0

したがって、3 つの異なるデータ ファイルを分析し、ベンフォードの法則を確認するためのプログラムを作成する必要があります。各ファイルを開き、「1」、「2」、「3」などで始まる値の数を数え、各桁のパーセンテージを出力するコンソール アプリケーションを作成します。

ダウンしていると思いますが、Dev C++ でエラーが発生し続けます。

int analyzeData(string fname) {
    ifstream infile(string fname);
    int tmp,count = 0;
    float percents[9];
    int nums[9] = { 0 };
    if(!infile.good())
        return 1;
    while(!infile.eof())
    {
        infile >> tmp;
        tmp = first(tmp);
        if(tmp > 0)
        {
            nums[tmp - 1] ++;
            count++;
        }
    }

「good」、「eof」、「infile」は非クラス型ということですか? 意味がわからない!助けていただければ幸いです。ありがとう!

4

2 に答える 2

1

まずは

ifstream infile(string fname);

する必要があります

ifstream infile(fname);

あなたのバージョンは、変数の宣言ではなく関数プロトタイプでした。

第二に、これはファイルの最後までループする間違った方法です

while (!infile.eof())
{
    infile >> tmp;
    ...
}

これが正しい方法です

while (infile >> tmp)
{
    ...
}

これは、ここで見られる最も一般的なエラーの 1 つに違いありません。eofあなたが思っていることをしませんし、あなたに書くように言った人は誰でもwhile (!infile.eof())間違っています.

最後にfirst(tmp)、整数から最初の桁を取得する正しい方法ではありません。それよりも少し頑張る必要があります。

于 2013-10-03T16:36:29.457 に答える
0

入力を整数として読み取るのではなく、行を文字列として読み取り、文字列から最初の数字を取得します。または、整数として読み取り、結果が 10 未満になるまで tmp を 10 で割ることもできます。

人生を少し楽にして、数字を配列のインデックスとして使用してください。値 1 ~ 9 のインデックスを作成できる必要があるため、配列を少し大きく宣言する必要があります。パーセントについても同様です。

int nums[9] = { 0 };  // works, but do less work
float percents[9];

int nums[10] = { 0 }; // do this, then you can us the digit to index nums[]
float percents[10];

tmp > 0 のガードは必要ありません。10 桁すべてに余裕があるためです。

//if( tmp > 0 )
//{
...
//}

tmp から 1 を引く必要はありません。

int analyzeData(string fname)
{
    ifstream infile(fname);
    int tmp,count = 0;
    float percents[10];
    int nums[10] = { 0 };
    if(!infile.good())
        return 1;
    while(infile >> tmp)
    {
        tmp = first(tmp);
        {
        nums[tmp] ++;
        count++;
        }
    }
    if(count<1) count=1; //avoid division by zero
    for( tmp=1; tmp<10; ++tmp )
        cout<<tmp<<":"<<nums[tmp]<<",pct:"<<(nums[tmp]*1.0)/count<<eol;
}
于 2013-10-04T05:15:46.977 に答える