通訊錄管理系統(tǒng)
- 問題定義與描述
1.1問題定義
創(chuàng)建一個學(xué)生通訊錄管理系統(tǒng)。系統(tǒng)中每個學(xué)生信息包括學(xué)號、姓名、性別、出生日期、家庭地址、學(xué)號、電話、QQ。程序的運(yùn)行效果如下圖所示,選擇任意菜單后,實現(xiàn)相應(yīng)功能。
圖1.1? 學(xué)生通訊錄管理系統(tǒng)功能需求
1.2問題描述
在問題定義與描述階段要考慮題目的可行性和需求分析,接下來進(jìn)入開發(fā)階段,完成系統(tǒng)設(shè)計和系統(tǒng)實現(xiàn)的任務(wù)。
2、系統(tǒng)設(shè)計
總體設(shè)計
采用模塊化的程序設(shè)計方法,即將較大的任務(wù)按照一定的原則分為一個個較小的任務(wù),然后分別設(shè)計各個小任務(wù)。需要注意的是劃分出來的模塊應(yīng)該相對獨立但又相關(guān),且容易理解。可以用模塊化層次結(jié)構(gòu)圖(即模塊圖)來分析其任務(wù)的劃分,一般從上到下進(jìn)行,最上面一層是主模塊,下面各層是其上一層模塊的逐步細(xì)化描述。
2.1主要功能模塊
添加:添加通訊錄記錄。
顯示:顯示通訊錄記錄。
刪除:刪除通訊錄記錄。
查詢:查詢通訊錄記錄。
修改:修改通訊錄記錄。
保存:將信息保存到文件。
2.2數(shù)據(jù)結(jié)構(gòu)設(shè)計
s struct addr???????????? /*通訊地址結(jié)構(gòu)定義*/
{?? char post_num[10];? /*郵編*/
char addr[40];????? /*家庭地址*/
};
struct birth????? /*出生年月結(jié)構(gòu)定義*/
{?? int year;???? /*年份*/
int month;??? /*月份*/
int day;????? /*日期*/
};
struct friend1???? /*電子通訊錄結(jié)構(gòu)定義*/
{?? int number;?????? /*序號*/
char name[20];???? /*姓名*/
char sex;???????????? /*性別*/
struct birth birth;?? /*出生年月*/
struct addr addr;???? /*通信地址*/
char telephone[13];?? /*聯(lián)系電話*/
}friends[50];
FILE *fp;
int i;
2.3輸入記錄模塊
輸入記錄模塊主要實現(xiàn)將數(shù)據(jù)存入結(jié)構(gòu)體中。,用戶應(yīng)選擇2,調(diào)用Data_Inpu ()函數(shù),進(jìn)行朋友姓名、電話、地址、性別的輸入,即完成在結(jié)構(gòu)體中添加記錄的操作。
2.4查詢記錄模塊
查詢記錄模塊主要實現(xiàn)了在結(jié)構(gòu)體中按姓名查找滿足相關(guān)條件的信息記錄。在查詢函數(shù)search()中,找到相同名字則打印出記錄。
2.5刪除記錄模塊
該操作完成刪除指定姓名的記錄,
輸入要刪除的序號,輸入后調(diào)用函數(shù)若找到該記錄,詢問是否繼續(xù)尋找相同姓名的記錄。
2.6顯示所有記錄模塊
該操作完成顯示所有記錄信息,它分兩步完成。
第一步,按照數(shù)組中序號進(jìn)行排序。
第二步,逐條顯示出來。
3、系統(tǒng)實現(xiàn)
3.1 編碼
3.1.1 部分程序源代碼
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<stdio.h>
#include<dos.h>
struct addr???????????? /*通訊地址結(jié)構(gòu)定義*/
{?? char post_num[10];? /*郵編*/
char addr[40];????? /*家庭地址*/
};
struct birth????? /*出生年月結(jié)構(gòu)定義*/
{?? int year;???? /*年份*/
int month;??? /*月份*/
int day;????? /*日期*/
};
struct friend1???? /*電子通訊錄結(jié)構(gòu)定義*/
{?? int number;?????? /*序號*/
char name[20];???? /*姓名*/
char sex;???????????? /*性別*/
struct birth birth;?? /*出生年月*/
struct addr addr;???? /*通信地址*/
char telephone[13];?? /*聯(lián)系電話*/
}friends[50];
FILE *fp;
int i;
void Data_Show(int j)??? /*打印記錄的詳細(xì)資料*/
{
printf("nntNo:%3dn",friends[j].number);
printf("ntBirthday(y/m/d):%4d%2d%2d",friends[j].birth.year,friends[j].birth.month,friends[j].birth.day);
printf("ntPostnum:%-10s",friends[j].addr.post_num);
printf("ntaddress:%-40s",friends[j].addr.addr);
printf("ntTele%-13s",friends[j].telephone);
}
void Data_Input(int j)??? /*記錄插入函數(shù)*/
{
fflush(stdin);
friends[j].number=j;
printf("nnntNo %d record",j);
printf("nntName:");????? /*讀入姓名*/
scanf("%s",friends[j].name);
fflush(stdin);
printf("ntSex(m/f):");??? /*讀入性別*/
scanf("%c",&friends[j].sex);
printf("nt---birthday---");?? /*讀入出生年月*/
printf("ntyear:");
scanf("%d",&friends[j].birth.year);
printf("nttmonth:");
scanf("%d",&friends[j].birth.month);
printf("nttday:");
scanf("%d",&friends[j].birth.day);
printf("ntPost_number:");?? /*讀入郵編*/
scanf("%s",friends[j].addr.post_num);
printf("ntAddress:");??? /*讀入家庭地址*/
scanf("%s",friends[j].addr.addr);
printf("nttelephone:");??? /*讀入聯(lián)系電話*/
scanf("%s",friends[j].telephone);
printf("y/n");
if( getch()=='n')
main();
}
void Data_Save()
{
int j;
fp=fopen("friend.txt","w");
for(j=1;j<=i;j++)
{?? fwrite(&friends[j],sizeof(struct friend1),1,fp);
}
}
void main()
{
int j,k;
char ch;
char *search_name;
clrscr();
Data_Load();
i--;
do
{?? printf("nnntFunction choose:");
printf("nt1.Read");
printf("nt2.Append");
printf("nt3.Delete");
printf("nt4.Search");
printf("nt5.Insert");
printf("nt6.Save and Exit");
printf("nt7.Quit");
printf("nn");
printf("tChoice:");
ch=getche();
switch(ch)
{?? case '1': j=1;???? /*顯示通訊錄中的所有記錄*/
while(getch()!=0x1b&&j<=i) Data_Show(j++);
if(j>i) printf("ntEnd of e_noten");
break;
case '2':????????? /*增加通訊錄中的記錄*/
while(getch()!=0x1b&&i<50)
{?? i++;
Data_Input(i);
}
if(i==50)printf("nte_note is filledn");
break;
case '3':?????????? /*刪除通訊錄中的記錄*/
if(i<1)
{?? printf("ntNo recordsn");
break;
}
printf("ntDelete No:");??? /*讀入刪除位置*/
scanf("%d",&k);
for(j=k;j<i;j++)?? /*刪除位置前的元素順序前移*/
{?? strcpy(friends[j].name,friends[j+1].name);
friends[j].sex=friends[j=1].sex;
friends[j].birth.year=friends[j+1].birth.year;
friends[j].birth.month=friends[j+1].birth.month;
friends[j].birth.day=friends[j+1].birth.day;
strcpy(friends[j].addr.post_num,friends[j+1].addr.post_num);
strcpy(friends[j].addr.addr,friends[j+1].addr.addr);
strcpy(friends[j].telephone,friends[j+1].telephone);
}
i--;????? /*元素總數(shù)減1*/
break;
case '4':????? /*通訊錄查詢功能*/
printf("ntPlease input name:");
gets(search_name);
for(j=1;j<=i;j++)
{
if(strcmp(search_name,friends[j].name)==0)? /*比較字符串*/
{?? Data_Show(j);? /*查詢成功,打印記錄結(jié)束循環(huán)*/
break;
}
}
if(j>1)???? /*查詢失敗*/
printf("nt No such records")? ;
break;
case '5':
printf("ntInsert No:");???? /*錄入插入位置*/
scanf("%d",&k);
for(j=i+1;j<k;j++)? /*插入位置后的元素順序后移*/
{?? strcpy(friends[j].name,friends[j-1].name); /*交換元素內(nèi)容*/
friends[j].sex=friends[j-1].sex;
friends[j].birth.year=friends[j-1].birth.year;
friends[j].birth.month=friends[j-1].birth.month;
friends[j].birth.day=friends[j-1].birth.day;
strcpy(friends[j].addr.post_num,friends[j-1].addr.post_num);
strcpy(friends[j].addr.addr,friends[j-1].addr.addr);
strcpy(friends[j].telephone,friends[j-1].telephone);
}
Data_Input(k);
i++;
break;
case '6': Data_Save();
exit(0);? break;
case '7': printf("ntDo you want to save e_note:(y/n)");
ch=getch();
if(ch=='y') Data_Save();
fclose(fp);
exit(0);
default: printf("Please choose num 1-4n"
);
}
}while(1);
}
3.1.2 主函數(shù)main()
main()函數(shù)主要實現(xiàn)了對整個程序的運(yùn)行控制,以及相關(guān)功能模塊的調(diào)用。
void main()
{
int j,k;
char ch;
char *search_name;
clrscr();
Data_Load();
i--;
do
{?? printf("nnntFunction choose:");
printf("nt1.Read");
printf("nt2.Append");
printf("nt3.Delete");
printf("nt4.Search");
printf("nt5.Insert");
printf("nt6.Save and Exit");
printf("nt7.Quit");
printf("nn");
printf("tChoice:");
ch=getche();
switch(ch)
{?? case '1': j=1;??? ?/*顯示通訊錄中的所有記錄*/
while(getch()!=0x1b&&j<=i) Data_Show(j++);
if(j>i) printf("ntEnd of e_noten");
break;
case '2':????????? /*增加通訊錄中的記錄*/
while(getch()!=0x1b&&i<50)
{?? i++;
Data_Input(i);
}
if(i==50)printf("nte_note is filledn");
break;
case '3':?????????? /*刪除通訊錄中的記錄*/
if(i<1)
{?? printf("ntNo recordsn");
break;
}
printf("ntDelete No:");??? /*讀入刪除位置*/
scanf("%d",&k);
for(j=k;j<i;j++)?? /*刪除位置前的元素順序前移*/
{?? strcpy(friends[j].name,friends[j+1].name);
friends[j].sex=friends[j=1].sex;
friends[j].birth.year=friends[j+1].birth.year;
friends[j].birth.month=friends[j+1].birth.month;
friends[j].birth.day=friends[j+1].birth.day;
strcpy(friends[j].addr.post_num,friends[j+1].addr.post_num);
strcpy(friends[j].addr.addr,friends[j+1].addr.addr);
strcpy(friends[j].telephone,friends[j+1].telephone);
}
i--; ?????/*元素總數(shù)減1*/
break;
case '4':????? /*通訊錄查詢功能*/
printf("ntPlease input name:");
gets(search_name);
for(j=1;j<=i;j++)
{
if(strcmp(search_name,friends[j].name)==0)? /*比較字符串*/
{?? Data_Show(j);? /*查詢成功,打印記錄結(jié)束循環(huán)*/
break;
}
}
if(j>1)???? /*查詢失敗*/
printf("nt No such records")? ;
break;
case '5':
printf("ntInsert No:");???? /*錄入插入位置*/
scanf("%d",&k);
for(j=i+1;j<k;j++)? /*插入位置后的元素順序后移*/
{?? strcpy(friends[j].name,friends[j-1].name); /*交換元素內(nèi)容*/
friends[j].sex=friends[j-1].sex;
friends[j].birth.year=friends[j-1].birth.year;
friends[j].birth.month=friends[j-1].birth.month;
friends[j].birth.day=friends[j-1].birth.day;
strcpy(friends[j].addr.post_num,friends[j-1].addr.post_num);
strcpy(friends[j].addr.addr,friends[j-1].addr.addr);
strcpy(friends[j].telephone,friends[j-1].telephone);
}
Data_Input(k);
i++;
break;
case '6': Data_Save();
exit(0);? break;
case '7': printf("ntDo you want to save e_note:(y/n)");
ch=getch();
if(ch=='y') Data_Save();
fclose(fp);
exit(0);
default: printf("Please choose num 1-4n"
);
}
}while(1);
}
3.1.3 主菜單界面
用戶進(jìn)入通訊錄系統(tǒng)時,需要顯示主菜單,提示用戶進(jìn)行選擇,完成相應(yīng)任務(wù)。此代碼被main()函數(shù)調(diào)用。
void main()
{
printf("nt1.Read");
printf("nt2.Append");
printf("nt3.Delete");
printf("nt4.Search");
printf("nt5.Insert");
printf("nt6.Save and Exit");
printf("nt7.Quit");
printf("nn");
printf("tChoice:");
ch=getche();
switch(ch)
3.1.4讀取文件中的記錄
檢查文件是否存在,建立student.txt文檔,用于保存通訊錄中的記錄。
void Data_Load()
{?? int j;
long k;
fp=fopen("friend.txt","r+t");?? /*打開文件friend.txt*/
if(fp!=NULL)
{?? for(i=1;i<50;i++)
{?? j=fgetc(fp);
if(j==EOF)??? /*判斷是否到了文件尾*/
return;
k=i-1;
fseek(fp,k*sizeof(struct friend1),SEEK_SET);
fread(&friends[i],sizeof(struct friend1),1,fp);/*從文件中讀取一條記錄
*/
}
}
else
{?? fp=fopen("friend.txt","w");
i=1;
}
}
}3.1.5 顯示所有記錄
由于記錄顯示操作經(jīng)常進(jìn)行,所以將這部分由獨立的函數(shù)來完成,減少代碼的重復(fù)。排序后更加方便查找所需要的朋友信息,為用戶減少不必要的麻煩。
case '1': j=1;???? /*顯示通訊錄中的所有記錄*/
while(getch()!=0x1b&&j<=i)
Data_Show(j++);
if(j>i) printf("ntEnd of e_noten");
break;
3.1.6 刪除學(xué)生記錄
在刪除操作中,系統(tǒng)會按用戶要求先找到該學(xué)生記錄,然后從將后一條記錄覆蓋過來。
case '3':?????????? /*刪除通訊錄中的記錄*/
if(i<1)
{?? printf("ntNo recordsn");
break;
}
printf("ntDelete No:");??? /*讀入刪除位置*/
scanf("%d",&k);
for(j=k;j<i;j++)?? /*刪除位置前的元素順序前移*/
{?? strcpy(friends[j].name,friends[j+1].name);
friends[j].sex=friends[j=1].sex;
friends[j].birth.year=friends[j+1].birth.year;
friends[j].birth.month=friends[j+1].birth.month;
friends[j].birth.day=friends[j+1].birth.day;
strcpy(friends[j].addr.post_num,friends
[j+1].addr.post_num);
strcpy(friends[j].addr.addr,friends[j+1].addr.addr);
strcpy(friends[j].telephone,friends[j+1].telephone);
}
i--;????? /*元素總數(shù)減1*/
break;
3.1.7查找學(xué)生記錄
當(dāng)通訊記錄較多的時候,全部羅列出所有記錄太浪費(fèi)精力,查找則能精確快速的完成這項工作。
case '4':????? /*通訊錄查詢功能*/
printf("ntPlease input name:");
gets(search_name);
for(j=1;j<=i;j++)
{
if(strcmp(search_name,friends[j].name)==0)? /*比較字符串
*/
{?? Data_Show(j);? /*查詢成功,打印記錄結(jié)束循環(huán)*/
break;
}
}
if(j>1)???? /*查詢失敗*/
printf("nt No such records")? ;
break;
3.1.8 插入記錄
插入通訊錄中的朋友詳細(xì)信息。
case '5':
printf("ntInsert No:");???? /*錄入插入位置*/
scanf("%d",&k);
for(j=i+1;j<k;j++)? /*插入位置后的元素順序后移*/
{?? strcpy(friends[j].name,friends[j-1].name); /*交換元素內(nèi)
容*/
friends[j].sex=friends[j-1].sex;
friends[j].birth.year=friends[j-1].birth.year;
friends[j].birth.month=friends[j-1].birth.month;
friends[j].birth.day=friends[j-1].birth.day;
strcpy(friends[j].addr.post_num,friends[j-
1].addr.post_num);
strcpy(friends[j].addr.addr,friends[j-1].addr.addr);
strcpy(friends[j].telephone,friends[j-1].telephone);
}
Data_Input(k);
i++;
break;
3.1.9寫入記錄到文件中。
將所輸入的朋友信息保存到frieng.txt中,防止信息丟失。
void Data_Input(int j)??? /*記錄插入函數(shù)*/
{
fflush(stdin);
friends[j].number=j;
printf("nnntNo %d record",j);
printf("nntName:");????? /*讀入姓名*/
scanf("%s",friends[j].name);
fflush(stdin);
printf("ntSex(m/f):");??? /*讀入性別*/
scanf("%c",&friends[j].sex);
printf("nt---birthday---");?? /*讀入出生年月*/
printf("ntyear:");
scanf("%d",&friends[j].birth.year);
printf("nttmonth:");
scanf("%d",&friends[j].birth.month);
printf("nttday:");
scanf("%d",&friends[j].birth.day);
printf("ntPost_number:");?? /*讀入郵編*/
scanf("%s",friends[j].addr.post_num);
printf("ntAddress:");??? /*讀入家庭地址*/
scanf("%s",friends[j].addr.addr);
printf("nttelephone:");??? /*讀入聯(lián)系電話*/
scanf("%s",friends[j].telephone);
printf("y/n");
if( getch()=='n')
main();
}
4程序測試與系統(tǒng)維護(hù)
4.1測試主菜單界面
主界面如圖4.1
圖4.1主界面
4.2測試添加界面
進(jìn)入添加界面,如圖4.2。
圖4.2添加界面
4.3測試顯示界面
進(jìn)入顯示界面,如圖4.3。
圖4.3顯示界面
4.4測試刪除界面
進(jìn)入刪除界面,如圖4.4。
圖4.4刪除界面
4.5測試查詢界面
進(jìn)入查詢界面,如圖4.5。
圖4.5查詢界面
4.6測試修改界面
進(jìn)入修改界面,如圖4.6。
圖4.6修改界面
4.7測試保存界面
進(jìn)入保存界面,如圖4.7。
圖4.7保存界面
需要完整的資料以及源程序可在我的資源里下載。
需要完整的資料可在我的資源里下載,也可以加入我的紛傳圈子,里面有資源壓縮包的百度網(wǎng)盤下載地址及提取碼。
紛傳?點擊用微信打開即可,過程有點繁瑣請見諒。