日记管理系统.docx

上传人:小飞机 文档编号:5332507 上传时间:2023-06-27 格式:DOCX 页数:40 大小:231.91KB
返回 下载 相关 举报
日记管理系统.docx_第1页
第1页 / 共40页
日记管理系统.docx_第2页
第2页 / 共40页
日记管理系统.docx_第3页
第3页 / 共40页
日记管理系统.docx_第4页
第4页 / 共40页
日记管理系统.docx_第5页
第5页 / 共40页
亲,该文档总共40页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《日记管理系统.docx》由会员分享,可在线阅读,更多相关《日记管理系统.docx(40页珍藏版)》请在三一办公上搜索。

1、福建工程学院实验报告专业计算机科学与技术班级 计算机1001座 号姓名日期 2012/5/14福建工程学2010-2011 学年第一学期任课老师: 章静实验题目日记管理系统的开发实验时间实验开始日期:20120503 报告提交日期:20120514实验目的、要求一、实验题目:设计一个简单实用个人日记管理系统。二、实验要求1. 该实验的课内学时是4个课时。2. 程序完成后应该完成如下基本功能:1)用自定义日记的存储结构,每篇日记至少包含日期,内容等字段;2)使用者必须输入密码;3)写日记与保存功能;4)日记查阅:按日期查看,按关键字查看,按顺序查看功能(从某一篇开 始)3. 在完成上述基本功能的

2、前提下,有能力的同学可以完成如下加强功能:1)实现日记的永久存储。2)对保存的密码进行变换,以免泄密。3)允许多人使用。4)在程序的提示语言清晰明确,界面美观并且适用。实验设计内容(实验设计的数据结构尸定义日记结点类型*/typedef struct Diary(char &血值/*日期*/char城尸日记标题*/int flag;/*判断日记是否符合查阅要求,是为0,否为/struct Diary *next;Diary;卢定义用户结点类型*/typedef struct User(char name囹,,/*用户名*/char password/207;/* 登录密码*/int count

3、;/*该用户拥有的日志的个效*/Diary *尸指向用户拥有的日记链表的表头*/ struct User *next;%Uer;最后的用户信息以及在该用户目录下的日志信息以二进制的形式存在文件中。(2)总体函数模块结构图:(3)重点函数分析1. 初始化函数:程序运行会运行此函数,讲已有的用户信息和她们的日志信息读入链表中。Us Init()FILE *fp1,*fp2;Us L=NULL;User *p;Diary *s;if (fp1=fopen(”Userlist.txt”,”r+”)=NULL) return L; while(!feof(fp1) p=(User *)malloc(si

4、zeof(User);if(fread(p,sizeof(User),1,fp1)!=1) break;从一个流中读取数据(接受数据的指针,单个元素的大小,元素个数,提供数据的文件指针)p-first=NULL;读取系统已有的用户信息p-next=L; L=p; chdir(p-name);/把相应用户目录作为当前工作目录if(fp2=fopen(”dairylist.txt”,”r”)=NULL) continue;elsewhile(!feof(fp2)s=(Diary *)malloc(sizeof(Diary);读取系统相应用户的相应日记信息if(fread(s,sizeof(Diar

5、y),1,fp2)!=1) break; s-next=L-first; /first为该用户的节点拥有的日志链表 L-first=s; fclose(fp2);关闭存储日志信息的文件,把父目录作为当前工作目录fclose(fp1);return(L);2. 登录结构流程图:开始代码:/*用户登录函数*/ void Login(Us L) char temp20; char flag;int i,j,count;User *p;Diary *s;P=L;system(cls);printf(ntttlAAAAAAAAAAAAAAAAAAAAAAAln);printf(tttlt 用户登 Atl

6、n);printf(ttt|AAAAAAAAAAAAAAAAAAAAAAA|n);printf(nt已有的用户名:n);printf(tt|AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA|n);用户名 ttln);printf(tt|t 序号 t count=1;while(p!=NULL)printf(ttlt%dt p=p-next;count+;将已经有的用户名和对应序号打印出来%stt|n,count,p-name);printf(ttlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAln);count-;printf(nn

7、t 输入序号:tt);i=Input_Integer();这样我们在选择序号时输入字符也不会造成死循环while(icountlli=-1)printf(nn t输入序号错误”);printf(nt是否继续进行输入:(丫 or N)”);scanf(%c,&flag);if(flag=Nllflag=n)return;printf(nnt 输入序号:tt);scanf(%d”,&i);jT;p=L;while(jnext;printf(nt 你选择的用户:tt%s”,p-name);printf(nt 输入密码:tt);Password_input(temp);输入密码Express_chag

8、e_dark(temp);明码转化为暗码,以跟以保存的用户密码比较while(strcmp(p-password,temp)!=0)printf(nt输入的密码错误!n);printf(nt 是否继续输入:(丫 or N)t);scanf(%c”,&flag);if (flag=Nllflag=n)return;printf(nt 输入密码:tt);Password_input(temp);Express_chage_dark(temp);printf(nnttt 登入中,请稍等.);system(cls);User_Operate(p,L);用户登入后,进行用户操作3.用户注册:结构流程图:

9、代码:/*新用户申请函数*/Us User_apply(Us L)char temp120;char temp220;int i;char flag;User *p;User *s;rewind(stdin);s=(User *)malloc(sizeof(User);system(cls);printf(ntttlAAAAAAAAAAAAAAAAAAAAAAAln);printf(tttlt 申请用户tln);printf(ttt|AAAAAAAAAAAAAAAAAAAAAAA|n);printf(nt已有的用户名:n);P=L;while(p!=NULL)输出系统已存在的用户名,以让用pr

10、intf(ttt%sn”,p-name);p=p-next;户申请新用户时,有个注意,不申请重复的用户名p=L;printf(nnt 输入用户名:tt);scanf(%s”,s-name);rewind(stdin);while(p!=NULL&strcmp(p-name,s-name)!=0)p=p-next;/判断有没有重复的用户名while(p!=NULL)printf(nt该用户名已经存在!n);printf(nt是否继续进行申请用户:(Y or N)”);scanf(%c”,&flag);if (flag=Nllflag=n)free(s);return L;printf(t 输入用

11、户名:t);scanf(%s”,s-name);rewind(stdin);p=L;while(p!=NULL&strcmp(p-name,s-name)!=0) p=p-next;printf(nttt该用户名可以使用n);printf(nt 输入密码:tt);Password_input(temp1);printf(nt 确认密码:tt);Password input(temp2);while(strcmp(temp1,temp2)!=0)printf(nt两次输入的密码不一致!n);printf(nt 输入密码:tt);Password_input(temp1);printf(nt 确认

12、密码:tt);Password_input(temp2);strcpy(s-password,temp1);/申请好用户,生成相应用户对应的文件夹,文件夹里用来存s-first=NULL;s-count=0;mkdir(s-name);进行密码家秘密储相应用户的相应日记Express_chage_dark(s-password);s-next=L;L=s;Save_user(L);getchar();/每添加一个用户时,都要进行存储用户信息的保存printf(ntt 申请中,请稍等.”);printf(nnttt 申请成功! nnt);getchar();return(L);4.写日志操作:说

13、明:在次用户登陆后,打开文件,直接找到该用户目录下的日志表单,将写入的日志直 接写到这个人的用户的文件夹中,日志具体内容并不是保存在链表中的,由于考录到日志内容 可能会很长,这样可以节省空间。函数结构流程图:输入日记内容、日记 名、日记时间 打开文件fp=fopen讲日记内容写入到文件中保存更新后的用户信息 和日志信息链表代码:/*写日记*/void Write_dairy(User *H,Us L)int choice;char temp200;用于存储写入的日记FILE *fp;Diary *s;int i;printf(nnt 输入日记内容:nntt);scanf(%s”,temp);g

14、etchar();rewind(stdin);Express_chage_dark(temp);对日记内容加密s=(Diary *)malloc(sizeof(Diary);为保存日志的节点动态申请空间printf(nnt输入要保存的日记名:t);scanf(%s”,s-title);getchar();rewind(stdin);while(Search_dairy(H,s-title)!=1)printf(nt该日记名已经存在,请重新输入!”);printf(-nt重新输入要保存的日记名:t);scanf(%s”,s-title);getchar();printf(ntt该日记名可以使用)

15、;printf(nt 输入日期时间:(20120501)t);scanf(%s”,s-date);getchar();rewind(stdin);s-flag=0;chdir(H-name);把相应用户目录作为当前工作的目录(因为日志信息是直接放在文件中的,每次对日志内容添加、修改是都要先打开文件)if(fp=fopen(s-title,w)=NULL)printf(对不起,不能打开文件!”);return;i=0;printf(-nt保存中,请稍等.”);while(tempi!=0)fwrite(temp+i,1,1,fp);将信息写入文件流中(要输出数据的地址,要读写的字节数,要读写的字

16、节数据的个数,文件类型的指针)i=i+1;s-next=H-first;头插法,新写的日志排在最前面H-first=s;H-count+;保存相应用户的日记信息保存用户信息,因为此时用户的count已经改变fclose(fp);Save_dairy(H);Save_user(L);了,需要保存printf(nnt 保存完毕!nnt);4.查阅日记操作函数流程图:代码:/*查阅日记*/void Consult_dairy(User *H,int i)Diary *p;FILE *fp;char temp200;int j;int flag=0;先进行遍遍历,若有找到符合条件的日志则做标记p=H-

17、first;if (i=-1)进行顺序查询printf(nnt请输入要顺序查看的日记序号:t);scanf(%d”,&j);if(jcount) while(j1) p=p-next;j-;p-flag=-1;/找到符合条件日记,对应结点的flag赋为-1,以便待会筛选出来flag=1;在此用户的日志链表中有找到过符合条件的日志elseif (i=0) printf(nt输入要查询的日期:t);进行日期查询if (i=15) printf(nt输入要查询的关键字:t); /进行关键字查询 scanf(%s”,temp);rewind(stdin);while(p!=NULL) if(strst

18、r(p-date+i),temp)!=NULL) /分配的空间是连续的 p-flag=-1;/找到符合条件的结点,其flag赋予-1,以便待会筛选出来flag=1;/在此用户的日志链表中有找到过符合条件的日志p=p-next;if(flag=0) printf(ntt对不起,找不到所需要的日记”); else p=H-first;printf(nt要查看的日记如下n);chdir(H-name);/把相应用户的目录弄为当前工作目录(要对文件进行操作)while(p!=NULL) if(p-flag=-1)先前找到的符合条件的日子打印出来Diary *p;/指向要删除的结点Diary *pre;

19、/指向要删除的结点的前驱结点int i,j;char flag;printf(nnt请输入要删除的日记序号:tt);scanf(%d”,&i);rewind(stdin);声p=H-first;先找到要进行删除的结点if(jcount)先判断一下输入的药删除日志的编号是否小于该用户拥有的总日志的个数while(i1)p=p-next;i-;p-flag=-1;要删除的结点的flag标识符设为-1p=H-first;再对找到的结点进行删除操作while(p!=NULL&(p-flag=0)pre=p;p=p-next;printf(nt要删除的日记是:n);printf(tt 序号:dt日记名:

20、st 时间:s”,j,p-title,p-date);getchar();printf(nt 是否确认要删除:(Y or N) t);scanf(%c”,&flag);rewind(stdin);if(flag=Y|flag=y)要删除的结点为第一结点时要删除的结点不是第一结点时if(H-first=p) H-first=p-next;else pre-next=p-next;else把相应用户的目录弄为当前工作目录用户的日记数减1去掉相应的文件释放要删除的结点空间保存用户日记信息,不然原有的用户日记信息还return ;chdir(H-name);H-count-;remove(p-titl

21、e);free(p);Save_dairy(H);/保存用户信息是不变Save user(L);printf(nt 删除中,请稍等.”);printf(nnt 删除成功!nt);getchar();else(printfC序号太大);7.用户及其拥有的日志信息在文件中的保存/*保存用户日记信息*/void Save_dairy(User *H)FILE *fp;Diary *p;chdir(H-name);把相应用户目录作为当前工作目录(用于文件操作)if(fp=fopen(”dairylist.txt”,”w”)=NULL)printf(输入有误:不能打开文件! n);return;p=H-

22、first;while(p!=NULL)fwrite(p,sizeof(Diary),1,fp);/将信息写入文件流中(要输出数据的地址,要读写的字节数,要读写的字节数据的个数,文件类型的指针)p=p-next;fclose(fp);/*保存全部用户日记信息*/void Save_user(Us L)FILE *fp;User *p;fp=fopen(Userlist.txt,w);p=L;while(p!=NULL)fwrite(p,sizeof(User),1,fp);p=p-next;fclose(fp);I&Ia律诫I&知1. whne(feof(fpnHO) fwr=e(fp=c-&

23、lemps) +Z: Us33XXconin. . . &7Sgeede-: too 主!a# xgijin&ntf tn fi-inction ft7Eita 1本系实验主要是考察队文件的运用,而我一开始对文件这一部分的编程比较陌生,在经过看书查阅各种资料 后,对其的一些知识有所了解,经过实验中的反复运用加以熟练。例如通过实验代码的反复测试我发现了: Fwrite 写入的是一个数据块,fscanf 一个一个的输入,这边只能用 fscanf实验结果记录以及与预期结果比较以及分析1.主界面2.用户注册界面4.1写日志功能:4.2查看自己日志:(按顺序查找)4.3查看好友日志:(按日期查找)4.4

24、删除日志:4.5更改密码:总结以及心得体会这次实验综合考察了链表和文件的操作,有一定的复杂性。在实验的训练中,一开始拿到 题目没有什么思路主要是不明白日志具体要实现什么功能,然后要实现的这些功能又要用什么 样的函数来构成。然后通过查阅有关资料,看人家的成平的具体结构在思想中有了大体的结构 才开始一个功能一个功能的实现的编写。而日志管理系统的编写中最主要的就是文件的运用, 在这里我的我们用户所写的日志并不存在用户的日志链表中,而是直接写入文件,读取的时候 是通过日志的名称找到那一个日志的文件,然后打开文件直接从文件中读取并显示出来。这样 么可以节省很多的空间,因为用户的日志的长度有长有短,如果日

25、志的内容页存在日志的链表 中会真用很大空间,造成浪费现象,而且用户输入的日志长度还会有所限制。考虑到这些,就 采用直接将用户的日志内容存在文件中的方法了。总之,在日志系统的编写中,不仅对链表的使用更加熟练也加强了文件这一部分的运用。同时也十分感谢老师在实验过程中给予的耐心指导。指导老师评阅意见指导老师:年 月 日整体代码:/*日记管理系统*/#include#include#include#include#define Enter 13回车键/*定义日记结点类型*/typedef struct Diary char date15;/*日期*/char title20;/*日记标题 */int

26、flag;/*判断日记是否符合查阅要求,是为0,否为-1*/struct Diary *next;Diary;/*定义用户结点类型*/typedef struct Userchar name20; /* 用户名 */char password20;/* 登录密码*/int count;/*该用户拥有的日志的个数*/Diary *first; /*指向用户拥有的日记链表的表头*/ struct User *next;*Us,User;/*函数原型*/Us Init();/*初始化函数*/void main_menu(Us L);void Help();/*帮助使用函数*/Us User_appl

27、y(Us L);/*新 用户申请函数 */void Save_user(Us L);/*保 存所有用户信息*/void Login(Us L);/*用户密码登录函数*/int Input_Integer();/* 整数控制函数 */void Express_chage_dark(char temp);/* 明文转化为密文*/void Dark_chage_express(char temp);/*密 文转化为明文 */void User_Operate(User *H,Us L);int Search_dairy(User *H,char temp);/* 查找是否有同名日记操作 */void

28、 Write_dairy(User *H,Us L);void Save_dairy(User *H);/* 保存用户日记信息 */void Rejigger_user_password(User *H,Us L);/*修改用户密码 */void Read_dairy(char title);/* 读日记*/void Password_input(char temp);void Delete_dairy(User *H,Us L);void Consult_dairy_meno(User *H);/* 查阅日记菜单 */void Consult_dairy(User *H,int i);Us

29、findfriend(Us L);int main() Us L;begin();main_menu(L);/*初始化函数*/Us Init()FILE *fp1,*fp2;Us L=NULL;User *p;Diary *s;if (fp1=fopen(”Userlist.txt”,”r+”)=NULL) return L;while(!feof(fp1)p=(User *)malloc(sizeof(User);if(fread(p,sizeof(User),1,fp1)!=1) break;从一个流中读取数据(接受数据的指针,单个元素的大小,元素个数,提供数据的文件指针)p-first=

30、NULL;读取系统已有的用户信息p-next=L; L=p; chdir(p-name);/把相应用户目录作为当前工作目录if(fp2=fopen(”dairylist.txt”,”r”)=NULL) continue; else while(!feof(fp2) s=(Diary *)malloc(sizeof(Diary);读取系统相应用户的相应日记信息 if(fread(s,sizeof(Diary),1,fp2)!=1) break; s-next=L-first; /first为该用户的节点拥有的日志链表 L-first=s;fclose(fp2);关闭存储日志信息的文件,把父目录作

31、为当前工作目录fclose(fp1);return(L);/*开始函数*/int begin()int i,j;system(color b);for(i=1;i=1;i+)printf(nnnnnnntttn);printf(tttn);printf(ttt欢迎使用日志管理系统n);printf(tttn);printf(ttt设计者:张夷n);printf(ttt3100301101n);printf(ttt日期:2012.4.28n);printf(tttn);printf(tttn);printf(nttt 系统开始启动.n);for(j=1;j100000000;j+)system(

32、cls);printf(nnnnnnntttn);printf(tttn);printf(ttt欢迎使用日志管理系统n);printf(tttn);printf(ttt设计者:张夷n);printf(ttt3100301101n);printf(ttt日期:2012.4.28n);printf(tttn);printf(tttn);printf(nttt 系统开始启动.n);for(j=1;j100000000;j+)system(cls);printf(nnnnnnntttn);printf(tttn);printf(ttt欢迎使用日志管理系统n);printf(tttn);printf(t

33、tt设计者:张夷n);printf(ttt3100301101n);printf(ttt日期:2012.4.28n);printf(tttn);printf(tttn);printf(nttt 系统开始启动.n);for(j=1;j100000000;j+)system(cls);printf(nnnnnnntttn);printf(tttn);printf(ttt欢迎使用日志管理系统n);printf(tttn);printf(ttt设计者:张夷n);printf(ttt3100301101n);printf(ttt日期:2012.4.28n);printf(tttn);printf(ttt

34、n);printf(nttt 系统开始启动.n);for(j=1;j100000000;j+)system(cls);printf(nnnnnnntttn);printf(tttn);printf(ttt欢迎使用日志管理系统n);printf(tttn);printf(ttt设计者:张夷n);printf(ttt3100301101n);printf(ttt日期:2012.4.28n);printf(tttn);printf(tttn);printf(nttt 系统开始启动n);for(j=1;j100000000;j+)system(cls);printf(nnnnnnntttn);prin

35、tf(tttn);printf(ttt欢迎使用日志管理系统n);printf(tttn);printf(ttt设计者:张夷n);printf(ttt3100301101n);printf(ttt日期:2012.4.28n);printf(tttn);printf(tttn);printf(nttt 系统开始启动n);for(j=1;j100000000;j+) system(cls);void main_menu(Us L)int i=0;int select;L=Init();printf(nnnnnttt浓n);printf(ttt 浓浓 n);printf(ttt 浓1.用户登录浓 n)

36、;printf(ttt 浓-蛆):;printf(ttt 浓2.新用户申请浓 n);printf(ttt 浓-蛆):;printf(ttt 浓3.帮助浓 n);printf(ttt 浓-蛆):;printf(ttt 浓0.退出系统浓 n);printf(ttt 浓浓 n);printf(ttt浓n);printf(nttt 请选择【0-3】:”);scanf(%d”,&select);while(select!=0)switch(select)case 1:Login(L);break;case 2:L=User_apply(L);break;case 3:Help();break;syste

37、m(cls);printf(nnnnnttt浓n);printf(ttt 浓浓 n);printf(ttt 浓1.用户登录浓 n);printf(ttt 浓-蛆);printf(ttt 浓2.新用户申请浓 n);printf(ttt 浓-蛆);printf(ttt 浓3帮助浓 n);printf(ttt 浓-蛆);printf(ttt 浓0.退出系统浓 n);printf(ttt 浓浓 n);printf(ttt浓n);label:printf(nttt 请选择【0-3】:”);scanf(%d”,&select);/*打开使用系统的帮助文件*/void Help()FILE *fp;system(cls);fp=fopen(help.txt,r);if(fp=NULL)printf(nttt无法打开使用系统的帮助文件!”);return;while(feof(fp)=0)printf(%c”,fgetc(fp); 从文件中读取字符fclose(fp);printf(nnt);/*密码输入控制函数*/void Password_input(char temp)int i;i=0;while(temp

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号