前提・実現したいこと
C言語で以下のことをするプログラムを作成しました。
「任意数の人が異なる正の整数が書かれたくじを引き、くじの番号を比較して小さい人から1位、2位とし、その一位と二位の人の名前を出力する。」
[入力例]
yamada 2560
okada 195
ishida 4532
osaki 210
[出力例]
okada
osaki
発生している問題・エラーメッセージ
下に張り付けたコードを実行すると、どの場合でも二番目に入力した人の名前が二つ続けて出力されてしまいます。 上の例でいえば、 okada okada と出てしまいます。 なぜこうなるのか、そのようにすれば解決できるのか見当がつかないので教えていただきたいです。 どうかよろしくお願いいたします。 コンパイルと実行はできます。
該当のソースコード
C
1#include <stdio.h> 2 3struct member{ //くじを引いた人とそのくじの番号をセットにするための構造体 4 char name[100]; 5 int lot; 6}; 7 8int main(void){ 9 struct member people[5000]; //くじを引いた人を格納する配列 10 int i = 0; //ループのための変数 11 while(1){ //入力終了までループ回す 12 scanf("%s %d",people[i].name,&people[i].lot); 13 if(scanf("%s %d",people[i].name,&people[i].lot) == EOF){ 14 break; 15 } 16 i++; 17 } 18 int min = 10000; 19 int j = 0; 20 for(j = 0; j < i; j++){ //くじの値が最小である配列の番号をminに代入 21 if(min > people[j].lot){ 22 min = j; 23 } 24 } 25 int secmin = 10001; 26 int k = 0; 27 for(k = 0; k < i; k++){ //くじの値が二番目に小さい配列の番号をsecminに代入 28 if(min < secmin && secmin > people[k].lot){ 29 secmin = k; 30 } 31 } 32 printf("%s\n",people[min].name); 33 printf("%s",people[secmin].name); //一位の人と二位の人の名前を出力 34 return 0; 35}
試したこと
nameとlotでscanfをわけたらだめなのかなと思ったので一緒にしてみたりしました。
またscanfの入力終了はEOFで表現できると知ったので使用しました。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/29 12:32
2020/05/29 12:40 編集
2020/05/29 12:40
2020/05/29 13:17 編集
2020/05/29 15:22