01. 배열 days[]를 아래와 같이 초기화하고 배열 요소의 값을 다음과 같이 출력하는 프로그램을 작성하라.

#include <stdio.h>

int main() {
	int days[] = { 31,29,31,30,31,30,31,31,30,31,30,31 };
	for (int i = 0; i < sizeof(days) / sizeof(days[0]); i++) {
		printf("%d월은 %d일까지 있습니다. \n", i + 1, days[i]);
	}
}

02. 크기가 10인 1차월 배열에 난수를 저장한 후에, 최대값과 최소값을 출력하는 프로그램을 작성하라. 난수는 rand()함수를 호출하여 생성하라.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
	srand((unsigned)time(NULL));
	int arr[10];
	int max, min, size;
	size = sizeof(arr) / sizeof(arr[0]);
	
	for (int i = 0; i < size; i++) {
		arr[i] = rand();
	}

	max = min = arr[0];
	for (int i = 1; i < size; i++) {
		if (max < arr[i])
			max = arr[i];
		else if (min > arr[i])
			min = arr[i];
	}
	printf("최대값은 %d \n", max);
	printf("최소값은 %d \n", min);

}

03. 2개의 정수 배열 a, b를 받아서 대응되는 배열 요소가 같은지를 검사하는 함수 array_equal(int a[], int b[], int size)를 작성하고 테스트하라. 이 함수는 a[0]와 b[0], a[1]과 b[1], ... , a[size-1]와 b[size-1]가 같은지를 검사한다. 만약 전체 요소가 같다면 1을 반환하고 그렇지 않으면 0을 반환한다.

#include <stdio.h>

void scan(int n[], int size) {
	for (int i = 0; i < size; i++) {
		scanf("%d", &n[i]);
	}
}

void print_arr(int n[], int size) {
	for (int i = 0; i < size; i++) {
		printf("%d ", n[i]);
	}
}

int array_equal(int a[], int b[], int size) {
	for (int i = 0; i < size; i++) {
		if (a[i] != b[i]) {
			return 0;
		}
	}
	return 1;
}

int main() {
	int a[10], b[10];
	int size = sizeof(a) / sizeof(a[0]);

	scan(a, size);
	scan(b, size);

	print_arr(a, size);
	printf("\n");
	print_arr(b, size);
	printf("\n\n");

	if (array_equal(a, b, size)) {
		printf("2개의 배열은 같음");
	}
	else {
		printf("2개의 배열은 다름");
	}
}

04. 2개의 정수 배열 a, b를 받아서 배열 a의 요소를 배열 b로 복사하는 함수 array_copy(int a[], int b[], int size)를 작성하고 테스트하라. 이 함수는 a[0]를 b[0]에, a[1]를 b[1]에, ... , a[size-1]을 b[size-1]에 대입한다. 이 함수의 반환값은 없다.

#include <stdio.h>

void array_copy(int a[], int b[], int size) {
	for (int i = 0; i < size; i++) {
		b[i] = a[i];
	}
}

void print(int a[], int size) {
	for (int i = 0; i < size; i++) {
		printf("%d ", a[i]);
	}
	printf("\n");
}


int main() {
	int a[10], b[10], size;
	size = sizeof(a) / sizeof(a[0]);
    for (int i = 0; i < size; i++){
    	scanf("%d", &a[i]);
        }
	array_copy(a, b, size);
	print(a, size);
	print(b, size);
	printf("\n");
	printf("배열이 복사 되었음");
}

05. 0부터 9까지의 난수를 100번 생성하여 가장 많이 생성된 수를 출력하는 프로그램을 작성하라. 난수는 rand() 함수를 사용하여 생성하라.

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
	srand((unsigned)time(NULL));
	int count[10] = { 0 };
	int max;

	for (int i = 0; i < 100; i++) {
		count[rand() % 10]++;
	}
	
	max = 0;
	for (int i = 1; i < 10; i++) {
		if (count[max] < count[i]) {
			max = i;
		}
	}
	printf("가장 많이 나온 수=%d", max);
}

06. 로또 번호를 생성하는 프로그램은 8장에서 다루어 보았다. 다만 8장에서는 숫자들이 중복하여 나오는 문제를 해결하지 못했다. 배열을 이용하여서 숫자들이 중복되면 다시 난수를 발생하도록 코드를 수정하여보자.

 

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main() {
	srand(time(NULL));
	int lotto[45] = { 0 };
	int i = 0;
	int r;

	printf("로또 번호는 다음과 같습니다.\n");
	while (i < 6) {
		r = rand() % 45;

		if (lotto[r] == 1)
			continue;
		
		printf("%d ", r);
		lotto[r] = 1;
		i++;
	}
}

07. 다음과 같은 2차원 표를 배열로 생성하고, 각 행의 합계, 각 열의 합계를 구하여 출력하는 프로그램을 작성하라.

12
56
32
16
98
99
56
34
41
3
65
3
87
78
21

#include <stdio.h>

int main() {
	int arr[][5] = { 12,56,32,16,98,99,56,34,41,3,65,3,87,78,21 };
	int row, col, sum;
	row = sizeof(arr) / sizeof(arr[0]);
	col = sizeof(arr[0]) / sizeof(arr[0][0]);

	for (int i = 0; i < row; i++) {
		sum = 0;
		for (int j = 0; j < col; j++) {
			sum += arr[i][j];
		}
		printf("%d행의 합계: %d \n", i, sum);
	}

	for (int j = 0; j < col; j++) {
		sum = 0;
		for (int i = 0; i < row; i++) {
			sum += arr[i][j];
		}
		printf("%d열의 합계: %d \n", j, sum);
	}

}

08. 2차원 배열을 이용하여 세제곱근을 찾는 프로그램을 작성해보자. 먼저 10 x 2 크기의 2차원 배열을 만들고 첫 번째 열에는 정수를, 두 번째 열에는 세제곱값을 저장하라. 사용자에게 세제곱값을 입력하도록 하고 이 세제곱값을 배열에서 찾아서 첫 번째 열에 있는 값을 출력하도록 하여 보라.

#define _CRT_SECURE_NO_WARNINGS	
#include <stdio.h>

int main() {
	int a[2][10];
	int  col, n, result = 1;
	col = sizeof(a[0]) / sizeof(a[0][0]);

	for (int i = 0; i < col; i++) {
		scanf("%d", &a[0][i]);
		a[1][i] = a[0][i] * a[0][i] * a[0][i];
	}

	printf("정수를 입력하시오: ");
	scanf("%d", &n);
	for (int i = 0; i < col; i++) {
		if (n == a[1][i]) {
			result = 0;
			printf("%d의 세제곱근은 %d", n, a[0][i]);
		}
	}
	if (result) {
		printf("%d의 세제곱근은 배열에 없습니다.", n);
	}
}

09. 사용자가 입력하는 10개의 실수 자료의 평균과 표준 편차를 계산하는 프로그램을 작성하라. 평균은 n개의 실수가 주어져 있을때, 다음과 같이 계산된다. 

#include <stdio.h>
#include <math.h>

int main() {
	double arr[10];
	int size = sizeof(arr) / sizeof(arr[0]);

	double sum_avg = 0, avg;
	double sum_var = 0, stddev;

	for (int i = 0; i < size; i++) {
		printf("데이터를 입력하시오:");
		scanf("%lf", &arr[i]);
		sum_avg += arr[i];
	}
	avg = sum_avg / size;

	for (int i = 0; i < size; i++) {
		sum_var += pow((arr[i] - avg), 2);
	}
	sum_var /= size;
	stddev = sqrt(sum_var);
	
	printf("평균값은 %lf \n", avg);
	printf("표준편차값은 %lf \n", stddev);
}

10. 학생들의 시험 점수를 통계 처리하는 프로그램을 작성하여 보라. 한 학급은 최대 10명까지의 학생들로 이루어진다. 각 학생들은 3번의 시험을 치른다. 학생들의 성적은 난수를 생성하여서 얻는다. 각 시험에 대하여 최대점수, 최저점수를 계산하여 출력한다.

학번
시험 #1
시험 #2
시험 #3
1
 
 
 
2
 
 
 
3
 
 
 
4
 
 
 
5
 
 
 

#include <stdio.h>
#include <stdlib.h> 
#include <time.h>

int main() {
	srand((unsigned)time(NULL));
	int st[5][3], row, col, max, min;
	row = sizeof(st) / sizeof(st[0]);
	col = sizeof(st[0]) / sizeof(st[0][0]);

	for (int j = 0; j < col; j++) {
		max = 0; min = 0;
		for (int i = 0; i < row; i++) {
			st[i][j] = rand() % 101;
			if (st[max][j] < st[i][j]) {
				max = i;
			}
			else if (st[min][j] > st[i][j]) {
				min = i;
			}
		}
		printf("시험 #%d의 최대점수 = %d \n", j + 1,st[max][j]);
		printf("시험 #%d의 최소점수 = %d \n", j + 1, st[min][j]);
	}
}

11. 벡터에 대한 연산을 배열을 이용하여서 작성하여 보자.

(a) 2개의 벡터를 더하는 연산은 다음과 같이 정의된다. 2개의 벡터를 더하는 함수인 vector_add()를 작성하라. 이 함수를 테스트하기 위한 코드도 작성하라.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

#define size 3

void vector_add(double a[], double b[], double c[]) {
	for (int i = 0; i < size; i++) {
		c[i] = a[i] + b[i];
	}
}

void print_arr(double n[]) {
	printf("[ ");
	for (int i = 0; i < size; i++) {
		printf("%.2lf ", n[i]);
	}
	printf("] ");
}

int main() {
	double a[size] = { 1,2,3 };
	double b[size] = { 1,2,3 };
	double c[size];

	vector_add(a,b,c);
	print_arr(a);
	printf("+ ");
	print_arr(b);
	printf("= ");
	print_arr(c);
}

(b) 백터의 내적을 계산하는 함수인 vector_dot_prod()를 작성하라. 이 함수를 테스트하기 위한 코드도 작성하라. 벡터의 내적은 다음과 같이 정의된다.

#include <stdio.h>

#define size 3

void print_arr(double n[]) {
	printf("[ ");
	for (int i = 0; i < size; i++) {
		printf("%.2lf ", n[i]);
	}
	printf("]");
}

double vector_dot_prod(double a[], double b[]) {
	double sum = 0;
	for (int i = 0; i < size; i++) {
		sum += a[i] * b[i];
	}
	return sum;
}

int main() {
	double a[size] = { 1,2,3 };
	double b[size] = { 1,2,3 };

	print_arr(a);
	printf("*");
	print_arr(b);
	printf(" = ");
	printf("%.2lf", vector_dot_prod(a, b));
}

12. 아주 간단한 재고 관리 시스템을 만들어보자. 상품마다 상품 번호가 붙어 있고 상품 번호를 사용자가 입력하면 물품이 어디 있는지를 알려주는 번호를 출력한다. 상품 번호는 1부터 10까지로 하고 장소를 나타내는 번호는 1부터 100까지라고 가정한다. 1차원 배열을 사용하여 미리 상품 번호마다 장소를 저장해놓고 사용자로부터 상품 번호를 받아서 장소를 출력한다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
	srand((unsigned)time(NULL));
	int item[10], size, a;
	size = sizeof(item) / sizeof(item[0]);
	for (int i = 0; i < size; i++) {
		item[i] = rand() % 100 + 1;
	}
	printf("상품 번호를 입력하시오: ");
	scanf("%d", &a);
	printf("상품 %d번은 선반 %d에 있습니다. ", a, item[a - 1]);
}

13. 2차원 행렬에 대한 다음과 같은 함수를 작성하고 테스트하여 보라. 행렬의 크기는 3x3으로 가정하라.

(a) scalar_mult(int a[][3], int scalar)

#include <stdio.h>

void scalar_mult(int a[][3], int scalar) {

	for (int i = 0; i < scalar; i++) {
		for (int j = 0; j < scalar; j++) {
			printf("%d ", a[i][j] * 2);
		}
		printf("\n");
	}
}

int main() {
	int a[3][3] = { 1,2,3,4,5,6,7,8,9 };
	scalar_mult(a, 3);
}

 

(b) transpose(int a[][3], int b[][3])

#include <stdio.h>

transpose(int a[][3], int b[][3]) {
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			b[j][i] = a[i][j];
		}
	}
}

int main() {
	int a[3][3] = { 1,2,3,4,5,6,7,8,9 };
	int b[3][3];
	
	transpose(a, b);
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			printf("%d ", b[i][j]);
		}
		printf("\n");
	}
}

14. 어떤 석유 회사가 있다. 회사가 채굴하려고 하는 영역은 6행, 6열로 이루어진 36개의 셀로 분할된다. 회사는 시추 기술을 사용하여 각 셀의 잠재적 석유 매장량을 확인했다. 우리는 석유 매장량을 난수로 생성한다. 이 회사는 전체 영역 중에서 3 x 3 구역만을 빌리고자 한다. 가장 매장량이 많은 3 x 3 구역을 선정하고, 그 구역의 매쟝량을 출력하는 프로그램을 작성하라.

#include <stdio.h>


int hap(int area[][6], int a, int b) {
	int sum = 0;

	for (int i = a; i < a + 3; i++) {
		for (int j = b; j < b + 3; j++) {
			sum += area[i][j];
		}
	}
	return sum;
}



void print(int area[][6], int row, int col) {
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			printf("%d ", area[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

int main() {
	int area[][6] = { 1,2,3,3,5,2,1,2,3,3,5,2,1,2,3,3,5,2,1,2,3,0,0,0,1,2,3,0,0,0,1,2,3,0,0,0 };
	int row = sizeof(area) / sizeof(area[0]);
	int col = sizeof(area[0]) / sizeof(area[0][0]);
	int r, max, result;

	r = 2;
	max = 0;

	print(area,row,col);

	for (int i = 0; i < row - 2; i++) {
		for (int j = 0; j < col - 2; j++) {
			result = hap(area, i, j);
			if (max < result) {
				max = result;
			}
		}
	}
	printf("가장 매장량이 많은 구역의 매장량은 %d입니다. \n", max);


}

15. 수학에서의 "random walk"라 불리우는 문제를 프로그래밍하여보자. 술에 취한 딱정벌레가 10 x 10 크기의 타일 위에 있다. 딱정벌레는 임의의(랜덤) 위치를 선택하여 여기저기 걸어 다닌다. 현재의 위치에서 인접한 8개의 타일로 걸어가는 확률은 동일하다고 가정하자. 닥정하는 경로를 다음과 같이 표시하라.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

#define N 10

void printGrid(int tile[N][N]) {
    system("cls");  // 화면을 지우는 함수
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (tile[i][j] == 1)
                printf("* ");  
            else
                printf(". ");  
        }
        printf("\n");
    }
}

int main() {
    srand(time(NULL));  // 랜덤 시드 설정

    int tile[N][N] = { 0 }; 
    int x = N / 2, y = N / 2;
    tile[x][y] = 1; 


    while (1) {
        printGrid(tile);  // 현재 그리드 출력

        int move = rand() % 8;  

        // 딱정벌레 이동 방향 결정
        if (move == 0 && x > 0) x--;           // 북
        else if (move == 1 && x < N - 1) x++;  // 남
        else if (move == 2 && y > 0) y--;      // 서
        else if (move == 3 && y < N - 1) y++;  // 동
        else if (move == 4 && x > 0 && y > 0) { x--; y--; }       // 북서
        else if (move == 5 && x > 0 && y < N - 1) { x--; y++; }   // 북동
        else if (move == 6 && x < N - 1 && y > 0) { x++; y--; }   // 남서
        else if (move == 7 && x < N - 1 && y < N - 1) { x++; y++; }  // 남동

        tile[x][y] = 1;  // 딱정벌레가 지나간 타일에 1을 기록
        Sleep(500); 
    }
}

16. 지뢰 찾기는 예전에 윈도우에 무조건 포함되어있어서 상당히 많은 사람들이 즐겼던 프로그램이다. 2차원의 게임판 안에 지뢰가 숨겨져 있고 이 지뢰를 모두 찾아내는 게임이다. 10 x 10 크기의 2차원 배열을 만들고 여기에 30%의 위치에 지뢰를 숨긴다. 사용자가 지뢰가 없는 곳ㅇ르 클릭했을 때는 * 문자가 나온다 사용자가 지뢰를 열면 # 문자가 나오고 게임이 종료된다. 

.. 16이랑 17은 어려워서 보류..

+ Recent posts