第12回演習の解答例


(1)乱数を用いて,0をグー,1をチョキ,2をパーとするじゃんけんのプログラムを作成せよ.


#include<stdlib.h>
#include<stdio.h>

void main( )
{
	int you,com;

	randomize();    // 乱数発生ルーチンの初期化
	
	printf("グーは0,チョキは1,パーは2:");
	scanf("%d",&you);
	
	if(you!=0 && you!=1 && you!=2){
		printf("0~2を入力して下さい¥n");
	}else {
		com=rand()%3;
		printf("コンピュータの手は%d¥n",com);

		if(you-com==-1){
			printf("あなたの勝ち¥n");
		}else if(you-com==2){
			printf("あなたの勝ち¥n");
		}else if(you==com){
			printf("引き分け¥n");
		}else{
			printf("あなたの負け¥n");
		}
	}
}


(2)1.のプログラムを用いて3以上を入力するまでじゃんけんを続ける関数を作成せよ.


#include<stdio.h>
#include<stdlib.h>
void jyanken(int you)
{
	int cpu;
	randomize();

	cpu=rand()%3;

	printf("コンピュータの手は%d¥n",cpu);

	if(you-cpu==-1){
		printf("あなたの勝ち¥n");
	}else if(you-cpu==2){
		printf("あなたの勝ち¥n");
	}else if(you==cpu){
		printf("引き分け¥n");
	}else{
		printf("あなたの負け¥n");
	}

}
void main()
{
	int you=0;
	
	while(you<3){
		printf ("0:グー 1:チョキ 2:パー 3以上:終了¥n");
		scanf("%d",&you);
	
		if(you<0){
			printf("入力エラー¥n");
		}else{
			jyanken(you);
		}
	}
}

(3)中間演習の問題1のアルゴリズムを以下のように変えて,関数の再帰呼び出しを用いたプログラムを作成せよ.

[アルゴリズム]

  1. 入力を a, b (a ≧ b) とする.違うならば入れ替えを行う.
  2. b = 0 なら, a を出力して終了する.
  3. a が b で割り切れるなら,b を出力して終了する.
  4. a を b で割った余りを新たに a とし,更に a と b を取り替えて 1.に戻る.

#include <stdio.h>

int gcd (int a, int b)
{
    int tmp;

    if(a < b) {
	tmp=a;
	a=b;
	b=tmp;
    }

    if(b==0)
        return a;

    if(a%b==0){
        return b;
    } else {
	a=a%b;
	tmp=a;
	a=b;
	b=tmp;
	return gcd(a,b);
    }
}

void main()
{
    int a, b;

    printf("Input A="); scanf("%d", &a);
    printf("Input B="); scanf("%d", &b);

    printf("最大公約数は,%d です.¥n", gcd(a, b));
}