質問編集履歴
2
誤字の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -100,7 +100,7 @@
|
|
100
100
|
### 前提
|
101
101
|
|
102
102
|
私が書いたコードの評価、及び模範回答の修正と解説をお願いします。
|
103
|
-
特に、模範解答の
|
103
|
+
特に、模範解答の27〜31行目のbool型については、ネットで調べてもこのような使い方が出てこないため全く理解できていません。
|
104
104
|
|
105
105
|
|
106
106
|
自作コード↓
|
1
テキストの詳細についての追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,7 +1,101 @@
|
|
1
1
|
### 実現したいこと
|
2
2
|
|
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
|
147
|
+
int main(void)
|
50
|
-
|
148
|
+
{
|
51
|
-
|
149
|
+
srand((unsigned)time(NULL));
|
150
|
+
|
52
|
-
|
151
|
+
printf("***数当てゲーム(レベル2)***¥n");
|
152
|
+
printf("3桁の数を当ててください!¥n");
|
53
|
-
|
153
|
+
printf("ただし各桁の数字は重複しません¥n");
|
154
|
+
|
54
|
-
|
155
|
+
int answer[3];
|
55
|
-
|
156
|
+
int input[3];
|
56
|
-
|
157
|
+
bool check;
|
158
|
+
|
57
|
-
|
159
|
+
/* 答えを決める */
|
58
|
-
|
160
|
+
for (int i = 0; i < 3; i++) {
|
59
|
-
|
161
|
+
do {
|
60
|
-
|
162
|
+
answer[i] = rand() % 10; // ランダムな0〜9を設定
|
163
|
+
|
164
|
+
// これまでの桁に同じ数字が使われているかをチェック
|
61
|
-
|
165
|
+
for (int j = 0; j < i; j++) {
|
62
|
-
|
166
|
+
check = false;
|
63
|
-
|
167
|
+
if (answer[i] == answer[j]) { // 同じ数字はNG
|
64
|
-
|
168
|
+
break;
|
65
|
-
|
169
|
+
}
|
66
|
-
|
170
|
+
check = true; // 重複なければOK
|
67
|
-
|
171
|
+
}
|
68
|
-
|
172
|
+
} while (i > 0 && check == false); // 1桁目はチェック不要
|
69
|
-
|
173
|
+
}
|
70
|
-
|
174
|
+
return 0;
|
71
175
|
}
|
72
176
|
```
|
73
177
|
|
74
178
|
### 発生している問題
|
75
179
|
|
76
180
|
```
|
77
|
-
模範解答は実行をかけても
|
181
|
+
模範解答の抜粋では実行をかけてもprintf文が実行されるだけで、表示されるだけで数字は生成されません。
|
182
|
+
抜粋したために発生した問題かと思いますが、問題の部分も分からない状態です。
|
78
183
|
```
|
79
184
|
|
80
185
|
### 試したこと
|