Rodin/BuclePentru

From HaskellWiki

Am avut surpriza, experimentand interpretorul adaptabil modular pentru Rodin - Rodin2009e - versiunea nerevizuita din primavara 2009 -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 provenea din cartea "68 de pagini de probleme rezolvate si teorie in Pascal" de pe site-ul acesta: www.referate10.ro. (Cap.1 este scris de Prof. S.Groze, Prof. M.Frenţiu si colectiv iar Problema purta numarul 1.1.2)


Iata si ideea algoritmului, in viziunea autorilor, textul de mai jos fiind doar usor modificat fata de cel din carte: "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 corpul buclei 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>