• 검색 결과가 없습니다.

Chapter 2 – 기본 프로그래밍

N/A
N/A
Protected

Academic year: 2021

Share "Chapter 2 – 기본 프로그래밍"

Copied!
42
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

Chapter 2 – 기본 프로그래밍

Outline

2.1 C 프로그램의 형태

2.2 출력 함수 printf() 와 입력 함수 scanf()

2.3 출력 함수 putchar() 와 입력 함수 getchar() 2.4 요약

2.5 예제

(2)

- C 프로그램은 한 개의 main 함수가 필요하다 .

- 이 함수의 몸체는 한 개의 블록 (block) 을 이루며 , { 과 } 로 둘려 쌓여있다 .

- 몸체는 문장들을 열거하여 이루어진다 . - 각 문장의 끝은 ; 으로 끝난다 .

int main(void) {

문장 ; 문장 ; . . . 문장 ; }

(3)

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 을 반환한다 . 정상적인 프로그램의 종료를 의미한다 .

(4)

output

2 첫번째 C 프로그램 */

3 #include <stdio.h>

4 int main(void) 5 {

6 printf(“Hello, world!\n”);

7 return 0;

8 }

Hello, world!

 

(5)

2.1 C 프로그램의 형태 printf(“ABCDEF”);

printf(“abcdef”);

printf(“0123456\n”);

3 개의 문자열을 연속으로 한 줄에 출력한다 .

printf(“ABCDEF\n”);

printf(“abcdef\n”);

printf(“0123456\n”);

각 문자열의 뒤에 줄바꿈 문자 (\n) 이 있으므로 1 줄에 1

개의 문자열 씩 출력한다

(6)

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

 

(7)

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

 

(8)

• printf() 의 인수가 2 개 이상일 경우 첫 인수 는 제어문자열로 다른 인수를 제어한다 .

• printf() 의 첫 인수내에서 , % 와 변환문자를 이용하여 다음 인수들의 출력 형태를 결정한다 .

– ( 예 ) %s 는 문자열 (string), %c 는 문자 (char), %d 는 십진수 정수

• printf(“abc”); 와 printf(“%s”,

“abc”) 는 출력이 같다 .

• printf(“%c%c%c”, ‘a’, ‘b’, ‘c’);

– abc 를 출력한다 .

– 가령 두번째 %c 는 ‘ b’ 를 문자형으로 출력하게 한다 .

(9)

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.

– 즉 첫 인수에서 % 변환문자 꼴이 아닌 부분은 그대로 출력되

고 , % 변환문자 부분은 가리키는 해당 인수를 변환하여 출력된

다 .

(10)

• scanf() 변환

변환 문자 입력 스트림에서 문자의 변환 방법 c               문자

d               십진수

f           실수 (float)

lf 또는 LF    실수 (long float 즉 double) s               문자열

• printf() 변환 문자

변환 문자 해당되는 인수의 출력 방법 c           문자

d         십진수 정수

e           과학적 표기법으로의 실수 f           실수

g          e- 포맷과 f- 포맷 중 짧은 것 s           문자열

(11)

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 이 된다 .

(12)

scanf(“%d”, &y);

- 십진수의 정수를 읽어 들여 y 에 저장하라 .

- &y 는 y 의 주소를 뜻하며 , scanf 의 경우 , 읽어 들일 변수 의 주소를 제공해야 한다 .

scanf(“%3d”, &y);

- 자릿수 3 을 명시했으므로 4567 을 입력해도 3 자리 456 까지 만 읽어 들이고 , 다음 7 은 다음 읽어 들일 때 사용한다 .

(13)

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.

프로그램 동작시의 사용자의 입력부분을 이탤릭 체로 표시하였다 .

(14)

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 이 된다 .

(15)

2.2 출력 함수 printf() 와 입력 함수 scanf()

< 실수의 취급 >

z = x + y;

- 실수 x 의 값과 실수 y 의 값을 더하여 , 실수 z 에 배정한다 .

printf(“x + y = %f\n”, z);

- 첫 인수를 출력하되 , 실수형 자료 출력을 뜻하는 %f 자리에는 z 에 저장된 실수값으로 치환하여 출력한다 .

- z 값이 가령 912.468 인 경우 컴퓨터가 저장하는 가장 가까운 값 ( 가령 912.467957) 으로 출력됨에 유의해야 한다 .

(16)

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

 

(17)

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 포인터임을 선언한다 .

(18)

a = “This is a computer.”;

- 이 문자열이 저장된 메모리의 주소값이 a 에 저장된다 .

- 문자열이 저장될 때에는 널문자가 추가된다 . 따라서 이 문자열 의 길이는 16 이지만 저장을 위해서는 17 바이트가 사용된다 .

printf(“%s\n”, a);

- %s 는 문자열을 출력하기 위해 사용하며 , 포인터 a 가 가리키 는 문자열을 출력한다 .

- 물론 문자열 뒤에는 줄바꿈 문자 (\n) 가 출력된다 .

(19)

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.

 

(20)

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.

 

(21)

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) 이 저장된다 .

(22)

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

 

(23)

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  

(24)

putchar 와 getchar 함수는 문자를 다루지만 , 그 값을 정수형 변수 ( 즉 c) 에 저장하여 사용한다 .

putchar(‘a’);

문자 a 가 표준출력 ( 즉 화면 ) 에 출력된다 .

putchar(97);

문자 a 가 출력된다 .

97 은 문자 a 의 아스키 코드이기 때문이다 .

putchar(‘\n’);

줄바꿈 문자가 출력된다 .

c = getchar();

표준 입력 ( 즉 키보드 ) 에서 한 개의 문자 만을 읽어 들여

c 에 저장한다 .

(25)

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

(26)

예제 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

 

(27)

예제 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 }

(28)

예제 2.2 output

CCCCCCCC CCCC CCC CC

CC CCCCC CC CC

CC CC

CC CCCCC CC

CCCC CCC CCCCCCCC CCCCCC CCC  

(29)

예제 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  

(30)

예제 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  

(31)

예제 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).

(32)

예제 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

(33)

예제 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 형으로 바뀌어 저장 됨 .

(34)

예제 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’ 와 동일하다 .

(35)

예제 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!

(36)

예제 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 자리라는 의미이며 , % 뒤의 - 는 출력 시에 왼쪽으로 정렬하라는 의미이다 .

(37)

예제 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 는 상수로 그 값이 변경되지 않음을 뜻하며 , 위에서는 생략해도 무방하다 .

(38)

예제 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 자리에 우측정렬하고 , 문자로 출력 하라는 의미이다 .

(39)

예제 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 를 인수로 사용한다 .

(40)

2 키보드에서 한 문자를 입력시켜 , 그 코드값을 출력하는 프로그램을 작성하시오 . */

3 #include <stdio.h>

4 int main(void) 5 {

6 printf(“%d\n”, getchar());

7 }

9 57

가령 9 를 입력하면 문자 ‘ 9’ 의 아스키 코드값 57 이 출력된다 .

(41)

예제 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) 로 출력한다 .

(42)

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 로 표시한다 .

참조

관련 문서

한양㈜의 12월 거래 내역을 계속기록법과 실지재고조사법을 적용할 경우 회계처리 하라. 및 2.와 관련하여, 매입할인기간 이전과 이후에 외상매입 대금을 지급할

• 2 이상의 시․군에 걸쳐 지정되는 용도지역․용도지구 또는 용도구역과 2 이상 의 시․군에 걸쳐 이루어지는 사업의 계획 중 도시관리계획으로 결정하여야 할 사항이

- 합격자 등록기간 내 등록을 완료하지 않으면 임용 의사가 없는 것으로 간주하여 합격 취소 - 임용포기를 원할 경우, [덧붙임5]의 임용포기확인서를

● 중소기업이 ①「중소기업기본법」의 규정에 따른 중소기업 외의 기업과 합병하는 경우 ②유예 기간 중에 있는 기업과 합병 ③독립성기준의 요건을 충족하지 못하게

예약시 중국인 신분증이 필요하여 외국인은 예약용도로 사용이 불가능하지만 대형병원 및 의사별 전문분야와 외래시간을 미리 파악할 수 있으니

- 만약 가격이 한계비용보다 높을 경우 에너지 효율 개선으로 인한 소비감소 효과가 소득의 상승으로 직결되지 않는다고 볼 수 있는 바 , 리바운드 효과 의 크기를

제안된 의사난수 생성기는 라인돌의 입력과 출력에 맞추어서 진행하였는데 먼저 초기 값 재설정(seed-update)에서 실난수(truerandom number)128bit를 입력으로

① 민간자격관리자가 법 제22조제2항의 규정에 의하여 공인받은 민간자격의 관리 운영권을 양도하고자 하는 경우에는 양도인과 양수인이 공동으로 작성한