プロが教えるわが家の防犯対策術!

C++勉強中です。課題が出たので質問したいです。よろしくお願いします。

日付のエラー処理を完全にするというもので、
次のような仕様を満たすようにMyDateクラスを修正せよ。というものです。

1.月、日共に初期値は1とする。
2.月、日の状態を出力するメンバ関数print()を追加する。
3.changeDay関数において、monthに入っている値に対応して適切なエラー処理を行う。
   4月の時は日は30まで、5月の時は31まで、みたいな感じです。
4.changeMonth関数において、変更しようとする月に対しdayに入っている値が大きすぎる場合、dayを変更後の最後の日に修正するようにする。例えば、5月31日に設定されている時に、changeMonth(2)が呼ばれた時、monthに2を、dayに28を代入する。
5.うるう年は考慮しなくていい。


#include <stdio.h>

class MyDate{
private:
int day, month;
public:
MyDate(int =1, int = 1);
void changeMonth(int); //「月」変更用関数
void changeDay(int); //「日」変更用関数
void print();
};

void MyDate::changeMonth(int argMonth)//メンバ関数(changeMonth)の定義
{

if(argMonth >= 1 && argMonth <= 12){
//1~12のときだけ値を更新
month = argMonth;
}
}

void MyDate::changeDay(int argDay)//メンバ関数(changeDay)の定義
{

//1~31が入力された場合のみ値を更新
if(argDay >= 1 && argDay <= 31){
day = argDay;
}
}
void MyDate::print()
{
if(month = 2 && day > 28){
printf("DATE = %d/%d\n",1,31);
}else if(month = 4,6,9,11 && day > 30){
printf("DATE = %d/%d\n",month-1,31);
}else{
printf("DATE = %d/%d\n",month,day);
}
}

int main(int, char **){

MyDate today;
today.changeDay(30);
today.changeMonth(9);

return 0;
}

途中まで考えたのですが、煮詰まってしまってうまくいきません。
ifは使いますよね?

void MyDate::print()
の所はこれでいいのでしょうか?
よろしくお願いします。

A 回答 (3件)

仕様の2と3を見るに…



>void MyDate::print()
>{
>if(month = 2 && day > 28){
>printf("DATE = %d/%d\n",1,31);
>}else if(month = 4,6,9,11 && day > 30){
> :

MyDate::print()でごにょごにょするのではなく、
changeDay()とchangeMonth()で処理しろ……
ということかと思われますが。

あと、上記のif文の判定式は正しくないです。
if(month = 2 && day > 28)
は…
monthに2を「代入」し、dayが28より大きい場合に真となります。
「monthが2、かつdayが28より大きい」という判定ではないです。
if(month == 2 && day > 28)
と記述していませんから。

if(month = 4,6,9,11 && day > 30)
は…
monthに4を「代入」し、dayが30より大きい場合に真となります。
「monthが4または6または9または11で、dayが30より大きい」を期待されているようでしょうが違います。

もう少し、基礎からやり直した方がいいと思いますが。
    • good
    • 0
この回答へのお礼

わかりやすい回答ありがとうございました。

お礼日時:2011/05/25 08:41

質問になっていません。



> 途中まで考えたのですが、

ではその「途中まで」を示してください

> 煮詰まってしまってうまくいきません。

どこで/なにに煮詰まったのですか?
なにが/どううまくいきませんか?
    • good
    • 0
この回答へのお礼

確かにこれじゃ丸投げみたいなものですよね。
指摘ありがとうございます。
今後気を付けます。

お礼日時:2011/05/25 08:40

コンストラクタの実体は?


これがないと初期化ができないはずですが。

また、3.と4.の条件はchangeDay関数とchangeMonth関数内の処理を説明しているはずですが、なぜprint関数で処理してるの? しかもやってる処理自体も提示された条件とは違ってるし。

さらに、

> month = 4,6,9,11

これはエラーにはならないでしょうが、あなたが考えている「monthが4,6,9,11のどれかと一致したら」という条件にはなりません。C++のコンマ演算子について調べてみてください。
    • good
    • 0
この回答へのお礼

わかりました
調べてみます!!
細かく教えてくれてありがとうございました

お礼日時:2011/05/18 11:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!