C语言 假定2000年1月1日周六,用户输入年、月、日后计算这一天是周几?
不必用 switch. 以前编过一个. 现在找出来配了个主程序. 你试试吧.
---输入年,月,日:2000,3,1
答: 2000年3月1日是星期三.
---输入年,月,日:2008,4,20
答: 2008年4月20日是星期日.
---输入年,月,日:0
年月日数字用逗号隔开. 想结束的时候输入一个0就可以了.
int Ymd2Wday(int year, int month, int days)
{
static int mdays[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30 };
int i, y = year - 1;
for (i=0; i<month; ++i) days += mdays[i];
if (month>2) { // Increment date if this is a leap year after February
if (((year%400)==0) || ((year&3)==0 && (year%100))) ++days;
}
return (y+y/4-y/100+y/400+days)%7;
}
int main()
{
int y,m,d,w;
static char* wday[]={ "日","一","二","三","四","五","六" };
printf("---输入年,月,日:");
while (scanf("%d,%d,%d", &y, &m, &d)==3) {
w = Ymd2Wday(y,m,d);
printf("答: %d年%d月%d日是星期%s.
---输入年,月,日:", y, m, d, wday[w]);
}
return 0;
}
//输入年月日,输出是该年第几天
#include
int sum(int month,int day)
{
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int i;
for(i=1;i<month;i++)
day+=days[i];
return(day);
}
int leap(year)
{
int leap=0;
if((year%4==0&&year%100!=0)||(year%400==0))
leap=1;
return leap;
}
void main()
{
int year,month,day,num;
printf("Please input year,month,day:
");
scanf("%d,%d,%d",&year,&month,&day);
num=sum(month,day);
if(leap(year)&&month>=3)
num++;
printf("It is the %dth day.
",num);
}
w:0-6对应星期日-星期六 c:世纪-1(前两位数)y:年(后两位数)m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,d:日[ ]代表取整,即只要整数部分。这个是蔡勒(Zeller)公式
#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,int d)
{
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 main()
{
int y,m,d;
int lyn=0;
int dn=0;
char* cday[]={"六","日","一","二","三","四","五"};
printf("输入年月日:");
do
{
scanf("%d%d%d",&y,&m,&d);
if(m<13&&m>0&&d>0&&d<=dmax(y,m,d))
break;
else
printf("该日期不存在,请重新输入:");
}
while(1);
if(y>=2000)
{
for(int i=2000;i<=y;i++)
{
lyn+=isly(i);
}
if(isly(y))
{
if(m<2||(m==2&&d<=29))
lyn--;
}
dn=(y-2000)*365+mtod(m-1)+d+lyn-1;
printf("%d年%d月%d日是星期%s\n",y,m,d,cday[dn%7]);
}
if(y<2000)
{
for(int i=y;i<2000;i++)
{
lyn+=isly(i);
}
if(isly(y))
{
if(m>2)
lyn--;
}
dn=(2000-y)*365-mtod(m-1)-d+lyn+1;
printf("%d年%d月%d日是星期%s\n",y,m,d,cday[(7-dn%7)%7]);
}
return 0;
}
参考我blog里面的一个代码
辛梅蛭龙: # include void printmonth(int m); void printhead(int m); int daysofmonth(int m); int firstday(int y); int year,weekday; void main() { int i; printf("请输入年份:"); scanf("%d",& year); weekday=firstday(year); printf("\n\n"); printf(" %d年\n",...
白云矿区18470007180: .C语言编程“已知2000年1月1日为星期六,任意输入一年份,打印出其月历” - ?
辛梅蛭龙: #include#include #define day0001 0 int long_of_year(int year) { int i,day=0; for(i=1;i
白云矿区18470007180: 已知2000年1月1日为星期六,编程求任意给定年元月1日的星期?(C语言) - ?
辛梅蛭龙: 已编译通过!#include<stdio.h> #include<stdlib.h> int isLeap(int Year ) {if( (Year % 4 == 0 && Year % 100 != 0 ) || ( Year % 400 == 0 ) )e68a84e8a2ad7a686964616f31333431373238return 1;elsereturn 0; } int get_week( int Year ) {int i = ...
白云矿区18470007180: 已知2000年1月1日为星期六,编程求任意给定年元月1日的星期?(C语言) - ?
辛梅蛭龙: 从00年开始一直循环到指定年,累计每年的天数(365或366).得到天数以后,对7取余e799bee5baa6e58685e5aeb931333335336433,起点是周六所以需要微调减1. #define isleap(y) ((y)%4 == 0 && (y)%100 != 0 || (y)%400 == 0)void ...
白云矿区18470007180: 用C++或C编写:输入一个整数,将其转换为以2000年1月1日00:00:00为基准的年月日时分秒,并输出星期状态 - ?
辛梅蛭龙: 实在不知道你要问什么输入10,则输出2000年1月1日00:00:10,星期六输入1000,则输出2000年1月1日00:16:40,
白云矿区18470007180: C语言程序编程题....请高手做下 - ?
辛梅蛭龙: 这是在windows下的程序,用TC编译运行,完全可行.至于你的linux,我就不知道了.1. 程序运行后,首先在屏幕上显示主菜单:1. 查询某...
白云矿区18470007180: C语言 万年历计算星期几的问题 - ?
辛梅蛭龙: #include <iostream.h> #include <iomanip.h> #include <windows.h>int main() {int c,i,x,s,num,year,month,day,j=1,k=1;//SYSTEMTIME sysT;//GetSystemTime(&sysT);//year=sysT.wYear;//month=sysT.wMonth;cout<<"input year and month:"<...
白云矿区18470007180: c语言:输入日期如2000.1.1,得出那天是星期几,求流程图. - ?
辛梅蛭龙: #include int main() { int day,mn,yr,i,days=0,s,k; int mont[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; char wek[][9]={ {'S','u','n','d','a','y'}, {'M','o','n','d','a','y'}, {'T','u','e','s','d','a','y'}, {'W','e','d','n','s','d','a','y'}, {'T','h','u','r','s','d','a','y'}, {'F','r','i','d','a','y'}, {'S','a','t',...
白云矿区18470007180: C语言程序编程题....请高手做下 - ?
辛梅蛭龙: ```老兄的代码我直接copy过来编译不通过,呵呵. 环境:linux-2.6.15-27-server; gcc version 4.0.3 test.c: In function 'main': test.c:169: warning: return type of 'main' is not 'int' 此外,conio.h不是标准库文件,比较麻烦... --------------------------------------------------------- 呵呵,删除conio以及getch,wgetch等,通过,问题在于conio不是标准库文件.所以我说不推荐用```getch用scanf咯,虽然烦一点:)
白云矿区18470007180: C语言的编程 - ?
辛梅蛭龙: #include<stdio.h> int main() { int x; printf("输入年份:"); scanf("%d",&x); int day_code=(x+((x-1)/4)-((x-1)/100)+((x-1)/400)) % 7; switch(day_code) { case 0:printf("%d年1月1日是周日.",x);break; case 1:printf("%d年1月1日是周一.",...