1. 사용자로부터 5개의 숫자를 읽어서 리스트에 저장하고 숫자들의 평균을 계산하여 출력하는 프로그램을 작성해보자. 2. 주사위를 던져서 나오는 값들의 빈도를 계산하는 프로그램을 잓ㅇ해보자. 즉 1, 2, 3, 4, 5, 6의 값이 각각 몇 번이나 나오는지를 계산한다. 난수 발생 함수와 리스트를 사용해보자. 3. 딕셔너리를 사용하여서 친구들의 이름과 전화번호를 저장해보자. 사용자로부터 친구들의 이름과 전화번호를 입력받고 딕셔너리에 저장한다. 이름을 입력하지 않고 엔터키를 치면 검색모드가 된다. 검색 모드에서는 친구들의 이름으로 전화번호를 검색할 수 있도록 한다. 4. 색상을 리스트에 저장한다. 리스트에 저장된 색상을 하나씩 꺼내어 거북이의 색상으로 설정하면서 속이 채워진 사각형을 그리는 프로그램을 작성해보자. 1.덧셈, 뺄셈, 곱셈, 나눗셈을 지원하는 계산기 프로그램을 작성하여 보자. 이번에는 각 연산들이 몇 번씩 계산되었는지를 기억하게 하자. 각 연산을 지원하는 함수들은 자신이 호출된 횟수를 화면에 출력한다. (a) 정적 지역 변수를 사용하여 프로그램을 작성하라. (b) 전역 변수를 사용하여 프로그램을 작성하라. #include<stdio.h> intadd(intx,inty); intsup(intx,inty); intmul(intx,inty); intdvd(int x,int y); voidmain() { intn1,n2; charop; while(1) { printf("연산식 입력:"); scanf("%d %c %d",&n1,&op,&n2); fflush(stdin); switch(op) { case'+': printf("연산결과: %d\n",add(n1,n2)); break; case'-': printf("연산결과: %d\n",sup(n1,n2)); break; case'*': printf("연산결과: %d\n",mul(n1,n2)); break; case'/': printf("연산결과: %d\n",dvd(n1,n2)); break; } } } int add(intx,inty) { staticintcount=0; count++; printf("덧셈 연산이 %d번 실행되었습니다.\n",count); returnx+y; } int sup(intx,inty) { staticintcount=0; count++; printf("뺄셈 연산이 %d번 실행되었습니다.\n",count); returnx-y; } intmul(intx,int y) { staticintcount=0; count++; printf("곱셈 연산이 %d번 실행되었습니다.\n",count); returnx*y; } intdvd(intx,inty) { staticint count=0; count++; printf("나눗셈 연산이 %d번 실행되었습니다.\n",count); return x/y; } #include<stdio.h> static intcount_add; static int count_sup; static intcount_mul; static intcount_dvd; intadd(int x,inty); intsup(int x,inty); int mul(int x,inty); intdvd(int x,inty); voidmain() { intn1,n2; charop; while(1) { printf("연산식 입력:"); scanf("%d %c %d",&n1,&op,&n2); fflush(stdin); switch(op) { case'+': printf("연산결과: %d\n",add(n1,n2)); break; case'-': printf("연산결과: %d\n",sup(n1,n2)); break; case '*': printf("연산결과: %d\n",mul(n1,n2)); break; case '/': printf("연산결과: %d\n",dvd(n1,n2)); break; } } } intadd(int x,inty) { count_add++; printf("덧셈 연산이 %d번 실행되었습니다.\n",count_add); return x+y; } intsup(int x,inty) { count_sup++; printf("뺄셈 연산이 %d번 실행되었습니다.\n",count_sup); return x-y; } int mul(intx,inty) { count_mul++; printf("곱셈 연산이 %d번 실행되었습니다.\n",count_mul); return x*y; } int dvd(intx,inty) { count_dvd++; printf("나눗셈 연산이 %d번 실행되었습니다.\n",count_dvd); return x/y; } 2.주사위를 던져서 각각의 면이 몇 번 나왔는지를 출력하는 프로그램을 작성하라. 주사위의 면은 난수를 이용하여 생성한다. 주사위를 던지는 함수 get_dice_face()를 만들고 이 함수 안에서 각각의 면이 나올 때마다 그 횟수를 정적 지역 변수를 이용하여 기억하게 하라. get_dice_face() 호출 횟수가 100의 배수일 때마다 면이 나온 횟수를 출력한다. #include<stdio.h> #include <stdlib.h> #include <time.h> intget_dice_face(intnum); void main() { intnum=0; srand((unsigned)time(NULL)); get_dice_face(num); } int get_dice_face(intnum) { inti; static intcount1=0; static intcount2=0; static intcount3=0; static intcount4=0; static intcount5=0; static intcount6=0; for(i=0;i<1000;i++) { num=rand()%6+1; if(num==1) count1++; if(num==2) count2++; if(num==3) count3++; if(num==4) count4++; if(num==5) count5++; if(num==6) count6++; if((i+1)%100==0) printf("%d %d %d %d %d %d\n",count1,count2,count3,count4,count5,count6); } return num; } 3.정적 지역 변수가 사용되는 하나의 용도는 함수가 처음 호출될 때 초기화를 딱 한번만 수행하는 것이다. inited는 정적 변수이기 때문에 다음번의 호출에서도 그 값을 유지한다. 따라서 초기화 코드는 함수가 처음 호출될 때 한번만 실행된다. 이러한 구조를 사용하여 맨 처음 호출되는 경우에만 초기화를 수행하는 난수 발생 함수 get_random()을 작성하여 테스트하라. #include<stdio.h> #include<stdlib.h> #include<time.h> intget_random(void); void main() { printf("%d\n", get_random()); printf("%d\n", get_random()); printf("%d\n", get_random()); printf("%d\n", get_random()); printf("%d\n", get_random()); } intget_random() { static intinited=0; if(inited==0) { printf("초기화\n"); srand((unsigned)time(NULL)); inited=1; } returnrand(); } 4.다음과 같은 무한 수열을 계산하는 순환적인 프로그램을 작성하라. #include<stdio.h> double recursive(doublen); voidmain() { doublen; printf("실수를 입력하세요:"); scanf("%lf",&n); printf("recursive(%.0f)의 결과: %.2f\n",n,recursive(n)); } double recursive(doublen) { printf("recursive(%.0f)\n",n); if(n<=1) return1.0; else return1.0/n+recursive(n-1); } 5.은행 계좌에서 저축하고 인출하는 프로그램을 작성하여 보자. save(int amount) 함수는 저금할 금액 amount를 받아서 save(100)과 같이 호출된다. draw(int amount)은 예금인출을 나타낸다. 사용자에게 메뉴를 보여주고 저축 또는 인출을 선택하게 한다. #include<stdio.h> void save(intamount); void draw(int amount); int money=0; voidmain() { intnum,amount; printf("******* 메뉴 선택*******\n"); printf(" 1:저축 2:인출 3:종료 \n"); printf("**************************\n"); do { printf("메뉴를 선택하시오:"); scanf("%d",&num); if(num==1) { printf("저축할 금액:"); scanf("%d",&amount); save(amount); } else if(num==2) { printf("인출할 금액:"); scanf("%d",&amount); draw(amount); } else if(num==3) break; else printf("잘못 입력하셨습니다\n"); printf("\n"); }while(1); } voidsave(intamount) { money=money+amount; printf("현재 잔액은 %d입니다.\n",money); } void draw(intamount) { if(money>=amount) { money=money-amount; printf("현재 잔액은%d입니다.\n",money); } else { printf("잔액이 부족합니다.\n"); money=money; printf("현재 잔액은 %d입니다\n",money); } } 6.오른쪽과 같은 n번째 삼각수를 계산하는 함수 get_tri_number(int n)을 순환 호출을 이용하여 작성하여 보자. #include<stdio.h> intget_tri_number(intn); voidmain() { intn; printf("정수를 입력하세요:"); scanf("%d",&n); printf("get_tri_number(%d)의 결과: %d\n",n,get_tri_number(n)); } intget_tri_number(intn) { printf("get_tri_number(%d)\n",n); if(n<=1) return1; else returnn+get_tri_number(n-1); } 7.이항 계수(binomial coefficient)를 계산하는 순환 함수를 작성하라. 이항 계수는 다음과 같이 순환적으로 정의된다. 반복 함수로도 구현해보라. #include<stdio.h> intrecursive(intn,intk); void main() { intn,k; printf("n과 k값을 입력하세요.\n"); printf("큰 숫자를 먼저써주세요:"); scanf("%d %d",&n,&k); printf("이항계수의 결과: %d\n",recursive(n,k)); } intrecursive(intn,intk) { if(k==0||k==n) return1; else returnrecursive(n-1,k-1)+recursive(n-1,k); } 8. 순환 호출을 이용하여 정수의 각 자리수를 출력하는 함수 show_digit(int x)를 작성하고 테스트하라. 즉 정수가 1234이면 화면에 1 2 3 4와 같이 출려한다. 함수는 일의 자리를 출력하고 나머지 부분을 대상으로 다시 같은 함수를 순환 호출한다. 예를 들어서 1234를 10으로 나누면 123이 되고 4는 1234를 10으로 나눈 나머지이다. #include<stdio.h> intshow_digit(intx); voidmain() { intx; printf("정수를 입력하시오:"); scanf("%d",&x); show_digit(x); printf("\n"); } intshow_digit(intx) { if(x<10) return printf("%d ",x); else show_digit(x/10); return printf("%d ", x%10); } |