<docere>http://www.docere.ro/ |

Am evocat anterior o discuţie de genul Aşa ne-a zis Domnu' profesor, în legătură cu care m-am simţit… vinovat de exagerare - în fond ar fi doar un caz izolat, ceva neatenţie şi-atât. Dar iată că avem un întreg manual oficial, "Informatică - Manual pentru clasa a XI-a", Ed. CORINT 2006, autori: Mioara Gheorghe, Monica Tătărâm, Corina Achinca, Constanţa Năstase - în care apare peste tot sintagma "if(...) return (...); else return (...);".
În acest manual există un capitol SUBPROGRAME (de 80 de pagini) care tratează "Modularizarea programelor", "IMPLEMENTAREA MODULARIZĂRII. STIVA SISTEM", "Comunicarea între module", "Apelarea subprogramelor", "Fluxul de execuţie", etc. cu exemple şi ilustraţii potrivite - în pseudocod, în Pascal şi în C - şi cu fel de fel de Definiţii, Atenţionări şi Reguli.
După ce se discută aşa de amănunţit şi temeinic despre subprograme, despre "fluxul execuţiei" şi desigur despre return - la pagina 123 este formulată această funcţie C:
long fact(int n)
{ int i;
if(!n) return 1;
else
return n*fact(n-1);
}
Să ignorăm faptul că declaraţia "int i;" nu are sens în cadrul acestei funcţii. Însă formularea if(!n) return 1; else return n*fact(n-1); trădează neînţelegerea "fluxului execuţiei" (în pofida clamării pe parcursul capitolului).
Chiar şi formulările din manual care însoţesc explicativ funcţia redată mai sus, ar fi în măsură să lămurească lucrurile: "În corpul subprogramului recursiv există unul sau mai multe teste prin care se verifică condiţiile de ieşire din autoapelul recursiv. Aceste teste de ieşire formează condiţia de oprire." (am încheiat citatul). Cu alte cuvinte, în momentul îndeplinirii condiţiei de oprire n = 0 se va executa return 1; - determinând "ieşirea din autoapelul recursiv"; ieşire înseamnă implicit şi că se vor ignora toate instrucţiunile scrise după if(!n) return 1; - acestea vor fi executate numai dacă nu s-a atins situaţia de oprire. Formularea corectă ar fi aceasta:
long fact (int n) {
if(!n) return 1;
return n * fact(n-1);
}
sau mai scurt (s-o fi întâlnit şi "operatorul condiţional" pe la clasa a IX-a…):
long fact (int n) {
return n ? n * fact(n-1) : 1;
}
Întrebarea ţine desigur de o "deformaţie profesională": de ce greşeşte cutare (elevul)? În cazul de faţă ar fi chiar interesant de stabilit "de ce", fiindcă sintagma greşită if(...) return 1; else return 0; este întâlnită în toate formulările de funcţii recursive existente în manual. Intuim răspunsul datorită comparaţiei:
LIMBAJUL PASCAL:
function fibo(n: integer): integer;
begin
if n > 1 then fibo := fibo(n-1) + fibo(n-2)
else fibo := 1;
end;
LIMBAJUL C/C++:
int fibo(int n)
{
if(n > 1)
return (fibo(n-1) + fibo(n-2));
else
return 1;
}
Manualul respectiv vizează în paralel limbajul Pascal şi limbajul C/C++ (şi pseudocodul… excesiv). Ideea de a viza împreună mai multe limbaje de programare este excelentă, dar "realizarea" ei în acest manual este… "în paralel": programele redate în C/C++ nu sunt altceva decât traduceri mot-à-mot ale programelor Pascal respective.
Şi cum în Pascal nu avem o instrucţiune return, devine obligatorie formula if n > 1 then fibo := ... else fibo := ..., care prin traducere mot-à-mot conduce desigur la formularea principial greşită if(n > 1) return ...; else return ... (greşită nu numai pentru C/C++, dar şi pentru alte multe limbaje: perl, javascript, PHP, etc. ca să nu mai vorbim de "limbajele inteligenţei artificiale" la care se referă uneori manualul respectiv).
Dacă mai observăm şi greşeli de genul fibo := fibo(n-1) + fibo(n-2) (formulă în care nu se are în vedere ce înseamnă "integer")… Manualul acesta o fi bun ca "pregătire pentru bacalaureat" (care mizează în continuare pe pseudocod, Pascal sau C/C++ la fel de izolate între ele ca şi în manual, la fel de lipsite de legătură cu calculatorul sau cu sistemul de operare ca şi în manual); dar în nici un caz nu poate servi ca manual de Informatică pentru profilul Matematică-Informatică (decât doar de formă, nicidecum ca bază pentru studii ulterioare BAC-ului).
ORAR orarul şcolii
SitSco situaţie şcolară
ŞAH prin corespondenţă
doChess a Javascript chess engine
doPGN a Javascript PGN-browser
Cal++ ambiţiile Calului
aşaAzis momente lingvistice
Comentarii
—cum ar trebui calculată Media şcolară?
completely rethink the browser:
Google chrome