程序设计语言课程设计通讯录.docx
《程序设计语言课程设计通讯录.docx》由会员分享,可在线阅读,更多相关《程序设计语言课程设计通讯录.docx(17页珍藏版)》请在冰豆网上搜索。
程序设计语言课程设计通讯录
程序设计语言课程设计报告
通讯录
1.添加
2.查询
3.删除
4.修改
5.排序
6.输出全部信息
7.写入文件
8.读取文件
0.退出
程序的主界面
1课程设计目的和要求
1.1设计要求:
基本功能:
a)添加个人信息
b)查询个人信息
c)删除个人信息
d)修改个人信息
e)信息排序
f)输出全部信息
拓展功能:
采用文件形式对通讯录进行操作,包括:
g)写入文件
h)读取文件
创新(自拟)功能:
程序实现的其它功能由个人自拟。
1.2设计要求具体说明
通讯录至少应该有以下数据项:
姓名,家庭住址,手机号码,邮编,E-mail。
输入信息时要检查数据项手机、邮编、E-mail的合法性,手机号码:
11位数字;邮编:
6位数字;E-mail:
包含@字符,且@两边都非空。
对通讯录应该包含有以下操作(包括基本功能和拓展功能):
a)向通讯录中添加信息;
b)在通讯录中按姓名或手机号查找个人信息;
c)删除通讯录中的个人信息;
d)修改通讯录中的个人信息,并保存入文件;
e)按不同数据项排序后列表输出通讯录中所有人的信息。
通讯录中记录的数量没有限制。
f)将通讯录中的数据写入文件和从文件读入数据。
程序启动时先从文件读入数据,如果文件中没有数据则给出提示;写入文件时有两种方式,一为覆盖所有原有的内容;二为只将本次操作所修改的个人信息写入文件
g)程序启动时先从文件读入数据,如果文件中没有数据则给出提示退出程序。
1.3设计提示
定义合适的结构体类型,使用链表或数组的方式组织数据。
2通讯录概述
通讯录包括能够实现添加、查询、删除、修改、排序、输出全部信息以及写入文件、读取文件。
这里的学生通讯记录为姓名、家庭地址、手机号码、邮箱、邮编。
2.1程序的基本功能
a)添加个人信息
b)查询个人信息
c)删除个人信息
d)修改个人信息
e)信息排序
f)输出全部信息
2.2拓展功能:
g)写入文件
h)读取文件
3通讯录的分析
通讯录程序分析如结构图所示。
3.1主程序
定义结构体数组,使用循环,让程序能够通过选择进行各种操作。
3.2(主界面)输入学生信息
输入学生的姓名、手机号码、家庭地址、邮箱、邮编。
每次输入学生信息时判断其合法性。
根据要求进入主菜单,并选择其相应的选项(1、显示2、查询3、删除4、插入5、排序6、保存7、退出)进行运行
3.3写入文件
将所输入的信息以二进制方式存入文件,需输入所选择的文件所在全路径。
3.4读取文件
读取文件并在屏幕上打印文件所储存的信息,需输入所选择的文件所在全路径。
3.5退出
退出系统。
4通讯录详细设计
通讯录设计分为两个部分:
一、主函数;二、功能函数。
此次设计使用结构体数组的方式编写,定义结构体数组,链表,全局变量,主函数,功能函数。
#include
#include//主要有malloc,calloc,free,realloc函数时
#include//在运用字符串处理函数时
#include//定义结构体
typedefstructstudent//用typedef制定类型名FILE
{
charphonenum[15],name[20],add[35],email[10],postcode[35];
}elemtype;//定义结点或指定新类型名为elemtype
structnode
{
elemtypedata;node*next;
};//定义整体变量
charPRINT='0',DESE='0',SEARCH='0',C;
//PRINT=='Y'表示显示所有时的标志,作为控制空格之用
//SEARCH=='N'表示在通讯录中没找到相应的信息
//DESE=='D'表示使用删除功能时要输出的提示语
//DESE=='S'表示使用查询功能时要输出的提示语
//子函数
voidbeginmenu();//开始菜单
voidmodmenu();//模式选择
voidimportmenu();//菜单--导入文件
voidreadfromfile();//文件导入
voidcreatesl();//产生一个单链表
voidmainmenu();//主菜单选择
voidshowall();//输出单链表
voidsearchmemu();//查询菜单
node*searchnum();//按序号查询
node*searchbynpa();//按名字、电话号码、地址、邮箱、邮编查询
voiddeletemenu();//删除菜单
voiddeletebynpan();//按名字、电话号码、地址、序号、邮箱、邮编删除
voiddeleteall();//删除所有信息
voidinsertmenu();//插入菜单----插入一条信息(按序号插入)
voidlistmenu();//排序菜单
voidsavemenu();//菜单--保存到文件
voidwritetofile();//写入文件
voidexitmenu();//退出菜单选择
用户界面如图所示:
%%%%%%欢迎使用通讯录%%%%%%
***********************************
***********************************
是否导入已有文件TXT.txt--Y/N--
-
文本框4.1用户操作界面
4.1主程序
先定义结构体数组后,用switch循环实现菜单选择。
4.2输入学生信息
输入姓名、手机号码(11位)、地址、邮箱、邮编(6位),而每次输入的学生信息使用do......whlie判断其合法性。
下面举例:
voidpread(elemtype*x)//fread要设置输入4个信息,而pread可直接读取其中内容
{
printf("\t请输入学生的内容:
\n\n");
printf("----------姓名:
");
scanf("%s",x->name);
do
{
printf("----------手机号码(11位):
");
scanf("%s",x->phonenum);
}while(strlen(x->phonenum)!
=11);
printf("----------地址:
");
scanf("%s",x->add);
printf("----------邮箱:
");
scanf("%s",x->email);
do
{
printf("----------邮编(6位):
");
scanf("%s",x->postcode);
}while(strlen(x->postcode)!
=6);
fflush(stdin);//清空缓存
};
4.3显示、查询、删除、插入、排序学生通讯录信息
显示、查询、删除、插入、排序学生通讯录信息的函数结构相似,放在一起来说明。
输入学生的姓名、手机号码、地址、邮箱、邮编,用do{……}while()确保选择正确,使用switch循环,可以按姓名,手机号码,地址,邮箱,邮编查询(删除、插入、排序)。
下面是以查询方式为例的举例:
//查询菜单
voidsearchmenu(node*h)
{
DESE='S';//表示使用查询功能时要输出的提示语
if(h->next==NULL)
{
printf("\n\n\n\t\t通讯录为空!
!
!
");
getch();
printf("\n\t\t");return;
}
printf("\n\n\t\t[查询]");
printf("\n\t\t1--按名字查询2--按手机号码查询");
printf("\n\t\t3--退出查询");
get_C();
printf("\n");
switch(C)
{
case'1':
case'2':
searchbynpa(h,C);break;
case'3':
printf("\n\t\t");return;
default:
error();searchmenu(h);break;
}
DESE='0';
}
删除前的通讯录为:
[通讯录]
序号姓名手机号码地址邮箱邮编
1zhang11111111111shanghai111111111@123456123456
共1信息
请输入:
zhang
删除后的通讯录为空
请按任意键进入主菜单...
4.4写入文件、读取文件、保存文件和退出
写入文件:
定义文件指针,让用户输入储存信息的文件全路径,打开文件(打开文件时,须判断文件是否存在,但因为是写入文件,所以会直接生成一个新文件,但如果原文件已存在,则会在上一次写入后的末尾接下去写),写入信息,关闭文件。
读取文件:
定义文件指针,让用户输入储存信息的文件全路径,打开文件(打开文件时,须判断文件是否存在,若原文件不存在则打印找不到的字样),
//从文件导入
voidreadfromfile(node**h)
{
FILE*fp;//定义文件型指针变量
inti=0;
if((fp=fopen("TXL.txt","r"))==NULL)//打开输入文件TXL.txt
{
printf("\n\n\t\t通讯录文件不存在");
if((fp=fopen("TXL.txt","w"))==NULL)//打开输出文件
{
printf("\n\n\t\t建立失败");
exit(0);//终止程序
}
else
{
printf("\n\n\t\t通讯录文件已建立");
printf("\n\n\t\t按任意键开始创建通讯录");
getch();
*h=NULL;
return;
}
}
fseek(fp,0,2);//文件位置指针从文件开始移动到文件末尾
if(ftell(fp)>0)//文件不为空
{
node*p,*k;
elemtypex;
rewind(fp);//使文件位置指针重新置于文件开头
fscanf(fp,"%s\n",x.name);
fscanf(fp,"%s\n",x.phonenum);
fscanf(fp,"%s\n",x.add);
fscanf(fp,"%s\n",x.email);
fscanf(fp,"%s\n",x.postcode);
*h=(node*)malloc(sizeof(node));
k=(node*)malloc(sizeof(node));
*h=k;
while(!
feof(fp))//feof(of)将文件指针重新指向一个流的开头
{
p=(node*)malloc(sizeof(node));//在内存的动态存储区中分配一块长度为"size"字节的连续区域。
函数的返回值为该区域的首地址。
fscanf(fp,"%s\n",p->data.name);
fscanf(fp,"%s\n",p->data.phonenum);
fscanf(fp,"%s\n",p->data.add);
fscanf(fp,"%s\n",p->data.email);
fscanf(fp,"%s\n",p->data.postcode);
k->next=p;
k=p;
p->next=NULL;
p=p->next;//使p指向下一个结点
}
printf("\n\n\t\t文件导入成功");
printf("\n\n\t\t按任意键进入模式选择");
getch();
return;
}
printf("\n\n\t\t文件导入成功");
printf("\n\n\t\t通讯录文件中无任何纪录");
printf("\n\n\t\t按任意键开始创建通讯录");
*h=NULL;
fclose(fp);
getch();
return;
}
这里使用了while(!
feof(fp))判断,使读入数据时避免读入乱码信息,当与文件结束时,feof(fp)=1,!
feof(fp)=0时就不再执行while循环。
而在fread后面加入if(feof(fp))的判断也是此用意。
最后m=f是为了下次输入时,能在文件后面继续写入而加的,因为每次使用结束之后m值会变化。
5通讯录程序设计总结
5.1完成情况
1.本上已经完成基本功能,拓展功能。
并进行适当的运行,运行情况良好。
2.于时间的原因,还没有更加完善本次通讯录的设计程序。
3.能正确的判断邮箱的正确性,导致输出时出现乱码。
4.让用户任意选择按姓名,手机号码,地址,邮箱,邮编进行排序,排序可以使用冒泡排序法和指针实现。
本程序中使用的是冒泡指针法排序。
5.果可以,希望能在程序中添加更多的学生信息,如学生的各科成绩等。
5.2遇到的问题及解决
1.对手机号码,邮编的位数进行判断时出错,经过不断地运行与实验,解决了此问题,用do…..while循环结构进行判断。
2.strlen(phonenum)!
=11错误的,应为Strlen(x->phonenum)!
=11
3.数组不可>或<
4.strcpy()用于字符串,int只需赋值
5.Break;是跳出循环
6.两重循环不用同一变量
7.NULL表示“空地址”
6程序清单
#include
#include//主要有malloc,calloc,free,realloc函数时
#include//在运用字符串处理函数时
#include//定义结构体
typedefstructstudent//用typedef制定类型名FILE
{
charphonenum[15],name[20],add[35],email[10],postcode[8];
}elemtype;//定义结点或指定新类型名为elemtype
structnode
{
elemtypedata;node*next;
};//定义整体变量
charPRINT='0',DESE='0',SEARCH='0',C;
//PRINT=='Y'表示显示所有时的标志,作为控制空格之用
//SEARCH=='N'表示在通讯录中没找到相应的信息
//DESE=='D'表示使用删除功能时要输出的提示语
//DESE=='S'表示使用查询功能时要输出的提示语
//子函数
voidbeginmenu();//开始菜单
voidmodmenu();//模式选择
voidimportmenu();//菜单--导入文件
voidreadfromfile();//文件导入
voidcreatesl();//产生一个单链表
voidmainmenu();//主菜单选择
voidshowall();//输出单链表
voidsearchmemu();//查询菜单
node*searchnum();//按序号查询
node*searchbynpa();//按名字、电话号码、地址、邮箱、邮编查询
voiddeletemenu();//删除菜单
voiddeletebynpan();//按名字、电话号码、地址、序号、邮箱、邮编删除
voiddeleteall();//删除所有信息
voidinsertmenu();//插入菜单----插入一条信息(按序号插入)
voidlistmenu();//排序菜单
voidsavemenu();//菜单--保存到文件
voidwritetofile();//写入文件
voidexitmenu();//退出菜单选择
7参考文献
XX知道,XX文献,XX空间,c语言大全,c语言程序设计教程