Поэтому я должен написать программу для
=> проанализировать три разных файла данных и попытаться подтвердить закон Бенфорда. Вы создадите консольное приложение, которое откроет каждый файл, посчитает количество значений, начинающихся с «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» не относятся к классу?
Я не знаю, что это значит!
Помощь будет высоко ценится! Спасибо!
во-первых
ifstream infile(string fname);
должно быть
ifstream infile(fname);
Ваша версия была прототипом функции, а не объявлением переменной.
Во-вторых, это неправильный способ зацикливания до конца файла
while (!infile.eof())
{
infile >> tmp;
...
}
это правильный путь
while (infile >> tmp)
{
...
}
Это должно быть единственная самая распространенная ошибка, которую мы видим здесь. eof
не делает то, что вы думаете, что делает, и любой, кто сказал вам, чтобы написать while (!infile.eof())
это просто неправильно.
в заключение first(tmp)
неправильный способ получить первую цифру из целого числа. Вам придется работать немного усерднее, чем это.
Вместо того, чтобы читать входные данные как целые числа, читать строки как строки, взять первую цифру из строки. Или вы можете читать как целое число, а затем делить 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;
}