资源描述
综合实验报告
( 2013-- 2014年度第1学期)
实验名称: C语言课程设计
题 目: 电话簿管理
院 系:计算机科学与技术系
班 级: 计算1301班
组长学号:
组长姓名:
成员学号:
成员姓名:
指导教师:
设计周数: 2 周
成 绩:
日期:2014年2月 1 日
C语言课程设计报告
题目名称:电话簿管理
一、课程设计目的:
1.进一步掌握和利用C语言进行行程设计的能力;
2.进一步理解和运用结构化程序设计的思想和方法;
3.初步掌握开发一个小型实用系统的基本方法;
4.学会调试一个较长程序的基本方法;
5.学会利用流程图表示算法;
6.掌握书写程序设计开发文档的能力(书写课程设计报告)。
二、题目描述
电话簿管理系统是日常生活中帮助人们解决记忆众多人信息困难的问题的,可以进行添加,修改,删除个人信息的程序。是简单实用的程序。
三、功能分析
能建立、修改和增删学生通讯录
具有群组工能,可以增加群组和记录。
删除可以删除一条、一个群组、全部记录。
查询包含模糊查询。
显示可以以页面和列表方式显示。
开始输出功能选择画面
有自动排序的功能。
四、系统设计
1.程序总体结构
输入序号进入相应功能
根据不同功能的提示语进行操作
结束
2.界面设计
4.函数清单
int start();
输出开始界面
void delete_record();
删除记录的函数
void input();
输入记录的函数
void sort(char *fname);
按姓名首字母自动排序的函数
void display();
显示记录函数
void clear();
此函数是清除scanf输入时残留的输入
void change();
更改记录函数
int read(FILE *fx);
将磁盘中的数据读到内存中的函数
void save(FILE *fp,int a);
保存到磁盘文件的函数
void build();
创建群组的函数
void find();
查找记录函数
五、源程序
整个电话簿管理应用程序由1个源文件组成,是adress book.cpp源程序见附录一。
六、测试
1、测试各功能是否可以进入
2、分别测试各个功能是否可以实现
3、写入多组记录,反复测试,看是否出现问题。
七、参考文献
附录(程序、测试数据等)
1、 程序
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
struct student{ /*定义通讯录成员属性*/
char name[20];
char phone[20];
char age[20];
char post[20];
}stu[100];
int start(); //输出开始界面//
void input(); //添加记录函数
void display(); //显示记录函数
void change(); //更改记录函数
void save(FILE *fp,int a); //保存到磁盘文件的函数
void find(); //查找记录函数
void delete_record(); //删除记录的函数
void sort(char *fname); //按姓名首字母自动排序的函数
void clear(); //这里调了我好长时间,问了好多人才知道,此函数是清除scanf输入时残留的输入(回车)
int read(FILE *fx); //将磁盘中的数据读到内存中的函数
void build();
void main()
{
for(;;)
{
switch(start())
{
case 0:printf("\n\n\t-----------------------------谢谢使用-----------------------------\n");
exit(0);
break;
case 1:input();break;
case 2:display();break;
case 3:delete_record();break;
case 4:find();break;
case 5:change();break;
case 6:build();break;
}
printf("\n\n\n\n\t\t----------接下来您可以进行其他项的操作---------\n");
system("pause");
}
}
void save(FILE *fp,int a)
{
int b=0;
for(b;b<=a;b++)
{
fprintf(fp,"%s\n%s\n%s\n%s\n",stu[b].name,stu[b].phone,stu[b].age,stu[b].post);
}
fclose(fp);
}
void sort(char *fname)
{
FILE *fl;
int x,k,p,y;
struct student t;
if((fl=fopen(fname,"a+"))==NULL)
{
printf("文件加载失败!!");
exit(1);
}
x=read(fl);
remove(fname); //用r+模式写文件,不能实现覆盖,所以此方法,先读到内存,在删除该文件,最后处理过的数据在存入文件,以实现覆盖原数据
fl=fopen(fname,"a+");
for(k=0;k<x-1;k++)
{
p=k;
for(y=p+1;y<x;y++)
if(stu[y].name[0]<stu[p].name[0])
p=y;
t=stu[p];
stu[p]=stu[k];
stu[k]=t;
}
for(k=0;k<=x;k++)
{
fprintf(fl,"%s%s%s%s",stu[k].name,stu[k].phone,stu[k].age,stu[k].post);
}
fclose(fl);
}
int read(FILE *fx)
{
int x;
for(x=0;x<100;x++)
{
if(fgets(stu[x].name,20,fx)==NULL)
break;
fgets(stu[x].phone,20,fx);
fgets(stu[x].age,20,fx);
fgets(stu[x].post,20,fx);
}
fclose(fx);
return x;
}
void clear()
{
char junk[100];
gets(junk);
}
int start()
{
int n;
printf("\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 │ 6. 创建分组 │\n");
printf("\t\t\t │ 0. 退出程序 │\n");
printf("\t\t\t └───────┘\n");
printf("\t\t\t 请您选择(0-6):");
loop:scanf("%d",&n);
if(!(0<=n&&n<=6))
{
printf("输入错误,请重新输入! 请您选择(0-4):");
goto loop;
}
return n;
}
void input()
{
char filename[10];
int a;
char b;
FILE *fp;
printf("\n\n\t\t----------添加成员到通讯录-------------\n\n\n添加方式:1、添加到默认分组 2、添加到指定分组\n请选择:");
scanf("%d",&a);
if(a==1)
{
if((fp=fopen("mr.txt","a+"))==NULL)
{
printf("文件加载失败!!");
exit(1);
}
for(a=0;;a++)
{
printf("\t\t添加第%d个新成员:\n\n",a+1);
printf("\t\t输入姓名:");
scanf("%s",stu[a].name);
printf("\n\t\t输入手机号码:");
scanf("%s",stu[a].phone);
printf("\n\t\t输入年龄:");
scanf("%s",stu[a].age);
printf("\n\t\t输入邮编:");
scanf("%s",stu[a].post);
printf("第%d个添加完成,是否继续添加(Y/N)",a+1);
clear();
b=getchar();
if(b!='y')
break;
}
save(fp,a);
sort("mr.txt");
printf("\n保存成功!!");
}
else
{ printf("请输入你要添加到的分组名称");
clear();
gets(filename);
if((fp=fopen(filename,"a+"))==NULL)
{
printf("\n文件加载失败!!");
exit(1);
}
for(a=0;;a++)
{
printf("\t添加第%d个新成员:\n",a+1);
printf("\t\t输入姓名:");
scanf("%s",stu[a].name);
printf("\n\t\t输入手机号码:");
scanf("%s",stu[a].phone);
printf("\n\t\t输入年龄:");
scanf("%s",stu[a].age);
printf("\n\t\t输入邮编:");
scanf("%s",stu[a].post);
printf("第%d个添加完成,是否继续添加(Y/N)",a+1);
clear();
b=getchar();
if(b!='y')
break;
}
save(fp,a);
sort(filename);
printf("\n保存成功!!");
}
}
void display()
{
int x,k;
char filename[10];
FILE *fq;
printf("\n\n\t\t---------------下面您可以显示您想要看到的记录---------------\n\n\n输入您希望显示的群组名称,想要打开默认组请输入“mr.txt”");
clear();
gets(filename);
if((fq=fopen(filename,"r"))==NULL)
{
printf("\n文件加载失败,请重新打开程序!!");
exit(1);
}
x=read(fq);
for(k=0;k<x;k++)
{
printf("姓名:%s\n手机号:%s\n年龄:%s\n邮编:%s\n\n",stu[k].name,stu[k].phone,stu[k].age,stu[k].post);
}
}
void find()
{
int x,y,m;
char filename[10],str[20];
FILE *fl;
printf("\n\n\t\t------------下面你可以查询通讯录中的信息---------------\n\n\n请输入您要查询的组别名称:(默认分组请输入mr.txt)");
clear();
gets(filename);
if((fl=fopen(filename,"r"))==NULL)
{
printf("\n文件加载失败,请重新打开程序!!");
exit(1);
}
x=read(fl);
printf("\t\n请选择查询方式:\n");
printf("\t┌──────┐\n");
printf("\t│1------姓名 │\n");
printf("\t│2------电话 │\n");
printf("\t│3------邮编 │\n");
printf("\t│4------返回 │\n");
printf("\t└──────┘\n");
printf("请选择:");
scanf("%d",&m);
clear();
if(m==1)
{
printf("\n请输入姓名:");
gets(str);
printf("以下是您可能需要的结果:\n");
for(y=0;y<x;y++)
{
if(strstr(stu[y].name,str)!=NULL)
printf("姓名:%s手机号:%s年龄:%s邮编:%s\n",stu[y].name,stu[y].phone,stu[y].age,stu[y].post);
}
}
if(m==2)
{
printf("请输入手机号码:\n");
gets(str);
printf("以下是您可能需要的结果:\n");
for(y=0;y<x;y++)
{
if(strstr(stu[y].phone,str)!=NULL)
printf("姓名:%s手机号:%s年龄:%s邮编:%s\n",stu[y].name,stu[y].phone,stu[y].age,stu[y].post);
}
}
if(m==3)
{
printf("请输入邮编:\n");
gets(str);
printf("以下是您可能需要的结果:\n");
for(y=0;y<x;y++)
{
if(strstr(stu[y].post,str)!=NULL)
printf("姓名:%s手机号:%s年龄:%s邮编:%s\n",stu[y].name,stu[y].phone,stu[y].age,stu[y].post);
}
}
}
void delete_record()
{
int n,k,x;
FILE *f,*fy;
char filename[10];
char one[20];
printf("\n\n\t\t-------------您正在进行删除操作!!------------\n\n\n");
printf("\t\n请选择删除方式:\n");
printf("\t┌──────——┐\n");
printf("\t│1------删除群组 │\n");
printf("\t│2------删除个人 │\n");
printf("\t│3------返回 │\n");
printf("\t└──────——┘\n");
printf("请选择:");
scanf("%d",&n);
clear();
if(n==1)
{
printf("请输入要删除的组别名称,默认组请输入“mr.txt”:");
gets(filename);
if(remove(filename))
printf("删除失败!!\n");
else
printf("删除成功!!\n");
}
if(n==2)
{
printf("请输入要删除的人所在组别名称,默认组请输入“mr.txt”:");
gets(filename);
if((f=fopen(filename,"r"))==NULL)
{
printf("\n文件加载失败,请重新打开程序!!");
exit(1);
}
x=read(f);
printf("请输入要删除的人的姓名:");
gets(one);
n=strlen(one);
one[n]='\n'; //以下俩行是因为fgets读文件时回车不变成\0,直接读称\n
one[n+1]='\0';
for(k=0;k<x;k++)
if(!strcmp(one,stu[k].name))
break;
remove(filename); //这里删除文件,是起覆盖原文件的作用
if((fy=fopen(filename,"a+"))==NULL)
{
printf("\n文件加载失败,请重新打开程序!!");
exit(1);
}
for(n=0;n<k;n++)
{
fprintf(fy,"%s%s%s%s",stu[n].name,stu[n].phone,stu[n].age,stu[n].post);
}
for(n=k+1;n<x;n++)
{
fprintf(fy,"%s%s%s%s",stu[n].name,stu[n].phone,stu[n].age,stu[n].post);
}
printf("删除成功!\n");
fclose(fy);
}
}
void change()
{
FILE *fr;
int n,x,k,y,n1;
char filename[20];
char one[20];
printf("\n\n\t\t---------下面进行成员信息修改-----------\n\n\n请输入需要修改的人所在群组,默认组请输入“mr.txt”:");
clear();
gets(filename);
if((fr=fopen(filename,"r"))==NULL)
{
printf("\n文件加载失败,请重新打开程序!!");
exit(1);
}
x=read(fr);
printf("请输入您想修改的人的名字:");
gets(one);
y=strlen(one);
one[y]='\n';
one[y+1]='\0';
for(k=0;k<x;k++)
if(!strcmp(stu[k].name,one))
break;
printf("您是想更改他的:\n");
printf("\t┌──────┐\n");
printf("\t│1------姓名 │\n");
printf("\t│2------电话 │\n");
printf("\t│3------年龄 │\n");
printf("\t│4------邮编 │\n");
printf("\t│5------返回 │\n");
printf("\t└──────┘\n");
printf("请选择:");
scanf("%d",&n);
clear();
remove(filename);
if((fr=fopen(filename,"a+"))==NULL)
{
printf("\n文件加载失败,请重新打开程序!!");
exit(1);
}
if(n==1)
{
y=strlen(stu[k].name);
for(n1=0;n1<y;n1++)
stu[k].name[n]='\0';
printf("请输入新的姓名:");
gets(stu[k].name);
y=strlen(stu[k].name);
stu[k].name[y]='\n';
stu[k].name[y+1]='\0';
}
if(n==2)
{
y=strlen(stu[k].phone);
for(n1=0;n1<y;n1++)
stu[k].phone[n]='\0';
printf("请输入新的手机号:");
gets(stu[k].phone);
y=strlen(stu[k].phone);
stu[k].phone[y]='\n';
stu[k].phone[y+1]='\0';
}
if(n==3)
{
y=strlen(stu[k].age);
for(n1=0;n1<y;n1++)
stu[k].age[n]='\0';
printf("请输入新的年龄:");
gets(stu[k].age);
y=strlen(stu[k].age);
stu[k].age[y]='\n';
stu[k].age[y+1]='\0';
}
if(n==4)
{
y=strlen(stu[k].post);
for(n1=0;n1<y;n1++)
stu[k].post[n]='\0';
printf("请输入新的邮箱:");
gets(stu[k].post);
y=strlen(stu[k].post);
stu[k].post[y]='\n';
stu[k].post[y+1]='\0';
}
for(y=0;y<=x;y++)
{
fprintf(fr,"%s%s%s%s",stu[y].name,stu[y].phone,stu[y].age,stu[y].post);
}
fclose(fr);
sort(filename);
printf("\n修改成功!!");
}
void build()
{
FILE *p;
char filen[20];
printf("\n\n\t\t-----------你将创建一个新的分组-------------\n\n\n请输入你要常见的分组的名称:");
clear();
gets(filen);
if((p=fopen(filen,"a+"))==NULL)
{
printf("分组创建失败!\n");
exit(1);
}
else
printf("分组创建成功!!!\n");
}
2、 测试数据
20
展开阅读全文