Нахождение среднего значения массива с ++

0

Я пытаюсь найти среднее число викторин, используя функцию. Я продолжаю настраивать его, но он просто продолжает возвращаться 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; 
}
  • 0
    1. Вы должны сыграть до того, как разделите, а не после. 2. Какие магические числа 10 и 100? 100 Я могу понять, переводишь ли ты в проценты. 10 - это максимальная оценка за тест или что-то в этом роде?
  • 0
    да это извините забыл упомянуть об этом. что ты имеешь в виду под кастом до того как я разделю? <-novice
Показать ещё 7 комментариев
Теги:
arrays
average

3 ответа

0
Лучший ответ

Поскольку ваша переменная 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 котором он используется, - это уменьшает его область действия (что на самом деле не является проблемой), а также означает, что вам не придется вычислять его, если только будет также использоваться (также малозначительно в небольшой программе, но стоит рассмотреть в целом)

  • 0
    БЛАГОДАРЮ ВАС!!!!! Кроме того, спасибо за быстрый урок по векторам и предложение низкой суммы.
0
avrg= double(((sum) / (10* numberOfQuizzes)) * 100);

e.g.
avrg = (sum/(numberofQuizzes*10.0))*100.0;
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"?).

  • 1
    Хотя if , else if не по определению, включающему все возможности, когда int может быть и не <=2 и не >2 ?
  • 0
    @ chrisb2244 Хорошо - никогда, но, насколько я знаю, компиляторы не гарантируют, что заметят это в этом случае. Падение конца функции, которая объявлена для возврата значения (без явного возврата значения), приводит к неопределенному поведению. gcc 4.9.0 также будет жаловаться с -Wall в этих случаях. Смотрите пример здесь: goo.gl/cISz5x

Ещё вопросы

Сообщество Overcoder
Наверх
Меню