Chapter 2 – 기본 프로그래밍
Outline
2.1 C 프로그램의 형태
2.2 출력 함수 printf() 와 입력 함수 scanf()
2.3 출력 함수 putchar() 와 입력 함수 getchar() 2.4 요약
2.5 예제
- C 프로그램은 한 개의 main 함수가 필요하다 .
- 이 함수의 몸체는 한 개의 블록 (block) 을 이루며 , { 과 } 로 둘려 쌓여있다 .
- 몸체는 문장들을 열거하여 이루어진다 . - 각 문장의 끝은 ; 으로 끝난다 .
int main(void) {
문장 ; 문장 ; . . . 문장 ; }
2.1 C 프로그램의 형태
#include <stdio.h>
stdio.h 를 해당 위치에 포함시키라는 전처리 (preprocessor) 명 령
stdio.h 는 특정 디렉토리 ( 가령 /usr/include) 의 file 이다 입출력의 수행을 위해 항상 포함해야 한다 .
int main(void) void int main()
void 는 인수가 없다는 의미로 생략해도 됨
main 함수 앞의 int 는 정수값을 반환한다는 의미
printf(“Hello, world!\n”);
“ 과 ” 사이의 문자열을 출력한다 .
\n 을 출력하면 새 줄로 바뀐다 .
return 0;
여기서는 생략해도 무방하다 .
main 함수가 종료되며 return 뒤의 0 을 반환한다 . 정상적인 프로그램의 종료를 의미한다 .
output
2 첫번째 C 프로그램 */
3 #include <stdio.h>
4 int main(void) 5 {
6 printf(“Hello, world!\n”);
7 return 0;
8 }
Hello, world!
2.1 C 프로그램의 형태 printf(“ABCDEF”);
printf(“abcdef”);
printf(“0123456\n”);
3 개의 문자열을 연속으로 한 줄에 출력한다 .
printf(“ABCDEF\n”);
printf(“abcdef\n”);
printf(“0123456\n”);
각 문자열의 뒤에 줄바꿈 문자 (\n) 이 있으므로 1 줄에 1
개의 문자열 씩 출력한다
prog2-2.c
output
1 /* File : prog2-2.c
2 다수의 문자열을 출력하는 프로그램 */
3 #include <stdio.h>
4 int main(void) {
5 printf(“ABCDEFG”);
6 printf(“abcdefg”);
7 printf(“0123456\n”);
8 }
ABCDEFGabcdefg0123456
2004 K.C. Lee, Hongik University.
All rights reserved.
prog2-3.c
output
1 /* File : prog2-3.c
2 한 줄에 한 문자열 씩 출력하는 프로그램 */
3 #include <stdio.h>
4 int main(void) {
5 printf(“ABCDEFG\n”);
6 printf(“abcdefg\n”);
7 printf(“0123456\n”);
8 }
ABCDEFG abcdefg 0123456
• printf() 의 인수가 2 개 이상일 경우 첫 인수 는 제어문자열로 다른 인수를 제어한다 .
• printf() 의 첫 인수내에서 , % 와 변환문자를 이용하여 다음 인수들의 출력 형태를 결정한다 .
– ( 예 ) %s 는 문자열 (string), %c 는 문자 (char), %d 는 십진수 정수
• printf(“abc”); 와 printf(“%s”,
“abc”) 는 출력이 같다 .
• printf(“%c%c%c”, ‘a’, ‘b’, ‘c’);
– abc 를 출력한다 .
– 가령 두번째 %c 는 ‘ b’ 를 문자형으로 출력하게 한다 .
2.2 출력 함수 printf() 와 입력 함수 scanf()
• printf(“%c%2c%3c”, ‘a’, ‘b’, ‘c’);
– a b c 를 출력한다 .
– % 와 변환문자 사이의 자연수는 출력할 자리의 필드폭이다 .
– 가령 %2c 는 2 자리를 잡고 인수 ‘ b’ 를 문자 (character) 형으로 출력하게 한다 .
printf(“The sum is %d.\n”, z);
– Z 값이 150 인 경우의 출력 : The sum is 150.
– 즉 첫 인수에서 % 변환문자 꼴이 아닌 부분은 그대로 출력되
고 , % 변환문자 부분은 가리키는 해당 인수를 변환하여 출력된
다 .
• scanf() 변환
변환 문자 입력 스트림에서 문자의 변환 방법 c 문자
d 십진수
f 실수 (float)
lf 또는 LF 실수 (long float 즉 double) s 문자열
• printf() 변환 문자
변환 문자 해당되는 인수의 출력 방법 c 문자
d 십진수 정수
e 과학적 표기법으로의 실수 f 실수
g e- 포맷과 f- 포맷 중 짧은 것 s 문자열
2.2 출력 함수 printf() 와 입력 함수 scanf()
< 정수의 취급 >
int x, y, z;
- 세 개의 변수 x, y z 가 모두 정수 (integer) 형 변수임을 선 언하고 있다 .
- x, y, z 각각에는 정수만 배정할 수 있으며 , 3.14 등의 실 수를 저장하려 하면 에러가 난다 .
x = 123;
- 변수 x 에 정수값 123 을 배정한다 (assign) 는 의미 - x 값이 123 과 같다는 수학적 의미가 아니다 .
- 물론 정수값 123 을 배정한 후에는 x 값이 123 이 된다 .
scanf(“%d”, &y);
- 십진수의 정수를 읽어 들여 y 에 저장하라 .
- &y 는 y 의 주소를 뜻하며 , scanf 의 경우 , 읽어 들일 변수 의 주소를 제공해야 한다 .
scanf(“%3d”, &y);
- 자릿수 3 을 명시했으므로 4567 을 입력해도 3 자리 456 까지 만 읽어 들이고 , 다음 7 은 다음 읽어 들일 때 사용한다 .
prog2-4.c
output
[해 설 ]
1 /* File : prog2-4.c
2 정수의 덧셈과 정수의 입출력 */
3 #include <stdio.h>
4 int main(void) { 5 int x, y, z;
6 x = 123;
7 scanf(“%d”, &y);
8 z = x + y;
9 printf(“The sum is %d.\n”, z);
10 }
456
The sum is 579.
프로그램 동작시의 사용자의 입력부분을 이탤릭 체로 표시하였다 .
float x, y, z;
- 세 개의 변수 x, y z 가 모두 실수 (float) 형 변수임을 선언 하고 있다 .
- 실수는 부동소숫점 (floating point) 수라고도 불린다 . - x, y, z 에는 123.456 같은 실수만 배정할 수 있다 . - 가령 정수 30 은 실수 30.0 으로 변환되어 배정된다 .
x = 123.456;
- 변수 x 에 실수값 123.456 을 배정한다 (assign).
- x 값이 123 과 같다는 수학적 의미와는 다르다 .
- 물론 정수값 123 을 배정한 후에는 x 값이 123 이 된다 .
2.2 출력 함수 printf() 와 입력 함수 scanf()
< 실수의 취급 >
z = x + y;
- 실수 x 의 값과 실수 y 의 값을 더하여 , 실수 z 에 배정한다 .
printf(“x + y = %f\n”, z);
- 첫 인수를 출력하되 , 실수형 자료 출력을 뜻하는 %f 자리에는 z 에 저장된 실수값으로 치환하여 출력한다 .
- z 값이 가령 912.468 인 경우 컴퓨터가 저장하는 가장 가까운 값 ( 가령 912.467957) 으로 출력됨에 유의해야 한다 .
prog2-5.c
output
1 /* File : prog2-5.c 2 실수의 덧셈과 출력 */
3 #include <stdio.h>
4 int main(void) { 5 float x, y, z;
6 x = 123.456;
7 y = 789.012;
8 z = x + y;
9 printf(“x + y = %f\n”, z);
10 }
x + y = 912.467957
2.2 출력 함수 printf() 와 입력 함수 scanf()
< 문자와 문자열의 취급 >
printf(“%c%c%c%c ”, ‘Y’, ‘e’, ‘s’, ‘,’) ;
- 네 개의 문자를 %c 즉 문자형 그대로 출력한다 . 4 번째 %c 뒤의 공란 포함 다섯 자가 출력된다 .
char c1, c2, c3, c4, *a;
- c1, c2, c3, c4 는 char 형 변수로 선언된다 .
- *a( 즉 주소 a 가 가리키는 곳에 저장된 값 ) 가 char 형이 다 . 즉 a 는 char 포인터임을 선언한다 .
a = “This is a computer.”;
- 이 문자열이 저장된 메모리의 주소값이 a 에 저장된다 .
- 문자열이 저장될 때에는 널문자가 추가된다 . 따라서 이 문자열 의 길이는 16 이지만 저장을 위해서는 17 바이트가 사용된다 .
printf(“%s\n”, a);
- %s 는 문자열을 출력하기 위해 사용하며 , 포인터 a 가 가리키 는 문자열을 출력한다 .
- 물론 문자열 뒤에는 줄바꿈 문자 (\n) 가 출력된다 .
prog2-6a.c
output
1 /* File : prog2-6a.c 2 문자열과 문자의 출력 */
3 #include <stdio.h>
4 int main(void) {
5 printf(“%c%c%c%c ”, ‘Y’, ‘e’, ‘s’,
‘,’);
6 printf(“I am a computer.\n”);
7 }
Yes, I am a computer.
output
1 /* File : prog2-6b.c
2 문자열과 문자의 출력 */
3 #include <stdio.h>
4 int main(void) {
5 char c1, c2, c3, c4, *a;
6 c1 = ‘Y’; c2 = ‘e’;
7 c3 = ‘s’; c4 = ‘,’;
8 a = “I am a computer.”;
9 printf(“%c%c%c%c ”, c1, c2, c3, c4);
10 printf (“%s\n”, a);
11 }
Yes, I am a computer.
2.2 출력 함수 printf() 와 입력 함수 scanf()
char adr[30];
- 문자 30 개 저장할 수 있는 30 바이트의 메모리를 잡고 adr 에 그 시작 주소를 저장한다 .
- adr[0] 에서 adr[29] 까지 모두 30 개의 문자가 저장될 수 있 다 .
- adr 은 &adr[0] 와 같은 의미이다 . 즉 배열의 맨 앞 문자의 주소를 뜻한다 .
scanf(“%s”, adr);
- adr 포인터가 가리키는 곳에 문자열을 읽어 들인다 .
- 123 main Street 를 입력하더라고 첫 공백이 발견한 곳에서 입력을 종료한다 .
- 즉 adr 이 가리키는 곳에는 123 만이 저장된다 .
- adr[0], adr[1], adr[2] 에 각각 문자 ‘ 1’, ‘2’, ‘3’
이 저장되고 , adr[3] 에 널문자 ( 즉 0) 이 저장된다 .
prog2-7.c
output
1 /* File : prog2-7.c 2 문자열의 입력과 출력 */
3 #include <stdio.h>
4 int main(void) { 5 char adr[30];
6 printf (“Enter Address:”);
7 scanf(“%s”, adr);
8 printf (“Address is %s\n”, adr);
9 }
Enter Address:123 Main Street Address is 123
prog2-7b.c
문자열 3 개를 각각 읽어 들여 출력
output
1 /* File : prog2-7b.c
2 문자열의 입력과 출력 */
3 #include <stdio.h>
4 int main(void) {
5 char adr1[30], adr2[30], adr3[30];
6 printf (“Enter Address:”);
7 scanf(“%s %s %s”, adr1, adr2, adr3);
8 printf (“Address is %s %s %s\n”, adr1, adr2, adr3);
9 }
Enter Address:123 Main Street Address is 123 Main Street
putchar 와 getchar 함수는 문자를 다루지만 , 그 값을 정수형 변수 ( 즉 c) 에 저장하여 사용한다 .
putchar(‘a’);
문자 a 가 표준출력 ( 즉 화면 ) 에 출력된다 .
putchar(97);
문자 a 가 출력된다 .
97 은 문자 a 의 아스키 코드이기 때문이다 .
putchar(‘\n’);
줄바꿈 문자가 출력된다 .
c = getchar();
표준 입력 ( 즉 키보드 ) 에서 한 개의 문자 만을 읽어 들여
c 에 저장한다 .
prog2-8.c getchar 와 putchar
output
1 /* File : prog2-8.c
2 getchar 와 putchar */
3 #include <stdio.h>
4 int main(void) { 5 int c;
6 c = getchar();
7 putchar(c);
8 }
Hello H
예제 2.1
output
1 /* File : ex2-1.c
2 C Language Programming 이라는 문자열을 화 면에 출력 */
3 #include <stdio.h>
4 int main(void) 5 {
6 printf(“C Language Programming\n”);
7 }
C Language Programming
예제 2.2
1 /* File : ex2-2.c
2 다음과 같은 패턴을 출력하는 프로그램을 작성하시오 . */
3 #include <stdio.h>
4 int main(void) 5 {
6 printf(“ CCC\n”);
7 printf(“ CCCCCC\n”);
8 printf(“ CCCCCCCC\n”);
9 printf(“CCCC CCC\n”);
10 printf(“CC\n”);
11 printf(“CC CCCCC\n”);
12 printf(“CC CC\n”);
13 printf(“CC CC\n”);
14 printf(“CC CCCCC\n”);
15 printf(“CC\n”);
16 printf(“CCCC CCC\n”);
17 printf(“ CCCCCCCC\n”);
18 printf(“ CCCCCC\n”);
19 printf(“ CCC\n”);
20 }
예제 2.2 output
CCCCCCCC CCCC CCC CC
CC CCCCC CC CC
CC CC
CC CCCCC CC
CCCC CCC CCCCCCCC CCCCCC CCC
예제 2.3
output
/* File : ex2-3.c
2 변수 a 에 9, b 에 3 을 배정한 후 두 변수의 곱셈 , 나눗셈 , 덧 셈 , 뺄셈을 하시오 .*/
3 #include <stdio.h>
4 int main(void) 5 {
6 int a, b, c, d, e, f;
7 a=9; b=3;
8 c=a*b; d=a/b;
9 e=a+b; f=a-b;
10 printf(“%d*%d=%d\n”, a, b, c);
11 printf(“%d/%d=%d\n”, a, b, d);
12 printf(“%d+%d=%d\n”, a, b, e);
13 printf(“%d-%d=%d\n”, a, b, f);
14 }
9*3=27 9/3=3 9+3=12 9-3=6
예제 2.4
output
1 /* File : ex2-4.c
2 a=3, b=1, c=6, d=3 이라 할 때 (a-b)*(c-d)/
(a+d) 를 구하시오 . */
3 #include <stdio.h>
4 int main(void) 5 {
6 int a, b, c, d;
7
8 a=d=3, b=1, c=6;
9 printf(“(%d-%d)*(%d-%d)/(%d+%d)=%d\n”, 10 a, b, c, d, a, d, (a-b)*(c-d)/
(a+d));
11 }
(3-1)*(6-3)/(3+3)=1
예제 2.5
[해 설 ]
output 1 /* File : ex2-5.c
2 x, y, z 에 100 을 배정한 후 x/25, y/35, z/45 의 몫과 나머지를 구하시오 .*/
3 #include <stdio.h>
4 int main(void) 5 {
6 int x, y, z;
7
8 x = y = z = 100;
9 printf(“%d/25 = %d ... %d\n”, x, x/25, x%25);
10 printf(“%d/35 = %d ... %d\n”, y, y/35, y%35);
11 printf(“%d/45 = %d ... %d\n”, z, z/45, z%45);
12 }
100/25 = 4 ... 0 100/35 = 2 ... 30 100/45 = 2 ... 10
% 는 정수의 나눗셈의 나머지를 구하는 연산자 (modulus operator).
예제 2.6
output 2 a=10.23, b=3.64, c=1.23 이라 할 때 , 수식 (a+b)/c 의
결과를 구하시오 . */
3 #include <stdio.h>
4 int main(void) 5 {
6 float a=10.23, b=3.64, c=1.23;
7 float m;
8
9 m = (a+b)/c;
10 printf(“(%f + %f) / %f = %f\n”, a, b, c, m);
11 }
(10.230000 + 3.640000) / 1.230000 = 11.276423
예제 2.7
[해 설 ]
output 1 /* File : ex2-7.c
2 12345/321 을 과학적 표기법 (e 형 또는 E 형 ) 으로 출력하는 프로 그램을 작성하시오 .*/
3 #include <stdio.h>
4 int main(void) 5 {
6 float a, b, c;
7 a = 12345, b = 321;
8 c = a / b;
9 printf(“%e\n”, c);
10 }
3.845794e+001
줄 7 : a, b 가 float 형이므로 정수 12345 와 321 이 float 형으로 바뀌어 저장 됨 .
예제 2.8
[해 설 ]
output 3 #include <stdio.h>
4 int main(void) 5 {
6 int a, b, c, d, e;
7 a = 65, b = 66, c = 67, d = 68, e = 69;
8 printf(“%c %c %c %c %c\n”, a, b, c, d, e);
9 }
A B C D E
- 대문자 ‘ A’, ‘B’, ‘C’, ‘D’, ‘E’ 의 아스키 코드는 각각 65, 66, 67, 68, 69 이다 .
- 즉 문자를 표기하는 ‘ A’ 는 실제는 1 바이트의 작은 정수 65 로 저장된다 .
- 예를 들어 a = 65 는 a = ‘A’ 와 동일하다 .
예제 2.9
output 1 /* File : ex2-9.c
2 “Good Mornig!” 을 “ good” 과 “ Morning!” 으로 분리하여 별 개의 포인터가
3 가리키게 한 후 출력시키는 프로그램을 작성하시오 . */
4 #include <stdio.h>
5 int main(void) 6 {
7 char *p1, *p2;
8 p1 = “Good”;
9 p2 = “Morning!”;
10 printf(“%s %s\n”, p1, p2);
11 }
Good Morning!
예제 2.10
[해 설 ]
output 3 우측 정렬하여 출력하는 프로그램을 작성하시오 . */
4 #include <stdio.h>
5 int main(void) 6 {
7 int a = 1988; /* 변수 선언 시에 직접 그 값을 배정할 수 있음
*/
8
9 printf(“%-4d\n”, a);
10 printf(“%10d\n”, a);
11 }
1988
1988
- “%4d\n” 에서 %d 는 십진 정수를 의미하며 ,
4 는 해당 인수 ( 즉 a) 의 출력용 필드폭이 4 자리라는 의미이며 , % 뒤의 - 는 출력 시에 왼쪽으로 정렬하라는 의미이다 .
예제 2.11
[해 설 ]
output 1 /* File : ex2-11.c
2 3.14159 를 좌측 정렬하여 출력한 후 , 또한 필드폭 10 자리에 3 우측 정렬하여 출력하는 프로그램을 작성하시오 . */
4 #include <stdio.h>
5 int main(void) 6 {
7 const float a = 3.14159;
8
9 printf(“%-10.5f\n”, a);
10 printf(“%10.5f\n”, a);
11 }
3.14159 3.14159
- %10.5f 는 필드폭을 10 으로 잡고 , 그 중 소수점 미만 5 자리로 실수를 출력하라는 뜻이다 .
- % 뒤에 –가 있으면 좌측정렬이고 없으면 우측정렬이다 .
- const 는 상수로 그 값이 변경되지 않음을 뜻하며 , 위에서는 생략해도 무방하다 .
예제 2.12
[해 설 ]
output 5 {
6 char a = ‘*’;
7 printf(“%1c%2c%2c%2c%2c\n”, a, a, a, a, a);
8 printf(“%2c%2c%2c%2c\n”, a, a, a, a);
9 printf(“%3c%2c%2c\n”, a, a, a);
10 printf(“%4c%2c\n”, a, a);
11 printf(“%5c\n”, a);
12 }
* * * * * * * * * * * * * * *
예를 들어 마지막 printf 문장의 첫 인수내의 %5c 는 다음 인수인 a 를 필드폭 5 자리에 우측정렬하고 , 문자로 출력 하라는 의미이다 .
예제 2.13
[해 설 ]
output
1 /* File : ex2-13.c
2 실수 두 개를 입력시켜 그 합을 구하는 프로그램을 작성하시오 . */
3 #include <stdio.h>
4 int main(void) 5 {
6 float a, b;
7
8 scanf(“%f %f”, &a, &b);
9 printf(“%f + %f = %f\n”, a, b, a+b);
10 }
12.356 521.219971
12.356000 + 521.219971 = 533.575971
scanf 등으로 입력받을 때에는 , 저장하려는 변수의 주소를 인수로 사용한다 . 즉 a 에 입력값을 저장하려면 , &a 를 인수로 사용한다 .
2 키보드에서 한 문자를 입력시켜 , 그 코드값을 출력하는 프로그램을 작성하시오 . */
3 #include <stdio.h>
4 int main(void) 5 {
6 printf(“%d\n”, getchar());
7 }
9 57
가령 9 를 입력하면 문자 ‘ 9’ 의 아스키 코드값 57 이 출력된다 .
예제 2.15
(입출력 방향전환 )
[해 설 ]
1 /* File : mycopy.c
2 컴파일 / 링크시킨 file 을 mycopy 라 하자 . */
3 #include <stdio.h>
4 int main(void) 5 {
6 int c;
7 while ((c=getchar()) != EOF) /* stdin 에서 입력 * /
8 putchar(c); /* stdout 으로 출력 */
9 }
- 표준입력에서 입력을 받아 그와 동일한 복사본을 표준출력으로 출력시키는 프로그램 . - getchar() 로 한 문자씩 c 로 읽어들여 file 의 끝 (EOF) 이 아니라면 ,
putchar(c) 로 출력한다 .
output
cat afile
This is a test file.
Second line exists.
cc –o mycopy mycopy.c mycopy < afile > bfile cat bfile
This is a test file.
Second line exists.
현재 afile 이 워드프로세서 등의 방법으로 이미 생성되어 있다고 가정 한다 .
sort > tmp
> tmp 는 sort 의 표준출력을 화면 대신 tmp 라는 file 로 방향전환 한다 .
mycopy < afile > bfile
mycopy 의 표준입력을 키보드 대신 afile 에서 받고 , 표준출력은 화 면대신 bfile 로 방향 전환한다 .
만약 입력을 화면에서 받을 경우 입력의 끝은 UNIX/LINUX 의 경우 ctrl-D 로 한다 . DOS 의 경우는 입력의 끝은 ctrl-Z 로 표시한다 .