计算机软件基础课程设计电话本.docx
《计算机软件基础课程设计电话本.docx》由会员分享,可在线阅读,更多相关《计算机软件基础课程设计电话本.docx(52页珍藏版)》请在冰豆网上搜索。
计算机软件基础课程设计电话本
电话簿管理系统课程设计报告
---------
编写人:
xxx
同组成员:
XXX(课程设计负责人)
XXX
完成日期:
2011-12-14
辅导教师:
XXX
批阅日期:
分数:
一、功能描述:
本电话簿主要由数组实现,由如下八个模块组成:
1、输入模块:
主要完成将通讯信息存入线性表的工作。
2、修改模块:
主要完成修改电话簿中的信息的工作。
3、插入模块:
主要完成插入新信息的工作。
4、删除模块:
主要完成删除不需要的信息的工作。
5、查询模块:
主要完成查找信息的工作。
6、输出模块:
主要完成在屏幕上显示信息的工作。
7、保存模块:
主要完成保存已经输入信息的工作。
8、文件读入模块:
主要完成从已保存的文档中读取信息的工作。
9、登录模块:
主要用于实现电话簿系统密码登录的功能。
结构示意图如下:
二、总体设计:
1、功能模块设计:
(1)、主函数执行流程:
分析:
本电话簿管理系统总的执行流程如图1所示!
判断键入数值时:
选择1:
执行输入函数,实现从键盘输入数据的功能;
选择2:
执行查找函数,实现在已输入的数据中查询特定信息的功能;
选择3:
执行修改函数,实现修改已输入数据中的某些信息的功能;
选择4:
执行输出函数,实现在屏幕上显示已输入的数据信息的功能;
选择5:
执行插入函数,实现在已输入数据基础上插入新的数据的功能;
选择6:
执行删除函数,实现删除某些已输入的数据的功能;
选择7:
执行存储函数,实现把已输入数据保存在文档中的功能;
选择8:
执行读入函数,实现从已保存的文档中读入数据的功能;
选择0:
表示退出系统,实现系统的安全退出。
(2)、输入模块流程:
分析:
本电话簿系统的信息输入功能由main()函数调用input输入函数完成,执行流程如图2!
由do-while结构完成其循环,开始先比较数组中实际数据长度和系统允许的最大长度,判断数组中的空间是否已满,若满则退出输入函数到主菜单,方便用户删除;若未满则提示让用户输入信息,输入完一条信息后进行一次判断,让用户选择是否继续输入,是则继续执行输入函数,否则退出输入到主菜单。
(3)、查找模块流程:
分析:
本电话簿系统的信息查询功能由main()函数调用seachname、seachtel、seachqq、seachadd等四个函数,分别实现由姓名查询、由电话查询、由qq查询、由地址查询等查询功能。
执行流程如图3!
可通过不同信息部分查询,选择不同查询方式,则输入相应的要查数据,通过for循环逐条比较输入信息与数组中已存信息,若有相同的,则输出相应的那条信息,否则退出循环到选择操作,可选择继续查询或者退出查询到主菜单。
(4)、修改模块流程:
分析:
本电话簿系统的信息修改功能由main()函数调用recompose修改函数完成,可分别修改姓名、电话、QQ、地址等。
用户输入要查询的姓名,通过for循环逐条比较输入信息与数组中已存信息,若有相同的,则提示并选择要修改信息的相应部分,直接输入新信息;若找不到相应信息或执行完上一次修改,则进入选择操作,可选继续修改操作或回到主菜单。
(5)、输出模块:
本电话簿系统的信息输出功能由main()函数调用output输出函数完成。
由for循环逐条将已输入的信息显示在屏幕上。
流程:
开始→输出信息→结束输出操作
(6)、插入模块流程:
分析:
本电话簿系统的信息插入功能是由main()函数调用Insert插入函数完成执行的,流程如图5!
用户输入要插入的新信息,输入要在哪个名字后插入信息,for循环逐条查询该名字是否存在,若在,则将其向后复制一位,并把新信息插入其原来位置;否则把新信息存放在最后位置。
信息数加一,完成插入操作,进入选择操作,可选继续插入操作或回到主菜单。
(7)、删除模块流程:
分析:
本电话簿系统的信息删除功能是由main()函数调用desl删除函数完成的,流程如图6。
用户输入要删除信息的名字,for循环查找该信息,若找到相同的,则把该条信息后的信息向前复制,覆盖掉原信息,完成删除。
若没找到或已完成删除操作,则进入选择操作,可选继续删除或退出删除进入主界面菜单。
(8)、存储模块流程:
分析:
本电话簿系统的信息保存功能是由main()函数调用WriteToFile信息保存函数实现的,简易流程如图7!
程序试图创建一个tel.txt文档,之后打开该文档,若成功打开则说明文档创建成功,则for循环逐条把数组中的信息存入到该文档中,信息存储成功;否则说明文档创建失败。
不管是信息保存成功或是保存失败,结束保存操作,退回到主菜单。
(9)、文件读取模块流程:
分析:
本电话簿系统的信息读取功能是由main()函数调用ReadFromFile函数实现的,简易流程如图8,。
程序试图打开tel.txt文档,判断是否存在该文档,若存在,则把文档中的信息逐条输入到数组中,文件读取成功;若不存在,提示文件读取失败。
不管文件读取成功或是读取失败,都结束文件读入操作,退回到主菜单。
2、数据结构设计:
(1)电话簿信息数据结构体:
structADDRESS//定义数据结构
{charname[20];//姓名
chartel[20];//电话
charqq[11];//QQ号
charadd[20];//地址
}DHB[10];
(2)、
2、函数功能描述:
(1)、输入:
input
函数原型:
voidinput(structADDRESSDHB[])//输入函数
{
intc;
do{
if(q==MAX)//比较实际信息数与允许加入的最大信息数,若两者相等,则说明空间已满
{
printf("\n信息储存已满,需要删除其中的一些信息,才能执行输入操作!
\n");
return;
}
printf("输入机主的姓名:
");//输入机主的姓名
scanf("%s",&DHB[q].name);
printf("输入机主的电话:
");//输入机主的电话
scanf("%s",&DHB[q].tel);
printf("输入机主的QQ:
");//输入机主的qq
scanf("%s",&DHB[q].qq);
printf("输入机主的地址:
");//输入机主的地址
scanf("%s",&DHB[q].add);
q++;
printf("想继续执行输入操作请按1(否则按其它数字):
");//提示信息
scanf("%d",&c);
}
while(1==c);
}
参数含义:
ADDRESS:
用户定义的数据结构
DHB[]:
用户定义的数组,用于存放信息
(2)、查询:
(a)、seachname
函数原型:
voidseachname(structADDRESSDHB[])//按姓名查询
{
inti;
charname[20];//要查询的姓名
printf("输入要查询的姓名:
");//提示信息
scanf("%s",name);
for(i=0;i{
if(strcmp(name,DHB[i].name)==0)//输入的姓名和待比较的姓名是否相等
break;
}
if(i>q-1)//如果i>q-1超过了数组的长度
printf("没有找到要查询的信息!
\n");//显示没找到要查询的记录
else
printf("姓名:
%-15s电话:
%-12sQQ:
%-12s住址:
%-15s\n",DHB[i].name,DHB[i].tel,DHB[i].qq,DHB[i].add);//显示出查询的结果
}
参数含义:
ADDRESS:
用户定义的数据结构
DHB[]:
用户定义的数组,用于存放信息
(b)、seachtel
函数原型:
voidseachtel(structADDRESSDHB[])//按电话查询
{
inti;
chartel[20];//要查询的姓名
printf("输入要查询的电话:
");//提示信息
scanf("%s",tel);
for(i=0;i{
if(strcmp(tel,DHB[i].tel)==0)//输入的电话和待比较的电话是否相等
break;
}
if(i>q-1)//如果i>q-1超过了数组的长度
printf("没有找到要查询的信息!
\n");//显示没找到要查询的记录
else
printf("姓名:
%-15s电话:
%-12sQQ:
%-12s住址:
%-15s\n",DHB[i].name,DHB[i].tel,DHB[i].qq,DHB[i].add);//显示出查询的结果
}
参数含义:
ADDRESS:
用户定义的数据结构
DHB[]:
用户定义的数组,用于存放信息
(c)、seachqq
函数原型:
voidseachqq(structADDRESSDHB[])//按qq查询
{
inti;
charqq[20];//要查询的qq
printf("输入要查询的qq:
");//提示信息
scanf("%s",qq);
for(i=0;i{
if(strcmp(qq,DHB[i].qq)==0)//输入的qq和待比较的qq是否相等
break;
}
if(i>q-1)//如果i>n-1超过了数组的长度
printf("没有找到要查询的信息!
\n");//显示没找到要查询的记录
else
printf("姓名:
%-15s电话:
%-12sQQ:
%-12s住址:
%-15s\n",DHB[i].name,DHB[i].tel,DHB[i].qq,DHB[i].add);//显示出查询的结果
}
参数含义:
ADDRESS:
用户定义的数据结构
DHB[]:
用户定义的数组,用于存放信息
(d)、seachadd
函数原型:
voidseachadd(structADDRESSDHB[])//按地址查询
{
inti;
charadd[20];//要查询的地址
printf("输入要查询的地址:
");//提示信息
scanf("%s",add);
for(i=0;i{
if(strcmp(add,DHB[i].add)==0)//输入的地址和待比较的姓名是否相等
break;
}
if(i>q-1)//如果i>n-1超过了数组的长度
printf("没有找到要查询的信息!
\n");//显示没找到要查询的记录
else
printf("姓名:
%-15s电话:
%-12sQQ:
%-12s住址:
%-15s\n",DHB[i].name,DHB[i].tel,DHB[i].qq,DHB[i].add);//显示出查询的结果
}
参数含义:
ADDRESS:
用户定义的数据结构
DHB[]:
用户定义的数组,用于存放信息
(3)、修改:
recompose
函数原型:
voidrecompose(structADDRESSDHB[])//修改函数
{
intc;
do{
inti,a;
charname[20];//要修改记录的名字
printf("输入要修改机主的姓名:
");//提示信息
scanf("%s",name);
for(i=0;i{
if(strcmp(name,DHB[i].name)==0)//比较输入要修改的姓名与已输入的姓名
break;
}
if(i>q-1)//如果i>q-1超过了数组的长度
printf("没有找到要修改的信息!
\n");//显示没找到要删除的记录
else
{
{
printf("修改姓名请按1:
\n");//提示信息
printf("修改电话请按2:
\n");//提示信息
printf("修改qq请按3:
\n");//提示信息
printf("修改地址请按4:
\n");//提示信息
printf("请选择(1~4):
");//提示信息
scanf("%d",&a);
if(a==1)
{
printf("输入新的姓名:
\n");//输出机主的姓名
scanf("%s",&DHB[i].name);
}
if(a==2)
{
printf("输入新的电话:
\n");//输出机主的电话
scanf("%s",&DHB[i].tel);
}
if(a==3)
{
printf("输入新的qq:
\n");//输出机主的qq
scanf("%s",&DHB[i].qq);
}
if(a==4)
{
printf("输入新的地址:
\n");//输出机主的地址
scanf("%s",&DHB[i].add);
}
}
}
printf("如果想继续执行修改操作请按1(否则按其它数字):
");//提示信息
scanf("%d",&c);
}
while(1==c);
}
参数含义:
ADDRESS:
用户定义的数据结构
DHB[]:
用户定义的数组,用于存放信息
(4)、输出:
output
函数原型:
voidoutput(structADDRESSDHB[])//输出函数
{
inti;
for(i=0;iprintf("姓名:
%-15s电话:
%-12sQQ:
%-12s住址:
%-15s\n",DHB[i].name,DHB[i].tel,DHB[i].qq,DHB[i].add);//输出通讯录的信息
}
参数含义:
ADDRESS:
用户定义的数据结构
DHB[]:
用户定义的数组,用于存放信息
(5)、插入:
Insert
函数原型:
voidInsert(structADDRESSDHB[],charname[])//插入函数,参数为结构体数组和记录数
{
intc;
do{
structADDRESStemp;//新插入记录信息
charname[15];//要插入的名字
inti=1,j;
{
printf("输入要插入的姓名:
");//输入机主的姓名
scanf("%s",temp.name);
printf("输入要插入的电话:
");//输入机主的电话
scanf("%s",temp.tel);
printf("输入要插入的QQ:
");//输入机主的qq
scanf("%s",temp.qq);
printf("输入要插入的地址:
");//输入机主的地址
scanf("%s",temp.add);
}
printf("请输入到那个名字之前:
\n");//提示信息
scanf("%s",name);//输入姓名
for(i=0;i{
if(strcmp(name,DHB[i].name)==0)//比较输入的与实际信息是否相同
break;
}
if(i>q-1)//如果i>q-1超过了数组的长度
printf("没有找到要插入的位置!
\n");//显示没找到要插入的位置
else
{
printf("姓名:
%-15s电话:
%-12sQQ:
%-12s住址:
%-15s\n",DHB[i].name,DHB[i].tel,DHB[i].qq,DHB[i].add);//显示出插入的位置
for(i=0;i{
if(strcmp(name,DHB[i].name)==0)//输入的姓名和待比较的姓名是否相等
break;
}
for(j=q-1;j>=i;j--)
{
strcpy(DHB[j+1].name,DHB[j].name);//当前记录的机主姓名拷贝到后一条
strcpy(DHB[j+1].tel,DHB[j].tel);//当前记录的机主电话拷贝到后一条
strcpy(DHB[j+1].qq,DHB[j].qq);//当前记录的机主qq拷贝到后一条
strcpy(DHB[j+1].add,DHB[j].add);//当前记录的机主地址拷贝到后一条
}
{
strcpy(DHB[j+1].name,temp.name);//当要插入的机主姓名拷贝到j+1位置
strcpy(DHB[j+1].tel,temp.tel);//当要插入的机主电话拷贝到j+1位置
strcpy(DHB[j+1].qq,temp.qq);//当要插入的机主qq拷贝到j+1位置
strcpy(DHB[j+1].add,temp.add);//当要插入的机主地址拷贝到j+1位置
}
q++;//记录数加
printf("插入成功");//提示信息
}
printf("\n如果想继续执行添加操作请按1(否则按其它数字):
");//提示信息
scanf("%d",&c);
}
while(1==c);
}
参数含义:
ADDRESS:
用户定义的数据结构
DHB[]:
用户定义的数组,用于存放信息
(6)、删除:
desl
函数原型:
voiddesl(structADDRESSDHB[],charname[])//删除函数
{
intc;
do{
charname[15];
inti,j;
printf("请输入删除的名字:
\n");//提示信息
scanf("%s",name);//输入姓名
for(i=0;i{
if(strcmp(name,DHB[i].name)==0)//输入的姓名和待比较的姓名是否相等
break;
}
if(i>q-1)//如果i>q-1超过了数组的长度
printf("没有找到要删除的信息!
\n");//显示没找到要删除的记录
else
{
printf("姓名:
%-15s电话:
%-12sQQ:
%-12s住址:
%-15s\n",DHB[i].name,DHB[i].tel,DHB[i].qq,DHB[i].add);//输出机主的信息
for(j=i+1;j{
strcpy(DHB[j-1].name,DHB[j].name);//将后一条记录的姓名拷贝到前一条
strcpy(DHB[j-1].tel,DHB[j].tel);//将后一条记录的电话拷贝到前一条
strcpy(DHB[j-1].qq,DHB[j].qq);//将后一条记录的qq拷贝到前一条
strcpy(DHB[j-1].add,DHB[j].add);//将后一条记录的地址拷贝到前一条
}
q--;//记录数减1
printf("删除成功!
\n");
}
printf("如果想继续执行删除操作请按1(否则按其它数字):
");//提示信息
scanf("%d",&c);
}
while(1==c);
}
参数含义:
ADDRESS:
用户定义的数据结构
DHB[]:
用户定义的数组,用于存放信息
(7)、储存:
WriteToFile
函数原型:
intReadFromFile(structADDRESSDHB[])//读入函数
{
FILE*fp;//指向文件fp
inti;
if((fp=fopen("tel.txt","r"))==NULL)//判断是否存在需要打开的文件
{
printf("电话簿不存在,需重新建立!
\n");//提示信息
return0;
}
for(i=0;!
feof(fp);i++)
fread(&DHB[i],sizeof(structADDRESS),1,fp);//把文件中的信息读入到数组中
fclose(fp);
printf("信息读取成功!
\n");//提示信息
returni-1;
}
参数含义:
ADDRESS:
用户定义的数据结构
DHB[]:
用户定义的数组,用于存放信息
(8)、读取:
ReadFromFile
函数原型:
voidWriteToFile(structADDRESSDHB[])//信息保存函数
{
FILE*fp;//指向文件fp
inti;
if((fp=fopen("tel.txt","w+"))==NULL)//判断是否存在文件若不存在则新建
{
printf("不能打开文件!
\n");//提示信息
return;
}
for(i=0;iif(fwrite(&DHB[i],sizeof(structADDRESS),1,fp)!
=1)//将数组中信息读入到所创建的文件中
{
printf("写入文件错误!
\n");//提示信息
}
fclose(fp);
printf("文件保存成功!
\n");
}
参数含义:
ADDRESS:
用户定义的数据结构
DHB[]:
用户定义的数组,用于存放信息
三、程序实现:
源代码分析:
(1)、程序预处理:
#include
#include
#include
#include
#include
#defineMAX50//自定义结构体
structADDRESS//定义数据结构
{charname[20];//姓名
chartel[20];//电话
charqq[11];//QQ号
charadd[20];//地址
}DHB[10];
intq=0,c=0;//初始化q
分析:
加载头文件,定义数据结构体,定义数组,定义各个变量并初始化。
(2)、主函数:
voidmain()
{
inti,c;
charname[20];
system("colorE0");//确定字幕及字体的颜色
//-------------------实现登录功能-------------------
{
charszUser[20]={0};
char*PUser="user";//设置用户名
char*Pword="1234";//设置密码
charchPwd[5];
intflag_u=0,j=0,flag_p=0;
while(flag_u==0||flag_p==0)
{
j=0;
printf("