<Lab 06 문제 유형 요약>
- Program 1 : 일차원 배열 비교하는 함수 (같은 배열인지 확인)
- Program 2 : 두 행렬의 합과 차 구하는 함수
- Program 3 : 일차원 배열, 이차원 배열의 원소의 합 구하는 함수 (배열 포인터를 매개변수로)
- Program 4 : 배열 포인터
- Program 5 : 일차원 배열 복사하는 함수, 일차원 배열 출력하는 함수
- Program 6 : 1부터 n까지의 합 구하는 함수 (재귀함수)
- Program 7 : 문자 배열에서 대문자, 소문자, 숫자, 특수문자 개수 세는 함수
- Program 8 : 난수 배열 생성
Program 1
다음과 같이 일차원 배열의 동등함을 검사하여 그 결과를 알아보는 프로그램을 작성하시오.
- 다음 배열 a와 b1, b2, b3에 대해 각각 검사하시오(함수 사용)
- void displayarray(int ary[], int size) // display array element
- nt isequalarray (int a[], int b[], int assize, in bsize) // compare array a with b, return 1 or 0
int a[] = { 4, 7, 9, 3, 6 };
int b1[] = { 4, 7, 9, 3, 6 }; // 같은 경우
int b2[] = { 4, 7, 9, 3, 7 }; // 마지막 원소가 다른 경우
int b3[] = { 4, 7, 9, 3, 6, 8}; // 원소의 개수가 다른 경우
#include <stdio.h>
void displayarray(int ary[], int size)
{
for (int i = 0; i < size; i++) {
printf("%d ", ary[i]);
}
printf("\n");
}
int isequalarray(int a[], int b[], int asize, int bsize)
{
if (asize != bsize) return 0;
for (int i = 0; i < asize; i++) {
if (a[i] != b[i]) return 0;
}
return 1;
}
int main()
{
int a[] = { 4, 7, 9, 3, 6 };
int b1[] = { 4, 7, 9, 3, 6 };
int b2[] = { 4, 7, 9, 3, 7 };
int b3[] = { 4, 7, 9, 3, 6, 8 };
displayarray(a, 5);
displayarray(b1, 5);
if (isequalarray(a, b1, 5, 5)) printf("두 배열은 같다.\n\n");
else printf("두 배열은 다르다.\n\n");
displayarray(a, 5);
displayarray(b2, 5);
if (isequalarray(a, b2, 5, 5)) printf("두 배열은 같다.\n\n");
else printf("두 배열은 다르다.\n\n");
displayarray(a, 5);
displayarray(b3, 6);
if (isequalarray(a, b3, 5, 6)) printf("두 배열은 같다.\n\n");
else printf("두 배열은 다르다.\n\n");
}
Program 2
다음 4 x 3의 행렬에서 두 행렬 x 와 y의 합과 차를 구하는 프로그램을 작성하시오. (함수 정의)
- 배열에서 같은 첨자의 행과 열에 대응하는 원소의 합과 차를 구한다
- 행렬 x와 y는 아래 값들로 초기화 된다.
- 합과 차를 구하는 연산에서 배열 포인터(px와 py)를 정의하여 사용
- int (*px)[COLS] = x; int (*py)[COLS] = y; // COLS == 3, ROWS == 4
- 합을 구할 때는 배열 포인터의 px[i] 와 py[i] ([ ] 하나만으로 원소 접근) 사용
- 차를 구할 때는 배열 포인터의 px 와 py ([ ] 사용 없이 원소 접근) 사용
46 | 79 | 78 |
35 | 57 | 28 |
43 | 68 | 76 |
56 | 78 | 98 |
78 | 35 | 99 |
85 | 82 | 34 |
58 | 69 | 29 |
34 | 59 | 35 |
- 배열의 합, 배열의 차, 배열 출력 함수를 각각 정의하여 호출하도록 구현하시오.
#include <stdio.h>
#define ROWS 4
#define COLS 3
void printmat(int mat[][COLS])
{
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
printf("%4d ", mat[i][j]);
}
printf("\n");
}
printf("\n");
}
void printadd(int x[][COLS], int y[][COLS])
{
int(*px)[COLS] = x; int(*py)[COLS] = y;
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
printf("%4d ", (*px + i * COLS)[j] + (*py + i * COLS)[j]);
}
printf("\n");
}
printf("\n");
}
void printsub(int x[][COLS], int y[][COLS])
{
int(*px)[COLS] = x; int(*py)[COLS] = y;
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
printf("%4d ", *(*(px + i) + j) - *(*(py + i) + j));
}
printf("\n");
}
printf("\n");
}
int main()
{
int x[ROWS][COLS] = { {46, 79, 78}, {35, 57, 28}, {43, 68, 76}, {56, 78, 98} };
int y[ROWS][COLS] = { {78, 35, 99}, {85, 82, 34}, {58, 69, 29}, {34, 59, 35} };
printf("x\n"); printmat(x);
printf("y\n"); printmat(y);
printf("x+y\n"); printadd(x, y);
printf("x-y\n"); printsub(x, y);
return 0;
}
Program 3
아래와 같이 1차원 배열 a와 2차원 배열 b에 포함된 모든 원소의 합을 각각 구할 수 있는 함수를 정의하고, 함수에서 포인터 변수 p와 증감연산자를 이용하여 구하시오.
int a[] = {1, 2, 3, 4};
int b[][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}};
int arysum(int *p, int size);
#include <stdio.h>
int arysum(int* p, int size)
{
int sum = 0;
for (int i = 0; i < size; i++)
{
sum += *(p + i);
}
return sum;
}
int main()
{
int a[] = { 1, 2, 3, 4 };
int b[][4] = { {1, 2, 3, 4}, {5, 6, 7, 8} };
printf("배열 a 원소의 합 = %d\n", arysum(a, 4));
printf("배열 b 원소의 합 = %d\n", arysum(b, 8));
return 0;
}
Program 4
아래와 같이 5개의 정수형 변수가 있을 때, 배열 포인터를 int *pary[SIZE] 를 이용하여 5개 변수들의 합을 계산하는 프로그램을 쓰시오.(함수 사용할 필요 없음)
int a = 10, b = 20, c = 30, d = 40, e = 50;
#include <stdio.h>
#define SIZE 5
int main()
{
int a = 10, b = 20, c = 30, d = 40, e = 50;
int* pary[SIZE] = { &a, &b, &c, &d, &e };
int sum = 0;
for (int i = 0; i < SIZE; i++)
{
sum += *(pary[i]);
}
printf("sum = %d\n", sum);
return 0;
}
Program 5
표준 입력으로 받은 복사 원소의 수 n에 대하여 다음과 같이 일차원 배열을 복사하는 함수와 배열의 원소를 출력하는 함수를 작성하고 결과를 출력하시오.
- void copyarray(int from[], int to[], int n /* 배열 원소 수 */) : 배열 from의 첫 번째 원소부터 (n-1)번째 원소까지 같은 순서대로 배열 to로 값을 복사하는 함수
- void display(int a[], int m) : 배열의 원소를 출력하는 함수
int a[] = { 4, 7, 9, 3, 6 };
int b[] = { 10, 20, 30, 40, 50, 60 };
#include <stdio.h>
void copyarray(int from[], int to[], int n)
{
for (int i = 0; i < n; i++) to[i] = from[i];
}
void display(int a[], int m)
{
for (int i = 0; i < m; i++) printf("%d ", a[i]);
}
int main()
{
int a[] = { 4, 7, 9, 3, 6 };
int b[] = { 10, 20, 30, 40, 50, 60 };
int a_size = 5, b_size = 6, copy_size = 0;
printf("a[] = "); display(a, a_size); printf("\n");
printf("b[] = "); display(b, b_size); printf("\n");
while (1)
{
printf("a[]에서 b[]로 복사할 원소의 수를 입력하시오 : ");
scanf("%d", ©_size);
if (copy_size<0 || copy_size>a_size) {
printf("?? 복사할 원소의 개수가 음수이거나 너무 많습니다.\n");
}
else break;
}
copyarray(a, b, copy_size);
if (copy_size > b) b_size = copy_size;
printf("b[] = "); display(b, b_size); printf("\n");
return 0;
}
Program 6
표준 입력으로 받은 정수 n에 대하여 1부터 n까지의 합을 구하는 함수를 재귀함수로 작성하고, 합이 출력되도록 프로그램을 작성하시오.
#include <stdio.h>
int recursive_sum(int n)
{
if (n == 1) return 1;
else return n + recursive_sum(n - 1);
}
int main()
{
int n = 0;
printf("1부터 입력 n까지의 합을 재귀호출 함수를 정의하여 계산합니다.\n");
printf("양의 정수 n을 입력하시오 >> ");
scanf_s("%d", &n);
printf("sum = %d\n", recursive_sum(n));
return 0;
}
Program 7
임의의 대문자, 소문자, 숫자, 그외 문자를 10개 입력 받아 배열에 저장하고, 각각이 몇 개인지 출력 하는 프로그램을 쓰시오.
- 배열에 저장된 문자들을 각각 몇 개인지를 검사하는 함수를 정의하여 사용하시오.
#include <stdio.h>
int* check(char* str)
{
int int_cap_sma_cha[4] = { 0, 0, 0, 0 };
for (int i = 0; *(str + i); i++)
{
if ('0' <= *(str + i) && *(str + i) <= '9') int_cap_sma_cha[0]++;
else if ('A' <= *(str + i) && *(str + i) <= 'Z') int_cap_sma_cha[1]++;
else if ('a' <= *(str + i) && *(str + i) <= 'z') int_cap_sma_cha[2]++;
else int_cap_sma_cha[3]++;
printf("%c", *(str + i));
}
return int_cap_sma_cha;
}
int main()
{
char str[10];
printf("임의의 문자 10개를 연속으로 입력하시오 >> ");
scanf(" %s", str);
int* cnt = check(str);
printf("\n");
printf("대문자는 %d개, ", *(cnt + 1));
printf("소문자는 %d개, ", *(cnt + 2));
printf("숫자 %d개, ", *cnt);
printf("그 외 문자 %d개 입니다.\n", *(cnt + 3));
return 0;
}
Program 8
두자리 정수(10~ 99) 까지의 난수(random number)를 20개 생성하여 배열에 저장하고, 사용자가 5개의 숫자를 입력하여 몇 개를 맞추는지 검사하는 프로그램을 쓰시오.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int check(int* random, int a, int b, int c, int d, int e)
{
int cnt = 0, val;
for (int i = 0; i < 20; i++)
{
val = *(random + i);
if (val == a || val == b || val == c || val == d || val == e) cnt++;
}
return cnt;
}
int main()
{
int random[20];
int a, b, c, d, e;
srand((unsigned int)time(NULL));
while (1)
{
printf("20개의 두자리수 난수 생성 ");
for (int i = 0; i < 20; i++)
{
random[i] = (int)rand() % 89 + 10;
printf("*");
}
printf("\n");
printf("서로 다른 정수 5개 입력 >> ");
scanf("%d %d %d %d %d", &a, &b, &c, &d, &e);
printf("맞춘 개수는 %d개 입니다.\n\n", check(random, a, b, c, d, e));
}
return 0;
}
'College Computer Science > C Language' 카테고리의 다른 글
[C 프로그래밍 실습] 중간고사 문제 (0) | 2021.01.03 |
---|---|
[C 프로그래밍 실습] 문자와 문자열 (Lab 07) (0) | 2021.01.03 |
[C 프로그래밍 실습] Report 02 (0) | 2021.01.02 |
[C 프로그래밍 실습] 함수 1 (Lab 05) (0) | 2020.11.21 |
[C 프로그래밍 실습] 배열 (Lab 04) (0) | 2020.11.05 |
댓글