課題のプログラムの1文について

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

課題のプログラムの1文について

#1

投稿記事 by AIR » 7年前

[1] 質問文
 [1.1] 課題プログラムの完成
 [1.2] 課題プログラム
色つきの円を作るCircleクラスと、色名と色値をしめすCNameクラスがあり、Circleオブジェクトの色とCNameオブジェクトの色が一致しているかの判定をするプログラム。判定をするbool型関数をフレンド関数で実装する。

コード:

#include<iostream>
#include<cstring>
using namespace std;

class CName{
	char name[50];
	int r,g,b;
public:
	CName(char* str,int u,int v,int w);
	char* get_name(){return name;}
	void show();
};

class Circle{
	double x,y;
	double radius;
	int r,g,b;
public:
	void set_xyr(double s,double t,double r){
		x=s;y=t;radius=r;
	}
	void set_color(int u,int v,int w){
		r=u;g=v;b=w;
	}
	void show();
	bool isSame(CName col);
};



void Circle::show(){
	cout << "座標:("<<x<<","<<y<<")\n";
	cout << "半径:"  <<radius<<"\n";
	cout << "RGB:("  <<r<<","<<g<<","<<b<<")\n";
}
bool Circle::isSame(CName col){
	if(    ) return true; //エラー1
	else return false; //エラー2
}
CName::CName(char *str, int u, int v, int w){
	strcpy(name,str);
	r=u;g=v;b=w;
}

void CName::show(){
	cout<<name<<":("<<r<<","<<g<<","<<b<<")\n";
}


int main(){
	Circle ob;
	CName co1("Red",255,0,0);
	CName co2("Green",255,0,0);
	CName co3("Blue",255,0,0);

	ob.set_xyr(2.0,3.0,5.0);
	ob.set_color(255,0,0);

	cout <<"円の情報を表示\n";
	ob.show();
	cout <<"色の情報:";co1.show();cout<<"\n";

	cout<<"この円の色は"<<co1.get_name();
	if(isSame(co1)){
		cout <<"です\n";
	}else{ cout <<"ではありません\n";}

	return 0;
}
 [1.3] エラー1 横文エラー:”)”
     エラー2 else文がifと一致しません
 [1.4]
質問1
今回出された課題はサンプルのプログラムが動くようにmain関数を作成せよ、というものです。そのためmain関数以外はすでに課題に書かれていたものです。そのため、サンプルとして出された部分でエラーが出てしまい戸惑っています。見返しても間違ってはいないはずなのですが・・・。サンプルがおかしいのでしょうか、それとも自分のmain関数に不備があるのでしょうか。教えてもらえるとありがたいです。
質問2
上記のように課題の問題文にはbool型関数isSame(CName)をフレンド関数で実装するとあるのですが、サンプルを見る限り実装されているようには自分には見えません。サンプル部分を変更してフレンド関数になるようにすると、今度はisSameがCircleのメンバではありませんというエラーが出てしまいます。
[2] 環境  
 [2.1] OS : Windows7
 [2.2] コンパイラ名 : visual studio 2008
[3] その他
 ・現在C++のオブジェクトのポインタを習っています。

jay
記事: 314
登録日時: 9年前
住所: 大阪市
連絡を取る:

Re: 課題のプログラムの1文について

#2

投稿記事 by jay » 7年前

if文でエラーが出るのはif文の条件が指定されていないから、ですね。

if文の()内でif文の条件を定義すればエラーは消えるハズです
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

Suikaba
記事: 194
登録日時: 9年前

Re: 課題のプログラムの1文について

#3

投稿記事 by Suikaba » 7年前

if( ) のなかもちゃんと自分で考えて書けって課題かと思ったのですが、違うようですね。
そうであれば明らかにこれは問題のミスでしょう。
とりあえずisSameの中身も自分で書いて、指摘してあげるのがいいかなとおもいます。

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: 課題のプログラムの1文について

#4

投稿記事 by beatle » 7年前

授業でまだやってない範囲のことはサンプルに書かない、という方針なのであれば納得なのですが、サンプルが悪い意味でC++っぽくないなあと思いました。
  • CName::CNameで初期化子を使っていない。
  • CName::CNameの引数strがconstポインタになっていない。
  • Circle::isSameの引数をconst参照にしていない。
この辺改良して出したら加点が狙えるかも?

AIR

Re: 課題のプログラムの1文について

#5

投稿記事 by AIR » 7年前

jay さんが書きました:if文でエラーが出るのはif文の条件が指定されていないから、ですね。

if文の()内でif文の条件を定義すればエラーは消えるハズです
Suikaba さんが書きました:if( ) のなかもちゃんと自分で考えて書けって課題かと思ったのですが、違うようですね。
そうであれば明らかにこれは問題のミスでしょう。
とりあえずisSameの中身も自分で書いて、指摘してあげるのがいいかなとおもいます。
やはりif文の条件がないのが原因なんですね。意味深に空欄になっていたり、問題文でとくに触れられてなかったので自分が気づかないだけで何が意味があるのかと思っていました。改良を加えてみます。
フレンド関数についても何か意見をいただけるとありがたいです。
beatle さんが書きました:授業でまだやってない範囲のことはサンプルに書かない、という方針なのであれば納得なのですが、サンプルが悪い意味でC++っぽくないなあと思いました。
  • CName::CNameで初期化子を使っていない。
  • CName::CNameの引数strがconstポインタになっていない。
  • Circle::isSameの引数をconst参照にしていない。
この辺改良して出したら加点が狙えるかも?
いずれもまだ習っていないですね。なので恐らく書かれていないのだと思います。
習っていないことでも調べて付け加えてみたほうがいいでしょうか?

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: 課題のプログラムの1文について

#6

投稿記事 by beatle » 7年前

AIR さんが書きました:
beatle さんが書きました:授業でまだやってない範囲のことはサンプルに書かない、という方針なのであれば納得なのですが、サンプルが悪い意味でC++っぽくないなあと思いました。
  • CName::CNameで初期化子を使っていない。
  • CName::CNameの引数strがconstポインタになっていない。
  • Circle::isSameの引数をconst参照にしていない。
この辺改良して出したら加点が狙えるかも?
いずれもまだ習っていないですね。なので恐らく書かれていないのだと思います。
習っていないことでも調べて付け加えてみたほうがいいでしょうか?
constポインタは実はC言語からの機能です。
AIRさんが授業に対して頑張る姿勢を見せたいなら調べて書いたほうがいいでしょうし、ただ単位を取るためなら別に書かなくてもいいんじゃないでしょうか。
僕だったらプログラミングが大好きなので改良版ソースを提出しちゃうと思いますけど。
AIR さんが書きました:サンプル部分を変更してフレンド関数になるようにすると、今度はisSameがCircleのメンバではありませんというエラーが出てしまいます。
「フレンド関数になるようにすると」とありますが、具体的にどういうコードを書いたのでしょうか。お示し下さい。

AIR

Re: 課題のプログラムの1文について

#7

投稿記事 by AIR » 7年前

どうも、何とか課題にある実行結果どおりにはなったので載せて見ます。

コード:


#include<iostream>
#include<cstring>
using namespace std;

class Circle;

class CName{
	char name[50];
	int r,g,b;
public:
	CName(char* str,int u,int v,int w);
	char* get_name(){return name;}
	void show();
	friend bool isSame(CName col,Circle ob);
};

class Circle{
	double x,y;
	double radius;
	int r,g,b;
public:
	void set_xyr(double s,double t,double r){
		x=s;y=t;radius=r;
	}
	void set_color(int u,int v,int w){
		r=u;g=v;b=w;
	}
	void show();
	friend bool isSame(CName col,Circle ob);
};



void Circle::show(){
	cout << "座標:("<<x<<","<<y<<")\n";
	cout << "半径:"  <<radius<<"\n";
	cout << "RGB:("  <<r<<","<<g<<","<<b<<")\n";
}

bool isSame(CName col,Circle ob){
	if(col.r==ob.r&&col.g==ob.g&&col.b==ob.b) return true;
	else return false;
}

CName::CName(char *str, int u, int v, int w){
	strcpy(name,str);
	r=u;g=v;b=w;
}

void CName::show(){
	cout<<name<<":("<<r<<","<<g<<","<<b<<")\n";
}


int main(){
	Circle ob;
	CName co1("Red",255,0,0);
	CName co2("Green",0,255,0);
	CName co3("Blue",0,0,255);

	ob.set_xyr(2.0,3.0,5.0);
	ob.set_color(255,0,0);

	cout <<"円の情報を表示\n";
	ob.show();
	cout <<"色1の情報:\n";co1.show();cout<<"\n";
	cout <<"色2の情報:\n";co2.show();cout<<"\n";
	cout <<"色3の情報:\n";co3.show();cout<<"\n";

	cout<<"この円の色は"<<co1.get_name();
	if(isSame(co1,ob)){
		cout <<"です\n";
	}else{ cout <<"ではありません\n";}
	cout<<"この円の色は"<<co2.get_name();
	if(isSame(co2,ob)){
		cout <<"です\n";
	}else{ cout <<"ではありません\n";}
	cout<<"この円の色は"<<co3.get_name();
	if(isSame(co3,ob)){
		cout <<"です\n";
	}else{ cout <<"ではありません\n";}
	return 0;
}
とりあえず、これで課題の実行結果と同じにはなっています。ただ、この条件だと円の色と指定した色の数値がまったく一緒で無いと真を返さないなど、恐らく不十分なのではないかと思っています。
このソースコードで改良すべき点などがあれば教えてもらえるとありがたいです。

閉鎖

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