三天打鱼两天晒网(c)

作业说明

  1. 作业:三天打鱼两天晒网
  2. 作业分析:问题目的是计算出从2010年1月1日开始到指定日期共有多少天,然后根据三天打鱼两天晒网五天为一周期,通过相除取余数的方法即可判断出指定日期这一天是打鱼还是晒网。
  3. 细节分析:在计算总天数时需考虑是否为闰年,在用户输入指定日期时要判断输入的日期是否合理。
  4. 算法设计:
  • 将十定义变量日期年月日year,month,day。
  • 二个月的天数保存在一个数组中M[ ]。
  • 输入指定日期,格式为(2015 12 24)。
  • 判断输入日期是否合理,不合理,请重新输入。
  • 计算得出总天数,并通过周期判断输入日期这天是在打鱼还是晒网。
  1. 程序流程图:
  2. 三天打鱼两天晒网(c)

  3. 三天打鱼两天晒网(c)

    源代码:

    #include<stdio.h>
    int main()
    {
        int year,month,day,i;//定义输入变量年份year,月份month,日期day
        int M[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//将每月的天数放在一个数组里面,方便后续运用
        printf("请输入正确的年月日(形式如2015 1 1):\n"); 
        scanf("%d%d%d",&year,&month,&day);
        if(year<2010||month<1||month>12||day<1)//判断输入的数据是否有误    
        { 
           printf("数据输入有误,年份应大于2010,月份应小于12大于1,请重新输入:\n");
           scanf("%d,%d,%d",&year,&month,&day);
        }
        if(year%400==0||(year%4==0 && year%100!=0)) //当输入年份是闰年时,在二月份日期基础上加一天
        {
            M[2]+=1;
        }
        int days=0;
            for(i=2010;i<year;i++)   //判断从开始年份到输入年份之间年份是否有闰年
            {
                if(i%400==0||(i%4==0 && i%100!=0)) 
                    days=366;  
                else
                    days=365;  
            }

            for(i=1;i<month;i++)   
            {
                days=days+M [i];
            }
            days=days+day;//计算从2010年1月1日到输入年份数据共多少天
            if(days%5==0||days%5==4)  //总天数除以5,求得的余数为1或2或3时在打鱼,余数为0或4时在晒网
                printf("%d年%d月%d日他今天在晒网\n",year,month,day);
            else
                printf("%d年%d月%d日他今天在打鱼\n",year,month,day);
             return 0;

    }   

  4. 运行结果:

三天打鱼两天晒网(c)

三天打鱼两天晒网(c)

 

总结:程序有不足的地方就是,无法判断输入的日期几号是否合理,有尝试加上这部分的判断,但是效果都不好。还有就是运用文件进行数据保存时,我只能将数据写入文件,假如我写入两个数据,在打开文件读取数据时只能读出最后输入的数据,因此这个程序没有用文件。

程序设计风格的搜索:

(1)正确性-能完成需求中的所有要求;

(2)可扩展性-易于修改;

(3)高效的数据结构与算法;

(4)易读性;

(5)可移植性等;

具体为:

1.变量名,宏定义,见名知义

3.空格和缩进一致性和习惯用法

4.尽量用简单的条件语句,这样不容易出错

5.注释,简单而不过分简单;

6.在进行设计的时候,必须考虑的问题包括:界面:应提供哪些服务和访问?界面在效能上实际成为服务的提供者和使用者之间的一个约定。在这里要做的是提供一种统一而方便的服务,使用方便,有足够丰富的功能,而又不过多过滥以至无法控制。信息隐藏:哪些信息应该是可见的,哪些应该是私有的?一个界面必须提供对有关部件的方便访问方式,而同时又隐蔽其实现的细节。这样,部件的修改才不会影响到使用者。资源管理:谁负责管理内存或者其他有限的资源?这里的主要问题是存储的分配和释放,以及管理共享信息的拷贝等。错误处理:谁检查错误?谁报告?如何报告?如果检查中发现了错误,那么应该设法做哪些恢复性操作?一个界面要想成功,它就必须特别适合有关的工作—必须简单、通用、规范、其行为可以预料及坚固等等,它还必须能很好地适应用户或者实现方式的变化。

7.检查所有的变量是否都正确地进行了初始化。对于测试,惟一的、最重要的规则。

风格:

1.全局变量用具有描述意义的名字,局部变量用短名字。保持一致性。(缩进,空格等)

2.函数采用动作性的名字。要准确。

3.以缩行形式显示程序结构。

4.使用表达式的自然形式。

5.利用括号排除歧义。

6.分解复杂的表达式。要清晰。

7.使用一致的缩行和加括号风格。为了一致性,使用习惯用法。

8.用else-if 处理多路选择。(少用switch)

9.避免使用函数宏。给宏的体和参数都加上括号。

把数定义为常量,不要定义为宏。(const而非#define)

10.使用字符形式的常量,不要用整数。

11.利用语言去计算对象的大小。(sizeof)