티스토리 뷰
1. 10개 정도의 속담을 문자열의 형태로 함수 set_proverb() 내부에 저장하고 있다가 사용자가 set_proverb()을 호출하면 인수로 받은 이중 포인터를 이용하여 외부에 있는 char형 포인터 s를 설정하는 set_proverb()을 작성하고 테스트하라.
HINT - set_proverb(char **q, int n) 함수는 외부의 포인터 값을 변경하여야 하므로 이중 포인터 매개 변수를 가진다. 또 내부에 정적 문자 포인터 배열로 10개의 속담을 저장하고 있다.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void set_proverb(char** q, int n); // 이중 포인터 q를 이용하여 외부의 포인터 값을 변경한다.
int main(void) {
int choice;
printf("몇 번째 속담을 선택하시겠습니까? ");
scanf("%d", &choice);
char* p = NULL;
set_proverb(&p, choice);
printf("selected proverb = %s\n", p);
return 0;
}
void set_proverb(char** q, int n) {
// 내부에 정적 문자 포인터 배열로 10개의 속담을 저장하고 있다.
static char* array[10] = {
"A bad shearer never had a good sickle.",
"A bad workman (always) blames his tools.",
"A bad workman quarrels with his tools.",
"A bad thing never dies.",
"A good medicine tastes bitter",
"A sound mind in a sound body.",
"Every dog has his day.",
"Familiarity breeds contempt.",
"If you laugh, blessings will come your way.",
"The more, the better.",
};
*q = array[n - 1]; // 사용자가 1번 ~ 10번 중 선택한다고 가정.(인덱스는 0부터 시작하므로 1을 뺌)
}
2. 2차원 배열에 정수가 저장되어 있다고 가정한다. 우리가 가지고 있는 단 하나의 함수는 1차원 배열에 저장된 정수의 합을 구하는 int get_sum(int array[], int size) 라고 가정하자. 2차원 배열의 각 행에 대하여 get_sum()을 호출하여서 각 행의 합을 구한 후에, 이것들을 모두 합쳐서 전체 2차원 배열에 저장된 정수들의 합을 구하는 프로그램을 작성하여 보자.
HINT - 2차원 배열을 m[][]이라고 하면 m[0]은 첫 번째 행이고 m[1]은 두 번째 행을 가리킨다. 이것들은 또 1차원 배열이기도 하다. 즉 2차원 배열은 1차원 배열들의 모임이라고 생각할 수 있다.
#include<stdio.h>
#define ROWS 3
#define COLS 6
int get_sum(int array[], int size); // 1차원 배열에 저장된 정수의 합을 구하는 함수
int main(void) {
int arr[ROWS][COLS] = { 0 };
for (int i = 0; i < ROWS; i++) // 배열의 모든 요소를 10으로 초기화
for (int j = 0; j < COLS; j++)
arr[i][j] = 10;
int sum = 0;
for (int k = 0; k < ROWS; k++)
sum += get_sum(arr[k], COLS);
printf("정수의 합=%d\n", sum);
return 0;
}
// 1차원 배열에 저장된 정수의 합을 구하는 함수
int get_sum(int array[], int size) {
int sum = 0;
while (size > 0) {
sum += *array++;
size--;
}
return sum;
}
3. 학생들의 성적이 scores라는 2차원 배열에 저장되어 있다고 가정하자. scores의 행은 한 학생에 대한 여러 번의 시험 성적을 나타낸다. scores의 열은 한 시험에 대한 여러 학생들의 성적이다. 학생별로 성적의 평균을 구하려고 한다. 2차원 배열의 각 행이 1차원 배열임을 이용하여 다음과 같이 1차원 배열의 평균을 구하는 함수 get_average()를 호출하여 각 학생에 대한 평균 성적을 계산하여 보라.
double get_average(int list[], int n);
HINT - 2번과 유사한 문제이다.
#include<stdio.h>
#define ROWS 3
#define COLS 4
double get_average(int list[], int n); // 1차원 배열의 평균을 구하는 함수
int main(void) {
int scores[ROWS][COLS] = {
{45,55,70,90},
{30,40,55,75},
{25,53,63,83}
};
for (int i = 0; i < ROWS; i++)
printf("%d행의 평균값=%.0lf\n", i, get_average(&scores[i][0], COLS));
return 0;
}
// 1차원 배열의 평균을 구하는 함수
double get_average(int list[], int n) {
double sum = 0.0;
for (int i = 0; i < n; i++)
sum += *list++;
return sum / n;
}
4. 문자열의 배열을 인수로 받아서 저장된 문자열을 전부 출력하는 pr_str_array() 함수를 작성하여 테스트하여 보자.
pr_str_array()는 다음과 같은 원형을 가진다.
void pr_str_array(char **dp);
HINT - 문자열 자체가 1차원 문자 배열에 저장된다. 따라서 문자열의 배열이라면 자연스럽게 배열의 이름은 이중 포인터가 된다.
#include<stdio.h>
void pr_str_array(char** dp); // 문자열의 배열을 인수로 받아서 저장된 문자열을 전부 출력하는 함수
int main(void) {
char* s[] = {
"A bad shearer never had a good sickle.",
"A bad workman (always) blames his tools.",
"A bad workman quarrels with his tools.",
"A bad thing never dies.",
"A bad workman finds fault with his tools."
};
pr_str_array(s);
return 0;
}
// 문자열의 배열을 인수로 받아서 저장된 문자열을 전부 출력하는 함수
void pr_str_array(char** dp) {
while (*dp)
printf("%s\n", *dp++);
}
5. int형 배열과 int형 포인터를 받아서 포인터가 배열의 가장 큰 값을 가리키게 하는 함수 set_max_ptr()을 구현하고 테스트하여 보자.
#include<stdio.h>
void set_max_ptr(int m[], int size, int** pmax);// 배열, 포인터를 받아 배열의 가장 큰 값을 가리키게 함
int main(void) {
int m[6] = { 5,6,1,3,7,9 };
int* pmax = NULL; // 배열 m의 원소 중에서 가장 큰 값을 pmax가 가리킨다.
set_max_ptr(m, 6, &pmax);
printf("가장 큰 값은 %d\n", *pmax);
return 0;
}
// int형 배열과 int형 포인터를 받아서 배열의 가장 큰 값을 가리키게 하는 함수
void set_max_ptr(int m[], int size, int** pmax) {
int* max = m;
for (int i = 1; i < size; i++) {
if (m[i] > *max)
*max = m[i];
}
*pmax = max;
}
6. 문자열을 가리키고 있는 포인터의 배열을 인수로 받아서 문자열을 알파벳 순으로 정렬시키는 함수 sort_strings()를 작성하고 테스트하여 보라. 다음과 같은 원형을 가진다.
void sort_strings(char *s[], int size);
HINT - 정렬의 방법으로 버블 정렬을 사용하여 보자. 버블 정렬은 정렬이 완료될 때까지 이웃요소들을 교환하는 정렬 방법이다.
#include<stdio.h>
#include<string.h> // strcmp()
// 문자열을 가리키고 있는 포인터의 배열 s를 인수로 받아 문자열을 알파벳 순으로 버블 정렬하는 함수
void sort_strings(char* s[], int size);
int main(void) {
char* list[] = {
"mycopy",
"src",
"dst"
};
sort_strings(list, 3); // 알파벳 순으로 정렬
for (int i = 0; i < 3; i++)
printf("%s\n", list[i]); // 정렬된 결과 출력
return 0;
}
// 문자열을 가리키고 있는 포인터의 배열을 인수로 받아 문자열을 알파벳 순으로 버블 정렬하는 함수
void sort_strings(char* s[], int size) {
int least; // 최솟값을 가지는 인덱스 번호
char* temp = NULL; // 두 개의 요소를 교환하기 위해 필요한 변수
for (int i = 0; i < size - 1; i++) {
// i번째 값이 최솟값이라고 가정
least = i;
for (int k = i + 1; k < size; k++) { // 최솟값 탐색
if (strcmp(s[k], s[least]) < 0)
least = k;
}
// i번째 요소와 least번째 요소의 위치를 교환
temp = s[i];
s[i] = s[least];
s[least] = temp;
}
}
7. 디지털 영상은 보통 2차원 배열로 표현된다. 각 배열 요소는 픽셀이라고 불린다. 흑백 영상의 경우, 하나의 픽셀은 보통 0에서 255의 값을 가지며 0은 검정색을, 255는 흰색을 나타낸다. 중간값은 회색을 나타낸다. 영상이 unsigned char image[ROWS][COLS]에 저장되어 있다고 가정하고 픽셀 값이 128미만이면 0으로 만들고 128이상이면 255로 만들어보자.
8. 크기가 3 x 3인 2차원 배열을 다른 2차원 배열로 복사하는 함수 void array_copy(int src[ ][WIDTH], int dst[ ][WIDTH])를 구현하고 테스트하여 보라. 수행 속도를 위하여 배열 첨자 방법 대신에 포인터를 사용해보자.
HINT - int *p=&src[0][0];에서 시작하여 &src[HEIGHT-1][WIDTH-1];까지 반복한다.
'Study > C' 카테고리의 다른 글
쉽게 풀어쓴 C언어 - 15장 스트림과 파일 입출력 (0) | 2023.02.12 |
---|---|
쉽풀C - 11장 포인터 (0) | 2023.02.07 |
쉽풀C - 10장 배열 (0) | 2023.02.06 |
쉽풀C - 9장 함수와 변수 (0) | 2023.02.05 |
쉽풀C - 8장 함수 (0) | 2023.02.04 |
- Total
- Today
- Yesterday
- chrome extension 자동 배포
- public vs assets
- 중첩 함수(nested function)
- named export vs default export
- 원시값(primitive)
- math.h
- Jest
- react
- mermaid-cli
- counter
- 쉽게 풀어쓴 C언어 Express
- Collections
- react router
- x.y.z (메이저.마이너.패치)
- useEffect
- structuredclone()
- inp
- defaultdict
- jackson 라이브러리
- 프로세스 강제 종료
- pwa(progressive web app)
- 소프트웨어 버전 관리
- core web vitals
- stdlib.h
- json.parse(json.stringify())
- semver)
- 시맨틱 버전(semantic versioning
- ajax (asynchronous javascript and xml)
- javascript 필수 문법
- styled-components
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |