大致分爲以下幾個摸塊:
系統一運行,顯示菜單的同時,
並打開文件,若文件存在(打開文件成功),則輸入模塊無效(文件指針pfile!= NULL),並立即關閉文件;
若文件不存在(打開文件不成功),則輸入模塊有效(pfile = NULL)。
**********************************************************************************************
【信息輸入模塊(int input( ) ): 】
(返回1—成功;返回0—失敗)
主要讓用戶輸入學生的檔案信息(姓名,年齡,班級,性別,家庭住址,電話,學號);
若pfile = NULL,則做以下工作:
1,讓用戶輸入學生總數;
2,系統根據學生總數創建一個結構數組;
3,依次輸入各數據域,並讀入結構數組;
4,建立文件,並寫文件;
5,關閉文件;
若pfile = NULL,則不執行此模塊,並顯示出錯信息,按任意鍵返回菜單;
【信息輸出模塊(int output( ) ): 】
(返回1—成功;返回0—失敗)
主要讓用戶輸出已做改動的檔案信息;
若pfile != NULL,則做以下工作:
利用數組存儲數據;
利用表頭的形式顯示信息;
若pfile = NULL , 則不執行此模塊,並顯示出錯信息,按任意鍵返回菜單;
***********************************************************************************************
【信息修改模塊(int modify(int number[]) ): 】
(返回1—成功;返回0—失敗)(number爲學號)
主要讓用戶修改學生的檔案信息;(&M)
若pfile != NULL,則做以下工作:
1,輸入用戶想修改的學生記錄的學生學號;
2,查找此學生記錄,若存在就繼續;如不存在則顯示出錯信息;
3,顯示此學生信息;
4,提示用戶修改信息(每字段提示一下);
5,修改完畢,返回菜單。
若pfile = NULL , 則不執行此模塊,並顯示出錯信息,按任意賤返回菜單;
【信息添加模塊(int add( ) ): 】
(返回1—成功;返回0—失敗)
主要讓用戶增加不在數據庫中的某個學生信息;(&A)
若pfile != NULL,則做以下工作:
1,顯示輸入信息界面;
2,以學號爲關鍵字查找此學生信息,如存在,則顯示出錯信息;否則繼續。
3,若輸入完畢,則退出此模塊並返回至菜單界面。
若pfile = NULL , 則不執行此模塊,並顯示出錯信息,按任意鍵返回菜單;
【信息刪除模塊(int delete(int number[]) ): 】
(返回1—成功;返回0—失敗)(number爲學號)
主要讓用戶刪除已不在校的學生信息;(&D)
若pfile != NULL,則做以下工作:
1,要求用戶輸入想刪除的學生記錄的學號;
2,以學號爲關鍵字查找此記錄,若存在則顯示信息並釋放節點;不存在,則顯示出錯信息;
3,退出模塊並返回至菜單界面。
若pfile = NULL , 則不執行此模塊,並顯示出錯信息,按任意鍵返回菜單;
【信息查找模塊(int find(int number[]) ): 】
(返回1—成功;返回0—失敗)(number爲學號)
主要讓用戶查找某個特定的學生信息;(&F)
本模塊在刪除和修改中要用到,所以宜設爲外部函數;
若pfile != NULL,則做以下工作:
1,要求用戶輸入要查找的學生學號;
2,以學號爲關鍵字查找信息;
3,如存在,則顯示此信息並返回至菜單界面;若不存在則顯示出錯信息。
若pfile = NULL , 則不執行此模塊,並顯示出錯信息,按任意鍵返回菜單;
**********************************************************************************************
【信息存盤模塊(int save(char string[]) ): 】
(返回1—成功;返回0—失敗)(string爲文件名)
主要讓用戶保存檔案信息,以便下次讀取;
【信息讀盤模塊(int read(char string[]) ): 】
(返回1—成功;返回0—失敗)(string爲文件名)
主要讓用戶讀取已保存的檔案信息;
**********************************************************************************************
【數據存儲結構:】
對於單個學生採取一個結構:
struct STUDENT
{
char name[20];
int number[8];
char sex; //f&m
int age;
int class;
int phcde[7];
char address[30];
};
對於全班的所有同學(最多30人)採取鏈式存儲結構。
爲了採取這種存儲結構,在學生的結構中要再加一個next指針指向節點。
爲了節省存儲空間,採取動態申請的方法( malloc() )。
除此之外,還有各種其他的數據:
循環變量: register int i,j....
【預計難點:】
1, 文件的存儲是個關鍵。
當以"r"爲打開方式時,只讀;若文件不存在,則返回空指針。
當以"w"爲打開方式時,只寫;若文件不存在,則生成文件。
當以"a"爲打開方式時,追加;此時要求文件一定存在,若不存在,則失敗。
r+,w+,a+類似;rb,wb,ab也相似,只不過是以二進制方式!
結合以上,可以通過返回指針是否爲空來判斷文件是否打開成功!
【文件的存取<read,write>基本算法:】
void Data_Save(struct record *p) /*記錄文件的存取*/
{
int j;
fp = fopen( "tele_rec.txt " , "w" ); /*以可寫方式打開記錄文件*/
while( p != NULL ) /*若未到隊尾,徨將記錄存儲到文件中*/
{
fwrite(p, sizeof(struct record), 1, fp);
p = p->next;
}
fclose( fp ); /*關閉指定的文件*/
}
struct event * Data_Load() /*從記錄文件中讀取記錄*/
{
long k;
struct record *p, *q;11
p = event_head.next;
fp = fopen("tele_rec.txt", "r+t"); /*以讀方式打開記錄文件*/
if ( fp != NULL )
{
while( !feof(fp)) /*依次讀取記錄並執行入隊操作*/
{
fread(q, sizeof( struct record ), 1, fp);
p->next = q; /*這裏p爲尾指針,q爲指向新節點的指針*/
p = q;
}
p->next = NULL;
event_end = p;
}
else
{
fp = fopen("tele_rec.txt","w"); /*若文件不存在,創建指定文件名的新文件*/
event_head.next = NULL;
event_end = event_head.next;
}
}
其實,文件操作有很多函數,除fopen,fclose外,還有fwrite,fread,fprintf,fscanf,
rewend,ftell,fseek,ferror,fputc,fgetc等;
2, 其次,輸入的界面也是個問題。
如果用表頭,則要注意回車和製表符的控制。
如果用一行行的提示,就顯得有點老套。
結合以上,還是採取表頭的輸入比較好點。
****從這個問題中也就要求在今後的的實踐中多注意UI的設計,儘量設計出一個比較通用的界面。
3, 刪除或添加記錄時,移動記錄也是個關鍵:
由於數據是以結構數組存儲的,所以每變動一條記錄,就需移動之後的所有記錄,時間是個問題!
5,進入系統之前下載(讀取)文件;退出系統之前保存文件。
6,菜單要顯示,特別是功能鍵要加上大小寫的處理。
7,要注意函數的設計,每個函數功能要單一,函數最好被控制在50行之內!(學以致用嘛!^_^)
【製作目的:】
1,弄清楚函數返回值以及參數傳遞的問題。
2,指針是另一個方面!
3,弄懂讀盤和存盤的基本形式(即文件的基本操作)
4,熟悉各種常用函數的運用。