Я пытаюсь найти среднее число викторин, используя функцию. Я продолжаю настраивать его, но он просто продолжает возвращаться 10. Предпосылка программы - попросить пользователя представить свои викторины (которые не состоят из 10). Эти входы помещаются в массив quizarray[]
. Затем я quizarray
всю информацию из quizarray
в другой tempArray
. Затем tempArray сортируется и используется для функции calcQuizAverage
. Эта функция должна возвращать одну из двух средних значений. Это определяется numberOfQuizzes
double calcQuizAverage(int quizArray[], int numberOfQuizzes)
{
int a;
double avrg, sum, lowSum;
a = 0;
sum = 0;
lowSum = quizArray[0] + quizArray[1];
for (a=0; a< numberOfQuizzes; a++)
{
sum += double(quizArray[a]);
}
if (numberOfQuizzes <= 2)
{
avrg= double(((sum) / (10* numberOfQuizzes)) * 100);
return avrg;
}
else if (numberOfQuizzes > 2)
{
avrg= double(((sum-lowSum) / (10* (numberOfQuizzes - 2)))*100);
return avrg;
}
}
Я проверил, являются ли sum и lowSum тем, кем они предназначены, когда numberOfQuizzes
превышает 2, и это казалось прекрасным. Если numberOfQuizzes
меньше или равно 2, оно просто возвращает 10.
Здесь остальная часть кода:
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
//Symbolic Constants
const int MAX=12;
//Function Prototypes
int buildQuizArray(int[]);
void printArray(string,int[],int);
double calcQuizAverage(int[],int);
void sortArray(int[],int);
int main ()
{
int quizScores[MAX];
int compQuiz;
int tempArray[MAX];
double average;
int temp;
int i;
average = 0;
compQuiz = buildQuizArray(quizScores);
for(int i=0; i<MAX; i++)
{
tempArray[i] = quizScores[i];
}
sortArray(tempArray, compQuiz);
average = calcQuizAverage(tempArray, compQuiz);
cout<<endl<<"Your quiz average is "<<average<<endl;
printArray ("Quiz Scores", tempArray, compQuiz);
}
int buildQuizArray(int quizArray[])
{
int numQuiz, input, a;
a=0;
numQuiz=1;
cout << "Enter your score for quiz "<<numQuiz<<" (-1 to quit): ";
cin >> input;
while (input != -1)
{
quizArray[a] = input;
a++;
numQuiz++;
cout<< "Enter your score for quiz "<<numQuiz<<" (-1 to quit): ";
cin >> input;
}
return a+1;
}
void printArray(string reportTitle, int quizArray[], int numberOfQuizzes)
{
int a;
cout<< endl <<reportTitle <<endl<<"-----------"<<endl;
for (a=1; a<numberOfQuizzes; a++)
{
cout<< "Quiz " << a <<": " << setw(2) <<quizArray[a-1] <<"/10"<<endl;
}
}
double calcQuizAverage(int quizArray[], int numberOfQuizzes)
{
int a;
double avrg, sum, lowSum;
a = 0;
sum = 0;
lowSum = quizArray[0] + quizArray[1];
for (a=0; a< numberOfQuizzes; a++)
{
sum += double(quizArray[a]);
}
if (numberOfQuizzes <= 2)
{
avrg= double(((sum) / (10* numberOfQuizzes)) * 100);
return avrg;
}
else if (numberOfQuizzes > 2)
{
avrg= double(((sum-lowSum) / (10* (numberOfQuizzes - 2)))*100);
return avrg;
}
}
void sortArray(int num[], int numberOfQuizzes)
{
int i, j, flag = 1;
int temp;
for(i = 1; (i <= numberOfQuizzes) && flag; i++)
{
flag = 0;
for (j=0; j < (numberOfQuizzes -2); j++)
{
if (num[j+1] < num[j])
{
temp = num[j];
num[j] = num[j+1];
num[j+1] = temp;
flag = 1;
}
}
}
return;
}
Поскольку ваша переменная sum
является двойной, вам не нужно бросать столько мест. Кроме того, ваш код можно использовать вместо использования формы:
int a;
a=0;
for (a=0; ...) {
вместо этого пишет:
for (int a=0; ...) {
Функция buildQuizArray
не возвращает количество введенных викторин - я подозреваю, что вы хотели написать return a;
, вместо return a+1;
(Это может быть основной проблемой)
Что касается векторов, то vector
является классом контейнера, который доступен через стандартную библиотеку, используя #include <vector>
. Вектор можно выращивать по мере необходимости и имеет множество полезных функций, в частности myVector.size()
возвращает длину myVector
. Это предотвратит необходимость пропускать размер везде с вашим массивом. Вам также не нужно было бы выделять определенные 12 записей, что позволило бы использовать гораздо более простую функцию sort
(так как вам не нужно было бы оборачивать нулевые нули).
Я бы также рекомендовал, чтобы ваш lowSum
был рассчитан (и определен) только внутри цикла if
котором он используется, - это уменьшает его область действия (что на самом деле не является проблемой), а также означает, что вам не придется вычислять его, если только будет также использоваться (также малозначительно в небольшой программе, но стоит рассмотреть в целом)
avrg= double(((sum) / (10* numberOfQuizzes)) * 100);
e.g.
avrg = (sum/(numberofQuizzes*10.0))*100.0;
Без дальнейшего объяснения непонятно, что должен делать ваш код. Согласно названию, вы хотите рассчитать среднее значение в массиве? Следующий код сделает это:
double calcQuizAverage(int quizArray[], int numberOfQuizzes){
double avrg = 0.0;
int a = 0;
for (a = 0; a< numberOfQuizzes; a++){
avrg += quizArray[a];
}
return avrg / static_cast<double>(numberOfQuizzes);
}
int main(int argc, char* argv[]){
int array[] = { 0, 1, 2};
double x = calcQuizAverage(array, 3);
return 0;
}
Не понятно, в чем причина ваших дополнительных if-clauses: ваша функция всегда должна возвращать значение (вы можете захотеть заменить последнее "else if" только "else"?).
if
, else if
не по определению, включающему все возможности, когда int может быть и не <=2
и не >2
?