2013-03-22 3 views
0

Я тоже пытаюсь найти проблему с этим целую вечность, я наклоняю, похоже, тоже обнимаю его. Когда введено число выше значения 2, программа просто непрерывно выводит '' или '*' и не прерывается и дает правильный вывод.Непрерывный цикл не заканчивается C++

Может ли кто-нибудь увидеть, что я делаю неправильно? Вот мой код:

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


int main() 
{ 

    int xx; 

cout << "Enter the Height (odd positive numbers only): " << endl; 
cin >> xx; 

for(float y; y < xx; y++) 
{ 
    for(float x; x < xx; x++) 
    { 
     x = abs(x - (xx/2)); 
     y = abs(y - (xx/2)); 



    if((x + y) <= (xx/2)) 

     cout << '*'; 
    else 
     cout << ' '; 
    } 
cout << endl; 
} 
return 0; 

}

+3

UB. UB. UB. UB. означает Неопределенное поведение. 'x' и' y' неинициализированы, и вы * читаете * их. – Nawaz

+5

'for (float y; y perreal

+0

index undefined .... – CppLearner

ответ

1

Для номера, превышающего 2, ваше выражение x = abs(x - (xx/2)); приводит к x к декременту. Таким образом, бесконечный цикл

Например, если xx == 2, то x остается одинаковым для каждого цикла, как вы декремента x значение по 1 в выражении x = abs(x - 1); и увеличивается в течение цикла

Также, пожалуйста, инициализировать переменные внутри для цикла

EDIT: Новый дизайн

int temp1, temp2; 
for(float y=0; y < xx; y++) 
{ 
    for(float x=0; x < xx; x++) 
    { 
     temp1 = abs(x - (xx/2)); 
     temp2 = abs(y - (xx/2)); 



    //if((abs(x - (xx/2)) + abs(y - (xx/2))) <= (xx/2)) 

    if((temp1 + temp2) <= (xx/2)) 
     cout << '*'; 
    else 
     cout << ' '; 
    } 
} 
+0

благодарны кучам :) так много его бесконечного цикла, потому что x и y декрементируют в том, что xpressing x = abs (x - (xx/2)) ; Есть ли еще один способ выразить это так, что x и y приращения – KingKong

+0

Я думаю, вы можете решить его, не присваивая значения x и y. проверьте мой код – 999k

+0

спасибо, что он очень продолжил работать. было ли это не работать, потому что я использовал то же значение, которое инициализировалось в цикле for, а с помощью temp в качестве одной переменной тоже сохранялось абс x и y, не зависящее от циклов for, поэтому оно получило правильное значение? – KingKong

1

Вы должны установить свое первоначальное for петлю значения там. Предполагая, что вы хотите, чтобы они были 0:

for(float y = 0; [...] 
{ 
    for(float x = 0; [...] 
    { 

В противном случае значение, используемое в y и x случайна и зависит от того, что память содержала до их заявления.

Кроме выражение:

x = abs(x - (xx/2)); 
    y = abs(y - (xx/2)); 

с xx постоянная от входа будет держать декремент как х и у (если xx не является отрицательным или = 0, что случается, когда xx меньше 2), следовательно, ведущим к бесконечному петля.

+0

@downvoter Ум объяснить объяснение? – Shoe

+0

-1: Неопределенное поведение является правильным. но условие бесконечного цикла не решается путем его исправления. См. Мой ответ. – meyumer

+0

@meyumer, да, спасибо. исправлено это. – Shoe

4

Во-первых, существует неопределенное поведение. x и y необходимо инициализировать.

Во-вторых, ваш x и y никогда не будет больше, чем xx (если xx>=2), так как у вас есть:

x = abs(x - (xx/2)); 
y = abs(y - (xx/2)); 

Отсюда бесконечная петля.

+0

Если 'xx = 1', они не будут расти. – Shoe

+0

См. Информацию в круглых скобках: if xx> = 2 – meyumer

+0

Я забыл, что мы говорим о 'int'. – Shoe

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