Chapter 2 – 기본 프로그래밍 Outline 2.1 C 프로그램의 형태 2.2 출력 함수 printf()와 입력 함수 scanf() 2.3 출력 함수 putchar()와 입력 함수 getchar() 2.4 요약 2.5 예제
2.1 C 프로그램의 형태 - 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을 반환한다. 정상적인 프로그램의 종료를 의미한다.
Hello, world! 1 /* File : prog2-1.c 2 첫번째 C 프로그램 */ 3 #include <stdio.h> 4 int main(void) 5 { 6 printf(“Hello, world!\n”); 7 return 0; 8 } prog2-1.c output Hello, world!
2.1 C 프로그램의 형태 printf(“ABCDEF”); printf(“abcdef”); printf(“0123456\n”); 3 개의 문자열을 연속으로 한 줄에 출력한다. printf(“ABCDEF\n”); printf(“abcdef\n”); 각 문자열의 뒤에 줄바꿈 문자(\n)이 있으므로 1 줄에 1 개의 문자열 씩 출력한다
3 #include <stdio.h> 4 int main(void) { 5 printf(“ABCDEFG”); 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 } prog2-2.c output ABCDEFGabcdefg0123456
3 #include <stdio.h> 4 int main(void) { 5 printf(“ABCDEFG\n”); 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 } prog2-3.c output ABCDEFG abcdefg 0123456
2.2 출력 함수 printf()와 입력 함수 scanf() (예) %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. 즉 첫 인수에서 %변환문자 꼴이 아닌 부분은 그대로 출력되고, %변환문자 부분은 가리키는 해당 인수를 변환하여 출력된다.
2.2 출력 함수 printf()와 입력 함수 scanf() <변환 문자> 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이 된다.
2.2 출력 함수 printf()와 입력 함수 scanf() <정수의 취급> scanf(“%d”, &y); - 십진수의 정수를 읽어 들여 y에 저장하라. - &y는 y의 주소를 뜻하며, scanf의 경우, 읽어 들일 변수의 주소를 제공해야 한다. scanf(“%3d”, &y); - 자릿수 3을 명시했으므로 4567을 입력해도 3자리 456까지만 읽어 들이고, 다음 7은 다음 읽어 들일 때 사용한다.
3 #include <stdio.h> 4 int main(void) { 5 int x, y, z; 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 } prog2-4.c output [해 설] 456 The sum is 579. 프로그램 동작시의 사용자의 입력부분을 이탤릭 체로 표시하였다.
2.2 출력 함수 printf()와 입력 함수 scanf() <실수의 취급> 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)으로 출력됨에 유의해야 한다.
3 #include <stdio.h> 4 int main(void) { 5 float x, y, z; 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 } prog2-5.c output 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 포인터임을 선언한다.
2.2 출력 함수 printf()와 입력 함수 scanf() <문자와 문자열의 취급> a = “This is a computer.”; - 이 문자열이 저장된 메모리의 주소값이 a에 저장된다. - 문자열이 저장될 때에는 널문자가 추가된다. 따라서 이 문자열의 길이는 16이지만 저장을 위해서는 17바이트가 사용된다. printf(“%s\n”, a); - %s는 문자열을 출력하기 위해 사용하며, 포인터 a가 가리키는 문자열을 출력한다. - 물론 문자열 뒤에는 줄바꿈 문자(\n)가 출력된다.
3 #include <stdio.h> 4 int main(void) { 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 } prog2-6a.c output Yes, I am a computer.
3 #include <stdio.h> 4 int main(void) { 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 } prog2-6b.c output 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)이 저장된다.
3 #include <stdio.h> 4 int main(void) { 5 char adr[30]; 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 } prog2-7.c output 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 } prog2-7b.c 문자열 3개를 각각 읽어 들여 출력 output Enter Address:123 Main Street Address is 123 Main Street
2.3 출력 함수 putchar()와 입력 함수 getchar() int c; 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 } prog2-8.c getchar와 putchar output Hello H
2.5 예 제 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 } 예제 2.1 output C Language Programming
2 다음과 같은 패턴을 출력하는 프로그램을 작성하시오. */ 3 #include <stdio.h> 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
CCC CCCCCC CCCCCCCC CCCC CCC CC CC CCCCC CC CC 예제 2.2 output
2 변수 a에 9, b에 3을 배정한 후 두 변수의 곱셈,나눗셈,덧셈,뺄셈을 하시오.*/ 1 /* 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 } 예제 2.3 output 9*3=27 9/3=3 9+3=12 9-3=6
2 a=3, b=1, c=6, d=3이라 할 때 (a-b)*(c-d)/(a+d)를 구하시오. */ 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 } 예제 2.4 output (3-1)*(6-3)/(3+3)=1
2 x, y, z에 100을 배정한 후 x/25, y/35, z/45의 몫과 나머지를 구하시오.*/ 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 } 예제 2.5 [해 설] output %는 정수의 나눗셈의 나머지를 구하는 연산자(modulus operator). 100/25 = 4 ... 0 100/35 = 2 ... 30 100/45 = 2 ... 10
2 a=10.23, b=3.64, c=1.23 이라 할 때, 수식 (a+b)/c의 결과를 구하시오. */ 1 /* File : ex2-6.c 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 } 예제 2.6 output (10.230000 + 3.640000) / 1.230000 = 11.276423
2 12345/321을 과학적 표기법(e형 또는 E형)으로 출력하는 프로그램을 작성하시오.*/ 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 } 예제 2.7 [해 설] output 줄7 : a, b가 float형이므로 정수 12345와 321이 float형으로 바뀌어 저장됨. 3.845794e+001
2 ASCII 코드를 이용하여 “A B C D E”를 출력하는 프로그램을 작성하시오. */ 1 /* File : ex2-8.c 2 ASCII 코드를 이용하여 “A B C D E”를 출력하는 프로그램을 작성하시오. */ 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 } 예제 2.8 [해 설] output - 대문자 ‘A’, ‘B’, ‘C’, ‘D’, ‘E’의 아스키 코드는 각각 65, 66, 67, 68, 69이다. - 즉 문자를 표기하는 ‘A’는 실제는 1 바이트의 작은 정수 65로 저장된다. - 예를 들어 a = 65는 a = ‘A’와 동일하다. A B C D E
2 “Good Mornig!”을 “good”과 “Morning!”으로 분리하여 별개의 포인터가 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 } 예제 2.9 output Good Morning!
2 수치 1988을 필드폭 4자리에 좌측 정렬하여 출력한 후, 또한 필드폭 10자리에 1 /* File : ex2-10.c 2 수치 1988을 필드폭 4자리에 좌측 정렬하여 출력한 후, 또한 필드폭 10자리에 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 } 예제 2.10 [해 설] output - “%4d\n”에서 %d는 십진 정수를 의미하며, 4는 해당 인수(즉 a)의 출력용 필드폭이 4자리라는 의미이며, %뒤의 -는 출력 시에 왼쪽으로 정렬하라는 의미이다. 1988
3 우측 정렬하여 출력하는 프로그램을 작성하시오. */ 4 #include <stdio.h> 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 } 예제 2.11 [해 설] output - %10.5f는 필드폭을 10으로 잡고, 그 중 소수점 미만 5자리로 실수를 출력하라는 뜻이다. - % 뒤에 –가 있으면 좌측정렬이고 없으면 우측정렬이다. - const는 상수로 그 값이 변경되지 않음을 뜻하며, 위에서는 생략해도 무방하다. 3.14159
2 다음같은 패턴을 출력하는 프로그램을 작성하시오. */ 3 #include <stdio.h> 1 /* File : ex2-12.c 2 다음같은 패턴을 출력하는 프로그램을 작성하시오. */ 3 #include <stdio.h> 4 int main(void) 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 } 예제 2.12 [해 설] output 예를 들어 마지막 printf문장의 첫 인수내의 %5c는 다음 인수인 a를 필드폭 5자리에 우측정렬하고, 문자로 출력하라는 의미이다. * * * * * * * * * * * * * * *
2 실수 두 개를 입력시켜 그 합을 구하는 프로그램을 작성하시오. */ 3 #include <stdio.h> 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 } 예제 2.13 [해 설] output scanf등으로 입력받을 때에는, 저장하려는 변수의 주소를 인수로 사용한다. 즉 a에 입력값을 저장하려면, &a를 인수로 사용한다. 12.356 521.219971 12.356000 + 521.219971 = 533.575971
2 키보드에서 한 문자를 입력시켜, 그 코드값을 출력하는 프로그램을 작성하시오. */ 1 /* File : ex2-14.c 2 키보드에서 한 문자를 입력시켜, 그 코드값을 출력하는 프로그램을 작성하시오. */ 3 #include <stdio.h> 4 int main(void) 5 { 6 printf(“%d\n”, getchar()); 7 } 가령 9를 입력하면 문자 ‘9’의 아스키 코드값 57 이 출력된다. 9 57
2 컴파일/링크시킨 file을 mycopy라 하자. */ 3 #include <stdio.h> 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 } 예제 2.15 (입출력 방향전환) [해 설] - 표준입력에서 입력을 받아 그와 동일한 복사본을 표준출력으로 출력시키는 프로그램. - getchar()로 한 문자씩 c로 읽어들여 file의 끝(EOF)이 아니라면, putchar(c)로 출력한다.
<UNIX/LINUX 상에서의 동작> cat afile afile의 내용을 화면에 출력한다. sort > tmp > tmp는 sort의 표준출력을 화면 대신 tmp라는 file로 방향전환한다. mycopy < afile > bfile mycopy의 표준입력을 키보드 대신 afile에서 받고, 표준출력은 화면대신 bfile로 방향 전환한다. 만약 입력을 화면에서 받을 경우 입력의 끝은 UNIX/LINUX의 경우 ctrl-D로 한다. DOS의 경우는 입력의 끝은 ctrl-Z로 표시한다. [해 설] output cat afile This is a test file. Second line exists. cc –o mycopy mycopy.c mycopy < afile > bfile cat bfile