52쪽
3.1 표준 입출력함수
표준출력함수
printf() 화면에 여러 종류의 자료를 출력 print formatted
putchar() 화면에 1개의 문자를 출력 put character
puts() 화면에 문자열을 출력 put string
표준입력함수
scanf() 키보드를 통해 1개 이상의 자료를 입력받음 scan formatted
getchar() 키보드를 통해 1개의 문자를 입력받음 get character
gets() 키보드를 통해 문자열을 입력받음 get string
3.1.1 자료의 입출력
(1) printf() 함수
형식 : printf("출력양식", 변수1, 변수 2, ... );
출력양식 변환기호
%d 10진 정수로 변환하여 출력
%f 부동 소수점 형식으로 변환하여 출력
%e 지수 형태로 출력
%c 한 문자로 변환하여 출력
%s 문자열로 변환하여 출력
%o 8진수로 변환하여 출력
%x 16진수로 변환하여 출력
%p 포인터의 번지 값을 16진수로 출력
(주의) 상수의 자료형에서는 8진수는 숫자 0, 16진수는 숫자 0과 영문자 x를 상수의 머릿 글자로 사용하였으나
printf()함수의 출력양식은 영문자 o, 영문자 x를 사용함
(참고) printf("%");라고 하면 어떤 양식의 변환을 하려다 만 것으로 혼동할 수 있으므로 %를 화면에 나타내려면 %%라고 두번 써줍니다. 예) printf("%d%%", 30); ☞ 30%라고 화면에 출력됩니다.
문자상수에서 경로명을 써 줄 때는 "\"를 두 번 써줍니다. 한 번만 써주면 확장자(escape sequence)를 사용하려다 만 것 으로 오해할 수 있기 때문입니다. 예) "c:\\tcwin\\bin\\work\\myheader.h"
생각해보기
printf("test", 123); ☞ 출력양식의 갯 수가 매개변수의 갯 수 보다 적으면 남는 매개변수는 무시됩니다. 따라서 test만 출력됩니다.
printf("test %d"); ☞ 매개변수의 갯 수 보다 출력 양식의 갯 수가 많으면 치명적인 결과를 초래할 수 있습니다.
따라서 printf문을 사용할 때, 출력양식의 갯 수와 매개변수의 갯 수는 반드시 일치시키는 습관을 들여야 합니다.
(2) scanf() 함수
형식 : scanf("입력양식", &변수1, &변수2, ...);
입력양식 변환기호 : printf()함수와 유사함
%d 정수형을 입력받음
%ld long 정수형
%f 실수형
%lf double형
%c 문자형
%s 문자열
%o 8진수
%x 16진수
하나 이상의 자료를 입력할 경우 각 자료 사이에 공백을 입력하고 입력을 종료하려면 엔터 키를 누른다.
(참고) scanf()함수를 사용하여 자료를 계속 입력받다 보면 가끔 어떤 값을 입력받지 않고 scanf()문을 통과하는 경우가 발생합니다. 그럴 경우 바로 앞의 scanf()함수를 호출한 직후 fflush(stdin);이라고 써주면 문제가 해결됩니다.
3.1.2 문자 단위의 입출력
(1) getchar() 함수
형식 : getchar();
예) a = getchar();
프로그램 수행을 일시 정지시키기 위해 반환값 없이 자주 사용합니다.
getchar(); ☜ 엔터키를 칠 때까지 기다림
특징 : 글자를 입려한 후 Enter키를 눌러줘야 합니다.
(2) putchar() 함수
형식 : putchar(문자);
예) putchar(65); putchar(var); putchar('A');
3.1.3 문자열 단위의 입출력
(1) gets() 함수
형식 : gets(변수);
예) char s[50];
gets(s);
특징 : 공백을 포함한 문자열을 입력받을 수 있음
(2) puts() 함수
형식 : puts(변수);
예) char s[] = "seoul"; ☜ 교재 61쪽 박스 설명에는 세미콜론이 빠져있는데 반드시 붙여야 합니다.
puts(s);
특징 : 출력 후 자동으로 줄을 바꿈
3.2 연산자(operator) : 자료에 대해 각종 연산을 수행하도록 하는 기호.
산술연산자 + - * / % ++ --
관계연산자 > < >= <= == !=
논리연산자 && || !
대입연산자 += -= *= /= %= <<= >>= != &=
조건연산자 ? :
비트연산자 & | ^ ~ << >>
기타연산자 sizeof() cast & *
3.2.1 산술연산자
이항연산자 + - * / 가/감/승/제를 계산 i + 5
% 나눗셈의 나머지를 계산 i % 5
단항연산자 - 부호의 반전 -5
++ 1증가 i++, ++i
-- 1감소 i--, --i
(1) 이항연산자 (binary operator) : 2개의 자료를 대상으로 산술적인 처리를 수행하는 연산자
% 연산자(modulo operator)는 정수형 자료에만 사용할 수 있다.
(2) 단항연산자(unary operator) : 1개의 자료만을 대상으로 산술적인 처리를 수행하는 연산자
후치연산 : 해당 값을 먼저 사용한 후 가감시킨다.
a = i++; // a에 값을 먼저 대입시킨 후 i 값을 증가시킨다.
전치연산 : 먼저 값을 가감시킨 후 사용한다.
a = ++i; // i 값을 증가시킨 후 증가된 i 값을 a에 값을 대입
3.2.2 관계연산자(relational operator)
: 피연산자에 대한 대.소 관계를 비교하는 연산자로 그 결과는 참(true)과 거짓(false)로 된다.
3.2.3 논리연산자(logical operator)
: 피연산자에 대해 논리연산(AND, OR, NOT)을 수행하는 연산자로 연산 결과는 참과 거짓으로 나타난다.
&& 논리곱(AND) : 양쪽 모두 참일 때만 참 a && b
|| 논리합(OR) : 양쪽 중 하나라도 참이면 참 a || b
! 논리부정(NOT) : 오른쪽이 참이면 거짓, 거짓이면 참 !a
3.2.4 대입연산자(assignment operator)
'='를 사용하여 구성되며, 연산자의 오른쪽을 왼쪽에 대입하는 데 사용된다.
대입연산자는 수식을 압축하여 간단하게 기술할 수 있으므로 프로그램의 길이도 짧아지고 실행속도도 빨라진다.
= a = 5;
+= a += 5; a = a + 5; a에 5를 더한 후 결과를 a에 대입
-= a -= 5; a = a - 5; a에서 5를 뺀 후 결과를 a에 대입
*= a *= 5; a = a * 5; a에 5를 곱한 후 결과를 a에 대입
/= a /= 5; a = a / 5; a에 5를 나눈 후 결과를 a에 대입
%= a %= 5; a = a % 5; a에 5를 나눈 후 그 나머지를 a에 대입
|= a |= 5; a = a | 5; a와 5에 대해 bit 단위의 OR연산하여 그 결과를 a에 대입
^= a ^= 5; a = a ^ 5; a와 5에 대해 bit 단위의 XOR연산하여 그 결과를 a에 대입
<<= a <<= 5; a = a << 5; a의 값을 5bit 좌로 이동 후 결과를 a에 대입
>>= a >>= 5; a = a >> 5; a의 값을 5bit 우로 이동 후 결과를 a에 대입
3.2.5 조건연산자(conditional operator)
: 주어진 조건에 만족 여부에 따라 지정된 수식을 수행하는 연산자로서 3개의 피연산자를 취하는 3항 연산자이다.
(조건) ? 수식1 : 수식2
조건이 성립하면(참이면) 수식1을 수행하고, 조건이 성립되지 않으면(거짓이면) 수식2를 수행한다.
x = (5 > 2) ? 1 : 0; // 조건이 참이므로 x에 1이 대입됨
3.2.6 비트연산자(bitwise operator)
: 수치를 2진수로 변환하여 bit 단위의 연산을 수행하는 연산자.
비트 연산자는 정수형 자료에서만 사용이 가능하다.
(부호있는 정수형의 맨 앞의 비트가 부호비트이므로 가급적 unsigned형에서만 사용할 것)
& (bit AND) a & b 대응되는 두 bit가 모두 1일 때만 결과는 1
| (bit OR) a | b 대응되는 두 bit 중 하나라도 1이면 결과는 1
^ (bit XOR) a ^ b 대응되는 두 bit가 서로 다를 때만 결과는 1
~ (bit NOT) ~a 1은 0으로, 0은 1로 함
<< (bit 좌로 이동) a << 2 a의 값에 대해 2bit 왼쪽으로 이동 (bit left shift)
>> (bit 우로 이동) a >> 2 a의 값에 대해 2bit 오른쪽으로 이동 (bit left right)
3.2.7 기타연산자
sizeof() 지정한 자료형, 수식, 변수가 차지하는 기억공간의 크기 (byte)를 구함 (크기를 byte로 구함)
cast연산자 : 이미 지정된 자료의 자료형을 강제적으로 다른 자료형으로 바꿈
(지정자료형) 변수명; 변수명의 자료형을 강제적으로 (지정자료형)으로 바꿈
int val, i; float f; 에서
val = sizeof(int); int의 크기(2 혹은 4)를 val에 대입
val = sizeof(f); f의 자료형 float의 크기(4)를 val에 대입
(float) i * i; 연산결과가 float형으로 바뀜
3.2.8 연산자 우선순위

연습문제
1. 다음 설명 중 틀린 것은?
가. %d는 출력값을 10진수로 나타낸다.
나. %x는 출력값을 8진수로 나타낸다.
다. %e는 부동 소수점 수를 지수형으로 나타낸다.
라. %c는 바이트 값을 문자로 나타낸다.
%x는 hexadecimal(16진수)입니다. 8진수는 %o(octal)입니다.
2. 다음과 같이 증가연산자를 사용한 식에서 y의 값은?
n = 3;
y = n++ + n;
가. 5 나. 6 다. 7 라. 8
n++는 후위 연산자이므로 연산을 수행한 후에 n의 값을 증가시킵니다.
따라서 주어진 값 3을 이용해서 연산을 수행하여 결과를 y에 대입한 후 n이 1 증가하여 4가 됩니다.
<주의> 위와 같이 같은 변수에 대한 연산이 한 수식에서 이루어질 때는 가감연산자 사용을 극구피한다.
3. 다음 중 성격이 다른 연산자를 고르시오.
가. & 나. ~ 다. >> 라. ||
<설명> &, ~, >> 는 bit연산자이고 ||는 논리연산자
4. 다음 중 문자열의 입출력에 사용되는 함수가 아닌 것은?
가. gets() 나. puts() 다. scanf() 라. strings()
<설명> strings()는 표준 라이브러리 함수가 아님
gets() 문자열 입력 함수
puts() 문자열 출력 함수
scanf("%s", str) (문자열) 입력 함수
5. 다음 중 getchar() 함수에 대한 설명 중 틀린 것은?
가. 문자 단위의 입력함수로서 한 문자를 키보드에서 받아들인다.
나. 변수는 정수형이나 문자형으로 선언되어야 한다.
다. 괄호 안에 인자를 지정하지 않는다.
라. 문자 입력 후 엔터키를 누르지 않아도 된다.
<설명> 나. 변수는 정수형이나 문자형으로 선언되어야 한다는 말은 리턴 값을 받을 변수를 말하는 것으로 보임
c = getchar(); // 여기서 c가 변수이고 c는 정수형이나 문자형으로 지정되어야 함
char은 내부적으로 정수로 처리가 됩니다. 따라서 정수를 리턴합니다.
stdio.h에 int getchar(void);로 선언되어 있습니다.
getchar()는 엔터를 눌러야 합니다.
6. 프로그램이 다음과 같을 때
#include <stdio.h>
void main() {
int i, j;
long ix;
short s;
unsigned u;
float x;
double dx;
char c;
printf("%4d %4d %14.8e %14.8e %14.8e",
i, j, x, dx);
}
printf("%4d %4d %14.8e %14.8e %14.8e", i, j, x, dx); 에서 i, j, x, dx의
각 값들을 라인당 하나씩 출력하도록 printf()문을 수정하라.
printf("%4d\n %4d\n %14.8e\n %14.8e\n %14.8e\n", i, j, x, dx);
7. 프로그램이 다음과 같을 때

(1) i, j, k가 10진 정수인 경우 scanf()문을 작성하라.
scanf("%d%d%d", &i, &j, &k);
(2) i, j는 16진수, k는 8진수일 경우 scanf()문을 작성하라.
scanf("%x%x%o", &i, &j, &k);
8. 다음 프로그램에서 공란을 질문과 같이 채워라.
 |
(1) 10진수 8086을 10진수 4자리로 표시 : 4d
(2) 10진수 8086을 8진수 5자리로 표시 : 5o
(3) 10진수 8086을 16진수 4자리로 표시 : 4x
9. 다음 프로그램에서 입력 데이터가 입력될 경우 변수에 저장되는 값은?

(1) input data : 123 456 789 ☞ a = 123, b = 456, c = 789
(2) intput data : 123456789 ☞ a = 123, b = 456, c = 789
(3) input data : 1234 5678 9 ☞ a = 123, b = 4, c = 567
입력양식의 필드폭보다 클 경우 그 크기만큼만 잘라 내고 나머지는 다음 변수로 넘깁니다.
빈 칸이 입력되면 다음 변수로 넘깁니다.
10. 주어진 변수가 다음과 같을 때 연산자 우선순위를 괄호로 묶어 나태내고 연산 결과를 써라.
int i, j, k, m, n;
i = j = j = m = n = 3; |
(1) i += ++j + 3; ☞ i += ( (++j) + 3 ); 결과 10
++j이므로 j에 먼저 1을 더해 4가 되고, 3을 더해서 7이 된 값을 3인 i값에 더 하므로
(2) k %= m = 1 + n / 2; ☞ k %= ( m = ( 1 + (n / 2) ) ); 결과 1
3/2의 결과 1에 1을 더하여 m에 대입하여 m을 2로 만들고 k의 값 3과 m의 값 2를 나눈 나머지를 k에 대입
11. 다음 프로그램의 출력 결과를 확인하라.
#include <stdio.h>
void main() {
int a = 'A', b = 'B';
printf(" \n%c \n%c", a, b);
printf(" \n%c \t%c", a, b);
printf(" \n%c \b%c", a, b);
printf(" \n%c \r%c", a, b);
} |
직접 확인해보세요.
\n 줄 바꿈
\t 수평 탭
\b back space
\r 커서를 행의 시작위치로 이동 (carriage return)
교재 27쪽 참고
12. 다음 프로그램의 출력 결과를 확인하라.
#include <stdio.h>
void main() {
int a = 5, b = 9;
printf(" %d %d\n", ++a, a);
printf(" %d %d\n", a++, a);
printf(" %d %d\n", --b, b);
printf(" %d %d\n", b--, b);
} |
6 5 // 5 5인 상태에서 앞의 앞의 a는 6이 되었지만 뒤의 a는 5의 값이 이미 전달된 상태
6 6 // 위에서 a가 6이 되었고, 두 값을 출력한 후 앞의 a++에 의해 a가 7로 됨
8 9 // b의 값을 각각 9 9로 이미 전달받았고, 앞의 b를 1 뺀 상태로 출력
8 8 // 위에서 b가 8이 되었으므로 8 8을 출력하고 b를 7로 만듬
13. 다음과 같은 논리연산 식의 결과를 써라(참이면 '1', 거짓이면 '0').
i = 1, j = 2, k = 3, c = 'w' |
(1) i < j // 1이 2 보다 작으므로 참
(2) k != 3 // 3은 3과 같은데 같지 않은 경우를 참이라고 했기 때문에 거짓
(3) (i >= b) || (c == 119) // b의 값이 없어 좌측은 알 수 없지만 'w'가 119로 참이므로 둘 중 하나만 참이어도 참
(4) i + k <= 10 // 1+3은 4, 10보다 작으므로 참
(5) (j + k) > (i + 5) // (2+5) 는 (1+5)보다 작으므로 거짓
(6) i >= 6 && c == 'w' // i가 6보다 작으므로 우측이 참이어도 거짓
(7) c >= 100 * k * j // c가 100*3*2보다 작으므로 거짓
(8) i == (i >= 3) // i가 3 보다 크거나 같지 않으니 0(거짓)거짓이고, i는 1인데 0과 1이 같다고 했으니 거짓
(8)은 교재에 오타가 났으니 위와 같이 문제를 고치세요.
14. 키보드(keyboard)에서 2개의 정수 데이터를 입력하여 사칙연산을
수행하고 그 결과를 출력하는 프로그램을 완성하라.
#include <stdio.h>
void main()
{
int a, b;
scanf("%d%d", &a, &b);
printf("%d + %d = %d", a, b, a + b);
printf("%d - %d = %d", a, b, a - b);
printf("%d * %d = %d", a, b, a * b);
printf("%d / %d = %d", a, b, a / b);
}
15. 다음 문장은 잘못되어 있다. 올바르게 고쳐라.
(1) scanf("d", value);
☞ scanf("d", &value);
(2) printf("The product or %d and %d is %d"\n, x, y);
☞ printf("The product or %d and %d is %d\n", x, y);
(3) firstnumber + secondnumber = sumofnumbers
☞ sumofnumbers = firstnumber + secondnumber ;
(4) if (number => largest) largest == number;
☞ if (number => largest) largest = number;
(5) Scant("%d", anInteger);
☞ scanf("%d", anInteger);
(6) printf("Remeinder of %d divided by %d is \n", x, y, x % y);
☞ printf("Remeinder of %d divided by %d is %d\n", x, y, x % y);
(7) if (x = y);
printf(%d is egual to %d\n", x, y);
☞ if (x = y)
printf(%d is egual to %d\n", x, y);
(8) printf("The sum is %d\n," x + y);
☞ printf("The sum is %d\n", x + y);
(9) printf("The value you enterd is : %d\n, &value);
☞ printf("The value you enterd is : %d\n", value);
기출문제
1. 다음 프로그램을 조건 연산자를 사용하여 바꾼다면 가장 올바른 것은? (3점)
if (a > 10)
x = a * 100;
else
x = a * 200; |
① x = ( a > 10 ; a * 100 : a * 200);
② x = ( a > 10 ; a * 200 : a * 100);
③ x = ( a > 10 ? a * 100 : a * 200);
④ x = ( a > 10 ? a * 200 : a * 100);
* 다음과 같은 프로그램이 있을 때 물음에 답하시오.
(여기서 'A'의 ASCII값은 65이다.)
#include <stdio.h>
void main() {
char var = 'B';
printf("var1=%d var2=%c", var, var); .................. ㉠
putchar(var+2); .............................................. ㉡
} |
2. 위에서 ㉠의 결과로 올바른 것은? (3점) <2011 동계>
① var1=A var2=65 ② var1=66 var2=B
③ var1=b var2=B ④ var1=65 var2=66
3. 위에서 ㉡의 결과로 올바른 것은? (3점) <2011 동계>
① 67 ② 68
③ C ④ D
* 다음과 같은 프로그램이 있을 때 물음에 답하시오.
#include <stdio.h>
void main(){
char s[50];
|
①
②
③
④
다음 프로그램의 ㉠, ㉡, ㉢에서 가각ㄱ 10진수, 8진수, 16진수를 출력하려고 한다.
출력양식변환기호가 순서대로 올바르게 나열된 것은? <2008 기말>
#include <stdio.h>
void main() {
printf(" ㉠ \n", a);
printf(" ㉡ \n", a);
printf(" ㉢ \n", a);
} |
① %d, %f, %e ② %d, %o, %x ③ %c, %e, %d ④ %e, %f, %g
카페 게시글
C 프로그래밍
[교재] 제 3 장 입출력함수와 연산자
별은빛나고
추천 0
조회 754
13.04.11 13:47
댓글 0
다음검색