[열혈] 도전 프로그래밍 2
도전 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 > 1 을 i > 0으로 바꿔야 함 안그럼 1,2,3,4,5,6,7 입력 시 6,7,5,4,3,2,1 로 됨