程序设计方法学作业

程序设计方法学作业
一.题目:中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题。
基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求:1.输入数据的正确性验证。
2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保 存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。

二.解题思路
1)计算从2010年1月1日开始至指定日期共有多少天;
2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除;
3)根据余数判断他是在“打鱼”还是在“晒网”;
若 余数为1,2,3,则他是在“打鱼”,否则 是在“晒网”
在这三步中,关键是第一步。求从2010年1月1日至指定日期有多少天,要判断经历年份中是否有闰年,二月为29天,平年为28天。
C语言中判断能否整除可以使用求余运算(即求模)

三.个人学习心得
当看到编程题目“三天打鱼两天晒网”时,突然觉得编程是一个很神奇的东西,生活中很难解决的问题通过代码就可以搞定。
这个问题解决的关键在于计算从2010年1月1日至某一天的天数,天数中间还要分清平年(365)与闰年(366)的不同,大月小月的判断等,最后利用天数取余,余数为0或4,为晒网,剩下为打鱼。
除了简单的判断以外,还想将输入时间进行文件保存,对于写文件自己的能力还是不够,尝试好几次都失败,最终还是放弃。在以后的学习中还是得多学习,毕竟好多程序的编写都需要文件。

四.源代码

#include <stdio.h>
#include <stdlib.h>
int Insert();    //录入数据并判断是否合法
int Date(int, int, int);    //求期间的天数,参数为年月日
int Date(int year, int month, int day)
{
    int days = 0;   //期间共有多少天
    int days_tmp = 0;   //不满一年的整月天数
    int oyear[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int lyear[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int i = 0;
    int j = 0;
    for(i = 2010; i <= year; i++)   //遍历每一年
    {
        if((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0))  //判断闰年
        {
            if((year - i) != 0)    //判断是否为完整的一年
                days += 366;
            else
            {
                for(j = 0; j < month - 1; j++)
                    days_tmp += lyear[j];
                days += days_tmp + day;
            }
        }
        else
        {
            if((year - i) != 0)    //判断是否为完整的一年
                days += 365;
            else
            {
                for(j = 0; j < month - 1; j++)
                    days_tmp += oyear[j];
                days += days_tmp + day;
            }
        }
    }
    return days;
}

int Insert()
{
    int days = 0,   //从始至终的总天数
        year = 0,
        month = 0,
        day = 0;
    int num = 0;
    printf("\t     输入一个2010年1月1日后的日期   \n\n");
    printf("输入日期(例2010,1,1):");
    while(1)    //录入数据并判断是否合法
    {
        scanf("%d,%d,%d", &year, &month, &day);
        if(year >= 2010 && month >= 1 && month <= 12)   //判断年月
        {
            if(month == 1||month == 3||month == 5||month == 7||month == 8||month == 10||month == 12)
            {
                if(day >= 1 && day <= 31)   //大月天数是否合法
                    break;
                else
                {
                    printf("输入错误,请重新输入:");
                }
            }
            else if(month == 2)     //2月天数是否合法
            {
                if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))  //闰年
                {
                    if(day >= 1 && day <= 29)
                        break;
                    else
                    {
                        printf("输入错误,请重新输入:");
 
                    }
                }
                else
                {
                    if(day >= 1 && day <= 28)
                        break;
                    else
                    {
                        printf("输入错误,请重新输入:");
                    }
                }
            }
            else if(day >= 1 && day <= 30)  //小月天数是否合法
                break;
            else
            {
                printf("输入错误,请重新输入:");
            }
        }
        else
        {
            printf("输入错误,请重新输入:");     
        }
    }
    days = Date(year, month, day);  //调用求天数的函数 
    return days;    //返回天数
}

int main()
{
    int days = 0;   //从始至终的总天数
		days = Insert();  //调用函数
    if((days % 5 == 4) || (days % 5 == 0))  //利用取余判断打鱼还是晒网
        printf("这一天晒网");
    else
        printf("这一天打鱼");    
    return 0;
}



猜你喜欢

转载自blog.csdn.net/qq_44710356/article/details/88075024