Зацикливание программы при использовании оператора goto
Artyom88
Дата: 05.05.2015 10:40:51
a:
for (int z=1;z<NN;z++)
{
alfa[z]=F/(1+F*(2-alfa[z-1]));
beta[z]=(teta[z]+F*beta[z-1])/(1+F*(2-alfa[z-1]));
nn=StrToFloat(Form1->LabeledEdit14->Text);
gamma=1-alfa[nn-1]-beta[nn-1];
}
// Вычисление уточненного значения F1:
F1=(gamma*F+K0+(1-teta[nn]))/G;
if (abs(1-F/F1)<0.001)
{
if (F>250)
{
return;}
else {
goto b;
}}
else {
F=F1;
goto a;
}
//Обратная прогонка:
b:
teta[nn]=1;
for (int x=nn-1;x==0;x--)
{
teta[x]=alfa[x]*teta[x+1]+beta[x];
}
timex2=timex1+F*(pow(dy,2))/a;
delta1=delta1-dy;
q2=alam*(teta[1]-teta[0])*(T1-T2)/dy;
goto a;
Модератор: Отформатировано |
Artyom88
Дата: 05.05.2015 10:44:50
проблема в зацикливании проги, если условие N1 не выполняется, то F=F1 и пошел на метку А. Если выполняется то переходим ко второму условию, при котором если оно выполняется то заканчиваем расчет, а если нет то идем на метку B и после перерасчета идем на метку А.
wst
Дата: 05.05.2015 10:54:53
Могу ошибаться, но выложенному примеру вида "метка: что-то; goto метка" и положено зацикливаться, так что все работает как надо.
MasterZiv
Дата: 05.05.2015 11:07:11
Artyom88,
тут нет каких то ошибок в программе, ошибка в алгоритме, ну так и отлаживай.
А поскольку отлаживание -- это процесс устранения лажи из программы, то первая
лажа, которую надо отсюда убрать--это goto. Оформи программу с нормальными циклами, и уже будет легче -- ты поймешь, каковы условия выхода из цикла и каковы переменные цикла.
RWolf
Дата: 05.05.2015 11:09:17
Artyom88 |
---|
for (int x=nn-1;x==0;x--) |
Подозреваю, что имелось в виду for (int x=nn-1; x>=0; x--)
Artyom88
Дата: 05.05.2015 11:26:15
MasterZiv,
Вы были правы ошибка в алгоритме. не хватает строчки nn=nn-1 в конце))
Artyom88
Дата: 05.05.2015 11:48:05
RWolf,
Спасибо полезное замечание!