inti,j;
intmax,min;//最高分和最低分
if(flag==0)
{
}
elseif(flag==1)
{
}
getchar();
}
voidcountStu_Failed_Excellent()//case5:
统计每名学生的不及格课程门数和优秀课程门数
{
}
//按学生平均分的高低排序,一定已经执行了第3项,计算出了总分和平均分
voidsort_By_Average(intflag)//case6:
case9:
flag=0:
按学生平均分的高低排序;flag=1:
按课程平均分排序
{
system("cls");
inti,j;
if(flag==0)
{
}
elseif(flag==1)
{
}
getchar();
}
voidcalculateCourse_Average_Failrate()//case7:
计算每门课程的平均分和不及格率
{
}
2)操作步骤
(1)设置全局变量
以前只有一个主函数,所有的变量都定义在主函数中,现在要定义多个函数,每个函数都要用到公共的变量,因此将这些变量定义为全局变量。
将下面的变量的定义在主函数的外面,写在全局变量定义区框内。
charstudentname[10][15]={"zhanglili","chenjunwei","fanweiyong","tangjinquan",
"pengtianyi","liuhao","wuling","sunpeipei","shenhaiyan",
"tangxueyan"};
charcoursename[4][10]={"math","chinese","english","c++"};
intstudentscore[10][7]={{0,1,78,56,98,90,0},{0,2,65,78,92,98,0},
{0,3,34,87,89,80,0},{0,4,77,88,65,77,0},
{0,5,56,66,43,66,0},{0,6,67,87,77,98,0},
{0,7,87,67,35,97,0},{0,8,78,67,87,60,0},
{0,9,67,76,88,72,0},{0,10,80,96,79,58,0},
};
//二维数组学生成绩是10行7列,第0列用来排名次,第1列存放学号,
//第2,3,4,5列存放4门课程的成绩,第6列存放总分,初始化时为0
doublestudentavg[10];//存放每名学生的平均成绩
intcoursesum[4];//存放每门课程总和
doublecourseavg[4];//存放每门课程的平均成绩
doublecoursefailed[4];//存放每门课程的不及格率
(2)函数的定义
在main()函数的下面,定义其他函数,主函数和其他函数是并列关系,不是包含关系,切不可将其他函数定义在主函数之内,一定在主函数的外面。
A.设计outputStudentScore()函数,输出学生成绩,将原来系统中case2:
中的语句,除了break外,其他语句剪切到outputStudentScore()函数体中,如下面的代码所示。
局部变量要自己定义,如这里的循环变量i。
voidoutputStudentScore()//case2:
输出学生的成绩
{
system("cls");
cout<cout<<<cout<<"---------------------------------------------------------"<for(inti=0;i<10;i++)
{
cout<cout<cout<<<<}
cout<<"---------------------------------------------------------"<getchar();
}
B.设计score_Highest_Lowest(intflag)函数,如果flag=0,输出每名学生的最高分和最低分;如果flag=1,输出每门课程的最高分和最低分。
将原来系统中case4:
中的语句,剪切到该函数的定义函数体1中;将case8:
中的语句,剪切到该函数的定义函数体2中,如下面代码所示。
其他函数的定义与此类似。
voidscore_Highest_Lowest(intflag)//case4:
case8:
求二维数组的最大值和最小值,flag=0:
求每行的最高分和最低分;flag=1:
求每列的最高分和最低分;
{
system("cls");
cout<inti,j;
intmax,min;//最高分和最低分
if(flag==0)
{
cout<<<<cout<<"--------------------------------------------------------------------"<for(i=0;i<10;i++)
{
cout<cout<cout<<<<//求最高分和最低分
max=studentscore[i][2];
min=studentscore[i][2];
for(j=3;j<6;j++)
{
if(maxmax=studentscore[i][j];
if(min>studentscore[i][j])
min=studentscore[i][j];
}
//输出最高分和最低分
cout<}
cout<<"--------------------------------------------------------------------"<}
else
{
cout<<cout<<"--------------------------------------------"<for(i=0;i<4;i++)
{
cout<//求最高分和最低分
max=studentscore[0][i+2];
min=studentscore[0][i+2];
for(j=1;j<10;j++)
{
if(maxmax=studentscore[j][i+2];
if(min>studentscore[j][i+2])
min=studentscore[j][i+2];
}
cout<}
cout<<"--------------------------------------------"<}
getchar();
}
(3)函数声明
在主函数的后面定义的函数,在调用之前一定要声明。
将下面函数的声明语句,放在“函数的声明语句区”框内。
voidoutputStudentScore();//case2:
输出学生的各门课成绩
voidcalculateStu_Total_Average();//case3:
计算每名学生的总分和平均分
voidscore_Highest_Lowest(intflag);//case4:
case8:
求二维数组的最大值和最小值,
//flag=0:
求每行的最高分和最低分;
//flag=1:
求每列的最高分和最低分;
voidcountStu_Failed_Excellent();//case5:
统计每名学生不及格课程门数和优秀课程门数
voidsort_By_Average(intflag);//case6:
case9:
排序
//flag=0:
按学生平均分的高低排序;
//flag=1:
按课程平均分排序
voidcalculateCourse_Average_Failrate();//case7:
计算每门课程的平均分和不及格率
(4)函数调用
在对应的case语句内,写上对应的函数调用语句,举例略。
3)总结
函数实现了模块化管理,使主函数更加简洁。
在函数外定义的变量,称全局变量,供其他函数使用;在函数内定义的变量,称局部变量,供本函数使用。
2.头文件模块
为了进一步模块化,还可以使用头文件。
将函数写在一个头文件中,使用时只需将其包括进来就可以了。
用到了多个文件,就使用工作组和项目来管理文件,这样更方便使用VSS来管理。
使用多个头文件时,要避免数据重复定义的问题,数据集合中,某个数据如果首次被某个函数使用,就在该函数中定义。
其他函数在使用时就不需要再定义,直接使用就行了;如果再定义数据,会出现数据被重复定义的错误信息。
数据与首次被使用的函数之间的关系图
1)工程任务
下面给出程序框架,根据操作步骤完善程序。
#include//输入输出头文件
#include//system("cls"),清屏函数的头文件
#include//getchar(),接收一个字符函数的头文件,起到暂停作用;
#include//setw()函数的头文件
#include//strcpy()函数的头文件
voidmain()
{
intoptions;//用来存放选项的变量
do//循环语句
{
system("cls");//清屏函数
cout<<"学生成绩管理系统"<cout<<"=========================================="<cout<cout<<"1.输入学生成绩"<cout<<"2.输出学生成绩"<cout<<"3.计算每名学生的总分和平均分"<cout<<"4.输出每名学生的最高分和最低分"<cout<<"5.统计每名学生的不及格课程门数和优秀课程门数"<cout<<"6.按学生平均分的高低排序"<cout<<"7.计算每门课程的平均分和不及格率"<cout<<"8.输出每门课程的最高分和最低分"<cout<<"9.按每门课程平均分的高低排序"<cout<<"10.退出"<cout<<"=========================================="<cout<<"输入选项(1-10):
";
cin>>options;
switch(options)
{
case1:
//输入学生成绩
system("cls");
cout<"<getchar();
break;
case2:
//输出学生成绩
outputStudentScore();
break;
case3:
//计算每名学生的总分和平均分
calculateStu_Total_Average();
break;
case4:
//输出每名学生的最高分和最低分
score_Highest_Lowest(0);//flag=0
system("cls");
break;
case5:
//统计每名学生的不及格课程门数和优秀课程门数
countStu_Failed_Excellent();
break;
case6:
//按学生平均分的高低排序,先执行第3项,计算总分和平均分
sort_By_Average(0);//flag=0
break;
case7:
//计算每门课程的平均分和不及格率
calculateCourse_Average_Failrate();
break;
case8:
//输出每门课程的最高分和最低分
score_Highest_Lowest
(1);//flag=1
break;
case9:
//按每门课程平均分的高低排序
sort_By_Average
(1);//flag=1
break;
case10:
//退出
;
}
}while(options!
=10);
system("cls");
}
2)操作步骤
仅此一个为例,其他头文件的方法都类似
(1)新建工作组
打开VisualC++6.0,选择File菜单New选项,在New对话框中选择Workspaces,设置工作目录为D:
\,输入工作组名称StudentScoreMIS_3_2,如下图所示,单击OK,就建好了一个空的工作组。
(2)新建项目
选择File菜单New选项,在New对话框中选择Projects,在左侧窗口中选择Win32ConsoleApplication,在右侧选中Addtocurrentworkspace选项,输入项目名称StudentScoreMIS_3_2,如下图所示。
单击OK后,出现下图,选择Anemptyproject,单击Finish按钮,在出现的对话框中,如下下图所示,单击OK,就建好了。
(3)新建源程序
选择File菜单New选项,在New对话框中选择Files,左侧选择C++SourceFile,右侧选中Addtoproject,输入源程序名StudentScore_3_2,单击OK,就进入源代码编辑窗口。
将函数模块的代码,全部复制到当前窗口,下面将函数修改成头文件。
(4)新建头文件
学生成绩管理系统中的第二选项“输出学生成绩”,将函数voidoutputStudentScore()放在头文件中,选择File菜单New选项,在New对话框中选择Files,在窗口左侧选择C/C++HeaderFile,右侧输入头文件名outputStudentScore,单击OK,就建了一个空的头文件。
编辑头文件,第一:
将原来系统中的函数voidoutputStudentScore()的定义部分,剪切到头文件中;第二:
根据函数与数据的关系图,将该函数用到的数据也要剪切到头文件中来;第三:
保存头文件。
代码如下所示。
charstudentname[10][15]={"zhanglili","chenjunwei","fanweiyong","tangjinquan",
"pengtianyi","liuhao","wuling","sunpeipei","shenhaiyan",
"tangxueyan"};
intstudentscore[10][7]={{0,1,78,56,98,90,0},{0,2,65,78,92,98,0},
{0,3,34,87,89,80,0},{0,4,77,88,65,77,0},
{0,5,56,66,43,66,0},{0,6,67,87,77,98,0},
{0,7,87,67,35,97,0},{0,8,78,67,87,60,0},
{0,9,67,76,88,72,0},{0,10,80,96,79,58,0},
};
//二维数组学生成绩是10行7列,第0列用来排名次,第1列存放学号,
//第2,3,4,5列存放4门课程的成绩,第6列存放总分,初始化时为0
voidoutputStudentScore()//case2:
输出学生的成绩
{
system("cls");
cout<cout<<<