第一篇:电话簿管理系统
#include
|%-10s
|%-15s
|%-16s|n” #define DATA
p->num
,p->name
,p->phonenum p->address #define END
“----------------n” #define N 100 int saveflag=0;
typedef int Status;typedef struct telebook{
char num[15];
char name[15];
char phonenum[15];
char address[20];}TELEBOOK;
void menu(){
system(“cls”);
textcolor(13);
gotoxy(10,5);
cprintf(“
The telephone-book Management System
n”);
gotoxy(10,8);
cprintf(“*****************************************************n”);
gotoxy(10,9);
cprintf(“* input record display record
* n”);
gotoxy(10,10);
cprintf(“* delete record
search record
* n”);
gotoxy(10,11);
cprintf(“* modify record
insert record
* n”);
gotoxy(10,12);
cprintf(“* sort record
save record
* n”);
gotoxy(10,13);
cprintf(“*
0 input record
* n”);
gotoxy(10,14);
cprintf(“*****************************************************n”);} ,void printheader(){
printf(HEADER1);
printf(HEADER2);
printf(HEADER3);}
void printdata(TELEBOOK pp){
TELEBOOK *p;
p = &pp;
printf(FORMAT,DATA);}
void Disp(TELEBOOK temp[],int n){
int i;
if(n==0)
{
printf(“n======>Not telephone record!n”);
getchar();
return;
}
printf(“nn”);
printheader();
i=0;
while(i { printdata(temp[i]); i++; printf(HEADER3); } getchar();} void Wrong(){ printf(“nnnnn********Error:input has wrong!press any key to continue*******n”); getchar();} void Nofind(){ printf(“n========>Not find this telephone record!n”);} Status Locate(TELEBOOK temp[],int n,char findmess[],char nameorphonenum[]) /*find the locate*/ { int i=0; if(strcmp(nameorphonenum,“phonenum”)==0) { while(i { if(strcmp(temp[i].phonenum,findmess)==0)return i; i++; } } else if(strcmp(nameorphonenum,“name”)==0) { while(i { if(strcmp(temp[i].name,findmess)==0)return i; i++; } } return-1;} void stringinput(char *t,int lens,char *notice){ char n[255]; do{ printf(notice); scanf(“%s”,n); if(strlen(n)>lens)printf(“n exceed the required length!n”); }while(strlen(n)>lens); strcpy(t,n);} Status Add(TELEBOOK temp[],int n) /*increase record*/ { char ch,num[10]; int i,flag=0; system(“cls”); Disp(temp,n); while(1) { while(1) { stringinput(num,10,“input number(press '0' retrun menu):”); flag = 0; if(strcmp(num,“0”)==0) { return n;} i=0; while(i { if(strcmp(temp[i].num,num)==0) { flag = 1; break; } i++; } if(flag==1) { getchar(); printf(“==>The number %s is existing,try again?(Y/N):”,num); scanf(“%c”,&ch); if(ch=='Y'&&ch=='y')continue; else return n; } else break; } strcpy(temp[n].num,num); stringinput(temp[n].name,15,“Name:”); stringinput(temp[n].phonenum,15,“Telephone:”); stringinput(temp[n].address,15,“Adress:”); saveflag=1; n++; } return n;} void Qur(TELEBOOK temp[],int n)/*search the record*/ { int select; char searchinput[20]; int p = 0; if(n<=0) { system(“cls”); printf(“n====>No telephone record!n”); getchar(); return; } system(“cls”); printf(“n=====>1 Search by name =====>2 Search by telephonenumber!n”); printf(“ Please choice(1,2):”); scanf(“%d”,&select); if(select==1) { stringinput(searchinput,10,“input the existing name:”); p = Locate(temp,n,searchinput,“name”); if(p!=-1) { printheader(); printdata(temp[p]); printf(END); printf(“press any key to return ”); getchar(); } else { Nofind(); getchar(); } } else if(select==2) { stringinput(searchinput,15,“input the exiseing telephone number:”); p = Locate(temp,n,searchinput,“phonenum”); if(p!=-1) { printheader();printdata(temp[p]); printf(END); printf(“press any key to return ”); getchar(); } else { Nofind();getchar();} } else Wrong();getchar();} Status Del(TELEBOOK temp[],int n){ int sel; char findmess[20]; int p=0,i=0; if(n<=0) { system(“cls”); printf(“n======>No telephone!n”); getchar(); return n; } system(“cls”); Disp(temp,n); printf(“ ===>1 Name ====>2 Telephone Please choice[1,2]:”); scanf(“%d”,&sel); if(sel==1) { stringinput(findmess,15,“input the existing name:”); p = Locate(temp,n,findmess,“name”); getchar(); if(p!=-1) { for(i=p+1;i { strcpy(temp[i-1].num,temp[i].num); strcpy(temp[i-1].name,temp[i].name); strcpy(temp[i-1].phonenum,temp[i].phonenum); strcpy(temp[i-1].address,temp[i].address); } printf(“n==>delete successn”); n--; getchar(); saveflag=1; } else Nofind(); getchar(); } else if(sel==2) { stringinput(findmess,15,“input the existing telephone number:”); p = Locate(temp,n,findmess,“phonenum”); getchar(); if(p!=-1) { for(i=p+1;i { strcpy(temp[i-1].num,temp[i].num); strcpy(temp[i-1].name,temp[i].name); strcpy(temp[i-1].phonenum,temp[i].phonenum); strcpy(temp[i-1].address,temp[i].address); } printf(“n======>delete success!n”); n--; getchar(); saveflag = 1; } else Nofind(); getchar(); } else Nofind(); getchar(); return n;} void Modify(TELEBOOK temp[],int n){ char findmess[20]; int p = 0; if(n==0) { system(“cls”); printf(“n=======>No telephone book recorderdn”); getchar(); return; } system(“cls”); printf(“modify telephone book recorder”); Disp(temp,n); stringinput(findmess,10,“input the existing name:”); p = Locate(temp,n,findmess,“name”); if(p!=-1) { printf(“Number : %sn”,temp[p].num); printf(“Name : %sn”,temp[p].name); stringinput(temp[p].name,15,“input new name:”); printf(“Telephone:%s n”,temp[p].phonenum); stringinput(temp[p].phonenum,15,“input new phonenum:”); printf(“Address:%sn”,temp[p].address); stringinput(temp[p].address,30,“input new address:”); printf(“n==========>modify success!n”); getchar(); saveflag = 1; } else { Nofind(); getchar(); } return;} Status Insert(TELEBOOK temp[],int n){ char ch,num[10],snum[10]; TELEBOOK newinfo; int flag = 0,i =0,kkk = 0; system(“cls”); Disp(temp,n); while(1) { stringinput(snum,10,“Please input insert location after the Number:”); flag = 0;i = 0; while(i { if(strcmp(temp[i].num,snum)==0){kkk = i;flag = 1;break;} i++; } if(flag==1)break; else { getchar(); printf(“n=====>The number %s is not existing,try again?(Y/N)”,snum); scanf(“%c”,&ch); if(ch=='Y'||ch=='y')continue; else return n; } } while(1) { stringinput(num,10,“input the new Number:”); i = 0;flag = 0; while(i { if(strcmp(temp[i].num,num)==0){flag = 1;break;} i++; } if(flag==1){ getchar(); printf(“n=======>Sorry,The number %s is existing,try again(Y/N)”,num); scanf(“%c”,&ch); if(ch=='y'||ch=='Y')continue; else return n; } else break; } strcpy(newinfo.num,num); stringinput(newinfo.name,15,“Name:”); stringinput(newinfo.phonenum,15,“Telephone:”); stringinput(newinfo.address,15,“Address:”); saveflag = 1; for(i=n-1;i>kkk;i--) { strcpy(temp[i+1].num,temp[i].num); strcpy(temp[i+1].name,temp[i].name); strcpy(temp[i+1].phonenum,temp[i].phonenum); strcpy(temp[i+1].address,temp[i].address); } strcpy(temp[kkk+1].num,newinfo.num); strcpy(temp[kkk+1].name,newinfo.name); strcpy(temp[kkk+1].phonenum,newinfo.phonenum); strcpy(temp[kkk+1].address,newinfo.address); n++; Disp(temp,n); printf(“nn”); getchar(); return n;} void SelectSort(TELEBOOK temp[],int n){ int i=0,j=0,indexmin; char charflag[10]; TELEBOOK newinfo; if(n<=0) { system(“cls”); printf(“====>Not telephone record!n”); getchar(); return; } system(“cls”); Disp(temp,n); printf(“The order is sorted by number:n”); for(i=0;i { indexmin = i; for(j=i+1;j if(strcmp(temp[i].num,temp[j].num>0)) indexmin = j; if(indexmin!=i) { strcpy(newinfo.num,temp[i].num); strcpy(newinfo.name,temp[i].name); strcpy(newinfo.phonenum,temp[i].phonenum); strcpy(newinfo.address,temp[i].address); strcpy(temp[indexmin].num,newinfo.num); strcpy(temp[indexmin].name,newinfo.name); strcpy(temp[indexmin].phonenum,newinfo.phonenum); strcpy(temp[indexmin].address,newinfo.address); } } Disp(temp,n); saveflag = 1; printf(“n=======>sort complete!n”); getchar(); return;} void Save(TELEBOOK temp[],int n){ FILE *fp; int i = 0; fp = fopen(“c: elephonebook”,“w”); if(fp==NULL) { printf(“n=====>open file error!n”); getchar(); return; } for(i=0;i { if(fwrite(&temp[i],sizeof(TELEBOOK),1,fp)==1) continue; else break; } if(i>0) { getchar();printf(“nn=====>save file comlete,toal save's record is save's record number is:%dn”,i); getchar(); saveflag = 0; } else { system(“cls”); printf(“the current link is empty , no telephone record is saved!n”); getchar(); fclose(fp); } } void main(){ TELEBOOK tele[N]; FILE *fp; int select; char ch; int count=0; fp = fopen(“C: elephonebook”,“a+”); if(fp==NULL) { printf(“n========>can not open file!n”); exit(0); } while(!feof(fp)) { if(fread(&tele[count],sizeof(TELEBOOK),1,fp)==1) count++; } fclose(fp); printf(“n==>open file sucess, the total records number is :%d.n”,count); getchar(); menu(); while(1) { system(“cls”); menu(); printf(“n Please Enter you choice(0-9):”); scanf(“%d”,&select); if(select==0) { if(saveflag==1) { getchar(); printf(“n==>Wether save the modified record to file?(Y/N):”); scanf(“%c”,&ch); if(ch=='Y'||ch=='y') Save(tele,count); } printf(“n===>thank you for useness!”); getchar(); break; } switch(select) { case 1:count=Add(tele,count);break; case 2:system(“cls”);Disp(tele,count);break; case 3:count = Del(tele,count);break; case 4:Qur(tele,count);break; case 5:Modify(tele,count);break; case 6:count = Insert(tele,count);break; case 7:SelectSort(tele,count);break; case 8:Save(tele,count);break; default :Wrong();getchar();break; } } getch();} #include “stdio.h” #include “string.h” #define N 20 struct mem { char name[20]; char tel[20]; char wu[20]; char dz[20];}mem[N];void sorttel(struct mem tel[]){ struct mem temp; int i,j; FILE *fp;if((fp=fopen(“c: elephone.txt”,“rb”))==NULL){ printf(“不能打开文件n”);} for(i=0;i for(j=0;j if(strcmp(mem[j+1].tel,mem[j].tel)<0) { temp=mem[j]; mem[j]=mem[j+1]; mem[j+1]=temp; } for(i=0;i void sortname(struct mem tel[]){ struct mem temp; int i,j; FILE *fp;if((fp=fopen(“c: elephone.txt”,“rb”))==NULL){ printf(“不能打开文件n”);} for(i=0;i for(j=i+1;j if(strcmp(mem[j].name,mem[i].name)<0) { temp=mem[i]; mem[i]=mem[j]; mem[j]=temp; } for(i=0;i void sor(){int k; do{printf(“--------------------排序菜单-------------------n”); printf(“------------------------n”); printf(“ 1:按号码排序n”); printf(“ 2:按姓名排序n”); printf(“ 0:退出n”); printf(“------------------------n”); printf(“请输入0-2选择功能n”); scanf(“%d”,&k);getchar(); switch(k) { case 1:sorttel(mem);break; case 2:sortname(mem);break; case 0:return; } }while(1);} void add(){ char name[10];char tel[10]; char wu[10]; char dz[10];FILE *fp;if((fp=fopen(“c: elephone.txt”,“a”))==NULL){ printf(“不能打开文件n”); exit(0);} printf(“请输入姓名”); gets(name); printf(“请输入电话号码”); gets(tel); printf(“请输入工作单位”); gets(wu); printf(“请输入地址”); gets(dz);printf(“n”); fprintf(fp,“%s %s %s %sn”,name,tel,wu,dz); fclose(fp);} void del(){ FILE *fp; int i=0,n; char name[10]; printf(“请输入删除名字”); gets(name); if((fp=fopen(“c: elephone.txt”,“r”))==NULL){ printf(“不能打开文件n”); exit(0);} while(!feof(fp)) { fscanf(fp,“%s%s%s%s”,mem[i].name,mem[i].tel,mem[i].wu,mem[i].dz); if(strcmp(name,mem[i].name)!=0)i++; } fclose(fp);if((fp=fopen(“c: elephone.txt”,“w”))==NULL){ printf(“不能打开文件n”); exit(0);} for(n=0;n fprintf(fp,“%s %s %s %s”,mem[n].name,mem[n].tel,mem[n].wu,mem[n].dz);fclose(fp);} void dis(){ FILE * fp;int i=0,n;printf(“ 姓名 电话号码 工作单位 地址n”); if((fp=fopen(“c: elephone.txt”,“r”))==NULL){ printf(“不能打开文件n”); exit(0);} while(!feof(fp)) {fscanf(fp,“%s%s%s%s”,mem[i].name,mem[i].tel,mem[i].wu,mem[i].dz);i++;} fclose(fp); n=i; for(i=0;i printf(“%-8s%11s%13s%24sn”,mem[i].name,mem[i].tel,mem[i].wu,mem[i].dz);} void mod(){ FILE * fp;int i=0,n;char name[10];char nn[10];char nt[10];char nwu[10];char ndz[10]; printf(“请输入要修改的姓名”);gets(name);printf(“请输入修改后的姓名”);gets(nn);printf(“请输入修改后的电话号码”);gets(nt);printf(“请输入修改后的工作单位”);gets(nwu);printf(“请输入修改后的地址”);gets(ndz);printf(“n”);if((fp=fopen(“c: elephone.txt”,“r”))==NULL){ printf(“不能打开文件n”); exit(0);} while(!feof(fp)) { fscanf(fp,“%s%s%s%s”,mem[i].name,mem[i].tel,mem[i].wu,mem[i].dz); if(strcmp(name,mem[i].name)==0) {strcpy(mem[i].name,nn);strcpy(mem[i].tel,nt);strcpy(mem[i].wu,nwu);strcpy(mem[i].dz,ndz);} i++; } fclose(fp);if((fp=fopen(“c: elephone.txt”,“w”))==NULL){ printf(“不能打开文件n”); exit(0);} n=i; for(i=0;i fprintf(fp,“%s %s %s %sn”,mem[i].name,mem[i].tel,mem[i].wu,mem[i].dz); fclose(fp);} void main(){ int choose; while(1) { printf(“--------------------电话簿管理系统--------------------n”); printf(“------------------------n”); printf(“ 1:添加一个新号码n”); printf(“ 2:删除一个号码n”); printf(“ 3:显示所有保存的号码n”); printf(“ 4:修改号码n”); printf(“ 5:排序n”); printf(“ 6:查询n”); printf(“ 0:退出n”); printf(“------------------------n”); printf(“请输入0-6选择功能n”); scanf(“%d”,&choose);getchar(); if(choose!=0) switch(choose) { case 1:add();break; case 2:del();break; case 3:dis();break; case 4:mod();break; case 5:sor();break; case 6:/*que();break*/; } else exit(0); } } XXXXXXXXXXXC/C++程序设计实训 电话簿管理系统 学生姓名 ×××× 学 号 ×××× 所在学院 ×××× 专业名称 ×××× 班 级 ×××× 指导教师 XXX XXXXXXXXXXXXXXXX XXXXXXXXXXXX 目 录 1.前言··················································································································· 3 2.设计目的··········································································································· 3 3.功能描述··········································································································· 3 4.总体设计··········································································································· 4 1、功能模块设计···························································································· 4 2、数据结构设计···························································································· 6 3、函数功能描述···························································································· 7 5.程序实现··········································································································· 7 1、源程序(略)···························································································· 7 2、运行结果···································································································· 7 6.小结··················································································································· 9 1.前言 随着科技的进步和信息产业的飞速发展,电话簿成为了现代生活中一个重要的工具。本电话簿管理系统利用计算机对通讯录进行统一管理,包括添加、修改、查询记录等功能,实现通讯录管理工作的系统化、规范化和自动化,为人们的工作和生活提供便利。本程序是利用结构数组实现此电话簿管理系统。 2.设计目的 本程序旨在训练基本编程能力,了解管理信息系统的开发流程,熟悉C语言的文件和结构数组的各种基本操作。本程序中涉及结构体、数组、文件等方面的知识。通过本程序的训练,能对C语言的文件操作有一个更深刻的了解,掌握利用数组存储结构实现电话簿管理的原理,为进一步开发出高质量的信息管理系统打下坚实的基础。 3.功能描述 如图1所示,电话簿管理系统主要利用数组来实现,其数组元素是结构体类型,整个系统由如下几大功能模块组成。 电话簿管理系统输入记录模块查询记录模块更新记录模块输出记录模块从文件读入从键盘读入按姓名查询按电话查询修改记录删除记录插入记录排序记录输出至文件输出至屏幕(1)输入记录模块。输入记录模块主要完成将数据存入数组中的工作。在此电话簿管理系统中,记录可以从以文本形式存储的数据文件中读入,也可从键盘逐个输入记录。记录由与联系人有关的基本信息字段构成。当从数据文件中读入记录时,它就是在以记录为单位存储的数据文件中,将记录逐条复制到结构体类型的数组元素中。 (2)查询记录模块。查询记录模块主要完成在数组中查找满足相关条件的记录。在此电话簿管理系统中,用户可以按照联系人姓名或联系人电话号码在数组中进行查找。若找到该记录,则以表格形式打印出此记录的信息;否则,返回一个-1的值,并打印出未找到该记录的提示信息。 (3)更新记录模块。更新记录模块主要完成对记录的维护。在此电话簿管理系统中,它实现对记录的修改、删除、插入和排序操作。一般而言,系统进行了这些操作之后,需要将修改的数据存入源数据文件。 (4)输出记录模块。输出记录模块主要完成两个任务。第一,它实现对记录的存盘操作,即将数组中各元素中存储的记录信息写入数据文件中。第二,它实现将数组中存储的记 图1 电话簿管理系统功能模块 录信息以表格的形式在屏幕上打印显示出来。 4.总体设计 1、功能模块设计 (1)主控main()函数执行流程 电话簿管理系统执行主流程如图2所示。它先以可读写的方式打开文本类型的数据文件,此文件默认为“c:telephon”,若该文件不存在,则新建此数据文件。当打开文件操作成功后,从文件中一次读出一条记录,添加到新建的数组中,然后执行显示主菜单和进入主循环操作,进行按键判断。值得一提的是,文本类型文件与二进制类型文件不同,它可以使用Windows自带的记事本打开并查看到存储的文件内容。 开始以可读写的方式打开一个数据文件将此文件的内容读出,并存入一个新的结构体类型的数组中调用emnu()菜单函数进入while(1)主循环输入0~8中的一个数值,选择相应操作输入是否为0?是否判断键值,调用相应函数,完成相应功能是否已对修改进行了存盘?否调用Save()函数,进行写数据文件操作是结束 图2 主控函数执行流程图 在判断键值时,有效的输入为0-8之间的任意数值,其他输入都被视为错误按键。若输入为0(即变量select=0),则会继续判断是否在对记录进行了更新操作之后进行了存盘操作,若未存盘,则全局变量saveflag=1,系统会提示用户是否需要进行数据存盘操作,用户输入 Y或y,系统会进行存盘操作。最后,系统执行退出电话簿管理系统的操作。 若选择1,则调用Add()函数,执行增加记录操作;若选择2,则调用Disp()函数,执行将记录以表格形式打印输出至屏幕的操作;若选择3,则调用Del()函数,执行删除记录操作;若选择4,则调用Qur()函数,执行查询记录操作:若选择5,则调用Modify()函数,执行修改记录操作;若选择6,则调用lnsert()函数,执行插入记录操作;若选择7,则调用SelectSort()函数,执行按升序排序记录的操作;若选择8,则调用Save()函数,执行将记录存入磁盘中的数据文件的操作:若输入为0-8之外的值,则调用Wrong()函数,给出按键错误的提示。 (2)输入记录模块 输入记录模块主要实现将数据存入数组中。当从数据文件中读出记录时,它调用fread(&tele[count],sizeof(TELEBOOK), l,fp)文件读取函数,执行一次从文件中读取一条电话簿记录信息存入某个数组元素中的操作,并且这个操作在main()中调用执行,即在电话簿管理系统进入显示菜单界面时,该操作己经执行了。若该文件中没有数据,则系统会提示数组为空,没有任何记录可操作,此时,用户应选择1,调用Add()函数,进行记录的输入,即完成在数组中添加元素的操作。 (3)查询记录模块 查询记录模块主要实现在数组中按联系人姓名或电话查找满足条件的记录。在查询函数Qur()中,为了遵循模块化编程的原则,对在数组中进行的记录定位操作设计成了一个单独的函数int Locate(TELEBOOK temp[],int n,char findmess[],char nameorphonenum[]),参数findmess[]保存要查找的具体内容,nameorphonenum[]保存要查找的字段(值为字特串类型的name或phonenum),若找到该记录,则返回指向该记录的数组元素的下标;否则,返回一个-1的值。 (4)更新记录模块 更新记录模块主要实现了对记录的修改、删除、插入和排序操作。因为记录是以数组的结构形式存储的,所以这些操作都在数组中完成。下面分别介绍这4个功能模块。 1)修改记录 修改记录操作需要对数组中目标元素的数据域中的值进行修改,它分两步完成。第一步,输入要修改的联系人姓名,输入后调用定位函数Locate()在数组中逐个对联系人姓名字段的值进行比较,直到找到该联系人姓名的记录;第二步,若找到该记录,修改除记录编号之外的各字段的值,并将存盘标记变saveflag置1,表示已经对记录进行了修改,但还未执行存盘操作。 2)删除记录 删除记录操作完成删除指定联系人姓名或电话号码的记录,它也分两步完成。第一步,输入要修改的联系人姓名或电话号码,输入后调用定位函数Locate()在数组中逐个对联系人姓名或电话号码字段的值进行比较,直到找到该联系人姓名或电话号码的记录,返回指向该记录的数组元素下标;第二步,若找到该记录,则从该记录所在元素的后续元素起,依次向前移一个元素位置,有值的数组元素个数减1,其具体过程如图3所示,在删除了数组元素A2后,数组元素A3和A4向前移动了一个位置 A0删除A2前A0删除A2后A1A1A2A3A3A4A4 图3 数组中删除记录示意图 3)插入记录 插入记录操作完成在指定记录编号的随后位置插入新的记录。首先,它要求用户输入某个记录编号,新的记录将插入在该记录之后、然后,提示用户输入一条新的记录的信息,这些信息保存在新结构体类型的数组元素的各字段中;最后,将该元素插入在已经确认位置的记录编号之后。它的具体插入执行过程如图4所示,新元素B1准备插入至已有5个元素的数组中,插入位置为元素A2之后。这具体过程为:先调用Locate()函数找到A2在数组中的下标,从A4开始,往后移动,至A2停止移动,然后在原A3的位置插入元素B1。 插入B1A0插入B1前A0插入B1后A1A2B1A3A4A1A2A3A4 图4 数组中插入记录示意图 4)排序记录 选择排序法也属于内部排序法中的一种,它是运用字段值比较后,从欲排序的数组元素中,按指定规则选出其字段值最小的元素,并依原则交换数组元素位置后,更新欲排序的数组元素,以达到排序的目的。这里我们采用这种排序法来实现按照记录编号或联系人姓名字段的值从低到高对记录进行升序排序。对按照记录编号排序方式而言,我们将按其数值大小来排序;对按照联系人姓名排序方式而言,我们将按其姓名字符ASCII码的大小来排序。 选择排序的方法为:从欲排序的n个数组元素中,以线性查找的方式找出最小的元素和第一个元素交换,再从剩下的(n-1)个数组元素中,找出最小的元素和第二个元素交换,以此类推,直到所有元素均已排序完成。 将相邻的两个数组元素的电话簿字段的值进行比较,若左边的值小于右边的值,则将此两个元素的值进行交换;若左边的值大于等于右边的值,则此两个值的位置不变。右边的值继续和下一个值做比较,重复此动作,直到比较到最后一个值,最终实现了升序排序。选择排序法是最简单的排序法,但选择排序法所需的排序时间比其他排序法长。 (5)输出记录模块 当把记录输出至文件时,调用fwrite(&temp[i],sizeof(TELEBOOK),L,fp)函数,将数组元素temp[i ]中各字段的值,写入文件指针fp所指的文件:当把记录输出至屏幕时,调用void Disp()函数,将数组中存储的记录信息以表格的形式在屏幕上打印出来。 2、数据结构设计 本程序定义了结构体telebook,用于存放联系人的基本信息。这里仅有3 个与联系人有关的字段,读者可以按照需要扩展相关字段。 typedef struct telebook { char num[4];char name[10];char phonenum[15];char address[20];}TELEBOOK;其各字段的值的含义如下: num[4]:保存记录编号。 name[10]:保存联系人姓名。 phonenum[15]:保存联系人的电话号码。 address[20]:保存联系人地址。 3、函数功能描述 1)printheader()函数原型:void printheader()printheader()函数用于在表格形式显示记录时,打印输出表头信息。2)printdata()函数原型:void printdata(TELEBOOK pp)printdatan()数用于以表格显示的方式,打印输出单个数组元素pp中的记录信息。3)Disp()函数原型:void Disp(TELEBOOK temp[],int n)Disp()函数用于显示temp数组中存储的n条记录,内容为telebook结构中定义的内容。其余函数功能描述省略,请同学们在自己写的时候写完整。 5.程序实现 1、源程序(略) 2、运行结果 (1)主界面 图5 主界面 当用户刚进入电话簿管理系统时,其主界面如图5所示。此时,系统己经将“c:telephon”文件打开,若文件不为空,则将数据从文件中逐条记录读出,并写入数组中。用户可选择0-8之间的数值,调用相应功能进行操作。当输入为0时,退出此管理系统。 (2)输入记录 当用户输入1并按Enter键后,即可进入数据输入界面。其输入记录过程如图6所示,这里输入了3条记录。当用户输入为0的记录编号时,它会结束输入过程,返回到主菜单界面。 (3)显示记录 当用户执行了输入记录或已经从数据文件中读取了记录之后,即可输入2并按Enter键,查看当前数组中的记录情况,如图7所示,此时表中有3条记录。 图6 输入记录 图7 显示记录 (4)删除记录 当用户输入3并按Enter键后,即可进入记录删除界面。其删除记录过程如图8所示,这里按联系人姓名删除了一条姓名为A1的记录。 图8 删除记录 (5)查找记录 当用户输入4并按Enter键后,即可进入记录查找界面。其查找记录过程如图9所示,8 用户可按姓名或电话号码进行记录查找。 图9 查找记录 (6)修改记录 当用户输入5并按Enter键后,即可进入记录修改界面。其修改记录过程如图10所示,这里修改了姓名为a2的联系电话和地址字段。 图11 修改记录 (7)插入记录 当用户输入6并按Enter键后,即可进入记录插入界面。其插入过程如图11所示,这里在记录编号为3的记录后插入了一条记录编号为5的记录。 (8)排序记录 当用户输入7并按Enter键后,即可进入记录排序界面。用户可以选择按照记录编号或联系人姓名进行排序,图12为按记录编号进行记录升序排序的结果。 (9)保存记录 当用户输入8并按Enter键后,即可进入记录保存界面。其保存结果提示信息如图13所示,这里有3条记录已经存储至磁盘数据文件c:telephon中。 6.小结 本文介绍了电话簿管理系统的设计思路及其编程实现,重点介绍了功能模块的设计原理和利用数组存储结构实现电话簿管理的过程。通过本程序的开发使我熟悉C语言下的文件和数组操作,了解管理信息系统(MIS)的开发原理,并注意利用选择排序法来实现数组元素 排序的特点。 利用本电话簿管理系统可以对通讯录进行日常维护和管理。 C++课程设计 ————简单电话簿管理 报告内容: 一.程序功能简介 二.课程设计要求 三.课程设计说明 四.参考数据结构 五.具体功能及实现六.源程序及注释 七.感想与心得 学号:050930109 姓名:陈浩 指导老师:臧洌 日期:202_年6月20日 一.程序功能简介 一个基本的电话簿管理程序,具有插入、删除、显示、修改和查询联系人电话码的功能。主菜单如右图所示,每个菜单项功能如下: 1.增加记录菜单:请输入用户姓名,如果该用户已经存在则添加失败,否则,输入用户的电话号码,进行添加。 2.修改某条记录:请输入用户姓名,如果没有该用户显示“ 该用户不存在”信息,否则,输出原电话号码,然后输入新的电话号码,进行修改。3.删除记录: 输入用户姓名,进行删除(删除时要进行确认)。4.查询:输入用户姓名,进行查找。 5.排序:根据子菜单,选择不同的排序方式。6.显示:逐屏显示(每屏显示10条记录)。7.全删:进行全部删除(要确认)。 二.课程设计要求 请选择以下功能 1-增加记录 2-修改记录 3-删除记录 4-查找(按姓名)5-排序 6-显示记录 1.用汉化菜单实现。 2.提供按姓名查询电话号码的功能。 3.显示功能(提供逐屏显示的功能,每屏显示10条记录)。4.删除和修改时要进行确认。 5.将电话簿记录以文件的形式存在磁盘上;每次操作时将电话簿调出,操作完毕后存盘。 三.课程设计说明 1.程序采用数组数据结构实现。2.用类来实现数据的封装。 四.参考数据结构 1.“电话簿”称为用户信息表,用数组实现。用户信息表由若干用户信息构成,每个用户信息是一个数组元素。 2.“user.txt”是一个文件,用于保存“用户信息表”中的信息。当系统启动时,从该文件中读入信息,当退出系统时,将“用户信息表”中的信息写到该文件中。该文件中信息存放形式如下: ZhangHong 5221369 LiLi 84891112 ZhaoQiang 5221498 其中 name(姓名)占20列 phone_num(电话号码)占12列 五.具体功能及实现 定义Fphone类,通过其私有成员数组name[20]和phone[12]分别记录用户姓名与电话号码,定义UserDatabase类记录用户信息,通过公有成员函数实现对数据的操作。 六.源程序及注释 #include //用户信息类的定义 { char name[M]; // 姓名 char phone_num[N]; //电话号码 public: Fphone(char *na=“",char *ph=”“){ strcpy(name,na); strcpy(phone_num,ph);} char*getname(); //获取姓名 char*getphone_num(); //获取电话号码 void setname(char*a); //设置姓名 void setphone_num(char*a);//设置电话号码 void disp(); //显示用户信息 };char *Fphone::getname() { return name;} char *Fphone::getphone_num(){ return(phone_num);} void Fphone::setname(char *a){ strcpy(name,a); } void Fphone::setphone_num(char*a){ strcpy(phone_num,a);} void Fphone::disp(){ cout<<”姓名:“< //用户信息表中的元素个数,即当前记录总数 int Maxu; //最多的用户 Fphone *user; //指向用户信息表的指针 public: UserDatabase() //构造函数,初始化用户信息表,将user.txt文件中数据读到User[]中 { nElem=0; Maxu=50; user=new Fphone[Maxu]; fstream in; in.open(”user.txt“,ios::in|ios::nocreate);//打开文件 for(int i=0;(!in.eof());i++) { in>>user[i].getname();in>>user[i].getphone_num(); nElem++; } in.close();} ~UserDatabase() //析构函数,将user[]写入user.txt文件中 { fstream out; Fphone *p=NULL; p=user; out.open(”user.txt“,ios::out,filebuf::sh_none); for(int i=0;i { out< <<((p+i)->getphone_num())< }delete []user; out.close();} void clear() //删除所有用户信息 { char ord; cout<<”确定删除吗?(选择:[y]是;[n]否)aa“< do { cin>>ord; if(ord=='N'||ord=='n')return; else if(ord=='Y'||ord=='y') { delete[Maxu]user; } user=0;cout<<”删除成功啦!“< user->setname(na); user->setphone_num(ph_num); } else if(nElem { if(strcmp((user+i)->getname(),na)>0) {(user+i+1)->setname(((user+i)->getname())); (user+i+1)->setphone_num(((user+i)->getphone_num())); } else break; } (user+i+1)->setname(na); (user+i+1)->setphone_num(ph_num); nElem++;} else cout <<”空间不足,无法添加!“< //返回user指针 { return(user);} void delete_record(Fphone *p,int k) //删除用户信息 { char con;cout<<”确认删除?(Y/N)“;cin>>con;if(con=='N'||con=='n')return;else if(con=='Y'||con=='y'){ for(int i=k;i { user[i]=user[i+1];} nElem--; cout<<”已删除!“< return;} else { cout<<”输入错误!“< system(”pause“); return;} } void modify_record(Fphone *p,char*ph_num)//修改用户信息 { p->setphone_num(ph_num);} Fphone *query(char *na) //按姓名查找 顺序查找,这里也可以用折半 { Fphone *p=user; int i=0; while(1) { if(strcmp(p->getname(),na)==0) return p; p++; if(i++==nElem) break;} return NULL;} void sorta_name()//按姓名升序排序 插入排序法 { Fphone temp;int i,j;for(i=1;i for(j=i-1;j>=0&&(strcmp(temp.getname(),user[j].getname())<0);j--) { strcpy(user[j+1].getname(),user[j].getname()); strcpy(user[j+1].getphone_num(),user[j].getphone_num()); } strcpy(user[j+1].getname(),temp.getname()); strcpy(user[j+1].getphone_num(),temp.getphone_num());} } void sorta_phonenum()//按电话号码升序排序 选择排序法 { int i,j,p;Fphone temp;for(i=0;i for(j=i+1;j if(strcmp(user[j].getphone_num(),user[p].getphone_num())<0)p=j; if(p!=i) { strcpy(temp.getname(),user[p].getname()); strcpy(temp.getphone_num(),user[p].getphone_num()); strcpy(user[p].getname(),user[i].getname()); strcpy(user[p].getphone_num(),user[i].getphone_num()); strcpy(user[i].getname(),temp.getname()); strcpy(user[i].getphone_num(),temp.getphone_num()); } } } void sort_name()//按姓名降序排序,将排成升序的对象数组逆向放置 { Fphone temp;int i,m=(nElem+1)/2;for(i=0;i strcpy(temp.getphone_num(),user[i].getphone_num()); strcpy(user[i].getname(),user[nElem-i-1].getname()); strcpy(user[i].getphone_num(),user[nElem-i-1].getphone_num()); strcpy(user[nElem-i-1].getname(),temp.getname()); strcpy(user[nElem-i-1].getphone_num(),temp.getphone_num());} } void sort_phonenum()//按电话号码降序排序 冒泡排序法 { Fphone temp;int i,m=(nElem+1)/2;for(i=0;i strcpy(temp.getphone_num(),user[i].getphone_num()); strcpy(user[i].getname(),user[nElem-i-1].getname()); strcpy(user[i].getphone_num(),user[nElem-i-1].getphone_num()); strcpy(user[nElem-i-1].getname(),temp.getname()); strcpy(user[nElem-i-1].getphone_num(),temp.getphone_num());} } void disp(){ int i,n=0;cout< cout< < n++; if(n%10==0) { system(”pause“); system(”cls“); } } cout< 请选择以下功能:“< 1-增加记录“< 2-修改记录“< 3-删除记录“< 4-查找(按姓名)“< 5-排序“< 6-显示记录“< 7-全删“< 0-退出“< 输入选择:“< “< “< 欢迎使用电话簿管理系统 “< 祝您使用愉快 “< “< system(”cls“); menu(); int k; cin>>k; switch(k) { case 1: { system(”cls“) cout<<”*****************************************“< cout<<” 增加记录 “< Fphone *t=NULL; char w; do { cout<<”请输入您要增加的用户的姓名“; cin>>na; t=(s.query(na)); if(t) { cout<<”用户已经存在,添加失败!!“< else { cout<<”请输入用户的电话号码“; cin>>ph_num; s.add_record(na,ph_num);cout<<”您添加的信息为:“;cout<<”姓名:“< } cout<<”是否继续?(Y or N)“< cin>>w;} while(w=='Y');break;} case 2: { system(”cls“); cout<<”***************************************“< 修改记录 “< char na[M],ph_num[N]; Fphone *t=NULL; char w; do { cout<<”请输入您要修改的用户的姓名“; cin>>na; t=s.query(na); if(!t) cout<<”没有该用户!“< else { cout<<”该用户原号码为:“< cout<<”请输入新的电话号码“; cin>>ph_num; s.modify_record(t,ph_num); cout<<”成功修改“< } cout<<”是否继续?(Y or N)“< cin>>w; } while(w=='Y'); break;} case 3: { system(”cls“); cout<<”********************************************“< 删除记录 “< cout<<”************** ***************************“< char w; char na[M]; int k; Fphone *p; do { cout<<”请输入您要删除的用户的姓名“; cin>>na; p=s.query(na); if(p==0) cout<<”没有该用户!“< else {(*p).disp(); k=p-s.getuser(); s.delete_record(p,k); } cout<<”是否继续?(Y or N)“< cin>>w; } while(w=='Y'); break;} case 4: { system(”cls“); cout<<”*********************************“< cout<<” 查询记录 “< cout<<”**********************************“< char na[M];int p=1; Fphone *t=NULL; char w; do { cout<<”请输入您要查询的用户的姓名“; cin>>na; t=s.query(na); if(t) { cout<<”姓名:“< cout<<”电话号码:“< } else cout<<”对不起,没有此人信息!“< cout<<”是否继续?(Y or N)“< cin>>w;} } case 5: { while(w=='Y');break;system(”cls“); cout<<” 请选择排序方式 “< cout<<” 1.按姓名(升序) “< cout<<” 2.按电话号码(升序) “< cout<<” 3.按姓名(降序) “< cout<<” 4.按电话号码(降序) “< cout<<” 请输入你的选择: “< int k; cin>>k; switch(k) { case 1: s.sorta_name(); cout<<”排序完成“< system(”cls“); break; case 2: s.sorta_phonenum(); cout<<”排序完成“< system(”cls“); break; case 3: s.sort_name(); cout<<”排序完成“< system(”cls“); break; case 4: s.sort_phonenum(); cout<<”排序完成“< system(”cls“); break; } } case 6: { system(”cls“); cout<<”*****************************************“< cout<<” 显示记录 “< cout<<”*****************************************“< s.disp(); system(”pause“);break; } } } case 7: { system(”cls“); cout<<”您确定要删除所有记录吗?(Y or N)“< char q; cin>>q; if(q=='Y'||q=='y') { cout<<”*********************************“< cout<<” 全部删除记录 “< cout<<”*********************************“< s.clear(); } else break; system(”pause“); break;} case 0: { system(”cls“); cout<<”谢谢使用,再见!“< exit(0);} default: cout<<”不存在该选择,请重新输入要进行的操作:“< system(”pause"); break;} 七.感想与心得 1.电话簿管理程序较长,算法比较复杂,调试的过程中遇到了各种各样的问题。各种各样的小错误寻找起来十分困难。在今后编写程序时应当随编随找错。 2.课设让我们把这一学期所学的C++知识得到了很好的应用,开拓了我们的思路,所谓温故而而知新,这次课设也让我们对以前的知识有了一个全面的回顾,加深了对已学知识的理解。 3.课设过程艰辛,花费时间很长,需要很强的耐力和信心。而这也是对我们的一次考验,养成了坚持不懈和吃苦耐劳的精神。总之,C++课设让我们学到了很多,也收获了很多,这必将成为我人生中的一个深刻的回忆。 #include struct //定义结构组 { char num[N]; char name[20]; char tele[15]; char add[20]; char emal[15];}STUDENT;STUDENT stu[N];int Menu(); //声明函数 int Key();int Get(STUDENT stu[N]);void Show(STUDENT stu[],int n);int Del(STUDENT stu[],int n);int find(STUDENT stu[],int n);int find2(STUDENT stu[],int n); void Search(STUDENT stu[],int n);void Search2(STUDENT stu[],int n);void Modify(STUDENT stu[],int n);void Sort(STUDENT stu[],int n);int Add(STUDENT stu[],int n);int Exit(); /****************************************其它函************************************/ int Menu(){int a;printf(“t ****************************************************n”);printf(“t *********** *************nn”);printf(“t ********* ☆欢迎亲使用本电话簿管理程序☆ *********nn”);printf(“t *********** *************n”);printf(“t ****************************************************nn”); printf(“*******************************主菜**********************************n”);printf(“ttt 0.输入信息n”);printf(“ttt 1.显示信息n”);printf(“ttt 2.删除信息n”);printf(“ttt 3.按人名查找信息n”);printf(“ttt 4.按电话号码查找信息n”);printf(“ttt 5.修改信息n”);printf(“ttt 6.添加信息n”);printf(“ttt 7.按人名排序信息n”); 数 单 printf(“ttt 8.退出信息n”);do {printf(“ttt 请输入0-8n”);scanf(“%d”,&a);} while(a<0||a>8);return a;} int Key() //口令验证函数 {char keyput[20];int keynum=3;for(keynum=3;keynum>0;keynum--){ if(keynum==0) return(0); printf(“请正确输入口令(201314)(你还有%d次机会):”,keynum); scanf(“%s”,keyput); if(!strcmp(keyput,“201314”)) return(1); } } int Get(STUDENT stu[N]) //输入信息 {int i,n; printf(“n请输入要加入用户的人数 n”); scanf(“%d”,&n); printf(“其输入信息 n”); for(i=0;i {printf(“请输入编号:n”); scanf(“%s”,stu[i].num);printf(“n请输入姓名n:”); scanf(“%s”,stu[i].name); printf(“ n请输入电话:n”);scanf(“%s”,stu[i].tele);printf(“ n请输入地址:n”);scanf(“%s”,stu[i].add);printf(“ n请输入emal:n”);scanf(“%s”,stu[i].emal);printf(“编号:%sn姓名:%sn电话:%sn位:%snemal:%sn”,stu[i].num,stu[i].name,stu[i].tele,stu[i].add,stu[i].emal);} return n;} void Show(STUDENT stu[],int n) //显示信息 {int i; 工 作 单for(i=0;i find(STUDENT stu[],int n) //人名查找函数 {int i; char s[20]; printf(“请输入的姓名n”); scanf(“%s”,s); for(i=0;i if(strcmp(s,stu[i].name)==0)return i; return i; } int find2(STUDENT stu[],int n) //电话号码查找函数 {int i; char s[20]; printf(“请输入的电话号码n”); scanf(“%s”,s); for(i=0;i if(strcmp(s,stu[i].tele)==0)return i; return i; } int Del(STUDENT stu[],int n) //删除信息 {int i,j,ch;i=find(stu,n);if(i>n-1) {printf(“没有找到要删除的记录,是否重新输入1/0n”);scanf(“%d”,&ch);if(ch==1)n=Del(stu,n);} else {printf(“编号: %sn 姓 名 : %sn 电 话 : %sn位:%snemal:%sn”,stu[i].num,stu[i].name,stu[i].tele,stu[i].add,stu[i].emal);printf(“是否确定要删除:%d是%2d否n”,1,0);} scanf(“%d”,&ch); if(ch==1) {for(j=i+1;j {strcpy(stu[j-1].name,stu[j].name); strcpy(stu[j-1].tele,stu[j].tele); strcpy(stu[j-1].add,stu[j].add); strcpy(stu[j-1].emal,stu[j].emal);} n--; 工作单 工作单 printf(“删除成功n”);} return n;} void Search(STUDENT stu[],int n) //按人名查找信息 {int i,ch;i=find(stu,n);if(i>n-1) {printf(“没有找到要查找的信息,是否重新输入1/0n”); scanf(“%d”,&ch);if(ch==1)Search(stu,n);} else printf(“编号: %sn 姓 名 : %sn 电 话 : %sn位:%snemal:%sn”,stu[i].num,stu[i].name,stu[i].tele,stu[i].add,stu[i].emal);} void Search2(STUDENT stu[],int n) //按电话号码查找信息 {int i,ch;i=find2(stu,n);if(i>n-1) {printf(“没有找到要查找的信息,是否重新输入1/0n”); scanf(“%d”,&ch);if(ch==1)Search2(stu,n);} else printf(“编号:%sn姓名:%sn电话:%sn位:%snemal:%sn”,stu[i].num,stu[i].name,stu[i].tele,stu[i].add,stu[i].emal);} void Modify(STUDENT stu[],int n) //修改信息 {int i,ch;i=find(stu,n);if(i>n-1) {printf(“没有找到要修改的信息,是否重新输入1/0n”); scanf(“%d”,&ch);if(ch==1)Modify(stu,n);} else {printf(“编号: %sn 姓 名 : %sn 电 话 : %sn位:%snemal:%sn”,stu[i].num,stu[i].name,stu[i].tele,stu[i].add,stu[i].emal); printf(“是否确定要修改:%d是%2d否n”,1,0);} scanf(“%d”,&ch); if(ch==1) {printf(“编号:n”); scanf(“%s”,stu[i].num); printf(“n姓名n:”); scanf(“%s”,stu[i].name); printf(“ n电话:n”); scanf(“%s”,stu[i].tele); 工 作 单 工 作 单 工 作 单 printf(“ n工作单位:n”); scanf(“%s”,stu[i].add); printf(“ nemal:n”); scanf(“%s”,stu[i].emal); printf(“修改成功n”);}} int Add(STUDENT stu[],int n) //添加信息 {int i,j; if(N<=n+1) printf(“储存已满”); else {printf(“请输入要插入的位置n”);scanf(“%d”,&i); for(j=n-1;j>=i;j--) {strcpy(stu[j+1].name,stu[j].name); strcpy(stu[j+1].tele,stu[j].tele); strcpy(stu[j+1].add,stu[j].add); strcpy(stu[j+1].emal,stu[j].emal); } printf(“其输入要插入的信息 n”); printf(“编号:n”); scanf(“%s”,stu[i].num); printf(“n请输入姓名:n”); scanf(“%s”,stu[i].name); printf(“ n请输入电话:n”); scanf(“%s”,stu[i].tele);printf(“ n请输入工作单位:n”);scanf(“%s”,stu[i].add);printf(“ n请输入emal:n”);scanf(“%s”,stu[i].emal); printf(“添加成功”);n++;} return n; } void Sort(STUDENT stu[],int n){STUDENT tmp;int i,j;for(i=0;i stu[j+1]=tmp;} for(i=0;i int Exit() //退出通讯录 {int n;n=-1;printf(“************************************************************************”);return n;} int main() //主函数 {int go;go=Key();if(go==1){int length,m=0; while(m>=0) {switch(Menu()) { case 0:length=Get(stu);break; case 1:Show(stu,length);break; case 2:length=Del(stu,length);break; case 3:Search(stu,length);break; case 4:Search2(stu,length);break; case 5:Modify(stu,length);break; case 6:length=Add(stu,length);break; case 7:Sort(stu,length);break; case 8:m=Exit();break; default:printf(“输入错误,请重新输入n”);} }return 0;} else printf(“三次密码错误,程序不能运行!”);} 欢 迎 再 次 工作单 使用第二篇:c语言 电话簿管理系统
第三篇:C++程序设计—电话簿管理系统
第四篇:C++课程设计电话簿管理
第五篇:电话簿管理程序