ページ 1 / 1
エラーの原因
Posted: 2017年4月25日(火) 23:51
by さとし
日にちを入力して、
その日にちが存在するなら、
その次の日を表示させるプログラムを作ったのですが、
エラーが出ます。
どこを直したらよいのでしょうか
コード:
#include <iostream>
using namespace std;
class Date {
private:
int year;
int month;
int day;
public:
int set(int year, int month, int day) {
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12 && 1 <= day <= 31) {
return 0;
}
else if (month == 2 || 1 <= day <= 28) {
return 0;
}
else if (month == 4 || month == 6 || month == 9 || month == 11 && 1 <= day <= 30) {
return 0;
}
else {
return 1;
}
}
void get(int year,int month,int day){}
void next() {
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 && day == 31) {
month++;
day == 1;
}
else if (month == 12 && day == 31) {
month == 1;
day == 1;
}
else if (month == 2 && day == 28) {
month++;
day == 1;
}
else if (month == 4 || month == 6 || month == 9 || month == 11 && day == 30) {
month++;
day == 1;
}
}
};
int main()
{
Date d1;
int yy, mm, dd, y, m, d;
cin >> yy >> mm >> dd;
if (d1.set(yy, mm, dd) == 0) {
d1.get(y, m, d);
cout << yy << "年" << mm << "月" << dd << "日が設定されました" << endl;
d1.next();
d1.get(yy, mm, dd);
cout << "次の日は" << yy << "年" << mm << "月" << dd << "日です" << endl;
}
else {
cout << "正しく設定されていません" << endl;
}
return 0;
}
Re: エラーの原因
Posted: 2017年4月26日(水) 00:06
by みけCAT
さとし さんが書きました:エラーが出ます。
コンパイルエラーは出ませんでした。
具体的なエラーの内容を書いていただける方が親切です。
さとし さんが書きました:どこを直したらよいのでしょうか
うーん、いっぱいありますね。
- 比較演算子の使い方が不適切(例えば1 <= x <= 5は(1 <= x) <= 5すなわちtrueと同じ)
- 論理ANDの方が論理ORより優先順位が高いのに、つけるべき括弧がついていない
- 無駄に比較してその結果を捨てている場所がある (if文の中で意図しない代入をするミスはよくあるが、その逆パターン)
- get関数が実装されていない。引数の型も不適切。(参照またポインタを使うべきであると思われる)
- set関数にセットする機能が無い。
- nextでdayがインクリメントされない。
といった問題が見つかりました。
Re: エラーの原因
Posted: 2017年4月26日(水) 00:14
by さとし
修正するとどうなるのでしょうか…?
教えていただきたいです。
よろしくお願いします。
別人だと思います。
講義などを受けてるわけじゃないので…
Re: エラーの原因
Posted: 2017年4月26日(水) 00:40
by purin52002
修正するとコードが完成に近づきます。
修正してみるといいですよ。
れっつとらい!
Re: エラーの原因
Posted: 2017年4月26日(水) 04:57
by るいと
修正できないから聞いているのですが…
インクリメントが何かとかもわからないですし…
Re: エラーの原因
Posted: 2017年4月26日(水) 05:16
by へにっくす
るいと さんが書きました:修正できないから聞いているのですが…
インクリメントが何かとかもわからないですし…
No.1と名前が違うようですが。あなた誰ですか。
(No.3で別人と書かれてますが…?)
とりあえずヒント。
まず比較で以下のような書き方はできません。
コード:
if (1 <= y <= 30) { /* ... */ }
以下のように書かないとだめですね。
コード:
if (1 <= y && y <= 30) { /* ... */ }
また、演算子の優先順位は分かりづらいので、一つずつカッコでかこった方が無難です。
コード:
if ((1 <= y) && (y <= 30)) { /* ... */ }
さらに以下のように書かれていますが、代入の形になっていない(== は比較演算子です)ので1になりません。
まずは上記の2点を修正してみましょう。
修正できたら、そのコードを載せてください。
(別に完成させろと言っているわけではありませんよ。またその修正コードを載せない限り学ぶ気がないとみなします)
答えを書いたところで、自分で考えてコードを書かない限り自分のものになりません。
そこ、分かっていますか?
Re: エラーの原因
Posted: 2017年4月26日(水) 06:12
by るいと
修正してきました!!!!!!!!!
コード:
#include <iostream>
using namespace std;
class Date {
private:
int year;
int month;
int day;
public:
int set(int yy, int mm, int dd) {
if ((mm == 1 || mm == 3 || mm == 5 || mm == 7 || mm == 8 || mm == 10 || mm == 12 )&& 1 <= dd || dd<= 31) {
return 0;
}
else if (mm == 2 || 1 <= dd ||dd <= 28) {
return 0;
}
else if ((mm == 4 || mm == 6 || mm == 9 || mm == 11) &&( 1 <= dd||dd <= 30)) {
return 0;
}
else {
return 1;
}
}
void get(int year,int month,int day){}
void next() {
if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 )&& day== 31) {
month++;
day = 1;
}
else if (month == 12 && day == 31) {
month = 1;
day = 1;
}
else if (month == 2 && day == 28) {
month++;
day = 1;
}
else if ((month == 4 || month == 6 || month == 9 || month == 11) && day == 30) {
month++;
day = 1;
}
else{
month++;
day++;
}
}
};
int main()
{
Date d1;
int yy, mm, dd, y, m, d;
cin >> yy >> mm >> dd;
if (d1.set(yy, mm, dd) == 0) {
d1.get(y, m, d);
cout << yy << "年" << mm << "月" << dd << "日が設定されました" << endl;
d1.next();
d1.get(yy, mm, dd);
cout << "次の日は" << yy << "年" << mm << "月" << dd << "日です" << endl;
}
else {
cout << "正しく設定されていません" << endl;
}
return 0;
}
Re: エラーの原因
Posted: 2017年4月26日(水) 09:57
by purin52002
お疲れ様です。
エラーらしいエラーはなくなったと思われます^^
細かいところをいくつか、、、
コード:
//後半の式も()でくくったほうがいい
//else if文だとくくっているのでくくり忘れ?
if ((mm == 1 || mm == 3 || mm == 5 || mm == 7 || mm == 8 || mm == 10 || mm == 12 )&& 1 <= dd || dd<= 31)
コード:
//たぶん式が適切ではない
//mm=2の場合必ずif文の中に入る
else if (mm == 2 || 1 <= dd ||dd <= 28)
あとこれは個人的な意見なのですが、set関数の返り値がどうにも気になります、、、(課題等でこういう仕様なのかもしれませんが)
不正な動作をした場合に1を返すことに違和感を感じます。
不正な動作の場合は0、もしくは-1を返すことが多い気がします。
(ついでに言うとbool型を使いたい^p^)
ともあれ、だんだん完成が見えてきましたね^^
あとはget関数の実装です。
参照型でググってみてください。(そんなに難しくはないはず、、、?)
オフトピック
コードの実行とかはしていますか?
実行結果、エラーメッセージを見るとどこでどういう不具合があるのかがわかりますよ^^
Re: エラーの原因
Posted: 2017年4月26日(水) 10:12
by るruru
こうなったのですが、
実行しても、存在しない日付でもそのまま設定され、
どんな日付でも翌日にならず、そのまま出力されてしまうのですが....
コード:
#include <iostream>
using namespace std;
class Date {
private:
int year;
int month;
int day;
public:
int set(int yy, int mm, int dd) {
if ((mm == 1 || mm == 3 || mm == 5 || mm == 7 || mm == 8 || mm == 10 || mm == 12 )&& (1 <= dd || dd<= 31)) {
return 0;
}
else if (mm == 2 &&( 1 <= dd ||dd <= 28)) {
return 0;
}
else if ((mm == 4 || mm == 6 || mm == 9 || mm == 11) &&( 1 <= dd||dd <= 30)) {
return 0;
}
else {
return 1;
}
}
void get(int& year,int& month,int& day){}
void next() {
if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 )&& day== 31) {
month++;
day = 1;
}
else if (month == 12 && day == 31) {
month = 1;
day = 1;
}
else if (month == 2 && day == 28) {
month++;
day = 1;
}
else if ((month == 4 || month == 6 || month == 9 || month == 11) && day == 30) {
month++;
day = 1;
}
else{
month++;
day++;
}
}
};
int main()
{
Date d1;
int yy, mm, dd, y, m, d;
cin >> yy >> mm >> dd;
if (d1.set(yy, mm, dd) == 0) {
d1.get(y, m, d);
cout << yy << "年" << mm << "月" << dd << "日が設定されました" << endl;
d1.next();
d1.get(yy, mm, dd);
cout << "次の日は" << yy << "年" << mm << "月" << dd << "日です" << endl;
}
else {
cout << "正しく設定されていません" << endl;
}
return 0;
}
Re: エラーの原因
Posted: 2017年4月26日(水) 11:59
by usao
オフトピック
>set関数にセットする機能が無い。
のように,指摘を受けているのにもかかわらず,
setやgetに必要な処理を何故か実装しない.
その状態で, 動かないのですが… みたく言われても.
あと,
>なるべくオリジナルな名前を決め、以後同じ名前を使い続けてください。
というルールになっていますので,いちいち名前を無駄に変えるべきではないと思いますが.
(”なるべく”なんて単語が入ってる時点でルールとして微妙な感じになっている気もしますけども)
Re: エラーの原因
Posted: 2017年4月26日(水) 12:40
by るrururu
それをどうしたら良いかがわからないのです…
Re: エラーの原因
Posted: 2017年4月26日(水) 13:22
by Dixq (管理人)
フォーラムルールの「なるべく」は「オリジナルな名前」の方にかかってます。
質問者が複数の名前を使うことは禁じています。
トピ主さん、ルールへの指摘を無視するのはやめましょう。
複数の名前を使っている場合管理人がアクセス情報をもとに同一人物か否かは公にできる決まりになっています。
何かユニークな名前一つに決めてください。
本サイトに登録して頂ければ名前入力の必要はありません。
Re: エラーの原因
Posted: 2017年4月26日(水) 13:25
by purin52002
>実行しても、存在しない日付でもそのまま設定され、
ということはif文の判定式がおかしいはずです。
論理演算が苦手なら数直線なんかを書いて図にしてみるとわかりやすいかもしれません。
>どんな日付でも翌日にならず、そのまま出力されてしまうのですが....
get関数でDateクラスが保持している年月日を取得すると思われます。
get関数が実装されていないから正しい値が出ません。
google先生を頼りにget関数を実装してみましょう。
>set関数にセットする機能が無い。
Dateクラスのメンバ変数はわかりますか?
set関数では正しい年月日が入力された際にメンバ変数に年月日を代入すればいいと思います。
Re: エラーの原因
Posted: 2017年4月26日(水) 13:52
by るruru
ここからどうしても進まないのですがどこをどうするとよいのですか?
get関数もgoogleで調べましたがよくわかりませんでした。
日付が正しいか間違いかは判断させられるようになりましたが、
次の日に出来ません。
コード:
#include <iostream>
using namespace std;
class Date {
private:
int year;
int month;
int day;
public:
int set(int year, int month, int day) {
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12 ) {
if(day<=31&&day>=1) return 0;
else return 1;
}
else if (month == 2) {
if(day<=28&&day>=1) return 0;
else return 1;
}
else if (month == 4 || month == 6 || month == 9 || month == 11){
if(day<=30&&day>=1) return 0;
else return 1;
}
}
void get(int& y,int& m,int& d){
}
void next() {
if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 )&& day== 31) {
month++;
day = 1;
}
else if (month == 12 && day == 31) {
year++;
month = 1;
day = 1;
}
else if (month == 2 && day == 28) {
month++;
day = 1;
}
else if ((month == 4 || month == 6 || month == 9 || month == 11) && day == 30) {
month++;
day = 1;
}
else{
month++;
day++;
}
}
};
int main()
{
Date d1;
int yy, mm, dd, y, m, d;
cin >> yy >> mm >> dd;
if (d1.set(yy, mm, dd) == 0) {
d1.get(y, m, d);
cout << yy << "年" << mm << "月" << dd << "日が設定されました" << endl;
d1.next();
d1.get(yy, mm, dd);
cout << "次の日は" << yy << "年" << mm << "月" << dd << "日です" << endl;
}
else {
cout << "正しく設定されていません" << endl;
}
return 0;
}
Re: エラーの原因
Posted: 2017年4月26日(水) 14:34
by かずま
ヒントとなるプログラムを示しますから、最後の質問に答えてください。
コード:
#include <iostream>
using namespace std;
class Hoge {
int x, y;
public:
void set(int xx, int yy) {
x = xx; y = yy;
}
void get(int& xx, int& yy) {
xx = x; yy = y;
}
};
int main()
{
Hoge h1;
int a, b, aa, bb;
cin >> a >> b;
h1.set(a, b);
h1.get(aa, bb);
cout << aa << ", " << bb << endl;
}
質問です。
main のコードはどこから持ってきましたか?
本であれば、その書籍名を、
ウェブサイトにあるのなら、その URL を教えてください。
main の中の、d1.get(y, m, d); が気になるのと、
最近、年月日で次の日を求める質問が、この掲示板でいくつか
続いたことを不思議に思っているからです。
もう一つヒントです。
2017年4月26日の次の日は2017年4月27日です。
day だけが 1 増えます。
month と day の両方が増えることがあるでしょうか?
Re: エラーの原因
Posted: 2017年4月26日(水) 16:13
by YuO
普通,現在の開発環境においてはソースレベルデバッガは用意されていると思いますし,デバッガにはブレイクポイントやソースシンボルを使ったウォッチ機能がついていると思いますが……。
この規模であれば,一行ずつステップ実行して変数の値が正しいかを調べていけば,どこで想定している状態になっていないかの絞り込みができると思うのですが。
# 想定している状態が無いというのは,そもそも「どうなるかがわかっていない」状態なので問題外。
Re: エラーの原因
Posted: 2017年4月26日(水) 16:28
by るruru
year month day
yy mm dd
y m d
と三つ使っているのでつが、
ヒントとなるプログラムでいただいたものは
二つしか使っていないのですが、どうした良いのですか。。。?
Re: エラーの原因
Posted: 2017年4月26日(水) 16:35
by るruru
int set(int year, int month, int day)
ここはこの通りじゃないとだめなのですが....汗
Re: エラーの原因
Posted: 2017年4月26日(水) 16:50
by るruru
以下のところだけ入力して、
その日付が存在するかどうかを確かめ、
存在すれば、翌日の日付を出力したいのです。
コード:
#include <iostream>
using namespace std;
class Date {
private:
int year;
int month;
int day;
public:
int set(int year, int month, int day) {
//ここ
}
void get( //ここ){
//ここ
}
void next() {
//ここ
}
};
int main()
{
Date d1;
int yy, mm, dd, y, m, d;
cin >> yy >> mm >> dd;
if (d1.set(yy, mm, dd) == 0) {
d1.get(y, m, d);
cout << yy << "年" << mm << "月" << dd << "日が設定されました" << endl;
d1.next();
d1.get(yy, mm, dd);
cout << "次の日は" << yy << "年" << mm << "月" << dd << "日です" << endl;
}
else {
cout << "正しく設定されていません" << endl;
}
return 0;
}
Re: エラーの原因
Posted: 2017年4月26日(水) 16:52
by usao
オフトピック
課題提出日がいつなのか知りませんけど,
もらったヒントの意味すら理解できない状態で,延々と不毛なやりとりしていても仕方ないのでは…
さっさと教科書なり何なりを読み直した方が早いのではないでしょうか.
Re: エラーの原因
Posted: 2017年4月26日(水) 17:47
by かずま
るruru さんが書きました:year month day
yy mm dd
y m d
と三つ使っているのでつが、
ヒントとなるプログラムでいただいたものは
二つしか使っていないのですが、どうした良いのですか。。。?
どうしたらよいのかを知りたければ、次の質問に答えてください。
main のコードはどこから持ってきましたか?
本であれば、その書籍名を、
ウェブサイトにあるのなら、その URL を教えてください。
Re: エラーの原因
Posted: 2017年4月26日(水) 18:24
by るruru
本やサイトではなく、
人から直々にだされるものです。
Re: エラーの原因
Posted: 2017年4月26日(水) 23:19
by かずま
るruru さんが書きました:本やサイトではなく、
人から直々にだされるものです。
その人に聞いてみてください。
「d1.get(y, m, d); で、d1 の中に設定された値を、
y, m, d に取得しているのに、次の行では、その設定された値ではなく、
入力された値 yy, mm, dd を表示しているのは、なぜですか?」と。
さて、どうしたらよいのかですが、
このヒントのプログラムは、get と set が何をしているのかを説明するものです。
引数の数が 2個なのは、Hogeクラスのメンバ変数が x と y の 2個だからです。
Dateクラスのメンバ変数に置き換えるには、x を year に、y を month に
書き換え、day を追加すればよいのが分かりませんか?
質問です。
- ヒントのプログラムをコンパイルして実行してみましたか?
- ヒントのプログラムを理解しましたか?
- ヒントのプログラムは、メンバ変数や引数の個数が Dateクラスとは異なるので無視したんですか?
- 「set は、引数の値をメンバ変数に設定する。get は、メンバ変数の値を引数にコピーする」ということを今は理解しましたか?
Re: エラーの原因
Posted: 2017年4月27日(木) 00:15
by るruru
わかりました、きいてみます
setの中が、
yearや、monthじゃなきゃダメなのですが、
ヒントだと、
yyやmmとなっているので、どうしたらいいのかわかりません…
Re: エラーの原因
Posted: 2017年4月27日(木) 00:25
by かずま
るruru さんが書きました:setの中が、
yearや、monthじゃなきゃダメなのですが、
ヒントだと、
yyやmmとなっているので、どうしたらいいのかわかりません…
引数名とメンバ変数名が同じ場合ということですか?
コード:
#include <iostream>
using namespace std;
class Hoge {
int x, y;
public:
void set(int x, int y) {
this->x = x; this->y = y;
}
void get(int& x, int& y) {
x = this->x; y = this->y;
}
};
int main()
{
Hoge h1;
int a, b, aa, bb;
cin >> a >> b;
h1.set(a, b);
h1.get(aa, bb);
cout << aa << ", " << bb << endl;
}
質問です。
- ヒントのプログラムをコンパイルして実行してみましたか?
- ヒントのプログラムを理解しましたか?
- ヒントのプログラムは、メンバ変数や引数の個数が Dateクラスとは異なるので無視したんですか?
- 「set は、引数の値をメンバ変数に設定する。get は、メンバ変数の値を引数にコピーする」ということを今は理解しましたか?
Re: エラーの原因
Posted: 2017年4月27日(木) 06:25
by るruru
thisを使わないヒントお願いしたいです。
thisはまだやっていないので...
Re: エラーの原因
Posted: 2017年4月27日(木) 07:00
by かずま
るruru さんが書きました:thisを使わないヒントお願いしたいです。
thisはまだやっていないので...
回答者の質問に答えず、一方的に質問を繰り返すだけの人にはもう回答しません。
Re: エラーの原因
Posted: 2017年4月27日(木) 07:10
by るruru
質問はすべてはいです。
すみません。
Re: エラーの原因
Posted: 2017年4月27日(木) 08:53
by purin52002
横から失礼します。
コードはかずまさんのヒントをもとにすれば完成すると思います。
質問です。
ヒントのプログラムをコンパイルして実行してみましたか?
ヒントのプログラムを理解しましたか?
ヒントのプログラムは、メンバ変数や引数の個数が Dateクラスとは異なるので無視したんですか?
「set は、引数の値をメンバ変数に設定する。get は、メンバ変数の値を引数にコピーする」ということを今は理解しましたか?
質問はすべてはいです。
ヒントのプログラムは理解できているということなので、
あとはメンバ変数を変えたりなんだりで済むと思います。
もしもヒントのプログラムでわからない部分があるとしたら
箇条書きで具体的に書いてみてください。
Re: エラーの原因
Posted: 2017年4月27日(木) 09:21
by るruru
thisが使えないので、そこをどうしたら良いかわかりません。
Re: エラーの原因
Posted: 2017年4月27日(木) 10:36
by purin52002
使えないなら使えるようになりましょう^^
きっと今後役に立ちます。
「this」というのはクラスのポインタを示します。(自分自身のポインタみたいな感じ?)
構造体のメンバ(構造体の中の変数)にアクセスするときは「hoge.x」のようになります。
構造体のポインタがメンバにアクセスするときはアロー演算子というものを使います。hoge->x
thisもポインタなので、this->xのように書くとxにアクセスすることができます。
わかりやすく説明するのが難しいので、「c++ this」で検索して自分でも調べてみてください。
また、c++の勉強をするなら「ロベールのc++教室」や「猫でもわかるプログラミング」というサイトが1から10ぐらいまで解説してくれていますよ^^
Re: エラーの原因
Posted: 2017年4月27日(木) 14:25
by Dixq (管理人)
thisを学べばいいのではないでしょうか。
ググればいくらでも情報出てきます。