指定された個数(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);
}
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」は何のためにあるんでしょうか?
ですよね。何の為にあるのか判りませんね。
No.5
- 回答日時:
追記。
A.No4のバグ修正を施した場合は
printf(max!=sec?"%dです。\n":"ありません。\n", sec);
を
printf(INT_NIN!=sec?"%dです。\n":"ありません。\n", sec);
に直すのも忘れないように。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
このQ&Aを見た人はこんなQ&Aも見ています
-
とっておきの「夜食」教えて下さい
真夜中に小腹がすいたときにこっそり作るメニュー、こっそり家を抜け出して食べに行くお店… 人には言えない、けど自慢したい、そんなあなたの「とっておきの夜食」を教えて下さい。
-
大人になっても苦手な食べ物、ありますか?
大人になっても、我慢してもどうしても食べれないほど苦手なものってありますよね。 あなたにとっての今でもどうしても苦手なものはなんですか?
-
「これはヤバかったな」という遅刻エピソード
寝坊だったり、不測の事態だったり、いずれにしても遅刻の思い出はいつ思い出しても冷や汗をかいてしまいますよね。
-
許せない心理テスト
私は「あなたの目の前にケーキがあります。ろうそくは何本刺さっていますか」と言われ「12本」と答えたら「ろうそくの数はあなたが好きな人の数です」と言われ浮気者扱いされたことをいまだに根に持っています。
-
【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
【お題】 ・このサンタクロースは偽物だと気付いた理由とは?
-
2番目の最大値を求める
C言語・C++・C#
-
n番目に大きい数を求めるアルゴリズム(C言語)
C言語・C++・C#
-
n番目に大きな値を探索する
Java
-
-
4
配列の問題
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
10進数からN進数に変換するプロ...
-
配列を使って魔方陣
-
配列を関数に渡す方法
-
while文について、c言語...
-
if-else文および標準演算子(*...
-
C言語 数字以外を入力させない...
-
C言語です
-
c言語プログラミングで1から100...
-
raspberrypiでロータリエンコーダ
-
C言語。どうしてコンパイルでき...
-
改善すべき点を教えてください。
-
C++での乱射ショットについて教...
-
getcの改行判定
-
ガウスの消去法のプログラムが...
-
C言語:配列の最大値
-
while文を使った問題なのですが...
-
c言語です
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
プログラム
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
配列を使って魔方陣
-
getcの改行判定
-
配列を関数に渡す方法
-
プログラミングで二番目に大き...
-
C言語階乗の総和を求める
-
scanf関数を用いての加減乗除%...
-
C言語で電卓を作成する。
-
C言語 プログラム
-
C言語の二分法のプログラムにつ...
-
C言語のwhile文を使った素数判...
-
while文について、c言語...
-
10進数からN進数に変換するプロ...
-
C言語です
-
C言語でのトランプシャッフルに...
-
全角文字の判定
-
C言語のプログラミング (基礎...
おすすめ情報