C入門8 課題解答

1. さいころプログラムを書いてください。実行すると、1から6の目が出るものです。
  もちろん、実行する度に(基本的には)異なる数字が表示されるようにしてください。

/* kadai8_1.c */
#include <stdio.h>
#include <stdlib.h> /* randとsrandを使うため */
#include <time.h>  /* timeを使うため */

int main(void)
{
    srand( (unsigned)time( NULL ) );
    printf("%d\n", rand() % 6 + 1);
    return 0;
}

2. 実行すると、今日のパワーとラッキー度が表示されるプログラムを書いてください。
  パワーとラッキー度は、1から100までとします。

/* kadai8_2.c */
#include <stdio.h>
#include <stdlib.h> /* randとsrandを使うため */
#include <time.h>  /* timeを使うため */

int main(void)
{
    srand( (unsigned)time( NULL ) );
    printf("今日のパワー  :%d\n", rand() % 100 + 1);
    printf("今日のラッキー度:%d\n", rand() % 100 + 1);
    return 0;
}

3. 入門8のおみくじプログラムを改良してオリジナルのおみくじプログラムを書いてください。
  結果は、10通り以上にしてください。

/* kadai8_3.c */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    char* kekka[10] = {"友達を大切にしよう。友達は一生の宝。",
                              "講義にはきちんと出よう。早退より、居眠りより、遅刻がよくない。",
                              "講義が終わったら、ちょっとその辺を散歩してみよう。",
                              "気になるあの人に声をかけてみよう。",
                              "あたってくだける日もある。それが人生。",
                              "プログラミングがおもしろくなる運気を感じます。",
                              "コンピュータ以外のことも勉強しような。",
                              "暑い日は、海かプールだね。いいことあるかもよ。",
                              "ビールは20歳になってからだな。",
                              "毎日、得たものを数えてみよう。"};

    srand( (unsigned)time(NULL) );
    printf("%s\n", kekka[rand() % 10]);
    return 0;
}

  switch文を使うと大変だとと思います。

4. じゃんけんプログラムを書いてください。ユーザがグー、チョキ、パーを指示すると、
  プログラムが結果を出すものです。

  単純にやると次のようになるでしょう。

/* kadai8_4.c */
#include <stdio.h>
#include <stdlib.h> /* randとsrandを使うため */
#include <time.h>  /* timeを使うため */

int main(void)
{
    /* userはユーザの手、compはコンピュータの手 */
    int user, comp;
    srand( (unsigned)time( NULL ) );
    printf("じゃんけんです。何を出しますか?\n");
    printf("1 グー 2 チョキ 3 パー\n");
    scanf("%d", &user);
    comp = rand() % 3 + 1;
    if(comp == 1){
        if(user == 1){
            printf("あなたはグー。私はグー。ひきわけですね。\n");
        }
        else if(user == 2){
            printf("あなたはチョキ。私はグー。私の勝ちですね。\n");
        }
        else if(user == 3){
            printf("あなたはパー。私はグー。あなたの勝ちです。\n");
        }
    }
    else if(comp == 2){
        if(user == 1){
            printf("あなたはグー。私はチョキ。あなたの勝ちです。\n");
        }
        else if(user == 2){
            printf("あなたはチョキ。私はチョキ。ひきわけですね。\n");
        }
        else if(user == 3){
            printf("あなたはパー。私はチョキ。私の勝ちですね。\n");
        }
    }
    else if(comp == 3){
        if(user == 1){
            printf("あなたはグー。私はパー。私の勝ちですね。\n");
        }
        else if(user == 2){
            printf("あなたはチョキ。私はパー。あなたの勝ちです。\n");
        }
        else if(user == 3){
            printf("あなたはパー。私はパー。ひきわけですね。\n");
        }
    }
    return 0;
}

  初心者なら、ここまでできれば上出来です。
  しかし、ながいですね。もっと短くする方法も考えてみましょう。
  考える方向として、「勝ち負け判定のアルゴリズムを工夫する」方向と
  「表示手順を工夫する」方向があります。
  頭を鍛えるには「勝ち負け判定」を考えるとよいかもしれませんが、とりあえず、
  プログラミング能力を高めるには、「表示手順」を考えるとよいと思います。
  たとえば、「あなたは」「私は」なんかの繰り返しは必要でしょうか?
  「グー」「チョキ」「パー」はどうでしょうか?

5. じゃんけん3回勝負のプログラムを書いてください。

  これも単純にやると次のようになりそうです。
  しかし、これは、必ずしも「よいプログラム」ではありません。
  もう限界で、これ以上、このプログラムをいじると、泥沼にはまりそうだからです。
  プログラムを短くすることが難しくても、わかりやすくすることはできるのです。
  これは、次回以降で考えることにします。

/* kadai8_5.c */
#include <stdio.h>
#include <stdlib.h> /* randとsrandを使うため */
#include <time.h>  /* timeを使うため */

int main(void)
{
    /* userはユーザの手、compはコンピュータの手 */
    /* uwinはユーザの勝ち数、cwinはコンピュータの勝ち数 */
    int user, comp, i, uwin = 0, cwin = 0;
    printf("じゃんけん3回勝負!\n\n");
    srand( (unsigned)time( NULL ) );
    for(i = 0; i < 3; i++){
        printf("何を出しますか?\n");
        printf("1 グー 2 チョキ 3 パー\n");
        scanf("%d", &user);
        comp = rand() % 3 + 1;
        if(comp == 1){
            if(user == 1){
                printf("あなたはグー。私はグー。ひきわけですね。\n");
            }
            else if(user == 2){
                printf("あなたはチョキ。私はグー。私の勝ちですね。\n");
                cwin++;
            }
            else if(user == 3){
                printf("あなたはパー。私はグー。あなたの勝ちです。\n");
                uwin++;
            }
        }
        else if(comp == 2){
            if(user == 1){
                printf("あなたはグー。私はチョキ。あなたの勝ちです。\n");
                uwin++;
            }
            else if(user == 2){
                printf("あなたはチョキ。私はチョキ。ひきわけですね。\n");
            }
            else if(user == 3){
                printf("あなたはパー。私はチョキ。私の勝ちですね。\n");
                cwin++;
            }
        }
        if(comp == 3){
            if(user == 1){
                printf("あなたはグー。私はパー。私の勝ちですね。\n");
                cwin++;
            }
            else if(user == 2){
                printf("あなたはチョキ。私はパー。あなたの勝ちです。\n");
                uwin++;
            }
            else if(user == 3){
                printf("あなたはパー。私はパー。ひきわけですね。\n");
            }
        }
    }
    /* 3回勝負だから引き分け数は、 3 - uwin - cwin */
    printf("\nあなたの%d勝%d敗%d引き分け\n", uwin, cwin, 3 - uwin - cwin); 
    return 0;
}

6. 数当てゲームを作ってください。
  数は1から10までのどれかとし、ユーザが答えるチャンスは5回とします。

/* kadai8_6.c */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    /* xに正解を格納。ansにユーザの入力を受け取る */
    int i, x, ans;
    srand( (unsigned)time( NULL ) );
    printf("数当てゲームです。正解は1から10のどれか。\n");
    printf("チャンスは5回です。\n");
    x = rand() % 10 + 1;      /* 正解を乱数で決める */
    for(i = 0; i < 5; i++){
        printf("好きな数字を入力してください。\n");
        scanf("%d", &ans);    /* ユーザの入力をansに格納 */
        if(x == ans){
            printf("大当たり!\n");
            break;            /* ループの終了 */
        }
        else if(x > ans){
            printf("小さすぎです。\n");
        }
        else{                 /* x < ans の場合 */
            printf("大きすぎです。\n");
        }
    }
    printf("終了\n");
    return 0;
}

課題8

C入門8
C入門目次
ホーム