2013-11-16 2 views
0
int count; 
int main(){ 
count=0; 

    printf("%6d\t %6d\t %6d\t ",i+1,multiFib(i),count); 
} 

int multiFib(int x){ 

if (x<2){ 
    return 1; 
    count++; 
}} 

В этом коде count всегда дает 0 результат. Я сделал глобальную переменную, чтобы не определять ее в функции снова. Как увеличить эту переменную?глобальная переменная не прирастает должным образом

Он выдает в порядке; это не проблема. Это дает результат:

1 1 0 
- 

2 1 0 
- 

3 2 0 

Так, count не растет - но почему?

+2

Пожалуйста, обратите внимание на ваше письмо, задавая здесь. –

+1

любые ответы? Глобальная переменная не увеличивается. –

+0

Скопировать-вставить сообщение об ошибке, сообщающее вам развернуть вопрос, чтобы сделать это, является самым верным способом сбора негативного внимания. –

ответ

4

Хотя порядок оценки не гарантируется (см множество других ответов), есть другой, более фундаментальная проблема (на самом деле, две из них):

int multiFib(int x) 
{ 
    if (x<2){ 
     return 1; 
     count++; 
    } 
} 
  1. Вы пытаетесь увеличиваем count после вас» ve вернулся из вашей функции. Ваш компилятор должен быть предупрежден о недостижимом коде.
  2. Вы не возвращают значение из multiFib(), когда вход больше, чем 2.

Фрагмент main(), что вы показываете ссылается на неопределенную переменную i. Я предполагаю, что это потому, что вы удалили цикл for (i = 0; i < 40; i++) из-за инструкции printf().Для того, чтобы решить эту проблему «порядок оценки», вы можете использовать:

int count; 
int main(void) 
{ 
    for (int i = 0; i < 40; i++) 
    { 
     count = 0; 
     int fib = multiFib(i); 
     printf("%3d %10d %10d\n", i+1, fib, count); 
    } 
    return(0); 
} 

Это оценивает количество вызовов multiFib() для каждого вызова верхнего уровня для функции.

Для самой multiFib() функции, вы, вероятно, необходимо:

int multiFib(int x) 
{ 
    count++; 
    if (x < 2) 
     return x; 
    else 
     return multiFib(x-1) + multiFib(x-2); 
} 

Хотя это ужасающе медленное внедрение чисел Фибоначчи, так что вы не должны использовать это в качестве ответа на свою домашнюю работу (но это сделать «рабочая» функция).

Пример вывода:

1    0    1 
    2    1    1 
    3    1    3 
    4    2    5 
    5    3    9 
    6    5   15 
    7    8   25 
    8   13   41 
    9   21   67 
10   34   109 
11   55   177 
12   89   287 
13   144   465 
14   233   753 
15   377   1219 
16   610   1973 
17   987   3193 
18   1597   5167 
19   2584   8361 
20   4181   13529 
21   6765   21891 
22   10946   35421 
23   17711   57313 
24   28657   92735 
25   46368  150049 
26   75025  242785 
27  121393  392835 
28  196418  635621 
29  317811  1028457 
30  514229  1664079 
31  832040  2692537 
32  1346269  4356617 
33  2178309  7049155 
34  3524578  11405773 
35  5702887  18454929 
36  9227465  29860703 
37  14930352  48315633 
38  24157817  78176337 
39  39088169  126491971 
40  63245986  204668309 

Обратите внимание, что если вы идете далеко за 40, вы начнете получать арифметическое переполнение. Это также становится очень (очень, очень) медленным.

+0

Я могу дать +1 ... Хорошее наблюдение ... Даже я ответил, но я этого не наблюдал ... –

+0

@NishithJainMR: Я не заметил дополнительных проблем, пока OP не выпустил жалобный «любой ответы «глобальная переменная не увеличиваются», когда уже было три ответа, дающих те же (точные, насколько это было) анализ. –

+0

Есть много вещей, чтобы узнать, как вы отвечаете ... –

1
printf("%6d\t %6d\t %6d\t ",i+1,multiFib(i),count); 

Порядок вычисления аргумента функции не определено в С. multiFib может быть оценена до или после того, как count в вызове функции printf.

1

Порядок оценки аргументов функции не указан. В коде

printf("%6d\t %6d\t %6d\t ",i+1,multiFib(i),count); 

Аргумент printf функции multiFib(i) может быть получение вызывается после печати count.

Попробуйте это,

printf("%6d\t",multiFib(i)); 
printf("%6d\t %6d\t ",i+1,count); 

проверить результат.

+0

Рассмотрите @Jonathan Leffler ответ ... –

1

Как уже было сказано в других ответах, проблема заключается в том, что порядок вычисления аргументов функции не определен, поэтому в вашем примере:

printf("%6d\t %6d\t %6d\t ",i+1,multiFib(i),count); 

Вы не можете быть уверены, что если count будут оценены до или после того, как минуя multiFib(i) до printf() функция.

Пожалуйста, look here для получения более подробной информации об оценочном заказе на C++, или here for evaluation order in C.

Вы также можете найти полезным, чтобы заставить порядок оценки, разделяя ваши printf на два вызова:

printf("%6d\t",multiFib(i)); 
printf("%6d\t %6d\t ",i+1,count); 

как Nishith джайнского M R предложил в своем ответе.

+1

Вы можете быть уверены, что значение 'multiFib (i)' оценивается до того, как будет напечатано значение 'count'; что вы не можете быть уверены в том, будет ли аргумент 'count' оцениваться до или после аргумента' multiFib (i) '' printf() '. –

+0

Верно, я сделал свой ответ более точным, спасибо. – Zegar

3

Это:

if (x<2){ 
    return 1; 
    count++; 
} 

Вы возвращаетесь из функции перед тем вы увеличиваете количество. Поэтому он никогда не увеличивается.

Возврат не просто устанавливает возвращаемое значение. Он фактически выходит из функции в этот момент.

Просто поменяйте порядок этих двух линий. Кроме того, вы должны следить за предупреждениями вашего компилятора. Любой достойный компилятор предупредит вас, что линия count++;недоступна.

Смежные вопросы