加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入

C語(yǔ)言程序設(shè)計(jì)-通訊錄

08/22 13:19
1875
服務(wù)支持:
技術(shù)交流群

完成交易后在“購(gòu)買成功”頁(yè)面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗(yàn)、收獲成長(zhǎng)和認(rèn)同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當(dāng)前內(nèi)容為數(shù)字版權(quán)作品,購(gòu)買后不支持退換且無(wú)法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論
放大
實(shí)物圖
相關(guān)方案
  • 方案介紹
  • 相關(guān)文件
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

通訊錄管理系統(tǒng)

  1. 問(wèn)題定義與描述

1.1問(wèn)題定義

創(chuàng)建一個(gè)學(xué)生通訊錄管理系統(tǒng)。系統(tǒng)中每個(gè)學(xué)生信息包括學(xué)號(hào)、姓名、性別、出生日期、家庭地址、學(xué)號(hào)、電話、QQ。程序的運(yùn)行效果如下圖所示,選擇任意菜單后,實(shí)現(xiàn)相應(yīng)功能。

圖1.1? 學(xué)生通訊錄管理系統(tǒng)功能需求

1.2問(wèn)題描述

在問(wèn)題定義與描述階段要考慮題目的可行性和需求分析,接下來(lái)進(jìn)入開(kāi)發(fā)階段,完成系統(tǒng)設(shè)計(jì)和系統(tǒng)實(shí)現(xiàn)的任務(wù)。

2、系統(tǒng)設(shè)計(jì)

總體設(shè)計(jì)

采用模塊化的程序設(shè)計(jì)方法,即將較大的任務(wù)按照一定的原則分為一個(gè)個(gè)較小的任務(wù),然后分別設(shè)計(jì)各個(gè)小任務(wù)。需要注意的是劃分出來(lái)的模塊應(yīng)該相對(duì)獨(dú)立但又相關(guān),且容易理解??梢杂媚K化層次結(jié)構(gòu)圖(即模塊圖)來(lái)分析其任務(wù)的劃分,一般從上到下進(jìn)行,最上面一層是主模塊,下面各層是其上一層模塊的逐步細(xì)化描述。

2.1主要功能模塊

添加:添加通訊錄記錄。

顯示:顯示通訊錄記錄。

刪除:刪除通訊錄記錄。

查詢:查詢通訊錄記錄。

修改:修改通訊錄記錄。

保存:將信息保存到文件。

2.2數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)

結(jié)構(gòu)體

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;?????? /*序號(hào)*/

char name[20];???? /*姓名*/

char sex;???????????? /*性別*/

struct birth birth;?? /*出生年月*/

struct addr addr;???? /*通信地址*/

char telephone[13];?? /*聯(lián)系電話*/

}friends[50];

FILE *fp;

int i;

2.3輸入記錄模塊

輸入記錄模塊主要實(shí)現(xiàn)將數(shù)據(jù)存入結(jié)構(gòu)體中。,用戶應(yīng)選擇2,調(diào)用Data_Inpu ()函數(shù),進(jìn)行朋友姓名、電話、地址、性別的輸入,即完成在結(jié)構(gòu)體中添加記錄的操作。

2.4查詢記錄模塊

查詢記錄模塊主要實(shí)現(xiàn)了在結(jié)構(gòu)體中按姓名查找滿足相關(guān)條件的信息記錄。在查詢函數(shù)search()中,找到相同名字則打印出記錄。

2.5刪除記錄模塊

該操作完成刪除指定姓名的記錄,

輸入要?jiǎng)h除的序號(hào),輸入后調(diào)用函數(shù)若找到該記錄,詢問(wèn)是否繼續(xù)尋找相同姓名的記錄。

2.6顯示所有記錄模塊

該操作完成顯示所有記錄信息,它分兩步完成。

第一步,按照數(shù)組中序號(hào)進(jìn)行排序。

第二步,逐條顯示出來(lái)。

3、系統(tǒng)實(shí)現(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;?????? /*序號(hào)*/

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ù)主要實(shí)現(xiàn)了對(duì)整個(gè)程序的運(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)時(shí),需要顯示主菜單,提示用戶進(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");?? /*打開(kāi)文件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)行,所以將這部分由獨(dú)立的函數(shù)來(lái)完成,減少代碼的重復(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)會(huì)按用戶要求先找到該學(xué)生記錄,然后從將后一條記錄覆蓋過(guò)來(lái)。

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)通訊記錄較多的時(shí)候,全部羅列出所有記錄太浪費(fèi)精力,查找則能精確快速的完成這項(xiàng)工作。

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程序測(cè)試與系統(tǒng)維護(hù)

4.1測(cè)試主菜單界面

主界面如圖4.1


圖4.1主界面

4.2測(cè)試添加界面

進(jìn)入添加界面,如圖4.2。

圖4.2添加界面

4.3測(cè)試顯示界面

進(jìn)入顯示界面,如圖4.3。


圖4.3顯示界面

4.4測(cè)試刪除界面

進(jìn)入刪除界面,如圖4.4。


圖4.4刪除界面
4.5測(cè)試查詢界面

進(jìn)入查詢界面,如圖4.5。

圖4.5查詢界面

4.6測(cè)試修改界面

進(jìn)入修改界面,如圖4.6。

圖4.6修改界面

4.7測(cè)試保存界面

進(jìn)入保存界面,如圖4.7。

圖4.7保存界面

需要完整的資料以及源程序可在我的資源里下載。

需要完整的資料可在我的資源里下載,也可以加入我的紛傳圈子,里面有資源壓縮包的百度網(wǎng)盤下載地址及提取碼。

紛傳?點(diǎn)擊用微信打開(kāi)即可,過(guò)程有點(diǎn)繁瑣請(qǐng)見(jiàn)諒。

  • 有需要資料的可了解一下.docx

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
AQY282S 1 Panasonic Electronic Components Solid State Relay,
$1.69 查看
AT24C02C-SSHM-T 1 Microchip Technology Inc IC EEPROM 2KBIT 1MHZ 8SOIC

ECAD模型

下載ECAD模型
$0.17 查看
SN74LVC1G125DCKT 1 Texas Instruments Single 1.65-V to 5.5-V buffer with 3-state outputs 5-SC70 -40 to 125

ECAD模型

下載ECAD模型
$0.9 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜