三天打漁,兩天晒網小演算法
阿新 • • 發佈:2019-01-01
問題描述:
中國有句俗語叫“三天打魚兩天晒網”。某人從2010年1月1日起開始“三天打魚兩天晒網”,問這個人在以後的某一天中是“打魚”還是“晒網”。用C或C++語言實現程式解決問題。
原始碼:
//檔名: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"); } }