Цикл for проходит только одну итерацию

Я пытаюсь создать программу, которая упрощает радикалы в TI-BASIC. Однако один цикл FOR завершает только одну итерацию, в то время как остальные работают нормально. Вот код:

Input "Root=",A
Input "Radical=",B
B→Z
ClrList L₃
prgmPRMNTOL1
prgmGETPRIME

Рассматриваемый цикл FOR начинается здесь...

For(Y,1,10)
0→Z
For(X,1,dim(L₂))
If L₁(Y)=L₂(X)
Then
Z+1→Z
End:Disp Z
End
If Z≥A
Then
int(Z/A)*A→C
int(Z/A)→D
For(T,1,D)
L₁(Y)→L₃(1+dim(L₃))
End
For(R,1,C)
ClrList L₄
For(S,1,dim(L₂))
If L₂(S)=L₁(Y) and C>0
Then
–1→L₂(S)
C-1→C
End
End
For(Q,1,dim(L₂))
If L₂(Q)≠–1
Then
L₂(Q)→L₄(1+dim(L₄))
End
End
ClrList L₂
For(Q,1,dim(L₄))
L₄(Q)→L₂(Q)
End
End
End

...и заканчивается здесь.

1→E
For(M,1,dim(L₃))
E*L₃(M)→E
End
1→F
For(N,1,dim(L₂))
F*L₂(N)→F
End
Disp "OUTSIDE",E,"ROOT",A,"INSIDE",F

Программа работает отлично, за исключением того, что этот цикл выполняется только один раз. При необходимости я также опубликую prgmPRMNTOL1 и prgmGETPRIME, хотя они, вероятно, не имеют никакого значения, поскольку изменяют только L₁ и L₂.

РЕДАКТИРОВАТЬ: добавлена ​​версия с отступом.

Input "Root=",A
Input "Radical=",B
B→Z
ClrList L₃
prgmPRMNTOL1
prgmGETPRIME

For(Y,1,10)
    0→Z
    For(X,1,dim(L₂))
        If L₁(Y)=L₂(X)
        Then
            Z+1→Z
        End
    End
    If Z≥A
    Then
        int(Z/A)*A→C
        int(Z/A)→D
        For(T,1,D)
            L₁(Y)→L₃(1+dim(L₃))
        End
        For(R,1,C)
            ClrList L₄
            For(S,1,dim(L₂))
                If L₂(S)=L₁(Y)
                Then
                    –1→L₂(S)
                End
            End
        For(Q,1,dim(L₂))
            If L₂(Q)≠–1
            Then
                L₂(Q)→L₄(1+dim(L₄))
            End
        End
        ClrList L₂
        For(Q,1,dim(L₄))
            L₄(Q)→L₂(Q)
        End
    End
End

1→E
For(M,1,dim(L₃))
    E*L₃(M)→E
End

1→F
For(N,1,dim(L₂))
    F*L₂(N)→F
End

Disp "OUTSIDE",E,"ROOT",A,"INSIDE",F

person GamrCorps    schedule 04.04.2015    source источник
comment
Распространенной причиной такого поведения является то, что ваши петли и концы не совпадают. Версия вашего кода с отступом позволит легко обнаружить это.   -  person ankh-morpork    schedule 05.04.2015
comment
@dohaqatar7 только что добавил это.   -  person GamrCorps    schedule 05.04.2015


Ответы (1)


Закройте петли

Ваша проблема, по-видимому, связана с неправильным сопоставлением ваших операторов If, циклов и их операторов End.

Что творится

Поведение TI-Basic, когда конец файла достигнут до того, как все циклы и операторы If были закрыты, заключается в тихом сбое, завершающем программу, а не в предупреждении пользователей об ошибке.

Такое поведение делает некоторые странные фрагменты кода синтаксически допустимыми. Например, этот фрагмент будет работать без ошибок:

 For(A,1,10
     Disp A

Результаты

               1
            Done

Очевидно, это то же самое, что и запуск Disp 1, поэтому нет причин использовать это в вашем коде. Он служит только для того, чтобы в коде появлялись тихие и надоедливые ошибки.

Исправление

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

Input "Root=",A
Input "Radical=",B
B→Z
ClrList L₃
prgmPRMNTOL1
prgmGETPRIME
For(Y,1,10)
0→Z
For(X,1,dim(L₂))
If L₁(Y)=L₂(X)
Z+1→Z
End
If Z≥A:Then
int(Z/A)*A→C
int(Z/A)→D
For(T,1,D)
L₁(Y)→L₃(1+dim(L₃))
End
For(R,1,C)
ClrList L₄
For(S,1,dim(L₂))
If L₂(S)=L₁(Y)
–1→L₂(S)
End
End:"Inserted this End
For(Q,1,dim(L₂))
If L₂(Q)≠–1
L₁(Q)→L₄(1+dim(L₄))
End
ClrList L₂
For(Q,1,dim(L₄))
L₄(Q)→L₂(Q)
End
End
End
1→E
For(M,1,dim(L₃))
E*L₃(M)→E
End
1→F
For(N,1,dim(L₂))
F*L₂(N)→F
End
Disp "OUTSIDE",E,"ROOT",A,"INSIDE",F

Если это не исправит, отсутствующий End находится где-то в вашем коде.

person ankh-morpork    schedule 05.04.2015
comment
Я даже не знал, что код может работать с отсутствующими концами. Спасибо! - person GamrCorps; 05.04.2015
comment
Я решил, что это проблема. +1 за скорость! - person Timtech; 06.04.2015