주사위를 던져서 각각의 면이 몇 번 나왔는지를

1. 사용자로부터 5개의 숫자를 읽어서 리스트에 저장하고 숫자들의 평균을 계산하여 출력하는 프로그램을 작성해보자.

주사위를 던져서 각각의 면이 몇 번 나왔는지를
alist = []
sum = 0
for i in range(5):
    i = int(input("정수를 입력해주세요 : "))
    alist.append(i)
    sum += i

avg = sum/len(alist)
print(avg)

2. 주사위를 던져서 나오는 값들의 빈도를 계산하는 프로그램을 잓ㅇ해보자. 즉 1, 2, 3, 4, 5, 6의 값이 각각 몇 번이나 나오는지를 계산한다. 난수 발생 함수와 리스트를 사용해보자.

주사위를 던져서 각각의 면이 몇 번 나왔는지를
import random
counters = [0, 0, 0, 0, 0, 0]

for i in range(1000):
    value = random.randint(0, 5)
    counters[value] = counters[value] +1

for i in range(6):
    print("주사위가", i+1,"인 경우는 :", counters[i], "번")

3. 딕셔너리를 사용하여서 친구들의 이름과 전화번호를 저장해보자. 사용자로부터 친구들의 이름과 전화번호를 입력받고 딕셔너리에 저장한다. 이름을 입력하지 않고 엔터키를 치면 검색모드가 된다. 검색 모드에서는 친구들의 이름으로 전화번호를 검색할 수 있도록 한다.

주사위를 던져서 각각의 면이 몇 번 나왔는지를
def inputData(): 
    while True:
        name = input("(입력모드)이름을 입력하시오: ")
        if not name: break;
        tel = input("전화번호를 입력하시오: ") 

        contact[name] = tel
        
def select(): 
    while True:
        name = input("(검색모드)이름을 입력하시오: ")
        
        if not name: break;
        print(name,"의 전화번호는",contact[name],"입니다.")
        
contact = {}

while True:
    inputData()
    select()

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("nk값을 입력하세요.\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와 같이 출려한다. 함수는 일의 자리를 출력하고 나머지 부분을 대상으로 다시 같은 함수를 순환 호출한다. 예를 들어서 123410으로 나누면 123이 되고 4123410으로 나눈 나머지이다.

#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);

}