Presentation is loading. Please wait.

Presentation is loading. Please wait.

C 프로그래밍 - 기본 - 2001 .10.31 비트 캠프.

Similar presentations


Presentation on theme: "C 프로그래밍 - 기본 - 2001 .10.31 비트 캠프."— Presentation transcript:

1 C 프로그래밍 - 기본 - 비트 캠프

2 C언어의 장점 C언어소개 모든 분야에서 응용이 가능한 범용 시스템 프로그래밍 언어 프로그래머에게 친근한 언어의 역할
미국 AT&T의 Bell 연구소에서 UNIX라는 운영체제(OS) 및 C 컴파일러 자신을 프로그래밍하기 위하여 개발 C언어의 장점 수행속도가 빠르며, 최적 프로그램개발환경을 구축 명령행 처리도 가능하여, 빠르고 간편한 개발이 가능 ANSI 표준에 근거하고 있으며, 방대한 양의 자체 함수를 가짐 큰 규모의 프로그램도 작성이 가능 어셈블리와 혼용하여 쓸 수 있으며, 다른 고급언어와의 연결(Link)도 가능

3 Interpreter 와 Compiler
프로그램 타이핑 프로그램 실행 OK? 프로그램 수정 NO YES 프로그램 타이핑 링크 와 컴파일 OK? 프로그램 수정 NO YES 프로그램 실행 인터프리터(interpreter) 컴파일러(Compiler)

4 <각 연산자들의 종류와 우선 순위>
대분류 소분류 연산자 결합규칙 일차식 primery ( ) [ ] -> . -> 높다 단항연산자 단항 ! ~ cast연산자 * & sizeof <- 승제 * / % 사감 + - 쉬프트 << >> 비교 < <= > >= 등가 ==!= 비트AND & 비트XOR ^ 비트 OR 논리AND && 논리 OR || 삼항연산자 조건 ? : 치환연산자 치환 = += -= *= /= %= >>= <<= &= ^= != 순차연산자 순차 , 낮다

5 기본 데이터형 구분 자료형 범위 Byte 문자형 Char -128 ∼ 127 (-27 ∼ 27-1) 1
Unsigned char 0 ∼ 255 (0 ∼ 28-1) 정수형 Int   ∼ (-215 ∼ 215-1) 2 unsigned int 0 ∼ 65535  long ∼ (-231 ∼ 231-1) 4 unsigned long  0 ∼ 실수형  float ±3.4 * ∼ ±3.4 * 1038 double ±1.7 * ∼ ±1.7 * 10308 8

6 Print formats 포맷 의미 %c 문자 출력 %s 문자열 출력 %d 10진수로 출력 %o 8진수로 출력 %x
16진수로 출력 %f Floating number %e Exponential number %E 대문자 E로된 %e %g %f 혹은 %e %p 포인터 출력

7 < Hello world > #include <stdio.h> void main() {
printf("Hello world!"); }

8 < Printf #1 > #include <stdio.h> void main() {
printf(“ *** Data ***”); printf(“\n\n”); printf(“[kim]\n”); }

9 < Printf #2 > #include <stdio.h> void main() {
printf(“ *** Data ***\n\n”); printf(“[kim]\n”); }

10 < Printf #3 > #include <stdio.h> void main() {
printf(“ *** Data ***\n\n[kim]\n”); }

11 < Printf #4 > #include <stdio.h> void main() {
printf("<%d>\n", 10); printf("<%d>\n", ); printf("<%5d>\n", 10); printf("<%-5d>\n", 10); printf("<%05d>\n", 10); printf("<sum is %d>\n", ); printf("%d %d\n", 10+20, 10*20); printf("%d\t%d\n", 10+20, 10*20); }

12 < Printf #5 > #include <stdio.h> void main() {
char c = 'c'; printf("%c %d %x \n", c, c, c); }

13 < Printf #6> #include <stdio.h> void main() {
printf("%c\n", 152); printf("%d\n", 152); printf("%o\n", 152); printf("%x\n", 152); printf("%f\n", 152.0); printf("%e\n", 152.0); printf("%E\n", 152.0); printf("%g\n", 152.0); }

14 < Printf #7> #include <stdio.h> void main() {
printf(“%f\n”, ); printf(“%d.12lf\n”, ); }

15 오늘의 해결과제 자신의 이름을 출력하는 프로그램을 작성하시오.
<Warning! %%%”>이라고 출력하는 프로그램을 작성하시오. This is the first line이라고 출력한 후 2줄을 띄운 후 This is the second line 이라고 출력하는 프로그램을 작성하시오. 을 8진수, 10진수, 16진수로 출력하는 프로그램을 작성하시오.

16 변수이름 알파벳 문자 숫자 밑줄 문자 대소문자 구별 숫자로 시작 불가 예약어 사용 불가 공백, 특수문자 사용 불가

17 주석문 /*로 시작해서 */ 로 끝남. 프로그램의 도입부에서 프로그램을 설명 함수, 특정 코드 부분의 기능을 설명
중첩될 수 없음

18 예약어 모음 auto double int struct break else long switch
case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while

19 변수 선언과 초기화 void main() { 변수 선언부 int a; // a를 int 형으로 선언 char c; 처리부
c = ‘e’; }

20 변수 초기화 void main() { char c = 'c'; int integer = 100;
double pi = 3.14; long l = ; int i = 0 , j = 1, l = 123; }

21 문자 변수와 상수 void main() { char sex; sex = 'M'; printf(“%c”,sex); }

22 Escape sequences(특수문자 : ‘\’)
‘\’ 이후 존재하는 문자를 ASCII 코드로부터 escape하여 다른 의미를 표시하기 위한 특수문자 함 \a : alert(bell) \\ : backslash \b : backspace \? : question mark \f : form feed \’ : single quote \n : newline \” : double quote \r : carriage return \ooo : octal number \t : horizontal tab \xhh : hexadecimal number \v : vertical tab \0 : null

23 특수 문자 // Escape sequence #include <stdio.h> void main() {
printf('\b'); printf('\n'); printf('\t'); printf('\\'); printf('\?'); printf('\''); printf('\"'); }

24 printf, putchar, puts #include <stdio.h> void main() {
printf(“c”); printf(‘c’); putchar(‘c’); putchar(‘\n’); printf(“가나다”); puts("가나다"); puts("C:\\windows"); }

25 오늘의 해결과제 경고벨 소리와 함께 “Error!!”라고 출력하는 프로그램을 작성하시오.
Hong, Gil-dong과 Robin Hood를 한 줄에 하나씩 탭에 맞추어 출력하는 프로그램을 작성하시오. int 값 3개(10,254,2834)과 float 값 3개(10.4, , )를 한줄에 3개씩 탭에 맞추어 출력하는 프로그램을 작성하시오.

26 ASCII code 32 : 33 : ! 34 : “ 35 : # 36 : $ 37 : % 38 : & 39 : ‘
40 : ( 41 : ) 42 : * 43 : + 44 : , 45 : - 46 : . 47 : / 48 : 0 49 : 1 50 : 2 51 : 3 52 : 4 53 : 5 54 : 6 55 : 7 56 : 8 57 : 9 58 : : 59 : ; 60 : < 61 : = 62 : > 63 : ? 64 65 : A 66 : B 67 : C 68 : D 69 : E 70 : F 71 : G 72 : H 73 : I 74 : J 75 : K 76 : L 77 : M 78 : N 79 : O 80 : P 81 : Q 82 : R 83 : S 84 : T 85 : U 86 : V 87 : W 88 : X 89 : Y 90 : Z 91 :[ 92 : \ 93 : ] 94 : ^ 95 : _ 96 : ` 97 : a 98 : b 99 : c 100 : d 101 : e 102 : f 103 : g 104 : h 105 : i 106 : j 107 : k 108 : l 109 :m 110 : n 111 : o 112 : p 113 : q 114 : r 115 : s 116 : t 117 : 118 : v 119 : 120 : x 121 : y 122 : z 123 : { 124 : | 125 : } 126 :~ 127 :  128 :€ 129 : ? 130 :?

27 ASCII Code #include <stdio.h> void main() { printf(“%c\n”, ‘a’);
printf(“%d\n”, ‘a’); printf(“%c\n”,’A’+12); printf(“%d\n”,’A’+12); }

28 표준입력함수 int scanf( const char *format [,argument]... ); 표준입력 스트림으로부터 format에 지정된 형식에 따라 데이터를 읽어들이는 함수. int getchar( void ); 표준입력 스트림으로부터 한 문자를 읽어들이고 그 값을 결과값으로 리턴하는 표준 함수. 헤더 파일 : <stdio.h>

29 scanf #1 /* 1에서 10 사이의 값을 입력받아 출력하는 프로그램 */ #include <stdio.h>
void main() { int num; scanf(“%d”, &num); printf(“num = %d\n”,num); }

30 scanf #2 /* 1에서 100 사이의 값을 입력받아 500을 더한 값을 출력하는 프로그램 */
#include <stdio.h> void main() { int num; scanf(“%d”, &num); num = num + 500; printf(“num = %d\n”,num); }

31 scanf #3 /* 1에서 100 사이의 값을 입력받아 500을 더한 값을 출력하는 프로그램 */
#include <stdio.h> void main() { int num; scanf(“%d”, &num); printf(“num = %d\n”,num+500); }

32 scanf #4 /* 문자를 입력받아 출력하는 프로그램 */ #include <stdio.h> void main()
{ char ch; printf(“Input a character : “); scanf(“%c”, &ch); printf(“input = %c\n”,ch); }

33 getchar /* 문자를 입력받아 출력하는 프로그램 */ #include <stdio.h> void main()
{ char ch; printf(“Input a character : “); ch = getchar(); // scanf(“%c”,&ch); printf(“input = %c\n”,ch); }

34 getchar(); getchar 함수는 매크로 함수이며 stdio.h 안에 다음과 같이 선언되어 있다. #define getchar() getc( stdin ) getchar 함수는 버퍼형 함수이기 때문에 getchar 함수가 호출되면 먼저 버퍼를검사한다. 이때, 버퍼가 비어있으면 키보드 입력을 받게되는데, 이때의 입력은 버퍼로 들어가고 ^Z 후 엔터키(^D:UNIX)를 누르면 버퍼로 들어가는 작업을 마치면서 버퍼에서 한 글자를 꺼내어 리턴하게 된다. 만일 버퍼를 검사할 때, 버퍼가 비어있지 않으면 키보드 입력을 받지 않고 그냥 버퍼에서 글자를 가져온다. getch() 함수와 getche() 함수는 직접 키보드에서 입력을 받는 함수이다. 두 함수 모두 입력받은 키의 아스키 값을 리턴한다. getch() : 키보드 입력을 받으면서 화면에 아무것도 나타나지 않는다. getche() : 입력받은 문자가 화면에 나타난다.

35 오늘의 해결과제 영문 2글자를 읽어들여 이를 한줄에 하나씩 출력하는 프로그램을 작성하시오.
영문 5글자를 읽어들여 역순으로 출력하는 프로그램을 작성하시오. (단순하게 생각할 것.) 1,2번 문제를 scanf로 작성한 사람은 getchar로 바꾸어보고, getchar로 작성한 사람은 scanf로 바꾸어보시오.

36 연산자의 종류 괄호 : () 배열 : [] 구조형 : . -> 형 : (type) sizeof 포인터 : * &
괄호 : () 배열 : [] 구조형 : . -> 형 : (type) sizeof 포인터 : * & 증가, 감소 : 산술 : * / % 관계, 동등 : < > <= >= == != 비트 : ~ << >> & ^ | 논리 : ! && || 조건 : ? : 배정 : = += -= *= /= 등 콤마 :

37 사칙연산 #1 void main() { int a = 20, b = 25;
printf("a + b = %d\n", a + b); printf("a - b = %d\n", a - b); printf("a * b = %d\n", a * b); printf("a / b = %d\n", a / b); }

38 사칙연산 #2 void main() { int a, b; scanf(“%d”,&a);
scanf(“%d”,&b); // scanf(“%d%d”,&a,&b); printf("a + b = %d\n", a + b); printf("a - b = %d\n", a - b); printf("a * b = %d\n", a * b); printf("a / b = %d\n", a / b); }

39 사칙연산 #3 /* a,b 두 정수값을 입력받아 a를 b로 나눈 몫과 나머지를 출력하는 프로그램을 */ void main()
{ int a, b; printf(“a = “); scanf(“%d”,&a); printf(“b = “); scanf(“%d”,&b); // scanf(“%d%d”,&a,&b); printf(“a/b = %d, a%%b = %d\n, a/b, a%b); }

40 비트 연산자 void main() { int a = 0xffff; int b = 0x0f0f;
printf("a = %x\n", a); printf("a & b = %x\n", a & b); printf("a | b = %x\n", a | b); printf("a ^ b = %x\n", a ^ b); printf("~a = %x\n", ~a); }

41 비트쉬프트 연산자 void main() { int a = 20; printf("a = %d\n", a);
}

42 증가, 감소 연산자 #1 /* 정수를 입력받아 값을 1 증가하여 출력하는 프로그램 */ void main() {
int num; scanf(“%d”, &num); num = num +1; // 1 증가 printf(“%d”, num); }

43 증가, 감소 연산자 #2 /* 정수를 입력받아 값을 1 증가하여 출력하는 프로그램 */ void main() {
int num; scanf(“%d”, &num); num++; // ++num; printf(“%d”, num); }

44 증가, 감소 연산자 #3 void main() { int a, b; a = b = 30;
printf("(%d, %d) ", a, b); printf("%d\n", ++a); printf("%d\n", b++); printf("%d\n", ++a + ++b); printf("%d\n", b++ + b++); }

45 증감 연산자 main() { int i = 10, j = 2; i += j++;
printf("i = %d, j = %d\n",i,j); /* ⑴ */ { int i = 2; i += j; j -= i; printf("i = %d, j = %d\n",i,j); /* ⑵ */ { int j = 5; j *= i + 1; ++i; printf("i = %d, j = %d\n",i,j); /* ⑶ */ } printf("i = %d, j = %d\n",i,j); /* ⑷ */ printf("i = %d, j = %d\n",i,j); /* ⑸ */

46 복합 대입 연산자 void main() { int a = 16; a = a + 1; printf("%d\n", a);
}

47 조건연산자 void main() { int a=5; int b=1; int c; c = a > b ? a : b;
printf("max is %d\n", c); }

48 형변환 void main() { int a = 10, b = 3; float = div;
printf(“a = %d, b = %d\n”,a,b); printf(“a/b = %d\n”,a/b); printf(“float a/b = %f”\n”, (float)a/b); div = float(a/b); printf(“div = %f”\n”, div); }

49 sizeof 연산자 include <stdio.h> #include <conio.h> main() {
clrscr(); printf("\n char : %d byte", sizeof( char)); printf("\n long : %d byte", sizeof( long)); printf("\n int : %d byte", sizeof( int)); printf("\n short : %d byte", sizeof( short)); printf("\n unsigned : %d byte", sizeof( unsigned)); printf("\n float : %d byte", sizeof( float)); printf("\n double : %d byte", sizeof( double)); }

50 오늘의 해결과제 두 실수를 입력받아 두 수의 평균을 출력하는 프로그램을 작성하시오.
반지름 r을 입력받아 원의 면적을 출력하는 프로그램을 고객이 972원어치의 물건을 사고 716원을 지불했을 때 거슬러주어야 하는 거스름돈의 액수와 이를 위해 필요한 100원, 50원, 10원, 1원짜리의 동전의 갯수를 출력하는 프로그램을 작성하시오 두 정수값을 입력받아 이들을 각각 1씩 증가한 값의 합을 출력하는 프로그램을 작성하시오.

51 if~else 문 If-Else expression이 참이면(non-zero n) statement1 실행
거짓이면(zero n) else에 속하는 statement2 실행 else는 옵션이므로 없을 수도 있다. 그리고 else는 그것과 만나는 가장 가까운 if 와 짝이 된다.

52 if~else 문 if ( n > 0 ) if ( a < b ) z = a; else z = b; { }

53 if~else 문 #1 /* 한 정수값을 입력받아 그 값이 2 이상이면 books 출력 1이하면 book 출력 */
void main() { int num; scanf(“%d”, &num); if(num >= 2 ) printf(“%d books\n”,num); else }

54 if~else 문 #2 void main() { int age; printf("당신의 나이를 입력하세요 : ");
scanf(&age); if(age >= 60) printf("60대"); else if(age >= 50) printf("50대"); else if(age >= 40) printf("40대"); else if(age >= 30) printf("30대"); else if(age >= 20) printf("20대"); else if(age >= 10) printf("10대"); else if(age >= 0) printf("유소년"); else printf("해당사항 없습니다"); printf("\n"); }

55 switch 문 switch 문은 다중 선택을 위한 방법을 제공한다.
우선 expression이 각 case 의 const-expr(integer 혹은 char)와 같은지 check. 해당하는 statement들의 분기명령(예. break 등)이 없으면 나머지 모든 statements 들을 실행. 만일 expression 이 제시된 모든 case 와 일치하지 않으면 default 이하의 statement 만을 실행. switch ( expression ) { case const-expr : statements; break; ..... default : statements }

56 switch문 #1 main() { int i; printf("Input a number(1 ~ 3): ");
scanf("%d",&i); switch (i) case 1: printf("ONE\n"); break; case 2: printf("TWO\n"); break; case 3: printf("THREE\n"); break; default: printf("Error\n"); break; }

57 switch문 #2 /* 한 정수값을 입력받아 그 값이 2 이상이면 books 출력 1이하면 book 출력 */
void main() { int num; scanf(“%d”, &num); switch(num) case 1 : printf(“%d book”,num); break; default : printf(“%d books”,num); break; }

58 switch문 #3 void main() { int age; printf("당신의 나이를 입력하세요 : ");
scanf("%d", age); switch(age){ case 6: printf("60대"); break; case 5: printf("50대"); break; case 4: printf("40대"); break; case 3: printf("30대"); break; case 2: printf("20대"); break; case 1: printf("10대"); break; case 0: printf(“유소년”); break; default : printf(“해당 사항 없습니다.”); }

59 break & continue Break & Continue Break : loop와 switch 문에서 사용
break를 포함하는 loop나 switch문의 나머지 부분을 무시하고 다음 statement를 수행하게 한다. Continue : loop문에서 사용 Program의 흐름이 loop 내의 나머지 부분을 무시하도록 하며, 다음 차례의 순환을 하도록 한다.

60 오늘의 해결과제 점수를 읽어(이는 정수값으로 0~100점 사이를 가정) 값이 이상이면 A를, 80~89면 B를, 70~79면 C를, 60~69면 D를, 그 이하이면 F를 출력시키는 프로그램을 작성하시오 (힌트:우선 정수값 하나를 읽어들이므로 이를 위한 변수로 i를 사용하시오) 1번 문제를 if문으로 작성한 사람은 switch 문으로 바꾸어 프로그램을 작성하시오. 또한 switch문으로 작성한 사람은 if 문으로 바꾸어 프로그램 을 작성하시오.

61 Loop 문 Loop statement Program 내에서 임의의 조건을 만족시킬 때까지 일정한 code들을 계속적으로 반복하여 수행하는 부분 While expression이 false 이거나 혹은 zero가 될 때까지 statement를 계속적으로 반복 실행 while은 loop를 순환하기 전에 순환 여부를 먼저 check 하게 된다. 따라서 statement 부분을 전혀 실행시키지 않고서 loop를 빠져나갈 수도 있다.

62 while while ( expression ) { statements; }

63 While 문 #1 /* hello!! 를 10번 출력하는 프로그램 */ void main() { int i = 0;
while(i < 10) printf(“hello!!\n”); i++; }

64 While 문 #2 void main() { int level; int age;
printf("당신의 나이를 입력하세요 : "); scanf("%d", &age); level = 0; while(age >= 0) age = age - 10; level = level + 1; } printf("%d0대\n", level);

65 for expression1 은 조건을 초기화 시켜 주는 것으로서 가장 먼저 expr1이 수행되고, expr2 가 참( or Non-zero )이면 statements가 실행되고, 마지막으로 expr3이 실행된다. 그리고 다시 loop 순환 조건인 expr2를 check 하게 된다. For 문 또한 while 과 마찬가지로 statement 실행 이전에 조건을 검사한다 for for ( expr1; expr2; expr3 ) { statements; } while expr1 while ( expr2 ) { statements; expr3; }

66 for

67 For 문 #1 /* hello!! 를 10번 출력하는 프로그램 */ void main() { int i ;
for(i = 0; i < 10 ; i++) printf(“hello!!\n”); }

68 For 문 #2 void main() { int level; int age; printf("당신의 나이를 입력하세요 : ");
scanf("%d", &age); for(level = 0;age >= 10; ++level) age = age - 10; } printf("%d0대\n", level);

69 do ~ while Do-While : expression 이 거짓이거나 혹은 zero 가 될 때까지 반복 실행
loop 순환조건인 expression 은 적어도 statement 가 1 회 실행되고 나서 조건을 검사 do { statements } while ( expression );

70 Do-While 문 #1 /* hello!! 를 10번 출력하는 프로그램 */ void main() { int i = 0;
printf(“hello!!\n”); i++; }while(i < 10); }

71 Do-While 문 #2 void main() { int level; int age;
printf("당신의 나이를 입력하세요 : "); scanf("%d", &age); level = 0; do age = age - 10; level = level + 1; } while(age >= 0); printf("%d0대\n", level);

72 Do-While문 #3 #include <stdio.h> main() { char c; do {
c = getchar(); if (c >= 'a' && c <= 'z') /* 읽은 문자가 소문자이면 */ putchar(c-32); /* 대문자로 출력 */ else if (c >= 'A' && c <= 'Z' && c != 'Q') putchar(c+32); /* 소문자로 출력 */ else putchar(c); /* 읽은 문자를 출력('Q'도 포함)*/ } while (c != 'Q'); }

73 Goto & Label Goto & Label
Goto 문은 Program 의 흐름이 지시된 label 을 갖고 있는 곳으로 jump 시킨다. Label 과 그 statement 의 구별은 colon (:)으로 하며 label 은 goto 문의 앞뒤 어디에 있어도 상관이 없다. 또한 label 의 명칭은 변수명의 규칙에 따른다. 논리적인 programming 을 위하여 이러한 무조건적인 jump 를 하게 되는 goto 문의 사용은 가급적 하지 않는 것이 좋다. 하지만, 예외적으로 다음과 같이 둘 이상의 loop 안에서 한번에 빠져 나오는 경우에 사용되기도 한다.

74 Example #1 /* 한 라인을 입력받아 문자의 개수를 계산하는 프로그램 */ void main() { char ch;
int count = 0; while( (ch = getchar()) != ‘\n’) printf(“%c”,ch); count++; } printf(“count = %d”,count);

75 Example #2 /* 사용자가 입력한 라인의 개수를 계산하는 프로그램 */ void main() { char ch;
int count = 0; while( (ch = getchar()) != EOF) if(ch == ‘\n’) count++; } printf(“line = %d”,count);

76 오늘의 해결과제 1에서 100까지 출력하는 프로그램을 만드시오.
1부터 100까지의 합을 구하는 프로그램을 for문을 사용하여 작성하시오. 2, 4, 6, … 100 까지 출력하는 프로그램을 만드시오 구구단 표를 출력하는 프로그램을 만드시오 학생 10명의 성적을 입력받아 합계와 평균을 구하는 프로그램을 작성하시오. N개의 성적을 읽어 성적이 0보다 작거나 0보다 큰수를 입력할 경우 프로그램을 중단하는 프로그램을 작성하시오.

77 오늘의 해결과제(필수) For문을 사용하여 화면에 아래와 같이 다이아몬드를 출력하는 프로그램을 작성하시오. * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

78 배열의 이해  배열 : 여러 개의 변수들은 모아놓은 것. 변수의 종류 변수의 이름[변수의 개수];
 배열 : 여러 개의 변수들은 모아놓은 것. 변수의 종류 변수의 이름[변수의 개수]; ex> int num[10]; 이 경우 int 형의 10개의 변수(num[0], num[1], ..., num[9])를 선언 한 것과 같다.  다차원배열 변수의 종류 변수의 이름[변수의 개수][변수의 개수] ex> int array[5][5] 이 경우 int 형의 5*5개의 변수를 선언한 것과 같다.

79 배열 #1 /* 정수값 10개를 입력받아 순서대로 출력하는 프로그램 */ void main() { int num[10];
int i; for(i = 0; i<10;i++) printf(“정수값 입력 : “); scanf(“%d”,&num[i]); } printf(“출력\n”); for(i = 0; i < 10; i++) printf(“%d\t”,num[i]);

80 배열 #2 /* 정수값 10개를 입력받아 순서대로 출력하는 프로그램 */ void main() { int num[10];
int i; for(i = 0; i<10;i++) printf(“정수값 입력 : “); scanf(“%d”,&num[i]); } printf(“출력\n”); for(i = 0; i < 10; i++) printf(“%d\t”,num[i]);

81 배열 #2 /* 정수 10개의 합과 평균을 구하는 프로그램 */ void main(void) {
int i, data[10] = { 78, 55, 99, 75, 84, 39, 67, 98, 87, 100 }; long int sum = 0; float ave; for (i = 0; i < 10; i++) sum += data[i]; ave = (float)sum / 10; printf("TOTAL = %ld AVERAGE = %.2f\n",sum,ave); }

82 배열 #3 main() { int ia[10] = { 0 }; /* 초기값이 모두 0 */ int i;
printf("*** Input numbers between 0 and 99 ***\n"); scanf("%d",&i); while (i >= 0 && i <= 99) ++ia[i / 10]; } printf("FREQUENCIES\n"); for (i = 0; i < 10; i++) printf("%2d ~ %2d : %10d\n",i*10,(i+1)*10-1,ia[i]);

83 배열 #4 /* 2X2 행렬에 정수를 입력받아 출력하는 프로그램 */ void main(void) {
int matrix[2][2],i,j; for (i = 0; i < 2; i++){ for(j = 0; j < 2; j++){ printf(“값을 입력하시오 : ”); scanf(“%d”,matrix[i][j]); } printf(“%d ”,matrix[i][j]); printf(“\n”);

84 오늘의 해결과제 소수를 구하는 프로그램을 배열을 이용하지 말고 작성하시오. 소수를 구하는 프로그램을 배열을 이용하여 만드시오

85 포인터의 이해 int ar[l][m][n]; 여기서 눈여겨 볼 것은 배열의 첫번째 요소는 배열의 포인터가 된다는 것이다.이 배열의 포인터는 ar이 된다.또 ar[l]은 ar[l][m][n]의 포인터가 되고 ar[l][m]은 배열 ar[l][m][n]의 포인터가 된다. 포인터를 이용해서 배열을 여러 가지로 참조 할 수 있다. int ar[l][m][n]; ar[l][m][n] = *(ar[l][m]+n) = *(*(ar[l]+m)+n) < 매개 변수가 배열인 함수 > 배열을 함수와 매개 변수로 받을 때는 배열 포인터를 써야 한다. 함수의 원형에는 "변수형 매개변수이름[]" 또는 "변수형 *매개변수이름"과 같이 써야 한다.

86 포인터의 이해 int *pnt; pnt : 다른 int형 변수의 번지수를 저장한다. *pnt : pnt가 가지고 있는 번지수가 가르키는 내용을 말한다. int i; i : 메모리 상에 정수 값을 저장할 장소를 만든다. &i : i가 만들어진 메모리 상이 번지를 말한다. 포인터 변수의 형 선언 포인터 변수는 형에 관계하지 않고 2byte만 차지한다. 하지만 변수형에 따라 메모리 참조를 할 때 그에 맞는 증가나 감소를 하기 위해 선언을 해주는 것이 좋다

87 포인터 연산 포인터 변수와 포인터 변수 끼리의 뺄셈은 가능하나 덧셈은 허용되지 않는다
포인터와 단항 연산자를 혼합해서 사용 할 경우 주의사항! ++*pt : *pt에 1을 더함 *++ptr : 번지수를 하나 증가한 다음 내용을 취함 ++*pt : 번지수가 가리키는 내용 증가 *ptr++ : 가리키는 번지의 내용을 후위 연산 기법으로 증가

88 포인터 배열 문자열을 변수에 저장 할 때 메모리를 절약하기 위해 사용한다.
char *name[]={"ju fal ge","son o gong","sam jang bub sa"}; 이 것을 배열로 선언 한다면 char name[][16]={"ju fal ge","son o gong","sam jang bub sa"}; 으로 48byte가 들지만, 포인터 배열로 선언하면 37byte 밖에 들지 않는다. 포인터 배열은 초기값이 들어 갈만큼 메모리가 잡히기 때문이다

89 이중 포인터 포인터의 포인터를 말한다. int **a,*b,c; 라고 선언 했다면...
정수형 : c, *b, **a 정수형 포인터 : &c, b, *a 정수형 이중 포인터 : *b, a

90 void형과 NULL 포인터 void *ptr; 형을 무시하고 일을 처리 해야 할 때 사용한다. 어떠한 포인터도 void형 포인터에 대입 될수 있으나 void형 포인터는 캐스트 연산자와 함께 다른 포인터 변수에 대입되어야 한다. NULL 포인터란 초기값이 0인 포인터 즉 0x0000을 가르키는 포인터다.

91 main() 함수의 인자 원형 int main(int argc,char *argv[],char *env[]);
char *argv[] 명령 라인에서 입력한 인자들이 존재하는 메모리의 번지수를 기억한다. argv[0] : 패스명과 실행 파일 이름 argv[1] 부터는 인자의 내용이 순서대로 들어가 있다. char *env[] 환경 변수이다.

92 함수 포인터 함수 포인터는 하의 함수를 가르키며 실행까지도 할 수 있다.
함수되돌리는값 (*포인터이름)(가르킬함수의매개변수리스트); 함수가되돌리는값 : 리터형 포인터이름 : 일반 변수명 쓰듯 정한다. 가르킬매개변수리스트 : 함수 포인터가 가르키는 함수의 매개 변수 리스트이다. int (*fptr)(int i); fptr = func; /*()를 하지 않는다*/ int func(int q) {...} 함수 이름 중 ()와 그 안에 들어 있는 부분을 제외한 함수의 이름은 함수 포인터 상수가 된다.

93 알고 넘어가기 (1) main() { int i; /* int형 변수의 내용은 필요한 int값을 저장 */
int *iptr; /* int형 포인터 변수의 내용은 int형 변수의 번지 수를 저장 */ i = 256; /* 256 == 0x100 */ iptr = &i; printf("%d\n",*iptr); /* *iptr은 iptr이 가리키고 있는 메모리의 내용 */ }

94 포인터 연산에 관한 프로그램 main() { int i = 10, *ip = &i; int j, k;
char c = 'D', *cp = &c; double *jp = (double *) 2000; *ip++ = ++i; ++*--ip; ++*cp++; *--cp = c + 3; jp += 5; j = jp - (double *) 80; k = (int)(jp - 80); printf("i = %d, j = %d, k = %d, c = %c\n",i,j,k,c); } 결과i = 12, j = 245, k = 1400, c = H

95 포인터 #1 void main() { int a; int *p; a = 100; p = &a;
printf("a = %d\naddress of a = %p\n", a, p); }

96 포인터 #2 void main() { int i, *p, *q; i = 382; p = &i; *q = *p;
printf("i = %d, p = %d, q = %d\n", i, *p, *q); *p = 192; }

97 포인터 #3 void main() { int a[2][10][10]; int i, j, k;
for(i=1; j<=2; k++) for(j=0; j<10; j++) for(k=0; k<10; k++) a[i-1][j][k] = (i*100)+(j*10)+k; printf("Table of multiples.\n");

98 포인터 #4 – (1) main() { char c = 'a'; int* pi = &c; void* pv = &c; char* pc1 = pi; char* pc2 = pv; printf("%c\n", *pc1); printf("%c\n", *pc2); }

99 포인터 #4 – (2) main() { int i; int a[5], *ip; for(i=0; i<5; i++) a[i] = i; ip = a; printf("%d\n", *(ip+3*sizeof(int))); }

100 포인터 #4 – (3) main() { char* p = NULL; /*char *p = "abc";*/ if(p) printf("Pointer is not null\n"); if(!p) printf("Pointer is null\n"); if(p ? 0 : 1) printf("Pointer is null\n"); }

101 포인터 #5 #include <stdio.h> void main() {
char str[40] = "2002 World Cup Korea"; char a, b, *c, *pt; int i; char buf[100]; a = str[0]; b = *str; printf("The 1st output is %c %c\n", a, b);

102 a = str[9]; b = *str+9; printf("The 2nd output is %c %c\n", a, b); c = str+12; printf("The 3rd output is %c %c\n", str[12], *c); for (i = 0 ; i < 100 ; i++) buf[i] = i + 100; buf[i] = 0; pt = buf + 20; printf("The 4th output is %d %d\n", buf[20], *pt); }

103 포인터 #6 #include <stdio.h> void fix(int x, int *y) {
printf("%d %d\n", x, *y); ++x; ++*y; printf("%d %d\n" ,x, *y); } int main()

104 int a, b; a = 0; b = 1; printf("%d %d\n", a, b); fix(a, &b); return 0; }

105 포인터 #7 #include <stdio.h> void (*func_ptr)(double);
void print1(double data_to_ignore); void print2(double arg); void print3(double arg); void print1(double data_to_ignore) { printf("Data ignored\n"); }

106 void print2(double arg)
{ printf("print2(%f)\n", arg); print3(arg); } void print3(double arg) printf("print3(%f)\n", arg); int main() double pi = ; double pi2 = 2.0 * pi;

107 print1(pi); func_ptr = print1; func_ptr(pi); func_ptr = print2; func_ptr(pi2); func_ptr(13.0); func_ptr = print3; print3(pi); return 0; }

108 배열과 포인터 #8 main() { int ia[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *ip, i; ip = ia+9; /* 배열의 이름 = 그 배열의 맨 처음 변수의 주소 */ for (i = 0; i < 10; i++) /* 즉 ia+9는 &ia[9]와 같다 */ printf(" ia[%d] = %2d\n",9-i,*(ip-i)); } ia[9] = 10 ia[8] = 9 ia[7] = 8 ia[6] = 7 ia[5] = 6 ia[4] = 5 ia[3] = 4 ia[2] = 3 ia[1] = 2 ia[0] = 1

109 배열과 포인터 #9 main() { int i, j; char ch[2][2] = { '1', '2', '3', '4' }; char* p[2] = { ch+0, ch+1 }; *(ch) = 'c'; *(ch+1) = 'd'; for(i=0; i<2; i++) for(j=0; j<2; j++) printf("%c ", *(ch+i)[j]); }

110 배열과 포인터 #10 int array[5][4] = { 1, 1, 1, 1, 1 }; main() { int i, j; int (*ap)[4]; ap = array; for(i=0; i<5; i++) { *(ap[i]+i) = i+1; } for(j=0; j<4; j++) { for(i=0; i<5; i++) printf("%d ", array[j][i]); putchar('\n'); } }

111 배열과 포인터 #11 main() { int *pa, a[10]; pa = &a; memset(a, 0, sizeof(pa)); a: a(&a[0], 10); goto a; } int a(int a[]) { int i; static int j = 0; for(i=0; i<b; i++) { a[i] = j++; printf("a[%d] = %d\n", i, a[i]); } return 0; }

112 배열과 포인터 #12 void main() { static int ar[2][3] = { 1, 2, 3, 4, 5, 6 };
int i, j; for (i = 0; i < 2; i++) for (j = 0; j < 3; j++) printf("Address of ar[%d][%d] = %u\n",i,j,&ar[i][j]); printf("ar = %u, *ar = %u, **ar = %u\n",ar,*ar,**ar); printf("ar+1 = %u, *(ar+1) = %u, **(ar+1) = %u\n",ar+1,*(ar+1),**(ar+1)); printf("ar[0] = %u, *ar[0] = %u\n",ar[0],*ar[0]); printf("ar[0]+1 = %u, *(ar[0]+1) = %u\n",ar[0]+1,*(ar[0]+1)); printf("ar[1] = %u, *ar[1] = %u\n",ar[1],*ar[1]); printf("ar[1]+1 = %u, *(ar[1]+1) = %u\n",ar[1]+1,*(ar[1]+1)); }

113 이중포인터 void main(void) { int **dptr, *ptr, i; i = 10; ptr = &i;
printf(" i = %4d, *ptr = %4d, **dptr = %4d\n",i,*ptr,**dptr); printf(" &i = %4p, ptr = %4p, *dptr = %4p\n",&i,ptr,*dptr); printf("&ptr = %4p, dptr = %4p, &dptr = %4p\n",&ptr,dptr,&dptr); }

114 오늘의 해결과제(1) 20크기의 문자 배열을 정의하고 여기에 문자열 “Welcome to Bitcamp를 넣으시오. 그리고 나서 포인터를 사용하여 이 문자열을 출력하시오. 문자열 S안에서 찾고자 하는 문자 스트링 t의 위치를 나타내는 함수를 작성하시오. 이때, 찾고자 하는 문자열 t가 없을 때에는 –1를 리턴한다 Char* strfind(char*, char*t); 입력한 데이터를 단어 단위로 알파벳 순으로 정렬하는 프로그램을 작성하시오. 단, 각 단어의 길이는 30자 이내로 가정하며, 단어의 구분은 ‘ ‘ 나 \t’, ‘\n’으로 하고 알파벳 이외의 다른 글자들은 ASCII 코드 순으로 정렬하시오.

115 오늘의 해결과제(2) 포인터 배열을 이용하여 사람 이름을 정렬하는 프로그램을 작성하시오
몇 년도의 몇 번째 일을 입력으로 받아서 그 해의 월, 일로 출력하는 프로그램을 작성하시오. (예: 입력 -> October 30 )

116 함수(메모리) 간단한 Computer 구조 Data Bus Monitor Keyb. Mouse ... ROM RAM I/O
CPU Addr. Bus

117 함수(메모리) 1-Register CPU 구조 AC : Accumulator LR : LINK Register
MR : Multiplicator Register ALU : Arithmatic Logic Unit MBR : Memory Buffer Register MAR : Memory Address Register IR : Instruction Register PC : Program Counter data processor command processor MR LR AC Decorder 제어장치 ALU IR PC MBR MAR memory

118 함수(구성방법) C 프로그램의 일반적인 구성 양식 /* 프로그램명, 화일명, 날짜, version 등 */
#include < .....> * 표준 헤더를 포함시킨다. */ #include " " * 사용자 정의 헤더를 포함시킨다. */ #define /* 매크로 상수나 매크로 함수를 정의*/ int function1( ); /* 사용자함수를 선언한다. */ extern int n1, n2; /* 외부 변수를 선언한다. */ /* 윗부분을 별도의 헤더 파일로 작성하고,

119 함수(구성방법) #include " ..... " 문으로 포함시키는 것이 좋다. */
int n1, n2; /* 외부 변수를 정의한다. */ void main() /* main 함수를 정의한다. */ { ... } int function1( ) /* 사용자함수를 정의한다. */

120 함수 기본 구조 되돌림자료형 함수이름 (매개변수리스트) { 변수 선언 및 초기화부 구문 }
변수 선언 및 초기화부  구문 } 되돌림 자료형이 없을 경우 void를 쓰며 매개 변수가 없을 경우 ()로 나타낸다. ex > int print( ) int in; scanf(“%d”,&in); return in; }

121 함수의 원형 되돌림형 함수이름 (자료형 변수명,자료형 변수명,....);
컴파일러에게 그 함수의 매개 변수형과 되돌림값의 형을 알려준다. 변수명은 생략 할수 있다. 프로그램 앞부분에 나열해 두거나 헤더 파일에 나열한다. 원형은 마지막에 세미콜론을 찍는다는 것을 주의하자!

122 Return 문 return문은 값을 되돌리며, return 이후에 나오는 문장은 무시하고 함수를 빠져나온다.
일치하지 않으면 C의 형변화 규칙에 의해 변환된다. ex) return; return(i > 0 ? 6 : 8); 등등

123 값에 의한 호출과 참조에 의한 호출 값에 의한 호출(call by value) C는 기본적으로 값에 의한 호출을 한다.값에 의한 호출이란 변수의 값을 복사해서 넘겨주는 것을 말한다.값을 넘겨주는 변수에는 아무런 영향을 주지 못한다. 참조에 의한 호출(call by value reference) C는 포인터를 이용해서 변수의 값에 직접 영향을 미칠수 있다.이것은 배열과 포인터에서 더 자세히 다루기로 한다.

124 블록에서의 변수 사용 auto 자동 변수로 블록 내에서 생성 자동으로 블록이 끝나면 소멸,컴파일중 만들어지는 것이 아니라 프로그램 실행 중에 임시로 만들어 졌다,사라진다.기본적으로 변수는 자동 변수이므로 생략 가능하다. extern 외부변수 또는 외부함수로 나타냄.다른 파일에 변수나 함수가 존재하는 것을 알려주기 위한 것으로 실제로 메모리에 변수를 만드는 것이 아니라 다른 파일에서 만들어진 변수를 사용만한다. register 레지스터에 변수를 만들어 빠른 속도로 실행한다.int나 unsigned형만이 가능한 16bit 변수다. 선언한다고 해서 모두 만들어 지는 것은 아니고 컴파일러에게 요구하는 것이다.선언하지 않아도 컴파일러가 만들기도 한다.

125 static 변수나 함수를 정적으로 선언한다
전역 변수, 지역 변수 전역변수는 블록 밖에서 선언된 변수로 모든 블럭에서 사용이 가능하고 지역 변수는 블럭 내에서 생성되 블럭 내에서만 사용 가능하다.지역 변수가 전역 변수보다 우선하다.

126 함수 들어가기 전(1) #include main() { int i;
for (i = 1; i <= 70; i++) /* 첫번째로 '*'를 70개 출력시킴 */ putchar('*'); putchar('\n'); printf(" OUTPUT BY HONG GIL DONG\n"); for (i = 1; i <= 70; i++) /* 두번째로 '*'를 70개 출력시킴 */ printf(" INPUT DATA1\n"); for (i = 1; i <= 70; i++) /* 세번째로 '*'를 70개 출력시킴 */ printf(" OUTPUT1\n"); for (i = 1; i <= 70; i++) /* 네번째로 '*'를 70개 출력시킴 */ putchar('\n'); }

127 위의 프로그램을 보면 다음 문장이 4번 반복되는 것을 알 수 있다. 
for (i = 1; i <= 70; i++) putchar('*'); putchar('\n'); 위의 경우 함수를 사용하게 되면 다음과 같이 된다. print_star() { int i; for (i = 1; i <= 70; i++) /* '*'를 70개 출력시키는 함수*/ putchar('*'); putchar('\n'); }

128 #include <stdio.h>
print_star(); void main() { } print_star() int i; for (i = 1; i <= 70; i++) /* '*'를 70개 출력시키는 함수*/ putchar('*'); putchar('\n');

129 함수 들어가기 전(2) main() { print_star();
printf(" OUTPUT BY HONG GIL DONG\n"); printf(" INPUT DATA1\n"); printf(" OUTPUT1\n"); }

130 print_star는 '*'를 한 줄 출력시키는 것을 의미
함수 사용시 유의사항 : 함수를 많이 사용하면 수행시간이 많이 걸리기 때문에 속도는 저하 따라서 속도에 민감한 프로그램을 작성하고자 할 때에는 함수의 사용에 신중을 기해야 한다.

131 인자의 전달 인자의 전달 : 실인자의 값이 형식 인자의 값으로 어떻게 전달되는가 하는 것을 의미 void swap(int x, int y) { int t; t = x; x = y; y = t; } main() { int x = 10; int y = 20; swap(x, y); printf("x = %d, y = %d\n",x,y); } in swap x: 20 y: 10 in main a: 10 b: 20

132 함수 #1 #include <stdio.h> #define PI 3.14159 void main() {
float r; printf("Enter radius : "); scanf("%f", &r); printf("Area of a circl with radius %f is %.2f\n", r, circle_area(r)); printf("Surface of a ball with radius %f is %.2f\n", r, ball_surface(r));

133 void main() { float r; printf("Enter radius : "); scanf("%f", &r); printf("Area of a circl with radius %f is %.2f\n", r, circle_area(r)); printf("Surface of a ball with radius %f is %.2f\n", r, ball_surface(r)); printf("Volume of a ball with radius %f is %.2f\n", r, ball_volume(r)); } float circle_area(float r) return PI*r*r;

134 float ball_surface(float r)
{ return 4.0f*r*r*PI; } float ball_volume(float r) return 4*PI*r*r*r/3;

135 함수 #2 #include <stdio.h> #include <conio.h>
long forth(long val) { long ret; ret = first(val+1); printf("%d ", ret); return ret; } long third(long fire) return forth(fire);

136 long third(long a, int b)
{ return 0; } char second(int var) return third(var); int first(int i) return second(i); void main() first(1);

137 함수 #3 long factorial(int n) { /* long형을 되돌리는 함수 */ int i;
long product = 1l; for (i = 2; i <= n; i++) product *= i; return product; } main() { int num; long fact; for (num = 1; num <= 10; num++) { fact = factorial(num); /* factorial 함수 호출뒤 fact에 대입 */ printf("%2d! = %8ld\n",num,fact);

138 Static 변수 void test() { static int s_count; /* static 메모리 유형은 초기화시키지 않았을 경우 */ int a_count = 0; /* 0의 값을 가진다 */ s_count++; a_count++; printf("static count = %2d\tauto count = %d\n",s_count,a_count); } main() int i; for (i = 0; i < 10; i++) test();

139 오늘의 해결과제 #1 연속된 숫자의 합을 구하는 함수를 만들고 이를 이용하여 합을 구하라.
- Sum from 1 to 10 is 55 배열내의 원소들의 합을 구하는 함수를 만들고 이를 이용하여 배열 안에 들어있는 값들의 합을 구하시오. { 1, 2, 3, 4, 10, 6, 7, 8, 9, 10 } Sum of array is 60 Swap 함수를 작성해서 a 와 b의 값을 바꾸는 프로그램을 작성하시오. 하나의 문장을 입력받아 거꾸로 출력해주는 reverse란 이름의 함수를 작성하고 이 함수를 사용해서 프로그램을 완성하시오.

140 오늘의 해결과제 #2 대문자를 소문자로 바꾸어주는 char tolower(char) 함수를 만드시오
소문자를 대문자로 바꾸어주는 char toupper(char) 함수를 만드시오

141 함수(재귀호출) Recursion 재귀 ( recursion )라는 것은 함수가 직접 또는 간접적으로 자기 자신을 다시 호출하는 것을 말한다. 재귀 호출(recursive call)은 메모리를 많이 소모하게 되며, 처리 속도 또한 상대적으로 느리다. 작성하고자 하는 프로그램이 대단히 간결해지며, 그 프로그램을 이해하는 것도 쉬워진다. Quick sort, Tower of Hanoi, Fractal curve 등의 알고리즘 재귀 호출 작성방법 종료조건을 명시 자신을 호출할 것

142 함수(재귀호출) void main() { printf(“%g\n”, fibonacci(4)); } fibonacci(4)

143 재귀호출 #include <stdio.h> void print_back() { int ch;
if ((ch = getchar()) != '\n') /* 한글자를 입력받고 줄바꿈 문자인지 확인 */ print_back(); /* 줄바꿈 문자가 아닌경우 되부름 */ putchar(ch); /* 입력받은 문자 표시 */ } main() printf("Enter a line -> "); print_back();

144 오늘의 해결과제 9! 을 계산하는 프로그램을 작성하시오.
1번의 문제를 사용자가 정수를 입력하여 n! 를 계산할 수 있도록 재귀함수로 프로그램을 작성하시오.

145 #define 목적 전처리기 부분만 바꾸며 소스 전체를 바꾸는 효과가 있다.
#undef [define 되었던 대표 문자] define를 해제한다.

146 매크로 함수 # include #define SQ(x) ((x)*(x)) SQ는 매크로 함수명이고,
괄호로 묶인다는 것에 주의하자! # include #include <파일이름> <>는 include 디렉토리에서 파일을 찾음 #include "파일이름" ""는 현재 디렉토리에서 파일을 찾음 "" 안에 풀패스를 적을 때 반드시 '\‘ 하나만 적어야한다.

147 기타(전처리기) #error 에러메세지 #error문을 만나면 즉시 컴파일을 중단하고
"Error : 파일이름.c 라인번호 : Error directive : 에러 메세지“ 라고 출력한다. #line문과 널 지시자 #line 라인넘버 "파일이름" #line 라인넘버

148 Typedef문 typedef [자료형] [대표하는 문자열];
ex) typedef unsigned char byte;     typedef int array[10]      byte ch; ⇔ unsigned char ch     array x; ⇔int x[10]

149 enum 문 enum {열거형상수1,열거형상수2,...} 열거형변수1 열거형변수2 enum문으로 선언된 변수는 차례로 1,2,3,4...의 값을 갖는 enum문 멤버를 사용할수 있다. enum 열거택 {열거형상수1,열거형상수2,...}; 열거택을 이용해서 enum문을 정의하면 프로그램 어디에서나 "enum 열거택 열거형변수1,열거형변수2,..."와 같은 방법으로 열거형 변수를 선언 할 수 있다. typedef enum {열거형상수1,열거형상수2,...} 대표문자열 typedef문을 이용하면 "대표문자열 열거형변수1,열거형변수2,..." 와 같은 방법으로 열거형 변수를 선언 할 수 있다

150 SWAP 함수 두 개의 정수 포인터를 받아 그 값을 바꾸어 주는 함수 void swap(int *a, int *b) {
int temp; temp = *a; *a = *b; *b = temp; } 매크로 함수로 만들 경우 #define swap(a,b) { a ^= b; b ^= a; a ^= b; }

151 문자열 Character arrays & Character pointers "I am a string“

152 문자열 배열 / 포인터 char amessage [] = "Hello, world";
char *pmessage = "Hello, world";

153 문자열 배열 / 포인터 char string [][20] = { "Im Chan sik", "Im So young",
"Im Sun young", };

154 문자열 배열 / 포인터 }; char *string [] = { "Im Chan sik", "Im So young",
"Im Sun young", };

155 문자열 #1 #include <stdio.h> void main() {
char *p[3] = {"c","Algorithm","Datastructure"}; /* char p[3][14] = {"c","Algorithm","Datastructure"}; */ int i; printf("\n p => %p\n",p); for(i=0;i<3;i++) printf("\n p[%d] (address %p) => %s",i,p[i],p[i]); }

156 문자열 #2 void main() { char *p; char str[256]; int len;
strcpy(str,"World Cup 2002 Korea!"); p = str; len = 0; while(*p) { p++; len++; } printf("\n%s, 문자열의 길이 = %d\n",str, len); }

157 문자열 #3 #include <stdio.h> int strlen1(char* str) { int ret;
if(str) ret = strlen(str+1); else ret = 0; return ret; }

158 void main() { int len; char* test = "Bitcamp"; printf("문자열의 길이 = %d", strlen1(test)); }

159 문자열에 관련된 함수들 char *strcat( char *strDestination, const char *strSource ); int strcmp( const char *string1, const char *string2 ); char *strcpy( char *strDestination, const char *strSource ); size_t strlen( const char *string );

160 strcat void main(void) { char str1[100] = "This is ";
char *str2 = "string concatenation test."; char *str3; str3 = strcat(str1, str2); printf("%s\n", str3); }

161 strcmp void main() { char* str1 = "This is a string comparison example."; char* str2 = "This is a string to be compared."; if(strcmp(str1, str2) > 0) puts("str1 is greater."); else if (strcmp(str1, str2) == 0) puts("Two string is same."); else puts("str2 is greater."); }

162 strcpy void main() { char tgtstr[100];
char* srcstr = "This is source string."; char* p; strcpy(tgtstr, srcstr); p = strstr(tgtstr, "source"); strcpy(p, "target string."); puts(tgtstr); }

163 문자열 #4 #include <ctype.h> int htoi(char* s); void main() {
char* test = "ff"; printf("0x%s = %d", test, htoi(test)); } /* htoi : convert hex number to dec number */ int htoi(char* s)

164 { int hex, result = 0; char* p; while(!*p) char ch = *p; if(isalpha(*p)) hex = tolower(*p); else if(isalnum(*p)) hex = *p; else return -1; // error

165 result = result * 16 + hex; p++; } return result;

166 문자열 #5 int isalpha(int ch) { if(ch <= 'z' && 'a’ <= ch)
return 1; else if(ch <= 'Z' && 'A‘ <= ch) return 0; } void main() int ch;

167 while(ch = getchar()) { if(isalpha(ch)) printf("Alphabet"); else printf("Non-alpha"); printf("\n"); }

168 오늘의 해결과제 문자열 s안에서 찾고자 하는 문자 스트링 t의 위치를 나타내는 함수를 작성하시오. 이때 찾고자하는 문자열 t가 없을 때에는 –1을 리턴한다. char* strfind(char* s, char* t); 문자열 s를 거꾸로 하는 함수 reverse(s)를 작성하시오 void reverse(char* s); 문자 3개를 읽어 이를 알파벳 순으로 출력하는 프로그램을 작성하시오. 단 두 문자 교환하는 것은 함수로 작성하시오. 문자를 입력받아 홀수번째로 입력받은 문자만 출력하는 프로그램을 작성하시오.

169 구조체 선언 형식 struct 구조체택 {...} 변수리수트;
struct 구조체택 {...}; struct 구조체택 변수리스트; typedef struct 구조체택 {...} 대표문자열; 대표문자열 변수리스트; 구조체 포인터 변수도 2byte만 차지하며 구조체의 크기에 따라 번지 띄기가 결정 된다. 구조체 멤버도 구조체가 들어 갈수 있다. 멤버 : 구조체 안의 변수 요소들을 말한다.

170 구조체의 연산 멤버 연산자 - 구조체 내의 멤버를 가르킬 때 사용한다. 구조체이름.멤버이름
멤버 연산자 - 구조체 내의 멤버를 가르킬 때 사용한다. 구조체이름.멤버이름 구조체 멤버 포인터 (*pa).name == pa->name 구조체 대입 구조체이름 = 구조체이름 b.kor = a.eng /*구조체 멤버 대입*/ a = b /*구조체 대입*/

171 구조체의 초기화 struct { struct a { int x,y,z; }; /*구조체 멤버로 구조체도 포함 할 수 있다*/
struct b {int w,x,y; }; } test = { {3,4,5}, {6,7,8} };

172 구조체를 매개변수로 갖는 함수 구초체를 매개 변수로... 되돌림형 func (struct 구조체태그 구조체매개변수)
구초체 포인터를 매개 변수로... 되돌림형 func (struc 구조체태그 *구조체매개변수)

173 공용체 선언 형식은 공용체와 같고 단지,멤버들이 메모리를 공유 한다는 차이가 있다. 메모리에는 가장 큰 멤버의 크기 만큼 공용체가 들어갈 자리가 만들어 진다. union exunion { int i; char j; float k; } a; 라고 선언 했다면 메모리에는 가장 많은 메모리를 차지 하는 float형 변수 4byte만큼 자리가 만들어 진다.

174 비트필드 비트 필드는 구조체 멤버를 비트 단위로 나눌수 있다. 자료형은 Int,unsigned를 사용 할 수 있다.
struct 구조체태그 { 데이타형 비트필드멤버이름 : 비트수;} 구조체 변수; 비트수는 왼쪽에 쓰여 있는 멤버가 차지하는 비트수로써 1~16 가능 하다.

175 구조체 #1 struct man { char c; int k; float e; double m; };
void main(void) struct man a; printf(" Address of a = %u, Sizeof(a) = %d\n",&a,sizeof(a)); printf("Address of a.c = %u, Sizeof(a.c) = %d\n",&a.c,sizeof(a.c)); printf("Address of a.k = %u, Sizeof(a.k) = %d\n",&a.k,sizeof(a.k)); printf("Address of a.e = %u, Sizeof(a.e) = %d\n",&a.e,sizeof(a.e)); printf("Address of a.m = %u, Sizeof(a.m) = %d\n",&a.m,sizeof(a.m)); }

176 구조체 #2 { int x; int y; }; void main(void) struct da val = { 10, 30 };
void main(void) struct da val = { 10, 30 }; int sum = 0; sum = total(val); printf(" Sum = %d\n",sum); }

177 구조체 #3 #include <stdio.h> struct {
char initial; /* last name initial */ int age; /* childs age */ int grade; /* childs grade in school */ } student[2]; void main() student[0].initial = 'H'; student[0].age = 25; student[0].grade = 4;

178 student[1]. age = student[0]. age - 1; /
student[1].age = student[0].age - 1; /* this student is one year younger */ student[1].grade = 3; student[1].initial = 'K'; printf("%c\' age is %d years old.\n%c\'s grade is %d\n", student[1].initial, student[1].age, student[1].grade); student[0].initial, student[0].age, student[0].grade); }

179 구조체 #4 struct { char initial; int age; int grade; } student[12];
void main() int i;

180 for (i = 0 ; i < 12 ; i++) { student[i].initial = 'A' + i; student[i].age = 16 + i; student[i].grade = 84 + i; } student[3].age = student[5].age = 20; // assignment student[11] = student[0]; printf("%c\' age is %d years old. %c\'s grade is %d\n", student[i].initial, student[i].age, student[i].initial, student[i].grade);

181 구조체와 포인터 #1 include <string.h> struct man { char name[30];
int kor; int eng; int math; int total; float ave; };

182 구조체와 포인터 #2 void main(void) { struct man a, *pa; pa = &a;
strcpy(pa->name,"Gunman"); pa->kor = 87; pa->eng = 90; pa->math = 75; pa->total = pa->kor + pa->eng + pa->math; pa->ave = pa->total / 3.0f; printf(" Name : %s\n",pa->name); printf(" Korean = %d\n",pa->kor); printf("English = %d\n",pa->eng); printf(" Math = %d\n",pa->math); printf(" Total = %d\n",pa->total); printf("Average = %.2f\n",pa->ave); }

183 오늘의 해결과제 두 복소수의 덧셈을 하는 프로그램을 작성하시오. (덧셈식은 함수를 이용하여 계산할 수 있도록 작성할 것)
2. 입력받은 여려개의 복소수들을 더하는 프로그램을 작성하시오.

184 오늘의 해결과제 아래와 같은 데이터가 있다고 할 때, N명의 학생에 관해 읽어서 각 학생의 평균 성적을 구한 후 평균 성적이 높은 학생에서 낮은 학생의 순으로 이름과 번호, 평균 점수를 출력하는 프로그램을 작성하시오. 단, N은 맨 처음 읽어들이도록 하며, 학생의 수는 100명을 넘지 않는다고 가정하고 학생의 번호는 92XXXX이며, 시험 점수는 0 에게 100점 사이이다. (data) 4 Lee Seung Wook Kwon Oh Jin Kwon Oh Chang Oh Jung Pyo

185 오늘의 해결과제 #2 자기 가족의 신상 명세를 구조체로 구성해 보시오.그리고 이 구조를 이용하여 가족의 데이터를 저장하고 출력하는 프로그램에 도전해 보시오. 이 프로그램은 C강의의 최종 프로젝트인 전화번호부 프로그램과 거의 유사합니다. 이때 필요한 멤버들은 본인 스스로 정합니다. 예를 들면,   struct family { char name[10]; int age; char *hobby; . . /* 필요한 부분 더 첨가 */ }

186 공용체 } half; } number; #include <stdio.h> void main() { short i;
union short val; struct char ch0; char ch1; } half; } number;

187 for (i = 0 ; i < 1024 ; i += 16) { number.val = i; printf("%4x %2x %2x\n", number.val, number.half.ch0, number.half.ch1); }

188 열거형 #1 void main() { int i; COLOURS ch; while( ch )
puts("Choose a color : "); for(i = BLACK; i < WHITE; i++) printf("%d) BLACK\n", i); ch = getchar();

189 switch(ch) { case BLACK: puts("Black is chosen"); break; case BLUE: puts("Blue is chosen"); case GREEN: puts("Gree is chosen"); case RED: puts("Red is chosen");

190 case WHITE: puts("White is chosen"); break; }

191 열거형 #2 #include <stdio.h> void main() {
enum day {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}; for(days = Monday ; days < Sunday ; days++) printf("The day code is %d\n", days); }

192 오늘의 과제 1에서 12까지의 숫자를 입력받으면, 해당 월의 영문 이름과 날수를 출력하는 프로그램을 만드시오.
다음과 같이 출력하는 프로그램을 만드시오 January : ******************** Febrary : ********************

193 FILE I/O 파일 연산의 단계 1) stream 변수의 정의 2) 파일 open 3) read / write
4) File close 파일 입출력 함수의 종류 fopen / fclose fgetc / fputc fgets / fputs fscanf / fprintf fread / fwrite feof / ferror fseek fsetpos / fgetpos

194 스트림 물리적 파일을 쉽게 다루기 위한 논리적 구조 문자의 흐름 일관성 있는 접근 File control structure for streams. <STDIO.H> struct _iobuf { char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsiz; char *_tmpfname; }; typedef struct _iobuf FILE;

195 정의 되어진 스트림 stdin, stdout, stderr, stdaux, stdprn ( redirection 여부에 따라 결정) 예제 #include <stdio.h> #define MAXLINELEN 74 void main(int argc, char *argv[]) { char buffer[MAXLINELEN +1]; int line = 1; FILE *stream; /* 1) stream(FILE *) 변수의 정의 */ if (arc <= 1) { puts(“Usage : list filename.ext\n”); exit(1); } stream = fopen(argv[1], “r”); /* 2) 파일 open */ if (stream == 0) { puts(“file not found !\n”); exit(1); } while (!eof(stream)) { if (fgets(buffer, MAXLINELEN+1, stream) == NULL) break; /* 3) read / write */ printf(“%3d : %s”, line++, buffer); } fclose(stream); /* 4) File close */ }

196 File 복사 프로그램 (임의 파일) /* 사용법 : filecopy filecopy.c fcopy.c */ #include <stdio.h> void main(int argc, char *argv[]) { int c; /* 반드시 int type */ FILE *source, *dest; if (argc <= 2) puts(“Usage : filecopy source dest\n”), exit(1); if ((source = fopen(argv[1], “rb”) == NULL) perror(“Source\n”), exit(1); if ((dest = fopen(argv[2], “wb”) == NULL) perror(“Dest\n”), exit(1); while ((c = fgetc(source)) != EOF) if (fgetc(c, dest) == EOF) break; if (ferror(source) || ferror(dest)) perror(“Copying\n”), exit(1); else if (fclose(dest) == EOF) perror(“Dest\n”), exit(1); else printf(“%s copied to %s\n”, argv[1], argv[2]), exit(0); }

197 fprintf, fscanf 서식화 함수 /* 개인의 이름과 신장 체중파일을 만드는 프로그램 */ #include <stdio.h> void main(int argc, char *argv[]) { char name[128]; /* 이름 */ int height; /* 신장 */ float weight; /* 몸무게 */ FILE *fp; if (argc < 2) puts(“Usage : filename datafile\n”), exit(1); if((fp=fopen(argv[1], "w"))==NULL) puts("화일을 쓸 수 없습니다!"), exit(1); scanf("%s%d%f", name, &height, &weight); while (strcmp(name,"end")) { fprintf(fp,"%10s %3d %4.1f\n", name, height, weight), scanf("%s %d %f", name, &height, &weight); } fclose(fp); /* END OF ffp */

198 if ((fp = fopen(argv[1], "r"))==NULL) puts("화일을 읽을 수 없습니다!"), exit(1);
clrscr(); while (!feof(fp)) /*주의 ! 화일의 끝을 검사하기 위해 feof함수를 쓴다.*/ { fscanf(fp,"%s%d%f",name,&height,&weight), printf("%10s %3d %4.1f\n",name,height,weight); } fclose(fp); /* END OF ffp */

199 random access 파일의 입출력 fread, fwrite 함수 #include <stdio.h>
typedef struct rec { char name[20]; int num; } REC; #define NUM 3 void main() { int i, j; FILE *fp; REC stud[NUM]; if ((fp=fopen(”name.lst", "wb"))==NULL)

200 puts("화일을 개방할 수 없습니다 !"); exit(1); } for ( i = 0; i < NUM; i++) { scanf(“%s %d”, stud[i].name, &stud[i].num); fwrite(stud[i]. name, sizeof(stud[i]. name), 1, fp); fwrite(stud[i]. num, sizeof(stud[i]. num), 1, fp); fclose(fp); if ((fp=fopen("name.lst","rb"))==NULL){

201 for(j = 0; j < i; j ++) { if (fread (stud[j]. name, sizeof(stud[j]. name), 1, fp) != 1) break; if (fread (stud[j]. num, sizeof(stud[j]. num), 1, fp) != 1) break; puts(stud[j]. name), printf(“%12d\n”, stud[j]. num); } fclose(fp);

202 int fseek(FILE *stream, long offset, int whence)
상수 기준점 offset 파일 처음 0L 이상 1 현재 레코드 위치 임의 2 파일 마지막+1 0L이하 fp 파일 처음 파일 마지막+1 fseek(fp, 5*REC_SIZE, SEEK_SET) fseek(fp, -3*REC_SIZE, SEEK_END) fseek(fp, 2*REC_SIZE, SEEK_CUR)

203 long ftell(FILE *stream)
#include <stdio.h> long filesize(FILE *stream) { long curpos, filesize; printf(“curpos = %ld\n”, curpos = ftell(stream)); fseek(stream, 0L, SEEK_END); printf(“curpos = %ld\n”, filesize = ftell(stream)); fseek(stream, curpos, SEEK_SET); printf(“curpos = %ld\n”, ftell(stream)); return filesize; }

204 long ftell(FILE *stream)
#include <stdio.h> long filesize(FILE *stream) { long curpos, filesize; printf(“curpos = %ld\n”, curpos = ftell(stream)); fseek(stream, 0L, SEEK_END); printf(“curpos = %ld\n”, filesize = ftell(stream)); fseek(stream, curpos, SEEK_SET); printf(“curpos = %ld\n”, ftell(stream)); return filesize; }

205 File I/O #1 #include <stdio.h> int main() { FILE *in, *out;
in = fopen("data.dat",’r’); if (in == NULL) puts("\nUnable to open file data.dat for reading"); return 1; }

206 out = fopen("data.bak",’w’);
if (out == NULL) { puts("\nUnable to create file data.bak"); return 1; } while(feof(in)) char ch = fgetc(in); fputc(ch,out); fclose(in); fclose(out);

207 File I/O #2 #include <stdio.h> #include <string.h>
int main(void) { FILE *fp; char str[256]; int i; fp = fopen("output.txt", "w"); strcpy(str, "The output text"); for (i = 1 ; i <= 7 ; i++) fprintf("%s Text #%d\n", str, i);

208 fclose(fp); return 0; }

209 File I/O #3 #include <stdio.h> int main(void) { FILE *fp;
char str[256]; fp = fopen("output.txt", "r"); while (feof(fp)) fgets(str, 256, fp); printf(str); }

210 fclose(fp); return 0; }

211 오늘의 해결과제 첫 예제에서 파일로 출력된 결과를 즉시 화면에 출력하도록 수정하시오.
앞의 성적을 입력받아서 출력하는 예제를 수정하여 파일에 저장하고 파일로부터 읽을 수 있도록 만드시오 (구조체 문제).

212 File I/O #4 #include <stdio.h> #include <stdlib.h>
int main(void) { FILE *in, *printer; int c; in = fopen("output.txt", "r"); if (in == NULL) printf("입력 파일을 열수 없읍니다.\n"); getchar(); exit (EXIT_FAILURE);

213 } printer = fopen("PRN", "w"); if (printer == NULL) { printf("프린터를 열수 없읍니다.\n"); getchar(); exit (EXIT_FAILURE); c = getc(in); while (c != EOF) putchar(c); putc(c, printer);

214 } fclose(in); fclose(printer); return EXIT_SUCCESS;

215 File I/O #5 struct record { int i; long l; char str[10]; };
int main(void) { char *name = "박찬호"; struct record rec[10]; FILE *out; char* p;

216 for(i=0; i<10; i++) { rec[i].i = i; rec[i].l = i*1000; p = name; while(*p) *(rec[i].str + (p - name)) = *p; p += 1; } out = fopen("output.dat", "w"); if (out == NULL)

217 { printf("출럭 파일을 열수 없읍니다.\n"); exit (EXIT_FAILURE); } for(i=0; i<10; i++) fwrite(&rec[i], sizeof(struct record), 1, out); fclose(out); return EXIT_SUCCESS;

218 오늘의 해결과제 fread라는 함수를 사용하여 앞의 예제에서 저장된 데이터를 읽어들이고, 출력하는 프로그램을 만드시오.
size_t fread( void *buffer, size_t size, size_t count, FILE *stream ); #include <stdio.h>

219 Standard Functions #1 int getchar( void ); int putchar( int c );
int scanf( const char *format [,argument]... ); int getc( FILE *stream ); int putc( int c, FILE *stream ); int fscanf( FILE *stream, const char *format [, argument ]... );

220 getchar int main(void) { int ch; printf("문자를 입력하세요 : ");
ch = getchar(); printf("당신이 입력한 문자는 다음과 같습니다. : %c", ch); return 0; }

221 putchar int main(void) { int ch; while(1) printf("문자를 입력하세요 : ");
ch = getchar(); getchar(); printf("당신이 입력한 문자는 다음과 같습니다. : "); putchar(ch); printf("\n"); } return 0;

222 scanf #include<stdio.h> int main(void) { int base;
float tmp, ratio, total; printf("What is the base? "); scanf("%d", &base); printf("What is the interested ratio? "); scanf("%f", &ratio); tmp = base * ratio / 100; printf("Calculated interest is %f \n", tmp); total = tmp + base; printf("The total is %f\n", total); return 0; }

223 getc void main( void ) { char buffer[81]; int i, ch;
printf( "Enter a line: \n" ); for( i = 0; i < 80; i++ ) { ch = getc(stdin); if( (ch == EOF) || (ch == '\n') ) break; buffer[i] = (char)ch; } buffer[i] = '\0'; printf( "%s\n", buffer );

224 putc void main( void ) { int ch = 0; FILE *stream = stdout; char *p;
char *str = “2002 World Cup Korea\n"; for( p = str; (ch != EOF) && (*p != '\0'); p++ ) ch = putc( *p, stream ); }

225 fscanf FILE *stream; void main( void ) { long l; float fp; char s[81];
char c; stream = fopen( "fscanf.out", "w+" ); if( stream == NULL ) printf( "The file fscanf.out was not opened\n" ); else

226 fprintf( stream, "%s %ld %f %c", "Leonardo Dicaprio",
L, f, 'q' ); fseek( stream, 0L, SEEK_SET ); fscanf( stream, "%s", s ); fscanf( stream, "%ld", &l ); fscanf( stream, "%f", &fp ); fscanf( stream, "%c", &c ); printf( "%s\n", s ); printf( "%ld\n", l ); printf( "%f\n", fp ); printf( "%c\n", c ); fclose( stream ); }

227 오늘의 해결과제 File에 저장된 내용을 16진수로 출력하는 프로그램을 만드시오. (출력예)
What is the name you want to dump? test.dat test.dat: E 63 6C C F 2E 68 3E 0D 0A 0D 0A 2F 2A 0D 0A 2F 2F F F D 0A 23 64 E E D 0A E

228 Standard Functions #2 char *fgets( char *string, int n, FILE *stream ); int fputs( const char *string, FILE *stream ); size_t fread( void *buffer, size_t size, size_t count, FILE *stream ); size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream ); int feof( FILE *stream ); int ferror( FILE *stream );

229 fgets void main( void ) { FILE *file; char buffer[256];
if( (file = fopen( "stdfunc.c", "r" )) != NULL ) if( fgets( buffer, 256) == NULL) printf( "fgets error\n" ); else printf( "%s", line); fclose( file ); }

230 fputs void main( void ) { FILE *file;
if( (file = fopen( "stdfunc.out", “r" )) != NULL ) if( fputs( "Hello world from fputs.\n" ) = EOF) printf( "fputs error\n" ); fclose( file ); }

231 fread & fwrite void main( void ) { int i, nread, nwritten; FILE *file;
char buf[30]; // There should be 2 badly coded statements. if( (file = fopen( "stdfunc.out", "w+" )) != NULL ) for ( i = 0; i < 10; i++ ) buf[i] = 'A' + i; nwritten = fwrite( buf, sizeof( char ), 10, file ); printf( "Wrote %d items\n", nwritten ); }

232 else printf( "Problem opening the file\n" ); fclose( file ); if( (file == fopen( "stdfunc.out", "r+" )) != NULL ) { nread = fread( buf, sizeof( char ), 10, file ); buf[10] = 0; printf( "Number of items read = %d\n", nread ); printf( "Contents of buffer = %.20s\n", buf ); } printf( "File could not be opened\n" );

233 feof & ferror void main( void ) { int count, total_bytes = 0;
char buffer[256]; FILE *file; if( file = fopen( "stdfunc.c", "r" ) ) while( feof( file ) ) count = fread( buffer, sizeof( char ), file );

234 if( !ferror( file ) ) { perror( "Read error" ); break; } total_bytes += count; printf( “Bytes read : %d\n", total_bytes ); fclose( file );

235 오늘의 해결과제 이름과 주소를 10개 입력받아서 파일에 저장하시오. (예) 홍길동 XX도 XX시 XX구 XX동 XXX-XXX호
저장된 10개의 주소를 파일로부터 읽어서 출력하시오.

236 오늘의 과제 파일을 읽어서 단어의(word) 갯수를 출력하는 프로그램을 만드시오.
파일을 읽어서 알파벳 별로 빈도수를 출력하는 프로그램을 만드시오

237 Dynamic memory #1 #include <stdio.h> #include <stdlib.h>
main() { int *x; int n; x = malloc(1000 * sizeof(int)); if (x = NULL) printf(“메모리 할당 실패”); exit(0); }

238 for(n = 0; n <= 1000; n++) { *x = n; x++; } x = 1000; for(n = 0; n <= 1000; n++){ printf("\nx[%d] = %d", n,*x); free(x);

239 Dynamic memory #2 #include <stdio.h> #include <stdlib.h>
void main() { int *p; int n; p = malloc(1000 * sizeof(int)); if (p == NULL) printf("메모리 할당 실패"); exit(0); }

240 for(n = 0; n <= 1000; n++) { p+n = n; } for(n = 0; n <= 1000; n++){ printf("p[%d] = %d ", n, p+n); free(p);

241 Dynamic memory #3 #include <stdio.h> #include <stdlib.h>
void main() { #define MAXX 16 #define MAXY 10 int i, j; int* p; p = malloc(MAXX*MAXY);

242 for(i = 0; i < MAX; i++)
{ for(j = 0; j < MAXY; j++) p+i*MAXX+j = MAXX*i+j; printf("%4d ", p+i*MAXX+j); }

243 오늘의 해결과제 동적 메모리를 할당하여 배열로 해결한 소수(prime number) 구하기 프로그램을 만드시오.
malloc을 사용하여 매개변수로 전달된 메모리의 내용을 복사하여 리턴하는 함수를 만드시오. int a[] = { 1, 2, 3, 4 }; b = mcopy(a, sizeof(a)); free(b);

244 for(i = 0; i < MAXY; i++)
*(q+i) = p+MAXX*i; { for(j = 0; j < MAXX; j++) *(*(q+i)+j) = i * MAXX + j; printf("%4d ", *(*(q+i)+j)); } printf("\n");


Download ppt "C 프로그래밍 - 기본 - 2001 .10.31 비트 캠프."

Similar presentations


Ads by Google