明解C言語の中級 1章末問題解いてみた


最近はフォルランの話題で持ち切りですが、Jリーグが話題になるのってかなり久し振りな気がしますね。

最近のたけけんはというと、とりあえず1章の数当てゲームが終わった!
章末に自由課題が載っているのでやってみました。

1問目 無難な感じ。

//おみくじ

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

int main(void)
{
        int i;
        char *omikuji[5] = { "大吉", "吉", "中吉", "小吉", "凶" };
        int k;
        int yn;

        srand(time(NULL));
        k = rand() % 6;

        printf("おみくじひいてな?\n");
        printf("はい -- (1) いいえ -- (2) -> ");
        scanf("%d", &yn);
        if ( yn == 1 ) {
                printf("おみくじの結果は%sですねん。\n", omikuji[k]);
        }

        return 0;
}

2問目 疑似乱数の大きい小さいで振り分けた。

//おみくじ いいのが出やすく細工した裏もの

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

int main(void)
{
        int i;
        char *omikujia[4] = { "大吉", "吉", "中吉", "小吉" };
        char *omikujib[3] = { "大凶", "凶", "末吉" };
        int k, x, y;
        int yn;

        srand(time(NULL));
        k = rand() % 100;
        x = rand() % 4;
        y = rand() % 3;

        printf("おみくじひいてな?\n");
        printf("はい -- (1) いいえ -- (2) -> ");
        scanf("%d", &yn);
        if ( yn == 1 ) {
                if ( k > 30 ){
                        printf("おみくじの結果は%sですねん。\n", omikujia[x]);
                } else {
                        printf("おみくじの結果は%sですねん。\n", omikujib[y]);
                }
        } else
                printf("ばいなら\n");

        return 0;
}

3問目 randは結構負荷が高いのかしらね。

// -999~999の整数とした数あてゲーム
//
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
        int no;
        int ans;
        int max_stage=20;
        int remain = max_stage;

        srand(time(NULL));
        ans = rand() % 1999 - 999;

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

        do {
                printf("残り%d回 -->", remain);
                scanf("%d", &no);
                remain--;

                if (no > ans)
                        printf("もっと小さい\n");
                else if (no < ans)
                        printf("もっと大きい\n");
                } while (no != ans && remain > 0);

        if (no != ans)
                printf("残念。正解は%dでした。\n", ans);
        else {
                printf("正解です。\n");
                printf("%d回であたり\n", max_stage - remain);
        }

        return 0;
}

4問目 無難な感じ。

// 3以上999以下の3の倍数 数あてゲーム
//
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
        int no;
        int rans;
        int max_stage=20;
        int remain = max_stage;

        srand(time(NULL));
        rans = 1;
        while ( rans % 3 != 0)
                rans = 1 + rand() % 1000;

        printf("3~999で3の倍数である数を書いてね。\n\n");

        do {
                printf("残り%d回 -->", remain);
                scanf("%d", &no);
                remain--;

        if ( no % 3 != 0){
                                printf("3の倍数だけだよ~\n");
                                return 0;
                } else
                        if (no > rans)
                                printf("もっと小さい\n");
                        else if (no < rans)
                                printf("もっと大きい\n");
                        } while (no != rans && remain > 0);

                if (no != rans)
                        printf("残念。正解は%dでした。\n", rans);
                else {
                        printf("正解です。\n");
                        printf("%d回であたり\n", max_stage - remain);
                        }
        return 0;
}

5問目 無難な感じ。

// 範囲をランダムに 数あてゲーム
//
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
        int no, st, gl;
        int rans;
        int max_stage = 20;
        int remain = max_stage;

        do {
        srand(time(NULL));
        rand(); rand(); rand(); rand();

        st = rand() % 500;
        gl = st + rand() % 500;
        rans = st + rand() % gl;
        } while ( rans > gl );

        printf("%d~%dの数を書いてね。\n\n", st, gl);

        // 回数を決める
        max_stage = ( gl - st ) / 30;
        remain = max_stage;

        do {
                printf("残り%d回 -->", remain);
                scanf("%d", &no);
                remain--;

                        if (no > rans)
                                printf("もっと小さい\n");
                         else if (no < rans)
                                printf("もっと大きい\n");
                        } while (no != rans && remain > 0);

                if (no != rans)
                        printf("残念。正解は%dでした。\n", rans);
                else {
                        printf("正解です。\n");
                        printf("%d回であたり\n", max_stage - remain);
                        }

        return 0;
}

6問目 くじを引く回数を決める式が微妙だ。

// レベルを選択 範囲をランダムに 数あてゲーム
//
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
        int no, st, gl;
        int level;
        int rans;
        int max_stage;
        int remain;
        int sho, dai;

        printf("数あてのレベルを選択ください\n");
        printf("簡単1 普通2 難しい3 - 1~3?");

        scanf("%d", &level);
        if ( !(level >= 1 && level <= 3) ){
                printf("1~3だけにしてや\n\n");
                return 0;
        } else
        switch (level){
                case 1:
                        sho = 100, dai = 100;
                        break;
                case 2:
                        sho = 100, dai = 1000;
                        break;
                case 3:
                        sho = 100, dai = 10000;
                        break;
                }

        // 数の幅を決める
        //
        do {
        srand(time(NULL));
        rand(); rand(); rand(); rand();

        st = rand() % sho;
        gl = st + rand() % dai;
        rans = st + rand() % gl;
        } while ( rans > gl );

        printf("%d~%dの数を書いてね。\n\n", st, gl);

        // 回数を決める
        max_stage = ( gl - st ) / 20;

---------------------------------
        追記 普通にもとめた。
         if ( 3000 <  gl - st)
                 max_stage = 30;
              else if (1000 < gl - st)
               max_stage = 20;
              else
               max_stage = 10;
 ----------------------------------

        remain = max_stage;

        do {
                printf("残り%d回 -->", remain);
                scanf("%d", &no);
                remain--;

                        if (no > rans)
                                printf("もっと小さい\n");
                         else if (no < rans)
                                printf("もっと大きい\n");
                        } while (no != rans && remain > 0);

                if (no != rans)
                        printf("残念。正解は%dでした。\n", rans);
                else {
                        printf("正解です。\n");
                        printf("%d回であたり\n", max_stage - remain);
                        }

        return 0;
}

7問目

//数あてゲーム 1

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

#define MAX_STAGE 10

int main(void)
{
        int i;
        int no;
        int stage;
        int ans;
        int num[MAX_STAGE];

        srand(time(NULL));
        ans = rand() % 1000;

        printf("0~999の整数を当ててください。, \n\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("残念。正解は%dでした。\n", ans);
        else {
                printf("正解です。\n");
                printf("%d回で正解しました。\n", stage);
        }

        puts("\n---------------------------");
        for (i=0; i < stage; i++){
                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;
}

8問目

//数あてゲーム 1

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

#define MAX_STAGE 10

int main(void)
{
        int i;
        int no;
        int stage;
        int ans;
        int num[MAX_STAGE];

        srand(time(NULL));
        ans = rand() % 1000;

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

        for ( stage = 0; no != ans && 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");
                }

        if (no != ans)
                printf("残念。正解は%dでした。\n", ans);
        else {
                printf("正解です。\n");
                printf("%d回で正解しました。\n", stage);
        }

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

        return 0;
}

7問目と8問目は本に載ってるソースを修正するものなので、問題があったら削除するので連絡ください。

1章だし、まだまだ序の口といった感じですね。

 

Similar Posts:


Leave a Reply

Your email address will not be published. Required fields are marked *