当前位置:文档之家› 万年历+备忘录(C语言课程设计)

万年历+备忘录(C语言课程设计)

/*湖南大学数学与应用数学胡凡C语言课程设计万年历+备忘录命令提示行完成于2011年完整版*//*-------------------------------我是分割线-------------------------------*/ /*命令行功能选项*//*-d:显示当月日历和当日备忘*//*-i:显示当月日历和添加当日备忘*//*-m:显示当月日历和修改当日备忘*//*-g:删除当日备忘*//*-t:删除全部备忘*//*-------------------------------我是分割线-------------------------------*/ /*头文件*/#include<stdio.h>#include<stdlib.h>#include<unistd.h> /*调用getopt函数*//*定义全局变量(各月所含天数)*/int a[]={0,31,0,31,30,31,30,31,31,30,31,30,31};/*定义结构体*/struct date_message{int year; /*年*/int month; /*月*/int day; /*日*/char memo[300]; /*备忘*/}date={1,1,1,"\0"};/*-------------------------------我是分割线-------------------------------*/ /*主函数*/int main(int argc,char *argv[]){/*函数声明*/void checkDate(); /*检查日期合法性*/ void show_calender(); /*显示日历*/void memo_written(); /*写入备忘*/void memo_modify(); /*修改备忘*/void memo_delete(); /*删除当日备忘*/void memo_delete_all(); /*删除全部备忘*/void memo_read(); /*读取备忘*//*定义变量*/int choice;/*使用getopt函数分析命令行参数,识别选项*/while((choice=getopt(argc,argv,"d:i:m:g:t"))!=-1){ /*选项*/switch(choice){ /*选项为d时,显示当月日历和当日备忘*/case 'd':/*调用atoi函数,将字符型数字转化为整型*/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();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();printf("请输入该日修改后的备忘\n");/*修改备忘*/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();/*确认信息*/printf("确认要删除当日备忘吗(y/n)?");/*如果输入y的话删除*/if(getchar()=='y'||'Y')memo_delete();break;/*选项为t时,删除全部备忘*/case 't':/*确认信息*/printf("确认要删除全部备忘吗(y/n)?");/*如果输入y的话删除全部*/if(getchar()=='y'||'Y')memo_delete_all();getchar();break;}}printf("\t\t Please any key to continue…………");getchar();system("cls");return 0;}/*-------------------------------我是分割线-------------------------------*//*显示当月日历*/void show_calender(){/*函数调用声明*/int leap(int t_year);/*定义函数*/int sum=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);else printf("1日\n");/*计算某月第一天是星期几,以2011年1月1日星期六为基点,计算某月第一天距离基点的天数除以7取余*//*当某年不低于2011年*/if(date.year>=2011){/*加上整年的天数*/for(temp_year=2011;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);}/*当某年低于2011年*/if(date.year<2011){/*加上整年的天数*/for(temp_year=2011;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\t Sun Mon Tue Wed Thu Fri Sat\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);else printf("\b[%d] ",date.day);}/*普通日期无特别表示*/else printf("%-5d",temp_day);/*计数增加*/count+=5;/*当一行已输出38个位数的时候换行(除每行开头的一堆空格外)*/if(count==38){printf("\n ");count=3;}}printf("\n");}/*-------------------------------我是分割线-------------------------------*//*备忘读取*/void memo_read(){/*定义文件指针*/FILE *fp;/*定义变量*/int i=0;struct date_message temp={0,0,0,"\0"};/*打开文件*/if((fp=fopen("calender","ab+"))==NULL){printf("\t\t\t\t\n");return;}/*查找文件中是否有相同的日期*/do{if(fread(&temp,sizeof(struct date_message),1,fp)!=1)break;}while((temp.year!=date.year)||(temp.month!=date.month)||(temp.day!=date.day));/*如果没有相同日期的话*/if((temp.year!=date.year)||(temp.month!=date.month)||(temp.day!=date.day)) printf("\t\t\t\t该日暂无备忘\n\n");/*如果有相同日期的话*/else if(date.memo=="\0")printf("\n\t\t\t\t该日暂无备忘\n\n");/*有备忘则输出备忘*/else{for(i=0;i<300;i++)date.memo[i]=temp.memo[i];printf("\n\t\t\t备忘:%s\n\n",date.memo);}fclose(fp);}/*-------------------------------我是分割线-------------------------------*/ /*备忘写入*/void memo_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(struct date_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);}/*-------------------------------我是分割线-------------------------------*/ /*备忘修改*/void memo_modify(){/*定义文件指针*/FILE *fp;/*定义变量*/int i=0;struct date_message temp;/*打开文件*/if((fp=fopen("calender","rb+"))==NULL){printf("\n\n\n\n\n\n\n\n\n\t\t\t 打开文件失败\n\n");return;}/*输入备忘*/scanf("%s",&date.memo);/*在文件中寻找该日期*/do{fseek(fp,i*sizeof(struct date_message),0);if(fread(&temp,sizeof(struct date_message),1,fp)!=1)break;i++;}while((temp.year!=date.year)||(temp.month!=date.month)||(temp.day!=date.day));/*如果没有的话添加备忘*/if((temp.year!=date.year)||(temp.month!=date.month)||(temp.day!=date.day)) fwrite(&date,sizeof(struct date_message),1,fp);/*有的话修改*/else{fseek(fp,(i-1)*sizeof(struct date_message),0);fwrite(&date,sizeof(struct date_message),1,fp);}printf("\n\t\t\t\t 修改成功!\n\n");getchar();system("cls");fclose(fp);}/*-------------------------------我是分割线-------------------------------*//*当日备忘删除*/void memo_delete(){/*定义文件指针*/FILE *fp;/*定义变量*/struct date_message temp1={0,0,0,"\0"};struct date_message temp2;/*打开文件*/if((fp=fopen("calender","rb+"))==NULL){printf("打开文件失败\n\n");return;}/*在文件中查找是否有输入的年月日的信息*/do{fseek(fp,i*sizeof(struct date_message),0);if((fread(&temp2,sizeof(struct date_message),1,fp))!=1)break;i++;}while((temp2.year!=date.year)||(temp2.month!=date.month)||(temp2.day!=date.day));/*没有的话返回*/if((temp2.year!=date.year)||(temp2.month!=date.month)||(temp2.day!=date.day)){fclose(fp);printf("该日无备忘!\n\n");getchar();return;}else/*有的话覆盖*/{fseek(fp,(i-1)*sizeof(struct date_message),0);fwrite(&temp1,sizeof(struct date_message),1,fp);i++;printf("删除成功!\n\n");}getchar();fclose(fp);}/*-------------------------------我是分割线-------------------------------*//*全部备忘删除*/void memo_delete_all(){/*定义文件指针*/FILE *fp;/*定义变量*/struct date_message temp1={0,0,0,"\0"};struct date_message temp2;/*打开文件*/if((fp=fopen("calender","wb+"))==NULL){printf("打开文件失败\n\n");return;}/*将位置指针依次后移,将所有的内容覆盖*/do{fseek(fp,i*sizeof(struct date_message),0);if(fread(&temp2,sizeof(struct date_message),1,fp)!=1)break;fseek(fp,i*sizeof(struct date_message),0);fwrite(&temp1,sizeof(struct date_message),1,fp);i++;}while(1);printf("全部删除成功!\n\n");fclose(fp);}/*-------------------------------我是分割线-------------------------------*//*判断输入的日期是否合法*/void checkDate(){/*函数声明*/int leap(int t_year);/*如果给定的日期中年份部分为非正数*/if(date.year<=0){printf("年份不符合要求!\n");printf("请重新输入。

相关主题