01. 실수를 받아서 정수부와 소수부로 분리하는 함수  get_frac(double f, int *pi, double *pd) ;을 작성하고 테스트해보자.

 

#include <stdio.h>

void get_frac(double f, int* pi, double* pd) {
	*pi = (int)f;
	*pd = f - *pi; 
	// *pf = f % 1 불가능 (실수형은 % 연산자 사용 불가)
}

int main() {
	int a;
	double n, b;
	printf("실수를 입력하시오: ");
	scanf("%lf", &n);

	get_frac(n, &a, &b);
	printf("get_frac(%.2lf)이 호출되었습니다.\n", n);
	printf("정수부는 %d입니다. \n", a);
	printf("소수부는 %.2lf입니다. \n", b);

}

02. 크기가 3인  int형 배열을 생성하고 사용자로부터 정수를 받아서 배열을 채운다. 배열 요소의 주소와 값을 다음과 같이 출력하는 프로그램을 작성해보자.

 

#include <stdio.h>

int main() {
	int a[3];
	int size = sizeof(a) / sizeof(a[0]);

	for (int i = 0; i < size; i++) {
		printf("정수를 입력하시오: ");
		scanf("%d", &a[i]);
	}

	printf("====================== \n");
	printf(" 주소      값 \n");
	printf("====================== \n");

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

03. 정수 배열을 받아서 요소들을 난수로 채우는 함수 array_fill()를 작성하고 테스트하라. 난수는 라이브러리 함수인  rand()를 사용하여 생성한다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void array_fill(int A[], int size) {
	for (int i = 0; i < size; i++) {
		A[i] = rand();
	}
}

int main() {
	srand((unsigned)time(NULL));
	int arr[10];
	int size = sizeof(arr) / sizeof(arr[0]);
	array_fill(arr, size);
	for (int i = 0; i < size; i++) {
		printf("%d ", arr[i]);
	}
}

04. 문자형 배열을 생각해보자. 배열의 요소에는 문자 H, E, L, L, O R가 저장되어 있고 맨 끝에는 0을 저장시킨다. 저장된 문자들의 개수를 세어서 반환하는 함수 my_strlen(char *p)를 작성하고 테스트해보자. 이것은 실제로  C언어가 문자열을 저장하는 방법이다.

#include <stdio.h>

int strlen(char *p){
	int i = 0;
	while (*p != '\0') {
		i++;
		p++;
	}
	return i;
}

int main() {
	char a[] = "HELLO";
	printf("저장된 문자열 = %s \n", a);
	printf("문자열의 길이 = %d", strlen(a));
}

05. 큰 배열을 할당받아서 우리 마음대로 메모리를 사용하고자 한다. 크기가 1000인 char형 배열을 생성한다. 배열의 첫 번재 바이트에는 'a'를 저장하고, 다음 4바이트에는 정수 100을 저장하고, 다음 4바이트에는 float형 실수 3.14를 저장할 수 있는가? 다시 꺼내서 출력해보자.

 

#define _CRT_SECURE_NO_WARNINGS	
#include <stdio.h>

int main() {
	char buffer[1000];
	char* p;
	int* pi;
	float* pf;

	p = buffer;
	*p = 'a';

	pi = (int*)(p + 4);
	*pi = 100;

	pf = (float*)(pi + 1);
	*pf = 3.14;

	printf("%c ", *p);
	printf("%d" , *pi);
	printf("%f ", *pf);
}

06. 정수 배열의 요소들을 화면에 출력하는 함수 array_print()를 작성하고 테스트하라. 출력 형식은 다음과 같은 형식이 되도록 하라.

 

#include <stdio.h>

void array_print(int* A, int size) {
	printf("A[] = { ");
	for (int i = 0; i < size; i++) {
		printf("%d, ", A[i]);
	}
	printf("}");
}

int main() {
	int A[10] = { 1,2,3,4,5 };
	int size = sizeof(A) / sizeof(A[0]);
	array_print(A, size);
}

07. 배열에 저장된 값을 역순으로 출력하는 프로그램을 작성하라. 단 인덱스를 사용하지 않고 포인터만을 사용해보자.

#include <stdio.h>

void array_print(int* A, int size) {
	printf("A[] = ");
	for (int i = 0; i < size; i++) {
		printf("%d ", *(A + i));
	}
	printf("\n");
}

void array_print_reverse(int* A, int size) {
	printf("A[] = ");
	for (int i = size - 1; i >= 0; i--) {
		printf("%d ", *(A+i));
	}
	printf("\n");
}

int main() {
	int A[10];
	int size = sizeof(A) / sizeof(A[0]);
	for (int i = 0; i < size; i++) {
		A[i] = i;
	}
	array_print(A, size);
	array_print_reverse(A, size);
}

08. 배열에 double형의 실수값들이 저장되어 있다. 이 실수값 중에서 최대값이 저장된 요소를 찾아서 요소와 주소를 반환하는 다음과 같은 함수를 구현하고 테스트해보자.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


double* find_max(double* arr, int size) {
	double* max = arr;
	for (int i = 1; i < size; i++) {
		if (*max < arr[i])
			max = arr + i;
	}
	return max;
}

int main() {
	double A[] = { 1.23, 3.14, 9.16, 100.9 };
	printf("%.2lf", *find_max(A, sizeof(A) / sizeof(A[0])));
}

09. 학생들의 평점은 4.3점이 만점이라고 하자. 배열 grades[ ]에 학생 10명의 학점이 저장되어 있다. 이것을 100점 만점으로 변환하여서 배열 scores[ ]에 저장하는 함수를 작성하고 테스트하라.

#include <stdio.h>

void print_array(double* arr, int size) {
	for (int i = 0; i < size; i++) {
		printf("%.2lf ", arr[i]);
	}
	printf("\n");
}

void convert(double* grades, double* scores, int size) {
	for (int i = 0; i < size; i++) {
		scores[i] = grades[i] / 4.3 * 100;
	}
}

int main() {
	double grades[] = { 0,0.5,1.0,1.5,2.0,2.5,3.0,3.5,4.0,4.3 };
	double scores[10];
	
	print_array(grades, 10);
	convert(grades, scores, 10);
	print_array(scores, 10);
}

10. 정수 배열 A[]를 다른 정수 배열 B[]에 복사하는 함수를 작성하고 테스트하라.

#include <stdio.h>

void array_copy(int* A, int* B, int size) {
	for (int i = 0; i < size; i++) {
		B[i] = A[i];
	}
}

void print_array(int* arr, int size) {
	for (int i = 0; i < size; i++) {
		printf("%d ", *(arr + i));
	}
	printf("\n");
}

int main() {
	int A[10] = { 1,2,3 };
	int B[10];
	array_copy(A, B, 10);
	printf("A[] = ");
	print_array(A, 10);
	printf("B[] = ");
	print_array(B, 10);
}

11. 직원들의 기본급이 배열 A[ ]에 저장되어 있다. 배열 B[ ]에는 직원들의 보너스가 저장되어 있다. 기본급과 보너스를 합하여 이번 달에 지급할 월급의 총액을 계산하고자 한다. A[ ] 와 B[ ]를 더하여 배열 C[ ]에 저장하는 함수를 작성하고 테스트하라. 즉 모든 i에 대하여 C[ i ] = A[ i ] + B[ i ]가 된다.

#include <stdio.h>

void print_array(int* a, int size) {
	for (int i = 0; i < size; i++) {
		printf("%d ", a[i]);
	}
	printf("\n");
}

void array_add(int* A, int* B, int* C, int size) {
	for (int i = 0; i < size; i++) {
		C[i] = A[i] + B[i];
	}
}

int main() {
	int A[10] = { 1,2,3 };
	int B[10] = { 4,5,6 };
	int C[10];

	array_add(A, B, C, 10);
	printf("A[] = ");
	print_array(A, 10);
	printf("B[] = ");
	print_array(B, 10);
	printf("C[] = ");
	print_array(C, 10);
}

12. 직원들의 월급이 배열 A[ ] 에 저장되어 있다고 가정하자. 이번 달에 회사에서 지급할 월급의 총액을 계산하고자 한다/ 정수형 배열 요소들의 합을 구하여 반환하는 함수를 작성하고 테스트하라.

#include <stdio.h>

void print_array(int* a, int size) {
	for (int i = 0; i < size; i++) {
		printf("%d ", a[i]);
	}
	printf("\n");
}

int array_sum(int* A, int size) {
	int sum = 0;
	for (int i = 0; i < size; i++) {
		sum += A[i];
	}
	return sum;
}

int main() {
	int A[10] = { 1,2,3 };
	printf("A[] = ");
	print_array(A, 10);
	printf("월급의 합: %d", array_sum(A, 10));
}

13. 직원들의 월급이 저장된 배열에서 월급이 200만원인 사람을 찾고 싶을 때가 있다. 주어진 값을 배열 A[]에서 탐색하여 배열 요소의 인덱스를 반환하는 함수를 작성하고 테스트하라.

#include <stdio.h>

int search(int* A, int size,int search_value) {
	for (int i = 0; i < size; i++) {
		if (A[i] == search_value) {
			return i;
		}
	}
	
}

int main() {
	int A[10] = {0, 100,300,200,400,500,600,700,800,900};
	printf("월급 200만원인 사람의 인데스=%d", search(A, 10, 200));
}

14. 2개의 정수의 합과 차를 동시에 반환하는 함수를 작성하고 테스트하라. 포인터 매개 변수를 사용한다.

#include <stdio.h>

void get_sum_diff(int x, int y, int* p_sum, int* p_diff) {
	*p_sum = x + y;
	*p_diff = x - y;
}

int main() {
	int x = 100, y = 200;
	int p_sum, p_diff;
	get_sum_diff(x, y, &p_sum, &p_diff);
	printf("원소들의 합 = %d \n", p_sum);
	printf("원소들의 차 = %d \n", p_diff);
}

15. 우리가 프로그램을 하다 보면 사용자로부터 2개의 정수를 받아오는 경우가 많다. 이것을 함수로 구현해두고 필요할 때마다 사용하면 편리할 것이다. 하지만 한 가지 문제가 있다. C에서 함수는 하나의 값만 반환할 수 있다. 2개 이상의 값을 반환하려면 다른 방법을 사용해야 하는데 다음과 같이 포인터도 사용할 수 있다.

void get_two_int(int *px, int *py);

위와 같은 원형을 가지는 함수를 작성하고 이것을 이요해서 정수의 합을 계산하는 프로그램을 작성해보자.

#include <stdio.h>

void get_two_int(int* px, int* py) {
	printf("정수 2개를 입력하시오: ");
	scanf("%d %d", px, py);
}

int sum(x, y) {
	return x + y;
}


int main() {
	int x, y;
	get_two_int(&x, &y);
	printf("정수의 합은 %d", sum(x, y));
}

16. 2개의 정렬된 정수 배열 A[ ]와 B[ ]가 있다고 가정하자. 이 2개의 배열을 합쳐서 하나의 정렬된 배열 C[]로 만드는 함수를 작성하고 테스트한다. 다음과 같은 함수 원형을 가진다고 가정하라.

void merge(int *A,int *B, int *C, int size){ }

여기서 배열 A[ ], B[ ]는 똑같은 크기로 정의되어 있다고 가정한다. 배열 C[ ]에는 충분한 공간이 확보되어 있다고 가정하자. 합치는 알고리즘은 다음과 같다. 먼저 A[0]와 B[0]를 비교한다. 만약 A[0]가 B[0]보다 작으면 A[0]를 C[0]에 복사한다.  다음에는 A[1]과 B[0]를 비교한다. 이번에는 B[0]가 A[1]보다 작다면 B[0]를 C[1]에 저장한다. 똑같은 방식으로 남아있는 요소들을 비교하여 더 작은 요소를 C[ ]로 복사한다. 만약 A[ ]나 B[ ] 중에서 어느 하나가 먼저 끝나게 되면 남아있는 요소들을 전부 C[ ]로 이동한다.

#include <stdio.h>

void array(int* A, int* B, int* C, int size) {

	int j = 0;
	int k = 0;

	for (int i = 0; i < size; i++) {
		if (j < size / 2 && k < size / 2) {
			if (A[j] < B[k]) C[i] = A[j++];

			else C[i] = B[k++];
		}
		else if (j == size / 2)
			C[i] = B[k++];

		else if (k == size / 2)
			C[i] = A[j++];
	}
}

void print_arr(int *arr, int size) {
	for (int i = 0; i < size; i++) {
		printf("%d ", arr[i]);
	}
	printf("\n");
}

int main() {
	int A[4] = { 2,5,7,8 };
	int B[4] = { 1,3,4,6 };
	int C[10];
	array(A, B, C, 8);

	printf("A[] = ");
	print_arr(A, 4);
	printf("B[] = ");
	print_arr(B, 4);
	printf("C[] = ");
	print_arr(C, 8);
}

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

#include <stdio.h>

int main() {
	int days[] = { 31,29,31,30,31,30,31,31,30,31,30,31 };
	for (int i = 0; i < sizeof(days) / sizeof(days[0]); i++) {
		printf("%d월은 %d일까지 있습니다. \n", i + 1, days[i]);
	}
}

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

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
	srand((unsigned)time(NULL));
	int arr[10];
	int max, min, size;
	size = sizeof(arr) / sizeof(arr[0]);
	
	for (int i = 0; i < size; i++) {
		arr[i] = rand();
	}

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

}

03. 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>

void scan(int n[], int size) {
	for (int i = 0; i < size; i++) {
		scanf("%d", &n[i]);
	}
}

void print_arr(int n[], int size) {
	for (int i = 0; i < size; i++) {
		printf("%d ", n[i]);
	}
}

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

int main() {
	int a[10], b[10];
	int size = sizeof(a) / sizeof(a[0]);

	scan(a, size);
	scan(b, size);

	print_arr(a, size);
	printf("\n");
	print_arr(b, size);
	printf("\n\n");

	if (array_equal(a, b, size)) {
		printf("2개의 배열은 같음");
	}
	else {
		printf("2개의 배열은 다름");
	}
}

04. 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>

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

void print(int a[], int size) {
	for (int i = 0; i < size; i++) {
		printf("%d ", a[i]);
	}
	printf("\n");
}


int main() {
	int a[10], b[10], size;
	size = sizeof(a) / sizeof(a[0]);
    for (int i = 0; i < size; i++){
    	scanf("%d", &a[i]);
        }
	array_copy(a, b, size);
	print(a, size);
	print(b, size);
	printf("\n");
	printf("배열이 복사 되었음");
}

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

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
	srand((unsigned)time(NULL));
	int count[10] = { 0 };
	int max;

	for (int i = 0; i < 100; i++) {
		count[rand() % 10]++;
	}
	
	max = 0;
	for (int i = 1; i < 10; i++) {
		if (count[max] < count[i]) {
			max = i;
		}
	}
	printf("가장 많이 나온 수=%d", max);
}

06. 로또 번호를 생성하는 프로그램은 8장에서 다루어 보았다. 다만 8장에서는 숫자들이 중복하여 나오는 문제를 해결하지 못했다. 배열을 이용하여서 숫자들이 중복되면 다시 난수를 발생하도록 코드를 수정하여보자.

 

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main() {
	srand(time(NULL));
	int lotto[45] = { 0 };
	int i = 0;
	int r;

	printf("로또 번호는 다음과 같습니다.\n");
	while (i < 6) {
		r = rand() % 45;

		if (lotto[r] == 1)
			continue;
		
		printf("%d ", r);
		lotto[r] = 1;
		i++;
	}
}

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

12
56
32
16
98
99
56
34
41
3
65
3
87
78
21

#include <stdio.h>

int main() {
	int arr[][5] = { 12,56,32,16,98,99,56,34,41,3,65,3,87,78,21 };
	int row, col, sum;
	row = sizeof(arr) / sizeof(arr[0]);
	col = sizeof(arr[0]) / sizeof(arr[0][0]);

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

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

}

08. 2차원 배열을 이용하여 세제곱근을 찾는 프로그램을 작성해보자. 먼저 10 x 2 크기의 2차원 배열을 만들고 첫 번째 열에는 정수를, 두 번째 열에는 세제곱값을 저장하라. 사용자에게 세제곱값을 입력하도록 하고 이 세제곱값을 배열에서 찾아서 첫 번째 열에 있는 값을 출력하도록 하여 보라.

#define _CRT_SECURE_NO_WARNINGS	
#include <stdio.h>

int main() {
	int a[2][10];
	int  col, n, result = 1;
	col = sizeof(a[0]) / sizeof(a[0][0]);

	for (int i = 0; i < col; i++) {
		scanf("%d", &a[0][i]);
		a[1][i] = a[0][i] * a[0][i] * a[0][i];
	}

	printf("정수를 입력하시오: ");
	scanf("%d", &n);
	for (int i = 0; i < col; i++) {
		if (n == a[1][i]) {
			result = 0;
			printf("%d의 세제곱근은 %d", n, a[0][i]);
		}
	}
	if (result) {
		printf("%d의 세제곱근은 배열에 없습니다.", n);
	}
}

09. 사용자가 입력하는 10개의 실수 자료의 평균과 표준 편차를 계산하는 프로그램을 작성하라. 평균은 n개의 실수가 주어져 있을때, 다음과 같이 계산된다. 

#include <stdio.h>
#include <math.h>

int main() {
	double arr[10];
	int size = sizeof(arr) / sizeof(arr[0]);

	double sum_avg = 0, avg;
	double sum_var = 0, stddev;

	for (int i = 0; i < size; i++) {
		printf("데이터를 입력하시오:");
		scanf("%lf", &arr[i]);
		sum_avg += arr[i];
	}
	avg = sum_avg / size;

	for (int i = 0; i < size; i++) {
		sum_var += pow((arr[i] - avg), 2);
	}
	sum_var /= size;
	stddev = sqrt(sum_var);
	
	printf("평균값은 %lf \n", avg);
	printf("표준편차값은 %lf \n", stddev);
}

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

학번
시험 #1
시험 #2
시험 #3
1
 
 
 
2
 
 
 
3
 
 
 
4
 
 
 
5
 
 
 

#include <stdio.h>
#include <stdlib.h> 
#include <time.h>

int main() {
	srand((unsigned)time(NULL));
	int st[5][3], row, col, max, min;
	row = sizeof(st) / sizeof(st[0]);
	col = sizeof(st[0]) / sizeof(st[0][0]);

	for (int j = 0; j < col; j++) {
		max = 0; min = 0;
		for (int i = 0; i < row; i++) {
			st[i][j] = rand() % 101;
			if (st[max][j] < st[i][j]) {
				max = i;
			}
			else if (st[min][j] > st[i][j]) {
				min = i;
			}
		}
		printf("시험 #%d의 최대점수 = %d \n", j + 1,st[max][j]);
		printf("시험 #%d의 최소점수 = %d \n", j + 1, st[min][j]);
	}
}

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

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

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

#define size 3

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

void print_arr(double n[]) {
	printf("[ ");
	for (int i = 0; i < size; i++) {
		printf("%.2lf ", n[i]);
	}
	printf("] ");
}

int main() {
	double a[size] = { 1,2,3 };
	double b[size] = { 1,2,3 };
	double c[size];

	vector_add(a,b,c);
	print_arr(a);
	printf("+ ");
	print_arr(b);
	printf("= ");
	print_arr(c);
}

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

#include <stdio.h>

#define size 3

void print_arr(double n[]) {
	printf("[ ");
	for (int i = 0; i < size; i++) {
		printf("%.2lf ", n[i]);
	}
	printf("]");
}

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

int main() {
	double a[size] = { 1,2,3 };
	double b[size] = { 1,2,3 };

	print_arr(a);
	printf("*");
	print_arr(b);
	printf(" = ");
	printf("%.2lf", vector_dot_prod(a, b));
}

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

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
	srand((unsigned)time(NULL));
	int item[10], size, a;
	size = sizeof(item) / sizeof(item[0]);
	for (int i = 0; i < size; i++) {
		item[i] = rand() % 100 + 1;
	}
	printf("상품 번호를 입력하시오: ");
	scanf("%d", &a);
	printf("상품 %d번은 선반 %d에 있습니다. ", a, item[a - 1]);
}

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

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

#include <stdio.h>

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

	for (int i = 0; i < scalar; i++) {
		for (int j = 0; j < scalar; j++) {
			printf("%d ", a[i][j] * 2);
		}
		printf("\n");
	}
}

int main() {
	int a[3][3] = { 1,2,3,4,5,6,7,8,9 };
	scalar_mult(a, 3);
}

 

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

#include <stdio.h>

transpose(int a[][3], int b[][3]) {
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			b[j][i] = a[i][j];
		}
	}
}

int main() {
	int a[3][3] = { 1,2,3,4,5,6,7,8,9 };
	int b[3][3];
	
	transpose(a, b);
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			printf("%d ", b[i][j]);
		}
		printf("\n");
	}
}

14. 어떤 석유 회사가 있다. 회사가 채굴하려고 하는 영역은 6행, 6열로 이루어진 36개의 셀로 분할된다. 회사는 시추 기술을 사용하여 각 셀의 잠재적 석유 매장량을 확인했다. 우리는 석유 매장량을 난수로 생성한다. 이 회사는 전체 영역 중에서 3 x 3 구역만을 빌리고자 한다. 가장 매장량이 많은 3 x 3 구역을 선정하고, 그 구역의 매쟝량을 출력하는 프로그램을 작성하라.

#include <stdio.h>


int hap(int area[][6], int a, int b) {
	int sum = 0;

	for (int i = a; i < a + 3; i++) {
		for (int j = b; j < b + 3; j++) {
			sum += area[i][j];
		}
	}
	return sum;
}



void print(int area[][6], int row, int col) {
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			printf("%d ", area[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

int main() {
	int area[][6] = { 1,2,3,3,5,2,1,2,3,3,5,2,1,2,3,3,5,2,1,2,3,0,0,0,1,2,3,0,0,0,1,2,3,0,0,0 };
	int row = sizeof(area) / sizeof(area[0]);
	int col = sizeof(area[0]) / sizeof(area[0][0]);
	int r, max, result;

	r = 2;
	max = 0;

	print(area,row,col);

	for (int i = 0; i < row - 2; i++) {
		for (int j = 0; j < col - 2; j++) {
			result = hap(area, i, j);
			if (max < result) {
				max = result;
			}
		}
	}
	printf("가장 매장량이 많은 구역의 매장량은 %d입니다. \n", max);


}

15. 수학에서의 "random walk"라 불리우는 문제를 프로그래밍하여보자. 술에 취한 딱정벌레가 10 x 10 크기의 타일 위에 있다. 딱정벌레는 임의의(랜덤) 위치를 선택하여 여기저기 걸어 다닌다. 현재의 위치에서 인접한 8개의 타일로 걸어가는 확률은 동일하다고 가정하자. 닥정하는 경로를 다음과 같이 표시하라.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

#define N 10

void printGrid(int tile[N][N]) {
    system("cls");  // 화면을 지우는 함수
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (tile[i][j] == 1)
                printf("* ");  
            else
                printf(". ");  
        }
        printf("\n");
    }
}

int main() {
    srand(time(NULL));  // 랜덤 시드 설정

    int tile[N][N] = { 0 }; 
    int x = N / 2, y = N / 2;
    tile[x][y] = 1; 


    while (1) {
        printGrid(tile);  // 현재 그리드 출력

        int move = rand() % 8;  

        // 딱정벌레 이동 방향 결정
        if (move == 0 && x > 0) x--;           // 북
        else if (move == 1 && x < N - 1) x++;  // 남
        else if (move == 2 && y > 0) y--;      // 서
        else if (move == 3 && y < N - 1) y++;  // 동
        else if (move == 4 && x > 0 && y > 0) { x--; y--; }       // 북서
        else if (move == 5 && x > 0 && y < N - 1) { x--; y++; }   // 북동
        else if (move == 6 && x < N - 1 && y > 0) { x++; y--; }   // 남서
        else if (move == 7 && x < N - 1 && y < N - 1) { x++; y++; }  // 남동

        tile[x][y] = 1;  // 딱정벌레가 지나간 타일에 1을 기록
        Sleep(500); 
    }
}

16. 지뢰 찾기는 예전에 윈도우에 무조건 포함되어있어서 상당히 많은 사람들이 즐겼던 프로그램이다. 2차원의 게임판 안에 지뢰가 숨겨져 있고 이 지뢰를 모두 찾아내는 게임이다. 10 x 10 크기의 2차원 배열을 만들고 여기에 30%의 위치에 지뢰를 숨긴다. 사용자가 지뢰가 없는 곳ㅇ르 클릭했을 때는 * 문자가 나온다 사용자가 지뢰를 열면 # 문자가 나오고 게임이 종료된다. 

.. 16이랑 17은 어려워서 보류..

01. 덧셈, 뺄셈, 곱셈, 나눗셈을 지원하는 계산기 프로그램을 작성하여 보자. 각 연산들이 몇 번식 계산되었는지를

기억하게 하자. 각 연산을 지원하는 함수들은 자신이 호출된 횟수를 화면에 출력한다.

 

(1) 정적 지역 변수를 사용하여 프로그램을 작성하라

(2) 전역 변수를 사용하여 프로그램을 작성하라.

(1)

#include <stdio.h>

int add(int a, int b);
int subtract(int a, int b);
int multiply(int a, int b);
int divide(int a, int b);

int main() {
	int a, b, result;
	char n;
	
	while (1) {
		printf("연산을 입력하시오: ");
		scanf("%d%c%d", &a, &n, &b);
		
		if (n == '+') {
			result = add(a, b);
		}
		else if (n == '-') {
			result = subtract(a, b);
		}
		else if (n == '*') {
			result = multiply(a, b);
		}
		else if (n == '/') {
			result = divide(a, b);
		}
		else {
			printf("잘못된 연산을 입력했습니다. \n");
			continue;
		}
		printf("연산의 결과: %d \n", result);
	}
}

int add(int a, int b) {
	static int x = 0;
	x++;
	printf("덧셈은 총 %d번 실행되었습니다. \n", x);
	return a + b;
}

int subtract(int a, int b) {
	static int x = 0;
	x++;
	printf("뺄셈은 총 %d번 실행되었습니다. \n", x);
	return a - b;
}

int multiply(int a, int b) {
	static int x = 0;
	x++;
	printf("나눗셈은 총 %d번 실행되었습니다. \n", x);
	return a / b;
}

int divide(int a, int b) {
	static int x = 0;
	x++;
	printf("곱셈은 총 %d번 실행되었습니다. \n", x);
	return a * b;
}

 

(2)

static int 변수명 대신 

함수밖에 int 변수명을 선언하면된다. 


 

02. 주사위를 던져서 각각의 면이 몇 번 나왔는지를 출력하는 프로그램을 작성하라. 주사위의 면은 난수를

이용하여 생성한다. 주사위를 던지는 함수 get_dice_face()를 만들고 각각의 면이 나올 때마다 그 횟수를 정적 지역

변수를 이용하여 기억하게 하라. get_dice_face() 호출 횟수가 100이 되면 각 면의 횟수를 출력한다.

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int dice() {
	static int count[6] = { 0 };
	static int call = 0;

	count[rand() % 6 ]++;
	call++;

	if (call == 100) {
		for (int i = 0; i < 6; i++) {
			printf("%d -> %d\n", i+1, count[i]);
		}
		return 0;
	}
	else
		return 1;
}

int main() {
	srand((unsigned)time(NULL));
	int n;
	do {
		n = dice();
	} while (n);
}

 

03. 로그인 시에 아이디를 검사하는 함수 int check()를 작성해서 테스트하라. check()가 한번 호출될 때마다 비밀

번호를 질문하고 일치 여부를 0과 1로 반환한다. 비밀번호는 숫자 1234로 고정되어 있다고 가정한다. check()가

3번 이상 호출되고 아이디가 일치하지 않으면 check()는 “로그인 시도 횟수 초과“ 메시지를 출력한다. check()

함수 안에 정적 변수를 선언하여 사용해보자

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int check() {
	static int count = 0;
	int user;
	int pass = 1234;
	
	count++;
	printf("비밀번호: ");
	scanf("%d", &user);

	if (pass == user)
		return 1;
	else if (count >= 3)
		return -1;
	else
		return 0;

}


int main() {
	int n;
	do {
		n = check();
	} while (n == 0);

	if (n == 1)
		printf("로그인 시도 완료");
	else
		printf("로그인 시도 횟수 초과");
}

 
 

04. 본문에서 설명한 바와 같이 정적 변수는 초기화를 딱 한 번만 수행하는 경우에도 사용된다. 난수를 생성하여

반환하는 함수 get_random()을 작성하여 테스트하라. get_random()이 처음으로 호출되는 경우에는 srand를 호출

하여서 난수의 시드를 초기화하고 그렇지 않으면 rand()를 호출하여 난수를 반환한다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>



void get_random() {
	static int i = 0;
	if (i == 0) {
		printf("초기화 실행 \n");
		srand((unsigned)time(NULL));
		i = 1;
	}
	printf("%d \n", rand());
}

int main() {
	for (int i = 0; i < 3; i++) {
		get_random();
	}
}

 

05. math.c 파일 안에 전역 변수 pi는 3.14로 초기화된다. main.c에서는 extern 키워드를 사용하여 math.c에 정의된 pi의 값을 출력하는프로그램을 작성해보자.   

float pi = 3.14;
#include <stdio.h>

extern float pi;

int main() {
	printf("pi = %.2f",pi);
}

 
 

06. 1부터 n까지의 합(1+2+3+4+…+n)을 계산하는 문제를 순환 기법을 이용하여 작성해보자.

#include <stdio.h>

int hap(int n) {
	if (n < 1) {
		return 0;
	}
	else {
		return n + hap(n - 1);
	}
}

int main() {
	int a;
	printf("정수를 입력하시오: ");
	scanf("%d", &a);
	printf("1부터 %d까지의 합=%d", a, hap(a));
}

 

07. 순환 기법을 이용하여 지수 값을 계산하는 함수 power(int base, int power_raised)를 작성하고 테스트해보자.

power(2,3)가 호출되면 2^3을 계산하여 반환한다

#include <stdio.h>

int power(int a, int b) {
	if (b < 1) {
		return 1;
	}
	else {
		return a * power(a, b - 1);
	}
}

int main() {
	int a, b;
	printf("밑수: ");
	scanf("%d", &a);
	printf("지수: ");
	scanf("%d", &b);
	printf("%d^%d = %d \n", a, b, power(a, b));
}

 

08. 순환 호출을 이용하여 정수의 각 자리수를 출력하는 함수 show_digit(int x)를 작성하고 테스트하라. 즉 정수가

1234이면 화면에 1 2 3 4와 같이 출력한다. 함수는 일의 자리를 출력하고 나머지 부분을 대상으로 다시 같은

함수를 순환 호출한다. 예를 들어서 1234의 4를 출력하고 나머지 123을 가지고 다시 같은 함수를 순환 호출한다.

1234를 10으로 나누면 123이 되고 4는 1234를 10으로 나눈 나머지이다.

 

#include <stdio.h>


void print(int a) {
	if (a > 0) {
		print(a / 10);
		printf("%d ", a % 10);
	}
}

int main() {
	int a;
	printf("정수를 입력하시오: ");
	scanf("%d", &a);
	print(a);
}

 

09. 사용자로부터 여러 개의 문자를 받아서 역순으로 출력하는 프로그램을 작성해보자. 순환 호출을 이용해본다.

#include <stdio.h>

void reverse() {
    static int a = 0;
    char c = getchar();
    if (c != '\n') {
        if (a == 0) {
            a = 1;
            printf("역순문장: ");
        }
        
        reverse();
        putchar(c);
    }
}
int main() {
    printf("문장을 입력하시오: "); 
    reverse();  
}

10. 다음과 같은 수식의 값을 계산하는 순환적인 프로그램을 작성하라.

1/1+1/2+1/3+…+1/n

#include <stdio.h>


double reverse(int n) {
	if (n < 1) 
		return 0;
	else {
		return 1.0 / n + reverse(n - 1);
	}
}

int main() {
	int a;
	scanf("%d", &a);
	printf("%lf",reverse(a));
}

 

11. 순환 호출을 이용하여 피보나치수열을 계산해 보자. 피보나치수열이란 다음과 같이 정의되는 수열이다.

#include <stdio.h>

int fib(int n) {
	if (n <= 1) 
		return n;
	else {
		return fib(n - 1) + fib(n - 2);
	}
}

int main() {
	int result;
	for (int i = 0; i <= 10; i++) {
		result = fib(i);
		printf("fib(%d) = %d \n", i, result);
	}
}

12. 우리는 8장에서 ATM을 구현해본 적이 있다. 여기서는 전역 변수를 사용하여서 소스를 변경해보자. 현재 계좌의 잔고는 전역 변수로 해보자(전역 변수도 사용해봐야 한다). 메뉴를 표시하는 코드도 별도의 함수로 독립시킨다. 
 

 

 
#include <stdio.h>

int money = 0;

void print();
void account();
void input();
void output();

int main() {
	int a, money = 0;
	while (1) {
		print();
		scanf("%d", &a);
		if (a < 1 || a > 4) {
			printf("메뉴에 없는 번호입니다. \n");
			continue;
		}
		if (a == 1) {
			account();
		}
		else if (a == 2) {
			input();
		}
		else if (a == 3) {
			output();
		}
		else {
			break;
		}
	}
}

void print() {
	printf("******* welcome to Express ATM ******* \n");
	printf("<1> 잔액 \n");
	printf("<2> 입금 \n");
	printf("<3> 출금 \n");
	printf("<4> 종료 \n");
	printf("메뉴를 선택하시오: ");
}

void account() {
	printf("잔고는 %d원입니다.\n\n", money);
}

void input() {
	int a;
	printf("입금 금액을 입력하시오: ");
	scanf("%d", &a);
	money += a;
	account();
}

void output() {
	int a;
	printf("출금 금액을 입력하시오: ");
	scanf("%d", &a);
	if (money < a) {
		printf("출금 금액이 잔고보다 많습니다.\n");
		output();
	}
	account();
}

01. 다음과 같은 간단한 기능을 하는 함수들을 작성하고, 사용자로부터 임의의 값을 입력받을 후에 작성한 함수들을 테스트하여 보자.

(a) 주어진 정수가 짝수이면 1을 반환하고 홀수이면 0을 반환하는 함수 int even(int n)

(b) 주어진 정수의 절대값을 구하는 함수 int absolute(int n)

(c) 주어진 정수가 음수이면 -1을, 양수이면 1을 0이면 0을 반환하는 함수 int sign(int n)

#include <stdio.h>

int even(int n);
int absolute(int n);
int sign(int n);

int main() {
	int a;
	printf("정수를 입력하시오: ");
	scanf("%d", &a);
	printf("even()의 결과: %d \n", even(a));
	printf("absolute()의 결과: %d \n", absolute(a));
	printf("sign()의 결과: %d \n", sign(a));
}

int even(int n) {
	if (n % 2 == 0) {
		return 1;
	}
	return 0;
}

int absolute(int n) {
	return (n > 0) ? n : -n;
}

int sign(int n) {
	if (n > 0) {
		return 1;
	}
	else if (n < 0) {
		return -1;
	}
	else {
		return 0;
	}
}

02. 두 개의 정수 n, m을 입력받아서 n이 m의 배수이면 1을 반환하고 그렇지 않으면 0을 반환하는 함수 is_multiple(int n, int m)를 작성하고 테스트하여 보자.

#include <stdio.h>

int is_multiple(int n, int m);

int main() {
	int n, m;
	printf("첫 번째 정수를 입력하시오: ");
	scanf("%d", &n);
	printf("두 번째 정수를 입력하시오: ");
	scanf("%d", &m);
	if (is_multiple(n, m)) {
		printf("%d은 %d의 배수입니다.", n, m);
	}
	else {
		printf("%d은 %d의 배수가 아닙니다.", n, m);
	}
}
int is_multiple(int n, int m) {
	if (n % m == 0) {
		return 1;
	}
	return 0;
}

03. 두 개의 실수 중에서 더 큰 수를 반환하는 함수 get_bigger()를 다음과 같이 작성하고 이것을 이용해서 사용자로부터 받은 실수 두 개 중에서 더 큰수를 출력하는 프로그램을 작성하여본다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

double get_bigger(double a, double b);

int main() {
	double a, b;
	printf("실수를 입력하시오: ");
	scanf("%lf %lf", &a, &b);
	printf("큰 수는 %.1lf입니다.", get_bigger(a, b));
}

double get_bigger(double a, double b) {
	return a > b ? a : b;
}

   

04. 전달된 문자가 알파벳 문자인지 아닌지를 검사하는 함수 check_alpha()를 작성하고 이것을 호출하여서 사용자가 입력한 문자가 알파벳('a'에서 'z'까지)인지를 판단하여 출력하는 프로그램을 작성하라.

#include <stdio.h>

void check_alpah(char c);

int main() {
	char c;
	printf("문자를 입력하시오: ");
	scanf("%c", &c);
	check_alpah(c);
}

void check_alpah(char c) {
	if (c >= 'a' && c <= 'z') {
		printf("%c는 알파벳 문자입니다.",c);
	}
	else {
		printf("%c는 알파벳 문자가 아닙니다.", c);
	}
}

05. 원의 면적을 구하는 문제를 함수로 작성하여 보자. 다음과 같은 식을 이용하라. 원의 면적을 구하는 함수 cal_area(double radius)를 작성하고 함수를 호출하려 원의 면적을 출력하는 전체 프로그램을 완성하라.

 

#include <stdio.h>
#define PI 3.141592
void cal_area(double radius);

int main() {
	double r;
	printf("원의 반지름을 입력하시오: ");
	scanf("%lf", &r);
	cal_area(r);
}

void cal_area(double radius) {
	printf("원의 면적은 %.2lf입니다.", radius * radius * PI);
}

 

06. 함수 is_leap( int year ) 함수로 작성하고 이 함수를 사용하여서 사용자가 입력한연도가 윤년인지를 출력하는 프로그램을 작성하라.

#include <stdio.h>

void is_leap(int year);

int main() {
	int year;
	printf("연도를 입력하시오: ");
	scanf("%d", &year);
	is_leap(year);
}

void is_leap(int year) {
	if ((year % 4 == 0 && year % 100 != 0)|| (year % 400 == 0)) {
		printf("%d년은 윤년입니다.", year);
	}
	else {
		printf("%d년은 윤년아닙니다.", year);
	}
}

07. 실수를 정수로 변환하면 소수점 이하는 잘려서 없어지게 된다. 예를 들어서 6.999를 정수로 변환하면 6이 된다. 실수에 0.5을 더하여 소수점 이하를 버리는 반올림 연산을 수행하는 함수 round(double f)를 작성하고 테스트하라. 단 f 는 양수라고 가정하라.

#include <stdio.h>

int round(double f);

int main() {
	double a;
	printf("실수를 입력하시오: ");
	scanf("%lf", &a);
	printf("반올림한 값은 %d입니다.", round(a));
}

int round(double f) {
	return (int)(f + 0.5);
}

 

08. 월급에 붙는 소득세를 계산하는 함수 get_tax(int income)를 작성하고 테스트하여 보자. 과표 구간은 1000만 원 이하 8%, 1000만 원 초과는 10%로 되어 있다고 가정한다. 사용자로부터 소득을 입력받아서 세금을 계산하는 프로그램을 작성하라.

 

#include <stdio.h>

int get_tax(int income);

int main() {
	int income;
	printf("소득을 입력하시오(만원):");
	scanf("%d", &income);
	printf("소득세는 %d만원입니다.", get_tax(income));
}

int get_tax(int income) {
	int extra, money, tax;

	if (income > 1000) {
		extra = income - 1000;
		money = 1000;
	}
	else {
		extra = 0;
		money = income;
	}
	tax = money * 0.08 + extra * 0.1;

}

09. 각도를 받아서 사인값을 반환하는 함수 sin_degree(double degree)를 작성하고 이 함수를 호출하여서 0도부터 180도까지, 10도 단위로 사인값을 출력하여보자.

#include <stdio.h>
#include <math.h>
#define PI 3.141592

double sin_degree(double degree);

int main() {
	for (double i = 0; i <= 180; i += 10) {
		printf("sin(%lf)의 값은 %lf \n", i,sin_degree(i));
	}
}

double sin_degree(double degree) {
	return sin(PI * degree / 180);
}

10. 난수(random number)는 컴퓨터를 이용한 문제 해결에서 많이 사용된다. 특히 수학적인 분석이 너무 복잡한 경우에 시뮬레이션을 사용하면 실제로 제품을 제작하기 않고서도 많은 실험을 할 수 있다.10에서 90까지의 정수를 무작위로 반환하는 함수 randint()를 작성하고 10번 호출하여보자. 힌트: (a~ b)까지 범위 구하기 ( a + rand()%(b-a+1))

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int randint() {
	return 10 + rand() % 81;
}

int main() {
	srand((unsigned)time(NULL));
	for (int i = 0; i < 10; i++) {
		printf("%d ", randint());
	}
}

11. 사용자와 컴퓨터가 주사위 게임을 한다고 하자. 주사위를 각 3번씩 굴려서 주사위 점수를 합한다. 함친 점수가 높은 쪽이 이긴다고 하자.     

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int randint() {
	int sum = 0, a;
	for (int i = 0; i < 3; i++) {
		a = 1 + rand() % 6;
		sum += a;
		if (i == 2) {
			printf("%d", a);
		}
		else {
			printf("%d, ", a);
		}
	}
	return sum;
}

int main() {
	int user, com;
	srand((unsigned)time(NULL));

	printf("사용자 주사위=(");
	user = randint();
	printf(")=%d \n", user);

	printf("컴퓨터 주사위=(");
	com = randint();
	printf(")=%d \n", com);

	if (user > com) {
		printf("사용자 승리");
	}
	else if (user == com) {
		printf("사용자와 컴퓨터 비김");
	}
	else {
		printf("컴퓨터 승리");
	}
}

12. 양의 십진수를 받아서 가장 상위 자리수를 반환하는 함수 get_first_digit(int n)를 작성하라. 예를 들어서 1099999이라면 1을 반환하여야 한다. 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void print(int n) {
	if (n <10)
		printf("가장 상위 자리수는 %d입니다.", n);
	else
		print(n / 10);

}

int main() {
	int n;
	printf("정수를 입력하시오 :  ");
	scanf("%d", &n);
	print(n);
}
#include <stdio.h>


int get_first_digit(int n) {
	while (n > 9) {
		n /= 10;
	}
	return n;
}

int main() {
	int a;
	printf("정수를 입력하시오: ");
	scanf("%d", &a);
	printf("가장 상위 자리수는 %d입니다.", get_first_digit(a));
}

13. 두 점사이의 거리를 계산하는 함수를 작성하여 보자. 2차원 공간에서 두 점 와 사이의 거리를 계산하는 get_distance(double x1, double x2, double y1, double y2)를 작성하시오. 다음과 같은 두 점 사이의 거리를 계산하는 공식을 사용하라. 제곱근은 sqrt() 라이브러리 함수를 사용하라.

#include <stdio.h>
#include <math.h>

double get_distance(double x1,double y1,double x2,double y2){
	return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

int main() {
	double x, y, a, b;
	printf("첫 번째 점의 좌표를 입력하시오: ");
	scanf("%lf %lf", &x, &y);
	printf("두 번째 점의 좌표를 입력하시오: ");
	scanf("%lf %lf", &a, &b);
	printf("두 점 사이의 거리는 %lf입니다.", get_distance(x, y, a, b));
}

14. 어떤정수가 소수 2개의 합으로 표시될 수 있는지를 검사하는 프로그램을 작성해보자. 이 문제는 함수를사용하지 않으면 구현하기가 상당히 어렵다. 컴퓨터는 반복을 굉장히 쉽게 한다는 것을 이용한다 정수라면 반복 횟수가 제한되기 대문에 모든 경의 수를 다검사할수 있다. 본문에서 작성한 is_prime()함수를 사용한다 .

#include <stdio.h>


int is_prime(int a) {
	for (int i = 2; i < a; i++) {
		if (a % i == 0) {
			return 0;
		}
	}
	return 1;
}

int main() {
	int a;
	printf("양의 정수를 입력하시오: ");
	scanf("%d", &a);

	for (int i = 2; i <= a - 2; i++) { // a - 1 이면  a = 1 + (a-1) 이 되기때문, 1은 소수가 될수 없음 
		if (is_prime(i) && is_prime(a - i)) {
			printf("%d = %d + %d \n", a, i, a - i);
		}
	}
}

15. 오일러의 수 e는 자연 로그의 밑수로 사용된다. 이 값은 다음과 같은 식에 의하여 근사치를 구할 수 있다. 본문에 있는 팩토리얼 값을 계산하는 함수 tactorial()을 호출하여서 오일러의 수를 계산하는 프로그램을 작성하라.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

double oil(int n) {
	double sum = 1;
	int term = 1;

	for (int i = 1; i <= n; i++) {
		term *= i;
		sum += 1. / term;
	}
}


int main() {
	int n;
	printf("어디까지 계산할까요: ");
	scanf("%d", &n);
	printf("오일러의 수는 %lf입니다.", oil(n));
}
#include <stdio.h>

int facotrial(int n) {
	int result = 1;
	for (int i = 1; i <= n; i++) {
		result *= i;
	}
	return result;
}

int main() {
	int n;
	double result = 0;

	printf("어디까지 계산할까요: ");
	scanf("%d", &n);

	for (int i = 0; i <= n; i++) {
		result += 1.0 / facotrial(i);
	}
	printf("오일러의 수는 %lf입니다.", result);
}

 

재귀함수

#include <stdio.h>

int fac(n) {
	if (n < 1)
		return 1;
	else
		return n * fac(n - 1);
}


double oil(int n) {
	if (n < 1) {
		return 1;
	}
	else 
		return 1. / fac(n) + oil(n - 1);
}

int main() {
	int n;
	printf("어디까지 계산할까요: ");
	scanf("%d", &n);

	printf("오일러의 수는 %lf", oil(n));

}

16. 은행에 설치되어 있는 ATM 장치를 프로그램으로 구현해보자. 가능하다면 소스의 많은 부분을함수로 구현해본다.

#include <stdio.h>

int money = 0;

void print();
void account();
void input();
void output();

int main() {
	int a, money = 0;
	while (1) {
		print();
		scanf("%d", &a);
		if (a < 1 || a > 4) {
			printf("메뉴에 없는 번호입니다. \n");
			continue;
		}
		if (a == 1) {
			account();
		}
		else if (a == 2) {
			input();
		}
		else if (a == 3) {
			output();
		}
		else {
			break;
		}
	}
}

void print() {
	printf("******* welcome to Express ATM ******* \n");
	printf("<1> 잔액 \n");
	printf("<2> 입금 \n");
	printf("<3> 출금 \n");
	printf("<4> 종료 \n");
	printf("메뉴를 선택하시오: ");
}

void account() {
	printf("잔고는 %d원입니다.\n\n", money);
}

void input() {
	int a;
	printf("입금 금액을 입력하시오: ");
	scanf("%d", &a);
	money += a;
	account();
}

void output() {
	int a;
	printf("출금 금액을 입력하시오: ");
	scanf("%d", &a);
	if (money < a) {
		printf("출금 금액이 잔고보다 많습니다.\n");
		output();
	}
	account();
}

01. 가끔은 일정한 시간 동안 아무 일도 하지 않으면서 시간을 지연시킬 목적으로 반복문을 사용하기도 한다. 사용자에게서 하나의 수를 입력받아서 변수에 저장한다. 반복문을 사용하여 이 변수의 값을 1씩 감소시키면서 이 변수의 값이 0이 될 때까지 반복한다. 반복이 끝나면 벨소리를 낸다.

#include <stdio.h>

int main() {
	int sec;
	printf("카운터의 초기값을 입력하시오 (단위: 초): ");
	scanf("%d", &sec);
	for (int i = sec; i > 0; i--) {
		printf("%d ", i);
	}
}

 


02. 1부터 100사이의 모든 3의 배수의 합을 계산하여 출력하는 프로그램을 반복 구조를 사용하여 작성하라.

#include <stdio.h>

int main() {
	int sum = 0;
	for (int i = 1; i <= 100; i++) {
		if (i % 3 == 0) {
			sum += i;
		}
	}
	printf("1부터 100 사이의 모든 3의 배수의 합은 %d입니다.", sum);
}


03. 사용자가 입력한 정수 3개의 합을 계산하여 출력한다. 다만 사용자가 음수를 입력하면 이것은 합계에서 제외된다.

#include <stdio.h>

int main() {
	int a, i = 0, sum = 0;
	while (i < 3) {
		printf("숫자를 입력하시오: ");
		scanf("%d", &a);
		if (a < 0) {
			continue;
		}
		i++;
		sum += a;
	}
	printf("\n합계는 %d입니다.", sum);
}

04. 사용자가 입력한 정수의 모든 약수를 화면에 출력하는 프로그램을 작성하라.

#include <stdio.h>

int main() {
	int a;
	printf("정수를 입력하시오: ");
	scanf("%d", &a);
	printf("약수: ");
	for (int i = 1; i <= a; i++) {
		if (a % i == 0) {
			printf("%d ", i);
		}
	}
}

 


05. 실수의 거듭 제곱값을 계산하는 프로그램을 작성하여 보자. 사용자로부터 하나의 실수 r와 거듭 제곱 횟수를 나타내는 정수 n을 입력받아서 r^n을 구하여 화면에 출력한다.

#include <stdio.h>

int main() {
	double r, n, result = 1;
	printf("실수의 값을 입력하시오: ");
	scanf("%lf", &r);
	printf("거듭 제곱 횟수를 입력하시오: ");
	scanf("%lf", &n);
	for (int i = 0; i < n; i++) {
		result *= r;
	}
	printf("결과값은 %lf", result);
}

06. 1^2 + 2^2  + 3^2 + ... + n^2의 값을 계산하여 출력하여보자.

#include <stdio.h>

int main() {
	int n, result = 0;
	printf("n의 값을 입력하시오: ");
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		result += i * i;
	}
	printf("계산값은 %d", result);
}

07. 반복 루프를 사용하여 다음과 같은 패턴을 출력하는 프로그램을 작성하라.

#include <stdio.h>

int main() {
	for (int i = 1; i <= 7; i++) {
		for (int j = 1; j <= 7 - i; j++) {
			printf(" ");
		}
		for (int j = 1; j <= i; j++) {
			printf("*");
		}
		printf("\n");
	}
}

 


08. 중천 반복문을 사용하여서 다음과 같이 출력하는 프로그램을 작성하여 보자.

#include <stdio.h>

int main() {
	int n;
	printf("정수를 입력하시오: ");
	scanf("%d", &n);
	for (int i = 1; i <= 5; i++) {
		for (int j = 1; j <= i; j++) {
			printf("%d ", j);
		}
		printf("\n");
	}
}

09. 사용자가 입력한 두 숫자의 최소공배수를 계산하는 프로그램을 작성한다. 두 정수의 최소공배수는 가장 적은 공배수이다. 예를 들어, 72와 120의 LCM은 360이다.

#include <stdio.h>

int main() {
	int a, b, r;
	printf("정수 2개를 입력하시오: ");
	scanf("%d %d", &a, &b);
	printf("\n");
	
	r = (a >= b) ? a : b;
	while (1) {
		if ((r % a == 0) && (r % b == 0)) {
			break;
		}
		r++;
	}
	printf("\n최소공배수는 %d입니다. ", r);

}
#include <stdio.h>

int main() {	
	int r;
	int a, b;

	printf("정수 2개를 입력하시오: ");
	scanf("%d %d", &a, &b);

	r =(a > b) ? a : b;


	while (r % a != 0 || r % b != 0) {
		r++;
	}

	printf("최소공배수는 %d입니다.", r);


}

10. 2와 100 사이에 있는 모든 소수(prime number)를 찾는 프로그램을 작성하라. 정수가 소수가 되려면 1과 자기 자신만을 약수로 가져야 한다.

#include <stdio.h>

int main() {
	int a; // 소수인지 아닌지 판단 기준
	for (int i = 2; i <= 100; i++) {
		a = 1; // 소수
		for (int j = 2; j < i; j++) {
			if (i % j == 0) {
				a = 0; // 소수가 아님
			}
		}
		if (a == 1) {
			printf("%d ", i);
		}
	}
}

 


11. 자동차의 연료 탱크 프로그램을 시뮬레이션하여보자. 초기값이 100리터이고, 연료 탱크의 최대 용량은 500리터이다. 사용자가 주행을 하면 연료가 줄어든다. 반복문을 사용하여서 사용자로부터 충전 또는 사용한 연료를 입력받아서 연료 탱크에 남아 있는 연료가 20리터 미만이면 경고를 출력한다.

#include <stdio.h>

int main() {
	int fuel = 100, a;

	while (1) {
		printf("현재 연료량: %d \n", fuel);
		if (fuel <= 0){
			printf("연료가 고갈되었습니다. \n");
			break;
		}
		else if (fuel < 20) {
			printf("(경고) 연료가 20리터 미만입니다.\n");
		}
		
		printf("연료 충전은 +, 소모는 -로 입력해주세요: ");
		scanf("%d", &a);
		printf("\n");
		fuel += a;
	}
}

12. 컴퓨터는 막대 그래프를 그리는 데도 사용된다. 사용자로부터 1부터 50사이의 숫자를 입력받아서 숫자만큼의 별표를 출력하는 프로그램을 작성하라. 막대는 가로로 그려지게 된다.

#include <stdio.h>

int main() {
	int a;
	while (1) {
		printf("막대의 높이(종료:-1): ");
		scanf("%d", &a);
		if (a < 0) {
			break;
		}
		for (int i = 0; i < a; i++) {
			printf("*");
		}
		printf("\n");
	}
}

13. (1+2+3+...+n)가 10000을 넘지 않으면서 가장 큰 값과 그 때의 n의 값을 구하라.

#include <stdio.h>

int main() {
	int sum = 0, i = 0;

	while (sum < 10000) {
		i++;
		sum += i;
	}

	sum -= i;
	i--;

	printf("1부터 %d까지의 합은 %d입니다.", i, sum);
}

 


14. 피보나치 수열은 다음과 같이 정의되는 수열이다.

    

    f0=0

    f1=1

    fi+1=fi+fi-1  for i=1,2,...

피보나치 수열에서는 앞의 2개의 원소를 합하여 뒤의 원소를 만든다. 피보나치 수열은 컴퓨터에서도 탐색 문제 등에 사용되기도 한다. 피보나치 수열을 생성하여 출력하는 프로그램을 작성하여 보자.

#include <stdio.h>

int main() {
	int n;
	int a = 0, b = 1, c;

	printf("몇번째 항까지 구할까요? ");
	scanf("%d", &n);

	for (int i = 0; i <= n; i++) {
		printf("%d, ",a);

		c = a + b;
		a = b;
		b = c;
	}
}

15. 서로 다른 n개에서 r개를 택하여 일렬로 나열하는 방법의 수를 순열(permutation)이라 하고, nPr로 표시한다. 순열은 다음과 같은 식을 이용하여 구할 수 있다. 순열을 구하는 프로그램을 작성하라. n과 r은 사용자가 입력할 수 있도록 하라.

    nPr=n(n-1)(n-2)...(n-r+1)

#include <stdio.h>

int main() {
	int n, r, result = 1;
	printf("n의 값: ");
	scanf("%d", &n);
	printf("r의 값: ");
	scanf("%d", &r);

	for (int i = n; i >= (n - r + 1); i--) {
		result *= i;
	}

	printf("순열의 값은 %d입니다.", result);

}
#include <stdio.h>

int main() {
	int n, r;
	printf("n의 값: ");
	scanf("%d", &n);
	printf("r의 값: ");
	scanf("%d", &r);
	int result = 1;
	for (int i = 0; i < r; i++) {
		result *= (n - i);
	}
	printf("순열의 값은 %d입니다.", result);
}

16. 사용자가 입력한 특정한 정수의 자리수를 반대로 출력하는 프로그램을 작성하라. 예를 들어서 사용자가 정수 1206을 입력하였다면 6021이 출력되어야 한다. do...while 문을 사용하여 보라.

#include <stdio.h>

int main() {
	int a;
	printf("정수를 입력하시오: ");
	scanf("%d", &a);
    
	while (a > 0) {
		printf("%d", a % 10);
		a /= 10;
	}
}

17. 앞장에서 간단한 정수 계산기를 만들어본 적이 있다. 이 계산기 프로그램에 메뉴를 추가하도록 한다. 다음과 같은 메뉴를  화면에 출력하고 사용자가 메뉴 중에서 하나를 선택할 때까지 반복을 계속한다. 만약 사용자가 A, S, M, D, Q가 아닌 다른 문자를 입력하면  "연산을 선택하시오:" 메시지를 계속해서 출력한다. 하나의 메뉴가 선택되면 해당되는 연산을 실행하고 다시 메뉴를 선택할 수 있도록 하라. 

#include <stdio.h>

int main() {
	char c;
	int a, b, result;
	do {
		printf("***************\n");
		printf("A---- Add\n");
		printf("S---- Subtract\n");
		printf("M---- Multiply\n");
		printf("D---- Divide\n");
		printf("Q---- Quit\n");
		printf("***************\n");
		printf("연산을 선택하시오: ");
		scanf("%c", &c);
		if (c == 'Q') {
			break;
		}
		printf("두 수를 공백으로 분리하여 입력하시오: ");
		scanf("%d %d", &a, &b);

		if (c == 'A') {
			printf("%d \n", a + b);
		}
		else if (c == 'S') {
			printf("%d \n", a - b);
		}
		else if (c == 'M') {
			printf("%d \n", a * b);
		}
		else if (c == 'D') {
			printf("%d \n", a / b);
		}
		else {
			printf("지원되지 않는 연산자입니다. \n");
		}

	} while (1);
}

18. 사용자로부터 n을 입력받아서 조화 수열의 합을 표시하는 프로그램을 C로 작성해보자. 조화 수열은 각 항의 역수가 등차 수열을 이루는 수열로서 각 항은 점차 작아져서 0에 한없이 가까워지지만, 그 역 수의 합은 무한대가 된다고 알려져 있다. 사실일까? 컴퓨터로 천만개까지 계산해보자. (조건문 초기식 주의)

 

#include <stdio.h>

int main() {
	int n;
	double result = 0;
	printf("항의 개수: ");
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) { // 초기식이 i = 0; 이면 안된다
		result += 1.0 / i;
	}
	printf("수열의 합=%lf", result);
}

19. 몬테카를로 시뮬레이션을 이용하여 파이의 값을 계산하여보자. 몬테카를로 시뮬레이션은 난수를 이용하여 수학적인 문제나 물리학적인 문제를 해결하는 기법이다 아래와 같이 사각형과 원을 그리고난수를 생성하여서 그림 위에 찍는다(프로그램에서 실제로 그림을 그리는 것은 아니다.) 원의 반지름은 1이라고 하자. 그러면 원의 면적은 PI이고 사각형의 면적은 4이다. 따라서 점이 원 내부에 찍힐확률은 (원의 면적)/(사각형의 면적)=PI / 4가 된다. 따라서 점을 1,000,000개 정도 찍으면 우리는 파이의 값을 꽤 정확하게 추정할 수 있다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main() {
    int p, p_in = 0;
    double x, y, pi;
    srand(time(NULL));

    printf("반복 횟수: ");
    scanf("%d", &p);


    for (int i = 0; i < p; i++) {
        x = (double)rand() / RAND_MAX * 2.0 - 1.0;  // -1과 1 사이의 난수
        y = (double)rand() / RAND_MAX * 2.0 - 1.0;  // -1과 1 사이의 난수

        if (x * x + y * y <= 1.0) {  // 점이 원 안에 있는지 확인
            p_in++;
        }
    }

    // 파이 추정값 계산
    pi = (double)p_in /p * 4.0;
    printf("추정된 파이 값: %lf\n", pi);
}
 

20. NIM 게임을 구현하여보자. 스틱들의 뭉치를 가정한다. 사용자와 컴퓨터는 번갈아서 스틱 뭉치에서 0개에서 3개 사이로 스틱을 가져갈 수 있다. 마지막 스틱을 가져가는 사람이 지는 게임이다. 스틱의 초기 개수는 12개라고 하자. NIM 게임에서는 전략이 있으나 여기서는 전략은 전혀 고려하지 않는다. 컴퓨터는 무조건 0부터 3 사이의 난수를 발생시켜서 스틱을 가져간다. 발생된 난수가 현재 스틱 개수보다 크면 스틱 개수로 제한한다. 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
	srand((unsigned)time(NULL));
	int stick = 12;
	int user, com;
	int can_stick = 4;

	while (1) {
		printf("현재 스틱의 개수: %d \n", stick);
		printf("몇개의 스틱을 가져가시겠습니까? : ");
		scanf("%d", &user);
		if (user < 1 || user > 3) {
			printf("1개부터 3개까지 가능합니다. \n");
			continue;
		}
		stick -= user;
		if (stick == 0) {
			printf("컴퓨터가 승리 했습니다. \n");
			break;
		}
		if (stick < 3) {
			can_stick = stick+1; // stick+1 -> 0 ~ stick 범위 / stick -> 0 ~ (stick-1) 범위
		}
		com = rand() % can_stick;
		stick -= com;
		printf("컴퓨터는 %d개의 스틱을 가져갔습니다. \n\n", com);

		if (stick == 0) {
			printf("유저가 승리 했습니다.\n");
			break;
		}
	}
}

21. 우리는 앞에서 컴퓨터가 숨기고 있는 숫자를 사람이 맞히는 프로그램을 살펴보았다. 이번에는 반대로 하여보자. 사용자가 숨기고 있는 숫자를 컴퓨터가 알아맞히는 프로그램을 작성해보자. 게임 도중에 사용자는 숫자를 변경하면 안된다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int com, res;
	int max, min;

	max = 100;
	min = 1;

	printf("컴퓨터가 당신이 생각하는 숫자를 알아맞히는 게임입니다.\n");
	printf("하나의 숫자를 생각하세요. \n");
	printf("컴퓨터가 제시한 숫자보다 정답이 높으면 1, 낮으면 -1라고 하세요. \n");
	printf("컴퓨터가 숫자를 맞히면 0라고 하세요. \n\n");

	do {
		com = (max + min) / 2;
		printf("숫자가 %d 인가요? ", com);
		scanf("%d", &res);
		if (res == 1) {
			min = com + 1;
		}
		else if (res == -1) {
			max = com - 1;
		}
	} while (res != 0);


}

01. 사용자로부터 2개의 정수를 받아서 첫 번째 정수가 두 번째 정수로 나누어 떨어지는 지를 검사하는 프로그램을 작성하라. 즉, 약수인지를 검사한다.

#include <stdio.h>

int main() {
	int a, b;
	printf("정수를 입력하시오: ");
	scanf("%d", &a);
	printf("정수를 입력하시오: ");
	scanf("%d", &b);
	if (a % b == 0) {
		printf("약수입니다.");
	}
}

02. 사용자로부터 3개의 정수를 읽어 들인 후에 if-else 문을 사용하여 가장 작은 값을 결정하는 프로그램을 작성하라.

#include <stdio.h>

int main() {
	int a, b, c, min;
	printf("정수 3개를 입력하시오: ");
	scanf("%d %d %d", &a, &b, &c);
	if (a < b) {
		if (a < c) {
			min = a;
		}
		else {
			min = c;
		}
	}

	else {
		if (b < c) {
			min = b;
		}
		else {
			min = c;
		}
	}
	printf("제일 작은 정수는 %d입니다.", min);
}

03. 컴퓨터와 가위, 바위, 보 게임을 하는 프로그램을 작성하라. 컴퓨터는 사용자에게 알리지 않고 가위, 바위, 보 중에서 임의로 하나를 선택한다. 사용자는 프로그램의 입력 안내 메기지에 따라서, 3개 중에서 하나를 선택하게 된다. 사용자의 선택이 끝나면 컴퓨터는 누가 무엇을 선택하였고 누가 이겼는지, 비겼는지를 알려준다.

#include <stdio.h>
#include <time.h>

int main() {
	int user, com;
	srand((unsigned)time(NULL));

	printf("(1: 가위 2:바위 3:보) 중에서 하나를 선택하시오: ");
	scanf("%d", &user);

	com = rand() % 3 + 1;
	if (com == 1) {
		printf("컴퓨터는 가위를 선택하였습니다.\n\n");
	}
	else if (com == 2) {
		printf("컴퓨터는 바위를 선택하였습니다.\n\n");
	}
	else {
		printf("컴퓨터는 보를 선택하였습니다.\n\n");
	}

	if ((com == 1 && user == 3) || (com == 2 && user == 1) || (com == 3 && user == 2)) {
		printf("컴퓨터가 이겼습니다. \n");
	}
	else if ((user == 1 && com == 3) || (user == 2 && com == 1) || (user == 3 && com == 2)) {
		printf("사용자가 이겼습니다. \n");
	}
	else {
		printf("비겼습니다.");
	}
}

04. 놀이 공원에서 롤러코스터에 타려면 키가 140cm 이상이고 나이가 10살 이상이어야 한다고 가정하자. 사용자에게 키와 나이를 질문한 후에 "타도 좋습니다." 또는 "죄송합니다."를 출력하는 프로그램을 작성하여보자. 

#include <stdio.h>

int main() {
	int k, n;
	printf("키를 입력하시오(cm): ");
	scanf("%d", &k);
	printf("나이를 입력하시오: ");
	scanf("%d", &n);

	if (k >= 140 && n >= 10) {
		printf("\n타도 좋습니다. \n");
	}
	else {
		printf("\n죄송합니다. \n");
	}
}

05. 사용자로부터 몇 월인지 정수로 입력받아서 Jan와 같은 영어단어로 출력하는 프로그램을 작성하라.

#include <stdio.h>

int main() {
	int month;
	printf("월 번호를 입력하시오: ");
	scanf("%d", &month);

	switch (month) {
		case 1:
			printf("Jan");
			break;
		case 2:
			printf("Feb");
			break;
		case 3: 
			printf("Mar");
			break;
		case 4:
			printf("Apr");
			break;
		case 5:
			printf("May");
			break;
		case 6:
			printf("Jun");
			break;
		case 7:
			printf("Jul");
			break;
		case 8:
			printf("Aug");
			break;
		case 9:
			printf("Sep");
			break;
		case 10:
			printf("Oct");
			break;
		case 11:
			printf("Nov");
			break;
		case 12:
			printf("Dec");
	}
}

06. 키보드에서 하나의 문자를 읽어서 모음과 자음을 구분하는 프로그램을 작성하여보자. 단 swtich 문을 사용한다.

#include <stdio.h>

int main() {
	char a;
	printf("문자를 입력하시오: ");
	scanf("%c", &a);

	switch (a) {
	case 'A': case 'E': case 'I': case 'O': case'U':
	case 'a': case 'e': case 'i': case 'o': case'u':
		printf("모음입니다.");
		break;
	default: 
		printf("자음입니다.");
	}
}

07. 사용자로부터 키를 입력받아서 표준 체중을 계산한 후에 사요자의 체중과 비교하여 저체중인지, 표준 체중인지, 과체중인지를 판단하는 프로그램을 작성하라. 표준 체중 계산식은 다음을 사용하라.

#include <stdio.h>

int main() {
	double w, st_w, k;
	printf("체중과 키를 입력하시오: ");
	scanf("%lf %lf", &w, &k);
	st_w = (k - 100) * 0.9;
	
	if (w < st_w) {
		printf("저체중입니다.");
	}
	else if (w == st_w) {
		printf("표준입니다.");
	}
	else {
		printf("과체중입니다.");
	}
}

08. 놀이 공원의 자유이용권의 가격을 계산하는 프로그램을 작성하여보자. 입장료는 다음과 같은 조건으로 결정된다. 현재 시간과 사용자의 나이를 입력받아서 지불하여야 하는 요금을 화면에출력한다.

 

#include <stdio.h>

int main() {
	int time, age, pay;
	printf("현재 시간과 나이를 입력하시오(시간 나이): ");
	scanf("%d %d", &time, &age);
	if (time < 17) {
		if ((age >= 3 && age <= 12) || age >= 65) {
			pay = 25000;
		}
		else {
			pay = 34000;
		}
	}
	else {
		pay = 10000;
	}
	printf("요금은 %d원 입니다.", pay);

}

09.  다음과 같이 정의되는 함수의 함수값을 게산하여보자. 사용자로부터 x값을 입력받아서 함수값을 계산하여 화면에 출력한다. x는 실수이다.

#include <stdio.h>

int main() {
	double x, y;
	printf("x의 값을 입력하시오: ");
	scanf("%lf", &x);
	if (x<= 0) {
		y = x * x - 9 * x + 2;
	}
	else {
		y = 7 * x + 2;
	}
	printf("f(x)의 값은 %.2lf 입니다.", y);
}

10. (x,y) 좌표를 입력받아서 좌표가 속하는 사분면을 화면에 출력하는 프로그램을 작성하시오.

#include <stdio.h>

int main() {
	int x, y, z;
	printf("x, y좌표를 입력하시오: ");
	scanf("%d %d", &x, &y);
	if (x > 0 && y > 0) {
		z = 1;
	}
	else if (x < 0 && y > 0) {
		z = 1;
	}
	else if (x < 0 && y < 0) {
		z = 3;
	}
	else {
		z = 4;
	}
	printf("%d사분면입니다.", z);
}

11. 사용자로부터 하나의 문자를 입력받아서 문자가 'R'이나 'r'이면 "Renctangle"이라고 출력한다. 'T'이거나 't'이면 "Triangle", "C"이거나 "c"이면 "Circle"이라고 출력하는 프로그램을 작성한다. 그 외의 문자가 들어오면 "Unknwon"이라고 출력한다.

#include <stdio.h>

int main() {
	char a;
	printf("문자를 입력하시오: ");
	a = getchar();
	if (a == 'R' || a == 'r') {
		printf("Rectangle");
	}
	else if (a == 'T' || a == 't') {
		printf("Triangle");
	}
	else if (a == 'C' || a == 'c') {
		printf("Circle");
	}
	else {
		printf("Unknown");
	}
}

12. 2자리 숫자로이루어진 복권이 있다. 사용자가 가지고 있는 복권 번호가 2자리 모두 일치하면 100만원을 받는다. 2자리 중에서 하나만 일치하면 50만원을 받는다. 하나도 일치하지 않으면 상금은 없다. 복권 당첨 번호는 난수로 생성하고 사용자의 입력에 따라서 상금이 얼마인지를 출력하는 프로그램을 작성하라.

 

#include <stdio.h>
#include <time.h>

int main() {
	srand((unsigned)time(NULL));
	int com, user;
	int com_digit1, com_digit2;
	int user_digit1, user_digit2;

	printf("복권 번호를 입력하시오(0에서 99사이):");
	scanf("%d", &user);
	user_digit1 = user / 10;
	user_digit2 = user % 10;

	com = rand() % 100;
	com_digit1 = com / 10;
	com_digit2 = com % 10;
	printf("당첨번호는 %d입니다.\n", com);
	
	
	if (com == user) {
		printf("상금은 100만원입니다.");
	}
	else if ((com_digit1 == user_digit1) || (com_digit1 == user_digit2) || (com_digit2 == user_digit1) || (com_digit2 == user_digit2)) {
		printf("상금은 50만원입니다.");
	}
	else {
		printf("상금은 없습니다.");
	}
}

01. 사용자로부터 2개의 정수를 입력받아서 첫 번째 정수를 두 번째 정수로 나누었을 때 얻게 되는 몫과 나머지를 출력하는 프로그램을 작성하시오.

#include <stdio.h>

int main() {
	int a, b;
	printf("2개의 정수를 입력하시오: ");
	scanf("%d %d", &a, &b);
	printf("몫: %d 나머지: %d \n", a / b, a % b);
}

02. 2개의 double 형의 실수를 읽어서 합, 차, 곱, 몫을 구하는 프로그램을 작성하라.

#include <stdio.h>

int main() {
	double a, b;
	printf("실수를 입력하시오: ");
	scanf("%lf %lf", &a, &b);
	printf("합: %.2lf 차: %.2lf 곱: %.2lf 몫: %.2lf \n", a + b, a - b, a * b, a / b);
}

03. 3개의 정수값을 입력받아서. 3개의 정수값 중에서 최대값을 출력하는 프로그램을 작서앟라.

#include <stdio.h>

int main() {
	int a, b, c, max;
	printf("3개의 정수를 입력하시오: ");
	scanf("%d %d %d", &a, &b, &c);
	max = (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c);
	// max = (a > b && a > c) ? a : ((b > c) ? b : c);
	printf("최대값 %d \n", max);
}

04. cm로 표현된 키를 입력하여 피트와 인치로 변환하는 프로그램을 작성하시오. 1피트는 12인치이고 1인치는 2.54cm이다.

#include <stdio.h>
#define ONE_FEET 12
#define ONE_INCH 2.54

int main() {
	int cm, feet;
	double inch;
	printf("키를 입력하시오 (cm): ");
	scanf("%d", &cm);
	inch = cm / ONE_INCH;
	feet = inch / ONE_FEET;
	inch = inch - feet * 12;
	printf("%dcm는 %d피트 %.2lf인치 입니다. \n", cm, feet, inch);
}

 


05. 100보다 작은 정수를 입력받아서 이것을 십의 자리, 일의 자리로 분리하여 출력하는 프로그램을 작성하시오. 즉, 사용자가 정수 23을 입력하면 2,3을 차례로 출력하면 된다. 

#include <stdio.h>

int main() {
	int a;
	printf("정수를 입력하시오: ");
	scanf("%d", &a);
	printf("십의 자리: %d \n", a / 10);
	printf("일의 자리: %d \n", a % 10);
}

06. (1.0-0.9)==0.1의 값은 당연히 1이어야 한다. 하지만 0이 출력된다. 출력값이 1이 나오도록  코드를 작성해보자. 부동소수점수를 비교할 때는 어덯게 하여야 하는가?

#include <stdio.h>

int main() {
	int a;
	printf("정수를 입력하시오: ");
	scanf("%d", &a);
	printf("2의 보수: %d", ~a + 1);
}

07. 정수에 비트 연산자 <<를 한 번 적용하면 2를 곱한 값을 얻을 수 있다. 또 정수에 비트 연산자 >>를 한 번 적용하면 2로 나눈 값을 얻을 수 있다. 사용자로부터 정수 x, y 를 입력받아서 x<<y의 값을 출력하는 프로그램을 작성하여보자.

#include <stdio.h>

int main() {
	int a, b;
	printf("정수를 입력하시오: ");
	scanf("%d", &a);
	printf("2를 곱하고 싶은 횟수: ");
	scanf("%d", &b);
	printf("%d << %d의 값: %d", a,b, a<<b);
}

08. 구의 표면적과 체적을 구하는 프로그램을 작성하라. 구의 반지름은 실수로 입력된다. 아래의 공식을 사용하라. 파이값은 기호 상수를 사용하여 정의하라.

#include <stdio.h>
#define PI 3.141592
int main() {
	double r;
	printf("구의 반지름을 입력하시오: ");
	scanf("%lf", &r);
	printf("표면적은 %.2lf입니다. \n", 4*PI*r*r);
	printf("체적은 %.2lf입니다. \n", (double)4 / 3 * PI * r * r * r);
}

09. 그리스 최초의 수학자이자 천문학자인 탈레스는 지팡이 하나로 피라미드의 높이를 재었다고 한다. 탈레스는 지팡이를 똑바로 땅에 세우고 지팡이를 움직여서 지팡이의 그림자와 피라미드의 그림자를 일치시켰다. 삼각형 ABC와 삼각형ADE는 닮은꼴이므로 다음의 수식이 성립한다.

AC : AE = BC : DE

따라서 AC와 AE, BC를 안다면 DE를 계산할 수 있다. AC와 AE, BC를 입력하여서 DE를 구하는 프로그램을 작성하라. 입력되는 수치는 모두 실수로 한다. 

#include <stdio.h>

int main() {
	double a, b, x, y; // a : b = x : y;

	printf("지팡이의 높이를 입력하시오: ");
	scanf("%lf", &a);

	printf("지팡이 그림자의 길이를 입력하시오: ");
	scanf("%lf", &b);

	printf("피라미드까지의 거리를 입력하시오: ");
	scanf("%lf", &y);

	x = a * y / b;
	printf("피라미드의 높이는 %.2lf입니다. \n", x);
}

10. 조건 연산자 ?만을 이용하여 2차원 공간의 x 좌표와 y 좌표를 입력받아서 그 좌표가 속하는 사분면을 출력하는 프로그램을 작성하시오. (x>0 && y >0)? printf("1사분면"):printf(" ");와 같은 문장을 사용하여 작성해본다.

#include <stdio.h>

int main() {
	int x, y;
	printf("x좌표를 입력하시오: ");
	scanf("%d", &x);
	printf("y좌표를 입력하시오: ");
	scanf("%d", &y);
	(x > 0 && y > 0) ? printf("1사분면") : printf("");
	(x < 0 && y > 0) ? printf("2사분면") : printf("");
	(x < 0 && y < 0) ? printf("3사분면") : printf("");
	(x > 0 && y < 0) ? printf("4사분면") : printf("");
}

11. 약 2200년 전에 그리스의 에라토스테네스는 최초로 지구의 크기를 측정하였다. 일단 지구를 구형으로 가정하고 또 태양 광선은 지구의 어느 곳에서나 평행하게 비친다고 가정하였다. 또 원호의 길이는 중심각에 비례한다는 원리를 사용하였다. 하지날 정오에 시에네에서 햇빛이 수직으로 비칠 때, 알렉산드리아에서는 막대와 그림자가 이루는 각도가 7.2도로 측정되었다. 또 시에네에서 알렉산드리아까지의 거리는 약 900km로 측정되었다. 이것을 이용하여서 지구의 반지름을 계산하여보자.

 

#include <stdio.h>
#define PI 3.14

int main() {
	double dis, r, k; // r: dis = 360: k;
	printf("거리를 입력하시오: ");
	scanf("%lf", &dis);
	printf("각도를 입력하시오: ");
	scanf("%lf", &r);
	k = dis / r * 360;
	printf("지구의 반지름은 %.2lf입니다. \n", k / PI /2);
}

12. 비트 이동 연산을 이용하여 문자 4개를 받아서 하나의 unsigned int형의 변수 안에 저장하는 프로그램을 작성하라. 첫 번쩨 문자는 비트 0부터 비트 7까지에 저장되고 두 번째 문자는 비트 8부터 비트 15까지 세 번째 문자는 비트 16에서 비트 23까지, 네 번째 문자는 비트 24부터 비트 31까지에 저장된다. 결과로 생성되는 정수값은 16진수로 출력하도록 한다. 비트 이동 연산과 비트 OR 연산을 사용하라.

#include <stdio.h>

int main() {
	char a, b, c, d;
	unsigned int result;
	printf("첫 번째 문자를 입력하시오: ");
	scanf("%c", &a);
    
	printf("두 번째 문자를 입력하시오: ");
	scanf(" %c", &b); // 한 칸 띄어줌으로써 버퍼를 비움 
    
	printf("세 번째문자를 입력하시오: ");
	scanf(" %c", &c);

	printf("네 번째 문자를 입력하시오: ");
	getchar(); // 한 칸 띄어쓰는 것 대신 getchar()을 이용해서 버퍼를 비울 수 있음.
	scanf("%c", &d); 

	result = (d << 24) | (c << 16) | (b << 8) | a;
	printf("결과값: %x", result);
}

또 다른 방법

#include <stdio.h>
#include <math.h>

int main() {
	int a, b, c, d;
	unsigned int result;

	printf("첫 번째 문자를 입력하시오: ");
	a = getchar();
	getchar();

	printf("두 번째 문자를 입력하시오: ");
	b = getchar();
	getchar();

	printf("세 번째 문자를 입력하시오: ");
	c = getchar();
	getchar();

	printf("네 번째 문자를 입력하시오: ");
	d = getchar();

	result = a | (b << 8) | (c << 16) | (d << 24);
	printf("결과값: %x", result);

}

01. 사용자로부터 하나의 실수를 입력받아서 소수점 표기 방법과 지수 표기 방법으로 동시에 출력하는 프로그램을 작성하라.

#include <stdio.h>

int main() {
	double num;
	printf("실수를 입력하시오: ");
	scanf("%lf", &num);
	printf("실수형식으로는 %lf입니다. \n", num);
	printf("지수형식으로는 %e입니다. \n", num);
}

02. 사용자로부터 정수를 16진수로 입력받아서 8진수, 10진수, 16진수 형태로 출력하는 프로그램을 작성하시오.

#include <stdio.h>

int main() {
	int num;
	printf("16진수 정수를 입력하시오: ");
	scanf("%x", &num);
	printf("8진수로는 %#o입니다. \n", num);
	printf("10진수로는 %d입니다. \n", num);
	printf("16진수로는 %#x입니다.\n", num);
}

03. int형의 변수 x와 y의 값을 서로 교환하는 프로그램을 작성하여보자. 별도의 변수가 필요하면 정의하여서 사용한다. 변수 x와 y는 10, 20의 값으로 초기화하라.

#include <stdio.h>

int main() {
	int x = 10, y = 20;
	printf("x = %d y = %d \n", x, y);
	x = x ^ y;
	y = x ^ y;
	x = x ^ y;
	printf("x = %d y = %d \n", x, y);
}

04. 상자의 부피를 구하는 프로그램을 작성하여보자. 부피는 길이*너비*높이로 계산된다. 길이, 너비, 높이는 모두 double형의 실수로 입력받아보자.

#include <stdio.h>

int main() {
	double x, y, z;
	printf("상자의 가로 세로 높이를 한번에 입력: ");
	scanf("%lf %lf %lf", &x, &y, &z);
	printf("상자의 부피는 %lf입니다. \n", x * y * z);
}

05. 우리나라에서 많이 사용되는 면적의 단위인 평을 제곱미터로 환산하는 프로그램을 작성하시오. 여기서 1평은 3.3m^이다. 변수들의 자료형은 어떤 것을 선택하는 것이 좋은가? 기호 상수를 이용하여 1평당 제곱미터를 나타내어라.

#include <stdio.h>
#define ONE_PYEONG 3.3058

int main() {
	double p;
	printf("평을 입력하세요: ");
	scanf("%lf", &p);
	printf("%lf평방미터입니다. \n", p * ONE_PYEONG);
}

06. 다음과 같은 수식의 값을 계산하여 화면에 출력하는 프로그램을 작성하시오. 지수 표기법을 사용하여 변수들을 초기화한다.

#include <stdio.h>

int main() {
	double x;
	x = 3.32e-3 + 9.76e-8;
	printf("%lf \n", x);
}

07. 물리학에서 운동에너지는 E = mv^2으로 계산된다. 사용자로부터 질량(m)과 속도(v)를 받아서 운동에너지(E)를 게산하는 프로그램을 작성하여보자. 모든 변수는 double형을 사용하라.

#include <stdio.h>

int main() {
	double e, m, v;
	printf("질량(kg): ");
	scanf("%lf", &m);
	printf("속도(m/s): ");
	scanf("%lf", &v);
	e = m * v * v / 2;
	printf("운동에너지 (J): %lf \n", e);
}

08. 사용자가 아스키 코드값을 입력하면 그 아스키 코드값에 해당하는 문자를출력하는 프로그램을 작성하라. 

#include <stdio.h>

int main() {
	int char_num;
	printf("아스키 코드 값을 입력하세요: ");
	scanf("%d", &char_num);
	printf("문자 : %c입니다. \n", char_num);
}

09. 'a'+1, 'a'+2, 'a'+3 을 문자 형식(%c)으로 출력하는 프로그램을 작성하시오. 이 프로그램에서 알 수 있는 것은 무엇인가?

#include <stdio.h>

int main() {
	printf("%c %c %c \n", 'a' + 1, 'a' + 2, 'a' + 3);
}

10. 경보음이 울린 후에 다음과 같은 메시지를 출력하고 다시 경보음이 울리는 프로그램을 작성하여보자.

#include <stdio.h>

int main() {
	printf("화재가 발생하였습니다. \a \n");
}

11. 다음과 같이 화면에 출력하는 프로그램을 작성하시오.

#include <stdio.h>

int main() {
	int A = 65, B = 66, C = 67;
	printf("\"ASCII code\", '%c','%c','%c' \n", A, B, C);
	printf("\\t \\a \\n  \n");
}

 


12. 정수형 변수에 대하여 실습하여보자.

int i = 255;
printf("%d \n", i);

 

1) i의 값을 형식 지정자 %o, %x를 사용하여 8진수, 16진수로도 출력하여보라.

8진수: 377, 16진수:  ff

 

2) i을 -1로 초기화한 후에 %x를 사용하여 출력해보자. 어떤 값이 출력되는가? 2의 보수인지를 확인하자. -2, -3도 확인해보자. 

ffffffff (2의 보수이다)

+ Recent posts