ページ 1 / 1
C言語++について質問です。
Posted: 2010年12月11日(土) 15:53
by exmt-tvyn
初めてこのサイトを利用します。
課題の問題なのですが、問題内容と自分でできたところまでを載せます。
次のように、整数値を表すクラスを設計する
データメンバ
x:xの座標(ただし 0-1000とする)
y:yの座標(ただし 0-1000とする)
z:zの座標(ただし 0-1000とする)
メンバ関数
void setX(int a): xの座標を設計する(範囲外の値は、error messageを出力する)
void setY(int b): Yの座標を設計する(範囲外の値は、error messageを出力する)
void setZ(int c) Zの座標を設計する(範囲外の値は、error messageを出力する)
int getX(): Xの座標値を得る
int getY(): Yの座標値を得る
int getZ(): Zの座標値を得る
結果は、次のように表示する.
Please Input X
3
Please Input Y
1000067
The value of Y is a mistake, Please input Y again!
5
Please Input Z
7
The result is: (3,5,7)
以上が問題です。
class Calc
{
private:
int x;
int y;
int z;
void CheckNum(int n, char d) {
if (n < 1 || 1000 < n) {
printf("...%c...%c..", d, d);
...
}
};
public:
void setX(int a) { CheckNum(a, 'X') ... };
void setY(int b) { CheckNum(b, 'Y') ... };
void setZ(int c) { CheckNum(c, 'Z') ... };
int getX() { return x; };
int getY() { return y; };
int getZ() { return z; };
}
ここまではヒントをもらってやりましたが、...の部分に何を入れればよいのか分かりません。
...の部分、もしくは別のやり方でも構いませんので、どなたか教えていただけると助かります。
Re: C言語++について質問です。
Posted: 2010年12月11日(土) 17:33
by softya(ソフト屋)
これですね?
http://detail.chiebukuro.yahoo.co.jp/qa ... 1351773193
ヒントでは無くまんまの写しだと思いますが、フォーラムルールに則って相互リンクをお願いしたいのと、自分の現状に正直に書き込みをお願いします。
とりあえず、
フォーラムルールのテンプレに従って記載してください。
なお、コードを貼る機能がりますので、それを使っていただけると読みやすくなります。
ちなみにC言語++と言う言語は存在しません。C++言語かC++とお書きください。
Re: C言語++について質問です。
Posted: 2010年12月11日(土) 18:32
by exmt-tvyn
申し訳ありません。
その通りです。
そのサイトで教えてもらい、そこまでは自分なりに理解したつもりです。
意味がないことかもしれませんが、プログラムも自分で打ちました。
ほぼ丸投げになってしまうかもしれませんが、お力を貸していただけると助かります。
Re: C言語++について質問です。
Posted: 2010年12月11日(土) 18:46
by softya(ソフト屋)
まず、書いてあります通りにフォーラムルールにあるテンプレに記載してください。
「うまくいきません」という質問は大抵回答に困ります。
1. 自分は今何がしたくて
2. どう取り組んで(作ったプログラムはどれで
3. どのようなエラーやトラブルで困っていて
4. 自分は何が解らないのか、知りたいのか
5. 今のC++の知識はどの程度なのか
この5点をしっかりと明記して下さい。
環境に依存する場合やライブラリを使っているときは
使っているOS名・コンパイラ名・ライブラリ名も明記しましょう。
できるだけ細かくお願いします。
コードを貼り直しておきますが、main関数もないのでそちらの記載をお願いします。
コード:
class Calc
{
private:
int x;
int y;
int z;
void CheckNum(int n, char d) {
if (n < 1 || 1000 < n) {
printf("...%c...%c..", d, d);
...
}
};
public:
void setX(int a) { CheckNum(a, 'X') ... };
void setY(int b) { CheckNum(b, 'Y') ... };
void setZ(int c) { CheckNum(c, 'Z') ... };
int getX() { return x; };
int getY() { return y; };
int getZ() { return z; };
}
もしmainもどうして良いのか分からないのであれば、
Please Input X
3
Please Input Y
1000067
The value of Y is a mistake, Please input Y again!
5
Please Input Z
7
The result is: (3,5,7)
だけを実現するプログラムをクラスを使わなくてもよいので書いてみてください。
【追記】
void setX(int a): xの座標を設計する(範囲外の値は、error messageを出力する)
void setY(int b): Yの座標を設計する(範囲外の値は、error messageを出力する)
void setZ(int c) Zの座標を設計する(範囲外の値は、error messageを出力する)
の設計は設定ですよね。
まぁ、それはそれとしてクラスとして設計がおかしいので次のように変えないと仕様を満たしたプログラムが作れないと私は思います。
bool setX(int a): xの座標を設定する。範囲外の値は、FALSEを返す。正常ならTRUEを返す。
bool setY(int b): Yの座標を設定する。範囲外の値は、FALSEを返す。正常ならTRUEを返す。
bool setZ(int c): Zの座標を設定する。範囲外の値は、FALSEを返す。正常ならTRUEを返す。
ご検討下さい。
Re: C言語++について質問です。
Posted: 2010年12月11日(土) 19:18
by exmt-tvyn
これで合っていますでしょうか?
間違っていたらすみません。
1.明日提出のプログラミングC++言語の課題についての質問です。
2.他のサイトで教えてもらった内容が最初に載せたものです。
その後このサイトを見つけ、こちらの方が詳しく教えてもらえるのではないかと思い質問しました。
3.他の人が作成したプログラムはだいたいは理解できるのですが、いざ自分で作成するとなると何から手をつけてよいのか分かりません。
4....の部分に当てはまるもの、もしくは別の良いやり方があれば教えていただきたいです。
5.今までほとんどパソコンを利用したことがないため、まったくと言っていいほど知識がありません。
課題が出たのは今回が初めてで、1から自分で作成するのも初めてです。
授業では教授が作ったプログラムを自分のパソコンに打ってみる、といった感じなので、自分で考えて作るというよりもほぼ暗記の状態です。
Re: C言語++について質問です。
Posted: 2010年12月11日(土) 19:59
by softya(ソフト屋)
exmt-tvyn さんが書きました:これで合っていますでしょうか?
間違っていたらすみません。
1.明日提出のプログラミングC++言語の課題についての質問です。
2.他のサイトで教えてもらった内容が最初に載せたものです。
その後このサイトを見つけ、こちらの方が詳しく教えてもらえるのではないかと思い質問しました。
3.他の人が作成したプログラムはだいたいは理解できるのですが、いざ自分で作成するとなると何から手をつけてよいのか分かりません。
4....の部分に当てはまるもの、もしくは別の良いやり方があれば教えていただきたいです。
5.今までほとんどパソコンを利用したことがないため、まったくと言っていいほど知識がありません。
課題が出たのは今回が初めてで、1から自分で作成するのも初めてです。
授業では教授が作ったプログラムを自分のパソコンに打ってみる、といった感じなので、自分で考えて作るというよりもほぼ暗記の状態です。
そもそもメンバ関数の定義が変わるのですが、課題としてはそれで良いのでしょうか?
場合によっては、それだけでNGになりそうですが。
あと明日日曜ですが、明日提出ですか?
Re: C言語++について質問です。
Posted: 2010年12月11日(土) 21:49
by exmt-tvyn
遅くなってしまいすみません。
ネット提出で、明日(日曜)までなんです。
どんなに大変でもやろうと思います。
Re: C言語++について質問です。
Posted: 2010年12月11日(土) 21:54
by exmt-tvyn
すみません。言葉が足りませんでした。
関数が変わってしまうのはまずいかもしれません・・。
それにも気がつかないなんて情けないです。
自分では理解していたつもりでしたが、やはり全然できていなかったようです。
Re: C言語++について質問です。
Posted: 2010年12月11日(土) 22:57
by softya(ソフト屋)
今のところ仕様を満たしていてかつ、setメンバ関数の引数を有効利用するクラスというのが私には思いつきません。
すごく矛盾しているので完全に条件を満たせるとは思えませんので、問題自体の間違いを指摘するのが課題とか言う落ちはありませんか?
引数を使わないで作るなら出来ますが、それってクラスの設計としてすごく間違っているんですよ。
Re: C言語++について質問です。
Posted: 2010年12月11日(土) 23:06
by exmt-tvyn
詳しく教えていただいてありがとうございます。
そうですか・・。
おそらく教授が問題を間違えてしまっただけで、それを指摘するのが回答というわけではないと思います。
ということは完全に条件を満たせないプログラムか、引数を使わないで作ったプログラムのどちらかということですよね?
前者の方でやってみようと思います。
最初に載せたプログラムを元に作成することは可能でしょうか?
Re: C言語++について質問です。
Posted: 2010年12月11日(土) 23:53
by softya(ソフト屋)
最初のものに近いもので動く物を書いてみました。
ただ、mainは自分で考えてみてください。
コード:
class Calc
{
private:
int x;
int y;
int z;
int InputNum(char d) {
int n;
cout << "please input " << d << ":" << endl;
cin >> n;
while(n<0 || 1000<n) {
cout << "The value of "<< d <<" is a mistake, Please input "<< d <<" again!" << endl;
cin >> n;
}
return n;
};
public:
void setX(int a) { x=InputNum('X'); };
void setY(int b) { y=InputNum('Y'); };
void setZ(int c) { z=InputNum('Z'); };
int getX() { return x; };
int getY() { return y; };
int getZ() { return z; };
}
;
Re: C言語++について質問です。
Posted: 2010年12月12日(日) 00:06
by exmt-tvyn
ありがとうございます。
本当に助かります。
今から頑張ってやってみます。
Re: C言語++について質問です。
Posted: 2010年12月12日(日) 00:10
by Dixq (管理人)
softyaさんに呼ばれてきました。
酷い仕様ですね・・。
exmt-tvynさんの今のお気持ちとしては
「間違いをそのままにしたくはない、正しい答えを書くべきだ!」
か
「いやいや、教授の逆鱗に触れるようなことはしたくない。要件を満たす回答をするだけで済ませたい」
のどちらでしょうか?
softyaさんから教えて頂きましたが、
http://detail.chiebukuro.yahoo.co.jp/qa ... 1422039044
去年も全く同じ問題が出ていますね。「設計」という誤字もそのまま放置してある事から、きちんと考えられていないのではないかと推測出来ます。
今、set関数はsetが成功したかどうかvoidなので解りません。
解りやすく言うならば、
Aさんは「この仕事やっておいてね」とBさんに言ったとします。仕事をした後、Bさんは「仕事は正常に終わったよ」と言ってくれないのです。
それより、仕事を終えた時「ちゃんと仕事終わったよ」とAさんに返事くれる仕様の方がよっぽどいいですよね。
今のままだと、set関数の中で、引数が不適切なら再入力を求める仕様にしなければなりません。
これはsoftyaさんが仰る方法ですね。
ただsoftyaさんも仰る通り、これはあるべき仕様ではありません。
ここで、コンストラクタで変数を-1で初期化しておけば、
set関数から処理が返って来た後で、get関数でちゃんとセットできたか、調べる事が出来ます。
例えばxを-1で初期化しておけば、範囲外の値がset関数に渡され、セットされなかったとき、-1のままになります。
set関数から返って来た後で、get関数でxの値を取得して、まだ-1ならセット出来なかったことが解ります。
クラスの中で再入力を求める事はしない方がいいと思うので、もし関数の仕様を変更せずにスマートなクラスにしたければ
以下のようなクラスを参考にして下さい。
コード:
class Calc{
int x;
public:
// xを-1で初期化
Calc(){
x = -1;
}
void setX(int a);
int getX();
};
void Calc::setX(int a){
// 10以上20未満ならxにaを代入
if( 10<=a && a<20 ){
x = a;
}
}
int Calc::getX(){
// xを返す
return x;
}
int main(void){
Calc cal;
cal.setX(10);
printf("%d",cal.getX());
return 0;
}
Re: C言語++について質問です。
Posted: 2010年12月12日(日) 00:59
by exmt-tvyn
お忙しいのにわざわざありがとうございます。
去年も同じ問題が出ていたなんて全く気がつきませんでした。
正直間違いをそのままにはしたくないと思いながらも、間違いを指摘して教授にいろいろと聞かれてしまうのを想像すると後者の方を選んでしまいます・・。
この課題が終わったら、もう1度自分で1から勉強しなおします。
本当にありがとうございました。