在c语言中使用函数来制作一个万年历,要求,可以知道每个月有多少天,每个月的第一天是星期几

在c语言中使用函数来制作一个万年历,要求,可以知道每个月有多少天,每个月的第一天是星期几,第1张

#include <stdioh>
#include <stdlibh>
#include <conioh>
#include <timeh>
//是否闰年
#define IS_LEAP_YEAR(iYear) (((iYear) % 100 == 0)  ((iYear) % 400 == 0) : ((iYear) % 4 == 0))
int Calendar(int iYear, int iMonth);
void main()
{
//获取今天的日期
struct tm today;
time_t ltime;
time(&ltime);
today = localtime(&ltime);
// printf("%d-%02d-%02d %02d:%02d:%02d\n星期%d 当年第%d天\n", 
// today->tm_year + 1900, today->tm_mon + 1, today->tm_mday, 
// today->tm_hour, today->tm_min, today->tm_sec, today->tm_wday, today->tm_yday);
int iYear = today->tm_year + 1900;
int iMonth = today->tm_mon + 1;
do {
system("cls");
int ch = Calendar(iYear, iMonth);
if (ch == 27) break;
switch (ch)
{
case 75: //<--
iYear--;
break;
case 77: //-->
iYear++;
break;
case 80: //下箭头
iMonth++;
if (iMonth > 12)
{
iYear++;
iMonth = 1;
}
break;
case 72: //上箭头
iMonth--;
if (iMonth < 1)
{
iYear--;
iMonth = 12;
}
break;
case 71: //Home
iYear = today->tm_year + 1900;
iMonth = today->tm_mon + 1;
break;
}
} while (1);
}
//显示给定年月的日历
//返回值为获取的用户按键, 以确定下一步的 *** 作
int Calendar(int iYear, int iMonth)
{
int i, j, iDays;

//初始化数组w的值为1至31
int w[31];
for (i = 0; i < 31; i++) w[i] = i+1;

//获取本月天数于iDays中
switch (iMonth)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
iDays = 31;
break;
case 4: case 6: case 9: case 11:
iDays = 30;
break;
case 2:
iDays = IS_LEAP_YEAR(iYear)  29 : 28;
break;
}

//显示 日历头
printf("\n    %d年%d月 日历\n\n", iYear, iMonth);
printf(" 日 一 二 三 四 五 六\n");
printf("----------------------\n");


//获取参数指定年月的第一天是周几。保存在firstdaytm_wday中
struct tm firstday = {0};
firstdaytm_year = iYear - 1900;
firstdaytm_mon = iMonth - 1;
firstdaytm_mday = 1;

time_t ltime;
ltime = mktime(&firstday);

firstday = localtime(&ltime);

//处理1号前的留空
j = firstdaytm_wday; //周几
for (i = 0; i < j; i++)
{
printf("   "); //3个空格
}

//显示日历正文
for (i = 0; i < iDays; i++)
{
printf("%3d", w[i]);
if (++j == 7)
{
printf("\n");//逢七换行
j = 0;
}
}
if (j != 0) printf("\n");


//获取今天日期
time(&ltime);
struct tm today = localtime(&ltime);

//显示 日历尾
printf("----------------------\n");
printf("今天是: %d年%d月%d日\n\n", todaytm_year + 1900, todaytm_mon + 1, todaytm_mday);

printf("←: 上一年  →: 下一年\n");
printf("↑: 上一月  ↓: 下一月\n\n");
printf("Home: 今天  Esc: 退出\n");

//获取用户按键 (不用按回车立即返回)
fflush(stdin);
clearerr(stdin);

int c = getch();
if (c == 0xe0 || c == 0) c = getch();

return c;
}

两个函数的套用,一个是date_add这个函数可以求出当前日期所在月份的第一天的日期,第二个函数是dayname,这个可以返回星期的名字,将dayname套在date_add的外面就可以了。
当然不想这么做也可以,将输入的日期转换为字符,然后将后面的日期部分替换成01,然后再用dayname也可以。
date_add求日期坐在月份的第一天
date_add('写入日期',interval -day('写入日期')+1 day),然后再套一层dayname函数就可以了。

日期时间函数
1DATE
用途:返回代表特定日期的序列号
语法:DATE(year,month,day)
参数:year为一到四位,根据使用的日期系统解释该参数。默认情况下,Excel for Windows使用1900日期系统,而Excel for Macintosh使用1904日期系统。Month代表每年中月份的数字。如果所输入的月份大于12,将从指定年份的一月份执行加法运算。Day代表在该月份中第几天的数字。如果 day 大于该月份的最大天数时,将从指定月份的第一天开始往上累加。
注意:Excel按顺序的序列号保存日期,这样就可以对其进行计算。如果工作簿使用的是1900日期系统,则Excel会将1900年1月1日保存为序列号1。同理,会将1998年1月1日保存为序列号35796,因为该日期距离1900年1月1日为35795天。
实例:如果采用1900日期系统(Excel默认),则公式“=DATE(2001,1,1)”返回36892。
2DATEVaLUE
用途:返回date_text所表示的日期的序列号。该函数的主要用途是将文字表示的日期转换成一个序列号。
语法:DATEVaLUE(date_text)
参数:Date_text是用Excel日期格式表示日期的文本。在使用1900日期系统中,date_text必须是1900年1月1日到9999年12月31日之间的一个日期;而在1904日期系统中,date_text必须是1904年1月1日到9999年12月31日之间的一个日期。如果date_text超出上述范围,则函数DATEVaLUE返回错误值#value!。
如果省略参数date_text中的年代,则函数DATEVaLUE使用电脑系统内部时钟的当前年代,且date_text中的时间信息将被忽略。
实例:公式“=DATEVaLUE("2001/3/5")”返回36955,DATEVaLUE("2-26")返回36948。
3DAY
用途:返回用序列号(整数1到31)表示的某日期的天数,用整数 1 到 31 表示。
语法:DAY(serial_number)
参数:Serial_number是要查找的天数日期,它有多种输入方式:带引号的文本串(如"1998/01/30")、序列号(如1900日期系统的35825表示 的1998年1月30日),以及其他公式或函数的结果(如DATEVaLUE("1998/1/30"))。
实例:公式“=DAY("2001/1/27")”返回27,=DAY(35825)返回30,=DAY(DATEVaLUE("2001/1/25"))返回25。
4DAYS360
用途:按照一年360天的算法(每个月30天,一年共计12 个月),返回两日期间相差的天数。
语法:DAYS360(start_date,end_date,method)
参数:Start_date和end_date是用于计算期间天数的起止日期。如果start_date在end_date之后,则DAYS360将返回一个负数。日期可以有多种输入方式:带引号的文本串(例如:"1998/01/30")、序列号(例如:如果使用1900日期系统,则35825表示1998年1月30日)或其他公式或函数的结果(例如,DATEVaLUE("1998/1/30"))。
Method是一个逻辑值,它指定了在计算中是采用欧洲方法还是美国方法。若为FALSE或忽略,则采用美国方法(如果起始日期是一个月的31日,则等于同月的30日。如果终止日期是一个月的31日,并且起始日期早于30日,则终止日期等于下一个月的1日,否则,终止日期等于本月的30日)。 若为TRUE则采用欧洲方法(无论是起始日期还是终止日期为一个月的 31 号,都将等于本月的 30 号)。
实例:公式“=DAYS360("1998/2/1","2001/2-1")”返回1080。
5EDATE
用途:返回指定日期(start_date)之前或之后指定月份的日期序列号。
语法:EDATE(start_date,months)
参数:Start_date参数代表开始日期,它有多种输入方式:带引号的文本串(例如:"1998/01/30")、序列号(如35825表示1998年1月30日)或其他公式或函数的结果(例如:DATEVaLUE("1998/1/30"))。Months 为在start_date之前或之后的月份数,未来日期用正数表示,过去日期用负数表示。
实例:公式“=EDATE("2001/3/5",2)”返回37016即2001年5月5日,=EDATE("2001/3/5",-6)返回36774即2000年9月5日。
6EOMONTH
用途:返回start-date之前或之后指定月份中最后一天的序列号。
语法:EOMONTH(start_date,months)
参数:Start_date参数代表开始日期,它有多种输入方式:带引号的文本串(如"1998/01/30")、序列号(如1900日期系统中的35825)或其他公式或函数的结果(如DATEVaLUE("1998/1/30"))。Month为start_date之前或之后的月份数,正数表示未来日期,负数表示过去日期。
实例:公式“=EOMONTH("2001/01/01",2)”返回36981即2001年3月31日,=EOMONTH("2001/01/01",-6)返回36738即2000年7月31日。
7HOUR
用途:返回时间值的小时数。即介于0(12:00 AM)到23(11:00 PM) 之间的一个整数。
语法:HOUR(serial_number)
参数:Serial_number表示一个时间值,其中包含着要返回的小时数。它有多种输入方式:带引号的文本串(如"6:45 PM")、十进制数(如078125 表示6:45PM)或其他公式或函数的结果(如TIMEVaLUE("6:45 PM"))。
实例:公式“=HOUR("3:30:30 PM")”返回15,=HOUR(05)返回12即12:00:00 AM,=HOUR(297477)返回16。
8MINUTE
用途:返回时间值中的分钟,即介于0到59之间的一个整数。
语法:MINUTE(serial_number)
参数:Serial_number是一个时间值,其中包含着要查找的分钟数。时间有多种输入方式:带引号的文本串(如"6:45 PM")、十进制数(如 078125表示6:45 PM)或其他公式或函数的结果(如TIMEVaLUE("6:45 PM"))。
实例:公式“=MINUTE("15:30:00")”返回30,=MINUTE(006)返回26,=MINUTE(TIMEVaLUE("9:45 PM"))返回45。
9MONTH
用途:返回以序列号表示的日期中的月份,它是介于 1(一月)和12(十二月)之间的整数。
语法:MONTH(serial_number)
参数:Serial_number表示一个日期值,其中包含着要查找的月份。日期有多种输入方式:带引号的文本串(如"1998/01/30")、序列号(如表示1998年1月30日的35825)或其他公式或函数的结果(如DATEVaLUE("1998/1/30"))等。
实例:公式“=MONTH("2001/02/24")”返回2,=MONTH(35825)返回1,=MONTH(DATEVaLUE("2000/6/30"))返回6。
10NETWORKDAYS
用途:返回参数start-data和end-data之间完整的工作日(不包括周末和专门指定的假期)数值。
语法:NETWORKDAYS(start_date,end_date,holidays)
参数:Start_date代表开始日期,End_date代表终止日;Holidays是表示不在工作日历中的一个或多个日期所构成的可选区域,法定假日以及其他非法定假日。此数据清单可以是包含日期的单元格区域,也可以是由代表日期的序列号所构成的数组常量。
函数中的日期有多种输入方式:带引号的文本串(如"1998/01/30")、序列号(如使用1900日期系统的35825)或其他公式或函数的结果(如 DATEVaLUE("1998/1/30"))。
注意:该函数只有加载“分析工具库”以后方能使用

1、首先打开excel软件并打开需要用到的表格。例如图下的有一列数值的表格。

2、假设想要“I"这一列所有的数值都乘”25“,就在"I1"后面的单元格”J1“中输入”=25“

3、然后点击enter,可以看到"J1",出现了一个数值,就是”I1“的值乘25的结果。

4、然后点击"J1",用鼠标左键点住该单元格右下角的”十字符号”往下拖动,就可以看到所有的数值都已经自动算好啦。

具体 *** 作如下:

1首先打开Excel文档。

2以图为例。鼠标选中C2区域,在函数栏(fx)中输入=B2-A2 (这个函数的意思是把结束日期减去开始日期,就得到两个日期之间的天数了)

3如果数据很多时,又改如何计算呢?大家还可以用隐藏函数DATEDIF函数来完成,公式如下:

=DATEDIF(A2,B2,"d")

4DATEDIF()函数知识点介绍:

这个函数语法是这样的:=DATEDIF(开始日期,结束日期,第三参数),第三参数可以有若干种情况,分别可以返回间隔的天数(d)、月数(m)和年数(y)。

可以 *** 作的,但是需要说清楚:
1、日期范围是输入在哪个单元格?
2、表格的行列标号你能不能让人家看到啊!
3、返回第一天的结果显示的是在哪一个单元格?显示的结果是日期?还是什么数值?


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13325580.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-15
下一篇 2023-07-15

发表评论

登录后才能评论

评论列表(0条)

保存