版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、-作者xxxx-日期xxxx日记管理系统【精品文档】福 建 工 程 学 院实 验 报 告专业 计算机科学与技术 班级 计算机1001 座 号 姓 名 日 期 2012/5/14 福建工程学院计算机与信息科学系实验报告 2010 2011 学年第 一 学期 任课老师: 章静 实验题目日记管理系统的开发实验时间实验开始日期:20120503 报告提交日期:20120514实验目的、要求一、实验题目:设计一个简单实用个人日记管理系统。二、实验要求1该实验的课内学时是4个课时。2程序完成后应该完成如下基本功能:1)用自定义日记的存储结构,每篇日记至少包含日期,内容等字段;2)使用者必须输入密码;3)写
2、日记与保存功能;4)日记查阅:按日期查看,按关键字查看,按顺序查看功能(从某一篇开始)3在完成上述基本功能的前提下,有能力的同学可以完成如下加强功能:1)实现日记的永久存储。2)对保存的密码进行变换,以免泄密。3)允许多人使用。4)在程序的提示语言清晰明确,界面美观并且适用。实验设计内容(1)实验设计的数据结构/*定义日记结点类型*/typedef struct Diary char date15; /*日期*/ char title20; /*日记标题*/ int flag; /*判断日记是否符合查阅要求,是为0,否为-1*/ struct Diary *next;Diary;/*定义用户结
3、点类型*/typedef struct User char name20; /*用户名*/ char password20;/*登录密码*/ int count; /*该用户拥有的日志的个数*/ Diary *first; /*指向用户拥有的日记链表的表头*/ struct User *next;*Us,User;最后的用户信息以及在该用户目录下的日志信息以二进制的形式存在文件中。(2)总体函数模块结构图:初始化用户、日志信息读取密码修改日志管理系统用户登陆和注册写入日记日记查询日记删除用户、日记信息保存按顺序查询按日期查询按照关键字查询(3)重点函数分析1.初始化函数:程序运行会运行此函数,
4、讲已有的用户信息和她们的日志信息读入链表中。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=NULL; /读取系统已有的用户信息 p-next=L; L=p;
5、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); /关闭存储日志信息的文件,把父目录作为当前工作目录 fclose(fp1); return(
6、L);2.登录结构流程图: 开始输入用户名及其对应密码NY进入日志操作界面判断输入的用户名和密码链表中是否存在代码:/*用户登录函数*/void Login(Us L) char temp20; char flag; int i,j,count; User *p; Diary *s; p=L; system(cls); printf(nttt|n); printf(ttt|t用户登入t|n); printf(ttt|n); printf(nt已有的用户名:n); printf(tt|n); printf(tt|t序号t 用户名tt|n); count=1; while(p!=NULL) /将已
7、经有的用户名和对应序号打印出来 printf(tt|t%dt %stt|n,count,p-name); p=p-next; count+; printf(tt|n); count-; printf(nnt输入序号:tt); i=Input_Integer(); /这样我们在选择序号时输入字符也不会造成死循环 while(icount|i=-1) printf(nnt输入序号错误); printf(nt是否继续进行输入:(Y or N) ); scanf(%c,&flag); if(flag=N|flag=n) return; printf(nnt输入序号:tt); scanf(%d,&i);
8、 j=1; p=L; while(jnext; printf(nt你选择的用户:tt%s,p-name); printf(nt输入密码:tt); Password_input(temp); /输入密码 Express_chage_dark(temp); /明码转化为暗码,以跟以保存的用户密码比较 while(strcmp(p-password,temp)!=0) printf(nt输入的密码错误!n); printf(nt是否继续输入:(Y or N)t); scanf(%c,&flag); if (flag=N|flag=n) return; printf(nt输入密码:tt); Passw
9、ord_input(temp); Express_chage_dark(temp); printf(nnttt登入中,请稍等.); system(cls); User_Operate(p,L); /用户登入后,进行用户操作3.用户注册:结构流程图:YNNY开始输入要注册的用户名检查该用户是否已经存在输入密码(密码确认)注册成功两次输入密码相同代码:/*新用户申请函数*/Us User_apply(Us L) char temp120; char temp220; int i; char flag; User *p; User *s; rewind(stdin); s=(User *)mallo
10、c(sizeof(User); system(cls); printf(nttt|n); printf(ttt|t申请用户t|n); printf(ttt|n); printf(nt已有的用户名:n); p=L; while(p!=NULL) printf(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-nex
11、t; /判断有没有重复的用户名 while(p!=NULL) printf(nt该用户名已经存在!n); printf(nt是否继续进行申请用户:(Y or N) ); scanf(%c,&flag); if (flag=N|flag=n) free(s); return L; printf(t输入用户名: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_inp
12、ut(temp1); printf(nt确认密码:tt); Password_input(temp2); while(strcmp(temp1,temp2)!=0) printf(nt两次输入的密码不一致!n); printf(nt输入密码:tt); Password_input(temp1); printf(nt确认密码:tt); Password_input(temp2); strcpy(s-password,temp1); s-first=NULL; s-count=0; /申请好用户, mkdir(s-name); /生成相应用户对应的文件夹,文件夹里用来存储相应用户的相应日记 Exp
13、ress_chage_dark(s-password); /进行密码家秘密 s-next=L; L=s; Save_user(L); getchar();/每添加一个用户时,都要进行存储用户信息的保存 printf(ntt申请中,请稍等.); printf(nnttt申请成功!nnt); getchar(); return(L); 4.写日志操作:说明:在次用户登陆后,打开文件,直接找到该用户目录下的日志表单,将写入的日志直接写到这个人的用户的文件夹中,日志具体内容并不是保存在链表中的,由于考录到日志内容可能会很长,这样可以节省空间。函数结构流程图:开始输入日记内容、日记名、日记时间打开文件
14、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); getchar(); rewind(stdin); Express_chage_dark(temp); /对日记内容加密 s=(Diary *)malloc(sizeof(Diary); /为保存日志的节点动态申请空间 printf(nn
15、t输入要保存的日记名: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该日记名可以使用); printf(nt输入日期时间:(20120501)t); scanf(%s,s-date); getchar(); rewind(stdin); s-flag=0; chdir(H-name); /把相应
16、用户目录作为当前工作的目录(因为日志信息是直接放在文件中的,每次对日志内容添加、修改是都要先打开文件) if(fp=fopen(s-title,w)=NULL) printf(对不起,不能打开文件!); return; i=0; printf(nt保存中,请稍等.); while(tempi!=0) fwrite(temp+i,1,1,fp); /将信息写入文件流中(要输出数据的地址,要读写的字节数,要读写的字节数据的个数,文件类型的指针) i=i+1; s-next=H-first; /头插法,新写的日志排在最前面 H-first=s; H-count+; fclose(fp); Save_
17、dairy(H); /保存相应用户的日记信息 Save_user(L); /保存用户信息,因为此时用户的count已经改变了,需要保存 printf(nnt保存完毕!nnt);4. 查阅日记操作函数流程图:开始按顺序查询选择查询方式按关键字查询按日期查询输出日记返回代码:/*查阅日记*/void Consult_dairy(User *H,int i) Diary *p; FILE *fp; char temp200; int j; int flag=0;/先进行遍遍历,若有找到符合条件的日志则做标记 p=H-first; if (i=-1) /进行顺序查询 printf(nnt请输入要顺序查
18、看的日记序号:t); scanf(%d,&j); if(jcount) while(j1) p=p-next; j-; p-flag=-1; /找到符合条件日记,对应结点的flag赋为-1,以便待会筛选出来 flag=1; /在此用户的日志链表中有找到过符合条件的日志 else if (i=0) printf(nt输入要查询的日期:t); /进行日期查询 if (i=15) printf(nt输入要查询的关键字:t); /进行关键字查询 scanf(%s,temp); rewind(stdin); while(p!=NULL) if(strstr(p-date+i),temp)!=NULL)
19、/分配的空间是连续的 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) /先前找到的符合条件的日子打印出来 printf(ntn); printf(tt日记名:%stt时间%sn,p-title
20、,p-date); p-flag=0; /筛选输出结点的flag为-1的日记名,日期 Read_dairy(p-title); p=p-next; printf(nntt);5. 删除用户日记函数流程图:代码:/*删除用户日记*/void Delete_dairy(User *H,Us L) Diary *p; /指向要删除的结点 Diary *pre; /指向要删除的结点的前驱结点 int i,j; char flag; printf(nnt请输入要删除的日记序号:tt); scanf(%d,&i); rewind(stdin); j=i; p=H-first; /先找到要进行删除的结点 i
21、f(jcount) /先判断一下输入的药删除日志的编号是否小于该用户拥有的总日志的个数 while(i1) p=p-next; i-; p-flag=-1; /要删除的结点的flag标识符设为-1 p=H-first; /再对找到的结点进行删除操作 while(p!=NULL&(p-flag=0) pre=p; p=p-next; printf(nt要删除的日记是:n); printf(tt序号:%dt 日记名:%st时间:%s,j,p-title,p-date); getchar(); printf(nt是否确认要删除:(Y or N) t); scanf(%c,&flag); rewind
22、(stdin); if(flag=Y|flag=y) if(H-first=p) H-first=p-next; /要删除的结点为第一结点时 else pre-next=p-next; /要删除的结点不是第一结点时 else return ; chdir(H-name); /把相应用户的目录弄为当前工作目录 H-count-; /用户的日记数减1 remove(p-title); /去掉相应的文件 free(p); /释放要删除的结点空间 Save_dairy(H); /保存用户日记信息,不然原有的用户日记信息还是不变 Save_user(L); /保存用户信息 printf(nt删除中,请稍
23、等.); printf(nnt删除成功!nt);getchar(); else printf(序号太大n); 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-first; while(p!=NULL) fwrite(p,sizeof(Diary),1,fp); /将信息写入文
24、件流中(要输出数据的地址,要读写的字节数,要读写的字节数据的个数,文件类型的指针) 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);调试过程记录1.while(feof(fp)=0) fwrite(fp,%c,&tempi); i+; 本系实验主要是考察队文件的运用,而我一开始对文件这一部分的编程比较陌生
25、,在经过看书查阅各种资料后,对其的一些知识有所了解,经过实验中的反复运用加以熟练。例如通过实验代码的反复测试我发现了:Fwrite 写入的是一个数据块,fscanf 一个一个的输入,这边只能用fscanf实验结果记录以及与预期结果比较以及分析 4.登陆后菜单: 写日志功能: 查看自己日志:(按顺序查找)查看好友日志:(按日期查找)删除日志:更改密码:总结以及心得体会这次实验综合考察了链表和文件的操作,有一定的复杂性。在实验的训练中,一开始拿到题目没有什么思路主要是不明白日志具体要实现什么功能,然后要实现的这些功能又要用什么样的函数来构成。然后通过查阅有关资料,看人家的成平的具体结构在思想中有了
26、大体的结构才开始一个功能一个功能的实现的编写。而日志管理系统的编写中最主要的就是文件的运用,在这里我的我们用户所写的日志并不存在用户的日志链表中,而是直接写入文件,读取的时候是通过日志的名称找到那一个日志的文件,然后打开文件直接从文件中读取并显示出来。这样么可以节省很多的空间,因为用户的日志的长度有长有短,如果日志的内容页存在日志的链表中会真用很大空间,造成浪费现象,而且用户输入的日志长度还会有所限制。考虑到这些,就采用直接将用户的日志内容存在文件中的方法了。总之,在日志系统的编写中,不仅对链表的使用更加熟练也加强了文件这一部分的运用。同时也十分感谢老师在实验过程中给予的耐心指导。指导老师评阅
27、意见指导老师: 年 月 日 整体代码: /*日记管理系统*/#include#include#include#include#define Enter 13 /回车键/*定义日记结点类型*/typedef struct Diary char date15; /*日期*/ char title20; /*日记标题*/ int flag; /*判断日记是否符合查阅要求,是为0,否为-1*/ struct Diary *next;Diary;/*定义用户结点类型*/typedef struct User char name20; /*用户名*/ char password20;/*登录密码*/ in
28、t count; /*该用户拥有的日志的个数*/ Diary *first; /*指向用户拥有的日记链表的表头*/ struct User *next;*Us,User;/*函数原型*/Us Init();/*初始化函数*/void main_menu(Us L);void Help(); /*帮助使用函数*/Us User_apply(Us L);/*新用户申请函数*/void Save_user(Us L);/*保存所有用户信息*/void Login(Us L);/*用户密码登录函数*/int Input_Integer();/*整数控制函数*/void Express_chage_da
29、rk(char temp);/*明文转化为密文*/void Dark_chage_express(char temp);/*密文转化为明文*/void User_Operate(User *H,Us L);int Search_dairy(User *H,char temp);/*查找是否有同名日记操作*/void Write_dairy(User *H,Us L);void Save_dairy(User *H);/*保存用户日记信息*/void Rejigger_user_password(User *H,Us L);/*修改用户密码*/void Read_dairy(char title
30、);/*读日记*/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 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,
31、r+)=NULL) return L; while(!feof(fp1) p=(User *)malloc(sizeof(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; else while(!feof(fp2) s=(Di
32、ary *)malloc(sizeof(Diary); /读取系统相应用户的相应日记信息 if(fread(s,sizeof(Diary),1,fp2)!=1) break; s-next=L-first; /first为该用户的节点拥有的日志链表 L-first=s; fclose(fp2); /关闭存储日志信息的文件,把父目录作为当前工作目录 fclose(fp1); return(L);/*开始函数*/int begin() int i,j; system(color b); for(i=1;i=1;i+) printf(nnnnnnntttn);printf(ttt n);printf
33、(ttt 欢迎使用日志管理系统 n);printf(ttt n);printf(ttt 设计者: 张 夷 n); printf(ttt 3100301101 n); printf(ttt 日期:2012.4.28 n);printf(ttt n);printf(tttn);printf(nttt系统开始启动.n);for(j=1;j100000000;j+) system(cls); printf(nnnnnnntttn);printf(ttt n);printf(ttt 欢迎使用日志管理系统 n);printf(ttt n);printf(ttt 设计者: 张 夷 n); printf(tt
34、t 3100301101 n); printf(ttt 日期:2012.4.28 n);printf(ttt n);printf(tttn);printf(nttt系统开始启动.n);for(j=1;j100000000;j+) system(cls); printf(nnnnnnntttn);printf(ttt n);printf(ttt 欢迎使用日志管理系统 n);printf(ttt n);printf(ttt 设计者: 张 夷 n); printf(ttt 3100301101 n); printf(ttt 日期:2012.4.28 n);printf(ttt n);printf(t
35、ttn);printf(nttt系统开始启动.n);for(j=1;j100000000;j+) system(cls); printf(nnnnnnntttn);printf(ttt n);printf(ttt 欢迎使用日志管理系统 n);printf(ttt n);printf(ttt 设计者: 张 夷 n); printf(ttt 3100301101 n); printf(ttt 日期:2012.4.28 n);printf(ttt n);printf(tttn);printf(nttt系统开始启动.n);for(j=1;j100000000;j+) system(cls); printf(nnnnnnntttn);printf(ttt n);printf(ttt 欢迎使用日志管理系统 n);printf(ttt n);printf(ttt 设计者: 张 夷 n); printf(ttt 3100301101 n); printf(ttt 日期:2012.4.28 n);p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年高速公路数字化运营管理服务提升场景:授权运营与产品开发指南
- 2026年卫星影像与AI分析平台VRA Map Builder精准施肥技术解析
- 2026年农业科技特派员下乡技术服务机制
- 2026年四川省凉山彝族自治州重点达标名校初三下开学检测试题生物试题含解析
- 海南省屯昌县2026届初三第二次(4月)联考化学试题文试题含解析
- 福建省漳州市诏安县重点达标名校2026年初三下学期适应性训练(六)生物试题含解析
- 黑龙江省大庆市三站中学2025-2026学年初三第二学期(4月)月考生物试题含解析
- 2026届西藏西藏达孜县学生学业调研抽测试卷(第二次)化学试题含解析
- 2026年基于二十四节气的幼儿园自然探究课程设计
- 黑龙江省大庆市第六十一中学2026年初三下学期线上周生物试题含解析
- 2026年包头轻工职业技术学院单招综合素质考试题库附答案详解(基础题)
- 2026年兴安职业技术学院单招职业倾向性测试题库及答案详解(新)
- 国家基层糖尿病防治管理指南(2025版)
- 2025年国企招聘考试(建筑工程及造价)经典试题及答案
- (2026)中华人民共和国海关注册登记和备案企业信用管理办法解读课件
- 2025CSCO胰腺癌诊疗指南课件
- 慈善基金会内控制度
- DB15∕T 385-2025 行业用水定额
- 最新景观照明培训专业知识讲座课件
- 基于单片机的交流数字电压检测系统仿真设计-数字显示模块设计毕业设计(论文)说明书
- 钢管工艺焊接方案
评论
0/150
提交评论