実現したいこと
乱数で重複しない3桁の数字を生成する。
- 自分で書いたコードで一応実現できましたが、テキストの模範解答とかなり異なっており、最適解なのか疑問です。模範解答は数当てゲームの一部のため、全文は以下に記載します。
著書名:スッキリわかるC言語入門第2版
著者名:中山清喬
出版社:インプレス
該当のページ:257
C
1#include <stdio.h> 2#include <stdbool.h> 3#include <stdlib.h> 4#include <time.h> 5 6typedef char String[1024]; 7 8int main(void) 9{ 10 srand((unsigned)time(NULL)); 11 12 printf("***数当てゲーム(レベル2)***¥n"); 13 printf("3桁の数を当ててください!¥n"); 14 printf("ただし各桁の数字は重複しません¥n"); 15 16 int answer[3]; 17 int input[3]; 18 bool check; 19 20 /* 答えを決める */ 21 for (int i = 0; i < 3; i++) { 22 do { 23 answer[i] = rand() % 10; // ランダムな0〜9を設定 24 25 // これまでの桁に同じ数字が使われているかをチェック 26 for (int j = 0; j < i; j++) { 27 check = false; 28 if (answer[i] == answer[j]) { // 同じ数字はNG 29 break; 30 } 31 check = true; // 重複なければOK 32 } 33 } while (i > 0 && check == false); // 1桁目はチェック不要 34 } 35 36 do { // ゲームが続く間はループする 37 /* 結果を初期化 */ 38 int hit = 0; 39 int blow = 0; 40 41 /* 入力された予想を変数に設定 */ 42 for (int i = 0; i < 3; i++) { 43 printf("%d桁目の予想を0〜9の数字で入力してください:", i + 1); 44 String inputStr; 45 scanf("%s", inputStr); 46 input[i] = atoi(inputStr); 47 } 48 49 /* 答えあわせ */ 50 for (int i = 0; i < 3; i++) { 51 if (input[i] == answer[i]) { 52 hit++; // 位置も数字も一致ならhit 53 } 54 for (int j = 0; j < 3; j++) { 55 if (input[i] == answer[j] && i != j) { 56 blow++; // 位置の異なる数字はblow 57 } 58 } 59 } 60 61 /* 結果発表 */ 62 printf("%dヒット! %dブロー!¥n", hit, blow); 63 64 if (hit == 3) { 65 // 正解 66 printf("正解です!¥n"); 67 break; 68 } else { 69 // 不正解 70 printf("続けますか?(0:終了 0以外の数字:続ける):"); 71 String retryStr; 72 scanf("%s", retryStr); 73 74 // 終了するなら正解を表示 75 if (atoi(retryStr) == 0) { 76 printf("正解は・・・"); 77 for (int i = 0; i < 3; i++) { 78 printf("%d", answer[i]); 79 } 80 printf("でした!¥n"); 81 break; // ループを抜けて終了 82 } 83 } 84 } while (true); 85 86 return 0; 87}
前提
私が書いたコードの評価、及び模範回答の修正と解説をお願いします。
特に、模範解答の27〜31行目のbool型については、ネットで調べてもこのような使い方が出てこないため全く理解できていません。
自作コード↓
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4 5int main (void){ 6 7 printf("重複しない3桁の数字を生成します。\n"); 8 srand((unsigned)time(NULL)); 9 int num [3] = {0}; 10 num [0] = rand() % 10; 11 while (1) { 12 num [1] = rand() % 10; 13 if (num [1] != num [0]) 14 break; 15 } 16 while (1) { 17 num [2] = rand() % 10; 18 if (num [2] != num [0] && num [2] != num [1]) 19 break; 20 } 21 for (int i = 0; i < 3; i++) { 22 printf("%d", num [i]); 23 } 24 printf("\n"); 25 return 0; 26}
模範解答↓
※抜粋したためか、以下のコードでは数字の生成がされないまま終了してしまします。
C
1#include <stdio.h> 2#include <stdbool.h> 3#include <stdlib.h> 4#include <time.h> 5 6typedef char String[1024]; 7 8int main(void) 9{ 10 srand((unsigned)time(NULL)); 11 12 printf("***数当てゲーム(レベル2)***¥n"); 13 printf("3桁の数を当ててください!¥n"); 14 printf("ただし各桁の数字は重複しません¥n"); 15 16 int answer[3]; 17 int input[3]; 18 bool check; 19 20 /* 答えを決める */ 21 for (int i = 0; i < 3; i++) { 22 do { 23 answer[i] = rand() % 10; // ランダムな0〜9を設定 24 25 // これまでの桁に同じ数字が使われているかをチェック 26 for (int j = 0; j < i; j++) { 27 check = false; 28 if (answer[i] == answer[j]) { // 同じ数字はNG 29 break; 30 } 31 check = true; // 重複なければOK 32 } 33 } while (i > 0 && check == false); // 1桁目はチェック不要 34 } 35 return 0; 36}
発生している問題
模範解答の抜粋では実行をかけてもprintf文が実行されるだけで、表示されるだけで数字は生成されません。 抜粋したために発生した問題かと思いますが、問題の部分も分からない状態です。
試したこと
ネットでの検索。
回答5件
あなたの回答
tips
プレビュー