新・明解C言語(中級編)  ー演習問題回答ー まとめ

C言語

教科書の回答がありませんので、順番にまとめていきます。
本当の初心者ですので、間違いなどありましたらご教授のほどお願いいたします。
また、回答は私個人で作成していますので、ご了承くださいませ。

第1章 数当てゲーム

演習問題 1-1(更新 2021年8月30日)

演習問題 1-2(更新 2021年8月30日)

演習問題 1-3(更新 2021年8月30日)

演習問題 1-4(更新 2021年8月30日)

演習問題 1-5(更新 2021年8月30日)

演習問題 1-6(更新 2021年8月30日)

演習問題 1-7(更新 2021年8月30日)

演習問題 1-8(更新 2021年8月30日)

第2章 表示に凝ろう

演習問題 2-1(更新 2021年9月6日)

演習問題 2-2(更新 2021年9月6日)

演習問題 2-3(更新 2021年9月6日)

演習問題 2-4(更新 202A1年9月6日)

演習問題 2-5(更新 202A1年9月6日)

演習問題 2-6(更新 2021年9月6日)

第3章 じゃんけんゲーム 

演習問題 3-1(更新 2021年9月19日)

演習問題 3-2(更新 2021年9月19日)

演習問題 3-3(更新 2021年9月19日)

演習問題 3-4(更新 2021年9月19日)

演習問題 3-5(更新 2021年9月19日)

演習問題 3-6(更新 2021年9月19日)

演習問題 3-7(更新 2021年9月19日)

演習問題 3-8(更新 2021年9月19日)


【解答】 第1章 数当てゲーム


【Answer】演習問題 1-1

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

int main(void)
{
    int ans;
    int num;
    srand(time(NULL));

    do{
        printf("<<おみくじ>>\n");
        num = rand() % 7;    
        switch(num){
            case 0 :
                printf("[大吉]\n"); break;
            case 1 :
                printf("[中吉]\n"); break;
            case 2 :
                printf("[小吉]\n"); break;
            case 3 :
                printf("[吉]\n"); break;
            case 4 :
                printf("[末吉]\n"); break;
            case 5 :
                printf("[凶]\n"); break;
            case 6 :
                printf("[大凶]\n"); break;
            default:
                break;
            }
        printf("もう一度おみくじを引きますか?\nyes ・・・ 1 / no ・・・ 2 : ");
        scanf("%d",&ans);
    }while(ans == 1);
    
    return 0;
}


【Answer】演習問題 1-
2

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

int main(void)
{
    int ans;
    int num;
    srand(time(NULL));

    do{
        printf("<<おみくじ>>\n");
        num = rand() % 11;    
        switch(num){
            case 0 :
            case 1 :
                printf("[大吉]\n"); break;
            case 2 :
            case 3 :
                printf("[中吉]\n"); break;
            case 4 :
            case 5 :
                printf("[小吉]\n"); break;
            case 6 :
            case 7 :
                printf("[吉]\n"); break;
            case 8 :
                printf("[末吉]\n"); break;
            case 9 :
                printf("[凶]\n"); break;
            case 10 :
                printf("[大凶]\n"); break;
            default:
                break;
            }
        printf("もう一度おみくじを引きますか?\nyes ・・・ 1 / no ・・・ 2 : ");
        scanf("%d",&ans);
    }while(ans == 1);
    
    return 0;
}


【Answer】演習問題 1-3

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

#define MAX_STAGE 10

int main(void)
{
    int ans;
    int num;
    int stage = 0;
    srand(time(NULL));
    num =  rand() % 1999 - 999;

    printf("<<数当てゲーム>>\n-999以上999以下の数字を当ててください。\n");

    do{
        printf("残り回答数 %d 回\n回答:", MAX_STAGE - stage);
        stage++;
        scanf("%d",&ans);

        if(ans > num)
            printf("もっと小さいよ。\n");
        else if(ans < num)
            printf("もっと大きいよ。\n");

    }while(ans != num && stage < MAX_STAGE);
 
    if(ans == num)
        printf("正解! %d 回目で正解です。\n",stage);
    else
        printf("残念。正解は %d でした。\n", num);
    
    
    return 0;
}


【Answer】演習問題 1-
4

(ただちに終了)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define MAX_STAGE 8
/*二分探索
 文字どおり「半分半分にする」ことです。具体的な数で考えてみます。
【16 個から探す場合】
16 個の半分→8 個
8 個の半分→4 個
4 個の半分→2 個
2 個の半分→1 個
で,解答数は4 回です。*/
/* 999 / 3 = 333 3の倍数の数は333個ある。
/* 333を2で割っていく(小数点切り捨て) 
   333/2=166 166/2=83 83/2=41 41/2=20
   20/2=10 10/2=5 5/2=2 2/2=1
   計8回 8回あれば回答が可能*/

int main(void)
{
    int ans;
    int num;
    int stage = 0;
    srand(time(NULL));

    do{
        num =  3 + rand() % 1000;
    }while(num % 3);
    /*3の倍数乱数が出るまで繰り返す*/

    printf("<<数当てゲーム>>");
    printf("3~999までの3の倍数の数字を当ててください。\n");

    do{
        printf("残り回答数 %d 回\n回答 : ", MAX_STAGE - stage);
        stage++;
        scanf("%d",&ans);

        if(ans % 3 != 0){
            printf("3の倍数が入力されませんでしたので終了します。\n");
            break;
            }
        else
            if(ans > num)
                printf("もっと小さいよ。\n");
            else if(ans < num)
                printf("もっと大きいよ。\n");
            
    }while(ans != num && stage < MAX_STAGE);
   
    return 0;
}

-------------------------------------------------------------------------------------------------------

(比較結果を再入力させる)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define MAX_STAGE 8
/* 999 / 3 = 333 3の倍数の数は333個ある。
/* 333を2で割っていく(小数点切り捨て) 
   333/2=166 166/2=83 83/2=41 41/2=20
   20/2=10 10/2=5 5/2=2 2/2=1
   計8回 8回あれば回答が可能*/

int main(void)
{
    int ans;
    int num;
    int stage = 0;
    srand(time(NULL));

    do{
        num =  3 + rand() % 1000;
    }while(num % 3);
    /*3の倍数乱数が出るまで繰り返す*/

    printf("<<数当てゲーム>>");
    printf("3~999までの3の倍数の数字を当ててください。\n");

    do{
        printf("残り回答数 %d 回\n回答 : ", MAX_STAGE - stage);
        
        do{
            scanf("%d",&ans);

            if(ans % 3 != 0){
                printf("3の倍数ではありません。\n");
                break;
                }
            else
                if(ans > num)
                    printf("もっと小さいよ。\n");
                else if(ans < num)
                    printf("もっと大きいよ。\n");
            stage++;
        }while(ans % 3 != 0);
            
    }while(ans != num && stage < MAX_STAGE);
   
    return 0;
}


【Answer】演習問題 1-5

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

int main(void)
{
    int count = 0;
    int kaitou = 0;;
    int seikai = 0;

    int low , hi;
    int ans;

    srand(time(NULL));

    low = rand() % 5001;/*5000以下の乱数*/
    hi = 5000 + rand() % 5001;/*5000以上10000以下の乱数*/
    ans = low + rand() % hi;/*答えの乱数*/

    int a = ans - low;/*二分探索用*/

/*回答数の求め方 二分探索*/
    do{
        kaitou = a / 2;
        count++; /*回答数*/
        a = kaitou;    
    }while(kaitou > 2);

    int zan = count;

    printf("%d %d\n",ans, count);
    printf("%d 以上 %d 以下の数を当ててください。\n", low,hi);

    do{
        printf("回答数 : %d回 \n", count);
        count--;
        printf("答えを入力して下さい : ");
        scanf("%d", &seikai);

        if(seikai < ans)
            printf("もっと大きいよ。\n");
        else if(seikai > ans)
            printf("もっと小さいよ。\n");

    }while(seikai != ans && count > 0);

    if(seikai == ans)
        printf("おめでとうございます!\n%d回目で正解!\n", zan - count);
    else
        printf("残念!答えは%dでした。\n", ans);

    return 0;
}


【Answer】演習問題 1-6

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

int kaitou_zan(int a)
{
int kaitou = 0;
int count = 0;
do{
    kaitou = a / 2;
    count++; /*回答数*/
    a = kaitou;    
}while(kaitou > 2);

return count;
}

int main(void)
{
    int level;
    int a;
    int ans = 0;

    srand(time(NULL));

    printf("<<数当てクイズ>>\n");
    printf("(1)  1 ~9  (2)  1~99  (3)  1~999  (4)  1~9999\n ");
    printf("レベルを選んでください。: ");
    scanf("%d",&level);

    switch (level)
    {
    case 1:
        a = 1 + rand() % 10; 

        int count_1 = kaitou_zan(a);
 
        do{
            printf("回答数: %d\n", count_1);
            printf("答え : ");
            scanf("%d",&ans);
            count_1--;

            if(ans > a)
                printf("もっと小さいよ。\n");
            else if(ans < a)
                printf("もっと大きいよ。\n");

        }while(ans != a && count_1 > 0);

        break;

    case 2:
        a = 1 + rand() % 100;

         int count_2 = kaitou_zan(a);
 
        do{
            printf("回答数: %d\n", count_2);
            printf("答え : ");
            scanf("%d",&ans);
            count_2--;

            if(ans > a)
                printf("もっと小さいよ。\n");
            else if(ans < a)
                printf("もっと大きいよ。\n");

        }while(ans != a && count_2 > 0);

        break;

    case 3:
        a = 1 + rand() % 1000;

        int count_3 = kaitou_zan(a);
 
        do{
            printf("回答数: %d\n", count_3);
            printf("答え : ");
            scanf("%d",&ans);
            count_3--;

            if(ans > a)
                printf("もっと小さいよ。\n");
            else if(ans < a)
                printf("もっと大きいよ。\n");

        }while(ans != a && count_3 > 0);

        break;
    case 4:
        a = 1 + rand() % 10000;

        int count_4 = kaitou_zan(a);
 
        do{
            printf("回答数: %d\n", count_4);
            printf("答え : ");
            scanf("%d",&ans);
            count_4--;

            if(ans > a)
                printf("もっと小さいよ。\n");
            else if(ans < a)
                printf("もっと大きいよ。\n");

        }while(ans != a && count_4 > 0);

        break;

    default:
        printf("1~4以外の数字が入力されましたので終了します。\n");
        break;
    }

    if(ans == a)
        printf("おめでとうございます!正解です。\n" );
    else
        printf("残念でした。正解は %d でした。\n",a);

    return 0;
}


【Answer】演習問題 1-7

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

#define max_stage  10

int main(void)
{
    int i;
    int stage;
    int no;
    int ans;
    int num[max_stage];
    
    srand(time(NULL));
    ans = rand() % 1000;

    printf("0~999の整数を当ててください。\n");

    stage = 0;
    do{
        printf("残り%d回。いくつかな:", max_stage - stage);
        scanf("%d",&no);
        num[stage++] = no;

        if(no > ans)
            printf("もっと小さいよ。\n");
        else if(no < ans)
            printf("もっと大きいよ。\n");
    }while (no != ans && stage < max_stage);
    
    if(no != ans)
        printf("\a残念。正解は%dです。\n",ans);
    else{
        printf("正解です。\n");
        printf("%d回目で当たりましたね。", stage);
    }

    puts("\n--- 入力履歴---");
    for(i = 0; i < (stage - 1); i++)
        printf(" %2d : %4d  %+4d\n", i + 1, num[i], num[i] - ans);
        /*書式文字列 %+4d\n とすると値が正や0であっても符号が表示される*/
        
    if(num[i] - ans > 0)
        printf(" %2d : %4d  %+4d\n", i + 1, num[i], num[i] - ans);
    else
        printf(" %2d : %4d  %4d\n", i + 1, num[i], num[i] - ans);

    return 0;    
}


【Answer】演習問題 1-8

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

#define max_stage  10

int main(void)
{
    int i;
    int stage;
    int no;
    int ans;
    int num[max_stage];
    
    srand(time(NULL));
    ans = rand() % 1000;

    printf("0~999の整数を当ててください。\n");

    stage = 0;

    for(stage ; stage < max_stage ; stage++)
    {
        printf("残り%d回。いくつかな:", max_stage - stage);
        scanf("%d",&no);
        num[stage] = no;

        if(no > ans)
            printf("もっと小さいよ。\n");
        else if(no < ans)
            printf("もっと大きいよ。\n");
        else
            break;
    }
    
    if(no != ans)
        printf("\a残念。正解は%dです。\n",ans);
    else{
        printf("正解です。\n");
        printf("%d回目で当たりましたね。", stage);
    }

    puts("\n--- 入力履歴---");
    for(i = 0; i < stage; i++)
        printf(" %2d : %4d %+4d\n", i + 1, num[i], num[i] - ans);

    return 0;    
}

【解答】 第2章 表示に凝ろう


【Answer】演習問題 2-1

#include<time.h>
#include<stdio.h>

int sleep(unsigned long x)
{
    clock_t c1 = clock(), c2;
    do{
        if((c2 =clock()) == (clock_t)-1)
            return 0;
    }while(1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x);
    return 1;
}

int main(void)
{
    int i;
    clock_t c;

    for(i = 10; i > 0; i--){
        printf("\r%2d", i);
        fflush(stdout);
        sleep(1000);
    }
    printf("\r\aFIRE!!\n");

    c = clock();
    printf("プログラム開始から%.1f秒経過しました。\n", (double)c / CLOCKS_PER_SEC);
    printf("クロック数は%.1ldです。\n",(long)c);

    return 0;
}


【Answer】演習問題 2-2

#include<time.h>
#include<stdio.h>

int sleep(unsigned long x)
{
    clock_t c1 = clock(), c2;

    do{
        if((c2 = clock()) == (clock_t)-1)
            return 0;
    } while (1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x);
    return 1;
}

void gput(const char *s, int speed)
{
    for(int i = 0; i < 3; i++){
        putchar(s[i]);
        fflush(stdout);
        sleep(speed);
    }
    putchar('\n');
}

int main(void)
{
    gput("ABC",100);

    return 0;
}


【Answer】演習問題 2-3

#include<time.h>
#include<stdio.h>

int sleep(unsigned long x)
{
    clock_t c1 = clock(), c2;
    do{
        if((c2 =clock()) == (clock_t)-1)
            return 0;
    }while(1000.0 * (c2 -c1) / CLOCKS_PER_SEC < x);
    return 1;
}

void bput(const char *s, int d, int e, int n)
{
    for(int i = 0; i < n; i++){
        printf("\r%s",s);
        fflush(stdout);
        sleep(d);
        printf("\r                               ");
        fflush(stdout);
        sleep(e);
    }
}

int main(void)
{
    char s[] = "ABC";
    bput(s,500,500,3);
    return 0;
}


【Answer】演習問題 2-4

#include<time.h>
#include<stdio.h>
#include<string.h>

int sleep(unsigned long x)
{
    clock_t c1 = clock(), c2;
    do{
        if((c2 = clock()) == (clock_t)-1)
            return 0;
    }while(1000.0 * (c2 - c1 ) / CLOCKS_PER_SEC < x);
    return 1;
}

void telop(const char *s, int direction, int speed, int n)
{
    int i ;
    int cnt = 0;
    int name_len = strlen(s);

    switch (direction)
    {
    case 0:
        while(n > 0){
            n--;
            putchar('\r');
              for(i = 0; i < name_len; i++){
                if(cnt + i < name_len)
                    putchar(s[cnt + i]);
                else
                    putchar(s[cnt + i - name_len]);
            }
        fflush(stdout);
        sleep(speed);

        if(cnt < name_len - 1)
            cnt++;
        else
            cnt = 0;
        }
        break;

    case 1:
        while(n > 0){
            n--;
            putchar('\r');
            for(i = 0; i < name_len; i++){
                if(cnt + i < name_len)
                    putchar(s[cnt + i]);
                else
                    putchar(s[cnt + i - name_len]);
            }
        fflush(stdout);
        sleep(speed);

        if(cnt > 0)
            cnt--;
        else
            cnt = name_len - 1;
        }
        break;

    default:
        break;
    }
}

int main(void)
{
    char s[] = "ABC ";
    int direction;

    printf("テロップを流す方法を選んでください。\n(0)左方向 (1)右方向 :");
    scanf("%d",&direction);

    telop(s,direction,500,10);

    return 0;
}


【Answer】演習問題 2-5

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

int main(void)
{
    int stage;
    int a, b, c;
    int x;
    int n;
    double cnt[10];
    double count = 0;
    clock_t start, end;

    srand(time(NULL));

    printf("視野拡大暗算トレーニング開始!\n");
    

    for(stage = 0; stage < 10; stage++){
        start = clock();

        a = 10 + rand() % 90;
        b = 10 + rand() % 90;
        c = 10 + rand() % 90;
        n = rand() % 17;

        printf("%d%*s+%*s%d%*s+%*s%d : ", a, n,"", n, "", b, n, "", n, "", c);
        do{
            scanf("%d",&x);
            if(x == a + b + c){
                end = clock();
                cnt[stage] = ((double)(end - start) / CLOCKS_PER_SEC);
                break;
            }
            else
                printf("\a違います。再入力してください:");
            
        }while(1);
    }

    for(int i = 0; i < stage; i++){
        printf("%d回目 %.1f秒\n", i + 1, cnt[i]);
        count += cnt[i];

    }
    printf("平均解答時間は%.1f秒でした。", count / 10);

    return 0;
}


【Answer】演習問題 2-6

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

int main(void)
{
    int stage;
    int a, b, c, d;
    int x;
    int n;
    double cnt[10];
    double count = 0;
    clock_t start, end;

    srand(time(NULL));

    printf("視野拡大暗算トレーニング開始!\n");
    

    for(stage = 0; stage < 10; stage++){
        start = clock();

        a = 10 + rand() % 90;
        b = 10 + rand() % 90;
        c = 10 + rand() % 90;
        n = rand() % 17;
        d = rand() % 4;

        switch(d)
        {
        case 0:
            printf("%d%*s+%*s%d%*s+%*s%d : ", a, n,"", n, "", b, n, "", n, "", c);
            do{
                scanf("%d",&x);
                if(x == a + b + c){
                    end = clock();
                    cnt[stage] = ((double)(end - start) / CLOCKS_PER_SEC);
                break;
            }
                else
                    printf("\a違います。再入力してください:");   
            }while(1);
                break;
        
        case 1:
            printf("%d%*s+%*s%d%*s-%*s%d : ", a, n,"", n, "", b, n, "", n, "", c);
            do{
                scanf("%d",&x);
                if(x == a + b - c){
                    end = clock();
                    cnt[stage] = ((double)(end - start) / CLOCKS_PER_SEC);
                break;
            }
                else
                    printf("\a違います。再入力してください:");   
            }while(1);
                break;

        case 2:
            printf("%d%*s-%*s%d%*s+%*s%d : ", a, n,"", n, "", b, n, "", n, "", c);
            do{
                scanf("%d",&x);
                if(x == a - b + c){
                    end = clock();
                    cnt[stage] = ((double)(end - start) / CLOCKS_PER_SEC);
                break;
            }
                else
                    printf("\a違います。再入力してください:");   
            }while(1);
                break;

        case 3:
            printf("%d%*s-%*s%d%*s-%*s%d : ", a, n,"", n, "", b, n, "", n, "", c);
            do{
                scanf("%d",&x);
                if(x == a - b - c){
                    end = clock();
                    cnt[stage] = ((double)(end - start) / CLOCKS_PER_SEC);
                break;
            }
                else
                    printf("\a違います。再入力してください:");   
            }while(1);
                break;
        
        default:
            break;
        }     
    }

    for(int i = 0; i < stage; i++){
        printf("%d回目 %.1f秒\n", i + 1, cnt[i]);
        count += cnt[i];

    }
    printf("平均解答時間は%.1f秒でした。", count / 10);

    return 0;
}

【解答】 第3章 じゃんけんゲーム


【Answer】演習問題 3-1

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

int human;
int comp;
int win_no;
int lose_no;
int draw_no;

char *hd[] = {"グー","チョキ","パー"};

void initialize(void)
{
    win_no = 0;
    lose_no = 0;
    draw_no = 0;

    srand(time(NULL));

    printf("じゃんけんゲーム開始!!\n");
}

void jyanken(void)
{
    int i;

    comp = rand() % 3;

    do{
        printf("\n\aじゃんけんポン ・・・");
        for(i = 0; i < 3; i++)
            printf("(%d)%s", i, hd[i]);
        printf(" : ");
        scanf("%d",&human);
    }while(human < 0 || human > 2);
}

void count_no(int result)
/*disp_resultをまとめた*/
{
    switch (result) {
    case 0: puts("引き分けです。");     draw_no++; break;
    case 1: puts("あなたの負けです。"); lose_no++; break;
    case 2: puts("あなたの勝ちです。"); win_no++;  break;
    }
}

int confirm_retry(void)
{
    int x;

    printf("もう一度しますか ・・・ (0)いいえ (1)はい:");
    scanf("%d",&x);

    return x;
}

int main(void)
{
    int judge;
    int retry;

    initialize();

    do{
        jyanken();
        printf("私は%sで、あなたは%sです。\n", hd[comp], hd[human]);

        judge = (human - comp + 3) % 3;

        count_no(judge);

        retry = confirm_retry();
    }while(retry == 1);

    printf("%d勝%d敗%d分けでした。\n", win_no, lose_no, draw_no);

    return 0;
}


【Answer】演習問題 3-2

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

int human;
int comp;
int win_no;
int lose_no;
int draw_no;

char *hd[] = {"グー","チョキ","パー"};

int initialize(void)
{
    win_no = 0;
    lose_no = 0;
    draw_no = 0;

    srand(time(NULL));

    printf("じゃんけんゲーム開始!!\n");
}

void jyanken(void)
{
    int i;

    comp = rand() % 3;

    do{
        printf("\n\aじゃんけんポン ・・・");
        for(i = 0; i < 3; i++)
            printf("(%d)%s", i, hd[i]);
        printf(" : ");
        scanf("%d",&human);
    }while(human < 0 || human > 2);
}

void count_no(int result)
{
    switch (result) {
    case 0: draw_no++; break;
    case 1: lose_no++; break;
    case 2: win_no++;  break;
    }
}

void disp_result(int result)
{
    switch (result){
    case 0: puts("引き分けです。"); break;
    case 1: puts("あなたの負けです。"); break;
    case 2: puts("あなたの勝ちです。"); break;
    }
}

int main(void)
{
    int judge;
    int retry;
    int n;

    initialize();

    printf("何回勝負しますか。:");
    scanf("%d",&n);

    do{
        jyanken();
        printf("私は%sで、あなたは%sです。\n", hd[comp], hd[human]);

        judge = (human - comp + 3) % 3;

        count_no(judge);

        disp_result(judge);

    }while(win_no < n && lose_no < n);

    printf(win_no == 3 ? "\n あなたの勝ちです。\n" : "\n 私の勝ちです。\n");

    printf("%d勝%d敗%d分けでした。\n", win_no, lose_no, draw_no);

    return 0;
}


【Answer】演習問題 3-3

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

int comp;
int human;
char *hd[] = {"グー","チョキ","パー"};

void start(void)
{
    printf("じゃんけんゲーム開始!!\n");

    srand(time(NULL));
}

void comp_think(void)
{
    do{
        comp = rand() % 3;
    }while (comp == 1);/*チョキならやり直し*/
}

void human_think(void)
{
    printf("じゃんけんポン ・・・ ");
    for(int i = 0; i < 3; i++){
        printf("(%d)%s ",i,hd[i]);
    }
    printf(" : ");
    scanf("%d",&human);
}

void result(int x)
{
    switch (x){
    case 0: puts("引き分けです。"); break;
    case 1: puts("あなたの負けです。"); break;
    case 2: puts("あなたの勝ちです。"); break;
    }
}



int main(void)
{
    int judge;
    int n;

    start();/*じゃんけん開始*/

    do{
        comp_think(); /*コンピュータの手を決定*/
        human_think(); /*じゃんけんの入力*/   
        judge = (human - comp + 3) % 3; /*勝ち負け*/
        result(judge);  /*結果*/

        printf("もう一度やりますか ・・・ (0)いいえ (1)はい : ");
        scanf("%d",&n);
    }while(n == 1);

    return 0; 
}


【Answer】演習問題 3-4

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

int human;
int comp;

char *hd[] = {"グー","チョキ","パー"};

void initialize(void)
{
    srand(time(NULL));

    printf("じゃんけんゲーム開始!!\n");
}

void first_janken(void)
{
    int i;

    comp = 0;/*グーの選択*/

    do{
        printf("\n\aじゃんけんポン ・・・");
        for(i = 0; i < 3; i++)
            printf("(%d)%s", i, hd[i]);
        printf(" : ");
        scanf("%d",&human);
    }while(human < 0 || human > 2);
}

void jyanken(void)
{
    int i;

    comp = rand() % 3;

    do{
        printf("\n\aじゃんけんポン ・・・");
        for(i = 0; i < 3; i++)
            printf("(%d)%s", i, hd[i]);
        printf(" : ");
        scanf("%d",&human);
    }while(human < 0 || human > 2);
}

void count_no(int result)
{
    switch (result) {
    case 0: puts("引き分けです。");     break;     
    case 1: puts("あなたの負けです。"); break;
    case 2: puts("あなたの勝ちです。"); break;
    }
}

int confirm_retry(void)
{
    int x;

    printf("もう一度しますか ・・・ (0)いいえ (1)はい:");
    scanf("%d",&x);

    return x;
}

int main(void)
{
    int judge;
    int retry;
    int n = 0;

    initialize();
    
    do{
        if(n == 0){
            first_janken();
        }
        else
            jyanken();

        n++;
        
        printf("私は%sで、あなたは%sです。\n", hd[comp], hd[human]);

        judge = (human - comp + 3) % 3;

        count_no(judge);

        retry = confirm_retry();
    }while(retry == 1);

    return 0;
}


【Answer】演習問題 3-5

【人間が望む限り繰返し】
#include<time.h>
#include<stdio.h>
#include<stdlib.h>

int comp;
int human;

char *hd[] = {"グー","チョキ","パー"};

void start(void)
{
    srand(time(NULL));

    printf("じゃんけんゲーム開始!!\n");
}

void jyanken(void)
{
    comp = rand() % 3;

    do{
        for(int i = 0; i < 3; i++)
            printf("(%d)%s ",i, hd[i]);
        printf(" : ");
        scanf("%d",&human);
    }while(human < 0 || human > 2);
}

void jyanken_after(void)
{
    do{
        for(int i = 0; i < 3; i++)
            printf("(%d)%s ",i, hd[i]);
        printf(" : ");
        scanf("%d",&human);
    }while(human < 0 || human > 2);

    comp = (human + 2) % 3;
}

void count_no(int result)
{
    switch (result) {
    case 0: puts("引き分けです。");     break;     
    case 1: puts("あなたの負けです。"); break;
    case 2: puts("あなたの勝ちです。"); break;
    }
}

int confirm_retry(void)
{
    int x;

    printf("もう一度しますか ・・・ (0)いいえ (1)はい:");
    scanf("%d",&x);

    return x;
}

int main(void)
{
    int judge;
    int n = 1;
    int x;

    start();

    do
    {
        switch (n)
        {
        case 1:
        case 2:
        case 3:
        case 4: jyanken();  break;
        case 5: jyanken_after(); break;
        }
        
        n++;

        printf("私は%sで、あなたは%sです。\n", hd[comp], hd[human]);
      
        judge = (human - comp + 3) % 3;

        count_no(judge);

        if(n > 5)
            n = 1;
        
        x = confirm_retry();
    
    } while (x == 1);

    return 0;
    
}

----------------------------------------------

【n回勝負】
#include<time.h>
#include<stdio.h>
#include<stdlib.h>

int comp;
int human;
int win_no;
int lose_no;
int draw_no;

char *hd[] = {"グー","チョキ","パー"};

void start(void)
{
    srand(time(NULL));

    printf("じゃんけんゲーム開始!!\n");
}

void jyanken(void)
{
    comp = rand() % 3;

    do{
        for(int i = 0; i < 3; i++)
            printf("(%d)%s ",i, hd[i]);
        printf(" : ");
        scanf("%d",&human);
    }while(human < 0 || human > 2);
}

void jyanken_after(void)
{
    do{
        for(int i = 0; i < 3; i++)
            printf("(%d)%s ",i, hd[i]);
        printf(" : ");
        scanf("%d",&human);
    }while(human < 0 || human > 2);

    comp = (human + 2) % 3;
}

void count_no(int result)
{
    switch (result) {
    case 0: puts("引き分けです。");     draw_no++; break;     
    case 1: puts("あなたの負けです。"); lose_no++; break;
    case 2: puts("あなたの勝ちです。"); win_no++; break;
    }
}

int main(void)
{
    int judge;
    int n = 1;
    int x, y;

    start();

    printf("何回勝負にしますか : ");
    scanf("%d",&y);

    do
    {
        switch (n)
        {
        case 1:
        case 2:
        case 3:
        case 4: jyanken();  break;
        case 5: jyanken_after(); break;
        }
        
        n++;

        printf("私は%sで、あなたは%sです。\n", hd[comp], hd[human]);
      
        judge = (human - comp + 3) % 3;

        count_no(judge);

        if(n > 5)
            n = 1;
    
    } while (win_no < y && lose_no < y);

    printf("%d勝 %d敗 %d分でした。\n", win_no, lose_no, draw_no);

    return 0;
    
}


【Answer】演習問題 3-6

【人間が望む限り繰返し】
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

#define game 25

int x = 0; /*試合カウント回数*/
int judge[game];
int human[game];
int comp[game];

char *hd[] = {"グー","チョキ","パー"};

void start(void)
{
    srand(time(NULL));
    printf("じゃんけんゲーム開始!!\n");
}

void jyanken(void)
{
    comp[x] = rand() % 3;

    do{
        printf("\n\aじゃんけんポン ・・・");
        for(int i = 0; i < 3; i++)
            printf(" (%d)%s", i, hd[i]);
        printf(" : ");
        scanf("%d", &human[x]);
    }while(human[x] < 0 || human[x] > 2);
}

void disp_result(int result)
{
    switch (result)  {
    case 0: puts("引き分けです。。"); break;
    case 1: puts("あなたの負けです。"); break;
    case 2: puts("あなたの勝ちです。"); break;
    
    }
}

int  confirm_retty(void)
{
    int s;

    printf("もう一度しますか・・・(0)いいえ (1)はい : ");
    scanf("%d",&s);

    return s;
}

int main(void)
{
    int retry;

    start();

    do{
        jyanken();

        printf("私は%sで、あなたは%sです。\n", hd[comp[x]],hd[human[x]]);

        judge[x] = (human[x] - comp[x] + 3) % 3;

        disp_result(judge[x]);

        retry = confirm_retty();

        x++;

    }while (retry == 1);

    printf("勝敗結果!\n");

    for(int a = 0; a < x; a++){
        printf("%2d回目 \t(私)%s\t (あなた)%s\t (結果)", a + 1, hd[comp[a]], hd[human[a]]);
        switch (judge[a]) {
            case 0: puts("引き分けです。。"); break;
            case 1: puts("あなたの負けです。"); break;
            case 2: puts("あなたの勝ちです。"); break;
        }
    }
    
    return 0;
}
-------------------------------------------------------------------------------------------------------
【n回勝負】
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

#define game 25

int x = 0; /*試合カウント回数*/
int judge[game];
int human[game];
int comp[game];

int win_no = 0;;
int lose_no = 0;;
int draw_no = 0;;

char *hd[] = {"グー","チョキ","パー"};

void start(void)
{
    srand(time(NULL));
    printf("じゃんけんゲーム開始!!\n");
}

void jyanken(void)
{
    comp[x] = rand() % 3;

    do{
        printf("\n\aじゃんけんポン ・・・");
        for(int i = 0; i < 3; i++)
            printf(" (%d)%s", i, hd[i]);
        printf(" : ");
        scanf("%d", &human[x]);
    }while(human[x] < 0 || human[x] > 2);
}

void disp_result(int result)
{
    switch (result)  {
    case 0: puts("引き分けです。。"); draw_no++; break;
    case 1: puts("あなたの負けです。"); lose_no++; break;
    case 2: puts("あなたの勝ちです。"); win_no++; break;
    
    }
}

int main(void)
{
    int retry;
    int n;

    start();

    printf("何回勝負にしますか。:");
    scanf("%d",&n);

    do{
        jyanken();

        printf("私は%sで、あなたは%sです。\n", hd[comp[x]],hd[human[x]]);

        judge[x] = (human[x] - comp[x] + 3) % 3;

        disp_result(judge[x]);

        x++;

    }while (n > win_no && n > lose_no);

    printf("\n勝敗結果!\n");

    for(int a = 0; a < x; a++){
        printf("%2d回目 \t(私)%s\t (あなた)%s\t (結果)", a + 1, hd[comp[a]], hd[human[a]]);
        switch (judge[a]) {
            case 0: puts("引き分けです。。"); break;
            case 1: puts("あなたの負けです。"); break;
            case 2: puts("あなたの勝ちです。"); break;
        }
    }

    printf("\n%d勝%d敗%d分でした。\n", win_no, lose_no, draw_no);
    
    return 0;
}


【Answer】演習問題 3-7

【人間が望む限り繰返し】
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

int judge;
int human, comp1, comp2;

int win_no = 0;
int lose_no = 0;
int draw_no = 0;

char *hd[] = {"グー","チョキ","パー"};

void start(void)
{
    srand(time(NULL));
    printf("じゃんけんゲーム開始!!\n");
}

void jyanken(void)
{
    comp1 = rand() % 3;
    comp2 = rand() % 3;

    do{
        printf("\n\aじゃんけんポン ・・・");
        for(int i = 0; i < 3; i++)
            printf(" (%d)%s", i, hd[i]);
        printf(" : ");
        scanf("%d", &human);
    }while(human < 0 || human > 2);
}

/*3人じやんけん勝敗判定*/
void hantei(int a, int b, int c)
{
    /* human , comp1, comp2 でジャンケン
      humanが勝利条件
      一人勝ち(comp1 == comp2) 011, 122, 200
      二人勝ち(human == comp1) (human == comp2) 001, 010, 112, 121, 220,202
       上述 足算回答 一人勝ち 2, 5 二人勝ち 1, 4  
         一人勝ち (一人勝ち回答 + 3 ) % 3 ... 2
         二人勝ち (二人勝ち回答 + 3 ) % 3 ... 1  

     humanが負け条件
      一人負け(comp1 == comp2) 022, 100, 211
      二人負け(human == comp1) (human == comp2) 002, 020, 110, 101, 221, 212
       上述 足算回答 一人負け 4, 1 二人負け 2, 5  
         一人負け (一人勝ち負け + 3 ) % 3 ... 1
         二人負け (二人勝ち負け + 3 ) % 3 ... 2
      
      引き分け 000, 111, 222, 012~210 足算 0,  6, 3
           (引き分け足算 + 3) % 3 ... 0
    */


   int answer;

   if(b == c){
        answer = (a + b + c + 3) % 3;
            switch (answer){
            case 0: puts("引き分けです。"); draw_no++; break;
            case 1: puts("あなたの負けです。"); lose_no++; break;
            case 2: puts("あなたの勝ちです。"); win_no++; break;
            }
    }
    else if(a == b || a == c){
        answer = (a + b + c + 3) % 3;
        switch (answer){
            case 0: puts("引き分けです。"); draw_no++; break;
            case 1: puts("あなたの勝ちです。"); win_no++; break;
            case 2: puts("あなたの負けです。"); lose_no++; break;
            }
    }
    else{
        puts("引き分けです。"); draw_no++;
    }
}

int  confirm_retty(void)
{
    int s;

    printf("もう一度しますか・・・(0)いいえ (1)はい : ");
    scanf("%d",&s);

    return s;
}

int main(void)
{
    int retry;

    start();

    do{
        jyanken();

        printf("コンピューター1は%sで、コンピューター2は%sで、あなたは%sです。\n", hd[comp1],hd[comp2],hd[human]);

        hantei(human, comp1, comp2);

        retry = confirm_retty();

    }while (retry == 1);

    printf("\n勝敗結果!\n");

    printf("%d勝%d敗%d分でした。\n", win_no, lose_no, draw_no);
    
    return 0;
}
-------------------------------------------------------------------------------------------------------
【n回勝負】
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

int judge;
int human, comp1, comp2;

int win_no = 0;
int lose_no = 0;
int draw_no = 0;

char *hd[] = {"グー","チョキ","パー"};

void start(void)
{
    srand(time(NULL));
    printf("じゃんけんゲーム開始!!\n");
}

void jyanken(void)
{
    comp1 = rand() % 3;
    comp2 = rand() % 3;

    do{
        printf("\n\aじゃんけんポン ・・・");
        for(int i = 0; i < 3; i++)
            printf(" (%d)%s", i, hd[i]);
        printf(" : ");
        scanf("%d", &human);
    }while(human < 0 || human > 2);
}

/*3人じやんけん勝敗判定*/
void hantei(int a, int b, int c)
{
    /* human , comp1, comp2 でジャンケン
      humanが勝利条件
      一人勝ち(comp1 == comp2) 011, 122, 200
      二人勝ち(human == comp1) (human == comp2) 001, 010, 112, 121, 220,202
       上述 足算回答 一人勝ち 2, 5 二人勝ち 1, 4  
         一人勝ち (一人勝ち回答 + 3 ) % 3 ... 2
         二人勝ち (二人勝ち回答 + 3 ) % 3 ... 1  

     humanが負け条件
      一人負け(comp1 == comp2) 022, 100, 211
      二人負け(human == comp1) (human == comp2) 002, 020, 110, 101, 221, 212
       上述 足算回答 一人負け 4, 1 二人負け 2, 5  
         一人負け (一人勝ち負け + 3 ) % 3 ... 1
         二人負け (二人勝ち負け + 3 ) % 3 ... 2
      
      引き分け 000, 111, 222, 012~210 足算 0,  6, 3
           (引き分け足算 + 3) % 3 ... 0
    */

   int answer;

   if(b == c){
        answer = (a + b + c + 3) % 3;
            switch (answer){
            case 0: puts("引き分けです。"); draw_no++; break;
            case 1: puts("あなたの負けです。"); lose_no++; break;
            case 2: puts("あなたの勝ちです。"); win_no++; break;
            }
    }
    else if(a == b || a == c){
        answer = (a + b + c + 3) % 3;
        switch (answer){
            case 0: puts("引き分けです。"); draw_no++; break;
            case 1: puts("あなたの勝ちです。"); win_no++; break;
            case 2: puts("あなたの負けです。"); lose_no++; break;
            }
    }
    else{
        puts("引き分けです。"); draw_no++;
    }
}


int main(void)
{
    int retry;
    int n;

    start();

    printf("何回勝負にしますか。:");
    scanf("%d",&n);

    do{
        jyanken();

        printf("コンピューター1は%sで、コンピューター2は%sで、あなたは%sです。\n", hd[comp1],hd[comp2],hd[human]);

        hantei(human, comp1, comp2);


    }while (n > win_no && n > lose_no);

    printf("\n勝敗結果!\n");

    printf("%d勝%d敗%d分でした。\n", win_no, lose_no, draw_no);
    
    return 0;
}


【Answer】演習問題 3-8

【人間が望む限り繰返し】
#include<time.h>
#include<stdio.h>
#include<stdlib.h>

#define NUMBER 4 /*参加人数*/

int z[NUMBER - 1]; /*ジャンケンの手を格納*/
int win_no = 0;
int lose_no = 0;
int draw_no = 0;
int hand_count; /*3種類(グー、チョキ、パー)にうち、何種類かカウント*/

char *hd[] = {"グー","チョキ","パー"};

void start(void)
{
    printf("ジャンケンゲーム開始!!\n");

    srand(time(NULL));
}

void jyanken(void)
{
    for(int i = 1; i < (NUMBER); i++)
        z[i] = rand() % 3;
    
    printf("\n\aじゃんけんポン ... ");
    for(int i = 0; i < 3; i++)
        printf("(%d)%s", i, hd[i]);
    printf(" : ");
    scanf("%d", &z[0]);
}

void mesurements(void)
{
    int a[NUMBER - 1] = {0};
    hand_count = 0;

    /*全員の手を表示*/
    printf("(あなた)%s ", hd[z[0]]);
    for(int n = 1; n < NUMBER; n++){
        printf("(コンピューター%d)%s ", n, hd[z[n]]);
    }
    printf("\n");

    for(int i = 0; i < NUMBER; i++){
        switch (z[i]){
        case 0: a[0]++; break; /*グーを出した人数をカウント*/
        case 1: a[1]++; break; /*チョキを出した人数をカウント*/
        case 2: a[2]++; break; /*パーを出した人数をカウント*/
        }
    }

    /*勝敗は必ず2種類の手のみ、あいこは全員一緒、または全員バラバラ*/
    for(int i = 0; i < 3; i++){
        if(a[i] > 0)
            hand_count++; /*1or3はあいこ、2のみ勝敗がつく*/
    }

    if(hand_count == 2){ /*勝敗判定*/
        switch (z[0]) {  /*人間の手 */ 
        case 0: for(int i = 1; i < NUMBER; i++){
                    if(z[i] == 1) {/*コンピューターが一人でもチョキを出していれば*/
                          printf("あなたの勝ちです。\n"); 
                          win_no ++;
                          break;
                        }
                    else if(z[i] == 2){/*コンピューターが一人でもパーを出していれば*/
                        printf("あなたの負けです。\n");
                        lose_no++;
                        break;
                        }
                    }break;
        case 1: for(int i = 1; i < NUMBER; i++){
                    if(z[i] == 2){ /*コンピューターが一人でもパーを出していれば*/
                         printf("あなたの勝ちです。\n");
                         win_no++;
                         break;
                        }
                    else if(z[i] == 0){ /*コンピューターが一人でもグーを出していれば*/
                        printf("あなたの負けです。\n");
                        lose_no++;
                        break;
                        }
                    }break;
        case 2: for(int i = 1; i < NUMBER; i++){
                    if(z[i] == 0){ /*コンピューターが一人でもグーを出していれば*/
                         printf("あなたの勝ちです。\n");
                         win_no++;
                         break;
                        }
                    else if(z[i] == 1){ /*コンピューターが一人でもチョキを出していれば*/
                        printf("あなたの負けです。\n");
                        lose_no++;
                        break;
                        }
                    }break;
        }
    }
    else{
        printf("あいこです。\n");
        draw_no++;
    }
}

int  confirm_retty(void)
{
    int s;

    printf("もう一度しますか・・・(0)いいえ (1)はい : ");
    scanf("%d",&s);

    return s;
}



int main(void)
{
    int retry;

    start();

    do{
        /*敵の乱数設定*/ /*comp1 = z[1] comp2 = z[2] comp3 = [3]に格納*/ 
        /*人間の手*/ /*human = z[0]に格納*/
        jyanken();
        
        /*ジャンケンの種類カウント*//*勝敗は必ず2種類 1種類または3種類はあいこ*/
        /*2種類のみ見つけて 人間の手で勝敗は判定する*/
        mesurements();

        /*繰返しを聞く*/
        retry = confirm_retty();

    }while (retry == 1);

     /*勝敗表示*/
    printf("%d勝%d敗%d分でした。" ,win_no, lose_no, draw_no);
   
    return 0;
}
----------------------------------------------------------------------------------------------------
【n回勝負】
#include<time.h>
#include<stdio.h>
#include<stdlib.h>

#define NUMBER 4 /*参加人数*/

int z[NUMBER - 1]; /*ジャンケンの手を格納*/
int win_no = 0;
int lose_no = 0;
int draw_no = 0;
int hand_count; /*3種類(グー、チョキ、パー)にうち、何種類かカウント*/

char *hd[] = {"グー","チョキ","パー"};

void start(void)
{
    printf("ジャンケンゲーム開始!!\n");

    srand(time(NULL));
}

void jyanken(void)
{
    for(int i = 1; i < (NUMBER); i++)
        z[i] = rand() % 3;
    
    printf("\n\aじゃんけんポン ... ");
    for(int i = 0; i < 3; i++)
        printf("(%d)%s", i, hd[i]);
    printf(" : ");
    scanf("%d", &z[0]);
}

void mesurements(void)
{
    int a[NUMBER - 1] = {0};
    hand_count = 0;

    /*全員の手を表示*/
    printf("(あなた)%s ", hd[z[0]]);
    for(int n = 1; n < NUMBER; n++){
        printf("(コンピューター%d)%s ", n, hd[z[n]]);
    }
    printf("\n");

    for(int i = 0; i < NUMBER; i++){
        switch (z[i]){
        case 0: a[0]++; break; /*グーを出した人数をカウント*/
        case 1: a[1]++; break; /*チョキを出した人数をカウント*/
        case 2: a[2]++; break; /*パーを出した人数をカウント*/
        }
    }

    /*勝敗は必ず2種類の手のみ、あいこは全員一緒、または全員バラバラ*/
    for(int i = 0; i < 3; i++){
        if(a[i] > 0)
            hand_count++; /*1or3はあいこ、2のみ勝敗がつく*/
    }

    if(hand_count == 2){ /*勝敗判定*/
        switch (z[0]) {  /*人間の手 */ 
        case 0: for(int i = 1; i < NUMBER; i++){
                    if(z[i] == 1) {/*コンピューターが一人でもチョキを出していれば*/
                          printf("あなたの勝ちです。\n"); 
                          win_no ++;
                          break;
                        }
                    else if(z[i] == 2){/*コンピューターが一人でもパーを出していれば*/
                        printf("あなたの負けです。\n");
                        lose_no++;
                        break;
                        }
                    }break;
        case 1: for(int i = 1; i < NUMBER; i++){
                    if(z[i] == 2){ /*コンピューターが一人でもパーを出していれば*/
                         printf("あなたの勝ちです。\n");
                         win_no++;
                         break;
                        }
                    else if(z[i] == 0){ /*コンピューターが一人でもグーを出していれば*/
                        printf("あなたの負けです。\n");
                        lose_no++;
                        break;
                        }
                    }break;
        case 2: for(int i = 1; i < NUMBER; i++){
                    if(z[i] == 0){ /*コンピューターが一人でもグーを出していれば*/
                         printf("あなたの勝ちです。\n");
                         win_no++;
                         break;
                        }
                    else if(z[i] == 1){ /*コンピューターが一人でもチョキを出していれば*/
                        printf("あなたの負けです。\n");
                        lose_no++;
                        break;
                        }
                    }break;
        }
    }
    else{
        printf("あいこです。\n");
        draw_no++;
    }
}


int main(void)
{
    int retry;
    int last;

    start();

    printf("何回勝負にしますか。:");
    scanf("%d",&last);

    do{
        /*敵の乱数設定*/ /*comp1 = z[1] comp2 = z[2] comp3 = [3]に格納*/ 
        /*人間の手*/ /*human = z[0]に格納*/
        jyanken();
        
        /*ジャンケンの種類カウント*//*勝敗は必ず2種類 1種類または3種類はあいこ*/
        /*2種類のみ見つけて 人間の手で勝敗は判定する*/
        mesurements();

    }while (last > win_no && last > lose_no);

     /*勝敗表示*/
    printf("%d勝%d敗%d分でした。" ,win_no, lose_no, draw_no);
   
    return 0;
}

コメント