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);
}
'C' 카테고리의 다른 글
[쉽게 풀어쓴 C언어 Express 개정 4판] 13장 Programming (8) | 2024.10.09 |
---|---|
[쉽게 풀어쓴 C언어 Express 개정 4판] 12장 Programming (7) | 2024.10.08 |
[쉽게 풀어쓴 C언어 Express 개정 4판] 10장 Programming (3) | 2024.10.04 |
[쉽게 풀어쓴 C언어 Express 개정 4판] 9장 Programming (2) | 2024.10.03 |
[쉽게 풀어쓴 C언어 Express 개정 4판] 8장 Programming (1) | 2024.10.03 |