課題なんですが。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
クリーム

課題なんですが。

#1

投稿記事 by クリーム » 15年前

課題なんですが、わからなくてアドバイスお願いします。

 課題1
100点満点でじっしされたテストの点を入力するものとします。点数はたくさんあります。
 
(1)入力された点数が正しいかどうかをチェックするプログラムをつくりなさい。入力値が0以上100以下の場合は正しいので、そのまま得点を表示し、そ  れ以外の場合は、エラーであることを表示しなさい。できれば、小さすぎる。  大きすぎるの区別をしなさい。

(2)正しいデータのみ足し算して、データの件数と合計点、および平均点を表 示しなさい。平均点は整数どうしの割り算で、結果も整数(切り捨て)でよい。

なんですが・・・。
(1)は
こんな感じでやってみました。たぶんこれでいいと思うのですが、(2)はどういう感じなのか想像もつかないのでアドバイスをおねがいします。

コード:

#include <iostream>
using namespace std;
int main ()
{
	int tokuten;
	while(cin>>tokuten)
	{
	if(0 <= tokuten && tokuten <= 100)
	{
		cout<<"得点:"<<tokuten<< endl;
	}
	else if(tokuten<0)
	{
	  	cout << "得点が小さすぎます" << endl;
	}
	else if(tokuten>100)
	{
		cout <<"得点が大きすぎます"<<endl;

	}
	}
		return 0;
}

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 課題なんですが。

#2

投稿記事 by h2so5 » 15年前

(2)のヒントは、
データの件数と合計点を記憶する変数を用意して、
数値が入力されるたびに数値を更新して、平均点を表示するというような手順で良いと思います。

あと、(1)はelseを使ってもう少し簡潔に書ける気がしますね。

追記:
ソースを投稿する時はcodeタグで囲って下さい。

クリーム

Re: 課題なんですが。

#3

投稿記事 by クリーム » 15年前

データの件数と合計点を記憶する変数?
って具体的にどんな感じなんですか?
すみません。。

アバター
bitter_fox
記事: 607
登録日時: 15年前
住所: 大阪府

Re: 課題なんですが。

#4

投稿記事 by bitter_fox » 15年前

クリーム さんが書きました:データの件数と合計点を記憶する変数?
って具体的にどんな感じなんですか?
データ件数の変数が取りうる値とはどういった値でしょうか??(簡略化のために正負は考慮しないようにしましょう)

データ件数に少数の値が来ることは考えられるでしょうか??
そんな中途半端なデータは嫌ですねw(0.5のデータってないですよね?)
ということで、データ件数が取りうる値は整数になります。(厳密にいうと取りうる値は0を含む自然数ですね。)
では、整数の型はどういったものがありますでしょうか??

同様に、合計点や平均点の変数の型も論理的に考えてみましょう。

アバター
asd
記事: 319
登録日時: 15年前

Re: 課題なんですが。

#5

投稿記事 by asd » 15年前

クリーム さんが書きました:データの件数と合計点を記憶する変数?
って具体的にどんな感じなんですか?
すみません。。
横から失礼します。

まず正しいデータとは0以上100以下の整数ですね。
で、平均を出すためには合計点を件数で割る必要があります。

なので、
  • データの件数
  • 合計点
を保持しておく必要があります。

具体例を元にロジックを考えていきましょう。
例えば以下のような点数データがあるとしましょう。

60点 5点 150点 -5点 100点 0点

上記を見ると正しい点数は4件ということがわかりますが、プログラム上では実行時にその件数を数える必要があります。

(1)のコードにコメントをつける形でロジックを書いてみますので参考にしてください。

コード:

#include <iostream>
using namespace std;
int main ()
{
    int tokuten;/*入力点数受け取り用の変数*/
    /*合計点を保持しておく変数を用意します*/
    /*正しいデータの件数を保持しておく変数を用意します*/
    /*平均点を保持しておく変数を用意します*/

    while(cin>>tokuten)
    {
        if(0 <= tokuten && tokuten <= 100)
        {
            cout<<"得点:"<<tokuten<< endl;
            /*正しいデータなので入力データを合計点を保持する点数に足します*/
            /*また、正しいデータの件数を1足します*/
        }
        else if(tokuten<0)
        {
            cout << "得点が小さすぎます" << endl;
        }
        else if(tokuten>100)
        {
            cout <<"得点が大きすぎます"<<endl;
        }
    }
    /*合計点を正しいデータ件数で割ったものを平均として計算し、平均点を保持する変数に入れます*/
    /*平均点を表示します*/
    return 0;
}
用意する変数の型はbitter_foxさんが仰っているようにどういう値が来るか考えて指定してください。
ちなみに上記の例で計算すると、

入力データ:60点 5点 150点 -5点 100点 0点
正しいデータ件数:4件
正しいデータの合計点:165点
正しいデータの平均点:41.25点

参考になれば幸いです。
Advanced Supporting Developer
無理やりこじつけ(ぉ

クリーム

Re: 課題なんですが。

#6

投稿記事 by クリーム » 15年前

コード:

#include <iostream>
using namespace std;
int main ()
{
    int tokuten,sum,kensuu,heikin;
	sum = 0;
	kensuu = 0;
	heikin = 0;
 
    while(cin>>tokuten)
    {
        if(0 <= tokuten && tokuten <= 100)
        {
            cout<<"得点:"<<tokuten<< endl;
           sum = sum + tokuten;
		   kensuu = kensuu + 1;
        }
        else if(tokuten<0)
        {
            cout << "得点が小さすぎます" << endl;
        }
        else if(tokuten>100)
        {
            cout <<"得点が大きすぎます"<<endl;
        }
    }
	cout << "合計"<<sum<<endl; 
	cout <<"データの件数"<<kensuu<<endl;
    heikin = sum / kensuu;
	cout <<"平均"<<heikin<<endl;
	return 0;
}
こんな感じでやってできました。
みなさんアドバイスありがとうございます。

それからまた聞きたいんですが・・・。

問題 科目別の試験の点数が次のように順不順で入力されてくるとします。科目は英語が1、数学が2、国語が3であらわされています。

1 65
1 70
3 80
2 40
3 100
2 70
1 69

このように入力されてくるデータを読み込んで科目別のデータ件数、合計、平均を計算するプログラムを作りなさい。
データはなくなるまでよみなさい、科目コードが誤っている場合は読み捨てて、エラーデータの件数を数えて表示する。科目の点数については、入力された通とする。(0点未満、100点超のデータがあってもそのまま扱う。)点数の合計、データの個数とも整数として扱い、平均点も整数として(1点未満は切り捨て)計算すること
科目のデータが1件もない場合はどうなるか、どうするのが正しいか。

なんですが・・・。
とりあえず

コード:

#include <iostream>
using namespace std;
int main ()
{
    int tokuten,sum,kensuu,heikin,x,era;
	sum = 0;
	kensuu = 0;
	heikin = 0;
	era =0;
	
	cin>> x;

	if(x == 1)
	{
		cout<< "英語"<< endl;
	}
	
	else if(x == 2)
	{
		cout<< "数学"<< endl;
	}

	else if(x == 3)
	{
		cout<< "国語"<< endl;
	}
	else 
	{
		cout<< "わかりません"<< endl;
	}

 
    while(cin>>tokuten)
    {
        if(0 <= tokuten && tokuten <= 100)
        {
            cout<<"得点:"<<tokuten<< endl;
           sum = sum + tokuten;
		   kensuu = kensuu + 1;
        }
        else if(tokuten<0)
        {
            cout << "得点が小さすぎます" << endl;
			era = era + 1;
			
		}
        else if(tokuten>100)
        {
            cout <<"得点が大きすぎます"<<endl;
			era = era + 1;
        }
    }
	cout<<"エラー件数"<<era<<endl; 
	cout << "合計"<<sum<<endl; 
	cout <<"データの件数"<<kensuu<<endl;
    heikin = sum / kensuu;
	cout <<"平均"<<heikin<<endl;
	return 0;
}
としてみたんですが、これではちがうようなきがして・・・。
またアドバイスをお願いします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 課題なんですが。

#7

投稿記事 by h2so5 » 15年前

上記のコードだと、科目の数字を1度しか読み込んでいません。
点数ごとに、科目の数字を読み取る必要があります。

また、
クリーム さんが書きました: データはなくなるまでよみなさい、科目コードが誤っている場合は読み捨てて、エラーデータの件数を数えて表示する。
と書かれていますが、ファイルからの入力ならともかく、
コマンドラインからの入力では何らかの終了コマンドを作らないと、データが終わったのかどうか判断しようがありません。

追記:
何度も言いますが、ソースを投稿する時はcodeタグで囲って下さい。

クリーム

Re: 課題なんですが。

#8

投稿記事 by クリーム » 15年前

すみません。
ちょっとわかりずらいのでもう少しわかりやすくお願いします。
申し訳ありません。

アバター
asd
記事: 319
登録日時: 15年前

Re: 課題なんですが。

#9

投稿記事 by asd » 15年前

クリーム さんが書きました:すみません。
ちょっとわかりずらいのでもう少しわかりやすくお願いします。
申し訳ありません。
すみません。
何がわかりずらいのかわからないのでもう少しわかりやすくお願いします。
申し訳ありません。

#codeタグで囲むこととかの注意を受け入れないところを見ると、プログラムだけ流し読みしてるんですかねー。
#平均点は今のままだと小数部は無視されるような・・・
Advanced Supporting Developer
無理やりこじつけ(ぉ

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 課題なんですが。

#10

投稿記事 by softya(ソフト屋) » 15年前

とりあえずコードをcodeタグで囲んでおきました。
クリームさん、もう少し具体的に質問と状況報告してもらって良いですか?

>としてみたんですが、これではちがうようなきがして・・・。
具体的にどう違うと思われたのでしょうか?

>ちょっとわかりずらいのでもう少しわかりやすくお願いします。
どこら辺が分かりづらいのでしょうか?

なぜこんな風に聞くかというと、プログラムというのは倫理的・具体的に出来ないことはプログラムに書く事はできません。
なので、論理的に書くクセというか思考をまとめるクセを付けてもらいたいからです。

あと何度もcodeタグを付けて欲しいとお願いされているのに付けない理由を伺って良いですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: 課題なんですが。

#11

投稿記事 by ISLe » 15年前

横やりすみません。
h2so5 さんが書きました:コマンドラインからの入力では何らかの終了コマンドを作らないと、データが終わったのかどうか判断しようがありません。
コマンドラインではなくてコンソールだと思いますが、ウインドウズならCtrl+Z(^Z)、LinuxならCtrl+D(^D)を入力するとプログラム側ではEOFを検出しますよ。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 課題なんですが。

#12

投稿記事 by h2so5 » 15年前

試しに組んでみましたが、
クリームさんはこのような動作を期待していると考えてよいのでしょうか。

(-1を入力すると結果を表示するようになっています)

コード:

input:
1 65
1 70
0 70
3 80
2 40
3 100
4 100
2 70
1 69
-1
output:
◆英語
データ件数: 3
合計点数: 204
平均点数: 68

◆数学
データ件数: 2
合計点数: 110
平均点数: 55

◆国語
データ件数: 2
合計点数: 180
平均点数: 90

エラー件数: 2
クリームさんの示されたコードでは、
このような動作をさせようとして組んでいるようには思われないのですが。
(0点未満、100点超のデータがあってもそのまま扱う。と書かれているのに、コード内で範囲の判定をしています)

追記:
ISLe さんが書きました:横やりすみません。
コマンドラインではなくてコンソールだと思いますが、ウインドウズならCtrl+Z(^Z)、LinuxならCtrl+D(^D)を入力するとプログラム側ではEOFを検出しますよ。
それは知りませんでした(-_-;)
ではその部分は無視してください、申し訳ありません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 課題なんですが。

#13

投稿記事 by softya(ソフト屋) » 15年前

現状のコードは、最初の回答を理解されていないでその上に構築したのでワケが分からなくなっているんじゃないでしょうか?
なので、原点に戻って最初の問題を自分の答えを見ずにもう一度解いてみてください。
それで理解度が分かります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

クリーム

Re: 課題なんですが。

#14

投稿記事 by クリーム » 15年前

#codeタグっていうのがいまいちわかっていなかったので。つけてませんでした。もうしわけないです。
とりあえずアドバイスを参考にもういちど考えてみます。

閉鎖

“C言語何でも質問掲示板” へ戻る