프로그래밍/C언어

[열혈] 도전 프로그래밍 2

LinZBe4hia 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 로 됨