-1

この配列の平均を取得する方法を見つける私の試みは、これまでのところ無益でした。どんな助けでもいただければ幸いです。

#include <iostream>
#include <algorithm>
#include <numeric>
#include <vector>
#include <iterator>
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
int main( )
{
    const int MAX = 100;
    double voltages[MAX];
    double average;
    ifstream thefile("c:\\voltages.txt");
        if(!thefile) 
    {
                cout<<"Error opening file"<<endl;
                system("pause");
                exit(1);
    }
        for(int count = 0; count < MAX; count++)
    {
                thefile >> voltages[count];
                cout << voltages[count++] << endl;
                average = voltages[count++]/count;
        if(count == 0 || thefile.eof())
    {
                break;
    }
    }
    cout << average;
    cout << "\n";
    system("PAUSE");
    return 0;
} 

電圧ファイルは

100.8

120.4

121.4

111.9

123.4

ただし、最大100のdoubleを使用できます。

4

3 に答える 3

2

C ++コンテナ(生の配列も含む)に格納されている数の平均を計算するには、次のアプローチを使用します。合計を取り、要素の数で割ります。

std::accumulate(std::begin(v), std::end(v), 0.0) / (std::end(v) - std::begin(v));

動作中のサンプルコード:

std :: vector / raw配列を使用(ベクトル/配列の定義のみが変更されることに注意してください!)

このコードは、ゼロによる除算を生成するゼロ長をチェックしません。これは値を返しNaNます。このケースは、を使用して事前に検出できますif (std::begin(v) == std::end(v))。戻りたくない場合は、必要に応じてこのようなコーナーケースを処理できますNaN

  • 次のような明確に定義された値を返します0.0
  • 例外をスローする
  • 警告を出力して終了します(基本的に例外と同じですが、キャッチできません)
  • カスタムエラー処理。たとえば、ブールエラー変数をtrueに設定します。
于 2013-01-31T00:26:14.480 に答える
2

現在の合計でダブルを作成し、次にカウンターを作成して、平均でTOTAL/COUNTを実行することをお勧めします。ベクトルなどは必要ありません。

PS:テキストエディタが末尾に「\ n」文字を追加することがあるため、fstreamには.eof()の代わりに.get()を使用することをお勧めします(空の文字列に余分な反復とエラーが発生する可能性があります)。

また、一般的に、配列などの[]内でインクリメントすることはお勧めできません。[count + 1]を使用するか、括弧の外でカウントをインクリメントすることをお勧めします。

于 2013-01-31T00:27:46.847 に答える
0

平均には再帰的な定義を使用します。

avg_n= ((n-1)* avg_n_1 + val) / n;

valはn番目のデータの値です。
avg_nは現在の平均
ですavg_n_1は前の反復の平均です(n-1値の平均)

最後に、ループの最後のステートメント:

avg_n_1 = avg_n;

このようにして、読み取る値の数を事前に知らなくても、平均を計算できます。

于 2013-01-31T00:22:51.153 に答える