实验题目:

设计一个简单实用个人日记管理系统。
实验要求:
1.该实验的课内学时是4个课时。
2.程序完成后应该完成如下基本功能:
1)用自定义日记的存储结构,每篇日记至少包含日期,内容等字段;
2)使用者必须输入密码;
3)写日记与保存功能;
4)日记查阅:按日期查看,按关键字查看,按顺序查看功能(从某一篇开始)
3.在完成上述基本功能的前提下,有能力的同学可以完成如下加强功能:
1)实现日记的永久存储。
2)对保存的密码进行变换,以免泄密。
3)允许多人使用。
4)在程序的提示语言清晰明确,界面美观并且适用。
 
/* 0 ********学生信息管理系统**************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#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)