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
相关产品推荐
相关产品推荐

