电话薄管理系统.docx
《电话薄管理系统.docx》由会员分享,可在线阅读,更多相关《电话薄管理系统.docx(28页珍藏版)》请在冰点文库上搜索。
电话薄管理系统
郑州轻工业学院
实训报告
实训名称:
电话薄管理系统
姓名:
院(系):
专业班级:
学号:
指导教师:
成绩:
时间:
实训报告:
一、需求分析
设计一个电话薄管理系统,实现通讯录管理工作的系统化,为人们的工作和生活提供便利。
二、功能描述
该系统具有输入、显示、查找、删除、插入、保存、读入、排序和退出等功能。
三、总体设计
设计思路:
(1)、输入模块。
主要完成将数据存入数组中的工作。
记录既可以从以文本格式存储的数据文件中读入,也可以从键盘逐个输入。
记录由于联系人有关的基本信息字段构成。
(2)、查询模块。
查询模块主要完成在数组中查找满足相关条件的记录。
用户可以按照联系人姓名或者联系人号码在数组中进行查找。
(3)、更新模块。
更新模块主要实现对记录的修改、删除、插入、和排序。
在进行更新操作只好,需要将修改的数据存入源数据文件。
(4)输出模块。
实现对记录的存盘,并以表格的形式将记录信息打印在屏幕上。
主控函数流程图:
程序实现:
在判断键值是,有效输入为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"//屏幕操作函数库
#defineHEADER1"--------------------------电话簿-----------------------------------\n"
#defineHEADER2"|编号|姓名|电话号码|地址|\n"
#defineHEADER3"|-----------|-------------|----------------|----------------------|\n"
#defineFORMAT"|%-8s|%-10s|%-11s|%-18s|\n"
#defineDATAp->num,p->name,p->phonenum,p->address
#defineEND"--------------------------------------------------------------------\n"
#defineN250
intsaveflag=0;//是否需要存盘的标志变量
//定义与职工有关的数据结构
typedefstructtelebook//标记为telebook
{
charnum[4];//记录编号
charname[10];//联系人姓名
charphonenum[15];//联系人电话号码
charaddress[20];//联系人地址
}TELEBOOK;
voidmenu()//主菜单
{
system("cls");//调用DOS命令,清屏.与clrscr()功能相同
system("color1a");
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()送格式化输出至文本窗口屏幕中
}
voidprintheader()//格式化输出表头
{
printf(HEADER1);
printf(HEADER2);
printf(HEADER3);
}
voidprintdata(TELEBOOKpp)//格式化输出表中数据
{
TELEBOOK*p;
p=&pp;
printf(FORMAT,DATA);
}
voidDisp(TELEBOOKtemp[],intn)//显示数组temp[]中存储的记录,内容为电话薄结构中定义的内容
{
inti;
if(n==0)//表示没有电话簿记录
{
printf("\n=====>无电话号码记录!
\n");
while(getchar()!
='\n')
continue;
printf("输入回车键继续");
getchar();
return;
}
printf("\n\n");
printheader();//输出表格头部
i=0;
while(i{
printdata(temp[i]);
i++;
printf(HEADER3);
}
while(getchar()!
='\n')
continue;
printf("输入回车键继续");
getchar();
}
voidWrong()//输出按键错误信息
{
printf("\n\n\n\n\n***********错误:
输入有误!
请按回车键继续!
**********\n");
getchar();
}
voidNofind()//输出未查找到此电话信息
{
printf("\n=====>没有相关记录,请按回车键继续!
\n");
}
//作用:
用于定位数组中符合要求的记录,并返回保存该记录的数组元素下标值
//参数:
findmess[]保存要查找的具体内容;nameorphonenum[]保存按什么在数组中查找
intLocate(TELEBOOKtemp[],intn,charfindmess[],charnameorphonenum[])
{
inti=0;
if(strcmp(nameorphonenum,"phonenum")==0)//按号码记录编号查询
{
while(i{
if(strcmp(temp[i].phonenum,findmess)==0)//若找到findmess值的号码记录编号
returni;
i++;
}
}
elseif(strcmp(nameorphonenum,"name")==0)//按号码记录姓名查询
{
while(i{
if(strcmp(temp[i].name,findmess)==0)//若找到findmess值的号码记录姓名
returni;
i++;
}
}
return-1;//若未找到,返回一个整数-1
}
//输入字符串,并进行长度验证(长度voidstringinput(char*t,intlens,char*notice)
{
charn[250];
do{
printf(notice);//显示提示信息
scanf("%s",n);//输入字符串
if(strlen(n)>lens)
printf("\n超出长度!
\n");//进行长度校验,超过lens值重新输入
}while(strlen(n)>lens);
strcpy(t,n);//将输入的字符串复制到字符串t中
}
//增加电话号码记录
intAdd(TELEBOOKtemp[],intn)
{
charch,num[10];
inti,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,则退出添加操作,返回主界面
{returnn;}
i=0;
while(i{
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
returnn;
}
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++;
}
returnn;
}
//按电话薄号码编号或姓名,查询记录
voidQur(TELEBOOKtemp[],intn)
{
intselect;//:
按编号查,2:
按姓名查,其他:
返回主界面
charsearchinput[20];//保存用户输入的查询内容
intp=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();
}
elseif(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();
}
//删除记录:
先找到保存该记录的数组元素的下标值,然后在数组中删除该数组元素
intDel(TELEBOOKtemp[],intn)
{
intsel;
charfindmess[20];
intp=0,i=0;
if(n<=0)
{
system("cls");
printf("\n=====>没有任何记录!
\n");
getchar();
returnn;
}
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{
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();
}
elseif(sel==2)//先按电话号码查询到该记录所在的数组元素的下标值
{
stringinput(findmess,15,"请输入存在的电话号码:
");
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=====>删除成功,输入回车键返回!
\n");
n--;
getchar();
saveflag=1;
}
else
Nofind();
getchar();
}
returnn;
}
//修改记录:
先按输入的电话编号查询到该记录,然后提示用户修改编号之外的值,编号不能修改
voidModify(TELEBOOKtemp[],intn)
{
charfindmess[20];
intp=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;
}
//插入记录:
按号码编号查询到要插入的数组元素的位置,然后在该编号之后插入一个新数组元素。
intInsert(TELEBOOKtemp[],intn)
{
charch,num[10],s[10];//s[]保存插入点位置之前的编号,num[]保存输入的新记录的编号
TELEBOOKnewinfo;
intflag=0,i=0,kkk=0;
system("cls");
Disp(temp,n);
while
(1)
{stringinput(s,10,"请输入要插入哪位编号之后:
");
flag=0;i=0;
while(i{
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
{returnn;}
}
}
//以下新记录的输入操作与Add()相同
while
(1)
{stringinput(num,10,"请输入要插入的编号:
");
i=0;flag=0;
while(i{
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
{returnn;}
}
else
break;
}
strcpy(newinfo.num,num);//将字符串num复制到newinfo.num中
stringinput(newinfo.name,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,newinfo.name);
strcpy(temp[kkk+1].phonenum,newinfo.phonenum);
strcpy(temp[kkk+1].address,newinfo.address);
n++;
Disp(temp,n);
printf("\n\n输入回车键返回");
getchar();
returnn;
}
//利用选择排序法实现数组的按记录编号或姓名的升序排序
voidSelectSort(TELEBOOKtemp[],intn)
{
inti=0,j=0,flag=0,indexmin,selec