• ベストアンサー

C++の課題が分かりません。

作りたいプログラムがあるのですが,どのように書けばいいのか分かりません. 分かる方がいれば是非教えてください.作りたい内容というのは以下の通りになります. 1.名前と点数を入力. 2.平均を算出するか人の追加をするか人の削除をするかを選択. 3.人の追加を選択すると,別の名前と点数を入力. 人の削除を選択すると,今まで入力した名前と点数の中からどれか一つを選んで削除する. この1~3の流れを延々と続けるプログラムです. ちなみに条件として ・クラスを用いて書く. ・メモリの動的確保を行い,解放もきちんと行う. また,メンバ変数として 人数,名前,点数,平均点 メンバ関数として 人の追加,人の削除,平均点の算出,平均点の表示を用いる. という条件のもとでプログラムを作成したいです.

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

  • ベストアンサー
回答No.3

設定があいまい。 - 追加時に同名のデータが登録済みどうするか? - 削除時に同名/同点のデータが登録されていたらどうするか? - 「今まで入力した名前と点数の中からどれか一つを選」ぶのはユーザかプログラムか? - 人の追加を選択時に最初に入力した名前/点数が無駄になるが構わないか? ざっくり書くと #include <vector> #include <string> #include <utility> #include <algorithm> using namespace std; class ScoreBook {   vector<pair<string,double>> records; public:   void add(string name, double score) { records.push_back(pair<string,int>(name,score)); }   void remove(string name) { records.erase(remove_if(records.begin(),records.end(),[](pair<string,double> x) { return x.first == name;}),records.end());}   doubel avarage() const { double sum = 0.0; for_each(records.begin(),records.end(),[&](pair<string,double>& x) { sum += x.second;}); return sum / records.size(); } }; int main() { // ユーザ・インタフェースはお好きに }

kittantan
質問者

補足

ご指摘ありがとうございます。確かにあいまいですね。 ‐別の名前と点数を入力というのは、追加入力したいという程度なので、同名のデータが登録済みでも別に構いません。 - 削除時に同名/同点のデータが登録されていても、選択した一つのみを削除できるようにしたいです。 - 「今まで入力した名前と点数の中からどれか一つを選」ぶのはユーザかプログラムか?ユーザが選びます。 - 人の追加を選択時に最初に入力した名前/点数が無駄になるが構わないか?なぜ無駄になるのかよく分かってないですが、それはあまり望ましくないです。

その他の回答 (3)

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

「方針などは何となく分かるのですが、実際にソースを書くのに困ってます。」ってのは, 具体的にはどこをどう困っている?

kittantan
質問者

補足

メモリの動的確保のやり方がよく分からず、 人の追加と削除を行うプログラムの書き方に困っています。

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

まず「追加」の方のうち「名前と点数を入力」は問題ないはず (ここで引っかかる前に 1 で引っかかる). 「別の」が問題だというなら, 「それまでに入力されたすべての名前と 1つずつ地道に比べる」だけで「別の」名前かどうかは判断できる. 別の名前でなかった (つまり既に入力された名前と同じ名前だった) 場合にどうするかは知らん. 問題に書いてないところだから勝手に考えてくれ. 削除の方はいろいろなやり方があるところだと思う. とことん手を抜くなら「入力されたものをすべて表示し, その中から削除したいものを番号で入力させる」という方針もありだろう. でも, 平均点をメンバ変数に持つのは不自然な感じがする.

kittantan
質問者

お礼

方針などは何となく分かるのですが、実際にソースを書くのに困ってます。 ですがもう少し考えてみます。 アドバイスありがとうございます。

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

「課題」というなら出した人に聞けばいいのではなかろうか. さておき, これだと「どこが (あるいは何が) わからないのか」がさっぱり読み取れないんだよね. あなたは何をどう考えたの? あと, たとえば「いくつかの数字を入力し, 最後にそれらの数字と平均を表示する」プログラムは作れますか?

kittantan
質問者

補足

工程3の 人の追加を選択すると,別の名前と点数を入力. 人の削除を選択すると,今まで入力した名前と点数の中からどれか一つを選んで削除する. というところがどう書けばよいのか分からなくて困ってます。

関連するQ&A

  • C言語の課題で

    C言語の課題で 「成績集計プログラム 入力件数nをキーボードより入力し、n人分のテストデータを入力する。その際、合計点、最高点、最低点を求め、最後に平均点を計算しそれぞれを出力するプログラムを作成せよ。ただし、平均点は実数型とし小数点第2位まで出力する。平均点以外の変数は整数型とする。」というのが出ました。 #include <stdio.h> int main(void) { int n,a,b,c; int res,i; printf("入力件数を入力して下さい。\n"); scanf("%d",&n); for(i = 1; i <= n; i++) { printf("点数を入力して下さい。\n"); scanf("%d",&a); printf("%d人目=>%d\n",i,a); if(i == res) break; } return 0; } ここまでは、出来たのですが、後が分かりません。どなたか教えていただけませんか?お願いします。

  • C言語 構造体配列について

    6人分の小テストの点数を記録し,平均値などを計算するプログラムを作成している. 以下の手順と条件に従ってプログラムを作成. 手順 (1) 氏名(name[100], char 型) と点数( score , int 型) をメンバにもつ構造体「struct_TEST」を(main 関数の外で)定義. (2) struct _TEST 型構造体配列 element[6] を定義. (3) キーボードから氏名(ローマ字でよい)と点数を入力する処理を6 回繰り返す. (4) 平均点を計算して画面表示. (5) 最高点を出した人の名前と点数を画面表示. (6) 平均点に満たない人の名前と点数を画面表示. 条件 (3)~(6)の処理には以下に示す関数を利用する. (3) ・・・ 氏名と点数を入力する処理をn 回繰り返す関数 void input_score( struct _TEST *a, int n ) (4) ・・・ n 個の構造体配列に対して平均を計算し,平均点を返す関数 double calc_ave( struct _TEST *a, int n ) (5) ・・・ n 個の構造体配列に対して最高点を算出し,そのユーザの配列番号を返す関数 int calc_max( struct _TEST *a, int n ) (6) ・・・ n 個の構造体配列に対して平均点に満たない人の名前と点数を画面表示する関数 void show_under_ave( struct _TEST *a, int n ) C言語の構造体が良く分かっていません。 こういった条件が多いと考えづらく分からなくなります。 考えても分かっていないので困っています。 誰かすみませんが解答を教えて下さい。

  • C言語の課題について

    データファイル(txtファイル) に生徒30人分の出席番号、数学 、英語の点数が入っていて、数 学と英語の点数は0点から100点 (整数)です。 このデータを元にして ・構造体型配列に出席番号、数 学、英語の点数を格納する ・国語の得点を70点から100点間 での整数の一様乱数によって格 納する ・各学生の平均点、偏差値を求 める ・偏差値が最もよい学生の出席 番号、数学、英語、国語の得点 、平均点、偏差値と合計点が181 点から210点、211点から240点 、241点から270点、271点から3 00点の学生の人数を数えてその 度数分布をtxtファイルへと出力 する 条件 ・平均点、偏差値を求める箇所 はmain関数から独立させる。 ・国語を入れるときに使用する 乱数は出席番号下4桁により初期 化したものを使うこと。頭の0は 除く(例120012-3→123) ・配列を因数とする関数は使用 可能 ・度数分布を作る際は、if文を使 用しないこと ・合計点が181~300点に含まれ ることは既知である ・txtファイルへの出力は以下の ようにすること。 High score: No. | math: , Eng , Jap | Ave: , D ev 181-200(10): ********** 211-240(17):**************** このような課題が出されたのですが、どのような順序でプログラムを書いていけばいいかが分かりません なのでどのような順序でプログラムを書いていけばいいか教えて下さい

  • プログラミング分からないので教えてください

    【演習1】 コマンド引数で台形の上底、下底、及び高さを指定して実行すると、台形の面積を算出し表示するプログラムを作成せよ。ただし、以下の条件を満たすこと。 条件: (1)コマンド引数が不足していた場合は<実行例(2)>のようにエラーメッセージを表示する。 (2)上底、下底、高さ、及び面積は実数値として処理する。 (3)台形の上底、下底、及び高さを引数として受け取って面積を算出するユーザー関数を作成し使用する。 (4)面積の表示はmain関数で行い、<実行例(1)>のように表示する。 そのとき、上底、下底、高さは小数点以下2桁、面積は小数点以下3桁で表示する。 <実行例(1)> Z:\>ee1001 3.5 4.2 8.37↓ 上底3.50,下底4.20,高さ8.37の台形の面積は32.224 <実行例(2)> Z:\>ee1001 3.5 4.2↓ 引数が足りません。 【演習2】 点数を3つキー入力すると、3つの点数の合計点と平均点を表示するプログラムを作成せよ。ただし、以下の条件を満たすこと。 条件: (1)点数は整数で入力する。。 (2)入力された3つの点数のうち1つでも0未満だった場合は、<実行例(3)>のようにエラーメッセージを表示する。 (3)3つの点数を受け取って、3つの点数の合計点と平均点を算出するユーザー関数を作成し使用する。また、合計点は整数、平均点は実数で算出する。 (4)合計点と平均点の表示はmain関数で行い、<実行例(1)(2)>のように表示する。 そのとき、合計点は全4桁、平均点は全6桁小数点以下1桁で表示する。 <実行例(1)> 点数: 80↓ 点数: 65↓ 点数: 98↓ 合計点 243 平均点 81.0 <例実行(2)> 点数: 80↓ 点数: -1↓ 点数: 98↓ 点数は0以上で入力してください よろしくお願いします

  • C言語のプログラムについて質問です。

    C言語のプログラムについて伺いたいことがあるんですが5人くらいの名前、数学、英語、国語の点数を入力して各教科の最高点、最低点、平均点、それぞれの数+英+国の合計点を表示するプログラムを構造体を使って作りたいと思っています。 もしよろしければ事細かに教えていただけないでしょうか。 よろしくお願いします。

  • C言語プログラムの作成方法がわかりません

    キーボードから5人の点数を入力すると平均点を表示するようにし、平均点以上の学生の点数を表示させるC言語のプログラムの作成方法を教えてください

  • 初心者です。C++の課題

    C++の課題が出たのですが、行き詰まりました。 cinで入力した英数字、記号から、文字の系列に変換するプログラムで、 例えば、abbcdeee00))) と入力した場合、 a b c d e 0 ) と出力されるようにしたいのです。 条件は、 入力した文字系列はchar型の変数に1文字ずつ入力されること、 使えるのは、for、while、if のみ、 入力はEOFで終わること、 以上です。どなたか教えてください。

  • 学校で課題を出されて困っています(;´д`)

    問題ですが、5回テストをして、各テストの点数、合計点、平均点、最高点、最低点を求めて表示するプログラムを作成せよ!という問題です。画面イメージとして、 C:\java Syuukei 点数: 80 : 100 : 70 : 60 : 90 [5回] 合計点 : 400 平均点 : 80.0 最高点 : 100 最低点 : 60 C:\ こういうふうにコマンドプロンプトに表示されるプログラムです。 今月習い始めたばかりで私にはとてつもなく難しいです・・・。 どうか力をかして下さい。よろしくお願いします。(ちなみに提出が明日・・・)

    • ベストアンサー
    • Java
  • C言語の添削

    「C言語基礎課題1」 #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <tchar.h> #include <ctype.h>                                       #include <string.h> #define MAX 100 /*点数*/ int flag; double avg(double t[],int n); int str_check(char s[]);                                        int main() { int number; //人数 double score[MAX]; //点数 char temp[MAX]; char str[MAX]; //名前 double ans; //平均成績 int i=0; //カウンタ変数 //人数の決める printf("人数を入力して下さい。\n"); scanf("%d",&number); //名前の入力 for(i=0;i<number;i++) { printf("%d番様の名前を入力して下さい。\n",i+1); scanf("%s",&str[i]); } //点数の入力 for(i=0;i<number;i++) { printf("%d番様の点数を入力して下さい。\n",i+1); scanf("%s",&temp); str_check(temp); if(flag==1) { score[i]=atoi(temp); //点数入力で有効範囲をチェック if(score[i]<0 || score[i]>100) { printf("0-100点の範囲を入力して下さい。\n"); i--; } } if(flag==0) { printf("点数を数字で入力して下さい。\n"); i--; } } ans =avg(score,number); printf("\n=====入力内容一覧と成績平均値======\n"); for(i=0;i<number;i++) { printf("%d番の点数は%3.2lfです。\n",i+1,score[i]); } printf("平均点は%3.2lfです。\n",ans); printf("=====================================\n"); getch(); return 0; } /*avg関数の定義*/ double avg(double t[],int n) { int i; double sum; sum = 0.0; for(i=0;i<n;i++) { sum += t[i]; } return sum/n; } /*点数入力で文字か数字かチェック*/ int str_check(char s[]) { int i=0,n; //カウンタ変数 n=strlen(s); while(s!='\0') { if(s[i]>='0'&&s[i]<='9'||s[i]=='.') { i++; } else { break; } } if(i==n) { flag=1; } else { flag=0; } return flag; } [最初に組んだソースプログラム] #include<stdio.h> #include<stdio.h> #define NUM 3 /*点数*/ #define Name 3 /*人数*/ #include<conio.h> double avg(int t[]); struct stList{ char str[Name][100]; int score[NUM]; int i,j; }; int main(void) { int score[NUM]; //char str[Name]; char str[100]; int i,j; double ans; printf("名前を入力して下さい。\n",Name); for(i=0;i<Name;i++){ scanf("%s",&str[Name]); } // if(score[NUM]=0 || score[NUM]<=100) //{ // printf("点数を入力して下さい。\n",NUM); //} printf("点数を入力して下さい。\n",NUM); for(i=0;i<NUM;i++) { scanf("%d",&score[i]); if(score[i]<0 || score[i]>100) { printf("0-100点の範囲を入力して下さい。\n"); i--; } } for(j=0;j<NUM;j++){ printf("%d番目の人の点数は%dです。\n",j+1,score[j]); } ans =avg(score); printf("平均点は%3.2lfです。\n",ans); getch(); return 0; } /* avg関数の定義 */ double avg(int t[]) { int i; double sum; sum = 0.0; for(i=0;i<3;i++){ sum += t[i]; } return sum/Name; } 「一人分のデータを保持する構造体(文字列と整数の変数をメンバに持つ)を用意し、3人分の名前と成績 (最大値100、最小値0)を入力でき、入力が終了したら、入力内容一覧と成績の平均値を表示する プログラムを作成せよ。 ※考えうる限りの異常系処理の導入、関数化を行うこと。」 研修で以下の指摘を受けました。 (1)compare関数が使われていない。 (2)名前入れる変数が3つ不明 (3)カウンタ変数がi,j,s,tになっている理由は? (4)名前を入力しなかった時の処理 (5)点数を処理しなかった時の処理 (6)定数NUMで人数3を指定できるようにしているのにプログラムはそれを利用仕切れていない(名前入力が固定3人)ので無意味 (7)if(tmp=0 || tmp<=100)←これなんでしょうか? (8)平均点表示の少数点以下有効桁数はどうなっているのか? (9)点数入力で文字を入れたときの処理 (10)点数入力で有効範囲外の数字を入れた時の処理 ちなみに最大値、最小値はdefineして欲しいです。理由は(2)に読めば分かる (11)変数名が謎なのが多い 課題のキーワードのどこにも出て来ないですし言葉だから 後、添付ファイルを添付します。 最初のソースプログラム名「最初に組んだもの」修正したものが「C言語基礎課題1」と名付けています。 いづれのソースプログラムも構造体を用意出来てないように思うのですがいかかですか?

  • C言語の平均点の出し方

    C言語の平均点の出し方 こんばんは。 よろしくお願いいたします。 名前と得点を入力してから平均を出すプログラムを作っているのですが、名前と得点を対応させるにはどうしたらよいでしょうか。また、人数は固定化したくないためどのように平均点を出せばよいのかわかりません。 よろしくお願いいたします。

専門家に質問してみよう