ページ 1 / 1
C++ コンストラクタ?
Posted: 2017年5月10日(水) 19:47
by プログラム素人er
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;
}
Re: C++ コンストラクタ?
Posted: 2017年5月10日(水) 20:13
by purin52002
おそらくコンストラクタは使わないような気がします。(わたしなら使いません)
単純に日付を引けばいいんじゃないでしょうか?
返り値がint型、引数がDateクラスの関数subをDateの中に作りましょう。
あとはその関数の中で日付の差分をとればよさそうです。
オフトピック
アルゴリズムっていうか計算方法はめんどくさそうだから書きません^p^
10進数じゃないだけで引き算には変わりないはずなんできっとできるはず、、、
オフトピック
前スレ(?)の質問が解決になっててよかったです^^
解決した場合は具体的にどのようにして解決したかを書くといいですよ。
教えた側もどのように解決したか気になりますし、
他の人が似たような問題で困ったときに参考にするかもしれないですしね。
Re: C++ コンストラクタ?
Posted: 2017年5月10日(水) 20:17
by プログラム素人er
こうでしょうか?
少し具体的に教えていただけると助かります!!
コード:
#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++ コンストラクタ?
Posted: 2017年5月10日(水) 20:38
by かずま
プログラム素人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 の意味を調べて説明してください。
それらができなければ、別の解答を考えてください。
Re: C++ コンストラクタ?
Posted: 2017年5月10日(水) 21:20
by プログラム素人er
constを使わないでやるにはどうしたらよいのでしょうか..?
Re: C++ コンストラクタ?
Posted: 2017年5月10日(水) 21:26
by purin52002
ちょっとでいいからググってくれ~w
そしてt[]とかstaticのことも考えてみてください。
きっと役に立ちますよ^^
Re: C++ コンストラクタ?
Posted: 2017年5月10日(水) 22:04
by プログラム素人er
役立つのとは思うのですが、
使わないでやりたいのですが、どうしたらよいでしょうか...汗
Re: C++ コンストラクタ?
Posted: 2017年5月10日(水) 22:41
by purin52002
まずはググる。グーグル先生は偉大。
グーグル先生が偉大すぎてわからなかった場合は質問する。
「先生は~~っていってるんですけど何を言っているのかよくわかりません。」
質問内容を具体的に書くと答える側も答えやすいです。
かといって「~~するプログラムを教えてください」って言われると、
「すげー全部教えてあげたい!でも、本人のためにならないしな、、、」ってなって答えづらいです。
質問内容をなるべくコンパクトにまとめるといいと思います。
あと、今回ググってほしいのはconst修飾子についてです。
const修飾子についてググって、それでもどうしたらいいかわからなかったらもう一度ここに来てみてください。
t[]はググってもたぶん出てきません。自分で考える必要があります。
staticはググると出てきます。使わないでやりたいのなら使わなくてもいいと思います。
Re: C++ コンストラクタ?
Posted: 2017年5月10日(水) 23:14
by プログラム素人er
constを使わないプログラムを作りたいんです。
constを使わずにこのプログラムを成立させるには、subをどうしたらよいのですか?
Re: C++ コンストラクタ?
Posted: 2017年5月10日(水) 23:27
by purin52002
constを使いたくないのはよくわかりました。
constを使わずにsub関数を作りたいというのもよくわかりました。
では、constについてググってもらいたいというのはわかってもらえたでしょうか?
constが何を意味するのか分かってもらえたでしょうか?
Re: C++ コンストラクタ?
Posted: 2017年5月11日(木) 00:51
by かずま
プログラム素人er さんが書きました:constを使わないプログラムを作りたいんです。
constを使わずにこのプログラムを成立させるには、subをどうしたらよいのですか?
const を使わない解答を、私は 2つ知っています。
次の質問に答えていただければ、それらを披露します。
- const を使いたくないのはなぜですか?
- 配列 t の要素の値の意味を考えてみましたか?
- static の意味を調べてみましたか?
- この問題はどこ(書籍名かURL)から持ってきましたか?
- フォーラムルールを読みましたか?
Re: C++ コンストラクタ?
Posted: 2017年5月11日(木) 07:13
by プログラム素人er
constについてはググりました。
constを使いたくないのは、そういう指定だからです。
配列tは考えてみてもわかりませんでした。
staticの意味はわかりました。
この問題は書籍でもURLでもないので言えないです。
フォーラムルールは読んでいます。
Re: C++ コンストラクタ?
Posted: 2017年5月11日(木) 08:48
by かずま
私が問題の出所を知りたいのは、質問者が勝手な判断で
問題の条件を省略したりして、回答に困ることがあるからです。
なぜ、最初に「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 を付けないとどうなりますか?