TCP/IPソケットプログラミング C言語編を読みたいが故に柴田望洋さんの明解C言語入門編からC言語の勉強を始めました。でただいま中級編に入ったところです。章末に自由課題が載っているのでやってみました。まだ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問目 数あてゲームです。
#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問目 数あてゲームだよ。
#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章だし、まだまだ序の口といった感じですね。
世の中ではフォルランの話題で持ち切りですが、Jリーグが話題になるのってかなり久し振りな気がしますね。
問題8について
中級編1章解答とても助かります!ありがとうございます!
その中で一つ気になりまして、問題8のno変数が初期化されていないので、こちらのコードですとエラーを起こすかもですっ
きびしめのコンパイルするとちゃんと出てましたね!
コメントありがとうございます!