1. 學(xué)生通訊錄管理系統(tǒng)的設(shè)計與實現(xiàn)
1.1 問題的描述
學(xué)生通訊錄管理系統(tǒng)是為了幫助老師、同學(xué),或者其他一些需要使用通訊錄的人員進行管理和分析的一種應(yīng)用程序。
1.2 問題分析和任務(wù)定義
(1)輸入數(shù)據(jù)建立通訊錄;
(2)查詢通訊錄中滿足要求的信息;
(3)插入新的通訊錄信息;
(4)刪除不需要的通訊錄信息;
(5)查看所有的通訊錄信息。
1.3 數(shù)據(jù)類型和系統(tǒng)設(shè)計
(1)存儲結(jié)構(gòu)設(shè)計
采用鏈表來存儲“學(xué)生通訊信息”,其中鏈表結(jié)點有4個分量構(gòu)成:通訊錄成員學(xué)號、姓名、電話號碼、指向下一個成員的指針。
(2)系統(tǒng)功能設(shè)計
本系統(tǒng)設(shè)置了5個子功能菜單,5個子功能的設(shè)計描述如下:
① 建立通訊錄系統(tǒng)??梢砸淮屋斎攵鄠€成員通訊錄的信息,建立通訊錄。該功能有由creatIncreLink() 函數(shù)實現(xiàn)。
② 插入通訊錄記錄。每次可以插入一個成員通訊錄的信息,如果要連續(xù)插入多個成員通訊錄信息必須多次選擇該功能。該功能由insertYouXu() 函數(shù)實現(xiàn)。
③ 查詢通訊錄記錄??梢园磧煞N方式查詢所需要的通訊錄成員記錄,一是按學(xué)號查詢,而是按姓名查詢。分別由searchNum() 和searchName() 函數(shù)實現(xiàn)。
④ 刪除通訊記錄。可以對通訊錄中不再需要的信息進行刪除。有三種刪除方式,按序號進行刪除,按學(xué)號進行刪除和按姓名進行刪除。分別由deleteElem() ,delNum() 和delName() 三個函數(shù)實現(xiàn)。
⑤ 顯示通訊錄記錄。可以查看通訊錄中所有通訊錄成員記錄。該功能由printList() 函數(shù)實現(xiàn)。
(3)系統(tǒng)主界面的設(shè)計
為了實現(xiàn)學(xué)生通訊管理系統(tǒng)各功能的管理,設(shè)計一個含有多個菜單項的主控菜單子程序以鏈接系統(tǒng)的各項子功能,方便用戶使用本系統(tǒng)。本系統(tǒng)主控菜單運行界面如圖1所示。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-494750.html
圖1 “學(xué)生通訊錄管理系統(tǒng)”主菜單
1.4 編碼實現(xiàn)
(1)鏈表結(jié)點類型的定義
typedef struct LNode
{ int number;
?double telenum;
?char name[20];
?struct LNode *next;
}LNode,*LinkList;
(2)建立鏈表的函數(shù),主要用來建立通訊錄。
LinkList creatIncreLink() //創(chuàng)建一個存放通訊錄成員的非遞減有序表,返回頭結(jié)點地址
{ LinkList L=(LinkList)malloc(LEN);? //頭結(jié)點
?L->next=NULL;
?LinkList p;
?int num=1;
?int number;
?double telenum;
?char name[20];
?printf("請輸入學(xué)生學(xué)號、姓名和電話號碼,建立通訊錄,以'-1'為輸入結(jié)束標志\n");
?printf("請輸入學(xué)號 %d:",num);
?scanf("%d",&number);
?printf("請輸入姓名 %d: ",num);
?char temp=getchar();
?gets(name);
?printf("請輸入電話號碼 %d:",num);
?scanf("%lf",&telenum);
?while (number>=0)
?{
? p=(LinkList)malloc(LEN); //新結(jié)點
? p->number=number;
? p->telenum=telenum;
? strcpy(p->name,name);
? insertYouXu(L,p);?????? //有序的插入新結(jié)點
? num++;
? printf("請輸入學(xué)號 %d:",num);
???? scanf("%d",&number);
???? printf("請輸入姓名 %d: ",num);
? temp=getchar();
???? gets(name);
? printf("請輸入電話號碼 %d:",num);
???? scanf("%lf",&telenum);
?} return(L);
}
(3)插入通訊記錄
void insertYouXu(LinkList L,LinkList Elem)
{????????????? //插入一個元素,使原有序表仍為有序
????? LinkList p=L->next;
????? while(p!=NULL && Elem->number>=p->number)
????? {
???????????? if(p->number==Elem->number)
???????????? {?????????????????? printf("重復(fù)輸入??!\n");return;
???????????? }
???????????? p=p->next;
????? }???????? //確定Elem插入的位置
????? if(p==NULL)
????? {
???????????? p=prior(L,p); Elem->next=NULL;p->next=Elem;
????? }
????? else?????? //若為空表,插到頭結(jié)點之后
????? {??????????? p=prior(L,p); Elem->next=p->next; p->next=Elem;
????? }
}
(4)按學(xué)號查詢通訊錄記錄
int searchNum(LinkList L,int n)
{??? // 按學(xué)號查找通訊者
?int flag=0;
?LinkList p=L->next;
?seat=1;
?if(L->next==NULL) printf("該鏈表中沒有元素,查找失敗\n");
?else? {
? while(p !=NULL)
? {
?? if(p->number<=n)
??? if(p->number==n)
????? {?????? flag=1;
?????? printf("要查找的是第%d位通訊者:\n",seat);
?????? printf("??????????????????????? 學(xué)號: %d?? 姓名: %s?? 電話號碼.:%.0f\n",p->number,p->name,p->telenum);
??? }
?? p=p->next;seat++;//!!!!
? }
?}
?return flag;
}
(5)按姓名查詢通訊錄記錄
int searchName(LinkList L,char n[])
{??? // 按姓名查找通訊者
?int flag=0;
?LinkList p=L->next;
?seat=1;
?if(L->next==NULL||L==NULL)
?printf("該通訊錄中沒有元素,查找失敗\n");
?else? {
? while(p !=NULL)
? {
?? if(!strcmp(p->name,n))
?? {
??? flag=1;
??? printf("要查找的是第%d位通訊者:\n",seat);
??? printf("??????????????????????? Number: %d?? Name: %s?? TeleNo.:%.0f\n",p->number,p->name,p->telenum);
?? }
?? p=p->next;seat++;//!!!!!
? }
?} return flag;
}
(6)按序號進行刪除,刪除通訊錄第i個元素
void deleteElem(LinkList L,int i)?????? //從通訊錄中刪除第i個元素
{
LinkList p=L;
?int j=0;
?while (p->next&&j<i-1)
?{
? p = p->next;j++;
?}
if(!(p->next))
{printf("第%d個元素刪除失敗\n",i);return ;}
? //判斷i是否合法,i既不能大于元素的個數(shù),也不能小于等于0
LinkList q = p->next;
p->next = q->next;
free(q); //釋放刪除的結(jié)點
}
(7)按學(xué)號刪除通訊者
int delNum(LinkList L,int n)
{??? // 按學(xué)號刪除通訊者
?int flag=0;
?LinkList p=L->next;
?seat=1;
?if(L->next==NULL)
?printf("該鏈表中沒有元素,刪除失敗\n");
?else? {
? while(p !=NULL)
? {
?? if(p->number<=n)
?? {
??? if(p->number==n)
????? {?????? flag=1;
?????? printf("%d ",p->number);
?????? p=p->next;
???? ??deleteElem(L,seat);
??? }
?? }
?? else {p=p->next;seat++;}
? }
? printf("被刪除\n");
?}
?return flag;
}
(8)按姓名刪除通訊者
int delName(LinkList L,char n[])
{??? // 按姓名刪除通訊者?
?int flag=0;
?LinkList p=L->next;
?seat=1;
?if(L->next==NULL)
?printf("該鏈表中沒有元素,查找失敗\n");
?else {
? while(p !=NULL)
? {
?? if(!strcmp(p->name,n))
?? {
??? flag=1;
??? printf("%s ",p->name);
??? p=p->next;
??? deleteElem(L,seat);
?? }
?? else {p=p->next;seat++;}
? }
? if(flag)printf("被刪除\n");
?} return flag;
}
(9)顯示通訊錄
void printList(LinkList L)
{??? // 打印頭結(jié)點地址為L的通訊錄
?printf("\n????????? ---------------------------------------\n");
?printf("?????????????? 學(xué)號?????? 姓名???? 電話號碼\n");
?printf("????????? ----------------------------------------\n");
?LinkList p=L;
?int n=1;
?if(L==NULL||L->next==NULL) printf("該通訊錄中沒有元素\n");
?else
? while(p->next !=NULL)
? {
?? printf("????????? %2d?? %-9d",n,p->next->number);
?? printf("??? %-5s? %.0f\n",p->next->name,p->next->telenum);
?? p=p->next;
?? n++;
? }
??? printf("????????? ----------------------------------------\n");
?return ;
}
(10)主菜單,main函數(shù)
void main(){
?system("color 1f");??
?LinkList L=NULL;
?printf("\n?????????? ***************** ^@^歡迎使用通訊錄系統(tǒng)***********\n");
?printf("?????????? *?????????????? 1 通訊錄的建立?????????????????? *\n");??????
?printf("?????????? *?????????????? 2 插入通訊記錄?????????????????? *\n");
?printf("?????????? *?????????????? 3 查詢通訊記錄?????????????????? *\n");
?printf("?????????? *?????????????? 4 刪除通訊記錄?????????????????? *\n");
?printf("?????????? *?????????????? 5 顯示通訊錄信息???????????????? *\n");
?printf("?????????? *?????????????? 0 退出管理系統(tǒng)?????????????????? *\n");
?printf("?????????? **************** ^@^歡迎使用通訊錄系統(tǒng)************\n");
?int flag=0;
?int menu;
?printf("請選擇0-5:");
?scanf("%d",&menu);
?while(menu!=0)
?{
?switch(menu) {
? case 1:???? ? {
??? L=creatIncreLink();
??? printf("建立通訊錄:");
??? printList(L);
??? flag=1;
??? break;
????? ? }
? case 2:???? ? {??????? ? if(flag==1)
???????????? ? {int number,telenum;
?????????? char name[20];
?????????? printf("請輸入通訊者的學(xué)號和姓名:\n");
?????????? printf("請輸入學(xué)號: ");
?????????? scanf("%d",&number);
?????????? printf("請輸入姓名: ");
?????????? char temp=getchar();
?????????? gets(name);
????? ?????printf("請輸入電話號碼: ");
?????????? scanf("%d",&telenum);
?????????? LinkList p=(LinkList)malloc(LEN); //新結(jié)點
?????????? p->number=number;
?????????? strcpy(p->name,name);
?????????? p->telenum=telenum;
?????????? insertYouXu(L,p);?????? //有序的插入新結(jié)點
?????????? printf("插入后:");
?????????? printList(L);
???????????? ? }
????????? else printf("\nERROR: 通訊錄還沒有建立,請先建立通訊錄\n");
?? break;
????? ? }
? case 3:{ ???int way,n;
????????? char na[20];
????????? int s;
????????? if(L!=NULL)
???????????? ? {
if(flag) {
?????????????????????????? ? printf("選擇查找方式:\n");
????????????????? printf("?????????????? 1.按學(xué)號?? 2.按姓名");
????????????????? scanf("%d",&way);
????????????????? if(way==1)
?????????????????????????? ? {
????????????????????????????????? ? printf("\n請輸入學(xué)號:");
????????????????????? scanf("%d",&n);
?????????? ???????????s=searchNum(L,n);
????????????????????? if(s==0) printf("無此通訊者,查找失??!\n");
?????????????????????????? ? }
?????????????????????????? ? else if(way==2)
?????????????????????????? ? {??????? printf("\n請輸入姓名:");
????????????????????????????????? ? char temp=getchar();
????????????????????????????????? ? gets(na);
????????????????????????????????? ? s=searchName(L,na);
????????????????????????????????? ? if(s==0) printf("無此通訊者,查找失??!\n");
?????????????????????????? ? }
?????????????????????????? ? else printf("通訊錄中無記錄!\n");
??????????????????? ? }
??????????????????? ? break;
???????????? ? }
???????????? ? else printf("通訊錄中無記錄!\n");break;
????? ? }
? case 4:{
???????????? ? int way;
???????????? ? printf("選擇刪除方式:1.按序號? 2. 按學(xué)號? 3.按姓名 \n");
???????????? ? scanf("%d",&way);
???????????? ? if(way==1)
???????????? ? {
??????????????????? ? int n;
??????????????????? ? printf("請輸入通訊錄序號: ");
??????????????????? ? scanf("%d",&n);
??????????????????? ? printf("刪除后:\n");
??????????????????? ? deleteElem(L,n);
??????????????????? ? printList(L);
???????????? ? }
???????????? ? else if(way==2)
???????????? ? {
??????????????????? ? int n,f;
??????????????????? ? printf("請輸入學(xué)號: ");
??????????????????? ? scanf("%d",&n);
??????????????????? ? f=delNum(L,n);
??????????????????? ? if(f!=0)
??????????????????? ? {
?????????????????????????? ? printf("刪除后:\n");
?????????????????????????? ? printList(L);
??????????????????? ? }
??????????????????? ? else printf("無該學(xué)號,刪除失敗!\n");
???????????? ? }
???????????? ? else if(way==3)
???????????? ? {
??????????????????? ? char na[20];
??????????????????? ? int f;
??????????????????? ? printf("\n請輸入姓名:");
??????????????????? ? char temp=getchar();
??????????????????? ? gets(na);
??????????????????? ? f=delName(L,na);
??????????????????? ? if(f!=0)
??????????????????? ? {
?????????????????????????? ? printf("刪除后:\n");
?????????????????????????? ? printList(L);
??????????????????? ? }
??????????????????? ? else printf("無該學(xué)號,刪除失敗!\n");
???????????? ? }
???????????? ? else printf("ERROR!!\n");
???????????? ? break;
????? ? }
? case 5: {
???????????? ? printf("當前通訊錄內(nèi)容如下:\n");
???????????? ? printList(L);
???????????? ? break;
????? ? }
? case 0: exit(0);
? default:? printf("\n沒有此功能,重新輸入\n");
?}
?printf("選擇功能:");
?scanf("%d",&menu);
}
}
1.5 測試結(jié)果
1.建立通訊錄
?
2.插入通訊記錄
?
3.查詢通訊記錄
?
4.刪除通訊記錄
?
5.顯示通訊錄信息
?
6.退出管理系統(tǒng)
?文章來源:http://www.zghlxwxcb.cn/news/detail-494750.html
?
到了這里,關(guān)于學(xué)生通訊錄管理系統(tǒng)的設(shè)計與實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!