[设计]c语言程序课程设计日记本管理系统_第1页
[设计]c语言程序课程设计日记本管理系统_第2页
[设计]c语言程序课程设计日记本管理系统_第3页
[设计]c语言程序课程设计日记本管理系统_第4页
[设计]c语言程序课程设计日记本管理系统_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、c语言程序课程设计日记本管理系统日记管理系统的开发设计实验目的、要求一、实验题目:设计一个简单实用个人日记管理系统。二、实验要求1该实验的课内学时是4个课时。2程序完成后应该完成如下基本功能:1)用自定义日记的存储结构,每篇日记至少包含日期,内容等字段;2)使用者必须输入密码;3)写日记与保存功能;4)日记查阅:按日期查看,按关键字查看,按顺序查看功能(从某一篇开始)3在完成上述基本功能的前提下,有能力的同学可以完成如下加强功能:1)实现日记的永久存储。2)对保存的密码进行变换,以免泄密。3)允许多人使用。4)在程序的提示语言清晰明确,界面美观并且适用。实验步骤与内容一)主要设计思想 日记管理

2、系统设计,应分模块进行。首先一个注册、登录的用户界面,编写函数保存用户已录入信息,及密码。编写函数用于验证用户登录信息,并进行匹配。有能力的话,可以添加一个用户密码修改功能 当用户注册,登录匹配成功以后,进入其个人日记管理界面。其中应当包含一些日记处理基本操作:写日记、保存、打开、各种方式查询、删除。各个功能分别用函数来实现,最后主函数用case语句调用各函数。二)主要数据结构及其解释1日记结构体typedef struct Link1 char date10; /日期 格式2011-05-11 char title40; /标题 char content1000; /日记内容 char ke

3、yword20; /关键字,可用空格隔开 int tag; /用来标记该日记是否满足查阅要求,是为0,否为-1,初始值为0; struct Link1 *nextd; Diary;2用户结构体typedef struct Link2 char username25; /用户名 char password16; /登录密码 Diary *diarys_list; /该用户拥有的日记链表 struct Link2 *nextu; User;三)系统结构图: 四)所有函数的简要说明:int Change_Password(User *U2); /*更改用户密码*/ int Create_NewUse

4、r(User *U1); /*创建用户链表*/ int Delete_Diary(Diary *D); /*删除日记*/ int Diary_Operation(User *U2,Diary *D1); /*日记操作*/ int Encrypt_Password(char password);/* 将登录口令加密*/ int Enter_Password(char password);/* 获取登录口令*/ User *Find_User(User *U1,char username);/*查找用户*/ Diary *Init_Diary(Diary *D1);/*初始化日记表*/ void

5、Initial_Tag(Diary *D1,int tag); User *Init_User(User *U1);/*初始化用户表*/ int Input_Choose(); int Open_Diary(Diary *D1); Diary *Open_DiaryFile(Diary *D1,char FileName);/* 打开并导入日记文件*/ int Printf_DiaryList(Diary *D1);/*显示日记列表*/ void Print_Menu1(int *choose1);/*进入菜单*/ void Print_Menu2(int *choose2);/*进入日记菜单

6、*/ void Print_Menu3(int *choose3);/*进入日记查阅菜单*/ int Printf_users(User *U1);/*导入用户信息*/ int Save_Diary(Diary *D1);/*保存日记*/ int Save_Users_info(User *U1);/*保存用户信息*/ int Search_Diary(Diary *D1);/*日记查询*/ Diary *Filter_word(Diary *D1,char cmpword,int n);/*按标题、日期、关键字查阅*/ User *User_Login(User *U1);/* 登录个人用户

7、*/ int Write_Diary(Diary *D1);/* 写新日记*/试验过程记录记录试验中遇到的困难及解决方法;,1.在编写字符匹配的函数时,利用flag当监视哨,当判断字符匹配成功后,未跳出本次循环,导致单个结果多次输出。解决方法:在匹配成功输出结果后加一个goto 语句跳出循环,进行下一个节点比较。2.在写筛选函数的时候,把筛选查找直接写成了筛选算法,这样输入的数据经过一次筛选后,不符合条件的就被删除了。这样不利于重复进行筛选操作。解决方案:在结构体中加一个fflag单元,当每次判断不符合条件的节点,将其fflag赋值为0,否则赋1。输出时将fflag!=0的输出。3.本程序用到

8、双链表,注意指针指向。实验结果记录以及与预期结果比较以及分析记录每次实验结果以及分析情况1.创建用户: 用户名jiang,密码123 2.显示用户,及登录:输入用户名jiang,密码123. 3.写日记:标题:夏热 标题:端午 4.保存及读取: 5.输入查阅,标题: 端午 输入关键字晴天,查询: 6.日记删除操作: 实验结论:经验证,以上筛选结果正确。总结以及心得体会本次试验的其实很想自己想的,可是自己真的写不出来这么长的,只能半借鉴半写,所以我只能说懂这个程序,会用,但是,让我自己写,还是很有难度的,太多了,写的头痛,纠结死了,花了我好长时间,一直纠结到现在,自己写了300多行,可是有点问题

9、,远不如同学的,就把自己的改了,我只能写一些小程序,像运用到归纳啊,贪心这些。注意一些常出现的错误:1.字符匹配时要注意,字符串长度应为输入长度再加1.(0占一个空间) 2.注意指针指向问题,最好用两个指针,一个用于判断结束,一个用于输出所需值。3.可以用flag设置监视哨,判断是否找到所需结果。 历经千辛万苦,终于编出来了。发现指针这一块还有很多漏洞。比如插入时未将尾指针赋空值,导致了很多问题。还有特别要注意对字符串操作时的长度问题。总之,吃一堑,长一智,在自己编程实践,请教同学的过程中,学到很多很多。不过指针那方面的知识还是有些模糊不够熟练,有待加强。指导老师评阅意见指导老师: 年 月 日

10、/* 日记管理系统*/#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>#define ESC 27 /退出键#define Enter 13 /回车键#define BackSpace 8/*定义日记结构体*/typedef struct Link1 char date10; /日期 格式2009-12-30 char title40; /标题 char content1000; /日记内容 char keyword20; /关键字,可用空格隔开 int

11、tag; /用来标记该日记是否满足查阅要求,是为0,否为-1,初始值为0; struct Link1 *nextd; Diary;/*定义用户结构体*/typedef struct Link2 char username25; /用户名 char password16; /登录密码 Diary *diarys_list; /该用户拥有的日记链表 struct Link2 *nextu; User;/* 函数声明*/ int Change_Password(User *U2); /*更改用户密码*/ int Create_NewUser(User *U1); /*创建用户链表*/ int Del

12、ete_Diary(Diary *D); /*删除日记*/ int Diary_Operation(User *U2,Diary *D1); /*日记操作*/ int Encrypt_Password(char password);/* 将登录口令加密*/ int Enter_Password(char password);/* 获取登录口令*/ User *Find_User(User *U1,char username);/*查找用户*/ Diary *Init_Diary(Diary *D1);/*初始化日记表*/ void Initial_Tag(Diary *D1,int tag);

13、 User *Init_User(User *U1);/*初始化用户表*/ int Input_Choose(); int Open_Diary(Diary *D1); Diary *Open_DiaryFile(Diary *D1,char FileName);/* 打开并导入日记文件*/ int Printf_DiaryList(Diary *D1);/*显示日记列表*/ void Print_Menu1(int *choose1);/*进入菜单*/ void Print_Menu2(int *choose2);/*进入日记菜单*/ void Print_Menu3(int *choose

14、3);/*进入日记查阅菜单*/ int Printf_users(User *U1);/*导入用户信息*/ int Save_Diary(Diary *D1);/*保存日记*/ int Save_Users_info(User *U1);/*保存用户信息*/ int Search_Diary(Diary *D1);/*日记查询*/ Diary *Filter_word(Diary *D1,char cmpword,int n);/*按标题、日期、关键字查阅*/ User *User_Login(User *U1);/* 登录个人用户*/ int Write_Diary(Diary *D1);/

15、* 写新日记*/* 更改用户密码*/int Change_Password(User *U2) char oldpw16,newpw116,newpw216; do printf("nt请输入旧密码:t"); Enter_Password(oldpw); /调用输入密码函数 Encrypt_Password(oldpw); /调用对密码加密函数 if(strcmp(U2->password,oldpw)!=0) /如果输入的密码与各个用户中的密码不相等 printf("nt旧密码输入错误!.nn"); while(strcmp(U2->pas

16、sword,oldpw)!=0);/一直到输入的密码与用户密码相等的时候才退出循环 do printf("nt请输入新密码:t"); Enter_Password(newpw1); printf("nt请确认新密码:t"); Enter_Password(newpw2); if(strcmp(newpw1,newpw2)!=0) printf("nt密码确认错误!.nn"); while(strcmp(newpw1,newpw2)!=0); /到输入的新密码与确认的新密码一样的时候退出循环 Encrypt_Password(newpw

17、1); /对新密码进行加密 strcpy(U2->password,newpw1); /讲新密码复制给旧密码,就把旧密码覆盖掉了,密码就修改完毕 printf("nnt密码修改成功!."); return 1;/* 创建用户链表*/int Create_NewUser(User *U1) int flag=0; char password216; User *s,*temp; Diary *D2=NULL; D2=Init_Diary(D2); do s=(User *)malloc(sizeof(User); printf("nt请输入用户名:t"

18、;); scanf("%s",&s->username); temp=Find_User(U1,s->username); if(temp=NULL) do printf("nt请输入密码:t"); Enter_Password(s->password); printf("nt请确认密码:t"); Enter_Password(password2); if(strcmp(s->password,password2)!=0) printf("nt密码确认错误!.nn"); while(

19、strcmp(s->password,password2)!=0); Encrypt_Password(s->password); s->diarys_list=D2; s->nextu=U1->nextu; U1->nextu=s; flag=0; printf("nt用户创建成功!.n"); else printf("nnt*对不起*该用户名已存在!n"); printf("nt是否继续创建用户:1/0t"); scanf("%d",&flag); while(fla

20、g); return 1;/* 删除日记*/int Delete_Diary(Diary *D) Diary *p; p=D->nextd; D->nextd=p->nextd; free(p); printf("nt日记删除成功."); return 1;/* 日记操作*/int Diary_Operation(User *U2,Diary *D1) char tempch='1' int choose2; char FileName40; Diary *p=NULL; while(tempch!=ESC) printf("nt

21、tt欢迎用户-“%s”的到来!.nn",U2->username); Print_Menu2(&choose2); switch(choose2) case 0:return 0; case 1: Write_Diary(D1); tempch=getch(); /用来每次做完一项指令后按回车之后返回选择操作 break; case 2: printf("nt请输入文件路径及文件名:"); scanf("%s",FileName); p=Open_DiaryFile(D1,FileName); /调用该函数返回该文件名里面的内容并

22、赋值给p if(p!=NULL) Open_Diary(p); /如果该文件夹里面不为空,就调用打开日记函数,将文件夹里面的内容打印出来 tempch=getch(); ;break; case 3: printf("nnt该用户有以下日记:nn"); Printf_DiaryList(D1); tempch=getch(); break; case 4: if(Search_Diary(D1)=1) tempch=getch(); break; /打开帮助文件 case 5: Change_Password(U2); tempch=getch(); break; retu

23、rn 1;/* 将登录口令加密*/int Encrypt_Password(char password) int i=0; while(passwordi!='0') if(passwordi>='a'&&passwordi<='z')|(passwordi>='A'&&passwordi<='Z') /当passwordi为az或AZ时 passwordi=passwordi+4; /将每个字符进行加4, if(passwordi>'Z'

24、;&&passwordi<='Z'+4|passwordi>'z') passwordi=passwordi-26; else if(passwordi>='0'&&passwordi<='9') passwordi=passwordi+4; if(passwordi>'9'&&passwordi<='9'+4) passwordi=passwordi-10; else passwordi=passwordi+4;

25、i+; return 1;/* 获取登录口令*/int Enter_Password(char password) char password150; int i=0; while(password1i=getch()!=Enter) /将手动输入的字符读入password1i中,Enter为终结符 passwordi=password1i; /将得到的password1中的数赋给password; password1i='*' printf("%c",password1i); /打印出出*号,即将密码隐藏只打印出*号 i+; passwordi='

26、0' rewind(stdin); return 1;/*查找用户*/User *Find_User(User *U1,char username) User *q; q=U1->nextu; while(q!=NULL&&strcmp(q->username,username)!=0) q=q->nextu; /一直循环到q等于NULL或者找到与username一样的用户名的用户 if(q!=NULL) return q; /找到就返回该用户 else return NULL; /否则就返回NULL/*初始化日记表*/Diary *Init_Diar

27、y(Diary *D1) D1=(Diary *)malloc(sizeof(Diary); /为用户D1申请空间 D1->nextd=NULL; return D1;/* 将所有日记记录的标记tag值置为0或-1*/void Initial_Tag(Diary *D1,int tag) Diary *q; q=D1->nextd; while(q!=NULL) q->tag=tag; q=q->nextd; /*初始化用户表*/User *Init_User(User *U1) U1=(User *)malloc(sizeof(User); if(U1!=NULL)

28、U1->nextu=NULL; return U1; else return NULL;/* 打开日记*/int Open_Diary(Diary *D1) printf("nt-n"); printf("nt日记日期=>%s",D1->date); printf("nt日记标题=>%s",D1->title); printf("nnt关键字=>%s",D1->keyword); printf("nt-n"); printf("nnt日记正文如

29、下:n"); printf("nt%s",D1->content); return 1;/* 打开并导入日记文件*/Diary *Open_DiaryFile(Diary *D1,char FileName)FILE *fp; Diary *p=NULL; if(fp=fopen(FileName,"r")=NULL) /将文件名为FileName的文件赋给文件名fp并打开 printf("t文件打开失败!"); return NULL; else p=(Diary *)malloc(sizeof(Diary); fs

30、canf(fp,"t日期: %sn",p->date); /将文件fp中的内容赋给p fscanf(fp,"t标题: %sn",p->title); fscanf(fp,"t关键字: %sn",p->keyword); fscanf(fp,"t正文如下:nt%sn",p->content); p->tag=0; p->nextd=D1->nextd; /将p接到D1后面,后插法 D1->nextd=p; fclose(fp); /对于文件的操作,最后都要对打开的文件进

31、行关闭操作 return p; /返回p /*导入用户信息*/int Open_Users_info(User *U1) FILE *fp; User *U2=NULL,*U3=NULL; Diary *D1=NULL,*D2=NULL; char filepn20,tempstr80;/*用来存放文件保存路径以及文件名,tempstr是用来保存文件的保存路径*/ if(fp=fopen(filepn,"r")=NULL) printf("不能打开文件!n"); return 0; else fscanf(fp,"%sn",temps

32、tr); /将文件fp写入字符型tempstr中,这样才可以分别与字符串“User”和"Diary"进行复制 while(strcmp(tempstr,"User:")=0&&(!feof(fp)/循环用来一条一条的读出文件中的每一个用户以及用户的信息 U2=(User *)malloc(sizeof(User);/申请一个空间用来存放每一条的用户信息 fscanf(fp,"用户名:%80sn",U2->username);/将文件中的每一个用户名写到U2->username中 fscanf(fp,&quo

33、t;密码:%80sn",U2->password); fscanf(fp,"%80s",tempstr); D1=(Diary *)malloc(sizeof(Diary); D1=Init_Diary(D1); U2->diarys_list=D1; while(strcmp(tempstr,"Diary:")=0&&(!feof(fp)/将属于该用户的日记信息一条一条的全部读出 D2=(Diary *)malloc(sizeof(Diary); fscanf(fp,"t日期: %sn",D2-

34、>date); fscanf(fp,"t关键字: %sn",D2->keyword); fscanf(fp,"t标题: %sn",D2->title); fscanf(fp,"t日记内容: n%snn",D2->content); fscanf(fp,"%sn",tempstr); D2->tag=0; D2->nextd=D1->nextd; D1->nextd=D2; /D2->nextd=NULL; /由前往后进行导入 /D1->nextd=D2;

35、/D1=D1->nextd; U2->nextu=U1->nextu; U1->nextu=U2;/跟上面的插入方法是一样的 fscanf(fp,"nn"); fclose(fp); return 0;/*显示日记列表*/int Printf_DiaryList(Diary *D1) int count=0; Diary *D; D=D1; printf("n"); if(D->nextd=NULL) printf("t没有日记信息!.n"); else while(D->nextd!=NULL)

36、D=D->nextd; if(D->tag=0) count+; printf("t第%2d篇=>时间:%-10s 日记标题:%-20s t关键字:%-sn",count,D->date,D->title); printf("t关键字:%-sn",D->keyword); return count;/*进入菜单并选择操作*/ void Print_Menu1(int *choose1) printf("ntt “日记管理系统”(ESC退出)n"); printf("t|n");

37、printf("t| 1.用户登录 2.新建用户 3.显示用户列表 |n"); printf("t|n"); do printf("nt请选择操作:t"); scanf("%d",choose1); while(*choose1<0|*choose1>3); rewind(stdin); /*清空键盘缓冲区里的无用字符*/*进入日记菜单并选择操作*/ void Print_Menu2(int *choose2) printf("nttt “日记操作”(ESC返回上级)n"); pri

38、ntf("t|n"); printf("t| 1.写日记 2.导入日记 3.查阅与删除 4.更改用户密码 |n"); printf("t|n"); do printf("nt请选择操作:t"); scanf("%d",choose2); while(*choose2<0|*choose2>5); rewind(stdin); /*清空键盘缓冲区里的无用字符*/*进入日记查阅菜单*/ void Print_Menu3(int *choose3) printf("ntt “日记

39、查阅与删除”(ESC返回上级)n"); printf("t|n"); printf("t| 1.日记列表 2.按标题查阅 3.按日期查阅 4.按关键字查阅 |n"); printf("t|n"); do printf("nt请选择操作:t"); scanf("%d",choose3); while(*choose3<0|*choose3>5); rewind(stdin); /*清空键盘缓冲区里的无用字符*/* 显示用户列表*/int Printf_users(User *

40、U1) int count=0; User *p; p=U1; printf("nnt用户信息列表如下:nn"); if(U1->nextu=NULL) printf("nt没有用户信息!.n"); else while(p->nextu!=NULL) p=p->nextu; count+; printf("t第%d个用户=>用户名:%sn",count,p->username); return 1;/* 日记保存*/int Save_Diary(Diary *D1)FILE *fp; char File

41、Name40,postfix6=".txt0" printf("t请输入文件路径及文件名:"); scanf("%s",FileName); if(fp=fopen(FileName,"w+")=NULL) printf("t打开文件失败!"); return 0; fprintf(fp,"t日期: %sn",D1->date); fprintf(fp,"t标题: %sn",D1->title); fprintf(fp,"t关键字:

42、%sn",D1->keyword); fprintf(fp,"t正文如下:nt%sn",D1->content); fclose(fp); printf("t日记文件保存成功!"); return 1;/* 保存用户信息*/int Save_Users_info(User *U1) FILE *fp; Diary *D1; int temp; char filepn20;/*用来存放文件保存路径以及文件名*/ printf("nnt-n"); printf("t是否保存本次使用所做的所有操作?.t1-是

43、 0-否t"); printf("nt-nt"); printf("请选择操作:t"); scanf("%d",&temp); if(temp=1) strcpy(filepn,"Users_info.txt"); if(fp=fopen(filepn,"w+")=NULL) printf("不能打开文件!n"); return 0; while(U1->nextu!=NULL) fprintf(fp,"User:n"); U1=U

44、1->nextu;/*下移一个结点*/ fprintf(fp,"用户名:%sn密码:%sn",U1->username,U1->password); D1=U1->diarys_list; while(D1->nextd!=NULL) D1=D1->nextd; fprintf(fp,"Diary:n"); fprintf(fp,"t日期:%snt关键字: %sn",D1->date,D1->keyword); fprintf(fp,"t标题:%sn",D1->

45、title); fprintf(fp,"t日记内容:n%sn",D1->content); fclose(fp); return 0;/* 日记查阅*/int Search_Diary(Diary *D1) char tempch='1' char cmpword20; int choose3; Diary *p; while(tempch!=ESC) Print_Menu3(&choose3); p=D1; if(p->nextd=NULL) printf("nt没有日记.n"); else switch(choos

46、e3) case 0: return 0; case 1: printf("nt该用户有以下日记:nn"); Printf_DiaryList(D1); break; case 2:Search_order(D1);break; case 3: printf("nt请输入要查阅的日记标题:t"); scanf("%s",cmpword); Filter_word(D1,cmpword,1); break; /按标题查阅 case 4: printf("nt请输入要查阅的日记日期(2009-4-11):t"); sc

47、anf("%s",cmpword); Filter_word(D1,cmpword,2); break; /按日期查阅 case 5: printf("nt请输入要查阅的关键字(如:想你):t"); scanf("%s",cmpword); Filter_word(D1,cmpword,3); break; /按关键字查阅 Initial_Tag(D1,0); tempch=getch(); rewind(stdin); /*清空键盘缓冲区里的无用字符*/ return 1;/*按标题、日期、关键字查阅*/Diary *Filter_word(Diary *D1,char cmpword,int n) /采用的是筛选算法 char *temp=NULL; Diary *D,*D2; Initial_Tag(D1,0); /将每一篇日记都编辑成可查找状态 D=D1; while(D->nextd!=NULL) /对没有都进行比较 if(n=1) temp=strstr(D->nextd->title,cmpword); /strstr函数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论