我正在尝试编写一个程序,允许用户输入他们选择的数量。我希望数字按升序显示并显示平均值。我完成了这个部分,但是如果至少有一个高于90的数字,我还希望打印出一个字符串,如果没有高于90的数字,我还想打印另一个字符串。我认为我非常接近于使这个工作,但是每当我通过编译器运行它时,它说我必须使用的布尔函数不带1个参数。我真的不知道该怎么办。
#include <iostream>
using namespace std;
#include <iomanip>
#include <cstdlib>
int compare(const void* pa, const void* pb)
{
const int& a = *static_cast<const int*>(pa);
const int& b = *static_cast<const int*>(pb);
if (a < b) return -1; // negative if a<b
if (a > b) return 1; // positive if a>b
return 0; // 0 for tie
} // compare
double getAverage(int* score, int n)
{
int sum = 0;
int i = 0;
for (i = 0; i < n; i++)
sum += score[i];
double average = double(sum) / n;
return average;
} // getAverage
//Boolen Function to see if there are A grades present
bool getAGrades(int* score, int n)
{
int i = 0;
for (i = 0; i < n; i++){
if (score[i] >= 90){
return true;
cout << "there is at least one A"<<endl;
}else {
return false;
cout<<" No A Grades "<<endl;
}
}
}
int main()
{
int size;
cout << "How many scores? ";
cin >> size;
cin.ignore(1000, 10);
int* score = new int[size];
int i; // loop counter
for (i = 0; i < size; i++)
{
cout<< "Enter a number: ";
cin >> score[i];
cin.ignore(1000, 10);
} // for
qsort(score, size, sizeof(int), compare);
for (int i = 0; i < size; i++) {
cout << score[i] << ' ';
}
cout <<endl;
cout << "Lowest score = " << score[0] << endl;
cout << "Highest score = " << score[size-1] << endl;
cout << fixed << setprecision(1);
cout << "Average = " << getAverage(score, size) << endl;
//this is where i want it to print if there are a grades or not
getAGrades(score);
return 0;
} // main
答案 0 :(得分:2)
首先,您的问题是:函数getAGrades
需要int* score
和int n
。从main
返回之前,您要做的最后一件事是致电getAGrades(score);
,但是您没有给它一个大小。您还必须传递大小:getAGrades(score, size)
。
第二:为什么你的比较函数需要void*
?这没有任何理由是危险的。为什么不使用具有安全比较功能的类型安全std::sort
?
第三:getAGrades
在每个cout
之前返回,因此它永远不会显示任何内容。它应该cout
,然后返回
编辑:Keven还注意到getAGrades
在找到不是A的成绩时返回。正如他解释的那样,这样的函数应该在找到A等级时返回,或者如果它已经检查所有等级没有找到任何等级。 for循环后,将"No A Grades"
块移至。
第四:你的cin.ignore
没有做任何有用的事情,因为你只有格式化的输入。另外,使用'\n'
代替10
,否则会让人感到困惑,而且更便携。
第五:首选标准容器来分配自己的数组。因为您的代码泄漏了score
数组。
答案 1 :(得分:1)
bool getAGrades(int* score, int n)
getAGrades需要两个参数 - 得分和n。
getAGrades(score);
当你调用getAGrades时,你只传入一个参数。您还应传入n。
的参数getAGrades(score, size);
你的getAGrades函数体也有一些错误。假设你传入了一个数组[1,100]。在for循环的第一次迭代中,它看到得分[0] == 1,因此它返回false。它永远不会得分[1]看到它高于90.因此,你应该延迟返回false,直到你遍历整个数组。
bool getAGrades(int* score, int n)
{
int i = 0;
for (i = 0; i < n; i++){
if (score[i] >= 90){
return true;
cout << "there is at least one A"<<endl;
}
}
return false;
cout<<" No A Grades "<<endl;
}
还有一件事 - 你的cout语句在你返回一个值后发生,所以它们永远不会被执行。你应该把它们放在return语句之前。
bool getAGrades(int* score, int n)
{
int i = 0;
for (i = 0; i < n; i++){
if (score[i] >= 90){
cout << "there is at least one A"<<endl;
return true;
}
}
cout<<" No A Grades "<<endl;
return false;
}
答案 2 :(得分:1)
使用std::sort
和std::vector
。
我知道这不是这个问题的答案。
但是当你想使用C ++时,你不应该尝试使用像qsort
这样的C函数。
使用std::sort
,您也可以对c数组进行排序。
qsort(score, size, sizeof(int), compare);
变为std::sort(score, score+size);
(或std::sort(score, score+size, compare);
)
C ++方式(使用std::vector
和std::sort
,使用固定getAGrades
函数):
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
using namespace std;
double getAverage(const vector<int>& score)
{
int sum = 0;
for(int i = 0; i < score.size(); ++i)
{
sum += score[i];
}
return sum / double(score.size());
}
bool getAGrades(const vector<int>& score)
{
for (int i = 0; i < score.size(); ++i)
{
if (score[i] >= 90)
{
cout << "there is at least one A"<<endl;
return true;
}
}
cout << "No A Grades"<<endl;
return false;
}
int main()
{
int size;
cout << "How many scores? ";
cin >> size;
cin.ignore(1000, 10);
vector<int> score(size);
for (int i = 0; i < size; i++)
{
cout<< "Enter a number: ";
cin >> score[i];
cin.ignore(1000, 10);
}
sort(score.begin(), score.end());
for (int i = 0; i < size; i++)
{
cout << score[i] << ' ';
}
cout <<endl;
cout << "Lowest score = " << score[0] << endl;
cout << "Highest score = " << score[size-1] << endl;
cout << fixed << setprecision(1);
cout << "Average = " << getAverage(score) << endl;
getAGrades(score);
return 0;
}