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

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

ただいまの
回答率

90.52%

  • C

    3686questions

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

  • Emacs

    123questions

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

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

解決済

回答 7

投稿

  • 評価
  • クリップ 0
  • VIEW 7,566

bjbjeknr

score 18

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

5つの数字を入力
1
2
3
4
5
1番目に大きい数字は5です。
2番目に大きい数字は32765です。

となってしまいます。。二番目の数の定義をどのように書けばイイのかが
分かりません。。
私のコードです。

#include <stdio.h>

int main(void)
{
  int number[5];
  int no_1;
  int no_2;
  int i,j;

  printf("5つの数字を入力\n");
  for(i=0; i<5; i++){
    scanf("%d",&number[i]);

    if(no_1 < number[i])
      no_1=no_2;
    no_1=number[i];
  }
  printf("1番目に大きい数字は%dです。\n",no_1);
  printf("2番目に大きい数字は%dです。\n",no_2);

  return 0;
}

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 7

checkベストアンサー

+3

作成してみました。マイナス入力は無いとしています。

#include <stdio.h>

int main(void)
{
  int number[5];
  int no_1=0;
  int no_2=0;
  int i;

  printf("5つの数字を入力\n");
  for(i=0; i<5; i++){
    scanf("%d",&number[i]);

    if(no_1 < number[i]){
        no_2=no_1;
        no_1=number[i];
    }else if(no_2 < number[i]){
        no_2=number[i];
    }
  }
  printf("1番目に大きい数字は%dです。\n",no_1);
  if (no_1 != no_2)
      printf("2番目に大きい数字は%dです。\n",no_2);

  return 0;
}

マイナス入力対応版

#include <stdio.h>
int main(void)
{
  int n;
  int number[5] = {0};
  int i,j,k;

  printf("5つの数字を入力\n");
  for(i=0; i<5; i++){
    scanf("%d",&n);
    if ( i == 0 ){
        number[i]=n;
    }else{
        for (j=0; j<i; j++){
            if (number[j] < n){
                for (k=4; k>j; k--) number[k]=number[k-1];
                number[j]=n;
                break;
            }
        }
        if ( j == i ) number[j]=n;
    }
  }
  printf("1番目に大きい数字は%dです。\n",number[0]);
  if (number[0] != number[1])
      printf("2番目に大きい数字は%dです。\n",number[1]);

  return 0;
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/12 12:10

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

    キャンセル

+3

こんにちは。

まず、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 12:10

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

    キャンセル

+1

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/12 12:10

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/12 12:10

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

    キャンセル

+1

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

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

no_1=no_2;
no_1=number[i];

no_2の意味がわからない。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/12 12:10

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

    キャンセル

+1

書いてみました。

#include <stdio.h>

int max_val(int * array, int size) {
  int max = array[0];
  int i;
  for (i = 0; i < size; i++) {
    if (max < array[i]) {
      max = array[i];
    }
  }
  return max;
}

int main(void)
{
  int number[5];
  int work[5], work_pos;
  int flag;
  int no_1;
  int no_2;
  int i;

  printf("5つの数字を入力\n");
  for(i = 0; i < 5; i++) {
    scanf("%d", &number[i]);
  }

  no_1 = max_val(number, 5);

  // number[] から no_1 を一つ削除した配列をつくる
  flag = 0;
  work_pos = 0;
  for (i = 0; i < 5; i++) {
      if (number[i] == no_1 && flag == 0) {
        flag = 1;
        continue;
      }
      work[work_pos] = number[i];
      work_pos++;
  }
  no_2 = max_val(work, 4);

  printf("1番目に大きい数字は%dです。\n", no_1);
  printf("2番目に大きい数字は%dです。\n", no_2);

  return 0;
}

number[] をソートして、1番、2番を表示するのがより良い方法とおもいますが、
ここでは、配列の最大値を得る方法だけを使って2番を求めるようにしてみました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/17 14:17

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

    キャンセル

0

ポイントは「値が設定されてない変数は参照しない」。 

ここがミソです,C言語においては変数を宣言するだけで何かしら不定の初期値が入ってしまっているので,「値が設定されていない」というのは工夫しないと判別できません。

  • 「代入されたかどうか」を示すフラグ変数を使う
  • ポインタ変数を使う

このどちらかの方法を使います。

配列を使わずに済むようにした例なら以前書いたことがあるので,サンプルとして記載しておきます↓
(配列を使わないことによって事実上無制限の入力を受け付けられる長所はあります)

#include <stdio.h>

int main(void)
{
    int count, num, *max1 = NULL, *max2 = NULL;

    printf("何個入力しますか?: ");
    if (scanf("%d%*[^\n]", &count) != 1) {
        return 1;
    }

    for (int i = 0; i < count; ++i) {
        printf("入力%d: ", i + 1);
        if (scanf("%d%*[^\n]", &num) != 1) {
            break;
        }
        if (max1 == NULL || num > *max1) {
            if (max1 != NULL) {
                max2 = &(int){*max1};                
            }
            max1 = &(int){num};
        } else if (max2 == NULL || num > *max2) {
            max2 = &(int){num};
        }
    }

    if (max1 == NULL) {
        printf("1番目に大きい値: 未定義\n");
    } else {
        printf("1番目に大きい値: %d\n", *max1);
    }

    if (max2 == NULL) {
        printf("2番目に大きい値: 未定義\n");
    } else {
        printf("2番目に大きい値: %d\n", *max2);
    }

    return 0;
}

ただ,読みやすいコードとは言えず,素直にソートするコードを書いてしまったほうが簡単かもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/12 12:02

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

    キャンセル

  • 2017/03/12 12:10

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

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    C言語を用いて、カレンダーを作成したい。

    前提・実現したいこと ある月の日数と、一日の曜日を入力させて、その月のカレンダーを例のように出力するプログラムを作る。 <例> 一か月の日数: 31 一日目の曜日

  • 解決済

    結果の表示について

    課題で、 キーボードから入力された数値の平均を計算して表示し、平均以上の数値、平均より小さい数値を表示するプログラムを考えているのですが、 実行例 ./a.out

  • 解決済

    gcry_mpi_t 内の公開鍵をビット列で取り出したい

     gcry_mpi_t 内の公開鍵をビット列で取り出したい libgcrypt1.7.6 を使ってRSA暗号をいじってく中で, gcry_mpi_t型におさまっている公開鍵をビット

  • 解決済

    C言語でのSegmentation faultエラーについて

    以下のコードを実行すると、以下のような結果になりました。 Segmentation faultというエラーが何故出力されたのかを教えていただきたいです。 #include <s

  • 解決済

    C言語のソートプログラムについて

    前提・実現したいこと C言語で配列を昇順に入れ替えて、処理の前後の結果を表示するコードを書いています。 結果としては、以下のように表示されることを考えています。 a = [9,

  • 受付中

    ポインタを用いての行列計算

    プログラミング初心者です。 C言語にて二次元のポインタの和をポインタ縛りで求める問いがあるのですが 例えば int arrayA[3][3] = {{0,1,2},{3

  • 解決済

    strcmp関数, strcpy関数を使って、文字列を大きい順に並べ替える

    英単語をアルファベット順になるように並べ替えるプログラムです。しかし、うまく行きません。どこに間違えがあるのでしょうか? #include <stdio.h> #include

  • 解決済

    2バイトのバイナリデータをSJISの対応する文字で出力する方法

    C言語で2バイトのバイナリデータ、例えば0x82a0があるとしてこれが「あ」に対応するのですが、 %sや%cの変換指定子ではこのデータを渡しても「あ」にならないのですがどうすればい

同じタグがついた質問を見る

  • C

    3686questions

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

  • Emacs

    123questions

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