hello 大家好呀 這里是布丁學(xué)姐~
今天給大家?guī)淼氖恰禖語言課設(shè)計劃》的第一篇,個人通訊錄管理系統(tǒng)
引言
通訊錄是當(dāng)前社會每個人不可缺少的信息系統(tǒng),利用C語言和Dve c++制作個人通訊錄管理系統(tǒng),從根本上改變紙質(zhì)通訊錄難以長久保存、容易丟失的弊端,從而提高信息管理和存儲效率。在對系統(tǒng)進(jìn)行分析和設(shè)計的基礎(chǔ)上,創(chuàng)建各種項目組件,若干個功能模塊連接成個人通訊錄管理系統(tǒng)。
功能及操作介紹
該系統(tǒng)可以簡單明了的通過用戶輸入的數(shù)據(jù)創(chuàng)建成通訊錄,實現(xiàn)最基本的新建、更改、查找、排序等功能。本系統(tǒng)通過鏈表和函數(shù)的調(diào)用,實現(xiàn)最基本的功能。
系統(tǒng)設(shè)計分析
本系統(tǒng)包括主函數(shù)和多個實現(xiàn)具體功能的函數(shù),現(xiàn)分別介紹如下。
(1)主函數(shù)模塊:主函數(shù)設(shè)計比較簡潔,只是提供輸入輸出和處理部分的函數(shù)調(diào)用,其中具體的功能模塊顯示為菜單之后由用戶進(jìn)行選擇。具體流程如下:
①顯示菜單
②用戶輸入操作選項
③通過switch語句進(jìn)行函數(shù)的調(diào)用
④運行g(shù)oto語句進(jìn)行循環(huán)
(2)新建通訊錄的功能模塊:通過提示讓用戶輸入聯(lián)系人的各類信息,然后用insert函數(shù)將各個聯(lián)系人的信息用鏈表進(jìn)行連接。具體流程如下;
①顯示適當(dāng)?shù)奶崾?,用戶輸入信?br> ②調(diào)用insert函數(shù)準(zhǔn)備進(jìn)行下一個聯(lián)系人的輸入和鏈接
③輸出提示創(chuàng)建成功
(3)顯示通訊錄的功能模塊:調(diào)用printff函數(shù)將通訊錄中的信息打印出來
(4)查找聯(lián)系人的功能模塊:調(diào)用search函數(shù)按照要求對通訊錄里的內(nèi)容進(jìn)行查找,并進(jìn)行輸出。
(5)修改通訊錄的功能模塊:調(diào)用change函數(shù)根據(jù)用戶需求對聯(lián)系人的信息進(jìn)行修改
(6)排序通訊錄的功能模塊:調(diào)用sortt函數(shù)根據(jù)分類對聯(lián)系人按照字典序升序進(jìn)行排序
(7)退出通訊錄的功能模塊:退出系統(tǒng)。
各個函數(shù)的流程介紹如下:
(1)insert函數(shù):插入函數(shù)的本質(zhì)是在頭結(jié)點后插入一個新結(jié)點,定義一個結(jié)構(gòu)體指針p,使p也指向head,當(dāng)p為空時,p指向下一個結(jié)點q,q的下一個結(jié)點為NULL,插入完成。
(2)search函數(shù):search函數(shù)的本質(zhì)是通過結(jié)構(gòu)體指針對單鏈表進(jìn)行遍歷,當(dāng)遇到與所查找信息相匹配的信息是跳出。這時候進(jìn)行判斷,如果相匹配就打印出所查找到的信息,如果不匹配就顯示未查找到該聯(lián)系人的信息。注意在此之前要先判斷通訊錄是否為空,如果為空,則顯示適當(dāng)?shù)奶崾拘畔⒉⑶彝V箞?zhí)行下面的語句。
(3)printff函數(shù):printff函數(shù)是將通訊錄中的所有信息打印到屏幕上。在執(zhí)行主體語句之前先對通訊錄進(jìn)行判斷,如果為空,則打印提示信息并且停止執(zhí)行函數(shù),否則則對鏈表進(jìn)行遍歷并且進(jìn)行打印的操作。執(zhí)行主體時,要判斷此個結(jié)點是否為最后一個結(jié)點。
(4)change函數(shù):change函數(shù)是根據(jù)用戶需求對聯(lián)系人的信息進(jìn)行更新。同樣先判斷通訊錄是否為空,如果非空則執(zhí)行后續(xù)操作。首先遍歷鏈表并且運用strcmp函數(shù)找到想要更改的聯(lián)系人的位置,并通過switch和goto語句進(jìn)行根據(jù)用戶需求更新甚至循環(huán)更新的功能。
(5)sortt函數(shù):sortt函數(shù)是將通訊錄中的全部聯(lián)系人按照分類根據(jù)字典序進(jìn)行排序。在此函數(shù)中,首先保證結(jié)構(gòu)體指針變量p有后續(xù)節(jié)點,然后構(gòu)造只有一個數(shù)據(jù)結(jié)點的有序表,然后通過循環(huán)和比較進(jìn)行排序。
測試運行結(jié)果
為了截圖運行結(jié)果,在本次測試過程中沒有調(diào)用cls,運行結(jié)果如下:
1.新建聯(lián)系人
2.顯示新建的聯(lián)系人
3.查找聯(lián)系人tom
4.修改聯(lián)系人tom的qq
5.顯示信息查看是否修改成功
6.對通訊錄中的聯(lián)系人進(jìn)行排序,然后顯示聯(lián)系人信息
7.退出系統(tǒng)
不足之處
原意是想用文件一次性讀入大量用戶的信息,然后結(jié)束時將通訊錄的最新狀態(tài)保存到新的文件中,但是失敗了,說明對文件的有關(guān)操作還是不夠熟練。在此系統(tǒng)的代碼書寫過程中,在一些地方遇到了困難,但已獲得老師和同學(xué)的幫助,都已解決。其中,在sortt函數(shù)的書寫過程中,最開始的思路僅僅將分類進(jìn)行了排序,而并沒有改變結(jié)構(gòu)體內(nèi)其他變量的順序,參考了博客上大佬的方法,對鏈表的排序又得到了新的認(rèn)知。而文件的輸入保存還是有待完善。還有search函數(shù)的書寫也是出現(xiàn)了問題,但最后已經(jīng)得到解決。具體的錯誤代碼依舊保留并且被注釋掉。文章來源:http://www.zghlxwxcb.cn/news/detail-786666.html
程序設(shè)計心得
在本次程序設(shè)計過程中,由于一開始的目的比較明確,而且系統(tǒng)主體用調(diào)用函數(shù)實現(xiàn)功能,所以最開始比較順利。但是在排序函數(shù)的書寫中以及保存通訊錄的過程中遇到了困難,說明自己對C語言的掌握能力以及對程序整體的認(rèn)知還不夠熟練,有待提高。這次程序設(shè)計也讓我懂得了一個基本的程序的基礎(chǔ)是框架的有序書寫,在以后的程序設(shè)計過程中,我會先構(gòu)建出一個框架,然后再去完善功能。文章來源地址http://www.zghlxwxcb.cn/news/detail-786666.html
代碼
#include<stdio.h>
#include<windows.h>
#include<string.h>
#include<stdlib.h>
struct stu{
char name[100];//學(xué)生姓名
char postion[100];//家庭住址
char tel[50];//電話
char leibie[50];//類別
char email[50];//電子郵件
char qq[50];//QQ
struct stu *next;//用指針處理鏈表,next是指針變量指向結(jié)構(gòu)體變量
};
struct stu *head=NULL;
struct stu *insert(struct stu *head,struct stu *q){
struct stu *p;
for(p=head;p->next!=NULL;p=p->next);
p->next=q;
q->next=NULL;
return head;
}
void search(struct stu *head){
struct stu *p;
char a[100];
if(head->next==NULL)
printf("通訊錄為空\n");
else{
printf(" 請輸入要查找的人的姓名:");
scanf("%s",a);
// int flag=0;
for(p=head->next;p->next!=NULL;p=p->next){
if(strcmp(p->name,a)==0){
//flag=1;
/*printf(" 要查找的人的信息如下:");
printf("測試\n");
printf(" *姓名:");printf("%s\n",p->name);
printf(" *住址:");printf("%s\n",p->postion);
printf(" *電話:");printf("%s\n",p->tel);
printf(" *類別:");printf("%s\n",p->leibie);
printf(" *電子郵件:"); printf("%s\n",p->email);
printf(" *QQ:");printf("%s\n",p->qq);*/
break;
}
}
if(strcmp(p->name,a)==0){
//flag==1;
printf(" 要查找的人的信息如下:\n");
printf(" *姓名:");printf("%s\n",p->name);
printf(" *住址:");printf("%s\n",p->postion);
printf(" *電話:");printf("%s\n",p->tel);
printf(" *類別:");printf("%s\n",p->leibie);
printf(" *電子郵件:"); printf("%s\n",p->email);
printf(" *QQ:");printf("%s\n",p->qq);
// break;
}
// if(!flag) printf("未找到此人的信息\n");
else printf("未找到此人的信息\n");
}
}
void printff(struct stu *head){
struct stu *p=head->next;
while(1){
if(p==NULL){
printf("通訊錄為空\n");
break;
}
else if(p->next==NULL){
printf(" *姓名:");printf("%s\n",p->name);
printf(" *住址:");printf("%s\n",p->postion);
printf(" *電話:");printf("%s\n",p->tel);
printf(" *類別:");printf("%s\n",p->leibie);
printf(" *電子郵件:"); printf("%s\n",p->email);
printf(" *QQ:");printf("%s\n",p->qq);
printf("\n");
break;
}
else{
printf(" *姓名:");printf("%s\n",p->name);
printf(" *住址:");printf("%s\n",p->postion);
printf(" *電話:");printf("%s\n",p->tel);
printf(" *類別:");printf("%s\n",p->leibie);
printf(" *電子郵件:"); printf("%s\n",p->email);
printf(" *QQ:");printf("%s\n",p->qq);
printf("\n");
p=p->next;
continue;
}
}
}
struct stu *change(struct stu *head){
struct stu *p;
char a1[100],b1[100],c1[100];
int flag=1,x;
if(head->next==NULL) printf("通訊錄為空\n");
else{
printf("請輸入您想要更新的人的姓名:"); scanf("%s",a1);
p=head->next;
while(p!=NULL){
if(strcmp(p->name,a1)==0){
flag=0;
B:
printf("請輸入您想要更新的信息:\n");
printf(" 1.姓名:\n");
printf(" 2.住址:\n");
printf(" 3.電話:\n");
printf(" 4.類別:\n");
printf(" 5.電子郵件:\n");
printf(" 6.QQ:\n");
printf("您選擇的是:\n");
scanf("%d",&x);
switch(x){
case 1:
printf(" 請輸入新姓名:\n");
scanf("%s",p->name);break;
case 2:
printf(" 請輸入新住址:\n");
scanf("%s",p->postion);break;
case 3:
printf(" 請輸入新電話:\n");
scanf("%s",p->tel);break;
case 4:
printf(" 請輸入新類別:\n");
scanf("%s",p->leibie);break;
case 5:
printf(" 請輸入新電子郵件:\n");
scanf("%s",p->email);break;
case 6:
printf(" 請輸入新qq:\n");
scanf("%s",p->qq);break;
default:
printf("輸入不合法!請重新輸入:");
break;
}
printf("更新成功!\n");
printf("是否繼續(xù)更新?1.是;2.否:\n");
int y;
C:scanf("%d",&y);
switch(y){
case 1:
goto B;break;
case 2:
break;
default:
printf("輸入符號不合法,請重新輸入!");
goto C;
break;
}
}
p=p->next;
}
if(flag) printf("要更新的人的信息不存在!\n");
}
return head;
}
void sortt(struct stu *l){
struct stu *p,*r,*pre;
p=l->next;
r=p->next;//保證r是p的后續(xù)節(jié)點
p->next=NULL;//構(gòu)造一個只有一個數(shù)據(jù)結(jié)點的有序表 就是讓一個有序表的長度為1
p=r;
while(p){
r=p->next;
pre=l;
while(pre->next!=NULL&&strcmp(pre->next->leibie,p->leibie)<0)
pre = pre->next;
p->next = pre->next;
pre->next = p;
p = r; //掃描剩下的結(jié)點
}
}
/*struct stu *sortt(struct stu *head){
struct stu *q,*p,*s;
char temp[50];
p=head->next;
while(p->next){
s=p;
q=p->next;
while(q){
if(strcmp(q->leibie,s->leibie)<0)
s=q;
q=q->next;
}
if(s!=p){
strcpy(temp,p->leibie);
strcpy(p->leibie,s->leibie);
strcpy(s->leibie,temp);
}
p=p->next;
}
return head;
}*/
void save(){
struct stu *p=NULL;
FILE *fp;
char *book="list.txt";
if(head==NULL){
printf("通訊錄為空\n");
return ;
}
else p=head->next;
if((fp=fopen(book,"w+"))==NULL){
printf("無法打開此文件\n");
return ;
}
while(p!=NULL){
fwrite(p,sizeof(struct stu),1,fp);
p=p->next;
}
printf("保存完成!\n");
fclose(fp);
}
int main(){
//creat();
system("color F4");//更改系統(tǒng)顏色
struct stu *q;
head=(struct stu*)malloc(sizeof(struct stu));//動態(tài)分配內(nèi)存
head->next=NULL;//完成構(gòu)建
printf("*****個人通訊錄管理系統(tǒng)*****\n");
A: printf(" **1.新建通訊錄**\n");
printf(" **2.顯示通訊錄**\n");
printf(" **3.查找通訊錄**\n");
printf(" **4.修改通訊錄**\n");
printf(" **5.排序通訊錄**\n");
printf(" **6.保存并退出**\n");
printf("****************************\n");
//A:
printf("請輸入您想要進(jìn)行的操作序號:");
int oper;
scanf("%d",&oper);
switch(oper){
case 1:
// add();
q=(struct stu*)malloc(sizeof (struct stu));
printf("請輸入姓名:");scanf("%s",q->name);
printf("請輸入住址:");scanf("%s",q->postion);
printf("請輸入電話:");scanf("%s",q->tel);
printf("請輸入類別:");scanf("%s",q->leibie);
printf("請輸入郵件:");scanf("%s",q->email);
printf("請輸入QQ:");scanf("%s",q->qq);
insert(head,q);
printf("建立成功!\n");
break;
case 2:
printff(head);
Sleep(1000);
break;
case 3:
search(head);
Sleep(500);
break;
case 4:
change(head);
break;
case 5:
sortt(head);
break;
case 6:
//save();
printf("謝謝您的使用!");
return 0;
default:
printf("輸入不合法!請重新輸入:");
}
Sleep(500);
system("cls");//清屏
goto A;//循環(huán)
return 0;
}
到了這里,關(guān)于【C語言課設(shè)計劃】個人通訊錄管理系統(tǒng)(C語言大作業(yè) 鏈表 結(jié)構(gòu)體 運行截圖 完整代碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!