标题:输入年月,输出日历 这个程序怎么写
只看楼主
黑暗骑士5D
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2019-11-6
结帖率:100%
 问题点数:0 回复次数:19 
输入年月,输出日历 这个程序怎么写
不要什么太复杂的函数什么的
搜索更多相关主题的帖子: 日历 输出 年月 函数 输入 
2019-11-12 22:18
柴十一
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2020-1-9
得分:0 
#include<iostream>
#include<iomanip>
using namespace std;

 
int nyear(int year)
{
    if(year%400==0||(year%4==0&&year%100!=0))
       return 366;
   else
       return 365;
}
 
int nmonth(int m,int y)  //根据年份和月份,判断是那一个月的天数
{
   if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
       return 31;
   else if(nyear(y)==366&&m==2)
       return 29;
   else if(nyear(y)==365&&m==2)
       return 28;
   else
       return 30;
}
 
int getDays(int year, int month)
{
   int i;
   int sum=0;
   if(year>1900)
      for(i=1900;i<year;i++)
          sum+=nyear(i);
   if(month>1)
      for(i=1;i<month;i++)
          sum+=nmonth(i,year);
 
   return sum;   
}
 
int main()
{
   int i,j,year,month,day,sum,daycount,cases=1;
 
   while(cin>>year>>month)
   {
      sum=getDays(year,month);
      day=sum%7;  
      daycount=nmonth(month,year);
      cout<<"Case "<<cases++<<": "<<year<<"年"<<month<<"月"<<endl;
      cout<<"Mon Tue Wed Thu Fri Sat Sun"<<endl;
      for(i=0;i<day%7;i++)
         cout<<"    ";//
      for(i=1,j=day+1;i<=daycount;i++,j++)
      {
         cout<<setw(4)<<setiosflags(ios::left)<<i;
         if(j%7==0) cout<<endl;
      }
      cout<<endl;
   }
 
   return 0;
}


2020-01-10 09:13
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:0 
可参https://bbs.bccn.net/thread-498781-1-1.html

只要计算出月1日是星期几,即可输出整个月的日历了

可参https://blog.

选参考点不必1900采用比较近的年份可减少循环量看下图

程序代码:
    int n = 0, y = 0, r = 1, z = r, nn = n, yy = y;
    cin >> n >> y;
    nn = n; yy = y;
    while (nn >= 2018)if (--yy)z += 返回月的天数(nn, yy); else --nn, yy = 13;
    cout << (z %= 7) << endl;
    nn = 返回月的天数(n, y); yy = 0;
    while (r <= nn)if (yy > z)
        cout << r++ << ((yy++ % 7) ? "\t" : "\t\n");
    else
        cout << (r > 1?to_string(r++):".") << ((yy++ % 7) ? "\t" : "\t\n");





需要说明的是以上程序只能算2018年后的,要算2018年前的算式就要修改了。

[此贴子已经被作者于2020-1-10 14:32编辑过]

收到的鲜花
  • 静夜思2020-02-03 16:52 送鲜花  20朵  
2020-01-10 12:12
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:0 
修改一下显示星期标记的,这程序是目前最简单,最经典的了。
程序代码:
    int n = 0, y = 0, r = 1, z = r, nn = n, yy = y;
    cin >> n >> y;
    nn = n; yy = y;
    while (nn >= 2018)if (--yy)z += 返回月的天数(nn, yy); else --nn, yy = 13;
    cout << (z %= 7) << endl;
    nn = 返回月的天数(n, y); yy = 1; cout << "星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六\n.\t";
    while (r <= nn)if (yy >= z)
        cout << r++ << ((++yy % 7) ? "\t" : "\t\n");
    else
        cout << (r > 1?to_string(r++):".") << ((++yy % 7) ? "\t" : "\t\n");


另外说一下,如果要计算阳历日历,那么,只要把nn>=2018修改为nn即可显示全部阳历的日历。

[此贴子已经被作者于2020-1-10 14:50编辑过]

2020-01-10 14:47
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
得分:0 
回复 2楼 柴十一
发帖时间 2019-11-12 22:18             你咋翻出来几月份前的问题的?

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-01-10 15:20
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
得分:0 
回复 2楼 柴十一
你的帖我没有看明白您能说一下您的思路吗?只要思路就行。谢谢

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-01-10 15:22
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:0 
思路无二致,只是不再使用数组和其他形式而已。
星期的参考点计算以1月1日为周一的。
这个程序不算最佳,最佳的就是使用直接计算,而不是月份的累加。
程序代码:
    CTime time(CTime::GetCurrentTime());
    SYSTEMTIME timeDest;
    time.GetAsSystemTime(timeDest);
    输出万年历(timeDest.wYear, timeDest.wMonth, timeDest.wDay);


以下是引用叶纤在2020-1-10 15:22:58的发言:

你的帖我没有看明白您能说一下您的思路吗?只要思路就行。谢谢



[此贴子已经被作者于2020-1-10 15:53编辑过]

2020-01-10 15:39
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
得分:0 
程序代码:
#include <stdio.h>

int isly(int year)  

{

return ((!(year%4))&&(year%100)||(!(year%400)));

}

int mtod(int m)  

{

int n=0;

switch(m)

{

case 1:n=31;break;

case 2:n=59;break;

case 3:n=90;break;

case 4:n=120;break;

case 5:n=151;break;

case 6:n=181;break;

case 7:n=212;break;

case 8:n=243;break;

case 9:n=273;break;

case 10:n=304;break;

case 11:n=334;break;

default:n=0;

}

return n;

}

int dmax(int y,int m)

{

if(m==2)

{

return 28+(isly(y));

}

if((m==1||m==3||m==5||m==7||m==8||m==10||m==12))

return 31;

return 30;

}

int day(int y,int m)

{

int lyn=0;  

int dn=0;  

int weekday;

static int aday[7]={2,3,4,5,6,0,1};

if(y>=1901)

{

for(int i=1901;i<=y;i++)

{

lyn+=isly(i);

}

if(isly(y))

{

if(m<=2) 

lyn--;

}

dn=(y-1901)*365+mtod(m-1)+lyn;

weekday=aday[dn%7];

}

if(y<1901)

{

for(int i=y;i<1901;i++)

{

lyn+=isly(i);

}

if(isly(y))

{

if(m>2)

lyn--;

}

dn=(1901-y)*365-mtod(m-1)+lyn;

weekday=aday[dn%7];

}

return weekday;

}

void printdate(int y,int m,int wd)

{

int cd=dmax(y,m);

int mdate[40]={0};

printf(" 日 一 二 三 四 五 六\n");

for(int i=0;i<cd;i++)

{

mdate[i+wd]=i+1;

}

for(int i=0;i<cd+wd;i++)

{

if(mdate[i]==0)

printf("   ");

else

printf("%3d",mdate[i]);

if((i+1)%7==0)

printf("\n");

}

printf("\n");

}

int main()

{

int y,m;

printf("输入年月:");

do

{

scanf("%d%d",&y,&m);

if(m<13&&m>0)

{

printf("\n");

printdate(y,m,day(y,m));

break;

}

else

printf("输入不合法,请重新输入:");

}

while(1);

return 0;
}
2020-01-10 16:10
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:0 
计算型不用写那么多代码,简单一句或数句即可。简单代码的背后是不简单的反复推敲与不断升华。

[此贴子已经被作者于2020-1-10 17:06编辑过]

2020-01-10 17:01
柴十一
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2020-1-9
得分:0 
回复 6楼 叶纤
#include<bits/stdc++.h>
using namespace std;
int nyear(int year)//判断平闰
{
    if(year%400==0||(year%4==0&&year%100!=0))
       return 366;
   else
       return 365;
}

int nmonth(int m,int y)  //哪一月
{
   if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
       return 31;
   else if(nyear(y)==366&&m==2)
       return 29;
   else if(nyear(y)==365&&m==2)
       return 28;
   else
       return 30;
}

int getDays(int year, int month)//输入年月,确定几天
{
   int i;
   int sum=0;
   if(year>1900)
      for(i=1900;i<year;i++)
          sum+=nyear(i);
   if(month>1)
      for(i=1;i<month;i++)
          sum+=nmonth(i,year);

   return sum;     //返回总共多少天;
}

int main()
{
   int i,j,year,month,day,sum,daycount,cases=1;

   while(cin>>year>>month)
   {
      sum=getDays(year,month);
      day=sum%7;  //计算空格
      daycount=nmonth(month,year);//计算天数
      cout<<"Case "<<cases++<<": "<<year<<"年"<<month<<"月"<<endl;
      cout<<"Mon Tue Wed Thu Fri Sat Sun"<<endl;
      for(i=0;i<day%7;i++)
         cout<<"    ";//
      for(i=1,j=day+1;i<=daycount;i++,j++)
      {
         cout<<setw(4)<<setiosflags(ios::left)<<i;
         if(j%7==0) cout<<endl;
      }
      cout<<endl;
   }

   return 0;
}
2020-01-10 18:43



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




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

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