《C语言程序设计》实训报告
课题名称: 通讯录管理系统
专 业: 计算机信息管理
班 级: 09信管(1)班
学 号:
姓 名:
指导教师:
2010 年 7 月 1 日
目 录
1 课程设计目的………………………………………………… 1
2 课程设计题目………………………………………………… 1
3 课程设计报告内容…………………………………………… 1
4 结论…………………………………………………………… 10
5 结束语………………………………………………………… 10
6 参考书目……………………………………………………… 10
7 程序运行……………………………………………………… 10
8 附录:(源程序清单)………………………………………… 12
一、课程设计题目
《通讯录管理系统》
二、实训目的
(1)掌握结构化程序设计的基本方法,基本掌握面向对象程序设计的基本思路和方法。
(2)掌握C的基本概念和基础知识。
(3)通过训练能够读懂较为复杂的C语言源程序并具备基本C语言程序设计的能力。
(4)熟练掌握各种常用类的定义,继承,文件的应用,为更好的理解面向对象打下更好的基础。
(5)通过实训,培养自己编写、调试、分析大型应用程序的能力。
(6)掌握面向对象的基本原理,提高学生综合程序设计的能力。
(7)培养自己独立解决问题,查找资料的能力。同学之间相互帮助,相互交流,相互合作的团队精神。
(8) 培养自己良好的学习兴趣,独立的编程风格。
(9) 通过实训检查自己学习上的不足,达到熟练掌握C语言的基本知识和技能。
三、课程设计报告内容
3.1功能要求
该系统运行在DOS环境下,人机界面为命令行文本界面。完成的任务是对若干人的通信录信息进行管理,且数据保存到文件中。
实现的主要功能是:
= 添加:增加一个或几个人的通信录信息。
= 删除:删除已输入的通信录信息。
= 查询:根据输入的姓名查找通信录信息。
= 修改:根据输入的姓名修改通信录信息。
= 显示:输出所有通信录信息。
3.2 设计环境
所使用的语言采用标准C,开发工具选用在Windows环境下的C-free、Win-TC或者Visual C++ 6.0。
3.3 数据结构
本系统是对通信录的信息进行管理,通信录记录的信息采用C的结构体数据类型描述,定义如下:
struct ren /*定义个人资料结构体类型*/
{
char name[10]; /*姓名*/
int age; /*年龄*/
char tel[12]; /*电话号码*/
char city[20]; /*城市 */
char units[30] ; /*所在单位*/
char note[20]; /*备注*/
};
3.4实现方法及主要算法分析
(1)主界面的设计:主界面采用文本菜单的形式,各功能调用通过菜单进行选择。采用循环处理,以便执行完某项处理后,仍可选择其他项处理。在循环内先显示提示信息,然后读取用户输入,使用switch语句对用户的输入进行判断,分别调用相应的模块,当某模块结束后再次回到文本菜单,直到用户选择结束程序菜单,才退出循环,从而退出系统。
(2) 外部文件的类型:文件采用的二进制的文件,对文件的读写采用顺序文件的方式,并使用fread和fwrite等函数对文件进行操作。
(3)清屏函数:一般由上一级菜单屏幕进入下一级菜单屏幕或由下一级菜单屏幕返回上一级菜单屏幕都需要清除屏幕原来显示的内容。同时在调用程序的过程中,记录需要清屏的位置,然后修改代码,加入clrscr()函数清屏。
(4)提示信息:一般的输入与输出需有相应的提示信息,以增加用户的交互性,增加输出的可读性,以帮助用户使用程序。
(5)设置颜色:textbackground()、textcolor()函数设置背景和前景颜色
(6)光标定位:gotoxy(列,行); 光标定位
3.5模块设计
根据功能要求,本系统为五大主要模块,具体模块如表所示。
表 通讯录管理管理系统的模块
3.6处理流程
(1)通讯录主界面模块
(2)增加记录模块 (3)显示记录模块
(4)删除记录
(5)修改记录
四、结论
通信录管理系统的编写,看似杂乱无头绪,实际上却并不如此。它的每一个功能都能分成模块,有句话说的好,大事化小,小事化了。C语言编程也正式如此,把一个大的程序分为若干相互独立的模块,这样使完成每一个模块的工作变得单纯而明确,这样不仅降低了难度还使得思路清晰,很容易编写出要做的程序,从而为设计一些较大的软件打下了良好的基础。
分析问题:
通讯录管理的整体功能都包括登陆限制、增加成员、删除成员、查看成员、修改成员、登陆口令五大板块,而查看有包括姓名查看,城市查看,年龄查看三个模块。
(1) 设计的数据对象包括整形:年龄。字符型:姓名、电话、城市、所在单位、备注。
(2) 数据结构线性数据结构,定义人数上限为100.
算法的设计:
(1) 自顶向下
现有全局,在进行整体设计,然后再进行下层的设计,逐步实现精细化。采用这种方法能够做到胸有全局,能全盘考虑,不至于顾此失彼,头重脚轻。
(2) 逐步细化
一步步地将上层的任务分解成较小的、易于实现的任务,知道可以很简单实现为止。
编写源程序:
(1) 不求速度,但求质量!一步一个脚印,编写程序时候宁可速度慢些也要尽量保证质量,做到尽量不出错。
(2) 精力集中,全神贯注!写程序时候最忌讳三心二意,这样才能思路清晰保证质量。
(3) 保持一个良好的编程心态,不要被长长的代码吓到,更不要厌烦,既然同样都是写,为什么不仲满激情的去写那?
程序的编译与运行:
(1) 查找错误是一件让人闹心的事,但是要注重技巧,注意平时经验的积累。才能在最快的时间找出错误
(2) 用心去查找,也许你会发现错误并不是很难找
(3) 程序编译成功不要满足现状,要积极测试程序的可用性,对功能不理想,存在缺点的地方,积极的改进,完善。
五、结束语
在实训过程中,使我良好的锻炼了自己,首先是兴趣方面,通过编写通讯录管理系统使我更加喜欢编程,使我从以前的迷茫状态中解脱出来,使我了解了编程的真正意义。我想这对我以后的人生有着很大的帮助。其次通过编写通讯录管理系统使我对写程序有了一定的思路,不像以前无从下手,使我理解了算法的意义,使我懂得了模块化思想的好处。
通过一个星期的编写代码,使我对书本上的知识有了更深的理解,甚至有很多不懂的问题在这过程中自然而然的理解了。对期末考试更有了信心。在方建文老师的悉心指导下,我对C语言有了更深刻的理解,对程序的算法,数据的定义,程序的改错等方面的能力有了很大提高,自身的注意力,耐心,和对编程的兴趣有了很大增长,使我获益匪浅。
六、参考书目:
[1] 周成义,汤德俊,钟菊,《C语言程序设计与数据结构》,中国铁道出版社,北京,20##年8月
[2](美)克尼汉,(美)里奇 著,徐宝文,李志 译 ,《 C程序设计语言》,机械工业出版社 20##年01月
七、程序运行
系统各个模块运行调试,并附上运行结果截图。
八、附录:(源程序清单)
/*通讯录程序*/
#define M 100
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct record
{
char name[20];
int age;
char tele[15];
char city[20];
char units[30];
char note[20];
};
void modi_seq(struct record info[],int n);
void creat();
void append();
void display();
void locate();
void modify();
void dele();
void disp_arr(struct record * ,int);
void disp_row(struct record);
void disp_table();
void modi_sep(struct record[],int);
void disp_str(char,int);
void sort(struct record[],int);
void sort_name(struct record[],int);
void sort_city(struct record[],int);
void dele_name(struct record[],int*);
void dele_sequ(struct record[],int*);
#include<stdio.h>
void main()
{
char choice;
while(1)
{
printf("\n\n");
disp_str(' ',18);
printf("通讯录管理程序\n");
disp_str('*',50);
putchar('\n');
disp_str(' ',16);
printf("1.通讯录信息输入\n");
disp_str(' ',16);
printf("2.显示通讯录信息\n");
disp_str(' ',16);
printf("3.通讯录记录查询\n");
disp_str(' ',16);
printf("4.修改通讯录信息\n");
disp_str(' ',16);
printf("5.通讯录记录删除\n");
disp_str(' ',16);
printf("6.建立通讯录文件\n");
disp_str(' ',16);
printf("7.退出通讯录程序\n");
disp_str('*',50);
putchar('\n');
disp_str(' ',14);
printf("请输入代码选择(1~7)");
choice=getchar();
getchar();
switch(choice)
{
case'1':
append();
break;
case'2':
display();
break;
case'3':
locate();
break;
case'4':
modify();
break;
case'5':
dele();
break;
case'6':
creat();
break;
case'7':
return 1;
default:
continue;
}
}
}
void disp_str(char ch,int n)
{
int i;
for(i=1;i<=n;i++)
printf("%c",ch);
return;
}
void append()
{
struct record info[M];
FILE *fp;
char ask;
int i=0;
if((fp=fopen("address.txl","rb+wb"))==NULL)
{printf("can't open file!\n");
return;
}
while(!feof(fp))
fread(&info[i++],sizeof(struct record),1,fp);
i--;
while(1)
{
if(i==M)
{
printf("纪录已满!");
break;
}
printf("\n\n");
disp_str(' ',10);
printf("添加通讯录信息(共有%d条记录)\n",i);
disp_str('*',50);
putchar('\n');
disp_str(' ',17);
printf("1.添加新的通讯纪录\n");
disp_str(' ',17);
printf("2.退出添加程序\n");
disp_str('*',50);
putchar('\n');
disp_str(' ',16);
printf("请输入代码选择(1~2)");
ask=getchar();
getchar();
if(ask=='2')
break;
else if(ask=='1')
{
printf("开始添加新的纪录信息:\n");
putchar('\n');
printf("清输入一下信息:\n");
printf("姓名:");
gets(info[i].name);
printf("\n年龄:");
scanf("%d",&info[i].age);
getchar();
printf("\n电话:");
gets(info[i].tele);
printf("\n所在城市:");
gets(info[i].city);
printf("\n所在单位:");
gets(info[i].units);
printf("\n备注:");
gets(info[i].note);
fwrite(&info[i],sizeof(struct record),1,fp);
i++;
}
}//while(1)
fclose(fp);
return;
}
void creat()
{
FILE * fp;
if((fp=fopen("address.txl","wb"))==NULL)
{
printf("can't open file!\n");
return;
}
fclose(fp);
printf("\n\n文件成功建立,请使用“通讯录信息输入功能”输入信息!");
getchar();
return;
}
void display()
{
struct record info[M];
FILE *fp;
char ask;
int i=0;
if((fp=fopen("address.txl","rb"))==NULL)
{
printf("can't open file! \n");
return;
}
while(!feof(fp))
fread(&info[i++],sizeof(struct record),1,fp);
i--;
while(1)
{
printf("\n\n");
disp_str(' ',10);
printf("显示通讯录信息(共有%d条记录)\n",i);
disp_str('*',50);
putchar('\n');
disp_str(' ',17);
printf("1.按自然顺序显示 \n");
disp_str(' ',17);
printf("2.按排序顺序显示 \n");
disp_str(' ',17);
printf("3.退出显示程序 \n");
disp_str('*',50);
putchar('\n');
disp_str(' ',16);
printf("请输入代码选择1-3");
ask=getchar();
getchar();
if(ask=='3')
{
fclose(fp);
return;
}
else if(ask=='1')
disp_arr(info,i);
else if(ask=='2')
sort(info,i);
}
fclose(fp);
return;
}
void disp_arr(struct record info[],int n)
{
char press;
int i;
for(i=0;i<n;i++)
{
if(i%20==0)
{
printf("\n\n");
disp_str(' ',25);
printf("我的通讯录\n");
disp_str('*',78);
printf("\n");
printf("序号");
disp_table();
}
printf("%-7d",i+1);
disp_row(info[i]);
if((i+1)%20==0)
{
disp_str('*',78);
printf("\n");
printf("按回车键继续显示下屏,按其他键结束显示!\n");
printf("请按键……");
press=getchar();
getchar();
if(press!='\n')
{
break;
}
}
}
disp_str('*',78);
printf("\n");
printf("按任意键继续......");
getchar();
return;
}
void disp_row(struct record row)
{
printf("%-12s%-12s%-15s%-16s%-4d%-s\n",row.name,row.tele,row.city,row.units,row.age,row.note);
return;
}
void sort(struct record info[],int n)
{
char ask;
while(1)
{
printf("\n\n");
disp_str(' ',16);
printf("通讯录排序 \n");
disp_str('*',50);
putchar('\n');
disp_str(' ',17);
printf("1.按姓名排序 \n");
disp_str(' ',17);
printf("2.按城市排序 \n");
disp_str(' ',17);
printf("3.返回上一层 \n");
disp_str('*',50);
putchar('\n');
disp_str(' ',16);
printf("请输入号码选择(1-3)");
ask=getchar();
getchar();
if(ask=='3')
break;
else if(ask=='1')
sort_name(info,n);
else if(ask=='2')
sort_city(info,n);
}
return;
}
void sort_name(struct record info[],int n)
{
int i,j;
struct record info_t[M],temp;
for(i=0;i<n;i++)
info_t[i]=info[i];
for(i=1;i<n;i++)
for(j=0;j<n;j++)
{
if(strcmp(info_t[j].name,info_t[j+1].name)>0)
{
temp=info_t[j];
info_t[j]=info_t[j+1];
info_t[j+1]=temp;
}
}
disp_arr(info_t,n);
return;
}
void sort_city(struct record info[],int n)
{
int i,j;
struct record info_t[M],temp;
for(i=0;i<n;i++)
info_t[i]=info[i];
for(i=0;i<n;i++)
for(j=0;j<n-i;j++)
{
if(strcmp(info_t[j].city,info_t[j+1].city)>0)
{
temp=info_t[j];
info_t[j]=info_t[j+1];
info_t[j+1]=temp;
}
}
disp_arr(info_t,n);
return;
}
void disp_table()
{
printf(" 姓名");
disp_str(' ',8);
printf("电话");
disp_str(' ',8);
printf("城市");
disp_str(' ',12);
printf("单位");
disp_str(' ',10);
printf("年龄");
disp_str(' ',2);
printf("备注\n");
return;
}
void locate()
{
struct record temp,info[M];
char ask,name[20],city[20];
int n=0,i,flag;
FILE *fp;
if((fp=fopen("address.txl","rb"))==NULL)
{
printf("can't open file!\n");
return;
}
while(fread(&temp,sizeof(struct record),1,fp)==1)
info[n++]=temp;
while(1)
{
flag=0;
disp_str(' ',20);
printf("查询通讯录\n");
disp_str('*',50);
putchar('\n');
disp_str(' ',17);
printf("1.按姓名查询\n");
disp_str(' ',17);
printf("2.按城市查询\n");
disp_str(' ',17);
printf("3.返回上一层\n");
disp_str('*',50);
putchar('\n');
disp_str(' ',16);
printf("请输入代码选择(1~3)");
ask=getchar();
getchar();
if(ask=='1')
{
printf("请输入要查询的姓名:");
gets(name);
for(i=0;i<n;i++)
if(strcmp(name,info[i].name)==0)
{
flag=1;
disp_row(info[i]);
}
if(!flag)
printf(" 没有找到符合条件的记录\n");
printf("按任意键返回.......");
getchar();
}
else if(ask=='2')
{
printf("请输入要查询的城市:");
gets(city);
for(i=0;i<n;i++)
if(strcmp(city,info[i].city)==0)
{
flag=1;
disp_row(info[i]);
}
if(!flag)
printf("没有找到符合条件的记录\n");
printf("按任意键返回......");
getchar();
}
else if(ask=='3')
{
fclose(fp);
return;
}
}
}
void modify()
{
char ask;
struct record temp,info[M];
FILE *fp;
int i=0;
if((fp=fopen("address.txl","rb"))==NULL)
{
printf("can't open file!\n");
return;
}
while(fread(&temp,sizeof(struct record),1,fp)==1)
info[i++]=temp;
while(1)
{
disp_str(' ',20);
printf("编辑修改通讯录 \n");
disp_str('*',50);
putchar('\n');
disp_str(' ',17);
printf("1.浏览显示通讯录 \n");
disp_str(' ',17);
printf("2.编辑修改通讯录 \n");
disp_str(' ',17);
printf("3.返回上一层 \n");
disp_str('*',50);
putchar('\n');
disp_str(' ',16);
printf("请输入号码选择(1-3)");
ask=getchar();
getchar();
if(ask=='3')
break;
else if(ask=='1')
disp_arr(info,i);
else if(ask=='2')
modi_seq(info,i);
}
fclose(fp);
fp=fopen("address.txl","wb");
fwrite(info,sizeof(struct record),i,fp);
fclose(fp);
return;
}
void modi_seq(struct record info[],int n)
{
int sequence;
char ask;
while(1)
{
printf("请输入序号:");
scanf("%d",&sequence);
getchar();
if(sequence<1||sequence>n)
{
printf("序号超出范围,请重新输入!\n");
getchar();
continue;
}
printf("当前要修改的记录信息:\n");
disp_table();
disp_row(info[sequence-1]);
printf("请重新输入以下的信息:\n");
printf("姓名:");
gets(info[sequence-1].name);
printf("年龄:");
scanf("%d",&info[sequence-1].age);
getchar();
printf("电话:");
gets(info[sequence-1].tele);
printf("所在城市:");
gets(info[sequence-1].city);
printf("所在单位:");
gets(info[sequence-1].units);
printf("备注:");
gets(info[sequence-1].note);
printf("继续修改请按y,否则按其他键......");
ask=getchar();
getchar();
if(ask!='y'&&ask!='Y')
break;
}
return;
}
void dele()
{
struct record temp,info[M];
char ask;
int i=0,lenth;
FILE *fp;
if((fp=fopen("address.txl","rb"))==NULL)
{
printf("can't open file!\n");
return;
}
while(fread(&temp,sizeof(struct record),1,fp)==1)
info[i++]=temp;
lenth=i;
while(1)
{
disp_str(' ',18);
printf("记录的删除\n");
disp_str('*',50);
putchar('\n');
disp_str(' ',17);
printf("1.按姓名删除\n");
disp_str(' ',17);
printf("2.按序号删除\n");
disp_str(' ',17);
printf("3.返回上一层 \n");
disp_str('*',50);
putchar('\n');
disp_str(' ',14);
printf("请输入号码选择(1-3)");
ask=getchar();
getchar();
if(ask=='3')
break;
else if(ask=='1')
dele_name(info,&i);
else if(ask=='2')
dele_sequ(info,&i);
if(lenth>i)
{
fclose(fp);
fp=fopen("address.txl","wb");
fwrite(info,sizeof(struct record),lenth-1,fp);
fclose(fp);
fp=fopen("address.txl","rb");
}
}
fclose(fp);
return;
}
void dele_name(struct record info[],int *n)
{
char d_name[20],sure;
int i;
printf("请输入姓名:");
gets(d_name);
getchar();
for(i=0;i<*n;i++)
if(strcmp(info[i].name,d_name)==0)
break;
if(i!=*n)
{
printf("要删除的记录如下:\n");
disp_table();
disp_row(info[i]);
printf("确定删除-y,否则按其他键.....");
sure=getchar();
getchar();
if(sure!='y'&&sure!='Y')
return;
for(;i<*n-1;i++)
info[i]=info[i+1];
*n=*n-1;
}
else
{
printf("要删除的记录没有找到,请按任意键返回......");
getchar();
}
return;
}
void dele_sequ(struct record info[],int *n)
{
int d_sequence;
int i;
char sure;
printf("请输入序号:");
scanf("%d",&d_sequence);
getchar();
if(d_sequence<1&&d_sequence>*n)
getchar();
if(d_sequence<1&&d_sequence>*n)
{
printf("序号要超出有效范围,按任意键返回......");
getchar();
}
else
{
printf("要删除的记录如下:\n");
disp_table();
disp_row(info[d_sequence-1]);
printf("确定删除-y,否则按其他键......");
sure=getchar();
getchar();
if(sure!='y'&&sure!='Y')
return;
for(i=d_sequence-1;i<*n-1;i++)
info[i]=info[i+1];
*n=*n-1;
}
return;
}