當前位置:首頁 » 編程語言 » 萬年歷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();
}