1 / 48

CHAPTER 03. 입력과 출력

CHAPTER 03. 입력과 출력. 프로그램에서 입력과 출력의 필요성을 살펴본다 . 표준 출력 함수 printf, putchar, puts 의 특징과 사용법을 익힌다 . 표준 입력 함수 scanf, getchar, gets 의 특징과 사용법을 익힌다 . printf 와 scanf 함수에서 사용되는 변환명세를 이해한다. 3.0 개요 p.76. 출력 입력 표준 입력과 표준 출력 키보드 / 모니터 scanf / printf 함수 등.

Download Presentation

CHAPTER 03. 입력과 출력

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CHAPTER 03. 입력과 출력 프로그램에서 입력과 출력의 필요성을 살펴본다. 표준 출력 함수 printf, putchar, puts의 특징과 사용법을 익힌다. 표준 입력 함수 scanf, getchar, gets의 특징과 사용법을 익힌다. printf와 scanf 함수에서 사용되는 변환명세를 이해한다.

  2. 3.0 개요 p.76 • 출력 • 입력 • 표준 입력과 표준 출력 • 키보드 /모니터 • scanf / printf 함수 등

  3. 3.1.1 변환명세를 포함하지 않은 printf 함수 p.78 • 단순히 특정 문자열을 출력하기 • 예) • 1 printf("Hello! "); • 2 printf("My name is 'C'. "); • 3 printf("Nice to meet you. ");

  4. 3.1.1 변환명세를 포함하지 않은 printf 함수 p.79 • 이스케이프 문자(escape sequence) • 원래 문자의 의미를 벗어나(escape) 특별한 의미를 가진 문자임을표시하기 위해 ‘\’(백슬래쉬, ‘\’)로 시작하는 문자 • p.79 [표 3-1] • 예 : 출력 결과를 보기 좋게 하기 위해 행을 바꾸고 싶으면? 행을 강제로 바꾸는 문자 ‘\n’을 사용

  5. 3.1.1 변환명세를 포함하지 않은 printf 함수 p.79 • 이스케이프 문자를 이용한 출력 예 1 printf("Hello! "); 2 printf("My name is 'C'. \n"); 3 4 printf("You said \"Hello!\". \n\n"); 5 6 printf("Yes!!\b"); 7 printf("I said \"Hello!\" \n\n"); 책 수정 실행결과 Hello! My name is ‘C’. ↲ You said “Hello!”. ↲ ↲ Yes! I said “Hello!” ↲ ↲

  6. 3.1.2 변환명세를 포함한 printf 함수 p.80 • 변수에 저장된 값은 어떻게 출력? • 변환명세(conversion specification)를 이용 형식에 맞게 출력

  7. 3.1.2 변환명세를 포함한 printf 함수 p.81 • 변환명세의 종류

  8. 3.1.2 변환명세를 포함한 printf 함수 p.82 • 예) 1 int age = 26; 2 double height = 175.7; 3 char grade = 'A'; 4 5 printf("나이 %d세\n", age); 6 printf("키 %lfcm의 표준체중: %lf\n", height, (height - 100) * 0.9); 7 printf("학점: %c\n", grade); 8 printf("국적: %s\n\n", "대한민국"); 9 printf("1억: %e\n", 1.0e8); 10 11 printf("10진수 %d = 8진수 %o = 16진수 %X\n", age, age, age);

  9. 3.1.2 변환명세를 포함한 printf 함수 p.82 • p. 82 『주의』 • 자료형에 맞지 않은 변환명세를 사용하면 이상한 결과가 출력된다.

  10. 3.1.3 변환명세의 필드폭, 플래그, 정밀도 p.83 • 자료의 크기가 가변적일 때 세로로 가지런히 맞춰 출력하기 • 필드폭을지정하여 해결 가능 필드폭을 지정하면 다음과 같이 세로로 가지런히 맞추어 출력 가능

  11. 3.1.3 변환명세의 필드폭, 플래그, 정밀도 p.84 • %d 변환명세에서의 필드폭 출력에 사용할 전체 칸 무조건 부호 출력 양수도 + 출력 왼쪽 정렬

  12. 3.1.3 변환명세의 필드폭, 플래그, 정밀도 p.84 • %d 변환명세 사용 예 책 수정 2

  13. 3.1.3 변환명세의 필드폭, 플래그, 정밀도 p.84 • %d 변환명세 사용 예: p.83의 예 결과와비교 • p. 85 『주의』출력할 자료의 자리수가 필드폭보다클 경우 • 위의 예에서 %3d 대신 %2d를 사용했다면 결과는?

  14. %lf 사용법 p.85 • %필드폭.정밀도lf • p. 85 예 1 double avg = 83.768; 2 3 printf("avg=%7.3lf\n", avg); 4 printf("avg=%6.2lf\n", avg); 출력에 사용할 전체 칸 • 필드폭: 7 • 정밀도: 3 (정밀도+1)번째 자리에서 반올림

  15. %lf 사용법 p.85 • %.정밀도lf • . 아래 칸만 강제 지정 • p. 85 예 1 double avg = 83.768; 2 5 printf("avg=%.2lf\n", avg);

  16. %lf 사용법 p.85 • %필드폭lf • 필드폭: 전체 출력 칸 • 소수점 아래: 무조건 6칸, 필드폭 나머지 왼쪽 칸에 . 위 값과 .을 출력 • p. 85 예 1 double avg = 83.768; 2 6 printf("avg=%10lf\n", avg); 필드폭: 전체 출력 칸 무조건 6자리

  17. %lf 사용법 p.85 • %필드폭.lf • 필드폭: 전체 출력 칸 • . 아래 첫 자리에서 반올림하여 소수점 위의 값만 출력  “%전체폭.0lf”와 결과가 같음 • p. 85 예 1 double avg = 83.768; 2 7 printf("avg=%5.lf\n", avg); 필드폭: 전체 출력 칸 . 아래에서 반올림한 결과 • p. 86 ★『주의』 • 100점 만점의 평균 점수 여러 개를 출력할 경우 %5.1lf가 아닌 • %3.1lf로 지정하면 평균 점수들의 소수점 위치를 나란히 맞출 수 없다. 왜?

  18. 3-1 실수형의 출력 예 p.86 각자 1 #include <stdio.h> 2 3 intmain() 4 { 5 double d = 12.345e-50; 6 7 printf("d = %.5lf\n", d); 8 printf("d = %.50lf\n", d); 9 10 printf("d = %.5e\n", d); 11 printf("d = %.5E\n", d); 12 13 return 0; 14 }

  19. 3.1.3 변환명세의 필드폭, 플래그, 정밀도 p.87 • %c 변환명세 사용법 • %필드폭c • %-필드폭c • 예) • 1 char grade = 'A'; • 2 • 3 printf("I've got an %c.\n", grade); • 4 printf("I've got an %3c.\n", grade); • 5 printf("I've got an %-3c.\n", grade); 왼쪽 정렬

  20. 3.1.3 변환명세의 필드폭, 플래그, 정밀도 p.87 • %s 변환명세 사용법 • 자세한 문자열 처리는 7장에서 소개함 • %필드폭s • %-필드폭s 왼쪽 정렬

  21. 3.2 문자와 문자열 전용 출력 함수 p.88 • printf는 변환명세 때문에 번거로워!!! • 보다 간결하고 처리 속도도 빠른 건 없을까? • putchar함수 문자 1개 출력 • 형식 putchar(‘문자’);putchar(문자형 변수); • 예) 1 char grade = 'A'; 2 3 putchar(grade); 4 putchar('+'); 5 putchar('\n');

  22. 3.2.2 문자형 자료와 정수형 자료 간의 상호 변환 관계 p.89 • 문자의 ASCII 코드 (p.50, p.51 참고) • 문자마다 정해진 2진수의 ASCII 코드가 부여됨 • 2진수 코드값은10진수 정수로 변환 가능문자 ↔정수 : 상호 변환 가능 • char ch = 'A' + 2;  ‘A’의ASCII 코드 값 65 + 2 = 67  67은 ‘C’의 ASCII 코드 값  ch에는 ‘C’가 저장

  23. 3.2.3 문자열 전용 출력 함수 puts p.90 • puts 함수 • 문자열 출력 후 무조건 개행 문자(‘\n’) 출력  즉 줄이 바뀜 • 형식 puts(“문자열); puts(문자열 변수); • 예 1 puts("Hello!"); 2 puts("My name is Hong GilDong."); 3 puts("Nice to meet you.");

  24. 3.3 프로그래밍 실습 p.90 • 문제 주어진 자료:학번 2013901, 국어 89, 세계사 100, 수학 95 결과:세 과목의 평균(94.67) 출력 형식: 세 점수를 세로로 나란히 맞추기, 평균은. 아래 두자리까지 출력 • 학번 • 단순히 int형 정수로 간주하여 int형 변수에 저장 • 각과목의 점수 • 최대 점수가 100이므로 %3d 또는 %4d와 같이 필드폭을 3 이상으로 지정 • 평균 점수 • 소수점 아래 두 자리까지 출력되도록 %6.2lf로 지정(전체 폭은 6보다 크게) • 과목명 문자열 • 한글 한 자는 출력 시 두 칸을 차지  가장 긴 “세계사”를 고려해 %-6s 사용

  25. 3-2 세 과목의 평균을 구해 출력하기 (ch3-2.cpp) p.91 3 intmain() 4 { 5 // 변수 선언 6 intstd_no, kor, world, math; 7 double avg; 8 9 // 대입문을 사용해 변수 값 저장하기 10 std_no= 2013901; 11 kor= 89; 12 world = 100; 13 math = 95; 14 15 // 세 과목의 평균 구하기 16 avg= (kor + world + math) / 3.0; 17 18 // 결과를 형식에 맞춰 보기 좋게 출력하기 19 printf("%-6s: %d \n", "학번", std_no); 20 printf("===============\n"); 21 printf("%-6s: %4d(점) \n", "국어", kor); 22 printf("%-6s: %4d(점) \n", "세계사", world); 23 printf("%-6s: %4d(점) \n", "수학", math); 24 printf("===============\n"); 25 printf("%-6s: %7.2lf \n", "평균", avg); 정수/정수 결과는 정수이므로 3을 실수로 사용

  26. 3.4 입력 함수 scanf p.92 • 프로그램에서 지정할 수 없는 값은 사용자가 직접 입력하도록 한다. • 예) 사용자의 나이, 키, 이름, 학교명 등 • scanf, getchar, gets 등의 함수를 사용 • scanf를 많이 사용 : printf에서 사용된 변환명세를 사용

  27. 3.4.1 한 개의 자료만 입력하기 p.93 • scanf함수를 사용한 입력 • 변수명= 키보드 입력 값; 효과 • &변수명 • 변환명세: [표 3-4] • scanf함수의 실행 과정 • 실행 창에 커서가 깜박이며 사용자 입력을 기다림 • 사용자가 키보드로 자료를 입력하고[엔터]키를 누름 • 입력된 값이 변수에 저장

  28. 3.4.1 한 개의 자료만 입력하기 p.94 • 예 1 int age; 2 3 printf("나이는? "); 4 scanf("%d", &age); 5 6 printf("입력한 나이: %d세\n", age);

  29. 3.4.1 한 개의 자료만 입력하기 p.94 • p. 94 『주의』 scanf 함수 • “ 변환명세” 안에 변환명세가 아닌 다른 문자는 사용 못함 • scanf(“나이는? %d”, &age); [X] • printf(“나이는? ”); scanf(“%d”, &age); [O] • “변환명세”에서 “로 닫기 전에 공백 문자(white character)나 이스케이프 문자를 넣지 않기 • scanf(“%d\n”, &age), scanf(“%d ”, &age) [X] • 뒤의 입력문 내용에 따라 키보드 입력을 한 번 더 해야 하는 현상이 생길 수도 있다. • 자료형에맞는 변환 지시자(d, lf, c, s 등)를 정확히 사용 • 변환명세에서 필드폭은 사용하지 않는 것이 더 편리(꼭 필요할 때만 사용)

  30. 프로그램 3-3 학생의 개인 정보를 입력받아 출력하기 p.95 5 intage; 6 char gender; 7 double height; 8 9 // 자료 입력 받기 10 printf("성별은? (남자라면 M 여자라면 F) "); 11 scanf("%c", &gender); 12 printf("나이는? "); 13 scanf("%d", &age); 14 printf("키는? "); 15 scanf("%lf", &height); 16 17 // 결과 출력하기 18 printf("\n============\n"); 19 printf("성별: %c\n", gender); 20 printf("나이: %d세\n", age); 21 printf("키: %.1lfcm\n", height);

  31. 3.4.1 한 개의 자료만 입력하기 p.97 • %s를사용한 문자열 입력

  32. 3.4.2 여러 개의 자료를 한꺼번에 입력하기 p.98 • scanf함수에서여러 변수의 값을 입력하기 • 키보드 입력 방법 • 자료 간 구분은 공백 문자(스페이스바, 탭키, 엔터키 입력 문자)를 사용 • 입력의 끝은 [Enter]키 사용 • “%d %d”도 가능 • “%d%d\n”, “%d%d ” 처럼 “로 닫기 전에 ‘\n’이나 빈칸을 넣지 않아야 함 • “%d, %d”  입력 시 반드시 ‘,’를 눌러야 함입력 방법: 10, 20↲

  33. 3.4.2 여러 개의 자료를 한꺼번에 입력하기 p.99 • p.99 『주의』 확인하기

  34. 3.5.1 문자 전용 입력 함수 getchar p.100 • getchar • 문자만입력 • 예) 1 char grade; 2 3 printf("C 언어의 학점은? "); 4 grade = getchar(); 5 printf("C 언어의 학점은 %c입니다.\n", grade);

  35. 3.5.2 문자 입력과 버퍼 비우기 fflush(stdin) p.100 • 숫자를 먼저 입력 받은 후 문자를 입력 받았을 때 발생하는 문제 • 문자 자료를 입력 받을 때는 공백 문자(빈칸, 탭키, 엔터키)도 입력 문자로 사용되므로 문제가 발생할 수 있음 3.5.2는 나중에 [프로그램 3-3] 순서를 바꾸면 어떤 문제가 발생할까? [프로그램 3-5]

  36. [프로그램 3-5]에서의 문제점 p.101 • 15행이 입력문이지만 사용자의 입력을 받지 않고 곧바로 18행이 실행된다. 실행결과 나이는? 21 ↲ 키는? 165.7 ↲ 성별은? (남자라면 M 여자라면 F) ============= 성별: ↲ ↲ 나이: 21세 ↲ 키: 165.7cm ↲ • 19행에서 gender가 출력될 곳에 개행 문자가 출력되어 있다. (왜?)

  37. 3.5.2 문자 입력과 버퍼 비우기 fflush(stdin) p.102 • 숫자 입력 후 문자 입력 시 발생하는 문제는 버퍼를이용하는 입력 때문 • 입출력 버퍼(buffer) • 입출력은 컴퓨터의 다른 장치 보다 속도가 아주 느림 • 이를 보완하기 위해 운영체제는 입출력이 수행될 때 입출력 자료를 임시로 버퍼에 모아두었다가 한꺼번에 전달함 • 버퍼를 이용한 입력 처리 과정 • 사용자가 입력한 자료는 변수에 바로 저장되지 않고 일단 버퍼에 저장 • 엔터키가 입력되면 버퍼에 있는 내용을 꺼내서 실제로 변수에 자료를 저장하며 • 버퍼의 내용을 변수에 저장할 때 버퍼에 저장된 내용이 남아 있는한다음 입력문 실행시 키보드에서 자료가 입력되기를 기다리는 게 아니라 버퍼에 있는 내용을 이용하여 곧바로 변수에 저장함  버퍼에 이전에 키보드에서 입력된 자료가 있다면 새로운 입력을 기다리지 않고 버퍼의 내용으로 입력을 완료

  38. 3.5.2 문자 입력과 버퍼 비우기 fflush(stdin) p.102 12 printf("키는? "); 13 scanf("%lf", &height); 14 printf("성별은? (남자라면 M 여자라면 F) "); 15 gender = getchar(); // scanf("%c", &gender); 16 17 // 결과 출력하기 18 printf("\n============\n"); 19 printf("성별: %c\n", gender); 20 printf("나이: %d세\n", age); 21 printf("키: %.1lfcm\n", height); • 사용자가 165.7 입력 후 엔터키를 누르면 버퍼에 저장된 내용을 꺼내서 height에 저장하여 입력을 완료한다. • 15행 입력문 처리 시 버퍼에 남은 자료(엔터키)가 있으므로 입력을 기다리지 않고 이 문자를 gender에 저장하여 입력을 완료한다. •  사용자에게서 새로 gender를 입력 받지 않고 이전의 입력 자료를 사용함으로써 문제가 발생

  39. 3.5.2 문자 입력과 버퍼 비우기 fflush(stdin) p.103 • 문제 해결 방안 1 • 15행 앞에 getchar(); 문장을 추가 • 버퍼에 남은 엔터키를 읽어 버퍼가 비게 되면 새로운 사용자 입력이 버퍼에 저장될 때까지 기다리게 된다. 13 scanf("%lf", &height); 14 printf("성별은? (남자라면 M 여자라면 F) "); getchar(); 15 gender = getchar(); // scanf("%c", &gender); • 상황에 따라 버퍼에 엔터키 외 다른 문자가 여러 개 있는 경우에는 해결할 수 없으므로 근본 해결 방안이 아님 13행 실행 후 버퍼에 남아있는 엔터키를입력받음으로써 버퍼가 비게 된다.

  40. 3.5.2 문자 입력과 버퍼 비우기 fflush(stdin) p.103 • 문제 해결 방안 2 • 사용자에게서 새로운 입력을 받도록 강제로 버퍼를 비움  버퍼에서 읽어올 자료가 없으므로 사용자가 새 자료를 입력할 때까지 기다리게 됨 • 언제나 사용자에게서 새로 입력을 받게 된다. • 표준 입력 장치용 버퍼의 내용을 모두 제거 • 이 함수 호출문 다음에 나오는 입력문은 항상 키보드에서 새로운 자료를 입력받게 됨

  41. 3.5.2 문자 입력과 버퍼 비우기 fflush(stdin) • 해결 결과: [프로그램 3-6] p.104

  42. 3.5.4 문자열 전용 입력 함수 gets p.106 • scanf의 문자열 입력 시 문제점 • 공백, 탭 등이 포함된 문자열을 한꺼번에 입력 받을 수 없음 • “Hong GilDong”을입력 → “Hong”만 입력 됨 • 행 단위 입력 함수 gets사용

  43. 3.5.4 문자열 전용 입력 함수 gets p.106 • 행 단위 입력 함수 gets사용 1 char address[30]; 2 3 printf("주소는? "); 4 gets(address); 5 printf("입력한 주소: %s", address);

  44. 3.6 프로그래밍 실습 p.106 • 문제) • 학생의 이름, 학년, 평점을 입력 후 평점을 100점 만점의 점수로 환산하여 출력하기 • 빈칸을 포함한 이름 입력 : scanf대신 gets 함수 이용 • 학생의 이름: • 문자열 → char형 1차원 배열 • 한글 1자는 2바이트 차지 → 넉넉하게 배열의 크기를 10으로 사용 • 학점은 A+를 4.5 만점으로 환산 • 평점 4.5가 100점이므로 입력된 평점 GPA를 점수 score로의 환산은4.5 : 100점 = GPA : score로 구함 분석

  45. 3-8 학생의 평점을 점수로 환산하여 출력하기 p.107

More Related