标题:一个超级简单的万年历程序,征求高手意见!
只看楼主
tinx
Rank: 2
等 级:论坛游民
帖 子:24
专家分:29
注 册:2008-10-19
结帖率:0
 问题点数:0 回复次数:8 
一个超级简单的万年历程序,征求高手意见!
#include <iostream.h>
#include <iomanip.h>
int week (int y, int m, int d) //日期换算星期   
{
    if (m==1||m==2)  y=y-1,m=m+12;
    return ((d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7);
}
bool leap(int y)  //判断闰年
{
    return ((y%4==0&&y%100!=0)||(y%400==0));
}

void main()
{
    int year,month,day,t,i;
    char c;
    bool leap(int y);
    int week(int y,int m,int d);
    N:cout<<"请输入正确的年份和月份(例如:2008 9):";
    cin>>year>>month;
    if(year<=0||month<=0||month>12) goto N;
    cout<<"\n                 "<<"公元"<<year<<"年"<<month<<"月\n";
    cout<<"  *****************************************  \n";
    if (month==4||month==6||month==8||month==9||month==11) day=30;
    else
        if(month==2)
            if(leap(year)==1) day=29;
            else day=28;
        else day=31;
    cout<<"    Mon   Tue   Wed   Thu   Fri   Sat   Sun"<<endl;   
    t=week(year,month,1)*6+4;
    if(t==40) cout<<"                                        "<<setw(2)<<"1"<<endl;
    else
    {
        for (i=1;i<=t;i++) cout<<" ";
        cout<<setw(2)<<"1";
    }
    for(i=2;i<=day;i++)
    {
        t=week(year,month,i);
        if(t==6) cout<<"    "<<setw(2)<<i<<endl;
        else cout<<"    "<<setw(2)<<i;
    }
    cout<<endl;
cout<<"  *****************************************  \n";
while(1)
{
    cout<<"\n重新输入(N)| 退出(Q):";
    cin>>c;
    if (c=='N') goto N;
    if (c=='Q') break;
}
}

[[it] 本帖最后由 tinx 于 2008-10-20 22:27 编辑 [/it]]
搜索更多相关主题的帖子: 万年历 意见 超级 
2008-10-19 15:39
xiaxiang1986
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2008-3-16
得分:0 
运行正确,但有点看不懂
int week (int y, int m, int d)   
{
    if (m==1||m==2)  y=y-1,m=m+12;
    return ((d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7);
}
这个函数作用是什么呀?

呵呵!
2008-10-20 20:53
r3215407
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2008-9-17
得分:0 
..
为什么用goto 啊
2008-10-20 21:09
yyj692471453
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2008-8-14
得分:0 
日期转换成星期的算法挺好的,只是不知道为什么那样做,程序的布局不是很好,可读性有点不太好,希望楼主以后写的程序能适当加些注释,特别是关键的算法.
2008-10-26 11:02
荒野的雄狮
Rank: 1
来 自:地球
等 级:新手上路
威 望:1
帖 子:300
专家分:0
注 册:2008-9-2
得分:0 
回复 3# r3215407 的帖子
为什么不能用goto?goto语句使用起来比较灵活,而且有些情形能够提高程序的效率。如果一味强调删除goto语句,有些情形反而会使程序过于复杂,增加一些不必要的计算量。

为天地立心、为生民立命、为往圣继绝学、为万世开太平
2008-10-26 11:27
linfeng1712
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2008-10-26
得分:0 
楼主?
好象有问题,每当我输入润年的时候就不输出?
2008-10-26 20:07
linfeng1712
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2008-10-26
得分:0 
清楚点说,输入为闰年和2月的时候,好象就出问题
2008-10-26 20:08
linfeng1712
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2008-10-26
得分:0 
不好意思,程序没问题
可能是我编译器出了问题。呵呵,可否问一下日期换算星期的公式,可否讲解一下啊?谢谢
2008-10-26 20:11
gyfabc
Rank: 1
等 级:新手上路
帖 子:16
专家分:5
注 册:2012-4-20
得分:0 
#include<iostream>
 using namespace std;
 #include<iomanip>
 int firstday(int year)   //计算当年第一天是星期几
 {
 double s;
 

int k=((year-1)+(year-1)/4-(year/100)+(year/400)+1);
 return (int)(k%7);
 
}
 





int monthday(int n,int year)     //计算一个月有多少天
 {
     if((n==1)||(n==3)||(n==5)||(n==7)||(n==8)||(n==10)||(n==12))
         return 31;
     if(n==2)
         {
         if((year%4==0&&year%100!=0)||(year%400==0))
             return 29;
 
           else
               return 28;
         }
 
    else
         return 30;
 


}
 
void main()
 {
 int i,year,f,m;
 cout<<"year:";
 cin>>year;
 cout<<endl;
 f=firstday(year);
 for(i=1;i<=12;i++)      //控制输出12个月
     {
       cout<<"         "<<i<<"月"<<endl;
 
cout<<" 日 "<<"一 "<<"二 "<<"三 "<<"四 "<<"五 "<<"六 "<<endl;
 for(int j=f;j>0;j--)
 cout<<"   ";
     m=monthday(i,year);
 for(int i=1;i<=m;i++)
 {
 cout<<" "<<setw(2)<<i;
 f=(f+1)%7;
 if(f==0)
    cout<<endl;
 }
 cout<<endl;
 }
 }
 
2012-04-22 19:08



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-239227-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.051909 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved