2019年05月一覧

献立決めるプログラム作成④

こんばんは。

前回作成した処理を適用させ、一通りプログラムを完成させました!

 

#include <iostream>
#include <string>
using namespace std;

string Maindish(string&);
string Sidedish(string&);
string Salad (string&);
string Soup(string&);
string Desert(string&);

int main() {
	int buf;
	string maindish;
	string sidedish;
	string salad;
	string soup;
	string desert;

	bool maindishflug = false;	//主菜のフラグ
	bool sidedishflug = false;	//副菜のフラグ
	bool saladflug = false;	//サラダのフラグ
	bool soupflug = false;	//スープのフラグ
	bool desertflug = false;	//デザートのフラグ

	//メインメニュー画面
	cout << "メニューを選択する画面です。" << endl;
	while (1) {
		cout << "選びたいジャンルの値を押してください。" << endl;
		if (maindishflug == false) {
			cout << "1:主菜" << endl;
		}
		else if (maindishflug == true){
			cout << "1:主菜  ->  " << maindish << endl;
		}
		if (sidedishflug == false) {
			cout << "2:副菜" << endl;
		}
		else if (sidedishflug == true) {
			cout << "2:副菜  ->  " << sidedish << endl;
		}
		if (saladflug == false) {
			cout << "3:サラダ" << endl;
		}
		else if (saladflug == true) {
			cout << "3:サラダ  ->  " << salad << endl;
		}
		if (soupflug == false) {
			cout << "4:スープ" << endl;
		}
		else if (soupflug == true) {
			cout << "4:スープ ->  " << soup << endl;
		}
		if (desertflug == false) {
			cout << "5:デザート" << endl;
		}
		else if (desertflug == true) {
			cout << "5:デザート ->  " << desert << endl;
		}
		cout << "----------------" << endl;

		//入力部
		cin >> buf;
		if (buf != 1 && buf != 2 && buf != 3 && buf != 4 && buf != 5) {
			cout << "1~5で再入力してください。" << endl;
		}

		switch (buf) {
		case 1:
			Maindish(maindish);
			maindishflug = true;
		case 2:
			Sidedish(sidedish);
			sidedishflug = true;
		case 3:
			Salad(salad);
			saladflug = true;
		case 4:
			Soup(soup);
			soupflug = true;
		case 5:
			Desert(desert);
			desertflug = true;
		default:
			break;
		}
	}
}

//主菜の選択メニュー
string Maindish(string& maindish) {
	int buf;
	string maindish1 = "肉";
	string maindish2 = "魚";
	string maindish3 = "麺";
	cout << "主菜は何系が良いですか?" << endl;
	while (1) {
		cout << "選びたいメニューの値を押してください。" << endl;
		cout << "1:肉" << endl;
		cout << "2:魚" << endl;
		cout << "3:麺" << endl;
		cout << "----------------" << endl;
		cin >> buf;
		if (buf != 1 && buf != 2 && buf != 3) {
			cout << "1~3で再入力してください。" << endl;
		}

		switch (buf) {
		case 1:
			maindish = maindish1;
			return maindish;
		case 2:
			maindish = maindish2;
			return maindish;
		case 3:
			maindish = maindish3;
			return maindish;
		default:
			break;
		}
	}
}
	//副菜の選択メニュー
	string Sidedish(string& sidedish) {
		int buf;
		string sidedish1 = "ごはん";
		string sidedish2 = "煮物";
		string sidedish3 = "揚げ物";
		cout << "副菜は何系が良いですか?" << endl;
		while (1) {
			cout << "選びたいメニューの値を押してください。" << endl;
			cout << "1:ごはん" << endl;
			cout << "2:煮物" << endl;
			cout << "3:揚げ物" << endl;
			cout << "----------------" << endl;
			cin >> buf;
			if (buf != 1 && buf != 2 && buf != 3) {
				cout << "1~3で再入力してください。" << endl;
			}

			switch (buf) {
			case 1:
				sidedish = sidedish1;
				return sidedish;
			case 2:
				sidedish = sidedish2;
				return sidedish;
			case 3:
				sidedish = sidedish3;
				return sidedish;
			default:
				break;
			}
		}
	}
	//サラダの選択メニュー
	string Salad(string& salad) {
		int buf;
		string salad1 = "野菜盛り合わせ";
		string salad2 = "茹で野菜";
		string salad3 = "野菜スティック";
		cout << "サラダは何系が良いですか?" << endl;
		while (1) {
			cout << "選びたいメニューの値を押してください。" << endl;
			cout << "1:野菜盛り合わせ" << endl;
			cout << "2:茹で野菜" << endl;
			cout << "3:野菜スティック" << endl;
			cout << "----------------" << endl;
			cin >> buf;
			if (buf != 1 && buf != 2 && buf != 3) {
				cout << "1~3で再入力してください。" << endl;
			}

			switch (buf) {
			case 1:
				salad = salad1;
				return salad;
			case 2:
				salad = salad2;
				return salad;
			case 3:
				salad = salad3;
				return salad;
			default:
				break;
			}
		}
	}
	//スープの選択メニュー
	string Soup(string& soup) {
		int buf;
		string soup1 = "みそ汁";
		string soup2 = "コンソメスープ";
		string soup3 = "シチュー";
		cout << "スープは何系が良いですか?" << endl;
		while (1) {
			cout << "選びたいメニューの値を押してください。" << endl;
			cout << "1:みそ汁" << endl;
			cout << "2:コンソメスープ" << endl;
			cout << "3:シチュー" << endl;
			cout << "----------------" << endl;
			cin >> buf;
			if (buf != 1 && buf != 2 && buf != 3) {
				cout << "1~3で再入力してください。" << endl;
			}

			switch (buf) {
			case 1:
				soup = soup1;
				return soup;
			case 2:
				soup = soup2;
				return soup;
			case 3:
				soup = soup3;
				return soup;
			default:
				break;
			}
		}
	}
	//デザートの選択メニュー
	string Desert(string& desert) {
		int buf;
		string desert1 = "アイス";
		string desert2 = "フルーツ";
		string desert3 = "お菓子";
		cout << "デザートは何系が良いですか?" << endl;
		while (1) {
			cout << "選びたいメニューの値を押してください。" << endl;
			cout << "1:アイス" << endl;
			cout << "2:フルーツ" << endl;
			cout << "3:お菓子" << endl;
			cout << "----------------" << endl;
			cin >> buf;
			if (buf != 1 && buf != 2 && buf != 3) {
				cout << "1~3で再入力してください。" << endl;
			}

			switch (buf) {
			case 1:
				desert = desert1;
				return desert;
			case 2:
				desert = desert2;
				return desert;
			case 3:
				desert = desert3;
				return desert;
			default:
				break;
			}
		}
	}

しかし、長い!

そして、なんかダラダラしている!

これいろいろと突っ込みどころありますよね。
現時点で思いついたのが、

  1. クラスを作ったらプログラムが見やすくなる?
  2. 同じような関数ありすぎ。
  3. フラグは配列にすれば、変数の数を抑えられる?
  4. 献立メニューの変更をするのにプログラム書き換え面倒。

他にもありそうですが、上記部分の改善をしていきたいと思います。


献立決めるプログラム作成③

こんばんは。

献立決めるプログラムで前回の改善点をある程度修正できました。

#include <iostream>
#include <string>
using namespace std;

string Syusyoku(string&);

int main() {
	int buf;
	string mainmenu;
	bool mainmenuflug = false;	//主食のフラグ

	cout << "メニューを選択する画面です。" << endl;
	while (1) {
		cout << "選びたいジャンルの値を押してください。" << endl;
		if (mainmenuflug == false) {
			cout << "1:主食" << endl;
		}
		else if (mainmenuflug == true){
			cout << "1:主食  ->  " << mainmenu << endl;
		}
		cout << "2:主菜" << endl;
		cout << "3:副菜" << endl;
		cout << "4:副々菜" << endl;
		cout << "5:汁物" << endl;
		cout << "----------------" << endl;
		cin >> buf;
		if (buf != 1 && buf != 2 && buf != 3 && buf != 4 && buf !=                5) {
			cout << "1~5で再入力してください。" << endl;
		}

		switch (buf) {
		case 1:
			Syusyoku(mainmenu);
			mainmenuflug = true;
		case 2:
			//処理を加える
		case 3:
			//処理を加える
		case 4:
			//処理を加える
		case 5:
			//処理を加える
		default:
			break;
		}
	}
}

//主食の選択メニュー
string Syusyoku(string& mainmenu) {
	int buf;
	string mainmenu1 = "米";
	string mainmenu2 = "麺";
	string mainmenu3 = "パン";
	cout << "主食は何系が良いですか?" << endl;
	while (1) {
		cout << "選びたいメニューの値を押してください。" << endl;
		cout << "1:米" << endl;
		cout << "2:麺" << endl;
		cout << "3:パン" << endl;
		cout << "----------------" << endl;
		cin >> buf;
		if (buf != 1 && buf != 2 && buf != 3) {
			cout << "1~3で再入力してください。" << endl;
		}

		switch (buf) {
		case 1:
			mainmenu = mainmenu1;
			return mainmenu;
		case 2:
			mainmenu = mainmenu2;
			return mainmenu;
		case 3:
			mainmenu = mainmenu3;
			return mainmenu;
		default:
			break;
		}
	}
}

実行結果

前回の改善点としては以下でした。

  1. 繰り返し処理の書き方はif(;;)で合っているのか?
  2. 関数Syuyokuの中がきれいにならないか。
  3. 関数Syusyokuのエラー処理がない。
  4. メイン画面にてそれぞれで決めたメニューが表示されない。

この中で2.以外は解決できました。

1.繰り返し処理の書き方はif(;;)で合っているのか?
→「猫でもわかるC++プログラミング」を読み返してみたところ、無限ループはwhile(1);で実施できるとのことでしたので、そちらに修正。

3.関数Syusyokuのエラー処理がない。
→これまた「猫でもわかるC++プログラミング」のプログラム例を参考にさせてもらいました。switch文の値を入力してもらう部分で、変な値を入れると再入力を促すようにしました。

4.メイン画面にてそれぞれで決めたメニューが表示されない。
→この部分は自分なりに考えました。初期選択画面で値が選択されるとまず関数に飛んで、それぞれメニューを選ぶ。ここまでは前回と変わりませんが、関数の引数と戻り値に参照を使いました。そして関数が呼ばれるとフラグを立て、フラグが立つと関数から戻ってきた変数を初期選択画面に表示させるようにしました。

「ロベール」の赤本は内容たっぷりですごいですが、「あれ、これどうだったっけ?」と読み返してみるには少し分厚すぎるかな(笑)

「猫でも」は分厚くもないし、プログラム例が実際のアプリに近かったりするので読み返すときには参考になりますね。

そして実際に自分の頭で考えて、プログラムが思ったように動いたときはとても達成感がありますね!

ひとまず、これでなんとなく形になりそうなので、残りの処理も作っていってみます!


献立決めるプログラム作成②

こんばんは。

前回作成したプログラムで問題のあった箇所を修正してみました。

修正後のプログラムがこちら。

#include <iostream>
#include <string>
using namespace std;

string Syusyoku() {
	int op;
	string mainmenu1 = "米";
	string mainmenu2 = "麺";
	string mainmenu3 = "パン";
	cout << "主食は何系が良いですか?" << endl;
	cout << "1:米" << endl;
	cout << "2:麺" << endl;
	cout << "3:パン" << endl;
	cin >> op;
	if (op = 1) {
		return mainmenu1;
	}
	else if (op = 2) {
		return mainmenu2;
	}
	else if (op = 3) {
		return mainmenu3;
	}
}

int main() {
	int op;
	cout << "メニューを選択する画面です。" << endl;
	for (;;) {
		cout << "選びたいジャンルの値を押してください。" << endl;
		cout << "1:主食" << endl;
		cout << "2:主菜" << endl;
		cout << "3:副菜" << endl;
		cout << "4:副々菜" << endl;
		cout << "5:汁物" << endl;
		cin >> op;

		switch (op) {
		case 1:
			cout << Syusyoku() << endl;
		case 2:
			//処理を加える
		case 3:
			//処理を加える
		case 4:
			//処理を加える
		case 5:
			//処理を加える
		default:
			cout << "1~5で再入力してください。" << endl;

		}
	}

for(;;)とすることで繰り返し再入力をさせることはできました。

そしてとりあえず主食を決める処理を試しに作ってみましたが、
まぁ・・・うん・・・いけてない!

というか全体的になんかいけてない!

とりあえず自分的に気になる点は以下

  • 繰り返し処理の書き方はif(;;)で合っているのか?
  • 関数Syuyokuの中がきれいにならないか。
  • 関数Syusyokuのエラー処理がない。
  • メイン画面にてそれぞれで決めたメニューが表示されない。

まだほかにもいろいろと突っ込みポイントはありますが、とりあえず、
上記点の改善を目指したいと思います。

いざ自分の作りたいプログラムを作ろうとなると、こうやりたいと
思ったことがなかなかできませんね。

ただ単純に参考書を何冊読んでもダメですね(笑)
ひとつひとつ壁にぶつかってその都度身に着けていくしかないですね!


献立決めるプログラム作成①

こんばんは。

ロベールの赤本をぼちぼち進めております。

再学習ということもあり、基本的なことは頭にすいすい
入ってきて、1年前と比べると少しは成長を感じられ
楽しく学習できています^^

ただ詳しく説明されているのですが、問題的なものはない
ので、参考プログラムを打ち込んで、実行するということ
を繰り返しているうちに、自分でプログラム作ってみたい
いう気持ちが出てきました。

基礎的なことは理解できているなら簡単なプログラムは作れる
のではないかということで嫁さんに「どんなプログラムがあった
らいいかな~?」と聞いてみたところ、「毎日のご飯のメニュー
考えるのがめんどくさいからそれ考えてくれるやつ」とのこと。

なんかそれなら作れそう!

というわけで、ちょっと構成を考えてみました。

~プログラムのあらすじ~

  1. 初期画面を表示
  2.  主食、主菜、副菜、副々菜、汁物を選択させる
  3.   選択外のものが入力されたら再入力させる
  4.    主食を表示
  5.     ごはん系、パン系、麺系を選択させる
  6.      選択外のものが入力されたら再入力させる
  7. 1.に戻る
  8.   2.を選択する
  9.    4.~6.の要領で主菜~汁物まで決める
  10. 1.に戻る
  11. 全ての品目が決定し、初期画面に表示されている
     

上記のような感じのプログラムの作成をしてみたいと思います。

これくらいならポインタもクラスも使わなくていけるかな?

ということで途中まで作成してみました。

#include <iostream>
using namespace std;

int main() {
	int op;
	cout << "メニューを選択する画面です。" << endl;
	cout << "選びたいジャンルの値を押してください。" << endl;
	cout << "1:主食" << endl;
	cout << "2:主菜" << endl;
	cout << "3:副菜" << endl;
	cout << "4:副々菜" << endl;
	cout << "5:汁物" << endl;
	cin >> op;

	switch (op) {
	case 1:
		//主食の処理を加える
	case 2:
		//主菜の処理を加える
	case 3:
		//副菜の処理を加える
	case 4:
		//副々菜の処理を加える
	case 5:
		//汁物の処理を加える
	default:
		cout << "1~5で再入力してください。" << endl;
	}
}

とりあえず初期画面を作って、各品の選択処理はまたあとでと思い、
ここまでは作ってみましたが、ここでちょっと問題が・・・

というのもswicth文で選択させて、選択外の値が入力されたら
再入力をさせたいのですが、ここでプログラムの実行が終わって
しまうのです。

この場合はどうすればいいんだろう。

defaultのとこでなにか仕掛けが必要なのか・・・?

ちょっと参考書とにらめっこしてみます。


ロベールのC++入門講座で再学習①

こんばんは。

先月買ったロベールの赤本ですが、ぼちぼちと進めております。

まだすべては終わってませんが!

私が他に読んだ参考書の「苦C」や「猫でもわかるC++」と比べると
進むのがちょいはやいかな?と感じます。

第1章は代表的な統合開発環境(VisualStudio、X Code、Exlipse)
のインストールから入ってくれているのでその辺は親切と感じました。

ただ第2章から変数の説明とかちょろっとしてすぐに関数の説明に
移るのは個人的にびっくりしました。
2-3章からですよ!?
私自身関数に関しては戻り値や引数の意味が分からなかったので、「ここで
もう関数の説明!?」と思わず声に出してしまいそうになりました。

これ初学でこの本読んでたら勉強するの諦めてたかも・・・(笑)

とはいえ900ページにC++のことを詰め込んでるので、しょうがないのかも
しれませんね。

全体的にパラパラとめくって見てみると本当に詳しく載っているなと
感じます。

「猫でもわかるC++」ではここまで網羅されていなかったので
この本極めたらC++に相当強くなれる気がします!

というわけでGWも終わったし、ペース早めて進めていきます!

 

 


スポンサーリンク
広告1
広告1