3장 연습문제

자료구조

1. 학생 10명의 국어, 영어, 수학 성적을 처리하는 프로그램을 작성하시오. 단, 배열을 사용하여 학생들의 학번, 국어, 영어, 수학, 총점, 평균을 저장하시오.

[출력 형식]

학번   국어	영어	수학	총점	평균

*********************************************

1      80      70      90      240     80

답 안
#include <stdio.h> void main() { int num[4]= {1,2,3}; int kor[4] = {80,70,90}; int eng[4]= {88,77,99}; int math[4] = {81,71,91}; int i, total, avg; puts(" 학번 국어 영어 수학 총점 평균", stdout); puts("***********************************", stdout); for(i=0;i<3;i++) { total= kor[i] + eng[i] + math[i]; avg= total/3; printf("%4d%6d%6d%6d%6d%6d\n",num[i],kor[i],eng[i],math[i],total,avg); } }

2. 다차원 배열을 이용하여 키보드로부터 5개의 문자열을 입력받아서 화면에 출력하는 프로그램을 작성하시오.

답 안
#include <stdio.h> void main() { int i; char array[5][50]; for(i=0;i<5;i++) { printf("%d번 문자열 : ", i+1); gets(array[i]); } printf("입력완료\n출력\n"); for(i=0; i<5; i++) printf("입력된 %d번 문자열 : %s\n",i+1, array[i]); }

3. 두 개의 문자열을 입력받아서 문자열이 같은지 다른지를 출력하는 프로그램을 작성하시오.

답 안
#include <stdio.h> void main() { int i; char array[2][20]; for(i=0;i<2;i++) { printf("%d번 문자열 : ", i+1); gets(array[i]); } for(i=0; array[0][i]!='\0'; i++) if(array[0][i] != array[1][i]) { printf("%d번째가 이상해요\n",i+1); return 0; } puts("두 문자열이 똑같습니다.",stdout); }

4. 포인터를 사용하여 실수값 2개를 교환하여 저장하고 출력하는 함수를 만드시오.

답 안
#include <stdio.h> void main() { float a,b; int *p1=&a; int *p2=&b; int temp; printf("1번 실수값 입력 : "); scanf("%f",&a); printf("2번 실수값 입력 : "); scanf("%f",&b); printf("교환전 1번 : %g, 2번 %g\n", a,b); temp=*p1; *p1=*p2; *p2=temp; printf("교환후 1번 : %g, 2번 %g\n", a,b); }

5. 다음과 같은 두 개의 행렬의 곱을 구하는 프로그램을 작성하시오.

[eqn: A = pmatrix { 3& 2& 5# 9& 2& 8# 6& 1& 2}],  [eqn: B = pmatrix {9&8&3&1#6&2&1&2#8&3&2&5}]

답 안
#include <stdio.h> void main() { int a[3][3] = {{3, 2, 5}, {9, 2, 8}, {6, 1, 2}}; int b[3][4] = {{9, 8, 3, 1}, {6, 2, 1, 2}, {8, 3, 2, 5}}; int i, j; for(i=0; i<3; i++) { printf("|"); for(j=0; j<4; j++) printf("%4d", a[i][0]*b[0][j] + a[i][1]*b[1][j] + a[i][2]*b[2][j]); printf("|\n"); } }

6. 입력받은 문자열을 역순으로 출력하는 reverse 함수를 작성하시오.

답 안
#include <stdio.h> void main() { char str[100]; int i,count=0; printf("입력 : "); gets(str); for(i=0;str[i]!='\0';i++) count++; printf("reverse : "); for(i=count-1;i>=0;i--) printf("%c",str[i]); printf("\n"); }

7. 이름과 생년월일과 오늘 날짜를 입력받아서 이름과 함께 오늘이 태어난지 몇칠째가 되었는지를 출력하는 프로그램을 작성하시오. 단, 구조체를 사용하시오.

답 안	(윤년 무시)
#include <stdio.h> void main() { struct birthday{ char name[10]; int birth_year; int birth_month; int birth_day; }birthday; int birth, today, year, month, day; printf("이름 : "); gets(birthday.name); printf("생년 : "); scanf("%d",&birthday.birth_year); printf("생월 : "); scanf("%d",&birthday.birth_month); printf("생일 : "); scanf("%d",&birthday.birth_day); printf("현년 : "); scanf("%d",&year); printf("현월 : "); scanf("%d",&month); printf("현일 : "); scanf("%d",&day); birth = (birthday.birth_year*365)+(birthday.birth_month*30)+(birthday.birth_day); today = (year*365)+(month*30)+(day); printf("==========\n%s 님 %d일 경과\n", birthday.name, today-birth); }