Cuprins volumul I
Teme de specialitate pentru concursuri in informatica si
grade didactice
CONŢINUTUL PROGRAMEI
1. Arhitectura generală a sistemelor de calcul
- prezentare globală………………………………………………………………1
- unitate centrală: componente, funcţii…………………………………………..3
- unitatea de memorie: structură şi funcţii………………………………………..5
- dispozitive periferice……………………………………………………………6
2. Sisteme de operare
- concepte de bază şi caracteristici ale sistemelor de operare (structură, funcţii,
elemente de interfaţă) …………………………………………………………..14
- tipuri de sisteme de operare…………………………………………………….16
- (*) utilizarea unui sistem de operare…………………………………………....19
3. Algoritmi
- noţiunea de algoritm şi caracteristici…………………………………………....23
- structuri fundamentale( secvenţa, decizia, repetiţia) ……………………………25
- reprezentarea algoritmilor…………………………………………………….…31
- algoritmi iterativi şi recursivi……………………………………………………41
- algoritmi elementari: probleme care operează asupra cifrelor unui număr,
divizibilitate, numere prime, algoritmul lui Euclid, şirul lui Fibonacci, calculul unor
sume cu termenul general dat, determinare minim/maxim, metode de ordonare
(metoda bulelor, inserţie, selecţie, numărare), interclasare, metode de căutare
(secvenţială, binară) ………………………………………………………………46
- analiza complexităţii unui algoritm (considerând criteriile de eficienţă duratã de
executare şi spaþiu de memorie utilizat) …………………………………………66
4. Limbaje de programare (Pascal sau C/C++)
- concepte generale (sintaxa unui limbaj de programare, medii de programare)
…………………………………………………………………………………….84
- (*) elementele de bază ale unui limbaj de programare (Pascal sau C, la alegere):
…………………………………………………………………………………….86
vocabularul limbajului, identificatori, constante, tipuri de dată, variabile, operatori,
structura programelor, comentarii, expresii, atribuire. Citirea/scrierea datelor.
Structuri de control (instrucţiunea compusă, structuri alternative şi repetitive)
…………………………………………………………………………………104
- (*) tipuri de date structurate…………………………………………………117
- (*) fişiere; operaţii specifice…………………………………………………131
- (*) subprograme definite de utilizator: proiectarea modulară a rezolvării unei
probleme; declarare, definire şi apel subprograme; mecanismul de transmitere a
informaţiilor prin parametri; variabile globale şi variabile locale, domeniu de
vizibilitate; …………………………………………………………………..140
recursivitate…………………………………………………………………..152
- concepte de bază ale programării orientată pe obiecte (principiile programării
orientată pe obiecte, încapsulare, moştenire, polimorfism, constructori şi destructori,
domeniul de vizibilitate a componentelor unui obiect) ………………………154
5. Metode de programare
- metoda Backtracking: prezentare generală, probleme de generare, oportunitatea
utilizării metodei backtracking; aplicaţii specifice…………………………….163
- metoda Divide et Impera. Descriere şi aplicabilitate. Exemple. Sortarea prin
1
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Recenzie,
Cartea este destinată concursurilor de titularizare si grade didactice din
invatamânt dar si elevilor sau studenţilor din perspectiva examenului de
bacalaureat sau olimpiadelor scolare.Salutăm acest prim volum ,care prin
completarea cu cel de al doilea constituie un suficient material pentru
concursurile scolare.
Referenti ştiintifici:
Prof.univ.dr Ion Vladimirescu Rector ,Universitatea din Craiova
Prof.univ.dr Octavian Dogaru,Universitatea din Timisoara
Prof.univ.dr Udrişte Constantin ,Universitatea PolitehnicaBucuresti
2
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
În prezent, calculatoarele reprezintă un instrument de lucru din ce în ce mai răspândit. Г de aplicaţii este
extrem de cuprinzătoare, calculatoarele fiind folosite în domenii ca: finanţe şi comerţ, rezervări hoteliere şi
aeriene, industrie, cercetare ştiinţifică, medicină, tehnică spaţială, jocuri, industria armamentului, educaţie,
sisteme de comunicaţie, tipografii. Incepând din anii 1950, industria sistemelor de calcul a cunoscut o dezvoltare
rapidă, aceasta accentuându-se în momentul creării circuitelor integrate care au făcut posibilă apariţia
calculatoarelor personale.
Pentru a înţelege mai bine modul de funcţionare şi câteva noţiuni elementare cu privire la calculator ,
unii autori au asemănat calculatoarele cu un ‘’sclav’’. Acest ‘’sclav’’ cunoaşte un limbaj şi poate executa o serie de
acţiuni simple. Dar el nu va executa nici o acţiune fără ca aceasta să-i fie ‘’ordonată’’de operatorul uman, prin
intermediul unor comenzi simple.
Aceste comenzi formează aşa-numitele instrucţiuni , iar totalitatea lor reprezintă setul de instrucţiuni
recunoscute de calculator. Pentru realizarea unei anumite sarcini, operatorul uman trebuie să ‘’programeze’’
sclavul, adică să-i ofere o listă de instrucţiuni, într-o ordine coerentă, care să ducă la îndeplinirea scopului urmărit.
Această succesiune logică şi coerentă de instucţiuni, care să ducă la rezolvarea unei probleme, formează, pentru
un calculator, un program.
Componentele fizice ale unui sistem de calcul pot fi grupate în unităţi cu funcţii complexe, numite
unităţi funcţionale.
MEMORIA
DISPOZITIVE INTERNĂ DISPOZITIVE
DE DE
INTRARE IEŞIRE
UNITATEA DE
COMANDĂ ŞI
CONTROL
UNITATEA
ARITMETICO-
LOGICĂ
3
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Dispozitive sau unităţi de intrare. Prin intermediul unităţii de intrare se introduc în calculator
informaţii -date (numere, caractere etc. ) sau instrucţiuni (programe). Exemple de astfel de unităţi:
tastatura;
mouse (şoarece);
scanner;
ş.a.
Prin aceste unităţi, operatorul uman îi “spune” (ordonă) unui calculator ce acţiune trebuie să execute şi,
de asemenea, îi transmite datele pe care sistemul trebuie să le prelucreze. Informaţia introdusă în
calculator ajunge în memoria internă.
Memoria internă.
Aceasta este o unitate folosită pentru înregistrarea şi păstrarea informaţiei (date, instucţiuni).
Din memorie, informaţia poate fi preluată de alte unităţi funcţionale din calculator. Datorită modului în
care este construită, memoria internă îşi pastrează conţinutul atâta timp cât calculatorul funcţionează.
În momentele în care calculatorul este oprit, memoria internă este ştearsă, adică îşi pierde conţinutul.
Pentru a elimina acest dezavantaj, se folosesc unităţi de memorie externă i, care nu-şi pierd conţinutul
atunci când sistemul de calcul este oprit. Exemple de suporturi de memorie externă:
discuri magnetice:
benzi magnetice;
CD-ROM-uri.
display (monitor)
imprimanta
plotter.
i
Putem considera că este impropriu spus “memorie externă” deoarece componentele menţionate (disk,
disketă, CD) constituie dispozitive de intrare-ieşire(de pe ele se pot introduce informaţii şi pe ele se pot
depune informaţii: prima operaţie este de intrare, iar cea de-a doua este de ieşire).
4
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Dispozitivele I/O sunt componente care din pdv functional, asigura sch de informatii intre
microprocessor si celelalte elemente din calculator. Se mai numesc si dispozitive periferice.
Dispozitivele periferice de intrare permit utilizatorului sa introduca date, comenzi si programe in
CPU. Cel mai cunoscut disp de intr este tastatura.
Dispozitivele de iesire permit utilizatorului sa vada rezultatele calculelor efect de catre calc sau al
manipularii datelor. Cel mai cunoscut disp de iesire este monitorul.
Unitatea centrala (CPU- central processing unit) - poate fi constituita dintr-un singur cip sau o serie
de cipuri care efectueaza calcule aritmetice si logice si in ac timp controleaza si operatiile altor elemente
din system.
Majoritatea cipurilor cu unitati centrale de prelucrare si a microprocesoarelor sunt compuse din 4
blocuri functionale:
- unit aritmetico-logica – furnizeaza abilitatea de calcul si permite efect operatiilor aritm si logice;
- register – zone de stocare temporara care mentin date, urmaresc instructiuni si pastreaza
locatii de memorie si rezultatele acestor operatii;
- bloc de control – are 3 functii:
o planifica si regleaza operatiile intregului system de calcul;
o decodorul sau de instructii citeste forma datelor si o transforma intr-o activitate cum ar
fi adunarea sau compararea;
o unit de intreruperi indica ordinea in care CPU este utilizata de catre operatii
individuale, stabilind timpul CPU alocat pentru fiecare operatiune.
- magistrala interna – o retea de linii de comunicatii care conecteaza elementele interne ale
microprocesorului si de asemeni conduce la conectori externi care leaga procesul cu alte elem
ale sist de calcul. Cele 3 tipuri de magistrale sunt:
o magistrala de control
o magistrala de adrese
o magistrala de date
Componenta hardware a unui calculator este formată din echipamentele fizice în care se asigură
prelucrarea automată a informaţiei şi din echipamentele care asigură comunicarea între utilizator şi
calculator. Ea este formată din următoarele subansamble.
Memoria internă, în care se păstrează programele şi datele cu care se lucrează la un moment
dat;
Memoria externă, hard- discul în care se păstrează toate programele şi datele de care poate
avea nevoie calculatorul la un moment dat pentru prelucrare. Hard discul este un pachet de
discuri pe care se pot face înregistrări de date şi programe. El este montat în interiorul
calculatorului, şi are o memorie care în zilele noastre poate depăşi 9 Go. In general
calculatoarele au o singură unitate de hard-disc, care este folosită pentru păstrarea
permanentă a programelor, inclusiv a sistemului de operare şi a datelor.
5
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Memoria internă, în care se păstrează programele şi datele cu care se lucrează la un moment
dat;
Memoria externă, hard- discul în care se păstrează toate programele şi datele de care poate
avea nevoie calculatorul la un moment dat pentru prelucrare. Hard discul este un pachet de
discuri pe care se pot face înregistrări de date şi programe. El este montat în interiorul
calculatorului, şi are o memorie care în zilele noastre poate depăşi 9 Go. In general
calculatoarele au o singură unitate de hard-disc, care este folosită pentru păstrarea
permanentă a programelor, inclusiv a sistemului de operare şi a datelor.
Memoria interna are o viteza de stocare si regasire a informatiei mai mare decit memoria externa.
Memoria externa are o capacitate de stocare a informatiei mai mare decit memoria interna.
Memoria interna e folosita pentru programe si date care sunt utilizate frecvent dar ocupa un volum mai
mic de informatie, iar memoria externa e utilizata pentru programe si date care necesita un volum mare
de informatie si atunci cind sunt utilizate se transfera partial sau integral in memoria interna.
Se utilizeaza ca unitate de masura a capacitatii memoriei octetul (BYTE), care este un cuvint de 8biti
impreuna cu multiplii sai:
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
Interfaţa ocupă un loc aparte în arhitectura unui sistem de calcul. Ea poate fi definită ca o
componentă care asigură o conexiune între două elemente, astfel încât acestea să poată lucra împreună.
Componentele electronice care fac ca dispozitivele periferice de intrare-ieşire şi unităţile de memorie
externă să poată comunica cu procesorul sunt interfeţele hardware. Suportul fizic al comunicării îl
6
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Schema arhitecturală prezentată mai jos cuprinde cele mai uzuale tipuri de interfeţe.
Tastatura se poate conecta la calculator printr-un port dedicat, utilizând fie mufa de tip DIN,
fie mufa de tip PS/2. În variantele mai noi tastaturile se pot cupla şi prin intermediul porturilor
USB.
Prin intermediul interfeţei seriale se pot conecta o serie de dispozitive cum sunt mouse-ul,
modem-ul, imprimanta, etc. Cuplarea mouse-ului se face printr-un port dedicat PS/2 sau USB.
7
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
USB (Universal Serial Bus) este un port serial de mare viteză care suportă până la 127 de
periferice înlănţuite. La un astfel de port se pot cupla dispozitive precum scanner-ul, mouse-
ul, imprimanta, tastatura, unităţi CD-ROM.
Interfaţa MIDI. Acest tip de interfaţă este utilizat pentru cuplarea tastaturii MIDI sau a
joistick-ului. De obicei portul MIDI este parte componentă a plăcii de sunet.
Placa de sunet este o interfaţă care permite stocarea sunetelor în format digital şi redarea lor
prin intermediul boxelor. Cuplarea acestei interfeţe se face la magistrale ISA sau PCI.
Placa video este tipul de interfaţă specifică pentru diverse dispozitive video: monitor,
cameră video, etc. Există plăci video care se pot cupla la magistrale ISA, PCI sau AGP.
Prin intermediul interfeţei paralele se pot transfera simultan mai mulţi biţi prin fire paralele,
aceasta conducând la creşterea vitezei de transfer faţă de cea obţinută prin interfaţa serială.
Diverse dispozitive se pot conecta la interfaţa paralelă (imprimanta, scanner, CD-ROM, ZIP,
etc.).
Gestionarea unităţilor de memorie externă se face prin intermediul controller-elor de discuri.
Controller-ul de dischete constituie interfaţa pentru unitatea de dischetă. Pentru unităţile de
HARD-DISK şi CD-ROM există două tipuri de interfeţe mai uzuale: IDE (EIDE) şi SCSI.
Ca element ce se interpune între periferice şi procesor (de fapt între periferice şi chipset, acesta din
urmă fiind "poarta de acces" spre procesor), orice interfaţă dispune de două tipuri de conexiuni:
Elementele fizice prin care se realizează conexiunea cu perifericele sunt perechile de mufe şi
conectori.
Din punct de vedere fizic o parte dintre interfeţe sunt integrate pe placa de bază (interfaţa paralelă,
interfaţa serială, etc), altele se conectează prin intermediul sloturilor (placa video, placa sunet, placă
reţea, etc.). Acestea din urmă se pretează operaţiunii de "up-grade" (înlocuirea unei componente cu o
alta mai performantă). În continuare prezentăm date despre două interfeţe de mare interes: placa video
şi placa de sunet.
Placa video
8
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
-video-Bios-ul;
În imaginea de mai jos se pot identifica componentele unei placi video (care dispune
de TV, FM Tuner şi realizează şi captură video):
1. -
Coprocesorul
video
2.Memoria
video
3. - Video-
Bios-ul
4. -
Conectorul AGP
5. -
Conectorul de
extensie video
6. - Tuner
TV-FM
7. - Conectorul VGA cu 15 pini
8. - Video IN
9. - Audio IN
10. - Antene TV,FM
9
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
f = ( 1.33 x X ) x ( 1.05 x Y ) x R
unde : X este adresabilitatea de pixel pe orizontală;
Y este adresabilitatea de pixel pe verticală;
4.Rata de reîmprospătare pe orizontală
- este frecvenţa de baleiere pe orizontală.
5.Rata de reîmprospătare pe verticală
- este frecvenţa de cadre.
Placa de sunet
Placa de sunet este componenta de bază a sistemului audio al calculatorului.
Cele mai importante caracteristici ale sale sunt:
2. Capabilitate stereo
Plăcile de sunet (ca şi amplificatoarele audio analogice) pot fi mono sau stereo.
O placă stereo produce voci provenind de la două surse diferite. Calitatea audio,
bineânţeles, creşte!
3. Compresia de sunet
Plăcile de sunet moderne includ şi compresoare de sunet, care realizează compresia
din mers.
4. Conectorii
Mai toate plăcile de sunet au acelaşi tip de conectori. Conectarea diverselor elemente
ale lanţului audio se face ca în figură:
Dacă placa de sunet conţine şi un procesor de semnal, nu puteţi decât să vă bucuraţi!
Aceste procesoare realizează efecte de spaţialitate, comprimare în timp real, etc.
6. Interfaţa MIDI
10
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Cuplarea internă a interfeţelor şi unităţilor de memorie externă
Funcţie de standardul de magistrală pentru care a fost proiectată o interfaţă, se diferenţiază şi modul
fizic de conectare al acesteia la respectivul tip de magistrală.
Pentru conectarea unităţilor de memorie externă (cele noi având interfaţa integrată în unitate) se
utilizează conectorii, iar pentru placa de sunet, placa video, etc., se folosesc sloturile. Slotul este un
conector îngust (tip fantă) în care se introduce partea cu terminaţiile de contact electric ale unei cartele
(plăci) electronice.
Cei mai uzitaţi conectori şi sloturi sunt prezentaţi în pozele de mai jos:
11
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Mai trebuie amintit că odată cu creşterea nivelului de miniaturizare există tendinţa ca şi interfeţele
placă video şi placă de sunet să fie integrate constructiv pe placa de bază, fapt ce înlătură necesitatea
cuplării lor prin sloturi sau conectori. Totuşi, utilizatorul are posibilitatea să dezactiveze o astfel de
interfaţă ("on board") şi să-şi conecteze una externă , mai performantă.
Tastatura
Este un dispozitiv de intrare prin intermediul căruia utilizatorul poate să transmită comenzi
calculatorului şi să introducă datele. Comenzile se dau sub forma unui sir de caractere, fiecare caracter
este generat prin acţionarea uneia sau mai multe taste de calculator. Utilizând aceste date se pot
genera:
Codurile caracterelor: cifrele ( 0,1,…9), literele ( a,A,b,B,… z,Z), semnele speciale: ( $,%, @, !,?,
…), spaţiul ( bara de spaţiu Space);
Codurile comenzilor: retur de car (Carriage Return), salt la linie nouă (Line Feed sau
Enter), tasta pentru salt tabelar (Tab), etc.;
Floppy discul
Toate calculatoarele posedă o unitate de citire a discurilor flexibile (Floppy disc). Capacitatea
discurilor flexibile depinde de tipul discului şi densitatea de înregistrare, din acest punct de vedere sunt:
12
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Mouse–ul
Operaţia clic (click) prin care se acţionează scurt un buton al mouse-lui;
Operaţia dubluclic (double click), prin care se acţionează scurt, de două ori succesiv un
buton al mouse-lui;
Operaţia de tragere (drag), prin care se deplasează mouse-ul pe masa reală cu un buton
acţionat.
Compact discul
Discul compact (CD-ROM), este o memorie externă pe un suport optic special de pe care se pot
citi datele înregistrate în unitatea de citire compact disc. Inregistrarea datelor şi programelor pe CD-
ROM se face în fabrică cu o aparatură ce foloseşte laserul. Memoria unui CD-ROM este de ordinul a
sute de Mocteţi.
Scannerul
Scannerul este un dispozitiv de intrare prin care pot fi citite imaginile grafice (fotografii, desene
tipărite pe hârtie). Imaginea pe care o citeşte scannerul este o suprafaţă formată din puncte, fiecare
punct fiind definit printr-un cod de culoare, şi coordonatele sale.
Rezoluţia, care reprezintă numărul de puncte pe inci pătrat pe care le poate citi;
Numărul de culori, reprezintă setul de culori care pot fi codificate de scanner;
Viteza de scannare, reprezintă viteza cu care un scanner citeşte şi prelucrează o imagine de
mărime standard.
Monitorul
Este dispozitivul care permite vizualizarea rapidă a rezultatelor date de calculator. Caracteristicile
unui monitor sunt: claritatea imaginii, numărul de culori afişate, nivelul de radiaţii electromagnetice.
Calitatea este dată de rezoluţie care reprezintă numărul de pixeli ai ecranului, unde un pixel este un
punct de pe ecran. In tabelul de mai jos sunt prezentate principalele tipuri de monitoare:
13
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Imprimanta
Este dispozitivul care afişează informaţiile din calculator pe suport de hârtie. Principalele
caracteristici ale unei imprimante sunt viteza de tipărire (în pagini pe minut) şi rezoluţia.
2.Sisteme de operare
14
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Gestiunea operaţiilor de intrare/ieşire la nivel fizic şi logic. La nivel fizic sunt asigurate
operaţiile de intrare/ieşire cu echipamentele periferice prin care se realizează citirea/scrierea
datelor pe suportul de informaţie, acţionându-se direct asupra dispozitivului periferic. Sunt
asigurate operaţiile de intrare/ieşire cu echipamentele periferice la nivel logic. Prin aceste operaţii
se realizează organizarea, accesul, stocarea şi regăsirea datelor pe suportul de informaţie.
Unitatea logica de acces la echipamentele periferice este fişierul.
Gestiunea datelor (fişierelor) pe suportul de memorie externă. Programe ale sistemului
de operare asigura transferul de date cu echipamentele periferice şi realizează o interfaţă între
programele de aplicaţie şi sistemul de intrare–ieşire. Modulele de program care realizează
transferul de date exista o singură dată în sistem ca şi componente ale sistemului de operare, şi
nu în fiecare program de aplicaţie care utilizează transferuri cu un anumit echipament periferic.
Sesizarea evenimentelor deosebite care apar în timpul execuţiei şi tratarea acestor
evenimente. In timpul executării unor programe (de aplicaţie sau de sistem) pot să apară
evenimente deosebite ca de exemplu programul solicită: scrierea pe un disc flexibil iar acesta nu
este montat, scrierea la imprimantă iar aceasta nu este conectată sau nu a fost alimentată cu
hârtie, executarea unei operaţii aritmetice iar rezultatul depăşeşte capacitatea zonei de memorie
alocată, etc. Evenimentele sunt sesizate de circuitele de control ale dispozitivelor periferice şi
transmise unor componente a nucleului care tratează aceste evenimente. Pentru a rezolva
aparitia unor stări conflictuale între mai multe evenimente, acestea sunt grupate în clase cărora li
se atribuie priorităţi.
15
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Un sistem de operare e un program de control de tip master, stocat permanent in memorie, care
gestioneaza toate resursele fizice ale sistemului de calcul si interpreteaza acele comenzi ale
utilizatorului care cer diverse tipuri de servicii.
Nucleul unui S.O. este compus din programele de bază care asigură gestionarea şi
controlarea activităţilor echipamentelor şi programelor.
Elemente de interfaţă
Interfaţa unui S.O. este reprezentată de modalitatea de interacţiune a S.O. cu
utilizatorul. De obicei, interfaţa este reprezentată de un sistem de meniuri (interfaţă grafică)
prin care ne sunt puse la dispoziţie opţiuni de continuare a conversaţiei cu calculatorul.
Ultima funcţie a sistemului de operare menţionată mai sus este realizată de interfaţa sistemului
de operare.
Interfaţa realizată printr-un limbaj de comandă. In acest tip de interfaţă utilizatorul transmite
comenzile calculatorului sub forma unui sir de caractere care respectă o anumită sintaxă. Calculatorul
permite utilizatorului să introducă o comandă afişând pe primele poziţii ale liniei curente de pe ecran un
sir de caractere numit prompter. De regulă prompterul este compus din numele unităţii curente de disc,
urmat eventual de numele directorului curent şi terminându-se cu caracterul “>” (ex: C:\LUCRU>).
16
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
De la tastatură (keyboard) utilizatorul introduce comanda care este păstrată în memoria internă
numită “zona de editare a tastaturii”. Se acţionează tasta <Enter>, moment în care comanda este
transferată în zona de memorie internă unde se află programul numit interpretor de comenzi.
Interpretorul analizează comanda, dacă aceasta este corectă, solicită procesorului să o execute
utilizând resursele logice şi fizice, în final se afişează din nou prompterul.
In cazul în care comanda nu a fost corect editată, pe ecran se afişează mesajul “Bad command
or file name”.
In acest tip de interfaţă utilizatorul transmite comenzile calculatorului prin intermediul unui sistem de
meniuri şi opţiuni de meniu sau poate folosi combinaţia de taste care apare în dreapta numelui opţiunii
cunoscută şi sub numele de scurtătură (shortcut keys).
Acest tip de interfaţă presupune existenta unui interpretor de comenzi care să folosească un
sistem de meniuri sau interpretorul de comenzi să folosească un program care se suprapune peste
interpretorul de comenzi.
Pentru deschiderea meniurilor, declanşarea unei comenzi se realizează prin folosirea tastaturii
(tehnica barei selectoare-dreptunghi evidenţiat pe ecran cu altă culoare sau tehnica literei de
identificare-litera de identificare subliniată) sau mouse-ul.
Sistemele de operare monotasking permit execuţia unui singur program la un moment dat (de
exemplu MS-DOS).
Sistemele de operare multitasking permit execuţia mai multor programe în acelaşi timp (de
exemplu Windows 95, Windows 98).Partajarea procesorului se face printr-o componenta a nucleului
sistemului de operare numita planificatorul de procese. Planificatorul de procese rezolvă cererile
solicitate de programele active încărcate în memoria internă printr-un sistem de priorităţi, partajarea
timpului, etc.
17
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Interfaţa realizată printr-un limbaj de comandă. In acest tip de interfaţă utilizatorul transmite
comenzile calculatorului sub forma unui sir de caractere care respectă o anumită sintaxă. Calculatorul
permite utilizatorului să introducă o comandă afişând pe primele poziţii ale liniei curente de pe ecran un
sir de caractere numit prompter. De regulă prompterul este compus din numele unităţii curente de disc,
urmat eventual de numele directorului curent şi terminându-se cu caracterul “>” (ex: C:\LUCRU>).
De la tastatură (keyboard) utilizatorul introduce comanda care este păstrată în memoria internă
numită “zona de editare a tastaturii”. Se acţionează tasta <Enter>, moment în care comanda este
transferată în zona de memorie internă unde se află programul numit interpretor de comenzi.
Interpretorul analizează comanda, dacă aceasta este corectă, solicită procesorului să o execute
utilizând resursele logice şi fizice, în final se afişează din nou prompterul.
In cazul în care comanda nu a fost corect editată, pe ecran se afişează mesajul “Bad command
or file name”.
18
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Depanare rapida - Gasirea rapida ( in mod automat) a solutiilor la diverse probleme de depanare
a calc si eventual aplicarea acestora prin facilitatea windows
Interfaţa realizată printr-un sistem de meniuri. In acest tip de interfaţă utilizatorul transmite comenzile
calculatorului prin intermediul unui sistem de meniuri şi opţiuni de meniu sau poate folosi combinaţia
de taste care apare în dreapta numelui opţiunii cunoscută şi sub numele de scurtătură (shortcut
keys).
Acest tip de interfaţă presupune existenta unui interpretor de comenzi care să folosească un
sistem de meniuri sau interpretorul de comenzi să folosească un program care se suprapune peste
interpretorul de comenzi.
Pentru deschiderea meniurilor, declanşarea unei comenzi se realizează prin folosirea tastaturii
(tehnica barei selectoare-dreptunghi evidenţiat pe ecran cu altă culoare sau tehnica literei de
identificare-litera de identificare subliniată) sau mouse-ul.
Sisteme de operare cu interfaţa realizata grafic: Windows NT, Windows 95, Windows 98,
Windows 2000.
Windows 95 are o interfaţă grafică orientată pe ferestre, care permite utilizatorului lansarea
concomitent a mai multor aplicaţii, fiecare în fereastra ei, precum şi schimbul de informaţii între acestea.
Windows 2000 este ultima interfaţă lansată de Microsoft în 1999, de la care se aşteaptă o
compatibilizare a platformelor Windows şi performante superioare.
La începutul fiecărei sesiuni de lucru trebuie încărcat în memoria internă nucleul sistemului de
operare (conţine programele necesare gestionării resurselor calculatorului). Sistemul de operare se
livrează pe suport magnetic împreună cu calculatorul (disc sistem). Acest suport conţine un program de
19
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
dimensiuni mici numit încărcător, situat la început de suport, precum şi programele aferente nucleului
sistemului de operare.
In memoria tip ROM există un program numit preîncărcător utilizat pentru iniţializarea lucrului cu
calculatorul.
Performanta calculatorului:
- viteza de procesare (Mhz, Ghz);
- nr. de biti prelucrati simultan (64biti).
Posibilitatea indeplinirii mai multor functii simultan – se executa succesiv secvente din fiecare program
aflat in rulare a.i. intr-o per de timp aplicatiile functioneaza aparent simultan.
c:
20
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Se cere:
1. Să se copieze subdirectorul Dana pe o disketă.
2. Directorul curent fiind BP, să se copieze fişierul b.cpp conţinut de subdirectorul XIC, pe disketă într-
un subdirector ClsXIC. Să se vizualizeze rezultatul copierii.
Rezolvare.
Cazuri:
Dacă directorul curent este c: , comanda va fi:
Comanda cd .. trece în directorul părinte al subdirectorului Dana, deoarece putem copia din
directorul curent numai ceea ce conţine el (dacă nu mai specificăm calea până la el). Deoarece
discul curent este C: , în comanda a doua putem omite discul sursă, preczând doar ce se copiază
de pe el.
Cazuri:
Succesiunea de comenzi va fi:
a:
md ClsXIC
copy C:\BP\Users\ XIC\ b.cpp A:\ ClsXIC
dir /p
sau
a:
md ClsXIC
c:
copy BP\Users\ XIC\ b.cpp A: :\ ClsXIC
a:
dir /p
sau
a:
md ClsXIC
copy C:\bP\Users\ XIC\ b.cpp ClsXIC
dir /p
La formatarea discului sau dischetei se creează directorul rădăcină (Root Director). In acesta
sunt memorate: numele fiecărui fişier cu extensia sa, spaţiul ocupat de acesta pe disc în octeţi, data şi
ora la care a fost creat sau modificat.
21
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Arborele de directoare (tree) este o structură arborescentă de directoare creată în zona de Boot
a discului pornind de la directorul rădăcină.
Un director are un singur director de origine, numit director părinte (parent directory),
situat pe nivelul imediat ierarhic superior. Un director care are un director părinte se mai
numeşte subdirector. Astfel se poate obţine un arbore cu un director şi mai mulţi subdirectori.
Un director poate avea mai multe directoare copii (child directories). Aceste directoare sunt în
directa lui subordonare şi se găsesc pe nivelul imediat inferior
Un director poate conţine unul sau mai multe subdirectoare şi, eventual, unul sau
mai multe fişiere, ş.a.m.d. Organizarea informaţiilor în subdirectoare se poate observa în
figura următoare:
c:
În capitolul Editare de text, se va arăta că d ocumentele create în Word au un nume, un punct şi extensia
doc. Pe suportul magnetic informaţiile sunt de mai multe feluri, nu numai documente Word, iar aceste informaţii
memorate poartă denumirea de fişiere. Deci documentul Word este şi el un fişier.
22
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Exemplu:
a: \my documents\referate\ carol.doc
23
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
3. Algoritmi
3.1 Noţiunea de algoritm şi caracteristici
ALGORITMI. DESCRIEREA ALGORITMILOR
Algoritmi
Orice activitate umană se desfăşoară, în general, pa baza unor principii logice sau, altfel spus,
a unui algoritm bine definit. Deşi nu se conştientizează acest lucru, omul acţionează conform unor
algoritmi, care reprezintă expresia regulilor impuse de parcurgerea logică a etapelor necesare pentru a
ajunge de la o situaţie iniţială la un anumit rezultat.
Funcţionarea calculatoarelor se aseamănă în mare măsură cu activitatea umană. În cazul
acestora, este obligatorie conştientizarea faptului că întreaga activitate a echipamentului de calcul se
bazează pe respectarea unor algoritmi, algoritmi ce sunt elaboraţi de factorul uman dotat cu raţiune şi
capacitate de analiză. Calculatorul nu dispune de calităţile omului, ca atare, în procesul de rezolvare a
unei probleme cu ajutorul echipamentului electronic de calcul este obligatorie parcurgerea unei etape
importante, şi anume elaborarea algoritmului de calcul. Succesul rezolvării problemei depinde de
calitatea algoritmului întocmit de către utilizator şi aplicat de echipamentul de calcul prin intermediul unui
program.
Calculatoarele numerice prelucrează informaţiile prin executarea unor operaţii simple. Deşi operaţiile
sunt elementare, prin înlănţuirea unei mulţimi de operaţii se poate ajunge la prelucrări deosebit de
complexe. Combinarea operaţiilor nu se face la întâmplare, ea supunându-se unor reguli bine
precizate. Studiul acestor reguli are la bază noţiunea de algoritm. Noţiunea de algoritm este strâns
legată de noţiunea de calcul.
Intuitiv un algoritm de calcul este o mulţime finită de operaţiuni cunoscute care executate într-o
ordine bine stabilită, pornind de la un set de valori, numite date de intrare, conduc într-un timp finit la un
set de valori, numite date de ieşire.
Algoritmul reprezintă o mulţime de asemenea calcule. Altfel spus, prin algoritm se înţelege
metoda de rezolvare a unei probleme într-un număr finit de paşi. Metoda de rezolvare este în esenţă un
şir de operaţii precise, care dacă sunt îndeplinite conduc la rezultatul dorit într-un număr finit de paşi.
Se poate spune că un algoritm constituie un sistem de reguli care, aplicat la o clasă de
probleme de acelaşi tip, conduce de la o situaţie iniţială la un rezultat final prin intermediul unor operaţii
succesiv ordonate, unic determinate.
O informaţie iniţială pentru care un algoritm de calcul este aplicabil, se numeşte informaţie admisibilă.
Totalitatea informaţiilor de acest gen constituie domeniul algoritmului.
Cunoscând faptul că orice algoritm conţine un anumit număr de etape numite şi paşii
algoritmului, se poate afirma că regulile algoritmului f aplicate asupra informaţiei iniţiale, care aparţine
domeniului D, determină întotdeauna obţinerea informaţiei finale corespunzătoare. Ca urmare, un
algoritm poate fi definit ca o funcţie:
f = D F unde: D= domeniul algoritmului (informaţiile iniţiale);
F= soluţia finală (informaţiile finale).
În general, un algoritm se caracterizează prin:
unicitatea. regulile algoritmului determinând unicitatea ordinii în care au loc toate
transformările intermediare, dar şi obţinerea informaţiei finale, după care activitatea
algoritmului se opreşte.
finalitate. Orice pas al algoritmului trebuie să se termine după un număr finit de paşi, şi
anume atunci când este obţinut rezultatul final, nu cel intermediar. Această proprietate se
mai numeşte şi realizabilitate potenţială.
claritate (să fie definit). Fiecare pas al algoritmului trebuie să fie precis definit. Operaţiile
ce trebuie efectuate în cadrul fiecărui pas trebuie să fie specificate în mod riguros, precis,
astfel încât să nu apară ambiguităţi în interpretare lui de către cel care îl execută.
Totodată, trebuie riguros precizate toate etapele de calcul ce trebuie urmate pentru a
obţine soluţia finală;
eficacitate. Orice algoritm trebuie să fie eficace. Aceasta înseamnă că toate operaţiile
algoritmului să poată fi efectuate de un individ cu creion şi hârtie într-un interval de timp
finit.
24
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Descrierea algoritmilor.
Transcrierea algoritmului într-un limbaj de programare, în vederea rezolvării lui cu ajutorul
calculatorului numeric poartă numele de program. Programele transmise calculatorului, ca o
reprezentare fidelă a algoritmului de calcul sunt transcrise într-un limbaj “înţeles” de calculator, nu
conţine ambiguităţi şi specifică precis şi clar doar operaţiile pe care calculatorul le poate executa.
Scrierea unui algoritm poate fi făcută rareori direct într-un limbaj de programare. Ca atare
realizarea unui program comportă, uzual nişte etape intermediare.
În vederea întocmirii unui algoritm de calcul şi utilizării acestuia la calculator, este necesară
realizarea următoarelor activităţi:
definirea problemei;
formularea modelului matematic al problemei;
stabilirea algoritmului de rezolvare a problemei;
reprezentarea algoritmului;
scrierea programului corespunzător algoritmului, prin utilizarea unui limbaj de programare
adecvat;
transpunerea programului pe un suport tehnic de memorie;
testarea, depanarea şi execuţia programului;
întreţinerea programului.
Calitatea programelor şi succesul execuţiei acestora depinde de calitatea algoritmilor utilizaţi,
de respectarea caracteristicilor specifice pentru orice algoritm, cât şi de mărimile şi operaţiile utilizate în
descrierea algoritmilor.
Exemple
25
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
26
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
înmulţirea şi împărţirea;
adunarea şi scăderea.
operaţii de atribuire (x=(a+b)-c);
operaţii de decizie (relaţionali , , , , sau logici , , )
Succesiunea operaţiilor din cadrul unui algoritm poate fi pusă în evidenţă prin intermediul a trei tipuri de
structuri de bază, elementare:
- structura liniară (secvenţială) – presupune executarea necondiţionată a operaţiilor din
cadrul unui algoritm, în ordinea logică a derulării acestora;
START
CITESTE
i
EITES
SUBRUTINA X
TE
PRINT i
STOP
V=Vi
A
A
C
NU V=V+r
C
DA
A V>Vr
Exemplu:
27
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
START
Citeşte
n
p: = 1
i: = 1
p: = p * i
i: = i + 1
Diagrama arborescentă
Diagrama arborescentă constituie o altă modalitate de reprezentare grafică a algoritmilor. Ca şi
în cazul schemelor logice, există mai multe convenţii de reprezentare a operaţiilor în cadrul algoritmilor.
IN PSEUDOCOD AVEM:
a) Secvenţa – este o structură realizată prin scrierea succesivă (în secvenţă) a comenzilor
componente.
Exemplu: citeşte A,B
atribuie C A + B
scrie A , B , C
stop
Efectul execuţiei unei comenzi depinde de poziţia comenzii în cadrul secvenţei .
b) Decizia – este o structură care asigură alegerea pentru execuţie a unei secvenţe din două
alternative posibile.
Structura comenzii: dacă condiţie atunci
secvenţa1
altfel
secvenţa 2
[]
Începutul comenzii de decizie este marcat de cuvântul cheie “dacă” iar sfârşitul său de semnul []
Execuţia acestei comenzi comportă următoarele etape:
se evaluează “ condiţia”;
dacă rezultatul evaluării este adevărat (condiţie îndeplinită) se execută secvenţa 1;
în caz contrar se execută secvenţa 2.
28
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
După executarea secvenţei 1 sau a secvenţei 2 se trece la următoarea comandă (cea după
semnul [] )
Observaţie: În cazul în care secvenţa care urmează după cuvântul cheie “altfel” lipseşte, se utilizează
forma simplificată a deciziei:
dacă condiţie atunci
secvenţa1
[]
În cazul în care condiţia nu este îndeplinită se trece direct la comanda ce urmează deciziei
Exemplul:
dacă A > B atunci
scrie A
altfel
scrie B
[]
Efectul execuţiei exemplului de mai sus este următorul:dacă valoarea variabilei A este mai
mare decât a variabilei B se scrie valoarea lui A în caz contrar se scrie valoarea variabilei B şi nu
valoarea variabilei A.
Exemplul: Decsrierea în Pseudocod a algoritmului de aflare a celui mai mare element
din 3 valori reale desemnate prin variabilele a,b,c.Variabila “x” va conţine cel mai mare element din cele
3 valori.Algoritmul de rezolvare a unei probleme nu este unic.Ca atare se dau două descrieri
Pseudocod pentru rezolvarea acestei probleme.
a) varianta 1
citeşte a,b,c
dacă a>b atunci
atribuie x a
altfel
atribuie x b
[]
29
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
c2 : secvenţa 2
.
.
cn : secvenţa n
rest : secvenţa n+1
[]
Unde c1 , c2 , ... cn sunt etichete şi se folosesc pentru identificarea secvenţelor.Sfârşitul comenzii este
marcat de _[] iar liniile textului selecţiei sunt marcate prin etichetele c.
Modul de execuţie al comenzii de selecţie este următorul:
se evaluează expresia
se identifică eticheta ci ce are aceeaşi valoare cu expresia ( în urma evaluării expresiei)şi
este selectată secvenţa corespunzătoare.Dacă nici o etichetă nu are valoarea expresiei
atunci este selectată secvenţa n+1, corespunzătoare etichetei rest.
se execută secvenţa selecctată şi se sare la sfârşitul comenzii de selecţie adică după
semnul [].
Exemplu: Să se adune valoarea întreagă v la una din variabilele s 0,s1,s2 ,s3, după cum
restul împărţirii valorii v la 4 este 0,1,2 sau 3 .Descrierea în Pseudocod arată astfel:
citeşte v,s0,s1,s2,s3
alege v – int ( v/4)*4 dintre
0: atribuie s0 s0 + v
1: atribuie s1 s1 + v
2: atribuie s2 s2 + v
3: atribuie s3 s3 + v
[]
scrie s0,s1,s2,s3
stop
STRUCTURI REPETITIVE IN PSEUDOCOD
În acest caz , eticheta “rest” şisecvenţa respectivă lipseşte ,deoarece domeniul de valori ale expresiei
este mulţimea (0,1,2,3).
a) Ciclul cu test final – În rezolvarea unei probleme , nu de puţine ori apare situaţia executării
repetate a unei secvenţe de operaţii.O astfel de combinaţie , în care execuţia unui grup de
operaţii se repetă se numeşte ciclu sau iteraţie.Pentru reprezentarea ei se utilizează o comandă
de ciclare care specifică atâtoperaţiile care se repetă cât şi condiţia de repetare.
Forma generală a comenzii de ciclare cu test final este următoarea:
repetă
secvenţa
până condiţia
30
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
[]
Modul de execuţie al comenzii de ciclare este următorul:
1-se execută secvenţa
2-se evaluează condiţia şi dacă rezultatul este fals(condiţie neîndeplinită)se continuă cu etapa 1 , altfel
execuţia comenzii se termină şi se trece la comanda următoare.
Exemplu: Se dă algoritmul lui Euclid pentru afişarea celui mai mare divizor comun a
două numere întregi m,n(m>=n>0).
1. citeşte valorile lui m şi n
2. atribuie lui c valoarea lui n ( în variabila c se reţine cel mai mare divizor
comun )
3. atribuie lui r restul împărţirii întregi a lui m la n
4. dacă r diferit de 0 atunci treci la 7
5. scrie valoarea lui c
6. stop
7. atribuie lui m valoarea lui n
8. atribuie lui n valoarea lui r
9. treci la pasul 2
Se observă că operaţiile care se realizează calculul restului şiactualizarea valorilor c, m şi n se
repetă.
Folosind Descrierea în Pseudocod a algoritmului şi ciclul cu test final vom avea:
citeşte m,n
repetă
atribuie c n , r m-int(m/n)*n
atribuie mn , n r
până r=0
_[]
scrie c
stop
Condiţia de terminare a ciclului poate fi orice expresie logică.Secvenţa de operaţii din ciclu
alcătuieşte corpul ciclului .Ea poate conţine oriceoperaţii, inclusiv iteraţii.
b) Ciclul cu test iniţial – În cazul ciclurilor sau iteraţiilor condiţia de
ciclare poate apare şi la începutul secvenţei de ciclare
Forma generală este :
cât timp condiţia execută
secvenţa
[]
Condiţia poate fi orice expresie logică , iar secvenţa poate conţine orice comenzi , inclusiv
comenzi de ciclare.
Modul de execuţie al ciclului cu test iniţial :
1-se evaluează condiţia;dacă rezultatul este fals(condiţie neîndeplinită) execuţia se termină,iar dacă
rezultatul este adevărat se continuă secvenţa(etapa 2)
2-se execută secvenţa,după care se continuă cu 1.
În cazul în care rezultatul evaluării condiţiei este fals încă de la început,secvenţa nu se
execută niciodată spre deosebire de ciclul cu test final,când secvenţa se executa cel puţin o dată.
Scrierea algoritmului lui Euclid în Pseudocod folosind ciclul cu test iniţial ne conduce la:
citeşte m,n
atribuie c n , r m-int(m/n)*n
cât timp r <> 0 execută
atribuie m n , n r, c n
atribuie r m-int(m/n)*n
[]
31
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
scrie c
stop
c) Ciclul de contor, cu forma generală:
pentru contor = val iniţială, val.finală,pas execută
secvenţa
[]
unde prin contor se înţelege o variabilă cu valori întregi:”valoarea iniţială, finală şi pas” pot fi expresii
aritmetice cu valori întregi.
Execuţia ciclului cu contor se explicitează astfel:
1) variabilei contor i se atribuie valoarea iniţială;
2) se verifică condiţia contor > val. Finală; dacă rezultatul este fals se continuă cu, astfel
execuţia ciclului se termină;
3) se execută secvenţa
4) se modifică valoarea contorului cu pasul p şi se continuă cu pasul 2)
Exemplu: aflarea lui n!
Observaţii: 1. Dacă pasul de ciclare este 1, se poate omite
2. Algoritmul a fost completat şi pentru cazul în care n = 0
citeşte n
atribuie p = 1
dacă n>0 atunci
pentru i=1,n execută
atribuie p=p*i
[]
[]
scrie p
stop
32
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Scheme logice
Schemele logice reprezintă scrierea algoritmilor de calcul cu ajutorul unor simboluri (forme)
geometrice, care evidenţiază diferite tipuri de acţiuni.
Realizarea schemei logice corespunzătoare unui algoritm este utilă fie la depanarea
programelor, fie la lucrul în echipă, fie la schimbul de informaţii dintre diverse grupuri de
programatori,întrucât ea specifică precis şi clar ordinea de parcurgere a blocurilor (simbolurilor
geometrice).
Simbolurile uzuale utilizate în realizarea schemelor sunt cuprinse în tabelul de mai jos:
33
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Succesiunea operaţiilor din cadrul unui algoritm poate fi pusă în evidenţă prin intermediul a trei
tipuri de structuri de bază, elementare:
- structura liniară (secvenţială) – presupune executarea necondiţionată a operaţiilor din
cadrul unui algoritm, în ordinea logică a derulării acestora;
START
CITESTE
i
EITES
SUBRUTINA X
TE
PRINT i
STOP
START START
I
I
CITESTE CITESTEi
I
i DA NU DA I
A2
EITEST EITEST I
E E
A1 A3
PRINT i PRINT i
STOP STOP ii
CASE - OF I
IF - THEEN
- STRUCTURA REPETITIVĂ (CICLICĂ) se bazează pe repetarea unei secvenţe din
algoritm, care poate să cuprindă una sau mai multe operaţii. Există următoarele tipuri de
operaţii repetitive:
- WHILE – DO presupune executarea unei anumite secvenţe din algoritm atâta timp cât
este îndeplinită condiţia C. Deoarece structura este condiţionată anterior, există
posibilitatea ca secvenţa respectivă să nu se execute niciodată.
- DO – UNTIL , condiţionare posterioară, secvenţa din program se execută cel puţin o dată,
întrucât decizia de reluare a secvenţei se ia după executarea acesteia.
- DO – FOR se execută atunci când se cunoaşte de câte ori trebuie repetată o anumită
secvenţă. Ea se caracterizează prin apariţia unei variabile numită contor, care evidenţiază
numărul de repetări a secvenţei.
34
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
V=Vi
A
A
C
NU V=V+r
C
DA
A V>Vr
WHILE - DO
DO - UNTIL DO - FOR
Exemplu:
Se cere algoritmul şi schema logică pentru calculul lui n!
Paşii algoritmului de calcul sunt :
9. citeşte valoarea lui n;
10. atribuie lui P valoarea 1;
11. atribuie lui I valoarea 1;
12. atribuie lui P valoarea expresiei P * I;
13. atribuie lui I valoarea expresiei I + 1;
14. dacă I<N atunci treci la pasul 4;
15. scrie valoare lui P;
16. stop.
Schema logică corespunzătoare algoritmului:
Diagrama arborescentă
Diagrama arborescentă constituie o altă modalitate de reprezentare grafică a algoritmilor. Ca şi
în cazul schemelor logice, există mai multe convenţii de reprezentare a operaţiilor în cadrul algoritmilor.
Limbajul Pseudocod
Spre deosebire de schemele logice, limbajele Pseudocod folosesc cuvinte cu înţeles
prestabilit (numite cuvinte cheie) şi câteva reguli simple de aliniere a textului scris.
35
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
36
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
atribuie C A + B
scrie A , B , C
stop
Efectul execuţiei unei comenzi depinde de poziţia comenzii în cadrul secvenţei .
i) Decizia – este o structură care asigură alegerea pentru execuţie a unei secvenţe din două
alternative posibile.
Structura comenzii: dacă condiţie atunci
secvenţa1
altfel
secvenţa 2
[]
Începutul comenzii de decizie este marcat de cuvântul cheie “dacă” iar sfârşitul său de semnul []
Execuţia acestei comenzi comportă următoarele etape:
se evaluează “ condiţia”;
dacă rezultatul evaluării este adevărat (condiţie îndeplinită) se execută secvenţa 1;
în caz contrar se execută secvenţa 2.
După executarea secvenţei 1 sau a secvenţei 2 se trece la următoarea comandă (cea după
semnul [] )
Observaţie: În cazul în care secvenţa care urmează după cuvântul cheie “altfel” lipseşte, se utilizează
forma simplificată a deciziei:
dacă condiţie atunci
secvenţa1
[]
În cazul în care condiţia nu este îndeplinită se trece direct la comanda ce urmează deciziei
Exemplul:
dacă A > B atunci
scrie A
altfel
scrie B
[]
Efectul execuţiei exemplului de mai sus este următorul:dacă valoarea variabilei A este mai
mare decât a variabilei B se scrie valoarea lui A în caz contrar se scrie valoarea variabilei B şi nu
valoarea variabilei A.
Exemplul: Descrierea în Pseudocod a algoritmului de aflare a celui mai mare element
din 3 valori reale desemnate prin variabilele a,b,c.Variabila “x” va conţine cel mai mare element din cele
3 valori.Algoritmul de rezolvare a unei probleme nu este unic.Ca atare se dau două descrieri
Pseudocod pentru rezolvarea acestei probleme.
a) varianta 1
citeşte a,b,c
dacă a>b atunci
atribuie x a
altfel
atribuie x b
[]
dacă c > x atunci
atribuie x c
[]
37
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
scrie x
stop
b) varianta 2
citeşte a,b,c
atribuie x a
dacă x < b atunci
atribuie x b
[]
dacă x < c atunci
atribuie x c
[]
scrie x
stop
O variantă simplificată : citeşte a,b,c,
atribuie x a
dacă x < b atunci atribuie x b
dacă x < c atunci atribuie x c
scrie x
stop
Observaţie: Ultima variantă a algoritmului are avantajul că poate fi uşor generalizată pentru aflarea
maximului unui şir.
j) Selecţia reprezintă o extindere a operaţiei de decizie, ea permitând alegerea unei alternative din
mai multe posibile.Forma generală a comenzii de selecţie este următoarea :
c2 : secvenţa 2
.
.
cn : secvenţa n
rest : secvenţa n+1
[]
Unde c1 , c2 , ... cn sunt etichete şi se folosesc pentru identificarea secvenţelor.Sfârşitul comenzii este
marcat de _[] iar liniile textului selecţiei sunt marcate prin etichetele c.
Modul de execuţie al comenzii de selecţie este următorul:
se evaluează expresia
se identifică eticheta ci ce are aceeaşi valoare cu expresia ( în urma evaluării expresiei)şi
este selectată secvenţa corespunzătoare.Dacă nici o etichetă nu are valoarea expresiei
atunci este selectată secvenţa n+1, corespunzătoare etichetei rest.
se execută secvenţa selecctată şi se sare la sfârşitul comenzii de selecţie adică după
semnul [].
Exemplu: Să se adune valoarea întreagă v la una din variabilele s 0,s1,s2 ,s3, după cum
restul împărţirii valorii v la 4 este 0,1,2 sau 3 .Descrierea în Pseudocod arată astfel:
38
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
citeşte v,s0,s1,s2,s3
alege v – int ( v/4)*4 dintre
0: atribuie s0 s0 + v
1: atribuie s1 s1 + v
2: atribuie s2 s2 + v
3: atribuie s3 s3 + v
[]
scrie s0,s1,s2,s3
stop
În acest caz , eticheta “rest” şisecvenţa respectivă lipseşte ,deoarece domeniul de valori ale
expresiei este mulţimea (0,1,2,3).
k) Ciclul cu test final – În rezolvarea unei probleme , nu de puţine ori apare situaţia executării
repetate a unei secvenţe de operaţii.O astfel de combinaţie , în care execuţia unui grup de
operaţii se repetă se numeşte ciclu sau iteraţie.Pentru reprezentarea ei se utilizează o comandă
de ciclare care specifică atâtoperaţiile care se repetă cât şi condiţia de repetare.
Forma generală a comenzii de ciclare cu test final este următoarea:
repetă
secvenţa
până condiţia
[]
Modul de execuţie al comenzii de ciclare este următorul:
1-se execută secvenţa
2-se evaluează condiţia şi dacă rezultatul este fals(condiţie neîndeplinită)se continuă cu etapa 1 , altfel
execuţia comenzii se termină şi se trece la comanda următoare.
Exemplu: Se dă algoritmul lui Euclid pentru afişarea celui mai mare divizor comun a
două numere întregi m,n(m>=n>0).
10. citeşte valorile lui m şi n
11. atribuie lui c valoarea lui n ( în variabila c se reţine cel mai mare divizor
comun )
12. atribuie lui r restul împărţirii întregi a lui m la n
13. dacă r diferit de 0 atunci treci la 7
14. scrie valoarea lui c
15. stop
16. atribuie lui m valoarea lui n
17. atribuie lui n valoarea lui r
18. treci la pasul 2
Se observă că operaţiile care se realizează calculul restului şiactualizarea valorilor c, m şi n se
repetă.
Folosind Descrierea în Pseudocod a algoritmului şi ciclul cu test final vom avea:
citeşte m,n
repetă
atribuie c n , r m-int(m/n)*n
atribuie mn , n r
până r=0
_[]
scrie c
stop
Condiţia de terminare a ciclului poate fi orice expresie logică.Secvenţa de operaţii din ciclu
alcătuieşte corpul ciclului .Ea poate conţine oriceoperaţii, inclusiv iteraţii.
39
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
l) Ciclul cu test iniţial – În cazul ciclurilor sau iteraţiilor condiţia de ciclare poate apare şi la
începutul secvenţei de ciclare
Forma generală este :
cât timp condiţia execută
secvenţa
[]
Condiţia poate fi orice expresie logică , iar secvenţa poate conţine orice comenzi , inclusiv
comenzi de ciclare.
Modul de execuţie al ciclului cu test iniţial :
1-se evaluează condiţia;dacă rezultatul este fals(condiţie neîndeplinită) execuţia se termină,iar dacă
rezultatul este adevărat se continuă secvenţa(etapa 2)
2-se execută secvenţa,după care se continuă cu 1.
În cazul în care rezultatul evaluării condiţiei este fals încă de la început,secvenţa nu se
execută niciodată spre deosebire de ciclul cu test final,când secvenţa se executa cel puţin o dată.
Scrierea algoritmului lui Euclid în Pseudocod folosindciclul cu test iniţial ne conduce la:
citeşte m,n
atribuie c n , r m-int(m/n)*n
cât timp r <> 0 execută
atribuie m n , n r, c n
atribuie r m-int(m/n)*n
[]
scrie c
stop
m) Ciclul de contor, cu forma generală:
pentru contor = val iniţială, val.finală,pas execută
secvenţa
[]
unde prin contor se înţelege o variabilă cu valori întregi:”valoarea iniţială, finală şi pas” pot fi expresii
aritmetice cu valori întregi.
Execuţia ciclului cu contor se explicitează astfel:
5) variabilei contor i se atribuie valoarea iniţială;
6) se verifică condiţia contor > val. Finală; dacă rezultatul este fals se continuă cu, astfel
execuţia ciclului se termină;
7) se execută secvenţa
8) se modifică valoarea contorului cu pasul p şi se continuă cu pasul 2)
Exemplu: aflarea lui n!
Observaţii: 1. Dacă pasul de ciclare este 1, se poate omite
2. Algoritmul a fost completat şi pentru cazul în care n = 0
citeşte n
atribuie p = 1
dacă n>0 atunci
pentru i=1,n execută
atribuie p=p*i
[]
[]
scrie p
stop
n) Proceduri şi funcţii
În rezolvarea unor probleme apar frecvent situaţii când un număr decomenzi se repetă
schimbându-se numai variabilele ce compun aceste comenzi,structura comenzilor rămânând aceeaşi.
40
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Pentru a nu repeta acel număr de comenzi în mai multe locuri în cadrul descrierii algoritmului de
rezolvare a problemei se folosesc procedurile şi funcţiile.
Procedura – descrie în termeni generali un algoritm cu posibilitatea de a aplica acel algoritm în
diverse cazuri particulare concrete.
Pentru a se identifica,procedurii i se asociază un nume.La definirea procedurii trebuie să se
asocieze un se de parametri , variabile care specifică mărimile ce se modifică la fiecare apelare a
procedurii.
Structura unei proceduri, în Pseudocod este :
Procedure nume (parametrii) este:
secvenţa
sfârşit
unde:
- nume = numele procedurii
- parametrii = parametrii formali ai procedurii
Apelul unei procedurei specifică numeleprocedurii,precum şi parametrii actuali prin care se
transmit valorile cu care se efectuează comenzile din procedură.
Structura apelului unei proceduri este :
execută nume ( parametrii )
unde : - nume = numele procedurii ce se apelează
- parametrii = parametrii actuali ( efectivi ),adică cei pentru care urmează a se
efectua comenzile din procedură.
Exemplu: Să se construiască o procedură pentru aflarea normei unui vector.Se ştie că
norma unui vector A de n componente se defineşte prin relaţia:
S=
41
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
= =
42
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
stop
Execuţia unei funcţii intervine atunci când la evaluarea unei expresii este necesară valoarea sa
.În acest caz se face transmisia parametrilor efectivi,se execută secvenţa de operaţii corespunzătoare
corpului funcţiei, găsindu-se astfel valoare funcţiei.
3.4 Algoritmi iterativi si recursivi
IMPLEMENTAREA UNOR ALGORITMI NUMERICI ITERATIV
Să se calculeze valoarea lui PI din următoarea dezvoltare:
luând în considerare n termeni.
a) Descrierea algoritmului în limbaj natural:
Se consideră S valoarea sumeidin dreapta semnului egal,formată
dinînsumarea inverselor numerelor impare cu semne opuse.După
însumarea celor n termeni , valoarea PI se obţine prin înmulţirea lui S cu 4.
b) Descrierea şi semnificaţia structurilor de date folosite:
PI: variabila în care se va calcula valoarea numărului PI
S : variabila în care se păstrează sumele parţiale
T : termenul ce se adaugă
n : numărul de termeni ce se adună
i : contor
43
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
44
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
cate’,k,’=’,c);
end;
END.
Să se calculeze pentru un n dat , toţi termenii şirului lui Fibonacci, cunoscând relaţia de
recurenţă f k = f k-1+ f k-2 , pentru orice k >= 2 şi f0 =0, f1 = 1
a) Descrierea algoritmului în limbaj natural
Relaţia de recurenţă necesită două valori iniţiale f 0 şi f . Această relaţie va fi aplicată de n-2 ori ,
actualizând de fiecare dată pe f k-2 şi f k-1.Deci pentru calculul termenului curent f k sunt suficienţi 2
termeni consecutivi din şir. Vom nota cu “a” termenul f k-2 ,cu “b” f k-1 şi cu “c” termenul f k calculat.
b.) Descrierea algoritmului în pseudocod:
citeşte n
scrie n
{iniţializează primi 2 termeni ai şirului}
atribuie a 0, b 1
scrie a,b {primi doi termeni}
pentru k=3, n, 1 execută
atribuie c a+b {calculează termenul curent}
a b {actualizarea ultimilor doi}
b c {termeni din şir}
scrie c
stop
d.) Programul PASCAL:
program fibonacii;
var
a,b,c,k,n:integer;
BEGIN{main}
write('Introduceti nr. de
termeni:');
readln(n);
a:=0; b:=1;
write(a:3);
for k:=3 to n do
begin
c:=a+b;
a:=b; b:=c;
write(c:3)
end;
END.
45
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Se ştie că c.m.m.m.c a două numere A şi B este egal cu raportul dintre produsul celor două numere
şi c.m.m.d.c. al celor două numere. Ca atare în variabila p se va reţine produsul celor două numere.
Variabila CMMMC va reţine c.m.m.m.c, iar variabila CMMDC va reţine c.m.m.d.c. Conform
algoritmului lui Euclid de aflare a c.m.m.d.c se împarte cel mai mare număr (A) la cel mai mic (B) şi se
calculează restul împărţirii întregi (R). Dacă restul împărţiirii este 0 atunci c.m.m.d.c. este B. În caz
contrar se fac atribuirile: lui A i se atribuie B iar lui B i se atribuie R şi procesul se continuă până R=0.
Dacă la introducerea datelor B>A, se schimbă între ele cele două valori.
Dacă cel mai mic număr este 0 se va tipări mesajul ‘unul dintre numere este 0’ şi nu se va calcula
c.m.m.m.c.
Pentru calculul restului împărţirii se va folosi operatorul PASCAL ,,mod”.
b.) Descrierea şi semnificaţia structurilor de date folosite:
A,B : cele două numere întregi
CMMDC, CMMMC : variabile întregi pentru calculul c.m.m.d.c. şi c.m.m.m.c.
c)Descrierea şi semnificaţia structurilor de date folosite
a,b : cele două numere întregi
cmmdc,cmmmc : variabile xîntregi pt.calculul cmmdc şi cmmmc
p : produsul celor două numere ( pentru calculul cmmmc)
x : variabilă auxiliară
d)Descrierea algoritmului în Pseudocod
citeşte a,b
atribuie p a * b { reţine produsul numerelor }
dacă a<b atunci
atribuie x a {schimbă cele două valori între ele}
ab
bx
[]
dacă b<>0 atunci
atribuie r a mod b {restul împărţirii întregi }
cât timp r<>0 execută
atribuie a b {pregăteşte o nouă reluare
a algoritmului }
br
r a mod b
[]
atribuie cmmdc b
cmmmc p / b
scrie cmmmc,cmmdc
altfel
scrie ‘ unul din termeni este zero’
[]
stop
c)Programul Pascal
Program Euclid;
var a,b,x,p,r,cmmdc,cmmmc:integer;
BEGIN{main}
46
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
write(‘introduceţi a si b : integer’);
readln(a,b);
p:=a*b;
if a<b then
begin
x:=a;
a:=b;
b:=x;
end;
if b<>0 then
begin
r:=a mod b;
while r<>0 do
begin
a:=b
b:=r;
r:=a mod b;
end;
cmmdc:=b;
cmmmc:=p div b;
writeln(‘cmmdc=’,cmmdc:8,
’cmmmc=’,cmmmc:9);
end
else writeln(‘unul din termeni este
zero’);
END.
3.5.1 Probleme care opereaza asupra cifrelor unui numar
1)Se citeste un numar natural n.Sa se deosebite din intervalul [a,b].Pentru
cunstruiasca numarul sau. fiecare numar deosebit se va afisa o
singura descompunere.Sa se precizeze
var m,n:word;
begin numarul lor.Un numar natural m este
write('n='); readln(n); deosebit daca exista un numar natural
m:=0; n astfel incat m=n +s(n), unde s(n)
while (n<>0) do begin este suma cifrelor lui n.
m:=m*10+n mod 10; Exemplu:
n:=n div 10;
end;
In intervalul [30,100] sunt 64 numere
write(m); deosebite.}
end. var a,b,m,n,n1,s,nr:word;
2) Se citeste un numar natural n,sa se begin
write('a='); readln(a);
calculeze numarul cifrelor sale. write('b='); readln(b);
ex:123 if b<=a then begin
=>3} writeln('Data incorecta!'); readln; exit; end;
nr:=0;
var n,nr:word; for m:=a to b do
begin for n:=0 to m do begin
write('n='); readln(n); n1:=n; s:=0;
nr:=0; while n1>0 do begin
while (n<>0) do begin inc(s,n1 mod 10);
nr:=nr+1; n1:=n1 div 10; end;
n:=n div 10; if m=n+s then begin
end; inc(nr);
write(nr); write(m,'este un numar deosebit.');
end. writeln(' ',m,'=',n,'+',s);
3) Pentru a, b numere naturale date, if (m-a+1) mod 20=0 then
readln;
0<=a<b, sa se afiseze toate numerele break
47
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
48
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
49
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
3.5.2 Divizibilitate
1)Determinaţi toate numerele care sunt indeplinesc simultan conditiile:d<c, b-
multipli de k, care depăşesc valoarea n. c=1, iar b si d sunt divizibile cu 3 .
program multipli2; Sa se precizeze numarul lor.
var k,i,n:longint;
Exemplu:
begin
write('k=');readln(k) Sunt 6 numere:1320, 1650, 1653, 1980,
; 1983, 1986}
write('n=');readln(n) var b,c,d,n:0..9;
; nr:word;
i:=k; begin
while i<=n do n:=0;
begin for b:=3 to 9 do
write(i,' '); for d:=0 to 6 do begin
inc(i,k); c:=b-1;
end; if (d<c) and (b mod 3=0) and (d mod 3=0) then
end. begin
2) Se citesc n numere naturale.Sa se nr:=1000+100*b+10*c+d;
numere cate din ele sunt pare. write(nr:5); inc(n);
end;
end;
var n,i,x,nr_pare:integer; writeln;
begin writeln('sunt',n,'numere');
Write('n='); readln(n); end.
nr_pare:=0;
for i:=1 to n do begin
5) Sa se verifice daca numarul natural n
read(x); este perfect sau nu.( n este perfect
if x mod 2 =0 then daca este egal cu suma divizorilor sai
nr_pare:=nr_pare+1; mai mici ca el).
end; Exemplu:
write(nr_pare);
end.
n=6 este perfect deoarece 6=1+2+3.}
var n,i,s:word;
3) Se citeste un numar natural n Sa se begin
numere divizorii sai (inclusiv 1 si write('n='); readln(n);
el insusi)} s:=0;
for i:=1 to n div 2 do
var n,nr_div,i:integer; if n mod i=0 then s:=s+i;
begin if n=s then
Write('n='); readln(n); writeln('numar perfect')
nr_div:=0; else
for i:=1 to n do writeln('numarul nu este perfect');
if n mod i=0 then end.
nr_div:=nr_div+1;
write(nr_div); 6) Sa se determine cel mai mic numar natural
end. nenul care are exact n divizori
(inclusiv divizorii banali), d>=2 dat.Sa se
4) Sa se genereze toate numerele afiseze acest numar impreuna cu
naturale de patru cifre de forma 1bcd divizorii sai.
care Exemplu:
50
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
51
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
end; d
if k>0 then 6
write (s/k:0:2)
else
d
write (' nu exista numere pare'); 9
readln; n
end. =>3}
11) Se dau doua n numere naturale var a:array[1..20] of integer;n,i,j,di,x,y,t:integer;
nenule (n<40) .Se cere sa se afiseze op:char;
cel mai mare divizor comun.} begin
var n,a,b,d,i,x: longint; writeln(' dati numerele');
begin n:=0;
write ('n='); readln (n); repeat
writeln(' dati primul numar '); write('numar ');n:=n+1;readln(a[n]);
readln(x); write(' mai introduceti d / n ?');read(op);
d:=x; until op='n';
for i:=2 to n do begin writeln(' dati numarul al di:=abs(a[1]);
',i,' lea '); for i:=2 to n do
read(x); begin
a:=d; b:=x; x:=abs(a[i]);
while a<>b do if di>x then begin
if a >b then t:=x;x:=di;di:=t;end;
a:=a-b while x mod di <>0 do
else begin t:=x;x:=di;di:=t mod di;end;end;
b:=b-a; writeln('c m m d c ',di);
d:=a; if di=1 then for i:=1 to n do
end; for j:=i+1 to n do
writeln ; begin
write (' c.m.m.d.c=',d); x:=abs(a[i]);y:=abs(a[j]);
readln; if x>y then begin t:=x;x:=y;y:=t;end;
end. while y mod x <>0 do
begin t:=y;y:=x;x:=t mod x; end;
12) Sa se calculeze cel mai mare divizor if x=1 then writeln('(',a[i],',',a[j],')=1');
comun a unui numar aleator de numere end;
(cu vectori) readln;
ex:3 end.
52
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
begin begin
write('n='); readln(n); writeln('dati numarul ');
for i:=2 to n do begin readln (x); n1:=x;
prim:=true; repeat
for j:=2 to trunc(sqrt(i)) do inc(n1);
if i mod j=0 then begin ok:=true;
prim:=false; break; end; for i:=2 to trunc(sqrt(n1)) do
if prim then write(i:5); if n1 mod i =0 then ok:=false;
end; until ok;
writeln; n2:=x+1;
end. repeat
4) Sa se afiseze toate numerele naturale x dec(n2); ok:=true;
mai mici decat n,natural, cu for i:=2 to trunc (sqrt(n2)) do
if n2 mod i=0 then ok:=false;
proprietatea ca x-1 si x+1 sunt numere until ok;
prime. if k-n2<n1-x then writeln (n2)
Exemplu: else writeln(n1);
pentru n=15 se vor afisa: 4,6,12.} readln;
var x,y,n,i,k:integer; end.
t:boolean; 6) Se da un numar natural n (0<n<1000000).Se cere
begin sa se afiseze toate
write('n='); readln(n); perechile de numere gemene (a,b), a,b<=n. Perechea
for x:=2 to n-2 do (a,b) este o
begin pereche de numere gemene daca a si b sunt prime si
k:=0; valoarea absoluta a
t:=true; diferenteia-b este 2.}
for i:=2 to trunc(sqrt(x)) do var
if x mod i=0 then t:=false; i,j,n,l:integer;
if t then k:=k+1; bec: boolean;
y:=x+2; t:=true; begin
for i:=2 to trunc(sqrt(y)) do write ('n='); readln(n);
if y mod i=0 then t:=false; for i:=2 to n-2 do begin bec:=true;
if t then k:=k+1; for j:=2 to trunc(sqrt(i)) do
if k=2 then write (x+1,' '); if i mod j=0 then bec:= false;
end; if bec then begin
end. l:=trunc (sqrt(i+2));
5) Se citeste un numar natural de cel for j:=2 to l do
if (i+2) mod j=0 then
mult 8 cifre. Sa se afiseze cel bec:=false;
mai apropiat numar prim fata de if bec then write ('(',i,',',i+2,') ');end;
acesta.} end;
VAR x,i,k,n1,n2: longint; readln;
ok: boolean; end.
7) Dându-se un număr întreg N, să se afişeze toţi factorii primi ai acestuia precum şi
ordinele lor de multiplicitate.
a) Descrierea algoritmului în Pseudocod
O primă formă arată astfel:
citeşte n
scrie n
atribuie d 2
cât timp *n mai admite divizori execută
* determină multiplicitatea eventualului divizor şi extrage d din n
dacă *d a fost divizor atunci
afişează d şi ordinul de multiplicare
[]
trecere la următorul d
53
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
[]
stop
Acţiunea “*determină multiplicitatea eventualului divizor d şi îl extrage pe d din n” are un
caracter ciclic, necunoscându-se numărul de repetări ale ciclului.Această acţiune se poate realiza în
Pseudocod astfel:
citeşte n startSTART
atribuie d 2
cât timp d<=(sqrt(n+0.5)) execută Citeste
atribuie m0 n
cât timp n mod d =0 execută
d := 2
atribuie n n div d
mm+1 DA
d<=(sqrt(n+0.5))
[]
dacă m>0 atunci m:=0
scrie d , m
[] n mod d :=0
dacă d = 2 atunci
atribuie d 3 n :=n divd
altfel m := m + 1
atribuie d d + 2 NU
NU DA
[] m>0
[]
Scrie d,m
dacă n > 1 atunci
scrie n
NU DA
[] d: = 2
n>1
stop
d := 3 d:= d + 2
Scrie n
54
STOP
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
d)Programul Pascal
Program divizorii ;{descompunere în factori primi}
var n,d,m:integer;
BEGIN{main}
write (‘introduceti n:integer’);
readln(n);
writeln(n:4,’are urmatorii factori primi’);
writeln(‘factor’,’‘:5,’multiplicitate’);
d:=2;{cel mai mic numar prim}
while d<= trunc(sqrt(n+0.5)) do
begin
m:=0;
while(n mod d)= 0 do
begin
n:=n div d;
m:=m+1;
end;
if m>0 then
writeln(d:5,’ ‘:9,m:2);
if d = 2 then d:=3
else d:=d+2;
end;
if n>1 then writeln(n:5,’ ‘:10,’1’);
END.
3.5.3 Algoritmul lui Euclid
1)Să se calculeze c.m.m.d.c. şi c.m.m.m.c a două numere întregi aplicând algoritmul lui
Euclid.
a.) Descrierea algoritmului în limbaj natural:
Se ştie că c.m.m.m.c a două numere A şi B este egal cu raportul dintre produsul celor două numere
şi c.m.m.d.c. al celor două numere. Ca atare în variabila p se va reţine produsul celor două numere.
Variabila CMMMC va reţine c.m.m.m.c, iar variabila CMMDC va reţine c.m.m.d.c. Conform
algoritmului lui Euclid de aflare a c.m.m.d.c se împarte cel mai mare număr (A) la cel mai mic (B) şi se
calculează restul împărţirii întregi (R). Dacă restul împărţiirii este 0 atunci c.m.m.d.c. este B. În caz
contrar se fac atribuirile: lui A i se atribuie B iar lui B i se atribuie R şi procesul se continuă până R=0.
Dacă la introducerea datelor B>A, se schimbă între ele cele două valori.
Dacă cel mai mic număr este 0 se va tipări mesajul ‘unul dintre numere este 0’ şi nu se va calcula
c.m.m.m.c.
Pentru calculul restului împărţirii se va folosi operatorul PASCAL ,,mod”.
b.) Descrierea şi semnificaţia structurilor de date folosite:
A,B : cele două numere întregi
CMMDC, CMMMC : variabile întregi pentru calculul c.m.m.d.c. şi c.m.m.m.c.
c)Descrierea şi semnificaţia structurilor de date folosite
a,b : cele două numere întregi
cmmdc,cmmmc : variabile xîntregi pt.calculul cmmdc şi cmmmc
p : produsul celor două numere ( pentru calculul cmmmc)
x : variabilă auxiliară
d)Descrierea algoritmului în Pseudocod
55
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
citeşte a,b
atribuie p a * b { reţine produsul numerelor }
dacă a<b atunci
atribuie x a {schimbă cele două valori între ele}
ab
bx
[]
56
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
writeln(‘cmmdc=’,cmmdc:8,
’cmmmc=’,cmmmc:9);
end
else writeln(‘unul din termeni este
zero’);
END.
57
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
58
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
begin p:=p*i;
s:=s+i; s:=s+p;
writeln('Suma end;
ultimelor ',n-i+1,' numere este write(s);
',s); end.
end; 3) Pentru n>0 dat, sa se evalueze
writeln(' Suma expresia:
totala: ',s); E=1+1*3+1*3*5+...+1*3*..*(2*n+1)
readln; Exemple:
end. a)n=2 : E=19
2) Sa se calculeze suma b)n=3 : E=124
S=1+1*2+1*2*3+...+1*2*....*n, unde n c)n=4 : E=1069
este un numar d)n=5 : E=11464}
var n,i:byte;
natural citit. e,p:word;
ex:n=2 begin
=>3 write('n='); readln(n);
} e:=1; p:=1;
for i:=1 to n do begin
var p,n,s,i:integer; p:=p*(2*i+1);
begin inc(e,p);
Write('n='); readln(n); end;
p:=1; s:=0; write('E=',e);
for i:=1 to n do begin end.
59
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
ex:n=3 end;
124 if (p=1) or (p=n) then
write('nu este un punct creasta')
=>4} else begin
var a:array[1..20] of integer; s:=true;
i,n,k,max,j:integer; for i:=1 to p-1 do
ok:boolean; if v[i]>v[i+1] then s:=false;
begin d:=true;
write('n='); for i:=p to n-1 do
readln(n); if v[i]<v[i+1] then d:=false;
for i:=1 to n do if s and d then
begin write('da,este un punct creasta')
write('a[',i,']='); else write('nu este un punct creasta');
readln(a[i]); end;
end; readln;
end.
i:=1;
ok:=false; 5) Sa se determine maximul
while (i<=n) and (ok=false) do elementelor negative intr-un vector
if a[i] mod 2=0 then ok:=true ex:3
else i:=i+1; -1 -2 -3
if ok=false then begin =>-1}
writeln('nu sunt elemente pare'); program maxim_nr_negat;
max:=-1; type vector=array[1..100]of real;
end var x:vector;
else begin n,i:integer;
max:=a[i]; max:real;
for j:=i+1 to n do begin
if (a[j] mod 2=0) and (a[j]>max) then write('n=');
max:=a[j]; readln(n);
writeln('maximul elementelor pare for i:=1 to n do begin
este',max); write ('x[',i,']=');
end; readln (x[i]);end;
readln; max:=-maxint;
end. for i:=1 to n do
4) Se numeste varf creasta un if x[i]<0 then
maxim care in stanga sa are elementele if max<x[i] then
ordonate max:=x[i];
crescator iar in dreapta sa are write ('max negat este:',max);readln;
end.
elementele ordonate descrescator.
6) Sa se determine cea mai mica si
ex:3
cea mai mare diferenta intre doi termeni
132
consecutivi
=> da este}
var i,n,m,p:integer; la un vector
v:array[1..20] of integer; ex:4
s,d:boolean; 1248
begin =>4
write('n='); 1}
readln(n); program zecetablouri;
for i:=1 to n do begin type vector=array[1..100]of integer;
writeln('v[',i,']='); var n,i,max,min:integer;
readln(v[i]); v:vector;
end; begin
m:=v[1]; write ('n=');readln (n);
p:=1; for i:=1 to n do begin
for i:=2 to n do write('v[',i,']='); readln(v[i]); end;
if v[i]>m then begin max:=v[1]-v[2];
m:=v[i]; min:=v[1]-v[2];
p:=i;
60
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
1)METODA INSERTIEI
teoria 1):
Sortarea prin insertie
Principiu: tabloul este vazut ca fiind format din doua subtablouri a[1], a[2],..., a[i-1] si
respectiv a[i], a[i+1],...,a[N] (i=2,N). Secventa a[1],...,a[i-1] este ordonata si urmeaza ca a[i] sa fie
inserat in aceasta secventa la locul potrivit, astfel incit secventa a[1],...,a[i-1],a[i] sa devina ordonata,
urmind ca in pasul urmator cele doua subtablouri considerate sa fie a[1],...,a[i] si a[i+1],...,a[N].
Pentru a gasi locul in care trebuie sa fie inserat a[i] se parcurge sirul a[1],...,a[i-1] de la
dreapta spre stinga, pina cind fie se gaseste un element cu cheia <= a[i].cheie, fie s-a atins capatul
sirului. Aici se poate utiliza metoda fanionului, extinzind tabloul spre stinga cu elementul a[0] care se
asigneaza initial cu a[i] (deci TipIndex=0..N).
Implementarea algoritmului in Pascal:
procedure Insertie;
VAR i,j : TipIndex;
begin
for i:=2 to N do begin
{insereaza a[i] la locul potrivit in sirul a[1]...a[i]}
a[0]:=a[i]; j:=i-1;
{cauta locul de inserare}
while a[j].cheie > a[0].cheie do begin
a[j+1]:=a[j]; j:=j-1
end;
a[j+1]:=a[0]
end;
end; {Insertie}
In cazul sortarii prin insertie C si M sint de ordinul N*N, avind valori minime cind tabloul e
ordonat si maxime cind tabloul e ordonat descrescator.
Aceasta metoda este stabila.
61
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
62
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
4 2 1 3 aux A[1] 2 4 1 3
A[1]A[2]
A[1] A[2] A[3] A[4] A[2]aux A[1] A[2] A[3] A[4]
63
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
În continuare( tot pentru i=1) se testează A[1] faţă de elementul de pe poziţia 3 şi pentru că nu
îndeplineşte condiţia de a fi mai mic decât A[3] , acestea se vor interschimba (i=1; j=3)
aux A[1]
2 4 1 3 1 4 2 3
A[1]A[3]
A[1] A[2] A[3] A[4] A[3]aux A[1] A[2] A[3] A[4]
Pentru i=1; j=4 , elementele de pe aceste poziţii sunt poziţionate corect şi se continuă astfel cu
elementele de pe poziţiile i=2, j=3 care vor trebui interschimbate
1 4 2 3 aux A[2] 1 2 4 3
A[1] A[2] A[3] A[4] A[2]A[3] A[1] A[2] A[3] A[4]
A[3]aux
1 2 4 3 aux A[3] 1 2 3 4
A[1] A[2] A[3] A[4] A[3]A[4] A[1] A[2] A[3] A[4]
A[4]aux
matematic: =>1 2 3}
v=(7 3 9 2 1 4) uses crt;
i=1 j>i deci var t,i,j,n:integer;
j=2 v[1]=7>v[2]=3 le interschimb a:array[1..20]of integer;
v=(3 7 9 2 1 4 ) begin
j=3 clrscr;
v[1]3<v[3]=9, la fel write('n=');
j=4 v[1]=3<v[4]=2 le interschimb readln(n);
for i:=1 to n do begin
deci v=(2 7 9 3 1 4) write('a[',i,']=');
j=5 v[1]=2>v[5]=1 le interschimb readln(a[i]);
deci v=(1 7 9 3 2 4) end;
j=6 v[1]=1<v[6]=4 la fel for i:=1 to n-1 do
pentru i=2 , j={3 4 5 6} analog for j:=i+1 to n do
if a[i]>a[j] then begin
APLICATIA: t:=a[i];
Sa se sorteze un vector prin metoda a[i]:=a[j];
selectiei (se interschimba numere care a[j]:=t;
sunt adiacente(cel mai mare merge catre end;
ultima pozitie si la urmatoatea parcurgere for i:=1 to n do
urmatorul catre penultima) write(a[i]:4);
ex:3 readln;
213 end.
4)Metoda bulelor
Teoria 1:
Sortarea prin interschimbare (bubblesort)
64
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
65
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
3.5.8 Interclasarea
Sa se scrie un program pentru ordonarea prin interclasare a doua
siruri de
numere intregi a si b.
ex:n=3,a=(2,3,4),n=1 ,b=(1)}
program interclass;
var i,j,k,L,m,n:integer;
a,b,c:array[1..30] of integer;
BEGIN
write('n=');read(n);
write('m=');
readln(m);
for i:=1 to n do begin
write('a[',i,']=');readln(a[i]);
end;
for i:=1 to m do begin
write('b[',i,']=');readln(b[i]);
end;
i:=1;j:=1;k:=0;
while (i<=n) and (j<=m) do begin
if a[i]<b[j] then begin
k:=k+1;c[k]:=a[i];i:=i+1;end
else begin
k:=k+1;c[k]:=b[j];j:=j+1;end;
if i>n then for L:=j to m do begin
k:=k+1;c[k]:=b[L];end
else for L:=i to n do begin
k:=k+1;c[k]:=a[L];end;
for i:=1 to m+n do write(c[i],' '); end;
66
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
readln;
END.
Cu alte cuvinte, O( f ) (se citeste “ordinul lui f ”) este multimea tuturor functiilor t
marginite superior de un multiplu real pozitiv al lui f, pentru valori suficient de mari
ale argumentului. Vom conveni sa spunem ca t este in ordinul lui f (sau, echivalent, t
este in O( f ), sau t O( f )) chiar si atunci cand valoarea f (n) este negativa sau
nedefinita pentru anumite valori n < n0. In mod similar, vom vorbi despre ordinul lui f
chiar si atunci cand valoarea t(n) este negativa sau nedefinita pentru un numar finit de
valori ale lui n; in acest caz, vom alege n0 suficient de mare, astfel incat, pentru n n0,
acest lucru sa nu mai apara. De exemplu, vom vorbi despre ordinul lui n/log n, chiar
daca pentru n = 0 si n = 1 functia nu este definita. In loc de t O( f ), uneori este mai
convenabil sa folosim notatia t(n) O( f (n)), subintelegand aici ca t(n) si f (n) sunt
functii.
Fie un algoritm dat si fie o functie t : N R astfel incat o anumita implementare a
algoritmului sa necesite cel mult t(n) unitati de timp pentru a rezolva un caz de
marime n, n N. Principiul invariantei (mentionat in Capitolul 1) ne asigura ca orice
implementare a algoritmului necesita un timp in ordinul lui t. Mai mult, acest algoritm
necesita un timp in ordinul lui f pentru orice functie f : N R pentru care t O( f ).
In particular, t O(t). Vom cauta in general sa gasim cea mai simpla functie f, astfel
incat t O( f ).
67
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Proprietatile de baza ale lui O( f ) sunt date ca exercitii (Exercitiile 5.1-5.7) si este
recomandabil sa le studiati inainte de a trece mai departe.
Notatia asimptotica defineste o relatie de ordine partiala intre functii si deci, intre
eficienta relativa a diferitilor algoritmi care rezolva o anumita problema. Vom da in
continuare o interpretare algebrica a notatiei asimptotice. Pentru oricare doua functii
f , g : N R, definim urmatoarea relatie binara: f g daca O( f ) O(g). Relatia “”
este o relatie de ordine partiala in multimea functiilor definite pe N si cu valori in R
(Exercitiul 5.6). Definim si o relatie de echivalenta: f g daca O( f ) = O(g).
In Exercitiul 5.7 este data o metoda de simplificare a calculelor, in care apare notatia
asimptotica. De exemplu,
n33n2n8 O(n3(3n2n8)) = O(max(n3, 3n2n8)) = O(n3)
chiar daca pentru 0 n 6 polinomul este negativ. Exercitiul 5.8 trateaza cazul unui
polinom oarecare.
Notatia O( f ) este folosita pentru a limita superior timpul necesar unui algoritm,
masurand eficienta algoritmului respectiv. Uneori este util sa estimam si o limita
inferioara a acestui timp. In acest scop, definim multimea
Exista o anumita dualitate intre notatiile O( f ) si ( f ). Si anume, pentru doua functii
oarecare f, g : N R, avem: f O(g), daca si numai daca g ( f ).
O situatie fericita este atunci cand timpul de executie al unui algoritm este limitat, atat
inferior cat si superior, de cate un multiplu real pozitiv al aceleiasi functii. Introducem
notatia
( f ) = O( f ) ( f )
68
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
numita ordinul exact al lui f. Pentru a compara ordinele a doua functii, notatia nu
este insa mai puternica decat notatia O, in sensul ca relatia O( f ) = O(g) este
echivalenta cu ( f ) = (g).
Notatia O( f ) este echivalenta cu O( f | P), unde P este predicatul a carui valoare este
mereu true. Similar, se obtin notatiile ( f | P) si ( f | P).
O functie f : N R este eventual nedescrescatoare, daca exista un n0, astfel incat
pentru orice n n0 avem f (n) f (n1), ceea ce implica prin inductie ca, pentru orice
n n0 si orice m n, avem f (n) f (m). Fie b 2 un intreg oarecare. O functie
eventual nedescrescatoare este b-neteda daca f (bn) O( f (n)). Orice functie care este
b-neteda pentru un anumit b 2 este, de asemenea, b-neteda pentru orice b 2
(demonstrati acest lucru!); din aceasta cauza, vom spune pur si simplu ca aceste
functii sunt netede. Urmatoarea proprietate asambleaza aceste definitii, demonstrarea
ei fiind lasata ca exercitiu.
Proprietatea 3.6.1 Fie b 2 un intreg oarecare, f : N R o functie neteda si
t : N R o functie eventual nedescrescatoare, astfel incat
unde X poate fi O, , sau . Atunci, t X( f ). Mai mult, daca t ( f ), atunci si
functia t este neteda.
Pentru a intelege utilitatea notatiei asimptotice conditionate, sa presupunem ca timpul
de executie al unui algoritm este dat de ecuatia
69
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
unde a, b R+ sunt constante arbitrare. Este dificil sa analizam direct aceasta ecuatie.
Daca consideram doar cazurile cand n este o putere a lui 2, ecuatia devine
Prin tehnicile pe care le vom invata la sfarsitul acestui capitol, ajungem la relatia
Pentru a arata acum ca t (n log n), mai trebuie doar sa verificam daca t este
eventual nedescrescatoare si daca n log n este neteda.
t(1) = a 2(ab) = t(2)
t(n/2) t((n1)/2)
t(n/2) t((n1)/2)
Atunci,
t(n) = t(n/2)t(n/2)bn t((n1)/2)t((n1)/2)b(n1) = t(n1)
In fine, mai ramane sa aratam ca n log n este neteda. Functia n log n este eventual
nedescrescatoare si
2n log(2n) = 2n(log 2 log n) = (2 log 2)n 2n log n
O(n n log n) = O(max(n, n log n)) = O(n log n)
De multe ori, timpul de executie al unui algoritm se exprima sub forma unor
inegalitati de forma
si, simultan
70
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
t(n) t(n/2) t(n/2) O(n)
respectiv
t(n) t(n/2) t(n/2) (n)
t(n) t(n/2) t(n/2) (n)
Definim functia
v t(n)/f (n) u
t ( f ) = (n log n)
Aceasta tehnica de rezolvare a inegalitatilor initiale are doua avantaje. In primul rand,
nu trebuie sa demonstram independent ca t O(n log n) si t (n log n). Apoi, mai
important, ne permite sa restrangem analiza la situatia cand n este o putere a lui 2,
aplicand apoi Proprietatea 5.1. Deoarece nu stim daca t este eventual
nedescrescatoare, nu putem aplica Proprietatea 5.1 direct asupra inegalitatilor initiale.
unitati de timp, d fiind din nou o constanta. Simplificam aceasta expresie si obtinem
71
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
(a/2)n2 (bca/2)n (dcb)
In acest prim exemplu am dat toate detaliile. De obicei, detalii ca initializarea buclei
nu se vor considera explicit. Pentru cele mai multe situatii, este suficient sa alegem ca
barometru o anumita instructiune din algoritm si sa numaram de cate ori se executa
aceasta instructiune. In cazul nostru, putem alege ca barometru testul din bucla
interioara, acest test executandu-se de n(n1)/2 ori. Exercitiul 5.23 ne sugereaza ca
astfel de simplificari trebuie facute cu discernamant.
Sa presupunem ca i este fixat si fie x = T[i], ca in algoritm. Cel mai nefavorabil caz
apare atunci cand x < T[ j] pentru fiecare j intre 1 si i1, algoritmul facand in aceasta
situatie i1 comparatii. Acest lucru se intampla pentru fiecare valoare a lui i de la 2 la
n, atunci cand tabloul T este initial ordonat descrescator. Numarul total de comparatii
pentru cazul cel mai nefavorabil este
(n2)
Vom estima acum timpul mediu necesar pentru un caz oarecare. Presupunem ca
elementele tabloului T sunt distincte si ca orice permutare a lor are aceeasi
probabilitate de aparitie. Atunci, daca 1 k i, probabilitatea ca T[i] sa fie cel de-al k-
lea cel mai mare element dintre elementele T[1], T[2], …, T[i] este 1/i. Pentru un i
fixat, conditia T[i] < T[i1] este falsa cu probabilitatea 1/i, deci probabilitatea ca sa se
execute comparatia “x < T[ j]”, o singura data inainte de iesirea din bucla while, este
1/i. Comparatia “x < T[ j]” se executa de exact doua ori tot cu probabilitatea 1/i etc.
Probabilitatea ca sa se execute comparatia de exact i1 ori este 2/i, deoarece aceasta
se intampla atat cand x < T[1], cat si cand T[1] x < T[2]. Pentru un i fixat, numarul
mediu de comparatii este
ci = 1×1/i 2×1/i (i2)1/i (i1)2/i = (i1)/2 1/i
(n23n)/4 Hn (n2)
72
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Se observa ca algoritmul insert efectueaza pentru cazul mediu de doua ori mai putine
comparatii decat pentru cazul cel mai nefavorabil. Totusi, in ambele situatii, numarul
comparatiilor este in (n2).
Algoritmul necesita un timp in (n2), atat pentru cazul mediu, cat si pentru cel mai
nefavorabil. Cu toate acestea, pentru cazul cel mai favorabil, cand initial tabloul este
ordonat crescator, timpul este in O(n). De fapt, in acest caz, timpul este si in (n),
deci este in (n).
3.6.2.3 Heapsort
Vom analiza, pentru inceput, algoritmul make-heap din Sectiunea3.4. Definim ca
barometru instructiunile din bucla repeat a algoritmului sift-down. Fie m numarul
maxim de repetari al acestei bucle, cauzat de apelul lui sift-down(T, i), unde i este
fixat. Notam cu jt valoarea lui j dupa ce se executa atribuirea “j k” la a t-a repetare
a buclei. Evident, j1 = i. Daca 1 < t m, la sfarsitul celei de-a (t1)-a repetari a buclei,
avem j k si k 2j. In general, jt 2jt-1 pentru 1 < t m. Atunci,
n jm 2jm-1 4jm-2 … 2m-1i
Numarul total de executari ale buclei repeat la formarea unui heap este marginit
superior de
Demonstratia ultimei inegalitati rezulta din Exercitiul 5.26. Dar d = lg(n/2) implica
d1 lg n si d1 lg(n/8). Deci,
73
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Din () deducem ca n/23n repetari ale buclei repeat sunt suficiente pentru a
construi un heap, deci make-heap necesita un timp t O(n). Pe de alta parte, deoarece
orice algoritm pentru formarea unui heap trebuie sa utilizeze fiecare element din
tablou cel putin o data, t (n). Deci, t (n). Puteti compara acest timp cu timpul
necesar algoritmului slow-make-heap (Exercitiul 5.28).
Observam ca pentru a muta cele mai mici n discuri de pe tija i pe tija j (unde 1 i 3,
1 j 3, i j, n 1), transferam cele mai mici n1 discuri de pe tija i pe tija 6ij,
apoi transferam discul n de pe tija i pe tija j, iar apoi retransferam cele n1 discuri de
pe tija 6ij pe tija j. Cu alte cuvinte, reducem problema mutarii a n discuri la
problema mutarii a n1 discuri. Urmatoarea procedura descrie acest algoritm recursiv.
procedure Hanoi(n, i, j)
{muta cele mai mici n discuri de pe tija i pe tija j}
if n > 0 then Hanoi(n1, i, 6ij)
74
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Acest algoritm este optim, in sensul ca este imposibil sa mutam n discuri de pe o tija
pe alta cu mai putin de 2n1 operatii. Implementarea in oricare limbaj de programare
care admite exprimarea recursiva se poate face aproape in mod direct.
3.6.3.1 Metoda iteratiei
Cu putina experienta si intuitie, putem rezolva de multe ori astfel de recurente prin metoda
iteratiei: se executa primii pasi, se intuieste forma generala, iar apoi se demonstreaza prin
inductie matematica ca forma este corecta. Sa consideram de exemplu recurenta problemei
turnurilor din Hanoi. Pentru un anumit n > 1 obtinem t
succesiv t(n) = 2t(n1) 1 = 22t(n2) 2 1 = … = 2n-1t(1)
3.6.3.2 Inductia constructiva
Inductia matematica este folosita de obicei ca tehnica de demonstrare a unei asertiuni
deja enuntate. Vom vedea in aceasta sectiune ca inductia matematica poate fi utilizata
cu succes si in descoperirea enuntului asertiunii. Aplicand aceasta tehnica, putem
simultan sa demonstram o asertiune doar partial specificata si sa descoperim
specificatiile care lipsesc si datorita carora asertiunea este corecta. Vom vedea ca
aceasta tehnica a inductiei constructive este utila pentru rezolvarea anumitor recurente
care apar in contextul analizei algoritmilor. Incepem cu un exemplu.
75
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
f (n) = a(n1)2b(n1)cn = an2(1b2a)n(abc)
76
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
s := s + n MOD 10
n := n DIV 10
START
REPEAT
WRITE s;
STOP. Cit. s
S := 0
DA NU
Tip. S
S := S + n MOD 10
STOP
N := N DIV 10
Cit. n
77
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
READ nr
N := 1
J := 0;
DO
prim := true
78
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
FOR i := 2,
IF n MOD i = 0 THEN prim := false
ENDIF
REPEAT
IF prim THEN
WRITE n
j := j + 1
ENDIF
n := n + 1
UNTIL j = nr
STOP.
3) Se citeşte n, număr natural, să se descompună în
factori primi.
Algoritmul constă în următoarele:
se citeşte n;
se iniţializează ptrimul diviyor (i = 2);
secvenţa următoare se repetă până când n = 1;
se iniţializează fm cu 0 (factor de multiplicitate, arată
puterea la care se găseşte factorul prim);
atâta timp cât i îl divide pe n, se execută următoarele:
- se măreşte cu 12 factorul de multiplicitate;
- se împarte n la I;
dacă fm este diferit de 0 (deci s-a găsit divizor al lui n)
se tipăresc I şi fm;
se adun 1 la i (se incrementează).
Să presupunem că am citit n = 12. Algoritmul decurge astfel:
se iniţializează I cu 2;
se iniţializează fm cu 0;
întrucât 2 divide pe 12, fm va lua valoarea 1 iar n valoarea 6;
întrucât 2 divide pe 6, fm va lua valoarea 2 şi n valoarea 3;
n nu divide pe 3, deci se trece mai departe;
fm este diferit de 0, se tipăreşte 2 la puterea 2;
se măreşte i cu 1;
n nu este 1, deci secvenţa se reia;
fm va lua valoarea 0;
3 divide pe 3 (i divide pe n) deci fm va lua valoarea 1 şi n
va deveni 1;
3 nu divide 1, deci se trece mai departe;
fm este diferit de 0, deci se tiopăreşte 3 la pueterea 1;
i devine 4;
n este 1 şi algoritmul se încheie.
În continuare se prezintă schema logică şi algoritmul realizat în
pseudocod:
INTEGER n, i, fm;
READ n
i := 2;
DO
fm := 0;
WHILE n MOD i = 0
fm := fm + 1;
n := n DIV i
REPEAT
IF fm < > 0 THEN
WRITE I, ’la puterea’ fm
ENDIF
i := i + 1
UNTIL n = 1
STOP.
79
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
INTEGER n, i, s, p;
READ n
s := 0
p := 1
FOR i := 1, n
p := * i
s := s + p
REPEAT
WRITE s
STOP.
1, 4, 7, 10, 13, . . .
80
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
4. Limbaje de programare
81
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
În ce constă o descriere cu ajutorul diagramelor de sintaxă? Să presupunem că dorim să descriem riguros cum arată
un număr în baza 16. dacă folosim o descriere în genul un număr în baza 16 are în componenţa sa cifre şi litere,
cifrele pot fi de la 0 la 9 iar literele a,b,c,d,e,f,A,B,C,D,E,F şi dăm câteve exemple, nu suntem suficient de riguroşi.
Imediat pot apărea întrebări de genul: A reprezintă un număr în baza 16? Mai mult dacă dorim să facem un
program care să recunoască dacă un număr citit este sau nu în bază 16, situaţia se complică.
Se observă că o astfel de schemă are un nume(în cazul nostru cifra hexazecimală). Pentru a putea obţine o
cifră trebuie să urmez un drum prin acest desen(în matematică se numeşte graf orientat), de la intrare(din dreptul
numelui) până la ieşire, urmând sensul săgeţilor. Problema se poate pune şi invers: fiind dat un caracter oarecare să
se precizeze dacă este sau nu cifră. Caracterul este cifră dacă în diagrama prezentată există un drum care trece
printr-un cerculeţ ce reprezintă caracterul. Acum am definit riguros cifraÎn noua diagramă apare un dreptunghi în
care este scris cuvântul cifră. Dreptunghiul se utilizează atunci când se foloseşte o noţiune ce a fost definită printr-
o diagramă de sintaxă. Orice drum folosit în acest desen(de la intrare la ieţire) obţinem sau o cifră sau una din
literele care pot face parte din structura unui număr hexa:
82
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
83
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
4.2.2 Identificatori
Un identificator este o succesiune de litere sau cifre sau caracterul special’_’ din care primul caracter nu
poate fi cifră. Cu ajutorul identificaorilor se asociază nume constantelor, variabilelor, procedurilor etc.
Exemple de identificatori: a1, tasta, un_numar.
Exemple eronate: 4ar, mt& (primul începe cu o literă , al doilea conţine un caracter nepermis). O categorie
specială de identificatori este dată de cuvintele cheie ale limbajului(au un înţeles bine definit şi nu pot fi folosite în
alte context).
Acestea sunt:
AND,ARRAY,BEGIN,CASE,CONST,DIV,DO,DOWNTO,ELSE,END,FILE,FOR,FUNCTION,GOTO,IF,IN,LA
BEL,MOD,NILL,NOT,PROCEDURE,PROGRAM,RECORD,REPEAT,SET,OF,OR,ORIGIN,OTHERWISE,PA
CKED,THEN,TO,TYPE,UNTIL, VAR,WHILE,WITH.
Citiri, scrieri
Să analizăm programul de mai jos, care citeşte un număr întreg(pe care noi îl introducem de la tastatură)
şi îl tipăreşte:
program c1;
var a:integer;
begin
read(a);write(a)
end.
În cazul în care introducem numărul 10, calculatorul va tipării 10, dacă introducem 16, calculatorul va
tipării 16 ş.a.m.d.
Citirea datelor se face cu ajutorul procedurii READ şi READLN. În acest paragraf sunt prezentate aceste
proceduri într-o formă mult simplificată. Pentru amănunte, vezi fişier text. Procedura READ are forma
READ(var), unde var are semnificaţia de variabilă(variabile de tip boolean şi enumerare nu se citesc). Se citeşte de
la tastatură o dată care se depune în variabila var. Procedura READLN se foloseşte exact ca READ, cu deosebirea
că, după citire, cursorul sare pe linia următoare a ecranului.
Scrierea datelor se face cu ajutorul procedurii WRITE şi WRITELN. În ambele cazuri se scrie începând
cu poziţia curentă a cursorului pe ecran. Diferenţa între WRITE şi WRITELN este aceea că, după scriere, prin
utilizarea procedurii WRITE cursorul rămâne după ultimul caracter scris, iar prin utilizarea procedurii WRITELN
el sare pe prima poziţie a liniei următoare.
Exemple:
WRITE (a), unde a este o variabilă care conţine numărul 3 - scrie 3 începând din poziţia curentă a
cursorului.
WRITE (a,b), unde a şi b sunt variabile întregi care au conţinuturile 2, respectiv 3 - va avea ca efect
scrierea numărului 2 urmat de numărul 3 (apare 23).
WRITE (‘a=’,a) - are ca rezultat scrierea şirului de caractere ‘a=’urmat de data reţinută de variabila
întreagă a.
Presupunem că b este o variabilă reală (care reţine numere reale) şi conţine numărul 3.25 WRITELN
(b:4:2) va determina apariţia pe monitor a numărului 3.25. Cifra 4 are semnificaţia de număr total de poziţii pe care
să se scrie numărul real, iar cifra 2 numărul de poziţii pe care să se scrie partea zecimală (în absenţa acestor
parametri, data reală se va scrie într-o formă greu inteligibilă).În situaţia in care partea întreagă a datei reale nu
încape în formatul prestabilit, nu se mai ţine cont de acest format.
O utilizare specială o au instrucţiunile readln şi writeln fără parametri. Să analizăm programul de mai
jos.Acesta tipăreşte numărul 6 (se poate tipări un număr în acest mod). Observăm că programul se termină cu
instrucţiunea readln. Ce rol are ea? După ce un program îşi încheie execuţia, se revine în mod automat în mediul în
care se găseşte textul sursă. Rezultatele se pot vizualiza tastând ALT + F5. Pentru ca revenirea să nu se facă
automat (să avem timp să vedem rezultatul), vom utiliza instrucţiunea readln fără parametri. Efectul? Se va aştepta
să se tasteze Enter. În acest timp, avem posibilitatea să vedem ce s-a tipărit.
program c2
begin
writeln(6)
readln;
end.
Programul de mai jos tipăreşte numerele 6 şi 7. Între cele două numere există un rând liber. De ce? Pentru
că am utilizat writeln. Instrucţiunea writeln fără parametri are rolul de a determina saltul cursorului pe rândul
următor.
program c3;
begin
84
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
writeln(6);
writeln; {se sare un rând}
writeln (7)
end.
4.2.3 Constante
Constante
Constantele Pascal reprezintă valori care pot fi conţinute de un program scris în acest limbaj (nu sunt citite
de program). Ele folosesc în cadrul diverselor expresii (numerice, logice, şiruri de caractere) sau pentru scrierea
unor mesaje. Exemplu: În program trebuie realizată atribuirea y:=2*x+1. În acest caz, 2 şi 1 sunt constante.
Constantă întreagă
Constantă reală
Constantă
Sir caractere
Constantă simbolică
Constante întregi. Sunt alcătuite dintr-o submulţime a numerelor întregi care pot fi reprezentate în memoria
calculatorului.
Observaţie: Nu se pot reprezenta în calculator numere oricât de mari sau oricât de mici (orice număr ocupă
un spaţiu în memoria internă a calculatorului). Prin utilizarea limbajului Turbo Pascal se pot reprezenta numere
întregi cuprinse în intervalul [-2.147.483.648, 2.147.483.647].
Numerele se pot reprezenta în baza 10 sau în baza 16 (mai rar utilizată). Pentru baza 16, numărul este
precedat de caracterul special ‘$’.
Exemple: 32, -164, +131, $a1.
Cifră
Constantă
întreagă
Cifră
hexazecimală
Constante reale. Sunt alcătuite dintr-o submulţime a numerelor reale (mai precis a numerelor raţionale) care
pot fi reprezentate în calculator. Numerele se găsesc în intervalul [3.4*10-4932, 1,1*104932]. În locul virgulei se
foloseşte punctul Exemple: 2.34, -45.26, 512E+23, -45.1E-3.
Ultimele două numere folosesc o scriere neîntâlnită în matematică. Ele reprezintă numerele 512*1023 şi -
45.1*10-3.
Constantă
reală cifră cifră
cifră
Constante şir de caractere. După cum reiese şi din denumire, cu ajutorul lor se reprezintă şiruri de caractere.
Caracterele de şir pot fi specificate enumerându-le între apostrofuri sau se pot preciza prin codul lor ASCII,
precedat de caracterul #.
85
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
caracter
Sir
caracter
e Constantă
întreagă
Constante simbolice. Acestea sunt constante care au n program un anumit nume. Numele dat acestor
constante poate fi standard (de exemplu: false, true, maxint) sau dat de utilizator atunci când defineşte constantele.
Definirea constantelor simbolice precede definirea tupurilor utilizator şi se realizează astfel
const
identificator = expresie;
identificator = expresie;
Observaţie. Expresiile care intervin în definirea constantelor trebuie să poată fi evaluate la momentul
compilării programului.
Exemplu.
const NrMaxValori = 30;
Dim = NrMax Valori*2-1;
Mesaj = ‘Nu exista solutie’#10#13'
PI = 3.14;
Prin utilizarea constantelor simbolice, programatorul are posibilitatea de a asocia nume sugestive unor
valori, ceea ce măreşte considerabil lizibiltatea programului. În plus, în cazul în care o astfel de valoare trebuie
modificată (de exemplu: în cazul în care beneficiarului programului îşi schimbă cerinţele), actualizarea
programului se reduce doar la modificarea valorii din declaraţia constantei simbolice şi nu presupune înlocuirea
vechii valori din întreg programul.
86
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Spunem că variabilele au un tip standard dacă acesta este recunoscut de către compilator, fără a
fi definiti în prealabil de programator. Vom vedea ulterior că există posibilitatea ca programatorul
să-şi definească propriile tipuri, pentru ca apoi să declare variabile de tipul definit de el. Limbajul
Turbo Pascal conţine următoarele tipuri de standard:
1. tipuri întregi;
2. tipul caracter;
3. tipul logic;
4. tipuri reale.
Acestea vor fi studiate în continuare.
Tipuri întregi
Tipul shortint.
Mulţimea valorilor este dată de numerele întregi cuprinse între -128, 127. Pentru memorare, se
foloseşte un singur octet, iar un număr se memorează în cod complementar. Operaţiile sunt cele
de la tipul integer. Datele sunt memorate în cod complementar.
Tipul integer.
Mulţimea valorilor este dată de numerele întregi cuprinse între - 32768, 32767. Pentru memorare,
se folosesc doi octeţi, iar un număr se memorează în cod complementar. Datele sunt memorate
în cod complementar.
Tipul longint (întreg lung).
87
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Mulţimea valorilor este dată de numerele întregi cuprinse între -2l47483648 şi 2147483647.
Pentru memorare, se folosesc 4 octeţi iar un număr se memorează în cod complementar. Datele
sunt memorate în cod complementar.
Tipul byte.
Mulţimea valorilor este dată de numerele naturale cuprinse între 0 şi 255. Pentru memorare, se
foloseşte un octet, iar un număr se memorează în binar. Datele sunt memorate în binar.
Tipul word.
Mulţimea valorilor este dată de numerele naturale cuprinse între 0 şi 65535. Pentru memorare se
folosesc doi octeţi, iar un număr se memorează în binar. Datele sunt memorate în binar.
Declararea variabilelor de unul din tipurile întregi se face ca mai jos:
var a,b:integer;
c:word;
d,e,f:longint;
Variabilelor (operanzilor) de tip întreg li se pot aplica mai mulţi operatori.
Operanzilor de tip întreg li se pot aplica şi operatorii pe biţi (lucrează asupra biţilor din
reprezentarea internă a numărului). Aceştia sunt tot cei logici, dar acţionează de această dată
altfel.
Operatorul NOT.
Acţionează asupra variabilelor în felul următor:
toţi biţii care reţin 1, vor reţine 0;
toţi biţii care reţin 0, vor reţine 1.
Exemplu: O variabilă de tip byte a reţine valoarea 11110000. După atribuirea a:=not a; variabila a
va reţine valoarea 00001111.
Operatorul SHL.
Este binar (are doi operanzi).
Are rolul de a deplasa la stânga conţinutul biţilor primului operand cu un număr de poziţii dat de
al doilea operand. Conţinutul primilor biţi se pierde, iar ultimii biţi vor reţine 0.
Exemplu. O bariabilă de tip byte a reţine valoarea 10000110. După operaţia a shl 2; se obţine
00011000.
Observaţie. În cazul în care primul bit este 0, prin deplasare la stânga cu o poziţie (a shl 1)
valoarea se înmulţeşte cu 2.
Exemplu. O variabilă de tip byte a reţine valoarea 00000110(2)=6(10). După operaţia a shl 1; se
obţine valoarea 00001100(2) = 12(10).
Operatorul SHR.
Este binar şi are rolul de a deplasa la dreapta conţinutul biţilor primului operand cu un număr de
poziţii dat de al doilea operand. Conţinutul primilor biţi se pierde, iar ultimii biţi vor rămâne 0.
Exemplu. O variabilă de tip byte a reţine valoarea 10000110. După operaţia a shr 2; variabila a va
reţine valoarea 00100001.
Observaţie. Prin deplasare la dreapta cu o poziţie (a shr 1) se efectuează împărţirea întreagă la 2
(a div 2).
Exemplu. O variabilă de tip byte a reţine valoarea 00000110(2)=6(10). După atribuirea a:-a shr 1;
variabila a va reţine valoarea 00000011(2)=3(10).
Tipul caracter.
Calculatoarele nu lucrează numai cu numere. Ele reţin şi caractere. Din ce este alcătuită
mulţimea caracterelor?
Mulţimea caracterelor conţine:
literele mari şi mici ale alfabetului (a,b,...z, A,B,...Z);
cifrele sistemului zecimal (0,1,2,..9);
caractere speciale (!,$,%,?,. şi altele);
alte caractere.
În Turbo Pascal un caracter se notează între apostrofuri.
Exemple:’a’, ‘A’, ‘1’ (caracterul ‘1’ nu trebuie confundat cu numărul 1).
O variabilă de tip caracter reţine, la un moment dat, un singur caracter. Declaraţia unei variabile
de tip caracter se face ca în exemplul următor în care se declară două variabile a şi b de acest
tip:
Var a, b: char; (char înseamnă caracter).
Se citeşte variabila ch (de tip caracter) care, apoi, se tipăreşte. De asemenea se tipăreşte şi
caracterul 7. Cele două caractere sunt separate de un alt caracter şi anume caracterul spaţiu (şi
acesta este un caracter).
88
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
program c;
var ch: char;
begin
write(‘ch=’); readln (ch);
writeln (ch,’ ‘.’7')
end.
Tipuri reale
Variabilele de un tip real reţin numere cu zecimale. Exemple de astfel de numere: 6, 82, 9, 3, -8, 6.
În locul virgulei, în informatică se foloseşte punctul. Astfel, numerele de mai sus, vor fi
notate:6.82, 9.3, -8.6.
În Turbo Pascal există mai multe tipuri reale. O variabilă de un tip real reţine datele codificate în
virgulă mobilă (vezi anexa 2).
Tipul REAL.
Se reţin numerele reale care aparţin domeniului:
[-1,7*1038,-2,9*10-29] [2,9*10-29, 1,7*1038]
Tipul SINGLE.
Se reţin numere reale care aparţin domeniului:
[-3,4*1038,-1,5*10-45] [1.5*10-45, 3,4*1038]
89
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
însă înscris în forme diferite. Prima formă se numeşte formă normalizată sau formă ştiinţifică.
Pentru a regăsi numărul se procedează astfel: se înmulţeşte numărul aflat înaintea literei E cu 10
la puterea care este dată de numărul care urmează lui E (3.350...0x100 = 3.35).
Totuşi ne-am putea întreba care este logica faptului că există această formă (la prima vedere
chiar stupidă)? Trebuie ţinut seama de faptul că, în general, numerele reale nu se pot reţine
întotdeauna cu precizie în calculator (chiar numerele aflate între două valori). De exemplu, nu pot
fi reţinute cu precizie nici măcar numerele aflate între 1 şi 2. De ce? Fie numărul
1.6272625729383973235...9. Are prea multe zecimale. Există numere cu şirul zecimalelor infinit.
Atunci cum poate fi memorat un astfel de număr?
Se reţine o aproximaţie a sa. Acum putem răspunde la întrebare: forma normalizată tipăreşte
numărul cu precizia cu care a putut fi reţinut de calculator. Acesta este motivul existenţei sale.
Renunţând la ea, vom comanda calculatorului precizia cu care va fi tipărită valoarea respectivă.
Cum? Se poate utiliza formatul nr.:lg: zec, unde nr este numărul real pe care îl tipărim, lg este
numărul total de poziţii pe care se va tipări valoarea respectivă, iar zec reprezintă numărul de
zecimale care vor fi tipărite.
În program, am solicitat ca numărul să fie tipărit pe 3 poziţii din care ultimile două să fie
zecimale. S-a tipărit 3.35. Aţi observat, probabil, că numărul a fost tipărit pe 4 poziţii (şi punctul
ocupă o poziţie). Apare o neconcordanţă între cele afirmate. De ce?
Calculatorul va proceda astfel: va tipări întotdeauna numărul de zecimale cerut. În cazul în care
nu mai există poziţii care să permită tipărirea numărului întreg (ca în exemplu) nu se ţine cont de
lg. În cazul în care numărul poziţiilor pe care va fi tipărit numărul este mai mare decât cel
necesar, numărul va fi tipărit cu un număr de spaţii în faţă. Testaţi!
Tipul logic
Variabilele de acest tip pot reţine numai două valori: TRUE (adevărat) şi FALSE (fals). Pentru
declaraţie se foloseşte cuvântul boolean.
Reţinem următorul amănunt: conţinutul variabilelor de acest tip poate fi tipărit, dar nu poate fi
citit.
Tipuri ordinale
Am arătat că un tip de date conţine,în primul rând, o mulţime de valori(date).
Spunem că un tip de date este ordinal dacă:
datele pot fi ordonate (crescător);
fiecare dată din şirul ordonat al valorilor are:
o un succesor – valoarea care îl urează în şir (excepţie face ultima dată din şir);
o un predecesor – valoarea aflată imediat înainte în şirul ordonat (excepţie face prima
dată din şir).
Tipurile întregi sunt tipuri ordinale. Fie tipul integer ‚. Să considerăm o valoare a sa, numărul 123.
succesorul acestuia este numărul 124, iar predecesorul său este numărul 122. Evident, pentru fiecare valoare din şir
putem face un astfel de raţionament. De asemenea, pentru fiecare tip întreg (byte,longint etc.) se poate face un
astfel de raţionament.
Tipul caracter(char) este un tip ordinal. Am învăţat modul în care se memorează caracterele(pe un octet,
fiecare caracter se reprezintă printr-un număr natural, scris în baza 2, între 0 şi 255). Întrucât mulţimea numerelor
cu ajutorul cărora se memorează caracterele îndeplinesc condiţiile de mai sus, rezultă afirmaţia făcută. Exemplu.
Fie caracterul ’b’. Succesorul lui ’b’ este ’c’, iar predecesorul său este caracterul ’a’.
Tipul logic este un tip ordinal. Tipul logic are numai două valori true şi false. Este adevărată relaţia:
false<true. Prin urmare, succesorul valorii false este true, iar predecesorul valorii true este false.
Tipurile reale nu sunt tipuri ordinale. Evident, mulţimea valorilor acestui tip poate fi ordonată crescător. A
doua condiţie nu este îndeplinită. Să vedem de ce. Să considerăm o valoare oarecare(de exemplu, 0). Care este
valoarea reală care urmează şi este mai mare ? dacă veţi spune că această valoare este1, vă amintesc că este vorba
de valori reale (0<0.5<1). Atunci care? Orice valoare veţi găsi, vă arăt că există întotdeauna alta care este mai mare
ca 0 şi mai mică decât valoarea găsită de voi. Fie valoarea 0,00001. atunci găsesc valoarea 0,000001, care este mai
mică decât 0,00001 şi mai mare decât 0.
Pentru a obţine succesorul unei valori aparţinând unui tip ordinal se foloseşte funcţia succ cu forma
generală:
90
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
SUCC(valoare)
Pentru a obţine predecesorul unei valori aparţinând unui tip ordinal se foloseşte funcţia pred cu forma
generală:
PRED(valoare)
Analizaţi şi rulaţi programul de mai jos:
program ordinal1;
var a:integer;b:char;
begin
a:=0;
writeln(succ(a)); writeln(pred(a));
b:=’b’;
writeln(succ(b)); writeln(succ(a));
writeln(succ(false)); writeln(pred(true));
end.
O întrebare posibilă: care este succesorul celei mai mari valori din şir şi care este predecesorul celei mai
mici valori din şir? Răspunsul la această întrebare diferă în funcţie de tipul ordinal şi chiar de varianta
compilatorului.
De exemplu pentru tipul integer avem:
succ(32767)=-32768;
pred(-32768)= 32767.
Pentru tipul boolean avem:
succ(true)= true;
pred(false)=true.
Concluzia? În mod normal nu are sens problema pusă (oricum, este absurd să căutăm succesorul celei mai
mari valori din şir, la fel cum este absurd să căutăm predecesorul celei mai mici valori). Din acest motiv,
rezultatele prezentate nu sunt coerente.
Funcţia ord returnează numărul asociat unei valori a unui tip ordinal oarecare şi are forma generalăl:
ORD(valoare)
Ce înţelegem prin numărul asociat unei valori a unui tip ordinal? Răspunsul este diferenţiat de la un tip
ordinal la altul.
pentru o valoare care aparţine unuia din tipurile întregi, funcţia ord returnează chiar numărul.
Astfel, ord(6)=6, rod(-5)=-5.
pentru o valoare care aparţine tipului char, funcţia ord returnează codul caracterului respectiv.
În cazul tipului boolean funcţia ord returnează următoarele valori:
o 0, pentru false;
o 1, pentru true.
Convingeţi-vă de cele prezentate rulând programul de mai jos:
program ordin;
var a:integer;
b:char;
begin
a:= -13;b;= ’a’;
writeln(ord(a));writeln(ord(b));
writeln(ord(false));writeln(ord(true));
end.
91
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
A fost prevazut în limbaj în ideea de a scrie programe clare(care să fie uşor înţelese de o persoană care le
analizează). Ce-i drept, se pot scrie toate genurile de programe şi fără a-l folosi. toate genurile de programe şi fără
a-l folosi.
Un tip ordinal, se se defineşte prin scrierea mulţimilor din care este alcătuit. Numele valorilor pot fi
formate din litere şi cifre, dar orice nume trebuie să înceapă cu o literă.
În programul următor definim tipul timp. Acesta este format din 4 valori numite: dimineaţa, prânz, seara şi
noaptea. Tot aici, am declarat o variabilă de tip timp, căreia i-am atribuit o valoare.
program ordinal3;
type timp= (dimineaţa, prânz, seara, noaptea);
var a:timp;
begin
a:= dimineaţa;
end.
Observaţii:
Valorile unui tip enumerare nu se citesc şi nu se tipăresc.
Ordinul primei valori din şir este 0, următoarea valoare din şir are ordinul 1, următoarea are
ordinul 2 ş.a.m.d.
Tipul subdomeniu. Fiind dat un tip ordinal – numit tip părinte, putem construi un alt tip ordinal numit tip
subdomeniu al părintelui. Tipul subdomeniu conţine o submulţime de valori consecutive(în şirul crescător al
valorilor tipului părinte). Precizarea valorilor tipului subdomeniu se face după formatul următor:
valoare1..valoare2
unde:
valoarea1 reprezintă prima valoare din submulţime(cu ordinul cel mai mic);
valoarea2 reprezintă a doua valoare din submulţime(cu ordinul cel mai mare);
În programul de mai jos am definit următoarele tipuri de subdomeniu:
TreiValori – subdomeniu al tipului enumerare Valori (definit mai sus) care conţine valorile
a,b,c;
CifreNenule – subdomeniu al unui tip întreg şi conţine numerele naturale 1,2…9;
Litere – subdomeniu al tipului char şi conţine caracterele ‘c’,’d’,…,’k’.
De asemenea , am declarat câteva variabile din fiecare tip şi i-am atribuit câte o valoare a tipului respectiv.
program test;
type Valori =(a,b,c,d);
TreiValori= a..c;
CifreNenule =1..9;
Litere = ‘c’..’k’;
var x: TreiVAlori; z: CifreNenule; z: Litere;
i: integer;
begin
i:=9;y:= i;z:= ‘e’; x:= b
end.
Observaţie. În cazul unui tip subdomeniu, ordinul oricărei valori este acelaşi cu ordinul în tipul părinte. Să
analizăm programul de mai jos:
program test;
type Litere = (a,b,c,d);
Lit = b..d;
var l:Lit;
begin
1:= b;
writeln(ord(1));
end.
Tipul Lit este un tip subdomeniu al tipului Litere. Ordinul valorii b este 1(acesta este ordinul ei din tipul
Litere.
4.2.5 Variabile
Variabile. Declararea variabilelor
92
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prin variabila se intelege o informatie (o data) a carei valoare se poate modifica pe parcursul executiei
unui program. Fiecarei variabile i se asociaza un identificator. Multimea de valori pe care o poate lua acea
variabila reprezinta tipul acelei variabile. O variabila se declara astfel: var identif_var : identif_de_tip;.
Cand avem mai multe variabile de acelasi tip, putem scrie: var v_1, v_2, v_3: tip;, iar cand avem si tipuri
mai multe, vom scrie ceva de genul:
VA identificator : tip ;
R
:
Atentie! In limbajul Pascal trebuie sa se declare toate variabilele si inainte de a fi folosite (in textul
programului). Exista cazuri cand variabilele pot fi declarate in unituri utilizate de un program, dupa cum veti
invata mai tarziu, in clasa a-X-a.
Fiecarei variabile declarate in program i se aloca un spatiu de memorie, dependent de tipul ei. Aceasta
alocare se face odata cu compilarea programului.
Cand am vorbit despre tipuri de date standard simple am dat exemple de declaratii de variabile.
93
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Operatorii logici sunt not (negare), and (si), or (sau), xor (sau exclusiv). Cu exceptia operatorului not
care este unar,restul operatorilor sunt binari. Operanziipot fi de tip logic real sau intreg. In acest capitol
vom considera numai operanzide tip logic; in acest caz rezultatul va fi intotdeauna o valoare de tip
logic(true sau false).
Operatorul not (negare). Modul de actiune se poate observa mai jos.
Not (True) =False;
Not (False)=True;
Operatorul and (si).Regula de obtinerea rezultatului este: rezultatul este true
numai daca ambii operanzi au valoarea True (altfel rezultatul este false).
Operatorul or (sau).Regula: daca unul dintre operanzi este true ,rezultatul va fi
true, altfel va fi false.
Operatorul xor (sau exclusiv). Regula: daca argumentele sunt diferite rezultatul
este true, contrar el este false.
Prioritatea operatorilor
Operatorii au o anumita prioritate. De exemplu. Operatorul de inmultire are o prioritate mai mare decat
cel de adunare. Aceasta inseamna ca se executa intai inmultirea, apoi adunarea. Operatoriisunt
impartiti in 4 grupe,dupa priorutate. Astfel, operatoriidin grupa 1 au prioritatea cea mai mare,urmeaza
operatorii din grupa 2, grupa 3,iar la sfarsit cei din grupa 4. Iata cele 4 grupe de prioritate:
Grupa 1 (operatori unari- prioritate maxima): not, + (operator unar) , -
(operator unar);
Grupa 2 (operatori multiplicativi): and,*,/,div,mod;
Grupa 3 (operatori aditivi): or,xor,+,-;
Grupa 4 (operatori relationali- prioritate minima): <,<=,>,>=,=.
94
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Aceasta nu înseamnă că este bine să procedăm astfel. Să ne imaginăm că avem în faţă un program
mare scris aşa. El poate fi rulat, dar care programator va mai înţelege ceva, dacă îl priveşte?
Observaţie 3. Versiunea Borland a limbajului permite ca secvenţa program nume să lipsească. De
exemplu putem scrie şi aşa:
begin
end.
Dacă suntem ordonaţi nu procedăm astfel. Un program scris în Pascal (oricât de complex ar fi) are
structura următoare:
program nume;
definiţii de constante;
definiţii de tipuri;
declaraţii de variabile;
declaraţii de subprograme;
begin
instrucţiuni
end.
Nu este obligatoriu ca într-un program să figureze toate acestea, dar dacă figurează, trebuie să apară în
această ordine.
4.2.8 Comentarii
Separatori şi comentarii. Cele mai simple elemente alcătuite din caractere cu semnificaţie
lingvistică poartă denumirea de unităţi lexicale. Acestea se repetă între ele, după caz, prin unul sau mai
multe blancuri, caracterul CR, sfârşit de linie sau caracterul ’;’. Pentru ca un program să fie uşor de
înţeles se folosesc comentariile. Acestea se plasează oriunde în program. Un comentariu poate fi scris
în două feluri:
între acolade, exemplu: {un comentariu}
între paranteze rotunde urmate de *, exemplu (*un comentariu*).
4.2.9 Expresii
<expresie>::=<operand>|<operator_unar><expresie>|
<expresie><operator_binar><expresie>
Clase de precedenta a operatorilor:
1. Operatorii unari + si -
2. Operatorul unar NOT
3. * DIV / MOD AND SHR SHL
4. + - OR XOR * (intersectie) + (reuniune) - (diferenta)
5. < <= > >= = <> IN
O expresie este fie o constanta, fie o variabila, fie un apel de functie, fie o combinatie
corecta (din punct de vedere sintactic) de expresii mai simple.
“Combinarea” se realizeaza cu ajutorul operatorilor. Elementele care se combina se
numesc operanzi. In general, se lucreaza cu expresii algebrice, in care regulile de formare sunt
aceleasi ca si in matematica, insa, dupa cum am mai spus, expresiile se scriu liniarizat. Pot
exista,de asemenea,si expresii nenumerice,cum ar fi de pilda:’Turbo’+’Pascal’,aici simbolul +
reprezentand alipirea (concatenarea) celor doua siruri de caractere.Rezultatul este sirul
‘TurboPascal’.
95
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prioritate Operator
Atentie! O alta eroare ce poate surveni in scrierea unei expresii este urmatoarea: daca a, b
si c sunt valori intregi, de pilda, expresia (a>b) and (b<c) nu este echivalenta cu expresia a>b
and b<c, deoarece aceasta din urma este incorecta, fiindca mai intai se efectueaza operatia pe
biti: b and b si expresia isi pierde sensul!
expresie
+
termen
factor operator multiplicativ
factor
Un factor este fie un numar fara semn, fie o constanta sau o variabila, fie un identificator
de functie avand ca argument o alta expresie (intre paranteze), fie un alt factor precedat de
operatorul unar NOT.
Erori frecvente in scrierea expresiilor
96
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Tipul expresiilor
4.2.10 Atribuirea
Sintaxa instructiunii de atribuire
LIMBAJUL PASCAL
id_variabila:=valoare/expresie;
Precizare: Tipul variabilei trebuie sa coincida
cu tipul valorii/expresiei.
Prin operatia de atribuire se retine o anumita data dintr-o variabila. Ea are mai multe forme ,pe
care le vom prezenta pe rand.
Forma1.
V:=data
Semnificatia este urmatoarea:
V este numele unei variabile de un tip oarecare;
:= notatia pentru operatia de atribuire;
data – o valoare de un tip oareacare.
Cu o singura exceptie ,tipul variabileitrebie sa coincida cu tipul valorii atribuite. Exceptia este
urmatoarea: unei variabile de tip real i se poate atribui o data de tip intreg.
Real d;
D:=7;
Forma 2
V1:=v2; unde v1 si v2sunt nume de variabile. Cu o exceptie , tipul celor doua variabile
trebuie dsa coincida. Efectul este ca variabila v1 va retine continutul variabilei v2. Dupa aplicarea
acestei operatii,continutul variabilei v2 ramane nemodificat, iar continutul variabilei v2 se pierde.
Observatie: Nu este indiferentmodul de scriere a variabilelor in cadrul atribuirii. Atribuirea a:=b
nu este identica cu b:=a. Este adevarat ca , dupa atribuire ,cele doua variabile vor avea acelasi continut.
Insa este important ce continut( al lui b dupa prima atribuire, al lui a dupa a doua).
Forma 3
V:=expresie;
97
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Initial se evalueaza expresia, iar valoarea obtinuta este atribuita variabilei v. Consideram ca daca
cel putin unul din operanzi este real, tipul expresiei este real si poate fi atribuit doar unei variabile de
tip real,iardaca toti operanzii sunt intregi, tipul expresiei este intreg si poate fi atribuit unei variabile de
tip intreg sau real. Facem conventia ca operatorul da intot deauna un rezultat de tip real,chiar daca
ambii operanzi sunt intregi.
Exemplu: Fie c o variabila de tip integer care retine numarul 4 si d o variabila de tip real care
contine numarul 7.3. Efectuam atribuirea d:=c+1. Dupa atribuire continutul lor va fi: c=4;d=5.
Explicatie: Am vazut ca este posibil ca unei variabile de tip real sa-i atribuim o valoare
intreaga. Este normal sa fie asa pentru ca multimea numerelor intregi este submultome a numerelor
reale.
Exista multe moduri in care putem gresi atunci cand acriem o instructiune de atribuire. Vom
incerca totusi o sistematizare a erorilor.
Eroare 1.Gresim scierea expresiei.
Orice atribuire contine o expresie (fie ea si redusa la un singur operand). Evident, daca nu am scris
corect expresia , nici atribuirea nu se poate efectua. Exemplu: Fie a o variabila de tip integer. Scriem
atribuirea; a:=1+3(4+5). Expresia este gresita (lipseste operatorul de inmultire ). Prin urmare,atribuirea
este imposibila. Corect este a:=1+3*(4+5).
Eroare 2.Tipul variabilei nu coincide cu tipul expresiei, chiar daca expresia este scrisa
corect.Erorile de acest tip apar foarte des.
Fie atribuirea c:=9,unde c este o valoare de tip string.
La ce foloseste atribuirea ? Atribuirea are un rol urias in programare. Sa inceracam o sistematizare
a cazurilor cand folosim atribuirea.
o Intializari.
Stabilirea valorilor cu care anumite variabile intra in calcule se numeste initializare. Initializarile se
fac cu ajutorul instructiunii de atribuire.
o Calcule.
Majoritatea programelor efectueaza calcule. In afara tiparirii imediate a rezultatului evaluarii unei
expresii, exista si posibilitatea dca acesta sa fie pastrata intr-o variabila. In astfel de cazuri se foloseste
operatia de atribuire. Exista doua forme in care atribuirea intervine in calcule.
Forma directa. Unei variabile i se atribuie o expresie cu operanzivariabile, constante, altii
decat variabila care va retine rezultatul. Dupa atribuire, toti operanzii raman nemodificati.
Exemplu: Fie a, b, c trei variabile de tip integer, care contin, respectiv, valorile 2, 3, 4. Se
efectueaza atribuirea a:=b*c. Inurma atribuirii, continutul celor trei variabile devine: a=12, b=3, c=4.
Forma indirecta. Unei variabile i se atribuie o expresie cu operanzi variabile, constante, in
care intra si valoarea pe care o retine variabila careia i se face atribuirea. Revenim la exemplul
anterior (aceleasi variabile cu aceleasi valori initiale). Efectuam atribuirea a:=a+b*c. Iata ce retin cele
trei variabile: a=14, b=3, c=4.
o Copiere. De multe ori, este necesar ca o valoare retinuta de o variabila sa fie retinuta si de alta. O
simpla operatie de atribuire ne rezolva problema de mai sus. De exemplu, daca x si y sunt douia variabile de tip real
care retin doua valori oarecare, is dorim ca variabila x sa retina valoarea pe careo retine y, efectuam atribuirea x:=y.
Atentie! Dupa atribuire, continutul variabilei ramane neschimbat.
98
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Un caz particular, dar des intalnit in programare este interschimbarea continutului a doua variabile
(evident de acelasi tip).
Fie variabila de tip integer x care retine valoare 1 si variabila de tip integer y care retine valoarea 2.
Dorim sa inversam continutul celor doua variabile, adica x sa retina 2 si y sa retina 1. Se cere ca
secventa sa ramana valabila indiferent ce valori ar retine x si y.
Pentru rezolvare, folosim si o alta variabila pe care o notam m. Ea are rolul unei variabile
auxiliare (nu se foloseste decat ca sa realizam interschimbul de valori). Iata pasii de lucru:
Variabila m va prelua valoarea retinuta de y; m:=y;
Y va prelua valoarea retinuta de x; y:=x;
X va prelua valoarea retinuta de m; x:=m.
program CalculArie;
const pi=3.1415926;
var raza, aria: Real;
begin
raza:=2;
aria:=pi*Sqr(raza;
end.
El are doua parti: primele trei randuri reprezinta zona declaratiilor, iar instructiunile dintre
begin si end. zona actiunilor, adica partea operativa.
Daca pornim in executie acest program (in mediul Turbo Pascal), vom observa ca palpaie
putin ecranul, dar nu se intampla nimic. E si normal. Calculatorul a atribuit valoarea 2 variabilei raza.
A calculat aria (obtinand o anumita valoare) si gata. Noi nu am precizat prin nimic sa ni se comunice
rezultatul. De aceea va trebui sa folosim o procedura de extragere a datelor, de scriere a lor pe ecran.
Dar, chiar daca am dispune de o asemenea procedura, rezultatul programului ar fi acelasi la
orice executare a sa. De aceea, ar fi bine sa putem introduce de la tastatura raze de diferite valorui; deci
am avea nevoie de o procedura de citire a datelor. Aceste proceduri exista in limbajul Pascal:
ReadLn (v1, v2, . . . , vn) – citeste variabilele v1, . . . , vn, introduse de la tastatura. Variabilele
pot fi de orice tip invatat pana acum, mai putin Boolean sau un tip enumerare (sau un subdomeniu
al unui astfel de tip). Introducerea mai multor variabile se poate face daca acestea se separa prin
spatii sau <Enter>. La sfarsit trebuie apasata tasta <Enter>. Cursorul trece pe randul urmator.
Procedura ReadLn va citi si sfarsitul de linie (caracterul Enter).
Read(v1, v2, . . . , vn) – la fel ca ReadLn, doar ca nu citeste sfarsitul de linie.
Atentie! Datele citite se depun, de fapt, intr-o zona tampon, inainte de a fi date variabilelor.
Aceasta zona tampon se goleste cand apare ReadLn. De aceea, un apel simplu ReadLn (fara
argumente) va avea drept efect golirea acestei zone tampon. Astfel, apelul ReadLn (x, y, . . . ) este
echivalent cu secventa Read (x, y, . . . ); ReadLn.
Daca variabilele ar fi avut alte valori inaintea apelului procedurii de citire, ele se pierd.
Valorile citite ale acestor variabile raman neschimbate pana la rpima atribuire sau (re)citire a lor.
99
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Write(e1,e2, . . .,en) – evalueaza si apoi afiseaza valorile expresiilor e1, e2, . . ., en. Expresiile
pot fi inclusiv de tipul Boolean, caz in care se afiseaza unul din cele doua cuvinte (False sau True),
dar nu pot fi de tip enumerare. Dupa afisarea valorilor unor expresii, acestea nu se pierd si nici nu
se schimba.
WriteLn(e1,e2, . . .,en) – face acelasi lucru, dar la sfarsitul intregii afisari, muta cursorul pe
randul urmator. De exemplu, pentru a citi raza vom scrie: ReadLn(raza), iar, dupa calculul ariei,
aceasta se afiseaza prin: Write(aria). Putem scrie direct Write(pi*Sqr(raza)), efectul fiind acelasi.
Observatie
Exemple:
Fie declaratiile de variabile: var a: Integer; s: String;. Fie urmatoarea secventa de program:
a:=20; ReadLn(a,s); WriteLn(a,s); Write(s+’s’); in cazul introducerii valorilor 3 si alfa, se realizeaza
urmatoarele: a primeste valoarea 20; dupa citire, a isi pierde valoarea initiala (20) si devine 3.
Erori frecvente:
Unii incepatori sau cunoscatori ai limbajului BASIC cred ca se poate face o citire in felul
urmator: ReadLn(‘Dati n=”,n); iar altii nu sesizeaza diferenta intre un sir si valoarea identificatorului
corespunzator: ReadLn(‘n’).
Sa rescriem programul nostru folosind noile proceduri invatate:
program CalculArie;
const pi=3.1415926;
var raza, aria: Real;
begin
ReadLn(raza);
aria:=pi*Sqr(raza;
WriteLn(aria)
end.
Atentie! Daca se afiseaza un numar intreg sau un sir de caractere, n trebuie sa lipseasca.
Cu aceasta inlocuire programul devine mai “bun”, dar tot nu satisface urmatoarele cerinte:
sa se ceara explicit sa introducem raza;
100
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
program CalculArie;
{ acest program calculeaza aria unui cerc in functie de raza sa }
const pi=3.1415926;
var raza, aria: Real;
begin
WriteLn(‘Program de calculat aria cercului’);
WriteLn(‘********************************’);
Write(‘Dati raza=’);ReadLn(raza);
aria:=pi*Sqr(raza);
WriteLn(‘Aria este=’, aria:7:3)
end.
Acum lucrurile stau mai bine, insa ne mai deranjeaza doua lucruri:
trebuie sa apasam Alt-F5 pentru a vedea rezultatul programului;
raman pe ecran “urme” care deranjeaza, de la executia programelor anterioare.
Pentru a solutiona prima problema se va folosi un apel al procedurii ReadLn fara parametri,
inainte de instructiunea end finala. Aceasta instructiune va astepta sa apasam Enter, apoi va reveni in
mediul Turbo Pascal.
Observatie
Limbajul Pascal dispune de functia EoLn care testeaza daca s-a ajuns la citirea sfarsitului de
linie, caz in care returneaza True, sau nu, cind returneaza False. O astfel de functie se poate folosi
atunci cand se doreste prelucrarea de linii de caractere, cu dimensiuni variabile.
Program demonstrativ
Sa se citeasca mai multe linii de caractere de la tastatura si sa se afiseze fiecare linie, inlocuind
caracterele mici cu majusculele corespunzatoare. Prelucrarea se va incheia la aparitia caracterului ‘$’.
Pentru a transforma literele mici in litere mari se va folosi functia UpCase.
Program ConversieMinusculeMajuscule;
Var linie_vida,gata: Boolean; c:Char;
begin
Gata:=False;
While not gata do
begin
Write(‘Dati linia: ‘);
While not EoLn do
begin
Read(c);Write(UpCase(c));
linie_vida:=False;
if c=’$’ then gata:=True
end;
if linie_vida then WriteLn(‘Linia este vida!’)
else WriteLn
end.
Notiuni introductive
Inainte de a incepe prezentarea instructiunilor acestui limbaj , amintim conditiile in care a fost elaborat.
Limbajul a fost conceput special pentru scrierea de programe structurate
101
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Din acest motiv instructiunile reproduc structurile fundamentale ale programarii structurate.Exista si o exceptie si
anume intructiunea GO TO .
Motivul includerii acesteia in setul de instructiuni ale limbajului este acela de a permite programatorilor obisnuiti
sa lucreze nestructurat , folosirea acestui limbaj a fost introdusa pentru a permite programatorilor sa scrie programe
BASIC in PASCAL.
De atribuire
IF
Compusa
Vida
CASE
WHILE
REPEAT
FOR
WITH
Procedurala
1. Din fericire , autorul limbajului este de formatie matematician , fapt ce a permis sa realizeze
urmatoarele:
Instructiunea vida
Din punct de vedere sintactic , intructiunea vida nu este formata din nici un element iar din punct de vedere
semantic , nu are nici un efect.
Rolul sau este foarte mare , in special cand instructiunea vida este subordonata altor instructiuni .
Sa analizam programul urmator:
Program nimic;
Begin
;
;
end.
Desi nu face nimic ,programul este corect sintactic , adica nu da eroare la compilare pentru ca
intructiunile sunt separate prin caracterul “;” .
Instructiunea de atribuire
102
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
i:=i+a unde i este variabila de tip integer iar a de tip real.In acest caz expresia este de tip real iar variabila i este de
tip integer. La compilare apare un mesaj de eroare (type mismatch).
i:=i/2 unde i:integer .
Cu toate ca rezultatul ar putea fi de tip integer daca i este par , forma nu este permisa pentru ca
expresia este de tip real. Corect ar fi trebuit scris i:=i div 2.
In diagrama de sintaxa prezentata mai jos , apare si indentificatorul de functie. Astfel de atribuiri vor fi prezentate
in capitolul care trateaza subprogramele PASCAL.
IDENTIFICATOR
(VARIABILA)
INSTRUCTIUNE EXPRESIE
:
DE ATRIBUIRE
=
IDENTIFICATOR
(FUNCTIE)
Exemplul 1. Programul p1 interschimba continutul a doua variabile care au fost citite . La sfarsit , se afiseaza
noul continut al variabilelor.
Program p1;
Var a,b,c:integer;
Begin
Write(‘a=’);readln(a);
Write(‘b=’);readln(b);
c:=a;
a:=b;
b:=c;
writeln(‘a=’,a);
writeln(‘b=’,b);
end.
Exemplul 2:
Se citesc doua valori intregi a,b.Se cere sa se afiseze media lor aritmetica .
Program media ;
Var a,b:integer;
medie:real;
Begin
Write(‘a=’);readln(a);
Write (‘b=);readln(b);
medie:=(a+b)/2;
writeln(‘media este’,medie:5:2);
end.
Exemplul 3.Se citesc trei numere naturale .Se cere sa se afiseze primul numar ,suma dintre primul si al
doilea,suma primelor trei numere.
Program suma;
Var s,nr:integer;
Begin
s:=0;
Write(‘dati numarul’);
Redln (nr);
s:=s+nr;
writeln (s);
103
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
write(‘dati numarul’);
readln (nr);
s:=s+nr; writeln(s);
write(‘dati numarul’);
readln (nr);
s:=s+nr; writeln (s);
end.
Aceasta instructiune corespunde structurii alternative.Instructiunea IF are doua forme: IF THEN ELSE si IF
THEN.Instructiunea se scrie astfel:
IF “expresie logica” THEN “instructiune 1”
ELSE “instructiune2”
Principiul de executie este urmatorul:
se evalueaza expresia logica;
daca aceasta ia valoarea TRUE se executa instructiunea plasata dupa THEN , in caz contrar se executa
instructiunea plasata dupa ELSE.
Atentie:
Atat dupa THEN cat si dupa ELSE avem voie sa punem doar o singura instructiune.
IF “expresie logica”THEN”instructiune”
Principiul de executie este urmatorul:
se evalueaza expresia logica;
in situatia in care aceasta are valoarea TRUE se executa instructiune aflata dupa THEN , in caz contrar se
trece la instructiunea urmatoare.
Iata si diagrama de sintaxa care defineste instructiune IF :
Else INSTRUCTIUNE
104
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Read a;
Read b;
If a>b then write a
Else write b
Endif
In primul rand, se evalueaza expresia logica. In exemplul nostru ea este a>b. In cazul in care numarul retinut
de variabila a este mai mare decat cel retinut de variabila b, expresia logica ia valoarea true si setipareste a.
Contrar, expresia logica ia valoarea false si se tipareste b.
Avem posibilitatea ca una sau ambele operatii subordonate operatiei if sa fie tot operatie (operatii if) if.
Exemplu: se citesc 4 valori reale a, b, c, d. Sa se evalueze expresia:
a+b, c+d>0
E= a-b, c+d=0
a*b, c+d<0
Exemplu numeric. Fie a=1, b=2, c=3, d=4. Avem c+d=7>0, rezulta ca se va tipari a+b=1+2=3. Analizati
algoritmul care urmeaza:
Real a, b, c, d, rez;
Read a, b, c, d
If c+d>0 then rez:=a+b
Else if c+d=0 then rez:=a-b
Else rez:=a*b
Endif
Endif
Write rez
Daca suma c+d nu este mai mare decat 0, rezulta ca este mai mica sau egala cu 0. Din caest motiv,clauza else
a primului if va contine o alta operatie if in urma careia se va decide daca c+d=o sau c+d<0 (pentru care nu
mai facem testul c+d<0).
O problema interesanta este si aceasta: daca algoritmul impune ca instructiunea care urmeaza cuvantului cheie
then, sau cea care urmeaza cuvantului cheie else sa lipseasca –cum procedam?
Principiul de executie:
Se evalueaza expresia logica;
In cazul in care acesta are valoarea true, se executa operatia aflata dupa then, altfel se trece la operatia
urmatoare.
Exemplu. Se citeste o valoare intreaga. In cazul in acre aceasta este para( se imparte exact la 2) se va citi
mesajul “am citit un numar par”. Altfel, programul nu va da nici un mesaj.
Integer nr;
Read nr;
If nr mod 2=0 then write(‘am citi un numar par’)
Endif
Cum putem gresi?
O eroare des intalnita este asa numita eroare a testului inutil. Reluam exemplul in care evaluam expresia:
a+b, c+d>0
E= a-b, c+d=0
a*b, c+d<0
Unii scriu instructiunea if (corespunzatoare) astfel:
If c+d>0 then rez:=a+b:5
Else if c+d=0 then rez:=a-b
Else if c+d<0 then rez:=a*b
Endif
Endif
105
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Endif
Daca c+d>0 nu este adevarat, inseamna ca este mai mic sau egal cu 0, si daca nu este 0, este in mod sigur
strict mai mic decat 0. Nu are rost sa facem un test suplimentar. Calculatorul nu gandeste, il face, programul
functioneaza corect, dar se pierde timp inutil de calcul.
Am lasat in mod intentionat la sfarsit erorile care apar in scrierea expresiilor logice. De multe ori se greseste
in scrierea expresiilor logice care contin operatori relationali si operatorul logic not.
Exemple. Fie expresia logica a>b. Cum o negam? Daca scriem not a>b nu este corect. De ce? Operatorul not
are cea mai mare prioritate. Prin urmare, se va evalua mai intai not a, apoi se va face comparatia. Corect se
scrie not(a>b) ( es compara a cu b, se obtine true sau false, iar rezultatul se neaga).
Fie x si y doua variabile logice. Avem formulele(de Morgan):
not (x or y)=not x and not y
not (x and y)=not x or not y
Demonstram prima formula:
daca x=false,y=false → x or y= false →not(x or y)=true; tot asa not x=true, not y=true, not x and not y=true
daca x=false, y=true →x or y=true →not(x or y)=false; tot asa not x=true, not y=false →not x and not
y=false
daca x=true ,y=false →x or y= true →not ( x or y)=false; tot asa not x=false, not y=true →not x and not
y=false
daca x=true, y=true →x or y=true →not (x or y)=false; tot asa not x=false, not y=false →not x and not
y=false
Sa presupunem ca ne intereseaza sa es execute o operatie atunci cand la citirea a doua valori intregi a si b nu
sunt amandoua strict pozitive.
Corect este: not((a>0) and (b>0)). Dar tot corect este su asa: not(a>0) or not(b<0)
E:=a+b
E=:a*b
E:=a-b
c>0,c=0,c<0
Programul p3, care rezolva aceasta problema,exemplifica folosirea unei instructiuni IF,plasata in corpul unei alte
instructiuni IF.
Program p3 ;
Var a,b,c,e :real;
Begin
Write(‘a=’);readln (a);
Write (‘b=’);readln (b);
Write(‘c=’);readln (c);
If c>0 then e:=a+b
Else if c=0 then e:=a*b
Else e:=a-b;
Writeln(‘e=’,e:3:2);
End.
Exemplul 3.Se citeste o valoare intreaga.In cazul in care aceasta este para (se imparte exact la 2),se va afisa
mesajul”am citit un nr.par”.altfel programul nu va da nici un mesaj.
Program if2
Var nr:integer;
106
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Begin
Write (‘nr=’);readln (nr);
If nr mod 2=0
Then writeln (‘am citit un nr par’);
End.
107
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Observatie: orice program PASCAL are cel putin o instructiune compusa (incepe prin BEGIN si se termina prin
END).
Instructinea vida nu este vizibila in program .Totusi, prin faptul ca este admisa ca instructiune, apar multe
avantaje cum ar fi:
in cadrul instructiunii compuse, inte ultima instructiune si blocul END, sintaxa cere sa nu se puna
separatorul ‘;’.De multe ori ,din obisnuinta, programatorii pun chiar si in acest caz semnul ‘;’.
Compilatorul nu semnaleaza acest fapt ca eroare, intrucat se presupune ca intre separator si END se
gaseste instructiunea vida;
Observatii:
Constantele trebuie sa fie distincte;
Pot exista cel mult 255 constante;
Exemplu:Programul care urmeaza probeaza instructiunea case.
Program c1;
Var I:integer;
Begin
Write (‘I=’);readln(I);
Case I of
1: writeln(‘am citit 1’);
2, 3: writeln(‘am citit 2 sau 3’);
else writeln(‘am citit altceva’)
end;
end.
4.2.12.3 Instructiuni repetitive
Instructiunea WHILE
108
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Aceasta instructiune reproduce structura de tip WHILE DO. Forma generala este :WHILE expresie logica
DO instructiune.Principiul de executie este urmatorul :
Se evalueaza expresia logica si in caz ca aceasta are valoarea TRUE se executa instructiunea , se evalueaza
din nou expresia ,daca aceata are valoarea TRUE se executa din nou unstructiunea ;procedeul continua ,pana
cand, la evaluarea expresiei ,se obtine FALSE.
In situatia in care este necesar sa se execute mai multe instructiuni cand expresia a luat valoarea TRUE, se fol.
Instr. Compusa .
Diagrama de sintaxa a instructiunii WHILE este :
Exemplul 2. Se citeste n ,nr nat .Sa se afiseze nr. Obtinut prin invresarea cifrelor sale .
Program p7;
Var n, ninv:integer;
Begin
Write (‘n=’);readln(n);
Ninv :=0;
wile n<>0 do
begin
ninv :=ninv*10+n mod 10;
n:=n div 10
end;
writeln (‘nr.inversat =’,ninv);
end.
Instructiunea REPEAT
Aceasta instructiune reproduce structura REPEAT UNTIL si are forma generala:
REPEAT
I1;
I2;
I3;
:
:
In
UNTIL expresie logica
Aici,I1,I2,…..,In reprezinta instructiuni.
Principiul de executie este urmatorul:
Se executa secventa de instructiuni;
Se evalueaza expresia logica
Daca aceasta ia valorea FALSE se executa din nou secventa de instructiuni,contrar se trece mai departe.
Instructiunea repeat
repeat instructiune unti Expresie
l logica
109
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Observatie: secventa se executa cel putin o data, dupa care se pune problema daca sa se repete sau nu.
Exemplul 1 Se citeste un nr. Natural n,mai mare sau egal cu 1. Sa se calculeze suma
primelor n numere naturale.
Program suma ;
Var n, s,I:integer;
Begin
Write(‘n=’);readln(n);
I:=1;
S:=0;
Repeat
S:=s+I;
I:=I+1
Until I>n;
Wrieln (‘s=’,s)
End.
Program p10;
Var n, d,fm:integer;
Begin
Write(‘n=’);readln(n);
D:=2;
Repeat
Fm:=0;
While n mod d=0 do
Begin
Fm:=fm+1
n:=n div d
end;
if fm<>0 then writeln(d,’la puterea’,fm);
d:=d+1
untiln=1
end.
Instructiunea FOR
Atunci cand cunoastem de cate ori se executa o secventa este bine sa se utilizeze instrucitunea FOR.Ea are doua
forme .Iat-o pe prima:
For variabila:= expresie 1 to expresie2 do instructiune unde:
Variabila poate fi de orice tip ordinal
Expresie1, expresie2 sunt exoresii de acelasi tip cu variabila.
Principiul de executie este urmarorul:
Pasul 1.Se evalueaza cele doua expresii.
Pasul 2.
2.1Daca valoarea obtinuta in urma evaluarii expresiei1 este strict mai mare decat valoarea obtinuta in urma
evaluarii expresiei 2, executia FOR este incheiata;
Daca valoarea obtinuta in urma evaluarii expresiei1 este egala cu valoarea obtinuta in urma evaluarii
expresiei2, se atribuie variabilei de ciclare valoarea obtinuta in urma evaluarii expresiei1 se executa
instructiunea subordonata si executia FOR este incheiata;
Daca valoarea obtinuta un urma evaluarii expresiei 1 este strict mai mica decat decat valoarea obtinuta in
urma evaluarii expresiei 2, se atribuie variabilei de ciclare valoarea obtinuta in urma evaluarii expresiei 1si se
trece de la 1 la 2.
Daca valoarea retinuta de variabila de ciclare este strict mai mica decat valoarea obtinuta in urma evaluarii
exoresiei 2 se aduna 1 variabilei de ciclare si se trece la 2.2
110
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Daca valoarea retinuta de variabila de ciclare este egala cu valoarea obtinuta in urma evaluarii expresiei 2,
executia instructiunii FOR se incheie.
Sa ana lizam progamul urmator:
Pasul 1. La evaluare obtinem:3 pt. Expresie1 si 2 pt. Expresie 2.
Pasul 2. 3>2,deci executia FOR este incheiata >Valoarea finala pt. I va fi o(valoare initiala ).
Program f1;
Var I: integer;
Begin
I:=0;
For I:=3 to2 do writeln (I);
Writeln (‘valoarea finala pentru I’,I);
End.
Program f4 arata cum se foloseste FOR in cazul unei variabile de ciclare de tip CHAR.In program de listeaza
literele alfabetului inte ‘a’ si’k’.
Program f4;
Var I:char;
Begin
For I:=’a’ to ‘k’ do writeln(I);
End.
Programul f5 demonstreaza faptul ca instructiunea FOR functioneaza si pt. Variabile logice.Programul afiseaza
cele doua variabile logice(FALSE si TRUE).
Program f5;
Var I: false to true do writeln (I);
End.
Programul f6 ne demonstreaza faptul ca instructiunea FOR admite expresii in sensul general .Astfel ,dupa
evaluare se va obtine –5.Programul va afisa toate numerele intregi intre –5 si 10.De aoci o concluzie:variabila de
111
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Program f8;
Var I,j,k:integer;
Begin
I:=5,j:=10;
For k:=1 to j do
Begin
Writeln (k);
J:=j+1
End
End.
Programul f9 arata o modalitate de ‘’iesire din ciclu’’.Ce intelegem prin aceasta?Atunci cand un grup de
instructiuni se executa un mod repetat spunem ca se executa un ciclu.Atunci cand se iese din ciclu inainte ca
instructiunile sa se execute de cate ori a fost stabilit initial,spunem ca s-a iesit fortat din ciclu.In loc de ciclu, unii
folosesc cuvantal sinonim numit’’bucla’’
Program f9;
Var I,j,k:integer;
Begin
I:=5;j:=10;
Fork:=I to j do
Begin
Writeln (k);
K:=10;
End;
End.
O astfel de modalitate de lucru nu este induicata .Ea nu respecta principiile programarii structurate.Exista
posibiltatea sa ne incurcam atuncu cand urmarim un astfel de program.De astfel, daca in programul de mai sus in
loc de k:=10 am fi facut atribuirea k:=12 (incercati) programul ar fi ciclat.CE intelegem prin ciclare ?Daca un ciclu
nu se termina (instructiunile se executa la infinit )spunem ca programul ‘’cicleaza’’.De ce daca am efectua
atribuirea k:=12programul ar cicla?Simplu.Pt. ca un urma comparatiei intre valoarea retinuta de variabila de
ciclare si valoarea obtinuta la evaluarea exoresiei 2 nu ar fi egalitate.Concluzia:in instructiunea sibordonata
instructiunii FOR , nu se fac atribuiri variabilei de ciclare.Respectand aceasta regula evitam multe erori
ascinse.Daca totusi din greseala programam un ciclu infinit pt. a termina executia se tasteza ‘’CTRL+
PAUSE’’.Asta daca nu lucram sub Windows.In acest dun urma caz se tasteaza ‘’CTRL+ALT+DEL’’.
Am aratat faptul ca exista 2 forme ale instructiunii FOR.Pana in prezent am studiat prima forma
.Prezantam acum forma 2.
FOR VARIABILA:=EXPRESIE1 DOWNTO EXPRESIE2 DO INSTRUCTIUNE
Toate notatiile au aceasi semnificatie ca la forma 1.D.dvdr sintactic , forma 2 contine in loc de cuv.
Cheie TO, cuv.DOWNTO.La executie,continutul variabilei de ciclare scade ,la fiecare pas ,cu 1.In
programul f10 se listeaza numerele 5,4,3,2,1.
Program f10;
Var I:=integer;
112
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Begin
For I:=5 downto1 do writeln (I);
End.
Program f13 da eroare de sintaxa.Am fi dorit sa calculam suma 0.1+0.2+0.3.Dar am uitat faptul ca variabila de
ciclare nu pote fi reala.
Program f13;
Var I,s:I:real;
Begin
S:=0;
For I:=0.1 to o.3 do s:=s+I;
Writeln(s:5:2)
End.
Programul f 14 are o greseala .Variabila de ciclare este untreaga dar expresie2 este de tip real.Am invatat faptul ca
tipurile pt. expresie1, expresie2, si variabila de ciclare trebuie sa coincida.
Program f14;
Var I,k:integer;
Begin
K:=10;
For I:=1 to k/2 do writeln (I)
End.
Aplicatii
113
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
114
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
x:ARRAY[-10..10]; y:ARRAY[CHAR];
a:[BOOLEAN,1..10]; t:[operatii,1..10,BOOLEAN];
CONST I : ARRAY[1..2,1..2] OF BYTE = ( (1,0), (0,1) )
Referire elemente: x[1]; y[‘z’]; a[false,10]; a[false][10] t[creare,5,true]
Exemple:
1. Vector cu 5 componente numere naturale
V = (1,3,6,2,4 )
Aici k=1,n1 =5,T=N, elementele vectorului sunt v1=1,v2=3,…,v5=4.
2.Vector cu n componente reale
Z=(z1, z2,…,zn), zi real, i=1,n
Aici k=1,n1 =n,T=R.
MASIVE UNIDIMENSIONALE(vectori)
Sunt puţine programele în care nu apar definite masive unidimensionale.Problemele de
ordonare a şirurilor, de calcul a indicatorilor statistici medie şi dispersie ,programele pentru găsirea
elementului minim şi multe altele presupun stocarea valorilor numerice ale şirurilor în zone de
memorie ,care se întâlnesc în practică sub denumirea de vectori.
Definirea :
X: array[ 1..10] of integer;
se specifică:
- x este o dată compusă din 10 elemente;
- elementele sunt de tip întreg;
- primul element al structurii este x[1] , al doilea element este x[2]
- ultimul element este x [10]
Modelul grafic
115
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
sau
depl( x[i +k], x[i]) = adr( x[i+k]) - adr (x[i]);
Dacă X reprezintă structura de date omogene în totalitatea ei, iar x 1,x2…….x10 sunt părţile care o
compun, din reprezentarea grafică rezultă că:
adr(x) = adr (x[1])
Se defineşte:
adr(a+b) =adr(a) + (b-1) * lg (. , integer) ;
unde:
- a este numele datei structurate;
- b este poziţia elementului a cărui adresă se doreşte a fi calculată;
adr(a + b) = adr( b+ a)
Din calcule de adrese rezultă că:
Pentru stabilirea numărului maxim de componente ale vectorilor ce pot fi definiţi, se consideră:
L - lungimea în bytes a disponibilului de memorie;
Lp - lungimea în bytes a necesarului de memorie pentru program ;
(instrucţiuni executabile şi alte definiri )
116
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
EXEMPLU:
{Se citesc n numere naturale intr-un program PR10;
vector.sa se calculeze media uses crt;
var i,n:byte;
aritmetica a acestora} A:array[1..20] of integer;
program media; aUX:integer;
uses crt; ORDONAT:BOOLEAN;
var i,n:byte; begin
a:array[1..50]of integer; clrscr;
s:integer;m:real; write('n=');
begin readln(n);
clrscr; for i:=1 to n do begin
write('n='); write('a[',i,']=');
readln(n); readln(a[i]);
for i:=1 to n do begin end;
write('a[',i,']='); repeat;
readln(a[i]); ordonat:=true;
end; for i:=1 to n-1 do
s:=0;for i:=1 to n do if a[i]>a[i+1] then begin
s:=s+a[i]; aux:=a[i];
m:=s/n; a[i]:=a[i+1];
write('media este',m:8:2); ordonat:=false;
readkey; end;
end. until ordonat;
writeln('sirul ordonat este');
{ Se da un vector cu n elemente.sa se for i:=1 to n do
ordoneze crescator prin metoda write(a[i],'');
bulelor. } readkey;
end.
117
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Definirea :
a: array[ 1..,m,1..n] of integer;
rezultă că matricea a este formată din m linii; fiecare linie are în alcătuire n componente
Modelul grafic
l1 l2 Lm
118
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
119
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
120
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
121
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
ŞIRURI DE CARACTERE
Procedure Delete ( VAR s : string; m,n : integer); - şterge din şirul s un număr m de caractere începând
de la poziţia n
Procedure Insert ( s : string; VAR d: string; n : integer); - inserează şirul s în şirul d începând de la
poziţia n
122
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Procedure Str (e [ : m [ : n]]; VAR s: string); - converteşte valorile expresiei numerice reale sau întregi
e într-un şir de caractere de lungime m (luând în considerare n zecimale în cazul valorilor e reale şi depune şirul în
variabila s
Function Copy (s : string; m,n : integer): string; - extrage din şirul s subşirul format din m caractere
începând de la caracterul n
Function Lenght ( s: string): integer; returnează lungimea şirului s
Function Concat (s1 [,…,sn]: string) : string; - returnează şirul obţinut prin concatenarea tuturor
argumentelor, în ordinea în care apar; rezultatul nu poate depăşi 255 de caractere.
O variabilă care apare într-un bloc ( unitatea de bază a oricărui program Pascal) poate fi simultan locală,
globală şi necunoscută. De exemplu, dacă la nivelul unui bloc s-a declarat o variabilă, pentru blocul respectiv este
locală, pentru blocurile care au fost declarate în acel bloc este globală, iar pentru blocurile care include blocul
respectiv, variabila este necunoscută.
Siruri de caractere
SINTAXA:
TYPE NUME=string[dimensiune];
Var variabila:nume;
Sau:
Var variabila:string[dimensiune];
Variabila[0] este lungimea sirului
Are maxim 255 de caractere
Ex:
Var a:string[3];
Begin
A:=”cal”;
Write(a);
End.
Functii care lucreaza cu siruri de caractere
LUNGIMEA UNUI SIR DE CARACTERE S1:=CONCAT(s2,S3);
Sintaxa: Writeln (s1);
Variabila :=Length(sir); End.
Ex: SAU:
Var s: string; Var s1,S2,S3: string;
Begin Begin
Readln(s); Readln(s2);
Writeln(length(s); READLN(S3);
End. S1:= s2+S3;
CONCATERNARE(ALATURAREA) ADOUA Writeln (s1);
SIRURI DE CARACTERE End.
Sintaxa:
SIRdestinatie:=CONCAT(SIRsursa,SIR2); COPIEREA UNUI SIR DE CARACTERE de la
Ex: sursa LA DESTINATIE
Var s1,S2,S3: string; Sintaxa:
Begin SIRdestinatie:=COPY(SIRsursa,POZITIA_initial
Readln(s2); adecopiat,POZITIA_finala);
READLN(S3); Ex:
123
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Tipul multime
Declarare: SET OF tip_parinte
Literali: [element1,element2,…,elementn]; [] - multimea vida
Operatii:
- reuniune (+); intersectie (*); diferenta (-)
124
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
- relationale (incluziune)
- apartenenta (IN)
{Sa se efectueze operatii cu multimi until c=[];
apoi scrierea lor end
else
Daca limita multimii nu ar fi 255 ce if car='c' then
se intimpla (folosim vectori cu tipul for i:=0 to 255 do
multime nu se poate) for j:=1 to 255 do
Fie 1 care apartine si de A si de B if (i in a) and (j in b) then write('(',i,',',j,')');
Daca x apartine de A atunci writeln('}');
writeln(' sterg multimea c ');
2*x+1,3*x+1 apartine de A i:=0;
Daca x apartine de B atunci while c<>[] do begin
5*x+2,7*x+2 apartine de B if i in c then
Sa se stabileasca daca B e inclus in A begin
sau sa se afiseze elementele write(i:3,',');c:=c-[i];
end;
intersectiei i:=i+1;
} end;
var a,b,c:set of 0..255; writeln('}');
x,i,j:0..255; a:=[1];
car:char; b:=[1];
begin for x:=1 to 255 do
a:=[]; begin
repeat if x in a then
write(' dati elementul prim al if 2*x+1<=255 then
multimii');readln(x); begin
a:=a+[x]; a:=a+[2*x+1];
write(' mai dati d/n ');readln(car ); if 3*x+1<=255 then
until car='n'; a:=a+[3*x+1];end;
write(' dati a doua multime dati primul element if x in b then
'); if 5*x+2<=255 then
b:=[]; begin
repeat b:=b+[5*x+2];
write(' dati elementul multimii');readln(x); if 7*x+2<=255 then
b:=b+[x]; b:=b+[7*x+2];
write(' mai dati d/n ');readln(car ); end;
until car='n'; end;
write(' operatii:r=reuniune,i=intersectie,a=A- if b<=a then writeln(' multimea b este inclusa
B,b=B-A,c=produs cartezian'); in multmea a ')
write(' ce optati ');read(car); else
case car of begin
'r':begin c:=a+b ;writeln('reuniunea ');end; write('intersectia este {');
'i':begin c:=a*b ;writeln('intersectia ');end; x:=1;
'a':begin c:=A-B ;writeln('A-B ');end; repeat
'b':begin c:=B-A ;writeln('B-A ');end; if x in b then
'c':begin writeln('PRODUSUL cartezian');end; begin
else if x in a then
writeln(' alta varianta nu e '); write(x,' ');b:=b-[x];
end; end;
writeln; x:=x+1;
writeln; until b=[];
write('{'); writeln('}');
if car in ['a','b','c','i','r'] then begin i:=1; end;
repeat readln;
if i in c then write(i,' , '); end.
c:=c-[i];i:=i+1;
TIPUL DE DATE INREGISTRARE
125
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
SINTAXA Referirea1
TYPE identificator=RECORD Identificator1.
Camp1:tip1; identificator.camp1
Camp2:tip2; SINTAXA2
… TYPE identificator=RECORD
campN:tipN; Camp1:tip1;
end; Camp2:tip2;
VAR v:identificator; …
Referirea campN:tipN;
Identificator.camp end;
SINTAXA1 CASE identificator1:TIP OF
TYPE identificator=RECORD Camp11:( V1:tip1;V2:tip2;…);
Camp1:tip1; Camp21: :( V11:tip11;V21:tip21;
Camp2:tip2; …);;
… …
campN:tipN; campN1: :( V1n:tip1n;V2n:tip2;
end; …);;
identificator1=RECORD end;
Camp11:tip1; VAR v:identificator;
Camp21:tip2; Referirea2
… Identificator1.camp11 ,
campN1:tipN; Identificator1.camp21,..
cn: identificator; Identificator1.camp1,…
end; Identificator1.campN1
VAR v:identificator;
EXEMPLE:
{Citind coordonatele unui punct sa a:punct;
begin
se determine in ce cadran se afla} clrscr;
program cadran ;
with a do begin
uses crt;
write('abscisa :');
type punct=record
read(x);
x,y:real;
write('ordonata :');
end;
read(y);
var i,n:integer;
126
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
127
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
128
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
- PROCEDURA ASSIGN stabileşte o asociere între identificatorul din program reprezentat de variabila
fişier şi identificatorul extern; prototipul său este:
- PROCEDURA REWRITE deschide un fişier vid pentru executarea de operaţii de scriere şi are
prototipul:
Procedure Rewrite (varF);
Procedurile RESET şi REWRITE stabilesc modul de prelucrare a fişierelor şi se folosesc în cadrul
fişierelor text şi al celor cu tip.
Pentru scriere, respectiv citire se folosesc:
WRITE şi READ – la fişierele cu tip şi text
WRITELN şi READLN – la fişierele text
BLOCKWRITE şi BLOCKREAD – la fişierele prelucrate fără tip.
Procedure write ( VAR F ; VAL1 [VAL2, …] );
Procedure read ( VAR F ; VAR1 [V2, …] );
Pentru detectarea marcajului de sfârşit de fişier se foloseşte funcţia EOF
Pentru ştergerea şi schimbarea numelui unui fişier după închiderea acestuia se folosesc procedurile
ERASE, respectiv RENAME.
- FUNCŢIA SEEK EOF – avansează peste caracterele blanc şi TAB până la întâlnirea marcajului de
sfârşit de linie sau a marcajului de sfârşit de fişier.
129
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
begin
write (’nume fişier :’); readln (nume);
assign ( fişier, nume); reset (fişier);
număr : = 0;
while not eof (fişier) do
begin
readln (fişier);
număr : = număr + 1;
end;
close (fişier);
writeln (‘fişierul are ’, număr, ’linii’);
end.
Concatenarea de fişiere
reprezintă crearea cu ajutorul a două fişiere a unui al treilea fişier care conţine înregistrările primului fişier
urmate de înregistrările celui de-al doilea.
program concatenare;
type inr = record
nume : string [10 ];
vârsta : byte
end;
fişier = file of inr;
var inreg : inr;
f1,f2,f3 : fişier;
begin
assign (f1, ’f.dat’);
assign (f2, ’f.dat1’);
assign (f3, ’f.dat2’);
reset (f1);
reset (f2);
rewrite (f3);
while not eof (f1) do
begin
read (f1, inreg);
write (f3, inreg);
end;
while not eof (f2) do
begin
read (f2, inreg);
write (f3, inreg);
end;
close (f1);
close (f2);
130
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
close (f3);
end.
STRUCTURI DE DATE EXTERNE
Prelucrarea automata a datelor presupune un sistem de organizare a acestora dupa metode si procedee specifice.
Organizarea datelor este un proces complex care include identificarea, clasificarea si descrierea proprietatilor
acestora, gruparea lor în colectii, reprezentarea pe purtatori tehnici, definirea si realizarea procedurilor de
prelucrare etc.
Fisierul reprezinta termenul generic care desemneaza structurile de date externe. El este o multime
(colectie) de date omogene din punct de vedere al semnificatiei si al cerintelor de prelucrare. În
purtatorul extern, fisierul are, pe lânga partea de date, si informatii de identificare.
Fisiere cu tip
Fisierele cu tip sunt constituite, logic, din articole de lungime fixa, carora li se asociaza numere
relative, începând de la zero. Fisierele cu tip se mai numesc fisiere cu prelucrare la nivel de articol.
Operatiile de acces la articolele fisierelor cu tip transfera date fara conversie. Unitatea de transfer este
articolul, definit ca variabila de acelasi tip cu fisierul. Mecanismul fizic de "decupare" a articolelor în
cadrul fisierului se bazeaza pe faptul ca ele au lungime fixa (lart), definita în momentul prelucrarii.
Operatia de I/E transfera atâtia octeti câti indica lart. Lungimea fisierului, exprimata în octeti, este
memorata în intrarea lui din director (sfârsitul de fisier este logic). Numarul de articole din fisier
(Filesize(f)) este determinat de sistem prin împartirea întreaga a lungimii acestuia la lart. Fisierele cu
tip accepta accesul secvential si relativ la articole. Accesul secvential poate fi combinat cu cel relativ în
cadrul aceluiasi program. Pozitionarea directa pe articolul cu numarul relativ r se realizeaza cu
procedura Seek(f,r). Functia Eof(f) are valoarea TRUE, daca pointerul este plasat dupa ultimul articol
(la o deplasare egala cu n´lart fata de începutul fisierului, unde n este numarul de articole). Valoarea
curenta a pointerului (pozitia în cadrul fisierului exprimata în numar relativ) poate fi determinata prin
functia Filepos(f). Daca Eof(f) este TRUE, atunci Filepos(f)=Filesize(f).
Tentativa de citire a unui articol cu numarul relativ mai mare decât al ultimului genereaza eroare de
I/E. La scrierea articolului cu numarul relativ k, cele k articole precedente au spatiu rezervat în suportul
extern. De exemplu, se presupune un fisier cu articole de lungime 50 octeti, asupra caruia se realizeaza
doar scrierea articolului cu numarul relativ 100. Fisierul va ocupa în suport 5050 octeti (pentru 101
articole). Cele 100 articole (cu numere relative 0-99) au continut imprevizibil pentru utilizator. Citirea
articolelor se face cu procedura Read, iar scrierea cu procedura Write. Asupra fisierelor cu tip nu se pot
aplica functiile Eoln, SeekEoln, SeekEof si procedurile WriteLn, ReadLn. Procedurile de I/E pot
transfera unul sau mai multe articole, în functie de numarul variabilelor specificate în lista
argumentelor acestora.
Procedura Rewrite deschide un fisier nou pentru creare (creeaza intrarea în director). Declaratia ei este:
Rewrite(VAR f). Daca fisierul exista pe suport, acesta va fi sters si se creeaza noul fisier în locul sau.
131
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Daca fisierul f este deschis, procedura îl închide, îl sterge si recreeaza intrarea sa în director. Dupa
executia procedurii, pointerul de fisier se plaseaza pe începutul sau (pe primul articol) si functia Eof(f)
returneaza TRUE. În fisier este admisa atât scrierea, cât si citirea datelor.
Procedura Reset deschide un fisier existent (identifica fisierul în director). Declaratia ei este:
Reset(VAR f). Daca fisierul nu exista se genereaza eroare de I/E (IOResult are valoare diferita de zero).
Daca fisierul f este deschis, îl închide si apoi îl redeschide. Dupa executia procedurii, pointerul de fisier
se plaseaza pe începutul sau (pe primul articol), în fisier fiind admise atât citirea, cât si scrierea datelor,
iar Eof(f) este TRUE daca fisierul este vid sau FALSE, în caz contrar.
Procedura Close realizeaza închiderea unui fisier. Declaratia ei este:Close(VAR f). Variabila f indica
un fisier deschis anterior prin Reset sau Rewrite.
Read(VAR f,v1[,v2,...,vn]),
unde f este un fisier cu tip, iar vi sunt identificatori de variabile (articole), de acelasi tip cu
componentele fisierului. Procedura citeste unul sau mai multe articole, începând cu cel pe care este
plasat pointerul, avansându-l dupa ultimul articol transferat. Tentativa de citire a unui articol cu
numarul relativ mai mare sau egal cu FileSize(f) genereaza eroare de I/E (IOResult are valoare diferita
de zero).
La prelucrarea articolelor care au o parte variabila trebuie sa se tina seama de faptul ca li se asociaza o
singura zona de memorie, care poate fi tratata diferentiat. Este sarcina programatorului sa gestioneze
tipul de articol pe care îl prelucreaza. Pentru aceasta este necesar ca, în momentul prelucrarii, sa existe
criterii precise de diferentiere a articolelor. De cele mai multe ori, diferentierea este asigurata de
valorile posibile ale unui câmp definit în partea fixa a articolului sau de cunoasterea pozitiei articolelor
în fisier.
Write(VAR f,v1[,v2,...,vn]),
unde f si v au aceleasi semnificatii ca la procedura de citire. Procedura scrie unul sau mai multe
articole, începând cu pozitia în care se afla pointerul, avansându-l pe acesta dupa ultimul articol
transferat. Trebuie retinut ca datele se memoreaza în articol conform reprezentarii lor fizice în memoria
interna si ca la scriere nu se face nici o verificare cu privire la existenta articolului în fisier.
Alte proceduri si functii utilizate in lucrul cu fisiere cu tip
Functia Eof(f) testeaza sfârsitului de fisier. Ea este definita astfel: Eof(VAR f):BOOLEAN. Functia
returneaza valoarea TRUE, daca pointerul de fisier este dupa ultimul articol sau când fisierul este vid.
În caz contrar, returneaza valoarea FALSE. Daca buffer-ul în care se face analiza sfârsitului de fisier
este "eliberat", functia Eof(f) realizeaza transferul unui articol din fisierul extern în buffer. Tentativa de
citire când Eof(f)=TRUE produce eroare de I/E (IOResult este diferit de zero).
Procedura Seek plaseaza pointerul pe un anumit articol. Ea este definita astfel: Seek(VAR f;
n:LONGINT). Pointerul va fi plasat pe articolul al carui numar relativ este n.
Functia FilePos returneaza valoarea curenta a pointerul, exprimata ca numar relativ de articol. Functia
este definita astfel: FilePos(VAR f):LONGINT. Daca pointerul indica sfârsitul fisierului atunci
FilePos(f) = FileSize(f) si Eof(f) este TRUE.
Functia FileSize returneaza numarul de articole continute în fisier. Functia este definita astfel:
FileSize(VAR f):LONGINT.
Numarul de articole este determinat prin împartirea întreaga a lungimii fisierului, exprimata în octeti, la
132
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
lungimea articolului. Ultimul articol din fisier are numarul relativ egal cu FileSize(f)-1. Când se
efectueaza operatii de scriere, valoarea FileSize(f)=n´lart este înscrisa dinamic în File Information
Block (FIB).
În conditiile specifice modurilor de deschidere a fisierelor cu tip, prin folosirea adecvata a procedurilor
de I/E sunt posibile urmatoarele operatii de gestiune: populare, consultare, modificare adaugare si
stergere. Operatiile se realizeaza în acces secvential sau direct. De fapt, distinctia între cele doua tipuri
de acces este fortata, deoarece mecanismul lor este mult mai simplu: se citesc/scriu articole din/în
pozitia curenta. Plasarea se poate realiza prin parcurgere secventiala (prin operatiile de citire/scriere)
sau direct, prin procedura Seek.
· Popularea se realizeaza cu Write, dupa o deschidere cu Rewrite. În paralel cu popularea se pot realiza
si operatii de citire.
· Consultarea se realizeaza cu Read, dupa o deschidere cu Reset. În paralel, se pot realiza si operatii de
scriere.
· Adaugarea se realizeaza cu procedura Write, dupa o deschidere cu Reset. Operatia de adaugare
necesita tinerea evidentei din partea utilizatorului a casetelor "goale", anterior rezervate. Se pot adauga
articole si peste FileSize(f), operatia având caracter de extindere a fisierului.
· Modificarea se realizeaza cu procedura Write, dupa o deschidere cu Reset. Operatia necesita uzual o
citire, o plasare a pointerului pe numarul relativ FilePos(f)-1 si apoi o scriere.
· Stergerea fizica se poate realiza prin suprascrierea articolului de sters, obtinuta ca efect al deplasarii
articolelor ce îi urmeaza în fisier, cu o pozitie spre stânga. Stergerea ultimului articol duplicat în urma
deplasarii se asigura prin plasarea pointerului de fisier pe articolul FileSize(f)-1, urmat de executia
procedurii Truncate(f) care modifica lungimea fisierului în intrarea din director.
Fisierele fara tip sunt construite, logic, din blocuri de lungime fixa, asupra carora nu se face nici o
ipoteza de structura. Fisierele fara tip se mai numesc fisiere cu prelucrare la nivel de bloc. Unitatea de
transfer este blocul, a carui lungime este definita, implicit sau explicit, la deschiderea fisierului
(parametrul RecSize). Transferul datelor între memoria interna si suportul extern se realizeaza fara
conversie.
Blocurilor, fiind de lungime fixa, (lbloc) li se asociaza numere relative începând de la zero. Accesul la
blocuri se poate face secvential sau direct. Pozitionarea directa pe un bloc cu numar relativ r se
realizeaza cu procedura Seek(f,r). Functia Eof(f) are valoarea TRUE daca pointerul este plasat dupa
ultimul bloc (la o deplasare egala cu n´lbloc fata de începutul fisierului, unde n este numarul
blocurilor). Valoarea curenta a pointerului poate fi determinata prin functia Filepos(f), iar numarul de
blocuri din fisier prin functia Filesize(f). Tentativa de citire a unui bloc cu numarul relativ mai mare
decât al ultimului generaza eroare de I/E. La scrierea blocului cu numarul relativ k, cele k blocuri
precedente au spatiu rezervat în suportul extern. Citirea blocurilor se face cu procedura BlockRead, iar
scrierea cu procedura BlockWrite. Procedurile de I/E pot transfera unul sau mai multe blocuri, în
functie de valoarea specificata prin parametrul Count.
Din cele prezentate, se poate observa ca între fisierele cu tip si cele fara tip exista multe asemanari de
prelucrare. Dintre aceste, cele mai importante se refera la faptul ca transferul este binar (fara conversie)
si ca entitatile transferate (articolul sau blocul) au lungime fixa. Deosebirea esentiala dintre cele doua
tipuri de fisiere consta în aceea ca la fisierele cu tip, articolul are definita o structura, iar la cele fara tip,
blocului nu i se asociaza o structura.
Procedura Rewrite deschide un fisier nou pentru creare (creeaza eticheta în director). Declaratia ei
este: Rewrite(VAR f[;RecSize:WORD]). RecSize precizeaza marimea, în octeti, a blocului care va fi
133
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Procedura Reset deschide un fisier existent (identifica fisierul în director). Declaratia ei este:
Reset(VAR f [;RecSize:WORD]). RecSize are aceeasi semnificatie ca la procedura Rewrite. Daca
fisierul nu exista, se genereaza eroare de I/E (IOResult are valoare diferita de zero). Daca fisierul f este
deschis, îl închide si apoi îl redeschide. Dupa executia procedurii, pointerul de fisier se plaseaza pe
începutul sau (pe primul bloc). În fisier este admisa atât citirea, cât si scrierea datelor. Dupa executia
procedurii, Eof(f) este TRUE daca fisierul este vid sau FALSE, în caz contrar.
Declaratia ei este:Close(VAR f). Variabila f indica un fisier deschis anterior prin Reset sau Rewrite.
Procedura citeste unul sau mai multe blocuri, începând cu cel pe care este plasat pointerul, pe care îl
avanseaza dupa ultimul bloc transferat. Tentativa de citire a unui bloc cu numarul relativ mai mare sau
egal cu FileSize(f) genereaza eroare de I/E (IOResult are valoare diferita de zero).
Procedura scrie unul sau mai multe blocuri începând cu pozitia în care se afla pointerul, pe care îl
avanseaza dupa ultimul bloc scris. Se reaminteste ca datele se memoreaza în blocul extern identic cu
forma lor fizica din memoria interna.
Functiile Eof, FilePos, FileSize si procedura Seek functioneaza identic ca în cazul fisierelor cu tip,
referind sau referindu-se la blocuri. Numarul de blocuri este determinat prin împartirea întreaga a
lungimii fisierului, exprimata în octeti, la lungimea blocului. Ultimul bloc din fisier are numarul relativ
egal cu FileSize(f)-1. Când se efectueaza operatii de scriere, valoarea FileSize(f)´lbloc este înscrisa
dinamic în FIB.
134
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
135
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
end else
else if sum>su-25 then
if art1.su=max then begin begin
i:=i+1; writeln(' operatia sau suma data gresit',op,'
nn[i]:=filepos(fis1)-1 ',c1);
end; b:=false;
end; end
reset(fis1); else
writeln('urmatorii detin suma maxima ',max); su:=su-sum;
for j:=1 to i do if b then
begin begin
seek(fis1,nn[j]); seek(fis1,nr);write(fis1,art1);end;
read(fis1,art1); end;
writeln(art1.nu); end;
end; end;
close(fis1); end;
reset(fis1); close(fis1);
write('citi adaugati n=');readln(n); reset(fis1);
writeln(' la ce clasa ');readln(art1.cl); while not eof(fis1) do
seek(fis1,filesize(fis1)); begin
for i:=1 to n do read(fis1,art1);
with art1 do with art1 do begin
begin writeln('clasa',cl);writeln;
write('nume');readln(nu); writeln('SUMA--> ',su,' CLASA----> ',cl);
write('suma ');readln(su); end; end; close(fis1);
write(fis1,art1); readln;
end; end.
close(fis1); {Intr-un fisier cu tip sa se memoreze
reset(fis1); numele si virsta unor persoane
while not eof(fis1) do
begin
Dindu-se doua fisiere sa se listeze}
read(fis1,art1); type inr=record
with art1 do begin nume:string[10];
writeln('clasa',cl); virsta:byte;
writeln(' ',su,' ',cl); end;
end; end; close(fis1); fisier=file of inr;
reset(fis1);nm:=filesize(fis1)-1; var i,inreg:inr;
write('citi modificati n=');readln(n); f2,f1:fisier;
for i:=1 to n do c:char;
begin begin
write('clasa');readln(c1); assign(f1,'ff.dat');
write('nume');readln(num); rewrite(f1);
write(' nr de ordine ');readln(nr); repeat
write('tipul operatiei I?E');readln(op); write('numele ');readln(inreg.nume);
write('suma ');readln(sum); write('virsta');
if nr>nm then readln(inreg.virsta);
writeln(' nr de ordine gresit pentru ',num,' ',c1) write(f1,inreg);
else write('continuati y/n');readln(c);
begin until c='n';
seek(fis1,nr); assign(f2,'fff.dat');
read(fis1,art1); writeln(' dati inregistrari in al doilea fisier ');
with art1 do rewrite(f2);
begin repeat
if (c1<>cl) or (num<>nu) then writeln(' nr de write('numele ');readln(inreg.nume);
ordine gresit pentru ',num,' ',c1) write('virsta');
else readln(inreg.virsta);
begin write(f2,inreg);
b:=true; write('continuati y/n');readln(c);
if op in['i','I'] then until c='n';
su:=su+sum reset(f1); writeln(' primul fisier ');
136
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Fisierele fara tip sunt utilizate pentru stocarea unor blocuri din memoria interna, în vederea prelungirii
capacitatii ei (un exemplu semnificativ îl reprezinta memorarea masivelor de dimensiuni mari). Cu
toate acestea, pot fi concepute aplicatii care au la baza gestiunea fisierelor. În astfel de aplicatii,
fisierele fara tip se comporta asemanator fisierelor cu tip. De fapt, cele doua tipuri de fisiere pot fi
interschimbate în procesul prelucrarii.
EXEMPLU :
137
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Noţiunea de subprogram
Prin subprogram vom înţelege un ansamblu alcătuit din tipuri de date, variabile şi
instrucţiunii scrise în vederea unei anumite prelucrări (calcule, citiri, scrieri) şi care poate fi utilizat
(rulat) doar dacă este apelat de un program sau de alt subprogram.
■ de prelucrare a şirurilor de caractere:in Pascal avem pos,length …,iar in C++ strlen, strcpy, strncat.
În acest capitol învăţăm să le creăm. Pentru a înţelege noţiunea de subprogram, vom porni de
la două exemple:
138
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
□ Se citeşte n, număr natural. Să se scrie programele care tipăresc valoarea calculată a expresiilor:
E1=1+1/2+1/3+1/4+…+1/n
E2=(1+1/2+1/3+1/4+…+1/n)ⁿ
E₂=E₁ⁿ
Cerinţa este de a scrie programe separate. Cum procedăm? Prin utilizarea cunoştinţelor
dobândite până în prezent, scriem cele două programe separat, iar în al doilea program, secvenţa care
calculează prima expresie, se copiază din primul.
Oare nu se poate lucra mai eficient? Răspunsul este afirmativ. Se scrie un program care
calculează E₁ şi care este apelat de ambele programe. Primul program va tipări valoarea transmisă de
subprogram, al doilea va ridica la putere această valoare şi va afişa rezultatul.
Desigur, ştim să rezolvăm această problemă şi clasic, în mai multe feluri, pentru că am studiat
mai mulţi algoritmi de sortare. De această dată vom rezolva problema prin utilizarea subprogramelor.
Vom scrie un subprogram care citeşte un vector, unul care tipăreşte un vector şi un al treilea
care sortează vectorul, după una din metodele cunoscute.
Faţă de scrierea clasică, aici problema a fost descompusă în altele mai mici (citire, sortare,
tipărire). În general, o problemă complexă se rezolvă mai uşor dacă o descompunem în altele mai
simple. Apoi, şansele de a greşi la scrierea unui subprogram sunt cu mult mai mici decât acelea de a
greşi la scrierea unui program mare. Acesta din urmă rezultă din “asamblarea” subprogramelor la care
se adaugă, eventual, câteva linii scrise în programul principal. Putem acum enumera avantajele
utilizării subprogramelor:
■ reutilizarea codului –o dată scris, un subprogram poate fi utilizat de mai multe programe;
■ elaborarea algoritmilor prin descompunerea problemei în altele mai simple. În acest fel, rezolvăm cu
mult mai uşor problema;
■ depistarea cu uşurinţă a erorilor –verificăm la început subprogramele, apoi modul în care le-am
asamblat (le-am apelat din cadrul programului).
Parametrii care se găsesc în antetul funcţiei se numesc parametrii formali.
Atunci când scriem o funcţie nu cunoaştem valoarea propriu-zisă a parametrilor. Funcţia trebuie să
întoarcă rezultatul corect, oricare ar fi valoarea lor. Din acest punct de vedere ei se numesc formali.
La apel, lucrurile stau altfel: valorile acestora sunt cunoscute. Prin urmare aceştia se cunosc
parametrii efectivi.
139
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Antet – acesta conţine mai multe informaţii importante necesare compilatorului, numele funcţiei,
lista parametrilor formali, tipul rezultatului.
O funcţie poate fi apelată de sine stătător (prin nume şi lista parametrilor efectivi), dar poate fi inclusă şi în cadrul
expresiilor, caz în care, la evaluarea expresiei este apelată.
Sistemul de operare alocă fiecărui program trei zone distincte în memoria internă în care se găsesc
memorate variabilele programului.
Segment de date
Segment de stivă
Heap
Clasa de memorare.
Vizibilitate.
Durata de viaţă.
Tipul variabilei, singurul pe care l-am studiat până în prezent.
1. Clasa de memorare – precizează locul unde este memorată variabila respectivă. O variabilă poate
fi memorată în segmentul de date, în cel de stivă, în heap sau într-un registru al microprocesorului.
2. Vizibilitatea – precizează liniile textului sursă din care variabila respectivă poate fi accesată. Astfel
avem:
b. Vizibilitatea la nivel de fişier – în cazul în care programul ocupă un singur fişier sursă,
singurul caz pe care îl tratăm acum.
3. Durata de viaţă – reprezintă timpul în care variabila respectivă are alocat spaţiu în memoria
internă. Astfel avem:
a. Durata statică – variabila are alocat spaţiu în tot timpul execuţiei programului.
b. Durata locală - variabila are alocat spaţiu în timpul în care se execută instrucţiunile
blocului respectiv.
SUBPROGRAMUL reprezintă o parte dintr-un program, identificabilă prin nume, care se poate lansa în execuţie
ori de câte ori este cazul.
În Pascal, subprogramele sunt de două tipuri:
Funcţii
Proceduri
140
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Funcţii
Definiţie:
O funcţie este un subprogram care calculează şi aduce în programul apelant o singură valoare.
Sintaxa unei funcţii este:
Function name (x1, x2, …, xn) : tip;
[Declaraţii]
begin
…
nume = expresie;
141
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
end;
Prima linie a sintaxei poartă numele de antetul funcţiei sau linia de definiţie.
“Nume” reprezintă numele funcţiei şi este un identificator.
“Tip” reprezintă tipul funcţiei, care poate fi simplu, string sau referinţă.
x1, x2, …, xn sunt parametri formali şi sunt opţionali.
Declaraţiile pot fi: label, const, type, var, function, procedure şi sunt recunoscute doar în
cadrul funcţiei respective.
Apelul funcţiei se face prin:
program max_nr;
uses crt;
var x, y, z : integer;
function max : integer;
var t : integer;
begin
t:=x
if y > t then t : = y;
if z > t then t : = z;
max : = t
end;
begin
clrscr;
write (’introduceţi trei nr. !’);
readln (x,y,z);
writeln (’valoarea maximă = ’, max : 4);
readln
end.
În cadrul programului respectiv, x, y şi z sunt variabile globale relativ la funcţia MAX ; ele
sunt cunoscute şi în corpul funcţiei.
“t” se foloseşte pentru determinarea maximului dintre cele trei numere în interiorul programului definit
prin funcţia MAX . t este o variabilă locală a funcţiei MAX, care nu poate fi folosită decât în corpul funcţiei – ea
nu este cunoscută şi nu poate fi utilizată în program.
În acest caz, comunicarea între program şi funcţie se face prin variabile globale recunoscute şi în funcţie
şi nu este explicită.
Programul acesta poate fi scris şi astfel:
program max_nr;
uses crt;
var x,y,z : integer;
function max (a,b,c : integer) : integer;
var t : integer;
begin
t : = a;
142
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
if b > t then t : = b;
if c > t then t : = c;
max : = t
end;
begin
clrscr;
write (’introduceţi trei nr. !’);
readln (x,y,z);
writeln (’valoarea maximă:’, max (x,y,z) : 4);
readln
end.
În acest caz, elementele de comunicare între program şi funcţie sunt date explicit prin
declararea lor în linia de definiţie a funcţiei ca parametri formali.
Variabilele x,y,z declarate în secţiunea VAR a programului ca fiind de tip INTEGER nu sunt cunoscute
în corpul funcţiei.
În linia de definiţie a funcţiei, variabilele a,b,c sunt parametri formali care sunt cunoscuţi doar în corpul
funcţiei MAX.
Variabilele x,y,z sunt parametri actuali relativ la funcţia MAX, în formularea MAX (a,b,c : INTEGER).
PROCEDURI
Definiţie:
O procedură este un subprogram care furnizează în programul apelant unul sau mai multe
rezultate.
Sintaxa unei proceduri este:
Sintaxa procedurii este asemănătoare cu cea a funcţiei: conţine un antet sau o linie de definiţie, numele
este un identificator stabilit de utilizator, x 1, x2, …, xn sunt parametrii formali care sunt opţionali, declaraţiile sunt
recunoscute doar în corpul procedurii.
Instrucţiunile cuprinse în structura “begin – end” constituie corpul procedurii.
Apelul unei proceduri se face prin numele ei.
Parametri procedurii sunt:
- de intrare (ale căror valori sunt iniţializate la apelul procedurii); aceştia sunt parametri
valoare
- de ieşire (ale căror valori sunt calculate în procedură ); aceştia sunt parametri variabilă.
exemplu:
program expresie;
var a : integer;
procedure adun;
var b : integer;
143
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
procedure scad;
var c : integer;
begin
write (‘c =’);
readln (c);
b : = b-c
end;
begin
write (’b =’);
readln (b);
scad;
a: = a +b
end
begin
write (’a =’);
readln (a);
adun;
writeln (’a = ’,a )
end.
Programul prezentat calculează expresia a+b-c. Programul principal apelează o procedură declarată în
cadrul lui (ADUN), iar aceasta la rândul ei apelează o altă procedură pe care o conţine (SCAD).
În acest caz, parametrii reprezintă un mecanism de interfaţă între subprogram şi blocul apelant.
Parametrii sunt:
- formali, care în momentul declaraţiei nu sunt cunoscuţi efectiv (ca valoare) şi sunt situaţi
în antetul subprogramului. Pot fi: nume de variabile, valori sau alte subprograme.
- efectivi, la care, în momentul apelului, valorile lor sunt cunoscute şi sunt situaţi în
instrucţiunea de apel.
144
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
2. Vizibilitatea – În cazul în care declaraţiile acestora sunt înaintea tuturor funcţiilor, acestea sunt
vizibile la nivelul întregului program (fişier). Dacă anumite funcţii se află plasate înaintea
declaraţiilor acestor variabile, atunci ele sunt vizibile doar pentru funcţiile care sunt plasate după
aceste declaraţii.
3. Durata de viaţă a variabilelor globale este statică. Ele au spaţiu rezervat în tot timpul execuţiei
programului.
Variabile locale
145
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
1. Variabilele locale nu sunt iniţializate implicit cu 0. În ipoteza în care acestea nu sunt iniţializate
explicit de programator, reţin o valoare oarecare, numită valoare reziduală.
Aşa cum am arătat, parametrii care se găsesc în antetul funcţiei se numesc parametrii formali,
iar cei care se găsesc în instrucţiunea de apel se numesc parametrii efectivi.
După fiecare apel al funcţiei se tipăreşte suma obţinută. Între parametrii formali şi cei efectivi trebuie
să existe o anumită concordanţă, care este descrisă prin regulile următoare:
Numărul parametrilor formali trebuie să coincidă cu numărul parametrilor efectivi. La această regulă
există o excepţie care va fi prezentată într-un paragraf separat.
Tipul parametrilor formali trebuie să coincidă cu tipul parametrilor efectivi sau tipul parametrilor efectivi
să poată fi convertit implicit către tipul parametrilor formali la fel ca în cazul atribuirii
Observaţie: Nu este obligatoriu ca numele parametrilor formali să coincidă cu numele parametrilor
efectivi.
Vom analiza modul în care sunt memoraţi parametrii transmişi, în momentul lansării în
execuţie a funcţiei.
Memorarea parametrilor transmişi se face în ordinea în care aceştia figurează în antet: de la stânga
la dreapta.
În cadrul subprogramului, parametrii transmişi şi memoraţi în stivă sunt variabile. Numele lor este
cel din lista parametrilor formali.
A. Transmiterea prin valoare se utilizează atunci când suntem interesaţi ca subprogramul să lucreze
cu acea valoare, dar, în prelucrare, nu ne interesează ca parametrul efectiv (cel din blocul apelant)
să reţină valoarea modificată în subprogram.
1. Valorile reţinute de variabile. În acest caz, parametrii efectivi trebuie să fie numele
variabilelor.
2. Parametrii efectivi sunt expresii, care mai întâi se evaluează.
Aşa cum am arătat, transmiterea parametrilor prin valoare se utilizează atunci când nu ne
interesează ca, la întoarcerea din subprogram, parametrul efectiv să reţină valoarea modificată
acolo. Întrebare: dacă n-ar exista decât transmiterea prin valoare, ar fi posibil să modificăm
valoarea anumitor variabile care sunt declarate în blocul aparent?
146
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
B. Transmiterea prin referinţă. Parametrii sunt transmişi prin referinţă atunci când de interesează
ca la revenirea din subprogram variabila transmisă să reţină valoarea stabilită în timpul execuţiei
subprogramului.
În cazul transmiterii prin referinţă, parametrii efectivi trebuie să fie referinţe la variabile (vezi
tipul referinţă prezentat în capitolul anterior).
În acest caz ne putem întreba care este mecanismul prin care, deşi pentru o variabilă transmisă se
reţine adresa ei, în subprogram putem adresa variabila normal (nu indirect)? La compilare, orice
referinţă la variabila respectivă, este “tradusă” ca adresare indirectă.
□ A defini un subprogram, înseamnă a-l scrie efectiv, după structura anterior prezentată. O problemă
importantă este locul unde se defineşte subprogramul.
147
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
program expresie;
var a,b,c,d : integer;
procedure adun;
begin
d: = a+b;
end;
procedure scad;
begin
d: = d-c;
end;
begin
write (’a =’); readln (a);
write (’b =’); readln (b);
write (’c =’); readln (c);
adun;
scad;
writeln (’d =’,d);
readln;
end.
ARITMETICE
148
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
149
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
4.5.6 Recursivitate
Mecanismul recursivitati
A) Pentru a scrie o functie recursiva care efectueaza acelasi calcul, vom porni de la o
definitie recursiva a lui n !. Aceasta este :
n !=fact(n)= 1, n=0
n€N
n * fact(n-1), astfel
Care este mecanismul prin care subprogramele se pot autoapela? Sa ne amintim modul in care
subprogramele memoreaza parametrii transmisi:
● Pentru memorarea parametrilor, subprogramele folosesc o zona de memorie numita stiva (mai
exact, aceasta zona se numeste segment de stiva).
● Pentru parametrii transmisi prin valoare, se memoreaza valoarea transmisa, iar pentru cei
transmisi prin referinta se memoreaza adresa variabilei.
● In cadrul subprogramului, parametrii transmisi si memorati in stiva sunt variabile.Numele lor este
cel di lista parametrilor formali.
150
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
In capitolul anterior am studiat proprietatile structurii numita stiva. Exact aceleasi proprietati le are si
segmental de stiva.Singura diferenta este data de faptul ca gestiunea segmentului de stiva este facuta
automat de catre calculator.Mai exact, codul in limbaj masina, obtinut in urma compilarii, contine
secvente prin care se gestioneaza segmentul de stiva.
● In cazul in care subprogramul se autoapeleaza pe un al doilea nivel se depun din nou parametrii
transmisi si se rezerva un nou spatiu pentru variabilele locale.
In continuare prezentam grafic modul in care functioneaza recursivitatea in cazul functiei fact a
programului anterior. Aceasta functie nu are variabile locale, deci in stiva se depune doar parametrul
n.
n→2
n→3 Functia se autoapeleaza. De aceasta data parametrul n ia valoarea 2
.In stiva se creeaza un nou nivel, care retine n cu valoarea 2.
F:N N 2 Exemple :
Fact (0) = 1 ;
1, ,n = 0 Fact(2) = fact(1)*2 = fact(0)*1*2 = 1*1*2 =2
Fact (n) = Fact(2) = fact(3)*4 = fact(2)*3*4 = fact(1)*2*3*4
Fact(n-1)*n ,altfel = fact(0)*1*2*3*4 = 1*1*2*3*4 =24
151
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Var n:integer ;
Exempu de definire inconsistenta : Function pp(k , p :integer) :integer ;
Begin
F(0) = 1 If (k=p) then pp:=k else pp:=pp(k,p-1)*p
F(2) = f(4)*2 = f(6)*2*4 = f(8)*2*6*4 = ……. End;
Bein
Write(‘n =’);readln(n);
Realizati subprograme recursive in Write(‘pp =’, pp(1,n));
Pascal care returneaza: Readln;
End.
1+2+3+….+n.
Se da un sir x de nr intregi . SA se
realizeze subprograme in Pascal care
Program p1 ;
sa realizeze citrea si afiserea sirului
Uses crt; x.
Var n:integer ;
Function s(k , p :integer) :integer ; Procedure Cit_sir(x:Şir ; k,p : integer);
Begin Begin
If (k=p) then s:=k else s:=s(k,p-1)+p If (k=p) then readln(x[k]) else
End; Begin
Bein Readln(x[k]);
Write(‘n =’);readln(n); Cit_sir(x , k+1 , p);
Write(‘s =’, s(1,n)); End
Readln; End;
End. Procedure Afis_sir(x:Şir ; k,p : integer);
Begin
If (k=p) then write(x[k]:5) else
Begin
Realizati subprograme recursive in Pascal write(x[k]:5);
care returneaza: Afis_sir(x , k+1 , p);
1 x 2 x 3 x….x n. End
End;
Readln;
Program p1 ; End.
Uses crt;
Incepand cu versiunea 5,5,limbajul Turbo-Pascal a fost exstins pt programare orientata pe obiecte cu facilitati
inspirate din limbajul c++ si adaptate sintaxei Pascal.Principiile fundamentale si avantajele POO sunt aceleasi in
cele 2 limbaje,dar exista si multe deosebiri intre ele:
- facilitatile oferite inTP sunt mai reduse ca in C++ :nu este posibila existenta mai multor functii sau
operatori cu acelasi nume,dar cu efecte diferite,nu exista functii sau clase prieten(\friends’),nu exista
mostenire multipla,nu exista clase predefinite pt operatii intrare iesire s,a;
- aceleasi convepte sunt implementate diferit,uneori cu mici diferente care nu sunt evidente la o citire
superficiala:rolul si necesitatea constructorilor si destructorilor.redefinirea metodelor virtuale in clasele
derivate s,a.
152
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
-prin obiecte se realizeaza cea mai buna imprementare atipurilor de date abstracte,adica cea mai buna
incapsulare a unei SD si a metodelor asociare
structurile de date constitue uncandidat important pt crearea de obiecte si chiar exista biblioteci de obiecte
SD,care pot fi folosite ca atare si pt derivarea unor alte SD mai bine adaptate pt aplicatii.
CONCEPTE DIN ABORDAREA ORIENTATA OBIECT IN VFP
Tehnologia orientata obiect a introdus o serie de concepte care se folosesc atat in modelul orientata obiect cat si in
programarea orientata obiect.Prezentam o parte din aceste concepte si anume cele utilizate in Visual FoxPro.
Obiectul este un ansamblu de informatie si actiuni.Obiectele sunt entitati din lumea reala care
inglobeaza in ele stari (date) si comportamente(functiuni).Reprezentarea entitatilor se realizeaza printr-un
ansamblu de proprietati comune (colectii de proprietati)
Proprietatile sunt datele dintr-un obiect.In termenul Visual FoxPro proprietatea este o variabila de
memorie care se ataseaza unui obiect.Acesta poate fi referita sau modificata prin calificarea,utilizand numele
obiectului urmat de caracterul punct si apoi numele proprietatii.Proprietatea poate avea oricare dintre tipurile de
date acceptate de Visual FoxPro.
Metodele sunt procedurile atasate unui obiect.Unui obiect i se ataseaza,pe langa date ,si actiuni,care sunt
codificate in proceduri.Fata de procedurile obisnuite(tip procedura sau tip functie) exista o mica diferenta in ceea
ce priveste apelul unei metode.Pentru aceasta se utilizeaza numele obiectului,urmat de caracterul punct si apoi
numele metodei(calificarea).
Evenimentele sunt situatii(lucruri) care se produc la momentul executiei(exemplul clic pe
mouse).Evenimentele pot fi cauzate de actiunea utilizatorului(apasarea unui buton) sau a sistemului (producerea
unei erori).Cand se creeaza o clasa (de exemplu tip radio buton) in Visual FoxPro se poate atasa si codul
evenimentului (de exemplu metodele aferente).Atunci cand se produce evenimentul (de exemplu clic stanga cu
mouse-ul pe obiect),metoda asociata este automat apelata.
Utilizarea evenimentelor nu este noua in Visual FoxPro, ci ea se regaseste inca din FoxPro 2.0.(exemplu clauza
VALID ataseaza o procedura simpla unui eveniment).
In Vizual FoxPro se pot atasa metodele la toate tipurile de evenimente. Se poate atasa cod unui eveniment care se
executa automat atunci cand obiectul este creat (INIT EVENT) si/sau este sters(DESTROY EVENT).Apelul unui
eveniment se face intr-un mod similar cu al unei metode.
Clasa descrie comportamentul unui set de obiecte.Dintr-o clasa fac parte toate obiectele ce au
comportament comun si ea cuprinde una sau mai multe metode de descriere. Printr-o clasa se descrie:natura
datelor.metodele aferente,initializarea obiectelor,pozitia clasei intr-o eventuala ierarhie de clase.
In Visual FoxPro,si,in general,in programarea orientata obiect,obiectele nu sunt niciodata codificate,in schimb
clasele sunt.Toate obiectele sunt instatiate din clasa din care fac parte.Se fac astfel dinstinctie intre obiecte si clase.
Instatierea unui obiect este o realizare a unei clase data de valorile variabilei aferente.Ea se realizeaza in
Visual FoxPro prin functia CREATEOBJECT().In urma acestui program se ataseaza o variabila de memorie de tip
"Object" obiectului instantat,care provine dintr-o anumita clasa.
NOTA
Pentru a se face referire la proprietatilor obiectelor sau la metodele in ele insele se foloseste ca indentificator
pentru numele de obiect,cuvantul cheie THIS.
Mostenirea(succesiunea) este caracteristica unei clase de obiecte pentru a deriva datele si functile sale
din alta clasa.Cel mai adesea clasele de obiecte nu sunt independente,ci ele se gasesc dispuse in ierarhie.In Visual
FoxPro clasa care mosteneste se numeste superclasa.
Pentru a referi un membru dintr-o ierarhie de clase se foloseste calificarea cu ajutorul caracterului . .
De exemplu daca avem obiectul "mForm" pe nivelul cel mai de sus al ierarhiei si obiectul"mTextBox"
pe nivelul cel mai de jos atunci referirea va fi:
mForm.mPageFrame.mContainer.mTextBox.
Protectia metodelor si proprietatilor claselor este asigurata prin faptul ca acestea nu pot fi accesate din
afara clasei,daca nu se specifica acest lucru.La definirea unei clase se decide de catre programator,care este
interfata publica(partea accesibila tuturor) si care sunt metodele si proprietatile care vor fi utilizate numai in
interiorul clasei (partea privata).In Visual FoxPro acest lucru se realizeaza ,atat prin proprietati cat si prin
metode,prin cuvantul cheie PROTECT.
Polimorfismul este caracteristica unei clase de obiecte prin care se pot da metodelor si proprietatilor din
diferite clase acelas nume,daca ele se refera la situati diferite.Polimorfismul se utilizeaza intens in realizarea
claselor de obiecte.Se poate utiliza,de exemplu, pentru o standardizare a numelor metodelor pentru situatii
similare.Efectul va fi ca la acelas mesaj,diferite obiecte por furniza raspunsuri diferite.
Mesajul este o cerere de regasire care se transmite spre un obiect pentru a executa o anumita
metoda,obtinandu-se un raspuns.Mesajul este modul de comunicare intre obiecte.In Visual FoxPro transmiterea de
153
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
mesaje are loc la crearea unui obiect,la citirea valori unei proprietati ,la apelul unei metode.
Incapsularea este caracteristica care se refera la faptul ca obiectul este o unitate de sine
statatoare .Obiectul,ca instantierea a unei clase contine date sub forma de proprietati de date si metode.
Alaturi de polimorfism si mostenire incapsularea reprezinta caracteristicile de baza ale obiectelor.Acestea sunt date
de tehnologia orientata obiect si sunt implementate in Visual FoxPro.
Realizarea programelor dupa tehnologia orientata obiect presupune ca pas final scrierea obiectelor
intr-un limbaj de programare.Inainte de acest pas trebuie realizate analiza si proiectarea orintate obiect.Pentru
aceste activitati au fost utilizate diferite metodologii In realizarea unei aplicatii cu baze de date, in jur de 70%din
timp este alocat,de catre analist,pentru activitatile de analiza si proiectare.In cazul utilizari tehnologiei orientate
obiect,principalul rezultat al analizei si proiectarii aplicatiei este identificarea si ierarhizarea claselor de obiecte
precum si stabilirea proprietatilor si metodelor.
Tipuri de obiect in tip
Un tip obiect este asemanator unui tip inregistrare dar contine in plus si functii,sau proceduri,numite si’metode’.Un
tip obiect este o structura cu numar fix de componente dintre care unele sunt campuri de date,iar altele sunt metode
ale obiectului respective.
Definirea unui obiect tip seamana cu definirea unui tip inregistrare,dra foloseste cuvantul cheie’obiect’in locul
cuvantului’record’
EXEMPLU
type complex=object
re,im:real;
procedure init(cre,cim:real);
procedure write;
procedure plus(c:complex);
function egal(c:complex):Boolean;
end;
Tipurile obiect trebuie declaratela inceputul unui program sau unei unitati ;ele nu pot fi declarate intr-un sub
program(sau intr-o alta metoda).
Metodele unui tip obiect sunt declarate in definitia obiectului respestiv,dar sunt definite ulterior;declararea
metodelor este deci o declarare anticipata,dar fara cuvantul cheie ‘forward’.
EXEMPLU
procedure Complex .Init(cre,cim:real);
begin
re:=cre;
im:=cim;
end;
procedure Complex.Write;begin
writeln(‘(‘,re:7:2,’,’,im:7:2,’)’);end;
O metoda poate apela alte metode ale aceluiasi obiect sau al altor obiecte si poate avea argumente de tip
obiect.EXEMPLU
Procedure Complex.Plus(c:complex);begin
re:=re+c.re;
im:=im+c.im;
end;
Lista de parametric din definitia unei metode trebuie sa coincida cu cea din declaratia metodei in definitia tipului
obiect;deci trebuie folosite aceleasi nume pt argumentele formale.Exemplu de eroarein definirea metodei init:
procedure complex.init(pre,pim:real);begin…end;
Daca tipurile obiect definite vor fi folosite in mai multe programe,atunci este preferabil sa se ceeze un fisier
untate TP care sa contina in partea de interfata definitiile obiectelor,iar in partea de implementare definitile
metodelor
Deci este posibil accesul direct la datele unui obiect ,se recomanda ca prelucrarea campurilor de date ale unui
obiect sa se faca numai prin intermediul metodelor acelui obiect.Inacest sens exemplul dat ar trebui completat cu
metode de acces la partea reala si la partea imaginara aunui numar complex.
EXEMPLU
function complex.RePart:real begin
RePart:=re;end;
154
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Dupa definirea unui obiect se pot declara variabile obiect,tablouri de variabile obiect,pointeri catre tipul obiect,se
pot folosii parametric de un tip obiect in sub programe;
aceste variabile pot fi statice sau dinamice,pot fi globale sau locale unui sub progerm.
Utilizarea componentelor unui obiect este similara cu cea acomponentelorunei inregistrari,
EXEMPLU
var c1,c2:complex;
PC: complex;
c1.init(3,4);c1.write;
new(PC);PC.init(7.8);PC.write;
Este posibila atribuirea intre variabile obiect de acelasi tip,asa cum este posibila atribuirea intre inregistrari de
acelasi tip.
EXEMLPU
C2:=C1;C2.WRITE;
A se observa diferenta dintre modul de folosire al unei metode si modul de folosire a unei proceduri.
De fapt aceasta diferenta este mai mult de notatiie pt ca in realitate o metoda primeste ca parametru variabila
obiect pt care a fost apelata .Deci,notatie:
c2.write;c1.init(7.8) sunt echivalente ca effect cu notatile:
write (c2)l;init(c1.7,8);
Primul parametru al oricarei metode este variabila obiect pentru care se executa;el este accesibil si ca parametru
formal cu numele ‘self’.
procedure complex.PLUS(var self:complex;c:complex);
begin
self:re:=self.re+c.re;
self.im:=self.im+c.im;end.
4.6.2 Incapsulare
Ideea de obiect are la baza o notiune mai simpla, deja cunoscuta, si anume aceea de
inregistrare(record). Spre deosebire de inregistrari, obiectele pot contine, pe langa date, functii si proceduriceea ce
mai poarta denumirea de incapsulare..
Una dintre cele mai simple definitii de obiect este urmatoarea:
Type complex=object
Re,im:real;
Function modul: real;
End;
Function complex.modul:real;
Begin
Modul:=sqrt(sqe(re)+sqr(im));
End;
Cea mai simpla cale de definire a nr complexe ar putea sa porneasca de la tipul de date record
Type complex=record
Re,im: real;
End;
Obiectul nostru va avea definitia:
Function complex=object
Re,im: real;
Function modul: real;
End;
Function complex.modul: real;
Begin
Modul:=sqrt(sqe(re)+sqr(im));
End;
METODA CONSTRUCTOR
Metoda care initializeaza variabilele
Constructor init (a,b: real);
Constructor complex.init(a,b: real);
Begin
155
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Re:=a;
Im:=b;
End;
Apelul constructorului se face prin calificarea obisnuita:
z.complex(10,12);
Deci se va face initializarea datelor componente ale lui z astfel incat z.re va avea valoarea 10, iar z.im va avea
valoare 12.
Observatie:
Un obiect poate avea mai multe metode constructor, singura restrictie fiind aceea ca acesti constructori trebuie
sa difere prin nume.
Obiectul complex va avea acum definitia:
Type complex=object
Re, im: real;
Constructor init(a,b:real);
Constructor generare(x:real);
In care constructorul generare este descris prin:
Constructor complex.generare(x:real);
Begin
Re:=x;
Im:=0;
End;
Acest constructor va fi apelat in forma:
z.generare(x);
Iata cum arata cel mai simplu program “cu obiecte” in limbajul Pascal:
156
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Begin Distanta:=sqrt(sqr(x)+sqr(y));
Distanta:=sqrt(sqr(x)+sqr(y)); End;
End; Type dreptunghi=object
Dreptunghi U,v:punct;
Definiti un tip de obiect care sa reprezinte Constructor generare(a,b:punct);
notiunea geometrica de dreptunghiavand Function aria:real;
u.x:=a.x; u.y:=a.y;
laturile paralele cu axele de coordonate si v.x:=b.x; v.y:=b.y;
atasati o metoda care sa furnizeze aria sa. end;
Program test; function dreptunghi.aria:real;
Type punct=object begin
X,y:real; aria:=abs((u.x-v.x)*(u.y-v.y));
Constructor generare; end;
Function distanta:real; var
End; a,b:punct;
Constructor punct.generare; x:dreptunghi;
Begin begin
X:=0;y:=0; a.generare; a.x:=1; a.y:=1;
End; b.generare; b.x:=2; b.y:=2;
Function punct.distanta:real; x.generare(a,b);writeln(x.aria);
Begin end.
4.6.3 Mostenire
Limbajul Pascal ofera ofera o cale de reutilizare si extindere a insesi definitiei unui obiect. Avem
posibilitatea ca pornind de la o definitie de obiect sa o imbogatim adaugand noi date si metode.
Aceasta posibilitate este in realitate cel de-al doilea concept fundamentalal programarii pe obiecte si
poarta numele de mostenire.
Definitie:
Mostenirea reflecta preluarea tuturor datelor si metodelor unui stramos la care se
pot adauga alte date si metode noi rezultand un urmas.
Modificarea modului de functionare a metodelor conduce la un al treilea concept fundamental al programarii
pe obiecte si anume acela de polimorfism.
In mod concret mostenirea seamana cu un apel de functie.
Dam in continuare un exemplu de aplicare a mecanismului de mostenire pentru a obtine dintr-o fractie
(stramos)
un urmas numit rational :
unit_rat;
interface
type fractie=object
p,q:integer;
constructor init (n,m:integer);
end;
implementation
constructor fractie.init;
begin
p:=n; q:=m; end;
procedure rational. simplific;
begin
if a=b then p:=1
else begin
a:=abs(p);
b:=abs(q);
while(a<>b) do if a<b then b:=b-a else a:=a-b;
p:=semn*round(abs(p)/a); q:=round(abs(q)/a);
end;
end;
begin
end.
Obiecte derivate.
157
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Tipurile obiect definite si utilizate in programemodeleaza anumite oboiecte reale,asa cum obiectele reale pot fi
grupate si clasificate dupa semanarile si deosebirile dintre ele,tot asa putem recunoaste obiecte ci parti commune
care pot fi grupate intr-o familie de obiecte.Definirea unui obiect D derivat dintr-un obiect de baza D se face dupa
sintaxa urmatoare:
type D =object(B)…end;
Unobiect descendent mosteneste automat toate componentele obiectului din care descinde,dar are urmatoarele
posibilitati de a fi diferit de acesta:
-sa adauge alte componente noi ;
-sa redefineasca metodele mostenite.pt a le modifica actiunea,cu pastrarea numelor metodelor.
Redefinirea se face diferit pentru metodele statice sau virtuale;redefinirea metodelor statice poate modifica tipul
functiei ,nimarul si tipul argumentelor.
Un obiect descendent poate servi la randul lui ca baza pt crearea altor obiecte derivate.In felul acesta se poate
crea o ierarhie de obiecte inrudite.
EXEMPLU
unit figuri;
interface uses graph,crt;
type point=object
x.y:integer;
color integer;
procedure init
procedure show;
procedure hide;
procedure set color;
procedure move to
end;
circle=object;
r:integer
procedure init
procedure show;
procedure hide;
procedure move to;
procedure expand;
end;
point ptr=point;
circle ptr=circle;
implementation
procedure point.init
begin
x:=init x
y;=inity;
color:=white;end
procedure poin.show;begin
put pixel(x,y,color);end;
procedure point.hide;begin
put pixel (x.y.getbkcolor);end;
procedure point.move to ;begin
hide;x:=new x;y:=new y;show;end;
procedure poin set color(c:integer);
begin
if(h>=0)and(h<=15)then color :=c;end;
procedure circle.init;
begin
point,init;
r:=init r;
end;
procedure circle .show;
begin
graph.set color;(color)
graph,circle;end;
procedure circle.hide;
158
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Urmasii pot modifica metodele mostenite. Simpla reanuntare a metodei in definitia urmasului conduce la
inlocuirea metodei
mostenite cu una noua .
Vom ilustra conceptul de polimorfism prin definirea notiunii de punct in reper cartezian .Un punct e
caracterizat de cele doua
coordonate, xsiy Obiectul de tip punct va contine pe langa cele doua date , urmatoarele metode:constructor ,
distanta pana la origine ,si afisare.
type punct=object
x,y:real;
constructor init(a,b:real);
function ro :real;
procedure afis;
end;
Definitie:
Numim polimorfism, acea proprietate prin care o functie apelata prin acelasi nume , poate avea actiuni
diferite de la stramos la urmas .
Cum se construieste un unit ?
unit imaginar ;
interface
type complex =object
re,im:real;
constructor init (a,b:real);
constructor generare (x:real);
function modul : real;
procedure afisare; end;
implementation
constructor complex .init(a,b:real);
begin re:=a; im:=b ; end;
constructor complex.generare (x:real)
159
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
begin
re:=x; im:=0; end;
function complex .modul:real;
begin
modul :=sqrt(sqr(re)+sqr(im));
end;
Obiectele pot fi alocate dinamic prin intermediul procedurii new. Aceste obiecte vor fi create in heapsi
pot fi
distruse prin apelul proceduriidispose. Utilizarea procedurilor new si dispose se face prin sintaxa extinsa in care
acestea
au doi parametrii:
-new are primul parametru un pointer catre obiectul care urmeaza sa fie creat iar al doilea este chiar
constructorul
obiectului.
-disposeare primul parametru un pointer catre obiectul care va fi distrus iar al doilea seste detructorul
obiectului.
exemplu:
program dinamic ;
type exemplu=object
n:integer;
constructor gen(i:integer);
destructor dis;
end;
constructor exemplu.gen(i:integer);
begin
n:=i;
writeln(‘am creat un obiect’);
destructor eemplu .dis;
begin
writeln(‘am distrus un obiect’);
end;
var E,F:^exemplu;
begin
end.
De obicei constructorul;unui obiect descendent are ca prima actiune apelarea constructorului obiectului din
care se dechide. In general se definesc ca metode virtuale acele metode care se pot modifica pt obiectele
descendente,dar care sunt folosite in alte metode care nu vor mai fi modificate
160
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
5. Metode de programare
5.1 BACKTRACKING:prezentare generala,oportunitatea
utilizarii metodei;aplicatii specifice
Aspecte teoretice
Aceasta tehnica se foloseste in rezolvarea problemelor care indeplinesc simultan
conditiile:
-solutia lor poate fi pusa sub forma unui vector S=x 1,x2…xn , cu x1 €A1 ,… xn€ An;
-multimile A1 ,… An; sunt multimi finite ,iar elementele lor se considera ca se aflã intr-o
relatie de ordine bine stabilita;
-nu se dispune de o alta metoda de rezolvare mai rapida.
Observatii:
-nu pentru toate problemele n este cunoscut de la început;
-x1,x2…xn pot fi la rândul lor vectori;
-în multe probleme ,multimile A1 ,… An; coincid.
La întâlnirea unei astfel de probleme, dacã nu cunoastem aceasta tehnica,
suntem tentati sã generãm toate elementele produsului cartezian A 1XA2X… X An; si
fiecare element să fie testat dacă este soluţie. Rezolvând problema în acest mod ,
timpul de execuţie esteatât de mare, încât poate fi considerat infinit,algoritmul neavând
nici o valoare practica.
De exemplu, dacă dorim să generăm toate permutările unei multimi finite A, nu
are rost să generăm produsulcarteyian AxAx…xA, pentru ca apoi, să testăm pentru
fiecare element al acestuia, dacă este sau nu permutare)nu are rost să generăm
1,1,1,1,1…,1, pentru ca să constatăm că nu am obţinut o permutare, când de la a
doua cifră 1 ne putem da seama că cifrele nu sunt distincte).
Obs: tehnica Backtracking are ca rezultat obţinarea tuturor soluţiilor problemei. În
cazul în care se cere o singură soluţie , se poate forţa oprirea , atunci când a fost
găsită.
Pentru uşurarea înţelegerii metodei, vom prezenta o rutină unică,aplicabilă
oricărei probleme, rutină care este elaborată folosind noţiunea de stivă. Rutina va
apela proceduri şi funcţii care au întotdeauna acelaşi nume şi parametri şi care , sin
punct de vedere al metodei, realizează acelaşi lucru. Sarcina rezolvitorului este să
scrie explicit, prntru fiecare problemă în parte, procedurile şi functiile apelate de rutina
backtracking.
Evident, o astfel de abordare conduce la programe lungi. Nimeni nu ne opreşte
ca, după înţelegerea metodei, să scriem programe scurte, specifice fiecărei probleme
în parte.
Am arătat că orice soluţie se generează sub formă de vector. Vom că
generarea soluţiilor se face într-o stivă. Astfel x1 €A1 se va găsi pe primul nivel al stivei,
x2 €A2 se va găsi pe al doilea nivel al stivei,…, xk €Ak se va găsi pe nivelul k al stivei.
Nivelul k+1 al stivei trebuie iniţializat (pentru a alege ,în ordine, elementele
mulţimii k+1). Iniţializarea trebie făcută cu o valoare aflatăînaitea tuturorvalorilor
posibile din mulţime.
De exemplu , pentru generarea permutărilor mulţimii{1,2,…n} , orice nivel al
stivei va lua valori de la 1 la n . Iniţializarea unui nivel se face cu valoarea 0. Procedura
de iniţializare o vom numi init şi va avea doi parametri:k,nivelul care trebuie iniţializat
şi ST(stiva).
=>Găsirea următorului element al mutţimii Ak , element netestat se face cu ajutorul
procedurii succesor(as,st,k). Parametrul as-am succesor-este o variabilă booleană.
161
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
În situaţia în care am găsit elementul, acesta este pus în stivă şi as ia valoarea true,
contrar as ia valoarea false.
=> Odată ales un element, trebuie văzut dacă acesta îndeplineşte condiţiile de
continuare. Acest test se face cu ajutorul procedurii valid(ev,st,k). Variabila ev este
booleană.
=>Testul dacă s-a ajuns sau nu la soluţia finală
se face cu ajutorul funcţiei soluţie(k).
Aceasta tehnica se foloseste in rezolvarea problemelor care indeplinesc simultan urmatoarele conditii:
solutia lor poate fi pusa sub forma unui vector S=x1,x2,..,xn,cu x1 apartine de de A1,x2
apartine de A2,…,xn apartine de An;
multimile A1,A2,…,An sunt multimi finite,iar elementele lor se considera ca se afla intr-o relatie
de ordine bine stabilita;
nu se dispune de o alta metoda de rezolvare,mai rapida.
Observatii:
nu pentru toate problemele n este cunoscut de la inceput;
x1,x2,…,xn pot fi la randul lor vectori;
in multe probleme,multimile A1,A2,…,An coincide.
Observatie: tehnica Backtracking are ca rezultat obtinerea tuturor solutiilor problemei.In cazul in care se
cere o singura solutie,se poate forta oprirea,atunci cand a fost gasita.
Pentru usurarea intelegerii metodei,vom prezenta o rutina unica(aplicabila oricarei
probleme),rutina care este elaborate folosind structura de stiva.Rutina va apela functii care au
intotdeauna acelasi nume si care,din punct de vedere al metodei,realizeaza acelasi
lucru.Sarcina rezolvitorului este sa scrie explicit,pentru fiecare problema in parte,functiile
apelate de rutina backtracking.
Evident o astfel de abordare conduce la programe lungi.Nimeni nun e opreste ca,dupa
intelegerea metodei,sa scriem programe scurte,specifice fiecarei probleme in parte(de
exemplu,scurtam substantial textul doar daca renuntam utilizarea unor functii,scriind
instructiunile lor chiar in corpul rutinei).
Aplicatii rezolvate iterativ
o Generarea permutarilor.Se citeste un numar natural n.Sa se genereze toate permutarile
multimii {1,2,..,n}.
Generarea permuatrilor se va face tinand cont ca orice permutare va fi alcatuita din elemente distincte
ale multimii A={1,2…,n}.
Prezentam algoritmul corespunzator cazului n=3;
1 2 3
1 2 2 2 2
1 1 1 1 1 1
1 2 3
3 3 3 3 1
1 1 1 1 2 2
1 2 3 1
1 1 1 2 3 3
2 2 2 2 2 2
162
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Cum procedam?Observam, ca o dama trebuie sa fie plasata singura pe linie.Plasam prima dama pe
linia 1 coloana 1.
Observam ca a treia daman u poate fi plasata in linia a 3-a.Incercam atunci plasarea celei de-a doua
dame in coloana a 4-a.
D
163
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
D
D
D
D
D
Acum este posibil sa plasam a patra dama in coloana a-3-a si astfel am obtinut o solutie a problemei.
D
D
D
D
Algoritmul continua in acest mod pana cand trebuie scoasa de pe tabla prima dama.
Pentru reprezentarea unei solutii putem folosi un vector cu n componente (avand in vedere ca pe
fiecare linie se gaseste o singura dama).Exemplu:pentru solutia gasita avem vectorul st ce poate fi
asimilat unei stive.
Doua dame se gasesc pe aceeasi diagonala daca si numai daca este indeplinita conditia:l st(i)-st(j) l=li-
jl: diferenta, in modul, intre linii si coloane este aceeasi).
ST(4)
ST(3)
ST(2)
ST(1)
164
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
D st(1)= 1 i=1
st(3)=3 j=3
D l st(1) – st(3) l = l 1-3 l=2
l i-j l = l 1-3 l= 2
sau situatia:
D st(1) = 3 i = 1
st(3) = 1 j=3
D | st(i) – st(j)l|= | 3-1 | = 2
| i-j | = |1-3 | = 2
Intrucat doua dame nu se pot gasi in aceeasi coloana, rezulta ca o solutie este sub forma de permutare.
O prima idee ne conduce la generarea tuturor permutarilor si la extragerea solutiilor pentru problema
( ca doua dame sa nu fie plasate in aceeasi diagonala).A proceda astfel, inseamna ca nu lucram
conform strategiei backtracking.
end;
begin
type sir =array[1..100] of integer; READLN(N);
write('dati vectorul ');
var x:sir; readln(v);
p,i,j,k,n,k1:integer; for i:=1 to n do
as,ev:boolean; read(v[i];
v:string[20]; k:=1;
x[k]:=0;
procedure succesor(var while(k>0) do
x:sir;k:integer;var as:boolean); begin
begin repeat
if (x[k]<n) then begin succesor(x,k,as);
as:=true; x[k]:=x[k]+1; if as then valid(x,k,ev)
until (as and ev) or (not
end as);
else if as then
as:=false; if (k=n) then
end; afis(x,k)
else
3 procedure begin
1 valid(x:sir;k:integer;var k:=k+1;
4 ev:boolean); x[k]:=0;
2 var i:integer; end
begin else
ev:=true; k:=k-1 ;
for i:=1 to k-1 do end;
if v[x[k]]=v[x[i]] then readln;
ev:=false; end.
165
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
begin x[k]:=0;
if (x[k]<n ) then begin end
as:=true; x[k]:=x[k]+1; else
k:=k-1 ;
end end;
else readln;
as:=false; end.
end;
{se pleaca din orasul 1 si se
procedure valid(x:sir;k:integer;var cunosc distantele la celelate
ev:boolean); orase
var i:integer; Se cer toate traseele ce trece
begin prin toate localitatile si
ev:=true; ajunge la primul
for i:=1 to k-1 do iar distanta zero inseamna ca
if (x[k]=x[i]) OR (K-i =ABS(X[K]- nu am legatura directa}
X[I])) then ev:=false; uses crt;
type sir =array[1..100] of
end; integer;
var x:sir;
procedure afis(x:sir;k:integer); i,j,k,n:integer;
var i,j:integer; as,ev:boolean;
begin p:=p+1; a:array[1..50,1..50] of
for i:=1 to n do integer;
begin
procedure succesor(var
for j:=1 to n do x:sir;k:integer;var
if x[i]=j then as:boolean);
write('1 ',' ') begin
else if (x[k]<n) then begin
write('0 ',' '); as:=true;
x[k]:=x[k]+1;
writeln;end; end
writeln('------------------'); else
as:=false;
end; end;
begin procedure
valid(x:sir;k:integer;var
write('dati numarul n= '); ev:boolean);
readln(n); begin
k:=1; p:=1; ev:=true;
x[k]:=0; if(a[x[k-1],x[k]]=0 )then
ev:=false
while(k>0) do else
begin begin
repeat for i:=1 to k-1
succesor(x,k,as); do
if as then valid(x,k,ev) if x[i]=x[k] then ev:=false;
until (as and ev) or (not if(k=n) and(a[x[n],x[1]]=0)
as); then ev:=false;
if as then end;
if k=n then begin end;
writeln('solutia
',p);writeln('==============');
afis(x,k); procedure
end afis(x:sir;k:integer);
else var i:integer;
begin begin
k:=k+1;
166
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
for i:=1 to k do
write(x[i]:5); end
WRITELN; else
end; as:=false;
begin end;
167
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
168
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
BACTRACKING IN PLAN
{Fie o tabla de sah si un cal in coltul stinga begin
sus for j:=1 to n do
Sa se afiseze toate modalitatile de mutare a write(a[i,j]:4);
calului asfel inacit sa writeln;
treaca o singura data prin fiecare patarat al end;
tablei} end;
uses crt;
type sir =array[1..8] of integer; procedure calul(var
mat=array[1..20,1..20] of integer; A:mat;i,j:integer;pas:integer);
const var k,i1,j1:integer;
di:sir=(-2,-1,1,2,2,1,-1,-2); cond:boolean;
dj:sir =(1,2,2,1,-1,-2,-2,-1); begin
var a:mat; for K:=1 to 8 do
i,j,n,ns,pas:integer; begin
i1:=i+di[K];
procedure afis; j1:=j+dj[k];
var i,j:integer; cond:=(i1 in [1..n]) and (j1 in [1..n]) and
begin (a[i1,j1]=0) ;
ns:=ns+1; if cond then begin
writeln('solutia cu numarul ',ns,'este '); a[i1,j1]:=pas;
for i:=1 to n do if pas=n*n then
169
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
begin begin
afis ; i1:=i+di[K];
readln; j1:=j+dj[k];
end cond:=(i1 in [1..n]) and (j1 in [1..n]) and
else calul(a,i1,j1,pas+1); (a[i1,j1]=0) and (lab[i1,j1]=1) ;
a[i1,j1]:=0; if cond then begin
end; a[i1,j1]:=pas;
end; if (i1 in [1..n]) or (j1 in [1..n]) then afis
end; else calul(a,i1,j1,pas+1);
a[i1,j1]:=0;
begin
clrscr; end;
writeln ('n='); end;
readln(n); end;
for i:=1 to n do
for j:=1 to n do begin
a[i,j]:=0; clrscr;
a[1,1]:=1; writeln ('n=');
ns:=0; readln(n);
pas:=2; for i:=1 to n do
calul(a,1,1,pas); for j:=1 to n do
readln; begin
end. writeln('labirint[',i,',',j,']=');
{Fie un labirint unde cifra 1 este culoar pe readln(lab[i,j]);
care se poate circula end;
iar zero nu se poate circula intr-o matrice for i:=1 to n do
Sa se afiseze toate modalitatile de deplasare for j:=1 to n do
a a[i,j]:=0;
unei persoane pe cifre de 1 astfel ns:=0;
sa poata sa iese din labirint dintr-o anumita writeln('linia de plecare');
pozitie readln(l);
deplasindu-se la nord,sud,est,vest} writeln('coloana de plecare');
uses crt; readln(c);
type sir =array[1..4] of integer; a[l,c]:=1;
mat=array[1..20,1..20] of integer; pas:=2;
const for i:=1 to n do
di:sir=(-1,0,1,0); begin
dj:sir =(0,1,0,-1); for j:=1 to n do
var a,lab:mat; write(lab[i,j]:4);
i,j,n,ns,pas,c,l:integer; writeln;
cond:boolean; end;
procedure afis; calul(a,l,c,pas);
var i,j:integer; readln;
begin end.
ns:=ns+1; {$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R-,S
writeln('solutia cu numarul ',ns,' este '); +,T-,V+,X+}
for i:=1 to n do {$M 16384,0,655360}
begin { Portiuni cu valoarea 1 dintr-o matice
for j:=1 to n do reprezinta un obiect.Cite
write(a[i,j]:4); obiecte sunt intr-o matrice}
writeln; uses crt;
end; type matrice=array[0..9,0..9] of integer;
end; var a:matrice; gasit:boolean;
n,m,i,j,x,y:integer;
procedure calul(var procedure transforma(x,y:integer;var
A:mat;i,j:integer;pas:integer); a:matrice);
var k,i1,j1:integer; begin
cond:boolean; if a[x,y]=1 then
begin begin
for K:=1 to 4 do a[x,y]:=0;
170
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
171
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
BACTRACKING RECURSIV
{Sa se genereze toate descompunerile tipar(p);
172
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
173
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
1 2 2 2 2
1 1 1 1 1 1
1 2 3
3 3 3 3 1
1 1 1 1 2 2
1 2 3 1
1 1 1 2 3 3
2 2 2 2 2 2
end writeln;
else end;
as:=false;
end; begin
174
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
st[k]:=st[k]+1;
write('dati cuvintul '); as:=true;
readln(v); end
n:=length(v); else as:=false;
end;
k:=1; procedure valid(var
x[k]:=0; ev:boolean;st:stiva;k:integer);
while(k>0) do var i:integer;
begin begin
repeat ev:=true;
succesor(x,k,as); for i:=1 to k-1 do
if as then valid(x,k,ev) if st[k]=st[i] then ev:=false;
until (as and ev) or (not as); end;
if as then function solutie(k:integer):boolean;
if (k=n) then begin
afis(x,k) solutie:=(k=n);
else end;
begin procedure tipar;
k:=k+1; var i:integer;
x[k]:=0; begin
end for i:=1 to n do write(st[i]);
else writeln;
k:=k-1 ; end;
end; Begin
readln; write('n=');readln(n);
end. k:=1;init(k,st);
while (k>0) do
VARIANTA 2 begin
program permutari; repeat
type stiva=array[1..100] of integer; succesor(as,st,k);
var st:stiva; if as then valid(ev,st,k);
n,k:integer; until (not as) or(as and ev);
as,ev:boolean; if as then
procedure init(k:integer;var st:stiva); if solutie(k) then tipar
begin else begin
st[k]:=0; k:=k+1;
end; init(k,st);
procedure succesor(var as:boolean;var end
st:stiva;k:integer); else k:=k-1;
begin end
if st[k]<n then End.
begin
…
Algoritmul continua pana cand stiva devine vida.
5.4.2 Generare aranjamente
type sir =array[1..100] of
{ Se citesc n si p numere integer;
numere naturale n>=p unde n
este numarul de litere care se var x:sir;
dau. p,i,j,k,n:integer;
Se cere sa se genereze toate as,ev:boolean;
submultimile v:array[1..50] of char;
multimi(a,b,...,z ) de p
elemente.Doua multimi cu procedure succesor(var
aceleasi elemente x:sir;k:integer;var
la care ordinea acestora difera as:boolean);
sunt considerate aceleasi.} begin
uses crt; if (x[k]<n) then begin
as:=true; x[k]:=x[k]+1;
175
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
end k:=k-1 ;
else end;
as:=false; readln;
end; end.
VARIANTA 2
procedure Generare aranjamentelor. Se citesc n si
valid(x:sir;k:integer;var
p. Sã se genereze toate aranjamentele
ev:boolean);
var i:integer; de n luate câte p.
begin program aranjamente;
ev:=true; type stiva=array[1..100] of integer;
for i:=1 to k-1 do var st:stiva;
IF (v[x[k]]>v[x[I]] )then
ev:=false;
n,k,p:integer;
as,ev:boolean;
end; procedure init(k:integer;var st:stiva);
begin
st[k]:=0;
procedure
afis(x:sir;k:integer); end;
var i:integer; procedure succesor(var as:boolean;var
begin st:stiva;k:integer);
for i:=1 to k do begin
write(v[x[i]],' ');
if st[k]<n then
writeln; begin
end; st[k]:=st[k]+1;
as:=true;
begin end
write('dati numarul de litere else as:=false;
din vector '); end;
readln(n); write('dati procedure valid(var
numarul litere cite combinati ev:boolean;st:stiva;k:integer);
'); var i:integer;
readln(p);
begin
for i:=1 to n do ev:=true;
begin for i:=1 to k-1 do if st[k]=st[i] then
write('numarul ',i,' este ev:=false;
');
readln(v[i]);
end;
end; function solutie(k:integer):boolean;
k:=1; begin
x[k]:=0; solutie:=(k=p);
while(k>0) do end;
begin
repeat procedure tipar;
succesor(x,k,as); var i:integer;
if as then valid(x,k,ev) begin
until (as and ev) or for i:=1 to p do write(st[i]);
(not as);
writeln;
if as then
if (k=p) then end;
afis(x,k) Begin
else write('n=');readln(n);
begin write('p=');readln(p);
k:=k+1;
x[k]:=0;
k:=1;init(k,st);
end while (k>0) do
else begin
176
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
repeat
succesor(as,st,k); k:=k+1;
if as then
valid(ev,st,k); init(k,st);
until (not as) or(as and end
ev); else k:=k-1;
if as then end
if solutie(k) then End.
tipar
else begin
177
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
178
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
179
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
x[k]:=-1 readln;
end end.
else
k:=k-1
end;
5.4.6 Partitii
a)Partitiile unui numar natural
180
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
{1} max:=0;
for i:=1 to k-1 do
pt n=2
if max<p[i] then max:=p[i];
{1,2} for i:=1 to max+1 do
{1},{2} begin
pt n=3 p[k]:=I;
{1 2 3} part(k+1,n,p);
end;
{1 2},{3} end;
{1 3 },{2} end;
{1},{2 3} begin
{1 },{2},{3}} read(n);
part(1,n,p);
EXPLICATII: end.
Programul afiseaza pentru n=1
1 adica {1} care apartine de VARIANTA 2:
multimea 1 {Se da un numar n>1.Se cere sa se
n=2 genereze toate partitiile multimii
11 adica {1,2} adica primele 2 {1,2,...,n)
numere apartin ambele de multimea ex:n=2=>
1 (1 ),(2),(1,2)
12 adica {1},{2} deci primul numar e
in prima multime,celalat e in cea de }
a doua
n=3 program partitii;
var x:array [1..10] of byte;
111 adica {1 2 3}
n,k,v,i,j,max,p:byte;
112 adica {1 2},{3} begin
121 adica {1 3},{3} write('n='); readln(n);
122 adica {1},{2 3} p:=0;
123 adica {1},{2},{3} k:=1;
x[1]:=0;
} while k>0 do begin
v:=0;
type vector =array[1..9] of integer; while (x[k]+1<=k)
var n,i:integer;p:vector; and (v=0) do
procedure tipar; begin
var I,j,max:integer; x[k]:=x[k]+1;
begin max:=x[1];
write(“partitia “); for i:=2 to
max:=1; k-1 do
for i:=2 to n do if
if max<p[i] then max:=p[i]; max<x[i] then max:=x[i];
for i:=1 to max do if
begin x[k]<=max+1 then v:=1
write(“multimea ‘,I,’ ‘ ); else v:=0;
for j:=1 to n do end;
if p[j]=I then if v=0 then k:=k-1
then write(j); else if k<n then
writeln; begin
wnd;
end; k:=k+1;
procedure part(k,n:integer;var
p:vector); x[k]:=0
var max,i:integer;
begin end
if k=n+1 then tipar else begin
else p:=p+1;
begin
181
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
if
max<x[n] then max:=x[n]; if x[j]=i then write(j,' ');
begin writeln;
end;
write('{'); end;
readln;
for j:=1 to n do end.
Procedure GREEDY1(A,n,B);
BØ
For i=1,n
Call ALEGE(A,i,x)
Call POSIBIL(B,x,v)
If v=1 then call ADAUG(B,x)
Endif
Repeat
Return
End
Procedure GREEDY2(A,n,B);
Call PREL(A); BØ
For i=1,n
Call POSIBIL(B,ai,v)
If v=1 then call ADAUG(B,ai)
Endif
182
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Repeat
End
Sa considaram o multime A cu n elemente.Se cere o submultime a sa, eventual m<=n elemente, astfel incat sa fie
indeplinite anumite conditii(acestea difera de la o problema la alta).
Se considera o multime de n enumere reale..Se cere o submultime a sa astfel incat suma elemetelor ei sa fie
maxima.Pentru rezolvare vom alege un prim element al multimii de numere reale.Daca este posibil acesta va fi
adaugat solutiei,initial vide.Posibilitatea ca acesta sa fie edagat este data de semnul numarului(acesta trebuie sa
fie mai mare ca 0).Se alege un al doilea numar cu care se procedeaza in mod asemanator.
Algoritmul se incheire cand au fost alese si, 4eventual ,adaugate toate elementele multimi.
Pentru a rezolva o problema cu Greedy ,solutiia se construieste ,dupa algoritmul de mai jos.
Pentru fiecare element care urmeaza sa fie adaugat solutiei finale, se efectueaza oalegere a sa dintre elementele
multimi A(dupa un mecanism specific fiecarei probleme in parte),iar daca este posibil,acesta este
adaugat.Alghoritmul se termina,fie cand a fost gasita solutia ceruta ,fie cand afost gasita solutia ceruta fie cand s-a
constatat inexistenta acesteia.
Intuitiv,alegem un element,al doilea,.... pana cand obtinem ce dorim sau pana cand au fost testate toate elementele
multimii.De aici provine si numele metodei(greedy=lacom.)
Cel care elaboreaza un algoritm greedy trebuie sa stie faptul ca, procedand in modul ales de el, se ajunge la
rezultatul dorit.Pentru fiecare problema in parte,dupa ce se identifica un algoritm,este onbligatoriu sa se
demonstreze ca acesta conduce la solutia optima.
In general,numarul de operatii de baza efectuate de un algoritm greedy este o expresie polinomiala -algoritmi sunt
performanti
De multe ori este necesar ca elementele multimii A sa fie sortate,pentru ca apoi sa slegem din acestea.
Problema spectacolelor
Intr-o zi trebuie planificate n spectacole.Pentru fiecare spectacol se cunoaste intervalul in care se desfasoara:
[st,sf(.Se cere sa se planifice un numar maxim de spectacole astfel incat sa nu se suprapuna.
183
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
184
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Fie G=(X,) un graf neorientat în care două vârfuri distincte ale grafului sunt unite între ele.
Să se determine un ciclu care să îndeplinească simultan următoarele condiţii:
- să treacă prin toate nodurile grafului;
- costul drumului să fie minim.
185
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
(de exemplu de timp caz în care costul unei muchii a grafului reprezintă timpul necesar comis-
voiajorului pentru a ajunge dintr-un oraş în altul).
O modalitate de rezolvare a acestei probleme este de a genera toate ciclurile şi de a-l reţine pe
cel de drum minim. O astfel de abordare conduce la un algoritm neperformant (timp exponenţial). Din
acest motiv această soluţie nu are valoare practică.
Pentru această problemă nu se cunosc algoritmi care să nu necesite un timp exponenţial. Iată
motivul pentru care renunţăm la condiţia de optimalitate şi ne mărginim să găsim un ciclu care să
treacă prin toate oraşele cu un cost pe cât posibil redus.
3 5 5 1
5
1
4 2
9
4 3
Dintre toate muchiile care au extremitatea în nodul 1 se alege muchia (1,2) ştiind că aceasta
are costul minim (1).
Dintre toate muchiile cu extremitatea în nodul 2 se alege muchia (2,3).
În continuare se aleg muchiile (3,5),(5,4),(4,1) şi astfel se obţine graful din figura de mai jos.
1
1 1
9
2
186
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
5
1
Acest graf (de cost 18) nu are costul minim. De exemplu, graful din figura de mai jos are
costul 15.
4
1
1
6 3
3 5
1
În program, vectorul S reţine nodurile selectate (S(I)=1, dacă nodul I a fost selectat şi S(I)=0
în caz contrar).
Program cv;
Type matrice=array[1..9,1..9] of integer;
Vector=array[1..9] of integer;
Var a:matrice;
s:vector;
n,I,j,v,v1,v2,min,cost:integer;
begin
write(‘n=’);
readln(n);
for I :=1 to n-1 do
for j:=I+1 to n do begin
write(‘a[‘,I,’,’,j,’]=’);
readln(a[I,j]);
a[j,I]:=a[I,j];
end;
for I:=1 to n do
begin
s[I]:=0;
a[I,I]:=0;
end;
write(‘nodul de pornire este =’);
readln(v);
s[v]:=1; v2:=v;
cost:=0;
writeln(v);
for I:=1 to n-1 do
begin
min:=30000;
for j:=1 to n do
if (a[v2,j]<>0) and (s[j]=0) and (a[v2,j]<min)
187
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
then
begin
min:=a[v2,v]; v1:=j;
end;
v2:=v1; s[v2]:=1;
cost:=cost+min;
writeln(v1);
end;
cost:=cost+a[v2,v];
writeln(v);
writeln(‘cost total =’,cost);
end.
procedure DETI(p,q)
global n,A(1:n);integer p,q,m // //
if MIC(p,q) then return(G(p,q))
else
m:=DIVIDE(p,q);
return(combină (DETI(p,m),DETI(m+1,q)))
endif
end DETI
188
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Aici MIC(p,q) reprezintă o funcţie booleană de evaluare, care determină dacă intrarile
sunt suficient de mici pentru a putea fi calculate fără diviziuni. Dacă da, atunci se apelează
funcţia neprecizată (aici) G(p,q), dacă nu se aplează funcţia DIVIDE, care furnizează
m=DIVIDE(p,q).
Prin determinarea lui m apar două subprobleme, prin împărţirea lui
A(p,q) în A(p,m) şi A(m+1,p).
Soluţiile lor se găsesc prin aplicarea recursivă a lui DETI. Funcţia
COMBINĂ – va combina soluţiile celor două subprobleme.
Procedure divideetimpera(p,q,a);
Begin
If (q-p)<=0.0005 then
Prelucreaza_rezolva(p,q,a)
Else
Begin
Divizeaza_imparte(p,q,m);
Divideimpera(p,m,b);
Divideimpera(m+1,q,c);
Combina_rezultatele(b,c,a)
End;
End;
189
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
subproblemele(aflam maximul pentru fiecare dintre ele) iar solutia problemei va fi data de
valoarea maxima dintre rezultatele celor doua subprobleme.
type sir=array[1..20] of integer;
var x, y,xx:sir;k1,n,i,ss:integer; ssss:boolean;
function afis11111(x:sir;k,p:integer);
var s1,s2:integer;
begin
if k=p then afis11111:=x[k]
else
begin
s1:=afis11111(x,k,trunc((k+p) div 2));
s2:=afis11111( x,trunc( ( k+p ) div 2 +1 ),p );
if s1>s2 then afis11111:=s1 else
afis11111:=s2;
end;end;
begin
writeln('n=');readln(n);
for i:=1 to n do
begin
writeln('xx[',i,']=');
readln(xx[i]);
end;
write(afis11111(xx,1,n )) readln;
end.
CAUTARE BINARA
Se citeste un vector cu n componente numere intregi, unde numerele se
presupun ordonate crescatoare si o valoare intreaga (nr).Sa se decida daca
nr se gaseste sau nu printre numrele citite, iar in caz afirmativ, sa se
tipareasca indicele componentei care contine acea valoare.
190
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Conform strategiei generale Divide et impera,problema este descompusa in alte doua subprobleme de
acelasi tip si,dupa rezolvarea lor,rezultatele se combina(in particular se interclaseaza).Descompunerea
unui vector in alti doi vectori care urmeaza a fi sortati are loc pana cand avem de sortat vetori de una
sau doua componente.
In aplicatie,functia sort sorteaza un vector cu maximum doua elemente;interc interclaseaza
rezultatele ;divimp implementeaza strategia generala a metodei studiate
matematic:
a=(1 3 5 9)
b=(2 4)
i=1,j=1,k=1
a1<b1
deci avem
c1=1
i=2
k=2
a2>b1
deci avem
c2=2
j=2
k=3
a2<b2
deci avem
c4=4
j=3
k=5
au mai ramas de copiat c5=5
c6=9
191
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
begin k:=k+1;
b[k]:=a[i]; end;end;
i:=i+1; procedure divimp(xxx1,xxx2:integer;var a:vector);
k:=k+1; var m:integer;
end begin
else if (xxx2-xxx1)<=1 then
begin sort(xxx1,xxx2,a)
b[k]:=a[j]; else
j:=j+1; begin
k:=k+1; m:=(xxx1+xxx2) div 2;
end; divimp(xxx1,m,a);
if i<=m then divimp(m+1,xxx2,a);
for j:=i to m do interclasare(xxx1,xxx2,m,a);
begin end;end;
b[k]:=a[j]; begin
k:=k+1; writeln('n=');readln(n);
end for i:=1 to n do
else begin
for i:=j to xxx2 do writeln('a[',i,']=');
begin readln(a[i]);
b[k]:=a[i]; end;
k:=k+1; divimp(1,n,a);
end; for i:=1 to n do
k:=1; write(a[i]);
for i:=xxx1 to xxx2 do readln;
begin end.
a[i]:=b[k];
o Sortare rapida.Fie vectorul a cu n numere intregi(sau reale).Se
cere ca vectorul sa fie sortat crescator.
Pentru rezolvare este necesara o functie poz care trateaza o portiune din vector
cuprinsa intre indicii dati de li (limita inferioara) si ls(limita superioara).Rolul acestei
functii este de a pozitiona prima componenta a[li] pe o pozitie k cuprinsa intre li si
ls,astfel incat toate componentele vectorului cuprinse intre li si k-1 sa fie mai mici sau
egale decat a[k] si toate componentele vectorului cuprinse intre k+1 si ls sa fie mai
mari sau egale decat a[k].
In aceasta functie exista doua moduri de lucru:
a) i ramane constant,j scade cu 1;
b) i creste cu 1,j ramane constant.
Functia este conceputa astfel:
initial,i va lua valoarea li,iar j va lua valoarea ls (elemental care initial
se afla pe pozitia li se va gasi mereu pe o pozitie data de i sau de j);
se trece in modul de lucru a);
atata timp cat i<j,se executa:
-daca a[i] este strict mai amre decat a[j],atunci se inverseaza cele doua
numere si se schimba modul de lucru;
-i si j se modifica corespunzator modului de lucru in care se afla
programul;
-k ia vlaoraea comuna a lui i si j.
Dupa aplicarea functiei poz,este evident ca elementul care se afla initial
in pozitia li va ajunge pe o pozitie k si va ramane pe acea pozitie in
cadrul vectorului deja sortat,fapt care reprezinta esenta algoritmului.
Functoa quick are parametrii li si ls(limita inferioara si limita superioara).In cadrul ei
se utilizeaza metoda Divide et impera,dupa cum urmeaza:
192
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
matematic:
a=(6,9,3,1,2)
li=1,ls=5
i=li=1
j=ls=5
1=li<5=ls,modul A
1=a1<a5=2 inversez deci am modul B
a=(2 9 3 1 6)
i=2
j=5
9=a2>a5=6 inversez in modul A
i=2
j=4
a=(2 6 3 1 9)
6=a2>a4=1
inversez dau deci modul B
i=3 j=4
a=(2 1 3 6 9)
a3 si a4
193
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
readln;
end.
194
o Turnurile din Hanoi.Se dau 3 tije simbolizate prin a,b,c.Pe tija a se gasesc discuri de
diameter diferite,asezate in orine descrescatoare a diametrelor private de jos in sus.Se
cere sa se mute discurile de pe tija a pe tija b,utilizand ca tija intermediara tija
c,respectand urmatoarele reguli:
La fiecare pas se muta un singur disc;
Nu este permis sa se aseze un disc cu diametrul mai mare peste un disc cu diametrul mai mic.
Rezolvare:
Daca n=1 se face mutarea ab,adica se muta discul de pe tija a pe tija b.
Daca n=2 se fac mutarile ac,ab,cb.
In cazul in care n>2 problema se complica.Notam cu H(n,a,b,c) sirul mutarilor celor n discuri de pe tija a
pe tija b,utilizand ca tija intermediara,toja c.
Conform strategiei Divede et impera incercam sa descompunem problema in alte doua subprobleme
de acelasi tip,urmand apoi combinarea solutiilor.In acest sens,observam ca mutarea celor n discuri de
pe tija a pe tija b,utilizand ca tija intermediara tija c,este echivalenta cu:
Mutarea a n-1 discuri de pe tija a pe tija c,utilizand ca tija intermediara tija b;
Mutarea discului ramas pe tija b;
Mutarea a n-1 discuri de pe tija c pe tija b,utilizand ca tija intermediara tija a.
a b, daca n=1
H(n,a,b,c)=
H(n-1,a,c,b),ab,H(n-1,c,b,a), daca n>1
Pentru n=2 avem: H(2,a,b,c)=H(1,a,c,b),ab,H(1,c,b,a)=ac,ab,cb.
Pentru n=3 avem:
H(3,a,b,c)=H(2,a,c,b),ab,H(2,c,b,a)=H(1,a,b,c),ac,H(1,b,c,a),ab,H(1,c,a,b),cb,H(1,a,b,
c)=ab,ac,bc,ab,ca,cb,ab.
Etapa 1)
etapa 2)discurile sunt ordonate dupa diametru
LIMBAJUL PASCAL
var a,b,c:string;n:integer;
procedure discurile(n:integer;a,b,c:string);
begin
if n=1 then
writeln(a,' --se pune pe--> ',b)
else
begin
discurile(n-1,a,c,b);
writeln(a,'-----se pune pe---> ',b);
discurile(n-1,c,b,a);
end;
end;
begin
write('n=');readln(n);
a:='mic';b:='mijlociu';c:='mare';
discurile(n,a,b,c);
readln;
end.
Pentru un dreptunghi (initial pornim cu toata bucata de tabla),verificam daca avem sau nu o gaura in
el(se cauta practice prima din cele n gauri).In situatia cand acesta prezinta o gaura,problema se
descompune in alte patru probleme de acelasi tip.Daca bucata nu prezinta gauri,se compara aria ei cu
aria unei alte bucati fara gaura,gasita in fazele precedente.
Mentionam ca dreptunghiul de arie maxima fara gauri este retinut prin aceiasi parametric ca si
dreptunghiul cu gauri,in zonele XF,YF,LF,HF