2017年10月15日
《その79》 ヘッダファイル と ソースファイル(p.377演習10-1,演習10-2)
今回の演習問題のプログラムは、ヘッダファイルとソースファイルの2つで構成する形で実現しました。
演習問題を解く前に、
コンパイルが成功したコンソールアプリケーションを実行する方法を再確認しておきたいと思います。
コンソールアプリケーションを実行する方法
デバッグ(D) → デバッグなしで開始(H)
Visual Studio Community 2017 を利用してコンソールアプリケーションを実行する場合
は、コマンドプロンプトがプログラム実行直後に消えてしまわないように、
本ブログの《その6》に書いてある次の手順を一度行っておいてください。
◆ ソリューションエクスプーラーで
プロパティ → リンカー → システム → サブシステム → コンソールを選択
デバッグ(D) → デバッグなしで開始(H)
の代わりに
Ctrl+F5キー
でコンソールアプリケーションを実行することもできます。
新版明解C++入門編 p.377 演習10-1
名前・身長・体重などをメンバとしてもつ《人間クラス》を自由に定義せよ。
2つのファイル Human.h
HumanTest.cpp
を順に記述します。
// Human.h
#include <string>
class Human {
private:
std::string name; // 氏名
std::string country; // 国籍
double height; // 身長(cm)
double weight; // 体重(kg)
public:
Human(std::string n, std::string c, double h, double w) {
name = n; country = c; height = h; weight = w;
}
std::string namae() { return name; }
std::string kokuseki() { return country; }
double shinchou() { return height; }
double taijuu() { return weight; }
double bmi() { // 肥満指数BMI
return weight / height / height * 10000;
}
double standard_w() { // 標準体重(kg)
return height * height * 22 / 10000;
}
};
// HumanTest.cpp
#include <iomanip>
#include <iostream>
#include <string>
#include "Human.h"
using namespace std;
int main() {
Human saitou("斉藤とまと", "日本", 176.5, 58.0);
cout << "◆" << saitou.namae() << '\n';
cout << " 国籍 " << saitou.kokuseki() << '\n';
cout << fixed << setprecision(1);
cout << " 身長 " << saitou.shinchou() << "cm\n";
cout << " 体重 " << saitou.taijuu() << "kg\n";
cout << " BMI " << saitou.bmi() << '\n';
cout << " 標準体重 " << saitou.standard_w() << "kg\n";
}
新版明解C++入門編 p.377 演習10-2
自動車クラス Car にデータメンバやメンバ関数を自由に追加せよ(ナンバーを表すデータメンバを追加する、燃費を表すデータメンバを追加する、移動による燃料残量の計算に燃費を反映させる、タンク容量を表すデータメンバを追加する、給油のためのメンバ関数を追加する etc…)。
2つのファイル Car.h
CarTest.cpp
を順に記述します。
// Car.h
#include <cmath>
#include <string>
#include <iostream>
class Car {
std::string name, number;
int width, length, height;
double tank_capa, km_p_L;
double fuel_level;
double xp, yp;
public:
Car(std::string num, std::string nam, int w, int l, int h, double t, double km) {
number = num; name = nam; width = w; length = l; height = h; tank_capa = t; km_p_L = km;
fuel_level = 0.0; xp = yp = 0.0;
}
bool refueling(double gas) {
if (fuel_level + gas > tank_capa) {
fuel_level = tank_capa;
return false;
}
else {
fuel_level += gas;
return true;
}
}
void print_spec() {
std::cout << "【スペック】" << "\n";
std::cout << "------------" << "\n";
std::cout << "名前:" << name << "\n";
std::cout << "車幅:" << width << "mm\n";
std::cout << "車長:" << length << "mm\n";
std::cout << "車高:" << height << "mm\n";
std::cout << "タンク容量:" << tank_capa << "L\n";
std::cout << "燃費:" << km_p_L << "km/L\n";
std::cout << "------------" << "\n";
}
void print_situation() {
std::cout << "・現在地 x:" << xp << "km y:" << yp << "km\n";
std::cout << "・燃料残量:" << fuel_level << "L" << '\n';
}
bool move(double dx, double dy) {
double dist = sqrt(dx * dx + dy * dy);
if (dist > fuel_level * km_p_L)
return false;
else {
fuel_level -= dist / km_p_L;
xp += dx;
yp += dy;
return true;
}
}
};
// CarTest.cpp
#include <iostream>
#include "Car.h"
using namespace std;
int main()
{
Car myCar("横浜012-3456", "ランドクルーザー", 1980, 4950, 1870, 90, 6.6);
myCar.print_spec();
while (true) {
myCar.print_situation();
cout << '\n';
int move;
cout << "[ 0…到着 /1…移動 /2…給油 ]:"; cin >> move;
if (move == 0) break;
if (move == 2) {
double gas;
do {
cout << "給油量[L]:"; cin >> gas;
} while (gas < 0);
if (!myCar.refueling(gas))
cout << "\a燃料が多過ぎます!\n満タンまで入れました。\n";
}
else {
double dx, dy;
cout << "X方向の移動距離[km]:"; cin >> dx;
cout << "Y方向の移動距離[km]:"; cin >> dy;
if (!myCar.move(dx, dy)) {
cout << "\a燃料が不足!\n";
}
}
}
}
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6858754
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック