ページ 11

課題なんですが。

Posted: 2011年1月12日(水) 20:43
by クリーム
課題なんですが、わからなくてアドバイスお願いします。

 課題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;
}

Re: 課題なんですが。

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

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

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

Re: 課題なんですが。

Posted: 2011年1月13日(木) 00:16
by クリーム
データの件数と合計点を記憶する変数?
って具体的にどんな感じなんですか?
すみません。。

Re: 課題なんですが。

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

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

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

Re: 課題なんですが。

Posted: 2011年1月13日(木) 10:49
by asd
クリーム さんが書きました:データの件数と合計点を記憶する変数?
って具体的にどんな感じなんですか?
すみません。。
横から失礼します。

まず正しいデータとは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点

参考になれば幸いです。

Re: 課題なんですが。

Posted: 2011年1月15日(土) 18:47
by クリーム

コード:

#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;
}
としてみたんですが、これではちがうようなきがして・・・。
またアドバイスをお願いします。

Re: 課題なんですが。

Posted: 2011年1月15日(土) 19:03
by h2so5
上記のコードだと、科目の数字を1度しか読み込んでいません。
点数ごとに、科目の数字を読み取る必要があります。

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

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

Re: 課題なんですが。

Posted: 2011年1月16日(日) 15:11
by クリーム
すみません。
ちょっとわかりずらいのでもう少しわかりやすくお願いします。
申し訳ありません。

Re: 課題なんですが。

Posted: 2011年1月16日(日) 17:30
by asd
クリーム さんが書きました:すみません。
ちょっとわかりずらいのでもう少しわかりやすくお願いします。
申し訳ありません。
すみません。
何がわかりずらいのかわからないのでもう少しわかりやすくお願いします。
申し訳ありません。

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

Re: 課題なんですが。

Posted: 2011年1月16日(日) 17:38
by softya(ソフト屋)
とりあえずコードをcodeタグで囲んでおきました。
クリームさん、もう少し具体的に質問と状況報告してもらって良いですか?

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

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

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

あと何度もcodeタグを付けて欲しいとお願いされているのに付けない理由を伺って良いですか?

Re: 課題なんですが。

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

Re: 課題なんですが。

Posted: 2011年1月16日(日) 17:50
by h2so5
試しに組んでみましたが、
クリームさんはこのような動作を期待していると考えてよいのでしょうか。

(-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を検出しますよ。
それは知りませんでした(-_-;)
ではその部分は無視してください、申し訳ありません。

Re: 課題なんですが。

Posted: 2011年1月16日(日) 18:00
by softya(ソフト屋)
現状のコードは、最初の回答を理解されていないでその上に構築したのでワケが分からなくなっているんじゃないでしょうか?
なので、原点に戻って最初の問題を自分の答えを見ずにもう一度解いてみてください。
それで理解度が分かります。

Re: 課題なんですが。

Posted: 2011年1月16日(日) 21:49
by クリーム
#codeタグっていうのがいまいちわかっていなかったので。つけてませんでした。もうしわけないです。
とりあえずアドバイスを参考にもういちど考えてみます。