Rodin/BuclePentru
Am avut surpriza, experimentand interpretorul adaptabil modular pentru Rodin sa observ un fapt cel putin curios. Unele programe semnalau o eroare stranie la inceputul buclelor pentru, imediat dupa cuvantul cheie. Aparent problema era "(" sau spatiul care urma dupa pentru - daca el exista.
Un fenomen similar am constatat la unele surse si in cazul instructiunii daca. In realitate mesajul se referea la substructurile acestor structuri.
Exemplu:Transcriind un mic algoritm din cartea "68 de pagini de probleme rezolvate si teorie in Pascal" de pe www.referate10.ro (din Cap.1 de Prof. S.Groze, Prof. M.Frenţiu si colectiv. - Problema 1.1.2) in Rodin ....
"Algoritmul NRPITAGORICE este :
Date n; {n; pentru n<12 nu există triplete}
Dacă n<12
atunci Tipăreşte "Nu există numerele cerute"
altfel Pentru S=12,n execută
Pentru a=3,S/3 execută
Pentru b=a+1,(S-a)/2 execută
Fie c:=S-a-b;
Dacă c=a+b atunci Tipăreşte(a,b,c) Sf-dacă
Sf-pentru
Sf-pentru
Sf-pentru
Sf-dacă
Sf-algoritm.
"
... am obtinut dupa o prima transcriere urmatorul program cu o mica eroare sintactica...
{text "Algoritmul NRPITAGORICE";
citeste n;
daca n<12
atunci text "Nu exista numerele cerute"
altfel pentru(fie s=12; s<n; fie s=s+1)
pentru(fie a=3; a<s/3; fie a=a+1)
pentru(fie b=a+1;b<(s-a)/2;fie b=b+1)
{fie c=s-a-b;
daca c==a+b atunci {scrie a; scrie b; scrie c} altfel 0;
}
;
}
Mesajul de eroare semnala ca a treia bucla pentru ar fi avut paranteza initiala neasteptata. Totusi Rodin la celelalte bucle (exterioare), scrise sintactic la fel, nu semnala nici o eroare.
Concluzia: Eroarea trebuia cautata in corpul sau substructurile buclei.
Solutia: Daca nu observati eroarea, copiati cu CUT/COPY corpul buclei intr-un alt fisier si testati-l ca pe un program separat. Apoi il puteti lipi (Paste) inapoi.
Surpriza: Cu un corp vid {} acea bucla nu mai da nici o eroare de sintaxa. Si corpul buclei are o eroare usor de depistat, daca este scris ca un "program" separat.
Corpul buclei, extras separat si corectat:
{fie c=s-a-b;
daca c==a+b
atunci {scrie a; scrie b; scrie c;} ;
}
Apoi dupa lipirea sa inapoi obtinem:
{text "Algoritmul NRPITAGORICE";
citeste n;
daca n<12
atunci text "Nu exista numerele cerute pentru n mai mic ca 12"
altfel pentru(fie s=12; s<n; fie s=s+1)
pentru(fie a=3; a<s/3; fie a=a+1)
pentru(fie b=a+1;b<(s-a)/2;fie b=b+1)
{fie c=s-a-b;
daca c==a+b
atunci {scrie a; scrie b; scrie c;} ;
}
;
}
Algoritmul intial era din cartea "68 de pagini de probleme rezolvate si teorie in Pascal" de pe www.referate10.ro (Cap.1 de Prof. S.Groze, Prof. M.Frenţiu si colectiv. - Problema 1.1.2)
Iata si ideea algoritmului, in viziunea autorilor, textul fiind doar usor modificat:
"Vom nota cu s suma a+b+c. Se ştie că (3,4,5) este primul triplet de numere pitagorice. În acest caz s ia valori de la 12 la n. Deoarece 3a<s variabila a ia valori de la 3 la s/3. Apoi 2b<s-a deci b va lua valori de la a+1 la (s-a)/2. "
Nu uitati aceasta solutie: In caz ca nu gasiti eroarea, copiati bucla in alt fisier si depanati-o ca atare.
In fond vorbim despre limbaje pentru programare structurata . :)
Pagina in dezvoltare.
Sursele le gasiti in arhiva Rodin2009e-Linux.zip <Download>