Showing posts with label Octavian BÂSCĂ. Show all posts
Showing posts with label Octavian BÂSCĂ. Show all posts

Friday, September 4, 2026

Programe în limbajul FORTRAN, carte din 1975 de Horia GEORGESCU și Octavian BÂSCĂ

Am în mână cartea referită prin:
Horia GEORGESCU, Octavian BÂSCĂ - Programe în limbajul FORTRAN, Editura Albatros, colecția Lyceum, București 1975, 327 pag.
Este cartea despre care spun că a reprezentat unul dintre elementele cheie pentru dezvoltarea multor generații de programatori, nu numai în limbajul FORTRAN, pentru că:
- are numeroase din tipologiile reprezentative de probleme enunțate,
- include texte sursă ale programelor așa cum rezultă ele după rularea pe calculator,
- soluțiile propuse au un grad foarte ridicat de reutilizare,
- comentariile oferă deschideri pentru alte soluții mai bune,
- acoperă cam toate facilitățile limbajului FORTRAN.
Cartea a apărut într-un tiraj de 32.200 exemplare, ceea ce la acea vreme reprezenta un punct culminant, editura exprimându-și în acest fel încrederea că tematica abordată de GEORGESCU și BÂSCĂ este de maxim interes, lucru care s-a dovedit real, din moment ce stocul a fost epuizat rapid.
La vremea când li s-a publicat cartea, Horia GEORGESCU avea 30 de ani, iar Octavian BÂSCĂ avea 28 de ani, ceea ce arată că erau la început de carieră academică și trecerea timpului a arătat că amândoi au evoluat frumos, devenind profesori universitari, GEORGESCU la vârsta de 56 de ani și BÂSCĂ la 52 de ani, știut fiind faptul că la matematicieni și la medici carierele universitare au la bază alte criterii decât în celelalte profesii, filtrele fiind cu mult mai ridicate.
Am avut oarece mirări că lucrarea ce face obiectul studiului de față nu conține o bibliografie, dar ea include programe scrise de cei doi și așa cum și în manualele de utilizare a unor dispozitive, nu prea există bibliografie, pentru că autorii împărtășesc din propria experiență și în acest caz tot așa stau lucrurile, mai ales că suntem în anul 1975 și cărțile de FORTRAN aveau teorie și ceva exemple, dar nu erau dedicate programelor, nu programării, așa cum fac GEORGESCU și BÂSCĂ. Nu-i scuz pe autori, dar și eu tot așa aș fi procedat atunci când aș fi făcut de unul singur, o culegere de programe, căci a scrie programe înseamnă a avea standardul limbajului și calculatorul, experiență proprie și nimic altceva. Este asemeni creațiilor populare, în care doinele și baladele se prezintă fără a se specifica o bibliografie cu autori și an al apariției, din moment ce autorii cărții luate acum în studiu includ în paginile acesteia creații proprii.
I-am inclus pe  Horia GEORGESCU și Octavian BÂSCĂ în galeria marilor clasici, așa cum am făcut-o cu Stelian NICULESCU, Margareta DRĂGHICI, Petre DIMO și Emil MUNTEANU, pentru că ei au scris cărți ce au influențat generații de programatori, au adus ceva nou în programare și un impus un standard deosebit de ridicat în dezvoltarea informaticii de la noi, prin oameni, prin sistemele informatice implementate și prin emulația pe care cei numiți de mine au creat-o în rândul populației prin ei înșiși.
Cartea scrisă de Horia GEORGESCU și Octavian BÂSCĂ are trei părți și anume:
- INTRODUCERE de la paginile 1 - 39
- PROGRAME de la paginile 40 - 258
- REZULTATELE EXERCIȚIILOR de la paginile 259 - 327.
În capitolul PROGRAME, autorii enunță probleme, dau explicații, construiesc scheme logice și prezintă texte sursă, dar și re4zultate obținute după rulări, după cum urmează:
- programul 01 de la paginile 40 - 43 se referă la problema interschimbului de subșiruri în cadrul unui șir de elemente; este prezentată schema logică și textul sursă; soluția aleasă este de a lucra cu doi vectori, unul cel cu datele inițiale, cel de al doilea, în care se interxchimbă elementele și care oferă rezultatul problemei cerute;
- programul 02 de la paginile 44 - 47 se referă la problema rezolvării ecuației de gradul doi; este explicată problema exact cu formalizările ce se preiau în programul FORTRAN; schema logică de la pagina 46 este cea pe care orice elev sau student au exersat-o la seminar, iar programul redă instrucțiune cu instrucțiune fiecare bloc al schemei logice; se folosesc A, B, C coeficienți ai ecuației ca în cartea de algebră și tot ca în cartea de algebră se folosește variabila DELTA, dar și denumirile rădăcinilor X1 și X2;la eticheta 60 de exemplu se găsește intrucțiunea FORMAT pentru tipărirea rădăcinilor complexe, fără a lucra cu tipul de date COMPLEX, dar folosind artificiile corespunzătoare;
- programul 03 de la paginile 148 - 150 se referă la problema descompunerii unui număr întreg în factori primi;
- programul 04 de la paginile 51 -54  se referă la problema ridicării unei matrice pătrate la o putere pozitivă întreagă m, folosind un subprogram; se optează pentru soluția scrierii acelui număr pozitiv în baza 2 și se reduce numărul de apeluri ale subprogramului de produs matrice; subprogramul BINARN dă reprezentarea binară a numărului m; este utilizat subrpgramul PRMAT de la pagina 33 care se apelează de m-1 ori sau subprogramul PTMAT care se apelează de mult mai puține ori;
- programul 05 de la paginile  55 - 58 se referă la problema aflării restului împărțirii a două numere naturale; se construiește un subprogram numit IND pentru calcului indicatorului lui EULER al unui număr natural; să nu uităm că GEORGESCU și BÂSCĂ sunt cadrevdidactice la Facultatea de Matematică de la Universitate și unele dintre problemele propuse de ei sunt de matematică, nici economice, nici inginerești, nici de chimie și nici de biologie;
- programul 06 de la paginile 58 - 62 se referă la problema trecerii unui număr scris într-o anumită bază, la reprezentarea sa într-o altă bază; se specifică faptul că numărul N și cele două baze B, B1, sunt numere naturale; se consideră numărul N scris în baza B; subprogramul ALG realizează trecerea numărului din baza B în baza 10; subprogramul MARY execută trecerea numărului N scris în baza 10 în baza B1; sunt date convențiile de reprezentare a simbolurilor utilizate în bazele B și B1; apare si subprogramul EU esențial în rezolvarea problemei enunțate;
- programul 07 de la paginile 63 - 66  se referă la problema găsirii unei soluții generale pentru a rezolva o ecuație diofantice A*X+B*Y=C cu A, B, C numere întregi și X și Y soluții, tot numere întregi; este scris subprogramul DLIN; la pagina 64  sunt date o serie de formule, care se regăsesc în schemele logice de la pagina 65 și blocurile schemelor logice au corespondent în textele sursă de la pagina 66, aceasta fiind o mare virtute  a demersului celor doi autori; în programul principal apar două instrucțiuni STOP, una care încheie prelucrarea în cazul în care problema nu are soluție și alta când există soluție și acea soluție se tipărește, după care se încheie execuția;
- programul 08 de la paginile  67 - 71 se referă la problema reprezentarea matricelor rare pătrate pentru a economisi memoria calculatorului; se folosesc doi vectori, unul care conține pozițiile elementelor nenule și celălalt care conține valoarea elementelor nenule; suprogramul MAT reconstituie matricea rară și o tipărește; programul principal conține și secvența pentru adunarea a două matrice rare, reprezentate fiecare prin doi vectori, iar rezultatul, dat de vectorii Z și IP estetipărit tot folosind suprogramul MAT; la disciplina de Structuri de date pe care am predat-o ani în șir, am prezentat chestiunea matricelor rare și am făcut calcule de eficiență în utilizarea memoriei și tot timpul m-am gândit la această problemă din cartea lui GEORGESCU și BÂSCĂ, pe care am considerat-o sursă de inspirație, căci la exercițiile propuse, tot timpul furnizau idei interesante;
- programul 09 de la paginile 72 - 76 se referă la problema reprezentării matricelor simetrice cu N linii și N coloane, în vederea economisirii de memorie; matricele simetrice sunt matrice pătrate; în loc de a păstra în memorie N*N elemente, se construiește un vector cu N*(N+1)/2; sunt scrise subprogramele PROD și LINIE, iar programul principal citește elementele a două matrice simetrice, reconstituie liniile acestora și calculează suma și produsul lor folosind numai și numai vectori; dacă ne imaginăm matricea distanțelor dintre capitalele de județe de la noi, reprezentarea propusă aici este extraordinară căci de la o matrice cu 41*41 componente, se face o economie de introducere de numere la 41*(41+1)/2 componente;
- programul 10 de la paginile 76 - 80 se referă la problema găsirii unei soluții într-un interval specificat pentru o ecuație de forma f(x)=0; autorii cărții au propus subprogramul RADC pentru calculul rădăcinii aproximative a ecuației; funcția f(x) este definită într-un subprogram de tip FUNCTION care este declarat EXTERNAL în programul principal; subprogramul RADC are în lista de parametri funcția, valorile A și B care definesc intervalul unde este căutată soluția, și variabila de stare K unde K este 1 dacă funcția are are același semn la capetele intervalului; și aici remarc corespondența între descrierea formulei de calcul, a algoritmului, a schemei logice și a programului; aceasta este arta de a scrie programe adevărate;
- programul 11 de la paginile 81 - 92 se referă la problema scrierii de subprograme destinate  implementării operațiilor cu polinoame; un polinom cu o variabilă are coeficienții dați în vectorul A; un polinom se reprezintă cu coeficienți și cu puterile lui x; sunt scrise subprogramele SUMP - adunare a două polinoame, INMPN - înmulțire a două polinoame, IMPP - împărțire a două polinoame, DCP - obținerea celui mai mare divizor comun a două polinoame, SCRIE - afișarea unui polinom cu coeficienți și variabila X folosind pentru exponent operatorul **; la unele dintre subprograme, autorii au optat la utilizarea mai multor instrucțiuni RETURN pentru a evita creșterea complexității prin utilizarea unor instrucțiuni GO TO inutile dealtfel în economia suprogramelor, mai ales că autorii au vorbit la început de programe eficiente;
- programul 12 de la paginile 93 - 96 se referă la problema calculului unui determinant folosind definiția acestuia, deci fără transformări ale matricei inițiale; subprogramul PERM realizează permutarea circulară a eementelor unui vector; subprogramul DET calculează valoarea determinantutlui apelând subprogramul PERM; există descris și subprogramul PER pe care nu-l descriu aici, lăsând plăcerea cititorului curios să meargă la sursă pentru a-l descoperi; programul principal lucrează cu o matrice A inițializată cu DATA; apelează subprogramul DET, după care tipărește valoarea determinantului; apreciez claritatea textului sursă în raport cu explicațiile de matematică, cu blocurile schemelor logice și cu secvențele de text sursă;
- programul 13 de la paginile  97 - 101 se referă la problema calculului unui polinom cu 3 variabile într-un punct, calculul derivatelor parțiale și calculul integralei; în același punct;
- programul 14 de la paginile  102 - 106 se referă la problema ortonormării unui sistem de vectori; autorii oferă la soluție formulele ce trebuie calculate; sistemul de indici și numele variabilelor sunt foarte apropiate de cele ce vor fi folosite în program; funcția PROD calculează produsul scalar a doi vectori A și B și are textul sursă:
        FUNCTION PROD(A,B,N)
        REAL A(N),B(N)
        PROD=0.
        DO 2 I=1,N
    2   PROD=PROD + A(I)*B(I)
        RETURN
        END
am reprodus acest text pentru că l-am găsit frumos, clar, exact cum trebuie scris acest subprogram ca să fie încadrat în clasa programelor bine scrise, după cum vor GEORGESCU și BÂSCĂ încă în introducerea cărții; autorii atenționează că se lucrează pe matricea A inițializată prin citire de cartele și de aceea se introduc vectorii de lucru P, V, W; solicit analiza blocurilor schemelor din figura14.1 și a textului sursă, pentru a evidenția grija autorilor în a realiza construcții de calitate; remarc faptul că autorii s-au fixat pe operații care să scoată în evidență cu claritate esența problemei de rezolvat, fără a schimba intrucțiunile READ, FORMAT, WRITE, DO și IF de la problemă la problemă, ca programatorul să piardă timp cu înțelegerea acestor instrucțiuni; am apreciat că la Instrucțiunea DO sunt folosite variabilele de control I și J;
- programul 15 de la paginile  106 - 108 se referă la problema desenării unui cerc; autorii explică din start că foaia de imprimantă trebuie văzută ca o matrice cu 132 coloane și 132 linii, deci desenul va apare în această matrice, unde multe elemente sunt inițo=ializate cu blanc și numai elementele care dau conturul cercului vor fi inițializate cu asterisc; ideea este de a calcula pozițiile I și J ale elementelor din matrice care vor fi inițializate cu asterisc; schema logică și programul lămuresc exact aceste aspecte; inițializările cu DATA oferă o soluție elegantă pentru ceea ce se va tipări; trebuie urmărit cum se inițializează vectorul definit cu DIMENSION LINIE(132) care va fi tipărit;
- programul 16 de la paginile  109 - 112 se referă la problema ordonării alfabetice a unei liste de nume; se pornește de la ideea reprezentării literelor în lista de caractere ASCII ca reprezentări hexazecimale; se știe că variabilele ocupă 4 baiți, adică un cuvânt; un cuvânt de memorie ocupă 4 caractere; se construiește subprogramul ORNM care ordonează alfabetic numele; se construiește o listă a numelor folosind matricea A cu M linii și L coloane;
- programul 17 de la paginile  112 - 116 se referă la problema ordonării lexicografice a unei matrici, după care se ordonează liniile matricelor după două criterii; subprogramul CRES ordonează crescător elementele unui vector, iar subprogramul DESCR ordonează descrescător elementele unui vector; subprogramul MAT ordonează lexicografic liniile matricei A cu M linii și N coloane; autorii au optat asupra ordonării folosind un anumit algoritm, dar nu se ține seama dacă șirul este deja ordonat; programul principal inițializează matricea A prin citirea de cartele, tipărește această matrice, după care apelează subprogramele MAT, apoi CRES, apoi DESCR, după care tipărește matricea ordonată lexicografic;
- programul 18 de la paginile  117 - 121 se referă la problema codificării și decodificării unui text  de cel mult 300 caractere;  simbolurilor diferite din text, alfabetul inițial,  le corespunde numere diferite într-un vector, codurile adică;   programul pune în corespondență elementele textului ce conțin simboluri din alfabetul inițial cu  caracterele din vectorul codurilor, rezultând textul codificat; tot în program se realizează și operația inversă, trecerea de la textul codificat la textul în clar; schemele logice și programul redau cu exactitate prezentarea algoritmului, folosind denumirile de variabile din soluția propusă;
- programul 19 de la paginile 121 - 125 se referă la problema găsirea pozițiilor unor dame pe tabla de șah, în condiții specificare, problemă denumită și problema celor opt dame; nu am insistat asupra acestui program căci nu sunt pasionat de jocul cu dame și deci nu voi aborda problema  decât din punctul calculului combinărilor de 64 luate câte 8, dar pe o linie poate să se găsească o singură damă; sunt definite și alte restricții, iar subprogramul TABLA apelat de mai multe ori, tipărește rezultatele;
- programul 20 de la paginile  125 - 129 se referă la problema construirii unui pătrat magic de ordin impar; se definește conceptul de pătrat magic; subprogramul PMAG construiește pătrate magice de cel mult 50 linii și 50 coloane; programul apelator construiește  programe magice cu 3, 5, 7, 9 linii, respectiv, coloane; pe care le afișează, tipărind și sumele pe coloane, respectiv, pe linii, ca să se arate, că chiar matricele tipărite reprezintă pătrate magice;
- programul 21 de la paginile  129 - 134 se referă la problema traversării elementelor unei matrice simulând mișcarea calului pe o tablă de șah; este descrisă tabla de șah, se stabilește poziția punctului de start; se identifică mișcările piesei de la șah numită cal și se stabilesc elementele din matrice care sunt identificate ca punct de final; aici apar multe instrucțiuni de salt necondiționat, dar se vede că autorii au optat pentru o soluție elegantă, instrucțiunea cu eticheta 400 este un GO TO calculat către 8 direcții, funcție de valoarea variabilei M2;
- programul 22 de la paginile 135 - 138 se referă la problema calcului funcției y = exp(x) folosind dezvoltarea în serie pentru exp(x) după formula în care apar termeni cu x la diferite puteri și la numitor apar calcule de factorial, cum cere dezvoltarea în serie FOURIER; programul principal începe abrupt prin calcului a 21 de termeni ai seriei; se apelează funcția EXPX care estimează exp(x); s-a folosit  EXPX pentru a nu fi confundată cu funcția de bibliotecă FORTRAN EXP(); programul afișează valorile estimate pentru cei 21 de pași parcurși;
- programul 23 de la paginile  138 - 139 se referă la problema calculului unui determinant după metoda lui GAUSS; ideea este de a construi o matrice triunghiulară; se construiește subprogramul DET care este apelat de programul principal; nu insist asupra acestei soluții pentru că mai toate cărțile de FORTRAN și acum de C++ și PYTHON insistă exact pe această problemă și textele sursă de acum 50 de ani nu diferă semnificativ, de textele sursă din ziua de azi;
- programul 24 de la paginile  143 - 146 se referă la problema unui sistem liniar de ecuații prin metoda GAUSS; programatorii din ziua de azi știu despre ce este vorba și aici voi spune doar că GEORGESCU și BÂSCĂ au construit niște scheme logice superbe prezentate în figura 24.1 în care formulele din cărțile de metode numerice sunt preluate integral și transferate în programul FORTRAN; subprogramul SISL calculează soluția sistemului de ecuații liniare; subprogramul INTERV schimbă două ecuații între ele; programul apelator poate fi modificat ușor pentru a permite rezolvarea de sisteme liniare cu mai mult de 10 ecuații și 10 necunoscute;
- programul 25 de la paginile  147 - 150 se referă la problema rezolvării unui sistem de ecuații prin metoda lui CRAMER; Nu descriu aici ce înseamnă metoda lui CRAMER; trebuie calculat un determinant asociat unei matrici; prima dată se calculează determinantul matricii coeficienților sistemului liniar, folosind subprogramul DET de la problema 23; cu același subprogram se calculează și ceilalți determinanți generații folosind subprogramul DETXI, rezultați din înlocuirea unei coloane cu vectorul termenilor liberi; soluția sistemului se obține ca împărțire a determinanților generați la valoarea determinantului sistemului; matricea inițială A(10, 10) este copiată în matricea C(10,10), pentru că operația de modificare în vederea obținerii determinanților generați, necesită conservarea acesteia;
- programul 26 de la paginile  150 - 153 se referă la problema scrierii unui subprogram pentru inversarea unei matrice; se folosește metoda complemenților algebrici; subprogramul care inversează matricea se numește INVMAT; se presupune că matricea este nesingulară; se folosește subprogramul de tip FUNCTION de calcul a unui determinant DET, despre care am mai vorbit; dacă matricea este singulară prin convenție un element din matricea B este inițializat cu 0 și se întrerupe execuția; în programul principal acest element este testat și dacă este 0 se tipărește mesajul că matricea nu este inversabilă; dacă acel element este diferit de zero se apelază subprogramul INVMAT; am mai văzut și alte programe pentru inversarea de matrice, dar acesta mi se pare a fi un program scris ca la carte și dacă aș opta pentru a face o bibliotecăde subprograme cu alcule matriceale, l-aș include acolo fără discuție;
- programul 27 de la paginile  153 - 157 se referă la problema inversării unei matrice prin metoda eliminării; ideea este de a scrie lângă matricea A o matrice unitate și de a face calcule ca în locul elementelor matricei A să avem matricea unitate și în locul matricei unitate se va obține matricea inversă; Îmi amintesc că în studenție mi s-a părut interesantă metoda, dar calculele de memorie nun erau în favoarea ei; GEORGESCU și BÂSCĂ au scris subprogramul INVMAT; în subprogram matricea B face obiectul inversării, iar matricea A este matricea inversă, în timp ce la apelare matricea A este matricea inițială, iar matricea B este matricea inversă; care se și imprimă linie de linie în secvența:
          DO 2 I=1,3
2       WRITE(3,3) (B(I,J), J=1,3)
3.       FORMAT( '  ', 3F8.5)
          STOP
și aici trebuie admirată perseverența autorilor pentru a păstra explicațiile din text în blocurile schemei logice și apoi în program;
- programul 28 de la paginile  157 - 1644 se referă la problema identificării structurii definite pe o mulțime finită de N elemente; se ia în considerare o lege de compoziție ⊤; comutativitatea este verificată cu subprogramul COMUT,; subprogramul INVERS verifică dacă orice element este inversabil; mai există subprogramele NEUTRU, GRUPCOMUT, DISTR GRUP;  la pagina 161 sunt prezentate schemele logice; subprogramele și programul principal urmăresc pas cu pas schemele logice și explicațiile soluției; în final după execuția subprogramelor apelate; programul principal tipărește mesaje dacă lege este sau nu asociativă, comutativă, dacă este vorba de un grup, de un inel și dacă există element neutru;
- programul 29 de la paginile 165 -168 se referă la problema verificării dacă o relație pe o mulțime finită este relație de echivalență; se construiesc subprogramele de tip FUNCTION numite REFLEX, SIMET, TRANZ, care verifică dacă relația este reflexivă, simetrică, respectiv, tranzitivă, caz în care valoarea returnată este 1; în caz contrar, valoarea returnată este 0; schemele logice și textele sursă urmăresc cu precizie explicațiile oferite de autori când au prezentat soluția aleasă de ei;
- programul 30 de la paginile 168 - 176 se referă la problema scrierii de subprograme care testează dacă o relație pe o mulțime are anumite proprietăți și pentru relații de echivalență cere să se găsească respectivele clase;  Se scriu subprogramele, TEST, REFLX, SCRIE, TRANZ, SIM, CLASA, REL, care sunt apelate din programul principal; subprogramul REL are trei puncte de intrare REL1, REL2, REL3, definite EXTERNAL în programul apelator și la apelul subprogramului REFLX câte unul din aceste puncte este transmis ca parametru; autorii au optat pentru tipărirea rezultatelor într-o formă cât mai clară;
- programul 31 de la paginile  176 - 181  se referă la problema trecerii de la o relație de preodine la o relație de ordine folosind factorizarea canonică; se consideră mulțimea A de numere întregi subprogramele TRANZ, REFLEX, SIM, sunt destinate prelucrărilor conform cu cerințele algoritmului prezentat; programul apelator  inițializează matricea M, apelează subprogramul REFLEX care verifică dacă este vorba de reflexivitate; apelează subprogramul TRANZ și testează dacă este vorba de tranzitivitate; pentru fiecare dintre situații se afișează mesaje; doar dacă vorbim de reflexivitate și tranzitivitate se apelează subprogramul SIM care împarte mulțimea în clase de echivalență și tipărește vectorul MN; 
- programul 32 de la paginile 181 - 183 se referă la problema găsirii claselor de echivalență în care este împărțită mulțimea A; în programul principal se citesc elementele vectorului I; se apelează subprogramul CLASA și se tipăresc vectorii I și J; subprogramul CASA urmărește cu fidelitate pașii algoritmului descris la prezentarea soluției problemei;
- programul 33 de la paginile 184 - 190 se referă la problema alcătuirii și tipăririi tabelelor de adunare, înmulțire și a inverselor din corpul Z7; se construiesc subprogramele PLUS, PR, INV pentru obținerea celor trei tabele după explicațiile date în explicarea soluției; deși programul este restrictiv, autorii s-au gândit să folosească pentru tipărirea rezultatelor un format flexibil; este definită variabila X, inițializată cu formatul A1; subprogramele preiau variabila X și o tipăresc de NN ori cu descriptorul de format A1, de 120 de ori; sunt convenții definite de autori, pentru a avea tabele cât mai bine reprezentate pentru cine vrea să urmărească rezultatele tipărite;
- programul 34 de la paginile 190 - 193  se referă la problema rezolvării unei ecuații polinomiale cu coeficienți în corpul Zp al claselor de resturi modulo p, unde p este un număr prim; pentru a calcula valoarea polinomului într-un punct de folosește schema lui HORNER; vectorul A definit în programul principal arată că polinoamele au cel mult gradul 100; schema logică urmează descrierii algoritmului; programul tipărește coeficienții polinomului; îmi amintesc că erau pe vremuri programe FORTRAN care permiteau screrea polinoamelor cu puteri ca în cărți, cu imprimarea polinomului pe două rânduri; nu era deloc ușor să se potrivească exponentul lui X, exponent tipărit pe rândul precedent;
- programul 35 de la paginile  194 - 198 se referă la problema găsirii tuturor poligoanelor regulate care pot fi construite cu rigla și compasul; este prezentat algoritmul; sunt scrise subprogramele PRIM() și ADUN(); programul principal inițializează variabilele N1 și N cu valori de pe cartelă; subrpgramul PRIM() stabilește dacă N este sau nu număr prim; la pagina 194 este prezentată subrutina ADUN; programul principalm tipărește NR care arată numărul de poligoane cu numărul de laturi cuprinse între N1 și N ce se pot construi cu rigla și compasul;
- programul 36 de la paginile  198 - 202 se referă la problema descompunerii în factori reductibili a unui element din inelul Z[ i]; mi-a plăcut foarte mult prezentarea clară, riguroasă a algoritmului, care se regăsește în schemele logice de la figura 36.1; programul conține o instrucțiune de citire a valorilor ce definesc un element din inelul Z[ i]; secvențele programului principal implementează pașii algoritmului explicat și tipăresc fie un divizor, fie constatarea că vorbim de un număr prim;
- programul 37 de la paginile 2202 - 206 se referă la problema aflării celui mai mare divizor comun a două elemente din inelul Z[ i]; este prezentată partea teoretică a algoritmului lui EUCLID; programul principal citește A, B, C, D pentru a defini două elemente din Z[ i] și apelează în mod repetat subprogramul DIV, după care afișează cel mai mare divizor comun când variabilele L și K sunt nule în același timp;
- programul 38 de la paginile 206 - 210 se referă la o problemă de verificare a unei structuri de tip inel; aplicațiile din punct de vedere matematic sunt clare și pe înțeles; eu analizez programul care este construit pentru o clasă particulară de probleme, din moment ce nu există instrucțiuni READ(); 
- programul 39 de la paginile 210 - 215  se referă la problema găsirii elementelor ireductibile mai mici decât o valoare dată dintr-o mulțime; sunt prezentate elementele teoretice; se construiește matricea TAB ale cărei elemente sunt memorate în variabila NR; matricea TAB are 110 linii și două coloane; programul implementează algoritmul descris de autori; programul nu are nicio instrucțiune READ, deci este construit doar pentru a rezolva o singură problemă; unele lucruri pot deveni parametri și în viitor este posibilă, zic eu, creșterea flexibilității programului;
- programul 40 de la paginile  215 - 221 se referă la problema verificării dacă o anumită mulțime definită este corp și să se găsească elementele acestui corp; sunt prezentate considerații de ordin matematic; sunt descrise funcțiile INA și IRED; programul principal este o structură rigidă, așa cum cere enunțul problemei; nu are instrucțiuni READ(); prelucrările implementează cerințele din explicații și tipărește șirul de valori ale corpului; mi-ar fi plăcut dacă folosind un test ar fi fost eliminate Aparițiile semnelor +- consecutive la anumite elemente;
- programul 41 de la paginile  221 - 226 se referă la problema verificării dacă automorfismele interioare ale unui grup sunt într-adevăr automorfisme; se definește conceptul; se reamintește definiția conceptului de permutare; exemplificarea se face pe grupul permutărilor de grad 4, generalizarea nefiind deloc o problemă pentru modificarea programului; subprogramul PROD calculează produsul a două permutări; se calculează un. produs de permutări cu subprogramul INT; se fac o serie de teste și în final mesajul tipărit de programul principal este că vorbim de un automorfism; programul principal tipărește și mesaje în cazul în care nu vorbim de un omomorfirsm sau de absența injecției;
- programul 42 de la paginile  227 - 231 se referă la problema lucrului cu două stive memorate într-un vector; problema este explicată frumos de către autori și pe înțeles; se clarifică ce operații sunt implementate pe stive; sunt prezentate subprogramele SSTIV1 și SSTIV; exemplul prezentat este edificator, cu cartelele pe care sunt prezentate datele celor două stive; sunt tratate distinct situațiile în care nu se efectuează operații de extragere de pe stive, testând indicatorul IND;
- programul 43 de la paginile 231 - 236  se referă la problema lucrului cu N stive într-un vector; este explicată regula FIFO, dar spusă altfel, ca în 1975; se consideră vectorul A(8000) în care sunt stocate stivele; programul principal apelează subprogramul    STIVS1() care implementează operații pe stive; este interesant că acest subprogram are un punct de intrare STIV(); să ne imaginăm N subșiruri stocate într-un același vector  în zone diferite și cu fiecare subșir se lucrează separat; problema se reduce la a gestiona primul, respectiv, ultimul element din subșir; se definesc vectori care gestionează vârfurile, respectiv, bazele celor N stive puse în vectorul A;
- programul 44 de la paginile  236 - 241se referă la problema găsirea unei linii euleriene într-un graf; se definește conceptul de grad local; se pune problema găsirii unui drum ciclic; este descris algoritmul și programul FORTRAN operează pe matricea A(15,15) inițializată prin citire a datelor de pe cartele; un rol important în are subprogramul de tip FUNCTION I() care stabilește dacă toate gradele locale sunt pare; figura 44.2 ete edificatoare în raport cu explicațiile date;
- programul 45 de la paginile  242 - 245 se referă la problema memorării unui arbore binar, știut fiind faptul că arborele binar este o structură dinamică, în care fiecare nod este caracterizat prin:
informație utilă - vectorul INF,
nod părinte - vectorul PROV,
nod descendent stâng - vectorul S,
nod descendent drept - vectorul D; 
suntem în anul 1975, anul publicării cărții și ideea de arbore binar, de traversare și de operații în arbori binari este tratată cu vectori, în niciun caz cu structuri de date autoreferite și de aceea programul de la pagina 245 este un program construit cu limitările limbajului FORTRAN;
- programul 46 de la paginile 246 - 258 se referă la problema de optimizare a transporturilor și la scrierea programului FORTRAN care să ofere soluția optimă de transport; când am citit acum peste 50 de ani cartea lui GEORGESCU și BÂSCĂ, am căutat să văd cât de mult diferea programul scris de mine când eram student și profesorul meu Constantin DINESCU de Cercetări operaționale mi-a prezentat problema de transport și eu am scris un program s-o rezolv; erau diferențe mari, legate de faptul că eu am scris un singur subprogram; notațiile erau cam aceleași la vectorul costurilor pe care și eu tot cu C îl notasem, la matricea cu soluția de start pe care tot cu A o notasem, la vectorul disponibilului notat tot cu D și la vectorului de necesar de transport tot cu B îl notasem, căci așa mi se prezentaseră notațiile la curs; revăzând acum peste ani textul sursă oferit de autori în 1975 am avut o nostalgie, dar și puterea de a accepta că subprogramele MULT, SOLB, SCBAZ, ELMIN, VAL, urmăresc într-un mod concentrat și distinct pașii algoritmului pentru optimizarea problemei de transport; toate subprogramele se încheie cu instrucțiunile RETURN și END; programul principal inițializează cu același FORMAT vectorii B, D și matricea C și este operațional și pentru situația în care cererea este egală cu disponibilul, dar și în cazurile în care trebuie să se producă echilibrare, pe care autorii programului o rezolvă adăugând linii sau coloane pe care le inițializează așa cum cere teoria; instrucțiunea C(M,J)=20000. este un artificiu, căci simulează infinitul, ca să fie descurajate transporturile spre acele destinații ale consumatorilor fitctivi; așa cum este construit programul este o excelentă bază de pornire pentru cei care ar dori să lucreze cu probleme de transport de foarte mari dimensiuni, în care apar matrice rare; tot GEORGESCU și BÂSCĂ au mugurii unor soluții, căci  programul 8 se referă la anumite operații cu matrice rare.
REZULTATELE EXERCIȚIILOR este un capitol foarte important al cărții. Se știe că un programator când primește o problemă de rezolvat, o analizează, își pune multe întrebări, căci vrea ca programul pe care-l scrie să nu fie un program oarecare, ci un program bun, care să includă și acele elemente pe care el le intuiește ca modificări în viitor. Se știe, de asemenea, că pentru o ecuație de gradul n sunt n soluții, fără a se porni cu ideea fixă că la construirea ecuației a fost folosită vreuna dintre soluții. De aceea și în programare problemele se pun tot așa, căci programatorul trebuie să analizeze variante, să definească criterii de eficiență și să aleagă soluția care i se pare cea mai avantajoasă. Acest capitol este esențial pentru dezvoltarea calităților unui programator, căci variantele sunt discutate și i se crează în acest fel programatorului capacitatea de analiză și de adaptare la noi probleme, dar și de a folosi tot ceea ce a acumulat anterior.
Am insistat asupra fiecărei probleme căci lucrarea mi se pare o carte fundamentală și ca orice lucrare specială, merită atenție și analiză de detaliu. Sunt opere literare despre care se scriu biblioteci întregi, fără ca subiectul să fie epuizat; și în acest caz, lucrurile stau tot așa, căci fiecare program scris de GEORGESCU și BÂSCĂ  este o mică bijuterie în felul lui, autorii dând dovadă de multă aplecare spre a scrie texte sursă de calitate; stilul lor de programare este inconfundabil pentru că știu să conserve ceea ce este bun de la program la program și textele lor sursă sunt clare precum un cristal de Sèvres. 


(02 septembrie 2026) 

Tuesday, September 1, 2026

Cartea lui Petre DIMO de Programare în FORTRAN ca sursă de inspirație

Lucram încă în Centrul de Calcul al ASE când am cumpărat cartea lui Petre DIMO și venind din programarea în ASSEMBLER, iar programele mele FORTRAN se inspirau din documentația extrem de bine pusă la punct de la IBM, îmi scriam subprogramele mele FORTRAN căci aveam ambiția de a avea cât mai multe subprograme care operau pe un șir de caractere.  Mă voi referi la cartea referită prin:

Petre DIMO - Programare în FORTRAN, Editura Didactică și Pedagogică, București, 1971, 298 pag.

ca sursă de inspirație, căci la un moment dat am dorit să extind crearea de subprograme la operații pe masive bidimensionale, folosindu-mă cât mai mult de modul în care se făcea alocarea de memorie. Știam că în FORTRAN, compilatoarele dispuneau elementelor din  matrici coloană după coloană, Adică, dacă aveam o matrice A cu m linii și n coloane, dispunerea se realiza astfel:

- elementul A(1,1) era dispus la adresa relativă de memorie X,

- elementul A(1,2) era dispus la adresa relativă de memorie X+4,

- elementul A(1,3) era dispus la adresa relativă de memorie X+2*4,

- elementul A(1,m) era dispus la adresa relativă de memorie X+(m-1)*4,

- elementul A(2,1) era dispus la adresa relativă de memorie X+m*4,

- elementul A(m,n) era dispus la adresa relativă de memorie X+(m*n-1)*4.

Mi-a venit ideea de a mă folosi pentru anumite subprograme care lucrau pe matrici de subprogramele pe care le aveam deja. Având la dispoziție cartea lui Petre DIMO, îmi aduc aminte ca și acum, am căutat să văd dacă în poginile ei se află ceva despre dispunerea coloană după coloană a elementelor matricei în FORTRAN și la pagina 57 am găsit ce căutam. Cum mie îmi place să sriu programe având o documentație în față și aveam cartea lui DIMO, am verificat ce și cum cu instrucțiunea EQUIVALENCE și era exact ceea ce mai știam eu de la documentațiile IBM, cu exemple sugestive, deci am prins curaj.

Aveam subrogramele:

        SUBROUTINE MINIM(X,N,MIN)

        DIMENSION X(100)

        MIN=X(1)

        DO 10 I=2,N

        IF(X(I).LT.MIN) MIN=X(I)

10    CONTINUE

        RETURN


        SUBROUTINE MAXIM(X,N,MAX)

        DIMENSION X(100)

        MAX=X(1)

        DO 10 I=2,N

        IF(X(I).GT.MIN) MAX=X(I)

10    CONTINUE

        RETURN


        SUBROUTINE SUMA(X,N,SUM)

        DIMENSION X(100)

        SUM=0.

        DO 10 I=1,N

        SUM=SUM+X(I)

10    CONTINUE

        RETURN


Dacă în programul apelator aveam o matrice definită fix cu:

        DIMENSION W(10,10)

ale cărei elemente se inițializau prin citirea de cartele a valorilor, atunci scriam în program:

    DIMENSUIB W(10,10), U(100)

    EQUIVALENCE (W(1,1),U(1))

după care urmau instrucțiunile de citire a cartelelor unde se aflau cele 100 de valori cu care se inițializau  elementele matricei, după care urmau instrucțiunile de apelare

CALL MINIM(U,100, UMIN)

CALL MAXIM(U,100, UMAX)

CALL SUMA(U,100, USUM)

și instrucțiunile de scriere pentru UMIN, UMAX, USUM.

Cumoscând formulele de punere în corespondență ale elementelor matricei cu elementele vectorului, la vremea aceea am construit și subprograme în care numărul de  linii era m și numărul de coloane era n, cu m și n mai mici decât 50, căci m-am gândit că dacă scriu subprograme, să nu fie restrictive la un număr prea mic de linii și de coloane. Programatorii știu ce vorbesc câd spun că m și n erau mai mici decât 50, căci elementele inițializate ale matricei A prin EQUIVALENCE (A(1,1),B(1,1)) nu mai sunt consecutive tot timpul cu elementele vectorului B de 2500 componente.

Îmi aduc aminte că în subprogramele mele băgasem instrucțiuni de testare a valorilor lui m și n, complectasem lista de parametri cu m și n a subprogramelor și după multe teste, ajunsesem să fiu mulțumit de ceea ce făcusem, dar de fiecare dată când simțeam nevoia, deschideam cartea lui Petre DIMO.

Nu forțez lucrurile dacă spun că Petre DIMO a creat un curent în Programarea în limbajul FORTRAN cam la nivelul pe care l-a generat publicarea poemului LUCEAFĂRUL, atât prin calitatea cărții, cât și prin tirajul acesteia. Tirajul nu este făcut public de către  Editura Didactică și Pedagogică, dar cu siguranță, era un tiraj de peste 4000 exemplare.





(02 septembrie 2026)

Lucru cu șiruri de caractere în FORTRAN, după cartea lui Petre DIMO '

Deși se spunea că limbajul FORTRAN are multe constrângeri, lucrul cu șirurile de caractere este posibil, chiar dacă acest limbaj nu are tipul de date char așa cum are limbajul C++. Mă voi referi la cartea referită prin:
Petre DIMI - Programarew în FORTRAN, Editura Didactică și Pedagogică, București, 1971, 298 pag.
La pagina 87 este prezentat descriptorul de format H precedat de un număr întreg n care arată numărul de caractere care se vor imprima. Dacă avem instrucțiunea:
        WRITE(3,12)
12    FORMAT(10HXXXXXXXXXX)
execuția acestei secvențe conduce la imprimarea a 9 caractere:
XXXXXXXXX
Dacă pe o cartelă sunt perforate caracterele:
123456789AB
și scriem secvența:
        WRITE(3,12)
12    FORMAT(10HXXXXXXXXXX)
        READ(1,12)
        WRITE(3,12)
efectul este:
XXXXXXXXX
23456789
Șirurile de caractere nu sunt memorate pentru inițializarea de variabile și deci programatorul nu are posibilitatea să facă el ce vrea cu aceste caractere, din moment ce nu se inițializează variabile.
La pagina 95 este arătată modalitatea prin care programatorul tipărește șiruri de caractere (litere mari, cifre și alte caractere speciale) în secvența de instrucțiuni:
        WRITE(3,7)
  7    FORMAT( 'I', 'TABLOUL REZULTATELOR')
Va apre scris TABLOUL REZULTATELOR
Primul caracter din format are un rol explicat frumos de Petre DIMO în raport cu convențiile limbajului FORTRAN.
Inițializarea datelor cu valori alfanumerice este exemplificată la pagina 246 prin instrucțiunea:
        DATA(A(I),I=1,3)/1.22,1.3,1.4/1HA/
ceea ce duce la inițializările:
A(1)=1.1
A(2)=1.2
A(3)=1.3
X = A (caracterul alfabetic A)
La pagina 260, secvența:
    INTEGER BLANC
    DATA BLANC /1H /
atribuie caracterul spațiu variabilei BLANC.
Secvența:
        READ(1,11) CARTA,CARTB
11    FORMAT(2A4)
inițializează variabilele CARTA și CARTB cu câte 4 caractere alfanumerice perforate pe cartele.
Se deschide în acest fel drumul la a folosi modul de constituire a șirului de baiți consecutivi în masivele unidimensionale și inițializarea cu caracterele de definire ale unui format. Dacă se definește un masiv unidimensional D care se inițializaează folosind ceea ce are descrierea unei cartele FORMAT și se va scrie secvența:
        READ(1,10)(D(I), I=1,10)
10    FORMAT(10A4)
        READ(1,11)(X(I), I=1,N)
11    FORMAT(D)
se obține inițalizarea masivului unidimensional X cu date de format variabil de la problemă la problemă.
Limbajul FORTRAN, așa cum a fost prezentat de Petre DIMO în cartea lui, chiar rezolvă orice problemă ar avea un programator cu pretenții.




(01 septembrie 2026)


 

Programarea în FORTRAN de Petre DIMO, publicată în 1971

Anul acesta s-au împlinit 55 de ani de la publicarea cărții referite prin:
Petre DIMO - Programare în FORTRAN, Editura Didactică și Pedagogică, București, 1971, 298 pag
Este cartea care a contribuit la formarea a nenumărate generații de programatori și de aceea l-am inclus pe autorul ei, Petre DIMO în galeria marilor clasici ai literaturii române de informatică. Când a publicat această carte, Petre DIMO avea 31 de ani și era șef de lucrări deja de doi ani, în Catedra de Calculatoare.
Cartea asupra căreia îmi îndrept acum atenția, a reprezentat pentru mine un instrument deosevbit de important în activitatea mea de cadru didactic la Secția de Informatică Economică din cadrul Facultății de Calcul Economic și Cibernetică Economică din ASE, căci țineam seminarii la disciplina de Limbaje de programare, unde limbajul FORTRAN era de bază. Parcurgerea după atâția ani a cărții lui Petre DIMO îmi stârnește emoții puternice, căci pentru mine această carte a fost un excelent ghid, datorită calităților ei, calități care s-au păstrat nealterate de-a lungul deceniilor care s-au scurs.
Cartea are o bibliografie formată din 9 titluri, din care 7 titluri conțin cuvântul cheie FORTRAN, ceea ce este esențial pentru o carte de specialitate, cunoscând exigența tânărului ei autor. Dacă țin seama că la acea vreme, o carte era depusă în editură cu un an înainte și informația circula cu mare dificultate, faptul că bibliografia nu conține autori români, arată clar că literatura română dedicată limbajului FORTRAN era foarte săracă. În Centrul de Calcul al ASE se lucra numai cu documentație tehnică de la IBM, căci nu existau lucrări de programare în FORTRAN în limba română în vremea când eu eram analist imediat după terminarea facultății, în anul 1970. Nici la biblioteca de specialitate de la etajul 7 a Centrului de Calcul nu existau cărți de FORTRAN venite din străinătate. Erau documentații, erau teze de doctorat cu programe FORTRAN, erau reviste, dar cărți de programare în limbajul FORTRAN nu erau, cu atât mai puțin cărți scrise de autori români, chiar și litografiate sau notițe de curs care să fie în circulație.
Cartea are 8 capitole după cum urmează:
- capitolul 0 intitulat Introducere de la paginile 9 - 44, conține  elemente absolut indispensabile pentru a înțelege cum se lucrează la un calculator; să nu uităm că suntem în anul 1971, când calculatoarele electronice erau niște dulapuri destul de voluminoase, când se lucra cu cartele perforate, cu bandă perforată, când banda magnetică și discul magnetic erau un lux; , iar imprimanta avea dimensiuni respectabile și foile de imprimantă erau elementul cheie pentru programatorul care aștepta rezultatele programelor lui; la pagina 24 se vorbește de programare automată, când de fapt nici în anul 2026 nu se poate încă vorbi de programare automată, deși inteligenta artificială face ravagii în dezvoltarea de software; la paginile 25 - 38 sunt detaliate aspecte de bază legate de elaborarea de scheme logice; în opinia mea, Petre DIMO este un maestru în această chestiune, căci schemele sale logice din toată cartea sunt fluente, cu urmărirea algoritmului, iar redarea lor în programe FORTRAN este mai mult decât naturală;
- capitolul 1 intitulat Elementele limbajului FORTRAN de la paginile 45 - 67,  conține  prezentarea caracterelor utilizate, definirea de constante numerice și alfanumerice cu exemplificări, construirea de variabile pentru a face programele inteligibile, cu tipurile INTEGER, REAL, DOUBLE PRECISION, LOGICAL, COMPLEX; sunt descrise variabilele elementare, tablourile unidimensionale, tablourile bidimensionale; este prezentată foaia de programare după care se perforează cartelele, iar întrebările și problemele de la paginile 65 - 67 îl ajută pe programator să se verifice dacă a înțeles corect chestiunile tratate și dacă poate merge mai departe după ce se verifică cu răspunsurile furnizate de autor la paginile 271 - 272;
- capitolul 2 intitulat  Instrucțiunile generale de intrare/ieșire de la paginile 68 - 104,  conține  detalii de prezentare a instrucțiunilor READ, WRITE și FORMAT, esențiale în citirea datelor de pe cartele și, respectiv, pentru imprimarea de rezultate obținute după execuția instrucțiunilor de prelucrare din program;
sunt prezentați descriptorii de format I, F, T, E, H, X, L, C, caracterele de control ale imprimantei, adică tot ceea ce este necesar ca programatorul să-și organizeze datele pe cartelă așa cum vrea el și să obțină rezultatele la imprimantă, tot așa cum și le dorește el, nu altfel; sunt abordate detalii practice de programare, căci trebuie luate în considerare cerințele fiecărui programator și experiența autorului cărții i-a permis să identifice acele situații cu care programatorii se întâlnesc cel mai frecvent când își organizează datele pentru a fi perforate pe cartele, respectiv, pentru a fi imprimate; ceva mai departe se prezintă și ideea de utilizare a formatelor variabile, citite de la imprimantă sau definite ca variabile inițializate ca șiruri de caractere;
- capitolul 3 intitulat Instrucțiunile de atribuire de la paginile 105 - 133, conține  acele elemente care să-l familiarizeze proprogramator cu esența limbajului FORTRAN, limbaj destinat rezolvărilor de probpleme științifice, căci FORTRAN vine de la FORmula TRANslation, adică tocmai de la necesitatea screrii corecte a expresiilor de atribuire; autorul prezintă în tabelul 3.1 operatorii aritmetici după care descrie expresiile așa cum le știm noi de la matematică și alături scrie modul în care acestea sunt scrise în FORTRAN, căutând să mențină denumirile de variabile și ordinea de efectuare a calculelor; în tabelul 3.2 sunt date restricțiile impuse de limbaj pentru tipurile de operanzi din expresiile de atribuire; sunt date detalii legate de utilizarea tipurilor INTEGER, REAL, DOUBLE PRECISION și COMPLEX, căci utilizarea atentă a tipurilor de variabile și gestionarea conversiitor de date, duce la creșterea performanței unui program; exemplul 3.9 de la paginile 117 - 118 clarifică aceste restricții; tot în acest capitol sunt prezentați operatorii logici .NOT., .AND., .OR. și constantele logice .TRUE. și .FALSE. cu care se inițializează variabile de tip LOGICAL; acest subcapitol nu este simplu deloc, dar Autorul Petre DIMO are talentul de a prezenta problematica de la simplu spre complex și de a clarifica întreaga problematică, știut fiind faptul că în programele FORTRAN apar multe situații în care se lucrează cu operatori logici și expresiile nu sunt deloc simple; cine a sris programe de complexitate un pic mai ridicată decât media, știe cât de dificilă este gestionarea expresiilor în care apar operatori logici, mai ales când nu sunt construite reguli sigure de a nu greși; programatorul FORTRAN trebuie să știe să lucreze cu operatorii relaționali .EQ., .LE., .LT., .GE., .GT. și mai ales să știe precedențele în evaluarea expresiilor complexe;
- capitolul 4 intitulat  Instrucțiuni de salt de la paginile 134 - 155,   conține prezentarea instrucțiunilor GO TO și IF în formele acceptate de limbajul FORTRAN; se știe clar că omul are o gândire ușor încâlcită și nu degeaba se spune că mulți se scarpină la nas, ducând mâna pe la ceafă; exact acest lucru se întâmplă și cu programatorii care nu zăbovesc asupra  rezolvării problemelor lor și pun în program instrucțiunile cu lopata, ceea ce duce la apariția a numeroase instrucțiuni GO TO care fac  dintr-un program simplu, o construcție aproape imposibilă; este prezentat GO TO calculat și GO TO simplu, pe care-l intuim cu toții;  programul scris de la pagina 151 arată cum se ordonează folosirea de insrrucțiuni GO TO și lucrurile devin foarte ușor de urmărit atunci când etichetele instrucțiunilor se scriu în ordine crescătoare în program; Instrucțiunea IF aritmetic este deosebit de utilă în programe și scrierea etichetelor în ordine crescătoare la linii sursă, va facilita depanarea programului; scrierea instrucțiunii IF logic în programe, are menirea de a dirija prelucrările în funcție de rezultatele calculelor și de aceea, programtorul trebuie să-și construiască propriile-i reguli pentru expresiile logice, pentru a avea întotdeauna rezultate corecte și complete ale problemelor pentru care a scris programe, mai ales când vrea să gestioneze numărul de iterații, când lucrează cu matrice de mari dimensiuni; exemplul 4.2 de la paginile 146 - 148 conține  instrucțiuni pentru calculul lui PI după o formulă de aproximare și numărul de iterații este date de o valoare epsilon, iar  expresia logică ABS(D).LT.0.0001/4. inclusă în instrucțiunea IF logic permite întreruperea iterațiilor dacă s-a atins precizia, dorită; exemplele propuse de Petre DIMO în acest capitol arată care este direcția de urmat pentru a construi programe curate, ușor de depanat; 
- capitolul 5 intitulat  Instrucțiunea de ciclare de la paginile 156 - 178, face referire la instrucțiunea DO, care implementează structura repetitivă condiționată posterior; exemplul de însumare a elementelor cu poziție pară, respectiv, a elementelor cu poziție impară, dintr-un șir de la pagina 158 arată modul de agregare a secvențelor de instrucțiuni, pentru a obține programe eficiente; prima variantă tratează distinct calculul celor două sume în cicluri diferite, iar a doua variantă reunește prelucrarea folosind un singur ciclu DO; se știe că problemele care sunt soluționate în limbajul FOTRAN au complexitate ridicată, ceea ce presupun cicluri în cicluri sau cicluri imbricate și exemplul înmulțirii a două matrici folosind secvența:
        DO 20 I=1,M
        DO 20 J=1,N
        CIJ =0.
        DO 10 K=1,L
 10   CIJ =CIJ +A(I,K) * B(K,J)
 20   C(I,J) = CIJ
are alte variante în cartea scrisă de Petre DIMO; este tratată și problema ieșirii, respectiv, revenirii în cicluri, vorbind de așa-zisele cicluri extinse; am apreciat cum este folosită instrucțiunea CONINUE, nu neapărat legată de un salt condiționat, ci și pentru frumusețea și cursivitatea secvențelor, căci delimitarea cu această instrucțiune a unui ciclu, lasă deschisă dinamica secvențelor, fără a interveni cu etichete inutile la instrucțiuni și fără a impune multe intervenții pe instrucțiuni diferite dacă trebuie făcute completări ulterioare în secvențele repetitive; exemplele 5.1 și 5.2 vin să arate eleganța obținută în secvențele de program în care apare instrucțiunea CONTINUE și apar și instrucțiuni IF aritmetic;
- capitolul 6 intitulat  Subprograme de la paginile 179 - 236,  conține  acele elemente specifice realizării de subprograme de tip FUNCTION, respectiv, subprograme de tip SUBROUTINE, cu precizări legate de listele de parametri reali din programul apelator și listele de parametri formali din subprograme; sunt prezentate subprogramele standard în tabelul 3.3 de la paginile 114 - 116 cu multe exemplificări de utilizare: exemplificarea subrpgramelor de tip FUNCTION este dată cu adunarea elementelor unui șir, subprogram scris în două variante (pagina 185) și cu funcția pentru calculul factorialului unui număr: pentru prezentarea subprogramelor de tip SUBROUTINE, autorul exemplifică produsul a două matrici, cu fix 10 linii și 10 coloane, ceea ce este un subprogram destul de rigid, din moment ce mulți autori de cărți de FORTRAN din aceeași perioadă au în lista de parametri matricele A, B, C și dimensiunile matricelor M, N, L, unde Ași B sunt matricile care trebuie înmulțite, C este matricea produs, M este numărul de linii al matricei A, N este numărul de coloane al matricei A și numărl de linii al matricei B, iar L este numărul de coloane al matricei B; tot aici sunt prezentate subprogramele SLITE, SLITET, OVERFL, foarte importante pentru a asigura fluența execuției unui program ceva mai complex; pentru a dezvolta programe în care se gestionează listele de parametri, sunt descrise instrucțiunile COMMON și EQUIVALENCE; exemplul 6.3 care generează subprogramele de calcul ale rădăcineilor ecuației de gradul al II-lea, respectiv, tipărirea acestor rădăcini, arată cu claritate de înseamnă să faci o construcție care ia în calcul toate variantele de lucru; exemplul 6.4 dedicat rezolvării unui sistem de ecuații liniare prin metoda eliminării lui GAUSS îi prilejuiește autorului realizarea unei descompuneri care să dezvolte subprograme a căror reutilizare vine mănușe pe conceptul de subprogram, ca element de economisire a efortului de programare, pentru secvențe repetitive din program; subrutinele INTERV și COEF sunt construite în acest scop;
- capitolul 7 intitulat Alte facilități de I/E. Utilizarea memoriilor auxiliare de la paginile 237 - 248, conține elemente de finețe în programare, căci instrucțiunile PAUSE, STOPPRINT, PUNCH, sunt utilizate numai și numai de programatorii care au atins un nivel cu mult peste media complexității programelor lor, în care utilizarea de fișiere pe bandă magnetică sau pe disc magnetic este absolut indispensabilă și operatorul din sala calculatorului trebuie să execute operații specifice, pentru a asigura rularea în bune condiții a programului, cu resursele cerute; problemele de utilizare a formatelor variabile sunt prezentate la un nivel excelent de autor și este bine că chestiunile speciale sunt adunate în acest capitol, căci nu toți programatorii au nevoie de toate facilitățile limbajului FORTRAN pentru a soluționa probleme specifice anului 1971, când bazele de date nu existau, când formatele de fișiere erau la nivel incipient și DEFINE FILE era ceva parcă venit de pe o altă planetă. 
Cartea are 5 anexe și anume:
Anexa 1 intitulată Indicații asupra operării de la paginile 266 -267, arată unele aspecte ale depanării programelor, când programatorii au făcut greșeli de sintaxă; exemplificarea este definirea unei etichete de mai multe ori, dar greșelile sunt și de altă natură, precum lipsa unor paranteze, folosirea incorectă a semnelor de punctuație și câte și mai câte, căci orice programator este supus greșelilor.
Anexa 2 intitulată Soluții la probleme de la paginile 268 - 289, conține soluțiile date de autor la problemele de la fiecare final de capitol. Am apreciat foarte mult această abordare specifică un or culegeri de probleme de matematică, pentru că toți care vor să facă progrese într-un domeniu, trebuie să răspundă și unor teste, iar răspunsurile trebuie verificate cumva, pentru a nu rămâne cu problema de evaluare nerezolvată. 
Anexa 3 intitulată Exemple de programe de la paginile 290-293
Anexa 4 intitulată Ordinea instrucșiunilor în program de la pagina 294 arată ordinea în care sunt puse instrucțiunile într-un program, pentru a fi asigurate condițiile definirilor corecte și complete, căci entitățile trebuie să fie distincte și aici mă refer la programul apelator și la subprogramele de tip SUBROUTINE și cele de tip FUNCTION. Operanzii mai întâi se definesc folosind tipul, EXTERNAL, DIMENSION, COMMON,  și după aceea se utilizează. Trebuie mare atenție la folosirea lui DATA și EQUIVALENCE. Ele crează facilități, dar și generează pericole. Ultima instrucțiune din program este END.
Anexa 5 intitulată Cuvintele rezervate FORTRAN, este instrumentul extrem de utili oricărui programator. Un programator lucrează tot timpul cu o carte în mână și dacă are ezitări, deschide cartea și caută ceea ce are nevoie. De regulă, programatorul verifică dacă folosește corect o instrucțiune, definită cu un cuvânt cheie. Dacă el are undeva cuvintele cheie în ordinea alfabetică și paginile din carte unde este trata în detaliu respectivul cuvânt , totul este rezolvat căci el găsește repede ceea ce are nevoie. Așa erau documentațiile IBM și așa are și Petre DIMO, iar eu, m-am folosit de paginile 295 -297 de nenumărate ori pentru a-mi rezolva problemele, așa cum o făceam cu ghidurile IBM.
Între paginile 224 și 225 se află 4 foi de programare IBM, iae la paginile 272 și 273 se află două foi de programare IBM și cititorul are posibilitatea să vadă cum arată un text sursă FORTRAN care pleacă spre perforarea cartelelor, în vederea generării fluxului normal specific rulării unui program în vederea obținerii rezultatelor de la calculator.
Multe dintre exemplele incluse de autor în carte se referă la probleme inginerești; ele nu sunt un abstacol pentru ceilalți programatori, căci autorul explică problema, realizează scrierea de formule și după aceea, trecerea la scrierea programului este o chestiune de limbaj, nu de problemă inginerească.
Unele edituri au optat să reproducă texte sursă de pe listingurile obținute de la calculator. În cazul de față, toate textele sursă au fost culese în tipografie și numai exigența autorului a făcut ca erorile date de neconcordanțele dintre textele din maniuscris și cele culese în tipografie să meargă pe principiul zero erori, specific managementului calității din producție.
Se vede cu ochiul liber că Petre DIMO a avut surse de calitate de unde a învățat să programeze în FORTRAN căci textele sursă scrise de el ți incluse în carte sunt de foarte bună calitate și rezistă chiar și exigențelor din ziua de azi. Mă voi rezuma la textul sursă scris pe foaia de programare de la pagina 63.
Primele 4 rânduri sunt comentarii care anunță că:
- programul calculează produsul a două matrici,
- dimensiunile matricilor sunt de maximum 10 linii și 10 coloane,
- matricea X se înmulțește cu matricea Y și rezultă matricea Z,
- prima matrice are L linii și N coloane, a doua matrice are N linii și M coloane.
Există instrucțiune de citire pentru L, M, N.
Există instrucțiune pentru citire foarte concentrată a elementelor matricilor X și Y.
Există o secvență clasică de 5 instrucțiuni pentru calculul elementelor din matricea produs Z.
Există instrucțiunea WRITE și instrucțiunea FORMAT pentru tipărirea elementelor matricei Z.
Am utilizat cartea lui Petre DIMO la seminariile mele. Am recomandat cartea lui Petre DIMO studenților. Pentru mine, a fost un instrument de lucru, căci ori de câte ori aveam nevoie de o lămurire, deschideam această carte și mă lămuream imediat, căci Petre DIMO a reușit să concentreze în cele 298 de pagini ale cărții, esența practicii de programare în limbajul FORTRAN.


(31 august 2026)

Monday, August 24, 2026

Cartea Inițiere în FORTRAN de Stelian NICULESCU din anul 1972 (II)

Când cumpărăm o carte de programare a calculatoarelor, vrem ca din primele cinci minute să scriem programe, adică din primele fraze ale cărții să primim informațiile necesare scrierii acelui program care:
- citește trei numere,
- evaluează expresia E = A + B - C,
- tipărește rezultatul.
Acum în anul 2026 lucrurile stau destul de simplu pentru că:
- dispunem de laptopul nostru,
- nu avem restricții de utilizare software de bază,
- există Internetul de unde ne putem documenta,
- putem fi asistați de Inteligența Artificială.
În anul 1971 când Stelian NICULESCU a publicat lucrarea referită prin:
Stelian NICULESCU - Inițiere în FORTRAN, Editura Tehnică, București, 1972, 280 pag.
lucrurile nu stăteau deloc așa.
Atunci un calculator electronic IBM 360 sau FELIX C 256 se prezenta sub forma unor dulapuri destul de voluminoase, care erau amplasate într-o sală numită sala calculatorului, unde era destul de frig, pentru că funcționarea calculatorului electronic presupunea o temperatură scăzută, deoarece componentele sale electronice emanau căldură, ceea ce nu era benefic pentru funcționarea calculatorului. Față de situația de acum în care datele se introduc de la tastatura laptopului sau de pe un CD sau de pe un stick de memorie, atunci, exista o tastatură a consolei calculatorului unde operatorii introduceau mesaje scurte și informația de intrare a calculatorului se afla stocată pe cartele perforate. Existau și benzi magnetice și discuri magnetice, dar majoritatea covârșitoare a datelor de intrare erau stocate pe cartele perforate. Cine a făcut programare în anul 1971 știe că:
- primea problema de rezolvat,
- identifica algoritmul de rezolvare,
- construia schema logică,
- scria textul sursă pe foi de programare,
- mergea cu foile la sala de perforare a cartelelor,
- prelua cartelele perforate,
- pregătea jobul pentru rulare,
- mergea cu cartelele la dispeceratul calculatorului,
- lăsa cartelele pentru rulare,
- cartelele erau rulate și se obținea pagini de la imprimantă,
- cartelele și paginile erau preluate de la dispecerat,
- conținutul imprimantei era analizat,
- dacă rezultatele erau complete și corecte procesul se încheia,
- dacă erau erori, programatorul trebuia să le remedieze,
- procesul se relua de la scrierea pe foi de programare a corecțiilor.
Toate acestea explică de ce primul text sursă tipărit în carte se află la pagina 93. Cititorul trebuia familiarizat cu multe concepte prelucrării de date folosind calculatorul electronic. De la problema de rezolvat, până la obținerea de rezultate de la calculator, drumul este lung și plin de tot felul de convenții, pe vare viitorul programator FOTRAN trebuie:
- să le învețe,
- să le accepte,
- să le respecte.
Am admirat la autorul cărții Stelian NICULESCU, atenția la detalii, căci a desena o cartelă perforată cu conținut și a comenta legătura dintre liniile sursă ale programului și conținutul cartelei, aparține unei arte pe care nu mulți o stăpânesc așa cum o stăpânește Stelian NICULESCU, pentru a asigura claritatea și coerența expunerii. Primul desen al unei cartele perforate apare la pagina 46.
Eu am admirat întodeauna pe acei aurori de cărți care au capacitatea de a prezenta lucrurile în așa fel încât cititorul să preia cele scrise, să obțină rezultatele anunțate, ca după aceea, acesta să treacă să rezolve cu mici modificări în programe, propriile-i probleme. Nu mi-au plăcut autorii de cărți care prezintă fragmente de texte sursă și-l lasă pe nefericitul de cititor să le asambleze, acesta depunând eforturi inutile, mai ales atunci când nu va obține niciodată rezultatele dorite, căci prezentarea în carte este incompletă, ambiguă și chiar are strecurate erori bazate pe ipoteze pecuniare.
În 1971, Stelian NICULESCU a impus un stil de programare în FORTRAN, căci el a definit pentru problemele propuse, texte sursă bine gândite, care la acea dată reprezentau un punct foarte înalt în programare și acest start a influențat ani în șir munca programatorilor, orientată spre standarde înalte.
Urmărind acel mod de lucru și nenumăratele faze intermediare până se ajungea ca un program să fie rulat pe calculator, programatorul din vremurile de demult folosea creionul și hârtia cu mare intensitate, căci el nu-și permitea să facă acele erori care acum ni se par normale, când ne așezăm în fața laptopului și ca niște pianiști care știm deja partitura, ne apucăm să scriem un program în C++ sau în PYTHON, căci avem azi cu totul alte resurse decât programatorii anului 1971. În ziua de azi s-au rafinat multe proceduri de a scrie programe și lucrul în echipă cu textele sursă puse în vitrină, au generat un anumit nivel de exigență legat de calitatea acestor texte sursă, încât azi, dacă se propune o aceeași problemă la 100 de programatori, probabilitatea de a se obține 100 de variante foarte diferite, a scăzut vertiginos și cauzele se regăsesc în exigența fiecărui programator din ziua de azi de a fi la un nivel cât mai sus, din moment ce nu mai are motive din care să se plângă în legătură cu calitatea textelor lui sursă, totul depinzând de el și numai de el.
Privind textele scrise de Stelian NICULESCU, căci parametrul PN al cartelei de control JOB conține numele lui, vedem că programatorul Stelian NICULESCU și-a făcut câteva reguli în a scrie programe și anume:
- la început primele linii ale textului sursă sunt comentarii,
- variabilele I, J și K sunt variabile de control cu care se gestionează numărul de cicluri,
- denumirile variabilelor păstrează aceleași semnificații,
- pentru inițializări de matrici se folosesc aceleași secvențe,
- între blocurile schemei logice și program există corespondență.
La 




(25 august 2026)

Sunday, August 23, 2026

Școala de Informatică de la Universitatea din București.

Școala de Informatică de la Universitatea din București include nume de referință ale domeniului și aici enumăr următoarele personalități:
Grigore MOISIL
Leon LIVOVSCHI
Solomon MARCUS
Dragoș VAIDA
Constantin P. POPOVICI
Octavian BÂSCĂ
Horia GEORGESCU
Virgil CĂZĂNESCU
Sergiu RUDEANU
Adrian ATANASIU
Nicolae ȚĂNDĂREANU
Alexandru MATEESCU
Gheorghe PĂUN
Marin POPA
Ioan TOMESCU - Data Structures, Editura Universitatii Bucuresti, Bucuresti, 2004, 206 pag, ISBN 973-575-866-0
Ileana POPESCU
Dorin PANAITE
Victorina PANAITE
Liliana POPESCU
Cristian CALUDE
Luminița STATE
Liviu SOFONEA
Ileana STREINU
Denis ENĂCHESCU
Tudor BĂLĂNESCU
Mircea ADAM
Gheorghe ȘTEFĂNESCU
Radu GRAMATOVICI
Marin VLADA.
Sunt mult mai mulți specialiști în informatică la Universitatea București, autori ai unor lucrări importante și de aceea, pe măsură ce vor fi analizate cărțile scrise de aceștia, lista se va îmbogăți cu siguranță, pentru că o istorie a literaturii române de informatică este cu atât mai reprezentativă, cu cât include numele și lucrările importante din domeniu.


(24 august 2026)

Saturday, August 22, 2026

Despre textele sursă din cartea Inițiere în FORTRAN de Stelian NICULESCU din anul 1972

Programarea înseamnă scrierea de texte sursă. Cartea referită prin:
Stelian NICULESCU - Inițiere în FORTRAN, Editura Tehnică, București, 1972, 280 pag.
conține 44 de texte sursă tipărite așa cum apar ele de la imprimanta calculatorului și aceste texte sursă trebuie analizate prin prisma obiectivului cărții, de a a-l învăța pe cititor să utilizeze facilitățile limbajului de programare FORTRAN în a-și rezolva problemele, desigur la nivelul anului 1972, nu acum.
În primul rând, remarc consecvența autorului cărții Stelian NICULESCU de a păstra notațiile din enunțul problemei în schema logică și mai apoi în textul sursă.
La pagina 132 se află textul sursă destinat implementării metodei de calcul al unei integrale folosind metoda trapezelor. Funcția f(x) este referită în programul FORTRAN ca F(A), F(B), F(A+X), căci programatorul a identificat mai multe subexpresii în formula de calcul a integralei folosind metoda trapezelor.
Sunt alese denumiri sugestive de variabile și de subprograme. Programul  de la pagina 144 care un factorial, utilizează un subprogram de tip FUNCTION numit FACT()
Dacă programatorul își dorește să-și construiască propria bibliotecă de subprograme, va face astfel de alegeri și-i va fi foarte ușor să identifice componentele bibliotecii atunci când dorește să le reutilizeze.
La paginile 150 și 151 se află textul sursă care exemplifică utilizarea lucrului cu matrici utilizate la definire folosind instrucțiunea DATA și, respectiv, prin citirea elementelor ale căror valori se află perforate cu un anumit format pe cartele. Programul apelează două subprograme de tip SUBROUTINE fără transmitere de parametri în listă, datorită faptului că acei parametri se află specificați în instrucțiunile COMMON scrise atât în programul apelator, cât și în subrutine. Autorul Stelian NICULESCU a ales pentru subprogramul de transpunere a unei matrice, numele TRANSPUS, iar pentru subprogramul de înmulțire a matricilor numele PRODUS.
Se știe că atunci când cineva vrea să scrie un program, o face pentru a rezolva toate problemele din clasa de probleme căreia aparține enunțul problemei pe care a preluat-o programatorul și de aceea, acesta caută să se asigure că atunci când va dori să mai rezolve și o altă problemă din aceeași clasă, nu va fi necesar să intervină pe textul sursă să facă oarece modificări. Autorul cărții, Stelian NICULESCU, a ținut seama de această cerință și în capitolul 11 intitulat APLICAȚII, a matricele de dimensiuni suficient de mari, încât să acopere cât mai multe dintre problemele care ar apărea de-a lungul timpului. În textul sursă al programului 11.1 se definesc matrici cu 50 de linii și 50 de coloane și vectori cu 50 de elemente, prin instrucțiunea:
DIMENSION A(50,50),B(50,50),X(50)
Și în cazul programului 11.7 se definesc matrici de dimensiuni mult mai mari, precum:
DIMENSION A(45,45),B(50,45),P(45,45),T945,45)
iar programatorul care va vrea să înmulțească două matrici și să tipărească matricea produs și transpusa acestui produs, nu va face altceva decât să folosească programul, dacă și numai dacă, matricile lui au numărul de linii și de coloane care să se încadreze în dimensiuniel matricelor definite în programul scris și testat cândva, căci presupunem că textul sursă 11.7 are un set de cartele perforate, o imprimantă și câteva detalii de pregătire a cartelelor cu propriile valori ale eleentelor matricelor A și B.
Când am citit textele sursă 5.9 de la pagina 124 și 5.11 de la pagina 126, mi-am adus aminte de seminariile mele de programare din studenție, când Ștefan MUSTĂȚEA, asistentul nostru ne-a prezentat problemele de alegere a elementului maxim dintr-un șir și de ordonare crescătoare e a elementelor unui șir pentru a scrie programe în COPCODER pe care să le rulăm pe calculatorul japonez NEAC 1240. Am studiat cu atenție textele scrise de autorul cărții, Stelian NICULESCU am regăsit aceleași idei în care inițializam o variabilă de lucru Y=X(1) după care o comparam cu celelalte elemente din șir și o modificam dacă Y era mai mică decât respectiva valoare a șirului.
În cazul ordonării elementelor unui șir, asistentul nostru ne-a prezentat mai multe variante, dar una dintre ele era eficientă, căci dacă șirul era deja ordonat, procesul de ordonare se oprea automat. Stelian NICULESCU definește o variabilă INDEX care contorizează inter-schimburile de elemente și procesul se încheie dacă și numai dacă după un proces de comparare nu mai apar interschimburi de elemente, ceea ce înseamnă că șirul este ordonat.
Programul de la capitolul 10 intitulat SEGMENTAREA PROGRAMELOR corespunde vremurilor de demult când erau restricții severe de memorie internă a unui calculator, iar dimensiunile operanzilor erau foarte, foarte mari. Atunci se segmentau programele, ceea ce însemna că exista un segment de bază, permanent în memorie cu operanzi necesari tuturor etapelor și segmente care se încărcau dinamic, executau prelucrări, după care lăsau loc altor segmente de program. Este ceea ce în viața de zi cu zi se întâmplă cu depozitările temporare a mărfurilor.
În programul 10.1 aturoul cărții Stelian NICULESCU a definit un segment principal unde a inițializat matricele A(45,45) și B(45,45) de mari dimensiuni, pe care le-a inițializat. Această parte de text sursă a plasat-o în segmentul numit S1. A construit o subrutină unde a adunat martricele A și B și a aflat elementul maxim al matricei rezultate din adunare. Acest fragment de text sursă l-a plasat într-un segment numit S2. El a mai construit un segment numit S3 în care a scris liniile sursă ale unei subrutine destinată scăderii dintre două matrice și aflării elementului minim din matricea rezultat.
Apelurile folosind instrucțiunea CALL realizează mai întâi încărcarea segmentului S1 și apoi executarea operațiilor procedurii AD(MAX). Celălalt apel determină încărcarea segmentului S3, apoi execuția operațiilor de prelucrare corespunzătoare ale subrutinei SC(MINI).
Autorul folosește în acest text sursă și ideea de procedură cu mai multe puncte de intrare ENTRY  SUBSC pentru a da un pic de culoare textului sursă, căci toată lumea știe că soluția era un pic alta dacă ENTRU e precedat de RETURN.
Chiar dacă este vorba de concepte ceva mai aride ale limbajului FORTRAN, autorul a găsit modalități clare de prezentare, fără a-l speria pe cititor că limbajul este greu, că este pândit la tot pasul de erori. Este foarte clar că prezentarea elementelor limbajului și exemplificarea fără a introduce eventuale erori pe care le-ar face programatorul, arată caracterul pozitiv al abordării. La paginile 47 și 48 cititorul este atenționat care sunt erorile pe care dacă le face, construcțiile sale nu mai sunt identificatori, căci ies în afara definiției
<identificator> ::= < literă > | <identificator> < literă > | <identificator> < cifră > 
Faptul că există textele sursă tipărite după listingurile obținute la imprimanta un calculator FELIX C 256, dovedește că toate programele au fost rulate și cititorul dacă va avea și el un set de cartele perforate identice, va obține la rulare exact programele existente în cartea lui Stelian NICULESCU.
Am scris undeva că recitind această carte, am remarcat prospețimea ei, deși limbajul FORTRAN este istorie, căci problemele enunțate, soluțiile propuse și secvențele de texte sursă sunt exact ceea ce trebuie unui programator. Cărțile despre alte limbaje de programare din zilele noastre au cam aceeași structură. Este adevărat că limbajele de azi folosesc pointeri, structuri de tip articol, obiecte, recursivitate, alocări dinamice de memorie și numeroase biblioteci de funcții, dar cu un mic efort de imaginație, toate ar putea fi alipite aici, adăugând noi capitole, dacă și numai dacă limbajul FORTRAN ar mai fi și el un pic șlefuit și ar fi aruncate peste bord restricțiile prea dure, puse în vremurile de demult pentru a avea pentru el un compilator cu fiabilitate cât mai ridicată.
Nu spun că trebuie să privim cu indulgență ceea ce era acum 54 de ani, dar trebuie să acceptăm ideea că fără progresele generat de produsele software scrise în limbajul FORTRAN multe dintre realizările de care beneficiem acum nu ar fi existat și mă refer la construcțiile ale căror calcule de rezistență s-au obținut prin rulări de programe FORTRAN, la navele gigantice care circulau pe oceane, a căror proiectare s-a făcut pe calculator cu programe FORTAN, ca să nu mai zic prea multe despre zborurile omului spre Lună, care au fost dirijate la NASA tot folosind programe scrise în FORTRAN.


(22 august 2026)