簡體   English   中英

如何計算 C++ 數組中高於平均值的值?

[英]How to count values above average in array for C++?

我對 C++ 非常陌生。 我在 Microsoft VBA 方面有一些經驗,但是在 C++ 中,語法以及如何查找函數的語法要困難得多。

我正在嘗試計算數組中高於平均值的數字的總和、平均值和計數。 我能夠對一個數組求和,但最終擺脫它只是為了將這些值相加,以便在其他地方創建一個集合來計算高於平均值的數字。 我確定我做錯了,但我希望一些魔法仙女能讓我設置set.count(>average)並神奇地工作。


    #include <iostream>
    #include <bits/stdc++.h>
    #include <algorithm>
    using namespace std;

    int main()
    {

        //define four number value variables
        double number1, number2, number3, number4;

        //prompt user to input values for number variable
        std::cout << "Enter four double values: " << endl;
        std::cin >> number1 >> number2 >> number3 >> number4;

        //define array for use in expressions
        double arr[] = {number1, number2, number3, number4};

        //initialize set for use in expressions
        std::set<double> set(arr, arr + 4);

        //calculate sum and average and count
        double sum = number1 + number2 + number3 + number4;
        double average = sum / 4;
        double count = set.count(average);

        //output expressions
        std::cout << "The sum is: " << sum << endl
        << "The average is: " << average << endl
        << count << " numbers are above average." << endl;

        return 0;

    }

使用std::vector並從<numeric> accumulate ,這可以非常簡單地完成。 我什至在上面擴展了您的問題,以允許用戶指定他們想要找到總和、平均值和高於平均值的實例計數的元素數量。

我沒有聲明多個變量,而是聲明了一個變量,然后重用它並使用基本循環將所有值保存到一個向量中。 然后我使用accumulate來輕松計算總和並使用該結果計算平均值。

從那里我使用基於范圍的 for 循環來檢查向量的每個元素,並測試它們是否大於計算的平均值,如果這樣我增加了出現變量。 最后我展示了所有的結果。

我確信這可以寫得更簡潔和優化,但這只是您嘗試實現的任務的簡單通用解決方案。

#include <numeric>
#include <iostream>
#include <vector>

int main() {
    try {
        int num_values = 0;
        std::cout << "How many values would you like to enter? ";
        std::cin >> num_values;
        std::cout << "Enter each value\n";
        std::cin.ignore();

        double value = 0.0;
        std::vector<double> values;
        for (int i = 0; i < num_values; i++) {
            std::cin >> value;
            std::cin.ignore(); // I called this first so if it fails or throws an
                               // exception I save time by not calling push_back 
            values.push_back(value);
        }            

        auto sum = std::accumulate(values.begin(), values.end(), 0.0);
        auto avg = sum / values.size();

        int greater_than_average = 0;
        for (auto& v : values) {
            if (v > avg) greater_than_average++;
        }

        std::cout << "Sum = " << sum << "\nAverage = " << avg
            << "\nGreater Than Average = " << greater_than_average << '\n';

    } catch (const std::exception& e) {
        std::cerr << e.what() << std::endl;
        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}

您將需要一個新的零初始化變量,然后使用 IF 序列來解決您的問題。 將代碼放在平均位置下方。

int count_avg = 0;

// .. repeat this for all input numbers.
if (number1> average) {
count_avg = count_avg + 1;
}
if (number2> average) {
count_avg = count_avg + 1;
}
// ...

std::cout << count_avg << endl;

當您更有經驗時,您可以使用向量來存儲您的條目並使用重復結構來解決同樣的問題。

C++ 是一種編譯語言。 這意味着有些事情在編譯時是已知的,而有些事情在運行時是已知的。 這樣做的副作用是,當您嘗試以某些方式混合它們時,可能會發生不好的事情。

讓我們在這里仔細看看這條線:

//define array for use in expressions
double arr[] = {number1, number2, number3, number4};

數組arr的大小必須在編譯時知道。 另一方面, number1number2number3number4中的值要到運行時才能知道。 雖然我不能 100% 確定它不應該編譯或運行,但我不敢嘗試。 這是因為在編譯時已知的東西和直到運行時才知道的東西同時混合在一起。

解決方案非常簡單:只需提前聲明您的數組。 然后對代碼的更改變得容易得多:

    double arr[4];
    //prompt user to input values for number variable
    std::cout << "Enter four double values: " << endl;
    std::cin >> arr[0]>> arr[1]>> arr[2]>> arr[3];

這不漂亮,但有效。 也許寫一個循環可能更容易:

    const unsigned int size = 4;
    double arr[size];
    //prompt user to input values for number variable
    std::cout << "Enter " << size << " double values: " << endl;
    for(unsigned int i=0; i<size;i++) {
        std::cin >> arr[i];
    }

然后你可以很容易地改變你的數組的size 您甚至可以將大多數使用 4 來表示數組大小的常量替換為size


編輯:呃。 一直不太 go 。 要平均數字,您應該能夠用這個替換number變量:

double sum = arr[0] + arr[1] + arr[2] + arr[3];
double average = sum / 4;

或者你可以構造一個類似於上述循環的循環來計算它。 我將把創建這樣一個循環作為練習留給你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM