Зацикливание программы при использовании оператора 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,

Спасибо полезное замечание!