Înlăturarea mai multor rânduri în secțiunea tabelă, prospectă

La prima vedere, sarcina este destul de trivială - am luat-o, am parcurs un ciclu peste toate liniile și am șters pe cele inutile:

Pentru i = 0 Prin tab. Număr () - 1 ciclu
Dacă există o [i] Marcaj atunci






Scoateți (I);
Sfârșit Dacă;
Sfârșitul ciclului;

Dar, în realitate, există două probleme:

1) După ștergerea fiecărui rând, toți indiciile rândului sunt mutate 1 înapoi.

După ștergerea liniei i-i i +, primul ia numărul i, iar ciclul merge mai departe, iar la următoarea iterație vom procesa linia i + 1 (fosta i + 2-nd).
Astfel, în primul rând, variabila buclă nu corespunde numărului de linie și, în al doilea rând, șirul care urmează șirul șters nu este procesat!
Soluția problemei încalcă recomandările programării clasice, în schimbarea variabilei buclă în corpul bucla:







Pentru i = 0 Prin tab. Număr () - 1 ciclu
Dacă există o [i] Marcaj atunci
Scoateți (I);
i = i-1;
Sfârșit Dacă;
Sfârșitul ciclului;

2) După fiecare ștergere a liniei, numărul total de linii este redus cu 1.

Se pare că ar trebui să fie așa, care este problema atunci? O problemă este că la începutul 1C ciclu o dată și stochează valoarea variabilei limită repetare (TabChast.Kolichestvo () - 1) și îl convertește de fiecare dată când se întorc la începutul buclei. Când eliminăm toate linia necesare și să ajungă la sfârșitul tabelului, iterațiile ciclu va continua, și va acoperi de eroare care depășește un index de matrice.
Soluția problemei se află în verificarea suplimentară:

Pentru i = 0 Prin tab. Număr () - 1 ciclu
Dacă există o [i] Marcaj atunci
Scoateți (I);
i = i-1;
Sfârșit Dacă;
Dacă i = Tab. Numărul () - 1 Apoi
avorteze;
Sfârșit Dacă;
Sfârșitul ciclului;

Ei bine, dacă încă mai ești confuz de revenirea la 1 în contorul unei buclă variabilă, există această opțiune folosind bucla "Bye":

i = 0;
În timp ce i<=ТабЧасть.Количество()-1 Цикл
Dacă există o [i] Marcaj atunci
Scoateți (I);
altfel
i = i + 1;
Sfârșit Dacă;
Sfârșitul ciclului;







Trimiteți-le prietenilor: