1. 程式人生 > >三天打漁,兩天晒網小演算法

三天打漁,兩天晒網小演算法

問題描述:

   中國有句俗語叫“三天打魚兩天晒網”。某人從201011日起開始“三天打魚兩天晒網”,問這個人在以後的某一天中是“打魚”還是“晒網”。用CC++語言實現程式解決問題。

原始碼:

//檔名:fishing or relaxing.cpp  
//作者:Vector_山水之間  
//學號:1508010333  
//版本:2017.3.1  
//完成日期:2017/3/10  
//主要功能:某人從2010年1月1日起開始“三天打魚兩天晒網”,  
//         判斷某天是打魚還是晒網.  
#include<stdio.h>  
void show();                         //宣告show()函式  
int calculate(struct date day);      //宣告計算天數的函式  
struct date{                         //定義結構體  
    int year;  
    int month;  
    int day;  
};  
void show()                           //計算並輸出某一日期下打魚或者晒網的結果  
{   struct date today,term;           //定義結構體變數today,term  
    int yearday,year,day;  
    printf("請輸入年份:");  
    scanf("%d",&today.year);  
    while(today.year<2010||today.year>9999)     //判斷年份輸入的規範性  
    {  
        printf("年份輸入不符合規範,請重新輸入:");  
        scanf("%d",&today.year);  
    }  
    printf("請輸入月份:");  
    scanf("%d",&today.month);  
    while(today.month<1||today.month>12)        //判斷月份輸入的規範性  
    {  
        printf("月份輸入不符合規範,請重新輸入:");  
        scanf("%d",&today.month);  
    }  
    printf("請輸入日:");  
    scanf("%d",&today.day);  
    if(today.month==1||today.month==3||today.month==5||today.month==7  
        ||today.month==8||today.month==10||today.month==12) //判斷日的輸入是否符合規範   
    {  
        while(today.day<0||today.day>31)                           
        {  
            printf("輸入不符合規範,請重新輸入:");  
            scanf("%d",&today.day);  
        }  
    }  
    else if(today.month==4||today.month==6||  
        today.month==9||today.month==11)  
    {  
        while(today.day<0||today.day>30)  
        {  
            printf("輸入不符合規範,請重新輸入:");  
            scanf("%d",&today.day);  
        }  
    }  
    else if(today.month==2)  
    {  
        if(today.year%4==0)  
            while(today.day<0||today.day>29)  
            {  
                printf("輸入不符合規範,請重新輸入:\n");  
                scanf("%d",&today.day);  
            }  
        else  
            while(today.day<0||today.day>28)  
            {  
                printf("輸入不符合規範,請重新輸入:\n");  
                scanf("%d",&today.day);  
            }  
    }    
    term.month=12;                    //設定變數的初始值:月  
    term.day=31;                      //設定變數的初始值:日  
    for(yearday=0,year=2010;year<today.year;year++)  
    {  
        term.year=year;  
        yearday+=calculate(term);     //計算從2010年至指定年的前一年的最後一天共有多少天  
    }  
    yearday+=calculate(today);        //加上指定年中到指定日期的天數  
    day=yearday%5;                    //求餘數                                 
    if(day>0&&day<4)                  //列印結果  
    {  
        printf("%d,%d,%d\n",today.year,today.month,today.day);  
        printf("He was fishing at that day.\n");  
    }                                             
    else  
    {     
        printf("%d,%d,%d\n",today.year,today.month,today.day);  
        printf("He was relaxing at that day.\n");  
    }  
}  
int calculate(struct date day)        //定義計算天數的函式  
{  
    static int day_tab[2][13]=  
            {{0,31,28,31,30,31,30,31,31,30,31,30,31,},      //平均每月的天數  
             {0,31,29,31,30,31,30,31,31,30,31,30,31,},  
    };  
    int i,lp;  
    lp=day.year%4==0&&day.year%100!=0||day.year%400==0;  
                                       //判定year為閏年還是平年,lp=0為平年,非0為閏年  
    for(i=1;i<day.month;i++)           //計算本年中自1月1日起的天數  
       day.day+=day_tab[lp][i];     
    return day.day;  
}  
void main()           
{     
    printf("功能介紹:某人從2010年1月1日起開始三天打魚兩天晒網,\n");  
    printf("         輸入日期判斷這個人在以後的某一天中是打魚還是晒網。\n\n");  
    int m;  
    show();  
    printf("\n繼續輸入請按 1\n");  
    scanf("%d",&m);  
    while(m==1)  
    {  
        show();  
        printf("\n");  
    }   
}