2016-10-13 5 views
-2

Я пытаюсь напечатать шаблон, подобный приведенному ниже, у меня код работает без ошибок, но он генерирует бесконечный цикл, и я не уверен, почему;Код полный, но создает бесконечный цикл?

Любое руководство или помощь были бы замечательными! Благодаря

#include <iostream> 
#include <string> 
using namespace std; 

// function member 
void star(int amountStars, char starShape); 

// function 
void star(int amountStars, char starShape) 
{ 
    int i; 
    string shape = "*"; 
    for (i = 0; i < starShape; i++) 
     // loop to increment through 
     cout << shape; 

    cout << endl; 

    if (starShape == amountStars) 
     // if * is equal to the amount of stars (30) 
     return; //************** 
    star(amountStars, ++starShape); // increase * by one *********** 

    for (i = 0; i < starShape; i++) 
     cout << shape; 
     cout << endl; 


} 
int main() 
{ 
    int amountStars = 30; // variable to store the amount of stars 

    star(amountStars, '*'); // function print for the amount of stars and the shape 

    return 0; 
}//end main 
+0

'if (starShape == amountStars)' по какой-то причине это выглядит неправильно. – Rakete1111

+0

starShape - персонаж. для (i = 0; i user5478656

+0

Я понимаю, что вам дали прототип 'void star (int amountStars, char starShape),' учителем или схожим. 'amountStars' - количество звезд, которые вы должны печатать; «starShape» - персонаж, который вы должны печатать. Вы не рассматриваете параметры таким образом. – molbdnilo

ответ

1

Ваша star() функция вызывает себя на линии с «увеличением * по одному» комментарий, что означает, что это рекурсивная функция. Но условие завершения сломана

Вы intialise параметр starShape, который имеет тип char с буквальным «*», который имеет значение ASCII из 42. Но вместо того, чтобы использовать это как символ, вы на самом деле использовать локальный строковая переменная shape для печати. И вы обрабатываете starShape в качестве счетчика, который вы пытаетесь использовать для завершения цикла. Но он начинается с 42 и только поднимается оттуда, поэтому он никогда не будет равняться значению 30, которое вы пройдете.

Самый простой (но не лучший) способ исправить это - изменить starShape на int и перейдите в 0 от main.

#include <iostream> 
#include <string> 
using namespace std; 

// function member 
void star(int amountStars, char starShape); 

// function 
void star(int amountStars, char starShape) 
{ 
    int i; 
    string shape = "*"; 
    for (i = 0; i < starShape; i++) 
     // loop to increment through 
     cout << shape; 

    cout << endl; 

    if (starShape == amountStars) 
     // if * is equal to the amount of stars (30) 
     return; //************** 
    star(amountStars, ++starShape); // increase * by one *********** 

    for (i = 0; i < starShape; i++) 
     cout << shape; 
     cout << endl; 


} 
int main() 
{ 
    int amountStars = 30; // variable to store the amount of stars 

    star(amountStars, 0); // function print for the amount of stars and the shape 

    return 0; 
}//end main 

Затем зайдите и прочитайте о рекурсивных функциях и условиях завершения. :)

0

Попробуйте это в основном корпусе

main() 
{ 
    //inside main() 
    int i,n,j; 

    //Reads number of columns from user 

    cout<<"Enter value of n : "<<endl; 
    cin>>n; 

    //Prints the upper half part of the pattern 
    for(i=1; i<=n; i++) 
    { 
     for(j=1; j<=i; j++) 
     { 
      cout<<"*"; 
     } 
     cout<<endl; 
    } 

    //Prints the lower half part of the pattern 
    for(i=n; i>=1; i--) 
    { 
     for(j=1; j<i; j++) 
     { 
      cout<<"*"; 
     } 
     cout<<endl;; 
    } 

    return 0; 
} 
1

вы делаете значение starShape быть *, значение ASCII из * 42, так что ваш код никогда не сойдутся код:

if (starShape == amountStars) 
     // if * is equal to the amount of stars (30) 
     return; //************** 

, потому что 42 больше, чем 30, то почему ваш цикл бесконечен.

1

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

Конкретная фигура, которую вы описываете, представляет собой восходящее (в гору) количество символов на линию до достижения порога, а затем повторение той же последовательности, которая спускается (спуска) в обратном направлении. Алгоритм сделать это:

void func(const int limit, const int current) 
{ 
    // termination case (note >) 
    if (current > limit) 
     return; 

    // TODO: perform task 

    // recurse 
    func(limit, current+1); 

    // TODO: perform task 
} 

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

Если вы не хотите повторяться центральная линия, вы просто изменить расположение рекурсии и изменить условие соответствия, а чем более:

void func(int limit, int current) 
{ 
    // TODO: perform task 

    // termination case (note ==) 
    if (current == limit) 
     return; 

    // recurse 
    func(limit, current+1); 

    // TODO: perform task 
} 

Это приведет к шаблону, который выглядит следующим образом:

* 
** 
*** 
**** 
*** 
** 
* 

Обратите внимание на центр линии не повторяется, как и все остальные.

Наконец, сама задача, которая может быть просто:

void starline(const int length) 
{ 
    for (int i=0; i<length; ++i) 
     std::cout.put('*'); 
    std::cout.put('\n'); 
} 

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

Наконец, параметры все из выше const, потому что (а) нет никаких оснований изменять их для этих алгоритмов, и (б), если вы случайно сделать так, вы хотите, чтобы поймать его на compile- время; не время выполнения.


Примеры

Оба алгоритма используют один и те же starline() функцию, показанных ранее. Единственная разница - это рекурсивная функция и результаты, которые они испускают.

Первый алгоритм и его выход ниже

#include <iostream> 

void starline(const int length) 
{ 
    for (int i=0; i<length; ++i) 
     std::cout.put('*'); 
    std::cout.put('\n'); 
} 

// function 
void star(const int amountStars, const int length = 1) 
{ 
    // termination case 
    if (length > amountStars) 
     return; 

    starline(length); 
    star(amountStars, length+1); 
    starline(length); 
} 

int main() 
{ 
    star(10); 
} 

Выход

* 
** 
*** 
**** 
***** 
****** 
******* 
******** 
********* 
********** 
********** 
********* 
******** 
******* 
****** 
***** 
**** 
*** 
** 
* 

Второй показано в следующем:

#include <iostream> 

void starline(const int length) 
{ 
    for (int i=0; i<length; ++i) 
     std::cout.put('*'); 
    std::cout.put('\n'); 
} 

// function 
void star(const int amountStars, const int length = 1) 
{ 
    starline(length); 

    // termination case 
    if (length == amountStars) 
     return; 

    star(amountStars, length+1); 
    starline(length); 
} 

int main() 
{ 
    star(10); 
} 

Выход

* 
** 
*** 
**** 
***** 
****** 
******* 
******** 
********* 
********** 
********* 
******** 
******* 
****** 
***** 
**** 
*** 
** 
* 

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

  • Нет связанных вопросов^_^