1.设计内容:电话薄管理程序存储的数据包括:人名,工作单位,电话号码和E-mail地址有如下功能:1)加入一个新的电话号码2)删除一个电话号码3)显示保存的已有的电话号码4)修改功能5)排序功能(按电话号码,按姓名字母顺序)6)查询功能(按人名查电话号码,按电话号码查人名)要求:1)程序运行开始,首先显示一个命令菜单。
用户选择那条命令,就调用那项功能。
2)显示数据时,一页显示不下,可以分页显示。
1、设计目的通过本次课程设计了解指针、函数、文件、链表等在实际中的具体应用及他们各自特点,并通过这次实习能达到熟练应用c语言来编辑一些简单的可以在生活中使用的程序的目的,而且学会添加、删除、修改、排序、查找、显示等功能在c语言下的实现。
2、3、程序代码#include<stdio.h> /*标准输入输出库*/#include<conio.h> /*界面处理库*/#include<stdlib.h> /*标准库*/#include<string.h> /*处理字符串函数库*/char filename[20]="E:\\tx123.txt";struct phone /*定义结构体变量*/{char name[10]; /*存放姓名*/char mobile[15]; /*存放手机号码*/char phone[15]; /*存放家庭电话*/char company[20]; /*存放工作单位*/char add_Email[20]; /*存放Email地址*/struct phone *next; /*存放下一个节点的地址*/};typedef struct phone tel; /*重命名*/tel *head=NULL;int z=1,x=1; /*标记量x,z*/void showmenu(); /*显示功能菜单*/void add( ); /*控制添加记录*/void creat(); /*添加记录并按姓名排序*/void modify(); /*修改记录函数*/void searchshow(); /*查找功能显示*/tel *search(); /*查找菜单*/tel *searchname(); /*按人名查找*/tel *searchmob(); /*按手机号码查找*/tel *searchph(); /*按家庭号码查找*/void del(); /*删除记录函数*/void show(); /*显示全部记录*/void save(); /*保存函数*/void openfile(); /*输出文件到链表*/void fre(); /* 释放链表空间*/void showmenu() /*显示功能菜单*/{ int i;clrscr();for(i=0;i<80;i++)printf("%c",14);printf("\n\t\t********************************************\n"); printf("\t\t\t欢迎使用通讯录管理系统");printf("\n\t\t********************************************\n"); printf("\n\n\t\t\t******请选择你的操作******\n");printf("\t\t\t +-------------------------------+\n");printf("\t\t\t | 1 增加记录|\n");printf("\t\t\t | 2 修改记录|\n");printf("\t\t\t | 3 查找记录|\n");printf("\t\t\t | 4 删除记录|\n");printf("\t\t\t | 5 显示全部记录|\n");printf("\t\t\t | 0 退出|\n");printf("\t\t\t +-------------------------------+\n");printf("\n\n\t注意!!输入电话号码或Email要在英文状态下,中文状态无法输入!!\n\n"); printf("请在0--6选择:\n");for(i=0;i<80;i++)printf("%c",14);}void add( ) /*控制添加记录*/{int x=1;printf("开始添加纪录,在添加记录过程中按0 停止添加\n");while(x!=0){do{ creat();printf("操作完成\n");break;}while(1);printf("按0结束添加!!按其他数字键,继续添加!!!\n");scanf("%d",&x);if(x==0){ save();system("cls");}}}void creat() /*添加记录并按姓名排序*/{ int i;tel *new,*p1,*p2;new=(tel *)malloc(sizeof(tel));aa: printf("\t\t\t请输入姓名:");scanf("%s",new->name);printf("\t\t\t请输入工作单位:");scanf("%s",new->company);printf("\t\t\t请输入手机号码:");scanf("%s",new->mobile);printf("\t\t\t请输入家庭电话:");scanf("%s",new->phone);printf("\t\t\t请输入Email地址:");scanf("%s",new->add_Email);p1=head; /*将头指针赋给变量p1*/if(head!=NULL) /*先判断是否有记录*/do{if((strcmp(p1->mobile,new->mobile))==0||(strcmp(p1->phone,new->phone))==0){printf("记录已经存在\n");printf("\n%-10s%-20s%-15s%-15s%-20s\n",p1->name,p1->company,p1->mobile,p1->phone,p1->add_Email);printf("是否继续添加?1 继续添加\t其他数字键重新输入\n");scanf("%d",&i);if(i==1)break;elsegoto aa;}p1=p1->next;}while(p1!=NULL);p1=head;if(head==NULL) /*检测是否为空链表*/{head=new; /*链表为空,插入的结点作为第一个结点*/new->next=NULL;}else{while((p1->next!=NULL)&&(strcmp(p1->name,new->name)<0)){ p2=p1;p1=p1->next;}if((strcmp(p1->name,new->name)>0)){if(head==p1){ new->next=head;head=new;}else{ p2->next=new;new->next=p1;}}else{ p1->next=new;new->next=NULL;}}}void modify() /*修改记录函数*/ { tel *new=search();if(z==0);else if(x==0);else if(z==0&&x==0);else{ if(new==NULL){printf("请输入新纪录:\n");printf("\t\t\t请输入姓名:");scanf("%s",head->name);printf("\t\t\t请输入工作单位:"); scanf("%s",head->company);printf("\t\t\t请输入手机号码:"); scanf("%s",head->mobile);printf("\t\t\t请输入家庭电话:"); scanf("%s",head->phone);printf("\t\t\t请输入Email地址:"); scanf("%s",head->add_Email); save();}else{printf("请输入新纪录:\n");printf("\t\t\t请输入姓名:");scanf("%s",new->name);printf("\t\t\t请输入工作单位:"); scanf("%s",new->company);printf("\t\t\t请输入手机号码:"); scanf("%s",new->mobile);printf("\t\t\t请输入家庭电话:"); scanf("%s",new->phone);printf("\t\t\t请输入Email地址:"); scanf("%s",new->add_Email);save();}}printf("\n\n");printf("\t\t\t按任意键继续");getch();system("cls");}void searchshow() /*查找功能显示*/{ int i;clrscr();for(i=0;i<80;i++)printf("%c",16);printf("\n\t\t********************************************\n"); printf("\n\n\t\t\t******请选择你的操作******\n");printf("\t\t\t +-------------------------------+\n");printf("\t\t\t | 1 按人名查找|\n");printf("\t\t\t | 2 按手机号码查找|\n");printf("\t\t\t | 3 按家庭号码查找|\n");printf("\t\t\t +-------------------------------+\n");printf("\n\t\t********************************************\n"); printf("请在1--3选择:\n");for(i=0;i<80;i++)printf("%c",17);}tel *search() /*查找菜单*/{ int i;tel *p1=NULL,*p2=NULL,*p=NULL;searchshow();loop:scanf("%d",&i);if(i>=1&&i<=3)switch(i){case 1:p2=searchname();break;case 2:p2=searchmob();break;case 3:p2=searchph();break;}else{printf("选择错误,请重新选择\n\n");goto loop;}p1=head;while(p1!=NULL){if((strcmp(p1->name,p2->name))==0||(strcmp(p1->mobile,p2->mobile))==0||(strcmp(p1->phone,p2->phone))==0){printf("找到记录:\n");printf("%-10s%-20s%-15s%-15s%-20s\n","姓名","工作单位","手机号码","电话号码","家庭住址");printf("\n%-10s%-20s%-15s%-15s%-20s",p1->name,p1->company,p1->mobile,p1->phone,p1->a dd_Email);getch();break;}p=p1;p1=p1->next;}if(p1==NULL){printf("\t\t\t电话本中无此记录\n\n");printf("\t\t是否重新进行?按1 继续\t\n");scanf("%d",&i);if(i==1){free(p2);goto loop;}}return p;}tel *searchname() /*按人名查找*/{tel *p2=NULL;printf("\t\t请输入姓名:");p2=(tel *)malloc(sizeof(tel));scanf("%s",p2->name);return p2;}tel *searchmob() /*按手机号码查找*/{ tel *p2=NULL;printf("\t\t请输入手机号码:");p2=(tel *)malloc(sizeof(tel));scanf("%s",p2->mobile);return p2;}tel *searchph() /*按家庭号码查找*/{ tel *p2=NULL;printf("\t\t请输入家庭电话:");p2=(tel *)malloc(sizeof(tel));scanf("%s",p2->phone);return p2;}void del() /*删除记录函数*/{tel *p2=search();int i;if(z==0);else if(x==0);else if(z==0&&x==0);else if(p2==NULL){printf("\n\n\n确实要删除吗?\t按1 删除\t按其他数字保留!!\n"); scanf("%d",&i);if(i==1)head=head->next;save();printf("\t\t\t按任意键返回\n");getch();system("cls");}else{printf("\n\n\n确实要删除吗?\t按1 删除\t按其他数字保留!!\n"); scanf("%d",&i);if(i==1){p2->next=p2->next->next;save();}printf("\t\t\t按任意键返回\n");getch();system("cls");}}void show() /*显示全部记录*/{ tel *p1=NULL;clrscr();if(head==NULL) /*判断是否是空链表*/{printf("\n\t\t\t电话簿中没有记录,请输入纪录后,在使用本能!\n");printf("\t\t\t按任意键返回\n");getch();return;}p1=head;printf("\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~\n");printf("%-10s%-20s%-15s%-15s%-20s\n","姓名","工作单位","手机号码","电话号码","E_mail 地址");printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~\n");do{printf("%-10s%-20s%-15s%-15s%-20s",p1->name,p1->company,p1->mobile,p1->phone,p1->add_Email);p1=p1->next;}while(p1!=NULL);printf("\t\t\t按任意键返回\n");getch();system("cls");}void save() /*保存函数*/{tel *p1=NULL;FILE *fp;if((fp=fopen(filename,"w"))==NULL){printf("不能打开文件\n");return ;}p1=head;for(;p1!=NULL;p1=p1->next){fprintf(fp,"%s\t\t%s\t\t%s\t\t%s\t\t%s\n",p1->name,p1->company,p1->mobile,p1->phone,p1->add_Email);}printf("操作完毕\n");fclose(fp);}void openfile() /*输出文件到链表*/{FILE *fp;tel *p1=NULL,*p2=NULL;head=NULL;if((fp=fopen(filename,"r"))==NULL) /*打开文件*/{ /*文件不存在,表明第一次使用本电话簿*/ printf("\n\t\t\t********这是一个新电话簿*********\n");return ;}while(!feof(fp) ) /*循环读取文件数据*/{p1=(tel*)malloc (sizeof(tel));fscanf(fp,"%s%s%s%s%s\n",p1->name,p1->company,p1->mobile,p1->phone,p1->add_Email); if(head==NULL){head=p1;p1->next=NULL;p2=p1;}else{p2->next=p1;p1->next=NULL;p2=p1;}}fclose(fp);}void fre() /* 释放链表空间*/{tel *p=head;while(head!=NULL){head=head->next;free(p);p=head;}free(head);}main(){int x;openfile(); /*读取文件到链表*/textbackground(4);/*设置背景颜色*/textcolor(0); /*设置字体颜色*/while(1) /*设置循环条件为真*/{showmenu(); /*显示各个功能*/fflush(stdin); /*刷新缓存区,即清除上一次的存储数据*/printf("请作出您的选择:");scanf("%d",&x);if(x>=0&&x<=5){switch(x){ clrscr();case 1:add();break; /*添加记录函数*/case 2:modify();break; /*修改记录函数*/case 3:search();break; /*查找记录函数*/case 4:del();break; /*删除记录函数*/case 5:show();break; /*显示全部记录*/case 0:fre();printf("\n\t\t欢迎再次使用通讯录管理系统,再见!\n\n");exit(0); /*程序正常退出*/}}else printf("\n\n选择错误,请再次选择!\n");}}4、运行结果具体运行结果见实际操作5、分析与讨论大体上设计的程序与要求符合,但在分页程序的设计上,虽然我们设计出了较简单的可行的分页程序,可是在糅合进主程序时我们遇到了问题,主要是添加记录后显示的结果中始终带有乱码,这里可能是因为主程序的复杂性使输入、输出的数据格式与分页程序中的无法相匹配。