2

コードをコンパイルしようとすると、次のようなエラーが表示されます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));
     }
}
4

8 に答える 8

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;
}
于 2013-07-11T07:54:48.653 に答える
3

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)   
于 2013-07-11T07:54:49.587 に答える
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));
     }
}
于 2013-07-11T09:24:00.980 に答える
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. 2 つ目は常に実行されます。次に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";
     }
于 2013-07-11T07:54:36.243 に答える
2

これを試して:

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;
}

ifs とelsees がそれに応じて中括弧内にあることを確認してください。

于 2013-07-11T07:55:33.800 に答える
1

内部 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";
}
于 2013-07-11T07:55:49.050 に答える
1

if(n < 3) の後に中括弧がないと思うので、条件は下の行にのみ適用されます。するとコンパイラが「else」を叩き……

于 2013-07-11T07:55:53.220 に答える
0

中括弧に関するあなたの答えはすべて正しかったのですが、必要なコードは次のようなものでした:

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";
       }

    }
}
于 2013-07-11T09:55:59.803 に答える