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

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

ただいまの
回答率

90.50%

  • C#

    9211questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • C++

    4501questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

完成したプログラムをより良くしたい。

受付中

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,120
退会済みユーザー

退会済みユーザー

プログラミングでわからないことがあります。
10人の点数を入力して平均値と最高点と最低点を表示するプログラムです。

#include <stdio.h>

int main(void){

int i;
int a[10];
int max, min;
int sum;
float ave;

printf("10人の試験の点数:\n"); 
printf("No.1:");
scanf("%d", &a[0]);
printf("No.2:");
scanf("%d", &a[1]);
printf("No.3:");
scanf("%d", &a[2]);
printf("No.4:");
scanf("%d", &a[3]);
printf("No.5:");
scanf("%d", &a[4]);
printf("No.6:");
scanf("%d", &a[5]);
printf("No.7:");
scanf("%d", &a[6]);
printf("No.8:");
scanf("%d", &a[7]);
printf("No.9:");
scanf("%d", &a[8]);
printf("No.10:");
scanf("%d", &a[9]);


max = min = a[0];
for(i=1;i<10;++i){
if( max < a[i] )
max = a[i];
if( min > a[i] )
min = a[i];
}

sum = a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8]+a[9];

ave = sum / 10.0;
printf("平均点は%.1f点です\n", ave);


printf("最高点:%d点\n", max);
printf("最低点:%d点\n", min);

return 0;
}


これで正しく表示されるのですが、少し手を加えます。
最後の最高点・最低点の表示の際に、
例えばNo.1が最高なら「最高点(No.1):〇〇」と名前も同時に表示させたいですのですが
考えてもわかりませんでした。最低点も同様です。どうすればいいか教えてください。お願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • KSwordOfHaste

    2017/05/10 13:49

    タグがC#,C++になっていますが、コードの中身はCです。タグをCへ変更すべきです。

    キャンセル

  • Zuishin

    2017/05/10 13:50

    C# 関係ありませんね。タグから C# を外して C を入れてください。

    キャンセル

回答 4

+4

まずは入力時に 得点 だけでなく 名前 も入力できるようにしようか。
つぎに 最高点/最低点はいくつ じゃなく 最高点/最低点は何番目 を求めよう。
何番目 がわかっていれば 何番目の得点 と 何番目の名前 を出力すればいいからね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+3

例えばNo.1が最高なら「最高点(No.1):〇〇」と名前も同時に表示させたいですのですが

最高点が'1番目'であることや、1番目の人の名前を表示したいならその情報が変数に入っている状況を作るようにしてください。

int idOfBestMarkStudent; //最高点の人の番号
char* nameOfBestMarkStudent; //最高点の人の名前

最高点の人の番号は最高点を求める際に覚えておけばよいだけです。
最高点の人の名前は現状のプログラムでは求まりません。なぜなら名前を外部から入力する部分が「設計されていない」からです。まずは外部から名前と点数を入力しその情報を配列へ覚えるようなプログラムを作ってみてください。

ところで、そのような「機能の追加」より先にプログラムの作りを「よりよく」することが先だと思います。

printf("No.1:");
scanf("%d", &a[0]);
printf("No.2:");
scanf("%d", &a[1]);
...

このような「同じような処理を一々書く」のはいただけません。forループを用いて1~10までの生徒のデータを入力するようにプログラムを書きなおしてみてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+2

No.xも配列にし、for文の中で「最大値」ではなく、「最大値の要素番号」を調べるように修正すればいいですね。

構造体を使った方がよりよくなると思いますが。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+2

  • max = a[i];に加え、その時の要素位置imax_iなどに保持しておくとどうでしょうか?
  • 点数の入力部分と合計の計算部分もループ処理で書いてみましょう。

 追記

なお、上記ができたら、次のような修正に挑戦するのも良いと思います。

  • 入力をループで書く。
  • 入力ループを途中で中断できるようにする(点数に-1を入力したら入力終了など)
  • 入力ループ中に、最高、最低点など、結果表示に必要な値をうまく保持、計算しておく。

上記の修正をおこなうと、a[10]のような配列不要、数個の変数だけで好きな人数分だけ最高、最低点と名称、合計、平均を出すことができるようになります。
ただし、最高、最低点が複数人存在する場合は最後の人を採用するものとします。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • C#

    9211questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • C++

    4501questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。