C ++本福德的法律课程。

时间:2013-10-03 16:33:28

标签: c++ benfords-law

所以我必须写一个程序 =>分析三种不同的数据文件,并尝试确认本福德定律。您将创建一个打开每个文件的控制台应用程序,计算以“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++;
        }
    }

它说'好','eof'和'infile'是非类型的? 我不知道这意味着什么! 非常感谢帮助!谢谢!

2 个答案:

答案 0 :(得分:1)

首先

ifstream infile(string fname);

应该是

ifstream infile(fname);

您的版本是函数原型而不是变量的声明。

其次,这是循环到文件末尾的错误方法

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

这是正确的方法

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

这一定是我们在这里看到的最常见的错误。 eof没有按照您的想法行事,任何告诉您撰写while (!infile.eof())的人都是错的。

最后first(tmp)不是从整数中获取第一个数字的正确方法。你必须比那更努力地工作。

答案 1 :(得分:0)

不是将输入读作整数,而是将行读成字符串,从字符串中抓取第一个数字。或者您可以读取整数,然后将tmp除以10,直到结果为< 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个digis的空间,

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

您不需要从tmp,

中减去一个
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;
}