标题:C语言万年历程序问题
只看楼主
RhsR
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2017-1-4
结帖率:100%
已结贴  问题点数:10 回复次数:8 
C语言万年历程序问题
程序代码:
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <process.h>
int day_s(); 
int year_s(); 
int week_s(); 
void output_month(); 
void menu(); 
void output_year(); 
int year,month; 
int main() 
{ 

 SYSTEMTIME time;

 GetSystemTime(&time);//获取当前系统的时间
year=time.wYear;

 month=time.wMonth;

 printf("\t\t今天是公元%d年%d月%d日\n\n",time.wYear,time.wMonth,time.wDay);

 output_month(); 

 menu(); 

 return 0;
}
int Windows()
{ 

 printf("请输入年月以打印该月日历!\n");

 printf("年:");

 scanf("%d",&year);

 printf("月:");

 scanf("%d",&month);

 system("cls");

 printf("\t\t公元%d年\n",year);

 output_month(); 

 menu(); 

 return 0;
}
int day_s() 
{ 

 switch(month) 

 { 

 case 1: 

 case 3: 

 case 5: 

 case 7: 

 case 8: 

 case 10: 

 case 12:return 31;break; 

 case 4: 

 case 6: 

 case 9: 

 case 11:return 30;break; 

 case 2:
  {
   if(year%4==0&&year%100!=0||year%400==0) return 29; 
   else   return 28;
   break;
  }

 } 
}
int year_s() 
{ 

 int s=1; 

 switch(month-1) 

 { 

 case 11:s+=30; 

 case 10:s+=31; 

 case 9:s+=30; 

 case 8:s+=31; 

 case 7:s+=31; 

 case 6:s+=30; 

 case 5:s+=31; 

 case 4:s+=30; 

 case 3:s+=31; 

 case 2:
  {
   if(year%4==0&&year%100!=0||year%400==0)s+=29; 
   else s+=28; 
  }

 case 1:s+=31; 

 } 

 return s; 
}
int week_s() 
{ 

 int s=1,n; 

 n=(year-1)%400; 

 for(int i=1;i<=n;i++) 

 { 
  if(year%4==0&&year%100!=0||year%400==0) 
   s+=2; 
  else s+=1; 

 } 

 s+=year_s(); 

 s%=7; 

 return s; 
}
void output_month() 
{ 

 int week,day,i; 

 printf("\t\t公元%d月\n",month);

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

 day=day_s(); 

 week=week_s(); 

 for(i=1;i<=week;i++)

 {
  printf(" \t"); 

 }

 for(i=1;i<=day;i++) 

 { 
  printf("%d",i);
  if((i+week)%7==0) printf("\n");
  else printf("\t");

 } 

 for(int j=1;j<=42-week-i;j++)

 {
  printf("\t");

 }

 printf("\n\n");
}
void output_year() 
{ 

 printf("\t\t公元%d年\n",year);

 for(int i=1;i<=12;i++) 

 { 
  month=i; 
  output_month(); 

 } 

 printf("1查看下年\n");

 printf("2查看上年\n");

 printf("3重新输入年月\n");

 printf("0退出\n");

 printf("请选择:");

 int n; 

 scanf("%d",&n);
    system("cls"); 

 switch(n) 

 { 

 case 1:year+=1;output_year();break; 

 case 2:year-=1;output_year();break; 

 case 3:main();break; 

 case 0:;break; 

 }
} 
void menu() 
{ 

 printf("1查看下个月\n");

 printf("2查看上个月\n");

 printf("3查看本年全部日历\n");

 printf("4重新输入年月\n");

 printf("0退出\n");

 printf("请选择:");

 int n; 

 scanf("%d",&n);
    system("cls"); 

 switch(n) 

 {

 case 1:
  {
   if(month+1==13)
   {
    year+=1;
    month=1;
   } 
   else month+=1;
   printf("\t\t公元%d年\n",year);
   output_month(); 
   menu(); 
   break; 
  }
case 2:
    {
        if(month-1==0)
        {
            year-=1;month=12;
        }
        else
        {
            month-=1;
        }
        printf("\t\t公元%d年\n",year);
        output_month();
        menu();
        break;
    }

 case 3:output_year();break; 

 case 4:Windows();break; 

 case 0:break; 

 } 
}



万年历程序,输出后星期和日期对不上,有的年份可以,有的不可以,请教怎么修改
搜索更多相关主题的帖子: 万年历 C语言 
2017-01-05 00:19
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
得分:2 
你星期的算法有问题,可以百度星期的算法,或者从1900.1.1日起算星期。
2017-01-05 09:17
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:2 
传说中大学万年历课程设计难度五颗星~看来还是有一定含金量的~~关键是要考虑的东西比较多~~

直接做有难度可以用递推试试~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-05 09:54
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:2 
//int week_s() //int s=1;这个感觉有问题~12月31日和1月1日有时接不上轨~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-05 14:29
RhsR
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2017-1-4
得分:0 
回复 4楼 九转星河
那请教应该怎么修改呢,实在是C语言小白...
2017-01-05 14:45
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:2 
回复 5楼 RhsR
简单点先统一换算成日期,万年历,顶多三千多万日,用long不会越界~当然,除了要读入日期外,还要读入系统星期时间,以此为基准~

直接做有难度可以用递推~虽然这样执行效率会比较慢~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-05 20:07
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:2 
我以前写的  和你的需求有些差别  可以参看一下

https://www.bccn.net/paste/1446/

DO IT YOURSELF !
2017-01-05 20:32
RhsR
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2017-1-4
得分:0 
回复 6楼 九转星河
谢谢,已经解决
2017-01-06 11:47
RhsR
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2017-1-4
得分:0 
回复 7楼 wp231957
谢谢,已经解决了
2017-01-06 11:48



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




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

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