Week 03
< 180404 >
1) 과제풀이.
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h> int main() { int t, s; int bits, bytes; scanf("%d%d", &t, &s); bits = 2 * t * s * 4000; bytes = bits/8; return 0; } | cs |
>> 7 : scant() 에서 %d 는 10진수 정수를 입력받기 위한 서식문자.
>> 7 : &변수명 인 경우, &는 변수의 주소를 반환해주는 연산자..!!
2) %d 와 %c ..
- 숫자를 입력하고, 엔터를 친 다음, 문자를 입력하고 엔터를 쳤을때, 어떤 결과를 원한다.
- 아래 코드의 문제점은..??
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> int main() { int n; char ch; scanf("%d", &n); scanf("%c", &ch); printf("%d %c\n", n, ch); printf("End\n"); return 0; } | cs |
>> 숫자를 입력하고 엔터를 치면, 해당 숫자는 n에 저장되는데,
다음에 문자를 치기전에 쳤던 엔터도 문자로 인식이 되어 %c 에 저장이 된다.
- 해결책 1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> int main() { int n; char ch; scanf("%d", &n); getchar(); scanf("%c", &ch); printf("%d %c\n", n, ch); printf("End\n"); return 0; } | cs |
>> 스캔에프 사이에 getchar() 을 추가한다. 이유가 궁금하면 검색을...
getchar() 을 검색하기전에 '입력버퍼' 라는 것에 대해 검색을 먼저 해보자.
- 해결책2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> int main() { int n; char ch; scanf("%d", &n); scanf(" %c", &ch); printf("%d %c\n", n, ch); printf("End\n"); return 0; } | cs |
>> 9 : "%c" 를 " %c" 라 바꿧다. 즉 빈칸이 엔터키를 포함시켜, 정상적으로 문자를 입력받을 수 있게된다.
>> 이 원리가 궁금하면 스캔에프 사용법에 대해 검색을 해보자..
>> 해결책 2를 권함..^^
3) 입력 프롬프트에서 1을 입력했다. 프로그램은 이 1이란 것을 숫자 1인지, 문자 '1' 인지 어떻게 구분을 하여 저장을 할까??
1 2 3 | scanf("%d", &n); scanf("%c", &ch); | cs |
>> 서식문자를 무엇으로 지정했는지에 따라 구분이 가능하다.
4) 10진수 정수를 입력받아, 8진수, 16진수로 출력하기. 문자를 입력받아 그 문자의 아스키코드값 출력하기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> int main() { int n; char ch; scanf("%d", &n); printf("10진수: %d\n", n); printf("8진수: %o\n", n); printf("16진수: %x\n", n); printf("\n"); scanf(" %c", &ch); printf("%c의 ASCII 코드값: %d\n", ch, ch); return 0; } | cs |
>> 실행결과
1 2 3 4 5 6 7 | 10 10진수: 10 8진수: 12 16진수: a A A의 ASCII 코드값: 65 | cs |
5) 10진수 vs 8진수 vs 10진수
10진수 : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
8진수 : 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 ...
16진수 : 1 2 3 4 5 6 7 8 9 10 A B C D E F G 10 ...
6) 4자리 정수(1000 ~ 9999) 까지의 정수를 입력받았을 때, 이를 거꾸로 출력해보기.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <stdio.h> int main() { int n, res; scanf("%d", &n); res = n%10; n /= 10; res = res*10 + n%10; n /= 10; res = res*10 + n%10; n /= 10; res = res*10 + n%10; printf("%d\n", res); return 0; } | cs |
>> 1234 를 입력하면, 4321 이 출력된다.
>> 8 : res 에는 4가 저장된다.
>> 9 : n 에는 123 이 들어있다.
>> 11 : res 에는 43 이 저장된다.
>> 12 : n 에는 12 가 저장된다.
>> 14 : res 에는 432 가 저장된다.
>> 15 : n 에는 1 이 저장된다.
>> 17 : res 에는 4321 이 저장된다.
7) 증감 연산자. a++ vs ++a
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> int main() { int a, b, c; a = 5; b = a++; c = ++a + b++; printf("%d %d %d\n", a, b, c); return 0; } | cs |
>> 실행결과 : 7 6 12
>> 8라인이 끝나기 전에는 a에는 5가, b에도 5가 저장되어 있다.
>> 8라인이 끝나고 나서야 a에 값이 6으로 증가한다.
>> 9번 라인이 끝나기 전에는 a는 1이 증가한 7이, b에는 5가, c에는 그 둘의 합인 12가 저장된다.
>> 9번 라인이 끝나고 나서야 b의 값은 1이 증가하여 6이된다.
>> 그렇기 때문에 10라인에서 최종적으로 7 6 12 라는 결과가 출력된다.
8) scanf() 에서의 서식문자 %lf vs %f
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <stdio.h> int main() { float 키1, 키2, 키3, 키4; char 혈1, 혈2, 혈3, 혈4; printf("학생1의 키와 혈액형:"); scanf("%f %c", &키1,&혈1); printf("학생2의 키와 혈액형:"); scanf("%f %c", &키2, &혈2); printf("학생3의 키와 혈액형:"); scanf("%f %c", &키3, &혈3); printf("학생4의 키와 혈액형:"); scanf("%f %c", &키4, &혈4); printf("평균 키:%.1lf\n", (키1 + 키2 + 키3 + 키4) / 4); return 0; } | cs |
>> 문제 없이 출력된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <stdio.h> int main() { double 키1, 키2, 키3, 키4; char 혈1, 혈2, 혈3, 혈4; printf("학생1의 키와 혈액형:"); scanf("%f %c", &키1,&혈1); printf("학생2의 키와 혈액형:"); scanf("%f %c", &키2, &혈2); printf("학생3의 키와 혈액형:"); scanf("%f %c", &키3, &혈3); printf("학생4의 키와 혈액형:"); scanf("%f %c", &키4, &혈4); printf("평균 키:%.1lf\n", (키1 + 키2 + 키3 + 키4) / 4); return 0; } | cs |
>> 원하지 않는 결과가 출력될 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <stdio.h> int main() { double 키1, 키2, 키3, 키4; char 혈1, 혈2, 혈3, 혈4; printf("학생1의 키와 혈액형:"); scanf("%lf %c", &키1,&혈1); printf("학생2의 키와 혈액형:"); scanf("%lf %c", &키2, &혈2); printf("학생3의 키와 혈액형:"); scanf("%lf %c", &키3, &혈3); printf("학생4의 키와 혈액형:"); scanf("%lf %c", &키4, &혈4); printf("평균 키:%.1lf\n", (키1 + 키2 + 키3 + 키4) / 4); return 0; } | cs |
>> 원하는 결과가 출력될 것이다.
>> 결론 : scarf() 에서의 서식문자 %lf 는 double 형 변수에 , %f 는 float 형 변수에 맞는 서식문자이다.
9) 기타
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <stdio.h> int main() { int a=20, b=10; a = a+b; a += b; a = a-b; a -= b; a = a*b; a *= b; a = a/b; a /= b; return 0; } | cs |
>> 7, 8과 10, 11과 13, 14와 16, 17은 같은 연산이다.
- printf() 함수를 통해 %를 출력하고 싶으면 %% 를 써야한다.
1 2 3 4 5 6 7 | #include <stdio.h> int main() { printf("%d%%\n", 10); return 0; } | cs |
>> 실행결과 : 10%