Nick Dev

[c로 배우는 쉬운 자료구조] 2장 연습문제 본문

CS

[c로 배우는 쉬운 자료구조] 2장 연습문제

Nick99 2023. 5. 11. 20:56
반응형
반응형

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(); 를 추가하여 입력 대기 상태로 만들면 실행 결과를 확인할 수 있다.

 

반응형