중간고사.. 손코딩 30분 + 실제코딩 40분 으로 이루어져 있는데
사실 나름 잘봤다고 생각했는데, 손코딩에서 생각보다 너무 조져버려(?)서 ㅋ,,
빈칸 하나당 배점이 최소 5점임 .. ㅋ ㅋ ㅋ ㅋ ㅋ 그저 웃지요...
손코딩은 실제로 연습을 하고 시험을 봐야겠다는 교훈을 얻는 중간고사 였다..!
괜찮아 기말고사가 있으니까 ^^!( 근데 기말범위 개어렵던데.. + 하나도 예습안함 화이팅 미래의나야!)
교수님이 설명해 주신 것을 토대로 오답이나 해볼게요~
리뷰1에서는 손코딩 5문제만 정리를 해보자.
손코딩에 나온문제는 총 5문제이다.
1번 문제는 몇 개 선언되었고, 초기화 되었는지를 물어보는 문제이고
2번 문제는 적절한 형식문자열을 채우는 문제이다.
3번 문제는 전위연산자와 후위연산자로 계산된 값 쓰는 문제.
4번 문제는 문자열을 입력받아 거꾸로 출력하는 프로그램 빈칸 채우기.
5번 문제는 겉으로 보기에는 복잡해보이는 문제의 빈칸채우기 ^^ ( 문제 쓰기 너무 길어...)
1번 문제는 그냥
int a,b=1;
int c=2,d;
선언된 변수의 수는? 4개 ~
초기화된 변수의 수는? 2개~ (틀렸다면 a,b사이에 쉼표 못봐서 틀렸을 수도? 내가 검토하다가 고쳤거든ㅎ)
2번 문제는
int index=2;
char initial='S';
float pi=3.14;
printf("index=? ,initial=? ,pi=? ",index,initial,pi);
실행결과: index=2, initial=S, pi=3.1 일때 '?'에 들어갈 것들은?
첫번째는 int니까 당연히 %d이고,
두번째는 char니까 %c이다.
세번째는 3.14에서 3.1이 출력되었으므로, 그냥 %f가 아니라!! %.1f이다.
사실 3.1을 본 기억이 없다.. 그냥 나의 실수도 실력이지 뭐 ㅋ
앞으로 실행결과는 밑에 있으니까 꼼꼼하게 체크해야겠다.
3번 문제는
#include <stdio.h>
int main(){
int a=10, b=20;
printf("a=%d\n",a++);
printf("a=%d\n",++a);
printf("b=%d\n",b--);
printf("b=%d\n",--b);
}
실행결과:
a = ?
a = ?
b = ?
b = ?
실행결과를 각각 쓰는 문제이다.
후위연산자는 값이 늘어나지 않고 이전값을 유지한다. --> 첫번째 a = 10
하지만 다음으로 넘어갈때는 1이 더해진 상태로 넘어가서 11로 시작된다.
전위연산자는 값이 늘어난다. --> 두번째 a=12
첫번째 b= 20 ( 후위연산자니까), 두번쨰 b=18 (감소되니까)
여기서 이상한 실수함..main 함수 안에있는 건 같이 계산해야 하는데 따로 계산함 ㅋ
근데 이건 실수가 아니라 내 실력같긴해서 화이팅하자
4번 문제는
문제) 널 문자를 제외하고 최대 9 글자의 문자열을 입력 받아 입력된 다음의 실행 예와 같이 거꾸로 출력하는 프로그램을 작성한다고 할 때 밑줄 부분을 채우시오. 단, 사용하는 변수는 가장 작은 크기의 메모리를 사용해야 한다.
실행 예:
Enter a string: Hello
olleH
#include <stdio.h>
#include <string.h>
int main(){
char str[?];
printf("Enter a string: ");
scanf("%s",str);
for(int i = ; ; ){
printf("%c",str[i]);
}
printf("\n");
return 0;
}
5개의 빈칸을 채우는 문제이다.
1) 문자열 배열의 크기는 "저장할 문자열의 길이 + 1" 이다. (가장 작은)
따라서 첫번째 빈칸은 10이다.
2) 그냥 for문에 들어갈 것부터 말하고 정리해보자.
for(int i = strlen(str) - 1 ; i >= 0 ; i-- ) 이다.
return 0; 앞에 있는 ' printf("\n"); '이 거꾸로 된 문자열을 출력할 것이다.
그럼 어떻게 해야할까?
'for문'에서 문자를 각각 거꾸로 출력해야겠다!
여기서, 기본적으로 배열은 어떻게 저장되어있을까?
"Hello"
str[0] = 'H'
str[1] = 'e'
str[2] = 'l'
str[3] = 'l'
str[4] = 'o'
--> 문자열의 길이는 5이지만, 인덱스는 0~4이다.
--> 이것을 출력하면 Hello 가 나온다.
그럼 문제로 돌아가서,
for 문 안에 printf("%c",str[i]); 이므로 인덱스를 거꾸로 출력하는 것이다.
따라서 ;i >= 0;i -- 이다.
strlen(str)이 문자열의 길이를 반환하는 함수이다.
인덱스를 구하는 것이므로 1을 빼줘야 한다.
따라서 답은, for(int i = strlen(str) - 1 ; i >= 0 ; i-- ) 이다.
이 문제의 핵심은
1) 배열의 기본인 인덱스가 0 ~ 문자열 길이 - 1 인지 알고 있는가?
2) 문자열의 길이 반환 strlen(str) 을 알고 있는가?
이다.
5번 문제는
교수님께서 말씀하시길.. 실행예를 보면 많이 어렵지 않다고 하신다! ㅎ
1부터 100사이의 정수에 9를 곱한 숫자의 각 자리 수를 한 자리수가 될 때까지 더한 값은 결국 9가 된다. 예를 들어 54 x 9 = 486이고 각 자리 수를 뒤에서부터 더하면 6 + 8 + 4 = 18이 되고 아직 한 자리수가 아니므로 다시 각 자리 수를 더면 8 + 1 = 9로 결국 9가 된다. 다음과 같이 이러한 과정을 수행하는 프로그램을 작성한다고 할 때 밑줄 부분을 채우세요.
실행 예:
Enter an integer (1-100) : 54
54 * 9 = 486
6 + 8 + 4 = 18
8 + 1 = 9
#include <stdio.h>
int main(void)
{
int i, rem, digit;
printf("Enter an integer (1-100) : ");
scanf("%d", &i);
rem=i*9;
printf("%d * 9 = %d\n", i, rem);
do {
digit = 0;
while (1) {
printf("%d", );
digit= ;
rem= ;
if (rem==0)
break;
printf(" + ");
}
printf(" = %d\n",digit);
rem=digit;
}while (rem!=9);
return 0;
}
1) 이 문제는 각 자리수를 계속 더해서 한 자리수가 될 때까지 반복하는 과정과 관련이 있다.
- 특히, 9의 배수는 각 자리 수를 모두 더했을 때 항상 9의 배수가 된다. 따라서 한 자리수가 되면 결국 9가 된다. 이와 같은 수학적 성질을 활용한 것이다.
2) 낮은 자리수부터 더하면 된다. 따라서 실행예를 보면 486을 6+8+4 이므로 rem % 10을 하면 나머지 '6'이 나온다.
--> 첫번째 빈칸 : rem %10
3) 그리고 남은 '48'에 대해서 똑같이 실행하면 된다.
--> 세번째 빈칸 : rem /10
4) 처음 시작할 때는 'digit' 이라는 값이 '0' 이었지만, rem %10 해준 값을 'digit' 에 지속적으로 저장해준다.
--> 두번째 빈칸 : digit + rem%10
9의 배수는 각 자리 수를 모두 더했을 때 항상 9의 배수가 된다는 수학적 성질을 이용하는 문제였다.
항상 실행예를 보고 공통점을 잡아내는 것이 중요한 것 같다.
근데 나는 5번 빼고 솔직히 다 맞은 줄 ^^
이래서 사람은 겸손해야 해. + 문제를 끝까지 읽고 3.14인지 3.1 인지 숫자를 잘보고..
그리고 코딩은 암기가 아니라 이해하는 게 우선이네요. ㅎ (지금 블로그 쓰면서 느낌)
나 자신에게 화가 나네요^^
하지만 어떡해? 이미 엎질러진 물인걸?
중간고사는 1주일 공부한거,, 까짓것 기말은 날고나는 애들 사이에서 살아남기 위해서 열심히 할게요..//
'대학교_1학년 > C프로그래밍 및 실습' 카테고리의 다른 글
C프로그래밍 및 실습 - 중간고사 리뷰2 (0) | 2024.11.14 |
---|---|
C프로그래밍 및 실습 - 배열/문자열 (0) | 2024.11.08 |
C프로그래밍 및 실습 - 제어문 (1) | 2024.10.29 |
C프로그래밍 및 실습(1) (1) | 2024.10.29 |