ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [열혈] 도전 프로그래밍 2
    프로그래밍/C언어 2016. 7. 27. 22:33

    도전 1


    길이가 10인 배열을 선언하고, 총 10개 정수 입력을 받아 홀수, 짝수를 구분 지어 출력하는 프로그램 작성

    조건: 홀수부터 출력하고 나중에 짝수 출력, 정수 입력은 main함수에서, 홀수, 짝수 출력하는 건 각각 함수 정의해서 함수 호출하기


    내가 한 코딩

    #include <stdio.h>
    
    const int arrLength = 10;
    void showOdd(int * arr);
    void showEven(int * arr);
    
    int main(void) {
        int i;
        int arr[10]; // 배열의 크기를 도무지 상수화 시킨 변수로도 정할 수 없음.... 어떻게 해야하지??
        int * ptr = arr;
        printf("총 %d개의 숫자 입력\n", arrLength);
        for (i = 0; i < arrLength; i++) {
            printf("입력: ");
            scanf("%d", &arr[i]);
        }
    
        printf("홀수 출력: ");
        showOdd(ptr);
        printf("\n");
        printf("짝수 출력: ");
        showEven(ptr);
        printf("\n");
    
        return 0;
    }
    
    void showOdd(int * arr) {  
        int i, count = 0;
        for (i = 0; i < arrLength; i++) {
            if(arr[i] % 2 == 1){
                count++;
                if(count != 1) { printf(", "); }
                printf("%d", arr[i]);
            }
        }
    }
    
    void showEven(int * arr) {
        int i, count = 0;
        for(i = 0; i < arrLength; i++) {
            if(arr[i] % 2 == 0) {
                count++;
                if(count != 1) {printf(", "); }
                printf("%d", arr[i]);
            }
        }
    }

    내가 한 오류:

    1) 변수를 상수화시켜서 배열의 크기로 선언하려 했으나 불가능함 -> 컴파일 에러

    2) 함수 호출할 때 showEven의 함수를 showwEven으로 오타

    3) 배열을 함수의 인자로 전달할 때 포인터로 전달해야 하는데 선언한 배열 arr를 가리키는 포인터 변수 ptr을 만들지 않고 바로 배열을 전달

    4) 포인터 변수 ptr을 함수 인자로 대신 전달할 때 sizeof(arr) / sizeof(arrLength) 는 1을 나타내서 for 문이 정상적으로 돌아가지 않음



    도전 2


    프로그램 사용자로 부터 10진수 형태로 정수 하나를 입력 받은 다음, 이를 2진수로 변환해서 출력하는 프로그램


    내가 한 코딩

    #include <stdio.h>
    
    int main(void) 
    {
        int num; // 입력 받을 10진수 정수
        int radix2[50]; // 2진수 정수 담을 배열
        int count = 0; // 2진수 정수 담을 때 씀
        int i; 
    
        printf("10진수 정수 입력: ");
        scanf_s("%d", &num);
    
        while(1)  // 입력받는 정수에 따라 횟수 d ?
        {
            radix2[count] = num % 2;
            if(num /2 == 0) break;
            num = num / 2;
            count++;
        }
    
        for (i = count; i >= 0; i--) 
        {
            printf("%d", radix2[i]);
        }
    
        return 0;
    }
    내가 한 오류:
    1) int i 선언을 하지 않음.
    2) if(num / 2 ==0) break; 구문을 num = num /2 보다 앞에 써야 함. 안그러면 맨 앞의 숫자가 안나옴.
    3) while(true) -> while(1)   // true가 선언되지 않은 식별자라고 한다.


    도전 3


    길이가 10인 배열을 선언하고 총 10개 정수를 입력 받음.

    단, 입력 받은 숫자가 홀수이면 배열 앞부터 채워나가고, 짝수 이면 뒤에서 부터 채워나감.

    예) 사용자가 [1,2,3,4,5,6,7,8,9,10] 을 입력했다면, 배열에는 [1, 3, 5, 7, 9, 10, 8, 6, 4, 2] 순으로 저장


    내가 한 코딩

    #include <stdio.h>
    
    int main(void)
    {
        int arr[10];
        int i, num;
        int count0dd = 0;
        int countEven = 0;
        int arrSize = sizeof(arr) / sizeof(int);
    
        printf("총 %d개 숫자 입력\n", arrSize);
        for (i = 0; i < arrSize; i++)
        {
            printf("입력: ");
            scanf("%d", &num);
            
            if(num % 2 == 1)
            {
                arr[count0dd]  = num;
                count0dd++;
            }
            
            else
            {
                arr[arrSize - 1 - countEven] = num;
                countEven++;
            }
        } 
        printf("배열 요소의 출력: ");
        for( i = 0 ;i <arrSize; i++)
            printf("%d ", arr[i]);
        return 0;
    }
    내가 한 오류:
    1) scanf 함수를 scantf 함수로 적음
    2) for 문 괄호를 빼먹음



    도전 4


    화문 (Palindrome)은 앞으로 읽으나 뒤로 읽으나 차이가 없는 단어들을 뜻한다. 예) level, bob 

    인자로 전달되는 영단어가 회문인지 아닌지를 판단해서 그 결과를 출력하는 기능의 함수를 정의하고 이에 적절한 main함수 정의

    단, 구현의 편의를 위해 대소문작까지 일치해야 회문으로 인정


    내가 한 코딩

    #include <stdio.h>
    
    void checkPalindrm(char * ptr, int len); 
    
    int main(void)
    {
        char str[100];
        char * pstr = str;
        int count = 0;
        printf("문자열 입력: ");
        scanf("%s", str);
        while(str[count] != '\0')
            count++;
        checkPalindrm(pstr, count);
    
        return 0;
    }
    
    void checkPalindrm (char * arr, int len)
    {
        int i;
    
        for(i = 0; i < len / 2; i++)
        {
            if(arr[i] != arr[len - 1 - i])
            {
                printf("회문이 아닙니다.\n");
                break;
            }
    
            else if( i == len / 2 -1)
                printf("회문입니다.\n");
        }
    }
    내가 한 오류:
    1) scanf 함수를 scantf 함수로 적음
    2) 함수 checkPalindrm 에서 int i 선언 빼먹음
    3) 함수 checkPalindrm 매개변수 arr 데이터형 int -> char
    4) 매개변수 arr을 적어야 하는데 ptr로 적음


    도전 5 


    배열에 저장되어 있는 요소들을 내림차순으로 정렬하는 함수를 정의하자 (함수 이름: DesSort) 그리고 이 함수를 호출하는 예제 작성

    프로그램의 흐름: 길이가 7인 int 형 배열을 선언해서 사용자로부터 7개의 정수를 입력받도록 한다. 입력받은 정수는 DesSort 함수를 이용해 내림차순으로 정렬해 제대로 정렬이 되었는지 확인하기 위해 배열의 요소들을 순서대로 출력한다.


    내가 한 코딩

    #include <stdio.h>
    
    void DesSort(int arr[], int len);
    
    int main(void)
    {
        int arr[7];
        int i;
        int arrSize = sizeof(arr) / sizeof(int);
    
        for (i = 0; i < arrSize; i++)
        {
            printf("입력: ");
            scanf("%d", &arr[i]);
        }
        DesSort(arr, arrSize);
        for(i = 0; i < arrSize; i++)
            printf("%d ", arr[i]);
    
        return 0;
    }
    
    void DesSort( int arr[], int len)
    {
        int i, j; // loop
        int temp;
        for (i = len - 1; i > 0; i--)
        {
            for(j = 0; j < i; j++) 
            {
                if(arr[j] < arr[j+1])
                {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j+1] = temp;
                }
            }
        }
    }
    
    내가 한 오류:
    1) scanf 함수를 scantf 함수로 적음
    2) 함수 DesSort에서 for문 조건을 i > 1i > 0으로 바꿔야 함
       안그럼 1,2,3,4,5,6,7 입력 시 6,7,5,4,3,2,1 로 됨


    댓글

Designed by Tistory.