240 likes | 549 Views
2. scanf () 함수 활용 프로그램. 문제내용 scanf () 함수를 사용하여 모든 데이터 형의 값을 입력 학습내용 다양한 데이터형을 어떻게 읽어들이는지 학습 scanf () 함수의형식 변환 ( 형식서식 ) 문자 ( 기본 ). 형 식 : scanf (“ 형식 문자열” , 인수 ); 하는일 : 표준입력장치 ( 키보드 ) 로부터 입력값을 변수에 저장 형식문자열 : 변환 ( 서식 ) 문자로 구성
E N D
2. scanf() 함수 활용 프로그램 • 문제내용 • scanf() 함수를 사용하여 모든 데이터 형의값을 입력 • 학습내용 • 다양한 데이터형을 어떻게 읽어들이는지 학습 • scanf() 함수의형식 • 변환(형식서식)문자(기본) 형 식 : scanf(“형식 문자열”, 인수); 하는일: 표준입력장치(키보드)로부터 입력값을 변수에 저장 형식문자열 : 변환(서식)문자로 구성 인 자 : 입력값을 저장할 변수명(문자열 변수나배열을 제외한 변수명 앞에 &를 붙인다. (예 : &var_name, scanf(“%d”, &sum);)
2. scanf() 함수 활용 프로그램 • 함수의 형식 함수 원형 intscanf(const char * Format, [arguments]…); // scanf( 형식문자열, 인수들 ); 반 환 값 입력 받은 인수의 개수. 인 자 Format 입력할 문자열의 형식. [arguments] Format문자열의 형식으로 키보드로 부터 입력 받아 저장될 변수인자들. 내 용 키보드로부터 문자열을 입력 받아 Format에 정의한 형식으로 지정한 인수에 저장한다.
2. scanf() 함수 활용 프로그램 • 변환(형식서식)문자(상세) : I : 또는 #include <stdio.h> void main( void ) { char stdMaj[30]={0,}; charstdName[20]={0,}; intstdNum=0; printf("학과를 입력하세요 : "); scanf("%s", stdMaj); printf("학번을 입력하세요 : "); scanf("%d", &stdNum); printf("이름을 입력하세요 : "); scanf("%s", stdName); printf("\n학생의 학과는 \'%s\'이고 ",stdMaj); printf("학번은 \'%d\'이며 ",stdNum); printf("이름은 \'%s\'입니다.\n",stdName); }
2. scanf() 함수 활용 프로그램 • 사용 예제 • 기본적인 사용 예제 30 20 0 0 0 c 0 0 o 0 0 0 0 m 0 p 0 0 0 0 u 0 0 t 0 0 e … r 0 0 \0 0 0 0 0 … … 0 0 stdName stdNum stdMaj #include <stdio.h> void main( void ) { char stdMaj[30]={0,}; charstdName[20]={0,}; intstdNum=0; printf("학과를 입력하세요 : "); scanf("%s", stdMaj); printf("학번을 입력하세요 : "); scanf("%d", &stdNum); printf("이름을 입력하세요 : "); scanf("%s", stdName); printf("\n학생의 학과는 \'%s\'이고 ",stdMaj); printf("학번은 \'%d\'이며 ",stdNum); printf("이름은 \'%s\'입니다.\n",stdName); } 0 l e e \0 0 0 0 … 0 %s 20141234 %d lee Lee s g (엔터) 20141234 (엔터) Computer (엔터)
2. scanf() 함수 활용 프로그램 • 사용 예제 • 기본적인 사용 예제 30 20 0 0 0 c 0 0 0 o 0 m 0 0 0 p 0 0 0 u 0 0 0 t 0 0 e … r 0 0 \0 … 0 0… 0 0 0 stdName stdNum stdMaj #include <stdio.h> void main( void ) { char stdMaj[30]={0,}; charstdName[20]={0,}; intstdNum=0; printf("학과를 입력하세요 : "); scanf("%s", stdMaj); printf("학번을 입력하세요 : "); scanf("%d", &stdNum); printf("이름을 입력하세요 : "); scanf("%s", stdName); printf("\n학생의 학과는 \'%s\'이고 ",stdMaj); printf("학번은 \'%d\'이며 ",stdNum); printf("이름은 \'%s\'입니다.\n",stdName); } 0 l e e 0 \0 0 0 … 0 20141234 %s %d %s
2. scanf() 함수 활용 프로그램 printf("long형을 입력하세요 : " ); scanf("%d", &l ); printf("scanf : %d\n\n", l); printf("8진수형을 입력하세요 : " ); scanf("%o", &o8 ); printf("scanf : %o\n\n", o8); printf("16진수형을 입력하세요 : " ); scanf("%x", &x16 ); printf("scanf : %x\n\n", x16); printf(“float형을 입력하세요 : " ); scanf("%f", &f ); printf("scanf : %f\n\n", f); printf(“double형을 입력하세요 : " ); scanf("%lf", &d ); printf("scanf : %lf\n\n", d); printf("문자열형을 입력하세요 : " ); scanf("%s", s ); printf("scanf : %s\n\n", s); printf("정수 입력하세요\n"); scanf("%4d %3d", &i, &o8); printf("%d, %d\n", i, o8); } • 여러 변환문자를 사용한 예제 #include<stdio.h> void main( void ) { charch=0; short intsi=0; inti=0, o8=0, x16=0; unsignedui=0; long l=0; float f=0; double d = 0; char s[100]={0,}; printf("char형을 입력하세요 : " ); scanf("%c", &ch ); printf("scanf : %c\n\n", ch); printf("short형을 입력하세요 : " ); scanf("%hd", &si ); printf("scanf : %hd\n\n", si); printf("int형을 입력하세요 : " ); scanf("%d", &i ); printf("scanf : %d\n\n", i); printf("unsigned형을 입력하세요 : " ); scanf("%u", &ui ); printf("scanf : %u\n\n", ui);
2. scanf() 함수 활용 프로그램 • 버퍼 (Buffer) • 두 장치의 양자간의 데이터 전송/처리 속도의 차이를 해결하기 위해, 전송할 정보를 임시로 저장하는 고속 기억장치 • 선입선출(FIFO: First In First Out) 방식인 큐(Queue) 형태 • scanf() 함수사용 시 입력한 내용은 변수에 변환 저장되기 전에 먼저 버퍼에 저장됨 i n p u t 0 \0 0 0 0… 0 i \n n Input Value[20] p 변수 0 0 0 0 0 0 u Input t \n … 버퍼
2. scanf() 함수 활용 프로그램 • 두 번의 정수 입력 버퍼에 입력된 데이터 변환문자 %d 에 의해, 정수 부분만을 읽어와 변수 a에 저장 변수a에 값 12를 저장한 후 버퍼 상태
2. scanf() 함수 활용 프로그램 • 두 번의 정수 입력 버퍼에 입력된 데이터 변환문자 %d 에 의해, 정수 부분만을 읽어와 변수 a에 저장 * 버퍼 가장 앞쪽의 개행문자(\n)는 버려짐 변수a에 값 34를 저장한 후 버퍼 상태
2. scanf() 함수 활용 프로그램 • 자료형에 관계없이 두 번째 입력이 문자일 경우 ? 첫 번째 정수 입력 시 버퍼에 남아있는 개행 문자(\n)를 두 번째 scanf() 함수에서 자동으로 변수 ch에 저장하여 프로그램이 정상 동작하지 못함
2. scanf() 함수 활용 프로그램 • scanf(“%d”, &arg)의 여러 입력 형태 • 처음 읽어들인 문자가 공백(스페이스, 탭, 개행)이면 무시한다.(공백인 버퍼를 비움) 0 0 0 0 0 0 0 0 0 0 0 … 0 일반적인 입력 1 1 \n \n 버퍼 arg 1 1
2. scanf() 함수 활용 프로그램 • scanf(“%d”, &arg)의 여러 입력 형태 • 처음 읽어들인 문자가 공백 (스페이스, 탭, 개행) 이면 무시한다.(공백인 버퍼를 비움) 0 0 0 0 0 0 0 0 0 0 0 … 0 공백 하나 입력 후 입력 (공백)2 공백 2 \n \n 버퍼 arg (공백)2 2 공백은 버려짐
2. scanf() 함수 활용 프로그램 • scanf(“%d”, &arg)의 여러 입력 형태 • 처음 읽어들인 문자가 공백 (스페이스, 탭, 개행) 이면 무시한다.(공백인 버퍼를 비움) 0 0 0 0 0 0 0 0 0 0 0 … 0 여러 공백 입력 후 입력 (공백)(공백)…3 공백 공백 공백 공백 3 \n \n 버퍼 arg (공백)(공백)…3 3 공백들은 버려짐
2. scanf() 함수 활용 프로그램 • scanf(“%d”, &arg)의 여러 입력 형태 • 처음 읽어들인 문자가 공백 (스페이스, 탭, 개행) 이면 무시한다.(공백인 버퍼를 비움) 0 0 0 0 0 0 0 0 0 0 0 … 0 탭문자 입력 후 입력 \t4 \t 4 \n \n 버퍼 arg \t4 4 탭은 버려짐
2. scanf() 함수 활용 프로그램 • scanf(“%d”, &arg)의 여러 입력 형태 • 처음 읽어들인 문자가 공백 (스페이스, 탭, 개행) 이면 무시한다.(공백인 버퍼를 비움) 0 0 0 0 0 0 0 0 0 0 0 … 0 개행 문자 입력 후 입력 \n\n\n…5 \n \n \n \n … 5 \n \n 버퍼 arg \n\n\n…5 5 개행은 버려짐
2. scanf() 함수 활용 프로그램 • scanf(“%d”, &arg)의 여러 입력 형태 • 읽어 들인 문자가 숫자가 아니면 이를 버퍼에 남겨두고 읽지 않는다 • 입력 1에서 %d가 문자a를 받지 못하므로 버퍼가 비워지지 않는다 • 입력 2에서 버퍼에 값이 존재하므로 키보드로 부터 값을 받지 않고 버퍼에 남은 값을 읽으려고 한다. 0 0 0 0 0 0 … … 0 0 입력1 a \n a a 버퍼 초기값 7을 가짐 7 7 입력2 var var a \n a 버퍼 버퍼에 값이 존재함으로 키보드로부터 입력을 받지 않음
2. scanf() 함수 활용 프로그램 • 버퍼에 남겨지는 개행 문자 (\n) 처리 • 버퍼에서 문자를 읽어오는 문자열 처리 함수 getchar() 활용( getchar()에서 \n을 읽어감) • 프로그램에서 버퍼를 사용하는 작업을 수 차례 처리해야 할 경우, 안전하게 동작할 수 있도록 함
2. scanf() 함수 활용 프로그램 • scanf(“%d”, &arg)의 여러 입력 형태 • 숫자와 문자를 동시에 입력받는 경우 문제가 발생 • 따라서 버퍼를 비워주는 작업이 필요 0 0 … 0 3 a \n \n 3 3 3 버퍼 7 while((ch = getchar()) != ‘\n’) continue; • 버퍼의 개행 문자 전까지 모두 비워줌 var getchar(); • 하나의 문자를 지워줌 fflush(stdin); • 라이브러리 함수 • - intfflush(FILE * fp); • - stdin은 키보드 입력
2. scanf() 함수 활용 프로그램 • 버퍼 이해를 위한 scanf() 함수 응용 버퍼에 입력된 데이터 먼저 %d에 의해 정수 부분만 추출하여 정수형 변수 a에 저장 버퍼에 남은 데이터 다음으로 %s에 의해 문자열 부분만 추출하여 문자 배열 str에 저장
2. scanf() 함수 실습 • 실습 2-1. 각도형의 면적을 구하는 프로그램이다. scanf() 를 사용하여 각입력 값을 받아서 삼각형, 사각형, 원의 면적을 한 프로그램에서 작성하고 이를 출력하여 결과를 보이시오. HINT !!! 1. 넓이 구하는 공식 • 삼각형 (밑변 a X 높이 h X ½ = ?) • 사각형 (가로 x X세로y = ?) • 원 ( 반지름 r X 반지름 r X 3.14 = ? ) 2. 구현 방식 a. 함수에서 계산하는 방식 b. 메인에서 계산하는 방식
2. scanf() 함수 실습 • 실습 2-2. 메뉴를 통해 동작하는정수, 문자, 문자열 입.출력 프로그램을 작성하세요. 방법1) 비 반복-순차적 수행 • 정수형 입력 및 출력, 문자형 입력 및 출력, 문자열 입력 및 출력이 순차적으로 수행 방법2) 반복- 선택수행 • while(1) 무한루프사용, 연속 수행과종료 가능하도록 작성 • 잘못된 입력 값에 의해 비정상 종료되지 않도록 작성 (getchar() 활용) • 프로그램 작성에 switch-case 혹은 if-else 필요 • 함수 호출 사용 가능 • 프로그램 실행 예시는 다음 슬라이드 참고
2. scanf() 함수 실습 • 프로그램 실행 예시.
2. scanf() 함수 실습 • 프로그래밍 실습 – 석차 연명부 • 기존 프로그램에 추가하여 코딩 • 입력 기능 추가 • (심화) 처리 부분사용자 함수로 작성 (average) Chapter1 프로그램 Chapter2 프로그램 변수 선언 입력 변수 선언 및 초기화 처리 (average 부분) 출력 출력
2. scanf() 함수 실습 • 프로그래밍 실습 – 석차 연명부 • 다음 결과 화면과 같은 출력을 하도록 프로그램을 작성 • 이름은 크기 8의 전공은 크기 16의 문자형 배열(문자열)로 저장 • 학번은 정수형으로 저장 • 국어, 수학, 영어는 실수형으로 저장