C語言課程設(shè)計學(xué)生通訊錄管理系統(tǒng)設(shè)計
一、題目內(nèi)容的描述
學(xué)生通訊錄管理系統(tǒng)設(shè)計
設(shè)計一個學(xué)生通信錄,學(xué)生通迅錄數(shù)據(jù)信息構(gòu)成內(nèi)容可自行設(shè)計(如:姓名、家庭地址、郵政編碼、電話號碼等等),通信錄數(shù)據(jù)類型定義為結(jié)構(gòu)體類型。由鍵盤輸入數(shù)據(jù)(最好要考慮輸入數(shù)據(jù)輸入的格式及輸入數(shù)據(jù)的有效性),然后進(jìn)行以下的功能實現(xiàn)。程序要求主函數(shù)是一個功能選擇菜單,其它各功能都用各自的函數(shù)實現(xiàn)。
功能要求如下:
1、能建立、修改和增刪學(xué)生通訊錄
2、能夠按多種方式進(jìn)行查詢,例如按姓名、按電話號碼等。
3、通訊錄的數(shù)據(jù)保存在文件中,運行程序時將通訊錄數(shù)據(jù)從文件讀取到內(nèi)存中。對通訊錄進(jìn)行增加、刪除、修改學(xué)生數(shù)據(jù)后,提供功能菜單,可以將內(nèi)存中修改過的通訊錄重新保存至文件。
二、應(yīng)用程序功能的詳細(xì)說明
1、應(yīng)用程序?qū)崿F(xiàn)了可視化的系統(tǒng)操作界面。
2、對學(xué)生通訊錄形成了系統(tǒng)化的管理,操作簡便明了。
3、程序具有系統(tǒng)幫助,添加、顯示、查詢、刷新、刪除、排序、保存、修改、讀取學(xué)生通訊錄的功能。各項功能均可按照文字提示操作,淺顯易懂。
4、系統(tǒng)的各個功能模塊都用函數(shù)的形式來實現(xiàn)(readfile()、seek()、modify()、sort()、insert()、del()、save()、menu())方便查看。
5.可以將信息保存在文件(“student.txt“)中,亦可將信息從文件中讀取出來,靈活方便。
三、主要模塊的算法描述
學(xué)生通訊錄管理系統(tǒng)
刷新學(xué)生信息readfile()
查詢學(xué)生信息seek()
增加學(xué)生信息insert()
顯示學(xué)生信息display()
退出系統(tǒng)
修改學(xué)生信息modify()
刪除學(xué)生信息del()
保存當(dāng)前學(xué)生信息save()
匯總當(dāng)前學(xué)生數(shù)目number()
系統(tǒng)幫助help()
查詢學(xué)生信息
按姓名查詢
退出
按學(xué)號查詢
開始
以可讀寫的方式打開一個數(shù)據(jù)文件
將此文件的內(nèi)容讀出,并存入一個新的結(jié)構(gòu)體類型的數(shù)組中。
調(diào)用menu()菜單函數(shù)
進(jìn)入while()主循環(huán)
輸入1-8中的一數(shù)值,選擇相應(yīng)操作。
輸入是否為0
判斷鍵值,調(diào)用相應(yīng)函數(shù),完成相應(yīng)功能。
是否已對修改存盤
調(diào)用函數(shù)save()函數(shù),進(jìn)行寫數(shù)據(jù)文件操作
結(jié)束
模塊一:頭文件,變量定義,函數(shù)的聲明
對系統(tǒng)所使用的變量進(jìn)行定義,對函數(shù)進(jìn)行聲明。
模塊二:錄入學(xué)生信息
聲明函數(shù)void
readfile(),說明一個文件指針FILE
*fp打開文
件“student.txt“。
模塊三:學(xué)生信息的查找
聲明void
seek()為查找函數(shù),通過switch(item)設(shè)定用學(xué)號查找,用姓名查找兩個分支。
模塊四:學(xué)生信息的修改
聲明void
modify()為學(xué)生信息修改函數(shù),通過switch(item)設(shè)定
所要修改的項目。
模塊五:刷新學(xué)生信息
聲明void
sort()將錄入學(xué)生系按升序排列,用的是“冒泡排序法”
實現(xiàn)排序。
模塊六:增加學(xué)生信息
聲明void
insert()插入學(xué)生信息,先通過判斷學(xué)生是否存在,若
否則繼續(xù)輸入,若是則跳出,重新循環(huán)。
模塊七:刪除學(xué)生信息
聲明void
del()實現(xiàn)學(xué)生信息刪除,通過學(xué)號對比確定要刪除的信
息,然后用后一個替換掉。
模塊八:顯示學(xué)生信息
通過display()函數(shù)輸出學(xué)生信息。
模塊九:保存信息
通過fp=fopen(“student.txt“,“w“);寫入信息。
模塊十:匯總學(xué)生數(shù)目
通過number()函數(shù)將已有男女生及總學(xué)生數(shù)目匯總出來。
模塊十一:系統(tǒng)幫助
通過help()函數(shù)幫助操作。
模塊十二:界面菜單
通過switch(num)調(diào)用以上各函數(shù),實現(xiàn)功能。
1、程序采用模塊化設(shè)計,各模塊獨立,可分塊調(diào)試,個模塊由主函數(shù)控制調(diào)用。
2、其中主要模塊(readfile()、seek()、modify())都是利用數(shù)組,指針來實現(xiàn)數(shù)據(jù)結(jié)構(gòu)設(shè)計。
3、數(shù)據(jù)庫設(shè)計的任務(wù)是確定系統(tǒng)所需要的數(shù)據(jù)庫。數(shù)據(jù)庫是表的集合,通常一個系統(tǒng)只需一個數(shù)據(jù)庫。設(shè)計人
是根據(jù)需求分析,確定數(shù)據(jù)庫所包含的表及字段、表間的關(guān)系,然后具體確定表的結(jié)構(gòu),包括字段名、字段類型及寬度,需要的索引等。根據(jù)對需求得到的數(shù)據(jù)結(jié)構(gòu)進(jìn)行分析,按數(shù)據(jù)輸入輸出的要求,確定表和表間的關(guān)系,進(jìn)行驗證、調(diào)整、修改、完善,使其能夠?qū)崿F(xiàn)用戶對數(shù)據(jù)和功能的要求。通訊信息表包括以下字段:學(xué)號,姓名,年齡,性別,出生年月,地址,電話,E-mail。學(xué)號為主索引。
四、結(jié)束語
我設(shè)計的程序總體功能大都能夠運行順利,但有許多地方比較復(fù)雜,需要進(jìn)一步修改,進(jìn)行簡化。通過這次課程設(shè)計的鍛煉,我收獲很多,具體歸納為以下幾點:
1、首先,也是最重要的一點,學(xué)會如何將一個復(fù)雜的問題簡化,將一個較大的問題分成幾個小問題,再一一解決這些小問題。在設(shè)計一個程序之前,要學(xué)會對程序功能進(jìn)行規(guī)劃,將其分為幾個不同的功能模塊,要思路清晰,簡單易用;
2、學(xué)會靈活運用已有的知識,同時適當(dāng)?shù)耐卣挂恍┲R;比如,這次設(shè)計過程中,有一些函數(shù)以前就很少用到,甚至沒有見過,但對程序的設(shè)計及用戶界面的改善帶來方便;
3、解決問題時,要盡可能考慮全面。每一個細(xì)節(jié)都很重要,既要避免功能的重復(fù),也要避免功能疏漏的地方!
4、在這次課程設(shè)計過程中,參考了許多資料,發(fā)現(xiàn)C語言真的很有意思!比如我看到一個關(guān)于用C語言編寫的小程序:五子棋、俄羅斯方塊、推箱子等,等這次課程結(jié)束后,我就想利用C語言編寫這些小游戲。曾經(jīng)認(rèn)為C是個挺枯燥的課程,現(xiàn)在發(fā)現(xiàn)這不僅僅是個簡單的課程,而是個很實用的計算機(jī)工具!
五、程序源代碼清單
#include
#include
#include
#define
BUFLEN
#define
LEN
#define
N
struct
record
{
char
code[LEN+1];
char
name[LEN+1];
int
age;
char
sex[3];
char
time[LEN+1];
char
add[30];
char
tel[LEN+1];
char
mail[30];
}stu[N];
int
k=1,n,m;
void
readfile();
void
seek();
void
modify();
void
insert();
void
del();
void
display();
void
save();
void
number();
void
menu();
int
main()
{
while(k)
menu();
system(“pause“);
return
0;
}
void
readfile()//刷新學(xué)生信息
{
char
*p=“student.txt“;
FILE
*fp;
int
i=0;
if
((fp=fopen(“student.txt“,“r“))==NULL)
{
printf(“Open
file
%s
error!
Strike
any
key
to
exit!“,p);
system(“pause“);
exit(0);
}
while(fscanf(fp,“%s
%s%d%s
%s
%s
%s
%s“,stu[i].code,stu[i].name,&stu[i].age,stu[i].sex,stu[i].time,stu[i].add,stu[i].tel,stu[i].mail)==8)
{
i++;
i=i;
}
fclose(fp);
n=i;
printf(“錄入完畢?。躰“);
}
void
seek()//查詢學(xué)生信息
......void
modify()//修改學(xué)生信息
......void
sort()//對學(xué)生信息按學(xué)號排序
{
int
i,j,*p,*q,s;
char
temp[10];
for(i=0;i { for(j=n-1;j>i;j--) if(strcmp(stu[j-1].code,stu[j].code)>0) { strcpy(temp,stu[j-1].code); strcpy(stu[j-1].code,stu[j].code); strcpy(stu[j].code,temp); strcpy(temp,stu[j-1].name); strcpy(stu[j-1].name,stu[j].name); strcpy(stu[j].name,temp); strcpy(temp,stu[j-1].sex); strcpy(stu[j-1].sex,stu[j].sex); strcpy(stu[j].sex,temp); strcpy(temp,stu[j-1].time); strcpy(stu[j-1].time,stu[j].time); strcpy(stu[j].time,temp); strcpy(temp,stu[j-1].add); strcpy(stu[j-1].add,stu[j].add); strcpy(stu[j].add,temp); strcpy(temp,stu[j-1].tel); strcpy(stu[j-1].tel,stu[j].tel); strcpy(stu[j].tel,temp); strcpy(temp,stu[j-1].mail); strcpy(stu[j-1].mail,stu[j].mail); strcpy(stu[j].mail,temp); p=&stu[j-1].age; q=&stu[j].age; s=*q; *q=*p; *p=s; } } } void insert()//增加學(xué)生信息 ......void display()//顯示當(dāng)前學(xué)生信息 { int i; printf(“所有學(xué)生的信息為:\n“); printf(“學(xué)生學(xué)號,學(xué)生姓名,年齡,性別,出生年月,地址,電話,E-mail\n“); printf(“--------------------------------------------------------------------\n“); for(i=0;i { printf(“%6s,%7s,%5d,%5s,%9s,%8s,%10s,%14s\n“,stu[i].code,stu[i].name,stu[i].age,stu[i].sex,stu[i].time,stu[i].add,stu[i].tel,stu[i].mail); } } void save()//保存當(dāng)前學(xué)生信息 { int i; FILE *fp; fp=fopen(“student.txt“,“w“); for(i=0;i { fprintf(fp,“%s,%s,%d,%s,%s,%s,%s,%s\n“,stu[i].code,stu[i].name,stu[i].age,stu[i].sex,stu[i].time,stu[i].add,stu[i].tel,stu[i].mail); } fclose(fp); } void number()//匯總學(xué)生數(shù)目 { int i,girl,boy=0; for(i=0;i if(strcmp(stu[i].sex,“1“)==0) {boy++;} girl=n-boy; printf(“男生人數(shù)是:%d\n女生的人數(shù)是:%d\n“,boy,girl); printf(“總的學(xué)生人數(shù)為:%d“,n); } void help()//系統(tǒng)幫助 { printf(“輸入性別時男為1,女為2“); printf(“\n3.增加學(xué)生信息后,切記保存按7;\n“); printf(“\n4.謝謝您的使用?。躰“); } void menu()//可視化的系統(tǒng)操作界面 { int num; printf(“ \n\n 學(xué)生通訊錄管理系統(tǒng) \n\n“); printf(“ *********************系統(tǒng)功能菜單************************ \n“); printf(“ -------------------------------- ------------------------------- \n“); printf(“ 1.刷新學(xué)生信息 2.查詢學(xué)生信息 \n“); printf(“ ********************************************* \n“); printf(“ 3.修改學(xué)生信息 4.增加學(xué)生信息 \n“); printf(“ ********************************************* \n“); printf(“ 5.按學(xué)號刪除信息 6.顯示當(dāng)前信息 \n“); printf(“ ********************************************* \n“); printf(“ 7.保存當(dāng)前學(xué)生信息 8.匯總學(xué)生數(shù)目 \n“); printf(“ ********************************************* \n“); printf(“ 9.系統(tǒng)幫助 10.退出系統(tǒng) \n“); printf(“ --------------------------------- ------------------------------ \n“); printf(“ ************************************************************ \n“); printf(“請選擇菜單編號:“); scanf(“%d“,&num); switch(num) { case 1:readfile();break; case 2:seek();break; case 3:modify();break; case 4:insert();break; case 5:del();break; case 6:display();break; case 7:save();break; case 8:number();break; case 9:help();break; case 10:k=0;break; default:printf(“請在1-10之間選擇\n“); } }