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

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

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

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

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

Q&A

解決済

7回答

50367閲覧

配列の最大値と二番目に大きい数を求めたい。

bjbjeknr

総合スコア26

C

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

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

1グッド

1クリップ

投稿2017/03/12 01:55

配列の最大値と二番目に大きい数を求めたいのですが、二番目の数がうまく表示できません。。
実行すると、

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}

ご教示していただければ幸いです。。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答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
Chironian

総合スコア23272

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

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

bjbjeknr

2017/03/12 03:10

ご教示有難うございました。おかげで解決することができました。
guest

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
A.Ichi

総合スコア4070

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

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

bjbjeknr

2017/03/12 03:10

ご教示有難うございました。おかげで解決することができました。
guest

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

katoy

総合スコア22324

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

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

bjbjeknr

2017/03/17 05:17

ご教示有難うございました。おかげで解決することができました。
guest

0

2番目に大きい数字は32765です。

この意味不明な数値が出た時点で何かおかしいと思ってください。

no_1=no_2;

no_1=number[i];

no_2の意味がわからない。

投稿2017/03/12 02:46

toutou

総合スコア2050

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

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

bjbjeknr

2017/03/12 03:10

ご教示有難うございました。おかげで解決することができました。
guest

0

自分だったら、全部入力させた後でソートした結果からとるかなあ。
実際に数字を入力されて、どういう風に処理されるかを
シミュレーションしてみれば見えてくるものもありますよ。
ポイントは「値が設定されてない変数は参照しない」。
がんばってください。:-)

投稿2017/03/12 02:30

takasima20

総合スコア7460

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

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

bjbjeknr

2017/03/12 03:10

ご教示有難うございました。おかげで解決することができました。
guest

0

no_2 は初期化されただけで、その後何も代入されてないからでしょう。そもそもロジックが変です。

投稿2017/03/12 02:22

編集2017/03/12 02:23
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

bjbjeknr

2017/03/12 03:10

ご教示有難うございました。おかげで解決することができました。
guest

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

mpyw

総合スコア5223

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

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

mpyw

2017/03/12 03:02

というかよく見たら質問は「5個」で固定長だからこんなに複雑なこと書かなくても良かったのか…失礼しました
bjbjeknr

2017/03/12 03:10

ご教示有難うございました。おかげで解決することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.41%

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

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

質問する

関連した質問