一、目的要求
1.理解面向对象的程序设计的特点;
2.学会构造函数的使用和函数重载;
3.学会对象指针的使用、对象的动态建立和释放;
4.理解类的封装性和信息隐藏、析构函数的作用。
二、实验内容:
1.定义学生类,包括学号、姓名、性别、成绩,学生分为两类,课程门数不同,并将课程成绩全部初始化为0;假设有n个学生,由键盘输入学生信息;
2.定义类成员函数,完成修改学生的信息,统计所有学生课程的平均成绩、最高分和最低分;
3.同时输出所有学生信息;
4.通过输入学生学号或姓名查询某学生的信息。
三、实验要求:
1.利用头文件和多个源文件分别实现类的声明、类成员函数的定义和主函数;
2.从键盘输入学生数,为对象动态分配内存空间,并保证对象使用完毕时释放内存空间;
3.定义构造函数完成类成员变量的初始化;
4.利用静态成员变量与静态成员函数统计所有学生课程的平均成绩、最高分和最低分;
5.利用函数的重载实现通过输入学生学号或姓名查询某学生的信息。
兼顾程序的逻辑性、人性化设计,并减少冗余代码,(比如输入时提示输入内容、输出格式一目了然等。
附代码
!!!编译环境 DevC++ 5.11 TDM-GCC 4.9.2 64-Bit Release
头文件 iquery.h
#ifndef _IQUERY_H
#define _IQUERY_H 1
using namespace std;
#define MAXN 100
#define MAXY 5
class student{
private:
int old;
string sex;
string name;
int number;
double chinese;
double math;
double english;
double science;
double art;
double ave_grade; //个人主科综合成绩
static double sum_1[MAXY];
static int count_1;
static double max_allgrade_1[MAXY];
static double min_allgrade_1[MAXY];
static double sum_2[MAXY];
static int count_2;
//第一类 存储平均值和最大最小值的数组
static double ave_allgrade_1[MAXY];
static double max_1[MAXY];
static double min_1[MAXY];
//第二类
static double ave_allgrade_2[MAXY];
static double max_2[MAXY];
static double min_2[MAXY];
public:
void data_input(int idx);
bool data_grade_judge(); //judge 每个学生成绩是否及格
void data_output(int idx);
//查找函数
bool data_search(string pname)const;//重载实现姓名或学号查找 int data_search(int *pnumber);
bool data_search(int pnumber)const;
//析构
~student();
//计算平均数
static double data_ave_allgrade(int idx);
//输出静态变量,实现静态成员封装
static double output_ave_allgrade(int idx);
static double output_max_allgrade(int idx);
static double output_min_allgrade(int idx);
//total函数
void total(int idx);
//找最大最小
void judge_max(int idx);
void judge_min(int idx);
void init_judge_min(int idx); //min数组第一次调用时初始化
//修改
void data_change();
};
#endif
// 类成员函数中const的使用
// 一般放在函数体后,形如:void fun() const;
// 任何不会修改数据成员的函数都因该声明为const类型。
头文件实现文件 iquery,cpp
#include <iostream>
#include "string"
#include "iquery.h"
#include "iomanip"
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void student :: data_input(int idx){
if(idx==1){
cout<<" 姓名:" ;cin>>name;
cout<<" 年龄:" ;cin>>old;
cout<<" 性别:" ;cin>>sex;
cout<<" 学号:" ;cin>>number;
cout<<"接下来依次输入语文,数学,英语,科学成绩"<<endl;
cin>>chinese>>math>>english>>science;
ave_grade=(math+chinese+english)/3;
}
else if(idx==2){
cout<<" 姓名:" ;cin>>name;
cout<<" 年龄:" ;cin>>old;
cout<<" 性别:" ;cin>>sex;
cout<<" 学号:" ;cin>>number;
cout<<"接下来依次输入语文,数学,英语,科学,艺术成绩"<<endl;
cin>>chinese>>math>>english>>science>>art;
ave_grade=(math+chinese+english)/3;
}else{
cout<<"error in student choice, only 1 or 2"<<endl;
}
}
bool student :: data_grade_judge(){
while(chinese<90||math<9