#include
#include
using namespace std;
template //数制为base的数
class Number
{
int n; //存放数的当前值
public:
Number(int i):n(i){} //i必须小于base
int advance(int k); //当前值增加k个单位
int value()const{ return n; } //返回数的当前值
};
class TimeOfDay{
public:
Number hours; //小时(0~23)
Number minutes; //分(0~59)
//**1** **********found**********
Number; //秒(0~59)
Number milliseconds; //毫秒(0~999)
TimeOfDay(int h=0, int m=0, int s=0, int milli=0)
:hours(h),minutes(m),seconds(s),milliseconds(milli){}
void advanceMillis(int k){ advanceSeconds(milliseconds.advance(k)); } //前进k毫秒
void advanceSeconds(int k) //前进k秒
{
//**2** **********found**********
advanceMinutes(seconds.advance(k));
}
void advanceMinutes(int k){ advanceHour(minutes.advance(k)); } //前进k分钟
void advanceHour(int k){ hours.advance(k); } //前进k小时
void show()const{ //按“小时:分:秒.毫秒”的格式显示时间
int c=cout.fill('0'); //将填充字符设置为'0'
cout<<setw(2)<<hours.value()<<':' //显示小时
<<setw(2)<<minutes.value()<<':' //显示分
<<setw(2)<<seconds.value()<<'.' //显示秒
<<setw(3)<<milliseconds.value(); //显示毫秒
cout.fill(c); //恢复原来的填充字符
}
};
template
int Number::advance(int k)
{
n+=k; //增加k个单位
int s=0; //s用来累计进位
//**3** **********found**********
while(n>=base)_____________________ //n到达或超过base即进位
return s; //返回进位
}
int main()
{
TimeOfDay time(1,2,3,4); //初始时间:1小时2分3秒4毫秒
time.show(); //显示时间
time.advanceHour(5); //前进5小时
time.advanceSeconds(122); //前进122秒(2分零2秒)
time.advanceMillis(1017); //前进1017毫秒(1秒零17毫秒)
cout<<endl;
time.show(); //显示时间
cout<<endl;
return 0;
}
所有程序的数组性问题都是以0开始,一开始定义的60指的是数组内有60个数。而数字的计数是从0开始,所以有59为结束。
至于为什么是从0开始,是因为本身程序到最后都要翻译成机器语言,机器才能识别。
而机器是以电流的高低来确定0和1,也就是计算机使用二进制的原因
也就是说机器的计数是从0x0000的全低电位开始计数,即为第一个数。
定义分钟区间就是0~59
数组下标的最小值称为下界,在C语言中总是为0。数组下标的最大值称为上界,在c语言中数组上界为数组定义值减1。---摘抄自数据结构简明教程
程序的反人类设计,数组从0开始,list从0开始
没有1,2,3
有0,1,2,3
,日期也是这样,getMouth获取的月份得+1,,
0,1,2,3,4,5,6,7,8,9,10,11,而不是1到12