配列の最大値と二番目に大きい数を求めたいのですが、二番目の数がうまく表示できません。。
実行すると、
5つの数字を入力
1
2
3
4
5
1番目に大きい数字は5です。
2番目に大きい数字は32765です。
となってしまいます。。二番目の数の定義をどのように書けばイイのかが
分かりません。。
私のコードです。
C
1#include <stdio.h> 2 3int main(void) 4{ 5 int number[5]; 6 int no_1; 7 int no_2; 8 int i,j; 9 10 printf("5つの数字を入力\n"); 11 for(i=0; i<5; i++){ 12 scanf("%d",&number[i]); 13 14 if(no_1 < number[i]) 15 no_1=no_2; 16 no_1=number[i]; 17 } 18 printf("1番目に大きい数字は%dです。\n",no_1); 19 printf("2番目に大きい数字は%dです。\n",no_2); 20 21 return 0; 22}
ご教示していただければ幸いです。。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
こんにちは。
まず、1番目に大きい数字を求めるプログラムを作った方が良いですよ。
それができてないです。5→4→3→2→1の順序で入力してみて下さい。
これができないと2番目も求めるのはちょっと無理です。
ちょっと手抜き気味ですが、考え方としては下記で行けると思います。
1番目に大きい数字を求める方法
まず、仮の値をno_1に設定。(入力される可能性のある値の最小値が好ましいです。)
5回ループの中で、入力された数値がno_1以上ならば、それをno_1へ設定する。
1番目と2番目に大きい数字を求める方法
まず、仮の値をno_1とno_2に設定。
5回ループの中で、入力された数値がno_1以上ならば、それをno_1へ設定する。(その前にno_1をno_2へコピー)
そうでなければ、入力された数値がno_2以上ならば、それをno_2へ設定する。
注:
「no_1以上」の部分は「no_1より大きい」かも知れません。最大値が複数入力された時の扱いによります。
【修正】
A.Ichiさんの回答を見てミスに気がついたので修正しました。
投稿2017/03/12 02:50
編集2017/03/12 03:13総合スコア23272
0
ベストアンサー
作成してみました。マイナス入力は無いとしています。
c
1#include <stdio.h> 2 3int main(void) 4{ 5 int number[5]; 6 int no_1=0; 7 int no_2=0; 8 int i; 9 10 printf("5つの数字を入力\n"); 11 for(i=0; i<5; i++){ 12 scanf("%d",&number[i]); 13 14 if(no_1 < number[i]){ 15 no_2=no_1; 16 no_1=number[i]; 17 }else if(no_2 < number[i]){ 18 no_2=number[i]; 19 } 20 } 21 printf("1番目に大きい数字は%dです。\n",no_1); 22 if (no_1 != no_2) 23 printf("2番目に大きい数字は%dです。\n",no_2); 24 25 return 0; 26}
マイナス入力対応版
c
1#include <stdio.h> 2int main(void) 3{ 4 int n; 5 int number[5] = {0}; 6 int i,j,k; 7 8 printf("5つの数字を入力\n"); 9 for(i=0; i<5; i++){ 10 scanf("%d",&n); 11 if ( i == 0 ){ 12 number[i]=n; 13 }else{ 14 for (j=0; j<i; j++){ 15 if (number[j] < n){ 16 for (k=4; k>j; k--) number[k]=number[k-1]; 17 number[j]=n; 18 break; 19 } 20 } 21 if ( j == i ) number[j]=n; 22 } 23 } 24 printf("1番目に大きい数字は%dです。\n",number[0]); 25 if (number[0] != number[1]) 26 printf("2番目に大きい数字は%dです。\n",number[1]); 27 28 return 0; 29}
投稿2017/03/12 02:45
編集2017/03/12 06:52総合スコア4070
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
書いてみました。
c
1#include <stdio.h> 2 3int max_val(int * array, int size) { 4 int max = array[0]; 5 int i; 6 for (i = 0; i < size; i++) { 7 if (max < array[i]) { 8 max = array[i]; 9 } 10 } 11 return max; 12} 13 14int main(void) 15{ 16 int number[5]; 17 int work[5], work_pos; 18 int flag; 19 int no_1; 20 int no_2; 21 int i; 22 23 printf("5つの数字を入力\n"); 24 for(i = 0; i < 5; i++) { 25 scanf("%d", &number[i]); 26 } 27 28 no_1 = max_val(number, 5); 29 30 // number[] から no_1 を一つ削除した配列をつくる 31 flag = 0; 32 work_pos = 0; 33 for (i = 0; i < 5; i++) { 34 if (number[i] == no_1 && flag == 0) { 35 flag = 1; 36 continue; 37 } 38 work[work_pos] = number[i]; 39 work_pos++; 40 } 41 no_2 = max_val(work, 4); 42 43 printf("1番目に大きい数字は%dです。\n", no_1); 44 printf("2番目に大きい数字は%dです。\n", no_2); 45 46 return 0; 47}
number[] をソートして、1番、2番を表示するのがより良い方法とおもいますが、
ここでは、配列の最大値を得る方法だけを使って2番を求めるようにしてみました。
投稿2017/03/12 03:41
総合スコア22324
0
自分だったら、全部入力させた後でソートした結果からとるかなあ。
実際に数字を入力されて、どういう風に処理されるかを
シミュレーションしてみれば見えてくるものもありますよ。
ポイントは「値が設定されてない変数は参照しない」。
がんばってください。:-)
投稿2017/03/12 02:30
総合スコア7460
0
no_2 は初期化されただけで、その後何も代入されてないからでしょう。そもそもロジックが変です。
投稿2017/03/12 02:22
編集2017/03/12 02:23退会済みユーザー
総合スコア0
0
ポイントは「値が設定されてない変数は参照しない」。
ここがミソです,C言語においては変数を宣言するだけで何かしら不定の初期値が入ってしまっているので,「値が設定されていない」というのは工夫しないと判別できません。
- 「代入されたかどうか」を示すフラグ変数を使う
- ポインタ変数を使う
このどちらかの方法を使います。
配列を使わずに済むようにした例なら以前書いたことがあるので,サンプルとして記載しておきます↓
(配列を使わないことによって事実上無制限の入力を受け付けられる長所はあります)
c
1#include <stdio.h> 2 3int main(void) 4{ 5 int count, num, *max1 = NULL, *max2 = NULL; 6 7 printf("何個入力しますか?: "); 8 if (scanf("%d%*[^\n]", &count) != 1) { 9 return 1; 10 } 11 12 for (int i = 0; i < count; ++i) { 13 printf("入力%d: ", i + 1); 14 if (scanf("%d%*[^\n]", &num) != 1) { 15 break; 16 } 17 if (max1 == NULL || num > *max1) { 18 if (max1 != NULL) { 19 max2 = &(int){*max1}; 20 } 21 max1 = &(int){num}; 22 } else if (max2 == NULL || num > *max2) { 23 max2 = &(int){num}; 24 } 25 } 26 27 if (max1 == NULL) { 28 printf("1番目に大きい値: 未定義\n"); 29 } else { 30 printf("1番目に大きい値: %d\n", *max1); 31 } 32 33 if (max2 == NULL) { 34 printf("2番目に大きい値: 未定義\n"); 35 } else { 36 printf("2番目に大きい値: %d\n", *max2); 37 } 38 39 return 0; 40}
ただ,読みやすいコードとは言えず,素直にソートするコードを書いてしまったほうが簡単かもしれません。
投稿2017/03/12 02:55
総合スコア5223
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/12 03:10