用C语言怎么编写万年历

如题所述

1、首先下载安装Notepad++,这是一款免费的且能够编辑C语言的软件。

2、然后下载安装tdm-gcc,这是为了给电脑配置环境变量,以便能够编译C语言的。

3、在安装完以上两款软件后,还要配置一下环境变量。

4、然后开始编辑C语言万年历,首先要判断一个年份是闰年还是平年,用一个子程序来做:

5、然后就开始写主程序:首先用scanf得到一个年份,在判断这个年份是平年还是闰年后用printf在CMD中打出来。

6、在编写完成后,在Notepad++界面下按下F5,在输入框中输入:

cmd /k gcc -o "$(CURRENT_DIRECTORY)\$(NAME_PART).exe" "$(FULL_CURRENT_PATH)" && CLS && "$(CURRENT_DIRECTORY)\$(NAME_PART).exe" & PAUSE & EXIT

7、最后点击运行,会弹出CMD,在里面输入年份后回车:例如输入2017,然后回车,就会生成2017年的万年历了!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-12-10

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;

}

扩展资料

电子时钟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\n",str);

}

getch();

return 0;

}

本回答被网友采纳
第2个回答  推荐于2017-09-04

/*C语言编写万年历问题

这篇文章主要介绍了C语言实现的一个万年历小程序,相对简单,做C语言日期计算的朋友可以参考下

该程序简单地输入一个年份(1901年之后的年份),随后程序输出该年份十二个月的日历。*/




#define Mon   1 
#define Tues  2 
#define Wed   3 
#define Thur  4 
#define Fri   5 
#define Sat   6 
#define Sun   0 
  
#define January_days   31 
#define February_days   28 
#define March_days    31 
#define April_days    30 
#define May_days     31 
#define June_days     30 
#define July_days     31 
#define August_days    31 
#define September_days  30 
#define October_days   31 
#define November_days   30 
#define December_days   31 
  
#define first1month January_days 
#define first2month January_days+February_days 
#define first3month January_days+February_days+March_days 
#define first4month January_days+February_days+March_days+April_days 
#define first5month January_days+February_days+March_days+April_days+May_days 
#define first6month January_days+February_days+March_days+April_days+May_days+June_days 
#define first7month January_days+February_days+March_days+April_days+May_days+June_days \ 
             +July_days 
#define first8month January_days+February_days+March_days+April_days+May_days+June_days \ 
             +July_days+August_days 
#define first9month January_days+February_days+March_days+April_days+May_days+June_days \ 
             +July_days+August_days+September_days 
#define first10month January_days+February_days+March_days+April_days+May_days+June_days \ 
             +July_days+August_days+September_days+October_days 
#define first11month January_days+February_days+March_days+April_days+May_days+June_days \ 
             +July_days+August_days+September_days+October_days+November_days 
  
int known_weekday = Tues; 
int known_year = 1901; 
int konwn_month = 1; 
int known_day = 1; 
  
int day_count(int month) 
{    
    switch(month) 
    { 
        case 1: return 0;break; 
        case 2: return first1month;break; 
        case 3: return first2month;break; 
        case 4: return first3month;break; 
        case 5: return first4month;break; 
        case 6: return first5month;break; 
        case 7: return first6month;break; 
        case 8: return first7month;break; 
        case 9: return first8month;break; 
        case 10: return first9month;break; 
        case 11: return first10month;break; 
        case 12: return first11month;break; 
    } 

  
  
/*char * month_name(int month) 

    switch(month) 
    { 
        case 1: 
            return "January"; 
            break; 
        case 2: 
            return "February"; 
            break; 
        case 3: 
            return "March"; 
            break; 
        case 4: 
            return "April"; 
            break; 
        case 5: 
            return "May"; 
            break; 
        case 6: 
            return "June"; 
            break; 
        case 7: 
            return "July"; 
            break; 
        case 8: 
            return "August"; 
            break; 
        case 9: 
            return "September"; 
            break; 
        case 10: 
            return "October"; 
            break; 
        case 11: 
            return "November"; 
            break; 
        case 12: 
            return "December"; 
            break; 
        default: 
            break; 
    } 
}*/
  
char * month_name(int month) 

    switch(month) 
    { 
        case 1: 
            return "一月"; 
            break; 
        case 2: 
            return "二月"; 
            break; 
        case 3: 
            return "三月"; 
            break; 
        case 4: 
            return "四月"; 
            break; 
        case 5: 
            return "五月"; 
            break; 
        case 6: 
            return "六月"; 
            break; 
        case 7: 
            return "七月"; 
            break; 
        case 8: 
            return "八月"; 
            break; 
        case 9: 
            return "九月"; 
            break; 
        case 10: 
            return "十月"; 
            break; 
        case 11: 
            return "十一月"; 
            break; 
        case 12: 
            return "十二月"; 
            break; 
        default: 
            break; 
    } 

  
/*按格式打印某年某月名称*/
void first_line_print(int month, int year) 

    //printf("%20s %d \n",month_name(month),year); 
    printf("%8d年 %s \n",year, month_name(month)); 

  
/*按格式打印星期名称*/
void week_print() 

    //printf("%-6s%-6s%-6s%-6s%-6s%-6s%-6s\n","Sun.", "Mon.", "Tues.", "Wed.", "Thur.", "Fri.", "Sat."); 
    printf("%-3s%-3s%-3s%-3s%-3s%-3s%-3s\n","日", "一", "二", "三", "四", "五", "六"); 

  
/*计算该年该月份与已知日子之间的距离天数*/
int date_distance_count(int month, int year) 

    int leap_year_count = 0; 
    int i; 
    int distance; 
  
    if (year > known_year) 
    { 
        for (i=known_year; i<year; i++) 
        { 
            if(((i%4 == 0) && (i%100 != 0) ) || (i%400 == 0)) 
            { 
                leap_year_count++;       
            } 
        } 
  
        if (month > 2) 
        { 
            if(((year%4 == 0) && (year%100 != 0) ) || (year%400 == 0)) 
            { 
                leap_year_count++;       
            } 
        } 
    } 
    else
    if (year == known_year) 
    { 
        if (month > 2) 
        { 
            leap_year_count = 1; 
        } 
    } 
      
  
    distance = (year - known_year)*365 + leap_year_count + day_count(month); 
  
    return distance;     

  
/*确定该月份第一天是星期几*/
int makesure_firstday_weekday(int month, int year) 

    int date_distance = 0; 
    int weekday; 
  
    date_distance = date_distance_count(month, year); 
    weekday = (known_weekday + date_distance)%7; 
  
    return weekday;  

  
/*依次打印出该月份的日子*/
void print_in_turn(int month, int firstday, int year) 

    int i = 1; 
    int weekday; 
  
    switch(firstday) 
    { 
        case Sun: 
            break; 
        case Mon: 
            printf("%-3s",""); 
            break; 
        case Tues: 
            printf("%-6s",""); 
            break; 
        case Wed: 
            printf("%-9s",""); 
            break; 
        case Thur: 
            printf("%-12s",""); 
            break; 
        case Fri: 
            printf("%-15s",""); 
            break; 
        case Sat: 
            printf("%-18s",""); 
            break; 
    } 
  
    switch(month) 
    { 
        case 1: 
        case 3: 
        case 5: 
        case 7: 
        case 8: 
        case 10: 
        case 12: 
        { 
            for(i=0; i<31; i++) 
            { 
                weekday = (firstday + i)%7; 
                printf("%-3d",i+1); 
                  
                if(weekday == Sat) 
                { 
                    printf("\n"); 
                }                    
            } 
            break; 
        } 
        case 2: 
        { 
            if(((year%4 == 0) && (year%100 != 0) ) || (year%400 == 0)) /*闰年*/
            { 
                for(i=0; i<29; i++) 
                { 
                    weekday = (firstday + i)%7; 
                    printf("%-3d",i+1); 
                      
                    if(weekday == Sat) 
                    { 
                        printf("\n"); 
                    }                    
                } 
                break; 
            } 
            else /*平年*/
            { 
                for(i=0; i<28; i++) 
                { 
                    weekday = (firstday + i)%7; 
                    printf("%-3d",i+1); 
                      
                    if(weekday == Sat) 
                    { 
                        printf("\n"); 
                    }                    
                } 
                break; 
            } 
          
        } 
        case 4: 
        case 6: 
        case 9: 
        case 11: 
        { 
            for(i=0; i<30; i++) 
            { 
                weekday = (firstday + i)%7;/*计算该天是星期几*/
                printf("%-3d",i+1); 
                  
                if(weekday == Sat) 
                { 
                    printf("\n");/*如果是星期六,则换行*/
                }                    
            } 
            break; 
        }            
    } 

  
void date_print(int month, int year) 

    int firstday; 
  
    firstday = makesure_firstday_weekday(month, year); 
    print_in_turn(month, firstday, year); 
    printf("\n"); 

  
void main_month(int month, int year) 

    first_line_print(month, year); 
    week_print(); 
    date_print(month, year); 
    printf("\n\n"); 

  
void main_calendar(int year) 

    int i; 
    for(i=1; i<=12; i++) 
    { 
        main_month(i, year); 
    } 

  
int main() 

    int year; 
  
    printf("请输入年份:year = "); 
    scanf("%d",&year); 
    printf("\n"); 
  
    while(year < 1902) 
    { 
        printf("请输入大于1901的年份\n"); 
  
        printf("请输入年份:year = "); 
        scanf("%d",&year); 
        printf("\n"); 
    } 
      
    main_calendar(year); 
      
    scanf(" "); 
    return 0; 
}

第3个回答  2020-06-10
农历,大月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个朔望月,显然有七个月没有节气和七个月没有中气,这样把没有中气的月份定为闰月,也就很自然了。
农历月的大小很不规则,有时连续两个、三个、四个大月或连续两个三个小月,历年的长短也不一样,而且差距很大。节气和中气,在农历里的分布日期很不稳定,而且日期变动的范围很大。这样看来,农历似乎显得十分复杂。其实。农历还是有一定循环规律的:由于十九个回归年的日数与十九个农历年的日数差不多相等,就使农历每隔十九年差不多是相同的。每隔十九年,农历相同月份的每月初一日的阳历日一般相同或者相差一、二天。每隔十九年,节气和中气日期大体上是重复的,个别的相差一、两天。相隔十九年闰月的月份重复或者相差一个月。
干支纪法
干支就字面意义来说,就相当于树干和枝叶。我国古代以天为主,以地为从,天和干相连叫天干,地和支相连叫地支,合起来叫天干地支,简称干支。
天干有十个,就是甲、乙、丙、丁、戊、己、庚、辛、壬、癸,地支有十二个,依次是子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥。古人把它们按照一定的顺序而不重复地搭配起来,从甲子到癸亥共六十对,叫做六十甲子。
我国古人用这六十对干支来表示年、月、日、时的序号,周而复始,不断循环,这就是干支纪法。
传说黄帝时代的大臣大挠“深五行之情,占年纲所建,于是作甲乙以名日,谓之干;作子丑以名日,谓之枝,干支相配以成六旬。”这只是一个传说,干支到底是谁最先创立的,现在还没有证实,不过在殷墟出土的甲骨文中,已有表示干支的象形文字,说明早在殷代已经使用干支纪法了。
第4个回答  推荐于2017-09-24
哈哈,我编的第一个正经的程序就是这个程序了!
我自己编出来的,超爽啊!
#include <stdio.h>
int leap (int year)
{if(year%4==0&&year%100!=0||year%400==0)
return 1;
else return 0;
}
int days_month (int month,int year)
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
return 31;
if(month==4||month==6||month==9||month==11)
return 30;
if(month==2&&leap(year)==1) return 29;
else return 28;
}
int firstday(int month,int year)
{int w;
w=(1+2*month+3*(month+1)/5+year+year/4+year/400-year/100)%7+1;
return w;
}
main()
{int i,j=1,k=1,a,b,month,year;
printf("\n input month and year:\n");
scanf("%d%d",&month,&year);
b=days_month(month,year);
a=firstday (month,year);
printf(" Sun Mon Tue Wed Thu Fri Sat \n");
if(a==7)
{for(i=1;i<=b;i++)
{printf("%4d",i);
if(i%7==0)
{printf("\n");
}
}
}
if(a!=7)
{while (j<=4*a)
{printf(" ");
j++;
}
for(i=1;i<=b;i++)
{printf("%4d",i);
if(i==7*k-a)
{printf("\n");
k++;
}
}
}
getch();本回答被提问者采纳
相似回答