Почему я получаю ошибку компиляции, которая говорит об ошибке: «else» без предыдущего «if»?

Когда я пытаюсь скомпилировать код, я получаю сообщение об ошибке else without a previous if:

// Fibonacci series using recursion
#include <iostream>
using namespace std;
int fib (int n);

int main()
{
int n, answer;

cout << "\n\n\t\tEnter number to find: ";
cin >> n;
cout << "\n\n";

answer = fib(n);

if(n < 3 && n > 1)
cout << answer << " is the " << n;
cout << "nd Fibonacci number\n";
{
if(n < 3)
cout << answer << " is the " << n;
cout << "st Fibonacci number\n";
else
cout << answer << " is the " << n;
cout << "rd Fibonacci number\n";
}
else
cout << answer << " is the " << n;
cout << "th Fibonacci number\n";
return 0;
}

int fib (int n)
{
cout << "Processing fib (" << n << ")... ";

if (n < 3)
{
cout << "Return 1!\n";
return 1;
}
else
{
cout << "Call fib(" << n-2 << ") ";
cout << "and fib(" << n-1 << ").\n";
return( fib(n-2) + fib(n-1));
}
}

2

Решение

Ваши недостающие похвалы (фигурные скобки) после вашего if

if(n < 3 && n > 1)
cout << answer << " is the " << n;
cout << "nd Fibonacci number\n";
{
if(n < 3)

средства

 if(n < 3 && n > 1)
{
cout << answer << " is the " << n;
} // end of if
cout << "nd Fibonacci number\n"; // always executed
{ // new anonymous block
if(n < 3)
3

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

Конечно, это проблема с ключевыми скобками:

int main()
{
int n, answer;

cout << "\n\n\t\tEnter number to find: ";
cin >> n;
cout << "\n\n";

answer = fib(n);

if(n < 3 && n > 1) {
cout << answer << " is the " << n;
cout << "nd Fibonacci number\n";

if(n < 3) {
cout << answer << " is the " << n;
cout << "st Fibonacci number\n";
} else {
cout << answer << " is the " << n;
cout << "rd Fibonacci number\n";
}
}
else {
cout << answer << " is the " << n;
cout << "th Fibonacci number\n";
}
return 0;
}
4

Попробуй это:

int main()
{
int n, answer;

cout << "\n\n\t\tEnter number to find: ";
cin >> n;
cout << "\n\n";

answer = fib(n);

if(n < 3 && n > 1)
{
cout << answer << " is the " << n;
cout << "nd Fibonacci number\n";

if(n < 3)
{
cout << answer << " is the " << n;
cout << "st Fibonacci number\n";
}
else
{
cout << answer << " is the " << n;
cout << "rd Fibonacci number\n";
}
}
else
{
cout << answer << " is the " << n;
cout << "th Fibonacci number\n";
}
return 0;
}

Убедитесь, что ваш ifс и elseОни соответственно находятся в фигурных скобках.

2

Вы не добавили скобки в некоторые предложения if else с несколькими операторами. Не делайте этого в реальном мире кодирования.
Измените код следующим образом:

// Fibonacci series using recursion
#include <iostream>
using namespace std;
int fib (int n);

int main()
{
int n, answer;

cout << "\n\n\t\tEnter number to find: ";
cin >> n;
cout << "\n\n";

answer = fib(n);

if(n < 3 && n > 1)
{
cout << answer << " is the " << n;
cout << "nd Fibonacci number\n";

if(n < 3)
{
cout << answer << " is the " << n;
cout << "st Fibonacci number\n";
}
else
{
cout << answer << " is the " << n;
cout << "rd Fibonacci number\n";
}
}
else {
cout << answer << " is the " << n;
cout << "th Fibonacci number\n";
}
return 0;
}

int fib (int n)
{
cout << "Processing fib (" << n << ")... ";

if (n < 3)
{
cout << "Return 1!\n";
return 1;
}
else
{
cout << "Call fib(" << n-2 << ") ";
cout << "and fib(" << n-1 << ").\n";
return( fib(n-2) + fib(n-1));
}
}
2

(Редактировать: Это полностью переработанный ответ. Смотрите комментарии. Спасибо и извините за «полемику».)

Потому что вы не правильно использовали скобки («фигурные скобки», { а также }) в вашем main,

Сначала давайте возьмем эту внутреннюю часть кода:

      if(n < 3)
cout << answer << " is the " << n;
cout << "st Fibonacci number\n";
else
cout << answer << " is the " << n;
cout << "rd Fibonacci number\n";

Этот текущий отступ является «неправильным» и вводящим в заблуждение. Если вы копируете и вставляете его в редактор кода и используете автоформатирование (автоотступ будет достаточно), вы получите:

      if(n < 3)
cout << answer << " is the " << n;
cout << "st Fibonacci number\n";
else
cout << answer << " is the " << n;
cout << "rd Fibonacci number\n";

который показывает вам реальное «значение» кода. После добавления скобок и пустых строк для наглядности:

      if(n < 3)
{
cout << answer << " is the " << n;
}

cout << "st Fibonacci number\n";

else
{
cout << answer << " is the " << n;
}

cout << "rd Fibonacci number\n";

Как видите, только первый cout Заявление обусловлено if, Второй всегда будет выполнен. Затем приходит else который следует за «простым», «безусловным» оператором, а не «условным» оператором / блоком (блок оператора (ов) в целом тоже является оператором).

Чтобы исправить эту часть, вы должны заключить все условные выражения в фигурные скобки:

      if(n < 3)
{
cout << answer << " is the " << n;
cout << "st Fibonacci number\n";
}
else
{
cout << answer << " is the " << n;
cout << "rd Fibonacci number\n";
}

или в более компактном стиле:

      if(n < 3) {
cout << answer << " is the " << n;
cout << "st Fibonacci number\n";
} else {
cout << answer << " is the " << n;
cout << "rd Fibonacci number\n";
}

такой что полный блок-заявление обусловлен.

Теперь, когда «внутренняя» часть if-else исправлена, давайте возьмем «внешнюю» if-else:

     if(n < 3 && n > 1)
cout << answer << " is the " << n;
cout << "nd Fibonacci number\n";
{
/* ... fixed inner if-else ... */
}
else
cout << answer << " is the " << n;
cout << "th Fibonacci number\n";

Давайте снова использовать средство форматирования кода:

     if(n < 3 && n > 1)
cout << answer << " is the " << n;
cout << "nd Fibonacci number\n";
{
/* ... fixed inner if-else ... */
}
else
cout << answer << " is the " << n;
cout << "th Fibonacci number\n";

Реальный смысл теперь должен быть понятен (здесь используется компактный стиль):

     if(n < 3 && n > 1) {
cout << answer << " is the " << n;
}

cout << "nd Fibonacci number\n";

{
/* ... fixed inner if-else ... */
}

else {
cout << answer << " is the " << n;
}

cout << "th Fibonacci number\n";

Забавный блок один посередине (код внутри фигурных скобок, но не сразу после if/else) на самом деле является анонимным блоком, который просто вводит внутреннюю область видимости (переменные, определенные внутри, больше не будут существовать после закрытия }). Это можно увидеть как простое утверждение (безусловное), так же, как cout << "nd Fibonacci number\n"; чуть выше.

Еще раз, исправление очевидно:

     if(n < 3 && n > 1) {
cout << answer << " is the " << n;
cout << "nd Fibonacci number\n";

/* ... fixed inner if-else ... */

} else {
cout << answer << " is the " << n;
cout << "th Fibonacci number\n";
}
2

Вы забыли использовать {} для внутренних if. Так должно быть

if(n < 3)
{
cout << answer << " is the " << n;
cout << "st Fibonacci number\n";
}
else
{
cout << answer << " is the " << n;
cout << "rd Fibonacci number\n";
}
1

Я полагаю, вам не хватает фигурных скобок после if (n < 3), поэтому условное относится только к строке ниже. Затем компилятор нажимает «остальное» ……

1

Все ваши ответы о фигурных скобках были правильными, но код, который мне был нужен, был такой, ребята:

if (n > 3)
{
cout << answer << " is the " << n;
cout << "th Fibonacci number\n";
}
else
{
if(n == 3)
{
cout << answer << " is the " << n;
cout << "rd Fibonacci number\n";
}
else
{
if(n < 3 && n > 1)
{
cout << answer << " is the " << n;
cout << "nd Fibonacci number\n";
}
else
{
cout << answer << " is the " << n;
cout << "st Fibonacci number\n";
}

}
}
0