在c语言中使用函数来制作一个万年历,要求,可以知道每个月有多少天,每个月的第一天是星期几 用C语言编写一个万年历时候,怎么确定一年中第一天是星期几

作者&投稿:莘伟 (若有异议请与网页底部的电邮联系)
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>

//是否闰年
#define IS_LEAP_YEAR(iYear) (((iYear) % 100 == 0) ? ((iYear) % 400 == 0) : ((iYear) % 4 == 0))

int Calendar(int iYear, int iMonth);

void main()
{
//获取今天的日期
struct tm *today;
time_t ltime;
time(&ltime);
today = localtime(&ltime);

// printf("%d-%02d-%02d %02d:%02d:%02d
星期%d 当年第%d天
", 
// today->tm_year + 1900, today->tm_mon + 1, today->tm_mday, 
// today->tm_hour, today->tm_min, today->tm_sec, today->tm_wday, today->tm_yday);

int iYear = today->tm_year + 1900;
int iMonth = today->tm_mon + 1;

do {
system("cls");

int ch = Calendar(iYear, iMonth);
if (ch == 27) break;

switch (ch)
{
case 75: //<--
iYear--;
break;
case 77: //-->
iYear++;
break;
case 80: //下箭头
iMonth++;
if (iMonth > 12)
{
iYear++;
iMonth = 1;
}
break;
case 72: //上箭头
iMonth--;
if (iMonth < 1)
{
iYear--;
iMonth = 12;
}
break;
case 71: //Home
iYear = today->tm_year + 1900;
iMonth = today->tm_mon + 1;
break;
}
} while (1);
}

//显示给定年月的日历
//返回值为获取的用户按键, 以确定下一步的操作
int Calendar(int iYear, int iMonth)
{
int i, j, iDays;

//初始化数组w的值为1至31
int w[31];
for (i = 0; i < 31; i++) w[i] = i+1;

//获取本月天数于iDays中
switch (iMonth)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
iDays = 31;
break;
case 4: case 6: case 9: case 11:
iDays = 30;
break;
case 2:
iDays = IS_LEAP_YEAR(iYear) ? 29 : 28;
break;
}

//显示 日历头
printf("
    %d年%d月 日历

", iYear, iMonth);
printf(" 日 一 二 三 四 五 六
");
printf("----------------------
");


//获取参数指定年月的第一天是周几。保存在firstday.tm_wday中
struct tm firstday = {0};
firstday.tm_year = iYear - 1900;
firstday.tm_mon = iMonth - 1;
firstday.tm_mday = 1;

time_t ltime;
ltime = mktime(&firstday);

firstday = *localtime(&ltime);

//处理1号前的留空
j = firstday.tm_wday; //周几
for (i = 0; i < j; i++)
{
printf("   "); //3个空格
}

//显示日历正文
for (i = 0; i < iDays; i++)
{
printf("%3d", w[i]);
if (++j == 7)
{
printf("
");//逢七换行
j = 0;
}
}
if (j != 0) printf("
");


//获取今天日期
time(&ltime);
struct tm today = *localtime(&ltime);

//显示 日历尾
printf("----------------------
");
printf("今天是: %d年%d月%d日

", today.tm_year + 1900, today.tm_mon + 1, today.tm_mday);

printf("←: 上一年  →: 下一年
");
printf("↑: 上一月  ↓: 下一月

");
printf("Home: 今天  Esc: 退出
");

//获取用户按键 (不用按回车立即返回)
fflush(stdin);
clearerr(stdin);

int c = getch();
if (c == 0xe0 || c == 0) c = getch();

return c;
}


long YearDays(int Year)
{ Year--;
return(Year*365+Year/4-Year/100+Year/400+1);
}
int LeapYear(int Year)
{ if(Year%4)return 0;
if(Year%100)return 1;
if(Year%400)return 0;
return 1;
}
int MonthDays(int Year,int Month)
{ const int MonDays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(Year<=0||Month<1||Month>12)return 0;
if(Month!=2)return MonDays[Month];
return MonDays[2]+LeapYear(Year);
}
long TotalDays(int Year,int Month,int Day)
{ long Days=0L;
int i;
if(Month<=0)Month=1;
if(Month>12)
{ Month--;
Year+=Month/12;
Month%=12;
Month++;
}
for(i=1;i<Month;i++)
Days+=MonthDays(Year,i);
Days+=YearDays(Year);
return Days+Day-1;
}
int Week(int Year,int Month,int Day)
{ return TotalDays(Year,Month,Day)%7;
}

用c语言编写万年历,要求输出任意一年的某月,能显示出这个月的日历~

1、首先要判断一个年份是闰年还是平年,用一个子程序来做。

2、然后就开始写主程序,首先用scanf得到一个年份。

3、在判断这个年份是平年还是闰年后用printf在CMD中打印出来。

4、在编写完成后,在Notepad++界面下按下F5,弹出输入框。

5、cmd /k gcc -o "$(CURRENT_DIRECTORY)\$(NAME_PART).exe""$(FULL_CURRENT_PATH)" && CLS && "$(CURRENT_DIRECTORY)\$(NAME_PART).exe" & PAUSE & EXIT。在输入框例输入后运行。

6、点击运行,会弹出CMD,在里面输入年份后回车就完成了。

#include "stdafx.h"
#include

int fun(int year)
{
int sum=0;
if(year>2011)
{
while(year>2011)
{
year--;
if(year%4==0&&year%100!=0||year%400==0) sum+=2;
else sum+=1;
}
return (sum+6)%7;
}

while(year<2011)
{
if(year%4==0&&year%100!=0||year%400==0) sum-=2;
else sum-=1;
year++;
}
return 6+sum%7;

}


void main()
{
int y,w;
printf("请输入年份:");
scanf("%d",&y);
w=fun(y);
if(w==0)
printf("%d年1月1日是星期天。
",y);
else
printf("%d年1月1日是星期%d。
",y,w);
}

编程思路:
首先,需知道某一年第一天是星期(2011年1月1日是星期六);

之后,算出某年与2011年共相差几天(本程序中用sum累计),

如果year>2011,先自减一,计算year-1那年有多少天
考虑到365%7=1,366%7=2,所以用sum+=1和sum+=2分别统计平年和闰年应该加多少天
最后,返回(sum+6)%7,(2011年1月1日是星期6)

如果year<2011,先减sum,再year++,
比如2008年1月1日,如果先year++,那当年的天数就误作365天处理了(year++后成了2009,不是闰年)
最后返回值的表达式与year>2011的不同,因为sum是往回减的

当然如果year=2011,两处循环的表达式都不符合,直接返回6

主函数中,根据返回值决输出,此处把0作星期天处理

C语言编写万年历系统
答:void prtweek(void); /*输出表头*/ int fw(int m,int y); /*返回本月一号是星期几*/ void prtmonth(int m); /*输出月份表头*/ int main(void){ int y,m,i,test,week;printf("please import year of you want to select : ");scanf("%d",&y);for (m=1; m<=12; m++) {...

一个用C语言写的万年历程序,看不懂,求详细注释和这个程序的算法思想...
答:一下是大概的注释,不是特别详细,但是你看了应该能明白是怎么回事了 include<stdio.h> main(){ for(;;) //"万年",就是永远都运行 int nian,yue,a,b,m,c,_m=28; //m, c都是做星期控制的,见下面, _m是2月,2月分平年闰年 long e;printf("请输入年份:");scanf("%d",&nian...

用C语言编写万年历系统
答:/*计算从给定年份的1月1日到给定日期之间的天数*/ count+=day; /*计算星期*/ week=(year+1+(year-1)/4+(year-1)/100+(year-1)/400+count)%7 ; return week ;} /*输出指定个数个空格函数*/void printSpace(int n){ int i ; for(i=0;i<n;i++) printf(" ");} /*输出分隔线函数*...

怎么用C语言编写万年历程序
答:万年历 include "stdio.h" /* Required for MS-DOS use */ define ENTER 0x1C0D /* Enter key */ int year, month, day;static char *days[8] = {" ","Sunday ","Monday ","Tuesday ","Wednesday","Thursday ","Friday ","Saturday "};struct TIMEDATE { i...

如何用C语言编一个万年历系统?
答:include "stdio.h" /* Required for MS-DOS use */ define ENTER 0x1C0D /* Enter key */ int year, month, day;static char *days[8] = {" ","Sunday ","Monday ","Tuesday ","Wednesday","Thursday ","Friday ","Saturday "};struct TIMEDATE { int year...

用C语言制作万年历
答:return(mon_day[month-1]);} int DaySearch(int year,int month,int day) /*search what day this day is*/ { int c=0;float s;int m;for(m=1;m<month;m++)c=c+month_day(year,m);c=c+day;s=year-1+(float)(year-1)/4+(float)(year-1)/100+(float)(year-1)/400-40...

求用c语言做一个万年历系统
答:include <stdio.h>#define LMonth 31#define SMonth 30#define VMonth 28typedef enum { Sun, Mon, Jue, Wed, Thu, Fri, Sat} WEEK;typedef enum { January = 1, February, Match, Apirl, May, June, July, August, September, October...

怎么用C语言写万年历,输出一个月份,显示下个月和上个月的日历情况...
答:include"iomanip"include"windows.h"using namespace std;int 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 y,m,d,leap;class Calendar { public:int Leap(int year);int day_of_year(int y1,int m1,int d1...

c语言编写一万年历系统
答:C语言版本的已经发往你的邮箱,请查收 现已更新好,去除农历信息

谁能帮我用C语言将此题的程序编写出来:任意输入某一年,像挂历一样在...
答:include<stdio.h> int main(){ int i,j,m,n,k;int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};float y,m1,k1;printf("欢迎你使用万年历,请输入你要查询的年数:");while(scanf("%f",&y)){n=(int)((y-1)/3324);m1=(int)((y-1)/100);m=(int)(m1*3/4+0....