软件系统分析与设计 第十三节 成员数组 枚举类型

成员数组

main.cpp

#include “Score.h”
#include “iostream”
using std::cout;
using std::endl;
int main()
{

//Score ZhangSan(58,90,73,81,77);
//Score LiSi(66,52,83,79,61);
//Score WangWu(92,64,100,64,70);
int grades1[]={58,90,73,81,77};
int grades2[]={66,52,83,79,61};
int grades3[]={92,64,100,64,70};

Score ZhangSan(grades1);
Score LiSi(grades2);
Score WangWu(grades3);
Score::outputTitle();

ZhangSan.output();
LiSi.output();
WangWu.output();

Score::outputTitle();
ZhangSan.changeGrade(2,1.2);
WangWu.changeGrade(1,0.7);
ZhangSan.output();
LiSi.output();
WangWu.output();

return 0;
}

Score.cpp

#include “Score.h”
#include
#include //包含标准库的头文件
#include “round.h” //round
using std::cout;
using std::endl;
using namespace std;
using std::fixed;
using std::setprecision;
using std::left;
using std::setw;

int Score::getSum()
{
//int sum = this->chinese +this->english + this->maths+this->chemistry+
// this->physical;
int sum=0;
for(int index=0;index<amount;index++)
{
sum+=grades[index];
}
return sum;
}
//求平均值
double Score::getAverage()
{
return getSum()/static_cast(amount);
}
//输出各科成绩即平均值
void Score::output()
{
/**
cout<<setw(columnWidth)<chinese;
cout<maths<<setw(columnWidth);
cout<english<<setw(columnWidth);
cout<physical<<setw(columnWidth);
cout<chemistry<<setw(columnWidth);
cout<getSum()<<setw(columnWidth);
cout<getAverage()<<setw(columnWidth);
cout<<setw(columnWidth)<<toPoint(this->getAverage())<<endl;
**/
for(int index=0;index<amount;index++)
{
cout<<setw(columnWidth)<<grades[index];

}
//在成员函数体中直接写成员变量和常量 省略了this和类名
cout<<setw(columnWidth)<<getSum();
cout<<setw(columnWidth)<<getAverage();
cout<<setw(columnWidth)<<toPoint(getAverage())<<endl;
}
void Score::outputTitle()
{
cout<<left;
cout<<fixed<<setprecision(2);
//setw只对下一个被输出的数据有效,不会一直有效
cout<<setw(columnWidth)<<“chinese”
<<setw(columnWidth)<<“maths”
<<setw(columnWidth)<<“english”
<<setw(columnWidth)<<“physical”
<<setw(columnWidth)<<“chemistry”
<<setw(columnWidth)<<“sum”
<<setw(columnWidth)<<“average”
<<setw(columnWidth)<<“averagePoint”<<endl;
}
//将一个百分制的成绩转换为绩点
double toPoint(int grade)
{
if(grade<Score::passLimit) //不能省略Score::
return 0.0;
if(grade>=Score::passLimit)
return (grade-Score::passLimit)/10.0+1.0;
}

//计算某个学生(score类型结构变量)的平均分绩点
double Score::getAveragePoint()
{
double average=this->getAverage();
int integer=round(average);
return toPoint(integer);

}
Score::Score(int grades[]) //数组型形参从事等价于指针型形参
{
//形参grades的五个元素,赋值给数组型成员grades的五个元素
for(int index=0;index<amount;index++)
this->grades[index]=grades[index]; //this不能省略
}

void Score::changeGrade(int index,double multiple)

{
grades[index-1]=getNewGrade(grades[index-1],multiple);
/*
switch(index)
{
case 1: chinese=getNewGrade(chinese,multiple);break;
case 2: maths=getNewGrade(maths,multiple);break;
case 3: english=getNewGrade(english,multiple);break;
case 4: physical=getNewGrade(physical,multiple);break;
case 5: chemistry=getNewGrade(chemistry,multiple);break;
}
*/

}

/*
Score::Score(int chinese,int maths,int english,int physical,int chemistry)
//:grades0,…(错误)
//不能在初始化列表中直接初始化数组型成员
{

grades[0]=chinese;
grades[1]=maths;
grades[2]=english;
grades[3]=physical;
grades[4]=chemistry;

}
/
int Score::getNewGrade(int oldGrade,double multiple)
{
//在成员函数里用类的两个常量,Score::可以省略
int newGrade=round(oldGrade
multiple);
if(passLimit<=oldGrade&&oldGrade<=100) //及格
{
if(newGrade<passLimit-1) newGrade=passLimit;
else if(fullLimit<newGrade) newGrade=fullLimit;
}
else if(0<=oldGrade&&oldGrade<passLimit)
{
if(newGrade<0) newGrade=0;
else if(passLimit<newGrade) newGrade=passLimit-1;
}
return newGrade;

}

Score.h

#ifndef SCORE_H_INCLUDED
#define SCORE_H_INCLUDED

class Score
{

private:
//五个成员变量
//int chinese;
//int maths;
//int english;
//int physical;
//int chemistry;
//一个含有五个元素的数组型成员
static const int amount=5;//科目的数量
int grades[amount];
int getNewGrade(int oldGrade,double multiple);

public:
int getSum();
double getAverage();
void output();
double getAveragePoint();
static void outputTitle();
void changeGrade(int index,double multiple);
static const int passLimit=60;
static const int fullLimit=100;

public:

Score(int grades[]);

};
const int columnWidth=10; //列的宽度
double toPoint(int grade);
//将五个成员变量改为一个数组型成员,这改动了类含有的数据结构
//势必会对操作的实现带来剧烈的改动
#endif // SCORE_H_INCLUDED

round.cpp

int round(double floating)
{
int interger=static_cast(floating);
double decimal =floating-interger;
if(decimal>=0.5)
interger++;
return interger;
}

round.h

#ifndef ROUND_H_INCLUDED
#define ROUND_H_INCLUDED

int round(double floating); //将浮点数floating四舍五入成为整数,并返回整数值

#endif // ROUND_H_INCLUDED

枚举类型

main.cpp

#include “Score.h”
#include “iostream”
using std::cout;
using std::endl;
int main()
{

int grades1[]={58,90,73,81,77};
int grades2[]={66,52,83,79,61};
int grades3[]={92,64,100,64,70};

Score ZhangSan(grades1);
Score LiSi(grades2);
Score WangWu(grades3);

Score::outputTitle();

ZhangSan.output();
LiSi.output();
WangWu.output();

Score::outputTitle();
//ZhangSan.changeGrade(2,1.2);
//WangWu.changeGrade(1,0.7);
ZhangSan.changeGrade(Score::maths,1.2);
WangWu.changeGrade(Score::chinese,0.7);
ZhangSan.output();
LiSi.output();
WangWu.output();

return 0;
}

Score.cpp

#include “Score.h”
#include
#include //包含标准库的头文件
#include “round.h” //round
using std::cout;
using std::endl;
using namespace std;
using std::fixed;
using std::setprecision;
using std::left;
using std::setw;

int Score::getSum()
{
int sum=0;
for(int index=0;index<amount;index++)
{
sum+=grades[index];
}
return sum;
}
//求平均值
double Score::getAverage()
{
return getSum()/static_cast(amount);
}
//输出各科成绩即平均值
void Score::output()
{

for(int index=0;index<amount;index++)
{
    cout<<setw(columnWidth)<<grades[index];

}
cout<<setw(columnWidth)<<getSum();
cout<<setw(columnWidth)<<getAverage();
cout<<setw(columnWidth)<<toPoint(getAverage())<<endl;

}
void Score::outputTitle()
{
cout<<left;
cout<<fixed<<setprecision(2);
cout<<setw(columnWidth)<<“chinese”
<<setw(columnWidth)<<“maths”
<<setw(columnWidth)<<“english”
<<setw(columnWidth)<<“physical”
<<setw(columnWidth)<<“chemistry”
<<setw(columnWidth)<<“sum”
<<setw(columnWidth)<<“average”
<<setw(columnWidth)<<“averagePoint”<<endl;
}
//将一个百分制的成绩转换为绩点
double toPoint(int grade)
{
if(grade<Score::passLimit)
return 0.0;
if(grade>=Score::passLimit)
return (grade-Score::passLimit)/10.0+1.0;
}

double Score::getAveragePoint()
{
double average=this->getAverage();
int integer=round(average);
return toPoint(integer);

}
Score::Score(int grades[])
{
for(int index=0;index<amount;index++)
this->grades[index]=grades[index];
}

void Score::changeGrade(int index,double multiple)

{
grades[index]=getNewGrade(grades[index],multiple);
}

int Score::getNewGrade(int oldGrade,double multiple)
{
int newGrade=round(oldGrade*multiple);
if(passLimit<=oldGrade&&oldGrade<=100) //及格
{
if(newGrade<passLimit-1) newGrade=passLimit;
else if(fullLimit<newGrade) newGrade=fullLimit;

}
else if(0<=oldGrade&&oldGrade<passLimit)
{
if(newGrade<0) newGrade=0;
else if(passLimit<newGrade) newGrade=passLimit-1;
}
return newGrade;

}

Score.h

#ifndef SCORE_H_INCLUDED
#define SCORE_H_INCLUDED

class Score
{

public:
int getSum();
double getAverage();
void output();
double getAveragePoint();
static void outputTitle();
void changeGrade(int index,double multiple);
static const int passLimit=60;
static const int fullLimit=100;
Score(int grades[]);
//static const int amount=5;
//枚举类型:将一些整数值与一些名称(枚举字面量)建立对应关系
enum //嵌入在Score类之中的匿名枚举类型
{
chinese, // 第一个枚举字面量的默认值一定是0
maths, //后续枚举字面量的默认值一定是前一个枚举字面量的值+1
english, //没赋值的时候才有默认值
physical,
chemistry,
amount
};
//class 类
//struct 结构类型
//union 联合类型

private:

//static const int amount=5;//科目的数量
int grades[amount];
int getNewGrade(int oldGrade,double multiple);

};
const int columnWidth=10; //列的宽度
double toPoint(int grade);
#endif // SCORE_H_INCLUDED

round.cpp

int round(double floating)
{
int interger=static_cast(floating);
double decimal =floating-interger;
if(decimal>=0.5)
interger++;
return interger;
}

round.h

#ifndef ROUND_H_INCLUDED
#define ROUND_H_INCLUDED

int round(double floating); //将浮点数floating四舍五入成为整数,并返回整数值

#endif // ROUND_H_INCLUDED

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值