标题:搞笑达人的自我反省与再出发
关键词:类、定义
内容
A. 一句话概括今日目标完成情况
(a)把divisor函数在main函数里调用 0% (完全失败了,因为根本就不是我想的那么回事儿)
(b)9.5的的学习 80%
B.具体内容
昨天和王子昂同学深夜探讨了很久啊,发现自己在认真程度方面还有很大的提升空间。当时在写divisor函数的时候就发现了前面有int限制,却没有过多的去想。这是很不应该的一点。今天下午一二节下课之后,回来再仔细地反复的琢磨了一下Fraction函数里关于分数相加的写法,又来回写了一遍。现在想来应该是完全掌握了。
还有对于类成员的访问权限这个问题的原则就是能私有,最好私有;同时对外界提供,set,get(get是什么)方法,来访问私有成员。
而成员函数一般放在类内部定义,放在类外部实现。对于成员变量,放在类外一般用于变量初始化。
·下面是 日期类的设计的完整源代码:
#include<iostream>
#include<time.h>
using namespace std;
class Date
{
private:
int year,month,day;
void SetSystemDate(); //取得系统日期
public:
void init(int,int,int);
void print_ymd();
void print_mdy();
int get_year(){return year;}
int get_month(){return month;} //上中下均为内联函数
int get_day(){return day;}
bool IsLeapYear(); //判断是否为闰年
};
void Date::SetSystemDate()
{
tm *gm; //tm是时间结构体
time_t t=time(NULL); //time_t是长整型
gm=gmtime(&t);
year=1900+gm->tm_year;
month=gm->tm_mon+1;
day=gm->tm_mday;
}
void Date::init(int yy,int mm,int dd) //有效性检验
{
if(yy>=1900&&yy<=9999)
year=yy;
else
{
SetSystemDate();
return;
}
if(mm>=1&&mm<=12)
month=mm;
else
{
SetSystemDate();
return;
}
if(dd>=1&&dd<=31)
day=dd;
else
{
SetSystemDate();
}
return;
}
void Date::print_ymd()
{
cout<<year<<"."<<month<<"."<<day<<endl;
}
void Date::print_mdy()
{
cout<<month<<"."<<day<<"."<<year<<endl;
}
bool Date::IsLeapYear()
{
if(year%400==0||(year%100!=0&&year%4==0))
return true;
else
return false;
}
int main()
{
Date date1;
cout<<"输出日期对象date1的日期值:";
date1.print_ymd();
system("pause");
date1.init(2008,3,28);
cout<<"再输出日期对象date1的日期值:";
date1.print_ymd();
system("pause");
Date date2;
date2.init(2006,13,28);
cout<<"输出对象日期date2的日期值:";
date2.print_mdy();
system("pause");
if(date1.IsLeapYear())
cout<<date1.get_year()<<"是闰年"<<endl;
else
cout<<date1.get_year()<<"不是闰年"<<endl;
return 0;
}
写这个可把我给头疼死了。先说犯的第一个很基础的问题,if else 条件语句中if后面的语句两边不用加括号,而 esle 后面跟的语句两边一定要跟圆括号。否则编译会报错。
坦率地讲,在做这个有效性检验的时候,看到这个init我是吓懵了的。问了一下度娘,才知道int是initialization的缩写,放在 函数开头大多是用来指明函数是用来初始化的。刚看到到时候还以为是老师把int错打成了init,当看到后面定义都是init的时候还是固执地全都写成了int……结果可想而知,编译的时候红了一大串都是这个错误。
对每一个数据成员的赋值都是经过了有效性检验的用以保证安全性。判断是否是闰年用的bool布尔型&&和||两个逻辑要理清楚。而这个取系统时间……
void Date::SetSystemDate()
{
tm *gm; //tm是时间结构体
time_t t=time(NULL); //time_t是长整型
gm=gmtime(&t);
year=1900+gm->tm_year;
month=gm->tm_mon+1;
day=gm->tm_mday;
}
搞得我焦头烂额。这个gmtime结构体据说1900的来源是电脑是20世纪发明的(吧),相当于一个日期下限。(所以mon+1是因为只有12个月咯?)
然后这个mday我百度了一下居然是 day of the month.好吧是我孤陋寡闻了。关于这个详情明天我还要恶补一下。
而类定义中的public定义里头有这么三个:
public:
int get_year(){return year;}
int get_month(){return month;}
int get_day(){return day;}
这三个get_打头的函数都叫内联函数(啊!)。吓得我去翻了一下6.2的课程,内联函数一般不都长这样的么?
inline int square(int x)
{
return x*x;
}
为啥在类内定义了就也叫内联函数了呢?难道是因为他将程序内调用内联函数的语句用内联函数体中的代码进行替换了么?
而system("pause")是调用程序里的一个pause命令,用于暂停程序并且在屏幕上输出一句:press any key to continue...之类的话。
有效性检验那段代码中只要3个条件有一个不符合,就会碰到下面的return语句直接跳出,获取系统时间。
最后在这个判断是否是闰年也很巧妙,利用if...else语句,如果是true则输出是闰年false则输出不是闰年。
哎……最近出了很多常识性的错误。晚上向王子昂同学请教了很多。(不过那个关于gmtime的讲解我还是没有找到啊)感觉他学的很细腻,而我太糙了。之前学习的时候经常是跟老师讲着打一遍,然后自己在打一遍就算过了。虽然快,但是好多重点没能完全掌握,导致现在有些定义还是一知半解。现在进度慢下来了,是时候回过头看看之前挖的坑了。希望能用一天的时间把之间漏掉的知识点都补上,少犯常识性错误。(跟组长和王子昂交流完了感觉什么知识点都是常识TAT)
C.明日计划
1.复习9.5之前所学的内容,查缺补漏。
2.电信出摊。
我的博客:http://blog.csdn.net/andr3zzzz