Skip to content

CHAPTER 07

Tony Kim edited this page Oct 29, 2019 · 7 revisions

배열

  • 1번 문제

크기가 10인 등차수열의 첫 항과 공차를 입력받아 출력하는 프로그램

#include<stdio.h>
int main(void) {
	int a, b;
	int arr[10];

	printf("첫 번째 항? ");
	scanf_s("%d", &a);
	printf("공차? ");
	scanf_s("%d", &b);

	for (int i = 0; i < 10; i++) {
		if (i != 0)
			// arr[0]을 제외 나머지는 arr[i-1]에 공차 b를 더한다.
			arr[i] = arr[i - 1] + b;
		else if (i == 0)
			// arr[0] = 첫 번째 항
			arr[i] = a;
	}

	printf("등차수열:");

	// 등차수열 출력
	for (int i = 0; i < 10; i++) {
		printf(" %d", arr[i]);
	}
	return 0;
}

[실행 결과]

첫 번째 항? 1
공차? 5
등차수열: 1 6 11 16 21 26 31 36 41 46
  • 2번 문제

크기가 10인 등비수열의 첫 항과 공차를 입력받아 출력하는 프로그램

#include<stdio.h>
int main(void) {
	double a, b;
	double arr[10];

	printf("첫 번째 항? ");
	scanf_s("%lf", &a);
	printf("공차? ");
	scanf_s("%lf", &b);

	for (int i = 0; i < 10; i++) {
		if (i != 0)
			// arr[0]을 제외 나머지는 arr[i-1]에 공차 b를 곱한다.
			arr[i] = arr[i - 1] * b;
		else if (i == 0)
			// arr[0] = 첫 번째 항
			arr[i] = a;
	}

	printf("등차수열:");

	// 등차수열 출력
	for (int i = 0; i < 10; i++) {
		if (i == 0)printf("%.1f ", arr[i]);
		else if (i == 9)printf("%e ", arr[i]);
		else printf("%.0f ", arr[i]);
	}
	return 0;
}
[실행 결과]

첫 번째 항? 1.2
공차? 5
등차수열:1.2 6 30 150 750 3750 18750 93750 468750 2.343750e+06
  • 3번 문제

크기가 10인 정수형 배열에서 최소값과 최대값을 구하는 프로그램

#include<stdio.h>
int main(void) {
	int arr[10]{ 23,45,62,12,99,83,23,50,72,37 };

	int max = arr[0];
	int min = arr[0];

	printf("배열: ");
	// 배열을 출력
	for (int i = 0; i < 10; i++) {
		printf("%d ", arr[i]);
	}
	// 최소값과 최대값은 대소비교로 구한다
	for (int i = 0; i < 10; i++) {
		if (arr[i] > max) {
			max = arr[i];
		}
		if (arr[i] < min) {
			min = arr[i];
		}
	}
	printf("\n최대값: %d\n", max);
	printf("최소값: %d\n", min);

	return 0;
}
[실행 결과]

배열: 23 45 62 12 99 83 23 50 72 37
최대값: 99
최소값: 12
  • 4번 문제

3번 문제의 프로그램에 최대값과 최소값의 index를 같이 출력하는 기능을 추가

#include<stdio.h>
int main(void) {
	int arr[10]{ 23,45,62,12,99,83,23,50,72,37 };
	int i, max, min;
	int max_index, min_index;

	max = arr[0];
	min = arr[0];

	printf("배열: ");
	for (i = 0; i < 10; i++) {
		printf("%d ", arr[i]);
	}
	// 최소값과 최대값은 대소비교로 구하고 최대값과 최소값의 index i를 저장 
	for (i = 0; i < 10; i++) {
		if (arr[i] > max) {
			max = arr[i];
			max_index = i;
		}
		if (arr[i] < min) {
			min = arr[i];
			min_index = i;
		}
	}
	printf("\n최대값: 인덱스= %d 값= %d\n", max_index, max);
	printf("최소값: 인덱스= %d 값= %d\n", min_index, min);

	return 0;
}
[실행 결과]

배열: 23 45 62 12 99 83 23 50 72 37
최대값: 인덱스= 4 값= 99
최소값: 인덱스= 3 값= 12
  • 5번 문제

크기가 10인 정수형 배열에서 특정값을 역순으로 찾아서 출력하되 중복 출력은 허용하지 않는 프로그램

#include<stdio.h>
int main(void) {
	int arr[10]{ 23,45,62,12,99,83,23,50,12,37 };
	int num;

	printf("배열: ");

	for (int i = 0; i < 10; i++) {
		printf("%d ", arr[i]);
	}
	printf("\n찾을 값? ");
	scanf_s("%d", &num);

	for (int i = 9; i >= 0; --i) {
		// 배열에 저장된 수를 역순으로 n과 비교
		if (arr[i] == num) {
			// arr[]는 0부터 값이 저장되므로 i+1번째에 저장된 수
			printf("%d 는 %d번째 원소입니다.", arr[i], i + 1);
			// 중복 출력 방지를 위해 원소를 찾으면 프로그램 종료
			return 0;
		}
	}
}
[실행 결과]

배열: 23 45 62 12 99 83 23 50 12 37
찾을 값? 12
12 는 9번째 원소입니다.
  • 6번 문제

크기가 10인 실수형 배열을 역순으로 정렬하는 프로그램

#include<stdio.h>
int main(void) {
	double arr[10]{ 1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.1 };
	double temp[10]; // 임시 저장 배열
	int count = 0;

	printf("배열: ");
	for (int i = 0; i < 10; i++) {
		printf("%.1f  ", arr[i]);
	}
	// 역순으로 정렬
	for (int i = 9; i >= 0; i--) {
		temp[count] = arr[i];
		count++;
	}
	printf("\n역순: ");
	for (int i = 0; i < 10; i++) {
		arr[i] = temp[i];
		printf("%.1f  ", arr[i]);
	}
	return 0;
}
[실행 결과]

배열: 1.1  2.2  3.3  4.4  5.5  6.6  7.7  8.8  9.9  10.1
역순: 10.1  9.9  8.8  7.7  6.6  5.5  4.4  3.3  2.2  1.1
  • 7번 문제

크기가 20인 정수형 배열에 특정값을 입력받아 모두 같은 값으로 채우는 프로그

#include<stdio.h>
void fill_array(int a) {
	int i;
	int arr[20];

	for (i = 0; i < 20; i++) {
		arr[i] = a;
		printf("%d  ", arr[i]);
	}
}
int main(void) {
	int a;

	printf("배열의 원소에 저장할 값? ");
	scanf_s("%d", &a);
	fill_array(a);

	return 0;
}
[실행 결과]

배열의 원소에 저장할 값? 7
7  7  7  7  7  7  7  7  7  7  7  7  7  7  7  7  7  7  7  7
  • 8번 문제

상품 가격이 저장된 정수형 배열에 대한 할인율(%)을 입력받아 물건의 할인가를 출력하는 프로그램

#include<stdio.h>
int main(void) {
	int arr[5];
	double price, n;

	printf("상품가 5개를 입력하세요:\n");

	// 입력받은 상품의 가격을 배열에 저장
	for (int i = 0; i < 5; i++) {
		scanf_s("%d", &arr[i]);
	}

	printf("할인율(%%)? ");
	scanf_s("%lf", &n);

	// 할인가를 연산해서 출력
	for (int i = 0; i < 5; i++) {
		price = arr[i] - (arr[i] * (0.01 * n));
		printf("가격:%8d --> 할인가:%8.0lf\n", arr[i], price);
	}
	return 0;
}
[실행 결과]

상품가 5개를 입력하세요:
12000 18000 20000 50000 5600
할인율(%)? 20
가격:   12000 --> 할인가:    9600
가격:   18000 --> 할인가:   14400
가격:   20000 --> 할인가:   16000
가격:   50000 --> 할인가:   40000
가격:    5600 --> 할인가:    4480
  • 9번 문제

1~12월의 요금을 배열에 저장하고 막대 그래프로 출력하는 프로그램

#include<stdio.h>
int main(void) {
	int arr[12];
	int a;

	printf("1 ~ 12월 까지 핸드폰 요금을 입력하세요.\n");

	// 배열에 요금을 저장
	for (int j = 0; j < 12; j++) {
		scanf_s("%d", &arr[j]);
	}
	// 2000원당 * 한개로 출력 == 요금 / 2000
	for (int i = 0; i < 12; i++) {
		printf("\n%2d월 %d: ", i + 1, arr[i]);
		a = arr[i] / 2000;

		for (int l = 0; l < a; l++) {
			printf("*");
		}
	}
	return 0;
}
[실행 결과]

1 ~ 12월 까지 핸드폰 요금을 입력하세요.
10000 12000 15000 16000 30000 50000 60500 40000 30000 32000 74000 18000

 1월 10000: *****
 2월 12000: ******
 3월 15000: *******
 4월 16000: ********
 5월 30000: ***************
 6월 50000: *************************
 7월 60500: ******************************
 8월 40000: ********************
 9월 30000: ***************
10월 32000: ****************
11월 74000: *************************************
12월 18000: *********
  • 10번 문제

3x3 행렬의 합을 구하는 프로그램

#include<stdio.h>
int main(void) {
	int arr[3][3] = { {10,20,30},{40,50,60},{70,80,90} };
	int brr[3][3] = { {9,8,7},{6,5,4},{3,2,1} };

	printf("X 행렬:\n");
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			printf("%3d ", arr[i][j]);
		}
		printf("\n");
	}
	printf("Y 행렬:\n");
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			printf("%3d ", brr[i][j]);
		}
		printf("\n");
	}
	printf("X + Y 행렬:\n");

	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			printf("%3d ", arr[i][j] + brr[i][j]);
		}
		printf("\n");
	}
	return 0;
}
[실행 결과]

X 행렬:
 10  20  30
 40  50  60
 70  80  90
Y 행렬:
  9   8   7
  6   5   4
  3   2   1
X + Y 행렬:
 19  28  37
 46  55  64
 73  82  91
  • 11번 문제

크기가 5,4인 2차원 배열에 학생의 성적을 입력하고 평균을 계산해서 출력하는 프로그램

#include<stdio.h>
int main(void) {
	float arr[5][4], avg[4];
	float avg1;

	for (int i = 0; i < 5; i++) {
		printf("학생   %d번:", i + 1);
		for (int j = 0; j < 4; j++) {
			scanf_s("%f", &arr[i][j]);
			// 과목별로 최대 점수가 정해져 있다
			if ((j < 3) && (arr[i][j] > 30) || (j == 3) && (arr[i][j] > 10)) {
				printf("성적을 잘못 입력하였습니다.");
				return 0;
			}
		}
	}
	// 학생 개인의 평균 성적
	for (int c = 0; c < 4; c++) {
		avg[c] = (arr[0][c] + arr[1][c] + arr[2][c] + arr[3][c] + arr[4][c]) / 5;
	}
	printf("\n");
	for (int a = 0; a < 5; a++) {
		printf("학생   %d번: ", a + 1);
		avg1 = 0;
		for (int b = 0; b < 4; b++) {
			printf("%10.0f", arr[a][b]);
			avg1 = arr[a][b] + avg1;
			if (b == 3) {
				printf(" ==> %.0f\n", avg1);
			}
		}
		// 전체 학생의 과목별 평균 성적
		if (a == 4) {
			printf("\n항목별 평균: %10.2f%10.2f%10.2f%10.2f", avg[0], avg[1], avg[2], avg[3]);
		}
	}
	return 0;
}
[실행 결과]

학생   1번:         28        28        26         9 ==> 91
학생   2번:         30        27        30        10 ==> 97
학생   3번:         25        26        24         8 ==> 83
학생   4번:         18        22        22         5 ==> 67
학생   5번:         24        25        30        10 ==> 89

항목별 평균:      25.00     25.60     26.40      8.40
  • 12번 문제

O X로 예매 가능 여부를 표현하는 기차표 예매 프로그램

#include<stdio.h>
int main(void) {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int a = 0, add = 0, n = 0;

	for (;;) {
		for (int i = 0; i < 9; i++) {
			printf("현재 좌석: ");
			// 예매된 좌석의 수 만큼 X 출력
			if (add != 0) {
				for (int j = 0; j < add; j++) {
					printf("X ");
				}
			}
			// 예매 가능한 좌석의 수 만큼 O 출력
			for (int k = 0; k < (10 - add); k++) {
				printf("O ");
			}
			printf("\n예매할 좌석수? ");
			scanf_s("%d", &a);
			add = a + add;
			// 예매된 좌석의 번호 출력
			for (int l = 0; l < a; l++) {
				n++;
				printf("%d ", arr[n - 1]);
			}
			printf("번 좌석을 예매했습니다.\n");

			if (add == 10)
				// 전 좌석이 매진되면 프로그램 종료
				return 0;
		}
	}
}
[실행 결과]

현재 좌석: O O O O O O O O O O
예매할 좌석수? 2
1 2 번 좌석을 예매했습니다.
현재 좌석: X X O O O O O O O O
예매할 좌석수? 5
3 4 5 6 7 번 좌석을 예매했습니다.
현재 좌석: X X X X X X X O O O
예매할 좌석수? 3
8 9 10 번 좌석을 예매했습니다.
  • 13번 문제

난수로 2개의 배열을 채우고 비트 OR 연산 결과를 출력하는 프로그램

#include<stdio.h>
#include<stdlib.h> // srand(), rand() 함수
#include<time.h> // time() 함수
int main(void) {
	unsigned char arr[16], brr[16];
	srand(time(NULL));

	// 0~255 사이의 난수를 배열에 채움
	for (int i = 0; i < 16; i++) {
		arr[i] = rand() % 256;
		brr[i] = rand() % 256;
	}
	printf("image1: ");
	for (int i = 0; i < 16; i++) {
		printf("%4X", arr[i]);
	}
	printf("\nimage2: ");
	for (int i = 0; i < 16; i++) {
		printf("%4X", brr[i]);
	}
	// or 연산 후 출력
	printf("\nimage3: ");
	for (int i = 0; i < 16; i++) {
		printf("%4X", arr[i] | brr[i]);
	}
	return 0;
}
[실행 결과]

image1:   D2  CD  F3  E1  1A  61  D8   6  3B  ED  F4  DF  B5  D5  DD  BB
image2:   54  1B  55  D7  10  81  E2  84  B1  16  7F  6A  3E  27  E6  1A
image3:   D6  DF  F7  F7  1A  E1  FA  86  BB  FF  FF  FF  BF  F7  FF  BB
  • 14번 문제

난수로 배열을 채우고 임의의 순서로 배열을 셔플하는 프로그램

#include<stdio.h>
#include<stdlib.h> // srand(), rand() 함수
#include <time.h> // time() 함수
void suf(int* arr) {
	srand(time(NULL)); 
	// 오버플로우 오류로 int가 아닌 size_t 사용
	for (size_t i = 0; i < 10; i++) {
		// 임의의 순서로 셔플
		size_t j = i + rand() / (RAND_MAX / (10 - i) + 1);
		int temp = arr[j];
		arr[j] = arr[i];
		arr[i] = temp;
		printf("%4d", temp);
	}
}
int main(void) {
	int arr[10] = { 12,64,80,42,67,9,8,7,56,48 };

	printf("셔플 전: ");
	for (int i = 0; i < 10; i++) {
		printf("%4d", arr[i]);
	}
	printf("\n셔플 후: ");
	suf(arr);
	
	return 0;
}
[실행 결과]

셔플 전:   12  64  80  42  67   9   8   7  56  48
셔플 후:   12  64  80  67   7   9  48  56   8  42
  • 15번 문제

배열을 0으로 채우는 함수 프로그램

#include<stdio.h>
int zero_array(int *arr) {
	return *arr = 0;
}
int main(void) {
	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };

	for (int i = 0; i < 10; i++) {
		zero_array(&arr[i]);
		printf("%3d", arr[i]);
	}
	return 0;
}
[실행 결과]

  0  0  0  0  0  0  0  0  0  0
  • 16번 문제

key값을 입력받아 key값과 일치하는 배열의 index를 리턴하는 함수 프로그램

#include<stdio.h>
int find_array(int* arr, int key) {
	for (int i = 0; i < 10; i++) {
		if (arr[i] == key) {
			// 배열은 0번부터 시작하므로 +1
			return i + 1;
		}
	}
	return -1;
}
int main(void) {
	int arr[10] = { 23,45,62,12,99,83,23,50,72,37 };
	int key;

	for (int i = 0; i < 10; i++) {
		printf("%4d", arr[i]);
	}
	printf("\n찾을 값? ");
	scanf_s("%d", &key);

	printf("%d는 %d번째 원소입니다.\n", key, find_array(arr, key));
	
	return 0;
}
[실행 결과]

  23  45  62  12  99  83  23  50  72  37
찾을 값? 12
12는 4번째 원소입니다.
  • 17번 문제

원소의 중복을 허용하는 크기가 10인 배열을 채워넣고 값을 추가할 때마다 저장된 값들을 출력하는 프로그램

#include<stdio.h>
int main(void) {
	int arr[10];

	// 입력받은 숫자를 배열에 저장
	for (int i = 0; i < 10; i++) {
		printf("배열에 추가할 원소? ");
		scanf_s("%d", &arr[i]);
		// 현재까지 입력된 배열의 수를 출력
		for (int j = 0; j <= i; j++) {
			printf("%4d", arr[j]);
		}
		printf("\n");
	}
	return 0;
}
[실행 결과]

배열에 추가할 원소? 10
  10
배열에 추가할 원소? 20
  10  20
배열에 추가할 원소? 10
  10  20  10
배열에 추가할 원소? 30
  10  20  10  30
배열에 추가할 원소?....
  • 18번 문제

17번 문제의 프로그램을 변경해 중복을 허용하지 않는 프로그램

#include<stdio.h>
int main(void) {
	int arr[10];
	int overlap = 0;

	// 입력받은 숫자를 배열에 저장
	for (int i = 0; i < 10; i++) {
		printf("배열에 추가할 원소? ");
		scanf_s("%d", &arr[i]);
		for (int n = 0; n < i; n++) {
			// 배열에 같은 숫자가 있는지 확인
			if (arr[n] == arr[i]) {
				printf("\n해당 원소가 이미 [%d]에 존재합니다.\n", n);
				i--;
			}
		}
		// 현재까지 입력된 배열의 수를 출력
		for (int j = 0; j <= i; j++) {
			printf("%4d", arr[j]);
		}
		printf("\n");
	}
	return 0;
}
[실행 결과]

배열에 추가할 원소? 10
  10
배열에 추가할 원소? 20
  10  20
배열에 추가할 원소? 10

해당 원소가 이미 [0]에 존재합니다.
  10  20
배열에 추가할 원소? ....
Clone this wiki locally