《程序设计基础》
课程设计报告
课程设计题目
通讯录管理系统
指导教师:____李 萍____
班 级:__ 0903班_ _ __
学生姓名:2009100333_ 闫 晓
2009100334 皇 倩
2009100335 翟少平
2009100336 谢成龙
2009100337 姚 琳
完成日期: 20##年9月16日
运城学院计算机科学与技术系
目录
一、课程设计目的. 3
二、课程设计内容. 3
三、总体设计. 4
四、详细设计. 4
五、调试与测试. 11
《C语言课程设计》
通讯录管理系统
1、通过课程设计,加深对结构化设计思想的理解,能对系统功能进行分析,并设计合理的模块化结构。
2、通过课程设计,学会设计数据结构。其中包括对结构数组、链表和数据文件等知识的运用。
3、通过课程设计,提高程序开发功能,能运用合理的控制流程编写清晰高效的程序。
4、通过课程设计,训练C程序调试能力,能将一个中小型各级组织系统联调通过。
5、通过课程设计,开发一个中小型系统,掌握系统研发全过程。
6、通话课程设计,培养分析问题、解决实际问题的能力。
设计一个实用的学生通讯录管理系统,能以简便高效的方式对通讯录进行管理和检索,具体要示:
(1) 录入:学生通讯录信息包括:姓名,地址,电话等。以结构数组 或数据文件的形式存放通讯录信息。
(2) 更新:能插入、删除通讯录信息。
(3) 浏览:按姓名为序进行通讯录信息浏览。
(4) 查询:能实现指定联系人信息查询或指定课题组人员查询功能。
(5) 系统以菜单方式工作,要求界面友好,易于操作。
模块化设计
为实现系统功能,本程序主要分为六个模块。它们分别为:输入一个学生信息、删除一个学生信息、查询一个学生信息、插入一个学生信息、输出所有的学生信息、保存并且退出该程序。这六个函数再通过主函数调用分别得以实现。
主函数,首先提供了程序运行时的友好界面,列出了清单,提供用户做出选择,以便决定使用通讯录的哪种功能。然后,通过执行多分支选择语句——switch语句,分别实现其它各个函数的调用功能。
其它各个函数的功能分别如下:
creat函数用于对通讯录中的数据以文件的方式
进行读入及函数用于录入通讯录中学生的信息;
delete函数用于对通讯录中指定信息的删除;
search函数用于对通讯录中指定信息的查询;
append函数用于在通讯录中插入信息;
output函数用于对通讯录中所有信息进行浏览;
exit函数用于保存通讯录信息并且退出。
(1)数据结构设计
本程序中,运用了多种数据结构。首先对于学生通讯录中各项详细信息的记录用了结构数组的形式,然后又运用链表动态地分配内存单元,在creat函数中,把保存在数组中的值再赋值给其中的一个结点,通过指针的后移,把多个数据连成一个链,形成一个链表。在这过程当中,还运用了数据文件的方式,每一次从终端输入的数据都以数据文件的形式保存到了磁盘。
对于主要数据结构的举例如下:
结构数组:
struct person
{ char name[10];
char addr[30];
char tel[15];
};
(2)模块接口设计
由于本程序中存在很多指针,所以这个程序中被调用的函数都是空类型的,但这并没有影响最终结果的输出,反而使得函数调用的过程更加简便。
本程序执行的入口是main函数,然后在main函数中首先调用了creat函数,这就实现了对通讯录中的数据以文件的方式进行读入。接下来在while语句中再套用switch语句实现对各个函数的调用。最后,再从main函数中结束整个程序的运行。
其中涉及到被调用的函数有:
void creat33();
void output34();
void search34();
void append36();
void modify35();
void delete37();
(3)流程图
creat函数:
void creat33()
{
struct person one;
long s1;
printf("\n请输入通讯簿名:");
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("\n不能建立通讯簿!");
exit();
}
fprintf(fp,"%-20s%-30s%-50s\n","姓名","电话号码","住址");
printf("\n请输入姓名、电话号码及住址(以0结束)\n");
scanf("%s",one.name);
while(strcmp(one.name,"0"))
{
scanf("%s%s",one.tel,one.addr);
fprintf(fp,"%-10s%-20s%-50s\n",one.name,one.tel,one.addr);
scanf("%s",one.name);
}
fclose(fp);
}
output函数:
void output34()
{
struct person one;
if((fp=fopen(filename,"r"))==NULL)
{
printf("\n不能打开通讯簿!");
exit();
}
printf("\n\n%20s\n","通 讯 簿");
while(!feof(fp))
{
fscanf(fp,"%s%s%s\n",one.name,one.tel,one.addr);
printf("%-10s%-20s%-50s",one.name,one.tel,one.addr);
}
fclose(fp);
}
append 函数:
void append36()
{
struct person one;
if((fp=fopen(filename,"a"))==NULL)
{
printf("\n不能打开通讯簿!");
exit();
}
printf("\n请输入添加的姓名、电话号码及住址\n");
scanf("%s%s%s",one.name,one.tel,one.addr);
fprintf(fp,"%-10s%-20s%-50s\n",one.name,one.tel,one.addr);
fclose(fp);
}
search函数:
void search34()
{
int k=0;
char namekey[8];
struct person one;
printf("\n请输入姓名:");
scanf("%s",namekey);
if((fp=fopen(filename,"rb"))==NULL)
{
printf("\n不能打开通讯簿!");
exit();
}
while(!feof(fp))
{
fscanf(fp,"%s%s%s\n",one.name,one.tel,one.addr);
if(!strcmp(namekey,one.name))
{
printf("\n\n已查到,记录为:");
printf("\n%-10s%-18s%-50s",one.name,one.tel,one.addr);
k=1;
}
}
if(!k)
printf("\n\n对不起,通讯簿中没有此人的记录。");
fclose(fp);
modify函数
void modify35()
{
int m,k=0;
long offset;
char namekey[8];
struct person one;
printf("\n请输入姓名:");
scanf("%s",namekey);
if((fp=fopen(filename,"r+"))==NULL)
{
printf("\n不能打开通讯簿!");
exit();
}
while(!feof(fp))
{
offset=ftell(fp);
fscanf(fp,"%s%s%s\n",one.name,one.tel,one.addr);
if(!strcmp(namekey,one.name))
{
k=1;
break;
}
}
if(k)
{
printf("\n已查到,记录为:");
printf("\n%-10s%-18s%-50s",one.name,one.tel,one.addr);
printf("\n请输入新姓名、电话号码及住址:");
scanf("%s%s%s",one.name,one.tel,one.addr);
fseek(fp,offset,SEEK_SET);
printf("%ld",ftell(fp));
fprintf(fp,"%-10s%-20s%-50s\n",one.name,one.tel,one.addr);
}
else
printf("\n对不起,通讯簿中没有此人的记录。");
fclose(fp);
}
delete函数
void delete37()
{
int m,k=0,flag;
long offset1,offset2;
char namekey[8], valid[4];
struct person one;
printf("\n请输入姓名:");
scanf("%s",namekey);
if((fp=fopen(filename,"r+"))==NULL)
{
printf("\n不能打开通讯簿!");
exit();
}
while(!feof(fp))
{
offset1=ftell(fp);
fscanf(fp,"%s%s%s\n",one.name,one.tel,one.addr);
if(!strcmp(namekey,one.name))
{
k=1;
break;
}
}
if(k)
{
printf("\n已查到,记录为");
printf("\n%-10s%-18s%-50s",one.name,one.tel,one.addr);
printf("\n确实要删除,按1;不删除,按0:");
scanf("%d",&m);
if(m)
{
fseek(fp,offset1,SEEK_SET);
fprintf(fp,"%-10s%-20s%-50s\n","","","");
}
}
else
printf("\n对不起,通讯簿中没有此人的记录。");
fclose(fp);
}
(1) 调试过程中的主要问题
由于本程序是分模块设计的,所以运行时选择完任务并且执行完任务后,又会继续回到用户选择界面,供用户继续选择任务并执行任务,整个程序以文件形式读写,所以每次都可对输入的数据进行保存。对于本程序的调试运行,总体上情况良好。
(2) 测试结果的分析与讨论
① 用户界面
② 输入学生信息
③ 查找学生信息
④ 删除学生信息
⑤ 添加学生信息
⑥ 浏览学生信息
语
言 程
序
设 计
实
验 报
告C
报告人:09114115 孟凡超 指导老师: 姜 林 报告日期:20xx年12月26日
C语言程序设计实验报告 C语言课程设计实验报告
1.设计目的:
学生信息管理系统设计
学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。试设计一学生信息管理系统,使之能提供以下功能:
1. 系统以菜单方式工作
2. 学生信息录入功能---输入
3. 学生信息浏览功能---输出
4. 查询、排序功能---算法
按学号查询
按姓名查询
5. 学生信息的删除与修改(可选项)
2.总体设计:
程序设计组成框图
学生信息录入
学生信息浏览
2
C语言程序设计实验报告 流程图
3
C语言程序设计实验报告
3.详细设计:
1>函数入口说明 pr() 输出主菜单
pr2() 输出检索菜单界面 fileopen() 文件操作:打开 filesave()文件操作:保存
editname(int n) 编辑子菜单:对姓名编辑 editage(int n) 编辑子菜单:对年龄编辑 editsex(int n) 编辑子菜单:对性别编辑 editbir(int n) 编辑子菜单:对出生年月编辑 editadd(int n) 编辑子菜单:对住址编辑 edittel(int n) 编辑子菜单:对电话进行编辑
editemail(int n) 编辑子菜单:对电子邮件地址编辑 last(int n) 显示翻页致末尾的信息 edit(int n) 信息编辑函数 del(int n) 删除信息的函数 editpr(int n) 输出编辑界面 jsid() 检索:按学号 jsname() 检索:按姓名 writeinfo() 录入、添加信息 viewinfo() 学生信息查看 main() 主函数 2>调用关系
3>参数说明
editname(int n)、editage(int n)、editsex(int n) 、editbir(int n) 、editadd(int n) 、edittel(int n)、editemail(int n)、last(int n)、edit(int n)、del(int n)、editpr(int n) 函数中的n都为检索中确定的学生数组下标。
4
C语言程序设计实验报告 4.调试与测试:
1>调用pr2()函数(检索界面)一闪而过。
解决方法:添加getchar()语句使程序暂停。
2>无法有效的控制输出函数循环终止。
解决方法:添加全局变量“stunum”,使用该全局变量来记录学生总数,从而控制输出循环的次数。
3>查询函数数据量过多时同时输出,先输出的内容无法查看,或需用户自行查看。
解决方法:添加getchar()语句使程序暂停,当用户按Enter时继续。
4>文件在打开和保存时有问题。
解决方法:调整文件的打开方式,从原来的单纯的w+修改为添加一个if语句,当没有文件时执行w+的操作,否则执行r+。避免了原存储文件被覆盖的问题。
5
C语言程序设计实验报告 5.源程序清单和执行结果:
#include<stdio.h> #include<conio.h> #include<string.h> #include<stdlib.h> int stunum=0; struct student { int id; char name[30]; int age; char sex[2]; char birthday[9]; char add[80]; char tel[15]; char email[25]; }stu[100]; void pr() { system("cls"); printf("******学生信息管理系统******"); printf("\n----------V 1.0.0 ----------"); printf("\n您想要:"); printf("\n 1.录入学生信息"); printf("\n 2.浏览学生信息"); printf("\n 3.检索学生信息"); printf("\n 4.退出信息管理"); printf("\n-----By 09114115 孟凡超-----"); printf("\n****************************\n"); } void pr2() { void jsid(); void jsname(); int a; char ch; while (a) { system("cls"); printf("******学生信息管理系统******"); printf("\n----------检 索----------"); printf("\n您想要:"); printf("\n 1.按学号检索"); printf("\n 2.按姓名检索"); printf("\n 3.返回主菜单"); printf("\n\n-----By 09114115 孟凡超-----"); printf("\n****************************\n"); ch=getchar(); switch(ch) { case '1':jsid();break; case '2':jsname();break; case '3':a=0;break; } } } void fileopen() { FILE *fp; int n; if((fp=fopen("data","r+"))==NULL) fp=fopen("data","w+"); for(n=0;n<100;n++) fread(&stu[n],sizeof(struct student),1,fp);fread(&stunum,4,1,fp);fclose(fp); } void filesave() { int n; FILE *fp; fp=fopen("data","r+");
6
C语言程序设计实验报告 for(n=0;n<100;n++) fwrite(&stu[n],sizeof(struct student),1,fp); fwrite(&stunum,4,1,fp); fclose(fp); } void editname(int n) { printf("\n新姓名:"); scanf("%s",stu[n].name); } void editage(int n) { printf("\n新年龄:"); scanf("%d",&stu[n].age); } void editsex(int n) { printf("\n新性别:"); scanf("%s",stu[n].sex); } void editbir(int n) { printf("\n新出生年月"); scanf("%s",stu[n].birthday); } void editadd(int n) { printf("\n新地址:"); scanf("%s",stu[n].add); } void edittel(int n) { printf("\n新电话:"); scanf("%s",stu[n].tel); } void editemail(int n) { printf("\n新E-mail:"); scanf("%s",stu[n].email); } void last(int n) { if(n==stunum) system("cls"); //清屏 printf("******学生信息管理系统******"); printf("\n----------检 索----------"); printf("\n已检索到末尾。"); printf("\nPress any key to continue.."); printf("\n\n-----By 09114115 孟凡超-----"); printf("\n****************************\n"); } void edit(int n) { char ch; int a=1,b; while (a) { system("cls"); printf("******学生信息管理系统******"); printf("\n----------修 改----------"); printf("\n请输入你想修改的内容:"); printf("\n1.姓名 2.年龄 3.性别 4.出生年月 5.地址 6.电话 7.E-mail\n"); printf("\n\n-----By 09114115 孟凡超-----"); printf("\n****************************\n"); getchar(); ch=getchar(); switch(ch) {
7
C语言程序设计实验报告 case '1':editname(n);break; case '2':editage(n);break; case '3':editsex(n);break; case '4':editbir(n);break; case '5':editadd(n);break; case '6':edittel(n);break; case '7':editemail(n);break; } b=1; while (b) { printf("\n确认吗?(y/n)"); getchar(); ch=getchar(); switch(ch) { case 'Y': case 'y':b=0;a=0;break; case 'N': case 'n':b=0;break; } } } } void del(int n) { int a; for(a=n;a<stunum;a++) { strcpy(stu[a].name,stu[a+1].name); stu[a].age=stu[a+1].age; strcpy(stu[a].sex,stu[a+1].sex); strcpy(stu[a].birthday,stu[a+1].birthday); strcpy(stu[a].add,stu[a+1].add); strcpy(stu[a].tel,stu[a+1].tel); strcpy(stu[a].email,stu[a+1].email); } stunum--; printf("删除成功!press Enter to continue.."); } int editpr(int n) { int a=1; char ch; while(a) { getchar(); printf("\n您想要:"); printf("\n\n1.修改学生信息"); printf("\n2.删除该条信息"); printf("\n3.返回上级菜单"); printf("\n4.查看下条信息"); ch=getchar(); switch(ch) { case '1':edit(n),a=0;break; case '2':del(n),a=0;break; case '3':a=0;return(0);break; case '4':a=0;break; } } } void jsid() { int n,i,j=0; system("cls"); printf("******学生信息管理系统******"); printf("\n----------检 索----------"); printf("\n请输入想要检索的学号:"); scanf("%d",&n); if(n<=stunum) { n=n--;
//拷贝后一个学生信息到前一个人上。 8
C语言程序设计实验报告 printf("学号 姓 名 年龄 性别 出生年月\n"); printf("%4d ",stu[n].id); printf("%12s ",stu[n].name); printf("%4d ",stu[n].age); printf("%4s ",stu[n].sex); printf("%8s \n",stu[n].birthday); printf("\n\n\n学号 电 话 E-mail 地址\n"); printf("%4d ",stu[n].id); printf("%15s ",stu[n].tel); printf("%15s ",stu[n].email); printf("%s\n", stu[n].add); j=editpr(n); i++; } if(i==0) { printf("\nError:无此学生。"); printf("\n-----By 09114115 孟凡超-----"); printf("\n****************************\n"); } else { if(j==0) goto end; else { system("cls"); last(n); getchar(); } } end:getchar(); } void jsname() { int n,j,i=0; char m[30]; system("cls"); printf("******学生信息管理系统******"); printf("\n----------检 索----------"); printf("\n请输入想要检索的姓名:"); scanf("%s",m); for(n=0;n<stunum;n++) { if(strcmp(m,stu[n].name)==0) { system("cls"); printf("学号 姓 名 年龄 性别 出生年月\n"); printf("%4d ",stu[n].id); printf("%8s ",stu[n].name); printf("%4d ",stu[n].age); printf("%4s ",stu[n].sex); printf("%8s \n",stu[n].birthday); printf("\n\n\n学号 电 话 E-mail 地址\n"); printf("%4d ",stu[n].id); printf("%15s ",stu[n].tel); printf("%15s ",stu[n].email); printf("%s\n", stu[n].add); i++; if((j=editpr(n))==0) break; } } if(i==0) printf("\nError:无此学生。"); if(j!=0) last(n); getchar(); getchar(); } void writeinfo() { int a,n=1,m;
9
C语言程序设计实验报告 char ch; while (n) { a=stunum; system("cls"); printf("ID:"); stu[a].id=(a+1); printf("%d",stu[a].id); printf("\nName:"); scanf("%s",&stu[a].name); printf("\nAge:"); scanf("%d",&stu[a].age); printf("\nSex:"); scanf("%s",&stu[a].sex); printf("\nBirthday(E.g 20090101):"); scanf("%s",&stu[a].birthday); printf("\nAddress:"); scanf("%s",&stu[a].add); printf("\nTel:"); scanf("%s",&stu[a].tel); printf("\nE-mail:"); scanf("%s",&stu[a].email); m=1; while (m) //做一个循环,直到m=0时跳出 { system("cls"); printf("ID:"); printf("%d",stu[a].id); printf("\nName:"); printf("%s",stu[a].name); printf("\nAge:"); printf("%d",stu[a].age); printf("\nSex:"); printf("%s",&stu[a].sex); printf("\nBirthday:"); printf("%s",stu[a].birthday); printf("\nAddress:"); printf("%s",stu[a].add); printf("\nTel:"); printf("%s",stu[a].tel); printf("\nE-mail"); printf("%s",stu[a].email); printf("\n请选择:1.确认并继续 2.重新填写 3.放弃并返回 4.确认并返回"); ch=getchar(); switch(ch) { case '1':m=0;stunum++;break; case '2':stunum,m=0;break; case '3':m=0,n=0;break; //选择此项时,m=0,循环终止 case '4':m=0,n=0;a=stunum++;break; } } } } void viewinfo() { int count=1,i,n=1,pagenum=1,page=stunum/5+1; //设定变量控制翻页 char ch; while (n) { system("cls"); printf("学号 姓 名 年龄 性别 出生年月\n"); for(i=count-1;i<count+4&&i<stunum;i++) { printf("%4d ",stu[i].id); printf("%12s ",stu[i].name); printf("%4d ",stu[i].age); printf("%4s ",stu[i].sex); printf("%8s \n",stu[i].birthday); } printf("\n\n\n学号 电 话 E-mail 地址\n"); for(i=count-1;i<count+4&&i<stunum;i++)
10
C语言程序设计实验报告 { printf("%4d ",stu[i].id); printf("%15s ",stu[i].tel); printf("%15s ",stu[i].email); printf("%s\n", stu[i].add); } printf("\n1.上一页 2.下一页 0.退出 共学生%d人,第%d页,共%d页\n",stunum,pagenum,page);
ch=getchar(); switch(ch) { case '1':pagenum--; if(pagenum==0) count=(page-1)*5+1,pagenum=page; else count=(pagenum-1)*5+1;break; case '2':pagenum++; if(pagenum>page) count=1,pagenum=1; else count=(pagenum-1)*5+1;break; case '0':n=0;break; } } } void main() //主函数 { int n=1; char ch; fileopen(); //文件打开 while (n) { pr(); ch=getchar(); switch(ch) //switch语句选择功能 { case '1':writeinfo();break; case '2':viewinfo();break; case '3':pr2();break; case '4':n=0;break; } } filesave();文件保存 }
11
C语言程序设计实验报告 6.实验心得:
1)
2)
3)
4)
5)
6) 对C语言的编程实践有所认识。 在遇到程序调试不通过时,会通过缩小范围的分析来锁定问题所在。 通过这次实验,熟悉了从自然语言转换成伪代码再转换为流程图的过程。 在程序中设定合适的全局变量,可以简化程序的编写难度。 运用函数可以减少编写时的代码量,也使程序条理清晰。 通过本次C语言上机实验,我对这个介于人类与非人类之间的计算机编程
语言有了一定的体验。随着实验的成功与报告的完成,有点微微的成就感使人难忘。伴随着学习的深入,我发现高深的东西还有很多很多,等待着我自己去挖掘。对C语言的学习,我会加倍努力。
12
课程设计报告20xx20xx年度第一学期名称题目院系班级学号学生姓名指导教师设计周数成绩日期软件设计与实践课程设计计算机系软件设计…
《课程设计报告》的格式要求撰写课程设计报告参考格式:题目(居中,小三号黑体字)学生姓名(学号)(学生姓名之间两格)(一律采用五号宋…
成都理工大学课程设计实验报告课程名称程序设计院系信科院数字媒体技术系班级所属小组姓名学号指导教师何建军20xx年月日课程设计要求课…
四川大学操作系统课程设计报告学院专业年级组编号组成员软件学院第X组乔心轲姓名0743111340学号张雯姓名XXXXXXXX学号康…
C程序设计实验报告实验名称控制结构综合程序设计学时安排2课时实验类别上机操作型实验要求1人1组一实验目的1熟练掌握分支结构循环结构…
C课程设计报告题目小学算术运算测试设计者刘星刘俊良凌锋专业班级计算机网络0901班学号343337指导教师任长安所属系部计算机与信…
海南大学三亚学院信息管理与信息系统专业课程设计实验报告题目C语言程序设计实习分院管理分院专业信息管理与信息系统班级信管0902姓名…
程序设计基础课程设计C课程设计报告贪吃蛇院系:计算机学院网络工程系班级:122班姓名:指导教师:20##年12月25日程序设计基础…
C语言程序设计实验报告专业班级日期11月26日成绩实验组别第327次实验指导教师李开学生姓名学号同组人姓名实验名称数组实验一实验目…
大连交通大学软件学院C语言课程设计报告SOFTWAREINSTITUTEOFDALIANJIAOTONGUNIVERSITYEXP…