版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言课程设计报告设计题目:万年历学生姓名:学生学号:专业班级:数学与应用数学一班学院名称:数学与计量经济学院同组人姓名:指导老师:年 6月15日
目录TOC\o"1-3"\h\z1需求分析 11.1 问题描述 11.2 输入数据要求 11.3 输出数据要求 21.4 开发环境和工具 41.5 成员分工 42总体设计 52.1总体设计思路 52.2模块结构图 52.3模块说明 63详细设计…………………………93.1数据类型定义 91.结构体类型的定义及初始化 92定义全局变量 93.2模块实现 9MathPath模块实现 9memo_read模块实现 10memo_written模块实现 11memo_modify模块实现 12memo_delete模块实现 13memo_delete_all模块实现 144测试结果与分析………………..155总结 20附录………………..21-PAGE30-1需求分析问题描述我们将该课题分解为万年历和备忘录两部分,两人各完成其中的一部分。我们定义了一个structdate_message型结构体变量date用来存放年月日以及对应的备忘。由于课题要求使用命令行参数来实现各种功能,因此我们参考了一系列C语言教材,自学了命令行参数的使用,并使用getopt函数来实现参数的分析,最后根据getopt函数返回的值用switch语句选择程序的功能。(允许在输入参数时只有年份月份没有日期)关于万年历,我们先计算当月第一天是星期几,再依次将接下来的日期排下来。针对当月第一天星期的求解,我们以2021年1月1日为基点(星期六),计算所求日期与该日相差的天数取余(讨论年份在2021两边的两种情况),之后通过一定的输出手段将日历输出。关于备忘,我们除了实现要求中的显示功能和添加功能外,增加了程序的三项功能:修改功能、删除单日备忘功能、删除所有备忘功能。提供多备忘的添加功能。通过文件的写入与读取(删除功能使用了空结构体变量覆盖的办法),实现以上的各项功能。输入数据要求由于使用了命令行参数,所以该程序的运行必须在DOS环境下。在“命令行提示符”中按“可执行文件的路径空格负号命令选项空格命令选项所带的参数”的顺序输入。我们将该文件命名为calender.exe,参数为年月日(允许在输入参数时只有年份月份没有日期,使用选项-t时不允许输入年月日)。各命令选项的功能如下:/*-d:显示当月日历和当日备忘*//*-i:显示当月日历和添加当日备忘*//*-m:显示当月日历和修改当日备忘*//*-g:删除当日备忘*//*-t:删除全部备忘*/下面就各命令选项给出一部分样例:C:\Windows\system32>E:\calendar–d2021615C:\Windows\system32>E:\calendar–i688868C:\Windows\system32>E:\calendar–m999999C:\Windows\system32>E:\calendar–g1234567C:\Windows\system32>E:\calendar–t样例输入的截图如下:输出数据要求根据输入参数信息,使用不同的功能。注:允许多备忘存在,但此处不作为样例截图。针对样例输入的五种功能的输出如下:显示当月日历和当日备忘:基本功能,显示当月日历和当日备忘。
显示当月日历和添加当日备忘:输入所需要添加的备忘,提示“添加成功后”之后显示添加后的当月日历和当日备忘。显示当月日历和修改当日备忘:与添加备忘的程序运行结果类似。删除当日备忘。提示确认信息,当输入y时删除。如果该日本身无备忘的话,提示“该日无备忘!”删除全部备忘。提示确认信息,当输入y时删除。
开发环境和工具开发环境:Windows7开发工具:Dev-C++4.9.9.2成员分工胡凡:总体设计、主调模块、备忘录功能实现、注释编写叶磊:主调模块、万年历功能实现、数据测试、注释编写
2总体设计2.1总体设计思路设计思路考虑到日期与备忘的一一对应,采用结构体来解决该题成为一个可行的思路。首先,定义结构体类型,使得年月日与备忘直接绑定在一起。通过程序中这一临时存放数据的变量,使用文件的读写功能向文件中写入文件以及读出信息以暂时使用。针对日历的输出,首要考虑的是当月1日的输出位置,即需要求出该月1日是星期几。针对这个问题,我们以2021年1月1日为基点,求所求日期与基点距离的天数之差,之后根据除以7取的余数来看星期。选择2021年1月1日为基点,是因为其满足计算的两个条件:1.该日正好为年首,使得计算相差天数的计算变得更为简单。2.该日正好是星期六,使得相差的天数除以7所取出来的余数正好按日历从左至右显示(我们输出的日历从左往右依次为星期日、一、二、三、四、五、六)。我们考虑2021年前与后的两种情况。2021年后所需的即为正常余数,2021年前的则需要用7减去得到的余数才是所欲要的值。之后经过一定的输出格式即可将日历输出。针对备忘录的编写,考虑到定义了一个结构体使得年月日与备忘相连,因此可以将年月日与备忘一同存入文件。考虑到万年备忘录的庞大,为了节省时间和空间,我们想出了一个算法:在添加写入文件时,一律将数据内容写入文件末尾(即使用ab+追加模式);而当读取文件时,则将文件内的年月日与外部参数输入的年月日相比较,不相同则位置指针下移,一直到年月日相同或者无法读取为止。这样编写可以避免考虑年份的上限大小(因为如果定义一个二维数组,虽然也可以将日期和备忘一一对应,但是这样的话处理这个数组的上限就不好操作了。如果数组开太大会直接影响运行速度),而且在存入的备忘不太多的情况下在时间和空间上都可以节省(空间只跟存入的备忘数目有关,而不是直接开很大的数组,这样即使年份很大也不会对空间大小有什么影响)。另外,我们设计了备忘修改功能、备忘删除(单日或全部),使得操作可以更人性化。另外,多备忘录的添加、修改、删除(当天单条、当天所有、全部天的备忘)都是允许的。最后,在自学了命令行参数之后,我们用argc和*argv[]将主函数写出,并且用getopt函数来处理接收的参数并返回命令选项。之后便可以通过返回的命令选项用switch语句选择所需要实现的功能。以上即为我们对该课题的总体设计思路。数据存储将年月日与对应的备忘放于同一结构体变量中,在使用文件读写时作为一个整体使用,也方便了添加功能、修改功能、删除功能的实现。2.2模块结构图根据需求将系统划分为四个功能模块,函数之间的调用关系如图2.1所示。
memo_writtenmemo_writtenmemo_modifymemo_deletememo_delete_allmemo_readleapcheckDateMshow_calender箭头出发的函数调用箭头指向的函数图2.1晚年备忘录的模块结构图1)Main:主函数。2)leap:闰年判断。3)checkDate:检查日期合法性4)show_calender:显示当日的日历(未输入日时显示当月1日的日历)。5)memo_read:备忘的读取。6)memo_written:备忘的写入。7)memo_modify:备忘的修改。8)memo_delete:备忘的删除(当日(其中分为单条删除和全部删除))。9)memo_delete_all:备忘的删除(全部)。2.3模块说明(以从上至下,从左至右的顺序说明)MathPath模块函数原型:intmain(intargc,char*argv[])功能:主函数输入参数:argc——int类型,表示录入参数的个数 *argv[]——char类型,各元素记录各种录入字符串的首地址输出参数:0——int类型,返回给系统一个值,说明程序正常终止leap模块函数原型:intleap(intt_year)功能:闰年判断输入参数:t_year——int类型,表示需要判断闰年的年份输出参数:1——int类型,如果是闰年则返回1;0——int类型,如果是非闰年则返回0;
3.checkDate模块函数原型:voidcheckDate()功能:检查输入年月日的合法性输入参数:year——int类型,表示年份month——int类型,表示月份 day——int类型,表示日期输出参数:无4.show_calender模块函数原型:voidshow_calender()功能:显示日历输入参数:date.year——int类型,表示年份date.month——int类型,表示月份 date.day——int类型,表示日期输出参数:无5.memo_read模块函数原型:voidmemo_read()功能:从文件读取备忘输入参数:date.year——int类型,表示年份date.month——int类型,表示月份 date.day——int类型,表示日期输出参数:无6.memo_written模块函数原型:voidmemo_written()功能:将备忘写入文件输入参数:date.year——int类型,表示年份date.month——int类型,表示月份 date.day——int类型,表示日期输出参数:无7.memo_modify模块函数原型:voidmemo_modify()功能:修改备忘输入参数:date.year——int类型,表示年份date.month——int类型,表示月份 date.day——int类型,表示日期输出参数:无8.memo_delete模块函数原型:voidmemo_delete()功能:删除备忘(当日)输入参数:date.year——int类型,表示年份date.month——int类型,表示月份 date.day——int类型,表示日期输出参数:无9.memo_delete_all模块函数原型:voidmemo_delete_all()功能:删除备忘(全部)输入参数:无输出参数:无
3详细设计3.1数据类型定义1.结构体类型的定义及初始化/*定义结构体*/structdate_message{intyear;/*年*/intmonth;/*月*/intday;/*日*/charmemo[300];/*备忘*/}date={1,1,1,"\0"};2定义全局变量/*定义全局变量(各月所含天数)*/inta[]={0,31,0,31,30,31,30,31,31,30,31,30,31};3.2模块实现由于各人分工,故以下贴出的是自己负责模块的实现(此部分为备忘录功能模块的实现)MathPath模块实现算法思想首先进行函数调用声明。定义一个变量choice,用来记录getopt函数分析完参数之后的返回值,即命令选项,之后使用switch语句对命令选项进行判断,根据不同的命令选项执行不同的功能。具体实现(关键代码)intmain(intargc,char*argv[]){/*函数声明*/voidcheckDate();/*检查日期合法性*/voidshow_calender();/*显示日历*/voidmemo_written();/*写入备忘*/voidmemo_modify();/*修改备忘*/voidmemo_delete();/*删除当日备忘*/voidmemo_delete_all();/*删除全部备忘*/voidmemo_read();/*读取备忘*/ /*定义变量*/ intchoice; /*使用getopt函数分析命令行参数,识别选项*/ while((choice=getopt(argc,argv,"d:i:m:g:t"))!=-1) {/*选项*/switch(choice){case'd':/*调用函数,显示当月日历和当日备忘*/case'i':/*调用函数,显示当月日历和添加当日备忘*/case'm':/*调用函数,显示当月日历和修改当日备忘*/case'g':/*调用函数,删除当日备忘*/case't':/*调用函数,删除全部备忘*/}}printf("\t\tPleaseanykeytocontinue…………");getchar();system("cls");return0;}memo_read模块实现1算法思想依次读取文件的一个结构体长度的数据,直到读取的年月日与外部输入的年月日相等或者文件无法继续读取,再将最后读取的年月日输出。2具体实现(关键代码)/*备忘读取*/voidmemo_read(){/*定义文件指针*/FILE*fp;/*定义变量*/inti;structdate_messagetemp={0,0,0,"\0"};/*总是在读取备忘之前令备忘数归零*/count_memo=0;/*打开文件*/if((fp=fopen("calender.txt","ab+"))==NULL){printf("\t\t\t\t打开文件失败\t\t\t\t\n");return;}/*查找文件中是否有相同的日期*/while(1){/*文件读到不能读取为止*/if(fread(&temp,sizeof(structdate_message),1,fp)!=1)break;/*如果文件该位置的时间与所求时间相同*/if((temp.year==date.year)&&(temp.month==date.month)&&(temp.day==date.day)){/*当天备忘个数的计数*/count_memo++;for(i=0;i<300;i++)date.memo[i]=temp.memo[i];printf("\n\t\t\t备忘%d:%s\n",count_memo,date.memo);}}/*如果没有相同日期的话*/if(count_memo==0)printf("\t\t\t\t该日暂无备忘\n\n");printf("\n");fclose(fp);}memo_written模块实现1算法思想使用文件的追加模式打开,每次将需要写入的数据写于文件最后。2具体实现(关键代码)/*备忘写入*/voidmemo_written(){/*定义文件指针*/FILE*fp;/*打开文件*/if((fp=fopen("calender","ab+"))==NULL){printf("\n\t\t\t\t打开文件失败\n\n\t\t\t");return;}/*输入备忘*/scanf("%s",date.memo);/*写入备忘*/if(fwrite(&date,sizeof(structdate_message),1,fp)==1){system("cls");printf("\n\t\t\t\t备忘存入成功\n\n\t\t\t");}else{system("cls");printf("\n\t\t\t\t备忘存入失败\n\n\t\t\t");}getchar();fclose(fp);}memo_modify模块实现1算法思想依次读取文件的一个结构体长度的数据,直到读取的年月日与外部输入的年月日相等或者文件无法继续读取,调整位置指针的位置使得指针指向需要修改的结构体,之后将需要修改的数据写入即可。2具体实现(关键代码)/*备忘修改*/voidmemo_modify(){/*定义文件指针*/FILE*fp;/*定义变量*/inti=0,t,count=0;structdate_messagetemp;/*打开文件*/if((fp=fopen("calender.txt","rb+"))==NULL){printf("\n\n\n\n\n\n\n\n\n\t\t\t打开文件失败\n\n");return;}printf("请输入要修改第几条备忘\n");/*输入需要修改第几条备忘*/scanf("%d",&t);if(!(t>0&&t<=count_memo)){printf("输入错误!该次操作失败\n!");getch();system("cls");exit(0);}printf("请输入要修改的内容\n");/*输入备忘*/scanf("%s",&date.memo);/*在文件中寻找该日期*/while(1){/*移动指针位置*/fseek(fp,i*sizeof(structdate_message),0);/*到文件无法读取时退出*/if(fread(&temp,sizeof(structdate_message),1,fp)!=1)break;/*如果文件中的时间与所求时间相同*/if((temp.year==date.year)&&(temp.month==date.month)&&(temp.day==date.day)){/*备忘计数+1*/count++;/*对应上同一个备忘的时候*/if(count==t){fseek(fp,i*sizeof(structdate_message),0);/*覆盖*/fwrite(&date,sizeof(structdate_message),1,fp);break;}}i++;}printf("\n\t\t\t\t修改成功!\n\n");getch();system("cls");fclose(fp);}memo_delete模块实现1算法思想依次读取文件的一个结构体长度的数据,直到读取的年月日与外部输入的年月日相等或者文件无法继续读取,调整位置指针的位置使得指针指向需要删除的结构体,之后将空结构体写入即可。2具体实现(关键代码)/*当日备忘删除*/voidmemo_delete(){/*定义文件指针*/FILE*fp;/*定义变量*/inti=0,t,choice,count=0;structdate_messagetemp1={0,0,0,"\0"};structdate_messagetemp2;/*确认信息*/printf("确认要删除当日备忘吗(y/n)?");/*如果输入y的话删除*/if(!(getchar()=='y'||'Y')){printf("未删除该日任何备忘\n");getch();system("cls");exit(0);}printf("(1)删除单条备忘or(2)删除当日所有备忘?\n请输入1或2进行选择\n");scanf("%d",&choice);switch(choice){case1:printf("请输入要删除第几条备忘\n");/*输入要删除第几条备忘*/scanf("%d",&t);if(!(t>0&&t<=count_memo)){printf("输入错误!该次操作失败!");getch();system("cls");exit(0);}/*打开文件*/if((fp=fopen("calender.txt","rb+"))==NULL){printf("打开文件失败\n\n");return;}/*在文件中查找输入的年月日的信息*/while(1){fseek(fp,i*sizeof(structdate_message),0);if((fread(&temp2,sizeof(structdate_message),1,fp))!=1)break;if((temp2.year==date.year)&&(temp2.month==date.month)&&(temp2.day==date.day)){count++;if(count==t){fseek(fp,i*sizeof(structdate_message),0);/*将空的覆盖上去*/fwrite(&temp1,sizeof(structdate_message),1,fp);break;}}i++;}printf("单条备忘删除成功!\n");getch();system("cls");fclose(fp);break;case2:/*打开文件*/if((fp=fopen("calender.txt","rb+"))==NULL){printf("打开文件失败\n\n");return;}/*在文件中查找输入的年月日的信息*/while(1){fseek(fp,i*sizeof(structdate_message),0);if(fread(&temp2,sizeof(structdate_message),1,fp)!=1)break;if((temp2.year==date.year)&&(temp2.month==date.month)&&(temp2.day==date.day)){fseek(fp,i*sizeof(structdate_message),0);fwrite(&temp1,sizeof(structdate_message),1,fp);}i++;}printf("当日所有备忘删除成功!\n");getch();system("cls");fclose(fp);break;default:printf("输入错误!操作失败!");getch();system("cls");exit(0);}}memo_delete_all模块实现1算法思想从文件开头开始,每次将一个空结构体覆盖上已经存在的结构体,直到文件无法继续读取为止。2具体实现(关键代码)/*全部备忘删除*/voidmemo_delete_all(){/*定义文件指针*/FILE*fp;/*定义变量*/inti=0;structdate_messagetemp1={0,0,0,"\0"};structdate_messagetemp2;/*打开文件*/if((fp=fopen("calender","wb+"))==NULL){printf("打开文件失败\n\n");return;}/*将位置指针依次后移,将所有的内容覆盖*/do{fseek(fp,i*sizeof(structdate_message),0);if(fread(&temp2,sizeof(structdate_message),1,fp)!=1)break;fseek(fp,i*sizeof(structdate_message),0);fwrite(&temp1,sizeof(structdate_message),1,fp);i++;}while(1);printf("全部删除成功!\n\n");fclose(fp);}4测试结果及分析为了检验该程序的可行性以及正确性,我们选择了几组有代表的测试数据,与实际结果符合得很好。测试数据如下:选择了2021年前的一天。我们选择了1949年10月1日,预期结果为星期一,先查看其备忘,预期结果为“该日暂无备忘!”。之后添加备忘“中华人民共和国成立!”下面为测试时所截的图。在“命令提示行”中输入参数敲回车,得到结果:该日添加备忘“中华人民共和国成立!”。下为参数输入:d.敲回车后提示输入备忘。输入备忘。按回车后敲回车,得到成功信息,并输出修改后的日历及备忘。还需要测试年份大于2021年的日期。考虑到这份日历为万年历,于是测试两份数据:大于一万年和小于一万年。以下测试小于一万年的数据:2021年12月24日,先添加备忘“世界末日?”再修改为“不可能是世界末日!”,最后删除该日备忘。输入参数(添加)添加备忘添加成功信息输入参数(修改)输入修改内容修改成功输入参数(删除)确认删除后最后测试一组大于一万年的日期:999999年9月9日.测试功能:添加功能、全部删除功能。输入参数输入备忘添加成功输入参数(删除全部)确认删除后至此,数据测试完毕。所有的测试结果均与实际符合得很好,验证了该程序的正确性。
5总结1算法与程序总结本程序定义了结构体类型,将年月日和备忘联系起来,在写入和读取的过程中均作为一个整体,并且在将写入的内容始终写在文件的末尾,而不是定义一一对应的备忘数组,节省了时间和空间。对于多备忘的问题,我们构思了一种算法,最终解决了多备忘的添加、修改、删除功能。由于课题要求使用命令行参数,所以,没有使用菜单来实现功能,而是使用命令选项来选择所需要执行的功能。而由于使用了命令行参数,因此该程序必须在DOS环境下运行(命令提示行)。万年历部分,采用定基点求相差的天数取7的余来确定当月首日是星期几,从而得到所需要的日历。2改进方案a.删除功能使用的算法略有缺点。因为采用了覆盖法来删除,所以覆盖后的文件中实际上仍然有一段空的内容,虽然对程序没有太大影响,但是当删除的备忘比较多时也会占用一定不必要的资源。实际上还有一种算法,将所有的内容读取出,然后删去不需要的,再将剩余的写入回去,或许这样的效果能更好一些。至于全部删除,直接在命令行参数中使用rmdir命令会更快一些,但由于时间有限,没有进行尝试。b.万年历的算法有待简化。可以采用蔡勒公式,直接计算出任何日期是星期几,而且不需要设置基点。但蔡勒公式有使用限制,如果可以解决的话应该可以简化万年历的算法。c.在了解更多的命令行参数之后,我们的程序可以更加专业化,也可以使得程序功能更加强大。
附录以下为我们小组该课题的最终代码:/*我是分割线*//*命令行功能选项*//*-d:显示当月日历和当日备忘*//*-i:显示当月日历和添加当日备忘*//*-m:显示当月日历和修改当日备忘*//*-g:删除当日备忘*//*-t:删除全部备忘*//*我是分割线*//*头文件*/#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<unistd.h>/*调用getopt函数*//*我是分割线*//*定义全局变量(各月所含天数)*/inta[]={0,31,0,31,30,31,30,31,31,30,31,30,31};/*定义全局变量(已获取的备忘个数)*/intcount_memo;/*定义结构体*/structdate_message{intyear;/*年*/intmonth;/*月*/intday;/*日*/charmemo[300];/*备忘*/}date={1,1,1,"\0"};/*我是分割线*//*主函数*/intmain(intargc,char*argv[]){/*函数声明*/voidcheckDate();/*检查日期合法性*/voidshow_calender();/*显示日历*/voidmemo_written();/*写入备忘*/voidmemo_modify();/*修改备忘*/voidmemo_delete();/*删除当日备忘*/voidmemo_delete_all();/*删除全部备忘*/voidmemo_read();/*读取备忘*/ /*定义变量*/ charchoice; /*使用getopt函数分析命令行参数,识别选项*/ while((choice=getopt(argc,argv,"d:i:m:g:t"))!=-1) {/*选项*/switch(choice){/*选项为d时,显示当月日历和当日备忘*/case'd':/*调用atoi函数,将字符型数字转化为整型*/date.year=atoi(argv[2]);/*如果没有输入月份则不赋值*/if(atoi(argv[3])!=0)date.month=atoi(argv[3]);/*如果没有输入日期则不赋值*/if(atoi(argv[4])!=0)date.day=atoi(argv[4]);/*检查日期合法性*/checkDate();/*显示当日日历*/show_calender();/*显示备忘*/memo_read();break;/*选项为i时,显示当月日历和添加当日备忘*/case'i':date.year=atoi(argv[2]);date.month=atoi(argv[3]);if(atoi(argv[4])!=0)date.day=atoi(argv[4]);checkDate();show_calender();memo_read();printf("请输入要添加的备忘\n");/*写入备忘*/memo_written();/*添加之后*/printf("添加之后的日历与对应的备忘为\n");show_calender();memo_read();break;/*选项为m时,显示当月日历和修改当日备忘*/case'm':date.year=atoi(argv[2]);date.month=atoi(argv[3]);if(atoi(argv[4])!=0)date.day=atoi(argv[4]);checkDate();show_calender();memo_read();/*如果该日无备忘,则给出提示*/if(count_memo==0){printf("无法修改,因为该日无备忘。\n如需添加备忘,请使用备忘添加功能\n");break;}/*修改备忘*/memo_modify();/*修改之后*/printf("修改之后的日历为\n");show_calender();memo_read();break;/*选项为g时,删除当日备忘*/case'g':date.year=atoi(argv[2]);date.month=atoi(argv[3]);if(atoi(argv[4])!=0)date.day=atoi(argv[4]);checkDate();show_calender();memo_read();memo_delete();show_calender();memo_read();break;/*选项为t时,删除全部备忘*/case't':memo_delete_all();getch();break;}}printf("\t\tPleaseanykeytocontinue…………");getch();system("cls");return0;}/*我是分割线*//*显示当月日历*/voidshow_calender(){/*函数调用声明*/intleap(intt_year);/*定义函数*/intsum=0,count=0,i,t,temp_year,temp_month,temp_day=-1;/*输出年月日*/printf("\n\t\t\t\t%d年%d月",date.year,date.month); if(date.day!=0)printf("%d日\n",date.day); elseprintf("1日\n"); /*计算某月第一天是星期几,以2021年1月1日星期六为基点,计算某月第一天距离基点的天数除以7取余*//*当某年不低于2021年*/ if(date.year>=2021) {/*加上整年的天数*/ for(temp_year=2021;temp_year<date.year;temp_year++) sum+=365+leap(temp_year); a[2]=(leap(date.year)==1)?29:28; /*加上整月的天数*/ for(temp_month=1;temp_month<date.month;temp_month++) sum+=a[temp_month]; /*计算某月第一天是星期几*/ t=(sum%7>0)?sum%7:(sum%7+7); } /*当某年低于2021年*/ if(date.year<2021) {/*加上整年的天数*/ for(temp_year=2021;temp_year>date.year+1;temp_year--) sum+=365+leap(temp_year-1);a[2]=(leap(date.year-1)==1)?29:28; /*加上整月的天数*/ for(temp_month=12;temp_month>=date.month;temp_month--) sum+=a[temp_month]; /*计算某月第一天是星期几*/ t=(sum%7>=0)?(7-sum%7):(-sum%7); } /*输出当月日历*/ printf("\n\t\tSunMonTueWedThuFriSat\n\t\t"); /*输出一定数量的空格*/ for(i=1;i<=5*t-2;i++) { printf(""); /*计数一行中已输出多少个位数*/ count++; } /*逐行输出日历中的日期部分*/ for(temp_day=1;temp_day<=a[date.month];temp_day++) {/*如果有输入日期则特别标出*/ if(temp_day==date.day) {if(date.day<10)printf("\b[%d]",date.day);elseprintf("\b[%d]",date.day);} /*普通日期无特别表示*/ elseprintf("%-5d",temp_day); /*计数增加*/ count+=5; /*当一行已输出38个位数的时候换行(除每行开头的一堆空格外)*/ if(count==38) { printf("\n"); count=3; } } printf("\n");} /*我是分割线*//*备忘读取*/voidmemo_read(){/*定义文件指针*/FILE*fp;/*定义变量*/inti;structdate_messagetemp={0,0,0,"\0"};/*总是在读取备忘之前令备忘数归零*/count_memo=0;/*打开文件*/if((fp=fopen("calender.txt","ab+"))==NULL){printf("\t\t\t\t打开文件失败\t\t\t\t\n");return;}/*查找文件中是否有相同的日期*/while(1){/*文件读到不能读取为止*/if(fread(&temp,sizeof(structdate_message),1,fp)!=1)break;/*如果文件该位置的时间与所求时间相同*/if((temp.year==date.year)&&(temp.month==date.month)&&(temp.day==date.day)){/*当天备忘个数的计数*/count_memo++;for(i=0;i<300;i++)date.memo[i]=temp.memo[i];printf("\n\t\t\t备忘%d:%s\n",count_memo,date.memo);}}/*如果没有相同日期的话*/if(count_memo==0)printf("\t\t\t\t该日暂无备忘\n\n");printf("\n");fclose(fp);}/*我是分割线*//*备忘写入*/voidmemo_written(){/*定义文件指针*/FILE*fp;/*打开文件*/if((fp=fopen("calender.txt","ab+"))==NULL){printf("\n\t\t\t\t打开文件失败\n\n\t\t\t");return;}/*输入备忘*/scanf("%s",date.memo);/*写入备忘*/if(fwrite(&date,sizeof(structdate_message),1,fp)==1){system("cls");printf("\n\t\t\t\t备忘存入成功\n\n\t\t\t");}else{system("cls");printf("\n\t\t\t\t备忘存入失败\n\n\t\t\t");}fclose(fp);}/*我是分割线*//*备忘修改*/voidmemo_modify(){/*定义文件指针*/FILE*fp;/*定义变量*/inti=0,t,count=0;structdate_messagetemp;/*打开文件*/if((fp=fopen("calender.txt","rb+"))==NULL){printf("\n\n\n\n\n\n\n\n\n\t\t\t打开文件失败\n\n");return;}printf("请输入要修改第几条备忘\n");/*输入需要修改第几条备忘*/scanf("%d",&t);if(!(t>0&&t<=count_memo)){printf("输入错误!该次操作失败\n!");getch();system("cls");exit(0);}printf("请输入要修改的内容\n");/*输入备忘*/scanf("%s",&date.memo);/*在文件中寻找该日期*/while(1){/*移动指针位置*/fseek(fp,i*sizeof(structdate_message),0);/*到文件无法读取时退出*/if(fread(&temp,sizeof(structdate_message),1,fp)!=1)break;/*如果文件中的时间与所求时间相同*/if((temp.year==date.year)&&(temp.month==date.month)&&(temp.day==date.day)){/*备忘计数+1*/count++;/*对应上同一个备忘的时候*/if(count==t){fseek(fp,i*sizeof(structdate_message),0);/*覆盖*/fwrite(&date,sizeof(structdate_message),1,fp);break;}}i++;}printf("\n\t\t\t\t修改成功!\n\n");getch();system("cls");fclose(fp);}/*我是分割线*//*当日备忘删除*/voidmemo_delete(){/*定义文件指针*/FILE*fp;/*定义变量*/inti=0,t,choice,count=0;structdate_messagetemp1={0,0,0,"\0"};structdate_messagetemp2;/*确认信息*/printf("确认要删除当日备忘吗(y/n)?");/*如果输入y的话删除*/if(!(getchar()=='y'||'Y')){printf("未删除该日任何备忘\n");getch();system("cls");exit(0);}printf("(1)删除单条备忘or(2)删除当日所有备忘?\n请输入1或2进行选择\n");scanf("%d",&choice);switch(choice){case1:printf("请输入要删除第几条备忘\n");/*输入要删除第几条备忘*/scanf("%d",&t);if(!(t>0&&t<=count_memo)){printf("输入错误!该次操作失败!");getch();system("cls");exit(0);}/*打开文件*/if((fp=fopen("calender.txt","rb+"))==NULL){printf("打开文件失败\n\n");return;}/*在文件中查找输入的年月日的信息*/while(1){fseek(fp,i*sizeof(structdate_message),0);if((fread(&temp2,sizeof(structdate_message),1,fp))!=1)break;if((temp2.year==date.year)&&(temp2.month==date.month)&&(temp2.day==date.day)){count++;if(count==t){fseek(fp,i*sizeof(structdate_message),0);/*将空的覆盖上去*/fwrite(&temp1,sizeof(structdate_message),1,fp);break;}}i++;}printf("单条备忘删除成功!\n");getch();system("cls");fclose(fp);break;case2:/*打开文件*/if((fp=fopen("calender.txt","rb+"))==NULL){printf("打开文件失败\n\n");return;}/*在文件中查找输入的年月日的信息*/while(1){fseek(fp,i*sizeof(structdate_message),0);if(fread(&temp2,sizeof(structdate_message),1,fp)!=1)break;if((temp2.year==date.year)&&(temp2.month==date.month)&&(temp2.day==date.day)){fseek(fp,i*sizeof(structdate_message),0);fwrite(&temp1,sizeof(structdate_message),1,fp);}i++;}printf("当日所有备忘删除成功!\n");getch();system("cls");fclose(fp);break;default:printf("输入错误!操作失败!");getch();system("cls");exit(0);}}/*我是分割线*//*全部备忘删除*/voidmemo_delete_all(){/*定义文件指针*/FILE*fp;/*定义变量*/inti=0;structdate_messagetemp1={0,0,0,"\0"};structdate_messagetemp2;if(!(getchar()=='y'||'Y')){printf("未删除任何备忘\n");getch()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东省江门市2025届高三下学期一模化学试题(解析版)
- 一级建造师执业资格考试(建设工程经济)模拟试题(2025年承德)
- 特殊教育概论考编试题及答案
- 食品生产企业食品安全管理人员知识考试题库(附答案)
- 陕西建筑三类人员考试题库及答案2026
- 江西省贵溪市事业单位考试职业能力倾向测验(中小学教师类D类)强化训练题库及答案
- 护理编制考试试题及答案
- 【新教材】人教版(2024)七年级上册英语Unit 6 A Day in the Life教案(9课时)
- 广东省鹤山市事业单位考试职业能力倾向测验(中小学教师类D类)强化训练题库及答案
- 安全生产管理人员考试题库(带答案)
- YC-T 591-2021 烟草行业实验室安全管理要求
- 中国产业政策研究综述
- 人教版(2019)高中物理必修第三册《第1单元-静电场及其应用》测试卷(A卷)(含答案解析)
- 中国文化与文学精粹智慧树知到期末考试答案章节答案2024年西安交通大学
- 时代的脉搏-社会风尚与美术的发展 课件-2023-2024学年高中美术湘美版(2019)美术鉴赏
- 2020初中物理自制教具-初中物理自制教具大全
- 中外城市建设史(全套课件595P)
- 冲压模具设计-3
- GB/T 9797-2022金属及其他无机覆盖层镍、镍+铬、铜+镍和铜+镍+铬电镀层
- 2022年初中学业水平考试-体育与健康综合知识考试参考题库(重点500题)
- 外研版四年级英语下册阅读理解真题
评论
0/150
提交评论