開発環境
- OS X Mavericks - Apple, ときどき
Windows 8.1 + Cygwin64, MinGW (OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- C++ (プログラミング言語)
- g++(コンパイラ)
C++実践プログラミング (スティーブ オウアルライン (著)、Steve Oualline (原著)、Steve Oualline(原著)、望月 康司(翻訳)、クイープ(翻訳) 、オライリー・ジャパン)のⅣ部(高度なプログラミング概念)の18章(演算子のオーバーロード)、18.6(プログラミング実習)、実習 18-3.を解いてみる。
その他参考書籍
- C++プログラミング入門 (グレゴリー サティア (著)、ダウグ ブラウン (著)、Gregory Satir (原著)、Doug Brown (原著)、望月 康司 (翻訳)、谷口 功 (翻訳)、オライリージャパン)
実習 18-3.
コード(BBEdit, Emacs)
my_time.h
#ifndef __my_time_h__
#define __my_time_h__
#include <iostream>
#include <iomanip>
namespace my_time {
const int SEC_PER_DAY = 24 * 60 * 60;
class time {
private:
int hour;
int min;
int sec;
int time_to_sec;
static time sec_to_time(int sec);
public:
time () {
hour = 0;
min = 0;
sec = 0;
time_to_sec = 60 * 60 * hour + 60 * min + sec;
}
time (int h, int m, int s) {
hour = h;
min = m;
sec = s;
time_to_sec = 60 * 60 * hour + 60 * min + sec;
}
// time (cons time& old_time);
// ~time () {}
// time operator = (const time& old_time);
time operator += (const time& op2) {
(*this) = (*this) + op2;
return (*this);
}
time operator -= (const time& op2) {
(*this) = (*this) - op2;
return (*this);
}
friend time operator + (const time& op1, const time& op2);
friend time operator - (const time& op1, const time& op2);
friend std::ostream& operator << (std::ostream& out_file, const time& t);
friend std::istream& operator >> (std::istream& in_file, time& t);
};
inline time time::sec_to_time(int s)
{
int hour;
int min;
s = s < 0 ? SEC_PER_DAY + s :
s >= SEC_PER_DAY ? s - SEC_PER_DAY : s;
hour = s / (60 * 60);
s -= (60 * 60 * hour);
min = s / 60;
s -= (60 * min);
return time(hour, min, s);
}
inline time operator + (const time& op1, const time& op2)
{
return time::sec_to_time(op1.time_to_sec + op2.time_to_sec);
}
inline time operator - (const time& op1, const time& op2)
{
return time::sec_to_time(op1.time_to_sec - op2.time_to_sec);
}
inline std::ostream& operator << (std::ostream& out_file, const time& t)
{
out_file << std::setw(2) << std::setfill('0') << t.hour << ':' <<
std::setw(2) << std::setfill('0') << t.min << ':' <<
std::setw(2) << std::setfill('0') << t.sec;
return (out_file);
}
extern std::istream& operator >> (std::istream& in_file, time& t);
}
#endif /*__my_time_h__*/
my_time.cpp
#include <iostream>
#include "my_time.h"
namespace my_time {
std::istream& operator >> (std::istream& in_file, time& t)
{
int h;
int m;
int s;
char ch;
std::istream::sentry the_sentry(in_file, true);
if (the_sentry) {
if (in_file.fail()) return (in_file);
in_file >> h;
if (in_file.fail()) return (in_file);
in_file >> ch;
if (in_file.fail()) return (in_file);
if (ch != ':') {
in_file.setstate(std::ios::failbit);
return (in_file);
}
in_file >> m;
if (in_file.fail()) return (in_file);
in_file >> ch;
if (ch != ':') {
in_file.setstate(std::ios::failbit);
return (in_file);
}
in_file >> s;
if (in_file.fail()) return (in_file);
t.hour = h;
t.min = m;
t.sec = s;
}
else
in_file.setstate(std::ios::failbit);
return (in_file);
}
}
test_my_time.cpp
#include <iostream>
#include "my_time.h"
int main(int argc, char *argv[])
{
my_time::time t0;
my_time::time t1(1, 2, 3);
my_time::time t2(4, 5, 6);
my_time::time t3(21, 5, 10);
std::cout << t0 << "(00:00:00)\n";
std::cout << t1 << "(01:02:03)\n";
std::cout << t2 << "(04:05:06)\n";
std::cout << "時刻を入力(時:分:秒)>> ";
std::cin >> t3;
std::cout << t3 << '\n';
std::cout << t0 << " + " << t1 << " = " << t0 + t1 << std::endl;
std::cout << t1 << " + " << t0 << " = " << t1 + t0 << std::endl;
std::cout << t1 << " + " << t2 << " = " << t1 + t2 << std::endl;
std::cout << t2 << " + " << t1 << " = " << t2 + t1 << std::endl;
std::cout << t2 << " + " << t3 << " = " << t2 + t3 << std::endl;
std::cout << t3 << " + " << t2 << " = " << t3 + t2 << std::endl;
std::cout << t0 << " - " << t1 << " = " << t0 - t1 << std::endl;
std::cout << t1 << " - " << t0 << " = " << t1 - t0 << std::endl;
std::cout << t1 << " - " << t2 << " = " << t1 - t2 << std::endl;
std::cout << t2 << " - " << t1 << " = " << t2 - t1 << std::endl;
std::cout << t2 << " - " << t3 << " = " << t2 - t3 << std::endl;
std::cout << t3 << " - " << t2 << " = " << t3 - t2 << std::endl;
return (0);
}
Makefile
#
# FSFのg++コンパイラ用のMakefile
#
CC=g++
CFLAGS=-g -Wall
all: test_my_time
test_my_time: test_my_time.o my_time.o
${CC} ${CFLAGS} -o test_my_time test_my_time.o my_time.o
test_my_time.o: test_my_time.cpp my_time.h
${CC} -c -o test_my_time.o test_my_time.cpp
my_time.o: my_time.cpp my_time.h
${CC} -c -o my_time.o my_time.cpp
clean:
rm test_my_time
入出力結果(Terminal)
$ make && ./test_my_time g++ -c -o test_my_time.o test_my_time.cpp g++ -c -o my_time.o my_time.cpp g++ -g -Wall -o test_my_time test_my_time.o my_time.o 00:00:00(00:00:00) 01:02:03(01:02:03) 04:05:06(04:05:06) 時刻を入力(時:分:秒)>> 21:5:10 21:05:10 00:00:00 + 01:02:03 = 01:02:03 01:02:03 + 00:00:00 = 01:02:03 01:02:03 + 04:05:06 = 05:07:09 04:05:06 + 01:02:03 = 05:07:09 04:05:06 + 21:05:10 = 01:10:16 21:05:10 + 04:05:06 = 01:10:16 00:00:00 - 01:02:03 = 22:57:57 01:02:03 - 00:00:00 = 01:02:03 01:02:03 - 04:05:06 = 20:56:57 04:05:06 - 01:02:03 = 03:03:03 04:05:06 - 21:05:10 = 06:59:56 21:05:10 - 04:05:06 = 17:00:04 $
0 コメント:
コメントを投稿