




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
資料內容僅供您學習參考,如有不當或者侵權,請聯系改正或者刪除。福建工程學院實驗報告專業(yè)計算機科學與技術班級計算機1001座號姓名日期/5/14福建工程學院計算機與信息科學系實驗報告–年第一學期任課老師:章靜實驗題目日記管理系統的開發(fā)實驗時間實驗開始日期:\05\03
報告提交日期:\05\14實驗目的、要求一、實驗題目:設計一個簡單實用個人日記管理系統。二、實驗要求1.該實驗的課內學時是4個課時。2.程序完成后應該完成如下基本功能:1)用自定義日記的存儲結構,每篇日記至少包含日期,內容等字段;2)使用者必須輸入密碼;3)寫日記與保存功能;4)日記查閱:按日期查看,按關鍵字查看,按順序查看功能(從某一篇開始)3.在完成上述基本功能的前提下,有能力的同學能夠完成如下加強功能:1)實現日記的永久存儲。2)對保存的密碼進行變換,以免泄密。3)允許多人使用。4)在程序的提示語言清晰明確,界面美觀而且適用。實驗設計內容(1)實驗設計的數據結構/*定義日記結點類型*/typedefstructDiary{chardate[15];/*日期*/chartitle[20];/*日記標題*/intflag;/*判斷日記是否符合查閱要求,是為0,否為-1*/structDiary*next;}Diary;/*定義用戶結點類型*/typedefstructUser{charname[20];/*用戶名*/charpassword[20];/*登錄密碼*/intcount;/*該用戶擁有的日志的個數*/Diary*first;/*指向用戶擁有的日記鏈表的表頭*/structUser*next;}*Us,User;最后的用戶信息以及在該用戶目錄下的日志信息以二進制的形式存在文件中。(2)總體函數模塊結構圖:初始化用戶、日志信息讀取密碼修改日志管理系統初始化用戶、日志信息讀取密碼修改日志管理系統用戶登陸和注冊寫入日記日記查詢日記刪除用戶、日記信息保存按順序查詢按日期查詢按照關鍵字查詢(3)重點函數分析1.初始化函數:程序運行會運行此函數,講已有的用戶信息和她們的日志信息讀入鏈表中。UsInit(){FILE*fp1,*fp2;UsL=NULL;User*p;Diary*s;if((fp1=fopen("Userlist.txt","r+"))==NULL)returnL;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;}elsewhile(!feof(fp2)){s=(Diary*)malloc(sizeof(Diary));//讀取系統相應用戶的相應日記信息if(fread(s,sizeof(Diary),1,fp2)!=1)break;s->next=L->first;//first為該用戶的節(jié)點擁有的日志鏈表L->first=s;}fclose(fp2);//關閉存儲日志信息的文件,把父目錄作為當前工作目錄}fclose(fp1);return(L);}2.登錄結構流程圖:開始開始輸入用戶名及其對應密碼輸入用戶名及其對應密碼NNYY進入日志操作界面判斷輸入的用戶名和密碼鏈表中是否存在代碼:/*用戶登錄函數*/voidLogin(UsL){chartemp[20];charflag;inti,j,count;User*p;Diary*s;p=L;system("cls");printf("\n\t\t\t|^^^^^^^^^^^^^^^^^^^^^^^|\n");printf("\t\t\t|\t用戶登入\t|\n");printf("\t\t\t|^^^^^^^^^^^^^^^^^^^^^^^|\n");printf("\n\t已有的用戶名:\n");printf("\t\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");printf("\t\t|\t序號\t用戶名\t\t|\n");count=1;while(p!=NULL)//將已經有的用戶名和對應序號打印出來{printf("\t\t|\t%d\t%s\t\t|\n",count,p->name);p=p->next;count++;}printf("\t\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");count--;printf("\n\n\t輸入序號:\t\t");i=Input_Integer();//這樣我們在選擇序號時輸入字符也不會造成死循環(huán)while(i>count||i==-1){printf("\n\n\t輸入序號錯誤");printf("\n\t是否繼續(xù)進行輸入:(YorN)");scanf("%c",&flag);if(flag=='N'||flag=='n')return;printf("\n\n\t輸入序號:\t\t");scanf("%d",&i);}j=1;p=L;while(j<i){j++;p=p->next;}printf("\n\t你選擇的用戶:\t\t%s",p->name);printf("\n\t輸入密碼:\t\t");Password_input(temp);//輸入密碼Express_chage_dark(temp);//明碼轉化為暗碼,以跟以保存的用戶密碼比較while(strcmp(p->password,temp)!=0){printf("\n\t輸入的密碼錯誤!!!\n");printf("\n\t是否繼續(xù)輸入:(YorN)\t");scanf("%c",&flag);if(flag=='N'||flag=='n')return;printf("\n\t輸入密碼:\t\t");Password_input(temp);Express_chage_dark(temp);}printf("\n\n\t\t\t登入中,請稍等.....");system("cls");User_Operate(p,L);//用戶登入后,進行用戶操作}3.用戶注冊:結構流程圖:YYNNY開始輸入要注冊的用戶名檢查該用戶是否已經存在輸入密碼(密碼確認)注冊成功兩次輸入密碼相同代碼:/*新用戶申請函數*/UsUser_apply(UsL){chartemp1[20];chartemp2[20];inti;charflag;User*p;User*s;rewind(stdin);s=(User*)malloc(sizeof(User));system("cls");printf("\n\t\t\t|^^^^^^^^^^^^^^^^^^^^^^^|\n");printf("\t\t\t|\t申請用戶\t|\n");printf("\t\t\t|^^^^^^^^^^^^^^^^^^^^^^^|\n");printf("\n\t已有的用戶名:\n");p=L;while(p!=NULL){printf("\t\t\t%s\n",p->name);p=p->next;//輸出系統已存在的用戶名,以讓用戶申請新用戶時,有個注意,不申請重復的用戶名}p=L;printf("\n\n\t輸入用戶名:\t\t");scanf("%s",s->name);rewind(stdin);while(p!=NULL&&strcmp(p->name,s->name)!=0)p=p->next;//判斷有沒有重復的用戶名while(p!=NULL){printf("\n\t該用戶名已經存在!!!!!\n");printf("\n\t是否繼續(xù)進行申請用戶:(YorN)");scanf("%c",&flag);if(flag=='N'||flag=='n'){free(s);returnL;}printf("\t輸入用戶名:\t");scanf("%s",s->name);rewind(stdin);p=L;while(p!=NULL&&strcmp(p->name,s->name)!=0)p=p->next;}printf("\n\t\t\t該用戶名能夠使用\n");printf("\n\t輸入密碼:\t\t");Password_input(temp1);printf("\n\t確認密碼:\t\t");Password_input(temp2);while(strcmp(temp1,temp2)!=0){printf("\n\t兩次輸入的密碼不一致!!!\n");printf("\n\t輸入密碼:\t\t");Password_input(temp1);printf("\n\t確認密碼:\t\t");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("\n\t\t申請中,請稍等.....");printf("\n\n\t\t\t申請成功!\n\n\t");getchar();return(L);}4.寫日志操作:說明:在次用戶登陸后,打開文件,直接找到該用戶目錄下的日志表單,將寫入的日志直接寫到這個人的用戶的文件夾中,日志具體內容并不是保存在鏈表中的,由于考錄到日志內容可能會很長,這樣能夠節(jié)省空間。函數結構流程圖:開始開始輸入日記內容、日記名、日記時間打開文件fp=fopen講日記內容寫入到文件中保存更新后的用戶信息和日志信息鏈表代碼:/*寫日記*/voidWrite_dairy(User*H,UsL){intchoice;chartemp[200];//用于存儲寫入的日記FILE*fp;Diary*s;inti;printf("\n\n\t輸入日記內容:\n\n\t\t");scanf("%s",temp);getchar();rewind(stdin);Express_chage_dark(temp);//對日記內容加密s=(Diary*)malloc(sizeof(Diary));//為保存日志的節(jié)點動態(tài)申請空間printf("\n\n\t輸入要保存的日記名:\t");scanf("%s",s->title);getchar();rewind(stdin);while(Search_dairy(H,s->title)!=1){printf("\n\t該日記名已經存在,請重新輸入!!!!");printf("\n\t重新輸入要保存的日記名:\t");scanf("%s",s->title);getchar();}printf("\n\t\t該日記名能夠使用");printf("\n\t輸入日期時間:(\\05\\01)\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("\n\t保存中,請稍等.....");while(temp[i]!='\0'){fwrite(temp+i,1,1,fp);//將信息寫入文件流中(要輸出數據的地址,要讀寫的字節(jié)數,要讀寫的字節(jié)數據的個數,文件類型的指針)i=i+1;}s->next=H->first;//頭插法,新寫的日志排在最前面H->first=s;H->count++;fclose(fp);Save_dairy(H);//保存相應用戶的日記信息Save_user(L);//保存用戶信息,因為此時用戶的count已經改變了,需要保存printf("\n\n\t保存完畢!\n\n\t");}4.查閱日記操作函數流程圖:開始開始按順序查詢選擇查詢方式按關鍵字查詢按日期查詢輸出日記返回代碼:/*查閱日記*/voidConsult_dairy(User*H,inti){Diary*p;FILE*fp;chartemp[200];intj;intflag=0;//先進行遍遍歷,若有找到符合條件的日志則做標記p=H->first;if(i==-1)//進行順序查詢{printf("\n\n\t請輸入要順序查看的日記序號:\t");scanf("%d",&j);if(j<=H->count){while(j>1){p=p->next;j--;}p->flag=-1;//找到符合條件日記,對應結點的flag賦為-1,以便待會篩選出來flag=1;//在此用戶的日志鏈表中有找到過符合條件的日志}}else{if(i==0)printf("\n\t輸入要查詢的日期:\t");//進行日期查詢if(i==15)printf("\n\t輸入要查詢的關鍵字:\t");//進行關鍵字查詢scanf("%s",temp);rewind(stdin);while(p!=NULL){if(strstr((p->date+i),temp)!=NULL)//分配的空間是連續(xù)的{p->flag=-1;//找到符合條件的結點,其flag賦予-1,以便待會篩選出來flag=1;//在此用戶的日志鏈表中有找到過符合條件的日志}p=p->next;}}if(flag==0)printf("\n\t\t對不起,找不到所需要的日記");else{p=H->first;printf("\n\t要查看的日記如下\n");chdir(H->name);//把相應用戶的目錄弄為當前工作目錄(要對文件進行操作)while(p!=NULL){if(p->flag==-1)//先前找到的符合條件的日子打印出來{printf("\n\t—————————————————————————————————\n");printf("\t\t日記名:%s\t\t時間%s\n",p->title,p->date);p->flag=0;//篩選輸出結點的flag為-1的日記名,日期Read_dairy(p->title);}p=p->next;}}printf("\n\n\t\t");}5.刪除用戶日記函數流程圖:
代碼:/*刪除用戶日記*/voidDelete_dairy(User*H,UsL){Diary*p;//指向要刪除的結點Diary*pre;//指向要刪除的結點的前驅結點inti,j;charflag;printf("\n\n\t請輸入要刪除的日記序號:\t\t");scanf("%d",&i);rewind(stdin);j=i;p=H->first;//先找到要進行刪除的結點if(j<=H->count)//先判斷一下輸入的藥刪除日志的編號是否小于該用戶擁有的總日志的個數{while(i>1){p=p->next;i--;}p->flag=-1;//要刪除的結點的flag標識符設為-1p=H->first;//再對找到的結點進行刪除操作while(p!=NULL&&(p->flag==0)){pre=p;p=p->next;}printf("\n\t要刪除的日記是:\n");printf("\t\t序號:%d\t日記名:%s\t時間:%s",j,p->title,p->date);getchar();printf("\n\t是否確認要刪除:(YorN)\t");scanf("%c",&flag);rewind(stdin);if(flag=='Y'||flag=='y'){if(H->first==p)H->first=p->next;//要刪除的結點為第一結點時elsepre->next=p->next;//要刪除的結點不是第一結點時}elsereturn;chdir(H->name);//把相應用戶的目錄弄為當前工作目錄H->count--;//用戶的日記數減1remove(p->title);//去掉相應的文件free(p);//釋放要刪除的結點空間Save_dairy(H);//保存用戶日記信息,不然原有的用戶日記信息還是不變Save_user(L);//保存用戶信息printf("\n\t刪除中,請稍等.....");printf("\n\n\t刪除成功!!!\n\t");getchar();}else{printf("序號太大\n");}}7.用戶及其擁有的日志信息在文件中的保存/*保存用戶日記信息*/voidSave_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);//將信息寫入文件流中(要輸出數據的地址,要讀寫的字節(jié)數,要讀寫的字節(jié)數據的個數,文件類型的指針)p=p->next;}fclose(fp);}/*保存全部用戶日記信息*/voidSave_user(UsL){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",&temp[i]);i++;}本系實驗主要是考察隊文件的運用,而我一開始對文件這一部分的編程比較陌生,在經過看書查閱各種資料后,對其的一些知識有所了解,經過實驗中的重復運用加以熟練。例如經過實驗代碼的重復測試我發(fā)現了:Fwrite寫入的是一個數據塊,fscanf一個一個的輸入,這邊只能用fscanf實驗結果記錄以及與預期結果比較以及分析1.主界面2.用戶注冊界面3.用戶操登陸4.登陸后菜單:4.1寫日志功能:4.2查看自己日志:(按順序查找)4.3查看好友日志:(按日期查找)4.4刪除日志:4.5更改密碼:總結以及心得體會這次實驗綜合考察了鏈表和文件的操作,有一定的復雜性。在實驗的訓練中,一開始拿到題目沒有什么思路主要是不明白日志具體要實現什么功能,然后要實現的這些功能又要用什么樣的函數來構成。然后經過查閱有關資料,看人家的成平的具體結構在思想中有了大致的結構才開始一個功能一個功能的實現的編寫。而日志管理系統的編寫中最主要的就是文件的運用,在這里我的我們用戶所寫的日志并不存在用戶的日志鏈表中,而是直接寫入文件,讀取的時候是經過日志的名稱找到那一個日志的文件,然后打開文件直接從文件中讀取并顯示出來。這樣么能夠節(jié)省很多的空間,因為用戶的日志的長度有長有短,如果日志的內容頁存在日志的鏈表中會真用很大空間,造成浪費現象,而且用戶輸入的日志長度還會有所限制??紤]到這些,就采用直接將用戶的日志內容存在文件中的方法了??傊?在日志系統的編寫中,不但對鏈表的使用更加熟練也加強了文件這一部分的運用。同時也十分感謝老師在實驗過程中給予的耐心指導。指導老師評閱意見指導老師:年月日整體代碼:/*日記管理系統*/#include<stdio.h>#include<math.h>#include<string.h>#include<stdlib.h>#defineEnter13//回車鍵/*定義日記結點類型*/typedefstructDiary{chardate[15];/*日期*/chartitle[20];/*日記標題*/intflag;/*判斷日記是否符合查閱要求,是為0,否為-1*/structDiary*next;}Diary;/*定義用戶結點類型*/typedefstructUser{charname[20];/*用戶名*/charpassword[20];/*登錄密碼*/intcount;/*該用戶擁有的日志的個數*/Diary*first;/*指向用戶擁有的日記鏈表的表頭*/structUser*next;}*Us,User;/*函數原型*/UsInit();/*初始化函數*/voidmain_menu(UsL);voidHelp();/*幫助使用函數*/UsUser_apply(UsL);/*新用戶申請函數*/voidSave_user(UsL);/*保存所有用戶信息*/voidLogin(UsL);/*用戶密碼登錄函數*/intInput_Integer();/*整數控制函數*/voidExpress_chage_dark(chartemp[]);/*明文轉化為密文*/voidDark_chage_express(chartemp[]);/*密文轉化為明文*/voidUser_Operate(User*H,UsL);intSearch_dairy(User*H,chartemp[]);/*查找是否有同名日記操作*/voidWrite_dairy(User*H,UsL);voidSave_dairy(User*H);/*保存用戶日記信息*/voidRejigger_user_password(User*H,UsL);/*修改用戶密碼*/voidRead_dairy(chartitle[]);/*讀日記*/voidPassword_input(chartemp[]);voidDelete_dairy(User*H,UsL);voidConsult_dairy_meno(User*H);/*查閱日記菜單*/voidConsult_dairy(User*H,inti);Usfindfriend(UsL);intmain(){UsL;begin();main_menu(L);}/*初始化函數*/UsInit(){FILE*fp1,*fp2;UsL=NULL;User*p;Diary*s;if((fp1=fopen("Userlist.txt","r+"))==NULL)returnL;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;}elsewhile(!feof(fp2)){s=(Diary*)malloc(sizeof(Diary));//讀取系統相應用戶的相應日記信息if(fread(s,sizeof(Diary),1,fp2)!=1)break;s->next=L->first;//first為該用戶的節(jié)點擁有的日志鏈表L->first=s;}fclose(fp2);//關閉存儲日志信息的文件,把父目錄作為當前工作目錄}fclose(fp1);return(L);}/*開始函數*/intbegin(){inti,j;system("colorb");for(i=1;i<=1;i++){printf("\n\n\n\n\n\n\n\t\t\t★★★★★★★★★★★★★★★★★\n"); printf("\t\t\t★★\n"); printf("\t\t\t★歡迎使用日志管理系統★\n"); printf("\t\t\t★★\n"); printf("\t\t\t★設計者:張夷★\n");printf("\t\t\t★★\n");printf("\t\t\t★日期:.4.28★\n"); printf("\t\t\t★★\n"); printf("\t\t\t★★★★★★★★★★★★★★★★★\n"); printf("\n\t\t\t系統開始啟動.\n"); for(j=1;j<;j++){}system("cls");printf("\n\n\n\n\n\n\n\t\t\t★★★★★★★★★★★★★★★★★\n"); printf("\t\t\t★★\n"); printf("\t\t\t★歡迎使用日志管理系統★\n"); printf("\t\t\t★★\n"); printf("\t\t\t★設計者:張夷★\n");printf("\t\t\t★★\n");printf("\t\t\t★日期:.4.28★\n"); printf("\t\t\t★★\n"); printf("\t\t\t★★★★★★★★★★★★★★★★★\n"); printf("\n\t\t\t系統開始啟動...\n"); for(j=1;j<;j++){}system("cls");printf("\n\n\n\n\n\n\n\t\t\t★★★★★★★★★★★★★★★★★\n"); printf("\t\t\t★★\n"); printf("\t\t\t★歡迎使用日志管理系統★\n"); printf("\t\t\t★★\n"); printf("\t\t\t★設計者:張夷★\n");printf("\t\t\t★★\n");printf("\t\t\t★日期:.4.28★\n"); printf("\t\t\t★★\n"); printf("\t\t\t★★★★★★★★★★★★★★★★★\n"); printf("\n\t\t\t系統開始啟動.....\n"); for(j=1;j<;j++){}system("cls");printf("\n\n\n\n\n\n\n\t\t\t★★★★★★★★★★★★★★★★★\n"); printf("\t\t\t★★\n"); printf("\t\t\t★歡迎使用日志管理系統★\n"); printf("\t\t\t★★\n"); printf("\t\t\t★設計者:張夷★\n");printf("\t\t\t★★\n");printf("\t\t\t★日期:.4.28★\n"); printf("\t\t\t★★\n"); printf("\t\t\t★★★★★★★★★★★★★★★★★\n"); printf("\n\t\t\t系統開始啟動.......\n"); for(j=1;j<;j++){}system("cls");printf("\n\n\n\n\n\n\n\t\t\t★★★★★★★★★★★★★★★★★\n"); printf("\t\t\t★★\n"); printf("\t\t\t★歡迎使用日志管理系統★\n"); printf("\t\t\t★★\n"); printf("\t\t\t★設計者:張夷★\n");printf("\t\t\t★★\n");printf("\t\t\t★日期:.4.28★\n"); printf("\t\t\t★★\n"); printf("\t\t\t★★★★★★★★★★★★★★★★★\n"); printf("\n\t\t\t系統開始啟動.........\n"); for(j=1;j<;j++){}system("cls");printf("\n\n\n\n\n\n\n\t\t\t★★★★★★★★★★★★★★★★★\n"); printf("\t\t\t★★\n"); printf("\t\t\t★歡迎使用日志管理系統★\n"); printf("\t\t\t★★\n"); printf("\t\t\t★設計者:張夷★\n");printf("\t\t\t★★\n");printf("\t\t\t★日期:.4.28★\n"); printf("\t\t\t★★\n"); printf("\t\t\t★★★★★★★★★★★★★★★★★\n"); printf("\n\t\t\t系統開始啟動...........\n"); for(j=1;j<;j++){}system("cls");}}voidmain_menu(UsL){inti=0;intselect;L=Init(); printf("\n\n\n\n\n\t\t\t※※※※※※※※※※※※\n"); printf("\t\t\t※※\n"); printf("\t\t\t※1.用戶登錄※\n"); printf("\t\t\t※--------------------※\n"); printf("\t\t\t※2.新用戶申請※\n"); printf("\t\t\t※--------------------※\n"); printf("\t\t\t※3.幫助※\n"); printf("\t\t\t※--------------------※\n");printf("\t\t\t※0.退出系統※\n"); printf("\t\t\t※※\n"); printf("\t\t\t※※※※※※※※※※※※\n"); printf("\n\t\t\t請選擇【0-3】:"); scanf("%d",&select);while(select!=0){switch(select){case1:Login(L);break;case2:L=User_apply(L);break;case3:Help();break;}system("cls");printf("\n\n\n\n\n\t\t\t※※※※※※※※※※※※\n"); printf("\t\t\t※※\n"); printf("\t\t\t※1.用戶登錄※\n"); printf("\t\t\t※--------------------※\n"); printf("\t\t\t※2.新用戶申請※\n"); printf("\t\t\t※--------------------※\n"); printf("\t\t\t※3.幫助※\n"); printf("\t\t\t※--------------------※\n");printf("\t\t\t※0.退出系統※\n"); printf("\t\t\t※※\n"); printf("\t\t\t※※※※※※※※※※※※\n"); label: printf("\n\t\t\t請選擇【0-3】:"); scanf("%d",&select);}}/*打開使用系統的幫助文件*/voidHelp(){FILE*fp;system("cls");fp=fopen("help.txt","r");if(fp==NULL){printf("\n\t\t\t無法打開使用系統的幫助文件!");return;}while(feof(fp)==0)printf("%c",fgetc(fp));//從文件中讀取字符fclose(fp);printf("\n\n\t");}/*密碼輸入控制函數*/voidPassword_input(chartemp[]){inti;i=0;while((temp[i]=getch())!=Enter)//輸入回車鍵退出{if(temp[i]=='\b'&&i>0)//當不是第一個輸入刪除鍵時,進行的操作{rewind(stdin);//printf("\b");printf("");printf("\b\b");i--;continue;}elseif(temp[i]!='\b'&&i>=0)//當不是輸入刪除鍵時,輸出*號{printf("*");i=i+1;}}temp[i]='\0';}/*新用戶申請函數*/UsUser_apply(UsL){chartemp1[20];chartemp2[20];inti;charflag;User*p;User*s;rewind(stdin);s=(User*)malloc(sizeof(User));system("cls");printf("\n\t\t\t|^^^^^^^^^^^^^^^^^^^^^^^|\n");printf("\t\t\t|\t申請用戶\t|\n");printf("\t\t\t|^^^^^^^^^^^^^^^^^^^^^^^|\n");printf("\n\t已有的用戶名:\n");p=L;while(p!=NULL){printf("\t\t\t%s\n",p->name);p=p->next;//輸出系統已存在的用戶名,以讓用戶申請新用戶時,有個注意,不申請重復的用戶名}p=L;printf("\n\n\t輸入用戶名:\t\t");scanf("%s",s->name);rewind(stdin);while(p!=NULL&&strcmp(p->name,s->name)!=0)p=p->next;//判斷有沒有重復的用戶名while(p!=NULL){printf("\n\t該用戶名已經存在!!!!!\n");printf("\n\t是否繼續(xù)進行申請用戶:(YorN)");scanf("%c",&flag);if(flag=='N'||flag=='n'){free(s);returnL;}printf("\t輸入用戶名:\t");scanf("%s",s->name);rewind(stdin);p=L;while(p!=NULL&&strcmp(p->name,s->name)!=0)p=p->next;}printf("\n\t\t\t該用戶名能夠使用\n");printf("\n\t輸入密碼:\t\t");Password_input(temp1);printf("\n\t確認密碼:\t\t");Password_input(temp2);while(strcmp(temp1,temp2)!=0){printf("\n\t兩次輸入的密碼不一致!!!\n");printf("\n\t輸入密碼:\t\t");Password_input(temp1);printf("\n\t確認密碼:\t\t");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("\n\t\t申請中,請稍等.....");printf("\n\n\t\t\t申請成功!\n\n\t");getchar();return(L);}/*保存用戶日記信息*/voidSave_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);//將信息寫入文件流中(要輸出數據的地址,要讀寫的字節(jié)數,要讀寫的字節(jié)數據的個數,文件類型的指針)p=p->next;}fclose(fp);}/*保存全部用戶日記信息*/voidSave_user(UsL){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);}/*用戶登錄函數*/voidLogin(UsL){chartemp[20];charflag;inti,j,count;User*p;Diary*s;p=L;system("cls");printf("\n\t\t\t|^^^^^^^^^^^^^^^^^^^^^^^|\n");printf("\t\t\t|\t用戶登入\t|\n");printf("\t\t\t|^^^^^^^^^^^^^^^^^^^^^^^|\n");printf("\n\t已有的用戶名:\n");printf("\t\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");printf("\t\t|\t序號\t用戶名\t\t|\n");count=1;while(p!=NULL)//將已經有的用戶名和對應序號打印出來{printf("\t\t|\t%d\t%s\t\t|\n",count,p->name);p=p->next;count++;}printf("\t\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");count--;printf("\n\n\t輸入序號:\t\t");i=Input_Integer();//這樣我們在選擇序號時輸入字符也不會造成死循環(huán)while(i>count||i==-1){printf("\n\n\t輸入序號錯誤");printf("\n\t是否繼續(xù)進行輸入:(YorN)");scanf("%c",&flag);if(flag=='N'||flag=='n')return;printf("\n\n\t輸入序號:\t\t");scanf("%d",&i);}j=1;p=L;while(j<i){j++;p=p->next;}printf("\n\t你選擇的用戶:\t\t%s",p->name);printf("\n\t輸入密碼:\t\t");Password_input(temp);//輸入密碼Express_chage_dark(temp);//明碼轉化為暗碼,以跟以保存的用戶密碼比較while(strcmp(p->password,temp)!=0){printf("\n\t輸入的密碼錯誤!!!\n");printf("\n\t是否繼續(xù)輸入:(YorN)\t");scanf("%c",&flag);if(flag=='N'||flag=='n')return;printf("\n\t輸入密碼:\t\t");Password_input(temp);Express_chage_dark(temp);}printf("\n\n\t\t\t登入中,請稍等.....");system("cls");User_Operate(p,L);//用戶登入后,進行用戶操作}/*密文轉化為明文*/voidDark_chage_express(chartemp[]){inti;i=0;while(temp[i]!='\0'){temp[i]=temp[i]+2;i=i+1;}}/*明文轉化為密文*/voidExpress_chage_dark(chartemp[]){inti;i=0;while(temp[i]!='\0'){temp[i]=temp[i]-2;i=i+1;}}/*整數輸入控制*/intInput_Integer(){charstr[10];longn,i=0;scanf("%s",str);rewind(stdin);while(str[i]!='\0')//對字符串的各個字符進行判斷,直到字符串結束{if(str[i]<'0'||str[i]>'9')return-1;i++;}n=atoi(str);//利用atoi函數將字符串str轉換成整型數returnn;//返回輸入的正整數}/*查找是否有同名日記操作*/intSearch_dairy(User*H,chartemp[]){Diary*p;p=H->first;//讀取用戶結點中保存的她的日志鏈表while(p!=NULL&&strcmp(p->title,temp)!=0)p=p->next;if(p!=NULL)//如果是有同名日志return0;elsereturn1;}/*相應用戶登錄后的操作*/voidUser_Operate(User*H,UsL)//H是結點,L是鏈表的頭結點{intchoice;User*m;Diary*p;inti;system("cls");printf("\t\t>>>>———歡迎^%s^的到來———<<<<\n\n",H->name);printf("\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");printf("\t|1.寫日記2.查閱日記3.查看好友日志3.刪除日記4.更改用戶密碼0.退出系統|\n");printf("\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");printf("\n\t已有的日記:\n");printf("\n\t\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");printf("\t\t|\t序號\t日記名\t時間\t|\n");p=H->first;i=1;while(p!=NULL)//輸出該用戶的所有日志{printf("\t\t|\t%d\t%s\t%s\t|\n",i,p->title,p->date);p=p->next;//輸出相應用戶的日記名i++;}printf("\t\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");printf("\n\n\t請輸入選擇:\t\t");scanf("%d",&choice);while(choice!=0){switch(choice){case1:Write_dairy(H,L);break;//寫日記case2:Consult_dairy_meno(H);break;//查閱日記case3:m=findfriend(L);if(m==NULL)printf("對不起,該好友不存在!");elseConsult_dairy_meno(m);break;break;//查看好友日志case4:Delete_dairy(H,L);break;//刪除日記case5:Rejigger_user_password(H,L);break;//修改用戶}getchar();system("cls");printf("\t\t>>>>———歡迎^%s^的到來———<<<<\n\n",H->name);printf("\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");printf("\t|1.寫日記2.查閱日記3.查看好友日志3.刪除日記4.更改用戶密碼0.退出系統|\n");printf("\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");printf("\n\t已有的日記:\n");p=H->first;printf("\n\t\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");printf("\t\t|\t序號\t日記名\t時間\t|\n");p=H->first;i=1;while(p!=NULL){printf("\t\t|\t%d\t%s\t%s\t|\n",i,p->title,p->date);p=p->next;//輸出相應用戶的日記名i++;}printf("\t\t|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|\n");printf("\n\n\t請輸入選擇:\t\t");scanf("%d",&choice);}}/*寫日記*/voidWrite_dairy(User*H,UsL){intchoice;chartemp[200];//用于存儲寫入的日記FILE*fp;Diary*s;inti;printf("\n\n\t輸入日記內容:\n\n\t\t");scanf("%s",temp);getchar();rewind(stdin);Express_chage_dark(temp);//對日記內容加密s=(Diary*)malloc(sizeof(Diary));//為保存日志的節(jié)點動態(tài)申請空間printf("\n\n\t輸入要保存的日記名:\t");scanf("%s",s->title);getchar();rewind(stdin);while(Search_dairy(H,s->title)!=1){printf("\n\t該日記名已經存在,請重新輸入!!!!");printf("\n\t重新輸入要保存的日記名:\t");scanf("%s",s->title);getchar();}printf("\n\t\t該日記名能夠使用");printf("\n\t輸入日期時間:(\\05\\01)\t");scanf("%s",s->date);getchar();rewind(stdin);s->flag=0;chdir(H->name);//把相應用戶目錄作為當前工作的目錄(因為日志信息是直接放在文件中的,每次對日志內容添加、修改是都要先打開文件)if((fp=fopen(s->title,"w"))==NULL){printf("對不起,不能打開文件!!!");
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)療器械質量檢測服務合同
- 職場辦公技能培訓教育范文
- 高考語文復習:人物傳記類文言文專練
- 電線電纜采購合同書
- 法律行業(yè)律師服務費用免責協議
- 經典童話白雪公主的解讀與賞析
- 高考英語完形填空專題集中訓練含參考答案(5份)
- 農村居民公共服務需求滿足指導手冊
- 問題解決指南
- 金融科技服務風險免責合同
- 大班語言活動-海豹到哪里去了
- 小班社會《認識家用電器》課件
- 高考概率大題必練20題(理科)-含答案
- 涼水井煤礦礦山地質環(huán)境與土地復墾方案
- 果實酚類和揮發(fā)性物質含量特征及其與果實品質關系的研究
- 2023年東華高級中學中考自招數學復習題及答案解析
- 結果比過程重要辯論賽
- JTG C10-2007 公路勘測規(guī)范
- 工程結算審核項目投標技術方案造價咨詢服務方案
- 高中英語2024屆新高考詞匯轉換匯總(共六組)
- 2024年廣州市高三一模高考英語試卷試題答案詳解(含作文范文)
評論
0/150
提交評論