Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² r p ø û y ó Ñ...

44
10.1 C 언어에서 매개 변수 전달 방식으로 사용하는 방법은? (1) Call by Value Call by Reference Call by Result Call by Name [해설] C 언어에서의 매개 변수 전달방식은 call by value를 사용한다. 10.2 함수에 대한 설명 틀린 것을 모두 고르시오. (3, 6) ① 반환값이 없는 함수를 void함수라 한다. (O) ② 함수의 데이터 형이 생략되면 int형으로 간주한다. (O) 함수의 인자나 인수는 오직 한개만 사용할 있다. ( X) 인자나 인수는 여러 개를 사용할 수 있다. 함수의 데이터 형은 반환값의 데이터 형을 의미한다. (O) ⑤ 함수의 원형을 사용하지 않는 경우라면 main 함수보다 앞서서 정의해야 한다. (O) 함수의 데이터 형과 인자의 데이터 형은 같아야 한다. ( X) 인자가 실수형이지만 함수의 데이터 형은 정수형으로 사용할 수 있다. 10.3 다음에서 expo(3,4)의 반환 값은 무엇인가? (3) #include <stdio.h> int hap(int x, int y, int z, int w); int main(void) { printf("%d\n", hap(3, 4, 5, 6)); return 0; } int hap(int x, int y, int z, int w) { return x+y+z+w; } 36 연습문제 해답 CHAPTER 1 0 연습문제 해답 01 int expo(int a, int b) 02 { 03 int i,s=1; 04 for(i=1;i<=b;i++) 05 s=s*a; 06 return s; 07 } ① 12 ② 27 ③ 81 ④ 256

Upload: others

Post on 26-Dec-2019

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

10.1 C 언어에서매개변수전달방식으로사용하는방법은? (1)

① Call by Value ② Call by Reference

③ Call by Result ④ Call by Name

[해설] C언어에서의매개변수전달방식은 call by value를사용한다.

10.2 함수에대한설명중틀린것을모두고르시오. (3, 6)

①반환값이없는함수를 void형함수라한다. (O)

②함수의데이터형이생략되면 int형으로간주한다. (O)

③함수의인자나인수는오직한개만사용할수있다. (X)

인자나인수는여러개를사용할수있다.

④함수의데이터형은반환값의데이터형을의미한다. (O)

⑤함수의원형을사용하지않는경우라면main함수보다앞서서정의해야한다. (O)

⑥함수의데이터형과인자의데이터형은같아야한다. (X)

인자가실수형이지만함수의데이터형은정수형으로사용할수있다.

10.3 다음에서 expo(3,4)의 반환값은무엇인가? (3)

#include <stdio.h>int hap(int x, int y, int z, int w);int main(void){printf("%d\n", hap(3, 4, 5, 6));return 0;}int hap(int x, int y, int z, int w){return x+y+z+w;}

36

연습문제해답

CHAPTER10 연 습 문 제 해 답

01 int expo(int a, int b)02 { 03 int i,s=1;04 for(i=1;i<=b;i++)05 s=s*a;06 return s; 07 }

①12

②27

③81

④256

Page 2: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

반복문은위와같이처리하므로 3을네번곱한결과 81을반환함.

10.4 구구단에서 출력을 원하는 단을 입력하면 해당 단을 출력하는 다음 프로그램의

함수정의부분을완성하시오.

10.5 다음프로그램에대해절대값(absolute value)을계산하는부분을사용자정의함

수 absolute() 로작성하시오. 단, 반환값의데이터형은정수형으로가정합니다.

37

연습문제해답

for(i=1;i<=4;i++)s=s*3;

#include <stdio.h>void gugudan(int k);int main(void){int dan;printf("원하는단을입력>");scanf("%d", &dan);gugudan(dan);return 0;

}

void gugudan(int k){int i;for(i=1; i<=9; i++)

printf("\n%d*%d=%2d", k, i, k*i);}

실행결과

#include <stdio.h>int main(void){int num1, num2;printf("정수를입력하고 Enter>");scanf("%d", &num1);if (num1<0)

num2=-num1;printf("\n%d의절대값 %d", num1, num2);return 0;

}

int absolute(int abs){if (abs<0)

abs=-abs;return abs;

}

실행결과

Page 3: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

10.6 숫자 n을 입력하면 1부터 n까지의곱셈결과(n의 계승, n factorial)를 출력하는

프로그램을 함수 factorial()로 작성하여 다음의 프로그램을 완성하시오. 단, 함

수 factorial()의 데이터형은 double로 간주합니다.

10.7 입력한 년도가 윤년인지 또는 평년인지를 판별하는 부분을 함수(IsLeapYear)로

작성하여프로그램을완성하시오. (연습문제 7.8 참고)

38

연습문제해답

#include <stdio.h>double factorial(int n);int main(void){

int n;printf("\n n!을계산합니다. ");printf("\n n을입력하고 Enter");scanf("%d", &n);printf("\n n!=%.lf", factorial(n));return 0;

}

double factorial(int k){double product=1;int i;for(i=1; i<=k; i++)product=product*i;return product;}

실행결과

#include <stdio.h>int IsLeapYear (int y);int main(void){int year;printf(“연도를입력하세요:”);scanf(“%d”, &year);

printf(“\n %d년은 ”);if (IsLeapYear(year))

printf(“윤년입니다. ”);else

printf(“평년입니다. ”);return 0;

}

int IsLeapYear(int y){if((y%4==0 && y%100!=0) || y%400==0)

return 1;else

return 0;}

실행결과

Page 4: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

[추가문법]

10.8 다음프로그램의실행결과로출력되는것은? (2)

실행결과는②번과같이출력되는데그이유는 square(y+1)=y+1*y+1로계산됨.

10.9 다음프로그램의실행결과를예측하시오.

함수 number()는재귀함수로서인자에대한 2진수값을반환함.

39

연습문제해답

01 #include <stdio.h>02 #define square(x) x*x03 int main(void)04 {05 int y=4;06 printf("%d %d\n",square(y), square(y+1));07 return 0;08 }

①16 25

② 16 9

③ 16 17

④ 16 16

01 #include <stdio.h>02 int number(int i);03 int main(void)04 {05 number(6);06 return 0;07 }08 int number(int i)09 {10 if (i==0)11 return i;12 else13 number(i/2);14 printf("%d", i%2);15 }

실행결과

Page 5: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

11.1 지역변수와전역변수에대해바르게설명한것을모두고르시오. (3, 5)

①지역변수의선언위치는함수내부이거나외부일수있다. (X)

지역변수의위치는항상함수내부에서선언되어야한다.

②하나의프로그램에서같은이름의전역변수가존재할수있다. (X)

③전역변수는프로그램이종료되면사라진다. (O)

④지역변수보다는전역변수의사용이선호된다. (X)

많은지역변수를사용하면프로그램의관리나수정이복잡해질수있다.

⑤전역변수는자동적으로0으로초기화된다. (O)

지역변수는자동적으로 0으로초기화되지않으므로필요한경우초기화를해

야한다.

11.2 내부정적변수와외부정적변수에대한설명중틀린것은? (2)

①내부정적변수는지역변수의역할을한다. (O)

②외부정적변수는전역변수로서모든프로그램에서사용이가능하다. (X)

프로그램파일내부에서만전역변수의역할을한다.

③정적변수는자동적으로0으로초기화된다. (O)

④정적변수의구분은선언위치가함수내부인가외부인가로구분한다. (O)

11.3 다음의기억클래스중에서데이터가실제저장될위치가다른것은? (4)

①static ② extern

③auto ④ register

기억클래스는모두주기억장치(RAM)에위치하나 register는 register에위치함.

11.4 변수에대한기억클래스를생략하면어떤클래스로간주되는가? (3)

①static ② extern

③auto ④ register

40

연습문제해답

CHAPTER11 연 습 문 제 해 답

Page 6: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

11.5 다음프로그램의실행결과는? (4)

line 10의 x는 line 04의 x에 향을받으므로 0으로출력됨.

41

연습문제해답

01 #include <stdio.h>02 int main(void)03 {04 int x=0;05 {06 int x=2;07 printf("%d", x);08 x+=3;09 }10 printf("%d", x);11 return 0;12 }

실행결과

①25

②00

③22

④20

Page 7: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

12.1 헤더파일과포함된함수들의기능이잘못연결된것은? (4)

① stdio.h표준입출력 ② string.h문자열처리

③ math.h수학관련함수 ④ dos.h메모리관리

12.2 다음중바르게설명한것을모두고르시오. (2, 3, 4)

① scanf()를이용하여문자열을입력받을때공백도처리한다.

scanf()는공백이전의문자열만입력받음. gets()는공백도포함함.

②라이브러리함수를사용하려면헤더파일이필요하다. (O)

③문자열의마지막은 NULL이포함된다. (O)

④문자열을저장할때문자형배열이나포인터를사용한다. (O)

⑤한 한 자도 문자와마찬가지로 1 byte크기로처리된다.

한 한 자는 2 byte

⑥함수 fflush()는메모리에저장된모든변수의데이터를지운다.

fflush()는버퍼의내용을비운다.

12.3 다음프로그램의실행결과를예측하시오.

42

연습문제해답

CHAPTER12 연 습 문 제 해 답

#include <stdio.h>#include <ctype.h>int main(void){

char ch='A';printf("%d", isalnum(ch));printf("%d", isalpha(ch));printf("%d", isascii(ch));printf("%d", isdigit(ch));printf("%d", isupper(ch));return 0;

}

#include <string.h>#include <stdio.h>int main(void){

char *a="Visual c++", b[6]="Turbo";printf("%d \n", strlen(a));printf("%d \n", strcmp(a,b));printf("%s \n", strlwr(b));printf("%s \n", strupr(a));return 0;

}

실행결과Turbo C/C++의 결과

Visual C/C++의 결과

Page 8: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

12.4 다음과 같이 10개의 구구단 문제를 함수 rand()를 이용하여 출력하는 프로그램

을작성하시오.

12.5 숫자를문자열로변환하고, 문자열의길이를출력하는다음프로그램을완성하시오.

12.6 컴퓨터의 시간을 현재 시간으로 설정한 다음 우리나라와 뉴질랜드(웰링턴)의 현

재시간을 출력하는 다음 프로그램의 빈칸을 완성하시오. 뉴질랜드(웰링턴)는 우

리나라의동쪽에위치해있고 3시간의시차가있습니다.

43

연습문제해답

01 #include <stdio.h>02 #include <time.h>03 int main(void)04 {05 int i, x, y;06 srand(time(NULL));07 for(i=1;i<=10;i+=1)08 {09 x=rand()%9+1;10 y=rand()%9+1;11 printf("%d*%d=?\n", x, y);12 }13 }

실행결과

01 #include <stdio.h>02 #include <stdio.h>03 #include <stdio.h>04 int main(void)05 {06 long num=9876543;070809 printf(“정수:%d, 문자열:%s\n”, num, s);10 printf(“숫자의길이:%d\n”, );11 return 0;12 }

strlen(s);

ltoa(num2, s, 10);

char s[25];

Page 9: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

12.7 4자리 숫자 복권번호를 출력하는 프로그

램을 작성하시오. 복권번호의 최소값은

1000이고 최대값은 9999입니다. 프로그

램을 실행하고 임의의 키를 누르면 그림과

같이 임의의 4자리 복권번호가 출력되도

록작성하시오.

44

연습문제해답

01 #include <stdio.h>02 #include <time.h>03 #include <conio.h>04 int main(void)05 {06 int i;07 time_t t1. t2;08 t1 = time(NULL);09 printf(“대한민국(서울) : \n%s”, ctime(&t1));1011 printf(“뉴질랜드(웰링턴) : \n%s”, ctime(&t2));12 return 0;13 }

t2=t1+3*60L*60L;

실행결과

01 #include <stdio.h>02 #include <stdlib.h>03 #include <time.h>04 #include <conio.h>05 int main(void)06 {07 int i;08 time_t t;09 srand(time(NULL));10 printf("복권추첨을시작합니다. \n");11 printf("준비되었으면아무키나누르세요.\n");12 printf("아무키나누르면번호가출력됩니다.\n\n");13 printf("천백십일 \n");14 while(!kbhit())15 {16 }17 printf("%2d", rand()%9+1);18 printf("%2d", rand()%10);19 printf("%2d", rand()%10);20 printf("%2d", rand()%10);21 printf("\n당첨번호를확인하세요.");22 return 0;23 }

Page 10: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

12.8 A부터 Z까지 임의의 문자 100개를 함수 rand()로

생성하여출력하고, 어떤 문자가몇개생성되었는

지를 계산하여 빈도수를 출력하는 프로그램을 작

성하시오.

12.9 각도가 0도에서 360도까지 15도씩증가할때함수 sin() 값과 sine 그래프를다

음과같이출력하는프로그램을작성하시오.

45

연습문제해답

01 #include <stdio.h>02 #include <stdlib.h>03 #include <time.h>04 int main(void)05 {06 int i, rnd;07 char alpha[26]={0};08 srand(time(NULL));09 printf("임의의대문자\n");10 for(i=1;i<=100;i++)11 {12 rnd=rand()%26;13 printf("%c", rnd+65);14 if (i%20==0)15 printf("\n");16 alpha[rnd]+=1;17 }18 printf("\n문자와빈도수 \n");19 for(i=0;i<26;i++)20 {21 printf("%c : %2d ", i+65, alpha[i]);22 if ((i+1)%3==0)23 printf("\n");24 }25 return 0;26 }

Page 11: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

[프로그램설명]

sine값에따라공백을만들고이후에 '*'를출력합니다. sin(00)=0이므로공백

은 11개(for(j=0;j<=10;j++)를출력하고나서 '*'를출력하고, sin(450)=0.71

이므로공백은 18개(for(j=0;j<=17;j++)를출력하고나서 '*'를출력합니다.

46

연습문제해답

01 #include <stdio.h>02 #include <math.h>03 #define PI 3.14159204 int main(void)05 {06 int i , j ;07 double sine;08 for(i=0 ; i<=360 ; i+=15)09 {10 sine=sin((double)i*PI/180);11 printf("sin(%3d)= %5.2f", i,sine);12 for(j=0 ;j<=(int)(sine*10+10);j++)13 printf(" ");14 printf("* \n");15 }16 return 0;17 }

실행결과

프로그램line

프로그램 설명

03 #define PI 3.141592 매크로상수 PI는 3.141592

10 sin((double)i*PI/180); 각도를라디안(radian)으로 변경

12

for(j=0;j<=(int)(sine*10+10);j++)

printf(" ");

sine값은 -1에서 1사이이므로그래프로표시하기위해 0에서 20사이의범위로변환. sine값이 0이면변환값은 11(0부터 10까지)이 된다. 순환문에서변환된값의크기만큼공백을출력한다음 '*'을 출력. 이를자세히나타내면다음과같습니다.

공백위치

sine 값0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

sine=0 (00) 공백 *sine=0.7 (450) 공백 *sine=1 (900) 공백 *sine=-1 (2700) 공백 *

Page 12: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

12.10 생년월일을입력하면만나이를계산하는프로그램을작성하시오. 현재의날짜를

기준으로하되함수 localtime()을 이용하시오.

만 나이 = (현재 년도-생년)-(생일이지났으면 0, 생일이지나지않았으면 1)

47

연습문제해답

01 #include <time.h>02 #include <stdio.h>03 int main(void)04 {05 int birthy, birthm, birthd;06 time_t curr;07 struct tm *d;08 curr=time(NULL);09 d=localtime(&curr);10 printf("생년을입력하고 Enter하시오.>");11 scanf("%d",birthy);12 printf("생월을입력하고 Enter하시오.>");13 scanf("%d",birthm);14 printf("생월을입력하고 Enter하시오.>");15 scanf("%d",birthd);16 printf("현재날짜\n");17 printf("%d년%d월%d일\n",d->tm_year+1900,d->tm_mon+1, d->tm_mday);18 printf("입력된날짜\n);19 printf("%d년%d월%d일\n",birthy, birthm, birthd);20 diffy=birthy-d->tm_year+1900;21 diffm=birthm-d->tm_mon+1;22 diffd=birthd-d->tm_mday;23 if (diffm<=0 && diffd<=0)24 diffy++; 25 printf("만나이 : %d\n", diffy);26 return 0;27 }

Page 13: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

13.1 다음의배열의초기화중오류가있는것은? (3)

① int korea[5];

② int korea[ ]={2, 4, 9, 6};

③ int korea[3]={2, 4, 9, 6};

④ int korea[5]={2, 8};

[해설] 배열을초기화할경우배열의크기는데이터의개수와일치해야합니다. 그

러나배열의크기>데이터의개수라면나머지요소는 0으로초기화되고, 배열의크

기<데이터의개수이면컴파일오류가발생합니다.

13.2 다음배열의초기화중오류가있는것은? (2)

① char c[5]="test"; ② char c[2]="test";

③ char c[7]="test"; ④ char c[ ]="test";

[해설] 1차원배열을초기화할경우에배열의크기는생략할수있습니다. 문자열

을문자형배열에저장하는경우실제문자의개수보다한개더크게배열의크기

를잡아야합니다. 그러나②의경우에는문자의개수(4)보다배열의크기(2)가적

으므로컴파일오류가발생합니다.

13.3 다음중배열의선언중오류가있는것은? (3)

① auto int num[8]; ② static int num[8];

③ register int num[8]; ④ extern int num[8];

[해설] 레지스터변수는주기억장치가아닌처리속도가상대적으로빠른레지스터

를사용하므로기억클래스중에서가장빠른처리를하지만CPU 레지스터의숫자

는제한이있으므로 2, 3개정도만사용할수있습니다. 레지스터변수는크기에도

제한이있기때문에 char 형, int형으로만사용하며배열을선언할수없습니다.

13.4 다음프로그램의실행결과를예측하시오.

①#include <stdio.h>int main(void){

int arr[7]={11, 22, 33, 44, 55, 66, 77};int i;for(i=1; i<=6; i=i+2)printf("%d\n", arr[i]);

return 0;}

48

연습문제해답

CHAPTER13 연 습 문 제 해 답

실행결과

224466

Page 14: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

반복문의 제어변수 i는 1부터 2씩 증가하므로 arr[1], arr[3], arr[5]의 값을

출력합니다.

배열을 초기화할 경우 배열의 크기는 데이터의 개수와 일치해야 합니다. 그러나

배열의크기>데이터의개수라면나머지요소는 0으로초기화되고, 배열의크기<

데이터의개수이면컴파일오류가발생합니다.

%c는문자형을출력하는형식지정자이고, %d는정수형을출력하는형식지정자로

서이문제에서는 %d부분에각문자에대한 ASCII코드가출력됩니다.

제어변수 i는 2에서 0으로감소하지만배열의첨자는 d[2-i]로되어있기때문에

0부터 2까지변화합니다.

#include <stdio.h>int main(void){

double d[3]={0.1, 0.2, 0.3};int i;for(i=2;i>=0;i--)printf("%.1f\n", d[2-i]);

return 0;}

#include <stdio.h>int main(void){

char ch[9]="cprogram";int i;for(i=0; i<8; i++)printf("%c : %3d\n", ch[i], ch[i]);

return 0;}

#include <stdio.h>int main(void){

int arr[3]={0};int i;for(i=0; i<3; i++)printf("%d", arr[i]);

return 0;}

49

연습문제해답

실행결과

0 0 0

실행결과

0.10.20.3

실행결과

Page 15: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

13.5 다음의 야구 경기 스코어를 각각 배열에 저장한 다음 스코어를 회수별로 출력하

고, 점수의합을출력하는프로그램을작성하시오.

대한민국과 일본의 스코어를 각각 정수형 배열 korea[9]와 japan[9]에 저장하

고반복문에의해값을누적하여출력합니다.

13.6 주민등록번호의 앞부분 6자리를 다음 그림과 같이 문자열로 입력하여 년월일을

분리해서출력하는프로그램을작성하시오.

[해설] 주민등록번호 중 앞부분 6자리를 문자열로 입력받아야 하므로 char

num[7];로선언하여입력을받습니다. 문자열로입력된숫자를분리하는방법에

50

연습문제해답

회 1 2 3 4 5 6 7 8 9Korea 0 0 0 0 1 0 0 2 0Japan 1 1 0 0 0 0 0 0 0

#include <stdio.h>int main(void){int korea[9]={0,0,0,0,1,0,0,2,0};int japan[9]={1,1,0,0,0,0,0,0,0};int i, sumk=0, sumj=0;printf("야구스코어\n\n");printf("회\t 1 2 3 4 5 6 7 8 9 Run\n");printf("Korea\t");for(i=0;i<9;i++){

sumk+=korea[i];printf("%2d", korea[i]);

}printf("%3d\n", sumk);

printf("Japan\t");for(i=0;i<9;i++){

sumj+=japan[i];printf("%2d", japan[i]);

}printf("%3d\n", sumj);

return 0;}

Page 16: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

는다음과같은방법이있습니다.

[방법1] 문자열을다시숫자로변환. 즉, 함수atof()나atol()을이용[예제12-16]

[방법2] 문자를하나씩읽어 ASCII코드로변환하고두자리의정수로변환

[방법2]의경우예를들어 char num[7]="871209";라면연도는다음의방법으로

1987로계산됩니다.

연도= (num[0]-48)*10+num[1]-48+1900;

즉, 문자 '8'의 ASCII 코드는 56이므로 48을빼서정수 8로만들고여기에 10을

곱하여 10의 자리수로 만듭니다. 이어서 다음 문자 '7'은 1의 자리이므로

num[1]-48로계산하고마지막으로 1900을더하는방법을사용합니다.

[추가문법]

13.7 2행 3열의 정수형 2차원 배열로 선언된 배열 t에 대하여 1행 2열의 원소에 3을

기억시키는것은? (4)

① t(1,2)=3; ② t[1,2]=3;

③ t(0)(1)=3; ④ t[0][1]=3;

13.8 다음 프로그램의 출력결과가 [그림]과 같이 나타나도록 하려면 빈칸의 초기화에

맞는것을모두고르시오. (1, 2)

[해설] 배열에데이터를초기화할경우 C언어는행우선으로초기화를합니다. 따

라서①과②는같은방법으로초기화를합니다.

51

연습문제해답

#include <stdio.h>int main(void){int birthy, birthm, birthd;char num[7];printf("번호입력>");scanf("%s", num);birthy=(num[0]-48)*10+num[1]-48+1900;birthm=(num[2]-48)*10+num[3]-48;birthd=(num[4]-48)*10+num[5]-48;printf("%d년 %d월 %d일생입니다. \n", birthy, birthm, birthd);return 0;}

Page 17: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

13.9 다음배열에대해 a[1][0][1]의 값은? (4)

int a[2][2][2]={1,2,3,4,5,6,7,8}

①3 ②4 ③5

④6 ⑤7 ⑥8

[해설] 초기화에의해 3차원배열 a에저장된값은다음과같습니다.

a[0][0][0]=1, a[0][0][1]=2

a[0][1][0]=3, a[0][1][1]=4

a[1][0][0]=5, a[1][0][1]=6

a[1][1][0]=7, a[1][1][1]=8

13.10 2차원(3×3) 배열에 다음의 내용을 초기화하여 저장하고 출력하고, 그림과 같이

행과열의위치를바꾸어서출력하는프로그램을작성하시오.

[해설] 행과 열의 위치를 바꾸어서 표시하는 행렬을 전치행렬(transpose

matrix)이라합니다. 이것은중첩된반복문의출력에서첨자제어변수의위치를

matrix[i][j]에서 matrix[j][i]로바꾸어줌으로해결할수있습니다.

#include <stdio.h>int main(void){int a[2][3]= , i, j;

for(i=0; i<2;i++){for (j=0;j<3;j++);printf(“%d”, a[i][j]);

printf(“\n”);}return 0;

}

실행결과

①{1,2,3,4,5,6}

② {{1,2,3,}, {4,5,6}}

③ {{1,2}, {3,4}, {5,6}}

④ {{1,3,5} {2,4,6}}

52

연습문제해답

1 2 34 5 6

Page 18: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

13.11 금액을 입력하면 다음의 그림과 같이 화폐 단위별로 화폐의 개수를 출력하는 프

로그램을작성하시오.

53

연습문제해답

#include <stdio.h>int main(void){int matrix[3][3]={2, 4, 6, 8, 10,

12, 14, 16, 18};int i, j;printf("original matrix\n");for(i=0;i<3;i++){for(j=0;j<3;j++)printf("%2d", matrix[i][j]);

printf("\n");}printf("\ntranspose matrix\n");for(i=0;i<3;i++){for(j=0;j<3;j++)printf("%2d", matrix[j][i]);

printf("\n");}return 0;}

실행결과

#include <stdio.h>int main(void){long money, i, num;long money_unit[]={10000, 5000, 1000,

500, 100, 50, 10};printf("금액을입력하고 Enter>");scanf("%ld", &money);printf("\n화폐단위 \n");for(i=0; i<=6;i++){num=money/money_unit[i];printf("%5ld원권 : %3ld \n", money_unit[i], num);money=money-num*money_unit[i];}return 0;

}

실행결과

Page 19: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

[해설] 우선화폐단위를다음과같이배열에저장합니다. 금액을입력하면나눗셈

연산자 /를사용하여화폐별단위의개수를출력하고나서원래의금액에서앞서

계산된화폐단위별개수의금액을빼주고다시다음단계의화폐단위를계산하

는방법을반복합니다. [예제05-02]를참고하세요.

13.12 문자열로 입력된 문장에 대해 알파벳 별로 몇 개의 문자가 입력되었는지를 카운

트를 하는 프로그램을 작성하시오. 문장에는 알파벳 외에 숫자나 특수기호 그리

고 공백(space bar)이 사용되는데 이들은 모두 기타 문자로 카운트하시오. 단,

알파벳 문자는 대소문자 구분 없이 카운트하고, 입력할 문장은 공백을 포함하여

최대 99자로가정합니다.([과제 19] 참고)

[해설] 예를들어 ASCII 코드로 'A'에대한 10진수는 65, 'a'는 97에해당하므로

이 값을 적절히 변환하여 배열의 첨자로 계산한 다음 배열에 누적하여 처리합니

다. 즉, 문자 'A'에 대해 'A'-65는 0이므로 chr[0] 배열에 누적하고, 소문자인

'a'는 'a'-97=0으로변환하여 chr[0]에누적합니다.

54

연습문제해답

#include <stdio.h>int main(void){char ch[100]={0};int chr[26]={0}, i, nchr=0;printf("문장에서알파벳과기타문자 count\n\n");printf("문장을입력하고 Enter\n");printf("문장>");gets(ch);for(i=0; ch[i]!=0 ; i++){if( ch[i]>=65 && 90>= ch[i])

chr[ch[i]-65]+=1;else if (ch[i]>=97 && 122>= ch[i])

chr[ch[i]-97]+=1;else

nchr+=1;}printf("\n결과\n");printf("알파벳 count\n");for(i=0; i<26 ; i++){if (chr[i]==0)

continue;printf("%c \t %d\n", i+65, chr[i]);}printf("기타\t %d", nchr);return 0;}

실행결과

Page 20: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

13.13 공백 없이 10개 이하의 문 소문자를 하나의 문자열로 입력받아 각각의 ASCII

코드값을더한값을출력하는프로그램을작성하시오. 예를들어문자열“aaa”가

입력되었다면 a의 ASCII 코드가 97이므로 291(97×3)을 출력합니다.

[해설] 문자열이입력되면우선문자열의길이를함수 strlen()로계산하고, 문자

별로읽어들여 ASCII 코드의값을누적합니다.

55

연습문제해답

#include <stdio.h>#include <string.h>int main(void){char str[11];int i, len, sum;printf("소문자문자열입력후 Enter>");scanf("%s", str);len = strlen(str);sum = 0;for(i = 0; i < len; i++)sum += str[i];printf("합계 : %d\n", sum);return 0;}

실행결과

Page 21: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

14.1 int x;로선언된변수 x에대해서 &x는무엇을의미하는가? (2)

① x에저장된데이터 ② x의기억장소번지

③ x가가리키는곳의데이터 ④ x에대입된값

14.2 다음과같이변수를선언하 을때 *po+3과 *(po+3)의값으로옳은것은? (2)

① 13, 20 ② 13, 40 ③ 23, 30

④ 23, 40 ⑤ 13, 23

[해설] *po+3은a[0]+3이므로13이며, *(po+3)은a[3]을가리키므로40이됩니다.

14.3 다음과같이변수를선언했을때값이다른것은? (1)

① *a+1 ② a[1] ③ *(a+1)

④ *++pt ⑤ *(pt+1)

[해설] 배열이름은포인터상수이므로 a는 a[0]의주소를가리킵니다. 따라서 *a+1

은 a[0]+1과같으므로 4가됩니다. 그리고 *(a+1)는 a[1]을가리키며, *(pt+1)과

같습니다. *++pt는 ++pt; *pt;의순서로처리되므로 a[1]을가리킵니다.

14.4 다음프로그램의실행결과는?

ⓐ#include <stdio.h>int main(void){ int i=15, j=20, *p;p=&i;j=*p;printf("%d",j); return 0;

}

①j의주소 ②15 ③20 ④ i의주소

ⓑ#include <stdio.h>int main(void){

int *p, y[3]={2, 6, 9}, a;p=y;a=*p++;printf("%d", a);printf("%d", *p);return 0;

}

①2 6 ② 2 2 ③6 6 ④ a와y[0]의주소

int a[5]={3,1,4,2,5};int *pt=a;

int a[4]={10,20,30,40};int *po=a;

56

연습문제해답

CHAPTER14 연 습 문 제 해 답

Page 22: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

ⓐ(2)

[해설]

int i=15, j=20, *p;

p=&i; //포인터변수 p는 i의주소를가리킴.

j=*p; //포인터변수 p가가리키는곳의데이터(15)를 j에저장

printf("%d",j);

ⓑ(1)

[해설]

a=*p++의연산을풀어쓰면 a=*p; p++가되므로 a=*p;에의해변수 a에는 y[0]

값이저장되고포인터변수 p는 p++에의해다음주소즉, y[1]의주소를가리킵

니다.

14.5 다음프로그램의실행결과를예측하시오.

[해설] char *p="computer";에의해포인터변수 p는문자열 "computer"가저

장된연속된기억공간중에첫번째문자 'c'가저장된주소를가리킵니다. 이어

서 while문에의해 p가가리키는곳의문자가 NULL인가를판단하여반복을합니

다. 반복문안에서 p가가리키는주소는다음문자가저장된주소로한단위씩증

가할때마다 i의값을증가합니다. 반복문 while은문자열의마지막인 NULL을만

나면반복을중단하므로변수 i에는해당문자열에대해문자의개수를누적합니

다. 따라서문자열 "computer"의문자개수는 8이됩니다.

14.6 다음프로그램의실행결과를예측하고문제에답하시오.

57

연습문제해답

ⓐ#include <stdio.h>int main(void){char *p="computer";int i=0;while(*p != '\0'){i++; p++;

}printf("%d",i);return 0;

}

ⓑ#include <stdio.h>int main(void){char x[3], *p;x[1]='A';p=&x[1];*(p-1)='B';*(p+1)='C';printf("%c %c %c\n",*(p-1),*p,*(p+1));return 0;

}

Page 23: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

[해설] p=&k[0];에의해포인터변수 p에는배열 k의주소가저장됩니다. 따라서

㉠부분에서*p의값은 k[0]의값즉, 1이출력되고, 이어서 p++;에의해 p는다음

주소 즉, k[1]의 주소를 가리킵니다. 따라서 ㉡의 *p는 k[1]의 값을 출력하고,

㉢부분의 *p+1은 k[1]+1의의미이므로 2+1즉, 3이출력됩니다. 이어서㉣부분

의 *(p+1)은현재 p가가리키는곳(&k[1])의다음주소(&k[2])이므로 k[2]의값

3이출력됩니다.

[추가문법]

14.7 다음프로그램의실행결과를예측하시오.

[해설]

*(a[2]+2)에서 a[2]의주소는 a[2][0]의주소를의미합니다. 따라서 a[2]+1은

a[2][1]*의주소를 a[2]+2는 a[2][2]의주소를가리키므로 9가됩니다. (b+1)

배열 a에저장된값a[0][0]=1, a[0][1]=2, a[0][2]=3,a[1][0]=4, a[1][1]=5, a[1][2]=6,a[2][0]=7, a[2][1]=8, a[2][2]=9,

배열 b에저장된값b[0][0]=7, b[0][1]=8, b[0][2]=0,b[1][0]=9, b[1][1]=10,b[1][2]=11,

#include <stdio.h>int main(void){ int a[3][3]={1,2,3,4,5,6,7,8,9};int b[ ][3]={{7,8}, {9,10,11}};printf(" %d \n", a[1][1]); printf(" %d \n",*(a[2]+2)); printf(" %d \n",(*(b+1))[2]);return 0;

}

#include <stdio.h>int main(void){

int k[]={1,2,3,4} ,*p;p=&k[0];

㉠ printf("%d\n",*p);p++;

㉡ printf("%d\n",*p);㉢ printf("%d\n", *p+1);㉣ printf("%d\n",*(p+1));

return 0;}

㉠부분에서출력되는것은? (1)

①1 ② 2 ③ 3 ④ 4

㉡부분에서출력되는것은? (2)

①1 ② 2 ③ 3 ④ 4

㉢부분에서출력되는것은? (3)

①1 ② 2 ③ 3 ④ 4

㉣부분에서출력되는것은? (3)

①1 ② 2 ③ 3 ④ 4

58

연습문제해답

실행결과

5911

Page 24: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

은 b[1][0]의주소를가리키고, (*(b+1))[2]는 b[1][2]를가리킵니다.

14.8 주민등록번호의 앞부분 6자리를 문자열로 입력하면 년월일을 분리해서 출력하

고, 현재나이와생년에대한띠를계산하는프로그램을작성하시오. 현재나이는

(현재 년도-출생년도)로 계산하고, 1900년은 쥐띠해입니다.([연습문제 12.10],

[연습문제 13.6] 참고)

[해설] 띠에해당하는값들을다음과같이포인터문자형변수에초기화하여저장

합니다. 주민등록번호 중 앞부분 6자리를 문자열로 입력받아야 하므로 char

num[7];로선언하여입력을받습니다. 문자열로입력된숫자를분리하는방법에

는다음과같은방법이있습니다. ([연습문제13.5] 참고)

[방법1] 문자열을다시숫자로변환. 즉, 함수atof()나atol()을이용[예제12-16]

[방법2] 문자를하나씩읽어 ASCII코드로변환하고두자리의정수로변환

[방법2]의경우예를들어 char num[7]="871209";라면연도는다음의방법으로

1987로계산됩니다.

연도 = (num[0]-48)*10+num[1]-48+1900;

즉, 문자 '8'의 ASCII 코드는 56이므로 48을빼서정수 8로만들고여기에 10을

곱하여 10의 자리수로 만듭니다. 이어서 다음 문자 '7'은 1의 자리이므로

num[1]-48로계산하고마지막으로 1900을더하는방법을사용합니다.

띠의계산은 1900년이쥐띠해이므로생년에서 1900을뺀값을 12로나눈나머지

를이용하여계산합니다. 나머지가 0이면쥐띠해에해당합니다.

59

연습문제해답

실행결과

#include <stdio.h>int main(void){int birthy, birthm, birthd, day;char *animal[12]={"쥐", "소", "호랑이", "토끼", "용", "뱀",

"말", "양", "원숭이", "닭", "개", "돼지"};char num[7];printf("번호입력>");scanf("%s", num);birthy=(num[0]-48)*10+num[1]-48+1900;birthm=(num[2]-48)*10+num[3]-48;birthd=(num[4]-48)*10+num[5]-48;printf("%d년 %d월 %d일생이고, \n", birthy, birthm, birthd);

Page 25: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

14.9 금액을 입력하면 그림과 같이 화폐 단위별로 화폐의 개수를 출력하는 프로그램

을작성하시오.

[해설] 화폐단위의액수와문자열을다음과같이포인터문자형변수에초기화합

니다. 입력된금액을처리하기위해 long형데이터형을사용합니다. 반복문에의

해입력된금액을화폐단위로나누어가면서단위별개수를계산합니다.

14.10 다음과같은물품의품명과단가를배열에초기화한다음판매한각물품의수량

을입력하면그림과같이물품판매현황을출력하는프로그램을작성하시오.

60

연습문제해답

day=(birthy-1900)%12;printf("%s띠입니다.\n",animal[day]);return 0;}

실행결과

#include <stdio.h>int main(void){long money;long money_unit[]={1000, 500, 100, 50, 10, 5, 1}, i, num;char *unit[]={"만원권", "오천원권", "천원권", "오백원권" ,

"백원권", "오십원권", "십원권"};printf("금액을입력하고 Enter>");scanf("%ld", &money);printf("\n화폐단위\n");money=money/10L;for(i=0; i<=6; i++){num=money/money_unit[i];printf("\n%8s %3d", unit[i], num);money=money-num*money_unit[i];}

}

Page 26: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

[해설] 우선물품단가를표와같이초기화하여저장하고, 물품별수량을입력받아

금액과총액을계산합니다.

61

연습문제해답

#include <stdio.h>int main(void){int i;long cost[5]={135000, 235000, 122000, 260000, 73500};long quantity[5], sum, total=0;char *good[5]={"hard disk", "CPU(intel)", "main board",

"LCD monitor", "DVD-RW(combo)"};

printf("물품판매보고서 \n\n");printf("각품명에대한수량을입력하고 Enter\n");for(i=0; i<=4; i++){

printf("%s: 수량>", good[i]);scanf("%ld", &quantity[i]);

}printf("\n\n물품판매현황");printf("\n물품\t\t단가\t수량\t금액");for(i=0; i<=4; i++){

sum=cost[i]*quantity[i];printf("\n%s\t%7ld\t%3ld %10ld 원", good[i], cost[i], quantity[i], sum);total+=sum;

}printf("\n 총계\t\t\t %12ld 원", total);return 0;

}

품명 단가(원)

하드디스크(300GB) 135,000

CPU(인텔P4) 235,000

메인보드 122,000

모니터(17 LCD) 260,000

DVD-RW 73,500

Page 27: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

15.1 구조체형 user가 있다고할때구조체변수를잘못선언한것은? (5)

① struct user d_1; ② user PERSON;

③ struct user data[10]; ④ struct user *point;

⑤ struct user $amount;

[해설] 구조체변수의이름은일반변수의이름을정의하는규칙과같습니다.

변수이름의첫 자는반드시 문자로시작해야함. (예외 '_')

변수이름에특수문자를사용할수없음.

변수이름중간에공백을사용할수없음.

15.2 다음에서구조체변수의선언이잘못된것을모두고르시오. (2, 3, 5)

15.3 구조체 변수 var에 name이라는 멤버가 있고 멤버 name이 char name[10];으로

정의되었다고가정할때 "kim"을대입하는것으로적절한것은? (4)

① name="kim"; ② *name="kim";

③ var.name="kim"; ④ strcpy(var.name, "kim");

[해설] 멤버가 문자형 배열일 경우에 구조체 변수에 문자열을 대입하려면

strcpy()를사용합니다.

15.4 구조체 변수 var에 name이라는 멤버가 있고 멤버 name이 char *name;으로 정

의되었다고가정할때 "kim"을대입하는것으로적절한것은? (3)

① name="kim"; ② *name="kim";

③ var.name="kim"; ④ strcpy(var.name, "kim");

[해설] 멤버가문자형포인터일경우에는직접문자열의대입이가능함.

① std st1, st2; ② struct st1, st2; ③ std struct st1, st2; ④ struct std st1, st2;⑤ typedef st1, st2;

struct std{

int number;char *name;

};

62

연습문제해답

CHAPTER15 연 습 문 제 해 답

Page 28: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

15.5 다음의구조체형 person 다음에사용할수없는문장은? (4)

[해설] 구조체멤버가문자형배열일경우④번과같이구조체변수에직접데이터

를대입할수없다.

15.6 다음구조체변수 d1의 byte 크기는? (3)

[해설] byte크기: 12 byte + 4 byte + 8 byte = 24 byte

15.7 프로그램의실행결과가다음과같이출력되도록프로그램의빈칸을완성하시오.

[해설] 입력 함수인 scanf()를사용할때변수이름앞에 &(주소 연산자)가 붙는

#include <stdio.h>#include <string.h>struct student{char name[20];int jumsu;

};int main(void){struct student st;printf("이름입력후 Enter");scanf("%s", );printf("점수입력후 Enter");scanf("%d", );printf("이름 : %s \n”, );printf("점수 : %d \n”, );return 0;

}

[실행결과]

① 20 ② 22 ③ 24 ④ 30

struct data{char name[12];long income;double saving;

} d1;

① struct person d={"Park", 18};② strcpy(d.name, "Park");③ scanf("%s", d.name);④ d.name="Park";

struct person{

char name[10];int age;

};

63

연습문제해답

st.name

&st.jumsu

st.name

st.jumsu

Page 29: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

경우와붙지않는경우를구별해야합니다. 일반변수에대해서는 &를붙이지만포

인터나배열은그자체가메모리상의주소를가리키므로 &를사용하지않습니다.

15.8 [부록3]의 <표 5>(행성 데이터)에 대해 각 행성별로데이터를저장하기위해구조

체형 planet을 정의한다고할때각멤버의데이터형과이름을정의하시오.

[추가문법]

15.9 다음중잘못된설명을모두고르시오. (1)

①구조체변수로포인터는사용할수없다.

②구조체안에다른구조체를정의할수있다.

③한기억장소에서로다른data형을사용할수있도록하는것이공용체다.

④ bit field는주소를갖지못하므로포인터를사용할수있다.

[해설] 구조체변수로포인터사용가능

중첩된구조체는구조체내부에서또다른구조체를정의할수있고, 외부에

서정의한구조체를포함하여정의할수있음.

공용체에서는멤버들이기억장소를공용으로사용할수있습니다.

bit field는구조체멤버를 bit단위로처리하므로포인터나배열을사용

할수없음.

64

연습문제해답

행성이름 문이름 지름(km)태양과의거리(km)

궤도속도(km/초)

공전주기(일, 년)

위성수

수성 Mercury 4,878 57,910,000 47.89 87.97(일) 0

금성 Venus 12,103 108,200,000 35.03 224.70(일) 0

지구 Earth 12,756 149,600,000 29.79 365.26(일) 1

화성 Mars 6,786 227,940,000 24.13 686.98(일) 2

목성 Jupiter 142,984 778,330,000 13.06 11.86(년) 16

토성 Saturn 120,536 1,426,980,000 9.64 29.46(년) 18

천왕성 Uranus 51,118 2,870,000,000 6.81 84.01(년) 15

해왕성 Neptune 49,528 4,497,070,000 5.43 164.79(년) 8

명왕성 Pluto 2,284 5,913,520,000 4.74 248.54(년) 1

struct planet{char name[10];long diameter;float distance;float speed;float cycle;char satellite;

}

Page 30: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

15.10 다음의구조체형 person 다음에사용할수없는문장을모두고르시오. (3, 4)

[해설] 구조체멤버가문자형포인터형일경우③, ④번과같이구조체변수에직

접데이터를입력할수없고동적할당을먼저해주어야한다.

15.11 다음의구조체형 person 다음에사용할수없는문장을모두고르시오. (3)

[해설] 구조체변수가포인터일경우에멤버에대한접근은간접연산자->을사용

합니다.

15.12 다음프로그램의실행결과를예측하시오.

① scanf("%s", pt->name);② strcpy("%s", pt->name);③ (*pt).name="Lee";④ pt->name="Lee";

struct person{char *name;int age;

};struct person d, *pt;pt=&d;

① strcpy((*pt).name, "Choi");② strcpy(pt->name, "Choi");③ scanf("%s", pt.name);④ scanf("%s", pt->name);

struct person{char name[10];int age;

};struct person d, *pt;pt=&d;

65

연습문제해답

#include <stdio.h>struct human{char name01[10];char *name02;

} data01={"Miss Kim", "Mr Park"};struct company{char com_name[10];struct human people;int salary;

} data02={"Choi", "Kim", "Park", 500};int main(void){printf("%s\n", data02.com_name);printf("%s\n", data02.people.name01);printf("%c\n", data01.name01[1]);printf("%d\n ",data02.salary);return 0;

}

실행결과

Page 31: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

[해설] 위의구조체 company는중첩된구조체임.

data02.com_name← "Choi"

data02.people.name01← "Kim"

data01.name01← "Miss Kim"이므로 data01.name01[1]은 두 번째 문

자 'i'를가리킴

data02.salary← 500

66

연습문제해답

Page 32: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

16.1 공용체에대한설명중잘못된것은? (2, 3, 4)

①공용체의선언은 struct대신에 union을사용한다.

②멤버의데이터형중에서가장작은데이터형의기억공간을공유한다.

③공용체는기억공간을공유하지만한멤버의값이바뀌어도다른멤버에는 향

을주지않는다.

④공용체변수에대한초기화에서각멤버별로값을초기화할수있다.

⑤공용체멤버들의데이터형은구조체멤버와같은방법으로정의할수있다.

[해설] 공용체의기억공간은멤버의데이터크기중에서가장큰테이터형크기로

정해집니다. 공용체는기억공간을공동으로사용하기때문에하나의멤버값이바

뀌면나머지멤버들의값도동시에바뀌게되므로모든멤버가동시에기억공간을

사용할수없고, 한번에단하나의멤버만기억공간을사용할수있습니다. 그러

므로공용체변수의초기화도어떤멤버에대해서든하나의데이터만사용합니다.

16.2 다음프로그램의실행결과는?

[해설] 공용체변수 data는멤버중에서가장큰데이터형의크기를가지므로 4

byte의크기(char ch2[4];)를가지며이크기를서로공동으로사용합니다.

strcpy(data.ch2, "ABC");가실행된결과메모리에저장된내용은다음과같

습니다. 메모리공간의 은 1 bit의크기를나타냅니다. 제일왼쪽의 byte를상

위 바이트라 가정합니다. 문자 'A'는 이진수로 01000001이며, 문자 'B'는

01000010, 문자 'C'는 01000011입니다.

67

연습문제해답

CHAPTER16 연 습 문 제 해 답

01 #include <stdio.h>02 #include <string.h>03 union univar04 {05 char ch1;06 char ch2[4];07 };08 int main(void)09 {10 union univar data;11 strcpy(data.ch2, "ABC");12 data.ch1='D';13 printf("%s\n", data.ch2);14 return 0;15 }

DBC

실행결과

Page 33: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

메모리공간

그런데 data.ch1=’D’;의결과는

메모리공간

따러서 DBC가출력됩니다.

16.3 다음프로그램의실행결과는?

[해설] 열거형은구조체나공용체와같이사용자가정의하는또다른형태의데이

터형으로서상수들의집합을정수형으로대신하여표현합니다. 열거형변수를선

언하는형식은다음과같습니다.

열거형은키워드 enum을사용하며 tag_name은상수들의집합을대표하는이름입

니다. 예를들어요일을상수로사용한다면다음과같이열거형 week이라는데이

터형을선언할수있으며 card01은열거형변수를나타냅니다.

enum card {spade, diamond, heart, clover};

enum card card01;

상수 list 중의첫번째부터 0으로시작해서 1씩증가하는정수상수값이상수로

사용됩니다. 따라서 space는상수 0을, clover는상수 3을갖습니다.

16.4 다음의프로그램에대해답하시오.

68

연습문제해답

0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0

data.ch2[0] data.ch2[1] data.ch2[2]

A B C NULL

0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0

data.ch2[10]data.ch1 data.ch2[1] data.ch2[2]

D B C NULL

#include <stdio.h>enum card {spade, diamond, heart, clover};int main(void){enum card card01;card01=heart;printf("card01 : %d\n", card01);printf("card01 : %d\n", diamond);printf("card01 : %d\n", spade);return 0;

}

card01 : 2card01 : 1card01 : 0

실행결과

Page 34: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

③멤버의데이터에따라다음과같이멤버 sex가 0이면“남자”, 1이면“여자”로,

drinking이 1이면“음주자”로, smoking이 1이면“흡연자”, marriage가 1이

면“기혼자”로출력되도록프로그램을수정하시오.

나이 : 24성별 : 남자음주여부 : 음주흡연여부 : 흡연결혼여부 : 미혼

69

연습문제해답

#include <stdio.h>struct patient {char age;unsigned sex : 1;unsigned drinking : 1;unsigned smoking : 1;unsigned marriage : 1;

};int main(void){struct patient a={24,0,1,1,0};printf("age :%d\n", a.age);printf("sex :%d\n", a.sex);printf("drinking :%d\n", a.drinking);printf("smoking :%d\n", a.smoking);return 0;

}

#include <stdio.h>struct patient {char age;unsigned sex : 1;unsigned drinking : 1;unsigned smoking : 1;unsigned marriage : 1;

};int main(void){struct patient a={24,0,1,1,0};printf("나이 :%d\n", a.age);if (a.sex==0)

printf("성별 : 남자\n");elseprintf("성별 : 여자\n");

[해설]

① 비트 필드 구조체 변수 a의

크기는? (2 byte)

char 형은 1 byte이고 나머지

는 1 bit 씩 4개의 bit가 요구

되어 1 byte + 4 bit가되지만

최소단위가 byte이므로 변수 a

의크기는 2 byte가됩니다.

②위프로그램의실행결과는?

Page 35: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

16.5 지하철 티켓에 저장되거나 입력될 정보들을 구조체와 비트 필드로 나타낸다면

어떤멤버와데이터형을사용할것인지를나타내시오.

[해설] 출발지와도착지의역정보 : 지하철역의개수가대략400개정도가되므

로역의번호를숫자로구분하려면 int 형을, 문자로구분한다면최소4자리(호선

1자리, 역번호3자리)의문자형이필요하므로5 byte가소요됩니다.

티켓구분: 학생, 일반, 무료(유아, 경로우대)

시간초과여부: 출발시간과도착시간의시간차이계산(3시간이상은초과요금부과)

16.6 국내선 항공권을 예약하는 시스템에 대해 예약자의 정보들을 구조체와 비트 필

드로저장하려면어떤멤버와데이터형을사용할것인지를나타내시오.

[해설] 포함될내용은다음과같습니다.

출발날짜와시간

출발지와도착지의공항정보

왕복여부

좌석구분과번호(business, economy)

개인정보(이름, 성별, 연락처등)

화물정보

할인정보

70

연습문제해답

if (a.drinking==0)printf("음주여부 : 비음주\n");elseprintf("음주여부 : 음주\n");

if (a.smoking==0)printf("흡연여부 : 비흡연\n");elseprintf("흡연여부 : 흡연\n");

if (a.marriage==0)printf("결혼여부 : 미혼\n");elseprintf("결혼여부 : 기혼\n");

return 0;}

Page 36: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

17.1 다음중파일에대한설명으로맞는것을모두고르시오. (1, 2, 3)

①파일입력이나출력을위해서파일열기가먼저이루어져야한다.

②텍스트방식은데이터를 ASCII 코드에대응되는 byte 단위로처리하고, 이진

방식은데이터형(type)에기준하여처리한다.

③파일의입력과출력은스트림(stream)이라고하는공통된인터페이스를사용

한다.

④프로그램에서키보드와화면에대한입력과출력에대해서도파일열기가필요

하다.

⑤텍스트 방식으로 처리할 것인지 이진 방식으로 처리할 것인지는 파일 쓰기와

파일읽기에서결정한다.

[해설] 프로그램에서키보드와화면에대한입력과출력은매우빈번하게일어나

므로파일을 open할필요없이사용이가능하지만디스크상의파일에대한입력

과출력은함수 fopen()을사용하여파일을 open해야만사용할수있습니다.

텍스트 방식으로 처리할 것인지 이진 방식으로 처리할 것인지는 파일 처리의 첫

번째단계인파일열기(open)단계에서구분해줍니다.

17.2 다음설명에대해맞으면 O, 틀리면 X 표시를하시오.

①문자단위의파일입출력함수에는 fgets(), fputs()와같은함수가있다. (X)

[해설] 함수이름뒤의 's'는 string 즉, 문자열단위의처리임을나타낸다.

②함수 fprintf의사용법은맨처음인자가파일포인터가사용된다는것을제외

하고는 printf와사용방법이동일하다. (O)

③함수fscanf()는입력될문자열에포함된공백을포함하여입력받을수있다. (X)

[해설] 함수 fscanf()는 scanf()와마찬가지로입력될문자열에포함된공백을

포함하여입력받을수없으므로 fgets()나 fread()를사용할수있습니다.

④파일입출력에있어서사용하는파일포인터는 FILE 이라는구조체형포인터

다. (O)

⑤고수준의입출력함수는저수준의입출력함수보다사용하기가어렵다. (X)

[해설] C 언어에는파일의입력과출력에관한여러라이브러리함수들이있는데

이들은크게두가지로부류로구분됩니다. 하나의부류는고수준의파일입출력

(high level I/O) 함수이고다른하나는저수준의파일입출력(low level I/O)

함수입니다. 고수준과저수준의차이는버퍼의사용여부에따라구분되지만, 버

퍼를사용하는고수준의입출력함수는저수준의입출력함수보다사용하기가쉽

71

연습문제해답

CHAPTER17 연 습 문 제 해 답

Page 37: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

습니다.

⑥파일접근방법에는순차접근과랜덤접근방법이있다. (O)

⑦순차접근방법은음악이수록된 CD에서특정한곡이있는위치를찾을때사용

하는방법과같다. (X)

[해설] 예를들어음악이기록된카세트테이프와CD가있다고가정할때카세트테

이프는순차처리에, CD는랜덤처리에비유할수있습니다. 즉, 원하는곡을찾는

데있어 CD의경우는그곡이저장된위치의번호만선택하면바로해당위치로

이동하지만테이프의경우에는테이프를계속돌려가며위치를찾아야합니다.

⑧파일포인터가 NULL값을가져야만파일처리가가능하다. (X)

[해설 ]함수 fopen()은파일열기에성공하면유효한파일포인터를, 실패할경우

에는 NULL을반환합니다. 실패할경우의대부분은열려고하는파일이존재하지

않은경우에발생하므로프로그래머는파일처리에있어서이러한오류가발생될

수있다는것을염두에두어야합니다. 실패할경우즉, NULL을반환할경우에는

파일과관련된어떠한작업도처리할수없으므로이경우에는대부분다음과같

이프로그램을종료하는함수 exit()을사용합니다.

17.3 텍스트파일접근방식모드(mode)의 구분을바르게연결하시오.

.

17.4 다음중성격이다른함수는? (4)

① fgets() ② fscanf() ③ fgetc() ④ fputs()

[해설] ④는파일출력함수이고나머지는모두파일입력함수임

17.5 파일접근모드의구분중잘못된것은? (3)

①입력 ②출력 ③순차 ④추가

[해설] 파일의접근방식은입력, 출력그리고추가모드로구분

17.6 다음표의형식대로파일“sample.txt”에 저장하는프로그램을완성하시오.

파일에데이터추가파일읽기파일쓰기

rwa

72

연습문제해답

이름 전화번호

문상훈 015-2745-2233

이준 016-0023-9983

박찬길 014-740-4502

Page 38: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

17.7 문제 17.6에서 생성한파일“sample.txt”를 읽고문자단위로출력하는다음프

로그램의빈칸을완성하시오.

73

연습문제해답

#include <stdio.h>#include <stdlib.h>int main(void){char *name[3]={"문상훈","이준 ", "박찬길"};char *phone[3]={"015-2745-2233",

"016-0023-9983","014-740-4502"};

int i;FILE *fp;fp=fopen("sample", "w");if (fp==NULL){printf("File open에 오류발생");exit(1);

}for(i=0;i<3;i++){printf("%s %s\n", name[i], phone[i]);fprintf(fp, "%s %d\n", name[i], phone[i]);}fclose(fp);return 0;}

#include <stdio.h>#include <stdlib.h>int main(void){char c;FILE *fp;fp=fopen( )if (fp==NULL){

printf(“File open에오류발생”)exit(1);

}while((c=fgetc(fp))!= ){

printf(“%c”, )}fclose(fp);printf(“\n”);return 0;

}

c

EOF

“chr.txt”, r

Page 39: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

17.8 다음과같은물품의품명과단가를배열에초기화한다음판매한각물품의수량

을 입력하면 그림과 같이 물품의 판매현황 결과를 화면과 텍스트 파일 sale.txt

에 출력하는프로그램을작성하시오. [연습문제 14.10]참고.

74

연습문제해답

품명 단가(원)

하드디스크(300GB) 135,000

CPU(인텔P4) 235,000

메인보드 122,000

모니터(17 LCD) 260,000

DVD-RW 73,500

#include <stdio.h>int main(void){int i;long cost[5]={135000, 235000, 122000, 260000, 73500};long quantity[5], sum, total=0;char *good[5]={"hard disk", "CPU(intel)", "main board",

"LCD monitor", "DVD-RW(combo)"};FILE *fp;printf("물품판매보고서 \n\n");printf("각품명에대한수량을입력하고 Enter\n");for(i=0; i<=4; i++){

printf("%s: 수량>", good[i]);scanf("%ld", &quantity[i]);

}fp=fopen("sale.txt", "w");printf("\n\n물품판매현황");fprintf(fp, "\n물품판매현황\n");printf("\n물품\t\t단가\t수량\t금액");fprintf(fp, "\n물품\t\t단가\t수량\t금액\n");for(i=0; i<=4; i++){sum=cost[i]*quantity[i];printf("\n%s\t%7ld\t%3ld %10ld 원", good[i], cost[i], quantity[i], sum);fprintf(fp, "%s\t%7ld\t%3ld %10ld 원\n", good[i], cost[i], quantity[i], sum);total+=sum;}printf("\n 총계\t\t\t %12ld 원", total);fprintf(fp, "\n 총계\t\t\t %12ld 원", total);fclose(fp);return 0;

}

Page 40: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

[추가문법]

17.9 다음중이진파일에대한설명중맞는것을모두고르시오. (1, 3, 4, 7)

①파일쓰기모드에 wb가사용된다.

② ASCII형식으로데이터가저장된다.

[해설] 텍스트 방식은 데이터를 ASCII 코드에 대응되는 byte 단위로 처리하고,

이진방식은데이터형(type)에기준하여처리한다.

③랜덤접근(random access)처리에사용한다.

④데이터를 block 단위로처리하고 block을나타내기위해구조체를사용한다.

⑤이진파일에서 block의크기와 block의개수는항상같아야한다.

[해설] block의크기는같아야하지만 block의크기와 block의개수는서로상관

없음

⑥함수 fread()는오직1개의 block만을읽을수있다.

[해설] fread()에서읽어들일 block의크기와개수를정할수있다.

⑦파일포인터의이동은함수 fseek()를사용하여자유롭게이동할수있다.

17.10 다음 프로그램에서 block을 나타내는 구조체 형이 stdata이라 할 때 파일

group.dat에 대해 block의 크기를계산하는부분을 ftell을 이용하여작성하고,

①은어떤처리를하는지설명하시오.

fp=fopen("group.dat", "rb");

① fseek(fp, 0L, SEEK_END);

② total_block= / ;

[해설] 함수 ftell()은파일의처음(시작)위치에서현재의파일포인터위치까지

의거리를 byte크기로반환합니다. 따라서파일의크기를 byte로표시하거나파

일에몇개의 block이저장되어있는가를계산할때다음과같이사용합니다.

전체block의개수=

우선파일포인터의위치를파일의마지막위치(SEEK_END)로이동(offset의크기

는 0)시킨다음, 파일의처음(시작)위치에서현재의파일포인터의위치까지의거

리를 byte 수로환산하는함수 ftell()로계산하여이값을 block(구조체)의크

기로나누어줍니다.

파일의크기(byte)

한 block의크기(byte)

sizeof(stdata)ftell(fp)

75

연습문제해답

파일에 저장된 전체 block의개수를 계산하는 프로그램

설명

fseek(fp, 0L, SEEK_END);total=ftell(fp)/sizeof(stdata);

파일포인터를파일의마지막위치로전체 block수=파일의크기/block의크기

Page 41: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

17.11 block의 크기가 10 byte라고 가정하고 그림의 제일 왼쪽을 파일의 시작위치라

가정하면 fseek(fp, -30L, SEEK_END); 의 위치와 fseek(fp, 20L,

SEEK_END);의 위치는각각어디를나타내는가? (2, 3)

① ② ③ ④ ⑤

[해설]

인자 whence에대한상수

첫번째 block의위치(n=1)는파일의처음위치와동일합니다. 두번째 block의

위치는 파일 포인터의 기준 위치를 파일의 시작위치(SEEK_SET)로 하느냐 혹은

파일의 마지막 위치(SEEK_END)로 잡느냐에 따라 offset의 크기가 달라집니다.

이를그림으로나타내면다음과같습니다.

fseek(fp, -30L, SEEK_END);

fseek(fp, 20L, SEEK_SET);

17.12 앞의 [연습문제 17.8]에 대해 판매한 각 물품의 수량을 입력하면 물품의 판매현

황결과를화면과이진파일“sale.bin”에출력하는프로그램을작성하시오.

76

연습문제해답

10 byte 10 byte 10 byte 10 byte

첫번째 block 두번째 block 세번째 block 네번째 block

10 byte 10 byte 10 byte

첫번째 block 두번째 block 세번째 block 네번째 block

상수(constant) whence File 위치

SEEK_SET 0 파일처음(시작) 위치

SEEK_CUR 1 파일포인터의현재 위치

SEEK_END 2 파일의끝(마지막) 위치

10 byte

첫번째 block 두번째 block 세번째 block 네번째 block

#include <stdio.h>#include <stdlib.h>struct sale{char good[15];long cost;long quantity;long total;

Page 42: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

17.13 앞의 [연습문제 17.12]에 대해 출력을 원하는 block의 숫자를 입력하면 해당

block의 데이터를랜덤접근에의해출력하는프로그램을작성하시오.

77

연습문제해답

};int main(void){int i;long total=0;struct sale sdata[5]={{"hard disk", 135000},

{"CPU(intel)", 235000},{"main board", 122000},{"LCD monitor",260000},{"DVD-RW(combo)",73500}};

FILE *fp;printf("물품판매보고서 \n\n");printf("각품명에대한수량을입력하고 Enter\n");for(i=0; i<=4; i++){printf("%s: 수량>", sdata[i].good);scanf("%ld", &sdata[i].quantity);}fp=fopen("sale.bin", "wb");printf("\n\n물품판매현황");printf("\n물품\t\t단가\t수량\t금액");for(i=0; i<=4; i++){sdata[i].total=sdata[i].cost*sdata[i].quantity;printf("\n%s\t%7ld\t%3ld %10ld 원", sdata[i].good, sdata[i].cost,sdata[i].quantity, sdata[i].total);

total+=sdata[i].total;}printf("\n 총계\t\t\t %12ld 원", total);

if(fwrite(sdata, sizeof(sale), 5, fp) !=5){

printf("File Write Error 발생!");exit(1);

}fclose(fp);return 0;

}

Page 43: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

78

연습문제해답

#include <stdio.h>#include <stdlib.h>struct sale{char good[15];long cost;long quantity;long total;

};int main(void){int i;long total_block, block_number;struct sale d;FILE *fp;fp=fopen("sale.bin", "rb");fseek(fp, 0L, SEEK_END);total_block=ftell(fp)/sizeof(sale);printf("물품판매보고서 \n\n");printf("전체 block의숫자는 %d 입니다.\n", total_block);printf("0을입력하면종료함\n", total_block);while(1) {printf("\n원하는 block의숫자(1-%d)를입력하고 Enter >", total_block);scanf("%ld", &block_number);if (block_number==0)

break;fflush(stdin);if (block_number> total_block)break;fseek(fp, sizeof(sale)*(block_number-1), SEEK_SET);if(fread(&d, sizeof(sale), 1, fp) !=1) {printf("File read Error !");

Page 44: Ë # ç ùnbbs.knue.ac.kr/@lyj/04_board.brd/_71.73.7b5660/10-17장...$ ± ¯ À ² R P ø û y ó Ñ ' 5 ý Þ × Ñ è 7 ÝCall by Value ÞCall by Reference ßCall by Result àCall

79

연습문제해답

exit(1);}printf("\n물품\t\t단가\t수량\t금액\n");printf("%s\t%7ld\t%3ld %10ld 원\n", d.good, d.cost, d.quantity, d.total);}fclose(fp);return 0;

}