高级语言程序设计综合性实验指导书06.docx
- 文档编号:25220042
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:18
- 大小:134.55KB
高级语言程序设计综合性实验指导书06.docx
《高级语言程序设计综合性实验指导书06.docx》由会员分享,可在线阅读,更多相关《高级语言程序设计综合性实验指导书06.docx(18页珍藏版)》请在冰豆网上搜索。
高级语言程序设计综合性实验指导书06
C语言程序设计
综合性实验指导书
学生成绩管理系统
指导教师:
开课学期:
2016-2017第2学期
授课班级:
一、实验目的和要求
1.利用所学的三种程序基本结构以及数组、用户自定义函数进行一个小型程序的设计,进一步理解和掌握C语言的语法以及三种基本程序结构的综合应用。
2.通过程序中涉及到的排序、查找、求和等操作加深对算法、程序设计思路、常用程序设计技巧的理解与掌握,逐步培养学生的程序开发能力。
二、设计要求
(一)学生信息和程序功能
给定的原始数据和程序应实现的功能是该C程序开发的依据,此实验只处理一个班级学生信息,最多学生数为60人。
1.学生信息和数据类型
最多学生人数定义为全局符号常量
#defineN60
(1)学生信息
学生信息包含:
学号,姓名,性别,出生日期(年,月,日),三门课成绩和总分、平均分(高等数学,C语言,电工基础,总分,平均分)。
(2)数据类型
学号,姓名,性别三个信息为char型,其余为int型。
2.插入数据
测试数据以ASCII码文件studentf.txt提供。
studentf.txt文件结构:
学号姓名性别年月日高等数学C语言电工基础总分平均分
studentf.txt文件数据:
205201张明男19821021606060
205205李红英女19801110707070
205202成杰男19830101807590
205204孙梅女19811211906078
3.程序功能
(1)建立学生信息结构数组(从ASCII码文件studentf.txt读入数据)
(2)按总分递减排序
(3)按学号递增排序
(4)按姓名递增排序
(5)按总分查学生信息和平均分数
(6)按学号查学生信息和平均分数
(7)按姓名查学生信息和平均分数
(8)计算各门课的平均分数
(9)显示学生信息表
(二)程序总体设计
1.数据结构
依据给定的学生信息和数据类型,结构数组分量必须用结构实现。
结构类型的层次结构:
结构类型定义为全局标识符
structdate//日期结构
{intyear;//年
intmonth;//月
intday;
};
structstudent//学生信息结构
{charnum[12];//学号
charname[9];//姓名
charsex[2];//性别
structdatebirthday;//出生日期
intscore[5];//三门课成绩和总分、平均分
};
结构数组定义为局部标识符:
staticstructstudentstu[N];//学生信息结构数组
2.模块划分
依据程序的数据结构和功能,遵照“自顶向下”原则,采用基于函数的逐步求精法,描述该程序的层次结构。
该程序可按给定的程序功能直接描述模块层次结构。
该程序要求同时保留三种排序状态:
按总分排序,按学号排序,按姓名排序。
因此,必须用指针数组排序。
如图1显示该程序的层次结构。
在C语言中,模块用函数实现,函数原型清单:
1-1建立学生信息结构数组readsi
voidreadsi(structstudentstud[],int*n)
1-2按总分递减排序zfsort
voidzfsort(structstudent*ptscore,intn)
1-3按学号递增排序numsort
voidnumsort(structstudent*ptnum,intn)
1-4按姓名递增排序namesort
voidnamesort(structstudent*ptname,intn)
1-5按总分查学生信息和平均分数searchsum
voidsearchsum(structstudent*psum,intn,intscoresum)
1-6按学号查学生信息和平均分数searchnum
voidsearchnum(structstudent*pnum,intn,charsearch_num[10])
1-7按姓名查学生信息和平均分数searchname
voidsearchname(structstudent*pname,intn,charsearch_name[10]
1-8计算各门课的平均分数countave
void(structstudent*ave,intn)
1-9显示学生信息表printtable
voidprinttable(structstudent*pstu,intn)
2-1显示学生信息printsi
voidprintsi(structstudent*pstu,intn)
(三)程序总体框架
模块层次结构只是确定模块之间的关系和函数原型,不是程序的执行步骤。
程序总体框架是该程序的总体流程图。
该程序不是顺序执行全部功能,而是在某一时刻有选择地执行一种或多种功能。
因此,选用菜单方式是较佳的方案。
程序总体框架如图2所示。
三、参考程序
1.主控源程序文件studentmain.c
//********************************
//***应用结构数组、文件处理学生成绩studentmain.c***
//******
//***学号:
姓名:
日期:
2006.6.23***
//********************************
#include
#include
#include
#defineN53//结构数组的最大长度
structdate//日期结构
{intyear;//年
intmonth;//月
intday;
};
structstudent
{charnum[12];
charname[9];
charsex[2];
structdatebirthday;
intscore[6];
};
#include"studentfun_1.c"
voidmain()
{staticstructstudentstu[N];//学生信息结构数组
charsearch_num[10];
charsearch_name[10];
intsearch_scoresum;
intcode;//菜单代码
intn=0;//,i;//n为实际学生数
readsi(stu,&n);
printf("学生信息\n");
printf("---------------------------------------------------------------------\n");
printsi(stu,n);//显示学生信息
printf("\n按
");
scanf("%*c");//暂停
while
(1)
{code=menu();//调用菜单
switch(code)
{case0:
exit
(1);
case1:
//显示学生信息
printsi(stu,n);scanf("%*2c");break;
case2:
//显示按总分排序后的学生信息
{printf("\n按总分排序后的学生信息表");
zfsort(stu,n);
printtable(stu,n);
scanf("%*2c");break;
}
case3:
//显示按学号排序后的学生信息
{printf("\n按学号排序后的学生信息表");
numsort(stu,n);
printtable(stu,n);
scanf("%*2c");break;
}
case4:
//显示按姓名排序后的学生信息
{printf("\n按姓名排序后的学生信息表");
namesort(stu,n);
printtable(stu,n);
scanf("%*2c");break;
}
case5:
//按总分查学生信息和平均分数
{printf("请输入要查找的总分:
");
scanf("%d",&search_scoresum);
searchsum(stu,n,search_scoresum);
scanf("%*2c");break;
}
case6:
//按学号查学生信息和平均分数(顺序查找)
{printf("请输入要查找的学号:
");
scanf("%s",search_num);
searchnum(stu,n,search_num);
scanf("%*2c");break;
}
case7:
//按姓名查学生信息和平均分数
{printf("请输入要查找的姓名:
");
scanf("%s",search_name);
searchname(stu,n,search_name);
scanf("%*2c");break;
}
case8:
//计算各门课的平均分数
{countave(stu,n);
scanf("%*2c");break;
}
case9:
//显示学生信息表
{printf("学生信息表\n");
printtable(stu,n);scanf("%*2c");break;
}
}
}
}
2.函数源程序文件
//********************************
//***应用结构数组、工程处理学生的函数studentfun_1.c***
//******
//***学号:
姓名:
日期:
2006.5.20***
//********************************
/*
*/
intmenu()
{intcode;
printf("\n菜单\n");
printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃0.退出┃\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("┃9.显示学生信息┃\n");
printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("选择代码(0,1,2,3,4,5,6,7,8,9):
");
scanf("%d",&code);
returncode;
}
//从正文文件studentf.txt读入数据,建立学生信息结构数组
voidreadsi(structstudentstud[],int*n)
{FILE*fp;
inti;
if((fp=fopen("studentf.txt","r"))==NULL)
{printf("不能打开studentf.txt文件!
\n");
exit
(1);
}
for(i=0;!
feof(fp);i++)
{(*n)++;
if(*n>N)
{printf("最多处理%d位学生信息!
\n",N);
return;
}
fscanf(fp,"%s%s%s%d%d%d%d%d%d",stud[i].num,stud[i].name,stud[i].sex,
&stud[i].birthday.year,&stud[i].birthday.month,&stud[i].birthday.day,
&stud[i].score[0],&stud[i].score[1],&stud[i].score[2]);
//需要计算的变量不用读入如总分和平均分。
stud[i].score[3]=stud[i].score[0]+stud[i].score[1]+stud[i].score[2];
stud[i].score[4]=(int)(stud[i].score[3])/3;
}
fclose(fp);
}
//1显示学生信息
voidprintsi(structstudent*pstu,intn)
{inti,k=0;
printf("\n学号姓名性别年月日高等数学C语言电工基础总分平均分\n");
for(i=0;i {printf("%-9s%-8s%-2s%7d%3d%3d%7d%8d%8d%6d%7d\n",pstu[i].num,pstu[i].name,pstu[i].sex, pstu[i].birthday.year,pstu[i].birthday.month,pstu[i].birthday.day,pstu[i].score[0], pstu[i].score[1],pstu[i].score[2],pstu[i].score[3],pstu[i].score[4]); k++; if(k%20==0)scanf("%*c"); } } //2显示按总分排序后的学生信息--用冒泡法 voidzfsort(structstudent*ptscore,intn) {structstudenttemp; inti,j; for(j=0;j for(i=0;i if(ptscore[i].score[3] {temp=ptscore[i]; ptscore[i]=ptscore[i+1]; ptscore[i+1]=temp; } } //3显示按学号排序后的学生信息--用冒泡法 voidnumsort(structstudent*ptnum,intn) {structstudenttemp; inti,j; for(j=0;j for(i=0;i if(strcmp(ptnum[i].num,ptnum[i+1].num)>0) {temp=ptnum[i]; ptnum[i]=ptnum[i+1]; ptnum[i+1]=temp; } } //4显示按姓名排序后的学生信息--用冒泡法 voidnamesort(structstudent*ptname,intn) {structstudenttemp; inti,j; for(j=0;j for(i=0;i if(strcmp(ptname[i].name,ptname[i+1].name)>0) {temp=ptname[i]; ptname[i]=ptname[i+1]; ptname[i+1]=temp; } } //5按总分查学生信息和平均分数 voidsearchsum(structstudent*psum,intn,intscoresum) {inti=0; while(psum[i].score[3]! =scoresum) i++; printf("\n您所查找总分为%d的学生信息如下",scoresum); printf("\n学号姓名性别年月日高等数学C语言电工基础总分平均分\n"); printf("%-9s%-8s%-2s%7d%3d%3d%7d%8d%8d%6d%7d\n",psum[i].num,psum[i].name,psum[i].sex, psum[i].birthday.year,psum[i].birthday.month,psum[i].birthday.day,psum[i].score[0], psum[i].score[1],psum[i].score[2],psum[i].score[3],psum[i].score[4]); } //6按学号查学生信息和平均分数 voidsearchnum(structstudent*pnum,intn,charsearch_num[10]) {inti=0; while(strcmp(search_num,pnum[i].num)! =0)i++; if(i>=n)printf("没有找到该学号的学生,请重试! ! ! \n"); else {printf("\n您所查找学号为%s的学生信息如下",search_num); printf("\n学号姓名性别年月日高等数学C语言电工基础总分平均分\n"); printf("%-9s%-8s%-2s%7d%3d%3d%7d%8d%8d%6d%7d\n",pnum[i].num,pnum[i].name,pnum[i].sex, pnum[i].birthday.year,pnum[i].birthday.month,pnum[i].birthday.day,pnum[i].score[0], pnum[i].score[1],pnum[i].score[2],pnum[i].score[3],pnum[i].score[4]); } } //7按姓名查学生信息和平均分数 voidsearchname(structstudent*pname,intn,charsearch_name[10]) {inti=0; while(strcmp(search_name,pname[i].name)! =0) i++; printf("\n您所查找姓名为%s的学生信息如下",search_name); printf("\n学号姓名性别年月日高等数学C语言电工基础总分平均分\n"); printf("%-9s%-8s%-2s%7d%3d%3d%7d%8d%8d%6d%7d\n",pname[i].num,pname[i].name,pname[i].sex, pname[i].birthday.year,pname[i].birthday.month,pname[i].birthday.day,pname[i].score[0], pname[i].score[1],pname[i].score[2],pname[i].score[3],pname[i].score[4]); } //8计算各门课的平均分数 voidcountave(structstudent*ave,intn) {inti,j; floataven[3]={0.0}; for(i=0;i<3;i++) for(j=0;j aven[i]=aven[i]+ave[j].score[i]; printf("\n高等数学C语言电工基础\n"); printf("平均分"); for(i=0;i<3;i++) printf("%-10.2f",aven[i]/n); } //9显示学生信息表 voidprinttable(structstudent*pstu,intn) {inti,k=0; structstudentstuA[N]; for(i=0;i stuA[i]=pstu[i]; printf("\n"); printf("┏━━━┳━━━┳━━┳━━━━━┳━━━━┳━━━┳━━━━┳━━┳━━━┓\n"); printf("┃学号┃姓名┃性别┃年月日┃大学英语┃C语言┃电工基础┃总分┃平均分┃\n"); printf("┣━━━╋━━━╋━━╋━━━━━╋━━━━╋━━━╋━━━━╋━━╋━━━┫\n"); for(i=0;i {printf("┃%-6s┃%-6s┃%-4s┃%4d%3d%3d┃%8d┃%6d┃%8d┃%4d┃%6d┃\n",stuA[i].num,stuA[i].name,stuA[i].sex, stuA[i].birthday.year,stuA[i].birthday.month,stuA[i].birthday.day, stuA[i].score[0],stuA[i].score[1],stuA[i].score[2],stuA[i].score[3],stuA[i].score[4],stuA[i].score[5]); if(i==n-1) printf("┗━━━┻━━━┻━━┻━━━━━┻━━━━┻━━━┻━━━━┻━━┻━━━┛\n"); else printf("┣━━━╋━━━╋━━╋━━━━━╋━━━━╋━━━╋━━━━╋━━╋━━━┫\n"); k++; if(k%20==0) scanf("%*c"); } } 四、设计任务和进度 在已设计的程序组织框架上完成各功能块函数的设计、编程和调试任务。 具体进度如表1所示。 表1设计任务进度 序号 设计任务内容 学时数 1 1-1显示学生信息 1-9显示学生信息表 2 2 1-2按总分递减排序 1-3按学号递增排序 1-4按姓名递增排序 3 3 1-5按总分查学生信息和平均分数 1-6按学号查学生信息和平均分数 1-7按姓名查学生信息和平均分数 1-8计算各门课的平均分数 2 五、实验报告 实验报告内容要求: 1.函数原型、功能和参数说明; 2.每个函数的流程图(分别选择“排序”和“查学生信息和平均分数”绘制二张函数流程图); 3.程序清单; 4.运行结果。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高级 语言程序设计 综合性 实验 指导书 06