[C프로그래밍 새내기를 위한 첫 C 언어 책] Chapter3(입력과 출력) 정리 및 연습문제
내용 정리
※ 필드 폭, 정밀도
필드폭: 자료를 출력하는 데 사용할 전체 칸
%+필드폭d: 부호 출력
%-필드폭d: 왼쪽 정렬 (사용 안 하면 오른쪽 정렬)
정밀도: 소수점 아래 자리 수 지정
%. 정밀도 f: 정밀도 3이라면 소수 4자리에서 반올림하여 나타낸다.
아래의 예제를 확인하면 확실히 이해할 수 있을 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
|
#include <stdio.h>
int main()
{
double avg = 83.768;
printf("avg = %5.1f\n", avg);
printf("avg = %7.3f\n", avg);
printf("avg = %.2f\n", avg);
printf("avg = %5f\n", avg);
return 0;
}
|
출력함수
- printf
주의점: "(큰 따옴표) 출력하기 위해 이스케이프 문자인 \ 사용
ex) printf("My name is 'C'."); → 작은 따옴표는 이스케이프 문자 필요 없음
printf("You said \"Hello!\"."); → 큰 따옴표 이스케이프 문자 필요함!
문자 저장에는 작은 따옴표도 이스케이프 문자 필요
ex) char ch = '\'';
- putchar
문자 전용 출력 함수
변환 명세 필요 없음, 실행 속도 빠르다. → 문자 출력 용이
ex) char grade = 'A';
putchar(grade);
putchar('+');
→ A+ 출력, 개행하려면 putchar('\n');
- puts
문자열 전용 출력함수
변환 명세 필요 없음, 개행 문자 자동출력
puts("Hello!"); == printf("Hello!\n");
printf("% s\n", "Hello!");
입력함수
- scanf
scanf함수를 사용할 때는 키보드에서 입력되는 값을 주기억장치 몇 번지에 저장할지 명시해야 한다.
→ 기억 장소를 구해주는 연산자 &(앰퍼센트)를 사용
하지만 문자열을 저장하는 변수명이나 배열명은 그 자체가 문자열을 저장할 주기억장치의 시작 주소이므로 &를 붙이지 않는다.
문자열은 스페이스바, 탭키 전까지의 문자열이 변수에 저장
- getchar
문자 전용 입력함수
getchar() 형태로만 사용, 한 문자 입력을 받는다.
- gets
문자열 전용 입력함수
변환 명세 필요 없으며, 엔터키를 입력하기 전까지 모든 문자가 문자열로 저장.(공백 포함)
※fflush(stdin) 문자 입력과 버퍼 지우기
버퍼에 남아있는 개행 문자 때문에 문자를 입력할 때 오류 발생!
버퍼 안의 내용을 모두 지운 뒤 입력을 받아야 한다.
문자, 문자열 자료형 앞에 사용 → 공백도 입력문자로 사용하기 때문(숫자는 상관없음)
예제를 통해 입력 함수와 버퍼를 지워야 하는 이유를 확인해 보자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include <stdio.h>
int main()
{
char a, b, c;
int d, e;
printf("1.문자입력:");
a = getchar();
printf("2.숫자입력:");
d = scanf("%d", &d);
//fflush(stdin);
printf("3.문자입력:");
a = getchar();
return 0;
}
|
14열의 입력 함수가 처리될 때 버퍼에 있는 개행 문자가 삽입되어
입력을 수행하지 않고 메인 함수가 마무리된다.
따라서 12행의 주석처리를 해제하면 정상적으로 작동한다.
연습문제 풀이
7,8,9,10번을 풀어보겠다.
문제 7: 키보드에서 문자를 한 개 입력받은 후, 그 문자에 해당하는 ASCII코드 값을 구하는 프로그램을 작성하시오.
1
2
3
4
5
6
7
8
9
10
11
|
#include <stdio.h>
//연습문제7
int main()
{
char ch;
printf("문자를 입력하세요.:");
ch = getchar();
printf("%c의 ASCII코드 값은 %d입니다.\n", ch, ch);
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
|
문자, 숫자간 변환은 변환명세만 신경쓰면 된다.
문제 8: 키보드에서 8진수 정수와 16진수 정수를 하나씩 입력받은 후, 이 입력 값들과 두 정수의 합을 10진 정수로 출력하는 프로그램을 작성하시오.
1
2
3
4
5
6
7
8
9
10
11
|
#include <stdio.h>
//연습문제8
int main()
{
int oct, hex;
printf("8진수 16진수를 순서대로 입력하세요.:");
scanf("%o %x", &oct, &hex);
printf("%o(8) + %x(16) = %d", oct, hex, oct + hex);
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
|
역시 변환명세만 신경쓰면 진수변경 용이하다.
문제 9: 반지름을 입력받아 원의 둘레와 면적, 그리고 구의 부피를 구한 후 세 개의 결과 값의 소수 자리를 세로로 맞추어 출력하시오.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include <stdio.h>
//연습문제9
int main()
{
int r;
double pi = 3.141592;
printf("반지름(cm)을 입력하세요: ");
scanf("%d", &r);
printf("둘레= %7.2lf cm\n",pi* r* 2);
printf("면적= %7.2lf cm2\n", pi* r * r);
printf("부피= %7.2lf cm3\n", (4.0/3.0)*pi*r*r*r);
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
|
필드폭, 정밀도 문제이다. 맨 위의 예제에서 자세히 다뤘으니 설명은 패스
문제 10: 키와 몸무게를 입력받아 키에 맞는 표준 체중을 구한 후 자신의 몸무게와 표준 체중과의 차이를 출력하는 프로그램을 작성하시오.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include <stdio.h>
//연습문제10
int main()
{
double height, weight;
printf("키(cm)를 입력히세요.:");
scanf("%lf", &height);
printf("몸무게(kg)를 입력히세요.:");
scanf("%lf", &weight);
printf("당신의 키는 %.1lfcm (%.1lffeet)입니다.\n",height,height/30.48);
printf("당신의 체중은 %.1lfkg (%.1lflb)입니다.\n",weight,weight*2.20459);
printf("표준 체중 %.1lf과의 차이는 %+.1lfkg입니다.\n", (height - 100)*0.9, weight - ((height - 100)*0.9));
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
|
조금 더 살을 찌워보자...