简易通讯录系统 C语言程序设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

程序设计报告
( 2012 / 2013 学年第 2 学期)
题目:简易通讯录管理系统
专业应用物理
学生姓名于浩
班级学号 B12080507
指导教师骆健
指导单位计算机学院计算机科学与技术系日期 2013.3.27
简易通讯录管理系统程序设计报告
一、课题内容和要求
本课题设计是对基础课《面向对象程序设计》课程知识的进一步巩固并加强解决实际问题的能力。

目的是通过实习,一方面使学生加深对课内所学的有关面向对象概念的理解;另一方面,在具体的程序设计中掌握基于C语言的程序设计方法。

通过进行计算机实践,更加系统地理解和掌握C语言的基本概念、语言特点和编程技巧。

利用系统提供的标准函数和自定义函数进行程序设计,培养利用C语言设计综合程序的能力。

通过该课程设计使学生掌握一种程序设计开发环境,提高同学们自己学习、查阅资料、独立分析问题和解决问题的能力。

二、需求分析
设计通讯录系统,其信息中包括姓名、电话、地址等数据项。

所设计的系统要有简单的DOS界面,方便用户进行操作,显示以下功能:
(1)建立通讯录。

(2)插入、删除、修改通讯录记录
(3)查询通讯录记录,要求可按姓名和电话号码查询
(4)可按姓名或电话号码对通讯录进行排序
(5)信息记录要存放在文件中,因而要实现文件的输入/输出功能
三、概要设计
系统功能模块图:
建立:可以一次性输入多个人的相应信息
显示:可以输出通讯录里所有的记录
查询:可以选择用姓名、电话两种方式查询信息
修改:输入欲修改的那个人的名字后,再依次输入姓名、电话号码、地址即可完成修

添加:可以添加通讯录记录,依次输入姓名、电话号码、地址即可完成删除:输入欲删除的那个人的名字后,会自动删除其相应的记录内容排序:可以按姓名或电话号码对通讯录进行排序
保存:将通讯录信息保存到文件
四、源程序代码
#define N 100
#define SIZE 30
#include <stdio.h>
#include <string.h> //字符函数和字符串函数
#include <conio.h> //字符模式函数
#include <process.h>
struct student
{
char name[SIZE];
char tel[SIZE];
char adress[SIZE];
}; //函数声明
void myprint(); // 显示菜单
int mycreat(struct student*p,int n); // 输入通讯录
void mydisplay(struct student*p,int n); // 显示通讯录
void mysearch(struct student*p,int n); // 查找
void mymodify(struct student*p,int n); // 修改通讯录
int myadd(struct student*p,int n); // 增加通讯录
int mydelete(struct student*p,int n); // 删除
void mysort(struct student*p,int n); // 排序
void sch_tel(struct student*p,int n); // 按电话号码查找
void sch_name(struct student*p,int n); // 按姓名查找
int loadinfo(struct student*p,int n); // 载入通讯录信息
int saveinfo(struct student*p,int n); // 保存通讯录信息
void main()
{ // 文件定义
char yes_no ;
int choose; //定义choose为整形
struct student record[N]; // 存放通讯录信息,共100 条
int total=0,flag ; // 通讯录总数
total=loadinfo(record,N); // 从文件读取记录信息,不超过100 条
do
{
myprint(); // 显示菜单
printf(" 请选择:");
scanf("%d",&choose); //输入数据
switch(choose)
{
case 1 :
total=mycreat(record,total);
break ;
case 2 :
mydisplay(record,total);
break ;
case 3 :
mysearch(record,total);
break ;
case 4 :
mymodify(record,total);
break ;
case 5 :
total=myadd(record,total);
break ;
case 6 :
total=mydelete(record,total);
break ;
case 7 :
mysort(record,total);
break ;
case 8 :
flag=saveinfo(record,total);
if(flag==1)
printf("\n 保存失败!\n");
else
printf("\n 保存成功!\n");
break ;
case 0 :
exit(0);
break ;
default :
printf("\n %c 为非法选项!\n",choose); }
if(choose==0)break ;
printf("\n 要继续选择吗(Y/N)?");
do
{
yes_no=getchar();
}while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n');
}while(yes_no!='N'&&yes_no!='n');
}
void myprint() // 显示菜单信息
{
printf(" \n");
printf(" 请输入选项编号(0--7) \n");
printf(" 1---建立通讯录\n");
printf(" 2---显示通讯录\n");
printf(" 3---查询通讯录\n");
printf(" 4---修改通讯录\n");
printf(" 5---添加通讯录\n");
printf(" 6---删除通讯录\n");
printf(" 7---排序通讯录\n");
printf(" 8---保存通讯录\n");
printf(" 0---退出\n");
printf(" \n"); }
int mycreat(struct student*p,int n) // 批量输入学生信息
{
int i=0 ;
int m ;
printf("添加前的记录,共有<%d>个:\n",n);
printf("\n 记录号姓名电话号码地址\n");
i=0 ;
while((i<n)&&(strcmp(p->name,"")!=0))
{
printf("%d: %15s%15s%15s\n",i+1,p->name,p->tel,p->adress);
i++;
p++;
}
printf("\n 请输入要输入的学生人数(< %d): ",N-n);
scanf("%d",&m);
i=0 ;
while(i<m)
{
printf("\n");
printf("请输入第%d 个记录:\n",i+1);
printf("姓名:");
do
{
gets(p->name);
}while(strcmp(p->name,"")==0);
printf("电话号码:");
gets(p->tel);
printf("地址:");
gets(p->adress);
p++;
i++;
}
return m+n ;
}
void mydisplay(struct student*p,int n) // 显示学生信息
{
//clrscr();
int i=0 ;
printf("\n 记录号姓名电话号码地址\n");
while(i<n)
{
printf("%d: %15s%15s%15s\n",i+1,p->name,p->tel,p->adress);
p++;
i++;
}
}
void mymodify(struct student*p,int n) // 修改学生信息
{
char c;
int i ;
char nam[10];
mydisplay(p,n);
printf("\n 请输入要修改记录的姓名:");
c=getchar();
gets(nam);
for(i=0;i<n;i++,p++)
if(strcmp(nam,p->name)==0)break ;
if(i==n)
printf("无此人!\n");
else
{
printf("请输入正确的电话号码:");
do
{
gets(p->tel);
}while(strcmp(p->tel,"")==0);
printf("请输入正确的姓名:");
gets(p->name);
printf("请输入正确的地址:");
gets(p->adress);
}
}
void mysearch(struct student*p,int n) // 查找指定学生
{
char c ;
mydisplay(p,n);
printf("\n 按电话号码查询(h),还是按姓名查询(m)?");
c=getchar();
c=getchar();
if(c=='h'||c=='H')
sch_tel(p,n);
else if(c=='m'||c=='M')
sch_name(p,n);
else
printf("\n 非法字符!\n");
}
void sch_tel(struct student*p,int n) // 按电话号码查询
{
char c ;
int i,flag=0 ;
char tel[10];
printf("\n 请输入要查询记录的电话号码:");
c=getchar();
gets(tel);
for(i=0;i<n;i++)
if(strcmp(tel,p[i].tel)==0)
{
printf("\n 姓名电话号码地址\n");
printf("%15s%15s%15s\n",p[i].name,p[i].tel,p[i].adress);
flag=1 ;
}
if(flag==0)
printf("无此人!\n");
}
void sch_name(struct student*p,int n) // 按姓名查询
{
char c ;
int i,flag=0 ;
char nam[10];
printf("\n 请输入要查询记录的姓名:");
c=getchar();
gets(nam);
for(i=0;i<n;i++)
if(strcmp(nam,p[i].name)==0)
{
printf("\n 姓名电话号码地址\n");
printf("%15s%15s%15s\n",p[i].name,p[i].tel,p[i].adress);
flag=1 ;
}
if(flag==0)
printf("无此人!\n");
}
int myadd(struct student*p,int n) //增加学生信息
{
int i=0 ;
char c ;
struct student t,*q ;
printf("添加前的记录:\n");
printf("\n 姓名电话号码地址\n");
i=0 ;
q=p ; // 显示原有记录信息
while(i<n)
{
printf("%15s%15s%15s\n",q->name,q->tel,q->adress);
i++;
q++;
}
do
{
printf("请输入新记录的姓名:\n");
do
{
gets();
}while(strcmp(,"")==0); // 姓名不能为空
printf("请输入新记录的电话号码:");
gets(t.tel);
printf("请输入新记录的地址:");
gets(t.adress);
{
*(p+i)=t ;
printf("添加后的记录:\n");
printf("\n 姓名电话号码地址\n");
for(i=0;i<n+1;i++)
printf("%15s%15s%15s\n",(p+i)->name,(p+i)->tel,(p+i)->adress);
break ;
}
}
while(c=='y'||c=='Y');
return n+1 ;
}
int mydelete(struct student*p,int n) // 删除学生信息
{
int i,x ;
char c,tel[10],nam[10];
printf("删除前的记录:\n");
printf(" \n 姓名电话号码地址\n");
for(i=0;i<n;i++)
printf("%15s%15s%15s\n",p[i].name,p[i].tel,p[i].adress);
printf("按电话号码删除(h),还是按姓名删除(m)?");
c=getchar();
c=getchar();
if(c=='h'||c=='H')
{
printf("\n 请输入要删除记录的电话号码:");
c=getchar();
gets(tel);
for(x=0;x<n;x++)
if(strcmp(tel,p[x].tel)==0)
break; //说明提前结束循环,找到人if(x<n)
{
for(i=x;i<n-1;i++)
{
p[i]=p[i+ 1];
}
printf("删除后的记录:\n");
printf(" 姓名电话号码地址\n");
for(i=0;i<n-1;i++)
printf("%15s%15s%15s\n",p[i].name,p[i].tel,p[i].adress);
}
else
printf("无此人\n");
}
else
if(c=='m'||c=='M')
{
printf("\n 请输入要删除记录的姓名:");
c=getchar();
gets(nam);
for(x=0;x<n;x++)
if(strcmp(nam,p[x].name)==0)
break ;
if(x<n)
{
for(i=x;i<N-1;i++)
{
p[i]=p[i+1];
}
printf("删除后的记录:\n");
printf(" 姓名电话号码地址\n");
for(i=0;i<n-1;i++)
printf("%15s%15s%15s\n",p[i].name,p[i].tel,p[i].adress);
}
else
printf("无此人\n");
}
else
printf("\n 非法字符\n");
return n-1 ;
}
void mysort(struct student*p,int n) // 排序函数
{
char c;
int j,i,k ;
char c1;
struct student temp ;
printf("\n 排序前的记录:\n");
printf("\n 姓名电话号码地址\n");
for(i=0;i<n;i++)
printf("%15s%15s%15s\n",p[i].name,p[i].tel,p[i].adress);
printf("\n 按电话号码排序(h),还是按姓名排序(m)?");
c=getchar();
c1=getchar();
if(c1=='h'||c1=='H') //按号码排序
{
for(i=0;i<n-1;i++)
{
k=i ;
for(j=i+1;j<n;j++)
if(strcmp(p[k].tel,p[j].tel)>0)
k=j;
if(k!=i)
{
temp=p[k];
p[k]=p[i];
p[i]=temp;
}
}
printf("\n 排序后的记录:\n");
printf("\n 姓名电话号码地址\n");
for(i=0;i<n;i++)
printf("%15s%15s%15s\n",p[i].name,p[i].tel,p[i].adress);
}
else if(c1=='m'||c1=='M') // 按姓名排序
{
for(i=0;i<n-1;i++)
{
k=i ;
for(j=i+1;j<n;j++)
if(strcmp(p[k].name,p[j].name)>0)
k=j ;
if(k!=i)
{
temp=p[k];
p[k]=p[i];
p[i]=temp;
}
}
printf("排序后的记录:\n");
printf("\n 姓名电话号码地址\n");
for(i=0;i<n;i++)
printf("%15s%15s%15s\n",p[i].name,p[i].tel,p[i].adress);
}
}
int loadinfo(struct student*p,int n) // 载入通讯录信息
{
FILE*fp ;
int i,all=0 ;
char filename[30]="txl.txt" ;
fp=fopen(filename,"rb");
if(fp==NULL)
{
printf("\n***不能打开文件%s,或%s 文件不存在!***",filename,filename);
return 0 ;
}
fscanf(fp,"%d\n",&all);
if(all>N) // 读取记录总数
{
printf("文件记录数太多,不能读取");
return 0;
}
for(i=0;i<all;i++) // 读取记录信息
{
fscanf(fp,"%s %s %s\n",p[i].name,p[i].tel,p[i].adress);
}
fclose(fp); // 关闭文件
return all ;
}
int saveinfo(struct student*p,int n) //保存
{
FILE*fp ;
int i,all=0 ;
char filename[30]="txl.txt" ; //文件可以用记事本打开
fp=fopen(filename,"w");
if(fp==NULL)
{
printf("\n***不能建立或打开文件%s!***",filename);
return 0 ;
}
fprintf(fp,"%d\n",n);
for(i=0;i<n;i++)
fprintf(fp,"%s %s %s\n",p[i].name,p[i].tel,p[i].adress);
fclose(fp);
return 0;
}
五、测试数据及其结果分析
测试数据时,刚开始都比较顺利,如图:
开始不久就出现问题,我发现当号码位数不一致时,排序就乱了,如下图:
后来我与同学讨论调试后,发现原因是排序函数是按号码从左到右的顺序依次比较各个数字进行排序。

不过因为电话号码位数相同,此问题对程序影响不大。

六、调试过程中的问题
1.首先在程序设计之初,我觉得通讯录一般因为实际有存储空间限制,从而都是有存储数量限制的,所以我在程序中加入总数量100个信息的限制;
2.在排序函数设计部分,我一开始设计的是通讯录可以在姓名和电话号码的排序基础上,再弄个升序和降序的分类排序。

可后来觉得设计后排序方面操作比较麻烦,而且一般通讯录的排序都是升序排列,所以就把降序删除,简化了排序部分。

并且我在排序部分遇到顺序排列错误的问题,后来向其他同学求问才解决;
3.在文件存储与读取部分,程序经常读取文件时出现乱码,我想了很多办法都没有解决这个问题。

最后我求助了其他同学,在多次的讨论和修改调试后,终于解决乱码的问题。

七、设计总结
通过这次课程设计,我对很多的函数有了新的认识,也学会运用多种函数,我也明白写软件的基本过程和基本方法。

写软件的过程中我又学到了曾经自己不知道的函数或是自
己不会的函数的用法,特别是文件的写入和读取。

总的来说,这次课程设计让我受益匪浅。

在程序的设计过程中遇到很多的困难。

在课堂上学习C语言课程设计的时候,我发现课本上的内容都比较简单,以为程序编写非常简单。

然而等到真正编写程序的时候,我才发现理论和实践之间的巨大差异。

我在程序编写过程中遇到了很多问题。

比如刚开始的时候我几乎不知道该从何下手,面对电脑感到非常无力,后来通过编写一些简单的题目才有了思路。

在整个程序的编写过程中在很多地方都遇到了困难。

例如,我曾经想运用大量链表及指针来完成,但是在慢慢琢磨之后,觉得这个不一定要用链表,而且我对链表的熟练程度还不够,于是改变了编程思路。

当然还有不少文件的读写问题,不过还是通过不断测试之后顺利解决了。

另外我对一些算法的设计有很大漏洞,出现了很多的错误。

后来通过阅读相关书籍及程序代码,以及和同学的讨论,在克服了重重的困难后,终于完成了课程设计所要求的程序。

在这几天的编写过程中我对c语言有了更进一步的认识和了解。

此次编程过程的经验和知识肯定能促进我以后的学习。

总体来说,这次C语言程序设计实验还是比较成功的,虽然最终程序还存在一些不足,但能取得这样的成绩我还是比较高兴的。

相关文档
最新文档