C++二维数组如何同时求平均成绩和优秀率应该使用那个函数

程序设计,输入10名学生语文、数学、外语课成绩,计算每名学生3门课的平均成绩,输出每个人各科成绩及平均成绩,并分析3门课程的优秀率(90分以上为优秀)。
怎么分析优秀率

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7617400
  • 你也可以参考下这篇文章:【C++】建立一个对象数组,内放5个学生的数据(学号、成绩),用指针指向数组首元素,输出第1,3,5个学生的数据
  • 除此之外, 这篇博客: C++:将表达式构建为二叉树实现一个简单计算器中的 用c++实现一个计算器,支持整数、小数的加减乘除四则运算,允许表达式中出现括号。这里默认输入数据均为格式正常表达式,结果精确到小数点后三位。具体解释详见代码注释。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include <iostream>
    #include <list>
    #include <sstream>
    #include <iomanip>
    using namespace std;
    
    struct Token {  // 一个简单的结构体,成员只有一个字符串,用来储存数值或符号
        string text;
        Token(string text) : text(text) {}
        double doubleValue() {  // 将string类型转化为double类型
            stringstream ss(text);
            double value;
            ss >> value;
            return value;
        }
    };
    
    class Parser {
    
        struct Tree {      // 二叉树
            Token token;   // 储存数值或符号
            Tree * left;   // 指向左子树的指针
            Tree * right;  // 指向右子树的指针
    
            Tree(Token token) : token(token) {
                left = 0;
                right = 0;
            }
            ~Tree() {
                if (left != 0) delete left;
                if (right != 0) delete right;
            }
        };
    
        Tree * expression;  // 指向表达式二叉树的指针
        double result;      // 整个表达式的计算结果
    
        static double execute(Tree * expression) {  // 计算表达式的值
            if (expression->left == 0) {   // 左子树为空时,token储存的是当前子树的值
                return expression->token.doubleValue();
            } else {   // 左右子树均存在,分别计算左右子树的值,再根据符号进行四则运算
                double left = execute(expression->left);
                double right = execute(expression->right);
                switch (expression->token.text[0]) { // 左右子树均存在时,token储存的是符号
                    case '+': return left + right;
                    case '-': return left - right;
                    case '*': return left * right;
                    case '/': return left / right;
                }
                // 这里不加的话会报warning: control may reach end of non-void function
                return 0;
            }
         }
    
    public:  
        Parser() {
            expression = 0;
        }
    
        ~Parser() {
            if (expression != 0) delete expression;
        }
    
        // 执行表达式计算
        double execute() {
            if (expression != 0) {
                result = execute(expression);
                delete expression;
                expression = 0;
            }
            return result;
        }
    
        // 创建一棵新树, 这里用list模拟实现栈的功能
        void create(list<Tree*> &subTreeStack, list<string> &operatorStack) {
            Tree* node = new Tree(Token(operatorStack.back()));  // 新子树值为此时符号栈的顶部
            operatorStack.pop_back();              // pop掉符号栈的栈顶
            node->right = subTreeStack.back();     // 新树的右孩子为子树栈的顶部
            subTreeStack.pop_back();               // pop掉子树栈的栈顶
            if (!subTreeStack.empty()) {
                node->left = subTreeStack.back();  // 新树的左孩子为此时子树栈的顶部
                subTreeStack.pop_back();
            } else {  // 考虑特殊情况: -5、-0、+0 
                Tree* temp = new Tree(Token("0"));
                node->left = temp;                 // 新树的左孩子为一个值为0的子树
            }
            subTreeStack.push_back(node);   // 新树加进栈顶
        }
    
        // 将表达式构建成一棵二叉树
        void parse(string str) {
            list<Tree*> subTreeStack;    // 子树栈
            list<string> operatorStack;  // 符号栈
    
            for (unsigned i = 0; i < str.length(); i++) {
                if (str[i] >= '0' && str[i] <= '9') {  // 数字则为叶子节点
                    string value = "";
                    for (unsigned j = i; j < str.length(); j++) {  // 提取数字,包含可能存在的小数点
                        if ((str[j] >= '0' && str[j] <= '9') || str[j] == '.') {
                            value += str[j];
                            i = j;
                        } else {
                            break;
                        }
                    }
                    Tree* node = new Tree(Token(value));
                    subTreeStack.push_back(node);
                } else if (str[i] == '+' || str[i] == '-') {
                    string value = "";
                    value += str[i];
                    if (operatorStack.empty()) {
                        operatorStack.push_back(value);
                    } else {
                        if (i >= 1 && str[i-1] == '(') // 当出现(- 或者(+ 手动添加一个值为0的子树
                           subTreeStack.push_back(new Tree(Token("0")));
                        // 遇到加减符号,如果符号栈不为空,先将此时的栈构建一棵子树,再将该符号入栈
                        while (!operatorStack.empty() &&
                          (operatorStack.back() == "+" || operatorStack.back() == "-"
                            || operatorStack.back() == "*" || operatorStack.back() == "/")) {
                            create(subTreeStack, operatorStack);
                        }
                        operatorStack.push_back(value);
                    }
                } else if (str[i] == '*' || str[i] == '/') {
                    string value = ""; 
                    value += str[i];
                    if (operatorStack.empty()) {
                        operatorStack.push_back(value);
                    } else {
                        // 遇到乘除符号,如果符号栈不为空且栈顶同为乘除符号,先将此时的栈构建一棵子树,再入栈
                        while (!operatorStack.empty() &&
                            (operatorStack.back() == "*" || operatorStack.back() == "/")) {
                            create(subTreeStack, operatorStack);
                        }
                        operatorStack.push_back(value);
                    }
                } else if (str[i] == '(') {
                    string value = "";
                    value += str[i];
                    operatorStack.push_back(value);
                } else if (str[i] == ')') {
                    while (operatorStack.back() != "(") {  // 构建子树,直至遇到 '(' 
                        create(subTreeStack, operatorStack);
                    }
                    operatorStack.pop_back();  // pop '('
                }
            }
    
            while (!operatorStack.empty()) {  // 继续构建二叉树,直至符号栈为空
                create(subTreeStack, operatorStack);
            }
            expression = subTreeStack.back(); // 最后子树栈的栈顶的值即为表达式的值
        }                                 
    };
    
    int main(int argc, char const *argv[]) {  
        Parser p = Parser();  
        string expression;
        while (cin >> expression) {
            if (expression.length() > 0) {  // 不处理空字符串
                p.parse(expression);
                cout << fixed << setprecision(3) <<  p.execute() << endl;
            }
        }
        return 0;
    }
  • 您还可以看一下 朱有鹏老师的朱老师C++第2部分-2.3.C++继承和多态特性课程中的 2.3.20.纯虚函数与抽象类2小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    由于题目太过简单,以下是代码实现:

    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    const int STUD_NUM = 10;//学生人数
    const int COURSE_NUM = 3;//课程数
    
    //定义学生类
    class Student {
    public:
        Student();//构造函数
        void setScore(int index,float score);
        void calcAvg();//计算平均成绩
        void output();//输出成绩
        float getAvg();//获取平均成绩
        float getExcellentRate(int courseIndex);//获取优秀率
    private:
        float score[COURSE_NUM];//存放学生三门课成绩
        float avg;//平均成绩
    };
    
    Student::Student() {
        for (int i = 0; i < COURSE_NUM; i++) {
            score[i] = 0;
        }
        avg = 0;
    }
    
    void Student::setScore(int index, float score) {
        this->score[index] = score;
    }
    
    void Student::calcAvg() {
        float sum = 0;
        for (int i = 0; i < COURSE_NUM; i++) {
            sum += score[i];
        }
        avg = sum / COURSE_NUM;
    }
    
    void Student::output() {
        for (int i = 0; i < COURSE_NUM; i++) {
            cout << setw(8) << score[i];
        }
        cout << setw(8) << avg << endl;
    }
    
    float Student::getAvg() {
        return avg;
    }
    
    float Student::getExcellentRate(int courseIndex) {
        float excellentNum = 0;
        for (int i = 0; i < STUD_NUM; i++) {
            if (score[courseIndex] >= 90) {
                excellentNum++;
            }
        }
        return excellentNum / STUD_NUM;
    }
    
    int main() {
        Student stud[STUD_NUM];
        //读入学生成绩
        for (int i = 0; i < STUD_NUM; i++) {
            cout << "请输入第" << i + 1 << "名学生的成绩(语文,数学,外语): ";
            float ch, math, eng;
            cin >> ch >> math >> eng;
            stud[i].setScore(0, ch);
            stud[i].setScore(1, math);
            stud[i].setScore(2, eng);
    
            stud[i].calcAvg();
        }
        //输出成绩表头
        cout << setw(12) << "语文" << setw(8) << "数学" << setw(8) << "外语" << setw(8) << "平均成绩" << endl;
        //输出学生成绩及平均成绩
        for (int i = 0; i < STUD_NUM; i++) {
            cout << "第" << i + 1 << "名学生: ";
            stud[i].output();
        }
        //输出优秀率
        for (int i = 0; i < COURSE_NUM; i++) {
            cout << "第" << i + 1 << "门课的优秀率: " << stud[0].getExcellentRate(i) * 100 << "%" << endl;
        }
        return 0;
    }
    

循环统计就可以了。

#include <iostream>

using namespace std;

int main() {
    const int num_students = 10;
    const int num_subjects = 3;
    int scores[num_students][num_subjects];
    double averages[num_students];

    // 输入学生成绩
    for (int i = 0; i < num_students; i++) {
        cout << "请输入第" << i + 1 << "名学生的语文、数学、外语成绩:" << endl;
        for (int j = 0; j < num_subjects; j++) {
            cin >> scores[i][j];
        }
    }

    // 计算平均成绩
    for (int i = 0; i < num_students; i++) {
        int sum = 0;
        for (int j = 0; j < num_subjects; j++) {
            sum += scores[i][j];
        }
        averages[i] = (double) sum / num_subjects;
    }

    // 输出每个人各科成绩及平均成绩
    for (int i = 0; i < num_students; i++) {
        cout << "第" << i + 1 << "名学生的语文、数学、外语成绩为:";
        for (int j = 0; j < num_subjects; j++) {
            cout << scores[i][j] << " ";
        }
        cout << ",平均成绩为:" << averages[i] << endl;
    }

    // 计算优秀率
    int excellent_counts[num_subjects] = {0};
    for (int i = 0; i < num_students; i++) {
        for (int j = 0; j < num_subjects; j++) {
            if (scores[i][j] >= 90) {
                excellent_counts[j]++;
            }
        }
    }
    double excellent_rates[num_subjects];
    for (int j = 0; j < num_subjects; j++) {
        excellent_rates[j] = (double) excellent_counts[j] / num_students;
        cout << "第" << j + 1 << "门课的优秀率为:" << excellent_rates[j] << endl;
    }

    return 0;
}