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

広告

posted by fanblog

2017年11月02日

《その103》 演算子関数の一般的な定義の形式(p.455演習12-3)


単項演算子関数と2項演算子関数の一般的な定義の形式を確認しておきます。


// ヘッダ--------------------------------
class C {
・・・
public:
・・・
C operator☆() { ・・・ }
C operator△(const C& x) { ・・・ }
・・・
};

inline C operator★(const C& x) { ・・・ }
inline C operator▲(const C& x, const C& y) { ・・・ }
// ------------------------------------


operator☆ は単項演算子関数(メンバ関数)
operator★ は単項演算子関数(非メンバ関数)
operator△ は2項演算子関数(メンバ関数)
operator▲ は2項演算子関数(非メンバ関数)



新版明解C++入門編 p.455 演習12-3
 演習11-3(このブログの《その86》)で作成した時刻クラスに、各種の演算子関数を追加せよ。仕様などは自分で考えること。

// Time.h
#ifndef ___Class_Time
#define ___Class_Time

#include <iostream>

class Time {
int hour;
int minute;
int second;
public:
Time();
Time(int h, int m = 0, int s = 0);

int get_hour() const { return hour; }
int get_minute() const { return minute; }
int get_second() const { return second; }

// hour を進める。
void forward_h(int h);

// minute を進める。
void forward_m(int m);

// second を進める。
void forward_s(int s);

// 時・分・秒の値を調整。
void adjust(int &h, int &m, int &s);

// ○時間○分○秒後の時刻を求める。
Time& operator+=(const Time& x);

// ○時間○分○秒前の時刻を求める。
Time& operator-=(const Time& x);

// 時刻と時刻の時間差を求める。
friend Time operator-(const Time& x, const Time& y);
};

std::ostream& operator<<(std::ostream& so, const Time& x);
std::istream& operator>>(std::istream& si, Time& x);

#endif

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

Time::Time() {
time_t current = time(NULL);
struct tm* local = localtime(¤t);
hour = local->tm_hour;
minute = local->tm_min;
second = local->tm_sec;
}

Time::Time(int h, int m, int s)
: hour(h), minute(m), second(s) {
adjust(h, m, s);
hour = h; minute = m; second = s;
}

void Time::forward_h(int h) {
hour = (hour + h) % 24;
}

void Time::forward_m(int m) {
m = minute + m;
adjust(hour, m, second);
}

void Time::forward_s(int s) {
s = second + s;
adjust(hour, minute, s);
}


void Time::adjust(int &h, int &m, int &s) {
while (s < 0)
s += 60, m--;
while (m < 0)
m += 60, h--;
while (h < 0)
h += 24;

m = m + s / 60;
s = s % 60;
h = h + m / 60;
m = m % 60;
h = h % 24;
hour = h; minute = m; second = s;
}

Time& Time::operator+=(const Time& x) {
this->adjust(hour += x.hour,
minute += x.minute,
second += x.second);
return *this;
}

Time& Time::operator-=(const Time& x) {
this->adjust(hour -= x.hour,
minute -= x.minute,
second -= x.second);
return *this;
}

Time operator-(const Time& x, const Time& y) {
Time temp(x.hour - y.hour,
x.minute - y.minute,
x.second - y.second
);
return temp;
}

ostream& operator<<(ostream& so, const Time& x) {
return so << setfill('0')
<< setw(2) << x.get_hour() << "時(時間)"
<< setw(2) << x.get_minute() << "分"
<< setw(2) << x.get_second() << "秒";
}

istream& operator>>(istream& si, Time& x) {
int h, m, s; char c;
si >> h >> c >> m >> c >> s;
x = Time(h, m, s);
return si;
}

// TimeTest.cpp
#include <iostream>
#include "Time.h"
using namespace std;

int main() {
Time a1;
Time a2 = a1;
Time a3 = a1;
cout << "現在時刻 : " << a1 << '\n';
/* 演算子関数とは無関係なので、ここではコメントアウトしておきます。
cout << '\n';
cout << "**:**:**形式で時刻を入力 : "; cin >> a;
cout << a << '\n';
a.forward_h(20); cout << a << "( 20時間進めました。)" << '\n';
a.forward_m(80); cout << a << "( 80分 進めました。)" << '\n';
a.forward_s(3700); cout << a << "( 3700秒進めました。)" << '\n';
*/
Time t1, t2, t3;

cout << "\n◆ **時間**分**秒後の時刻を求めます。\n";
cout << " **:**:**形式で時間を入力 … "; cin >> t1;
cout << (a1 += t1) << "です。\n";

cout << "\n◆ **時間**分**秒前の時刻を求めます。\n";
cout << " **:**:**形式で時間を入力 … "; cin >> t2;
cout << (a2 -= t2) << "です。\n";

cout << "\n◆ 現在時刻との時間差を求めます。\n" ;
cout << " **:**:**形式で時刻を入力 … "; cin >> t3;
cout << "それは " << t3 - a3 << " 後か、\n";
cout << "または " << a3 - t3 << " 前です。\n";
}

c12_03.png


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

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









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

お名前:

メールアドレス:


ホームページアドレス:

コメント:

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

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

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

 たまに、クリック お願いします 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日以上新しい記事の更新がないブログに表示されております。