C++ コンストラクタ?

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

C++ コンストラクタ?

#1

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

main関数を変えずに、
日付の差を求めるプログラムを作りたいのですが、
下のプログラムにメンバ関数sub()を加えて、
うるう年は考慮しなくて良く、
引数で渡される方が、古い日付であることを仮定して良いのですが
どこをどうすれば成立するのでしょうか...?
コンストラクタを使用すると思うのですが...


コード:

#include <iostream>
using namespace std;
class Date {
private:
	int year;
	int month;
	int day;
public:


	Date(int y, int m, int d) {
		if (set(y, m, d) != 0) {
			year = 0;
			month = 0;
			day = 0;
		}
	}
	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;
	cin >> yy >> mm >> dd;
	Date d1(yy, mm, dd);
	d1.get(yy, mm, dd);
	if (yy == 0 && mm == 0 && dd == 0) {
		cout << "正しく設定されていません" << endl;
		return 1;
	}
	cin >> yy >> mm >> dd;
	Date d2(yy, mm, dd);
	d2.get(yy, mm, dd);
	if (yy == 0 && mm == 0 && dd == 0) {
		cout << "正しく設定されていません" << endl;
		return 1;
	}
	d1.get(yy, mm, dd);
	cout << yy << "年" << mm << "月" << dd << "日から";
	d2.get(yy, mm, dd);
	cout << yy << "年" << mm << "月" << dd << "日までは";
	cout << d2.sub(d1) << "日です" << endl;
	return 0;
}

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

Re: C++ コンストラクタ?

#2

投稿記事 by purin52002 » 6年前

おそらくコンストラクタは使わないような気がします。(わたしなら使いません)

単純に日付を引けばいいんじゃないでしょうか?
返り値がint型、引数がDateクラスの関数subをDateの中に作りましょう。
あとはその関数の中で日付の差分をとればよさそうです。
オフトピック
アルゴリズムっていうか計算方法はめんどくさそうだから書きません^p^
10進数じゃないだけで引き算には変わりないはずなんできっとできるはず、、、
オフトピック
前スレ(?)の質問が解決になっててよかったです^^

解決した場合は具体的にどのようにして解決したかを書くといいですよ。

教えた側もどのように解決したか気になりますし、
他の人が似たような問題で困ったときに参考にするかもしれないですしね。
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

プログラム素人er

Re: C++ コンストラクタ?

#3

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

こうでしょうか?
少し具体的に教えていただけると助かります!!

コード:

#include <iostream>
using namespace std;
class Date {
private:
    int year;
    int month;
    int day;
public:
 
 
    Date(int y, int m, int d) {
        if (set(y, m, d) != 0) {
            year = 0;
            month = 0;
            day = 0;
        }
    }

	int sub(){
	}

    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;
    cin >> yy >> mm >> dd;
    Date d1(yy, mm, dd);
    d1.get(yy, mm, dd);
    if (yy == 0 && mm == 0 && dd == 0) {
        cout << "正しく設定されていません" << endl;
        return 1;
    }
    cin >> yy >> mm >> dd;
    Date d2(yy, mm, dd);
    d2.get(yy, mm, dd);
    if (yy == 0 && mm == 0 && dd == 0) {
        cout << "正しく設定されていません" << endl;
        return 1;
    }
    d1.get(yy, mm, dd);
    cout << yy << "年" << mm << "月" << dd << "日から";
    d2.get(yy, mm, dd);
    cout << yy << "年" << mm << "月" << dd << "日までは";
    cout << d2.sub(d1) << "日です" << endl;
    return 0;
}

かずま

Re: C++ コンストラクタ?

#4

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

プログラム素人er さんが書きました:少し具体的に教えていただけると助かります!!
年の差と、月の差と、日の差を合わせるだけですが、
月の差がちょっと難しいと思います。
int cm[] と同様、配列を使えばよいでしょう。

コード:

    int sub(const Date& x) {
        static int t[] = { 0,0,31,59,90,120,151,181,212,243,273,304,334 };
        return (year - x.year)*365 + t[month] - t[x.month] + day - x.day;
    } 
この解答に興味があれば、
配列 t[] の要素の値の意味を考えて説明してください。
また、static の意味を調べて説明してください。
それらができなければ、別の解答を考えてください。

プログラム素人er

Re: C++ コンストラクタ?

#5

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

constを使わないでやるにはどうしたらよいのでしょうか..?

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

Re: C++ コンストラクタ?

#6

投稿記事 by purin52002 » 6年前

ちょっとでいいからググってくれ~w

そしてt[]とかstaticのことも考えてみてください。
きっと役に立ちますよ^^
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

プログラム素人er

Re: C++ コンストラクタ?

#7

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

役立つのとは思うのですが、
使わないでやりたいのですが、どうしたらよいでしょうか...汗

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

Re: C++ コンストラクタ?

#8

投稿記事 by purin52002 » 6年前

まずはググる。グーグル先生は偉大。

グーグル先生が偉大すぎてわからなかった場合は質問する。
「先生は~~っていってるんですけど何を言っているのかよくわかりません。」

質問内容を具体的に書くと答える側も答えやすいです。

かといって「~~するプログラムを教えてください」って言われると、
「すげー全部教えてあげたい!でも、本人のためにならないしな、、、」ってなって答えづらいです。

質問内容をなるべくコンパクトにまとめるといいと思います。



あと、今回ググってほしいのはconst修飾子についてです。
const修飾子についてググって、それでもどうしたらいいかわからなかったらもう一度ここに来てみてください。

t[]はググってもたぶん出てきません。自分で考える必要があります。
staticはググると出てきます。使わないでやりたいのなら使わなくてもいいと思います。
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

プログラム素人er

Re: C++ コンストラクタ?

#9

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

constを使わないプログラムを作りたいんです。
constを使わずにこのプログラムを成立させるには、subをどうしたらよいのですか?

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

Re: C++ コンストラクタ?

#10

投稿記事 by purin52002 » 6年前

constを使いたくないのはよくわかりました。
constを使わずにsub関数を作りたいというのもよくわかりました。

では、constについてググってもらいたいというのはわかってもらえたでしょうか?
constが何を意味するのか分かってもらえたでしょうか?
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

かずま

Re: C++ コンストラクタ?

#11

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

プログラム素人er さんが書きました:constを使わないプログラムを作りたいんです。
constを使わずにこのプログラムを成立させるには、subをどうしたらよいのですか?
const を使わない解答を、私は 2つ知っています。
次の質問に答えていただければ、それらを披露します。
  1. const を使いたくないのはなぜですか?
  2. 配列 t の要素の値の意味を考えてみましたか?
  3. static の意味を調べてみましたか?
  4. この問題はどこ(書籍名かURL)から持ってきましたか?
  5. フォーラムルールを読みましたか?

プログラム素人er

Re: C++ コンストラクタ?

#12

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

constについてはググりました。



constを使いたくないのは、そういう指定だからです。
配列tは考えてみてもわかりませんでした。
staticの意味はわかりました。
この問題は書籍でもURLでもないので言えないです。
フォーラムルールは読んでいます。

かずま

Re: C++ コンストラクタ?

#13

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

私が問題の出所を知りたいのは、質問者が勝手な判断で
問題の条件を省略したりして、回答に困ることがあるからです。
なぜ、最初に「const は使えない」と書かなかったのですか?
問題文を原文のまま書いてください。

const を使わない解答その1

コード:

    int sub(Date& x) {
        static int t[] = { 0,0,31,59,90,120,151,181,212,243,273,304,334 };
        return (year - x.year)*365 + t[month] - t[x.month] + day - x.day;
    }
const を使わない解答その2

コード:

    int sub(Date x) {
        static int t[] = { 0,0,31,59,90,120,151,181,212,243,273,304,334 };
        return (year - x.year)*365 + t[month] - t[x.month] + day - x.day;
    }
上記の 2つの解答の違いを説明してください。
set と get を書いたのなら分かるはずです。

配列 t の意味が分かりやすい解答

コード:

    int sub(const Date& x) {
        static int t[] = { 0,
			0,
			31,
			31+28,
			31+28+31,
			31+28+31+30,
			31+28+31+30+31,
			31+28+31+30+31+30,
			31+28+31+30+31+30+31,
			31+28+31+30+31+30+31+31,
			31+28+31+30+31+30+31+31+30,
			31+28+31+30+31+30+31+31+30+31,
			31+28+31+30+31+30+31+31+30+31+30
		};
        return (year - x.year)*365 + t[month] - t[x.month] + day - x.day;
    }
配列 t の意味を説明してください。

static の意味を説明してください。
static を付けないとどうなりますか?

返信

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