エラーの原因

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

エラーの原因

#1

投稿記事 by さとし » 2年前

日にちを入力して、
その日にちが存在するなら、
その次の日を表示させるプログラムを作ったのですが、
エラーが出ます。
どこを直したらよいのでしょうか

コード:

#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;
}

アバター
みけCAT
記事: 6227
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: エラーの原因

#2

投稿記事 by みけCAT » 2年前

さとし さんが書きました:エラーが出ます。
コンパイルエラーは出ませんでした。
具体的なエラーの内容を書いていただける方が親切です。
さとし さんが書きました:どこを直したらよいのでしょうか
うーん、いっぱいありますね。
  • 比較演算子の使い方が不適切(例えば1 <= x <= 5は(1 <= x) <= 5すなわちtrueと同じ)
  • 論理ANDの方が論理ORより優先順位が高いのに、つけるべき括弧がついていない
  • 無駄に比較してその結果を捨てている場所がある (if文の中で意図しない代入をするミスはよくあるが、その逆パターン)
  • get関数が実装されていない。引数の型も不適切。(参照またポインタを使うべきであると思われる)
  • set関数にセットする機能が無い。
  • nextでdayがインクリメントされない。
といった問題が見つかりました。
オフトピック
日付を表すクラス(C++) • C言語交流フォーラム ~ mixC++ ~
と問題が似ているようですが、同じ講義などを受けているというだけで別人ですよね?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

さとし

Re: エラーの原因

#3

投稿記事 by さとし » 2年前

修正するとどうなるのでしょうか…?
教えていただきたいです。
よろしくお願いします。


別人だと思います。
講義などを受けてるわけじゃないので…

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

Re: エラーの原因

#4

投稿記事 by purin52002 » 2年前

修正するとコードが完成に近づきます。
修正してみるといいですよ。
れっつとらい!
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

るいと

Re: エラーの原因

#5

投稿記事 by るいと » 2年前

修正できないから聞いているのですが…
インクリメントが何かとかもわからないですし…

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: エラーの原因

#6

投稿記事 by へにっくす » 2年前

るいと さんが書きました:修正できないから聞いているのですが…
インクリメントが何かとかもわからないですし…
No.1と名前が違うようですが。あなた誰ですか。
(No.3で別人と書かれてますが…?)

とりあえずヒント。

まず比較で以下のような書き方はできません。

コード:

if (1 <= y <= 30) { /* ... */ }
以下のように書かないとだめですね。

コード:

if (1 <= y && y <= 30) { /* ... */ }
また、演算子の優先順位は分かりづらいので、一つずつカッコでかこった方が無難です。

コード:

if ((1 <= y) && (y <= 30)) { /* ... */ }

さらに以下のように書かれていますが、代入の形になっていない(== は比較演算子です)ので1になりません。

コード:

day == 1;
まずは上記の2点を修正してみましょう。
修正できたら、そのコードを載せてください。
(別に完成させろと言っているわけではありませんよ。またその修正コードを載せない限り学ぶ気がないとみなします)
答えを書いたところで、自分で考えてコードを書かない限り自分のものになりません。
そこ、分かっていますか?
written by へにっくす

るいと

Re: エラーの原因

#7

投稿記事 by るいと » 2年前

修正してきました!!!!!!!!!


コード:


#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;
}

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

Re: エラーの原因

#8

投稿記事 by purin52002 » 2年前

お疲れ様です。
エラーらしいエラーはなくなったと思われます^^

細かいところをいくつか、、、

コード:

//後半の式も()でくくったほうがいい
//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関数の実装です。
参照型でググってみてください。(そんなに難しくはないはず、、、?)

オフトピック
コードの実行とかはしていますか?
実行結果、エラーメッセージを見るとどこでどういう不具合があるのかがわかりますよ^^
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

るruru

Re: エラーの原因

#9

投稿記事 by るruru » 2年前

こうなったのですが、
実行しても、存在しない日付でもそのまま設定され、
どんな日付でも翌日にならず、そのまま出力されてしまうのですが....

コード:


#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;
}


アバター
usao
記事: 1564
登録日時: 6年前

Re: エラーの原因

#10

投稿記事 by usao » 2年前

オフトピック
>set関数にセットする機能が無い。

のように,指摘を受けているのにもかかわらず,
setやgetに必要な処理を何故か実装しない.
その状態で, 動かないのですが… みたく言われても.


あと,

>なるべくオリジナルな名前を決め、以後同じ名前を使い続けてください。

というルールになっていますので,いちいち名前を無駄に変えるべきではないと思いますが.
(”なるべく”なんて単語が入ってる時点でルールとして微妙な感じになっている気もしますけども)

るrururu

Re: エラーの原因

#11

投稿記事 by るrururu » 2年前

それをどうしたら良いかがわからないのです…

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: エラーの原因

#12

投稿記事 by Dixq (管理人) » 2年前

フォーラムルールの「なるべく」は「オリジナルな名前」の方にかかってます。
質問者が複数の名前を使うことは禁じています。

トピ主さん、ルールへの指摘を無視するのはやめましょう。
複数の名前を使っている場合管理人がアクセス情報をもとに同一人物か否かは公にできる決まりになっています。
何かユニークな名前一つに決めてください。
本サイトに登録して頂ければ名前入力の必要はありません。

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

Re: エラーの原因

#13

投稿記事 by purin52002 » 2年前

>実行しても、存在しない日付でもそのまま設定され、

ということはif文の判定式がおかしいはずです。
論理演算が苦手なら数直線なんかを書いて図にしてみるとわかりやすいかもしれません。


>どんな日付でも翌日にならず、そのまま出力されてしまうのですが....

get関数でDateクラスが保持している年月日を取得すると思われます。
get関数が実装されていないから正しい値が出ません。
google先生を頼りにget関数を実装してみましょう。


>set関数にセットする機能が無い。

Dateクラスのメンバ変数はわかりますか?
set関数では正しい年月日が入力された際にメンバ変数に年月日を代入すればいいと思います。
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

るruru

Re: エラーの原因

#14

投稿記事 by るruru » 2年前

ここからどうしても進まないのですがどこをどうするとよいのですか?

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: エラーの原因

#15

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

ヒントとなるプログラムを示しますから、最後の質問に答えてください。

コード:

#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 の両方が増えることがあるでしょうか?

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: エラーの原因

#16

投稿記事 by YuO » 2年前

普通,現在の開発環境においてはソースレベルデバッガは用意されていると思いますし,デバッガにはブレイクポイントやソースシンボルを使ったウォッチ機能がついていると思いますが……。
この規模であれば,一行ずつステップ実行して変数の値が正しいかを調べていけば,どこで想定している状態になっていないかの絞り込みができると思うのですが。
# 想定している状態が無いというのは,そもそも「どうなるかがわかっていない」状態なので問題外。

るruru

Re: エラーの原因

#17

投稿記事 by るruru » 2年前

year month day
yy mm dd
y m d
と三つ使っているのでつが、
ヒントとなるプログラムでいただいたものは
二つしか使っていないのですが、どうした良いのですか。。。?

るruru

Re: エラーの原因

#18

投稿記事 by るruru » 2年前

int set(int year, int month, int day)

ここはこの通りじゃないとだめなのですが....汗

るruru

Re: エラーの原因

#19

投稿記事 by るruru » 2年前

以下のところだけ入力して、
その日付が存在するかどうかを確かめ、
存在すれば、翌日の日付を出力したいのです。




コード:

#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;
}

アバター
usao
記事: 1564
登録日時: 6年前

Re: エラーの原因

#20

投稿記事 by usao » 2年前

オフトピック
課題提出日がいつなのか知りませんけど,
もらったヒントの意味すら理解できない状態で,延々と不毛なやりとりしていても仕方ないのでは…
さっさと教科書なり何なりを読み直した方が早いのではないでしょうか.

かずま

Re: エラーの原因

#21

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

るruru さんが書きました:year month day
yy mm dd
y m d
と三つ使っているのでつが、
ヒントとなるプログラムでいただいたものは
二つしか使っていないのですが、どうした良いのですか。。。?
どうしたらよいのかを知りたければ、次の質問に答えてください。

main のコードはどこから持ってきましたか?
本であれば、その書籍名を、
ウェブサイトにあるのなら、その URL を教えてください。

るruru

Re: エラーの原因

#22

投稿記事 by るruru » 2年前

本やサイトではなく、
人から直々にだされるものです。

かずま

Re: エラーの原因

#23

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

る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 を追加すればよいのが分かりませんか?

質問です。
  1. ヒントのプログラムをコンパイルして実行してみましたか?
  2. ヒントのプログラムを理解しましたか?
  3. ヒントのプログラムは、メンバ変数や引数の個数が Dateクラスとは異なるので無視したんですか?
  4. 「set は、引数の値をメンバ変数に設定する。get は、メンバ変数の値を引数にコピーする」ということを今は理解しましたか?

るruru

Re: エラーの原因

#24

投稿記事 by るruru » 2年前

わかりました、きいてみます




setの中が、
yearや、monthじゃなきゃダメなのですが、

ヒントだと、
yyやmmとなっているので、どうしたらいいのかわかりません…

かずま

Re: エラーの原因

#25

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

る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;
}
質問です。
  1. ヒントのプログラムをコンパイルして実行してみましたか?
  2. ヒントのプログラムを理解しましたか?
  3. ヒントのプログラムは、メンバ変数や引数の個数が Dateクラスとは異なるので無視したんですか?
  4. 「set は、引数の値をメンバ変数に設定する。get は、メンバ変数の値を引数にコピーする」ということを今は理解しましたか?

るruru

Re: エラーの原因

#26

投稿記事 by るruru » 2年前

thisを使わないヒントお願いしたいです。
thisはまだやっていないので...

かずま

Re: エラーの原因

#27

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

るruru さんが書きました:thisを使わないヒントお願いしたいです。
thisはまだやっていないので...
回答者の質問に答えず、一方的に質問を繰り返すだけの人にはもう回答しません。

るruru

Re: エラーの原因

#28

投稿記事 by るruru » 2年前

質問はすべてはいです。
すみません。

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

Re: エラーの原因

#29

投稿記事 by purin52002 » 2年前

横から失礼します。

コードはかずまさんのヒントをもとにすれば完成すると思います。
質問です。
ヒントのプログラムをコンパイルして実行してみましたか?
ヒントのプログラムを理解しましたか?
ヒントのプログラムは、メンバ変数や引数の個数が Dateクラスとは異なるので無視したんですか?
「set は、引数の値をメンバ変数に設定する。get は、メンバ変数の値を引数にコピーする」ということを今は理解しましたか?
質問はすべてはいです。
ヒントのプログラムは理解できているということなので、
あとはメンバ変数を変えたりなんだりで済むと思います。

もしもヒントのプログラムでわからない部分があるとしたら
箇条書きで具体的に書いてみてください。
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

るruru

Re: エラーの原因

#30

投稿記事 by るruru » 2年前

thisが使えないので、そこをどうしたら良いかわかりません。

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

Re: エラーの原因

#31

投稿記事 by purin52002 » 2年前

使えないなら使えるようになりましょう^^
きっと今後役に立ちます。


「this」というのはクラスのポインタを示します。(自分自身のポインタみたいな感じ?)
構造体のメンバ(構造体の中の変数)にアクセスするときは「hoge.x」のようになります。
構造体のポインタがメンバにアクセスするときはアロー演算子というものを使います。hoge->x

thisもポインタなので、this->xのように書くとxにアクセスすることができます。


わかりやすく説明するのが難しいので、「c++ this」で検索して自分でも調べてみてください。

また、c++の勉強をするなら「ロベールのc++教室」や「猫でもわかるプログラミング」というサイトが1から10ぐらいまで解説してくれていますよ^^
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: エラーの原因

#32

投稿記事 by Dixq (管理人) » 2年前

thisを学べばいいのではないでしょうか。
ググればいくらでも情報出てきます。

返信

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