C ++ Законодательная программа Бенфорда.

Поэтому я должен написать программу для
=> проанализировать три разных файла данных и попытаться подтвердить закон Бенфорда. Вы создадите консольное приложение, которое откроет каждый файл, посчитает количество значений, начинающихся с «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» не относятся к классу?
Я не знаю, что это значит!
Помощь будет высоко ценится! Спасибо!

0

Решение

во-первых

ifstream infile(string fname);

должно быть

ifstream infile(fname);

Ваша версия была прототипом функции, а не объявлением переменной.

Во-вторых, это неправильный способ зацикливания до конца файла

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

это правильный путь

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

Это должно быть единственная самая распространенная ошибка, которую мы видим здесь. eof не делает то, что вы думаете, что делает, и любой, кто сказал вам, чтобы написать while (!infile.eof()) это просто неправильно.

в заключение first(tmp) неправильный способ получить первую цифру из целого числа. Вам придется работать немного усерднее, чем это.

1

Другие решения

Вместо того, чтобы читать входные данные как целые числа, читать строки как строки, взять первую цифру из строки. Или вы можете читать как целое число, а затем делить 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 цифр,

//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;
}
0

По вопросам рекламы [email protected]