가장 흔한 형태
int a[5] = {1, 2, 3, 4, 5};
initializer가 array보다 짧으면 남은 자리에 모두 0이 들어간다.
int a[5] = {1, 2, 3} ; /* initial value of a is {1, 2, 3, 0, 0} */
쉽게 모든 원소를 0으로 하는 배열을 만들 수 있다.
int a[5] = {0}; /* initial value of a is {0, 0, 0, 0, 0} */
initializer가 있으면 배열의 길이는 생략 가능하다.
int a[] = {1, 2, 3, 4, 5};
designated initializers (C99)
int a[5] = {[0] = 1, [2] = 3, [4] = 5}; /* initial value of a is {1, 0, 3, 0, 5} */
int a[] = {[5] = 3, [19] = 20}; /* length of a is 20 */
접기
#pragma warning(disable:4996)
#include <stdio.h>
#define VALUE0 100
int main(void)
{
int rate, years, i, j; // years 관련 index: i, rate 관련 index: j
double value[5];
printf("Enter interest rate: ");
scanf("%d", &rate);
printf("Enter number of years: ");
scanf("%d", &years);
printf("\nYears");
for (j = 0; j < 5; j++)
{
printf("%6d%%", j);
value[j] = VALUE0;
}
printf("\n");
for (i = 0; i < 5; i++)
{
printf("%3d ", i + 1);
for (j = 0; j < 5; j++)
{
value[j] *= (double)(100 + rate + j) / 100;
printf("%.2f ", value[j]);
}
printf("\n");
}
printf("\n");
return 0;
}
접기 접기
#pragma warning(disable:4996)
#include <stdio.h>
#define NUM_RATES ((int) (sizeof(value) / sizeof(value[0])))
#define INITIAL_BALANCE 100.00
int main(void)
{
int i, low_rate, num_years, year;
double value[5];
printf("Enter interest rate: ");
scanf("%d", &low_rate);
printf("Enter number of years: ");
scanf("%d", &num_years);
printf("\nYears");
for (i = 0; i < NUM_RATES; i++) {
printf("%6d%%", low_rate + i);
value[i] = INITIAL_BALANCE;
}
printf("\n");
for (year = 1; year <= num_years; year++) {
printf("%3d ", year);
for (i = 0; i < NUM_RATES; i++) {
value[i] += (low_rate + i) / 100.0 * value[i];
printf("%7.2f", value[i]);
}
printf("\n");
}
return 0;
}
접기 int m[3][4] = { {0,1,2,3},
{4,5,6,7},
{8,9,0,1} };
initializer가 다차원 배열을 채우기에 충분하지 못한 경우, 나머지 공간의 원소는 0이 된다.
int m[3][4] = { {0,1,2,3},
{4,5,6,7}}; // 마지막 행은 {0,0,0,0}이 된다.
안쪽 리스트가 한 행을 채우기에 충분하지 못하면, 그 행의 나머지 원소는 0이 된다.
int m[3][4] = { {0,1,2,3},
{4,5,6}, // 마지막 원소는 0으로 채워짐
{7,8,9,0}};
내부의 괄호를 생략해도 된다
int m[3][4] = {0,1,2,3,
4,5,6,7,
8,9,0,1};
1차원 배열과 같이 designated initializer 가능(C99)
double ident[2][2] = {[0][0] = 1.0, [1][1] = 1.0}; // 지정하지 않은 자리의 원소는 0이다.
접기
#pragma warning(disable:4996)
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <time.h>
#define NUM_SUITS 4
#define NUM_RANKS 13
int main(void)
{
bool in_hand[NUM_SUITS][NUM_RANKS] = { false };
int num_cards, rank, suit;
const char rank_code[] = { '2', '3', '4', '5', '6', '7', '8',
'9', 't', 'j', 'q', 'k', 'a' };
const char suit_code[] = { 'c', 'd', 'h', 's' };
srand((unsigned)time(NULL)); /* passing return value of time avoids dealing same cards everytime we run the program*/
printf("Enter number of cards in hand: ");
scanf("%d", &num_cards);
printf("Your hand:");
while (num_cards > 0) {
suit = rand() % NUM_SUITS; /* picks a random suit */
rank = rand() % NUM_RANKS; /* picks a random rank */
if (!in_hand[suit][rank]) {
in_hand[suit][rank] = true;
num_cards--;
printf(" %c%c", rank_code[rank], suit_code[suit]);
}
}
printf("\n");
}
접기 접기
Exercises
3번
bool weekend[7] = { 1,0,0,0,0,0,1 };
4번(designated initializer)
bool weekend[7] = { [0] = true,[6] = true };
5번 Fibonacci numbers
#pragma warning(disable:4996)
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
int fib[40] = { 0, 1 };
int i;
for (i = 2; i < 40; i++)
fib[i] = fib[i - 1] + fib[i - 2];
}
11번 체커 보드 그리기
char checker_board[8][8];
int i, j;
for (i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
{
if ((i + j) % 2 == 0)
checker_board[i][j] = 'B';
else
checker_board[i][j] = 'R';
}
}
Projects
1번 중복된 숫자 찾기
#pragma warning(disable:4996)
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
int digits_checker[10] = { 0 };
int digit;
long n;
bool any_repeated_digit = false;
printf("Enter a number: ");
scanf("%ld", &n);
while (n>0)
{
digit = n % 10;
digits_checker[digit]++;
n /= 10;
}
printf("Repeated digit(s):");
for (int i = 0; i < 10; i++)
{
if (digits_checker[i] > 1)
{
printf(" %d", i);
any_repeated_digit = true;
}
}
if (!any_repeated_digit)
printf (" None");
printf("\n");
return 0;
}
2번
#pragma warning(disable:4996)
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
int digits_checker[10] = { 0 };
int digit;
long n;
printf("Enter a number: ");
scanf("%ld", &n);
while (n>0)
{
digit = n % 10;
digits_checker[digit]++;
n /= 10;
}
printf("Digit:\t\t");
for (int i = 0; i < 10; i++)
printf("%3d", i);
printf("\n");
printf("Occuerence:\t");
for (int i = 0; i < 10; i++)
{
printf("%3d", digits_checker[i]);
}
printf("\n");
return 0;
}
3번
#pragma warning(disable:4996)
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
int digits_checker[10] = { 0 };
int digit;
long n;
for (;;) {
printf("Enter a number: ");
scanf("%ld", &n);
if (!(n > 0))
break;
while (n > 0)
{
digit = n % 10;
digits_checker[digit]++;
n /= 10;
}
printf("Digit:\t\t");
for (int i = 0; i < 10; i++)
printf("%3d", i);
printf("\n");
printf("Occuerence:\t");
for (int i = 0; i < 10; i++)
{
printf("%3d", digits_checker[i]);
}
printf("\n");
}
return 0;
}
4번
#pragma warning(disable:4996)
#include <stdio.h>
#define SIZE_A (int) (sizeof(a) / sizeof(a[0]))
int main(void)
{
int a[10], i;
printf("Enter %d numbers: ", SIZE_A);
for (i = 0; i < SIZE_A; i++)
scanf("%1d", &a[i]);
printf("In reverse order: ");
for (i = SIZE_A; i > 0; i--)
printf("%d ", a[i-1]);
printf("\n");
return 0;
}
5번
맨 위에 #include <math.h>하고
한 줄만 바꾼다(2중 for문 안의 value[i] assign)
value[i] = pow((1 + (low_rate + i) / 1200.0), 12) * value[i]; // compounds monthly
6번 영어를 야민정음화
#pragma warning(disable:4996)
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char a[50];
char ch;
int len, i = 0;
printf("Input any sentence: ");
ch = getchar();
while (ch != '\n')
{
ch = toupper(ch);
switch (ch)
{
case 'A': ch = '4'; break;
case 'B': ch = '8'; break;
case 'E': ch = '3'; break;
case 'I': ch = '1'; break;
case 'O': ch = '0'; break;
case 'S': ch = '5'; break;
}
a[i] = ch;
i++;
ch = getchar();
}
len = i;
for (i = len; i < len + 10; i++)
a[i] = '!';
for (i = 0; i < len + 10; i++)
printf("%c", a[i]);
printf("\n");
return 0;
}
7번 행렬의 행의 합과 열의 합 구하기
#pragma warning(disable:4996)
#include <stdio.h>
#define SIZE 5
int main(void)
{
int a[SIZE][SIZE], i, j;
int total = 0;
for (i = 0; i < SIZE; i++)
{
printf("Enter row %d: ", i + 1);
for (j = 0; j < SIZE; j++)
scanf("%d", &a[i][j]);
}
printf("Row totals: ");
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE;j++)
total += a[i][j];
printf("%d ", total);
total = 0;
}
printf("\n");
printf("Column totals: ");
for (j = 0; j < SIZE; j++) {
for (i = 0; i < SIZE; i++)
total += a[i][j];
printf("%d ", total);
total = 0;
}
printf("\n");
return 0;
}
8번 7번을 수정해 학생별 점수의 합과 평균, 퀴즈별 점수의 평균, 최대, 최소점 구하기
#pragma warning(disable:4996)
#include <stdio.h>
#define NUM_STUDENTS 5
#define NUM_QUIZZES 5
int main(void)
{
int a[NUM_STUDENTS][NUM_QUIZZES], low, high, total_quiz, i, j;
int total[NUM_STUDENTS] = { 0 };
total_quiz = 0;
for (i = 0; i < NUM_STUDENTS; i++)
{
printf("Enter quiz grade of student %d: ", i + 1);
for (j = 0; j < NUM_QUIZZES; j++)
scanf("%d", &a[i][j]);
}
printf("Total grade of each student: ");
for (i = 0; i < NUM_STUDENTS; i++) {
for (j = 0; j < NUM_QUIZZES; j++)
total[i] += a[i][j];
}
printf("\n");
printf("\t\tTOTAL\tAVERAGE\n");
for (i = 0; i < NUM_STUDENTS; i++)
{
printf("STUDENT %d\t%3d\t%5.2f\n", i+1, total[i], (float)total[i] / NUM_QUIZZES);
}
printf("\n");
printf("\tAVERAGE\tHIGH\tLOW\n");
for (j = 0; j < NUM_QUIZZES; j++) {
printf("QUIZ %d", j+1);
high = low = a[0][j];
for (i = 0; i < NUM_STUDENTS; i++) {
high < a[i][j] ? high = a[i][j] : 1;
low > a[i][j] ? low = a[i][j] : 1;
total_quiz += a[i][j];
}
printf("\t%5.2f\t%3d\t%3d\n", (float)total_quiz / NUM_STUDENTS, high, low);
total_quiz = 0;
}
return 0;
}
9번 알파벳이 꼬물꼬물
/* 처음 보드 선언할 때 12x12로 선언한 것은, 현재 위치가 모서리인지와 주변에 이미 글자가 점유한 공간이 있는지를 간편하게 비교하기 위해서이다((0, 0)에서 왼쪽과 위 좌표를 참조하게 되면 (-1,0)과 (0,-1)좌표를 참조하게 되어 underflow오류가 날 것이므로, row 0, row 11, column 0, column 11는 그냥 점으로 두었다.
실수로 board 선언을 11x11로 했더니 맨 마지막에 가서 stack around the variable 'board' has corrupted 오류가 발생했는데, 이것은 처음 선언된 배열의 type보다 더 큰 자리를 요구하는 type이 들 어올 때 발생하는 메시지인데( http://www.jynote.net/551 ) , 내 경우와 같이11x11로 배열을 선언했는데 12번째 row을 참조하려 할 때도 발생하는 것 같다 . 이 오류는 그냥 컴파일했을 때는 제대로 메시지가 나타나지 않다가 디버깅을 해서야 겨우 메시지가 나와서 더 원인을 찾아내기가 어려웠다. '크기'를 틀리지 않도록 조심해야겠다. */
#pragma warning(disable:4996)
#include <stdio.h>
#include <stdbool.h> // bool type, true and false
#include <time.h> // time function
#include <stdlib.h> // srand, rand function
#define SIZE 10 // board is 10x10
#define INITAL_CHARACTER 65
int main(void)
{
char board[SIZE + 2][SIZE + 2];
int i, j, step, move; // row, column, step of walks, direction of walk
bool possible_move[4] = { true,true,true,true }; // up, down, left, right
int check_block; // counts blocked moves
srand((unsigned)time(NULL)); // reset random generator
/* board initialization */
for (i = 0; i < SIZE+2; i++) {
for (j = 0; j < SIZE+2; j++)
board[i][j] = '.';
}
/* starting walk */
i = j = 1;
board[i][j] = (char) INITAL_CHARACTER;
for (step = 1; step < 26; step++) {
check_block = 0;
if (board[i - 1][j] != '.' || i == 1) {
possible_move[0] = false;
check_block++;
}
if (board[i + 1][j] != '.' || i == 10) {
possible_move[1] = false;
check_block++;
}
if (board[i][j - 1] != '.' || j == 1) {
possible_move[2] = false;
check_block++;
}
if (board[i][j + 1] != '.' || j == 10) {
possible_move[3] = false;
check_block++;
}
if (check_block == 4) {
break;
}
do { move = rand() % 4; } while (possible_move[move] == false);
switch (move)
{
case 0: i--; break;
case 1: i++; break;
case 2: j--; break;
case 3: j++; break;
}
board[i][j] = (INITAL_CHARACTER + step);
check_block = 0;
for (int t = 0; t < 4; t++)
possible_move[t] = true;
}
/* show board after walking */
for (i = 1; i < SIZE + 1; i++) {
for (j = 1; j < SIZE + 1; j++)
printf("%c ", board[i][j]);
printf("\n");
}
if (check_block == 4)
printf("Terminated due to no possible moves at letter %c.\n", INITAL_CHARACTER + step - 1);
else
printf("Ended Succesfully\n");
return 0;
}
// 보드의 크기를 10x10으로 설정해도 할 수 있다. if문 안에서 short-circuit evaluation하는 것을 이용.
int proj9(void) {
char board[SIZE][SIZE];
int i, j, direction;
int k = 1;
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
board[i][j] = '.';
}
}
srand((unsigned)time(NULL));
i = j = k = 0;
while (k < 26) {
if ((i < 0 || j < 0 || i>10 || j>10) || board[i][j] != '.') {
continue;
}
board[i][j] = INITIAL_CHARACTER + k;
direction = rand() % 4;
/* 0: up, 1: down, 2: left, 3: right */
switch (direction) {
case 0:
if (i > 0 && board[i - 1][j] == '.') {
i--;
break;
case 1:
if (i < 10 && board[i + 1][j] == '.') {
i++;
board[i][j] = INITIAL_CHARACTER + k;
k++;
}
break;
case 2:
if (j > 0 && board[i][j - 1] == '.') {
j--;
board[i][j] = INITIAL_CHARACTER + k;
k++;
}
break;
case 3:
if (j < 10 && board[i][j + 1] == '.') {
board[i][j + 1] = INITIAL_CHARACTER + k;
k++;
}
break;
default:
printf("There's no available path to proceed.\n");
return 0;
}
}
}
}
12번 SCRABBLE (chapter 7 project 5)
#pragma warning(disable:4996)
#include <stdio.h>
#include <ctype.h>
int main(void)
{
int score_table[26] = { 1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 5, 1, 3, 1, 1, 3, 10, 1, 1, 1, 1, 4, 4, 8, 4, 10 };
int score = 0;
char c;
printf("Enter a word: ");
while ((c = getchar()) != '\n')
{
c = toupper(c);
if (c < 65 || c>90) {
printf("Only alphabetical input is allowed.\n");
return 0;
}
score += score_table[c - 65];
}
printf("Scrabble value: %d\n", score);
return 0;
}
13번
#pragma warning(disable:4996)
#include <stdio.h>
int main(void)
{
char first_name, last_name[20];
int length, i = 0;
char c;
printf("Enter a first and last name: ");
first_name = getchar();
while (getchar() != ' ');
while ((c = getchar()) != '\n') {
last_name[i] = c;
i++;
}
length = i;
printf("You entered the name: ");
for (i = 0; i < length; i++)
printf("%c", last_name[i]);
printf(", %c.\n", first_name);
return 0;
}
14번 문장에 나온 단어 순서 역순으로 출력
#pragma warning(disable:4996)
#include <stdio.h>
int main(void)
{
char c, term_char, sentence[60];
int i, j, start, end, len;
i = 0;
printf("Enter a sentence: ");
c = getchar();
while (c != '.' && c != '!' && c != '?')
{
sentence[i] = c;
i++;
c = getchar();
}
term_char = c;
len = end = i - 1;
for (i = end; i >= 0; i--)
{
if (sentence[i] == ' ')
{
start = i + 1;
for (j = start; j <= end; j++)
printf("%c", sentence[j]);
printf(" ");
end = start - 2;
}
}
for (i = 0; i <= end; i++)
printf("%c", sentence[i]);
printf("%c\n\n", term_char);
for (i = 0; i <= len; i++)
printf("%c", sentence[i]);
printf("%c\n", term_char);
return 0;
}
15번 시저 암호법
#pragma warning(disable:4996)
#include <stdio.h>
int main(void)
{
char c, input[80];
int n, i, len;
i = 0;
printf("Enter message to be encrypted: ");
while ((c = getchar()) != '\n') {
input[i] = c;
i++;
}
len = i;
do {
printf("Enter shift amount (1-25): ");
scanf("%d", &n);
} while (n < 1 || n > 25);
printf("%d\n", n);
for (i = 0; i < len; i++)
{
c = input[i];
if (c >= 65 && c <= 90)
c = (c - 65 + n) % 26 + 65;
else if (c >= 97 && c <= 122)
c = (c - 97 + n) % 26 + 97;
printf("%c", c);
}
printf("\n");
return 0;
}
16번 2개의 단어가 아나그램인지 체크
#pragma warning(disable:4996)
#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
int main(void)
{
int word1[26] = { 0 };
int word2[26] = { 0 };
char c;
int i;
bool is_anagram = 1;
printf("Enter first word: ");
while ((c = getchar()) != '\n')
{
c = toupper(c);
if (c >= 65 && c <= 90)
word1[c - 65]++;
}
printf("Enter second word: ");
while ((c = getchar()) != '\n')
{
c = toupper(c);
if (c >= 65 && c <= 90)
word2[c - 65]++;
}
for (i = 0; i < 26; i++)
{
if (word1[i] != word2[i]) {
is_anagram = 0;
break;
}
}
if (is_anagram == 1)
printf("The words are anagrams.\n");
else
printf("The words are NOT anagrams.\n");
return 0;
}
17번 마방진
#pragma warning(disable:4996)
#include <stdio.h>
int main(void)
{
int ar[99][99] = { 0 };
int i, j, k, n, i_0, j_0;
printf("This program creates a magic square of a specified size.\nThe size must be an odd number between 1 and 99.\n");
for (;;) {
printf("Enter size of magic square : ");
scanf("%d", &n);
if (n > 0 && n < 100 && (n % 2 == 1))
break;
}
j = (n - 1) / 2 - 1;
i = 0 + 1;
for (k = 1; k <= n*n; k++) {
i--;
j++;
if (i >= n)
i %= n;
else if (i < 0)
i += n;
if (j >= n)
j %= n;
else if (j < 0)
j += n;
if (ar[i][j] != 0)
{
i = i_0 + 1;
j = j_0;
}
ar[i][j] = k;
i_0 = i;
j_0 = j;
}
printf("\n\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
printf("%3d ", ar[i][j]);
printf("\n");
}
return 0;
}
접기