這個項目是我大一時期數(shù)據(jù)結(jié)構(gòu)的課程設(shè)計,在我潛心研究下出來的,對于當時的我來說算是非常滿意啦,哈哈哈哈哈哈哈哈哈哈☆*: .?. o(≧▽≦)o .?.:*☆
目錄
一、引言
1.目的:
2.意義:
3.主要任務(wù):
4.程序功能:
5.編譯工具:
二、正文
1.系統(tǒng)模塊:
2.算法流程圖:
3.各個模塊的實現(xiàn):
(1)定義結(jié)構(gòu)體
①定義xx(信息)結(jié)構(gòu)體包含:
②定義結(jié)構(gòu)體xxb(信息表)包含:
③實現(xiàn)代碼:
(2)主函數(shù)main()?
①主函數(shù)模塊main()的功能是:
???②主函數(shù)模塊main()流程如圖(3)所示:
? ?③主函數(shù)模塊main()實現(xiàn)代碼:?
(3)選單模塊Menu()?
①選單模塊Menu()的功能是:
②選單模塊Menu()實現(xiàn)代碼:
(4)退出選單模塊Quit()?
①退出選單模塊Quit()的功能是:
②退出選單模塊Quit()實現(xiàn)代碼:
(5)創(chuàng)建數(shù)據(jù)模塊Create()?
①創(chuàng)建數(shù)據(jù)模塊Create()的功能是:
②創(chuàng)建數(shù)據(jù)模塊Create()的流程如圖(4)所示:
③創(chuàng)建數(shù)據(jù)模塊Create()實現(xiàn)代碼:
(6)添加數(shù)據(jù)模塊Add()?
①添加數(shù)據(jù)模塊Add()的功能是:
②添加數(shù)據(jù)模塊Add()的流程如圖(5)所示:
③添加數(shù)據(jù)模塊Add()實現(xiàn)代碼:
(7)查詢模塊Find()?
①查詢模塊Find()的功能是:
②查詢模塊Find()的流程如圖(6)所示:
③查詢模塊Find()實現(xiàn)代碼:
(8)修改模塊Alter()?
①修改模塊Alter()的功能是:
②修改模塊Alter()的流程如圖(7)所示:
③修改模塊Alter()實現(xiàn)代碼:
(9)刪除模塊Delete()?
①刪除模塊Delete()的功能是:
②刪除模塊Delete()的流程如圖(8)所示:
③刪除模塊Delete()實現(xiàn)代碼:
(10)顯示模塊List()?
①顯示模塊List()的功能是:
②顯示模塊List()的流程如圖(9)所示:
③顯示模塊List()實現(xiàn)代碼:
(11)統(tǒng)計模塊nv( )?
①統(tǒng)計模塊nv( )的功能是:
②統(tǒng)計模塊nv( )的流程如圖(10)所示:
③統(tǒng)計模塊nv( )實現(xiàn)代碼:
(12)顯示公司信息模塊ti( )?
①顯示公司信息模塊ti( )的功能是:
②顯示公司信息模塊ti( )流程如圖(11)所示:
③顯示公司信息模塊ti( )實現(xiàn)代碼:
三、結(jié)論
四、參考文獻
一、引言
1.目的:
(1)訓(xùn)練學生靈活應(yīng)用所學數(shù)據(jù)結(jié)構(gòu)知識,獨立完成問題分析,結(jié)合數(shù)據(jù)結(jié)構(gòu)理論知識,編寫程序求解指定問題。
(2)初步掌握軟件開發(fā)過程的問題分析、系統(tǒng)設(shè)計、程序編碼、測試等基本方法和技能;
2.意義:
(1)提高綜合運用所學的理論知識和方法獨立分析和解決問題的能力;
(2)訓(xùn)練用系統(tǒng)的觀點和軟件開發(fā)一般規(guī)范進行軟件開發(fā),鞏固、深化學生的理論知識,提高編程水平,并在此過程中培養(yǎng)嚴謹?shù)目茖W態(tài)度和良好的工作作風。
3.主要任務(wù):
使用順序表實現(xiàn)對通訊錄信息的插入、查找、刪除、修改、輸出等操作,以及統(tǒng)計通訊錄中男女比例和顯示出同一公司中的人的信息。
4.程序功能:
(1)顯示提示菜單。
(2)創(chuàng)建順序表。
(3)創(chuàng)建通訊人信息。
(4)添加通訊人信息。
(5)查找指定聯(lián)系人信息。
(6)修改指定聯(lián)系人信息。
(7)刪除指定聯(lián)系人信息。
(8)顯示所有聯(lián)系人信息。
(9)統(tǒng)計通訊錄中男女比例。
(10)顯示出同一公司中的人的信息。
(11)退出通訊錄管理系統(tǒng)。
5.編譯工具:
編程語言:C語言。
編譯環(huán)境:Visual Studio 2022。
二、正文
1.系統(tǒng)模塊:
系統(tǒng)模塊主要是用選單模塊來調(diào)用各個小模塊來實現(xiàn)任務(wù)要求的功能,根據(jù)任務(wù)要求,下面將系統(tǒng)功能進行詳細設(shè)計劃分,具體結(jié)構(gòu)如圖(1)所示。
?
圖(1) 系統(tǒng)模塊圖
2.算法流程圖:
本系統(tǒng)通過main()函數(shù)進行對menu()調(diào)用,然后通過menu()利用Switch函數(shù)實現(xiàn)
利用其它函數(shù)進行相關(guān)操作,具體流程如圖(2)所示
圖(2) 算法流程圖
3.各個模塊的實現(xiàn):
(1)定義結(jié)構(gòu)體
①定義xx(信息)結(jié)構(gòu)體包含:
編號(char num[10])、姓名(char name[10])、性別(char sex[10])、電話(char phone[20])、公司名稱(char address[50])
②定義結(jié)構(gòu)體xxb(信息表)包含:
單個信息(xx grxx[MaxLen])
表中共有多少信息(int length)
③實現(xiàn)代碼:
typedef struct {
char num[10];
char name[10];
char sex[10];
char phone[20];
char address[50];
}xx;
typedef struct
{
xx grxx[MaxLen];
int length;
}xxb;
(2)主函數(shù)main()
①主函數(shù)模塊main()的功能是:
根據(jù)選單的選項調(diào)用各函數(shù),并完成相應(yīng)的功能。運用if判斷用戶輸入的數(shù)值是否正確,用goto實現(xiàn)輸錯數(shù)值后的重新賦值,然后運用switch函數(shù)進行功能的選擇。
②主函數(shù)模塊main()流程如圖(3)所示:
圖(3) 主函數(shù)模塊main()流程圖
③主函數(shù)模塊main()實現(xiàn)代碼:? ? ??
int main()
{
xxb L;
int i;
InitList(&L);
while (1) {
Menu();
printf("請輸入您想要的功能:(1-9)\t");
loop:scanf_s(" %d", &i);
if (i <= 0 || i >= 10)
{
system("cls");
Menu();
printf("未設(shè)定功能,請重新輸入:");
goto loop;
}
switch (i)
{
case 1:
Create(&L);
break;
case 2:
Add(&L);
break;
case 3:
Find(L);
break;
case 4:
Alter(&L);
break;
case 5:
Delete(&L);
break;
case 6:
List(L);
break;
case 7:
nv(L);
break;
case 8:
ti(L);
break;
case 9:
Quit();
break;
default:
break;
}
}
system("pause");
return 0;
}
(3)選單模塊Menu()
①選單模塊Menu()的功能是:
顯示提示選單。使用printf函數(shù)進行界面排版。
②選單模塊Menu()實現(xiàn)代碼:
void Menu()
{
printf("\t\t\t《通訊錄管理系統(tǒng)菜單》\n");
printf(">————————————————————————————————\n");
printf("*\t1.新建聯(lián)系人\n");
printf("*\t2.添加聯(lián)系人信息\n");
printf("*\t3.查找指定聯(lián)系人信息\n");
printf("*\t4.修改指定聯(lián)系人\n");
printf("*\t5.刪除指定聯(lián)系人\n");
printf("*\t6.顯示全部聯(lián)系人信息\n");
printf("*\t7.顯示本通訊錄男女比例\n");
printf("*\t8.顯示出同一公司中的人的信息\n");
printf("*\t9.退出菜單\n");
printf(">————————————————————————————————\n");
}
(4)退出選單模塊Quit()
①退出選單模塊Quit()的功能是:
退出選單。運用exit()函數(shù)直接退出選單。
②退出選單模塊Quit()實現(xiàn)代碼:
void Quit()
{
exit(0);
}
(5)創(chuàng)建數(shù)據(jù)模塊Create()
①創(chuàng)建數(shù)據(jù)模塊Create()的功能是:
創(chuàng)建新的數(shù)據(jù)記錄。先判斷通訊錄是否滿員,再進行輸入內(nèi)容,對編號進行判斷是否重復(fù),在輸入其他數(shù)據(jù),最后詢問是否繼續(xù)添加,使用循環(huán)結(jié)構(gòu)進行多次寫入。
②創(chuàng)建數(shù)據(jù)模塊Create()的流程如圖(4)所示:
圖(4) 創(chuàng)建數(shù)據(jù)模塊Create()流程圖
③創(chuàng)建數(shù)據(jù)模塊Create()實現(xiàn)代碼:
void Create(xxb* L)
{
xx x;
char ch;
int n = 0, i;
do
{
printf(">————————————————————————————————\n");
if (L->length == MaxLen)
{
printf("通訊錄已滿!\n");
system("pause");
system("cls");
return;
}
printf("請輸入通訊者的編號:");
fflush(stdin);
num:gets(x.num);
for (i = 0; i < L->length; i++)
{
if (strcmp(L->grxx[i].num, x.num) == 0)
{
printf(">————————————————————————————————\n");
printf("已有此編號,請重新輸入:");
goto num;
}
}
printf("請輸入通訊者的姓名:");
gets(x.name);
printf("請輸入通訊者的性別:");
gets(x.sex);
printf("請輸入通訊者的電話:");
gets(x.phone);
printf("請輸入通訊者的公司名稱:");
gets(x.address);
L->grxx[L->length++] = x;
n++;
printf(">————————————————————————————————\n");
printf("是否繼續(xù)添加通訊者信息?(Y/N):");
scanf_s(" %c", &ch);
} while (ch == 'y' || ch == 'Y');
printf(">————————————————————————————————\n");
printf("本次共添加%d位信息\n", n);
system("pause");
system("cls");
return;
}
(6)添加數(shù)據(jù)模塊Add()
①添加數(shù)據(jù)模塊Add()的功能是:
增加新的數(shù)據(jù)記錄,并返回選單。判斷通訊錄是否滿員,再進行輸入內(nèi)容,對編號進行判斷,對編號進行判斷是否重復(fù),在輸入其他數(shù)據(jù)
②添加數(shù)據(jù)模塊Add()的流程如圖(5)所示:
圖(5) 添加數(shù)據(jù)模塊Add()流程圖
③添加數(shù)據(jù)模塊Add()實現(xiàn)代碼:
void Add(xxb* L)
{
xx x;
char ch;
printf(">————————————————————————————————\n");
if (L->length == MaxLen)
{
printf("通訊錄已滿!\n");
return;
}
printf("請輸入通訊者的編號:");
fflush(stdin);
num:gets(x.num);
for (int i = 0; i < L->length; i++)
{
if (strcmp(L->grxx[i].num, x.num) == 0)
{
printf(">————————————————————————————————\n");
printf("已有此編號,請重新輸入:");
goto num;
}
}
printf("請輸入通訊者的姓名:");
gets(x.name);
printf("請輸入通訊者的性別:");
gets(x.sex);
printf("請輸入通訊者的電話:");
gets(x.phone);
printf("請輸入通訊者的公司名稱:");
gets(x.address);
L->grxx[L->length++] = x;
printf(">————————————————————————————————\n");
printf("添加成功!\n");
system("pause");
system("cls");
return;
}
(7)查詢模塊Find()
①查詢模塊Find()的功能是:
按要求查詢相關(guān)的信息,如果找到了,則顯示該信息,如果未找到,則提示文件中沒有該信息,并返回選單。先判斷客戶要根據(jù)什么值查找,再根據(jù)輸入值進行判斷查找,找到就輸出其他信息,沒找到就返回菜單。運用switch ( )和if的多層嵌套來判斷客戶想要實現(xiàn)的功能,再用for循環(huán)來查找數(shù)據(jù),進行顯示操作。
②查詢模塊Find()的流程如圖(6)所示:
圖(6) 查詢模塊Find()流程圖
③查詢模塊Find()實現(xiàn)代碼:
void Find(xxb L)
{
int i;
xx r;
char e[20];
printf(">————————————————————————————————\n");
printf("1.按姓名查找\n");
printf("2.按手機號碼查找\n");
printf("3.按編號查找\n");
printf("0.返回菜單\n");
printf(">————————————————————————————————\n");
printf("請選擇查找方式:");
loop1:scanf_s (" %d", &i);
if (i < 0 || i > 3) {
printf(">————————————————————————————————\n");
printf("未設(shè)定功能,請重新輸入:");
goto loop1;
}
switch (i)
{
case 1:
printf(">————————————————————————————————\n");
printf("請輸入姓名:");
scanf_s ("%s", e);
for (i = 0; i < L.length; i++)
{
r = L.grxx[i];
if (strcmp(r.name, e) == 0)
{
printf(">————————————————————————————————\n");
printf("姓名為(%s)的通訊者的其他信息為:\n編號:%s\t性別:%s\t電話:%s\t公司名稱:%s\n", e, r.num, r.sex, r.phone, r.address);
printf(">————————————————————————————————\n");
system("pause");
system("cls");
return;
}
}
printf(">————————————————————————————————\n");
printf("未找到姓名為(%s)的通訊者\n", e);
system("pause");
system("cls");
break;
case 2:
printf(">————————————————————————————————\n");
printf("請輸入電話:");
scanf_s ("%s", e);
for (i = 0; i < L.length; i++)
{
r = L.grxx[i];
if (strcmp(r.phone, e) == 0)
{
printf(">————————————————————————————————\n");
printf("電話為(%s)的通訊者的其他信息為:\n編號:%s\t性別:%s\t電話:%s\t公司名稱:%s\n", e, r.num, r.name, r.sex, r.address);
printf(">————————————————————————————————\n");
system("pause");
system("cls");
return;
}
}
printf(">————————————————————————————————\n");
printf("未找到姓名為(%s)的通訊者\n", e);
system("pause");
system("cls");
break;
case 3:
printf(">————————————————————————————————\n");
printf("請輸入編號:");
scanf_s ("%s", e);
for (i = 0; i < L.length; i++)
{
r = L.grxx[i];
if (strcmp(r.num, e) == 0)
{
printf(">————————————————————————————————\n");
printf("編號為(%s)的通訊者的其他信息為:\n編號:%s\t性別:%s\t電話:%s\t公司名稱:%s\n", e, r.name, r.sex, r.phone, r.address);
printf(">————————————————————————————————\n");
system("pause");
system("cls");
return;
}
}
printf(">————————————————————————————————\n");
printf("未找到姓名為(%s)的通訊者\n", e);
system("pause");
system("cls");
break;
case 0:
system("cls");
break;
}
return;
}
(8)修改模塊Alter()
①修改模塊Alter()的功能是:
修改某條記錄的信息,如果未找到要修改的記錄,則提示系統(tǒng)中無此記錄,并返回選單。根據(jù)客戶輸入的修改方式進入對應(yīng)的修改界面,再根據(jù)輸入值進行修改,修改成功后返回菜單。運用switch ( )和if的多層嵌套來判斷客戶想要實現(xiàn)的功能,再用for循環(huán)來查找數(shù)據(jù),進行修改操作。
②修改模塊Alter()的流程如圖(7)所示:
圖(7) 修改模塊Alter()流程圖
③修改模塊Alter()實現(xiàn)代碼:
void Alter(xxb* L)
{
int i, k = 0;
xx r;
char e[20];
printf(">————————————————————————————————\n");
printf("1.按姓名修改\n");
printf("2.按手機號碼修改\n");
printf("3.按編號修改\n");
printf("0.返回菜單\n");
printf(">————————————————————————————————\n");
printf("請選擇修改方式:");
loop2:scanf_s (" %d", &i);
if (i < 0 || i > 3) {
printf(">————————————————————————————————\n");
printf("未設(shè)定功能,請重新輸入:");
goto loop2;
}
switch (i)
{
case 1:
printf(">————————————————————————————————\n");
printf("請輸入要修改人的姓名:");
scanf_s ("%s", e);
for (i = 0; i < L->length; i++)
{
r = L->grxx[i];
if (strcmp(r.name, e) == 0)
{
k = 1;
break;
}
}
if (k == 0)
{
printf(">————————————————————————————————\n");
printf("未找到姓名為(%s)的通訊者\n", e);
system("pause");
system("cls");
break;
}
else
{
printf(">————————————————————————————————\n");
printf("姓名為(%s)的通訊者的原信息為:\n編號:%s\t性別:%s\t手機號碼:%s\t公司名稱:%s\n", e, r.num, r.sex, r.phone, r.address);
printf(">————————————————————————————————\n");
printf("請選擇要修改的數(shù)據(jù)\n");
printf("\t1.姓名;\n");
printf("\t2.性別;\n");
printf("\t3.電話;\n");
printf("\t4.公司名稱;\n");
printf("\t0.退出\n");
printf(">————————————————————————————————\n");
printf("您要修改姓名為(%s)通訊者的哪項數(shù)據(jù)?\n", e);
scanf_s ("%d", &k);
switch (k)
{
case 1:
printf("請輸入新姓名:");
scanf_s ("%s", r.name);
break;
case 2:
printf("請輸入新性別:");
scanf_s ("%s", r.sex);
break;
case 3:
printf("請輸入新手機號碼:");
scanf_s ("%s", r.phone);
break;
case 4:
printf("請輸入新公司名稱:");
scanf_s ("%s", r.address);
break;
}
L->grxx[i] = r;
printf(">————————————————————————————————\n");
printf("修改成功!\n");
}
system("pause");
system("cls");
break;
case 2:
printf(">————————————————————————————————\n");
printf("請輸入要修改人的手機號碼:");
scanf_s ("%s", e);
for (i = 0; i < L->length; i++)
{
r = L->grxx[i];
if (strcmp(r.phone, e) == 0)
{
k = 1;
break;
}
}
if (k == 0)
{
printf(">————————————————————————————————\n");
printf("未找到手機號碼為(%s)的通訊者\n", e);
system("pause");
system("cls");
break;
}
else
{
printf(">————————————————————————————————\n");
printf("手機號碼為(%s)的通訊者的原信息為:\n編號:%s\t性別:%s\t手機號碼:%s\t公司名稱:%s\n", e, r.num, r.name, r.sex, r.address);
printf(">————————————————————————————————\n");
printf("請選擇要修改的數(shù)據(jù)\n");
printf("\t1.姓名;\n");
printf("\t2.性別;\n");
printf("\t3.電話;\n");
printf("\t4.公司名稱;\n");
printf("\t0.退出\n");
printf(">————————————————————————————————\n");
printf("您要修改手機號碼為(%s)通訊者的哪項數(shù)據(jù)?\n", e);
scanf_s ("%d", &k);
switch (k)
{
case 1:
printf("請輸入新姓名:");
scanf_s ("%s", r.name);
break;
case 2:
printf("請輸入新性別:");
scanf_s ("%s", r.sex);
break;
case 3:
printf("請輸入新手機號碼:");
scanf_s ("%s", r.phone);
break;
case 4:
printf("請輸入新公司名稱:");
scanf_s ("%s", r.address);
break;
}
L->grxx[i] = r;
printf(">————————————————————————————————\n");
printf("修改成功!\n");
}
system("pause");
system("cls");
break;
case 3:
printf(">————————————————————————————————\n");
printf("請輸入要修改人的編號:");
scanf_s ("%s", e);
for (i = 0; i < L->length; i++)
{
r = L->grxx[i];
if (strcmp(r.num, e) == 0)
{
k = 1;
break;
}
}
if (k == 0)
{
printf(">————————————————————————————————\n");
printf("未找到姓名為(%s)的通訊者\n", e);
system("pause");
system("cls");
break;
}
else
{
printf(">————————————————————————————————\n");
printf("編號為(%s)的通訊者的其他信息為:\n編號:%s\t性別:%s\t電話:%s\t公司名稱:%s\n", e, r.name, r.sex, r.phone, r.address);
printf(">————————————————————————————————\n");
printf("請選擇要修改的數(shù)據(jù)\n");
printf("\t1.姓名;\n");
printf("\t2.性別;\n");
printf("\t3.電話;\n");
printf("\t4.公司名稱;\n");
printf("\t0.退出\n");
printf(">————————————————————————————————\n");
printf("您要修改手機號碼為(%s)通訊者的哪項數(shù)據(jù)?\n", e);
scanf_s ("%d", &k);
switch (k)
{
case 1:
printf("請輸入新姓名:");
scanf_s ("%s", r.name);
break;
case 2:
printf("請輸入新性別:");
scanf_s ("%s", r.sex);
break;
case 3:
printf("請輸入新手機號碼:");
scanf_s ("%s", r.phone);
break;
case 4:
printf("請輸入新公司名稱:");
scanf_s ("%s", r.address);
break;
}
L->grxx[i] = r;
printf(">————————————————————————————————\n");
printf("修改成功!\n");
}
system("pause");
system("cls");
break;
case 0:
system("cls");
break;
}
return;
}
(9)刪除模塊Delete()
①刪除模塊Delete()的功能是:
刪除某條記錄,如果未找到要刪除的記錄,則提示通訊錄中沒有,并返回選單。根據(jù)客戶輸入的修改方式進入對應(yīng)的刪除界面,再根據(jù)輸入值進行刪除,最終確定客戶是否刪除,取消刪除或刪除成功后返回菜單。運用switch ( )和if的多層嵌套來判斷客戶想要實現(xiàn)的功能,再用for循環(huán)來查找數(shù)據(jù),進行刪除操作。
②刪除模塊Delete()的流程如圖(8)所示:
圖(8) 刪除模塊Delete()流程圖
③刪除模塊Delete()實現(xiàn)代碼:
void Delete(xxb* L)
{
int i, j, k = 0;
xx r;
char e[20], y;
printf(">————————————————————————————————\n");
printf("1.按姓名刪除\n");
printf("2.按手機號碼刪除\n");
printf("3.按編號刪除\n");
printf("0.返回菜單\n");
printf(">————————————————————————————————\n");
printf("請選擇修改方式:");
loop3:scanf_s (" %d", &i);
if (i < 0 || i > 3) {
printf(">————————————————————————————————\n");
printf("未設(shè)定功能,請重新輸入:");
goto loop3;
}
switch (i)
{
case 1:
printf(">————————————————————————————————\n");
printf("請輸入要刪除的通訊者的姓名:");
scanf_s ("%s", e);
for (i = 0; i < L->length; i++)
{
r = L->grxx[i];
if (strcmp(r.name, e) == 0)
{
k = 1;
break;
}
}
if (k == 0)
{
printf(">————————————————————————————————\n");
printf("未找到姓名為(%s)的通訊者\n", e);
system("pause");
system("cls");
break;
}
else
{
printf(">————————————————————————————————\n");
printf("姓名為(%s)的通訊者的原信息為:\n編號:%s\t性別:%s\t手機號碼:%s\t公司名稱:%s\n", e, r.num, r.sex, r.phone, r.address);
printf(">————————————————————————————————\n");
printf("您確定要刪除嗎?(Y/N)\n");
scanf_s (" %c", &y);
if (y == 'y' || y == 'Y')
{
for (j = i; j < L->length; j++)
L->grxx[j] = L->grxx[j + 1];
L->length--;
printf(">————————————————————————————————\n");
printf("刪除成功!\n");
system("pause");
system("cls");
return;
}
else
{
printf(">————————————————————————————————\n");
printf("您已取消刪除!\n");
system("pause");
system("cls");
return;
}
}
system("pause");
system("cls");
break;
case 2:
printf(">————————————————————————————————\n");
printf("請輸入要刪除的通訊者的手機號碼:");
scanf_s ("%s", e);
for (i = 0; i < L->length; i++)
{
r = L->grxx[i];
if (strcmp(r.phone, e) == 0)
{
k = 1;
break;
}
}
if (k == 0)
{
printf(">————————————————————————————————\n");
printf("未找到手機號碼為(%s)的通訊者\n", e);
system("pause");
system("cls");
break;
}
else
{
printf(">————————————————————————————————\n");
printf("手機號碼為(%s)的通訊者的原信息為:\n編號:%s\t性別:%s\t手機號碼:%s\t公司名稱:%s\n", e, r.num, r.name, r.sex, r.address);
printf(">————————————————————————————————\n");
printf("您確定要刪除嗎?(Y/N)\n");
scanf_s (" %c", &y);
if (y == 'y' || y == 'Y')
{
for (j = i; j < L->length; j++)
L->grxx[j] = L->grxx[j + 1];
L->length--;
printf(">————————————————————————————————\n");
printf("刪除成功!\n");
system("pause");
system("cls");
return;
}
else
{
printf(">————————————————————————————————\n");
printf("您已取消刪除!\n");
system("pause");
system("cls");
return;
}
}
system("pause");
system("cls");
break;
case 3:
printf(">————————————————————————————————\n");
printf("請輸入要刪除的通訊者的編號:");
scanf_s ("%s", e);
for (i = 0; i < L->length; i++)
{
r = L->grxx[i];
if (strcmp(r.phone, e) == 0)
{
k = 1;
break;
}
}
if (k == 0)
{
printf(">————————————————————————————————\n");
printf("未找到編號為(%s)的通訊者\n", e);
system("pause");
system("cls");
break;
}
else
{
printf(">————————————————————————————————\n");
printf("編號為(%s)的通訊者的其他信息為:\n編號:%s\t性別:%s\t電話:%s\t公司名稱:%s\n", e, r.name, r.sex, r.phone, r.address);
printf(">————————————————————————————————\n");
printf("您確定要刪除嗎?(Y/N)\n");
scanf_s (" %c", &y);
if (y == 'y' || y == 'Y')
{
for (j = i; j < L->length; j++)
L->grxx[j] = L->grxx[j + 1];
L->length--;
printf(">————————————————————————————————\n");
printf("刪除成功!\n");
system("pause");
system("cls");
return;
}
else
{
printf(">————————————————————————————————\n");
printf("您已取消刪除!\n");
system("pause");
system("cls");
return;
}
}
system("pause");
system("cls");
break;
case 0:
system("cls");
break;
}
return;
}
(10)顯示模塊List()
①顯示模塊List()的功能是:
顯示所有記錄。運用for實現(xiàn)數(shù)據(jù)的查找配合printf進行數(shù)據(jù)的輸出。
②顯示模塊List()的流程如圖(9)所示:
圖(9) 顯示模塊List()流程圖
③顯示模塊List()實現(xiàn)代碼:
void List(xxb L)
{
xx r;
int i;
printf("通訊者信息:\n");
for (i = 0; i < L.length; i++)
{
r = L.grxx[i];
printf("(%d)編號:%s\t姓名:%s\t性別:%s\t電話:%s\t公司名稱:%s\n", i + 1, r.num, r.name, r.sex, r.phone, r.address);
}
system("pause");
system("cls");
return;
}
(11)統(tǒng)計模塊nv( )
①統(tǒng)計模塊nv( )的功能是:
統(tǒng)計通訊錄中男女比例。運用for實現(xiàn)數(shù)據(jù)的查找,if判斷是否為男,為男則n++否則v++,顯示男女比例n:v,返回選單。
②統(tǒng)計模塊nv( )的流程如圖(10)所示:
圖(10) 統(tǒng)計模塊nv( )流程圖
③統(tǒng)計模塊nv( )實現(xiàn)代碼:
void nv(xxb L)
{
int i, n = 0, v = 0;
for (i = 0; i < L.length; i++)
{
if (strcmp(L.grxx[i].sex, "男") == 0)
n++;
else
v++;
}
printf(">————————————————————————————————\n");
printf("通訊錄中男女比例為%d:%d", n, v);
system("pause");
system("cls");
return;
}
(12)顯示公司信息模塊ti( )
①顯示公司信息模塊ti( )的功能是:
顯示出同一公司中的人的信息。運用for判斷通訊錄中是否有數(shù)據(jù)屬于此公司,如果沒有數(shù)據(jù)就返回選單,如果有數(shù)據(jù)屬于此公司再判斷屬于此公司的通訊者并輸出他們的信息,運行完成后回到選單。
②顯示公司信息模塊ti( )流程如圖(11)所示:
圖(11) 顯示公司信息模塊ti( )流程圖
③顯示公司信息模塊ti( )實現(xiàn)代碼:
void ti(xxb L)
{
xx r;
int i, k = 0;
char e[20];
printf(">————————————————————————————————\n");
printf("請輸入您要查找人員信息的公司名稱:");
scanf_s (" %s", e);
for (i = 0; i < L.length; i++)
{
if (strcmp(L.grxx[i].address, e) == 0)
{
k = 1;
break;
}
}
if (k == 0)
{
printf(">————————————————————————————————\n");
printf("本通訊錄沒有公司為(%s)的人員信息!", e);
system("pause");
system("cls");
return;
}
else
{
printf(">————————————————————————————————\n");
printf("本通訊錄里公司為(%s)的所有人員信息為:\n", e);
for (i = 0; i < L.length; i++)
{
r = L.grxx[i];
if (strcmp(L.grxx[i].address, e) == 0)
printf("(%d)編號:%s\t姓名:%s\t性別:%s\t電話:%s\t公司名稱:%s\n", k++, r.num, r.name, r.sex, r.phone, r.address);
}
printf(">————————————————————————————————\n");
system("pause");
system("cls");
return;
}
return;
}
三、結(jié)論
通訊錄管理系統(tǒng)是我設(shè)計的第1個系統(tǒng),面對現(xiàn)實當中通訊錄管理的實際需求,我總結(jié)分析并設(shè)計了不同模塊來滿足需求。在模塊的設(shè)計和調(diào)試當中,我感受到對順序表有了更多的領(lǐng)悟,我會在之后鞏固c語言的知識,堅持勤學勤練。在本次設(shè)計當中有許多我想要實現(xiàn)的復(fù)雜功能沒能成功,系統(tǒng)在體驗方面仍有不足。我會繼續(xù)努力探索,掌握技巧實現(xiàn)更多更便利的功能。
我的通訊錄管理系統(tǒng)總共設(shè)置了InitList( )、Menu( )、Quit( )、Create( )、Add( )、Find( )、Alter( )、Delete( )、List( )、nv( )、ti( )、main( )十二個模塊;其中除去課題中要求的模塊還有InitList( )模塊,是用來定義順序表的。同時我還定義了我自己的數(shù)據(jù)結(jié)構(gòu)所需要的內(nèi)存量length用來返回表中的數(shù)據(jù)數(shù)量,方便了各大模塊的遍歷。
本系統(tǒng)還可以添加更多的模塊來使現(xiàn)在所擁有的模塊變得更簡潔運行速度更快,比如定義一個查找模塊,使得原來的查找模塊與刪除模塊、修改模塊共用查找代碼,讓原來的查找模塊、刪除模塊、修改模塊變得更加簡潔;
本系統(tǒng)其實還有很多可以優(yōu)化的地方,各個模塊的代碼可以進行大幅度的縮減,有些模塊也并未達到我理想的最佳效果,不過本次課設(shè)讓我學到了很多,讓我對順序表的認知變多,也接觸到了以前并未接觸到的函數(shù),總體來說我對我的第一個系統(tǒng)還是比較滿意的。文章來源:http://www.zghlxwxcb.cn/news/detail-783833.html
四、參考文獻
[1]譚浩強。C語言程序設(shè)計.北京:清華大學出版社,1997.文章來源地址http://www.zghlxwxcb.cn/news/detail-783833.html
到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)課設(shè)—C語言實現(xiàn)通訊錄管理系統(tǒng)(順序表實現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!