C++一覧

体重記録プログラム作成③

こんばんは。

体重記録プログラムですが、いろいろと試行錯誤しながらなんとか形になりました。

上記のコードでひとまずは体重記録、履歴表示、履歴消去をすることが出来ました。

ただ前回の記事であったように日付についてはうまくビルドに通らない為、そこは今回は諦めました。

頑張った部分としては体重履歴消去のコーディングですかね!
どうやれば良いのかを考えながら参考書を読んでいた時に<vector>が使えるのではないかと思いつき、ネットで検索してみたところ、ファイルのデータを動的配列に詰め込むコードを発見。

そちらを参考にさせてもらい、<vector>のメンバ関数である、pop_backを使い、末尾のデータを削除し、再度ファイルに書き込む方法を使いました。

他にもやりようはあるのかもしれませんが、この方法しか思いつきませんでした。

あとは入力の際に数値以外が入力された場合などのエラー処理についても実装したかったのですが、そこまでは出来ていません。

ひとまず形にはなったということで、次のプログラム作成に移りたいと思います!

しかしながら、今回のプログラム作成はプライベートでいろいろあり、約1か月くらいしていたわけですが、どこまで作成していたか、どうやって作成しようと思っていたのか、思い出すために無駄な時間を費やしてしまいました。

今後はプログラム作成の前に大まかな設計図でも作ったほうが良いと思いました。

ちなみに今回のプログラムの設計図をフローチャート的にしてみました。

ざっくりこんな感じですかね。こういった図にしてみると頭の中の考えが整理できて、しかも時間がたった後も見直せるのでいいですよね。

今私が行っている仕事でもいきなり作業ではなく、お客さんの要求仕様書に沿って作業の準備し、実作業しますしね。

自分でプログラムを作成するのにまだ参考書は手放せない状態ですが、ひとつひとつ壁を乗り越えていってる感じが楽しいです。

さて、次はどんなプログラムに挑戦してみましょう。


体重記録プログラム作成②

こんばんは。

また少し更新間隔が空いてしまいました。

twitterのほうで少しツイートしたのですが、マイホーム計画がなくなりそうになってしまい、かなり凹んでました。

が、まぁいつまでもうじうじしていても仕方ないので、今は目の前のことだけ見ていこうと思います。

ぼちぼちと体重記録プログラムの作成をしていましたが、なかなかうまくいかないもので。

ファイルに書き込む、読み込む、不必要なデータを削除する、時間を表示する、等簡単にできそうなものだと思いましたが、うまくいかず・・・

ただファイルに関しては先ほどいい案が思い浮かんだので、これからそれを試したいと思います!

問題は時間の表示の方です。

ファイルに書き込む際に日時を合わせて表示したく、調べてみたところcpprefjpにやりたいことのコードがまるまる載っていたので、そのままパクりましたw

が、しかしまるまるパクったにも関わらず、ビルドが通らない・・・

エラー内容的に#include<ctime>がうまくインクルードされていないのではと思うのですが、これを調べても検索結果がいまいちなんですよね。

VC++17の問題?それとも私の環境の問題?

そんな感じで時間についてはひとまず気にせずファイル操作で思いついた方法を実装してみます。


体重記録プログラム作成①

こんばんは。

簡単に作れるプログラムですが、自分の体重を記録してくれるプログラムを作ってみようと思います。これくらいであれば、今持っている知識でも作れるのではないかな!

以下がプログラムの構成です。

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

  1. 初期画面表示
  2. 体重記録、体重履歴表示、体重履歴消去を選択させる
  3. 2.で体重記録を選択→現在の時刻を表示し、体重を入力させる
  4. 2.で体重履歴表示を選択→過去に入力した体重を一覧表示させる
  5. 2.で体重履歴消去を選択→直近の体重履歴を消去する

今回はクラスを使ってプログラムを作成してみようと思います。

以前作成していた献立決めるプログラムではクラスを使いませんでしたが、クラスに慣れるために、使ってみることにしました。

今回も「猫でもわかるC++」を参考にここまではコーディングしてみました。
まだまだ作成途中ですが、一応動きますw

ここから以下の部分の修正をしていきたいと思います。

  • 日時を表示させる
  • 体重履歴を表示させる
  • 体重履歴消去部分の作成

細かい部分の作りこみは行いません!
思うような動きをするプログラムが作成できれば良しとします!

それではまた


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

こんばんは。

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

 

#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も終わったし、ペース早めて進めていきます!

 

 


C++再学習中

どうも、こんばんは。

ここ数カ月プログラミングの勉強をほとんどしていなかった為か、
やりかけの参考書に手をかける気にならず、どうしようかと
本屋に行ってみたのですが、なかなか面白そうな参考書を
見つけたので買ってみました。

本屋での圧倒的存在感!

前々から少し気にはなっていたのですが、さすがに分厚すぎるので
スルーしていたのですが、ちょろっとめくって読んでみると、
他のC++の入門参考書には記載されていないような内容まで
載っていました。

C言語やC++についてはある程度入門書を読みましたが、再度C++を
学びなおすことを決意し、購入しちゃいました!!

今の仕事一本だけだと給料が落ちる可能性も考えられるしなー。
家を建てるにあたり、将来給料がなくなるなんてことになった日には
大変ですしね。

プログラミングができれば、第2のスキルとなり、今の会社で
給料が落ちても他に行き場がありそうな気がするし、自己投資として
は割に合ってるよね!

そう思いたいところ!
(入門書だけで何冊買ってんだって自分でも思っています・・・w)

とりあえず、900ページくらいある、この参考書をぼちぼちと進めていこうと
思います。


オブジェクト指向プログラミングって難解・・・

こんばんは。

 

ここ2カ月、基礎学習をぼちぼちやり直していました。

 

今まで購入した参考書を読み返したり、サイトやyoutubeをみて学習したり
して、なんとなくわかったつもりになっていたところや読み飛ばしていたり
したところ等、再学習しました。

 

再学習をすると全く理解できなかったところも多少は理解をすることができた
ので、少しは成長しているなと感じております!

 

特にポインタのところや構造体についてはC言語学習を始めたときは全然
わかっていませんでしたが、今は非常によく理解しております!

 

いや・・・まぁそれは言い過ぎなんですけど、それなりにわかるように
なりましたw

 

現在はC言語の機能は概ね理解が進んできたので、C++のほうを再学習中
なのですが、クラスのあたりはまだちんぷんかんぷんです・・・

 

クラスの継承とか多様性とかテンプレートとかクラスのオーバーロードとか
まじわけわからん。

 

オブジェクト指向はプログラムを部品のように扱い、プログラムするとか
言っている意味はわかるんですが、コードを読むと????しか浮かばねぇ・・・

 

「猫でもわかるC++プログラミング」やサイトを見ても到底理解できそうに
なかったので、それ専用みたいな本を買ってきて、学習しております。

 

C/C++言語を習得するためにたくさん参考書を買っている気がしますが、
一生もののスキルが手に入ると思えば安いもんです!

 

ここまできたら意地でもC++を習得してやります!


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