教科書の回答がありませんので、順番にまとめていきます。
本当の初心者ですので、間違いなどありましたらご教授のほどお願いいたします。
また、回答は私個人で作成していますので、ご了承くださいませ。
第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; }
コメント