Передача массива по ссылке C ++ - PullRequest
0 голосов
/ 17 апреля 2020

У меня проблемы с получением функции getAverage для получения правильного среднего значения. Что я делаю неправильно? Я не могу использовать указатели. Вот оригинальный вопрос:

Программа, которая будет запрашивать оценки и вычислять среднее значение. Оценки будут храниться в массиве с именем GradesInput, который определен в main. Максимальное количество оценок, которое можно сохранить в массиве, равно 100. Переменная, содержащая фактическое количество оценок, введенных пользователем, должна быть определена в main и должна называться GradeCount. Программа будет иметь две функции в дополнение к основной. Первая функция должна вызываться из main и должна постоянно запрашивать у пользователя оценки, пока не будет введен дозорный, захватить эти оценки и сохранить их в GradesInput. Эта функция также должна обновлять переменную GradeCount в main, GradeCount должен был быть передан по ссылке. Вторая функция должна вызываться из main и должна находить среднее значение оценок в GradesInput. Среднее должно быть возвращено и распечатано с основного.

//Lab7D This program will get the grades of students and average
#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>

using namespace std;

//The 1st function should be called from main and should keep prompting the user for grades till a sentinel is entered,
//capture those grades and store them in GradesInput.
//This function should also update the variable GradeCount in main, GradeCount should have been passed by reference.
void store(int arr[], int &GradeCount) //for taking input by user pass by reference
{
    int i = 0;

    while (arr[i] != -1)
    {
        cout << "Enter grade : ";
        cin >> arr[i];
        GradeCount++;
    }
}

//The 2nd function should be called from main and should find the average of the grades in GradesInput.
//he average should be returned to and printed out from main.
double getAverage(int arr[], int size)
{
    int i;
    double avg, sum = 0;

    for (i = 0; i < size; i++)
    {
        sum += arr[i];
    }
    avg = sum / size;

    return avg;
}

//The variable holding the actual number of grades the user entered should be defined in main and should be called GradeCount
int main()
{
    int GradeCount = 0;
    int grades[100];
    store(grades, GradeCount);

    cout << "Average : " << getAverage(grades, GradeCount) << endl;
}

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Функция store имеет неопределенное поведение, поскольку массив еще не был инициализирован. Таким образом, условие в l oop

while (arr[i]!=-1)

недопустимо. Более того, переменная i не изменяется в l oop.

Функция может быть определена следующим образом /

void store( int arr[],int &GradeCount ) //for taking input by user pass by reference
{
    const int Sentinel = -1;

    GradeCount = 0;

    bool success = true;

    do
    {
        cout << "Enter grade : ";

        int value = Sentinel;

        if ( ( success = ( cin >> value && value != Sentinel ) ) )
        {
            arr[GradeCount++] = value;
        } 
    } while ( success ); 
}

Но было бы гораздо лучше объявить и определите функцию следующим образом

size_t store( int arr[], size_t n, int sentinel = -1 )
{
    size_t GradeCount = 0;

    if ( n != 0 )
    {    
        bool success = true;;

        do
        {
            cout << "Enter grade : ";

            int value = sentinel;

            if ( ( success = ( cin >> value && value != sentinel ) ) )
            {
                arr[GradeCount++] = value;
            }
        } while ( success && GradeCount < n ); 
    }

    return GradeCount;
}

и назовите ее как

int grades[100];

size_t GradeCount = store( grades, 100 );

Функция getAverage должна быть объявлена ​​и определена следующим образом

double getAverage( const int arr[], size_t n )
{
    double sum = 0.0;

    for ( size_t i = 0; i < n; i++ )
    {
        sum += arr[i];
    }

    return n == 0 ? 0.0 : sum / n;
}
0 голосов
/ 17 апреля 2020

Ваша проблема заключается в функции store(). Вы сравниваете значение в a[i] с -1 еще до того, как его инициализируете. Альтернативой является выполнение следующих действий:

int store( int arr[] )
{
    int i = 0;
    int grade = 0 ;
    while ( true )
    {
        std::cout<< "Enter grade: " ;
        std::cin >> grade ;
        if ( grade == -1 )
            break ;

        arr[ i ] = grade ;
        ++i ;
    }
    return i ;
}

Значение, возвращаемое store(), будет GradeCount, который вы можете использовать для усреднения ваших оценок позже.

...