본문 바로가기
College Computer Science/C Language

[C 프로그래밍 실습] 함수 2 (Lab 06)

by 2den 2021. 1. 2.
728x90

<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의 합과 차를 구하는 프로그램을 작성하시오. (함수 정의)

 

  • 배열에서 같은 첨자의 행과 열에 대응하는 원소의 합과 차를 구한다
  • 행렬 xy는 아래 값들로 초기화 된다.
  • 합과 차를 구하는 연산에서 배열 포인터(pxpy)를 정의하여 사용
  • 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차원 배열 a2차원 배열 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", &copy_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;
}

 

728x90

댓글