アフィリエイト広告を利用しています

広告

posted by fanblog

2017年10月23日

《その89》 インクルードガード(p.415演習11-5)


インクルードガード

ヘッダの二重インクルードによるエラーを防ぐのに、インクルードガードと呼ばれる手法が役立ちます。


【例1】
#if !defined ___XYZ
#define ___XYZ

ヘッダ部

#endif



【例2】
#ifndef ___XYZ
#define ___XYZ

ヘッダ部

#endif



 例1や例2のように前処理指令(「 # 」で始まる指令 )を利用することで、二重インクルードを防止することができます。
 マクロ名 ___XYZ は任意ですが、ヘッダごとに異なる名前にする必要があります。



新版明解C++入門編 p.415 演習11-5
 日付(年・月・日)を読み込んで、その曜日を求めて表示するプログラムを作成せよ。

ここでの必要性はありませんが、ヘッダ部分をインクルードガードしました。

// Date.h
#ifndef ___Class_Date
#define ___Class_Date


#include <string>
#include <iostream>

class Date {
int y;
int m;
int d;

public:
Date();
Date(int yy, int mm = 1, int dd = 1);

int year() const { return y; }
int month() const { return m; }
int day() const { return d; }
std::string day_of_week() const;
Date preceding_day() const;
std::string to_string() const;
};

std::ostream& operator<<(std::ostream& s, const Date& x);
std::istream& operator>>(std::istream& s, Date& x);

#endif

// Date.cpp
#define _CRT_SECURE_NO_WARNINGS
#include <iomanip>
#include <ctime>
#include <sstream>
#include <iostream>
#include "Date.h"
using namespace std;

Date::Date() {
time_t current = time(NULL);
struct tm* local = localtime(&current);

y = local->tm_year + 1900;
m = local->tm_mon + 1;
d = local->tm_mday;
}

Date::Date(int yy, int mm, int dd) {
y = yy;
m = mm;
d = dd;
}

string Date::day_of_week() const {
string dw[] = { "日" ,"月", "火", "水", "木", "金", "土" };
int yy = y; int mm = m;
if (mm == 1 || mm == 2) {
yy--;
mm += 12;
}
return dw[(yy + yy / 4 - yy / 100 + yy / 400 + (13 * mm + 8) / 5 + d) % 7];
}

Date Date::preceding_day() const {
int dmax[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
Date temp = *this;

if (temp.d > 1)
temp.d--;
else {
if (--temp.m < 1) {
temp.y--;
temp.m = 12;
}
temp.d = dmax[temp.m - 1];
}
return temp;
}

string Date::to_string() const {
ostringstream s;
s << setfill('0') << y << "年"
<< setw(2) << m << "月"
<< setw(2) << d << "日";
return s.str();
}

ostream& operator<<(ostream& s, const Date& x) {
return s << x.to_string();
}

istream& operator>>(istream& s, Date& x) {
int y, m, d; char c;
s >> y >> c >> m >> c >> d;
x = Date(y, m, d);
return s;
}

// DateTest.cpp
#include <iostream>
#include "Date.h"
using namespace std;

int main()
{
Date d;
cout << "今日は" << d << d.day_of_week() << "曜日\n";

cout << '\n';

cout << "西暦年月日を **/**/** 形式で入力 : ";
cin >> d;
cout << d << "は" << d.day_of_week() << "曜日\n";
}

c11_05.png


新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/8/30 21:02時点)









--
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/6887656
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。