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変数が初期化されていないので、こちらのコードですとエラーを起こすかもですっ
きびしめのコンパイルするとちゃんと出てましたね!
コメントありがとうございます!