0

私はプログラミングの初心者で、配列を関数に渡し、すべての要素を一緒に追加して合計を返そうとしています。問題は、合計のガベージ値を取得していることです。配列を関数に渡す方法について調査しましたが、ポインターを使用して配列を渡す必要があるかどうかわかりません。とにかくポインターが苦手です。

これが私のコードです

#include <cmath>
#include <cstdlib>

using namespace std;
float mean(int);
int sum(int ARRZO[5]);

int total;

int main()
{

    int ARRZ[5];
    char *inname = "example.txt";
    ifstream infile(inname);

    if (!infile) {
        cout << "There was a problem opening file " << inname << " for reading." << endl;
        return 0;
    }
    cout << "Opened " << inname << " for reading." << endl;
    for(int i=0; i<11; i++)
    {
        while (infile >> ARRZ[i]) 
        {
            cout << "Value from file is " << ARRZ[i] << endl;
        }
    }

    total=sum(ARRZ);
    cout<<"the sum of the elements in the array is"<<total<<endl;

    system("PAUSE");

    return 0;
}


int sum(int ARRZO[])
{
    int sumz=0;
    for (int i=0; i<5; i++)
    {
        sumz+=ARRZO[i];
        cout<<ARRZO[i];
    }
    cout<<sumz<<endl;
    return sumz;
}
4

2 に答える 2

3

ARRZ[0]内部ループのために、実際にはファイルからすべての値を読み取っています。に到達するまでに、ファイルの最後に到達しi=1、何も読み取っていません。

1 つのループを削除iし、値の読み取りに成功したらインクリメントします。

于 2012-04-14T01:06:04.730 に答える
1

このネストされたループのペアが何をすることになっているとあなたが思うかわかりません:

for(int i=0; i<11; i++)
{
    while (infile >> ARRZ[i]) 
    {
        cout << "Value from file is " << ARRZ[i] << endl;
    }
}

しかし (@aliexisdm が指摘したように) 内側のループはファイルの内容全体を読み取ります。彼が (少なくとも直接的には) 指摘しなかったのは、配列の最初の要素にこれらの値をすべて読み込んでいるということです。次に、外側のループに戻り、 をインクリメントiして、ファイルを再度読み取ろうとしますが、ストリームfailbitが設定されているため、その後の読み取りの試みはすべて失敗することが保証されています。

その後、配列内の 5 つのアイテムを合計しますが、そのうちの 4 つには何も読み取っていない (そしてその内容を初期化していない) ため、最後にファイルから読み取ったアイテム + 4 つのガベージ値になり、結果として、さらにゴミが発生します (まあ、通常とにかく -- 実際には未定義の動作があるため、代わりにプログラムがクラッシュして燃焼する可能性がありますが、現在のほとんどのコンピューターでは、意味のない数値が得られるだけです)。

ただし、1 つのループを削除して残っているループをインクリメントするだけでなく、プログラムをもう少し変更することをお勧めします。代わりに、すべての (明示的な) ループを削除し、標準ライブラリが提供するものを実際に利用する試みを行います。

ファイルから数値を一気に読み取ることができます。

std::ifstream infile(inname);

std::vector<int> ARRZ ((std::istream_iterator<int>(infile)),
                        std::istream_iterator<int>());

std::accumulate次に、それらすべてを次のように合計できます。

int sum = std::accumulate(ARRZ.begin(), ARRZ.end(), 0);

最後に、結果を印刷できます。

cout << "The sum of the elements in the array is: " << sum << "\n";

ただし、ファイルから値を読み取ってそれらを加算するだけなので、それらを保存する必要はまったくありません。それらを一緒に追加して、結果を印刷することができます:

cout << "The sum of the elements in the file is: " 
     << std::accumulate(std::istream_iterator<int>(infile),
                        std::istream_iterator<int>(), 0);

作業全体が 1 つのステップに短縮されました...

于 2012-04-14T05:22:22.483 に答える