2015-04-18 2 views
0

Я прочитал некоторые предыдущие вопросы об использовании фигурных скобок, из моего понимания, что нормально не использовать фигурные скобки, если у вас есть только одна строка, но если бы вы использовали много строк кода, вы бы необходимо использовать скобки.фигурные скобки - рекурсия

У меня есть задание, и инструктор требует от нас использовать скобки для каждой ситуации для хорошей привычки. Он также позволяет нам исследовать и использовать образец кода.

Теперь, мой вопрос, я нашел пример кода, который не использует скобки. Когда я пытаюсь добавить скобки в код, это делает мой вывод неправильным. Может кто-нибудь объяснить мне, как правильно использовать фигурные скобки в нескольких строках кода и предложить рекомендацию о том, как я могу достичь результатов, которые я ищу.

Вот код, если выход правильно:

void printStars(int i, int n) 
// The calling program invokes this function as follows: printStars(1, n); 
// n >= 1 
{ 
if(i == n) 
{ 
    for(int j = 1; j <= n; j++) cout << '*'; cout << endl; 
    for(int j = 1; j <= n; j++) cout << '*'; cout << endl; 
} 
    else 
    { 
     for(int j = 1; j <= i; j++) cout << '*'; cout << endl; 
     printStars(i+1, n); // recursive invocation 

     for(int j = 1; j <= i; j++) cout << '*'; cout << endl; 
    } 
} // printStars 

int main() { 
    int n; 
    int i=0; 

     cout << "Enter the number of lines in the grid: "; 
     cin>> n; 
     cout << endl; 

     printStars(i,n); 

    return 0; 
} 

и когда я пытаюсь «очистить его» глядя, как это:

void printStars(int i, int n) 
// The calling program invokes this function as follows: printStars(1, n); 
{ 
    if(i == n) 
    { 
     for(int j = 1; j <= n; j++) 
     { 
      cout << '*'; 
      cout << endl; 
     } 
     for(int j = 1; j <= n; j++) 
     { 
      cout << '*'; 
      cout << endl; 
     } 
    } 
    else 
    { 
     for(int j = 1; j <= i; j++) 
     { 
      cout << '*'; 
      cout << endl; 
     } 
     printStars(i+1, n); // recursive invocation 

     for(int j = 1; j <= i; j++) 
     { 
      cout << '*'; 
      cout << endl; 
     } 
    } 
} // printStars 

int main() { 
    int n; 
    int i=0; 

     cout << "Enter the number of lines in the grid: "; 
     cin>> n; 
     cout << endl; 

     printStars(i,n); 

    return 0; 
} 
+0

помнить, что оператор заканчивается точкой с запятой (';'). – wimh

+0

да, я не хватает одного? –

+1

компилятор не против, если вы поместите несколько операторов в строку. Но если вы добавите фигурные скобки вокруг одного оператора, вы не должны добавлять его во второй оператор в той же строке. – wimh

ответ

3

Проблема в том, вы положили слишком много в печати петли:

for(int j = 1; j <= i; j++) 
    { 
     cout << '*'; 
     cout << endl; 
    } 

Должно быть:

for(int j = 1; j <= i; j++) 
    { 
     cout << '*'; 
    } 
    cout << endl; 

Петли без фигурных скобок могут содержать только заявление. Это означает, что окончательная печать с использованием cout вызывается только при завершении циклов.

Это полный код, используя фигурные скобки:

void printStars(int i, int n) 
// The calling program invokes this function as follows: printStars(1, n); 
// n >= 1 
{ 
if(i == n) 
{ 
    for(int j = 1; j <= n; j++){ 
     cout << '*'; 
    } 
    cout << endl; 

    for(int j = 1; j <= n; j++){ 
     cout << '*'; 
    } 
    cout << endl; 
} 
    else 
    { 
     for(int j = 1; j <= i; j++){ 
      cout << '*'; 
     } 
     cout << endl; 

     printStars(i+1, n); // recursive invocation 

     for(int j = 1; j <= i; j++){ 
      cout << '*'; 
     } 
     cout << endl; 
    } 
} // printStars 

int main() { 
    int n; 
    int i=0; 

     cout << "Enter the number of lines in the grid: "; 
     cin>> n; 
     cout << endl; 

     printStars(i,n); 

    return 0; 
} 
+0

ОК, так что endl должен быть вне цикла? он отлично работает, кстати, спасибо! –

+1

Ну, если мы согласны с тем, что без фигурных скобок цикл 'for' применяется только к одному оператору, мы можем понять второе утверждение (' cout << endl') не является частью цикла. Удачи. –

+0

Спасибо, я все еще новичок в переполнении стека, как я могу отдать кредит? я не думаю, что у меня достаточно «репутации», чтобы дать голосование –