麻烦指出问题加以改正
设计一个学生类CStudent,其结构如下:
私有数据成员No(学号),Name(姓名),DegChi(语文成绩),DegMath(数学成绩),DegEng(英语成绩),两个静态数据成员Sum(总分)和Num(人数);
重载构造函数,实现对类实例对象的带参数初始化和无参数初始化;
公有成员函数SetData();实现键盘随机输入对数据成员赋值;
公有成员函数Display();实现屏幕输出对数据成员;
公有成员函数Average();用于计算学生个人平均分;
设计一个统计类CStatistic,其结构如下:
私有数据成员Nums(学生人数),AvgChi(语文总评成绩),AvgMath(数学总评成绩),AvgEng(英语总评成绩),StuArray(学生对象数组);
公有成员函数Average();用于计算全班平均分;
公有成员函数Sort();实现学生对象数组中的对象按照平均分从高到低排序;
公有成员函数Display();实现屏幕输出对数据成员;
主函数设计要求:
定义一个指向CStatistic对象指针pStatistic,实现对象的初始化或赋值;
#include
using namespace std;
class CStudent{
private:
string No;
string Name;
float DegChi;
float DegMath;
float DegEng;
static float Sum;
static int Num;
public:
CStudent(){
No = "";
Name = "";
DegChi = 0;
DegMath = 0;
DegEng = 0;
}
CStudent(string no, string name, float degchi, float degmath, float degeng){
No = no;
Name = name;
DegChi = degchi;
DegMath = degmath;
DegEng = degeng;
Sum += DegChi + DegMath + DegEng;
Num++;
}
void SetData(){
cout << "请输入学号:";
cin >> No;
cout << "请输入姓名:";
cin >> Name;
cout << "请输入语文成绩:";
cin >> DegChi;
cout << "请输入数学成绩:";
cin >> DegMath;
cout << "请输入英语成绩:";
cin >> DegEng;
Sum += DegChi + DegMath + DegEng;
Num++;
}
void Display(){
cout << "学号:" << No << endl;
cout << "姓名:" << Name << endl;
cout << "语文成绩:" << DegChi << endl;
cout << "数学成绩:" << DegMath << endl;
cout << "英语成绩:" << DegEng << endl;
}
void Average(){
cout << "个人平均分:" << (DegChi + DegMath + DegEng) / 3 << endl;
}
};
float CStudent::Sum = 0;
int CStudent::Num = 0;
class CStatistic{
private:
int Nums;
float AvgChi;
float AvgMath;
float AvgEng;
CStudent StuArray[100];
public:
void Average(){
Nums = CStudent::Num;
AvgChi = CStudent::Sum / Nums / 3;
AvgMath = AvgChi;
AvgEng = AvgChi;
}
void Sort(){
for(int i = 0; i < Nums - 1; i++){
for(int j = i + 1; j < Nums; j++){
if((StuArray[i].DegChi + StuArray[i].DegMath + StuArray[i].DegEng) / 3 < (StuArray[j].DegChi + StuArray[j].DegMath + StuArray[j].DegEng) / 3){
CStudent temp;
temp = StuArray[i];
StuArray[i] = StuArray[j];
StuArray[j] = temp;
}
}
}
}
void Display(){
cout << "语文平均分:" << AvgChi << endl;
cout << "数学平均分:" << AvgMath << endl;
cout << "英语平均分:" << AvgEng << endl;
cout << "---------------------" << endl;
cout << "学生成绩单:" << endl;
for(int i = 0; i < Nums; i++){
StuArray[i].Display();
StuArray[i].Average();
cout << "---------------------" << endl;
}
}
};
int main()
{
CStatistic* pStatistic = new CStatistic();
}
CStatistic是另一个类了,不能访问 CStudent 私有成员
你要把private换成public
public:
string No;
string Name;
float DegChi;
float DegMath;
float DegEng;
大概改了下,加了几个必要的辅助函数。
#include <iostream>
using namespace std;
class CStudent
{
private:
string No;
string Name;
float DegChi;
float DegMath;
float DegEng;
static float Sum;
static int Num;
public:
CStudent()
{
No = "";
Name = "";
DegChi = 0;
DegMath = 0;
DegEng = 0;
}
CStudent(string no, string name, float degchi, float degmath, float degeng)
{
No = no;
Name = name;
DegChi = degchi;
DegMath = degmath;
DegEng = degeng;
Sum += DegChi + DegMath + DegEng;
Num++;
}
void SetData()
{
cout << "请输入学号:";
cin >> No;
cout << "请输入姓名:";
cin >> Name;
cout << "请输入语文成绩:";
cin >> DegChi;
cout << "请输入数学成绩:";
cin >> DegMath;
cout << "请输入英语成绩:";
cin >> DegEng;
Sum += DegChi + DegMath + DegEng;
// Num++;
}
void Display()
{
cout << "学号:" << No << endl;
cout << "姓名:" << Name << endl;
cout << "语文成绩:" << DegChi << endl;
cout << "数学成绩:" << DegMath << endl;
cout << "英语成绩:" << DegEng << endl;
cout << "个人平均分:" << Average() << endl;
}
float Average() // void Average()
{
// cout << "个人平均分:" << (DegChi + DegMath + DegEng) / 3 << endl;
return (DegChi + DegMath + DegEng) / 3;
}
float getChi()
{
return DegChi;
}
float getMath()
{
return DegMath;
}
float getEng()
{
return DegEng;
}
};
float CStudent::Sum = 0;
int CStudent::Num = 0;
class CStatistic
{
private:
int Nums;
float AvgChi;
float AvgMath;
float AvgEng;
CStudent StuArray[100];
public:
CStatistic() { Nums = AvgChi = AvgMath = AvgEng = 0; }
void Average()
{
// AvgChi = AvgEng = AvgMath = 0;
for (int i = 0; i < Nums; i++)
{
AvgChi += StuArray[i].getChi();
AvgEng += StuArray[i].getEng();
AvgMath += StuArray[i].getMath();
}
AvgChi /= Nums;
AvgEng /= Nums;
AvgMath /= Nums;
// Nums = CStudent::Num; // Nums = CStudent::Num;
// AvgChi = CStudent::Sum / Nums / 3;
// AvgMath = AvgChi;
// AvgEng = AvgChi;
}
void Sort()
{
for (int i = 0; i < Nums - 1; i++)
{
for (int j = i + 1; j < Nums; j++)
{
// if ((StuArray[i].DegChi + StuArray[i].DegMath + StuArray[i].DegEng) / 3 < (StuArray[j].DegChi + StuArray[j].DegMath + StuArray[j].DegEng) / 3)
if (StuArray[i].Average() < StuArray[j].Average())
{
CStudent temp;
temp = StuArray[i];
StuArray[i] = StuArray[j];
StuArray[j] = temp;
}
}
}
}
void Display()
{
if (Nums == 0)
{
cout << "没有学生信息" << endl;
return;
}
Average(); //--
cout << "语文平均分:" << AvgChi << endl;
cout << "数学平均分:" << AvgMath << endl;
cout << "英语平均分:" << AvgEng << endl;
cout << "---------------------" << endl;
cout << "学生成绩单:" << endl;
for (int i = 0; i < Nums; i++)
{
StuArray[i].Display();
// StuArray[i].Average();
cout << "---------------------" << endl;
}
}
void setData()
{
cin >> Nums;
for (int i = 0; i < Nums; i++)
StuArray[i].SetData();
}
};
int main()
{
CStatistic *pStatistic = new CStatistic();
pStatistic->setData();
pStatistic->Display();
}
1.约分分数的好方法(转载自ataraxy_thinking):
/*分数化简,关键是求出分母和分子的最大公因数。
这里采用“辗转相除法”求两个整数的最大公因数。
辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。
它的具体做法是:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,
如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。
*/
#include<iostream>
using namespace std;
int main() {
int n, m;
cout << "请分别输入分母和分子:" << endl;
cin >> m >> n;
int m0 = m, n0 = n; //m0和n0保存m和n的原始值
while (m%n != 0) {
int temp = m ;
m = n;
n = temp%n;
}
cout << "原分式的最简分式为: " << n0 / n << "/" << m0 / n << endl;
}
区分大小的情况如下:
int a = t.A, b = t.B;
while (a % b != 0)
{
int temp = a;
a = b;
b = temp % b;
}
int m = (abs(a) < abs(b) ? a : b);
t.A /= m;
t.B /= m;
2.要注意分子等于0的情况!