teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

コードを追加

2020/07/25 14:39

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -3,4 +3,44 @@
3
3
 
4
4
  また、次のような処理をしてみてはいかがですか?
5
5
  - data が min1 より小さければ、min2 = min1, min1 = data。
6
- - そうでなくて、data が min2 より小さければ、min2 = data。
6
+ - そうでなくて、data が min2 より小さければ、min2 = data。
7
+
8
+ **追記**
9
+ 質問のコードで「うまくいかない」わけを知りたいのですよね。
10
+ 10, 9, 8,... と入れるとどうなるか考えてみれば分かるはずです。
11
+ 各変数の値の変化を見てください。
12
+
13
+ 10 を入力すると、data = 10, min1 = 10, min2 = 0。
14
+ 9 を入力すると、data = 9。i = 1, min2 < data (0 < 9) なので何もしない。
15
+ 変ですよね。
16
+ 9が一番小さく、10 が二番目に小さいから、
17
+ min1 = 9、min2 = 10 になっていなくてはいけないのに。
18
+
19
+ こんな風に自分の書いたコードを確かめてみようと思わないのですか?
20
+
21
+ 私なら次のようなコードを書きます。
22
+ ```C
23
+ #include <stdio.h>
24
+
25
+ int main(void)
26
+ {
27
+ int min1 = 0x7fffffff; // 1番小さな値 (minimum number)
28
+ int min2 = 0x7fffffff; // 2番目に小さな値
29
+ int ent1 = 0; // min1 が何番目の入力か (entry number)
30
+ int ent2 = 0; // min2 が何番目の入力か
31
+ int data; // 入力データ
32
+
33
+ puts("10個の正整数を入力します");
34
+ for (int i = 1; i <= 10; i++) {
35
+ printf("%d番目 ", i);
36
+ scanf("%d", &data);
37
+ if (data < min1)
38
+ min2 = min1, ent2 = ent1, min1 = data, ent1 = i;
39
+ else if (data < min2)
40
+ min2 = data, ent2 = i;
41
+ }
42
+ printf("2番目に小さい数は%d番目に入力された%dです\n", ent2, min2);
43
+ }
44
+ ```
45
+ コンマ演算子を多用するなど、模範的なコードではありません。
46
+ 内容を理解して、自分のコードを書いてみてください。