当前位置:首页 » 编程语言 » 万年历c语言怎么改变位置
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

万年历c语言怎么改变位置

发布时间: 2022-08-02 08:03:00

‘壹’ c语言编程:输出万年历(按上下键改变年,按左右键改变月)

不是我编的,见参考资料
#include <stdio.h>
#include <stdlib.h>
int JudgeLeapYear(int); // 判断是否为闰年
int MonthDay(int m,int y); // 返回本月的天数
void printHeader(void); // 输出表头
int FirstWeek(int m,int y);// 返回本月一号是星期几
void printMonth(int m); // 输出月份表头
int main(int argc, char* argv[]) {
int year,month,i,test,week;
printf("Year:");
scanf("%d",&year);
for(month = 1; month <= 12; month++) {
test = 1;
printMonth(month);
printHeader();
week = FirstWeek(month,year);
if(week < 6) { //输出每月的第一星期
for(i = 0; i <= week; i++) {
putchar('\t');
test++;
}
}
for(i = 1; i <= MonthDay(month,year); i++,test++) {
//输出每个月非第一个星期
printf("%d\t",i);
if(test%7 == 0) putchar('\n');
}
putchar('\n');
system("pause");//暂停,以便观察输出
}
return 0;
}
//判断是否润年
int JudgeLeapYear(int y) {
return ((y%4 == 0) && (y%100) || (y%400 == 0)) ? 1 : 0;
}
//返回这月的一号是星期几
int FirstWeek(int month,int year) {
if (month < 3) {
month += 12;
year--;
}
return (1 + 2*month + 3*(month + 1)/5 + year + year/4 - year/100 + year/400)%7;
}
//一月有多少天
int MonthDay(int month,int year) {
int d;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:d = 31; break;
case 4:
case 6:
case 9:
case 11:d = 30;break;
case 2:d = JudgeLeapYear(year) ? 29 : 28; break;
}
return d;
}
//打印日历头
void printHeader(void) {
printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t\n","Sun","Mon","Tue","Wed","Thur","Fri","Sat");
}
//打印月份
void printMonth(int m) {
switch (m) {
default:
case 1:puts("\t***** January *****");break;
case 2:puts("\t***** February *****");break;
case 3:puts("\t***** March *****");break;
case 4:puts("\t***** April *****");break;
case 5:puts("\t***** May *****");break;
case 6:puts("\t***** June *****");break;
case 7:puts("\t***** July *****");break;
case 8:puts("\t***** August *****");break;
case 9:puts("\t***** September *****");break;
case 10:puts("\t***** October *****");break;
case 11:puts("\t***** November *****");break;
case 12:puts("\t***** December *****");break;
}
}

‘贰’ 怎么用C语言编写编写万年历

农历,大月30天,小月29天。
还有闰月。这个有点麻烦。我不知道农历的润月是怎么个润法。
农历

[解释]1.中国的一种历法,是阴阳历的一种,一般就叫阴历。平年十二个月,大月三十天,小月二十九天,全年354天或355天(一年中哪一月大,哪一月小,年年不同)。由于平均每年的天数比太阳年约差十一天,所以在十九年里设置七个闰月,有闰月的年份全年383天或384天。又根据太阳的位置,把一个太阳年分成二十四个节气,便于农事。纪年用天干地支搭配,六十年周而复始。这种历法相传创始于夏代,所以又称为夏历。也叫旧历。
2.农业上使用的历书。

即夏历。(“农历”一称流行的原因:由于文化大革命时期极左思潮泛滥,“横扫四旧”,认为“夏历”是夏王朝的印记,必须改名;因传统历法在农村使用较普遍,故通过报纸改名“农历”:1968年元旦,全国报纸报头一夜间将“夏历”名称改成了“农历”。
按:所谓“农历”,是指它有指导农业生产的意义,但事实上农历月日与季节变化相差明显,指导农时的效果并不好,我国古代真正指导农时的是“二十四气”,它实际是一种特殊的“阳历” )

农历的历月长度是以朔望月为准的,大月30天,小月29天,大月和小月相互弥补,使历月的平均长度接近朔望月。

农历固定地把朔的时刻所在日子作为月的第一天——初一日。所谓“朔”,从天文学上讲,它有一个确定的时刻,也就是月亮黄经和太阳黄经相同的那一瞬间。(太阳和月亮黄经的计算十分繁琐和复杂,这里就不予介绍了)

至于定农历日历中月份名称的根据,则是由“中气”来决定的。即以含“雨水”的月份为一月;以含“春分”的月份为二月;以含“谷雨”的月份为三月;以含“小满”的月份为四月;以含“夏至”的月份为五月;以含“大暑”的月份为六月;以含“处暑”的月份为七月;以含“秋分”的月份为八月;以含“霜降”的月份为九月;以含“小雪”的月份为十月;以含“冬至”的月份为十一月;以含“大雪”的月份为十二月。(没有包含中气的月份作为上月的闰月)

农历的历年长度是以回归年为准的,但一个回归年比12个朔望月的日数多,而比13个朔望月短,古代天文学家在编制农历时,为使一个月中任何一天都含有月相的意义,即初一是无月的夜晚,十五左右都是圆月,就以朔望月为主,同时兼顾季节时令,采用十九年七闰的方法:在农历十九年中,有十二个平年,为一平年十二个月;有七个闰年,每一闰年十三个月。

为什么采取“十九年七闰”的方法呢? 一个朔望月平均是29.5306日,一个回归年有12.368个朔望月,0.368小数部分的渐进分数是1/2 、1/3 、3/8 、4/11 、7/19 、46/125, 即每二年加一个闰月,或每三年加一个闰月,或每八年加三个闰月……经过推算,十九年加七个闰月比较合适。因为十九个回归年=6939.6018日,而十九个农历年(加七个闰月后)共有235个朔望月,等于6939.6910日,这样二者就差不多了。

七个闰月安插到十九年当中,其安插方法可是有讲究的。农历闰月的安插,自古以来完全是人为的规定,历代对闰月的安插也不尽相同。秦代以前,曾把闰月放在一年的末尾,叫做“十三月”。汉初把闰月放在九月之后,叫做“后九月”。到了汉武帝太初元年,又把闰月分插在一年中的各月。以后又规定“不包含中气的月份作为前一个月的闰月”,直到现在仍沿用这个规定。

为什么有的月份会没有中气呢? 节气与节气或中气与中气相隔时间平均是30.4368日(即一回归年排65.2422日平分12等分),而一个朔望月平均是29.5306日,所以节气或中气在农历的月份中的日期逐月推移迟,到一定时候,中气不在月中,而移到月末,下一个中气移到另一个月的月初,这样中间这个月就没有中气,而只剩一个节气了。

上面讲过,古人在编制农历时,以十二个中气作为十二个月的标志,即雨水是正月的标志,春分是二月的标志,谷雨是三月的标志……把没有中气的月份作为闰月就使得历月名称与中气一一对应起来,从而保持了原有中气的标志。

从十九年七闰来说,在十九个回归年中有228个节气和228个中气, 而农历十九年有235个朔望月,显然有七个月没有节气和七个月没有中气,这样把没有中气的月份定为闰月,也就很自然了。

农历月的大小很不规则,有时连续两个、三个、四个大月或连续两个三个小月,历年的长短也不一样,而且差距很大。节气和中气,在农历里的分布日期很不稳定,而且日期变动的范围很大。这样看来,农历似乎显得十分复杂。其实。农历还是有一定循环规律的:由于十九个回归年的日数与十九个农历年的日数差不多相等,就使农历每隔十九年差不多是相同的。每隔十九年,农历相同月份的每月初一日的阳历日一般相同或者相差一、二天。每隔十九年,节气和中气日期大体上是重复的,个别的相差一、两天。相隔十九年闰月的月份重复或者相差一个月。

干支纪法

干支就字面意义来说,就相当于树干和枝叶。我国古代以天为主,以地为从,天和干相连叫天干,地和支相连叫地支,合起来叫天干地支,简称干支。

天干有十个,就是甲、乙、丙、丁、戊、己、庚、辛、壬、癸,地支有十二个,依次是子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥。古人把它们按照一定的顺序而不重复地搭配起来,从甲子到癸亥共六十对,叫做六十甲子。

我国古人用这六十对干支来表示年、月、日、时的序号,周而复始,不断循环,这就是干支纪法。

传说黄帝时代的大臣大挠“深五行之情,占年纲所建,于是作甲乙以名日,谓之干;作子丑以名日,谓之枝,干支相配以成六旬。”这只是一个传说,干支到底是谁最先创立的,现在还没有证实,不过在殷墟出土的甲骨文中,已有表示干支的象形文字,说明早在殷代已经使用干支纪法了。

‘叁’ c语言(turbo c2.0环境)编辑万年历如何用键盘翻页

kbhit() 检测是否有键盘输入
有 getch()一下 如果是上下键 就切换显示的位置
可以把gotoxy()函数封装一下

‘肆’ 用C语言怎么编写万年历

C语言编写万年历的源代码如下:

#include <stdio.h>

int week(int y,int m,int d);

int main()

{

char wk[7][3] = {{"天"},{"一"},{"二"},{"三"},{"四"},{"五"},{"六"}};

int year, month, day, w;

scanf("%d %d %d", &year, &month, &day);

w = week(year, month, day);

printf("%d年%d月%d日 星期%s", year, month, day, wk[w]);

}

int week(int y,int m,int d)

{

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

int c,w;

y %= 400;

if ((y==0||y%4==0&&y%100!=0)&&m<3)

c = 5;

else

c = 6;

w = (y+y/4-y/100+r[m]+d+c)%7;

return w;

}

(4)万年历c语言怎么改变位置扩展阅读

电子时钟C语言版的源代码如下:

#include<stdio.h>

#include<time.h>

#include<string.h>

int main()

{

char str[50];

time_t t;

struct tm *nt;

while(1)

{

system("cls");//清屏函数

t=time(NULL);

nt=localtime(&t);

strftime(str,50,"%Y-%m-%d %H:%M:%S “,nt);

printf("现在时刻:%s ",str);

}

getch();

return 0;

}

‘伍’ C语言万年历问题

main放最下面,这样调用函数在之前都声明过了,你形参的声明不对,最后还少个大括号

#include<dos.h>
#include<stdio.h>

int leap(int year) //修改
{
int leap=0;
if(year/100==0&&year/400==0) leap=1;
if(year/100&&year/4==0) leap=1;
return(leap);
}

int get_days(int year,int month,int date) //修改
{
int i;
int m[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int sum=0;
if(leap(year)) m[2]=29;
for(i=1;i<month;i++)
sum+=m[i];
sum+=date;
return(sum);
}

int get_week(int year,int month,int date) //修改
{
int week;
week=(year-1)+(year-1)/100-(year-1)/400+(year-1)/1000;
week+=get_days(year,month,date);
week%=7;
return(week);
}
int calendar(int year,int month) //修改
{
int i,j;
int line=13;
int m[]={0,31,28,31,30,31,30,31,31,30,31,30,31};

if(leap(year)) m[2]=29;
printf("%d.%d\n",year,month);
printf("**************************\n");
printf("sun mon tue wen thu fri sat\n");
for(j=1;j<=get_week(year,month,1)*4;j++)
printf(" ");
for(i=1;i<=m[month];i++)
{
printf("%d",i);
if(i>=10)
printf(" ");
else
printf(" ");
if(get_week(year,month,i)==6)
printf("\n");
}
printf("\n**************************\n"); } //修改
main()
{
int year,month;
printf("please input the year\n");
scanf("%d",&year);
printf("please input the month\n");
scanf("%d",&month);
calendar(year,month);
}

‘陆’ c语言编万年历

你出的题目是不是C++大作业?应该是300行以内就可以搞定的程序。不过在这写肯定是地方不够的。

给你一个我写的输入年份,输出十二个月的月历的程序,不过是在控制台下的。比较难懂的是其中WeekDay给定年月日给出当天的星期和当月天数这个函数,不过这是一个经典算法,你可以自己找找资料。

主要用的东西就是MFC中有关日期类、有关文本输出、有关键盘消息处理的知识,还是自己认真看看书搞一搞吧,呵呵。

===========我是分割线=============
#include <stdio.h>

void printClander(unsigned int _year, unsigned int _month);

unsigned char WeekTab[] = {//闰年月星期表
(3 << 5) + 31,//1月
(6 << 5) + 29,//2月
(0 << 5) + 31,//3月
(3 << 5) + 30,//4月
(5 << 5) + 31,//5月
(1 << 5) + 30,//6月
(3 << 5) + 31,//7月
(6 << 5) + 31,//8月
(1 << 5) + 30,//9月
(4 << 5) + 31,//10月
(0 << 5) + 30,//11月
(2 << 5) + 31 //12月
};

unsigned char WeekDay(unsigned char c, unsigned char y, unsigned char m,
unsigned char d)
{
unsigned char week, day;
c &= 0x03;//百年%4
c = c | (c << 2);//百年%4*5
day = WeekTab[m - 1];//月表
week = day >> 5;//月星期数
day &= 0x1f;//月天数
if ((m < 3) && !((c == 0) | (y & ((y & 0x03) == 0)))){//平年
if (m == 2) day--;//平年月天数
week++;//平年月表+1
}
y = y + (y >> 2);//年+年/4
week = (week + c + y + d + 2) % 7;//(星期=百年%4*5+年+年/4+月表+日+2)%7
return (week << 5) | day;//返回星期和月天数
}

int main()
{
int year = 0;
int month = 0;

printf("Which year to print?: ");
scanf("%d", &year);
if (year < 1 || year > 9999)
{
fprintf(stderr, "Error in year");
return 1;
}

/*1 for January, and so on*/
for (month = 1; month <= 12; ++month)
{
printClander(year, month);
printf("\n");
}

return 0;
}

void printClander(unsigned int _year, unsigned int _month)
{
unsigned char c, y, m, d;
unsigned char WDay, Week, Day;
c = ((_year / 100) & 0xff);
y = ((_year % 100) & 0xff);
m = _month & 0xff;
d = 0x01;
WDay = WeekDay(c, y, m, d);//取星期和月天数
Week = WDay >> 5;//得到星期
Day = WDay & 0x1f;//得到最大月天数

char *month_name[12] = {"Jan", "Feb", "Mar", "Apr",
"May", "Jun", "Jul", "Aug",
"Sept", "Oct", "Nov", "Dec"};

printf("%s\n", month_name[_month - 1]);
printf("SUN MON TUR WED THU FRI SAT\n");
int col = 0;
int day_print = 0;
for (col = 0; col < Week; ++col)
{
printf(" ");
}
for (day_print = 1; day_print <= Day; ++day_print)
{
printf("%-4d", day_print);
if (col == 6)
printf("\n-----------------------------\n");
col = (col + 1) % 7;
}
printf("\n");
}

‘柒’ 用C语言编写万年历系统

必须在TC2.0才可以使用
/*加载头文件*/
#include <stdio.h>
#include <bios.h>
#include <dos.h>
#include <conio.h>

/*定义常量*/
/*左移键*/
#define LEFT 0x4b00
/*右移键*/
#define RIGHT 0x4d00
/*下移键*/
#define DOWN 0x5000
/*上移键*/
#define UP 0x4800
/*向上翻页移键*/
#define PAGEUP 0x4900
/*向下翻页移键*/
#define PAGEDOWN 0x5100
/*小写字母q*/
#define QLOWER 0x1071
/*大写字母Q*/
#define QUPPER 0x1051
/*空格键*/
#define SPACE 0x3920
/*Escape键*/
#define ESC 0x011b

/*定义全局变量*/
struct date sysTime;
int currentYear;
int currentMonth;
int currentDay;
int n_currentMon;
int n_lastMon;

/*-----------自定义函数-------------------------*/
void checkDate();
int isLeapyear(int year);
int getWeek(int year,int month,int day);

void printSpace(int n);
void printSeparator();
void printUsage();
void printWeek();
void printWeek2(int week);

void showCalendar(int year,int month,int day);

void getKeyValue();
/*--------------------------------------------*/

/*检查日期有效性函数*/
void checkDate()
{
/*如果给定的日期中年份部分为负数或者0*/
if(currentYear<=0)
{
gotoxy(1,27);
printf("The year should be a positive number !\n");
gotoxy(1,28);
printf("Press any key to continue......");
getchar();
getchar();
/*以当前系统时间重新赋值*/
currentYear=sysTime.da_year;
currentMonth=sysTime.da_mon;
currentDay=sysTime.da_day ;
}

/*如果给定的日期中月份部分为负数,为0或者大于12*/
if(currentMonth>12||currentMonth<1)
{
gotoxy(1,27);
printf("The month should be a number between 1 and 12 !\n");
gotoxy(1,28);
printf("Press any key to continue......");
getchar();
getchar();
/*以当前系统时间重新赋值*/
currentYear=sysTime.da_year;
currentMonth=sysTime.da_mon;
currentDay=sysTime.da_day ;
}

/*如果给定的日期中天数部分为负数,为0或者大于31*/
if(currentDay>31||currentDay<1)
{
gotoxy(1,27);
printf("The day should be a number between 1 and 31 !\n");
gotoxy(1,28);
printf("Press any key to continue......");
getchar();
getchar();
/*以当前系统时间重新赋值*/
currentYear=sysTime.da_year;
currentMonth=sysTime.da_mon;
currentDay=sysTime.da_day ;
}
}

/*判断是否是闰年函数*/
int isLeapyear(int year)
{
/*闰年的判断:(1)year被4整除,并且year不被100整除
或(2)year被4整除,并且year被400整除*/
if(year%4==0&&year%100||year%400==0)
return 1 ;
else
return 0 ;
}

/*根据给定日期计算星期函数*/
int getWeek(int year,int month,int day)
{
int leapFlag;
int week;
int i ;
/*该数组用于保存每个月的天数*/
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int count=0 ;

/*判断给定年份是否是闰年*/
leapFlag=isLeapyear(year);
/*如果是闰年则2月份的日期应该29天*/
if(leapFlag==1)
a[2]++;
/*计算从给定年份的1月1日到给定月份的1号之间的天数*/

for(i=1;i<month;i++)
{
count+=a[i];
}
/*计算从给定年份的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(" ");
}

/*输出分隔线函数*/
void printSeparator()
{
int i ;
for(i=0;i<38;i++)
{
printf("=");
}
printf("\n");
}

/*输出使用方法函数*/
void printUsage()
{
gotoxy(45,3);
/*设定字体颜色*/
textcolor(YELLOW);
/*送格式化输出至屏幕*/
cprintf("-----------Usage-----------");

gotoxy(45,5);
textcolor(YELLOW);
cprintf("YEAR");
gotoxy(50,5);
printf(" Up key( ) to increase;\n");
gotoxy(50,7);
printf(" Down key( ) to decrease.\n");

gotoxy(45,9);
textcolor(YELLOW);
cprintf("MONTH:");
gotoxy(50,9);
printf(" Right key( ) to increase;\n");
gotoxy(50,11);
printf(" Left key( ) to decrease.\n");

gotoxy(45,13);
textcolor(YELLOW);
cprintf("DAY");
gotoxy(50,13);
printf(" PageDown key to increase;\n");
gotoxy(50,15);
printf(" PageUp key to decrease.\n" );

gotoxy(45,17);
textcolor(YELLOW);
cprintf("QUERY");
gotoxy(50,17);
printf(" Q/q key\n");

textcolor(YELLOW);
gotoxy(45,19);
cprintf("RESET");
gotoxy(50,19);
printf(" SPACE key.\n");

gotoxy(45,21);
textcolor(YELLOW);
cprintf("EXIT");
gotoxy(50,21);
printf(" Esc key\n");

gotoxy(59,5);
/*设置寄存器,表示在指定位置输出一次指定的字符*/
_CX=01;
_AH=0xa;
/*指定输出字符为向上的箭头*/
_AL=24;
/*产生一次中断,输出向上的箭头*/
geninterrupt(0x10);

gotoxy(61,7);
_CX=01;
_AH=0xa;
/*指定输出字符为向下的箭头*/
_AL=25;
geninterrupt(0x10);

gotoxy(62,9);
_CX=01;
_AH=0xa;
_AL=26;
/*指定输出字符为向右的箭头*/
geninterrupt(0x10);

gotoxy(61,11);
_CX=01;
_AH=0xa;
/*指定输出字符为向左的箭头*/
_AL=27;
geninterrupt(0x10);
/*还原字体颜色*/
textcolor(7);
}

/*根据系统日期输出星期函数*/
void printWeek()
{
int day ;
/*根据系统日期获得星期*/
day=getWeek(currentYear,currentMonth,currentDay);
textcolor(11);

/*输出星期,0表示星期天,1表示星期一......6表示星期六*/
if(day==0)
cprintf("%d-%d-%d,Sunday!",currentYear,currentMonth,currentDay);
if(day==1)
cprintf("%d-%d-%d,Monday!",currentYear,currentMonth,currentDay);
if(day==2)
cprintf("%d-%d-%d,Tuesday!",currentYear,currentMonth,currentDay);
if(day==3)
cprintf("%d-%d-%d,Wednesday!",currentYear,currentMonth,currentDay);
if(day==4)
cprintf("%d-%d-%d,Thursday!",currentYear,currentMonth,currentDay);
if(day==5)
cprintf("%d-%d-%d,Friday!",currentYear,currentMonth,currentDay);
if(day==6)
cprintf("%d-%d-%d,Saturday!",currentYear,currentMonth,currentDay);
textcolor(7);
}

/*输出指定星期函数*/
void printWeek2(int week)
{
if(week==0)
cprintf(",Sunday");
if(week==1)
cprintf(",Monday");
if(week==2)
cprintf(",Tuesday");
if(week==3)
cprintf(",Wendesday");
if(week==4)
cprintf(",Thursday");
if(week==5)
cprintf(",Friday");
if(week==6)
cprintf(",Staturday");
}

/*显示日历函数*/
void showCalendar(int year,int month,int day)
{
int i;
int j;
/*输出的日期*/
int outDay;
int leapFlag;
/*本月第一个星期中,在上月的天数*/
int dayLastMon;
int week;
/*该数组用于保存每个月的天数*/
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
outDay=0;
dayLastMon=0;
week=0;

/*判断给定年份是否是闰年*/
leapFlag=isLeapyear(year);
/*如果是闰年则2月应该是29天*/
if(leapFlag==1)
{
a[2]++;
}

/*如果给定的日期中,天数大于该月的最大天数*/
if(day>a[month])
{
printf("The number of this month's day is %d at most !\n",a[month]);
printf("Press any key to continue......\n");
getchar();
getchar();
/*以当前系统时间重新赋值*/
year=sysTime.da_year;
month=sysTime.da_mon;
day=sysTime.da_day ;
currentYear=sysTime.da_year;
currentMonth=sysTime.da_mon;
currentDay=sysTime.da_day ;
}

/*当前月的天数*/
n_currentMon=a[month];
/*上一月的天数*/
n_lastMon=a[month-1];
/*根据给定日期,获取给定月份1号的星期*/
week=dayLastMon=getWeek(year,month,1);

/*清除文本模式窗口*/
clrscr();
printf("\nThe calendar of %d",year);
textcolor(10);

/*显示给定年份是否是闰年*/
if(leapFlag==1)
cprintf(" [leap year]",year);
if(leapFlag==0)
cprintf(" [not leap year]",year);
printf("\n");
textcolor(7);
printSeparator();
textcolor(YELLOW);

/*输出月份提示,1-12分别表示1月到12月*/
switch(month)
{
case 1 :
cprintf(" January 1 ");
break ;
case 2 :
cprintf(" February 2 ");
break ;
case 3 :
cprintf(" March 3 ");
break ;
case 4 :
cprintf(" April 4 ");
break ;
case 5 :
cprintf(" May 5 ");
break ;
case 6 :
cprintf(" June 6 ");
break ;
case 7 :
cprintf(" July 7 ");
break ;
case 8 :
cprintf(" August 8 ");
break ;
case 9 :
cprintf(" September 9 ");
break ;
case 10 :
cprintf(" October 10 ");
break ;
case 11 :
cprintf(" Nevember 11 ");
break ;
case 12 :
cprintf(" December 12");
break ;
}
textcolor(7);
printf("\n\n");
textcolor(13);
cprintf(" Sun Mon Tue Wed Thu Fri Sat");
textcolor(7);
printf("\n\n");

/*因为一个月中最多跨度6个星期,所以循环从0到5*/
for(i=0;i<6;i++)
{
/*如果是该月的第一个星期*/
if(i==0)
{
/*第一个星期中还要7-dayLastMon天本月,有dayLastMon天在上个月,
所以输出dayLastMon*4个空格符,每个日期在日历中占用4个空格*/
printSpace(dayLastMon*4);
/*剩余在本月的第一个星期中的天数为7-dayLastMon*/
for(j=0;j<7-dayLastMon;j++)
{
/*到达day的前一天时,输出++outDay*/
if(outDay==day-1)
{
/*用黄色字体突出显示*/
textcolor(YELLOW);
cprintf(" [%d]",++outDay);
textcolor(7);
}
/*到达day当天时,并且不是星期天*/
else if(outDay==day && week!=0)
{
printf("%3d",++outDay);
}
/*到达day当天时,并且是星期天*/
else
{
printf("%4d",++outDay);
}
/*计算当天的星期,如果前一天是星期六(6),则当天是星期天(0),
其他情况则直接星期加1*/
week=(week<6)?week+1:0;
}
printf("\n\n");
}

/*如果不是该月的第一个星期*/
else
{
/*则输出该星期中的7天*/
for(j=0;j<7;j++)
{
/*输出的天数小于该月的最大天数*/
if(outDay<a[month])
{
/*到达day的前一天时,输出++outDay*/
if(outDay==day-1)
{
/*输出一位数字*/
if(outDay<9)
{
textcolor(YELLOW);
cprintf(" [%d]",++outDay);
textcolor(7);
}
/*输出两位数字*/
else
{
textcolor(YELLOW);
cprintf(" [%2d]",++outDay);
textcolor(7);
}
}
/*到达day当天时,并且不是星期天*/
else if(outDay==day && week!=0)
{
printf("%3d",++outDay);
}
/*到达day当天时,并且是星期天*/
else
{
printf("%4d",++outDay);
}
}
/*计算当天星期*/
week=(week<6)?week+1:0;
}
printf("\n\n");
if(outDay==a[month])break ;
}
}
/*输出分隔线*/
printSeparator();

/*输出当前选择的日期和星期*/
printf("The day you choose is:\n\n");
printWeek();
gotoxy(1,22);
textcolor(10);
cprintf("--------------------\n");
textcolor(7);

/*输出系统日期和星期*/
printf("\nToday is: %d-%d-%d",sysTime.da_year,sysTime.da_mon,sysTime.da_day);
printWeek2(getWeek(sysTime.da_year,sysTime.da_mon,sysTime.da_day));
printf("\n\n");
/*显示按键操作*/
printUsage();
gotoxy(1,25);
}

/*通过键盘调整日期函数*/
void getKeyValue()
{
int key ;
char ch;
/*默认显示当前系统日期和星期*/
currentYear=sysTime.da_year;
currentMonth=sysTime.da_mon;
currentDay=sysTime.da_day ;
showCalendar(currentYear,currentMonth,currentDay);

while(1)
{
/*获取键值,根据键值调整日历输出*/
key=bioskey(0);
/*右移键,增加月份*/
if(key==RIGHT)
{
/*月份值在1-12之间,则直接加1*/
if(currentMonth<12 && currentMonth>=1)
{
currentMonth++;
}
/*如果月份为12,则加1后进位,即年份加1,月份变为1*/
else
{
currentYear++;
currentMonth=1 ;
}
}
/*左移键,减少月份*/
if(key==LEFT)
{
/*月份值在1-12之间,则直接减1*/
if(currentMonth<=12 && currentMonth>1)
{
currentMonth--;
}
/*如果月份为1,则减1后,到上一年,月份变为12*/
else
{
currentYear--;
currentMonth=12 ;
}
}
/*上移键,增加年份*/
if(key==UP)
{
currentYear++;
}
/*下移键,减少年份*/
if(key==DOWN)
{
currentYear--;
}
/*上移键,减少天数*/
if(key==PAGEUP)
{
/*当前日不是该月的第一天,则天数直接减1*/
if(currentDay!=1)
{
currentDay--;
}
/*当前日是该月的第一天,并且是该年的第一个月(即1月1日),
则天数减1后,变为上一年的最后一个月的最后一天(即12月31日)*/
else if(currentDay==1 && currentMonth==1)
{
currentYear--;
currentMonth=12 ;
currentDay=31 ;
}
/*当前日是该年中某一个月的最后一天,则天数减1后,
变为上个月的最后一天*/
else
{
currentMonth--;
currentDay=n_lastMon ;
}
}
/*下移键,增加天数*/
if(key==PAGEDOWN)
{
/*当前日不是该月的最后一天,则天数直接加1*/
if(n_currentMon!=currentDay)
{
currentDay++;
}
/*当前日是该年的最后一天(即12月31日),则天数加1后,
变为下一年的第一个月的第一天(即1月1日)*/
else if(n_currentMon==currentDay && currentMonth==12)
{
currentYear++;
currentMonth=1 ;
currentDay=1 ;
}
/*当前日是该年中某一个月的最后一天,则天数加1后,
变为下个月的第一天*/
else
{
currentMonth++;
currentDay=1 ;
}
}
/*Q或者q键,表示查询指定日期的星期*/
if(key==QLOWER||key==QUPPER)
{

{
printf("Input date(eg,%d-%d-%d):",sysTime.da_year,sysTime.da_mon,sysTime.da_day);
scanf("%d-%d-%d",¤tYear,¤tMonth,¤tDay);
checkDate();
}
}
/*空格键,重置到系统日期*/
if(key==SPACE)
{
currentYear=sysTime.da_year;
currentMonth=sysTime.da_mon;
currentDay=sysTime.da_day ;
}
/*Escpe键退出系统*/
if(key==ESC)
{
printf("Do you really want to quit?(Y/N)");
ch=getchar();
if(ch=='y'||ch=='Y')
break ;
}
showCalendar(currentYear,currentMonth,currentDay);
}
}

/*主函数*/
void main()
{
/*清除文本模式窗口*/
clrscr();
/*设置屏幕显示方式*/
_AL=03;
_AH=0;
geninterrupt(0x10);
getdate(&sysTime);
getKeyValue();
}

‘捌’ 求C语言程序(万年历)讲解

你的代码一共有如下几个问题:
1.
你使用scanf("%c",&a)来接收用户输入的一个字符时,会将回车符也接收下来。C语言在处理时,会将用户输入放在键盘缓冲区,使用scanf来接收%c时,编译器从键盘缓冲区读取一个char字符,但是并不清空后面的字符,所以导致下一次scanf("%c",&a)时,将剩下的回车符先给读进来,并进行处理了。
要解决这个问题,可以使用getch()或者getche()函数。
但是:
getch()接口,接收字符后不会将字符回显到显示器,所以用户看不到自己输入的字符。
而getche()接口就没有这个问题,所以应该使用getche()。
2.
循环计数错误,多循环一次。
这个你仔细推算一下就出来了。
一般解决这种问题的话,使用do/while循环较多,因为do/while循环可读性好一些。
以下是改过以后的代码,已经编译运行确认:
#include
<stdio.h>
#include
<conio.h>
main()
{
char
a;
int
i=3;
a=getche();//这里使用getche()来接收用户输入,既可以回显,也不会接收回车
do
{
i--;//将i--放在这里,防止出现可以输入4次的情况
if(a!='b'&&i>0)
{
printf("错误\n");
a=getche();//这里使用getche()来接收用户输入,既可以回显,也不会接收回车
}
else
break;
}while(1);
if(a=='b')
{
printf("正确");
}
else
getch();
}