読者です 読者をやめる 読者になる 読者になる
【スポンサーリンク】

【C言語解説】 C言語練習 R025 - 人数に上限がない入力から情報を出力する

こちらのサイト

C言語練習
http://www.geocities.jp/kenji_y0328/crenshu/

の問題を実際に解いていったので、「解説」という形でまとめていこうかと思っています。
ちなみに、こちらのサイトでは解答もありますが、自分の解答を元に解説していきます。

※作者様からの削除依頼がありましたらすぐに削除しますのでご報告頂けると幸いです。

カテゴリの「C言語練習」でまとめています。

【問題】

担当者名が"end"になる迄、担当者名と売上を入力する。売上合計、平均、最も売上が多
い担当者名とその売上、最も売上が低い担当者名とその売上を表示する。

【コード】

#include<stdio.h>
#include<string.h>

main(){
    int kensu=0, goukei=0, max, min, uriage, cnt=0, heikin;
    char max_tanto[10], min_tanto[10], tanto[10];
    
    printf("担当者名がendで終了\n");
    printf("担当者="); scanf("%s", tanto);
    printf("売上="); scanf("%d", &uriage);
    max = min = uriage;
    strcpy(max_tanto, tanto);
  strcpy(min_tanto, tanto);
    
    
    while(strcmp(tanto, "end")!=0){
        goukei += uriage;
        cnt++;
        if(uriage>max){
            max = uriage;
            strcpy(max_tanto, tanto);
        }
        if(uriage<min){
            min = uriage;
            strcpy(min_tanto, tanto);
        }
        printf("担当者="); scanf("%s", tanto);
        if(strcmp(tanto,"end")){
            printf("売上="); scanf("%d", &uriage);
        }
    }
    heikin = goukei / cnt;
    
    printf("合計=%d  平均=%d\n", goukei, heikin);
    printf("売上最高担当者は %s さんで、金額は %d 円です。\n", max_tanto, max);
    printf("売上最低担当者は %s さんで、金額は %d 円です。", min_tanto, min);
    
    return 0;
}

【考え方】

  • int型の「kensu」「goukei」「max」「min」「uriage」「cnt」「heikin」を宣言する。
  • char型の配列「max_tanto」「min_tanto」「tanto」を3つ宣言する。
  • 標準出力で文字を表示する。そして「tanto」と「uriage」を入力する。
  • 「max」と「min」に「uriage」を代入する。そうすることで最初に入力された値を基準とすることができる。
  • 「strcy」関数を使い、「tanto」(担当者の名前)を「max_tanto」「min_tanto」それぞれに担当者名の文字列を代入(コピー)する。
  • while文の条件式は「strcmp(tanto, "end")!=0」となっている。これは、「tanto」に入っている文字列が「"end"」という文字列と同じかどうか「strcmp」関数で判定している。もし同じなら「0」、異なるなら「1」を戻り値として返却する。 なので、簡潔に言うと「tanto」が「"end"」ではない間繰り返す、という条件式になる。
  • 「goukei」に「uriage」を加算する。「+=」を使うことで加算後に代入するという命令を短縮形で記述できる。
  • 「cnt」をインクリメント(+1)する。短縮せずに書くと「cnt = cnt + 1;」となる。
  • もし「uriage」が「max」よりも値が大きければ、「max」に「uriage」を代入し、「max_tanto」に「tanto」文字列を「strcpy」関数を使って代入(コピー)する。
  • 上記の逆に「uriage」が「min」よりも小さければ、「min」に「uriage」を代入し、「min_tanto」に「tanto」文字列を「strcpy」関数を使って代入(コピー)する。
  • while文の最後に担当者名を入力する。
  • もし担当者名が「"end"」でなければ「uriage」を入力する。「strcmp」関数は文字列が一致していたら「1」を返す。その式が「1」である、ということは「真である」ということになる。
  • while文を抜けたら「heikin」に「goukei」と「cnt」の商を代入する。「/」を使えば商だけが算出される。あまりは「%」を用いる。
  • 最後に「goukei」「heikin」「max_tanto」「max」「min_tanto」「min」を順番通りに出力する。
【スポンサーリンク】