函数形参使用结构体引发的问题

来源:互联网 发布:淘宝客服奖罚 编辑:程序博客网 时间:2024/04/30 03:23

  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菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =======




1 0
原创粉丝点击