2013-10-03 4 views
0

Так что я должен написать программу для => проанализировать три разных файла данных и попытаться подтвердить закон Бенфорда. Вы создадите консольное приложение, которое открывает каждый файл, подсчитывает количество значений, начинающихся с «1», «2», «3» и т. Д., А затем выводит проценты каждой цифры.C + + Закон Бенфорда Закон.

Я думаю, что у меня есть это, но я продолжаю получать ошибки в 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

my nemesis 'eof()' мы встречаемся снова! – andre

ответ

1

Во-первых

ifstream infile(string fname); 

должен быть

ifstream infile(fname); 

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

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

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

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

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

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

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

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; 
} 
Смежные вопросы