プログラミングで二番目に大きい数を表示する

このQ&Aのポイント
  • 指定された個数の整数を読み込んで、最大値と二番目に大きい値を表示するプログラムを作成します。
  • 最大値が複数入力された場合も正しく処理します。
  • 入力した数字が全部同じ場合は、二番目に大きい値は存在しないと表示します。
回答を見る
  • ベストアンサー

プログラミングで二番目に大きい数を表示する

指定された個数(100個以下)だけ整数を読み込んで,読み込んだ整数の一覧,それらのうちの最大値と二番目に大きい値とを表示するプログラムを作成。最大となる値が複数入力された場合も正しく処理する。 このプログラムで入力した数字が全部同じ時、二番目に大きい値はありません。と表示したいのですが、どのようにしたらいいのかわかりません。教えてください。あとこのプログラムで最大値と二番目に大きい値出せたのですが、念のため問題ないか確認お願いします。 #include <stdio.h> #define NUMBER 100 /*整数の個数の上限*/ int main(void) { int i; int num; int kazu[NUMBER]; int max; int sec; printf("整数は何個ですか:"); scanf("%d", &num); puts("整数を入力してください。"); for(i = 0; i<num; i++){ printf("%3d個目:",i+1); scanf("%d", &kazu[i]); } printf("入力された整数は%d個で、\n",num); for(i=0;i<num;i++) printf("%d ",kazu[i]); printf("です。\n"); sec = max = kazu[0]; for(i=1; i<num; i++){ if(kazu[i]>max) max=kazu[i]; } for(i=0;i<num;i++){ if(kazu[i]>max){ sec=max; max=kazu[i]; }else if((max>kazu[i]) && (kazu[i]>sec)) sec=kazu[i]; } printf("最大値は%dです。 \n",max); printf("二番目に大きい値は%dです。\n", sec); return(0); }

  • nogi4
  • お礼率36% (8/22)

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.3

>二番目に大きい値はありません。と表示したい printf("二番目に大きい値は%dです。\n", sec); を printf("二番目に大きい値は"); printf(max!=sec?"%dです。\n":"ありません。\n", sec); に変える。 sec = max = kazu[0]; for(i=1; i<num; i++){ if(kazu[i]>max) max=kazu[i]; } for(i=0;i<num;i++){ if(kazu[i]>max){ sec=max; max=kazu[i]; }else if((max>kazu[i]) && (kazu[i]>sec)) sec=kazu[i]; } の部分は sec = max = kazu[0]; for(i=1; i<num; i++){ if(kazu[i]>=max) max=kazu[i]; else if(kazu[i]>sec) sec=kazu[i]; } で構わない。 あと「整数の個数」に0以下(0かマイナス)が入力された場合、未初期化のkazu[]配列を参照してしまう。 また「整数の個数」に101以上が入力された場合、kazu[]配列に数値を格納しようとしてメモリを破壊してしまう。 なので、numにマイナス、0、101以上が入力されたら、return 0;して中断する必要がある。 A.No1さんへ。 >先に配列変数を大小で全部並び変えてから、最大値 二番目 同じ値か判別したほうが簡単だと思います。 入力された数値が、 1 2 2 1 2 1 3 3 3 だった場合、ソートしても 3 3 3 2 2 2 1 1 1 となるので、最大値の「3」、二番目に大きい「2」を見付けるのは簡単ではない。 単純にソート後のkazu[0]とkazu[1]を表示しても、「3」と「3」が表示されてしまう。 A.No.2さんへ。 >・ソートしてしまう A.No1と同じ問題が起きる。 >・そもそも「同じ値が複数存在する」のが問題なんだからそうならないようにしてしまう 題意に沿わない。「同じ数が複数存在してはいけない」と言う条件は無い。 >・最後にチェック 最終的にsecとmaxが同値であれば「二番目は無い」事になるので、それが正解であろう。 >ところで, このプログラムにおいて「最後の for における最初の if」は何のためにあるんでしょうか? ですよね。何の為にあるのか判りませんね。

nogi4
質問者

お礼

わかりやすい説明ありがとうございます。 助かりました。

その他の回答 (5)

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.6

A.No4の訂正。 ○INT_MIN ×INT_NIN

nogi4
質問者

お礼

ありがとうございます。

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.5

追記。 A.No4のバグ修正を施した場合は printf(max!=sec?"%dです。\n":"ありません。\n", sec); を printf(INT_NIN!=sec?"%dです。\n":"ありません。\n", sec); に直すのも忘れないように。

nogi4
質問者

お礼

ありがとうございます。

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.4

あ、バグ発見。 sec = max = kazu[0]; ってやってるから、一番最初に「最大値」を入力しちゃうと、それ以降、maxとsecが同値のまま、secが変化しない。 1行目に #include <limits.h> を追加して、 sec = max = kazu[0]; を max = kazu[0]; sec = INT_MIN; に変更すると、バグが直る。

nogi4
質問者

お礼

ありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

いろいろやり方はある. たとえば ・ソートしてしまう ・そもそも「同じ値が複数存在する」のが問題なんだからそうならないようにしてしまう ・最後にチェック くらいはできそう. ところで, このプログラムにおいて「最後の for における最初の if」は何のためにあるんでしょうか?

nogi4
質問者

お礼

ありがとうございます。

  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.1

先に配列変数を大小で全部並び変えてから、最大値 二番目 同じ値か判別したほうが簡単だと思います。

nogi4
質問者

お礼

ありがとうございます。

関連するQ&A

  • 最大値を求める

    3つの整数を入力して、最大値を求めるプログラムを作りたいのですが、整数を入力するところまでは うまくいくのですが、結果が、255、と出てしまいます。どこがおかしいのかが解かりません。 どなたか教えていただけませんか? 宜しくお願いします。 #include <stdio.h> int main(void) { int num[3]; int max, i, j; puts("三つの整数を入力してください"); for(i = 0; i < 3; ++i) { printf("整数%d:", (i + 1)); scanf("%d", &num[i]); } max = num[0]; for(j = 0; j < 3; ++j) { if(max < num[j]) { max = num[j]; } } printf("最大値は%dです。\n", max); return 0; }

  • わかりません・・・。

    100個以下の整数を読み込んで、読み込んだ整数の一覧,それらのうちの最大値と二番目に大きい値とを表示するプログラムをつくりたいのですが、わかりません。 教えてください!! 実行例 整数は何個ですか:5 1 個目:65 2 個目:30 3 個目:98 4 個目:10 5 個目:54 入力された整数は 5 個で, 65 30 98 10 54 です. 最大値は 98 です. 二番目に大きい値は 65 です. ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー #include<stdio.h> #define number 100 int main (void) { int i; int seisu[number]; int max; puts("整数を入力してください。"); for(i=0, i<number, i++){ printf("%2d番",i+1); scanf("%d",&seisu[i]); } max=seisu[0] for(i=1, i<number, i++){ if (seisu[i]>max) max=seisu[i]; } printf("最高点:%d\n",max); return(0); } までしかわかりません。 2番目に大きい値と‘整数は何個ですか: ‘と‘入力された整数は 個で です。‘の部分はどうすればいいのでしょうか??

  • 空Enterの扱い方

    3つの整数を入力し、最大値を出力するプログラムを作りました。 最大値をさがすステップに入る前に、 「最大値を出力しますか?(y/n)」と聞いてy+Enterで実行するようになっています。この部分を、 y+Enter もしくは 空Enter で実行するにはどのように変更すればよいのでしょうか?大変お手数ですが、教えてください。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> int main(){ int i,max,max_no,a[3]; char YN[2]; printf("整数を3つ入力してください。\n"); for(i=0;i<3;i++){ printf("%d番目の整数: ",i+1); scanf("%d",&a[i]); } printf("最大値を出力しますか?(y/n):"); scanf("%s",YN); if(YN[0]=='y'){ printf("最大値をさがします。\n"); } else{ exit(0); } max_no=0; max=a[max_no]; for(i=1;i<3;i++){ if(a[i]>max){ max=a[i]; max_no=i; } } printf("最大値は %d 番目のデータ %d です。\n",max_no+1,max); return 0; }

  • コンパイルエラー

    コンパイルしても、12行目(printf("%d番目の整数を入力してください。"i+1);が、関数呼び出しに)がないとでます。でもどこが間違っているか分かりません。 教えてください。お願いします。 #include <stdio.h> int main(void) { int num; int sum=0; int i; for(i=0; i<10; i++){ printf("%d番目の整数を入力してください。"i+1); scanf("%d", &num); sum+=num; } printf("合計は、%dです。\n", sum); return(0); }

  • C言語:配列の最大値

    こんにちは。 プログラミングの講義の課題で、 1.100未満の整数20個からなる配列を作成する 2.for文を使って20個の整数の中で最大値を求める 3.その結果を出力する というC言語の課題が出されました。完成はしたのですが、何度実行してもビルドエラーが発生して正常に作動しません。どうすれば正常に作動しますか? #include <stdio.h> int main(void){ int i; int max=0; int num[20] = {4,83,71,90,7,33,62,51,98,21,18,20,75,49,69,14,80,22,8,50}; for( i=0 ; i < 20 ; i++ ) { if (num[i] > max) max = num[i]; } printf("%d,",max); return (0); }

  • 並べ替えのプログラム

    整数を20個入力し、まずそのまま表示してその後大きい順に並べ替えて表示するプログラムを作っているのですが、最大値しか表示されません。多分for文の3重ループの中がおかしいと思うのですがよくわかりません。 #include <stdio.h> int main(int argc, char* argv[]) { int c,i,x,max; int sav = 0; int before[20]; int after[20]; int check[20] = {0}; printf("整数を20個入力してください: "); for(i = 0; i < 20; i++) { scanf("%d",&before[i]); } printf("\n"); printf("BEFORE\n"); for(i = 0; i < 20; i++) { printf("%d\n",before[i]); } printf("\n"); max = 0; for(c = 0; c < 20; c++) { for(x = 0; x < 20; x++) { for(i = 0; i < 20; i++) { if(before[i] > max && check[i] == 0) max = before[i]; sav = i; } if(check[sav] == 0) check[sav] = 1; after[19 - x] = max; } } printf("AFTER\n"); for(x = 0; x < 20; x++) { printf("%d\n",after[x]); } return 0; } よろしくお願いします。

  • ループ

    #include<stdio.h> int main(void) { int i=1,sum=0; int num=1; while(num>0) { printf("整数を入力してください。(マイナスの値で終了)\n"); scanf("%d",&num); printf("%dが入力されました。(%d番目の繰り返しです)\n",num,i); sum+=i; printf("1から%dまでをたすと%dです。\n",i,sum); i++; } printf("繰り返しが終わりました。\n"); printf("加算値は%dです。\n",sum); printf("%d回繰り返しました。\n",i); return 0; } このプログラムで101以上の数値は加算しないようにするにはどうすればいいですか。

  • 分割コンパイルの手順と方法について

    Visual Studio 2010でファイルを分割してコンパイル、リンクする方法がわかりません。以下のような3つのファイルです。 [myfunc.h] /* max関数の宣言 */ int max(int x, int y); [myfunc.c] int max(int x, int y) { if (x > y) return x; else return y; } [Sample13.c] #include <stdio.h> #include "myfunc.h" int main(void) { int num1, num2, ans; printf("1番目の整数を入力してください。\n"); scanf("%d", &num1); printf("2番目の整数を入力してください。\n"); scanf("%d", &num2); ans = max(num1, num2); printf("最大値は%dです。\n", ans); return 0; } 以上3つのファイルはあくまでも便宜的なもので、複数のファイルのコンパイル・リンクの手順を具台的に理解するために 用意したものです。

  • C言語 関数の問題

    C言語(関数の問題)で読み込んだ4つの整数の最大値を求めプログラムで 整数を2つペア比較し、関数の入れ子を用いて最大値を見つけて、表示する。 というプログラムを作成したいのですが #include<stdio.h> int maxof(int a, int b) { if(a > b) return (a); else return (b); } int max4(int a, int b, int c, int d) { max(max(a, b), max(c, d)); } int main(void) { int num1,num2, num3, num4; ------ 整数の読み込み printf("最大値は%dです。", max4(num1, num2, num3, num4)); return(0); } と記述すると、上手くいったのですが これを max関数だけを用いて作成できますでしょうか? 整数の比較は全てmax関数で行いたいです。

  • 最大値と最小値を表示したいのですが・・・

    double numに入っている数字から最大値と最小値を求めたいのですが、このままだと両方とも1.000になってしまうんです・・・ どうやったらちゃんと最大値と最小値が表示されるのでしょうか?? 初心者なものでスイマセンが教えてください!! #include<stdio.h> int main(void) { int i,j; double num[]={4.5,3.1,7.0,9.2,1.0,5.7,9.3,2.3,0.3,1.0}; double max,min; for(i=0; i<10; i++) { for(j=0; j<10; j++) { if(num[i]>num[j]) max=num[i]; } } for(i=0; i<10; i++) { for(j=0; j<10; j++) { if(num[i]<num[j]) min=num[i]; } } printf("最大値は%fです。",max); printf("最小値は%fです。",min); return 0; }

専門家に質問してみよう