Chapter 15 고급프로그램을 만들기위한 C...
1. main( ) 함수의숨겨진이야기 2. 헤더파일 3. 전처리문과예약어
1. main( ) 함수의숨겨진이야기 main( ) 함수의매개변수
[ 기본 14-1] main( ) 함수에매개변수를사용한예 1 01 #include <stdio.h> 02 03 int main(int argc, char* argv[]) 04 { 05 int i; 06 07 printf(" argc 매개변수 = = > %d \n", argc); 08 09 for(i=0; i<argc; i++) 10 printf(" argv[%d] 매개변수 = = > %s \n", i, argv[i]); 11 } --- 매개변수를지정한다. --- 매개변수의개수를출력한다. --- 매개변수개수만큼반복하며매개변수의내용을출력한다.
[ 응용 14-2] main( ) 함수에매개변수를사용한예 2 01 #include <stdio.h> 02 03 int main(int argc, char* argv[]) 04 { 05 char str[200]; 06 FILE *rfp; 07 08 if ( 1!= 2) 09 { 10 printf("\n -- 매개변수를 1 개사용하세요 --\n"); 11 return 0; 12 } 13 14 fopen_s(&rfp, 2, "r"); 15 16 for( ;; ) 17 { 18 fgets(str, 199, rfp); 19 20 if (feof(rfp)) 21 break; --- 매개변수가하나가아니면메시지를출력한후프로그램을종료한다. --- 첫번째매개변수로넘어온것을읽기모드로연다. --- 무한루프다. ------- 파일의내용을한줄읽어들인다. ------- 파일의끝이면무한루프를종료한다.
[ 응용 14-2] main( ) 함수에매개변수를사용한예 2 22 23 printf("%s", str); 24 } 25 26 fclose(rfp); 27 } -------- 읽을내용을출력한다. --- 파일을닫는다.
2. 헤더파일 헤더파일의이해 *.h라는확장자를사용하는파일 파일에는함수의프로토타입이선언되어있으며구조체등의데이터구조가정의되어있음 예 ) printf( ) 함수 : 프로그램의맨첫줄에 #include <stdio.h> 를썼기때문에 printf( ) 함수를만든적이없지만화면에무언가를출력해주는역할을수행해옴
2. 헤더파일 헤더파일과관련된함수의종류 사용자가만드는헤더파일 사용자가만든헤더파일의이름이 myheader.h 일경우
2. 헤더파일 헤더파일을만드는방법 01 Visual Studio 를실행한뒤 14_3 이라는이름으로프로젝트를생성하고 14_3.c 파일을 생성한다. 02 왼쪽솔루션탐색기의 [14_3] [ 헤더파일 ] 에서마우스오른쪽버튼을클릭한후 [ 추가 (D)] [ 새항목 ] 을선택한다.
2. 헤더파일 03 [ 헤더파일 ] 을선택하고이름에 myheader.h 를입력한후 < 추가 > 를클릭한다. 04 헤더파일의내용에는다음한줄을입력한다. 함수를선언하는것이다. 05 C 소스파일 (14_3.c) 은다음과같이코딩한다.
[ 기본 14-3] 사용자정의헤더파일의사용예 01 #include <stdio.h> 02 03 #include "myheader.h" 04 05 int main( ) 06 { 07 func(10); 08 } 09 10 void func(int num) 11 { 12 printf("%d\n", num); 13 } --- 사용자가만든헤더파일을포함시킨다. --- 함수를호출한다. ---func( ) 함수의내용을정의한다.
2. 헤더파일 하나의파일을여러개의파일로분리하기 파일분리과정 01 Visual Studio를실행한다음 14_4 라는이름으로프로젝트를생성한다. 솔루션탐색기의 [14_4] [ 헤더파일 ] 에서마우스오른쪽버튼을클릭한후 [ 추가 ] [ 새항목 ] 을누른다. 02 중간창에서 [ 헤더파일 ] 을선택하고이름에 f unc.h 를입력한후 < 추가 > 를클릭한다. 03 이번에는솔루션탐색기의 [14_4] [ 소스파일 ] 에서마우스오른쪽버튼을클릭한후 [ 추가 ] [ 새항목 ] 을선택한다. 04 중간창에서 [C++ 파일 ] 을선택하고이름에 main.c 를입력한후 < 추가 > 를클릭한다. 05 같은방식으로 func1.c 와 func2.c 를추가. 최종적으로다음과같이파일 4개가추가됨.
2. 헤더파일
[ 기본 14-4] 함수별로파일을분리하는예 func.h 01 #include <stdio.h> 02 03 void func1( ) ; 04 void func2( ) ; ---func1(), func2() 함수의프로토타입을선언한다. main.c 01 #include "func.h" 02 03 void main( ) 04 { 05 func1( ); 06 func2( ); 07 } --- 직접만든헤더파일을포함시킨다. ---func1(), fun2() 함수를호출한다.
[ 기본 14-4] 함수별로파일을분리하는예 func1.c 01 #include "func.h" 02 03 void func1( ) 04 { 05 printf("func1( ) 함수를실행합니다. \n"); 06 } --- 직접만든헤더파일을포함시킨다. ---func1() 함수내용을정의한다. func2.c 01 #include "func.h" 02 03 void func2( ) 04 { 05 printf("func2( ) 함수를실행합니다. \n"); 06 } --- 직접만든헤더파일을포함시킨다. ---func2() 함수내용을정의한다.
3. 전처리문과예약어 전처리문 실제컴파일전에미리처리되는문장 기존의방대한소스를건드리지않은상태에서부분적인컴파일수행 소스의시작부분에위치하며, # 으로시작 #include, #define, #ifdef, #undef 등 #define 문 소스코드에사용할숫자나문자열, 함수의이름이너무길거나복잡할때한눈에파악하도록쉬운기호로표현함 예 ) 원주율표시 - 3.1415926535
[ 기본 14-5] #define 문의사용예 01 #include <stdio.h> 02 03 #define PI 3.1415926535 04 #define STR " 원의면적을계산했습니다.\n" 05 #define END_MSG printf(" 프로그램이종료되었습니다. \n\n") 06 07 void main( ) 08 { 09 printf(" 반지름이 10 인원의면적은 = = > %10.5f \n", 10*10*PI); 10 11 printf(str); 12 13 END_MSG; 14 } ---상수를 PI로정의한다. ---문자열을 STR로정의한다. ---함수를 END_MSG로정의한다. ---정의한 PI를사용한다. ---정의한 STR을사용한다. ---정의한 END_MSG를사용한다.
3. 전처리문과예약어
3. 전처리문과예약어
3. 전처리문과예약어 예약어 특별한기능을수행하도록프로그래밍언어에서미리정의한것 변수나함수이름에사용할수없음 컴파일러는예약어를변수키워드로인식하므로변수역할을하지못함 const 예약어 #define 과비슷한기능 const 로변수를선언하면해당변수는변수로서의역할을하는것이아니라상수역할을함
3. 전처리문과예약어 const 의사용방법 const 를사용한위의예를 #define 으로바꿈 static 예약어 처음설정된값을초기화하지않고계속유지하게함
[ 기본 14-6] static 예약어의사용예 01 #include <stdio.h> 02 03 void myfunc( ); 04 05 void main( ) 06 { 07 myfunc( ); 08 myfunc( ); 09 } 10 11 void myfunc( ) 12 { 13 static int a = 0; 14 15 a = a + 100; 16 printf("a 의값 = = > %d\n", a); 17 } ---myfunc( ) 함수의프로토타입을선언한다. ---myfunc( ) 함수를두번호출한다. ---static 예약어로 a 변수를선언하고초기화한다. ---a에 100을증가시킨후출력한다.
3. 전처리문과예약어 extern 예약어 다른소스파일에선언된전역변수를현재의소스파일에가져와서사용하고싶을때사용함
[ 기본 14-7] extern 예약어의사용예 1 main.c 01 #include <stdio.h> 02 03 void func( ); 04 05 int a; 06 07 void main( ) 08 { 09 a = 100; 10 11 func( ); 12 } ---func( ) 함수의프로토타입을선언한다. ---전역변수 a를선언한다. ---전역변수에값을대입한다. ---함수를호출한다.
[ 기본 14-7] extern 예약어의사용예 1 func.c 01 #include <stdio.h> 02 03 extern int a; 04 05 void func( ) 06 { 07 printf("extern int a 값 = = > %d\n", a); 08 } --- 변수 a 를외부변수로선언한다. --- 변수 a 값을출력한다.
[ 응용 14-8] extern 예약어의사용예 2 main.c 01 #include <stdio.h> 02 03 void exchange( ); 04 05 int a, b; 06 07 int main( ) 08 { 09 printf("a 의값을입력 : "); 10 scanf_s("%d", &a); 11 printf("b 의값을입력 : "); 12 scanf_s("%d", &b); 13 14 1 ( ); 15 16 printf("\n 바뀐값 a 는 %d, b 는 %d \n", a, b); 17 } ---exchange( ) 함수의프로토타입을선언한다. ---전역변수 a와 b를선언한다. ---전역변수 a에값을입력한다. ---전역변수 b에값을입력한다. ---함수를호출한다. ---결과를출력한다.
[ 응용 14-8] extern 예약어의사용예 2 exchange.c 01 2 02 03 void exchange( ) 04 { 05 int tmp; 06 07 tmp = a; 08 a = b; 09 b = tmp; 10 } --- 변수 a, b 를외부변수로선언한다. --- 두값을교환한다.
[ 예제모음 37] 텍스트파일복사
[ 예제모음 37] 텍스트파일복사 01 #include <stdio.h> 02 03 int main(int argc, char* argv[]) 04 { 05 06 char str[200]; 07 FILE *rfp; 08 FILE *wfp; 09 10 if (argc!= 3) 11 { 12 printf("\n -- 매개변수를 2 개사용하세요 --\n"); 13 return 0; 14 } 15 16 fopen_s(&rfp, argv[1], "r"); 17 fopen_s(&wfp, argv[2], "w"); 18 --- 한행을최대 199 자로제한한다. --- 읽기용포인터와쓰기용포인터변수를선언한다. --- 매개변수가두개가아닌경우프로그램을종료한다. --- 읽기모드의파일을연다. --- 쓰기모드의파일을연다.
[ 예제모음 37] 텍스트파일복사 19 for( ;; ) 20 { 21 fgets(str, 199, rfp); 22 23 if (feof(rfp)) 24 break; 25 26 fputs(str, wfp); 27 } 28 29 fclose(rfp); 30 fclose(wfp); 31 } ---- 무한루프다. ------- 원본파일에서한행을읽어온다. ------- 만약파일의끝이라면 ( 더읽을행이없으면 ) for 문을종료한다. ------- 읽은행을대상파일에쓴다. --- 파일을닫는다.
[ 예제모음 38] static 예약어를활용한구구단출력
[ 예제모음 38] static 예약어를활용한구구단출력 01 #include <stdio.h> 02 03 void gugu( ) 04 { 05 static int dan=1; 06 int i; 07 08 dan++; 09 10 printf("\n\n ** %d 단 **\n", dan); 11 for (i=1; i<=9; i++) 12 { 13 printf("%2d X %2d= %2d \n", dan, i, dan*i); 14 } 15 } 16 17 int main( ) 18 { 19 int i; 20 21 for(i=0; i<8 ; i++) 22 gugu( ); 23 } ---static 예약어로 dan 변수를선언하고초기화한다. ---단을하나씩증가시킨다. ---제목을출력한다. ---각단의구구단을출력한다. ---8번반복해서 gugu( ) 함수를호출한다.
[15 장요약 ] 1 main( ) 함수의매개변수 ➊ 일반함수뿐만아니라 main( ) 함수에도매개변수를사용할수있다. ➋ 실행파일에매개변수를넘겨주기위해서는 main( ) 함수의매개변수를 main(int argc,char* argv[ ]) 와같은형식으로지정해야한다. 2 헤더파일 ➊ C의제일상단에들어가며확장명이 *.h인파일을말한다. ➋ 함수의프로토타입, 구조체등의데이터구조가선언되어있다. ➌ 자주사용하는헤더파일은다음과같다. ➍ 컴파일러가제공해주는헤더파일은 < > 로묶어주고, 사용자가작성한헤더파일은 로묶어준다.
[15 장요약 ] 3 전처리문전처리문이란실제컴파일전에미리처리되는문장으로기존에있는방대한소스코드를건드리지않은상태에서부분적인컴파일을수행한다. 소스코드의맨처음에 # 으로시작한다. 전처리문의종류로는 #include, #define, #ifdef, #undef 등이있다. 4 한파일을여러개의파일로분리소스가너무길어지면관리하기가힘들어지므로여러개의파일로분리해서프로그램을작성한후빌드하는것이좋다.
[15 장요약 ]
[15 장요약 ] 5 예약어 ➊ 예약어란특별한기능을수행하도록프로그래밍언어에서미리정의한것으로, 변수나함수이름으로도사용할수없는단어다. 컴파일러는예약어를변수로인식하지않고키워드로인식한다. ➋ const, static, extern 예약어에대해서는다음표를참조하라.