IT雏鸟起飞03-08 12:52给我发来求助信,让看看下面的程序,怎么个问题。
#include <iostream> using namespace std; struct Date { int year; int month; int day; int hour; int minute; int second; } date; int day(Date year,Date month,Date day); //int time(Date,Date,Date); /*输入两个人的生日,看和1900年1月1日相差多少天,然后在相减*/ int main() { int d1=0,d2=0,t;/*d1,m1,y1代表第一个人的出生年月日,同理d2,m2,d2,t表示相差天数,i和j分别作为循环的年和月*/ cout<<"第一个人的出生日期:"; cin>>date.year>>date.month>>date.day>>date.hour>>date.minute>>date.second; d1=day(date.year,date.month,date.day); cout<<"第二个人的出生日期:"; cin>>date.year>>date.month>>date.day>>date.hour>>date.minute>>date.second; d2=day(date.year,date.month,date.day); t=d2-d1; if(t<0) { t=-t;//若出现负数,则将其化为正数 } cout<<"两人生日相差"<<t<<"天."<<endl; } int day(Date year,Date month,Date day) { int d,y=0,i,j,m=0,x; for(i=1900; i<year; i++)//算出这年之前到1900年共多少天 { y+=365; if(i%400==0||(i%4==0&&i0!=0)) { y++; } } for(j=0; j<month; ++j)//算出本年到生日共多少天 { int x; if(j==2) { if(year%400==0||(date.year%4==0&&year0!=0)) { x=29; } else { x=28; } } else if(j==1||j==3||j==5||j==7||j==8||j==10||j==12) x=31; else if(j==4||j==6||j==9||j==11) x=30; else if(j==0) x=day; m+=x; } d=y+m;//生日到1900年1月1日共多少天 return d; }
这是我布置给学生本周实践的第四个项目(见http://blog.csdn.net/sxhelijian/article/details/20338443)。
一编译,数不清的问题。第一条提示:
F:\C++\codeBlock\example\main.cpp|21|error: could not convert 'date.Date::year' from 'int' to 'Date'|
点击之后看源代码,这个错误发生在第21行,d1=day(date.year,date.month,date.day);。
这一行有函数调用,再看提示有“could not convert 'date.Date::year' from 'int' to 'Date'”,涉及的是类型转换,是不能由int转到Date型。对照看一下,21行实际参数date.year是整型,而12行函数声明中,第一个形式参数却是Date year,类型是Date,是有6个整型数据域的结构体类型。
究竟改函数的调用,还是改函数的定义。看情况,两种思路都可以考虑。看到他已经有的实现中,day函数中year、month、day参数(这里函数名和形参名重名,并不是一个好的风格)是作为 int 型变量使用的。我回复中给出的建议是改函数的定义,只要在12行的声明和32行的实现处做些改动即可。我的回复是:
从你调用上来看:d1=day(date.year,date.month,date.day);,分明函数原型应为 int day(int, int, int)——年月日三个分量都是整型!
这就是问题所在。
随后,在动态中看到他已经修改好了程序(点击打开链接),时间是03-08 20:33。写的体会是“写这个时一开始出现些小意外,函数不知道该怎么声明,后来问了老师才明白应该在哪个地方改一改。其实这个题和第一周的项目三的选做差不多,就是多了一个秒数的问题,那个题我没用函数,这个题就用函数试了试,一开始还真是弄不出来,不实践永远不知道自己到底会不会。"多么好的体会!
次日,看私信。才发现他又来过两次私信。
03-08 18:21 把int改成Date,那行还是不对,就是这个不会,老师上课能不能讲一下
03-08 19:55 老师,我改过来了,但现在又有疑问了,项目5里面double distance(Point p1, Point p2);、double distance0(Point p1);这样的括
号里面为什么是Point,为什么不是(double,double)
我想由于我没有及时回复,他又付出了更多的努力,私信中所言问题即使没有完全想通,但也算是有感觉了。这中间由于我未能及时回复的”服务不到位“,他吃了些”苦头“。实际情况是,作为老师,当他与bug斗争之时,我正在忙自己的事情,即使我在休闲,作为周末的晚上,我不能即时回信也是能够理解的。但写私信、写邮件这种非实时的方式,与QQ、飞信这样的即时通信相比,不及时的表面下面,有积极的因素。他在”苦苦“求得正解,无奈之余,给我写信,也是整理思维的一个过程,促进了他的思考。老师要有自己的安排,我也提倡学生,如果”憋“得时间久了,要顾及自己的感受,去换做其他事情,包括锻炼、娱乐,都可以。
显然,他不达目的不罢休,在坚持中,既收获了完成作业的目标,也算是经受住了考验,相信其中的乐趣是无可言表的,这也是可贵的职业素养中的一部分。
18:21的私信已经不用再回复。课上讲,也没有必要。学生不经体会,讲得越多,效果越差。19:55的来信,要解答,实际上就是刚才“究竟改函数的调用,还是改函数的定义”中的第二种改法:函数定义中的形参还用Date型,只是参数个数只要一个就行了,而在函数的调用中,给出的实参也是一个结构体变量。
具体改法,http://blog.csdn.net/sxhelijian/article/details/8639499中的参考解答三和参考解答四,是比本文问题更简单的问题,用这两种思路的设计。
现在总结两种写法,总原则是,形参和实参类型匹配:
(1)函数定义:day(int,int,int); 函数调用day(date.year,date.month,date.day); //形、实参为结构体中的分量
(2)函数定义:day(Date); 函数调用day(date); //形、实参是结构体整体
至此,谈及的项目5(见http://blog.csdn.net/sxhelijian/article/details/8654915),我在给出任务时,用的是上面第二种策略(这样做更合理)。而如果用第一种思路,也有办法,应该定义成double distance(double x1, double y1, double x2, double y2);、double distance0(double x, double y);了,相应地在调用时,实际参数将不能用点结构体整体,而用各点的x、y分量,是一种较麻烦的做法。
对于项目3,我给出的参考解答,提供了一个“大程序”的设计过程指导,在http://blog.csdn.net/sxhelijian/article/details/8655466
==================== 迂者 贺利坚 CSDN博客专栏=================
|== IT学子成长指导专栏 专栏文章分类目录(不定期更新) ==|
|== C++ 课堂在线专栏 贺利坚课程教学链接(分课程年级) ==|
======== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =======