资源描述
学号
2016-2016学年 第二学期
1608220203
《高级语言程序设计》
课程设计报告
题目:
通信录程序设计
专业:
网络工程(对口)
班级:
16(3)班
姓名:
代应豪
指导教师:
程庆
成绩:
计算机学院
2017年4月25日
目录
1.设计内容及要求 1
1.1、课程设计的内容 1
1.2、课程设计的要求与数据 1
2.概要设计 1
3.设计过程或程序代码 2
3.1 问题描述 2
3.2 功能要求 2
3.3 算法提示 2
3.4 测试数据 2
3.4课题的主要功能模块划分 3
3.5主要功能的实现 3
4.设计结果与分析 15
4.1 程序调试 15
4.2 程序实现 15
4.3 总结 16
5.参考文献 17
1.设计内容及要求
1.1、课程设计的内容
编写学生通信录程序,包括以下功能模块:
1、通信录的每一条信息包括姓名、地址、邮政编码、电话号码。
2、输入功能:可以一次完成若干条信息的输入。
3、显示功能:完成全部通信录信息的显示。
4、查找功能:完成按姓名查找通信信息,并显示。
5、增加功能:增加通信信息。
6、删除功能:完成按姓名删除通信信息。
7、应提供一个界面来调用各个功能,调用界面和各个功能的操作界面应尽可能清晰美观!
1.2、课程设计的要求与数据
1、要求利用结构化程序设计方法以及C的编程思想来完成系统的设计。
2、要求有菜单、文件操作,数据使用数组、结构体、链表等均可,键盘操作或鼠标操作均可。
3、系统具有增加,查询,删除等基本功能;
4、模块化程序设计:要求在设计的过程中,按功能定义函数或书写多个文件,进行模块化设计,各个功能模块用函数的形式来实现。
5、完成设计任务并编写课程设计说明书。
2.概要设计
设计与开发一个通讯录管理系统,对通讯录中的姓名、单位、电话、QQ 、mail等基本信息进行管理、主要功能如下:
1).输入记录;
2).显示记录;
3).按姓名查找显示记录;
4).删除记录;
5).插入记录;
6).记录保存为文件;
7).从文件中读记录;
8).按姓名排序;
9).显示单条记录;
3.设计过程或程序代码
3.1 问题描述
制作一个通讯录,要求该系统对通讯录的姓名,单位,电话,进行输入,显示 ,查找,删除,插入,保存等操作的管理。
3.2 功能要求
1,本系统采用一个结构体数组,每个数据的结构应包括;姓名,单位,电话名称。
2, 本系统显示这样的菜单
请选择系统功能项
a 输入记录;
b 显示全部纪录;
c 查找记录;
d 删除记录;
e 插入记录;
f 保存文件 ;
g 读文件:
(1)按序号显示记录;
(2)按姓名排序;
(3)快速查找记录;
(4)复制文件。
3.3 算法提示
1. 数据结构;结构体类型数组。
2. 数据库结构;下表构成该系统的基本数据库。
姓 名
电 话
学号
3.4 测试数据
姓名
电话
学号
Zhang
152······
··················
3.4课题的主要功能模块划分
3.5主要功能的实现
3.5.1源程序
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#define N 100
int M=3;
struct student
{ char num[10];char name[10];char tel[10];};
void myprint()
{
system("cls");
printf(" |-----------------------------------------------|\n");
printf(" | :-)请输入选项编号(0-7): |\n");
printf(" |-----------------------------------------------|\n");
printf(" |--------------1--创建通讯录--------------------|\n");
printf(" |--------------2--显示通讯录--------------------|\n");
printf(" |--------------3--查询通讯录--------------------|\n");
printf(" |--------------4--修改通讯录--------------------|\n");
printf(" |--------------5--添加通讯录--------------------|\n");
printf(" |--------------6--删除通讯录--------------------|\n");
printf(" |--------------7--排序通讯录--------------------|\n");
printf(" |--------------0--退出--------------------------|\n");
printf(" |-----------------------------------------------|\n");
}
void mycreat(struct student *p,int n)
{
struct student *q=p;
FILE *fp=NULL;
fp=fopen("d:\\jilu.dat","w");
if(fp==NULL){printf("error"); return;}
for(p=q;p-q<n;p++)
{
printf("\n");
printf("第%d条记录:\n",p-q+1);
printf("学号:");
do
{gets(p->num);}
while(strcmp(p->num,"")==0);
printf("姓名:");
gets(p->name);
printf("电话:");
gets(p->tel);
fprintf(fp,"%23s%15s%15s\n",p->num,p->name,p->tel);
}
}
void mydisplay(struct student *p,int n)
{
FILE *fp=NULL;
fp=fopen("d:\\jilu.dat","r");
if(fp==NULL){printf("error"); return;}
system("cls");
printf(" 学号 姓名 电话\n");
while(n>0)
{
fscanf(fp,"%23s%15s%15s",p->num,p->name,p->tel);
printf("%23s%15s%15s\n",p->num,p->name,p->tel);
p++;n--;
}
}
void mysearch(struct student *p,int n)
{
struct student *q=p;
int flag=0;
char c='\0',nm[10]="",nam[10]="";
printf("\n按照学号查询(h)或姓名查询(m):\n");
c=getche();
if(c=='h'||c=='H')
{
printf("请输入要查询记录的学号:");gets(nm);
for(p=q;p-q<n;p++)
if(strcmp(nm,p->num)==0)
{
printf(" 学号 姓名 电话\n");
printf("%23s%15s%15s\n",p->num,p->name,p->tel);
flag=1;
}
if(flag==0) printf("wrong...\n");
}
else if(c=='m'||c=='M')
{
printf("请输入要查询记录的姓名:");gets(nam);
for(p=q;p-q<n;p++)
if(strcmp(nam,p->name)==0)
{
printf(" 学号 姓名 电话\n");
printf("%23s%15s%15s\n",p->num,p->name,p->tel);
flag=1;
}
if(flag==0) printf("wrong...\n");
}
else printf("wrong...\n");
}
void mymodify(struct student *p,int n)
{
struct student *q=p;
FILE *fp=NULL;
char nam[10]="";
mydisplay(p,n);
printf("请输入您想要修改记录的姓名:\n");gets(nam);
for(p=q;p-q<n;p++)
if(strcmp(nam,p->name)==0) break;
if(p-q==n)
printf("wrong...");
else
{
printf("请输入正确的学号:");
do
gets(p->num);
while(strcmp(p->num,"")==0);
printf("请输入正确的姓名:");
gets(p->name);
printf("请输入正确的电话:");
gets(p->tel);
}
fp=fopen("d:\\jilu.dat","w");
if(fp==NULL){printf("error"); exit(0);}
for(p=q;p-q<n;p++)
fprintf(fp,"%23s%15s%15s\n",p->num,p->name,p->tel);
fclose(fp);
}
void myadd(struct student *p,int n)
{
FILE *fp=NULL;
struct student *q=p;
char c='\n',tempnum[10]="",tempname[10]="",temptel[10]="";
printf("\n");
while(strcmp(p->num,"")!=0)
{
printf("%23s%15s%15s\n",p->num,p->name,p->tel);
p++;
}
n=p-q;
do
{
printf("请输入新纪录的学号:");
do
gets(tempnum);
while(strcmp(tempnum,"")==0);
printf("请输入新纪录的姓名:");
gets(tempname);
printf("请输入新纪录的电话:");
gets(temptel);
for(p=q;p-q<n;p++)
if(strcmp(tempnum,p->num)==0||strcmp(temptel,p->tel)==0)
{
printf("学号或电话号码需要重新输入吗(Y/N)?");
c=getche();
putchar('\n');
break;
}
if(p-q==n)
{
strcpy(p->num,tempnum);
strcpy(p->name,tempname);
strcpy(p->tel,temptel);
break;
}
}while(c=='y'||c=='Y');
fp=fopen("d:\\jilu.dat","w");
if(fp==NULL){printf("error"); return;}
for(p=q;p-q<=n;p++)
fprintf(fp,"%23s%15s%15s\n",p->num,p->name,p->tel);
fclose(fp);
M++;
}
void mydelete(struct student *p,int n)
{
FILE *fp=NULL;
struct student *q=p;
char c[10]="",tempnum[10]="",tempname[10]="",temptel[10]="",choose='\0';
mydisplay(p,n);
printf("选择删除记录的方式:学号(h)姓名(m)");
choose=getche();
printf("\n");
if(choose=='m'||choose=='M')
{
printf("删除的记录:");
gets(c);
for(;p-q<n;p++)
if(strcmp(c,p->name)==0) break;
if(p-q<n)
for(;p-q<n-1;p++)
{
strcpy(p->num,(p+1)->num);
strcpy(p->name,(p+1)->name);
strcpy(p->tel,(p+1)->tel);
}
else printf("no\n");
}
else if(choose=='h'||choose=='H')
{
printf("删除的记录:");
gets(c);
for(;p-q<n;p++)
if(strcmp(c,p->num)==0) break;
if(p-q<n)
for(;p-q<n-1;p++)
{
strcpy(p->num,(p+1)->num);
strcpy(p->name,(p+1)->name);
strcpy(p->tel,(p+1)->tel);
}
else printf("no");
}
else printf("wrong\n");
fp=fopen("d:\\jilu.dat","w");
if(fp==NULL){printf("error"); return;}
for(p=q;p-q<n-1;p++)
fprintf(fp,"%23s%15s%15s\n",p->num,p->name,p->tel);
fclose(fp);
M--;
}
void mysort(struct student *p,int n)
{
FILE *fp=NULL;
struct student *q=p,*w=p,*a=p;
char temp[10]="",c1='\0',c2='\0';
mydisplay(p,n);
printf("选择按照学号(h)或姓名(m)排序:\n");
c1=getche();
if(c1=='h'||c1=='H')
{
printf("升序(s)或者降序(j)排列:");
c2=getche();
if(c2=='s'||c2=='S')
for(;p-a<n;p++)
{
w=p;
for(q=p+1;q-a<n;q++)
if(strcmp(w->num,q->num)>0) w=q;
strcpy(temp,w->num);
strcpy(w->num,p->num);
strcpy(p->num,temp);
strcpy(temp,w->name);
strcpy(w->name,p->name);
strcpy(p->name,temp);
strcpy(temp,w->tel);
strcpy(w->tel,p->tel);
strcpy(p->tel,temp);
}
else if(c2=='j'||c2=='J')
for(;p-a<n;p++)
{
w=p;
for(q=p+1;q-a<n;q++)
if(strcmp(w->num,q->num)<0) w=q;
strcpy(temp,w->num);
strcpy(w->num,p->num);
strcpy(p->num,temp);
strcpy(temp,w->name);
strcpy(w->name,p->name);
strcpy(p->name,temp);
strcpy(temp,w->tel);
strcpy(w->tel,p->tel);
strcpy(p->tel,temp);
}
else printf("555wrong...\n");
}
else if(c1=='m'||c1=='M')
{
printf("升序(s)或者降序(j)排列:");
c2=getche();
if(c2=='s'||c2=='S')
for(;p-a<n;p++)
{
w=p;
for(q=p+1;q-a<n;q++)
if(strcmp(w->name,q->name)>0) w=q;
strcpy(temp,w->num);
strcpy(w->num,p->num);
strcpy(p->num,temp);
strcpy(temp,w->name);
strcpy(w->name,p->name);
strcpy(p->name,temp);
strcpy(temp,w->tel);
strcpy(w->tel,p->tel);
strcpy(p->tel,temp);
}
else if(c2=='j'||c2=='J')
for(;p-a<n;p++)
{
w=p;
for(q=p+1;q-a<n;q++)
if(strcmp(w->name,q->name)<0) w=q;
strcpy(temp,w->num);
strcpy(w->num,p->num);
strcpy(p->num,temp);
strcpy(temp,w->name);
strcpy(w->name,p->name);
strcpy(p->name,temp);
strcpy(temp,w->tel);
strcpy(w->tel,p->tel);
strcpy(p->tel,temp);
}
else printf("555wrong...\n");
}
else printf("555wrong...\n");
fp=fopen("d:\\jilu.dat","w");
if(fp==NULL){printf("error"); return;}
for(p=a;p-a<=n;p++)
fprintf(fp,"%23s%15s%15s\n",p->num,p->name,p->tel);
fclose(fp);
}
main()
{
char choose='\0',yes_no='\0';
struct student record[N]={0};
do
{
myprint();
printf(" :-)请选择(0-7):");
choose=getche();
switch(choose)
{
case '1':mycreat(record,M);break;
case '2':mydisplay(record,M);break;
case '3':mysearch(record,M);break;
case '4':mymodify(record,M);break;
case '5':myadd(record,M);break;
case '6':mydelete(record,M);break;
case '7':mysort(record,M);break;
case '0':exit(0);
default :printf("\nerror...\n");
}
printf("\n :-)继续选择吗(y/n)?\n");
do
{yes_no=getch();}
while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n');
}while(yes_no=='Y'||yes_no=='y');
}
4.设计结果与分析
4.1 程序调试
先进行人工检查,即静态检查。
在写好一个程序以后,不要匆匆忙忙上机,而应对程序进行人工检查。这一步十分重要,它能发现程序设计人员由于疏忽而造成的多数错误。这一步往往容易被人忽视,总希望把一切都推给计算机去做,但这样会多占用机器时间,作为一个程序人员应当养成严谨的作风,每一步都要严格把关,不把问题留给后面的工序。
为了更有效地进行人工检查,所编的程序应力求做到以下几点:
①应当采用结构化程序方法编程,以增加可读性;
②尽可能多加注释,以帮助理解每段程序的作用;
③在编写复杂的程序时不要将全部语句都写在main函数中,而要多利用函数,用一个函数来实现一个单独的功能。各函数之间除用参数传递数据外,尽量少出现耦合关系,这样便于分别检查和处理。
二、在人工检查无误后,再上机调试。
通过上机发现错误称为动态检查。在编译时会给出语法错误的信息,调试时可以根据提示信息具体找出程序中出错之处并改正。应当注意的是有时提示出错的地方并不是真正出错的位置,如果在提示出错的行找不到错误的话应当到上一行再找。有时提示出错的类型并非绝对准确,由于出错的情况繁多且各种错误互有关联,因此要善于分析,找出真正的错误,而不要只从字面意义上找出错信息,钻牛角尖。
如果系统提示的出错信息很多,应当从上到下逐一改正。有时显示出一大片出错信息往往使人感到问题严重,无从下手。其实可能只有一二个错误。例如,对使用的变量未定义,编译时就会对所有含该变量的语句发出出错信息。这时只要加上一个变量定义,就所有错误都消除了。
4.2 程序实现
(1)功能
通讯录的每一条信息包括学号、姓名、电话(字符数组)。
1. 输入功能:可以一次完成若干条信息的输入。
2. 显示功能:完成全部通讯录信息的显示。
3. 查找功能:可以用学号或姓名分别完成按姓名查找每一个通讯信息,并显示新的通讯信息。
4. 增加功能:可以无限增加学生数量。
5. 删除功能:完成按姓名删除通讯信息 并显示新的通讯信息。
6. 将通讯录信息存在文件d:\\jilu.dat中。
7. 将通讯录信息保存到新的文件中。
(2) 需要改进:
不知道如何改变DOS界面的颜色,使界面更加完美;字体颜色也不知道如何改变。
4.3 总结
通过这次课程设计,使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,我也发现我的好多不足之处,首先是自己在指法上还不行,经常按错字母,通过学习也有所改进;再有对C语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对C语言中经常出现的错误也不了解,通过实践的学习,我认识到学好计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。
在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前。
5.参考文献
[1] 谭浩强著. C程序设计(第三版). 北京:清华大学出版社,2005
[2] 谭浩强著. C程序设计题解与上机指导. 北京:清华大学出版社,2005
展开阅读全文