C语言实验八样例

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

《C语言程序设计实验》实验报告
实验八结构体编程
班级:_07某某专业1班_
学号:__**********____
姓名:___实验样例_____
日期:___2008.6.10_____
台州学院数信学院计算机系制作
一、实验目的和要求
综合使用基本结构、基本算法、函数、指针、结构体、链表等知识设计程序。

二、实验指导
1、注意:本次实验为综合性实验,需要综合本课程以前所学内容,完成编制一个小型应用程序。

需要复习课本以前所学内容,浏览上课讲解的相关内容。

2、实验时间安排:准备实验方案,上课时上机编程,课余完成整个设计并完成实验报告。

3、实验具体要求:以一张假想的学生期中成绩表为实验对象,编制一个小型应用程序,可以考虑实现以下功能:(1)成绩修改;(2)成绩查询;(3)成绩统计。

也可以实现其他自定义的功能。

界面采用简易菜单形式,可以分级显示。

实验需要进行以下步骤:需求分析、程序设计、程序调试、程序运行,并对程序运行效果进行分析,提出改进方案。

初步锻炼学生的程序设计能力、程序调试能力、对实验结果进行综合分析的能力。

4、实验成绩评价标准:参见成绩评定表。

四、实验报告内容(参见样本,请另附页)
实验报告必须包含以下内容:
1、对你设计的程序功能进行的较详细描述。

2、画出程序测试用的学生期中成绩表(包含:表头、若干行包含学生成绩等信息的数据行)。

3、给出程序清单(包含结构体的声明与定义、所有的函数声明、所有的全局变量、所有的函数定义、必要的注释。

注:如果程序过长,可以不用给出所有的函数定义,只给出主要的函数定义)。

4、运行结果(写出运行时的主界面、各模块的实现界面等,不作具体要求,但要求能清晰地体现出程序的功能)。

5、对你的设计作一个评价(可以包含你所花的时间、精力,你遇到的困难及如何解决的,你的设计过程所遇到的其他事情;必须包含你对设计的客观评价,以及提出的改进方案)。

1、程序功能描述:
程序名称:高二(3)班期中成绩管理程序
本程序对本班的期中成绩进行管理,管理的成绩表包含下列信息:学生学号、姓名、性别、语文成绩、数学成绩、英语成绩、总分,学生人数为5人。

功能包含:(1)成绩修改:根据学号修改成绩;(2)成绩查询:可以根据学号查询一个学生的成绩,也可显示所有学生的成绩;(3)成绩统计:可以统计全班人数,每门课的平均分。

程序采用菜单管理,操作方便,适合本班班主任在期中考试以后使用。

2、成绩表样表:
3、程序清单:
#include <stdio.h>
struct student /*期中成绩表的结构声明*/
{
int num;
char name[20];
char sex;
float YuWen;
float ShuXue;
float YingYu;
float totle;
};
/*定义5个学生的信息:*/
#define STU_NUMBER 5 /*宏定义学生数为5*/
struct student Stu[STU_NUMBER]={{1001,"张三",'M',78,85,50,0},
{1002,"李四",'M',89,79,69,0},
{1003,"王五",'F',85,76,87,0},
{1004,"钱六",'M',64,76,70,0},
{1005,"赵七",'F',92,93,94,0} };
int SelectMainMenu(); /*显示并选择主菜单。

返回:被选择的菜单项*/
/*所有的函数声明:*/
void Modify(); /*成绩修改模块*/
void Show(); /*成绩查询模块*/
void Stat(); /*成绩统计模块*/
void StatAve(float *AveYuWen,float *AveShuXue,float *AveYingYu);/*统计平均分*/ int FindStudent(int num); /*根据学号查找某一学生*/
void SetAllTotle(); /*计算所有学生总分*/
void SetTotle(int No); /*计算第No个学生总分*/
void ShowAllStudent(); /*显示所有成绩*/
void ShowTitle(); /*显示表头信息*/
void ShowStudent(int No); /*显示第No个的学生信息*/
void main()
{
int isend=0; /*程序结束标志量,0表示不结束,1表示结束*/
SetAllTotle(); /*计算所有学生总分*/
while(1)
{
switch(SelectMainMenu()) /*显示并选择主菜单*/
{
case 1: /*成绩修改*/
Modify(); /*调用成绩修改函数*/
break;
case 2: /*成绩查询*/
Show(); /*调用成绩查询函数*/
break;
case 3: /*成绩统计*/
Stat(); /*调用成绩统计函数*/
break;
case 4: /*退出系统*/
printf("\n谢谢您的使用,再见!\n\n");
isend = 1; /*设置程序结束标志*/
break;
}
if(isend) break; /*程序结束*/
}
}
int SelectMainMenu() /*显示并选择主菜单。

返回:被选择的菜单项*/ {
int menu_no=0;
do /*显示并选择菜单*/
{
printf("\n===============================\n");
printf("《高二(3)班期中成绩管理程序》\n");
printf(" 作者:应老师\n");
printf("===============================\n");
printf(" 主菜单:\n");
printf(" 1 –成绩修改\n");
printf(" 2 –成绩查询\n");
printf(" 3 –成绩统计\n");
printf(" 4 –退出系统\n");
printf(" 请选择(1-4):");
scanf("%d",&menu_no);
}while(menu_no<1 && menu_no>4); /*直到选择出正确的序号*/
return menu_no;
}
void Modify() /*成绩修改模块*/
{
int n,i;
while(1)
{
printf("\n====成绩修改====\n");
printf("请输入学号(输入0退出成绩修改):");
scanf("%d",&n);
if(n==0)break; /*退出成绩修改模块*/
if((i=FindStudent(n))>=0) /*找到学号为n的学生*/
{
ShowTitle(); /*显示表头信息*/
ShowStudent(i); /*显示该学生信息*/
printf("请输入成绩(语文,数学,英语):");
scanf("%f,%f,%f", &Stu[i].YuWen, &Stu[i].ShuXue, &Stu[i].YingYu);
SetTotle(i); /*计算该学生总分*/
printf("----修改成功----\n");
}
else printf("----找不到该学号----\n");
}
}
void Show() /*成绩查询模块*/
{
int n,i;
while(1)
{
printf("\n====成绩查询====\n");
printf("请输入学号(输入0退出成绩查询,输入1查询全部):");
scanf("%d",&n);
if(n==0) break; /*退出成绩查询模块*/
if(n==1) ShowAllStudent(); /*显示所有成绩*/
else if((i=FindStudent(n))>=0) /*找到学号为n的学生*/
{
ShowTitle(); /*显示表头信息*/
ShowStudent(i); /*显示该学生信息*/
}
else printf("----找不到该学号----\n");
}
}
void Stat() /*成绩统计模块*/
{
float AveYuWen, AveShuXue, AveYingYu;
StatAve(&AveYuWen, &AveShuXue, &AveYingYu); /*统计三门课的班级平均分*/ printf("\n====成绩统计====\n");
printf("学生人数:%d\n", STU_NUMBER);
printf("语文平均分:%6.2f\n", AveYuWen);
printf("数学平均分:%6.2f\n", AveShuXue);
printf("英语平均分:%6.2f\n", AveYingYu);
}
/*统计三门课的班级平均分,用指针参数返回*/
void StatAve(float *AveYuWen, float *AveShuXue, float *AveYingYu)
{
int i;
float sumYuWen=0, sumShuXue=0, sumYingYu=0;
for(i=0;i<STU_NUMBER;i++)
{
sumYuWen += Stu[i].YuWen;
sumShuXue += Stu[i].ShuXue;
sumYingYu += Stu[i].YingYu;
}
*AveYuWen = sumYuWen / STU_NUMBER;
*AveShuXue = sumShuXue / STU_NUMBER;
*AveYingYu = sumYingYu / STU_NUMBER;
}
/*根据学号查找某一学生。

返回:-1没找到,>=0该学生所在数组的下标*/
int FindStudent(int num)
{
int i;
for(i=0;i<STU_NUMBER;i++)
if(Stu[i].num==num)break;
if(i<STU_NUMBER) return i; /*找到*/
else return -1; /*没找到*/
}
void SetAllTotle() /*计算所有学生总分*/
{
int i;
for(i=0;i<STU_NUMBER;i++)
SetTotle(i);
void SetTotle(int No) /*计算第No个学生总分*/
{
Stu[No].totle = Stu[No].YuWen + Stu[No].ShuXue + Stu[No].YingYu; }
void ShowAllStudent() /*显示所有成绩*/
{
int i;
ShowTitle();
for(i=0;i<STU_NUMBER;i++)
ShowStudent(i);
}
void ShowTitle() /*显示表头信息*/
{
printf("\n%10s%10s%10s%10s%10s%10s%10s\n","学号","姓名","性别", "语文","数学","英语","总分");
}
void ShowStudent(int No) /*显示第No个的学生信息*/
{
printf("%10d%10s%10c%10g%10g%10g%10g\n",
Stu[No].num, Stu[No].name, Stu[No].sex, Stu[No].YuWen,
Stu[No].ShuXue, Stu[No].YingYu, Stu[No].totle);
}
4、运行结果:
5、分析评价:
我在设计这个程序时采用了模块设计的方法,使用菜单来呈现操作界面,使用函数来实现各个菜单项的功能。

花了大约15个小时的时间,其中大部分时间用于构思、输入程序、调试和写实验报告。

遇到的主要困难是:开始时由于构思不完善,导致程序很乱,等搞清楚主函数和子函数的关系后,程序变得简洁了。

下面对程序分模块进行优缺点的评价,以及提出了改进方案。

(1)主模块
优点:采用菜单模式,程序结构清晰,操作简单。

缺点:(略)
改进方案:添加一项版权信息菜单项。

(2)成绩修改模块
优点:修改成绩时,先显示该学生的成绩信息,以便确认是否修改。

如果输入的学号有误,提醒用户重新输入。

缺点:需要一次性修改语文、数学、英语三门成绩,不能只对其中一门进行修改,也不能在输入学号后放弃修改。

改进方案:(略)
(3)成绩查询模块
优点:可以有两种查询方式,即查询指定学号的成绩和显示所有学生的成绩。

缺点:查询功能显得不足。

改进方案:添加显示指定条件的成绩,如查询有不及格的成绩,查询指定男女的成绩等。

也可考虑采用菜单选择模式,便于放置更多的查询功能。

可以考虑添加排序查询。

(4)成绩统计模块
优点:通过函数分别计算统计结果,使得模块主函数结构清晰。

缺点:统计的项目不够多。

改进方案:添加不及格、最高最低分、名次、方差、分类汇总等统计。

采用菜单形式设置更多的统计项目。

(5)其他
优点:程序结构清晰,注释齐全,变量命名规范。

缺点:结构体定义的数据不够丰富,学生数不够多。

改进方案:增加学生人数,适当增加课程门数,添加平均分、名次栏目。

添加帮助系统。

相关文档
最新文档