You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++成绩计算程序报错:无匹配候选函数及表达式错误求助

你的C++程序错误解析及修复方案

一、核心错误原因

1. 函数调用传参错误(导致“无匹配候选函数”)

你在main里调用所有函数时,传的是grades[SIZE],这是完全错误的:

  • grades[SIZE]是访问数组的第SIZE个元素(数组下标从0开始,SIZE=5的话,这已经越界了),它的类型是double,但函数参数要求的是double[](本质是指针),类型不匹配直接触发“无匹配候选函数”错误。
  • 正确传参是直接写数组名grades,数组名会自动转换为指向第一个元素的指针,符合函数参数要求。

2. findDropInfo函数的多重问题

  • 返回类型声明为void,但你写了return average;,void函数不能返回值,这是语法错误。
  • 参数double average是值传递,函数内部修改它不会影响main里的变量,必须改成引用double &average才能把计算结果传出去。
  • total变量初始化后完全没使用,直接用(total - lowest)/SIZE算平均分,结果肯定是错的,得先把所有成绩累加起来。
  • lowest的类型是int,但你的成绩是double类型,会丢失小数精度,而且要修改main里的变量,所以得改成double &lowest(引用传递)。
  • 去掉最低分后,应该除以SIZE-1(也就是4),而不是原来的5,因为只剩4个成绩参与计算。

3. getAverage的精度丢失

total被定义为int,累加double类型的成绩时,小数部分会被直接丢弃,把total改成double类型就能解决。

4. printData的语法错误

cout << g[];是无效语法,C++里不能直接输出整个数组,必须用循环逐个打印每个元素。

5. main里的变量未赋值

调用getAverage时,你没有把返回值赋值给avgBeforeDrop,导致这个变量是未初始化的垃圾值,输出结果会乱。


二、修复后的完整代码

#include <iostream>
#include <iomanip>
using namespace std;

void getGrades(double g[], const int SIZE)
{
    cout << "Please enter " << SIZE << " grades:" << endl;
    for(int i = 0; i < SIZE; i++)
    {
        cin >> g[i];
    }
}

double getAverage(double g[], const int SIZE)
{
    double total = 0; // 改为double避免精度丢失
    for(int i = 0; i < SIZE; i++)
    {
        total += g[i];
    }
    return total/SIZE;
}

// 修正返回类型、参数传递方式及计算逻辑
void findDropInfo(double g[], const int SIZE, double &lowest, double &average)
{
    double total = 0;
    lowest = g[0];
    // 一次循环同时计算总和和找到最低分
    for(int i = 0; i < SIZE; i++)
    {
        total += g[i];
        if (lowest > g[i]) {
            lowest = g[i];
        }
    }
    // 去掉最低分后除以剩余的成绩数量
    average = (total - lowest)/(SIZE - 1);
}

void printData(double g[], const int SIZE, double lowest, double average, double avg_before)
{
    cout << "The 5 grades entered by the user are:" << endl;
    // 循环打印每个成绩
    for(int i = 0; i < SIZE; i++)
    {
        cout << g[i] << " ";
    }
    cout << endl;
    cout << "Grade dropped: " << lowest << endl;
    // 用fixed和setprecision控制小数位数,输出更规范
    cout << fixed << setprecision(2);
    cout << "Final Average: " << average << endl;
    cout << "Average before drop: " << avg_before << endl;
}

int main()
{
    const int SIZE = 5;
    double grades[SIZE];
    double lowest; // 改为double类型
    double avg, avgBeforeDrop;

    // 修正函数调用的传参,补充变量赋值
    getGrades(grades, SIZE);
    avgBeforeDrop = getAverage(grades, SIZE);
    findDropInfo(grades, SIZE, lowest, avg);
    printData(grades, SIZE, lowest, avg, avgBeforeDrop);

    return 0;
}

内容的提问来源于stack exchange,提问作者Magolor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:25:33