C++のコンストラクタについて...

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

C++のコンストラクタについて...

#1

投稿記事 by プログラム素人er » 7年前

メイン関数はこのままで、
set関数は削除しないで、オブジェクト生成直後の、日付の設定はコンストラクタを使って行いたいのですが、
(コンストラクタでは、不正な日付を排除する)
(不正な日付のときは、0年0月0日に設定する)
ということをしたいのですが、
コンストラクタを学び始めたばかりなので、
どこをどう変更していいのかわかりません。
どうしたらよいのか、教えてください。
よろしくお願いします。

コード:

#include <iostream>
using namespace std;
class Date {
private:
	int year;
	int month;
	int day;
public:
	int set(int y, int m, int d) {
		int cm[] = { 0, 31, 28, 31, 30,
			31, 30, 31, 31, 30, 31, 30, 31 };
		if (!(1 <= m && m <= 12)) {
			return 1;// 月が間違い
		}
		if (!(1 <= d && d <= cm[m])) {
			return 1;// 日が間違い
		}
		year = y;
		month = m;
		day = d;
		return 0;
	}
	void get(int &y, int &m, int &d) {
		y = year;
		m = month;
		d = day;
	}
	void next() {
		int cm[] = { 0, 31, 28, 31, 30, 31, 30,
			31, 31, 30, 31, 30, 31 };
		day++;
		if (cm[month] < day) {
			day = 1;
			month++;
			if (12 < month) {
				month = 1;
				year++;
			}
		}
	}
};


int main()
{
	int yy, mm, dd, y, m, d;

	cin >> yy >> mm >> dd;

	Date d1(yy, mm, dd);
	d1.get(y, m, d);
	if (y != 0 && m != 0 && d != 0) {
		cout << yy << "年" << mm << "月" << dd << "日が設定されました" << endl;
		d1.next();
		d1.get(yy, mm, dd);
		cout << "次の日は" << yy << "年" << mm << "月" << dd << "日です" << endl;
	}
	else {
		cout << "正しく設定されていません" << endl;
	}
	return 0;
}

アバター
purin52002
記事: 235
登録日時: 7年前
連絡を取る:

Re: C++のコンストラクタについて...

#2

投稿記事 by purin52002 » 7年前

こんにちは

まずクラスのpublic中にコンストラクタを作ります。
コンストラクタは返り値のない関数のようなものです。

main文を見ると引数は年月日ですかね?

コード:

class Date
{
public:
    Date(int y,int m,int d);//コンストラクタ
};
コンストラクタの中で日付を設定します。が、set関数があるのでそれを利用すれば簡単に作れそうですね^^
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

プログラム素人er

Re: C++のコンストラクタについて...

#3

投稿記事 by プログラム素人er » 7年前

出来ました!ありがとうございます。

かずま

Re: C++のコンストラクタについて...

#4

投稿記事 by かずま » 7年前

プログラム素人er さんが書きました:出来ました!ありがとうございます。
質問です。
フォーラムルールは読んでいないのですか?
解決した時は、「解決しました」とだけ言って去らず、ソースコードや解決した方法を明記して下さい。
と書かれています。

私は、3通りの方法を考え付きました。質問に答えて、
解決した方法を明記していただくと、その方法を示します。

プログラム素人er

Re: C++のコンストラクタについて...

#5

投稿記事 by プログラム素人er » 7年前

すみません!こうです!

コード:

#include <iostream>
using namespace std;
class Date {

private:
	int year;
	int month;
	int day;
public:
Date(int y,int m,int d){

}

	int set(int y, int m, int d) {
		int cm[] = { 0, 31, 28, 31, 30,
			31, 30, 31, 31, 30, 31, 30, 31 };
		if (!(1 <= m && m <= 12)) {
			return 1;// 月が間違い
		}
		if (!(1 <= d && d <= cm[m])) {
			return 1;// 日が間違い
		}
		year = y;
		month = m;
		day = d;
		return 0;
	}




	void get(int &y, int &m, int &d) {
		y = year;
		m = month;
		d = day;
	}
	void next() {
		int cm[] = { 0, 31, 28, 31, 30, 31, 30,
			31, 31, 30, 31, 30, 31 };
		day++;
		if (cm[month] < day) {
			day = 1;
			month++;
			if (12 < month) {
				month = 1;
				year++;
			}
		}
	}




};


int main()
{
	int yy, mm, dd, y, m, d;

	cin >> yy >> mm >> dd;

	Date d1(yy, mm, dd);
	d1.get(y, m, d);
	if (y != 0 && m != 0 && d != 0) {
		cout << yy << "年" << mm << "月" << dd << "日が設定されました" << endl;
		d1.next();
		d1.get(yy, mm, dd);
		cout << "次の日は" << yy << "年" << mm << "月" << dd << "日です" << endl;
	}
	else {
		cout << "正しく設定されていません" << endl;
	}
	return 0;
}

かずま

Re: C++のコンストラクタについて...

#6

投稿記事 by かずま » 7年前

プログラム素人er さんが書きました:すみません!こうです!
Date() の中身が空っぽですよ。

解答その1

コード:

    Date(int y,int m,int d) {
        if (set(y, m, d)) year = month = day = 0;
    }

解答その2

コード:

    Date(int y,int m,int d) : year(0), month(0), day(0) {
        set(y, m, d);
    }

解答その3 (set を変更していいなら)

コード:

    Date(int y,int m,int d) {
        set(y, m, d); 
    }
 
    int set(int y, int m, int d) {
        static int cm[] = {
            0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
        if (m < 1 || m > 12 || d < 1 || d > cm[m]) {
            year = month = day = 0;
            return 1;
        }
        year = y, month = m, day = d;
        return 0;
    }

返信

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