Rodin/BuclePentru

From HaskellWiki
< Rodin
Revision as of 21:42, 14 March 2009 by Ha$kell (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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>