C語言實(shí)現(xiàn)通訊錄功能的流程與代碼_第1頁
C語言實(shí)現(xiàn)通訊錄功能的流程與代碼_第2頁
C語言實(shí)現(xiàn)通訊錄功能的流程與代碼_第3頁
C語言實(shí)現(xiàn)通訊錄功能的流程與代碼_第4頁
C語言實(shí)現(xiàn)通訊錄功能的流程與代碼_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第C語言實(shí)現(xiàn)通訊錄功能的流程與代碼用C語言制作一個(gè)擁有添加,刪除,查找,修改,排序,清空,打印功能的通訊錄

用分模塊的方法來實(shí)現(xiàn)這個(gè)通訊錄,函數(shù)的聲明,類型的聲明放在一個(gè).h文件中,函數(shù)的實(shí)現(xiàn)放在一個(gè).c文件中,在主文件中來調(diào)用函數(shù)。

首先創(chuàng)建一個(gè)test.c文件用來測(cè)試并且實(shí)現(xiàn)通訊錄的功能

通訊錄需要顯示一個(gè)菜單來讓用戶具體選擇哪個(gè)功能,那么在test.c文件中就需要打印出來一個(gè)菜單,如下代碼:

#includestdio.h

voidmenu()

printf("***********************************\n");

printf("******1.add2.del******\n");

printf("******3.search4.modify******\n");

printf("******5.sort6.empty******\n");

printf("******7.print0.exit******\n");

printf("***********************************\n");

intmain()

//通訊錄:1.add2.del3.search4,modify5.sort6.empty7.print0.exit

menu();

}while(0);

return0;

}

接著就要讓用戶選擇輸入某個(gè)數(shù)組來使用通訊錄的功能,這時(shí)就可以用一個(gè)switch開關(guān)來實(shí)現(xiàn)了,如下代碼:

intinput=0;

menu();

printf("請(qǐng)選擇功能

scanf("%d",input);

switch(input)

case1:

break;

case2:

break;

case3:

break;

case4:

break;

case5:

break;

case6:

break;

case7:

break;

case0:

break;

default:

printf("請(qǐng)重新輸入\n");

break;

}while(input);

在while循環(huán)的條件判斷部分直接寫input,這樣選擇輸入0的時(shí)候就直接跳出循環(huán)了,輸入其他數(shù)字可以繼續(xù)使用通訊錄的功能。

case后面跟著的都是數(shù)字,有時(shí)候調(diào)試代碼的時(shí)候比較容易忘記這個(gè)數(shù)字表示的是什么意思,所以這個(gè)時(shí)候可以用創(chuàng)建一個(gè)枚舉類型來定義對(duì)應(yīng)的枚舉常量。

創(chuàng)建一個(gè)contact.h文件來放類型的定義,函數(shù)的聲明。

然后把枚舉類型在里面進(jìn)行聲明

enuminput

Exit,

add,

sub,

search,

modify,

sort,

empty,

print

};

之后要在主文件中調(diào)用這個(gè)頭文件

#include"contact.h"

同時(shí)可以把#includestdio.h這些庫(kù)函數(shù)的引用都放到contact.h這個(gè)文件當(dāng)中,這樣要引用新的庫(kù)函數(shù)時(shí)只需要在contact.h這個(gè)文件中添加就可以了。

這樣switch開關(guān)中的代碼就可以改成這樣了:

switch(input)

caseadd:

break;

casesub:

break;

casesearch:

break;

casemodify:

break;

casesort:

break;

caseempty:

break;

caseprint:

break;

caseExit:

break;

}

然后開始用函數(shù)去實(shí)現(xiàn)每一個(gè)函數(shù)的功能,首先是添加功能,在添加之前,還得需要一個(gè)空的通訊錄,來存放添加進(jìn)去的通訊人的數(shù)據(jù),而通訊人的數(shù)據(jù)有姓名,年齡,性別,電話號(hào)碼,地址這些數(shù)據(jù),都是一些不同類型的值,這時(shí)可以聲明一個(gè)結(jié)構(gòu)體類型來包含這些成員

好,切到contact.h文件來聲明一個(gè)結(jié)構(gòu)體類型:

typedefstructPeople

charname[20];

intage;

charsex[5];

charphone[20];

charaddress[30];

}People;

同時(shí)還對(duì)這個(gè)類型重命名了一下,方便后續(xù)使用這個(gè)結(jié)構(gòu)體類型,這是需要考慮到通訊錄存放數(shù)據(jù)多少的問題,如果address里面存放的內(nèi)容放不下了,這是就需要對(duì)數(shù)組的大小進(jìn)行更改,那這時(shí)就要先找到這個(gè)結(jié)構(gòu)體類型才能更改了,如果代碼寫的比較多的話就會(huì)比較亂,所以可以用#define定義的標(biāo)識(shí)符常量來定義這些值,以后要改的話就只需要找到#define就可以了

如下代碼:

#defineNameMax20

#defineSexMax5

#definePhoneMax20

#defineAddressMax30

typedefstructPeople

charname[NameMax];

intage;

charsex[SexMax];

charphone[PhoneMax];

charaddress[AddressMax];

}People;

因?yàn)檫@里是不同類型的值的定義,所以用#define來定義而不用枚舉類型來定義,因?yàn)槊杜e類型是用來列舉相同類型的值的,比如前面的通訊錄功能都是屬于通訊錄的功能一類的值

下一步,通訊錄不只存放一個(gè)人的數(shù)據(jù),所以需要用這個(gè)結(jié)構(gòu)體類型來創(chuàng)建一個(gè)數(shù)組,假設(shè)這個(gè)通訊錄可以存放1000個(gè)人的數(shù)據(jù),同時(shí)還能記錄其中已存放了多少個(gè)人

那么可以在主函數(shù)中這么寫:

intmain()

//通訊錄:1.add2.del3.search4,modify5.sort6.empty7.print0.exit

Peoplecontact[1000];

intnum;

對(duì)于這個(gè)通訊錄和這個(gè)通訊人的數(shù)量,這兩個(gè)變量可以兩者之間是由聯(lián)系的,那么此時(shí)就可以再聲明一個(gè)結(jié)構(gòu)體類型來包含這兩個(gè)成員。

切到contact.h文件:

typedefstructContact

Peoplepeople[1000];

intnum;

}Contact;

聲明好這個(gè)通訊錄類型之后,需要在主文件中用這個(gè)類型創(chuàng)建一個(gè)變量,同時(shí)對(duì)變量的內(nèi)容進(jìn)行初始化

intmain()

//通訊錄:1.add2.del3.search4,modify5.sort6.empty7.print0.exit

Contactcontact;

InitialContact(contact);

切到contact.h文件聲明函數(shù):

//函數(shù)的聲明

//通訊錄初始化

voidInitialContact(Contact*pc);

此時(shí)創(chuàng)建一個(gè)contact.c文件來實(shí)現(xiàn)函數(shù)的內(nèi)容:

切到contact.c文件:

#include"contact.h"

voidInitialContact(Contact*pc)

memset(pc,0,sizeof(*pc));

}

要記得引這個(gè)contact.h頭文件

在對(duì)通訊錄的內(nèi)容進(jìn)行完初始化之后,可以開始往里面添加通訊人的信息了,再聲明一個(gè)函數(shù):

test.c:

caseadd:

printf("添加通訊人\n");

AddPeople(contact);

break;

contact.h:

//添加通訊人

voidAddPeople(Contact*pc);

contact.c:

voidAddPeople(Contact*pc)

if(pc-num==1000)

printf("通訊錄已滿\n");

return;

printf("請(qǐng)輸入姓名

scanf("%s",pc-people[pc-num].name);

printf("請(qǐng)輸入年齡

scanf("%d",pc-people[pc-num].age);

printf("請(qǐng)輸入性別

scanf("%s",pc-people[pc-num].sex);

printf("請(qǐng)輸入電話

scanf("%s",pc-people[pc-num].phone);

printf("請(qǐng)輸入地址

scanf("%s",pc-people[pc-num].address);

pc-num++;

}

輸入完成之后,要記得讓通訊人數(shù)量+1

接下來可以嘗試顯示一下通訊錄中的通訊人信息了

contact.h:

//顯示通訊人信息

voidPrintContact(constContact*pc);

contact.c:

voidPrintContact(constContact*pc)

printf("%-20s%-20s%-20s%-20s%-20s\n","姓名","年齡","性別","電話","地址");

inti=0;

for(i=0;ipc-i++)

printf("%-20s%-20d%-20s%-20s%-20s\n",pc-people[i].name,pc-people[i].age,pc-people[i].sex,pc-people[i].phone,pc-people[i].address);

}

在前面打印個(gè)通訊人列表修飾一下

test.c:

caseprint:

printf("顯示通訊人信息\n");

PrintContact(contact);

break;

接下來,開始實(shí)現(xiàn)通訊錄的刪除功能:

可以通過讓用戶輸入某個(gè)人的名字來刪除這個(gè)人在通訊錄中的信息,刪除功能的實(shí)現(xiàn)分為兩步,第一步,是需要找到這個(gè)人,第二步,刪除這個(gè)人在通訊錄中的信息

contact.h:

//刪除通訊人信息

voidSubPeople(Contact*pc);

contact.c:

intFindByName(Contact*pc,constchar*name)

//遍歷每一個(gè)contact結(jié)構(gòu)體中people數(shù)組成員中的已存放數(shù)據(jù)的每一個(gè)結(jié)構(gòu)體

inti=0;

for(i=0;isizeof(pc-num);i++)

if(strcmp(pc-people[i].name,name)==0)

returni;//找到了返回對(duì)應(yīng)結(jié)構(gòu)體的下標(biāo)

return-1;//找不到就返回-1

voidSubPeople(Contact*pc)

if(pc-num==0)//先判斷通訊錄中有無存儲(chǔ)信息

printf("通訊錄已清空\(chéng)n");

return;

//1.找到

printf("請(qǐng)輸入要?jiǎng)h除的人的姓名;

charname[NameMax];

scanf("%s",name);

intret=FindByName(pc,name);//用以接收放回的數(shù)組下標(biāo)

if(ret==-1)

printf("找不到要?jiǎng)h除的人\n");

return;//讓函數(shù)直接返回

//2.刪除

//從找到的那個(gè)下標(biāo)位置開始,后面的數(shù)組元素(通訊人結(jié)構(gòu)體)依次往前賦值

intj=0;

for(j=ret;jpc-num-1;j++)

pc-people[j]=pc-people[j+1];

printf("刪除成功\n");

pc-num--;//通訊人數(shù)量-1

}

test.c:

casesub:

SubPeople(contact);

break;

每完成一個(gè)功能,都要去嘗試運(yùn)行一下,看有沒有bug,否則最后才去找bug可能會(huì)比較麻煩。

在刪除功能中,用到了一個(gè)自己寫的FindByName函數(shù),然后在接下來的通訊錄查找功能實(shí)現(xiàn)中,同樣也要依賴這個(gè)函數(shù),不僅如此,在通訊錄修改功能中,也要用到這個(gè)函數(shù),而這個(gè)函數(shù)的實(shí)現(xiàn)是為了刪除、查找和修改功能而聲明的,所以可以不用寫在contact.h頭文件中進(jìn)行聲明。

下面,來開始實(shí)現(xiàn)查找功能:

contact.h:

//查找通訊人

voidSearchPeople(constContact*pc);

contact.c:

voidSearchPeople(constContact*pc)

//查找

printf("請(qǐng)輸入要查找的人的姓名;

charname[NameMax];

scanf("%s",name);

intret=FindByName(pc,name);//用以接收放回的數(shù)組下標(biāo)

if(ret==-1)

printf("找不到要查找的人\n");

return;//讓函數(shù)直接返回

//顯示

printf("%-20s%-20s%-20s%-20s%-20s\n","姓名","年齡","性別","電話","地址");

printf("%-20s%-20d%-20s%-20s%-20s\n",pc-people[ret].name,pc-people[ret].age,pc-people[ret].sex,pc-people[ret].phone,pc-people[ret].address);

}

test.c:

casesearch:

SearchPeople(contact);

break;

查找功能已經(jīng)實(shí)現(xiàn)了,接下來就要實(shí)現(xiàn)修改功能了,先通過通訊人的姓名找到需要修改的結(jié)構(gòu)體對(duì)應(yīng)的下標(biāo),然后重新對(duì)這個(gè)結(jié)構(gòu)體進(jìn)行賦值就可以了

contact.h:

//修改通訊人信息

voidModifyPeople(Contact*pc);

contact.c:

voidModifyPeople(Contact*pc)

//查找

printf("請(qǐng)輸入要修改的人的姓名;

charname[NameMax];

scanf("%s",name);

intret=FindByName(pc,name);//用以接收放回的數(shù)組下標(biāo)

if(ret==-1)

printf("找不到要修改的人\n");

return;//讓函數(shù)直接返回

//修改

printf("請(qǐng)輸入要修改的姓名

scanf("%s",pc-people[ret].name);

printf("請(qǐng)輸入要修改的年齡

scanf("%d",pc-people[ret].age);

printf("請(qǐng)輸入要修改的性別

scanf("%s",pc-people[ret].sex);

printf("請(qǐng)輸入要修改的電話

scanf("%s",pc-people[ret].phone);

printf("請(qǐng)輸入要修改的地址

scanf("%s",pc-people[ret].address);

}

test.c:

casemodify:

ModifyPeople(contact);

break;

接下來可以開始實(shí)習(xí)通訊錄的排序功能了,這里就按照年齡來進(jìn)行一個(gè)排序,用到qsort這個(gè)函數(shù),其中cmp函數(shù)需要自己去寫

contact.h:

//排序

voidSortByAge(Contact*pc);

contact.c:

intcmp(constvoid*e1,constvoid*e2)

Contact*p1=(Contact*)e1;

Contact*p2=(Contact*)e2;

if(p1-people[0].agep2-people[1].age)

return1;

elseif(p1-people[0].agep2-people[1].age)

return-1;

else

return0;

voidSortByAge(Contact*pc)

if(pc-num==0)

printf("通訊錄已清空\(chéng)n");

return;

intnum=pc-

intwidth=sizeof(pc-people[0]);

qsort(pc-people,num,width,cmp);

}

test.c:

casesort:

printf("按照年齡排序\n");

SortByAge(contact);

PrintContact(contact);

break;

到這里通訊錄的功能就只剩下清空了,可以用到一開始的初始化函數(shù)InitialContact

test.c:

caseempty:

printf("清空通訊錄\n");

InitialContact(contact);

break;

現(xiàn)在通訊錄的功能已經(jīng)全部實(shí)現(xiàn)了

可是這個(gè)通訊錄的功能還是有點(diǎn)不太好,就是通訊錄默認(rèn)的大小就是存放1000個(gè)人的數(shù)據(jù),那么能不能創(chuàng)建一個(gè)可以隨著添加人數(shù)的增加而變大的通訊錄呢?鑒于最近學(xué)習(xí)了動(dòng)態(tài)內(nèi)存管理,所以對(duì)通訊錄的功能做出了一點(diǎn)改進(jìn)

對(duì)結(jié)構(gòu)體類型的修改:

contact.h

typedefstructContact

People*people;

intnum;

intcapacity;//通訊錄的容量

}Contact;

contact.c:

對(duì)InitialContact函數(shù)的修改:

voidInitialContact(Contact*pc)

pc-people=(People*)calloc(3,sizeof(People));

if(pc-people==NULL)

perror("calloc");

return;

pc-num=0;

pc-capacity=3;

}

對(duì)AddPeople函數(shù)的修改:

voidAddPeople(Contact*pc)

if(pc-num==pc-capacity)

pc-people=realloc(pc-people,(pc-capacity+2)*sizeof(People));

if(pc-people==NULL)

perror("realloc");

return;

pc-capacity+=2;

printf("請(qǐng)輸入姓名

scanf("%s",pc-people[pc-num].name);

printf("請(qǐng)輸入年齡

scanf("%d",pc-people[pc-num].age);

printf("請(qǐng)輸入性別

scanf("%s",pc-people[pc-num].sex);

printf("請(qǐng)輸入電話

scanf("%s",pc-people[pc-num].phone);

printf("請(qǐng)輸入地址

scanf("%s",pc-people[pc-num].address);

pc-num++;

}

對(duì)排序函數(shù)中cmp函數(shù)的修改:

intcmp(constvoid*e1,constvoid*e2)

People*p1=(People*)e1;

People*p2=(People*)e2;

if(p1-agep2-age)

return1;

elseif(p1-agep2-age)

return-1;

else

return0;

}

test.c:

部分修改:

caseempty:

printf("清空通訊錄\n");

FreeContact(contact);

break;

caseExit:

FreeContact(contact);

break;

如下是完整的代碼:

contact.h:

#includestdio.h

#includestring.h

#includestdlib.h

#includectype.h

//類型的聲明

#defineNameMax20

#defineSexMax5

#definePhoneMax20

#defineAddressMax30

enuminput

Exit,

add,

sub,

search,

modify,

sort,

empty,

print

typedefstructPeople

charname[NameMax];

intage;

charsex[SexMax];

charphone[PhoneMax];

charaddress[AddressMax];

}People;

typedefstructContact

People*people;

intnum;

intcapacity;//通訊錄的容量

}Contact;

//函數(shù)的聲明

//通訊錄初始化

voidInitialContact(Contact*pc);

//添加通訊人

voidAddPeople(Contact*pc);

//顯示通訊人信息

voidPrintContact(constContact*pc);

//刪除通訊人信息

voidSubPeople(Contact*pc);

//查找通訊人

voidSearchPeople(constContact*pc);

//修改通訊人信息

voidModifyPeople(Contact*pc);

voidSortByAge(Contact*pc);

//銷毀通訊錄

voidFreeContact(Contact*pc);

contact.c:

#include"contact.h"

voidInitialContact(Contact*pc)

pc-people=(People*)calloc(3,sizeof(People));

if(pc-people==NULL)

perror("calloc");

return;

pc-num=0;

pc-capacity=3;

voidAddPeople(Contact*pc)

if(pc-num==pc-capacity)

pc-people=realloc(pc-people,(pc-capacity+2)*sizeof(People));

if(pc-people==NULL)

perror("realloc");

return;

pc-capacity+=2;

printf("請(qǐng)輸入姓名

scanf("%s",pc-people[pc-num].name);

printf("請(qǐng)輸入年齡

scanf("%d",pc-people[pc-num].age);

printf("請(qǐng)輸入性別

scanf("%s",pc-people[pc-num].sex);

printf("請(qǐng)輸入電話

scanf("%s",pc-people[pc-num].phone);

printf("請(qǐng)輸入地址

scanf("%s",pc-people[pc-num].address);

pc-num++;

voidPrintContact(constContact*pc)

printf("%-20s%-20s%-20s%-20s%-20s\n","姓名","年齡","性別","電話","地址");

inti=0;

for(i=0;ipc-i++)

printf("%-20s%-20d%-20s%-20s%-20s\n",pc-people[i].name,pc-people[i].age,pc-people[i].sex,pc-people[i].phone,pc-people[i].address);

intFindByName(Contact*pc,constchar*name)

//遍歷每一個(gè)contact結(jié)構(gòu)體中people數(shù)組成員中的已存放數(shù)據(jù)的每一個(gè)結(jié)構(gòu)體

inti=0;

for(i=0;isizeof(pc-num);i++)

if(strcmp(pc-people[i].name,name)==0)

returni;//找到了返回對(duì)應(yīng)結(jié)構(gòu)體的下標(biāo)

return-1;//找不到就返回-1

voidSubPeople(Contact*pc)

if(pc-num==0)//先判斷通訊錄中有無存儲(chǔ)信息

printf("通訊錄已清空\(chéng)n");

return;

//1.找到

printf("請(qǐng)輸入要?jiǎng)h除的人的姓名;

charname[NameMax];

scanf("%s",name);

intret=FindByName(pc,name);//用以接收放回的數(shù)組下標(biāo)

if(ret==-1)

printf("找不到要?jiǎng)h除的人\n");

return;//讓函數(shù)直接返回

//2.刪除

//從找到的那個(gè)下標(biāo)位置開始,后面的數(shù)組元素(通訊人結(jié)構(gòu)體)依次往前賦值

intj=0;

for(j=ret;jpc-num-1;j++)

pc-people[j]=pc-people[j+1];

printf("刪除成功\n");

pc-num--;//通訊人數(shù)量-1

voidSearchPeople(constContact*pc)

//查找

printf("請(qǐng)輸入要查找的人的姓名;

charname[NameMax];

scanf("%s",name);

intret=FindByName(pc,name);//用以接收放回的數(shù)組下標(biāo)

if(ret==-1)

printf("找不到要查找的人\n");

return;//讓函數(shù)直接返回

//顯示

printf("%-20s%-20s%-20s%-20s%-20s\n","姓名","年齡","性別","電話","地址");

printf("%-20s%-20d%-20s%-20s%-20s\n",pc-people[ret].name,pc-people[ret].age,pc-people[ret].sex,pc-people[ret].phone,pc-people[ret].address);

voidModifyPeople(Contact*pc)

//查找

printf("請(qǐng)輸入要修改的人的姓名;

charname[NameMax];

scanf("%s",name);

intret=FindByName(pc,name);//用以接收放回的數(shù)組下標(biāo)

if(ret==-1)

printf("找不到要修改的人\n");

return;//讓函數(shù)直接返回

//修改

printf("請(qǐng)輸入要修改的姓名

scanf("%s",pc-people[ret].name);

printf("請(qǐng)輸入要修改的年齡

scanf("%d",pc-people[ret].age);

printf("請(qǐng)輸入要修改的性別

scanf("%s",pc-people[ret].sex);

printf("請(qǐng)輸入要修改的電話

scanf("%s",pc-people[ret].phone);

printf("請(qǐng)輸入要修改的地址

scanf("%s",pc-people[ret].address);

intcmp(constvoid*e1,constvoid*e2)

People*p1=(People*)e1;

People*p2=(People*)e2;

if(p1-agep2-age)

return1;

elseif(p1-agep2-age)

return-1;

else

return0;

voidSortByAge(C

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論