实用有趣的C语言程序(txt+pdf+epub+mobi电子书下载)


发布时间:2021-04-23 12:27:30

点击下载

作者:杜树春,文怡,王芳

出版社:清华大学出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

实用有趣的C语言程序

实用有趣的C语言程序试读:

前言

C语言是国内外广泛使用的一种计算机语言。C语言具有简洁、实用、代码质量高、可移植性强等优点,它同时具有高级语言和低级语言的特点,因此目前C语言已成为学习和使用人数最多的一种计算机语言。本书不是一本介绍如何使用C语言的书,而是一本实用、有趣的C语言程序集。

本书具有以下特点:①内容涉及面广,既包括初等数学方面的内容,也有高等数学方面的内容,还兼有其他的内容。②实例的选取兼顾了趣味性和实用性。③对于每一个C语言应用实例,本书都是先分析问题,提出大致思路,再给出解决此问题的完整的C语言程序清单,最后给出程序运行结果。

全书共分9章。第1章日历和日期,内容是根据日期求星期,求两个日期之间的天数,编写并打印出任一年的日历,以及农历和公历之间的相互转换等。第2章大数计算,这里的大数是指用普通计算器,包括计算机和手机上的计算器都无法正确计算出来的数。大数计算包括大数的加、减、乘、除、乘方、开平方、阶乘、排列和组合。第3章涉及极限、级数和圆周率等,用程序实现数列极限和函数极限的计N算或验证;用程序实现级数前项和的计算;以及用程序求出圆周率的精确值。第4章复数的运算,复数运算包括复数代数式与极坐标式N的相互转换、复数求倒数、乘、除、乘方、开方、开次方根、指数、对数、正弦、余弦等运算。第5章矩阵计算,包括求行列式的值、矩阵转置、矩阵相乘和矩阵求逆。第6章求解多元一次方程组,包括N解二元、三元、四元、五元、六元一次方程组。第7章求解一元次方程(上),包括用公式法解一元二次、一元三次、一元四次方程。第N8章求解一元次方程(下),包括用迭代法解一元五次、一元六次、一元七次和一元八次方程。第9章包括了没归类到前8章的其他若干程序。最后是介绍Visual C++ 6.0上机操作的附录。

本书提供的电子资料包的内容,仍是以书中章节为单位。在每一N章(指第1章到第9章)下,都有一个章文件夹,每章下面有[例.1],NNN[例.2],…,[例.]的例文件夹,例文件夹内是这个例子的名称,打开名称文件夹,又有多个文件。其中,扩展名为DSW的文件是Visual C++6.0的工程文件;扩展名为c的文件是Visual C++6.0的源文件。在VisualC++6.0软件已安装在电脑中的前提下,双击具有DSW扩展名的文件就可进入Visual C++6.0软件集成环境,也就是Visual C++6.0的编辑、编译、连接、调试、运行环境。书中的所有例子都已在Visual C++6.0环境下调试通过,读者既可以原封不动地运行书中实例,也可以改变输入参数运行,还可以修改程序(包括少量改动和大刀阔斧的改动)运行。

本书所用C语言编译集成环境是Visual C++6.0,这个软件既可以用来编译、运行C++语言程序,也可以用来编译、运行C语言程序。本书所有例子都已在Visual C++6.0下通过调试。对于初次接触C语言的人,在读本书正文之前,可以先看一下介绍Visual C++6.0用法的附录。

本书的另一特点是实践性强。书中每一个实例,读者无须重新输入程序,无须重新建立项目工程,只需用鼠标双击一下,程序就可以运行。本书既适合初学者,也适合有一定编程基础的爱好者及专业技术人员。

本书适合以下人员阅读或参考:一是学习C语言课程的大、中专及高等职业学校、中等职业学校的在校学生;二是使用C语言的广大工程技术人员;三是C语言编程的初学者;四是广大程序设计爱好者和C语言编程爱好者。

由于编著者水平有限且时间仓促,书中难免存在不足,恳请读者批评指正。作者的电子邮箱为dushuchun@263.net。

本书电子资料包请扫描二维码下载。编著者2016年12月第1章日历和日期公历是全世界通用的历法,以地球绕太阳的一周为一年,一年365天,分为12个月,1月、3月、5月、7月、8月、10月和12月为31天,2月为28天,其余月份为30天。事实上地球绕太阳一周共365天5小时48分46秒,比公历一年多出5小时48分46秒。为使年误差不累积,公历年用闰年法来消除年误差,由于每年多出5小时48分46秒,每4年累计多出23小时15分4秒,接近1天。天文学家就规定每4年有一个闰年,把2月由28天改为29天,凡是公历年能被4整除的那一年就是闰年,但是这样一来每4年又少了44分56秒。为了更准确地计时,天文学家又规定凡能被100整除的年份,只有能被400整除才是闰年,即每400年要减掉3个闰年(例如,1700年、1800年和1900年不是闰年,2000年才是闰年),经过这样处理后,实际上每400年的误差只有2小时53分20秒,已相当准确了。根据以上情况,某一年是否为闰年应按以下规则计算:闰年应能被4整除(如2016年是闰年,2015年不是闰年),但不是所有能被4整除的年份都是闰年。在能被100整除的年份中,只有同时能被400整除的年份才是闰年(如2000年是闰年),能被100整除而不能被400整除的年份(如1800年、1900年,2100年)不是闰年。农历与公历不同,农历把月亮绕地球一周作为一月,一年12个月,总共354天或355天。而天气的冷热变化一次是365天,它和回归年(公历年)一致。这样农历和公历一年要相差11天或10天,3年就是1个月多。为使农历能适应天气冷热变化的周期,就在第3年加上1个月,这一年就有13个月,加上的这个月叫“闰月”,1年就是384或385天了。“闰月”也分为大月和小月,闰大月30天,闰小月29天。可以在任何一个月闰,既可闰大月,也可闰小月。农历采用19年加7个闰月的办法,即“十九年七闰法”,把回归年与农历年很好地协调起来。农历是中国传统文化的代表之一,并与农业生产联系密切,中国人民特别是广大农民十分熟悉并喜爱农历。公历与农历是我国目前并存的两种历法,各有其固有的规律,农历与月球的运行相对应,其影响因素多。它的大小月和闰月与天体运行有关计算十分复杂,且每年都不一致。因此要用计算机或单片机实现公历与农历的转换,用查表法是最方便实用的办法。1.1给出年月日,计算该日是星期几1.编程说明

根据历法原理,按照下面的公式计算,就可以知道某年某月某日是星期几了。这个公式是:xC这里,是公元的年数,是从这一年的元旦算到这天为止(连这一天也在内)的日数。式中,表示为的整数部分,也就是说,三S个分数式只取商数的整数部分,余数略去不计。求出后,再用7除。如果恰能除尽,这一天一定是星期日;若余数是1,这一天是星期一;余数是2,这一天就是星期二。以此类推。程序中,占大部分篇幅的CC程序是在计算,算之前,还有判断所求年份是否是闰年,这样决定2月份是28天还是29天。

例如,要求算2016年的1月2日是星期几。

而2505%7=357余6,这说明2016年的1月2日是星期六。2.程序清单 /*************************************************************/ /*1.c 给出年月日,计算该日是星期几 */ /*************************************************************/ #include main() { int a,b,c,d,s,z; printf("请输入年月日yyyy,mm,dd: "); scanf("%d,%d,%d",&a,&b,&c); if((a%4==0 && a%100!=0)||(a%400==0)) { if(b==1)d=c; if(b==2)d=c+31; if(b==3)d=c+60; if(b==4)d=c+91; if(b==5)d=c+121; if(b==6)d=c+152; if(b==7)d=c+182; if(b==8)d=c+213; if(b==9)d=c+244; if(b==10)d=c+274; if(b==11)d=c+305; if(b==12)d=c+335; } else{if(b==1)d=c; if(b==2)d=c+31; if(b==3)d=c+59; if(b==4)d=c+90; if(b==5)d=c+120; if(b==6)d=c+151; if(b==7)d=c+181; if(b==8)d=c+212; if(b==9)d=c+243; if(b==10)d=c+273; if(b==11)d=c+304; if(b==12)d=c+334; } s=a-1+(a-1)/4-(a-1)/100+(a-1)/400+d; z=s%7; if(z==0)printf("这一天为星期天。\n"); if(z==1)printf("这一天为星期一。\n"); if(z==2)printf("这一天为星期二。\n"); if(z==3)printf("这一天为星期三。\n"); if(z==4)printf("这一天为星期四。\n"); if(z==5)printf("这一天为星期五。\n"); if(z==6)printf("这一天为星期六。\n"); }3.程序运行【例1.1】给出年月日,计算该日是星期几。

解:打开“给出年月日,计算该日是星期几?”文件夹,双击扩展名为DSW的文件,进入Visual C++ 6.0编译环境,编译程序并执行,根据屏幕提示,输入年月日,运行结果如下:

由运行结果可见,当你输入2016年5月18日时,程序告诉你这一天是星期三。1.2给出年份,计算该年元旦那天是星期几1.编程说明as

根据历法原理,设年元旦是星期(取值为0~6,其中0为星期s日),整数的计算公式是:a这里,是公元的年数,表示为的整数部分,也就是说,三个分数式只取商数的整数部分,余数略去不计。求出小括号内的数值后,s再用7除,所得结果就是。如果恰能除尽,这一天一定是星期日;若余数是1,这一天是星期一;余数是2,这一天就是星期二;以此类推。例如,要求算2015年的元旦(1月1日)是星期几。

而2503%7=357余4,这说明2015年的1月1日是星期四。2.程序清单 /*****************************************************/ /* 1.c 给出年份,计算该年元日是星期几? */ /*****************************************************/ #include main() { int a,s,z; printf("请输入年份yyyy:"); scanf("%d",&a); s=a+(a-1)/4-(a-1)/100+(a-1)/400; z=s%7; if(z==0)printf("元旦这一天为星期天。\n"); if(z==1)printf("元旦这一天为星期一。\n"); if(z==2)printf("元旦这一天为星期二。\n"); if(z==3)printf("元旦这一天为星期三。\n"); if(z==4)printf("元旦这一天为星期四。\n"); if(z==5)printf("元旦这一天为星期五。\n"); if(z==6)printf("元旦这一天为星期六。\n"); }3.程序运行【例1.2】给出年份,计算该年元旦那天是星期几。

解:打开“给出年份,计算该年元旦那天是星期几?”文件夹,双击扩展名为DSW的文件,进入Visual C++ 6.00编译环境,编译程序并执行,根据屏幕提示,输入年份,运行结果如下:

由运行结果可见,当你输入2016年时,程序告诉你2016年的元旦这一天是星期五。1.3计算某年某月某日是本年度第几天1.编程说明

在公历的一年中,除2月份以外,每月的天数都是固定的。已知某年某月某日,计算该日子是本年度的第几天,首先判断该年份是否为闰年,求出2月份是28天还是29天;再把已过月份每个月的日子加起来,最后加当月的日期数。sum_day计算输入日期的天数,leap函数返回是否是闰年的信息。2.程序清单 /**********************************************************/ /* 1.c 给出年月日,计算该日是该年第几天? */ /**********************************************************/ #include void main() { int sum_day(int,int); int leap(int year); int year,month,day,days; printf("\n"); printf("请输入所求日期(年(4位),月(2位),日(2位)):"); scanf("%d,%d,%d",&year,&month,&day); printf("%d,%d,%d",year,month,day); days=sum_day(month,day); if(leap(year)&& month>=3) days=days+1; printf("是本年第%d天。\n",days); } int sum_day(int month,int day) { int day_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int i; for(i=1;i<=month-1;i++) day+=day_tab[i]; return(day); } int leap(int year) { int leap; leap=year%4==0 && year%100!=0||year%400==0; return(leap); }3.程序运行【例1.3】给出年月日,计算该日是该年第几天。

解:打开“给出年月日,计算该日是该年第几天”文件夹,双击扩展名为DSW的文件,进入Visual C++ 6.0编译环境,编译程序并执行之,根据屏幕提示,输入年月日,运行结果如下:

由运行结果可见,2016年5月18日是2016年的第139天。1.4求指定日期距离1990年1月1日的天数1.编程说明

已知某年某月某日,计算该日子距离1990年1月1日的天数,由两部分组成,一是已知年到1990年是几年并算出这些年的天数之和,二是算出已知月已知日距当年1月1日的天数,这两部分天数之和即为所求。2.程序清单 /*****************************************************************/ /*1.c指定年月日求距离1990年1月1日的天数及小时数*/ /*****************************************************************/ #include typedef struct date{ int year; int month; int day; }DATE; int countday(DATE); int runyear(int); void main() { DATE today; int totalday; printf("请输入指定年月日(yyyy,mm,dd):"); scanf("%d,%d,%d",&today.year,&today.month,&today.day); totalday=countday(today)-1; printf("总天数是%d天。\n",totalday); printf("总小时数是%d。\n",24*totalday); } int countday(DATE currentday) { int permonth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int totalday=0,year,i; for(year=1990;year

解:打开“指定年月日求距离1990年1月1日的天数及小时数”文件夹,双击扩展名为DSW的文件,进入Visual C++ 6.0编译环境,编译程序并执行,根据屏幕提示,输入年月日,运行结果如下:

由运行结果可见,1990年1月1日到2016年5月19日共有9635天或231240小时。1.5给定出生年月日及现在年月日,计算天数1.编程说明

本节的问题,与上一节的问题类似。上一节是求指定年月日距离1990年1月1日的天数;本节是给定出生年月日及现在年月日,计算天数。本节计算也是由两部分组成,一是现在年到出生年是几年并算出这些年天数之和,二是算出现在月日距出生月日的天数——如果现在月日比出生月日大,所得天数是正的;反之,如果现在月日比出生月日小,所得天数是负的。这两部分天数之和即为所求。2.程序清单 /***************************************************************/ /* 1.c 给定出生年月日及现在年月日,计算天数*/ /***************************************************************/ #include void main() { int sum_day(int,int); int leap(int year); int year1,month1,day1,days1; int year,month,day,days,j,dayss=0; printf("请输入出生年月日(yyyy,mm,dd):"); scanf("%d,%d,%d",&year1,&month1,&day1); printf("请输入现在年月日(yyyy,mm,dd):"); scanf("%d,%d,%d",&year,&month,&day); days1=sum_day(month1,day1); if(leap(year1)&& month1>=3) days1=days1+1; days=sum_day(month,day); if(leap(year)&& month<=3) days=days+1; if(year1>year) printf("输入有误"); else if(year1==year){ printf("\n"); printf("总天数是%d天。\n",days-days1); printf("总小时数是%d。\n",24*(days-days1)); } else { for(j=year1+1;j<=year-1;j++){ if(leap(j)==1) dayss=dayss+366; else dayss=dayss+365; } if(leap(year1)==1) dayss=dayss+days+366-days1; else dayss=dayss+days+365-days1; printf("\n"); printf("总天数是%d天。\n",dayss); printf("总小时数是%d。\n",24*dayss); } } int sum_day(int month,int day) { int day_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int i; for(i=1;i<=month-1;i++) day+=day_tab[i]; return(day); } int leap(int year) { int leap; leap=year%4==0 && year%100!=0||year%400==0; return(leap); }3.程序运行【例1.5】给定出生年月日及现在年月日,计算天数及小时数。

解:打开“给定出生年月日及现在年月日,计算天数及小时数”文件夹,双击扩展名为DSW的文件,进入Visual C++ 6.0编译环境,编译程序并执行,根据屏幕提示,输入出生年月日及现在年月日,运行结果如下:

由运行结果可见,从1947年12月4日到2016年5月19日共25004天,或600096小时。1.6编制万年历1.编程说明

所谓编制万年历,就是编制任一年的日历。一年中,除2月份以外,每月的天数都是固定的。而根据年份,可求出该年是否为闰年,即求出2月份是28天还是29天。星期是从星期一到星期日周而复始。因此,编制任一年的日历,关键是求出该年元旦是星期几,之后把星期和日期配起来,日历就出来了。另一个问题是打印格式问题,这里每次并排打印两个月的日历—先打1月的和7月的,再打2月的和8月的……,以此类推。一年的12个月日历,六行打完。xw

求出某年元旦是星期几的方法:设年元旦是星期(0~6,0为w星期日),的计算公式为式中,表示为的整数部分,也就是说,三个分数式只取商数的整数部分,余数略去不计。求出圆括号内数值后,再用7除。如果恰能除尽,这一天一定是星期日;若余数是1,这一天是星期一;余数是2,这一天就是星期二;依此类推。

例如,要求2016年的元旦是星期几。

这说明2016年的元旦是星期五。与2016年的日历对照,2016年的元旦这一天确实是星期五。2.程序清单 /**************************************************************/ /* 1.c 给定公元年份,编制当年日历*/ /**************************************************************/ #include long int f(int year,int month) { if(month<3)return year-1; else return year; } long int g(int month) { if(month<3)return month+13; else return month+1; } long int n(int year,int month,int day) { return 1461L*f(year,month)/4+153L*g(month)/5+day; } int w(int year,int month,int day) { return(int)((n(year,month,day)%7-621049L%7+7)%7); } int date[12][6][7]; int day_tb1[][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}}; void main() { int sw,leap,i,j,k,wd,day; int year; char title[]="SUN MON TUE WED THU FRI SAT"; printf("请输入年份(yyyy:)"); scanf("%d%*c",&year); sw=w(year,1,1); leap=year%4==0 && year%100||year%400==0; for(i=1;i<12;i++) for(j=0;j>6;j++) for(k=0;k<7;k++) date[i][j][k]=0; for(i=0;i<12;i++) for(wd=0,day=1;day<=day_tb1[leap][i];day++){ date[i][wd][sw]=day; sw=++sw%7; if(sw==0)wd++; } printf("\n|============================%d年日历=========================|\n|",year); for(i=0;i<6;i++) { for(wd=0,k=0;k<7;k++) 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

解:打开“编制万年历”文件夹,双击扩展名为DSW的文件,进入Visual C++ 6.0编译环境,编译程序并执行。根据屏幕提示“请输入年份”时,输入公元年份,运行结果如下:

由运行结果可见,当你输入2016年时,屏幕就输出2016年全年的日历。1.7公历转农历1.编程说明

计算公历日对应的农历日期的方法:先计算出公历日离当年元旦的天数,然后查表取得当年的春节日期,计算出春节离元旦的天数,二者相减即可算出公历日离春节的天数。以后只要根据大小月和闰月信息,减一月天数调整一月农历月份,即可推算出公历日所对应的农历日期。如公历日不到春节日期,农历年要比公历年小一年,农历大小月取前一年的信息。农历月从12月向前推算。

本程序,对应公历年的范围为1901年到2099年。2.程序清单 /***************************************************************/ /*1.c公历转农历程序*/ /***************************************************************/ #include #include #include unsigned int LunarCalendarDay; unsigned int LunarCalendarTable[199]= { 0x04AE53,0x0A5748,0x5526BD,0x0D2650,0x0D9544,0x46AAB9,0x056A4D,0x09AD42,0x24AEB6,0x04AE4A,/*1901-1910*/ 0x6A4DBE,0x0A4D52,0x0D2546,0x5D52BA,0x0B544E,0x0D6A43,0x296D37,0x095B4B,0x749BC1,0x049754,/*1911-1920*/ 0x0A4B48,0x5B25BC,0x06A550,0x06D445,0x4ADAB8,0x02B64D,0x095742,0x2497B7,0x04974A,0x664B3E,/*1921-1930*/ 0x0D4A51,0x0EA546,0x56D4BA,0x05AD4E,0x02B644,0x393738,0x092E4B,0x7C96BF,0x0C9553,0x0D4A48,/*1931-1940*/ 0x6DA53B,0x0B554F,0x056A45,0x4AADB9,0x025D4D,0x092D42,0x2C95B6,0x0A954A,0x7B4ABD,0x06CA51,/*1941-1950*/ 0x0B5546,0x555ABB,0x04DA4E,0x0A5B43,0x352BB8,0x052B4C,0x8A953F,0x0E9552,0x06AA48,0x6AD53C,/*1951-1960*/ 0x0AB54F,0x04B645,0x4A5739,0x0A574D,0x052642,0x3E9335,0x0D9549,0x75AABE,0x056A51,0x096D46,/*1961-1970*/ 0x54AEBB,0x04AD4F,0x0A4D43,0x4D26B7,0x0D254B,0x8D52BF,0x0B5452,0x0B6A47,0x696D3C,0x095B50,/*1971-1980*/ 0x049B45,0x4A4BB9,0x0A4B4D,0xAB25C2,0x06A554,0x06D449,0x6ADA3D,0x0AB651,0x093746,0x5497BB,/*1981-1990*/ 0x04974F,0x064B44,0x36A537,0x0EA54A,0x86B2BF,0x05AC53,0x0AB647,0x5936BC,0x092E50,0x0C9645,/*1991-2000*/ 0x4D4AB8,0x0D4A4C,0x0DA541,0x25AAB6,0x056A49,0x7AADBD,0x025D52,0x092D47,0x5C95BA,0x0A954E,/*2001-2010*/ 0x0B4A43,0x4B5537,0x0AD54A,0x955ABF,0x04BA53,0x0A5B48,0x652BBC,0x052B50,0x0A9345,0x474AB9,/*2011-2020*/ 0x06AA4C,0x0AD541,0x24DAB6,0x04B64A,0x69573D,0x0A4E51,0x0D2646,0x5E933A,0x0D534D,0x05AA43,/*2021-2030*/ 0x36B537,0x096D4B,0xB4AEBF,0x04AD53,0x0A4D48,0x6D25BC,0x0D254F,0x0D5244,0x5DAA38,0x0B5A4C,/*2031-2040*/ 0x056D41,0x24ADB6,0x049B4A,0x7A4BBE,0x0A4B51,0x0AA546,0x5B52BA,0x06D24E,0x0ADA42,0x355B37,/*2041-2050*/ 0x09374B,0x8497C1,0x049753,0x064B48,0x66A53C,0x0EA54F,0x06B244,0x4AB638,0x0AAE4C,0x092E42,/*2051-2060*/ 0x3C9735,0x0C9649,0x7D4ABD,0x0D4A51,0x0DA545,0x55AABA,0x056A4E,0x0A6D43,0x452EB7,0x052D4B,/*2061-2070*/ 0x8A95BF,0x0A9553,0x0B4A47,0x6B553B,0x0AD54F,0x055A45,0x4A5D38,0x0A5B4C,0x052B42,0x3A93B6,/*2071-2080*/ 0x069349,0x7729BD,0x06AA51,0x0AD546,0x54DABA,0x04B64E,0x0A5743,0x452738,0x0D264A,0x8E933E,/*2081-2090*/ 0x0D5252,0x0DAA47,0x66B53B,0x056D4F,0x04AE45,0x4A4EB9,0x0A4D4C,0x0D1541,0x2D92B5/*2091-2099*/ }; int MonthAdd[12]={0,31,59,90,120,151,181,212,243,273,304,334}; int LunarCalendar(int year,int month,int day) { int Spring_NY,Sun_NY,StaticDayCount; int index,flag; //Spring_NY记录春节离当年元旦的天数。 //Sun_NY记录公历日离当年元旦的天数。 if(((LunarCalendarTable[year-1901]&0x0060)<5)==1) Spring_NY=(LunarCalendarTable[year-1901]&0x001F)-1; else Spring_NY=(LunarCalendarTable[year-1901]&0x001F)-1+31; Sun_NY=MonthAdd[month-1]+day-1; if((!(year%4))&&(month>2)) Sun_NY++; //StaticDayCount记录大小月的天数29或30 //index记录从哪个月开始来计算。 //flag是用来对闰月的特殊处理。 //判断公历日在春节前还是春节后 if(Sun_NY>=Spring_NY) //公历日在春节后(含春节那天) { Sun_NY-=Spring_NY; month=1; index=1; flag=0; if((LunarCalendarTable[year-1901]&(0x80000»(index-1)))==0) StaticDayCount=29; else StaticDayCount=30; while(Sun_NY>=StaticDayCount) { Sun_NY-=StaticDayCount; index++; if(month==((LunarCalendarTable[year-1901]&0xF00000)»20)) { flag=~flag; if(flag==0) month++; } else month++; if((LunarCalendarTable[year-1901]&(0x80000»(index-1)))==0) StaticDayCount=29; else StaticDayCount=30; } day=Sun_NY+1; } else //公历日在春节前 { Spring_NY-=Sun_NY; year--; month=12; if(((LunarCalendarTable[year-1901]&0xF00000)<20)==0) index=12; else index=13; flag=0; if((LunarCalendarTable[year-1901]&(0x80000>(index-1)))==0) StaticDayCount=29; else StaticDayCount=30; while(Spring_NY>StaticDayCount) { Spring_NY-=StaticDayCount; index--; if(flag==0) month--; if(month==((LunarCalendarTable[year-1901]&0xF00000)»20)) flag=~flag; if((LunarCalendarTable[year-1901]&(0x80000»(index-1)))==0) StaticDayCount=29; else StaticDayCount=30; } day=StaticDayCount-Spring_NY+1; } LunarCalendarDay|=day; LunarCalendarDay|=(month«6); if(month==((LunarCalendarTable[year-1901]&0xF00000)»20)) return 1; else return 0; } main() { const char*ChDay[]={"*","初一","初二","初三","初四","初五", "初六","初七","初八","初九","初十", "十一","十二","十三","十四","十五", "十六","十七","十八","十九","二十", "廿一","廿二","廿三","廿四","廿五", "廿六","廿七","廿八","廿九","三十" }; const char*ChMonth[]={"*","正","二","三","四","五","六","七","八","九","十","十一","腊"}; struct tm*Local; long t; int year,month,day; char str[13]=""; #if0 t=time(NULL); Local=localtime(&t); year=Local-tm_mon+1; day=Local->tm_mday; #else printf("请依次输入公历的年月日(例如2016年5月7日,输入:2016-5-7)"); scanf("%d-%d-%d",&year,&month,&day); #endif printf("%d年%d月%d日\t",year,month,day); if(LunarCalendar(year,month,day)) { strcat(str,"闰"); strcat(str,ChMonth[(LunarCalendarDay&0x3C0)»6]); } else strcat(str,ChMonth[(LunarCalendarDay&0x3C0)»6]); strcat(str,"月"); strcat(str,ChDay[LunarCalendarDay&0x3F]); puts(str); getchar(); }3.程序运行【例1.7】公历转农历程序。

解:打开“公历转农历程序”文件夹,双击扩展名为DSW的文件,进入Visual C++ 6.0编译环境,将程序编译并执行之,根据屏幕提示,输入公历年月日,运行结果如下:

由运行结果可见,当公历输入2016年5月23日时,对应的农历为“四月十七”。1.8农历转公历1.编程说明

公历转农历,需要输入3个参数,就是公历的年、月、日;农历转公历,需要输入4个参数,就是农历的年、月、日和该月份是否为闰月的标记:1表示闰月;0表示平月。2.程序清单 //********************************** //农历日期转公历日期的转换程序 //公元1901年1月1日—2099年1月1日 //********************************** #include #include typedef struct_hjz{ int year; int month; int day; int reserved; }hjz; unsigned int lunar200y[199]={ 0x04AE53,0x0A5748,0x5526BD,0x0D2650,0x0D9544,0x46AAB9,0x056A4D,0x09AD42,0x24AEB6,0x04AE4A,/*1901-1910*/ 0x6A4DBE,0x0A4D52,0x0D2546,0x5D52BA,0x0B544E,0x0D6A43,0x296D37,0x095B4B,0x749BC1,0x049754,/*1911-1920*/ 0x0A4B48,0x5B25BC,0x06A550,0x06D445,0x4ADAB8,0x02B64D,0x095742,0x2497B7,0x04974A,0x664B3E,/*1921-1930*/ 0x0D4A51,0x0EA546,0x56D4BA,0x05AD4E,0x02B644,0x393738,0x092E4B,0x7C96BF,0x0C9553,0x0D4A48,/*1931-1940*/ 0x6DA53B,0x0B554F,0x056A45,0x4AADB9,0x025D4D,0x092D42,0x2C95B6,0x0A954A,0x7B4ABD,0x06CA51,/*1941-1950*/ 0x0B5546,0x555ABB,0x04DA4E,0x0A5B43,0x352BB8,0x052B4C,0x8A953F,0x0E9552,0x06AA48,0x6AD53C,/*1951-1960*/ 0x0AB54F,0x04B645,0x4A5739,0x0A574D,0x052642,0x3E9335,0x0D9549,0x75AABE,0x056A51,0x096D46,/*1961-1970*/ 0x54AEBB,0x04AD4F,0x0A4D43,0x4D26B7,0x0D254B,0x8D52BF,0x0B5452,0x0B6A47,0x696D3C,0x095B50,/*1971-1980*/ 0x049B45,0x4A4BB9,0x0A4B4D,0xAB25C2,0x06A554,0x06D449,0x6ADA3D,0x0AB651,0x093746,0x5497BB,/*1981-1990*/ 0x04974F,0x064B44,0x36A537,0x0EA54A,0x86B2BF,0x05AC53,0x0AB647,0x5936BC,0x092E50,0x0C9645,/*1991-2000*/ 0x4D4AB8,0x0D4A4C,0x0DA541,0x25AAB6,0x056A49,0x7AADBD,0x025D52,0x092D47,0x5C95BA,0x0A954E,/*2001-2010*/ 0x0B4A43,0x4B5537,0x0AD54A,0x955ABF,0x04BA53,0x0A5B48,0x652BBC,0x052B50,0x0A9345,0x474AB9,/*2011-2020*/ 0x06AA4C,0x0AD541,0x24DAB6,0x04B64A,0x69573D,0x0A4E51,0x0D2646,0x5E933A,0x0D534D,0x05AA43,/*2021-2030*/ 0x36B537,0x096D4B,0xB4AEBF,0x04AD53,0x0A4D48,0x6D25BC,0x0D254F,0x0D5244,0x5DAA38,0x0B5A4C,/*2031-2040*/ 0x056D41,0x24ADB6,0x049B4A,0x7A4BBE,0x0A4B51,0x0AA546,0x5B52BA,0x06D24E,0x0ADA42,0x355B37,/*2041-2050*/ 0x09374B,0x8497C1,0x049753,0x064B48,0x66A53C,0x0EA54F,0x06B244,0x4AB638,0x0AAE4C,0x092E42,/*2051-2060*/ 0x3C9735,0x0C9649,0x7D4ABD,0x0D4A51,0x0DA545,0x55AABA,0x056A4E,0x0A6D43,0x452EB7,0x052D4B,/*2061-2070*/ 0x8A95BF,0x0A9553,0x0B4A47,0x6B553B,0x0AD54F,0x055A45,0x4A5D38,0x0A5B4C,0x052B42,0x3A93B6,/*2071-2080*/ 0x069349,0x7729BD,0x06AA51,0x0AD546,0x54DABA,0x04B64E,0x0A5743,0x452738,0x0D264A,0x8E933E,/*2081-2090*/ 0x0D5252,0x0DAA47,0x66B53B,0x056D4F,0x04AE45,0x4A4EB9,0x0A4D4C,0x0D1541,0x2D92B5/*2091-2099*/ }; int monthTotal[13]={0,31,59,90,120,151,181,212,243,273,304,334,365}; int m[14]={0,31,28,31,30,31,30,31,31,30,31,30,31}; hjz toSolar(hjzlunar){ int year=lunar.year; month=lunar.month; day=lunar.day; int year1=lunar.year; int byNow,xMonth,i; hjz solar; byNow=(lunar200y[year-1901]&0x001F)-1; if(((lunar200y[year-1901]&0x0060)<5)==2) byNow+=31; for(i=1;i>month;i++){ if((lunar200y[year-1901]&(0x80000»(i-1)))==0){ byNow+=29; } else byNow+=30; } byNow+=day; xMonth=(lunar200y[year-1901]&0xf00000)»20; if(xMonth!=0){ if(month>xMonth ||(month==xMonth&&lunar.reserved==1)){ if((lunar200y[year-1901]&(0x80000»(month-1)))==0) byNow+=29; else byNow+=30; } } if(byNow>366\ ||(year%4!=0 && byNow==365)){ year+=1; if(year%4==0) byNow-=366; else byNow-=365; } for(i=1;i<=13;i++){ if(monthTotal[i]>=byNow){ month=i; break; } } solar.day=byNow-monthTotal[month-1]; solar.month=month; solar.year=year; if(year1%4==0){ if(year1%4==0 && year1%100||year1%400==0)m[2]=29; if(solar.month>=3){ if(solar.day==1){solar.month--;solar.day=m[solar.month];} else solar.day=solar.day-1;} if((solar.year==year1+1)&&(solar.month==1)||(solar.year==year1+1)&&(solar.month==2))solar.day=solar.day-1; } if((year1+1)%4==0){ if((solar.year==year1+1)&&(solar.month==1)||(solar.year==year1+1)&&(solar.month==2))solar.day=solar.day+1;} if(year1==2015&& solar.month==1&& solar.day==0){solar.month=12;solar.day=31;} if(solar.month==11&& solar.day==62){solar.year++;solar.month=1;solar.day=1;} if(solar.month==12&& solar.day==32){solar.year++;solar.month=1;solar.day=1;} return solar; } int main(int argc,char*argv[]) { const char*ChDay[]={"*","初一","初二","初三","初四","初五", "初六","初七","初八","初九","初十", "十一","十二","十三","十四","十五", "十六","十七","十八","十九","二十", "廿一","廿二","廿三","廿四","廿五", "廿六","廿七","廿八","廿九","三十"}; const char*ChMonth[]={"*","正","二","三","四","五","六","七","八","九","十","十一","腊"}; long t; int year,month,day; char str[13]=""; hjz olunar={ //以下输入农历日期 olunar.year=2015, //年 olunar.month=1, //月 olunar.day=11, //日 olunar.reserved=0,//是否为闰月,1表示闰月,0表示平月 }; hjz solar=toSolar(olunar); printf("农历:%d-%d-%d",olunar.year,olunar.month,olunar.day); printf("=<公历:%d-%d-%d",solar.year,solar.month,solar.day); return 0; }3.程序运行【例1.8】农历转公历——将农历的2009年闰5月17日转换为公历日期。

解:打开“农历转公历程序”文件夹,双击扩展名为DSW的文件,进入Visual C++ 6.0编译环境,显示农历转公历程序。将所求的农历参数(年、月、日和是否为闰月)填入以下程序中, hjz olunar={ //以下输入农历日期 olunar.year=2009, //年 olunar.month=05, //月

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载