как передать несколько переменных из основной функции в другие функции C ++ - PullRequest
0 голосов
/ 20 ноября 2018

Я застрял в этой программе следующим образом:

Напишите программу, которая принимает в качестве входных данных пять чисел и выводит среднее (среднее) и стандартное отклонение чисел. Если числа х1, х2, х3, х4, х5.

Для решения среднего: среднее = (x1 + x2 + x3 + x4 + x5) / 5;

Чтобы решить отклонение: отклонение = sqrt ((pow (x1 - x, 2) + pow (x2 - x, 2) + pow (x3 - x, 2) + pow (x4 - x, 2) + pow (x5 - x, 2)) / 5);

Ваша программа должна содержать как минимум следующие функции: функцию, которая вычисляет и возвращает среднее значение, и функцию, которая вычисляет стандартное отклонение.

Я пытаюсь использовать переменную x1, x2, x3, x4, x5 из main, но я получаю унифицированные ошибки локальной переменной и не могу ее скомпилировать.

#include <iostream>
#include <cmath>

using namespace std;

// Named constant definitions (and function declarations): 


//Prototype
double meanfn();
double deviationfn();
// Main program: 

int main()
{
    // Variable declarations: 
    double x1, x2, x3, x4, x5;


    // Function body: 

    cout << "Enter a number followed by space 5 times to calculate the mean of five numbers. " << endl;
    cin >> x1 >> x2 >> x3 >> x4 >> x5;


    return 0;
} // end function main

double  meanfn()
{

    double x1, x2, x3, x4, x5;
    double mean;



    mean = (x1 + x2 + x3 + x4 + x5) / 5;

    return mean;
}// end function meanfn

double deviationfn(double mean)
{
    double x,deviation;
    double x1, x2, x3, x4, x5;
    x = mean;

    deviation = sqrt((pow(x1 - x, 2) + pow(x2 - x, 2) + pow(x3 - x, 2) + pow(x4 - x, 2) + pow(x5 - x, 2)) / 5);

    return deviation;
}

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Вместо того, чтобы иметь 5 переменных с нумерованными именами, вы можете вместо этого иметь одну переменную, которая содержит все 5.

#include <iostream>
#include <cmath>
#include <array>

using Values = std::array<double, 5>;

double mean(Values xs)
{
    return (xs[0] + xs[1] + xs[2] + xs[3] + xs[4]) / xs.size();
}

double distribution(Values xs, double x_bar)
{
    return sqrt((pow(xs[0] - x_bar, 2) + pow(xs[1] - x_bar, 2) + pow(xs[2] - x_bar, 2) + pow(xs[3] - x_bar, 2) + pow(xs[4] - x_bar, 2)) / xs.size());
}

int main()
{
    std::cout << "Enter a number followed by space 5 times to calculate the mean of five numbers. " << std::endl;

    Values xs;
    std::cin >> xs[0] >> xs[1] >> xs[2] >> xs[3] >> xs[4];

    auto x_bar = mean(xs);
    auto sigma = distribution(xs, x_bar);

    std::cout << "\n  Mean: " << x_bar << "\n  Deviation: " << sigma; 
}

Но обратите внимание, что каждая из этих функций выполняет одну и ту же операциюдля каждого из значений, а затем выполнить некоторые окончательные расчеты на основе того, сколько.Это можно лучше выразить с помощью функций из <algorithm>.Тогда нам не нужно знать, сколько там элементов.

#include <algorithm>
#include <vector>

using Values = std::vector<double>; // Any number of values

double mean(Values xs)
{
    // The default combiner is +
    return std::accumulate(xs.begin(), xs.end(), 0) / xs.size();
}

double distribution(Values xs, double x_bar)
{
    auto sum_squares = [x_bar](double cumulative, double x){ return cumulative + pow(x - x_bar, 2); }
    return sqrt(std::accumulate(xs.begin(), xs.end(), 0, sum_squares) / xs.size());
}
0 голосов
/ 20 ноября 2018

У вас есть две проблемы с пониманием основ в C ++:

  1. Переменная область.
  2. Параметры функции.

Чтобы кратко объяснить:

Переменные в C ++ живут только в той области, в которой они были объявлены. В вашем случае вы объявили: x1, x2, x3, x4, x5 внутри функции main, что означает, что они не существуют вне этой области. Переменные x1, x2, x3, x4, x5 в meanfn и deviationfn - это совершенно разные переменные. Они только одни и те же имена, и это все. Поэтому, когда вы объявили их внутри функций, у них не было ранее назначенных значений, что означает, что вы не можете их использовать.

Что касается параметров функции, вы должны объявить, какие параметры функция принимает в своей подписи. Ваша meanfn подпись double meanfn(), которая не принимает никаких параметров. Если вы хотите, чтобы он принимал 5 и только 5 double переменных, вы должны изменить его для соответствия.

Есть два решения, основанные на объяснениях выше:

#include <iostream>
#include <cmath>

using namespace std;

// Named constant definitions (and function declarations): 


//Prototype
double meanfn();
double deviationfn();
// Main program: 

// Variable declarations: 
double x1, x2, x3, x4, x5; // outside of 'main' making them global and everything has access to these variables.

int main()
{
    // Function body: 

    cout << "Enter a number followed by space 5 times to calculate the mean of five numbers. " << endl;
    cin >> x1 >> x2 >> x3 >> x4 >> x5;

    // CALL YOUR FUNCTIONS, THEY WONT BE CALLED BY THEIR OWN
    double mean = meanfn();   
    double deviation = deviationfn(mean);

    // print results
    std::cout << "\n  Mean: " << mean << "\n  Deviation: " << deviation;  

    return 0;
} // end function main

double  meanfn()
{
    double mean = (x1 + x2 + x3 + x4 + x5) / 5;

    return mean;
}// end function meanfn

double deviationfn(double mean)
{
    double x,deviation;
    x = mean;

    deviation = sqrt((pow(x1 - x, 2) + pow(x2 - x, 2) + pow(x3 - x, 2) + pow(x4 - x, 2) + pow(x5 - x, 2)) / 5);

    return deviation;
}

В приведенном выше решении переменные x1, x2, x3, x4, x5 были перемещены в глобальные переменные, что делает их доступ глобальным, и, следовательно, все функции могут использовать их.


Второе решение будет учитывать передачу параметров для функций, таких как:

#include <iostream>
#include <cmath>

using namespace std;

// Named constant definitions (and function declarations): 


//Prototype
double meanfn(double x1, double x2, double x3, double x4, double x5);
double deviationfn(double mean, double x1, double x2, double x3, double x4, double x5);

// Main program: 
int main()
{
    // Variable declarations: 
    double x1, x2, x3, x4, x5;


    // Function body: 

    cout << "Enter a number followed by space 5 times to calculate the mean of five numbers. " << endl;
    cin >> x1 >> x2 >> x3 >> x4 >> x5;

    // see the difference in the function calls?
    double mean = meanfn(x1, x2, x3, x4, x5);
    double deviation = deviationfn(mean, x1, x2, x3, x4, x5);

    // print results
    std::cout << "\n  Mean: " << mean << "\n  Deviation: " << deviation;

    return 0;
} // end function main

double  meanfn(double x1, double x2, double x3, double x4, double x5)
{
    double mean;
    mean = (x1 + x2 + x3 + x4 + x5) / 5;

    return mean;
}// end function meanfn

double deviationfn(double mean, double x1, double x2, double x3, double x4, double x5)
{
    double x,deviation;
    x = mean;

    deviation = sqrt((pow(x1 - x, 2) + pow(x2 - x, 2) + pow(x3 - x, 2) + pow(x4 - x, 2) + pow(x5 - x, 2)) / 5);

    return deviation;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...