Мне нужна помощь в отладке базовой программы на C для вычисления чисел Фибоначчи - PullRequest
0 голосов
/ 31 мая 2018
#include <stdio.h>
int main(); 
{
    int a;
    int b;
    int c;
    a = 1;
    b = 1;
    c= 2;
    for ()
    {
        a = c + b;
        printf(a,"\n");
        b = c + a;
        printf(b,"\n");
        c = a + b;
        printf(c,"\n");
    }
}

Я новичок в C и пытаюсь написать программу для перечисления последовательности Фибоначчи.

Это то, что я имею до сих пор.Я знаю, что у меня есть как минимум две проблемы, одна из которых - цикл for.Как бы я сделал это бесконечным циклом?

Моя вторая проблема, с которой я сталкиваюсь, это сообщение об ошибке

"prog.c:3:1: error: expected identifier or '(' before '{' token
 {
 ^"

Если кто-то может помочь, это будет высоко ценится.

Ответы [ 6 ]

0 голосов
/ 01 июня 2018

В вашем коде есть некоторые ошибки, точка с запятой после main неверна, ваш алгоритм не выводит последовательность fib и цикл for набирается неверно.

#include <stdio.h>
int main()  //;<-- doesn't contain semicolon
{
    /* use a better variable name for clarity
    int a; --> a
    int b; --> last number
    int c; --> sum
    a = 1;
    b = 0;
    */
    int a = 1;
    int last = 0;
    int sum;

    for (;;) // infite for loop needs 2 semicolons to work
    {
        printf("fib : %d\n", last);
        sum = a + last;
        last = a;
        a = sum;
    }
}

Кстати, вы должны ограничитьВаш цикл for, иначе он переполнит вашу переменную int.long unsigned a, sum, last даст вам больше битов для хранения.

0 голосов
/ 01 июня 2018

Как прочитать эту конкретную ошибку компилятора:

prog.c: 3: 1: ошибка: ожидаемый идентификатор или маркер '(' before '{' {^

Это говорит о том, что ошибка возникает в строке 3:

1: #include <stdio.h>
2: int main();
3: {           // <------ compiler is complaining about this line

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

Проблема в том, что после int main не должно быть точки с запятой.компилятор обрабатывает int main() как объявление , а не начало функции определение .

Удалите эту точку с запятой, и ошибка исчезнет.

Важный урок здесь - компилятор не сообщает вам, где вы на самом деле допустили ошибку, но где эта ошибка препятствует переводу кода . Если у вас есть глубоко вложенный цикл, например

for (...)
{
  for (...)
  {
    for (...)
    {

и вы забыли вставить закрывающую скобку наВ самом внутреннем цикле компилятор не скажет: «Вы забыли поставить закрывающую скобку в этом самом внутреннем цикле »;вместо этого он будет жаловаться на строку несколькими путями вниз, потому что она достигла конца программы или определения следующей функции, не видя закрывающего } предыдущей функции.

Как бы я сделал его бесконечным циклом?

Синтаксис для бесконечного цикла: while(1) или for(;;).Неважно, какой вы используете, компилятор должен ( должен ) генерировать один и тот же код для обоих.Однако, как говорили другие люди, числа Фибоначчи очень быстро становятся очень большими, слишком большими для представления целочисленного типа данных.Вы начнете видеть ошибки переполнения после вычисления 50-го числа F или около того.

0 голосов
/ 01 июня 2018

/ * ряд Фибоначчи * /

# include

int main ()

{

long int a =0;

 long int b=1;

 long int c=1;

  int n,d=1;


   printf(" Enter the number of 

   terms ");

   scanf("%d",&n);

   do

     {


       printf("%d\n",c);

              c=b+a;

              a=b;

              b=c;

              d=d+1;


       }

            while(n>=d);

             return 0;


  }
0 голосов
/ 01 июня 2018

Вот рабочий код для серии Фибоначчи

#include <stdio.h>
void main()
{
    int a;
    int b;
    int var_z;
    a = 1;
    b = 1;
    for(int i = 0;i < 10;i++)
    {
        printf("%d\n",a);
        printf("%d\n",b);
        a = a+b;
        b = a+b;
    }
}

Например.https://eval.in/1013468

0 голосов
/ 01 июня 2018

Это может быть один из способов сделать это.

#include <stdio.h>
int main()
{
    unsigned int a;
    unsigned int b;
    unsigned int c;
    a = 0;
    b = 0;
    c = 1;
    while(1)
    {
        if (c < b)
            break;
        printf("%u\n",c);
        a = b;
        b = c;
        c = a + b;
    }
}

Изменено использование unsigned int и сравнение изменений на основе комментария.

Bobby

0 голосов
/ 31 мая 2018

Удалить ; после int main() - следует позаботиться об ошибке компилятора

while(1) вместо for() - запустится бесконечный цикл

...