求C语言编程万年历 答案合适者200分必送。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求C语言编程万年历 答案合适者200分必送。相关的知识,希望对你有一定的参考价值。
已知公元一年一月一日是星期一。计算输入的年月日是星期几?求标准C语言程序。求完整程序。
╔═══════════════════════════╗╔══万年历查询═════════════沧海雄风制作═╗
║ 2011 年 11 月 ║
╟------┬------┬------┬------┬------┬------┬------╢
║ 日 │ 一 │ 二 │ 三 │ 四 │ 五 │ 六 ║
╟------┼------┼------┼------┼------┼------┼------╢
║ │ │ 1 │ 2 │ 3 │ 4 │ 5 ║
╟------┼------┼------┼------┼------┼------┼------╢
║ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │ 12 ║
╟------┼------┼------┼------┼------┼------┼------╢
║ 13 │ 14 │ 15 │ 16 │ 17 │ 18 │ 19 ║
╟------┼------┼------┼------┼------┼------┼------╢
║ 20 │ 21 │ 22 │ 23 │ 24 │ 25 │ 26 ║
╟------┼------┼------┼------┼------┼------┼------╢
║ 27 │ 28 │ 29 │ 30 │ │ │ ║
╟------┼------┼------┼------┼------┼------┼------╢
║ │ │ │ │ │ │ ║
╚═══╧═══╧═══╧═══╧═══╧═══╧═══╝
提示:【←】减年 【→】加年 【↑】减月 【↓】加月 【ESC】退出
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
#define CURU 72
#define CURD 80
#define CURL 75
#define CURR 77
#define ESC 27
void printWNL(int, int); //简单格式打印万年历
void printWNL2(int, int); //打印带表格的万年历
int Week(int,int,int); //求星期几
int getDays(int, int); //计算某个月的天数
int isRunNian(int); //判断是否闰年
/*
*主函数,应用程序入口
*/
void main()
int year,month;
struct tm t;
char ch;
_getsystime(&t); //标准函数, 获得系统当前时间
year = t.tm_year + 1900; //得到当前年份
month = t.tm_mon + 1; //得到当前月份
do
system("cls"); //调用DOS清屏命令
printWNL(year,month); //自定义函数, 打印万年历
ch = getch(); //获得无回显控制台输入字符
if(ch == ESC) //ESC键,退出循环,结束程序
break;
else if(ch == 0) //若值为零,则用户敲了功能键,继续获取后续代码。
ch = getch();
switch(ch)
case CURL: year--; break; //左键减年
case CURR: year++; break; //右键加年
case CURU: //上键减月
month--;
if(month == 0)
month = 12;
year--;
break;
case CURD: //下键加月
month++;
if(month == 13)
month = 1;
year++;
break;
default:;
while(1);
printf("\n\n\t谢谢使用,欢迎常来!再见。\n");
/*
*简单格式打印万年历
*参数: y 整型,接收年份值; m 整型,接收月份值;
*返回值: 无
*/
void printWNL(int y, int m)
int i,j;
int day = 1 - Week(y,m,1); //天数初始值,定位1号的位置
int days = getDays(y,m);
printf("\n\t╔═══════════════════════════╗");
printf("\n\t╔══万年历查询═════════════沧海雄风制作═╗\n");
printf("\t║ %4d 年 %2d 月 ║\n",y,m);
printf("\t╟------┬------┬------┬------┬------┬------┬------╢\n");
printf("\t║ 日 │ 一 │ 二 │ 三 │ 四 │ 五 │ 六 ║\n");
for(i = 1; i <= 6; i++)
printf("\t╟------┼------┼------┼------┼------┼------┼------╢\n");
printf("\t║");
for(j = 1; j <= 7; j++)
if(day <= 0 || day > days)
printf(" ");
else
printf(" %2d ",day);
j < 7 ? printf("│") : i < 6 ? printf("║") : printf("║");
day++;
printf("\n");
printf("\t╚═══╧═══╧═══╧═══╧═══╧═══╧═══╝\n");
printf(" 提示:【←】减年 【→】加年 【↑】减月 【↓】加月 【ESC】退出\n");
/*
*求星期几
*参数: y 整型,接收年份值; m 整型,接收月份值; d 整型,接收天的号数
*返回值: 整型, 是0,1-6七个数之间的一个数,0代表星期日,1-6代表星期一至星期六
*/
int Week(int y,int m,int d)
int days = 0; //总天数
int i;
for(i = 1; i < y; i++) //累计1到y-1年的天数
days += isRunNian(i) ? 366 : 365;
for(i = 1; i < m; i++) //累计y年第1月到第m-1月的天数
days += getDays(y,i);
days += d; //累计当月的天数。
return days % 7; //返回星期值
/*
*判断是否闰年
*参数: y 整型, 接收年份值
*返回值: 整型, 只为0或1, 0代表假, 1代表真
*/
int isRunNian(int y)
return (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) ? 1 : 0;
/*
*计算某个月的天数
*参数: y 整型,接收年份值; m 整型,接收月份值;
*返回值: 整型, 是0, 28, 29, 30, 31之间的一个数
*注意: 返回值为0,表示你调用该函数时传递了不正确的年份值或月份值.
*/
int getDays(int y, int m)
int days = 0;
switch(m)
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31; break;
case 4:
case 6:
case 9:
case 11:
days = 30; break;
case 2:
days = isRunNian(y) ? 29 : 28; break;
default:;
return days;
有问题请追问 满意记得采纳 参考技术A #include <stdio.h>
main()
long year,month,day;
long totalday;
int week;
int monthday[12]=0,31,59,90,120,151,181,212,243,273,304,334;
int monthdayLeap[12]=0,31,60,91,121,152,182,213,244,274,305,335;
char * weekname[7]="Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday";
printf("Please input Year Month Day:");
scanf("%ld %ld %ld",&year,&month,&day);
totalday=(year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400;
if((year%4==0)&&(year%100!=0)||(year%400==0))
totalday+=monthdayLeap[month-1];
else
totalday+=monthday[month-1];
totalday+=day;
week=totalday%7;
printf("%ld,%s\n",totalday,weekname[week]);
参考技术B 这个是我以前编过的简单的万年历程序,你可以看一下
#include "stdio.h"
long int f(int year,int month)
/*f(年,月)=年-1,如月<3;否则,f(年,月)=年*/
if(month<3) return year-1;
else return year;
long int g(int month)
/*g(月)=月+13,如月<3;否则,g(月)=月+1*/
if(month<3) return month+13;
else return month+1;
long int n(int year,int month,int day)
/*N=1461*f(年、月)/4+153*g(月)/5+日*/
return 1461L*f(year,month)/4+153L*g(month)/5+day;
int w(int year,int month,int day)
/*w=(N-621049)%7(0<=w<7)*/
return(int)((n(year,month,day)%7-621049L%7+7)%7);
int date[12][6][7];
int day_tbl[ ][12]=31,28,31,30,31,30,31,31,30,31,30,31,
31,29,31,30,31,30,31,31,30,31,30,31;
int main()
int sw,leap,i,j,k,wd,day;
int year;/*年*/
char title[]="SUN MON TUE WED THU FRI SAT";
printf("Please input the year whose calendar you want to know: ");/*输入年*/
scanf("%d%*c",&year);/*输入年份值和掠过值后的回车*/
sw=w(year,1,1);
leap=year%4==0&&year%100||year%400==0;/*判闰年*/
for(i=0;i<12;i++)
for(j=0;j<6;j++)
for(k=0;k<7;k++)
date[i][j][k]=0;/*日期表置0*/
for(i=0;i<12;i++)/*一年十二个月*/
for(wd=0,day=1;day<=day_tbl[leap][i];day++)
/*将第i+1月的日期填入日期表*/
date[i][wd][sw]=day;
sw=++sw%7;/*每星期七天,以0至6计数*/
if(sw==0) wd++;/*日期表每七天一行,星期天开始新的一行*/
printf("\n|==================The Calendar of Year %d =====================|\n|",year);
for(i=0;i<6;i++)
/*先测算第i+1月和第i+7月的最大星期数*/
for(wd=0,k=0;k<7;k++)/*日期表的第六行有日期,则wd!=0*/
wd+=date[i][5][k]+date[i+6][5][k];
wd=wd?6:5;
printf("%2d %s %2d %s |\n|",i+1,title,i+7,title);
for(j=0;j<wd;j++)
printf(" ");/*输出四个空白符*/
/*左栏为第i+1月,右栏为第i+7月*/
for(k=0;k<7;k++)
if(date[i][j][k])
printf("%4d",date[i][j][k]);
else printf(" ");
printf(" ");/*输出十个空白符*/
for(k=0;k<7;k++)
if(date[i+6][j][k])
printf("%4d",date[i+6][j][k]);
else printf(" ");
printf(" |\n|");
/*scanf("%*c");/*键入回车输出下一个月的日历*/
puts("=================================================================|");
puts("\n Press any key to quit...");
getch();
参考技术C 思路是:计算输入年份的1.1日距离1900年1.1过去了多少天。
然后计算过去这个天数是星期几,然后依次控制显示出去。
显示的时候,显示一二三四五六日,知道1.1是周几,那么再过去1天,2天...都知道了
#include<stdio.h>
#include<time.h>
int main(int argc,char** argv)
int year = 0;
int month = 0 ;
int day = 0 ;
int error = 0;
int leap_year_num = 0;//经历过多少个闰年
int leap =0;//输入年是否为闰年
long days = 0 ;//1900.1.1到输入年1月1日过去的天数
int i = 0;
int j = 0;
int k = 0;
printf("pls input year(xxxx):\n");
scanf("%d",&year);
printf("pls input month(1-12):\n");
scanf("%d",&month);
printf("pls input day(1-31):\n");
scanf("%d",&day);
if(month >12 )
error =1;
if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)|| (month==12))
if(day>31)
error =1;
else if(month==2)
if(((year%4==0) && (year%100 != 0))||(year%400 == 0))//判断闰年
leap =1 ;//是闰年
if(day>29)
error =1;
else
if(day>28)
error =1;
else
if(day>30)
error =1;
if(error == 1)//判断输入错误。
printf("the day %d,%d,%d is not exist",year,month,day);
printf("1\n");
for(i =year;i>0; i--)//判断1.1.1至year有多少个瑞年
if(((i%4==0) && (i%100 != 0))||(i%400 == 0))
leap_year_num++;
printf("2\n");
days = 366*leap_year_num + 365*(year - 1);//过去了的天数
for(j=1;j<month;j++)//这年里过去的月数里的总天数
if((j==1)||(j==3)||(j==5)||(j==7)||(j==8)||(j==10)|| (j==12))
days +=31;
else if(j==2)
if(leap =1 )//是闰年
days +=29;
else
days +=28;
else
days+=30;
printf("3\n");
days+=day;
printf("input is dya: %d\n",(days+1) % 7 );
看到你的同一个1900年的那个日历程序,一起做了,思路同上,这个做了入参合法的检查。
如果对你有帮助,请给分,谢谢!本回答被提问者采纳 参考技术D #include <stdio.h>
#include <stdlib.h>
#define true 1
#define false 0
const int BASEYEAR = 1990;
const int DAYSOFONEYEAR = 365;
typedef unsigned short boolean;
const int MONTHS[12] = 31, 28, 31,
30, 31, 30,
31, 31, 30,
31, 30, 31;
/*判断是否是闰年*/
boolean isLeepYear(int year);
void prompt(int *year);
int crossLeepYears(int year);
int crossDays(int year, int month);
int startWith(int year, int month);
void printMonth(int year, int month);
void printMonths(int month);
void printBlack();
void printTitle(int month);
int main(int argc, char *argv[])
int year = 0;
prompt(&year);
printMonths(year);
return 0;
int crossLeepYears(int year)
int i = -1;
int count = 0;
for (i = BASEYEAR; i < year; ++i)
if (isLeepYear(i))
++count;
return count;
int crossDays(int year, int month)
int days = 0;
int i = 0;
days = (year - BASEYEAR)*DAYSOFONEYEAR + crossLeepYears(year);
if (month > 2 && isLeepYear(year))
++days;
for (i = 0; i < month-1; ++i)
days += MONTHS[i];
return days;
int startWith(int year, int month)
return ((crossDays(year, month)+1))%7;
void prompt(int *year)
printf("Please inpu the year: ");
scanf("%d", year);
boolean isLeepYear(int year)
if ( (year%4==0)&&(year%100 != 0) || year%400==0)
return true;
return false;
void printMonths(int year)
int i = 0;
for (i = 0; i < 12; ++i)
printMonth(year, i+1);
void printMonth(int year, int month)
int i = 0;
int day = 1;
int startDay = startWith(year, month);
int daysOfMonth = MONTHS[month-1]+startWith(year, month);
if (isLeepYear(year))
++daysOfMonth;
printTitle(month);
for (i = 0; i < daysOfMonth; ++i)
if (i<startDay)
printf(" ");
continue;
printf ("%2d", day++);
printBlack();
if ((i+1)%7==0)
putchar('\n');
putchar('\n');
void printBlack()
printf(" ");
void printTitle(int month)
printf("\n\t");
switch (month)
case 1:
puts("一月");
break;
case 2:
puts("二月");
break;
case 3:
puts("三月");
break;
case 4:
puts("四月");
break;
case 5:
puts("五月");
break;
case 6:
puts("六月");
break;
case 7:
puts("七月");
break;
case 8:
puts("八月");
break;
case 9:
puts("九");
break;
case 10:
puts("十月");
break;
case 11:
puts("十一月");
break;
case 12:
puts("十二月");
break;
default:
break;
puts("日 一 二 三 四 五 六");
C语言啥是位段,位段的定义求答案
位段(bit-field)是以位为单位来定义结构体(或联合体)中的成员变量所占的空间。含有位段的结构体(联合体)称为位段结构。采用位段结构既能够节省空间,又方便于操作。
位段的定义格式为:
type [var]: digits
其中type只能为int,unsigned int,signed int三种类型(int型能不能表示负数视编译器而定)。位段名称var是可选参数,即可以省略。digits表示该位段所占的二进制位数。
那么定义一个位段结构可以像下面这段代码去定义:
struct nodeunsigned int a:4; //位段a,占4位
unsigned int :0; //无名位段,占0位
unsigned int b:4; //位段b,占4位
int c:32; //位段c,占32位
int :6; //无名位段,占6位
;
使用位段需注意一下几点:
1)位段的类型只能是int,unsigned int,signed int三种类型,不能是char型或者浮点型;
2)位段占的二进制位数不能超过该基本类型所能表示的最大位数,比如在VC中int是占4个字节,那么最多只能是32位;
3)无名位段不能被访问,但是会占据空间;
4)不能对位段进行取地址操作;
5)若位段占的二进制位数为0,则这个位段必须是无名位段,下一个位段从下一个位段存储单元(这里的位段存储单元经测试在VC环境下是4个字节)开始存放;
6)若位段出现在表达式中,则会自动进行整型升级,自动转换为int型或者unsigned int。
7)对位段赋值时,最好不要超过位段所能表示的最大范围,否则可能会造成意想不到的结果。
8)位段不能出现数组的形式。
参考技术A 位段则是一种特殊的结构体成员,这些成员允许以位为单位进行定义和存储,可以作为独立的量参与操作和运算。例如 上述控制字的例子中,可以采用位段的方法,将控制字分为两个位段,作为两个成员来使用。只需定义本回答被提问者采纳 参考技术B 有些信息在存储时,不需要占用一个完整的字节,而只需占几个或一个二进制位。
例如,在存放一个开关量的时候,只有0和1两种状态,用一位二进制位即可。为了节省存储空间,并使处理简便,C语音又提供了一种数据结构,称为“位域”或“位段”。所谓位段是把一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数。每个域都有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
手打勿喷。
以上是关于求C语言编程万年历 答案合适者200分必送。的主要内容,如果未能解决你的问题,请参考以下文章