c语言管理系统开发,日记管理系统的开发(C语言版)

实验题目:

设计一个简单实用个人日记管理系统。

实验要求:

1.该实验的课内学时是4个课时。

2.程序完成后应该完成如下基本功能:

1)用自定义日记的存储结构,每篇日记至少包含日期,内容等字段;

2)使用者必须输入密码;

3)写日记与保存功能;

4)日记查阅:按日期查看,按关键字查看,按顺序查看功能(从某一篇开始)

3.在完成上述基本功能的前提下,有能力的同学可以完成如下加强功能:

1)实现日记的永久存储。

2)对保存的密码进行变换,以免泄密。

3)允许多人使用。

4)在程序的提示语言清晰明确,界面美观并且适用。

/* 0 ********学生信息管理系统**************/

#include

#include

#include

#include

#define ESC 27        //退出键

#define Enter 13      //回车键

#define BackSpace 8

/* 1************定义日记结构体*************************/

typedef struct Link1

{   char date[10];          //日期    格式2009-12-30

char title[40];         //标题

char content[1000];     //日记内容

char keyword[20];       //关键字,可用空格隔开

int    tag;             //用来标记该日记是否满足查阅要求,是为0,否为-1,初始值为0;

struct Link1 *nextd;

} Diary;

/* 2 ************定义用户结构体************************/

typedef struct Link2

{   char  username[25];       //用户名

char  password[16];       //登录密码

Diary *diarys_list;       //该用户拥有的日记链表

struct Link2 *nextu;

} User;

/* 3 *********************函数声明************************/

int Change_Password(User *U2);

int Create_NewUser(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 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 Open_File(char FileName[]);

int Printf_DiaryList(Diary *D1);

void Print_Menu1(int *choose1);

void Print_Menu2(int *choose2);

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 *Search_order(Diary *D1);

Diary *Filter_word(Diary *D1,char cmpword[],int n);

User *User_Login(User *U1);

int Write_Diary(Diary *D1);

/* 4 *************************更改用户密码**************************/

int Change_Password(User *U2)

{  char oldpw[16],newpw1[16],newpw2[16];

do

{

printf("\n\t请输入旧密码:\t");

Enter_Password(oldpw);

Encrypt_Password(oldpw);

if(strcmp(U2->password,oldpw)!=0)

printf("\n\t旧密码输入错误!....\n\n");

}while(strcmp(U2->password,oldpw)!=0);

do

{

printf("\n\t请输入新密码:\t");

Enter_Password(newpw1);

printf("\n\t请确认新密码:\t");

Enter_Password(newpw2);

if(strcmp(newpw1,newpw2)!=0)

printf("\n\t密码确认错误!....\n\n");

}while(strcmp(newpw1,newpw2)!=0);

Encrypt_Password(newpw1);

strcpy(U2->password,newpw1);

printf("\n\n\t密码修改成功!......");

return 1;

}

/* 5 **********************创建用户链表*********************/

int Create_NewUser(User *U1)

{   int flag=0;

char password2[16];

User *s,*temp;

Diary *D2=NULL;

D2=Init_Diary(D2);

do

{

s=(User *)malloc(sizeof(User));

if(s==NULL)

{

printf("\t用户创建失败!");

return 0;

}

printf("\n\t请输入用户名:\t");

scanf("%s",&s->username);

temp=Find_User(U1,s->username);

if(temp==NULL)

{

do

{

printf("\n\t请输入密码:\t");

Enter_Password(s->password);

printf("\n\t请确认密码:\t");

Enter_Password(password2);

if(strcmp(s->password,password2)!=0)

printf("\n\t密码确认错误!....\n\n");

}while(strcmp(s->password,password2)!=0);

Encrypt_Password(s->password);

s->diarys_list=D2;

s->nextu=U1->nextu;

U1->nextu=s;

flag=0;

printf("\n\t用户创建成功!......\n");

}

else

{printf("\n\n\t***对不起**该用户名已存在!!!!\n");

printf("\n\t是否继续创建用户:1/0\t");

scanf("%d",&flag);

}

} while(flag);

return 1;

}

/* 6 *************************删除日记**********************/

int Delete_Diary(Diary *D)

{   Diary *p;

p=D->nextd;

D->nextd=p->nextd;

free(p);

printf("\n\t日记删除成功......");

return 1;

}

/* 7 **********************日记操作*************************/

int Diary_Operation(User *U2,Diary *D1)

{ char tempch='1';

int choose2;

char FileName[40];

Diary *p=NULL;

while(tempch!=ESC)

{

system("cls");

printf("\n\t\t\t欢迎用户---“%s”的到来!......\n\n",U2->username);

Print_Menu2(&choose2);

switch(choose2)

{ case 0:return 0;

case 1:{Write_Diary(D1);

tempch=getch();}break;

case 2:{ printf("\n\t参考文件:  听雨的思索.txt");

printf("\n\t请输入文件路径及文件名:");

scanf("%s",FileName);

p=Open_DiaryFile(D1,FileName);

if(p!=NULL)

Open_Diary(p);

tempch=getch();

};break;

case 3:

{ printf("\n\n\t该用户有以下日记:\n\n");

Printf_DiaryList(D1);

tempch=getch();

}break;

case 4: {if(Search_Diary(D1)==1)

tempch=getch();}break;    //打开帮助文件

case 5: {Change_Password(U2);

tempch=getch();}break;

}

}

return 1;

}

/* 8 ***********************将登录口令加密*******************/

int Encrypt_Password(char password[])

{  int i=0;

while(password[i]!='\0')

{

if((password[i]>='a'&&password[i]<='z')||(password[i]>='A'&&password[i]<='Z'))

{ password[i]=password[i]+4;

if(password[i]>'Z'&&password[i]<='Z'+4||password[i]>'z')

password[i]=password[i]-26;

}

else if(password[i]>='0'&&password[i]<='9')

{ password[i]=password[i]+4;

if(password[i]>'9'&&password[i]<='9'+4)

password[i]=password[i]-10;

}

else

password[i]=password[i]+4;

i++;

}

return 1;

}

/* 9 **********************获取登录口令********************/

int Enter_Password(char password[])

{ char password1[50];

int i=0;

while((password1[i]=getch())!=Enter)

{

password[i]=password1[i];

password1[i]='*';

printf("%c",password1[i]);

i++;

}

password[i]='\0';

rewind(stdin);

return 1;

}

/* 10 *********************查找用户********************/

User *Find_User(User *U1,char username[])

{

User *q;

q=U1->nextu;

while(q!=NULL&&strcmp(q->username,username)!=0)

q=q->nextu;

if(q!=NULL)

return q;

else

return NULL;

}

/* 11 *******************初始化日记表*******************/

Diary *Init_Diary(Diary *D1)

{   D1=(Diary *)malloc(sizeof(Diary));

if(D1!=NULL)

{   D1->nextd=NULL;

return D1;

}

else

return NULL;

}

/* 12 **********将所有日记记录的标记tag值置为0或-1*************/

void Initial_Tag(Diary *D1,int tag)

{

Diary *q;

q=D1->nextd;

while(q!=NULL)

{q->tag=tag;

q=q->nextd;

}

}

/* 13 ****************初始化用户表**********************/

User *Init_User(User *U1)

{   U1=(User *)malloc(sizeof(User));

if(U1!=NULL)

{   U1->nextu=NULL;

return U1;

}

else

return NULL;

}

/* 14 ***********************菜单操作数的选择**************************/

int Input_Choose()       //此函数用来判断是否输入的是正整数,结果将返回该正整数

{  char str1[50];

long n,i=0;

str1[0]=getch();

printf("%c",str1[0]);

if(str1[0]==ESC)

{  rewind(stdin);

return 0;

}

getch();

if(str1[0]>'0'||str1[0]

{  rewind(stdin);

return (str1[0]-48);

}

n=atoi(str1);          //利用atoi函数将字符串str转换成整型数

return n;        //返回输入的正整数

}

/* 15 *******************打开日记**********************************/

int Open_Diary(Diary *D1)

{

printf("\n\t--------------------------------------------------\n");

printf("\n\t日记日期==>%s",D1->date);

printf("\n\t日记标题==>%s",D1->title);

printf("\n\n\t关键字==>%s",D1->keyword);

printf("\n\t--------------------------------------------------\n");

printf("\n\n\t日记正文如下:\n");

printf("\n\t%s",D1->content);

return 1;

}

/* 16 *******************打开并导入日记文件*************************/

Diary *Open_DiaryFile(Diary *D1,char FileName[])

{FILE *fp;

Diary *p=NULL;

if((fp=fopen(FileName,"r"))==NULL)

{

printf("\t文件打开失败!");

return NULL;

}

else

{ p=(Diary *)malloc(sizeof(Diary));

if(p==NULL)

{

printf("\t日记创建失败!");

return NULL;

}

fscanf(fp,"\t日期: %s\n",p->date);

fscanf(fp,"\t标题: %s\n",p->title);

fscanf(fp,"\t关键字: %s\n",p->keyword);

fscanf(fp,"\t正文如下:\n\t%s\n",p->content);

p->tag=0;

p->nextd=D1->nextd;

D1->nextd=p;

fclose(fp);

return p;

}

}

/* 17 **************打开普通文本文件********************/

int Open_File(char FileName[])

{

FILE *fp;

fp=fopen(FileName,"r");               //以只读的方式打开文件,将文件指针赋给fp

if(fp==NULL)

{ printf   ("\n\t\t无法打开帮助文件!......");

return 0;

}

while(feof(fp)==0)                       //将文件中的字符读入

printf("%c",fgetc(fp));

fclose(fp);

return 1;

}

/* 18 ***********************导入用户信息********************/

int Open_Users_info(User *U1)

{

FILE *fp;

User *U2=NULL,*U3=NULL;

Diary *D1=NULL,*D2=NULL;

char filepn[20],tempstr[80];/*用来存放文件保存路径以及文件名*/

strcpy(filepn,"Users_info.txt");

if((fp=fopen(filepn,"r"))==NULL)

{

printf("不能打开文件!\n");

return 0;

}

else

{  fscanf(fp,"%s\n",tempstr);

while(strcmp(tempstr,"User:")==0&&(!feof(fp)))

{

U2=(User *)malloc(sizeof(User));

if(U2==NULL)

{

printf("\t用户空间申请失败!\n");

return 0;

}

else

{

fscanf(fp,"用户名:%80s\n",U2->username);

fscanf(fp,"密码:%80s\n",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));

if(D2==NULL)

{

printf("\t日记空间申请失败!\n");

return 0;

}

else

{

fscanf(fp,"\t日期: %s\n",D2->date);

fscanf(fp,"\t关键字: %s\n",D2->keyword);

fscanf(fp,"\t标题: %s\n",D2->title);

fscanf(fp,"\t日记内容: \n%s\n\n",D2->content);

fscanf(fp,"%s\n",tempstr);

D2->tag=0;

D2->nextd=D1->nextd;

D1->nextd=D2;

}

}

U2->nextu=U1->nextu;

U1->nextu=U2;

}

fscanf(fp,"\n\n");

}

}

fclose(fp);

return 0;

}

/* 19 ********************显示日记列表**********************/

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)

{ D=D->nextd;

if(D->tag==0)

{

count++;

printf("\t第%2d篇==>时间:%-10s   日记标题:%-20s  \t关键字:%-s\n",count,D->date,D->title,D->keyword);

}

}

}

return count;

}

/* 20 ************************进入菜单并选择操作*************************/

void Print_Menu1(int *choose1)

{

printf("\n\t\t           “日记管理系统”---(ESC退出)\n");

printf("\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");

printf("\t| 1.用户登录  2.新建用户  3.显示用户列表  4.帮助  |\n");

printf("\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");

do {

printf("\n\t请选择操作:\t");

*choose1=Input_Choose();

}while(*choose1<0||*choose1>4);

rewind(stdin);         /*清空键盘缓冲区里的无用字符*/

}

/* 21*******************进入日记菜单并选择操作************************/

void Print_Menu2(int *choose2)

{

printf("\n\t\t\t          “日记操作”---------(ESC返回上级)\n");

printf("\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");

printf("\t|  1.写日记  2.导入日记   3.日记列表   4.查阅与删除   5.更改用户密码  |\n");

printf("\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");

do {

printf("\n\t请选择操作:\t");

*choose2=Input_Choose();

}while(*choose2<0||*choose2>5);

rewind(stdin);         /*清空键盘缓冲区里的无用字符*/

}

/* 22 *******************进入日记查阅菜单并选择操作*********************/

void Print_Menu3(int *choose3)

{

printf("\n\t\t                     “日记查阅与删除”---------(ESC返回上级)\n");

printf("\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");

printf("\t|   1.日记列表  2.按顺序查阅   3.按标题查阅  4.按日期查阅    5.按关键字查阅  |\n");

printf("\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");

do {

printf("\n\t请选择操作:\t");

*choose3=Input_Choose();

}while(*choose3<0||*choose3>5);

rewind(stdin);         /*清空键盘缓冲区里的无用字符*/

}

/* 23 ********************显示用户列表**********************/

int Printf_users(User *U1)

{  int count=0;

User *p;

p=U1;

printf("\n\n\t用户信息列表如下:\n\n");

if(U1->nextu==NULL)

printf("\n\t没有用户信息!.....\n");

else

{  while(p->nextu!=NULL)

{ p=p->nextu;

count++;

printf("\t第%d个用户==>用户名:%s\n",count,p->username);

}

}

return 1;

}

/* 24 *********************日记保存************************/

int Save_Diary(Diary *D1)

{FILE *fp;

char FileName[40],postfix[6]=".txt\0";

printf("\t请输入文件路径及文件名:");

scanf("%s",FileName);

if((fp=fopen(FileName,"w+"))==NULL)

{

printf("\t打开文件失败!");

return 0;

}

fprintf(fp,"\t日期: %s\n",D1->date);

fprintf(fp,"\t标题: %s\n",D1->title);

fprintf(fp,"\t关键字: %s\n",D1->keyword);

fprintf(fp,"\t正文如下:\n\t%s\n",D1->content);

fclose(fp);

printf("\t日记文件保存成功!");

return 1;

}

/* 25 ***********************保存用户信息********************/

int Save_Users_info(User *U1)

{

FILE *fp;

Diary *D1;

int temp;

char filepn[20];/*用来存放文件保存路径以及文件名*/

printf("\n\n\t--------------------------------------------------\n");

printf("\t是否保存本次使用所做的所有操作?...\t1-是  0--否\t");

printf("\n\t--------------------------------------------------\n\t");

printf("请选择操作:\t");

temp=Input_Choose();

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=U1->nextu;/*下移一个结点*/

fprintf(fp,"用户名:%s\n密码:%s\n",U1->username,U1->password);

D1=U1->diarys_list;

while(D1->nextd!=NULL)

{

D1=D1->nextd;

fprintf(fp,"Diary:\n");

fprintf(fp,"\t日期:%s\n\t关键字: %s\n",D1->date,D1->keyword);

fprintf(fp,"\t标题:%s\n",D1->title);

fprintf(fp,"\t日记内容:\n%s\n",D1->content);

}

}

fclose(fp);

}

return 0;

}

/* 26 **********************日记查阅*************************/

int Search_Diary(Diary *D1)

{    char tempch='1';

char cmpword[20];

int choose3;

Diary *p;

while(tempch!=ESC)

{ system("cls");

Print_Menu3(&choose3);

p=D1;

if(p->nextd==NULL)

printf("\n\t没有日记......\n");

else

{

switch(choose3)

{ case 0: return 0;

case 1:

{ printf("\n\t该用户有以下日记:\n\n");

Printf_DiaryList(D1);

}break;

case 2:Search_order(D1);break;

case 3:{ printf("\n\t参考标题:  我不再爱你了");

printf("\n\t请输入要查阅的日记标题:\t");

scanf("%s",cmpword);

Filter_word(D1,cmpword,1);

}break;     //按标题查阅

case 4:{ printf("\n\t请输入要查阅的日记日期(2009-4-11):\t");

scanf("%s",cmpword);

Filter_word(D1,cmpword,2);

} break;     //按日期查阅

case 5:{ printf("\n\t请输入要查阅的关键字(如:想你):\t");

scanf("%s",cmpword);

Filter_word(D1,cmpword,3);

}break;     //按关键字查阅

}

}

Initial_Tag(D1,0);

tempch=getch();

rewind(stdin);                    /*清空键盘缓冲区里的无用字符*/

}

return 1;

}

/* 27 *********************按顺序查阅*********************/

Diary *Search_order(Diary *D1)

{  int choose,count,count1=0;

int temp;

Diary *D;

D=D1;

count=Printf_DiaryList(D);

if(count>0)

{   do

{ printf("\n\t您要查阅的是第几篇(<=%d):\t",count);

choose=Input_Choose();

}while(choose<1||choose>count);

while(D->nextd!=NULL)

{ if(D->nextd->tag==0)

{

if(count1==choose-1)

{ Open_Diary(D->nextd);

printf("\n\n\t--------------------------------------------------\n");

printf("\t是否要删除此篇日记?\t1-是  0--否\t");

printf("\n\t--------------------------------------------------\n\t");

printf("\t请选择操作:\t");

temp=Input_Choose();

if(temp==1)

Delete_Diary(D);        //删除P的下一个结点

return D;

}

count1++;

}

D=D->nextd;

}

}

else if(count==0)

printf("\n\t没有符合查阅要求的日记.....");

return D;

}

/* 28 *********************按标题、日期、关键字查阅****************************/

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);

else if(n==2)

temp=strstr(D->nextd->date,cmpword);

else if(n==3)

temp=strstr(D->nextd->keyword,cmpword);

if(temp==NULL)

D->nextd->tag=-1;

D=D->nextd;

}

printf("\n\n\t有以下的日记符合查阅要求:\n");

D2=Search_order(D1);

Initial_Tag(D1,0);

return D1;

}

/* 29 ******************************登录个人用户*************************/

User *User_Login(User *U1)    //登录成功返回改用户的日记链表指针

{  int i=0,temp;

User *s=NULL,*tempU=NULL;

printf("\n\t--------------------------------------------------\n");

printf("\t是否要显示用户列表?\t1-是  ESC--否\t");

printf("\n\t--------------------------------------------------\n\t");

temp=Input_Choose();

if(temp==1)

Printf_users(U1);

printf("\n\t系统默认用户:admin   密码:123 \n");

s=Init_User(s);

tempU=Init_User(tempU);

printf("\t请输入用户名:\t");

scanf("%s",&s->username);

tempU=Find_User(U1,s->username);

if(tempU==NULL)

{printf("\n\t该用户不存在!......\n");

getch();

}

else

{

printf("\t请输入密码:\t");

rewind(stdin);

Enter_Password(s->password);

Encrypt_Password(s->password);

if(strcmp(tempU->password,s->password)==0)

return tempU;

else

printf("\n\t密码错误!.....\n\n");

getch();

}

return NULL;

}

/* 30 **********************写新的日记**************************/

int Write_Diary(Diary *D1)

{  int temp;

Diary *p=NULL;

p=Init_Diary(p);

p=(Diary *)malloc(sizeof(Diary));

printf("\n\n\t请输入日期(2008-12-31):\t");

scanf("%s",&p->date);

printf("\n\t请输入标题:\t");

scanf("%s",&p->title);

printf("\n\t请开始写日记:......\n\n\t");

scanf("%s",&p->content);

printf("\n\t请为该日记写关键字:\t");

scanf("%s",&p->keyword);

p->tag=0;

p->nextd=D1->nextd;

D1->nextd=p;

printf("\n\t--------------------------------------------------\n");

printf("\t是否要以文件方式保存日记?\t1-是  0--否\t");

printf("\n\t--------------------------------------------------\n\t");

temp=Input_Choose();

if(temp==1)

Save_Diary(p);

return 1;

}

/* 31**********************主菜单**************************/

int main()

{   User *U1=NULL;

User *U2=NULL;

Diary *D1=NULL;

int choose1;

char tempch='1',FileName[20];

U1=Init_User(U1);

D1=Init_Diary(D1);

Open_Users_info(U1);

while(tempch!=ESC)

{

system("cls");

Print_Menu1(&choose1);            //输出菜单,并输入choose的值

switch(choose1)

{

case 0: Save_Users_info(U1);return 0;

case 1:

{  U2=User_Login(U1);

if(U2!=NULL)

{

D1=U2->diarys_list;

if(Diary_Operation(U2,D1)==1)

tempch=getch();

}

}break;

case 2: { Create_NewUser(U1);

tempch=getch();

}break;

case 3: { Printf_users(U1);

tempch=getch();

}break;

case 4: {system("cls");

strcpy(FileName,"help.txt");

Open_File(FileName);

tempch=getch();

}break;

}

system("cls");

}

Save_Users_info(U1);

system("PAUSE");

return 1;

}

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值