質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

5069閲覧

2番目に小さい値とその添字の出力

langhtorn

総合スコア105

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/07/25 12:27

編集2020/07/25 13:50

###実現したいこと
2番目に小さい値とその添え字を出力したい。
※全部異なる値が入力されるとします。
###問題点
いまのプログラムだと下記の実行結果になります。
10から降順にまた昇順にならべるとうまくいきません。

10個の正整数を入力します 1番目 10 min1=10 min2=10 2番目 9 min1=9 min2=10 3番目 8 min1=8 min2=10 4番目 7 min1=7 min2=10 5番目 6 min1=6 min2=10 6番目 5 min1=5 min2=10 7番目 4 min1=4 min2=10 8番目 3 min1=3 min2=10 9番目 2 min1=2 min2=10 10番目 1 min1=1 min2=10 2番目に小さい数は0番目に入力された10です

ランダムだとうまくいきます。

10個の正整数を入力します 1番目 4 min1=4 min2=4 2番目 7 min1=4 min2=4 3番目 2 min1=2 min2=4 4番目 9 5番目 0 min1=0 min2=4 6番目 5 min1=0 min2=4 7番目 1 ans=7 min1=0 min2=1 8番目 3 min1=0 min2=1 9番目 8 min1=0 min2=1 10番目 10 min1=0 min2=1 2番目に小さい数は7番目に入力された1です

###コード

C

1#include<stdio.h> 2int main(void) 3{ 4 int i,data,maxans; 5 int min1=0; //1番小さな値 6 int min2=0; //2番目に小さな値 7 int ans=0; 8 //添え字を保存しておく 9 10 printf("10個の正整数を入力します\n"); 11 for(i=0;i<10;i++){ 12 printf("%d番目 ",i+1); 13 scanf("%d",&data); 14 if(i==0){ 15 min1=data; 16 min2=min1; 17 }else if(min2>data){ 18 if(min1<data){ 19 min2=data; 20 ans=i+1; 21 printf("ans=%d\n",ans); 22 } 23 if(min1>data){ 24 min1=data; 25 } 26 //ans=i+1; 27 //printf("ans=%d\n",ans); 28 } 29 printf("min1=%d min2=%d\n",min1,min2); 30 } 31 32 printf("2番目に小さい数は%d番目に入力された%dです\n",ans,min2); 33 return 0; 34}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2020/07/25 12:37

最初から、10個なんてせずに、3個くらいから、確認したら、どうでしょう。 そして、プログラムの動きを一行づつ追う。 多分、簡単に分かると思う。。。 まず、一回目のループで、 min1 と min2が同じ値になってますが、良いでしょうか?
kazuma-s

2020/07/25 13:17

10個全部同じ値を入力したときは、どうするつもりですか?
langhtorn

2020/07/25 13:27

全部異なる値が入力されることになっています。
SHOMI

2020/07/25 13:43

ならばそれを前提条件として質問内容に追記してください。 コメント欄はデフォルト非表示なので回答者に読んでもらえるとは限りません。
guest

回答1

0

ベストアンサー

min1 と min2 に初期値として 0 を入れておくと、data より小さくなるので
適切な判断ができなくなります。

また、次のような処理をしてみてはいかがですか?

  • data が min1 より小さければ、min2 = min1, min1 = data。
  • そうでなくて、data が min2 より小さければ、min2 = data。

追記
質問のコードで「うまくいかない」わけを知りたいのですよね。
10, 9, 8,... と入れるとどうなるか考えてみれば分かるはずです。
各変数の値の変化を見てください。

10 を入力すると、data = 10, min1 = 10, min2 = 0。
9 を入力すると、data = 9。i = 1, min2 < data (0 < 9) なので何もしない。
変ですよね。
9が一番小さく、10 が二番目に小さいから、
min1 = 9、min2 = 10 になっていなくてはいけないのに。

こんな風に自分の書いたコードを確かめてみようと思わないのですか?

私なら次のようなコードを書きます。

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int min1 = 0x7fffffff; // 1番小さな値 (minimum number) 6 int min2 = 0x7fffffff; // 2番目に小さな値 7 int ent1 = 0; // min1 が何番目の入力か (entry number) 8 int ent2 = 0; // min2 が何番目の入力か 9 int data; // 入力データ 10 11 puts("10個の正整数を入力します"); 12 for (int i = 1; i <= 10; i++) { 13 printf("%d番目 ", i); 14 scanf("%d", &data); 15 if (data < min1) 16 min2 = min1, ent2 = ent1, min1 = data, ent1 = i; 17 else if (data < min2) 18 min2 = data, ent2 = i; 19 } 20 printf("2番目に小さい数は%d番目に入力された%dです\n", ent2, min2); 21}

コンマ演算子を多用するなど、模範的なコードではありません。
内容を理解して、自分のコードを書いてみてください。

投稿2020/07/25 12:43

編集2020/07/25 14:39
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momon-ga

2020/07/25 12:59

あと、ansも複数用意しないとindexを表示できないです。
pepperleaf

2020/07/26 09:04

確かにコンマ多用で、お薦めとは言えませんが、よさそうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問