电话薄管理系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
郑州轻工业学院
实训报告实训名称:电话薄管理系统
姓名:
院(系):
专业班级:
学号:
指导教师:
成绩:
时间:
实训报告:
一、 需求分析
设计一个电话薄管理系统,实现通讯录管理工作的系统化,为人们的工作和生活提供便利。
二、 功能描述
该系统具有输入、显示、查找、删除、插入、保存、读入、排序和退出等功能。
三、总体设计
设计思路:
(1)、输入模块。
主要完成将数据存入数组中的工作。
记录既可以从以文本格式存储的数据文件中读入,也可以从键盘逐个输入。
记录由于联系人有关的基本信息字段构成。
(2)、查询模块。
查询模块主要完成在数组中查找满足相关条件的记录。
用户可以按照联系人姓名或者联系人号码在数组中进行查找。
(3)、更新模块。
更新模块主要实现对记录的修改、删除、插入、和排序。
在进行更新操作只好,需要将修改的数据存入源数据文件。
(4)输出模块。
实现对记录的存盘,并以表格的形式将记录信息打印在屏幕上。
主控函数流程图:
电话薄管理系统
输入模块
查询模块
更新模块
输出模块
从文件读入
从键盘读入
按
电话号码查询
按姓名查询
修改记录
删除记录
插入记录
排序记录
输出至文件
输出至屏幕
将此文件的内容读出,是否已对修改开始
以可读写的方式打开一个数据文件
并存入一个新的结构体
类型的数组中
调用menu 菜单函数
进入while(1)主循环 输入0~8中的一数值,选择相应的操作
输入是否为0?
判断键值,调用相应函数,完成相应功能
进行了存盘?
调用Save()函数,进行写数据文件操作
结束
程序实现:
在判断键值是,有效输入为0—8之间的任意整数,其他输入都被视为错误案件。
若输入为0,则会判断在对记录进行了更新操作之后知否进行了存盘操作。
若未存盘,系统会提示用户是否需要进行数据存盘操作,用户输入Y或y,系统会进行存盘操作。
最后系统执行退出电话薄管理系统的操作。
若选择1,执行增加记录操作;若选择2,执行以表格形式打印输出记录至屏幕的操作;若选择3,执行删除记录操作;若选择4,执行查询记录操作;若选择5,执行修改记录操作;若选择6,执行插入记录;选择7,执行按升序排序的操作;选择8,执行存储记录的操作;若输入哦0—8之外的整数,给出案件错误的提示。
程序主菜单如下:
欢迎使用电话薄管理系统
************************电话薄主菜单*********************
* *
* 1 增加记录 2 显示记录 *
* *
* 3 删除记录 4 查询记录 *
* *
* 5 修改记录 6 插入记录 *
* *
* 7 排序记录 8 存储记录 *
* *
* 0 退出系统 *
* *
*********************************************************
实训感想
1、巩固和强化了个人程序设计基本知识和基本技能,尤其是C语言的基本数据类型、构造类型、函数、指针、文件等等方面的基本知识和技能。
2、培养和训练了个人综合利用所学基本知识和基本技能进行小型应用程序开发的技能。
3、培养个人适应岗位需要,独立分析问题、解决问题的基本能力,以及团队合作精神。
附录(代码)
#include "stdio.h" //标准输入输出函数库
#include "stdlib.h" //标准函数库
#include "string.h" //字符串函数库
#include "conio.h" //屏幕操作函数库
#define HEADER1 " --------------------------电话簿-----------------------------------\n"
#define HEADER2 " | 编号| 姓名| 电话号码| 地址| \n"
#define HEADER3 " |-----------|-------------|----------------|----------------------| \n"
#define FORMAT " | %-8s| %-10s| %-11s | %-18s | \n"
#define DATA p->num,p->name,p->phonenum,p->address
#define END " --------------------------------------------------------------------\n"
#define N 250
int saveflag=0; //是否需要存盘的标志变量
//定义与职工有关的数据结构
typedef struct telebook //标记为telebook
{
char num[4]; //记录编号
char name[10]; //联系人姓名
char phonenum[15]; //联系人电话号码
char address[20]; //联系人地址
}TELEBOOK;
void menu() //主菜单
{
system("cls"); //调用DOS命令,清屏.与clrscr()功能相同
system("color 1a");
cprintf(" 欢迎使用电话薄管理系统\n");
cprintf(" \n"); cprintf(" ************************电话薄主菜单**********************\n"); cprintf(" * *\n"); cprintf(" * 1 增加记录 2 显示记录*\n"); cprintf(" * *\n"); cprintf(" * 3 删除记录 4 查询记录*\n"); cprintf(" * *\n"); cprintf(" * 5 修改记录 6 插入记录*\n"); cprintf(" * *\n"); cprintf(" * 7 排序记录8 存储记录*\n"); cprintf(" * *\n"); cprintf(" * 0 退出系统*\n"); cprintf(" * *\n"); cprintf(" **********************************************************\n"); //cprintf()送格式化输出至文本窗口屏幕中
}
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) //显示数组temp[]中存储的记录,内容为电话薄结构中定义的内容
{
int i;
if(n==0) //表示没有电话簿记录
{
printf("\n=====>无电话号码记录!\n");
while(getchar()!='\n')
continue;
printf("输入回车键继续");
getchar();
return;
}
printf("\n\n");
printheader(); //输出表格头部
i=0;
while(i<n) //逐条输出数组中存储的电话记录
{
printdata(temp[i]);
i++;
printf(HEADER3);
}
while(getchar()!='\n')
continue;
printf("输入回车键继续");
getchar();
}
void Wrong() //输出按键错误信息
{
printf("\n\n\n\n\n***********错误:输入有误!请按回车键继续!**********\n");
getchar();
}
void Nofind() //输出未查找到此电话信息
{
printf("\n=====>没有相关记录,请按回车键继续!\n");
}
//作用:用于定位数组中符合要求的记录,并返回保存该记录的数组元素下标值
//参数:findmess[]保存要查找的具体内容; nameorphonenum[]保存按什么在数组中查找int Locate(TELEBOOK temp[],int n,char findmess[],char nameorphonenum[])
{
int i=0;
if(strcmp(nameorphonenum,"phonenum")==0) //按号码记录编号查询
{
while(i<n)
{
if(strcmp(temp[i].phonenum,findmess)==0) //若找到findmess值的号码记录编号
return i;
i++;
}
}
else if(strcmp(nameorphonenum,"name")==0) //按号码记录姓名查询
{
while(i<n)
{
if(strcmp(temp[i].name,findmess)==0) //若找到findmess值的号码记录姓名
return i;
i++;
}
}
return -1; //若未找到,返回一个整数-1
}
//输入字符串,并进行长度验证(长度<lens)
void stringinput(char *t,int lens,char *notice)
{
char n[250];
do{
printf(notice); //显示提示信息
scanf("%s",n); //输入字符串
if(strlen(n)>lens)
printf("\n 超出长度! \n");//进行长度校验,超过lens值重新输入}while(strlen(n)>lens);
strcpy(t,n); //将输入的字符串复制到字符串t中
}
//增加电话号码记录
int Add(TELEBOOK temp[],int n)
{
char ch,num[10];
int i,flag=0;
system("cls");
Disp(temp,n); //先打印出已有的电话号码记录
while(1) //一次可输入多条记录,直至输入号码记录编号为0的记录结束添加操作
{
while(1) //输入电话号码编号,保证该编号没有被使用,若输入编号为0,则退出添加记录操作
{
stringinput(num,10,"(输入0返回主菜单)请输入\n编号:"); //格式化输入编号并检验
flag=0;
if(strcmp(num,"0")==0) //输入为0,则退出添加操作,返回主界面
{return n;}
i=0;
while(i<n) //查询该编号是否已经存在,若存在则要求重新输入一个未被占用的编号{
if(strcmp(temp[i].num,num)==0)
{
flag=1;
break;
}
i++;
}
if(flag==1) //提示用户是否重新输入
{ getchar();
printf("==>该编号%s已存在,是否重新输入?(y/n):",num);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
continue;
else
return n;
}
else
{break;}
}
strcpy(temp[n].num,num); //将字符串num复制到tp[n].num中
stringinput(temp[n].name,10,"姓名:"); //输入姓名
stringinput(temp[n].phonenum,15,"电话号码:"); //输入电话号码
stringinput(temp[n].address,20,"地址:"); //输入家庭地址
saveflag=1;
n++;
}
return n;
}
//按电话薄号码编号或姓名,查询记录
void Qur(TELEBOOK temp[],int n)
{
int select; //:按编号查,2:按姓名查,其他:返回主界面
char searchinput[20]; //保存用户输入的查询内容
int p=0;
if(n<=0) //若数组为空
{
system("cls");
printf("\n=====>没有相关记录,请按回车键继续!\n");
getchar();
return;
}
system("cls");
printf("\n =====>1 按姓名查找=====>2 按号码查找\n");
printf(" 请选择[1,2]:");
scanf("%d",&select);
if(select==1) //按姓名查询
{
stringinput(searchinput,10,"请输入存在的姓名:");
p=Locate(temp,n,searchinput,"name"); //在数组temp中查找编号为searchinput值的元素,并返回该数组元素的下标值
if(p!=-1) //若找到该记录
{
printheader();
printdata(temp[p]);
printf(END);
printf("输入回车键返回");
getchar();
}
else
Nofind();
getchar();
}
else if(select==2) //按电话号码查询
{
stringinput(searchinput,15,"请输入存在的电话号码:");
p=Locate(temp,n,searchinput,"phonenum");
if(p!=-1)
{
printheader();
printdata(temp[p]);
printf(END);
printf("输入回车键返回");
getchar();
}
else
Nofind();
getchar();
}
else
Wrong();
getchar();
}
//删除记录:先找到保存该记录的数组元素的下标值,然后在数组中删除该数组元素int Del(TELEBOOK temp[],int n)
{
int sel;
char findmess[20];
int p=0,i=0;
if(n<=0)
{
system("cls");
printf("\n=====>没有任何记录!\n");
getchar();
return n;
}
system("cls");
Disp(temp,n);
printf("\n =====>1 按姓名删除=====>2 按号码删除\n");
printf(" 请选择[1,2]:");
scanf("%d",&sel);
if(sel==1)//先按姓名查询到该记录所在的数组元素的下标值
{
stringinput(findmess,10,"请输入存在的姓名:");
p=Locate(temp,n,findmess,"name");
getchar();
if(p!=-1)
{
for(i=p+1;i<n;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==>删除成功,请输入回车键返回!\n");
n--;
getchar();
saveflag=1;
}
else
Nofind();
getchar();
}
else if(sel==2) //先按电话号码查询到该记录所在的数组元素的下标值{
stringinput(findmess,15,"请输入存在的电话号码:");
p=Locate(temp,n,findmess,"phonenum");
getchar();
if(p!=-1)
{
for(i=p+1;i<n;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=====>删除成功,输入回车键返回!\n");
n--;
getchar();
saveflag=1;
}
else
Nofind();
getchar();
}
return n;
}
//修改记录:先按输入的电话编号查询到该记录,然后提示用户修改编号之外的值,编号不能修改
void Modify(TELEBOOK temp[],int n)
{
char findmess[20];
int p=0;
if(n<=0)
{ system("cls");
printf("\n=====>无号码记录,请按回车键继续!\n");
getchar();
return ;
}
system("cls");
printf("修改号码记录");
Disp(temp,n);
stringinput(findmess,10,"请输入存在的姓名:"); //输入并检验该编号
p=Locate(temp,n,findmess,"name"); //查询到该数组元素,并返回下标值
if(p!=-1) //若p!=-1,表明已经找到该数组元素
{
printf("编号:%s,\n",temp[p].num);
printf("姓名:%s,",temp[p].name);
stringinput(temp[p].name,10,"请输入新姓名:");
printf("姓名:%s,",temp[p].phonenum);
stringinput(temp[p].phonenum,15,"请输入新电话号码:");
printf("姓名:%s,",temp[p].address);
stringinput(temp[p].address,20,"请输入新地址:");
printf("\n=====>修改成功,输入回车键返回!\n");
Disp(temp,n);
getchar();
saveflag=1;
}
else
{Nofind();
getchar();
}
return ;
}
//插入记录:按号码编号查询到要插入的数组元素的位置,然后在该编号之后插入一个新数组元素。
int Insert(TELEBOOK temp[],int n)
{
char ch,num[10],s[10]; //s[]保存插入点位置之前的编号,num[]保存输入的新记录的编号
TELEBOOK newinfo;
int flag=0,i=0,kkk=0;
system("cls");
Disp(temp,n);
while(1)
{ stringinput(s,10,"请输入要插入哪位编号之后:");
flag=0;i=0;
while(i<n) //查询该编号是否存在,flag=1表示该编号存在
{
if(strcmp(temp[i].num,s)==0) {kkk=i;flag=1;break;}
i++;
}
if(flag==1)
break; //若编号存在,则进行插入之前的新记录输入操作
else
{ getchar();
printf("\n=====>该编号%s不存在,重新尝试?(y/n):",s);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{continue;}
else
{return n;}
}
}
//以下新记录的输入操作与Add()相同
while(1)
{ stringinput(num,10,"请输入要插入的编号:");
i=0;flag=0;
while(i<n) //查询该编号是否存在,flag=1表示该编号存在
{
if(strcmp(temp[i].num,num)==0) {flag=1;break;}
i++;
}
if(flag==1)
{
getchar();
printf("\n=====>对不起,你输入的编号%s已存在,请重新输入!(y/n):",num);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{continue;}
else
{return n;}
}
else
break;
}
strcpy(newinfo.num,num); //将字符串num复制到newinfo.num中stringinput(,10,"姓名:"); //输入姓名
stringinput(newinfo.phonenum,15,"电话号码:"); //输入电话号码stringinput(newinfo.address,20,"地址:"); //输入地址
saveflag=1; //在main()有对该全局变量的判断,若为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); //在kkk的元素位置后插入新记录strcpy(temp[kkk+1].name,);
strcpy(temp[kkk+1].phonenum,newinfo.phonenum);
strcpy(temp[kkk+1].address,newinfo.address);
n++;
Disp(temp,n);
printf("\n\n输入回车键返回");
getchar();
return n;
}
//利用选择排序法实现数组的按记录编号或姓名的升序排序
void SelectSort(TELEBOOK temp[],int n)
{
int i=0,j=0,flag=0,indexmin,select;
char charflag[10];
TELEBOOK newinfo;
if(n<=0)
{ system("cls");
printf("\n=====>无号码记录,输入回车键返回!\n");
getchar();
return ;
}
system("cls");
Disp(temp,n); //显示排序前的所有记录
printf(" ==>1 按记录编号排序==>2 按姓名排序\n");
printf(" 请选择[1,2]:");
scanf("%d",&select);
if(select==1) //按记录编号排序
{
for(i=0;i<n-1;i++)
{
flag=32767;indexmin=0;
for(j=i;j<n;j++)
{ if(atoi(temp[j].num)<flag)
{ flag=atoi(temp[j].num);
indexmin=j;
}
}
strcpy(newinfo.num,temp[i].num); //利用结构变量newinfo实现数组元素的交换strcpy(,temp[i].name);
strcpy(newinfo.phonenum,temp[i].phonenum);
strcpy(newinfo.address,temp[i].address);
strcpy(temp[i].num,temp[indexmin].num);
strcpy(temp[i].name,temp[indexmin].name);
strcpy(temp[i].phonenum,temp[indexmin].phonenum);
strcpy(temp[i].address,temp[indexmin].address);
strcpy(temp[indexmin].num,newinfo.num);
strcpy(temp[indexmin].name,);
strcpy(temp[indexmin].phonenum,newinfo.phonenum);
strcpy(temp[indexmin].address,newinfo.address);
}
Disp(temp,n); //显示排序后的所有记录/
saveflag=1;
printf("\n =====>排序成功,输入回车键返回!\n");
getchar();
return;
}
else if(select==2)
{
for(i=0;i<n-1;i++)
{
charflag[0]=255;indexmin=0;
for(j=i;j<n;j++)
{ if(strcmp(temp[j].name,charflag)<0)
{ strcpy(charflag,temp[j].name);
indexmin=j;
}
}
strcpy(newinfo.num,temp[i].num); //利用结构变量newinfo实现数组元素的交换
strcpy(,temp[i].name);
strcpy(newinfo.phonenum,temp[i].phonenum);
strcpy(newinfo.address,temp[i].address);
strcpy(temp[i].num,temp[indexmin].num);
strcpy(temp[i].name,temp[indexmin].name);
strcpy(temp[i].phonenum,temp[indexmin].phonenum);
strcpy(temp[i].address,temp[indexmin].address);
strcpy(temp[indexmin].num,newinfo.num);
strcpy(temp[indexmin].name,);
strcpy(temp[indexmin].phonenum,newinfo.phonenum);
strcpy(temp[indexmin].address,newinfo.address);
}
Disp(temp,n); //显示排序后的所有记录
saveflag=1;
printf("\n =====>排序成功,输入回车键返回!\n");
getchar();
return;
}
else
{Wrong();
getchar();
getchar();
return;}
}
//数据存盘,若用户没有专门进行此操作且对数据有修改,在退出系统时,会提示用户存盘void Save(TELEBOOK temp[],int n)
{
FILE* fp;
int i=0;
fp=fopen("c:\\telephon.txt","w");//以写方式打开txt文件
if(fp==NULL) //打开文件失败
{
printf("\n=====>打开失败,请按回车键继续!\n");
getchar();
return ;
}
for(i=0;i<n;i++)
{
if(fwrite(&temp[i],sizeof(TELEBOOK),1,fp)==1)//每次写一条记录或一个结构数组元素至文件{
continue;
}
else
{
break;
}
}
if(i>0)
{
getchar();
printf("\n\n=====>保存成功,总共储存号码:%d条\n请按回车键继续",i);
getchar();
saveflag=0;
}
else
{system("cls");
printf("没有已经保存的电话号码,请按回车键继续!\n");
getchar();
}
fclose(fp); //关闭此文件
}
void main()
{
TELEBOOK tele[N]; //定义TELEBOOK结构体
FILE *fp; //文件指针
int select; //保存选择结果变量
char ch; //保存(y,Y,n,N)
int count=0; //保存文件中的记录条数(或元素个数)
fp=fopen("C:\\telephon.txt","a+");
//以追加方式打开文本文件C:\\telephon.txt,可读可写,若此文件不存在,则会创建此文件
if(fp==NULL)
{
printf("\n=====>打开失败!\n");
exit(0);
}
while(!feof(fp))
{
if(fread(&tele[count],sizeof(TELEBOOK),1,fp)==1) //一次从文件中读取一条电话记录count++;
}
fclose(fp); //关闭文件
printf("\n==>打开成功,总共电话信息记录是: %d条\n",count);
getchar();
menu();
while(1)
{
system("cls");
menu();
printf("\n 请输入选择(0~8):"); //显示提示信息
scanf("%d",&select);
if(select==0)
{
if(saveflag==1) //若对数组的数据有修改且未进行存盘操作,则此标志为1
{ getchar();
printf("\n==>是否保存已修改数据?(y/n):");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
Save(tele,count);
}
printf("\n===>感谢使用本系统!\n");
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; //按键有误,数值必须为0~8
}
}
}。