質問編集履歴

2

誤字の修正

2024/03/14 04:05

投稿

kihochi
kihochi

スコア2

test CHANGED
File without changes
test CHANGED
@@ -100,7 +100,7 @@
100
100
  ### 前提
101
101
 
102
102
  私が書いたコードの評価、及び模範回答の修正と解説をお願いします。
103
- 特に、模範解答の1923行目のbool型については、ネットで調べてもこのような使い方が出てこないため全く理解できていません。
103
+ 特に、模範解答の27〜31行目のbool型については、ネットで調べてもこのような使い方が出てこないため全く理解できていません。
104
104
 
105
105
 
106
106
  自作コード↓

1

テキストの詳細についての追記

2024/03/14 04:03

投稿

kihochi
kihochi

スコア2

test CHANGED
File without changes
test CHANGED
@@ -1,7 +1,101 @@
1
1
  ### 実現したいこと
2
2
 
3
- 乱数生成にて、重複しない3桁の数字を生成する。
3
+ 乱数重複しない3桁の数字を生成する。
4
- - [ ] テキストにて上記の練習問題がありました。自分で書いたコードで一応実現できましたが、模範解答とかなり異なっており、最適解なのか疑問です。また、模範解答で実行をかけても字が生成されないまま終了してしまいます。
4
+ - [ ] 自分で書いたコードで一応実現できましたが、テキストの模範解答とかなり異なっており、最適解なのか疑問です。模範解答ゲームの一部のため、全文は以下に記載します。
5
+ 著書名:スッキリわかるC言語入門第2版
6
+ 著者名:中山清喬
7
+ 出版社:インプレス
8
+ 該当のページ:257
9
+
10
+ ```C
11
+ #include <stdio.h>
12
+ #include <stdbool.h>
13
+ #include <stdlib.h>
14
+ #include <time.h>
15
+
16
+ typedef char String[1024];
17
+
18
+ int main(void)
19
+ {
20
+ srand((unsigned)time(NULL));
21
+
22
+ printf("***数当てゲーム(レベル2)***¥n");
23
+ printf("3桁の数を当ててください!¥n");
24
+ printf("ただし各桁の数字は重複しません¥n");
25
+
26
+ int answer[3];
27
+ int input[3];
28
+ bool check;
29
+
30
+ /* 答えを決める */
31
+ for (int i = 0; i < 3; i++) {
32
+ do {
33
+ answer[i] = rand() % 10; // ランダムな0〜9を設定
34
+
35
+ // これまでの桁に同じ数字が使われているかをチェック
36
+ for (int j = 0; j < i; j++) {
37
+ check = false;
38
+ if (answer[i] == answer[j]) { // 同じ数字はNG
39
+ break;
40
+ }
41
+ check = true; // 重複なければOK
42
+ }
43
+ } while (i > 0 && check == false); // 1桁目はチェック不要
44
+ }
45
+
46
+ do { // ゲームが続く間はループする
47
+ /* 結果を初期化 */
48
+ int hit = 0;
49
+ int blow = 0;
50
+
51
+ /* 入力された予想を変数に設定 */
52
+ for (int i = 0; i < 3; i++) {
53
+ printf("%d桁目の予想を0〜9の数字で入力してください:", i + 1);
54
+ String inputStr;
55
+ scanf("%s", inputStr);
56
+ input[i] = atoi(inputStr);
57
+ }
58
+
59
+ /* 答えあわせ */
60
+ for (int i = 0; i < 3; i++) {
61
+ if (input[i] == answer[i]) {
62
+ hit++; // 位置も数字も一致ならhit
63
+ }
64
+ for (int j = 0; j < 3; j++) {
65
+ if (input[i] == answer[j] && i != j) {
66
+ blow++; // 位置の異なる数字はblow
67
+ }
68
+ }
69
+ }
70
+
71
+ /* 結果発表 */
72
+ printf("%dヒット! %dブロー!¥n", hit, blow);
73
+
74
+ if (hit == 3) {
75
+ // 正解
76
+ printf("正解です!¥n");
77
+ break;
78
+ } else {
79
+ // 不正解
80
+ printf("続けますか?(0:終了 0以外の数字:続ける):");
81
+ String retryStr;
82
+ scanf("%s", retryStr);
83
+
84
+ // 終了するなら正解を表示
85
+ if (atoi(retryStr) == 0) {
86
+ printf("正解は・・・");
87
+ for (int i = 0; i < 3; i++) {
88
+ printf("%d", answer[i]);
89
+ }
90
+ printf("でした!¥n");
91
+ break; // ループを抜けて終了
92
+ }
93
+ }
94
+ } while (true);
95
+
96
+ return 0;
97
+ }
98
+ ```
5
99
 
6
100
  ### 前提
7
101
 
@@ -40,41 +134,52 @@
40
134
  ```
41
135
 
42
136
  模範解答↓
137
+ ※抜粋したためか、以下のコードでは数字の生成がされないまま終了してしまします。
138
+
43
139
  ```C
44
140
  #include <stdio.h>
45
141
  #include <stdbool.h>
46
142
  #include <stdlib.h>
47
143
  #include <time.h>
48
144
 
145
+ typedef char String[1024];
146
+
49
- int main (void){
147
+ int main(void)
50
-
148
+ {
51
- srand((unsigned)time(NULL));
149
+ srand((unsigned)time(NULL));
150
+
52
-
151
+ printf("***数当てゲーム(レベル2)***¥n");
152
+ printf("3桁の数を当ててください!¥n");
53
- printf("重複ない3桁の数字を生成します。\n");
153
+ printf("ただ桁の数字は重複しません¥n");
154
+
54
-
155
+ int answer[3];
55
- int num [3];
156
+ int input[3];
56
- bool check;
157
+ bool check;
158
+
57
-
159
+ /* 答えを決める */
58
- for (int i = 0; i < 3; i++) {
160
+ for (int i = 0; i < 3; i++) {
59
- do {
161
+ do {
60
- num [i] = rand() % 10;
162
+ answer[i] = rand() % 10; // ランダムな0〜9を設定
163
+
164
+ // これまでの桁に同じ数字が使われているかをチェック
61
- for (int j = 0; j < i; j++) {
165
+ for (int j = 0; j < i; j++) {
62
- check = false;
166
+ check = false;
63
- if (num [i] == num [j]) {
167
+ if (answer[i] == answer[j]) { // 同じ数字はNG
64
- break;
168
+ break;
65
- }
169
+ }
66
- check = true;
170
+ check = true; // 重複なければOK
67
- }
171
+ }
68
- } while (i > 0 && check == false);
172
+ } while (i > 0 && check == false); // 1桁目はチェック不要
69
- }
173
+ }
70
- return 0;
174
+ return 0;
71
175
  }
72
176
  ```
73
177
 
74
178
  ### 発生している問題
75
179
 
76
180
  ```
77
- 模範解答は実行をかけても”重複しない3桁の数字を生成します。”と表示されるだけで数字は生成されません。
181
+ 模範解答の抜粋では実行をかけてもprintf文が実行されるだけで、表示されるだけで数字は生成されません。
182
+ 抜粋したために発生した問題かと思いますが、問題の部分も分からない状態です。
78
183
  ```
79
184
 
80
185
  ### 試したこと