일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Kafka
- depromeet
- OAuth
- kakao
- 코드 트리
- 코드트리
- c
- 디프만16기
- 운영체제
- Oidc
- 디프만
- pub.dev
- exception
- AOP
- Spring
- 부하 테스트
- Redis
- Sharding
- 코딩테스트
- Scaffold
- dip
- Kotlin
- nGrinder
- 코딩 테스트
- 연습문제
- 자료구조
- C언어
- flutter
- 코딩
- java
- Today
- Total
Nick Dev
[c로 배우는 쉬운 자료구조] 2장 연습문제 본문
01. int array[2][4]의 원소 개수와 배열의 전체 용량은? (단, 시스템에 정의된 int 자 료형의 크기는 4바이트이다.)
Ans : 4번
① 6개, 24바이트 ② 6개, 32바이트
③ 8개, 24바이트 ④ 8개, 32바이트
02. 다음 변수 선언이 있는 상태에서 수행할 명령어 중에서 틀린 명령어는? Ans : 2번
int i, j = 10; int *p1; char *p2; |
① p1 = &i; ② p2 = &j;
③ *p1 = j; ④ i = *p1;
03. 다음 중 포인터에 주소를 지정하는 방법으로 틀린 것은? Ans : 4번
① 주소 연산자를 사용해 변수 주소를 지정하는 방법
② 문자형 포인터에 문자열의 시작 주소를 지정하는 방법
③ 동적 메모리를 할당하고 그 시작 주소를 포인터값으로 지정하는 방법
④ 변수 이름을 변수의 시작 주소로 사용하는 방법
04. if 문장에서 포인터 pt1과 pt2에 대한 설명으로 옳지 않은 것은? Ans : 1번
① if (&pt1==&pt2)의 경우에 서로 다른 포인터가 동일한 주소에 있을 수 있다.
② if (pt1==pt2)는 같은 대상을 가리키는지 검증한다.
③ if (*pt1==*pt2)의 경우에 가리키는 대상이 다르더라도 변수값은 같을 수 있다.
④ if (pt1==pt2)는 가리키는 대상의 주소가 동일한 것인지 검증한다.
05. 다음은 C 언어로 작성된 1차원 배열의 예제 프로그램이다. ㉠에 들어갈 수 있 는 문장과 프로그램을 출력한 결과를 바르게 짝지은 것은? Ans : 3번
int main() { int i, j, A[100]; for (i = 0; i < 100; i++) A[i] = i; j = i - 1; printf("%d", ㉠ ); } |
㉠ | 출력 | |
① | A[j] | 100 |
② | &A[0]+j | 99 |
③ | *(A+j) | 99 |
④ | *A+j | 100 |
06. 다음 프로그램의 실행 결과로 옳은 것은? Ans : 4번
#include <stdio.h> int main(void) { int array[] = {100, 200, 300, 400, 500}; int *ptr; ptr = array; printf("%d\n", *(ptr+3) + 100); } |
① 200 ② 300
③ 400 ④ 500
07. 구조체 변수에 대한 명령 중 바른 것은? Ans : 1번
struct employee Lee, Hong, Kim[3]; struct employee *sp; |
① sp = Kim; ② sp = Lee;
③ Lee = Kim; ④ Kim[0] = Kim[3];
⑤ sp = Kim[1];
08. 재귀호출 방법이 적당하지 않은 것은? Ans : 3번
① 팩토리얼 ② 피보나치 수열
③ 구조체 변수 복사 ④ 1부터 n까지 누적 합계 구하기
09. 재귀호출 프로그램에 해당하는 것은? Ans : 2번
① 한 루틴이 반복될 때
② 한 루틴이 자기를 다시 호출할 때
③ 다른 루틴을 호출할 때
④ 한 루틴에서 다른 루틴으로 갈 때
10. 다음 함수를 이용해 f1(4)를 수행한 결괏값은? Ans : 4번
int f1(int n) { if ( n <= 0) return 0; else if (n <= 2) return n; else return f1(n-3) + f1(n-2) + f1(n-1); } |
① | 3 | ② 4 |
③ | 5 | ④ 6 |
11. 다음 함수를 이용해 recursive(4)를 수행한 결괏값은? Ans : 4번(정오표: 22=>2^2)
int recursive(int n) { if (n < 1) return 2; else return (2^2 * recursive(n-1) + 1); } |
① 149 ② 265
③ 373 ④ 597
12. 함수 호출 xxx(5)에서 반환되는 결괏값은? Ans : 4번
public static int xxx(int n) { if (n==0) return 4; return 1 + xxx(n-1); } |
① 0 ② 4
③ 5 ④ 9
13. 순환 함수 f()에 대한 첫 번째 호출이 f(7)일 때, f(7)을 포함하여 함수 f()가 호출 되는 총 횟수는? Ans : 3번
① 25 ② 35
③ 41 ④ 51
- 4 -
14. C 언어를 사용해 100행 50열로 이루어진 행렬을 2차원 배열 A[100][50]에 저장 하려고 한다. 10행 5열에 정수값 15를 저장하는 방법으로 옳지 않은 것은?Ans : 4번
① A[9][4] = 15 ② *(A[0] + 454) = 15
③ *(&A[9][0] + 4) = 15 ④ *(&A[0][0] + 904) = 15
15. 다음 ‘하노이 탑’ 프로그램을 수행한 결과에서 8행에 출력되는 문장으로 옳은 것은? Ans : 2번
① 원판 1을 C에서 B로 옮긴다. ② 원판 4을 A에서 C로 옮긴다.
③ 원판 3을 A에서 B로 옮긴다. ④ 원판 2을 B에서 C로 옮긴다.
16. 배열과 변수를 비교하여 설명하시오.
자료들 각각을 변수에 저장한다면 각 자료마다 일일히 변수를 지정해주어야 할 것이다. 이를 하나로 묶어 배열로 만들면 배열을 한번만 선언해 자료들을 정리할 수 있다. 또한 변수들을 선언할 때보다 배열을 선언할 때 요소들을 다루기 편리할 수 있다.
17. 학생 열 명의 국어, 영어, 수학 성적을 처리하여 다음과 같이 출력하는 프로그 램을 작성하시오. (단, 배열을 사용해 학생들의 학번, 국어, 영어, 수학, 총점, 평 균을 저장하시오).
- 5 -
Ans :
#include <stdio.h>
int main()
{
int i, total;
double avg;
int id[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int kor[10] = { 80, 70, 50, 60, 80, 90, 100, 30, 40, 70 };
int eng[10] = { 70, 90, 80, 60, 80, 50, 90, 60, 70, 90 };
int math[10] = { 90, 70, 60, 50, 80, 90, 80, 90, 50, 80 };
printf("\t학번\t국어\t영어\t수학\t총점\t평균\n");
printf("***************************************************************");
for (i = 0; i < 10; i++)
{
total = kor[i] + eng[i] + math[i];
avg = total / 3;
printf("\n\t%d\t%d\t%d\t%d\t%d\t%.f\n", id[i], kor[i], eng[i], math[i], total, avg);
}
return 0;
}
18. 정수형 1차원 배열을 {19, 2, 25, 92, 36, 45}로 초기화하고 다음을 수행하는 프 로그램을 작성하시오.
① 배열에 저장된 원소들을 화면에 출력한다.
② 배열 원소 중에서 최솟값과 최댓값을 구해 출력한다.
③ 배열 원소들의 평균을 구해 출력한다.
④ 배열 원소들의 분산을 구해 출력한다.
Ans :
#include <stdio.h>
#include <math.h>
int main() {
int arr[] = { 19, 2, 25, 92, 36, 45 };
int len = sizeof(arr) / sizeof(arr[0]);
int min, max, sum = 0;
double avg = 0.0, var = 0.0;
printf("[1번] ");
for (int i = 0; i < len; i++) {
printf("%d ", arr[i]); // 1번
sum += arr[i];
}
min = arr[0];
max = arr[0];
for (int i = 1; i < len; i++) {
if (min > arr[i]) {
min = arr[i];
}
if (max < arr[i]) {
max = arr[i];
}
}
printf("\n[2번] max : %d\tmin : %d\n", max, min); // 2번
avg = (double)sum / len;
printf("[3번] average : %.2lf\n", avg); // 3번
for (int i = 0; i < len; i++) {
var += pow(arr[i] - avg, 2);
}
var /= 6;
printf("[4번] variance : %.2lf\n", var); //4번
return 0;
}
19. 다차원 배열을 이용해 키보드로부터 문자열을 다섯 개 입력 받아 화면에 출력 하는 프로그램을 작성하시오.
Ans :
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
char s[5][10];
for (int i = 0; i < 5; i++) {
printf("문자열을 입력하세요: ");
scanf("%s", s[i]);
}
for (int i = 0; i < 5; i++) {
printf("%s\n", s[i]);
}
return 0;
}
20. 문자열을 두 개 입력 받고 문자열이 같은지 다른지 출력하는 프로그램을 작성 하시오.
Ans :
#include <stdio.h>
#include <string.h>
int main()
{
char s1[100] = "";
char s2[100] = "";
printf("첫 번째 문자열 입력: ");
gets(s1);
printf("두 번째 문자열 입력: ");
gets(s2);
if(strcmp(s1,s2) == 0)
printf("두 문자열은 같은 문자열 입니다.");
else
printf("두 문자열은 다른 문자열 입니다.");
return 0;
}
21. 포인터를 사용해 실수값 두 개를 교환하여 저장하고 출력하는 함수를 작성하시 오.
#include <stdio.h>
void swap(int*p, int*q) {
int catalyst;
catalyst = *p;
*p = *q;
*q = catalyst;
}
int main(void)
{
int first, second;
first = 2, second = 3;
printf("교환 전 first = %d, second = %d\n", first, second);
swap(&first, &second);
printf("교환 후 first = %d, second = %d", first, second);
return 0;
}
22. 문자열을 입력 받아 대문자는 소문자로, 소문자는 대문자로 변환하여 출력하는 프로그램을 작성하시오. (단, 포인터를 사용해야 한다.)
Ans :
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void chagne_capital_words(char* str_2)
{
while (*str_2 != 0)
{
if (*str_2 >= 'A' && *str_2 <= 'Z')
*str_2 = *str_2 + 32;
else if (*str_2 >= 'a' && *str_2 <= 'z')
*str_2 = *str_2 - 32;
str_2++;
}
}
int main()
{
int i = 0;
char str_1[100];
printf("문자열을 입력하세요: ");
scanf("%[^\n]s", str_1);
chagne_capital_words(str_1);
printf("%s\n", str_1);
return 0;
}
- 6 -
23. 입력 받은 문자열을 역순으로 출력하는 reverse 함수를 작성하시오.
Ans :
#include <stdio.h>
#include <string.h>
int main() {
char ch[100];
scanf("%s", ch);
int len = strlen(ch);
for (int i = len - 1; i >= 0; i--) {
printf("%c", ch[i]);
}
printf("\n");
return 0;
}
24. 다음과 같은 주소록 프로그램을 작성하시오. (단, 구조체를 사용해야 하고 주소 록 프로그램의 기능은 ‘① 목록 보기, ② 추가하기, ③ 탐색하기, ④ 삭제하기’이 다.)
Ans :
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#define MAX_NUM 50
int count = 0;
struct info {
char name[20];
char phoneNum[20];
char address[100];
char birth[30];
};
int menu() {
int menuNum;
printf("<MENU>\n");
printf("================\n");
printf("1. 목록보기\n2. 추가하기\n3. 탐색하기\n4. 삭제하기\n5. 종료\n");
printf("================\n");
printf("수행할 작업을 선택하세요: ");
scanf("%d", &menuNum);
return menuNum;
}
void showList(struct info list[MAX_NUM]) {
if (count == 0)
printf("목록이 비었습니다.\n");
for (int i = 0; i < count; i++) {
printf("이름: %s 전화번호: %s 주소: %s 생일: %s\n", list[i].name, list[i].phoneNum, list[i].address, list[i].birth);
}
return;
}
void add(struct info list[MAX_NUM]) {
if (count == MAX_NUM) {
printf("저장 공간이 가득 찼습니다.\n");
return;
}
printf("이름을 입력하세요: ");
scanf("%s", list[count].name);
printf("전화번호를 입력하세요: ");
scanf("%s", list[count].phoneNum);
printf("주소를 입력하세요: ");
getchar();
gets_s(list[count].address, sizeof(list[count].address));
printf("생일을 입력하세요: ");
scanf("%s", list[count].birth);
count++;
return;
}
void search(struct info list[MAX_NUM]) {
char name[20];
printf("탐색할 사람의 이름을 입력하세요: ");
scanf("%s", name);
int i = 0;
int result = 0;
for (i = 0; i < MAX_NUM; i++) {
if (strcmp(name, list[i].name) == 0) {
result = 1;
break;
}
}
if (result)
printf("이름: %s 전화번호: %s 주소: %s 생일: %s\n", list[i].name, list[i].phoneNum, list[i].address, list[i].birth);
else
printf("찾지 못했습니다.\n");
return;
}
void delete(struct info list[MAX_NUM]) {
char name[20];
printf("삭제할 사람의 이름을 입력하세요: ");
scanf("%s", name);
int i = 0;
int result = 0;
for (i = 0; i < MAX_NUM; i++) {
if (strcmp(name, list[i].name) == 0) {
result = 1;
break;
}
}
if (result) {
printf("삭제되었습니다.\n");
for (int j = i; j < 50; j++) {
strcpy(list[j].name, list[j + 1].name);
strcpy(list[j].phoneNum, list[j + 1].phoneNum);
strcpy(list[j].address, list[j + 1].address);
strcpy(list[j].birth, list[j + 1].birth);
}
count--;
}
else
printf("찾지 못했습니다.\n");
return;
}
int main(void) {
struct info list[100] = { 0, };
while (1) {
int menuNum = menu();
if (menuNum == 1)
showList(list);
else if (menuNum == 2)
add(list);
else if (menuNum == 3)
search(list);
else if (menuNum == 4)
delete(list);
else if (menuNum == 5) {
printf("종료합니다.");
break;
}
else {
printf("잘못된 메뉴 입력입니다.\n");
getchar();
}
}
return 0;
}
25. 정수값을 입력 받은 후, 1부터 입력 받은 값까지의 합을 구하는 프로그램을 재 귀호출을 이용해 작성하시오.
Ans :
#include <stdio.h>
int sum(int n)
{
if(n==1)
return 1;
else
return n+sum(n-1);
}
int main()
{
int n;
printf("1부터 n까지 합하는 프로그램 입니다.\n\nn을 입력하세요. : ");
scanf("%d",&n);
if (n < 1)
{
printf("Error : 입력된 숫자가 0 이하입니다. 프로그램을 종료합니다.");
return 0;
}
printf("1부터 %d 까지의 합은 %d 입니다.",n,sum(n));
return 0;
}
26. 재귀호출을 이용해 피보나치 수열을 구하는 프로그램을 작성하시오.
//피보나치 수열의 n번째 항을 구하는 프로그램
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int fib(int n) {
if (n < 3)
return 1;
else
return (fib(n - 1) + fib(n - 2));
}
int main(void)
{
int num;
printf("Enter a number N.\n");
scanf("%d", &num);
printf("%dth fibonacci number is %d.\n", num, fib(num));
return 0;
}
27. [예제 2-3]에서 getchar( ); 명령어의 역할을 설명하시오. (힌트 : scanf()와 입력 버퍼 비우기)
Ans : getchar(); 를 추가하여 입력 대기 상태로 만들면 실행 결과를 확인할 수 있다.
'CS' 카테고리의 다른 글
컴퓨터 구조 정리 노트( Ch 08~15 ) (1) | 2023.12.16 |
---|---|
[운영체제] 03. System Call (0) | 2023.07.04 |
[운영체제] 02. Processes (0) | 2023.06.30 |
[운영체제] 01. Introduction to Operating Systems (0) | 2023.06.26 |
[c로 배우는 쉬운 자료구조] 3장 연습문제 (0) | 2023.05.11 |