C++静态成员相关。

麻烦指出问题加以改正


设计一个学生类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();
}
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7577149
  • 这篇博客你也可以参考下:C++程序设计:字符图形输出(空白三角形)
  • 除此之外, 这篇博客: C++ 类与对象 附加练习题中的 收获: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 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的情况!

  • 您还可以看一下 王桂林老师的<3>华为工程师 ,带你实战C++(2018版)课程中的 02仿函数与智能指针的自实现小节, 巩固相关知识点