교육용프로그래밍언어 C 언어 입력과출력, 연산자 강사 : 김희진 1
contents 표준출력함수 printf, (putchar, puts) 의특징과사용법 표준입력함수 scanf, (gets) 의특징과사용법 printf 와 scanf 함수에서사용되는변환명세이해 수식과대입문의개념이해연산자의종류와기능 대입, 산술, 복합대입, 관계, 논리, 조건연산자증감, 형변환, 주소, sizeof 연산자 연산자의우선순위와결합방향형변환원리, 종류, 필요성, 사용법
1.0 개요 출력 컴퓨터내부의내용을사람이인식할수있는형태로 모니터, 프린터, 스피커등에표시해주는과정 입력 사용자로부터마우스, 터치스크린, 조이스틱등 입력장치를통하여프로그램의변수에자료를전달하는과정 표준입력과표준출력 표준입력장치는키보드, 표준출력장치는모니터 프로그래머가직접표준입 / 출력장치를제어하는것이어려우므로라이브 러리함수를제공 : scanf, printf 함수등 3
1.1.1 변환명세를포함하지않은 printf 함수 printf 함수 변환명세를사용하여형식에맞춰출력해주는함수 단순히특정문자열을출력하기 예 ) 1 printf("hello! "); 2 printf("my name is 'C'. "); 3 printf("nice to meet you. "); 4
1.1.1 변환명세를포함하지않은 printf 함수 이스케이프문자를이용한출력예 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! 5
1.1.2 변환명세를포함한 printf 함수 변수에저장된값은어떻게출력할까? printf 함수의변환명세 (conversion specification) 를이용형식에맞게출력 6
1.1.2 변환명세를포함한 printf 함수 변환명세의종류 7
1.1.2 변환명세를포함한 printf 함수 예 ) 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); 8
실수형의출력 ( 심화 ) 1 #include <stdio.h> 2 3 int main() 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 } 9
참고 ) 문자형자료와정수형자료간의상호변환관계 문자의 ASCII 코드 문자마다정해진 2진수의 ASCII 코드가부여됨 2진수코드값은 10진수정수로변환가능문자 정수 : 상호변환가능 char ch = 'A' + 2; A 의 ASCII 코드값 65 + 2 = 67 67은 C 의 ASCII 코드값 ch에는 C 가저장 10
2.2 프로그래밍실습 문제 주어진자료 : 학번 2013901, 국어 89, 세계사 100, 수학 95 결과 : 세과목의평균 (94.67) 출력형식 : 세점수출력, 평균출력 학번단순히 int형정수로간주하여 int형변수에저장 각과목의점수최대점수가 100이므로 %3d 또는 %4d와같이필드폭을 3 이상으로지정 평균점수소수점아래두자리까지출력되도록 %6.2lf로지정 ( 전체폭은 6보다크게 ) 11
세과목의평균을구해출력하기 3 int main() 4 { 5 // 변수선언 6 int std_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("%s: %d \n", " 학번 ", std_no); 20 printf("===============\n"); 21 printf("%s: %d( 점 ) \n", " 국어 ", kor); 22 printf("%s: %d( 점 ) \n", " 세계사 ", world); 23 printf("%s: %d( 점 ) \n", " 수학 ", math); 24 printf("===============\n"); 25 printf("%s: %lf \n", " 평균 ", avg); 정수 / 정수결과는정수이므로 3 을실수로사용 12
3.1 입력함수 scanf 프로그램에서지정할수없는값은사용자가직접입력하도록한다. 예 ) 사용자의나이, 키, 이름, 학교명등 scanf, getchar, gets 등의함수를사용 scanf 를많이사용 : printf 에서사용된변환명세를사용 13
3.1 한개의자료만입력하기 scanf 함수를사용한입력 변수명 = 키보드입력값 ; 효과 & 변수명 : 입력값을저장할변수의기억장소주소 변환명세 : 입력값종류별로정해져있다. [ 표 3-4] %d: 정수, %lf: 실수, %c: 문자, %s: 문자열 scanf 함수의실행과정 1 2 3 실행창에커서가깜박이며사용자입력을기다림사용자가키보드로자료를입력하고 [ 엔터 ] 키를누름입력된값이변수에저장 14
3.1 입력함수 scanf 15
3.1 한개의자료만입력하기 예 #include <stdio.h> int main(){ int age; printf(" 나이는? "); scanf("%d", &age); } printf(" 입력한나이 : %d 세 \n", age); return 0; 16
3.1 한개의자료만입력하기 주의 scanf 함수 변환명세 안에변환명세가아닌다른문자는사용못함 scanf( 나이는? %d, &age); [X] printf( 나이는? ); scanf( %d, &age); [] 변환명세 에서 로닫기전에공백문자 (white character) 나이스케이프문 자를넣지않기 scanf( %d\n, &age), scanf( %d, &age) [X] 뒤의입력문내용에따라키보드입력을한번더해야하는현상이생길수도있다. 자료형에맞는변환지시자 (d, lf, c, s 등 ) 를정확히사용 변환명세에서필드폭은사용하지않는것이더편리 ( 꼭필요할때만사용 ) 17
프로그램 ) 학생의개인정보를입력받아출력하기 5 int age; 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); 18
3.2 여러개의자료를한꺼번에입력하기 19
3.4 프로그래밍실습 문제 ) 학생의학번, 학년, 평점을입력후평점을 100 점만점의점수로환산하여 출력하기 분석 학번, 학년입력 : scanf 함수이용 ( 정수형 ) 학점은 A+ 를 4.5 만점으로환산 평점 4.5 가 100 점이므로입력된평점 GPA 를점수 score 로의환산은 4.5 : 100 점 = GPA : score 로구함 20
학생의평점을점수로환산하여출력하기 int s_number; printf( 학번은? ); scanf( %d, &s_number); 학번 printf( %d \t %d \t %lf (%lf), s_number, year, GPA, score); 21
Break Time!!!! 22
1.0 연산자개요 수식 (expression) 연산자 (operator) 와피연산자 (operand) 로구성 수식은평가 (evaluate) 되어최종적으로 1 개의결과값이됨 피연산자 : 상수, 변수, 또다른수식 1 + 2 sum - 10 (a+b) / 2 연산자 23
2.1 대입연산자 대입 (assignment) 연산자 = 특정값을변수에저장 ( 대입, 할당 ) 하는데사용 주의 수학의등호와완전히다른의미 결과값을변수에해당하는기억장소에저장 ( 대입 ) 하기 = 오른쪽의식을평가하여결과값구하기 변수명 = 식 24
2.1 대입연산자 형식변수명 = 값 ; 변수명 = 변수 ; 변수명 = 수식 ; // = 오른쪽값을변수에대입 // = 오른쪽변수에저장된값을 = 왼쪽변수에대입 // = 오른쪽수식결과값을변수에대입 예 x = 100; y = x + 1; ch = 'a'; a = b = c = 1; // x에 100을저장 // y에 101을저장 // ch에문자상수 'a' 를저장 // 다중대입 printf("%d", x = 2 + 3); 25
3.1 산술연산자 산술 (arithmetic) 연산자 26
3.2 산술연산자 주의 나머지연산자 (%) 정수형만가능 주의 나누기연산자 (/) C언어에서정수간연산결과는정수 정수간에는 / 와 % 는몫과나머지연산자역할 예 ) 5 / 2 5 % 2 5.0 / 2.0 참고 printf 함수에서 % 문자를출력하려면 %% 를사용해야함 27
3-2 산술연산자활용하기 7 printf(" 정수 1 >> "); scanf("%d", &x); 8 printf(" 정수 2 >> "); scanf("%d", &y); 10 11 printf("%d + %d = %d\n", x, y, x + y); 12 printf("%d - %d = %d\n", x, y, x - y); 13 printf("%d * %d = %d\n", x, y, x * y); 14 printf("%d / %d = %d\n", x, y, x / y); 15 printf("%d %% %d = %d\n\n", x, y, x % y); 16 17 printf("%d / %.1lf = %.1lf\n", x, 3.0, x / 3.0); 18 19 return 0; 20 } 실행결과 정수 1 >> 10 정수 2 >> 3 10 + 3 = 13 10-3 = 7 10 * 3 = 30 10 / 3 = 3 10 % 3 = 1 10 / 3.0 = 3.3
4.1 복합대입연산자 복합대입연산자 (compound assignment operator) 현재 a 변수의값에 b 를더한결과값을다시 a 에대입 a 의값을 b 만큼증가하기 29
4-1 복합대입연산자활용하기 5 int x, y; 6 7 x = y = 5; 8 9 printf("x = %d, y = %d\n", x, y); 10 printf("x += y 의결과는 %d\n\n", x += y); 11 12 printf("x = %d, y = %d\n", x, y); 13 printf("x -= y 의결과는 %d\n\n", x -= y); 14 15 printf("x = %d, y = %d\n", x, y); 16 printf("x *= y 의결과는 %d\n\n", x *= y); 17 18 printf("x = %d, y = %d\n", x, y); 19 printf("x /= y 의결과는 %d\n\n", x /= y); 20 21 printf("x = %d, y = %d\n", x, y); 22 printf("x %%= y 의결과는 %d\n", x %= y);
5.1 관계연산자 관계연산자 (relational operator) 좌우피연산자의크기를비교 참 / 거짓 주의 x = y 는대입문 31
5.1 관계연산자 주의 C 언어에서는숫자 0, 1 로논리값거짓, 참을대신 논리값과수치간의상호변환규칙 32
5-1 관계연산자활용하기
6.1 논리연산자 논리연산자 (logical operator) 논리값 ( 참과거짓 ) 에대한연산 결과는참 / 거짓 조건표현에주로사용 if ((year % 4) == 0 && (year % 100!= 0)) if ((average < 60) (absence > 12)) 34
6.2 논리식의표현 x가 5보다크고 10보다작으면참이고아니면거짓 을표현하면? 주의 수학식처럼줄여쓰기를하면안된다. 연산자의두피연산자의자료형은동일해야한다. // 잘못된식 5 < x < 10 // 올바른식 (5 < x) && (x < 10) 35
6-2 논리연산자활용하기
6.3 논리연산자의단축평가 단축평가 (short circuit evaluation) 란? 논리연산자특성에따라특정수식의평가를생략하는것 && 와 의왼쪽피연산자만으로결과값이결정되면오른쪽피연산자는평가하지않음 이식이거짓이므로 && 의결과는무조건거짓 오른쪽식은평가하지않음 37
논리연산자의단축평가
7.1 증감연산자 증감연산자 (increment/decrement operator) 변수에만사용하며변수의값을 1 증가또는감소시킴 변수 ++ 변수값을 1 증가 변수 = 변수 +1 변수 += 1 변수-- 변수값을 1 감소 변수 = 변수 1 변수 -= 1 바른것은? x++; --x 100++ --(x+2) 주의 x+1 과 x++ 의차이는? 39
7.1 증감연산자 주의 전위형인지후위형인지에따라수식결과값이달라질수있다. 현재 x 값을사용하여수식을평가한후 1 증가 먼저 x 값을 1 증가한후이증가된값을수식평가에사용 40
7-1 증감연산자활용하기 6 7 x = ++x * 5; 8 y = y++ * 5; 9 z = 5 - --z; 10 x = x + 1; x = x * 5; y = y * 5; y = y + 1; z = z - 1; z = 5 - z; 11 printf("x = %d\n", x); 12 printf("y = %d\n", y); 13 printf("z = %d\n", z);
8.1 형변환연산자 형변환 (type conversion) 이란? 두피연산자의자료형은같아야함 서로다른경우하나로통일해야함 형변환이필요 피연산자 1 연산자피연산자 2 2 + 3.0 int 형 (4 바이트 ) double 형 (8 바이트 ) 형변환발생 2.0 형변환의종류 자동형변환 : 컴파일러가자동으로함 강제형변환 : 프로그래머가직접명시함 42
8.1 자동형변환 자동형변환 : 형넓힘 (promotion) 컴파일러가자동으로처리 예 ) 두피연산자의자료형이다를때 작은표현범위의자료형 큰표현범위의자료형으로변환 표현범위는 char < short < int, long < float <double int i = 100; double j = 1.23; printf("%.2lf", i + j); 형넓힘변환이발생 int 형 + double 형 double 형 + double 형 100.0 + 1.23 43
8.1 자동형변환 자동형변환 : 형좁힘 (demotion) 예 ) 변수에값을대입할때발생 변수 = 식 ; int i; i = 3.14; 식의결과값은변수의자료형에맞게변환되어저장됨 큰자료형에서작은자료형으로변환시오차발생가능 의도적사용 ( 실수값의소수점위의값만필요한경우 ) 이아닌경우엔오차가발생할수있으므로주의해야함 형좁힘변환이발생 3.14 의. 이하값은절삭하여 int 형으로변환한후 i 에저장함 오차발생가능성경고메시지가나타남 의도적이라면다음의형변환연산자를사용해야경고가발생하지않음 44
8.2 강제형변환 프로그래머가형변환연산자 (type cast operator) 로형변환을직접지시 영구적인형변환이아니라캐스트연산자가사용된곳에서만일시적인형 변환이적용됨 (double) 4 (double) sum (int) (sum + i) // sum 이 double 형일때 sum+i 를 int 형으로캐스팅 avg = (double) sum / 3; 정수간나눗셈에서결과를실수형으로만들때매우유용 주의 변수자체의기억장소크기를변경하는것이아니므로대입문왼쪽의변수에 대해사용불가 (double) sales = sum * 9.5; 45
8-2 형변환연산자활용하기 3 int main() 4 { 5 char ch = 'A'; 6 int x = 10, y = 4, sum; 7 double pi = 3.14, avg; 8 9 sum = ch + 2; // 자동형넓힘변환 10 printf("sum = %d = %c \n", sum, sum); 11 12 sum = pi; // 자동형좁힘변환 13 printf("sum = %d\n", sum); 14 15 printf(" 정수간 x/y = %d \n", x / y); 16 printf(" 실수간 x/y = %lf \n", (double)x / (double)y);// 강제형변환 17 실행결과 sum = 67 = C sum = 3 정수간 x/y = 2 실수간 x/y = 2.500000 잘못된나눗셈 = 2 잘못된나눗셈 = 2.000000 정확한나눗셈 = 2.500000
8.2.1 강제형변환 6 int x = 10, y = 4, sum; 18, 21, 24 행의내용은반드시이해한다. 일반적인나눗셈에서엉뚱한결과값을얻는이유중의하나이다. 18 sum = (double) x / (double) y; 19 printf(" 잘못된나눗셈 = %d \n", sum); 20 21 avg = (double) (x / y); 22 printf(" 잘못된나눗셈 = %lf\n", avg); 23 24 avg = (double) x / y; 25 printf(" 정확한나눗셈 = %lf \n", avg); 2 실행결과 sum = 67 = C sum = 3 정수간 x/y = 2 실수간 x/y = 2.500000 잘못된나눗셈 = 2 잘못된나눗셈 = 2.000000 정확한나눗셈 = 2.500000
9.1 주소연산자 주소연산자 (address operator) &( 앰퍼샌드 ) & 변수명 변수에할당된기억공간의주기억장치주소를구함 scanf 함수, 포인터에서주로사용 48
10.1 sizeof 연산자 sizeof 연산자 기억공간의크기 ( 바이트단위 ) 를구하는연산자 C 언어는컴파일러마다자료형이차지하는기억공간의크기가다르므로 sizeof 결과값은실행환경에따라달라질수있다. 49
10.1 sizeof 연산자 예 ) int i = 10; printf("%d\n", sizeof i); // i 는 int 형변수 4 출력 printf("%d\n", sizeof(short)); // short 형의크기는 2 바이트 2 출력 sizeof 연산자는단항연산자로다른이항연산자보다우선순위가높다. 50
주소연산자, sizeof 연산자활용하기 1 #include <stdio.h> 2 3 int main() 4 { 5 char x = 'a'; 6 int y; 7 double z = 1.234; 8 9 printf("y 입력 : "); 10 scanf("%d", &y); 11 12 printf(" 변수 y의값 = %d\n", y); 13 printf(" 변수 y의주소 = %p\n", &y); 14 printf("\n\n\n"); 주소연산자 18 printf("char형변수 x의크기 = %d\n", sizeof x); 19 printf("int형변수 y의크기 = %d\n", sizeof y); 20 printf("double형변수 z의크기 = %d\n", sizeof(z)); 21 printf("float형의크기 = %d\n", sizeof(float)); 22 23 return 0; 24 }
11.1 연산자의우선순위와결합방향 연산자우선순위 식에괄호가없을때먼저수행되는연산자가정해져있다. 연산자결합방향 우선순위가같은연산자는결합 (associativity) 방향에따라순서대로적용됨 대부분왼쪽 오른쪽 단항 / 조건 / 대입연산자 : 오른쪽 왼쪽 52
11.2 연산자의우선순위와결합방향 53
연산자의우선순위와결합방향이해하기 1 #include <stdio.h> 2 3 int main() 4 { 5 int x = 1, y = 2, z = 3; 6 7 printf("%d\n", 10 * 2 / 5 * 2); 8 printf("%d\n", 10-2 * 5 + 2 / 2); 9 printf("%d\n", ++x * z--); 10 printf("%d\n", x + z >= z +!y); 11 printf("%d\n", x y && z); 12 printf("%d\n", z += x >> 2 + ++y); 13 printf("%d\n", x = y = z = 5); 14 printf("%d\n", (x = 1 + 2, 2-1)); 15 16 return 0; 17 }
Q&A 참고- 한빛미디어 55