티스토리 뷰

Study/C

쉽풀C - 10장 배열

Corinee 2023. 2. 6. 17:52
728x90

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

31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31

#include<stdio.h>

int main(void) {
	int days[] = { 31,29,31,30,31,30,31,31,30,31,30,31 };

	for (int i = 7; i < 12; i++)
		printf("%d월은 %d일까지 있습니다.\n", i + 1, days[i]);

	return 0;
}

 

 

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

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define SIZE 10

int main(void) {
	int array[SIZE]; // 난수를 저장할 배열
	int min, max;

	srand((unsigned)time(NULL)); // 시드 설정

	for (int i = 0; i < SIZE; i++)
		array[i] = rand();

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

	return 0;
}

 

 

3. 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>
#define SIZE 10

int array_equal(int a[], int b[], int size);

int main(void) {
	int a[SIZE] = { 1,2,3 }; // 앞의 3개의 원소를 제외한 나머지는 0으로 초기화
	int b[SIZE] = { 0 }; // 모든 원소 0으로 초기화

	for (int i = 0; i < SIZE; i++)
		printf("%d ", a[i]);
	printf("\n");

	for (int i = 0; i < SIZE; i++)
		printf("%d ", b[i]);
	printf("\n");

	if (array_equal(a, b, SIZE))
		printf("2개의 배열은 같음\n");
	else
		printf("2개의 배열은 다름\n");

	return 0;
}

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;
}

 

 

4. 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>
#define SIZE 10

void array_copy(int a[], int b[], int size);

int main(void) {
	int a[SIZE] = { 1,2,3 }; // 앞의 3개의 원소를 제외한 나머지는 0으로 초기화 됨
	int b[SIZE];
	
	array_copy(a, b, SIZE); // 배열 a의 요소를 배열 b에 복사

	for (int i = 0; i < SIZE; i++) // 배열 a 출력
		printf("%d ", a[i]);

	printf("\n");

	for (int i = 0; i < SIZE; i++) // 배열 b 출력
		printf("%d ", b[i]);

	return 0;
}

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

 

 

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

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define SIZE 10

int main(void) {
	int arr[SIZE] = { 0 }; // 각 정수가 생성된 빈도수를 저장할 배열. 모든 요소를 0으로 초기화
	int rand_num;

	srand((unsigned)time(NULL)); // 난수 생성을 위한 시드 설정

	for (int i = 0; i < 100; i++) {
		rand_num = rand() % 10; // 0~9 범위의 난수 생성
		arr[rand_num]++;
	}

	int max = 0;
	for (int i = 1; i < SIZE; i++) {
		if (arr[i] > arr[max])
			max = i;
	}
	printf("가장 많이 나온 수=%d\n", max);

	return 0;
}

 

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

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROWS 3
#define COLS 5

int main(void) {
	int arr[][COLS] = {
		{12,56,32,16,98},
		{99,56,34,41,3},
		{65,3,87,78,21}
	};

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

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

	return 0;
}

 

 

7. 1부터 10까지의 정수에 대하여 제곱값과 세제곱값을 계산하여 출력하는 프로그램을 작성하라. 10x3 크기의 2차원 배열을 만들고 첫 번째 열에는 정수를, 두 번째 열에는 제곱값을, 세 번째 열에는 세제곱값을 저장하라. 추가로 사용자에게 세제곱값을 입력하도록 하고 이 세제곱값을 배열에서 찾아서 그것의 세제곱근을 출력하도록 하여 보라.

#include<stdio.h>
#include<math.h>
#define ROWS 10
#define COLS 3

int main(void) {
	int n;
	int arr[ROWS][COLS];

	for (int i = 0; i < ROWS; i++) {
		for (int j = 0; j < COLS; j++) {
			arr[i][j] = pow((double)i, (double)j+1);
		}
	}

	printf("정수를 입력하시오: ");
	scanf("%d", &n);

	for (int i = 0; i < ROWS; i++) {
		if (arr[i][2] == n) {
			printf("%d의 세제곱근은 %d\n", n, arr[i][0]);
			return 0;
		}
	}
	printf("%d의 세제곱근이 없습니다.\n", n);

	return 0;
}

 

 

8. 사용자가 입력하는 10개의 실수 자료의 평균과 표준 편차를 계산하는 프로그램을 작성하라. 자료들은 난수를 생성하여서 작성된다(정수로 생성하여서 실수로 변환하라). 평균은 n개의 실수가 주어져 있을 때, 다음과 같이 계산된다. 표준 편차는 분산의 양의 제곱근으로 분산은 다음과 같이 계산된다. 표준 편차는 자료가 평균값 주위에 어느 정도의 넓이로 분포하고 있는가를 나타내는 하나의 척도이다.

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#define SIZE 10

double get_average(double a[], int size); // 평균 구하는 함수
double get_std_dev(double a[], int size, int avg); // 표준편차 구하는 함수

int main(void) {
	double data[SIZE]; // 데이터를 저장할 배열
	double average;

	srand((unsigned)time(NULL)); // 난수 생성을 위한 시드 설정

	for (int i = 0; i < SIZE; i++) {
		printf("데이터를 입력하시오:");

		int rand_num = rand() % 101; // 0 ~ 100 범위의 난수 생성
		printf("%d\n", rand_num); // 데이터 출력

		data[i] = (double)rand_num; // 데이터를 실수로 변환하여 배열에 저장
	}
	average = get_average(data, SIZE); // 평균 값 구하기

	printf("평균값은 %lf\n", average);
	printf("표준편차값은 %lf\n", get_std_dev(data, SIZE, average));

	return 0;
}

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

double get_std_dev(double a[], int size, int avg) {
	double variance = 0; // 분산
	double sum = 0;

	for (int i = 0; i < size; i++) {
		sum += pow(a[i] - avg, 2.0);
	}

	variance = sum / size;
	return sqrt(variance); // 표준편차는 분산의 양의 제곱근
}

 

 

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

 

 

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

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

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

 

 

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

 

 

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

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

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

 

 

13. 10진수를 2진수로 변환하여 출력하는 프로그램을 작성하여 보자. 최대 32자리까지 변환이 가능하도록 하라. 변환된 자리수를 저장하는데 배열을 사용하라. 10진수를 2로 나누어서 생성된 나머지를 역순으로 나타내면 2진수로 표현할 수 있다.

 

 

14. 수학에서의 "random walk"라 불리우는 문제를 배열을 이용하여 프로그래밍하여 보자. 문제는 다음과 같다. 술에 취한 딱정벌레가 n x m 크기의 타일로 구성된 방 안에 있다. 딱정벌레는 임의의(랜덤) 위치를 선택하여 여기저기 걸어 다닌다. 현재의 위치에서 주의의 8개의 타일로 걸어가는 확률은 동일하다고 가정하자. 딱정벌레가 이동하는 경로를 다음과 같이 표시하라.

 

 

15. 지뢰찾기는 예전에 윈도우에 무조건 포함되어 있어서 상당히 많은 사람들이 즐겼던 프로그램이다. 2차원의 게임판 안에 지뢰가 숨겨져 있고 이 지뢰를 모두 찾아내는 게임이다. 지뢰가 없는 곳을 클릭했을 때 숫자가 나오면 주변칸에 지뢰가 숨겨져 있다는 것을 의미한다. 예를 들어서 숫자가 2이면 주변칸에 지뢰가 두 개 있다는 의미가 된다. 이 문제에서는 지뢰찾기 게임을 위한 기초 작업을 하여 보자. 10 x 10 크기의 2차원 배열을 만들고 여기에 지뢰를 숨긴다. 지뢰가 아닌 곳은 .으로 표시하고 지뢰인 곳은 #로 표시하여 보자.

 

 

16. 간단한 텍스트 기반의 게임을 작성해보자. 주인공은 '#'로 표시되어 있다. 주인공이 금 'G'를 찾으면 게임이 종료된다. 중간에 몬스터 'M'가 있어서 금을 찾는 것을 방해한다. 주인공은 'w', 's', 'a', 'd' 키를 이용하여 상하좌우로 움직일 수 있다.                

728x90

'Study > C' 카테고리의 다른 글

쉽게 풀어쓴 C언어 Express - 14장 포인터 활용  (0) 2023.02.11
쉽풀C - 11장 포인터  (0) 2023.02.07
쉽풀C - 9장 함수와 변수  (0) 2023.02.05
쉽풀C - 8장 함수  (0) 2023.02.04
쉽풀C - 7장 반복문  (0) 2023.02.03