-
Notifications
You must be signed in to change notification settings - Fork 0
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
배열에 추가할 원소? ....
Visual Studio 2019 에서 작성 되었습니다.