Documente Academic
Documente Profesional
Documente Cultură
Prof.Bogdan Constantin
1
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
tangentei)
- rezolvarea sistemelor de ecuaţii liniare (Gauss, Jacobi)
7. Alocarea dinamică a memoriei
- tipuri specifice alocării dinamice a memoriei
- structuri de date implementate dinamic (lista simplu şi dublu înlănţuită, stiva, coada,
arbore binar, arbore binar de căutare, operaţii specifice – creare, inserare, ştergere,
parcurgere, căutare)
8. Teoria grafurilor
- definiţie, metode de reprezentare
- noţiunea de graf parţial, subgraf, lanţ, drum, ciclu, circuit
- parcurgerea grafurilor (parcurgerea în lăţime şi în adâncime)
- conexitate/tare conexitate, determinarea componentelor conexe/tare conexe
- drumuri minime şi maxime (algoritmii Dijkstra şi Roy-Floyd)
- grafuri euleriene şi hamiltoniene
- arbori, arbori parţiali de cost minim
- arbori cu rădăcină: metode specifice de reprezentare în memorie. Arbori binari
9. Baze de date
- definirea bazei de date
- clasificarea bazelor de date (modelul relaţional, modelul reţea, modelul ierarhic)
- prezentarea conceptelor de bază ale unui sistem de gestiune a bazelor de date
- operaţii specifice prelucrării bazelor de date (creare, adăugare, modificare, ştergere,
sortare, căutare, vizualizare, interogare)
- relaţii între baze de date
10. Noţiuni de birotică
- editor de text (Microsoft Word)
- editor de foi de calcul (Microsoft Excel)
- editor prezentări (Microsoft PowerPoint)
11. Reţele. Internet
- reţele de calculatoare, clasificarea reţelelor, protocoale de reţea (noţiuni generale)
- reţeaua Internet – descriere generală, adresarea în Internet
- (*) serviciile reţelei Internet (transferarea fişierelor prin ftp, poşta electronică, www,
telnet)
- (*) căutarea informaţiei pe Internet – motoare de căutare
REZOLVARI:
1. Arhitectura generală a sistemelor de calcul
1.1 Prezentare globală
Î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.
2
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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Ă
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ă:
3
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
discuri magnetice:
benzi magnetice;
CD-ROM-uri.
display (monitor)
imprimanta
plotter.
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
4
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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.
Memoria internă, în care se păstrează programele şi datele cu care se lucrează la un moment
dat;
5
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
reprezintă magistralele sistemului. Există o multitudine de dispozitive periferice şi standarde de
magistrală, fapt ce conduce şi la o mare varietate de interfeţe care le deservesc.
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.
6
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
Placa video este “mediatorul” între procesorul “sistemului gazdă” şi dispozitivul de
afişare video, ea realizând prelucrarea finală a informaţiei ce trebuie afişată şi generând,
totodată, comenzile de afişare.
Dacă prelucrarea realizată de placa video se referă la stabilirea dimensiunilor de
afişare, generare de caractere, operaţii pe zone de pixeli, generarea comenzilor de afişare
face trimitere la informaţia de culoare a pixelilor, semnale de sincronizare pe orizontală
şi verticală (HSYNC si VSYNC).
7
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Componentele de bază, asociate plăcii video, sunt:
-memoria video;
-coprocesorul video;
-controller-ul de magistrală;
-controller-ul de atribute;
-circuitele de conversie numeric/analogică (RAMDAC);
-generatoarele de tact;
-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
8
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
9. - Audio IN
10. - Antene TV,FM
9
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Placa de sunet
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
Prof.Bogdan Constantin
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
Prof.Bogdan Constantin
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
Prof.Bogdan Constantin
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
13
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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:
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.
14
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
2.Sisteme de operare
2.1 Concepte de baza si caracteristici ale sistemelor de
operare(structură, funcţii,
elemente de interfaţă)
Sistemul de operare este interfaţa intre hardware-ul calculatorului şi utilizator; este alcătuit dintr-o
colecţie de programe care gestionează resursele calculatorului şi controlează întreaga lui activitate.
controlul încărcării în memoria internă, punerii în funcţiune şi încetării activităţii pentru
programele utilizator;
sesizarea evenimentelor deosebite care apar în timpul execuţiei şi tratarea acestor
evenimente (mesaje de erori şi recomandări de rezolvare);
Structură
Componentele sistemului de operare:
15
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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.
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.
Functiile unui sistem de operare mai sunt:
- management al operatiilor la niv fizic si logic: sist de operare determina
cine va utilize imprimanta, discul, monitorul si alte periferice. De asemeni, SO supervizeaza utilizarea
memoriei si controleaza prioritatile diverselor evenimente. La aparitia unei erori SO raporteaza eroarea
utilizatorului.
- processor de comenzi: SO primeste comenzile utilizatorului, veifica
acuratetea lor si initiaza executia comenzilor prin lansarea programelor corespunzatoare de pe disc sau
din memorie;
- functia de control: SO trebuie sa aiba in permanenta controlul resurselor
sistemului;
- functia de tratare a erorilor: dc un progr prezinta erori de orice fel, care ii
fac imposibila executia in continuare, controlul este cedat SO care determina si raporteaza eroarea.
Un calculator este un echipament electronic cu care omul poate “conversa”. El este construit
din componente care asigură transmiterea, stocarea şi prelucrarea informaţiilor. Aceste
componente sunt “coordonate” (supervizate) prin intermediul unor suscesiuni de “comenzi”
cuprinse în programe speciale, scrise de echipe de specialişti, programe care formează
sistemul de operare cu care lucrează la un moment dat un calculator.
Deci calculatorul este compus dintr-o parte fizică (materială, componentele fizice),
numită hard, şi o parte care asigură dirijarea operaţiilor pe care le face calculatorul în
conversaţia lui cu omul, numită soft, care reprezintă colecţia de programe fără de care hardul
nu funcţionează.
16
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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>).
17
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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.
calea din care se lansează să fie calea în care s-a instalat programul;
să existe o comandă path în fişierul autoexec.bat, în care să fie specificată calea în care s-a
instalat utilitarul.
După lansarea în execuţie, pe ecran se prezintă interfaţa cu utilizatorul, care include doua
ferestre: stânga (left) şi dreapta (right), în care este afişat conţinutul directoarelor (numele de directori
sunt afişate cu litere mari, iar numele de fişiere cu litere mici).
Pe penultima linie apare prompterul, ceea ce face posibilă lansarea oricărei comenzi DOS.
Ultima linie conţine tastele funcţionale de la F1 la F10, fiecare având o semnificaţie înscrisă într-un
dreptunghi.
18
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Meniul principal se activează acţionând tasta <F9>. La selectarea unui meniu se deschide o
lista cu opţiuni, se selectează opţiunea dorită după care se acţionează tasta <Enter>
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”.
Archive –A- pentru a marca că s-a creat pentru fişier o copie de siguranţă;
System- S – pentru a preciza că fişierul aparţine sistemului de operare şi deci nu trebuie
folosit în operaţii curente;
Hidden –H – pentru a preciza că fişierul este ascuns pentru operaţiile cu fişiere şi directoare.
19
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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).
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>).
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”.
20
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Majoritatea comenzilor sau a programelor ce se pot rula in acest mediu de lucru sunt reprezentate cu
ajutorul unor pictograme, care reprezinta mici desene sugestive. Lansarea in executie se realizeaza prin
pozitionarea cursorului mouse-lui pe acesta si executarea unui dublu clik. In afara pictogramelor
interfata Windows dispune si de alte elemente grafice: butoane, casete de dialog, bare de navigare,
meniuri.
Butoanele contin semne grafice sau operatii referitoare la o decizie ce trebuie luata la un
moment dat (OK, Cancel, restart windows, end task, switch to, etc.), act lor fiind determinate de un clik
simplu.
Elemente:
1. fereastra – portiune din ecran de forma dreptunghiulara, bine
determinate, de dimensiuni variabile, care poate contine o anumita aplicatie in lucru, un fisier, una sau
mai multe pictograme ale aplicatiilor. Pe suprafata ecranului pot fi deschisa mai multe ferestre simultan,
fiecare fereastra continind propria aplicatie. Fereastra are mai multe zone importante:
- bara de titlu – in partea de sus, pe care e trecut numele aplicatiei
- bara de meniu
- bara de rulare (navigare) verticala si orizontala
2. utilizarea mouse-ului – exista mai multe moduri de folosire a butonului
sting al mouse-lui pentru efect operatiilor:
- clik-ul simplu – folosit pentru activarea meniurilor si selectarea comenzilor din acestea
si pentru apasarea butoanelor;
- clic-ul dublu – folos pt declansarea executiei unui program sau a unei aplicatii
reprezentate de o pictograma;
- drag (trage) – apasarea butonului din stinga al mouse-lui, mentinerea apasarii
deplasarea mouse-lui si eliberarea butonului – folosit pentru marirea micsorarea unei
ferestre, pentru desenare, etc.
Prin actionarea butonului drept al mouse-lui se acceseaza meniul de comenzi rapide care
contin optiuni variate in fct de zona ecranului in care se face clic. Ac optiuni vor fi referite la
sectiunea de operatii asupra fisierelor.
3. desktop – la incarcarea windows-ului pe ecran apare zona de lucru numita
desktop. Pe desk se gasesc mai multe pictograme (repr grupuri de programe sau
aplicatii)ce pot fi deschise prin exec unui dublu clik.
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.
21
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
plasează (drag and drop) prin care obiectele reprezentate prin pictograme pot fi copiate sau mutate.
Utilizatorul trebuie în acest tip de interfaţă să cunoască pictograma care reprezintă aplicaţia.
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
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.
22
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
interfata Windows dispune si de alte elemente grafice: butoane, casete de dialog, bare de navigare,
meniuri.
Butoanele contin semne grafice sau operatii referitoare la o decizie ce trebuie luata la un
moment dat (OK, Cancel, restart windows, end task, switch to, etc.), act lor fiind determinate de un clik
simplu.
Elemente:
4. fereastra – portiune din ecran de forma dreptunghiulara, bine
determinate, de dimensiuni variabile, care poate contine o anumita aplicatie in lucru, un fisier, una sau
mai multe pictograme ale aplicatiilor. Pe suprafata ecranului pot fi deschisa mai multe ferestre simultan,
fiecare fereastra continind propria aplicatie. Fereastra are mai multe zone importante:
- bara de titlu – in partea de sus, pe care e trecut numele aplicatiei
- bara de meniu
- bara de rulare (navigare) verticala si orizontala
5. utilizarea mouse-ului – exista mai multe moduri de folosire a butonului
sting al mouse-lui pentru efect operatiilor:
- clik-ul simplu – folosit pentru activarea meniurilor si selectarea comenzilor din acestea
si pentru apasarea butoanelor;
- clic-ul dublu – folos pt declansarea executiei unui program sau a unei aplicatii
reprezentate de o pictograma;
- drag (trage) – apasarea butonului din stinga al mouse-lui, mentinerea apasarii
deplasarea mouse-lui si eliberarea butonului – folosit pentru marirea micsorarea unei
ferestre, pentru desenare, etc.
Prin actionarea butonului drept al mouse-lui se acceseaza meniul de comenzi rapide care
contin optiuni variate in fct de zona ecranului in care se face clic. Ac optiuni vor fi referite la
sectiunea de operatii asupra fisierelor.
6. desktop – la incarcarea windows-ului pe ecran apare zona de lucru numita
desktop. Pe desk se gasesc mai multe pictograme (repr grupuri de programe sau
aplicatii)ce pot fi deschise prin exec unui dublu clik.
Depanare rapida - Gasirea rapida ( in mod automat) a solutiilor la diverse probleme de depanare a calc
si eventual aplicarea acestora prin facilitatea windows support automation.
23
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
c:
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
24
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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.
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 Ion
director poate conţine unul
Dana BPsau mai NCmulte autoexec.bat config.sys command.com
subdirectoare şi, eventual, unul sau
mai multe fişiere , ş.a.m.d. Organizarea informaţiilor în subdirectoare se poate observa în
figura următoare:
A1 alina.pas axa.pas max.exe text.txt ana.pas xxx.txt nc.exe
BIN USERS
Alex
Exemplu:
a: \my documents\referate\ carol.doc
26
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
folder
fişiere
Folder (dosar) este denumirea utilizată în Windows pentru “containerele” care conţin alte
foldere şi, eventual, fişiere.
Este similar cu subdirectorul din MS-DOS.
Exemple:
27
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Bara de aplicaţii – se găseşte în partea inferioară sau superioară a ecranului sau chiar în
dreapta ecranului, şi, după cum are numele, este sub formă de bară. Pe această bară se
găsesc butoane, înşirate unul după altul: butonul Start, sau butoane de aplicaţii (câte un
buton pentru fiecare aplicaţie activă; prin clic pe acest buton, va fi executată aplicaţia
ataşată).
Icon - My Computer
Bara de aplicaţii
Aplicaţie activă
O fereastră de aplicaţie se
minimizează prin clic pe
butonul din stânga din grupa
de trei butoane ce apar în
dreapta, pe prima linie a
ferestrei.
Observaţie: Un program (sau o aplicaţie) activ, spre deosebire de un program care nu este
activ, rămâne încărcat în memoria calculatorului.
Un program care nu este activ se găseşte pe suport extern şi el trebuie încărcat în
memorie pentru a deveni activ. Utilizatorul poate “conversa” cu calculatorul numai prin
intermediul unei aplicaţii active (sau a unui program activ).
Regăsirea informaţiei
28
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Move Here
Copy Here
Create Shortcuts Here
Cancel
29
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Prin intermediul scurtăturilor, putem alege o aplicaţie (sau orice fişier) din
orice loc, fără a muta fişierul. Unui fişier i se pot asocia mai multe scurtături, dar
o scurtătură nu poate fi asociată la mai multe fişiere.
30
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Folder Fişier
31
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Aranjarea iconurilor.
Iconurile se afişează pe ecran dezordonat sau ordonat. Ordonarea iconurilor poate fi: după numele
iconului, după tip, după mărime, după data creării sau o autoaranjare la distanţe fixe, dar fără criterii de
ordonare.
Fixând mouse-ul pe desktop, acţionăm butonul său drept,
determinând în acest fel apariţia unei ferestre cu opţiunile
afişate în figura alăturată.
Din fereastra de pe ecran ne alegem opţiunea Arrange
Icons prin clic pe butonul stâng al mouse-ului.
În continuare, pe ecran apare o fereastră cu posibilităţile
de aranjare a icon-urilor, din care putem selecţiona o opţiune.
32
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
2. deplasarea mouse-ului
pe opţiunea Arrange
Icons
3. deplasarea mouse-ului
pe opţiunea by Name
Aplicaţia calculator
Aplicaţia Calculator permite folosirea unui calculator ştiinţific pentru efectuarea
operaţiilor matematice.
Această aplicaţie se activează astfel:
Se acţionează butonul Start şi deplasăm cursorul pe aplicaţia Programs.
1. În meniul derulant al aplicaţiei
Programs, deplasăm cursorul pe
aplicaţia Accessories, iar din
meniul derulant al acestei
aplicaţii, alegem aplicaţia
Calculator.
2. Pe ecran apare un calculator de
buzunar, ca în figura alăturată.
33
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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.
generalitate (universal) - adică să permită rezolvarea oricărei probleme dintr-o
anumită clasă de probleme pentru care a fost stabilit.
34
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Ca exemple de algoritmi cunoscuţi din matematică amintim: algoritmul lui Newton pentru aflarea
rădăcinii pătrate aritmetice a unui număr, algoritmul lui Euclid pentru aflarea celui mai mare divizor
comun a două numere etc .
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
35
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Exemple
36
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
6. Testarea programului.
Testarea se face pe mai multe seturi de date care să acopere cazurile posibile ce pot
apărea.
3.2 Structuri fundamentale( secvenţa, decizia, repetiţia)
37
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Regulile de bază
• 1.Structura oricărui program sau subprogram va fi concepută ca o combinaţie a structurilor de
control admise: secvenţa, decizia , selecţia, ciclul
• 2. structura datelor utilizate în program trebuie să corespundă specificului problemelor
rezolvate.
• 3. Lungimea maximă a unei funcţii sau proceduri este de 50-100 linii. Folosirea variabilelor
globale nu este încurajată.
• 4. Identificatorii folosiţi pentru constante, tipuri, variabile, funcţii, proceduri şi unităţi de program
trebuie să fie cît mai sugestivi.
START
CITESTE
i
EITES
SUBRUTINA X
TE
PRINT i
STOP
38
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
- 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.
V=Vi
A
A
C
NU V=V+r
C
DA
A V>Vr
Exemplu:
Se cere algoritmul şi schema logică pentru calculul lui n!
Paşii algoritmului de calcul sunt :
1. citeşte valoarea lui n;
2. atribuie lui P valoarea 1;
3. atribuie lui I valoarea 1;
4. atribuie lui P valoarea expresiei P * I;
5. atribuie lui I valoarea expresiei I + 1;
6. dacă I<N atunci treci la pasul 4;
7. scrie valoare lui P;
8. stop.
Schema logică corespunzătoare algoritmului:
START
Citeşte
n
p: = 1
i: = 1
p: = p * i
i: = i + 1
Diagrama arborescentă
39
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
40
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
[]
dacă c > x atunci
atribuie x c
[]
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.
c) 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 :
alege expresia dintre
c1 : secvenţa 1
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 [].
41
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
[]
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
42
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
[]
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
43
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
stop
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:
44
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
START
CITESTE
i
EITES
SUBRUTINA X
TE
PRINT i
STOP
45
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Structura alternativă cu selecţie multiplă (CASE – OF) – permite selecţia între mai mult de
două posibilităţi de continuare în rezolvarea problemei.
START START
I
I
CITESTE CITESTE
I
i DA NU i DA I
A2
EITES EITES I
TE TE
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.
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;
46
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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.
Pseudocodul reprezintă un mijloc de exprimare naturală şi dezvoltare sistematică a
algoritmilor.
Pseudocodul are puţine reguli sintactice lăsând programatorului o mare libertarte în
exprimarea acţiunilor algoritmilor.
Pseudocodul permite specificarea algoritmilor prin două tipuri de enunţuri nestandard şi
standard.
Enunţurile nestandard sunt fraze în limbaj natural care pot fi utilizate de programator în
schiţarea formelor iniţiale ale algoritmilor şi sunt precedate de ***. În dezvoltarea algoritmilor, enunţurile
nestandard sunt înlocuite treptat cu enunţuri standard care exprimă operaţii cu corespondente directe
în limbajele de programare.
În forma standard fiecare comandă (operaţie) este reprezentată în limbajul Pseudocod printr-
un cuvânt care exprimă operaţia ce trebuie executată, însoţit de obicei, de elemente suplimentare care
îi particularizează efectul.
Limbajul pseudocod nu este un limbaj de programare, ci o modalitate textuală de reprezentare
a algoritmilor. El poate fi utilizat în locul reprezentărilor grafice, dar faţă de schemele logice este mult
mai puţin utilizat de către programatori.
Construcţia de bază a limbajului pseudocod este propoziţia, un algoritm fiind reprezentat printr-
o succesiune de propoziţii care pot fi:
- propoziţii simple care exprimă operaţii ce pot fi transpuse direct într-un limbaj de
programare;
- propoziţii complexe, notate cu simbolul #, care urmează să fie detaliate ulterior până la
nivelul propoziţiilor simple.
Fiecare propoziţie începe cu un verb care exprimă operaţia descrisă. Un exemplu de algoritm
reprezentat cu ajutorul limbajului pseudocod poate fi următorul:
citeşte var
atribuie var=expr
47
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
execută nume_proced
scrie var
stop
unde: var semnifică o variabilă;
expr reprezintă o expresie algebrică sau logică;
nume_proced este numele unei proceduri, care va fi detaliată ulterior.
Pentru a fi puse în evidenţă operaţiile, verbele sunt subliniate.
Cuvântul care identifică operaţia se numeşte cuvânt cheie. Enunţurile standard utilizate în
limbajele Pseudocod şi semnificaţia lor sunt următoarele:
d) operaţia de intrare (citire) - constă în transferul unor valori de pe mediul de intrare (eventual
de pe cartele sau de la un terminal) în locaţii de memorie specificate prin ‘lista de variabile’
Structura comenzii: citeşte lista de variabile
Exemplu: citeşte a,b,c
În locaţiile desemnate prin variabilele a,b,c se transferă valori de pe mediul de intrare.
e) Operaţia de ieşire (scriere) - constă în transferul unor valori din locaţiile de memori specificate
prin ‘lista de variabile’, pe mediul de ieşire (imprimantă, display etc.)
Structura comenzii: scrie lista de variabile
Exemplu: scrie x,a,d,g
Conţinutul locaţiilor de memorie desemnate prin variabilele x,a,d,g este transferat de mediul de
ieşire.
f) Operaţia de atribuire – constă în calculul valorii unei expresii, valoare ce se atribuie unei
variabile.
Structura comenzii: atribuie variabilă expresie
Exemplu: atribuie D a*b+c
atribuie E x /\ y \/ z
Variabilelor D,E li se atribuie valorile obţinute în urma calculului valorii expresiilor din dreapta
semnului
g) Operaţia de oprire – are ca efect oprirea execuţiei comenzilor în calculator
Structura comenzii: stop
h) 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 .
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
[]
48
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Î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
[]
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.
49
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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:
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:
50
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
51
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
S=
Descrierea în Pseudocod a procedurii este :
Procedura norma (a, n; s) este :
52
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
atribuie s 0
pentru i=1,n,1 execută
atribuie s s + |ai|
[]
sfârşit norma
Numele procedurii este “norma”.Parametrii de intrare necesari pentru a se realiza calculele din
procedură sunt vectorul a şi numărul de elemente ale vectorului n, iar parametrul de ieşire este S,prin
el se obţine rezultatul calculelor- norma . Separarea parametrilor de ieşire de cel de intrare se face prin
punct şi virgulă . Parametrii de intrare şi cei de ieşire specificaţi la definirea procedurii se numesc
parametrii formali.
Exemplu: Să se folosească procedura definită pentru a determina dacă norma vectorului x de l
componente este mai mare decât norma vectorului w de m componente.
Descrierea în Pseudocod a algoritmului de aflare a celei mai mari dintre normele vectorilor x şi
w este următoarea :
citeşte l ,(xi , i = 1, 1)
citeşte m,(xi , i = 1,m)
execută norma (x ,l ; s1)
execută norma (w,m; s2)
dacă s1>s2 atunci
scrie ‘norma vectorului x este mai mare’
altfel
scrie ‘norma vectorului w este mai mare’
[]
stop
În apelulprocedurii norma , parametrii x,l,s1,respectiv w,m,s2 sunt parametrii actuali.
Comanda “execută” urmată de numele procedurii are ca efect execuţia operaţiilor care
constituie procedura cu numele specificat , în care valorile parametrilor formali sunt înlocuite cu
valorile parametrilor efectivi corespunzători,adică parametrii a,n,s din procedura sunt înlocuiţi cu x,l,s1
respectiv w,m,s2 din apelul procedurii.
Corespondenţa dintre parametrii efectivi şi parametrii formali este poziţională , adică
parametrul care ocupă poziţia p în lista parametrilor formali este înlocuit cu parametrul care ocupa
poziţia p în lista parametrilor efectivi.Aceasta substituţie se numeşte transferul parametrilor.Comanda “
execută” se termină odată cu terminarea execuţiei ultimei operaţii din procedură.
Funcţia
Atunci când procedura calculează o singură valoare se poate utiliza un tip particular de
procedură numit funcţie.Descrierea unei funcţii cuprinde :
- linia de definire a funcţiei
- secvenţa de operaţii ce constituie corpul funcţiei
- linia finală
Structura unei funcţii în Pseudocod este următoarea :
funcţia nume (parametrii ) este:
secvenţa
sfârşit
unde:
- nume reprezintă numele funcţiei
- parametrii sunt parametrii funcţiei şi trebuie să fie doar parametrii de intrare
Singurul parametru de ieşire în cazul funcţiei este considerat chiar numele funcţiei care este
utilizat în secvenţa de operaţii din corpul funcţiei ca orice parametru. Valoarea acestui parametru
reprezintă valoarea funcţiei.Secvenţa din corpul funcţiei trebuie să conţină o comandă de atribuire prin
care numelui funcţiei i se atribuie o valoare.
Exemplu: Să se definească o procedură pentru calculul lui n!.
Descrierea în pseudoco a funcţiei este :
funcţia fact(m) este :
53
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
atribuie p 1
dacă m>1 atunci
pentru i=1,m,1execută
atribuie p p*i
[]
[]
atribuie fact p
sfârşit fact
Apelul unei funcţii este considerat ca operand în cadrul expresiilor .Structura apelului unei funcţii în
Pseudocod este :
nume( parametri )
unde :
- nume -reprezintă numele funcţiei
- parametrii - reprezintă lista parametrilor actuali de intrare ai funcţiei
Exemplu:
Să se folosească funcţia descrisă mai sus pentru calculul combinărilor:
= =
54
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
55
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
end;
pi := 4 * s ;
writeln(‘valoarea lui PI=’,PI:10,8);
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
56
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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.
57
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
58
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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 n1:=n; s:=0;
cunstruiasca numarul sau. while n1>0 do begin
inc(s,n1 mod 10);
var m,n:word; n1:=n1 div 10; end;
begin if m=n+s then begin
write('n='); readln(n); inc(nr);
m:=0; write(m,'este un numar deosebit.');
while (n<>0) do begin writeln(' ',m,'=',n,'+',s);
m:=m*10+n mod 10; if (m-a+1) mod 20=0 then
n:=n div 10; readln;
end; break
write(m); end
end. end;
2) Se citeste un numar natural n,sa se calculeze writeln('in intervalul[',a,',',B,']
numarul cifrelor sale. SUNT',NR,'NUMERE DEOSEBITE');
ex:123 readln;
=>3} end.
4) Se citeste un numar natural mai mare
var n,nr:word; strict decat 9 avand numar impar de
begin cifre (validare).Sa se afiseze numarul
write('n='); readln(n);
nr:=0; obtinut prin eliminarea cifrei din
while (n<>0) do begin mijloc a numarului initial;.
nr:=nr+1; Exemplu:
n:=n div 10; numarul initial:12345 numarul procesat:1245}
end; var n,n1:0..maxlongint;
write(nr); cifre,i:byte;
end. begin
3) Pentru a, b numere naturale date, 0<=a<b, sa se repeat
afiseze toate numerele write('Numarul dat:'); readln(n);
deosebite din intervalul [a,b].Pentru fiecare numar n1:=n; cifre:=0;
deosebit se va afisa o repeat
singura descompunere.Sa se precizeze numarul inc(cifre);
lor.Un numar natural m este n1:=n1 div 10
deosebit daca exista un numar natural n astfel incat until n1=0
m=n +s(n), unde s(n) until (n>9) and odd(cifre);
este suma cifrelor lui n. i:=0;
Exemplu: repeat
In intervalul [30,100] sunt 64 numere deosebite.} inc(i);
var a,b,m,n,n1,s,nr:word; if i<>cifre div 2+1 then
begin n1:=n1*10+n mod 10;
write('a='); readln(a); n:=n div 10
write('b='); readln(b); until n=0;
if b<=a then begin repeat
writeln('Data incorecta!'); readln; exit; end; n:=n*10+n1 mod 10;
nr:=0; n1:=n1 div 10
for m:=a to b do until n1=0;
for n:=0 to m do begin writeln('Numarul obtinut:',n);
59
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
60
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
3.5.2 Divizibilitate
1)Determinaţi toate numerele care sunt inc(i,k);
end;
multipli de k, care depăşesc valoarea n.
program multipli2; end.
var k,i,n:longint; 2) Se citesc n numere naturale.Sa se numere
begin cate din ele sunt pare.
write('k=');readln(k)
; var n,i,x,nr_pare:integer;
write('n=');readln(n) begin
; Write('n='); readln(n);
i:=k; nr_pare:=0;
while i<=n do for i:=1 to n do begin
begin read(x);
write(i,' '); if x mod 2 =0 then
61
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
62
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
63
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
1) Se citeste un numar natural n.Sa se verifice daca 4) Sa se afiseze toate numerele naturale x mai mici
el este prim.} decat n,natural, cu
proprietatea ca x-1 si x+1 sunt numere prime.
var n,i:integer; Exemplu:
prim:boolean; pentru n=15 se vor afisa: 4,6,12.}
begin var x,y,n,i,k:integer;
write('n='); readln(n); t:boolean;
prim:=true; begin
for i:=2 to trunc(sqrt(n)) do write('n='); readln(n);
if n mod i =0 then for x:=2 to n-2 do
prim:=false; begin
if prim then k:=0;
write('Numarul este prim') t:=true;
else for i:=2 to trunc(sqrt(x)) do
write('Numarul nu este prim'); if x mod i=0 then t:=false;
end. if t then k:=k+1;
2) Se citeste un numar natural n.Sa se afiseze y:=x+2; t:=true;
divizorii sai primi. for i:=2 to trunc(sqrt(y)) do
ex:n=9 if y mod i=0 then t:=false;
=>3} if t then k:=k+1;
if k=2 then write (x+1,' ');
var n,i,j:integer; end;
prim:boolean; end.
begin 5) Se citeste un numar natural de cel mult 8 cifre.
write('n='); read(n); Sa se afiseze cel
for i:=2 to n-1 do mai apropiat numar prim fata de acesta.}
if n mod i=0 then begin VAR x,i,k,n1,n2: longint;
prim:=true; ok: boolean;
for j:=2 to trunc(sqrt(i)) do begin
if i mod j =0 then writeln('dati numarul ');
prim:=false; readln (x); n1:=x;
if prim then write(i); repeat
end; inc(n1);
end. ok:=true;
3) Sa se afiseze toate numerele prime mai mici sau for i:=2 to trunc(sqrt(n1)) do
egale decat n, n>1 dat. if n1 mod i =0 then ok:=false;
ex:n=10 until ok;
=>2 3 5 7} n2:=x+1;
var n,i,j:byte; repeat
prim:boolean; dec(n2); ok:=true;
begin for i:=2 to trunc (sqrt(n2)) do
write('n='); readln(n); if n2 mod i=0 then ok:=false;
for i:=2 to n do begin until ok;
prim:=true; if k-n2<n1-x then writeln (n2)
for j:=2 to trunc(sqrt(i)) do else writeln(n1);
if i mod j=0 then begin readln;
prim:=false; break; end; end.
if prim then write(i:5); 6) Se da un numar natural n (0<n<1000000).Se cere
end; sa se afiseze toate
writeln; perechile de numere gemene (a,b), a,b<=n. Perechea
end. (a,b) este o
64
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
pereche de numere gemene daca a si b sunt prime si if i mod j=0 then bec:= false;
valoarea absoluta a if bec then begin
diferenteia-b este 2.} l:=trunc (sqrt(i+2));
var for j:=2 to l do
i,j,n,l:integer; if (i+2) mod j=0 then
bec: boolean; bec:=false;
begin if bec then write ('(',i,',',i+2,') ');end;
write ('n='); readln(n); end;
for i:=2 to n-2 do begin bec:=true; readln;
for j:=2 to trunc(sqrt(i)) do 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 limbaj natural:
O soluţie posibilă ar fi aceea de a alege dintre numerele 2,3,4,5...d...[n/2] pe acelea care sunt
numere prime urmând a fi “extrase” din numărul n.Ordinul de multiplicare al fiecărui factor prim d va fi
egal cu numărul de împărţiri cu rest nul care se pot face succesiv cu el.Pentru a verifica că d este
număr prim trebuie cercetată divizibilitatea sa cu 2,3,4,...[sqrt(d)],ceea ce presupune un număr mare de
împărţiri.O serie de observaţii ce se vor face va conduce la reducerea numărului de calcule.Dintre toate
numerele pare, singurul număr prim este 2.Deci este suficient să căutăm factorii primi numai printre 2 şi
numerele impare ce satisfac condiţia 2k+1<=[n/2] (partea întreagă din n/2).
Dacă se scot din “n” divizorii săi în ordine crescătoare, un număr neprim nu va fi găsit divizor al
lui n, deoarece proprii săi factori primi au fost eliminaţi din n. De exemplu un număr nu se mai divide cu
25 după ce toţi divizorii 5 au fost eliminaţi. Deci nu este necesar să se verifice dacă un număr este prim.
Algoritmul ne asigură că dacă un număr este divizor al lui n atunci acesta este un divizor prim.
Căutarea divizorilor este o operaţie care se repetă ciclic necunoscându-se aprioric numărul de
repatări. Operaţia continuă până numărul mai admite divizori (n>1). Dacă n=1, el nu admite divizori, deci
ciclul nu se va efectua niciodată (se va folosi ciclu cu test iniţial).
Întrucât valoarea lui n se modifică prin extragerea divizorilor,este necesară afişarea sa înaintea
începerii procesului de căutare a acestora.
b) Descrierea şi semnificaţia structurilor de date folosite
n : numărul ce se descompune
d : divizorul (potenţial )
m : ordinul de multiplicare
c) 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
[]
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:
atribuie m 0 {ordinul de multiplicitate}
cât timp *n estedivizibil cu d execută
*extrage d din n
atribuie m m+1
[]
65
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
STOP
d)Programul Pascal
66
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
67
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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}
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
68
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
zero’);
END.
69
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
70
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
71
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
72
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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.
Teoria 2):
Sortarea prin insertie binara
Principiu: reprezinta o varianta a sortarii prin insertie, in care cautarea locului de inserare se
face aplicind cautarea binara, stiind ca secventa a[1],...,a[i-1] este deja ordonata.
Implementarea algoritmului in Pascal:
procedure InsertieBinara;
VAR i,j,s,d,m : TipIndex; x : TipElement;
begin
for i:=2 to N do begin
x:=a[i]; s:=1; d:=i-1;
while s<=d do begin
m:=(s+d) div 2;
if a[m].cheie > x.cheie then d:=m-1
else s:=m+1
end;
for j:=i-1 downto s do a[j+1]:=a[j];
a[s]:=x
end
end; {InsertieBinara}
In cadrul acestei metode, C este de ordinul N*log N, iar M de N*N.
Se obtin valori minime ale lui C pentru tablouri ordonate invers si valori maxime pentru tablouri
ordonate.
73
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
etapa 1)
74
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
75
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
76
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
…
etapa2)
77
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
matematic:
v=(3 7 9 1 2)
i=1 j=2
a=v[j]=2=7
deci
APLICATIA:
78
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
79
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
write('n=');
readln(n);
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
for i:=1 to n do nr[i]:=0;
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]<a[j] then nr[j]:=nr[j]+1
else nr[i]:=nr[i]+1;
for i:=1 to n do
b[nr[i]+1]:=a[i];
for i:=1 to n do
write(b[i]:4);
readln;
end.
3)Sortare prin metoda selectiei
Teoria 1)
Sortarea prin selectie
Principiu: se considera subtabloul a[i],...,a[N], se cauta elementul cu cheia
minima din acest subtablou si apoi se interschimba acest element cu elementul a[i],
repetindu-se procedeul pentru valori ale lui i de la 1 la N-1.
Implementarea algoritmului in Pascal:
procedure Selectie;
VAR i,j,k : TipIndex; x : TipElement;
begin
for i:=1 to N-1 do begin
k:=i; x:=a[i];
for j:=i+1 to N do if a[j].cheie < x.cheie then begin
x:=a[j];
k:=j;
end;
a[k]:=a[i]; a[i]:=x
end
end; {Selectie}
In cazul sortarii prin selectie C este de ordinul N*N , iar M este de ordinul
N*ln N. Aceasta metoda este mai putin rapida pentru tablouri ordonate sau aproape
ordonate.
Momentul I :
Profesorul anunţă titlul lecţiei : SELECTIA DIRECTA
Reactualizează cunoştinţele elevilor
Explică metoda pe un caz concret de vector
Strategia este următoarea : la fiecare pas se plasează un element al vectorului pe poziţia sa finală .
Aceasta metodă este cea mai întâlnită mai ales în şcoli.
80
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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]
Î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
Teoria 2)
Sortarea prin selectie performanta
Principiu: reprezinta o varianta a sortarii prin selectie, in care determinarea elementului cu
cheia minima dintr-o portiune de tablou se reduce la determinarea pozitiei acestuia. In felul acesta se
poate renunta la asignarea x:=a[j] care apare in ciclul "for" controlat de j.
Implementarea algoritmului in Pascal:
81
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
procedure SelectiePerform;
VAR i,j,min : TipIndex; x : TipElement;
begin
for i:=1 to N-1 do begin
min:=i;
for j:=i+1 to N do if a[j].cheie<a[min].cheie then min:=j;
x:=a[min]; a[min]:=a[i]; a[i]:=x
end
end; {SelectiePerform}
etapa 1)
82
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
83
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
etapa 3) la fel…
84
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
matematic:
v=(7 3 9 2 1 4)
i=1 j>i deci
j=2 v[1]=7>v[2]=3 le interschimb
v=(3 7 9 2 1 4 )
j=3
85
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
v[1]3<v[3]=9, la fel
j=4 v[1]=3<v[4]=2 le interschimb
deci v=(2 7 9 3 1 4)
j=5 v[1]=2>v[5]=1 le interschimb
deci v=(1 7 9 3 2 4)
j=6 v[1]=1<v[6]=4 la fel
pentru i=2 , j={3 4 5 6} analog
APLICATIA:
Sa se sorteze un vector prin metoda selectiei (se interschimba numere care
sunt adiacente(cel mai mare merge catre ultima pozitie si la urmatoatea parcurgere
urmatorul catre penultima)
ex:3
213
=>1 2 3}
uses crt;
var t,i,j,n:integer;
a:array[1..20]of integer;
begin
clrscr;
write('n=');
readln(n);
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]>a[j] then begin
t:=a[i];
a[i]:=a[j];
a[j]:=t;
end;
for i:=1 to n do
write(a[i]:4);
readln;
end.
4)Metoda bulelor
Teoria 1:
Sortarea prin interschimbare (bubblesort)
Principiu: se considera subtabloul a[i],...,a[N] care se parcurge de la dreapta spre stinga,
comparind si interschimbind perechile de elemente alaturate care nu satisfac relatia de ordine,
procedeul repetindu-se pentru i=2,N. Practic, la o parcurgere a subtabloului a[i],...,a[N] are loc
deplasarea elementului minim al acestui subtablou pina in pozitia a[i-1].
Implementarea algoritmului in Pascal:
procedure BubbleSort;
VAR i,j : TipIndex; x : TipElement;
begin
for i:=2 to N do
for j:=N downto i do
if a[j-1].cheie>a[j].cheie then begin
x:=a[j-1];
a[j-1]:=a[j];
a[j]:=x
end
end; {BubbleSort}
etapa 1)
86
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
87
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
matematic:
v=(3 1 4 2 )
avem
i=1 v[1]=3<v[2]=1 le schimb locul
deci
v=(1 3 4 2 0)
i=2 v[2]=3<v[3]=4 ramane la fel
i=3 v[3]=4>v[4]=2 le interschimb
deci v=(1 3 2 4 0)
acum luam i=1 v[1]<v[2]
i=2 v[2]=3>v[3]=2 le interschimb
deci
v=(1 2 3 4 0 )
APLICATIA:
Sa se sorteze un vector prin metoda bulelor ( adica se compara permanent doi vecini
astfel incit in final cel mai mare merge spre dreapta)
ex:3
3 2 12
=>2 3 12
88
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
}
uses crt;
var t,i,q,n:integer;
a:array[1..20]of integer;
begin
clrscr;
write('n=');
readln(n);
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
q:=0;
while q=0 do
begin
q:=1;
for i:=1 to n-1 do
if a[i]>a[i+1] then begin
t:=a[i];
a[i]:=a[i+1];
a[i+1]:=t;
q:=0;
end;
end;
for i:=1 to n do
write(a[i]:4);
readln;
end.
3.5.9 Metode de cautare
1)Metoda binara if v=a[n] then
Se da un vector cu n elemente ordonat write('valoarea este pe pozitia ',n)
crescator si o valoare v.Sa se indice else begin
daca aceasta valoare exista in sir ,daca st:=1;
da ,sa se precizeze pe ce pozitie se dr:=n;
afla ,folosind metoda cautarii binare . ok:=false;
ex:3 while (dr-st>1) and not ok do begin
123 m:=trunc((st+dr)/2);
p=2 if v=a[m] then begin
=> pe pozitia a doua este} k:=m;
program cautarebinara; ok:=true;
uses crt; end else
const Nmax=20; if v>a[m] then st:=m
var i,n:byte; else dr:=m;
a:array[1..20] of integer; end;
v,st,dr,m,k:integer; if ok then
ok:boolean; writeln('valoarea cautata e in sir pe
begin pozitia ',k)
clrscr; else
write('n='); writeln('valoarea cautata nu e in sir');
readln(n); end;
for i:=1 to n do begin readkey;
write('a[',i,']='); end.
readln(a[i]); 2)Cautare secventiala
end; Se citesc n numre naturale intr-un
write('pe cine cautati'); vector.sa se calculeze
readln(v); media aritmetica a acestora
if v=a[1] then ex:n=3
write('valoarea este pe pozitia 1') caut pe 2
else 123
89
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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;
readln;
END.
90
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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 ).
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.
91
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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 )
92
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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.
unde X poate fi O, , sau . Atunci, t X( f ). Mai mult, daca t ( f ), atunci si
functia t este neteda.
93
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
94
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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.
95
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
bucla interioara necesita un timp de cel mult ba(ni) unitati, unde b este o constanta
reprezentand timpul necesar pentru initializarea buclei. O singura executie a buclei
exterioare are loc in cel mult cba(ni) unitati de timp, unde c este o alta constanta.
Algoritmul dureaza in total cel mult
unitati de timp, d fiind din nou o constanta. Simplificam aceasta expresie si obtinem
(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
96
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
ci = 1×1/i 2×1/i (i2)1/i (i1)2/i = (i1)/2 1/i
(n23n)/4 Hn (n2)
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
97
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Demonstratia ultimei inegalitati rezulta din Exercitiul 5.26. Dar d = lg(n/2) implica
d1 lg n si d1 lg(n/8). Deci,
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
98
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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)
write i ““ j
Hanoi(n1, 6ij, j)
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
succesiv
t(n) = 2t(n1) 1 = 22t(n2) 2 1 = … = 2n-1t(1)
t
99
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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.
f (n) = a(n1)2b(n1)cn = an2(1b2a)n(abc)
100
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
a0tn a1tn-1 ¼ aktn-k = 0 ()
tn = xn
a0xn a1xn-1 ... akxn-k = 0
Solutiile acestei ecuatii sunt fie solutia triviala x = 0, care nu ne intereseaza, fie
solutiile ecuatiei
a0xk a1xk-1 ... ak = 0
Sa exemplificam prin recurenta care defineste sirul lui Fibonacci (din Sectiunea
1.6.4):
tn = tn-1 tn-2 n 2
tn tn-1 tn-2 = 0
x2 x 1 = 0
101
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
de unde determinam
c1,2 =
(n()-n)
care este cunoscuta relatie a lui de Moivre, descoperita la inceputul secolului XVI. Nu
prezinta nici o dificultate sa aratam acum ca timpul pentru algoritmul fib1 (din
Sectiunea 1.6.4) este in (n).
Ce facem insa atunci cand radacinile ecuatiei caracteristice nu sunt distincte? Se poate
arata ca, daca r este o radacina de multiplicitate m a ecuatiei caracteristice, atunci
tn = rn, tn = nrn, tn = n2rn, ..., tn = nm-1rn sunt solutii pentru (). Solutia generala pentru o
astfel de recurenta este atunci o combinatie liniara a acestor termeni si a termenilor
proveniti de la celelalte radacini ale ecuatiei caracteristice. Din nou, sunt de
determinat exact k constante din conditiile initiale.
tn = 5tn-1 8tn-2 4tn-3 n 3
iar t0 = 0, t1 = 1, t2 = 2. Ecuatia caracteristica are radacinile 1 (de multiplicitate 1) si 2
(de multiplicitate 2). Solutia generala este:
tn = c11n c22n c3n2n
a0tn a1tn-1 ... aktn-k = bnp(n) ()
unde b este o constanta, iar p(n) este un polinom in n de grad d. Ideea generala este
ca, prin manipulari convenabile, sa reducem un astfel de caz la o forma omogena.
tn 2tn-1 = 3n
102
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
3tn 6tn-1 = 3n+1
tn+1 2tn = 3n+1
tn+1 5tn 6tn-1 = 0
x2 5x 6 = 0
adica (x2)(x3) = 0.
Generalizand acest procedeu, se poate arata ca, pentru a rezolva (), este suficient sa
luam urmatoarea ecuatie caracteristica:
(a0xk a1xk-1 ¼ ak)(xb)d+1 = 0
tn = 2tn-1 1 n 1
tn 2tn-1 = 1
tn = c11n c22n
Avem nevoie de doua conditii initiale. Stim ca t0 = 0; pentru a gasi cea de-a doua
conditie calculam
103
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
t1 = 2t0 1
tn = 2n 1
Daca ne intereseaza doar ordinul lui tn, nu este necesar sa calculam efectiv constantele
in solutia generala. Daca stim ca tn = c11n c22n, rezulta tn O(2n). Din faptul ca
numarul de mutari a unor discuri nu poate fi negativ sau constant, deoarece avem in
mod evident tn n, deducem ca c2 > 0. Avem atunci tn (2n) si deci, tn (2n).
Putem obtine chiar ceva mai mult. Substituind solutia generala inapoi in recurenta
initiala, gasim
1 = tn 2tn-1 = c1 c22n2(c1 c22n-1) = c1
3.6.3.5 Schimbarea variabilei
Uneori, printr-o schimbare de variabila, putem rezolva recurente mult mai complicate.
In exemplele care urmeaza, vom nota cu T(n) termenul general al recurentei si cu tk
termenul noii recurente obtinute printr-o schimbare de variabila. Presupunem pentru
inceput ca n este o putere a lui 2.
T(n) = 4T(n/2) n n > 1
tk = 4tk-1 2k
(x4)(x2) = 0
T(n) = c1n2 c2n
Rezulta
T(n) = 4T(n/2) n2 n > 1
104
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
tk = 4tk-1 4k
cu ecuatia caracteristica
(x4)2 = 0
T(n) = c1n2 c2n2lg n
si obtinem
T(n) = 3T(n/2) cn n > 1
T(2k) = 3T(2k-1) c2k
tk = 3tk-1 c2k
cu ecuatia caracteristica
(x3)(x2) = 0
tk = c13k c22k
T(n) = c13lg n c2n
si, deoarece
alg b = blg a
obtinem
T(n) = c1nlg 3 c2n
deci,
105
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
rezultatele obtinute sunt adevarate pentru orice n, este suficient sa adaugam conditia
ca T(n) sa fie eventual nedescrescatoare. Aceasta, datorita Proprietatii 5.1 si a faptului
ca functiile n2, n log n si nlg 3 sunt netede.
Putem enunta acum o proprietate care este utila ca reteta pentru analiza algoritmilor
cu recursivitati de forma celor din exemplele precedente. Proprietatea, a carei
demonstrare o lasam ca exercitiu, ne va fi foarte utila la analiza algoritmilor divide et
impera din Capitolul 7.
T(n) = aT(n/b) cnk n > n0
unde: n0 1, b 2 si k 0 sunt intregi; a si c sunt numere reale pozitive; n/n0 este o
putere a lui b. Atunci avem
3.6.4 Exercitii
ii) n3 O(n2)
iii) 2n+1 O(2n)
iv) (n1)! O(n!)
106
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
3.6.6 Pentru oricare doua functii f, g : N R definim urmatoarea relatie binara:
f g daca O( f ) O(g). Demonstrati ca relatia “” este o relatie de ordine partiala in
multimea functiilor definite pe N si cu valori in R.
3.6.9 O(n2) = O(n3(n2n3)) = O(max(n3, n2n3)) = O(n3)
Unde este eroarea?
107
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
i) O( f ) = O(g)
ii) ( f ) = (g)
iii) f (g)
108
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
iii) (log n)
iv) log n! (n log n)
= ln n 1/2n 1/12n2 ...
(ni)(i1) n
Deoarece
unde e = 1,71828... .
109
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Iata acum analiza detailata a algoritmului. Fie a timpul necesar pentru o executare a
buclei interioare, inclusiv partea de control. Executarea completa a buclei interioare,
pentru un i dat, necesita baT[i] unitati de timp, unde constanta b reprezinta timpul
pentru initializarea buclei. Acest timp nu este zero, cand T[i] = 0. Timpul pentru o
executare a buclei exterioare este cbaT[i], c fiind o noua constanta. In fine, intregul
110
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
i) Analizati eficienta algoritmului, luand ca barometru testul din bucla interioara.
ii) Modificati algoritmul, astfel incat, daca pentru un anumit i nu are loc nici o
interschimbare, atunci algoritmul se opreste. Analizati eficienta noului algoritm.
Solutie:
3.6.27 Analizati algoritmii percolate si sift-down pentru cel mai nefavorabil caz,
presupunand ca opereaza asupra unui heap cu n elemente.
111
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
C(n) (n1) lg n O(n log n)
(lg i 1) = lg n! (n1
C(n) = lg i >
)
3.6.29 Aratati ca, pentru cel mai nefavorabil caz, timpul de executie al
algoritmului heapsort este si in (n log n), deci in (n log n).
3.6.30 Demonstrati ca, pentru cel mai nefavorabil caz, orice algoritm de sortare
prin comparatie necesita un timp in (n log n). In particular, obtinem astfel, pe alta
cale, rezultatul din Exercitiul 5.29.
Fiecare din cele n! permutari a celor n elemente trebuie sa apara ca varf terminal in
arborele de decizie. Vom lua ca barometru comparatia intre doua elemente ale
tabloului T. Inaltimea h a arborelui de decizie corespunde numarului de comparatii
pentru cel mai nefavorabil caz. Deoarece cautam limita inferioara a timpului, ne
intereseaza doar algoritmii cei mai performanti de sortare, deci putem presupune ca
numarul de varfuri este minim, adica n!. Avem: n! 2h (demonstrati acest lucru!),
adica h lg n!. Considerand si relatia log n! (n log n) (vezi Exercitiul 5.17),
112
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
rezulta ca timpul de executie pentru orice algoritm de sortare prin comparatie este, in
cazul cel mai nefavorabil, in (n log n).
3.6.31 Analizati algoritmul heapsort pentru cel mai favorabil caz. Care este cel
mai favorabil caz?
ii) Pentru a analiza algoritmul fib3, luam ca barometru instructiunile din bucla while.
Fie nt valoarea lui n la sfarsitul executarii celei de-a t-a bucle. In particular, n1 = n/2.
Daca 2 t m, atunci
nt = nt-1/2 nt-1/2
Deci,
nt nt-1/2 … n/2t
nm n/2m < 1
Dar, nm N, si deci, nm = 0, care este conditia de iesire din bucla. Cu alte cuvinte,
bucla este executata de cel mult m ori, timpul lui fib3 fiind in O(log n). Aratati ca
timpul este de fapt in (log n).
113
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Pe de altă parte, chiar între problemele care pot fi rezolvate, teoreticienii trag o linie imaginară între
problemele care au rezolvări ``rezonabil'' de rapide, şi restul problemelor, care se numesc ``intratabile''.
În mod arbitrar, dar nu ne-justificabil, o problemă se numeşte ``intratabilă'' dacă complexitatea ei este
exponenţială în mărimea datelor de intrare. (Nu uitaţi, este vorba de complexitate ``worst-case''
asimptotică.) O problemă este ``tratabilă'' dacă putem scrie complexitatea ei sub forma unui polinom,
de un grad oricît de mare.
Mulţimea tuturor problemelor de decizie (adică a problemelor la care răspunsul este da sau nu) cu
complexitate polinomială se notează cu P (de la polinom). De exemplu, problema de a găsi dacă o
valoare se află într-un vector este în clasa P; algoritmul exhibat mai sus este un algoritm în timp linear
(O(n)) pentru a răspunde la această întrebare.
(Ca o curiozitate: există şi probleme cu o complexitate ``ne-elementară'', care este mai mare decît
complexitatea oricărei probleme exponenţiale. O astfel de problemă este cea de decizie a adevărului
unei formule în teoria numită S1S, sau ``teoria monadică a succesorilor de ordinul 2''. Nu vă lăsaţi
intimidaţi de terminologie: aceasta este practic o teorie logică peste numerele naturale, în care avem
114
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
voie să scriem formule cu cuantificatori şi conectori logici, ca mai sus, dar avem şi dreptul să
cuantificăm peste mulţimi. Complexitatea deciziei unei formule logice într-o astfel de teorie este mai
Acest tip de algoritmi este surprinzător de bogat în consecinţe cu valoare teoretică. Aceşti algoritmi nu
sunt direct aplicabili, însă studiul lor dă naştere unor concepte foarte importante.
Surprinzătoare este şi definiţia corectitudinii unui astfel de algoritm. Un algoritm nedeterminist este
corect dacă există o posibilitate de executare a sa care găseşte răspunsul corect. Pe măsură ce un
algoritm nedeterminist se execută, la anumiţi paşi se confruntă cu alegeri nedeterministe. Ei bine, dacă
la fiecare pas există o alegere, care făcută să ducă la găsirea soluţiei, atunci algoritmul este numit
corect.
Astfel, un algoritm nedeterminist care caută ieşirea dintr-un labirint ar arăta cam aşa:
Pe scurt algoritmul se comportă aşa: dacă la nord nu e perete mergi încolo, sau, poate, dacă la sud e
liber, mergi încolo, sau la est, sau la vest. În care dintre direcţii, nu se precizează (este ne-determinat).
Este clar că dacă există o ieşire la care se poate ajunge, există şi o suită de aplicări ale acestor reguli
care duce la ieşire.
Utilitatea practică a unui astfel de algoritm nu este imediat aparentă: în definitiv pare să nu spună nimic
util: soluţia este fie spre sud, fie spre nord, fie spre este, fie spre vest. Ei şi? Este clar că aceşti algoritmi
nu sunt direct implementabili pe un calculator real.
În realitate existenţa un astfel de algoritm deja înseamnă destul de mult. Înseamnă în primul rînd că
problema se poate rezolva algoritmic; vă reamintesc că există probleme care nu se pot rezolva deloc.
În al doilea rînd, se poate arăta că fiecare algoritm nedeterminist se poate transforma într-unul
determinist într-un mod automat. Deci de îndată ce ştim să rezolvăm o problemă într-un mod
nedeterminist, putem să o rezolvăm şi determinist! Transformarea este relativ simplă: încercăm să
mergem pe toate drumurile posibile în paralel, pe fiecare cîte un pas. (O astfel de tehnică aplicată în
cazul labirintului se transformă în ceea ce se cheamă ``flood fill'': evoluez radial de la poziţia de plecare
în toate direcţiile).
115
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Clasa tuturor problemelor care se pot rezolva cu algoritmi nedeterminişti într-un timp polinomial se
notează cu NP (Nedeterminist Polinomial). Este clar că orice problemă care se află în P se află şi în NP,
pentru că algoritmii determinişti sunt doar un caz extrem al celor determinişti: în fiecare moment au o
singură alegere posibilă.
Din păcate transformarea într-un algoritm determinist se face pierzînd din eficienţă. În general un
algoritm care operează în timp nedeterminist polinomial (NP) poate fi transformat cu uşurinţă într-un
algoritm care merge în timp exponenţial (EXP). Avem deci o incluziune de mulţimi între problemele
de decizie: P NP EXP.
Partea cea mai interesantă este următoarea: ştim cu certitudine că P EXP. Însă nu avem nici o idee
despre relaţia de egalitate între NP şi P sau între NP şi EXP. Nu există nici o demonstraţie care să
infirme că problemele din NP au algoritmi eficienţi, determinist polinomiali! Problema P=NP este cea
mai importantă problemă din teoria calculatoarelor, pentru că de soluţionarea ei se leagă o grămadă de
consecinţe importante.
Problema aceasta este extrem de importantă pentru întreaga matematică, pentru că însăşi demonstrarea
teoremelor este un proces care încearcă să verifice algoritmic o formulă logică (cum am văzut mai sus
de pildă); teoremele la care există demonstraţii ``scurte'' pot fi asimilate cu problemele din mulţimea
NP (la fiecare pas dintr-o demonstraţie putem aplica mai multe metode de inferenţă, în mod
nedeterminist; un algoritm trebuie să ghicească înşiruirea de metode aplicate pentru demonstrarea
enunţului); dacă orice problemă din NP este şi în P, atunci putem automatiza o mare parte din
demonstrarea de teoreme în mod eficient!
Problema P=NP este foarte importantă pentru criptografie: decriptarea este o problemă din NP (cel care
ştie cheia ştie un algoritm determinist polinomial de decriptare, dar cel care nu o ştie are în faţa o
problemă pe care nedeterminist o poate rezolva în timp polinomial). Dacă s-ar demonstra că P=NP
acest lucru ar avea consecinţe extrem de importante, iar CIA si KGB ar fi într-o situaţie destul de
proastă, pentru că toate schemele lor de criptare ar putea fi sparte în timp polinomial (asta nu înseamnă
neapărat foarte repede, dar oricum, mult mai repede decît timp exponenţial)!
Mai mult, în 1971 Cook a demonstrat că există o problemă specială în NP (adică pentru care se poate
da un algoritm eficient nedeterminist), numită problema satisfiabilităţii (notată cu SAT). Problema este
foarte simplă: dacă se dă o formulă booleană care cuprinde mai multe variabile, poate fi formula făcută
De la Cook încoace s-au mai descoperit cîteva sute de probleme NP-complete. Unele probleme care se
ivesc foarte adesea în practică s-au dovedit NP-complete! Acesta este un alt motiv pentru care clasa atît
de abstractă NP a problemelor cu algoritmi nedeterminişti este atît de importantă: foarte multe
probleme practice au algoritmi polinomiali nedeterminişti, dar cei mai buni algoritmi determinişti iau
un timp exponenţial!
Problema comis-voiajorului (turneu Hamiltonian de cost minim): dîndu-se o reţea de oraşe, o reţea de
drumuri între oraşe şi o lungime k, există un traseu de cost mai mic decît k trecînd prin fiecare oraş o
singură dată şi revenind la punctul de plecare?
116
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Dîndu-se o mulţime de numere naturale, se poate împărţi în două mulţimi de numere de sume egale 2?
``Clica'': dîndu-se un graf G şi un număr k, are G un subgraf complet cu k vîrfuri (adică o mulţime de k
vîrfuri unite fiecare cu fiecare)?
``Acoperire'': dîndu-se un graf G şi un număr k, pot alege k vîrfuri în aşa fel încît toate muchiile din G au
un capăt ales?
O cantitate enormă de efort şi ingeniozitate a fost risipită pentru a încerca să se demonstreze că P=NP
sau opusul acestei afirmaţii, dar nici un rezultat concret nu a fost obţinut. Credinţa cvasi-unanimă este
că P=NP, dar numai matematica poate oferi vreo certitudine...
Din cauză că foarte multe probleme practice sunt în NP, şi ca aparent nu putem avea algoritmi
determinişti eficace pentru ele, cercetătorii şi-au îndreptat atenţia asupra unor clase noi de algoritmi,
care vor face obiectul secţiunilor următoare.
Algoritmi aproximativi
În secţiunile care urmează folosim tot timpul premiza nedemonstrată că PNP. Dacă P=NP, atunci
problemele pe care ne batem capul să le rezolvăm prin metode ciudate pot fi de fapt rezolvate exact şi
eficient.
Optim şi aproximare
Într-adevăr, această metodă se bucură de un oarecare succes, dar nu de unul general. Algoritmii care
rezolvă o problemă de optimizare în speranţa unui rezultat sub-optimal se numesc ``algoritmi
aproximativi''.
Teoria algoritmilor aproximativi este relativ recentă (deşi ideea există de multă vreme), iar unele
rezultate sunt extrem de complicate. Ne vom mulţumi să dăm nişte exemple pentru a ilustra algoritmi
aproximativi în acţiune, şi tipul de rezultate care se pot obţine.
Vom ilustra două rezultate diferite din teoria algoritmilor aproximativi: algoritmi de aproximare
relativă, algoritmi de aproximare absolută a soluţiei (lămurim terminologia imediat).
Să notăm o instanţă a unei probleme cu I. Fie OPT(I) valoarea soluţiei optime pentru acea instanţă
(care există, dar pe care nu ştim s-o calculăm eficient), şi fie A(I) valoarea calculată de algoritmul
nostru aproximativ. Numim aproximaţia absolută dacă există un număr K, independent de instanţa I,
care are proprietatea că |OPT(I) - A(I)| < K. Numim aproximaţia relativă dacă există un R (numit
``performanţă'') astfel ca pentru orice instanţă I avem (A(I) / OPT(I)) < R (dacă problema caută un
maximum, atunci fracţia din definiţie trebuie inversată).
117
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Problema rucsacului
Iată o variantă a problemei rucsacului care este NP-completă , dar pentru care se poate obţine cu foarte
mare uşurinţă un algoritm aproximativ relativ eficient.
Se dau o mulţime (mare) de rucsaci de capacitate egală (cunoscută, un număr natural). Se mai dă o
mulţime finită de obiecte, fiecare de un volum cunoscut (număr natural). Întrebarea este: care este
numărul minim de rucsaci necesari pentru a împacheta toate obiectele?
Algoritmul este banal: metoda ``greedy'': pune de la stînga fiecare greutate în primul rucsac liber:
Initializari:
o, folositi := 1, 0
do o <= nrobiecte -> liber[o] := capacitate od
Algoritm:
o := 1
do o <= nrobiecte ->
r := 1
do (liber[r] < marime[o]) -> r := r+1
od
folositi, liber[r], o :=
max(r, folositi), liber[r] - marime[o], o+1
od
Vom folosi o altă problemă NP-completă, pentru care avem imediat un algoritm de aproximare relativă
de performanţă 2, dar pentru care vom demonstra că nu există nici un algoritm de aproximare absolută.
Problema este cea a acoperirii unui graf, enunţată mai sus. Ca problemă de optimizare, ea se enunţă
astfel: ``care este numărul minim de vîrfuri care trebuie ``acoperite'' astfel ca toate muchiile dintr-un
graf să fie atinse?''
Pentru această problemă algoritmul greedy nu face multe parale ca algoritm de aproximare. Există însă
un algoritm relativ simplu, cu performanţă 2, care se foloseşte însă de un alt algoritm clasic, cel al
``cuplării'' (matching). Fără a intra în detalii, există un algoritm polinomial relativ sofisticat pentru a
calcula cuplări maximale pe grafuri4. Calculăm o cuplare maximală, după care luăm capetele tuturor
muchiilor care o formează: astfel obţinem o acoperire (uşor de demonstrat) care e cel mult dublă ca
mărime faţă de optim (pentru că în optim trebuie să se găsească cel puţin cîte un vîrf pentru fiecare
muchie din cuplare, iar noi am luat cîte două).
118
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Iată şi un rezultat negativ interesant: pentru orice K fixat, nu există nici un algoritm care să dea pentru
problema acoperirii o soluţie aproximativă absolută la distanţa K de cea optimă pentru orice instanţă.
Demonstraţia este foarte simplă, odată ce ai văzut ideea, şi se bazează pe ``tehnica amplificării''. Iată
cum se face, prin reducere la absurd:
Să presupunem că avem un algoritm A care calculează pentru orice graf o acoperire care este cu cel
mult K noduri mai mare ca cea optimă (K e fixat). Cu alte cuvinte |OPT(G) - A(G)| < K. Să luăm o
instanţă arbitrară a problemei cuplării, G. Formăm un nou graf G 1 din G, care nu este conex, şi care
constă din K+1 copii ale lui G, alăturate. Aceasta este o instanţă perfect corectă a problemei acoperirii,
aşa că rulăm pe ea algoritmul nostru A. Acesta va oferi o acoperire care are cel mult cu K noduri mai
mult decît acoperirea optimă. (Vă reamintesc notaţiile: OPT(G) este valoarea optimă: numărul minim
de noduri pentru a acoperi muchiile, iar A(G) este valoarea calculată de algoritmul nostru.
Datorită faptului că cele K+1 copii ale lui G sunt neconectate, optimumul pentru G 1 este reuniunea a
K+1 optimumuri pentru G. Din cauza asta avem relaţia OPT(G 1) = (K+1) OPT(G). Fie acum H copia
lui G pe care A a marcat cele mai multe vîrfuri; atunci A(G 1) <= (K+1) A(H). Dar din proprietăţile lui
A avem: |OPT(G1) - A(G1)| < K, sau |(K+1) OPT(H) - (K+1) A(H)| < K, ori |OPT(H) - A(H)| <
K/(K+1) < 1. Însă ştim că OPT(H) şi A(H) sunt numere naturale, deci am obţinut OPT(H) = A(H)!
Asta înseamnă că dacă avem un algoritm aproximativ absolut pentru problema acoperirii, putem
imediat construi un algoritm exact la fel de rapid. Ori asta ar însemna că P=NP, ceea ce am presupus
fals.
Exemplele pe care le-am ales sunt în mod deliberat simple; teoria algoritmilor aproximativi este în
plină dezvoltare şi are rezultate foarte spectaculoase şi în general complicate. În orice caz,
aplicabilitatea ei este imediată, pentru că multe probleme practice care nu pot aştepta au numai
rezolvări aproximative.
O tehnică foarte spectaculoasă pentru rezolvarea problemelor este cea a folosiri numerelor
aleatoare. Practic algoritmii aleatori sunt identici cu cei obişnuiţi, dar folosesc în plus o nouă
instrucţiune, care s-ar putea chema ``dă cu banul''. Această instrucţiune generează un bit arbitrar ca
valoare.
Acest lucru este adevărat şi pentru alte clase de algoritmi; de pildă algoritmul quicksort are
pentru majoritatea vectorilor de intrare o comportare O(n log n). Dacă însă datele de intrare sunt prost
distribuite, atunci quicksort poate face n2 comparaţii. Pentru n=100 asta înseamnă de 10 ori mai mult!
Numărul de instanţe pentru care quicksort este slab este mult mai mic decît numărul de instanţe pentru
care merge bine. Ce te faci însă dacă într-un anumit context lui quicksort i se dau numai date rele?
(Datele preluate din măsurători reale sunt foarte rar complet uniform distribuite). O soluţie paradoxală
constă în a amesteca aleator vectorul înainte de a-l sorta.
Complexitatea medie (average case) a lui quicksort este O(n log n). Complexitatea în cazul cel
mai rău (worst case) este O(n 2). Dacă datele vin distribuite cu probabilitate mare în zona ``rea'', atunci
amestecîndu-le putem transforma instanţe care pică în zona ``worst-case'' în instanţe de tip ``average-
case''. Fireşte, asta nu înseamnă ca nu putem avea ghinion, şi ca amestecarea să producă tot o instanţă
``rea'', dar probabilitatea ca acest lucru să se întîmple este foarte mică, pentru că quicksort are puţine
instanţe rele5.
119
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Acesta este un caz de folosire a aleatorului pentru a îmbunătăţi performanţa medie a unui algoritm.
Cîteodată cîştigul este şi mai mare, pentru că putem rezolva probleme NP-complete foarte rapid
folosind aleatorismul. De obicei avem însă un preţ de plătit. Cînd folosim algoritmi din clasa prezentată
mai jos, putem risca să nu primim răspunsul corect.
Evoluţia unui algoritm care foloseşte numere aleatoare nu mai depinde numai de datele de intrare, ci şi
de numerele aleatoare pe care le generează. Dacă are ``noroc'' algoritmul poate termina repede şi bine;
dacă dă prost cu zarul, ar putea eventual chiar trage o concluzie greşită. (În cazul quicksort de mai sus
răspunsul este întotdeauna corect, dar cîteodată vine mai greu. Aceasta este diferenţa dintre algoritmii
Monte Carlo, mereu corecţi, şi cei Las Vegas, care pot uneori, rar, greşi.)
Vom defini acum algoritmii probabilişti pentru probleme de decizie (ţineţi minte, la care răspunsul este
Da sau Nu). Majoritatea problemelor pot fi exprimate în forma unor probleme de decizie, deci
simplificarea nu este prea drastică.
Există două clase de algoritmi probabilişti, dar ne vom concentra atenţia numai asupra uneia dintre ele,
pentru care vom da şi două exemple simple şi spectaculoase. Vom defini totodată clasa problemelor
care pot fi rezolvate probabilist în timp polinomial, numită RP (Random Polinomial).
Observaţi că dacă indicăm de la început care sunt numerele aleatoare care vor fi generate, evoluţia
algoritmului este perfect precizată.
Definiţie: O problemă de decizie este în RP dacă există un algoritm aleator A care rulează într-un timp
polinomial în lungimea instanţei (nc pentru un c oarecare), şi care are următoarele proprietăţi:
Dacă răspunsul la o instanţă I este ``Da'', atunci cu o probabilitate mai mare de 1/2 algoritmul va
răspunde ``Da''.
Dacă răspunsul la o instanţă I este ``Nu'', atunci cu probabilitate 1 algoritmul va răspunde ``Nu''.
De cine este dată ``probabilitatea'' de mai sus? De numărul de şiruri aleatoare. Cînd rulăm un
algoritm aleator pentru o instanţă I avem la dispoziţie 2 nc şiruri aleatoare de biţi; pentru unele dintre ele
algoritmul răspunde ``Da'', pentru celelalte răspunde ``Nu''. Ceea ce facem este să numărăm pentru cîte
şiruri algoritmul ar răspunde ``da'' şi să facem raportul cu 2nc. Aceasta este probabilitatea ca algoritmul
să răspundă ``da''. Opusul ei este probabilitatea să răspundă ``nu''.
O tehnică foarte simplă de amplificare poate creşte nedefinit această probabilitate: dacă
executăm algoritmul de 2 ori pe aceleaşi date de intrare, probabilitatea de a greşi pentru răspunsuri
``nu'' rămîne 0. Pe de altă parte, ajunge ca algoritmul să răspundă măcar odată ``da'' pentru a şti că
răspunsul este ``da'' cu siguranţă! Din cauza asta, dacă probabilitatea de eroare este p pentru algoritm,
executînd de k ori probabilitatea coboară la p k (nu uitaţi ca p este subunitar, ba chiar sub 1/2). Această
metodă se numeşte ``boost'' în engleză, şi face dintr-un algoritm probabilist slab ca discriminare o sculă
extrem de puternică!
Pentru a scădea probabilitatea de eroare a unui algoritm care poate greşi cu probabilitatea p
pînă sub o limită dorită siguranta, se procedează astfel:
120
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Fie un polinom de mai multe variabile, x1, x2, ... xn. Acest polinom poate fi descris printr-o
formulă aritmetică, de pildă: (x1 + 1) (x2 + 1) ... (xn + 1). Întrebarea este: este acest polinom identic nul
sau nu?
Pentru polinomul de mai sus gradul este n, şi putem alege pentru K de exemplu Z p, unde p este
un număr prim relativ mare în raport cu n (de două ori mai mare ajunge!).
Alegînd arbitrar numerele v1, v2, ..., vn în Zp şi evaluînd q(v1, v2, ..., vn) mod p, putem imediat
afirma cu probabilitate mare > 1 - n/p despre q dacă este nul sau nu! Observaţi că evaluarea
polinomului nu este prea costisitoare, putîndu-se face în timp polinomial în lungimea expresiei care
descrie polinomul.
Folosind metoda de ``boost'' putem creşte rapid siguranţa noastră despre rezultatul algoritmului.
Izomorfismul arborilor
Se dau doi arbori, cu rădăcina precizată. Sunt aceşti doi arbori ``izomorfi'' (identici prin re-ordonarea
fiilor)? Această problemă este surprinzător de dificilă pentru un algoritm determinist (am impresia
chiar că este NP-completă). Iată însă o soluţie aproape imediată: construim pentru fiecare arbore cîte un
polinom care nu depinde de ordinea fiilor unui nod, în aşa fel încît dacă şi numai dacă arborii sunt
izomorfi polinoamele sunt egale. Apoi pur şi simplu testăm ca mai sus dacă polinomul diferenţă este
nul.
O metodă de a asocia recursiv un polinom unui arbore este de pildă următoarea: fiecărui nod îi
asociem o variabilă xk, unde k este înălţimea nodului (distanţa pînă la cea mai depărtată frunză).
Frunzele vor avea toate asociate variabila x 0. Apoi asociem nodului v de înălţime k cu fii v 1, ... vl
polinomul fv = (xk - fv1) (xk - fv2) ... (xk - fvl). Se arată uşor că polinoamele sunt egale pentru arbori
izomorfi, bazîndu-ne pe unicitatea descompunerii în factori a unui polinom. Gradul polinomului asociat
unui nod este egal cu suma gradelor fiilor, care la rîndul ei este egală cu numărul de frunze care se află
sub acel nod (cum se demonstrează imediat prin inducţie după înălţime). Şi asta-i tot!
121
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Algoritmi on-line
Adesea trebuie luate decizii cu informaţii incomplete. Un caz particular este luarea de decizii
pe măsură ce datele devin disponibile. Deciziile afectează viitorul, dar sunt luate fără a avea cunoştinţe
despre datele viitoare. Sa vedem în acţiune un exemplu foarte simplu:
Problema schiorului
Se pune problema: ce este mai bine: să închiriezi sau să cumperi schiuri? (Vom presupune că preţul
schiurilor este constant de-a lungul timpului, ca să simplificăm problema). Dilema constă din faptul că
în fiecare sezon, nu ştii dacă te vei mai duce odată. Dacă le cumperi şi nu te mai duci, ai dat banii
degeaba. Dacă le tot închiriezi şi te duci des, s-ar putea să le plăteşti de mai multe ori. Totuşi, trebuie să
iei o decizie. Pe care?
Există un răspuns foarte simplu, care promite nu că dă rezultatul cel mai ieftin în orice circumstanţă, ci
doar că nu vei cheltui de două ori mai mult decît în cazul în care ai face decizia perfectă (decizia
perfectă este cea care ştie precis dacă te vei mai duce, şi de cîte ori; ea nu este accesibilă decît ``post-
factum'', deci este pur teoretică).
Algoritmul este: închiriezi schiuri pînă ai dat pe chirie costul schiurilor. După aceea dacă mai vrei să
mergi le cumperi. Voi demonstra rapid că în felul ăsta orice s-ar întîmpla nu pierzi mai mult de jumate
din banii pe care i-ai fi cheltuit în cazul ideal.
Avem 3 posibilităţi:
1. Te opreşti înainte de a le cumpăra: în cazul ăsta ai jucat perfect, pentru că ai schiat şi nu puteai ieşi mai
ieftin nicicum;
2. Te opreşti imediat după ce le-ai cumpărat. În cazul ăsta ai dat de două ori preţul (odată pe închirieri, şi
odată pe cumpărare), dar ai schiat cît ai fi putut schia dînd numai odată preţul (mai ieftin de odată nu
puteai ieşi);
3. Te opreşti mai tîrziu: în cazul ăsta cel mai ieftin era tot să le cumperi din prima zi, deci iar ai cheltuit
dublu.
Orice altă schemă foloseşti pentru a decide cumpărarea, există un scenariu în care poţi cheltui mai mult
de dublu faţă de optim.
Algoritmii on-line apar foarte natural într-o mulţime de situaţii: de exemplu în reţele de calculatoare,
algoritmii care decid traseul unui pachet cu informaţii sunt algoritmi on-line; dacă decid trasee proaste,
reţeaua poate deveni supra-aglomerată în viitor; astfel de algoritmi nu au idee despre cererile viitoare,
aşa că acţionează cu informaţie incompletă.
Un alt exemplu este în sistemele de operare: algoritmii după care cache-urile (sau sistemele de
memorie virtuală) aleg paginile care trebuie înlocuite. Alegerea aceasta nu poate fi optimă în absenţa
informaţiilor despre viitoarele cereri. Cu toate acestea, anumite alegeri sunt mai bune decît altele.
Un al treilea exemplu, tot din contextul sistemelor de operare, este al algoritmilor de planificare, care
trebuie să stabilească în ce moment se execută fiecare proces pe un calculator (paralel). Acolo unde
minutul de rulare costă o grămadă de bani, deciziile trebuie să risipească cît mai puţin timp. Însă job-uri
pentru prelucrare sosesc dinamic, aşa că algoritmii trebuie să facă faţă unui mediu în continuă
schimbare.
Algoritmii on-line sunt în general analizaţi comparîndu-i cu algoritmii off-line, care ar avea înainte de a
face deciziile informaţii perfecte despre toate cererile viitoare. Este clar că informaţia aceasta este un
mare avantaj, aşa că în general algoritmii on-line au performanţe mult mai proaste decît cei
corespunzători off-line.
122
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Cercetările în acest domeniu sunt doar la început; se explorează şi variante de algoritmi hibrizi on/off-line, în care
algoritmul are o idee despre viitor, dar nu neapărat o vedere completă.
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
123
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
124
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
i := 2
WHILE (i < n) AND (n MOD i < > 0)
i := i +1
REPEAT
IF i := n THEN WRITE ’numarul este prim’
ELSE WRITE ’numarul nu este prim’
ENDIF
STOP.
READ nr
N := 1
J := 0;
DO
prim := true
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.
125
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
126
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Pentru calculul acestor valori se utilizează se utilizează variabila p. din cele arătate rezultă
schema logică de mai jos:
INTEGER n, i, s, p;
READ n
s := 0
p := 1
FOR i := 1, n
p := * i
s := s + p
REPEAT
WRITE s
STOP.
2) Se consideră şirul de numere naturale:
1, 4, 7, 10, 13, . . .
Să se calculeze suma primelor n termeni, cu n dat de la tastatură
Program Problema_1;
127
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
4. Limbaje de programare
128
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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:
129
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
130
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
131
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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?
132
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
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 ‘$’.
133
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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*10 23 ş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 #.
Exemplu: #1$2 sau, echivalent (în baza 16), #$1#$2
‘abc’
‘abc’#10#13
caracter
Sir
caracter
e Constantă
întreagă
const
identificator = expresie;
134
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
identificator = expresie;
Exemplu.
const NrMaxValori = 30;
Dim = NrMax Valori*2-1;
Mesaj = ‘Nu exista solutie’#10#13'
PI = 3.14;
În paragraful anterior am văzut faptul că o variabilă poate reţine date de un anumit tip. De
exemplu, anumite variabile pot reţine numere întregi, altele numere reale (la informatică asta
înseamnă numere cu zecimale). Se pune întrebarea: cum are programatorul posibilitatea să
stabilească natura datelor care pot fi memorate de variabile? Mecanismul este următorul: atunci
când se declară o variabilă se precizează tipul ei.
Prin tip de date se înţelege:
mulţime de valori;
regulă de codificare a lor (modul în care se reprezintă în memorie);
mulţime de operaţii definite pe mulţimea valorilor.
135
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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).
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ă
136
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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).
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]
137
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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]
138
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Î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.
139
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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.
140
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
tipul enumerare;
tipul subdomeniu.
Pentru definirea unui tip propriu se foloseşte următoarea declaraţie:
type nume_tip=definitie tip
unde:
prin nume_tip înţelegem numele tipului;
definiţia tipului este specificată fiecărui tip în parte.
Declaraţia tipurilor este plasată după declaraţiile de constante simbolice(dacă
există)şi precede declaraţiile de variabile.
Tipul enumerare.
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;
141
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
VA identificator : tip ;
R
:
142
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
143
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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): <,<=,>,>=,=.
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;
144
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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’.
Prioritate Operator
145
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
Tipul expresiilor
146
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
intreg;
real;
logic;
sir;
Exemple:
4>2 este o expresie de tip logic;
1+2 este o expresie de tip integer;
1.3+ 3 este o expresie de tip real;
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;
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
147
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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.
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.
148
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Ajutati de profesor, editati un prim program in mediul Turbo/Borland Pascal, care se porneste
prin comanda turbo sau bp. In construirea unui program, tineti cont de cerintele prezentate in Anexa 2.
Fisierul executabil este, cel mai adesea:C:\BP\BIN\turbo.exe sau C:\BP\BIN\bp.exe. lansarea in
executie a programului editat si corectat se face prin actionarea simultana a tastelor Ctrl si F9. De fapt,
capitolul 7 din manual prezinta modul de lucru cu mediul limbajului.
149
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Programul nostru va calcula aria unui cerc in functie de lungimea razei cercului:
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.
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:
150
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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;
sa se spuna ca rezultatul pe care il afiseaza este aria cercului de raza data.
De aceea vom scrie programul de mai jos.
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
151
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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.
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
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:
152
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
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;
153
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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);
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.
154
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
155
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
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
156
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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;
Begin
Write (‘nr=’);readln (nr);
If nr mod 2=0
Then writeln (‘am citit un nr par’);
End.
157
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
:
In
End
Exemplul 1.Sa se scrie un program care rezolva ecuatia de gradul 1(a*x+b=0).
Program p2;
Var a,b, x :real;
Begin
Write (‘a=’);readln(a);
Write(‘b=’);readln(b);
If a<>0 then
Begin
X:=-b/a;
Writeln(‘x=’,x:3:2)
End
Else
If b=0 then writeln (‘infinitate de solutii’)
Else writeln(‘nu avem solutii’);
End.(‘nu avem solutii’);
End.
INSTRUCTIUNEA CASE
158
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Else
If b=0 then writeln(‘infinitate de solutii ‘)
Else writeln (‘nu avem solutii’)
End.
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
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 :
159
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Writeln(‘s:=’,s)
End.
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
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;
160
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
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.
161
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
ciclare poate lua si valori negative.
Programf7;
Var I, j, k:integer;
Begin
I:=5;j:=10;
For k:=I-j to j do writeln (k);
End.
Program f8;
Var I,j,k:integer;
Begin
I:=5,j:=10;
For k:=1 to j do
Begin
Writeln (k);
J:=j+1
162
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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;
Begin
For I:=5 downto1 do writeln (I);
End.
163
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
Exemplul 1.Se citeste n(nr nat).Se cere sa se efectueze suma primelor n nr nat.Exemplu:pt. n=3,S=1+2+3=10.
Program f15;
Var I,n,s:integer;
Begin
Write(‘n=’);readln(n);
S:=0
For I:=1 to n do s:=s+I;
Writeln(‘suma primelor ‘,n,’numere naturale este ;,s)
End.
Program f 16;
Var I:integer;
S:real;
Begin
S:=0;
For I:=1 to 9 do
S:=s+i/10;
Writeln(‘s=’,s:5:2)
End.
Program f17;
Var I,s,p,n:integer;
Begin
Write(‘n=’);readln (n);
S:=0;p:=1;
For I:=1 to n do
Begin
P:=p*I;
S:=s+p
End;
Writeln(‘s=’,s)
End.
164
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Exemplul 4.Se citesc n numere intregi.Se cere sa se afiseze cel mai mare numar citit.De exemplu, pentru n=4 si
numerele –7,9,2,3 se va afisa 9.
Program f 19;
Var I, max,n,nr:integer;
Begin
Write(‘n=’);readln (n);
Write(‘nr=’); readln (max);
For I:=2 to n do
Begin
Write (‘nr=’);readln(nr);
If nr>max then
Max:=nr;
End;
Writeln(‘maximul este:’, max);
End.
Exemplul 5.Sa se afiseze toate numerele naturale mai mici sau egale cu 10000 care se pot descompune in doua
moduri diferite ca suma de cuburi.
Program p11;
Var n, max, nr, I,j,i1,i2,j2,j1:integer;
Begin
For n:=1 to 10000 do
Begin
Max:= trunc (exp(1/3*1n(n));
Nr:=0
For I:=1 to max do
For j:=I to max do
Forj:=I to max do
If i*I +I*j*j*j=n then
Begin
If nr=0 then
Begin
I1:=I;j:=j
End
Else
Begin
12:=I;j2:=j
end;
nr:=nr+1;
end;
if nr=2 then writeln (‘n,’’,i1,’ ‘,j1,’ ‘,i2,’ ‘,j2)
end
end.
165
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
166
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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ă:
167
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
referirea elementelor se realizează specificând acest nume şi poziţia elementului cuprinsă între
paranteze drepte sub forma unei expresiii indiciale.
Localizarea unui element x[i], al unui masiv unidimensional, se face:
x[1]+ (i-1)*lungime_element
Atunci când se construiesc programe în care se definesc masive unidimensionale, alegerea
tipului, alegerea limitei inferioare şi a limitei superioare pentru variaţie, depind de contextul problemei şi
de formulele identificate prin inducţie matematică pentru explorare, folosind structuri repetitive.
De fiecare dată trebuie avută grijă ca numărul de componente ce rezultă la definire şă fie
acoperitor pentru problemele ce se rezolvă.
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 )
N - numărul de masive unidimensionale de tip T i, având acelaşi număr de
componente care apar în program;
X - numărul maxim de componente ale unui masiv
OPERATII IN VECTORI
a) initializarea(vector ngol fara componente)
168
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
EXEMPLU:
{Se citesc n numere naturale intr-un vector.sa var i,n:byte;
se calculeze media 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 for i:=1 to n do
ELEMENTE.SA SE ORDONEZE write(a[i],'');
CRESCATOR PRIN METODA BULELOR. } readkey;
program PR10; end.
uses crt;
169
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
170
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
171
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
172
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Fiecare linie sau coloană, prin descompunerea la nivelul următor ,poate fi privită ca vector de
elemente. Deci în final o matrice poate fi privită ca vectori de vectori .
173
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
se va ajunge la:
adr ( a[i,j] ) = adr (a[i]) +depl(a[i,j] , a [i,1])
În cazul în care matricea este densă sau încărcată sau are puţine elemente nule sau este full, dar are
elemente ce conţin valori particulare, se va efectua o tratare diferenţiată.
MATRICE SIMETRICE
se impun definirile :
- nume matrice
- număr de linii
- număr de coloane
- valoarea elementului repetat
MATRICE DIAGONALE
- în acest caz ,forma de memorare adecvată, în condiţiile în care în urma prelucrării matricei A ,
aceasta nu-şi schimbă structura, este vectorul
MATRICE TRIDIAGONALE
T=
174
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
MATRICE TRIUNGHIULARĂ
- are elementele nenule fie deasupra ,fie sub diagonala principală, iar stocarea în memorie este
asemănătoare matricei simetrice.
Pentru matricea triunghiulară A cu elementele nenule sub diagonala principală, adresa
elementului A[i,j], este:
K:=0;
For i:=1 to n do
For j:=1 to n do
Begin
Inc(k);
V[k]:=a[i,j];
End;
k:= n*(n+1)/2;
for i:=n downto 1 do
for j:=i downto 1 do
begin
v[k]:=a[i,j];
dec(k);
end;
În toate cazurile ,se urmăreşte atât reducerea lungimii zonei de memorie ocupată, cât şi
creşterea vitezei e acces la componente.Pentru aceasta, ami întâi matricele sunt memorate în extenso,
ca mai apoi după analiza componentelor să se deducă dacă matricele sunt simetrice sau dacă au linii
sau coloane constante, cazuri în care se fac alocări adecvate.
Operaţiile cu matrice se efectuează cu algoritmi care iau în considerare forma efectivă în care
s-a făcut memorarea, existând posibilitatea trecerii rezultatului la un alt tip de stocare în memorie.
De exemplu ,dacă A este o matrice triunghiulară cu elementele nenule sub diagonala
principală şi B este o matrice triunghiulară cu aceeaşi dimensiune ca matricea A dar cu elementele
nenule deasupra diagonalei principale,în cazul adunării celor două matrice ,rezultă o amtrice cu toate
elementele nenule,ce va fi stocată după regulile acestui tip.
175
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
MATRICE RARĂ
Gradul de umplere
- pentru a deduce dacă o matrice este sau nu rară, se defineşte gradul de
umplere al unei matrice:
k
G = ------------- * 100
m*n
unde:
- k numărul elementelor nenule
- m numărul de lini al matricei
- n numărul de coloane al matricei
În cazul în care k>0.3* m*n, se consideră că matricea este rară
2,abordare dinamică ,în care alocarea se efectuează în timpul execuţiei, caz în care
nu este necesară informaţia asupra numărului de elemente nenule;aceasta abordare va fi
dezvoltată în partea destinată listelor
Memorarea elementelor matricei rare, presupune memorarea indicelui liniei, a indicelui coloanei şi
respectiv, valoarea nenulă a elemntului.
Se consideră matricea:
A=
176
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Val[k]:=a[i,j];
End;
Exemplu:
Se consideră o matrice A şi un vector B ale cărui elemente corespund cu elementele matricei
A (forma liniarizata a unei matrice) . Se cere să se interschimbe două coloane oarecare k şi j ale
matricei .
for i:=1 to m do
begin
c:=a[i,j];
a[i,j]:=a[i,k];
a[i,k]:=c;
end;
for i:=1 to m do
begin
c:=b[(i-1)*n+j];
b[(i-1)*n+j]:= b[(i-1)*n+k];
b[(i-1)*n+k]:=c;
end;
Transformarea algoritmilor de lucru cu masive bidimensionale în algoritmi de lucru cu massive
unidimensionale, este benefică ,nemaimpunându-se cerinţa de transmitere ca parametru a dimensiunii
effective a numărului de linii (dacă liniarizarea se face pe coloane) sau a numărului de coloane(dacă
liniarizarea se face pe linie)
În cazul matricelor rare ,aceeaşi problemă revine la interschimbarea valorilor de pe coloana a
treia dintre elementele corespondente ale coloanei k şi j, cu posibilitatea inserării unor perechi şi
respectiv ştergerii altora.
Pentru generalizare, un amsiv n-dimensional rar, va fi reprezentat prin n+1 vectori, fiecare
permiţând identificarea coordonatelor elementului nenul, iar ultimul stocând valoarea acestuia.
În cazul în care se construieşte o matrice booleană ce se asociază matricei rare, odată cu
comprimarea acesteia, se dispun elementele nenule într-un vector.Punerea în corespondenţă a
elementelor vectorului are loc odată cu decomprimarea matricei booleene şi analizarea acesteia.
APLICATIA:
{Intr-un vector se memoreaza elementele nenule dintr-o matrice iar in alt vector
pozitiile acestora Sa se reconstituie matricea (rara)}
type li=1..10;
ma=array[li,li] of real;
ve=array[li] of real;
po=array[li] of integer;
var poz:po;
val:ve;a:ma;k,m,n,p,i,j:integer;
begin
177
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
write('m=');readln(m); write('n=');readln(n);
write(' cite comp[onente are vectorul de valori nenule din matrice p=');readln(p);
for i:=1 to p do
begin
write('valoarea ',i);readln(val[i]);
end; for i:=1 to p do
begin
write('pozitia lor initiala din matrice ',i);readln(poz[i]);
end;
for i:=1 to m do
for j:=1 to n do
a[i,j]:=0;
for k:=1 to p do begin
i:=poz[k] div n+1;
j:=poz[k] mod n;
a[i,j]:=val[k];
end;
write('matricea rara ');writeln;
for i:=1 to m do begin
for j:=1 to n do
write(a[i,j]:8:1);
writeln;
end;
readln;
end.
EXEMPLE:
aux:=a[i,j];
{ Se considera un tablou bidimensional a cu n linii a[i,j]:=a[i+1,j];
si n coloane (1<=n<=50) componente intregi si un a[i+1,j]:=aux;
numar intreg k. end;
Se cere sa se afiseze tabloul a cu componente intregi for j:=1 to n do begin
. aux:=a[j,i];
Se cere ca prin operatii de interschimbare de linii si a[j,i]:=a[j,i+1];
coloane sa se obtina un tablou cu elementele de pe a[j,i+1]:=aux;
diagonala principala end;
ordonate crescator.} sw:=1;
uses crt ; end;
var end;
a: array [1..50,1..50] of integer; writeln;
i,j,n,sw: byte; for i:=1 to n do begin
aux: integer; for j:=1 to n do
begin write (a[i,j],' ');
clrscr; writeln;
write ('n='); readln (n); writeln('dati elementele end;
matricei '); readln;
for i:=1 to n do end.
for j:=1 to n do begin {Sa se parcurga in spirala o matrice adica sub
forma
gotoxy (4*j,i+2); a[k,k]----------------------->a[k,n-k+1]
readln (a[i,j]); a[k-1,k]---------> |
end; | |
sw:=1; | |
while sw=1 do begin a[n-k+1,k] <---------------- a[n-k+1,n-k+1] }
sw:=0; var a:array[1..10,1..10] of integer;
for i :=1to n-1 do i,j,k,l,n:integer;
if a[i,i]> a[i+1,i+1] then begin
begin write('n=');readln(n);
for j:=1 to n do begin for i:=1 to n do
178
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Ş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
179
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
Sintaxa:
Variabila :=Length(sir);
Ex:
Var s: string;
Begin
Readln(s);
Writeln(length(s);
End.
CONCATERNARE(ALATURAREA) ADOUA SIRURI DE CARACTERE
Sintaxa:
SIRdestinatie:=CONCAT(SIRsursa,SIR2);
Ex:
Var s1,S2,S3: string;
Begin
Readln(s2);
READLN(S3);
S1:=CONCAT(s2,S3);
Writeln (s1);
End.
SAU:
Var s1,S2,S3: string;
Begin
180
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Readln(s2);
READLN(S3);
S1:= s2+S3;
Writeln (s1);
End.
Writeln (s1);
End.
LIMBAJUL PASCAL
CAUTAREA UNUI SIR DE CARACTERE
Sintaxa:
VARIABILA_de_tip_intreag:=pos(SIRsursa,CINE_se_cauta);
Ex:
Var s1,S2: string;p:integer;
Begin
Readln(s2);
Readln(s1);
p:=pos(s1,s2);
Write(p);
End;
LIMBAJUL PASCAL
STREGEREA DINTR-UN SIR
Sintaxa:
DELETE(SIRsursa,DE_UNDE_STERG,pana_in_ce_pozitie);
Ex:
Var s1: string;
Begin
Readln(s1);
delete(s1,1,length(s1)-2);
Write(s1);
End.
LIMBAJUL PASCAL
INSERAREA INTR-UN SIR A ALTUI SIR
Sintaxa:
181
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
INSERT(SIRsursa_UNDE_inserez,pe_cine_inserez,pozitia_de_unde_fac_inserarea);
Ex:
Var s1,S2: string;
Begin
Readln(s1);readln(s2);
insert(s1,s2,3);
Write(s1);
End.
LIMBAJUL PASCAL
CONVERSII LA SIRURI DE CARACTERE DIN NUMAR IN STRING
Sintaxa:
STR(NUMAR:cate_zecimale,cate_unitati,SIRUL_string);
Ex:
Var s1: string;p:integer;
Begin
Readln(p);
Str(p:10,s1);
Write(s1);
End.
Ex:
Var s1: string;p:real;
Begin
Readln(p);
Str(p:10:2,s1);
Write(s1);
End.
Tipul multime
Declarare: SET OF tip_parinte
Literali: [element1,element2,…,elementn]; [] - multimea vida
Operatii:
- reuniune (+); intersectie (*); diferenta (-)
- relationale (incluziune)
- apartenenta (IN)
{Sa se efectueze operatii cu multimi apoi Daca x apartine de B atunci 5*x+2,7*x+2
scrierea lor apartine de B
Daca limita multimii nu ar fi 255 ce se Sa se stabileasca daca B e inclus in A sau sa se
intimpla (folosim vectori cu tipul multime nu afiseze elementele intersectiei
se poate) }
Fie 1 care apartine si de A si de B var a,b,c:set of 0..255;
Daca x apartine de A atunci 2*x+1,3*x+1 x,i,j:0..255;
apartine de A car:char;
begin
182
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
183
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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 var i,n:integer;
sa se determine in ce cadran se a:punct;
afla} begin
program cadran ; clrscr;
uses crt; with a do begin
type punct=record write('abscisa :');
x,y:real; read(x);
end; write('ordonata :');
184
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
185
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
- PROCEDURA REWRITE deschide un fişier vid pentru executarea de operaţii de scriere şi are
prototipul:
Procedure Rewrite (varF);
186
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Pentru detectarea marcajului de sfârşit de fişier se foloseşte funcţia EOF (END OF FILE
)
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.
187
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
EXEMPLE
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.
(2) …
număr : = 0;
while not eof (f) do
begin
if seek eoln (f) then {linia este albă}
număr : = număr + 1;
readln(f); {avans la linia următoare}
end;
…
(3) …
număr : = 0;
while not seek eof (f) do
begin
număr : = număr + 1; {numără linie}
readln(f); {avans la linia următoare}
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;
188
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
f1,f2,f3 : fişier;
begin
assign (f1, ’fdat’);
assign (f2, ’fdat1’);
assign (f3, ’fdat2’);
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);
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.
189
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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. 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.
190
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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).
Write(VAR f,v1[,v2,...,vn]),
191
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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.
192
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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 citit/scris cu procedurile BlockRead, respectiv
BlockWrite. Când argumentul RecSize lipseste, se considera implicit ca blocul are
lungimea de 128 octeti. Valoarea maxima a argumentului este 65535. Daca fisierul
exista în suport, acesta va fi sters si se creeaza noul fisier în locul sau. 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 bloc).
În fisier este admisa atât scrierea, cât si citirea datelor. Dupa executia procedurii,
Eof(f) este TRUE.
193
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
transferate. În cazul în care parametrul corespunzator lui Ind este absent si numarul
blocurilor efectiv transferate este mai mic decât Count, se produce eroare de I/E.
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.
assign(f,'f.3'); read(x);
rewrite(f1);writeln; write(f2,x);
m:=0; readln;
repeat n:=n+1;
writeln(' dati valori descrescatoare in primul writeln(' mai sunt date de introdus
fisier'); d/n');readln(si);
194
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
195
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
196
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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 :
197
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
De cele mai multe ori o aplicatie necesita existenta mai multor fisiere active simultan,
cu rol diferit (de intrare, de iesire, de intrare/iesire). Indiferent de numarul fisierelor
utilizate, în marea majoritate a algoritmilor, logica prelucrarii este coordonata, la un
moment dat, de un singur fisier, obligatoriu de intrare, parcurs secvential, numit fisier
conducator (sau director). Fisierul conducator are proprietatea ca articolele lui pot fi
citite independent de prelucrarea altor fisiere. Altfel spus, un fisier nu este conducator
daca prelucrarea articolelor sale este dependenta de existenta (de citirea) articolului
altui fisier. Accesul la datele memorate în fisierul conducator se realizeaza la nivel de
articol. De aceea, algoritmii de prelucrare, indiferent de operatia de gestiune, necesita
utilizarea unei structuri repetitive pentru parcurgerea (partiala sau integrala) a
fisierului respectiv.
198
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
199
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Varianta se poate aplica fisierelor vide sau nevide. Când conditia de sfârsit de
prelucrare este chiar expresia (functia) Eof(f), algoritmul va include doar citirea
curenta în debutul modului PRELUCRARE - variantele 2 si 3 (figura 6.5).
200
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Varianta 3 necesita existenta cel putin a unui articol (fisier conducator nevid.)
Detectarea sfârsitului de fisier prin operatia de citire, caz în care se genereaza eroare
si se întrerupe executia programului. Întreruperea programului se poate inhiba cu
directive de compilare {$I-}, iar eroarea de intrare/iesire se poate detecta cu functia
standard IOResult. Algoritmul de prelucrare prevede o citire initiala în modulul
ÎNCEPUT si citirea curenta în finalul modulului PRELUCRARE. Testul de sfârsit al
prelucrarii poate fi constituit de însasi functia IOResult - varianta 4 (figura 6.6.), sau
de variabila booleana SF, pozitionata la citirea marcatorului de sfârsit de fisier -
varianta 5 (figura 6.7).
În ambele variante fisierul conducator este binar, vid sau nevid. În cazul în care
fisierul este nevid (are cel putin un articol), citirea initiala poate sa nu mai fie
încadrata de directivele de compilare {$I-} si {$I+}.
201
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
202
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
· descrierea articolelor este apropiata atât descrierii naturale a structurii unei entitati
din lumea reala (formata din câmpuri cu nume, lungime, reprezentare interna proprie,
semnificatie si factor de repetabilitate diferite), cât si descrierii din alte limbaje;
· exista posibilitatea de a descrie explicit mai multe structuri pentru articolele
aceluiasi fisier (articole cu structura variabila);
· operatiile de acces la înregistrari se realizeaza cu viteza mare, datorita lipsei
conversiilor la transferul între memoria principala si memoria externa.
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.
203
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
■ 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:
□ 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.
204
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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.
În esenţă, o funcţie este alcătuită din:
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
1. Clasa de memorare.
2. Vizibilitate.
3. Durata de viaţă.
4. Tipul variabilei, singurul pe care l-am studiat până în prezent.
205
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
206
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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;
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;
207
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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;
IF b > t THEN t : = b;
IF c > t THEN t : = c;
MAX : = t
END;
BEGIN
CLRSCR;
WRITE (’INTRODUCEŢI TREI NR. !’);
208
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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;
procedure scad;
var c : integer;
209
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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.
210
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
- efectivi, la care, în momentul apelului, valorile lor sunt cunoscute şi sunt situaţi în
instrucţiunea de apel.
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.
211
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Variabile locale
Acestea sunt declarate în corpul funcţiilor. Mai precis, pot fi declarate în orice bloc (instrucţiune
compusă) al acestora
1. Clasa de memorare a variabilelor locale este, implicit, segmentul de stivă. Există posibilitatea ca
acestea să fie alocate în registrele microprocesorului, caz în care declaraţia lor trebuie precedată de
cuvântul cheie register.
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.
212
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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?
213
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
c:=Aa+Bb; c:=Aa-Bb;
write('reuniunea');ss(c); write('diferenta');ss(c);
c:=Aa*Bb; READLN;
write('intersectia'); END.
ss(c);
Alte exemple:
1.Declaratia unei proceduri: Write(a,’ ‘,b);
procedure Scrie(a:integer); Readln;
begin End.
write(a);
end; 7.Program parametri variabili:
program p2;
2. declaratia altei proceduri: uses crt;
procedure Calcule(a:integer , var b:integer); var a , b :integer;
var I:integer; procedure Afis( var a , b :integer);
begin begin
readln (I); a:=a+1;
write(a); b:=b+4;
b:=b+I*3; writeln(a, ‘ ‘,b);
end; end;
begin
3.Lista parametrilor formali este vida: clrscr;
procedure Afisere; a:=1;
begin b:=1;
writeln(‘Exemplu de procedura fara parametri Afis(a,b);
formali’); Write(a,’ ‘,b);
end; Readln;
End.
4.lista parametrilor formali este
formata dintr-o singura sublista: 8.Consideram urmatoarele declaratii
procedure Afisere(k,p :integer); pentru a apela la o procedura:
begin var a, b :integer;
writeln(k,’ ‘, p); procedure Afis(a,b: integer);
end; begin
214
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
b:=1;
Afis(1); 23. primul exemplu de program cu functii:
Write(a,’ ‘,b);
program p1;
a:=1; (3) uses crt;
b:=2; var a,b :integer;
Afis(a+1.2,b+3); functioA(a,b:integer):real;
Write(a,’ ‘,b); begin
a:=a+1;
Readln; b:=b+4;
End. writeln(a,’ ‘,b);
18.DECLARAREA UNEI FUNCTII: A:=13;
End;
Begin
function F(x:integer):real; Clrscr;
begin A:=1;
F:=x+1; B:=2;
End; Writeln(A(a,b));
Write(a, ‘ ‘ , b);
Readln;
19. DECLARAREA UNEI FUNCTII (2): End.
215
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Var a:real;
Function f(x:real):real;
x+1 , daca <4 Begin
F(x)= If (x<=4) then f:=x+1
2x+1 , daca x>4 Else F:=2*x-1
End;
Begin
Clrscr;
Write(‘a=’);readln(a);
Writeln(‘f(‘,a,’);=’,fa:4:2);
Program p1; Readln;
Uses crt; End.
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.
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);
216
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
adun;
scad;
writeln (’d =’,d);
readln;
end.
ARITMETICE
217
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
218
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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.
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.
219
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
n→2 nivelul 2.
n→3
F:N N
Program p1 ;
Uses crt;
1, ,n = 0 Var n:integer ;
Fact (n) = Function pp(k , p :integer) :integer ;
Fact(n-1)*n ,altfel Begin
If (k=p) then pp:=k else pp:=pp(k,p-1)*p
End;
Bein
2 Exemple : Write(‘n =’);readln(n);
Write(‘pp =’, pp(1,n));
Fact (0) = 1 ; Readln;
Fact(2) = fact(1)*2 = fact(0)*1*2 = 1*1*2 =2 End.
Fact(2) = fact(3)*4 = fact(2)*3*4 = fact(1)*2*3*4
= fact(0)*1*2*3*4 = 1*1*2*3*4 =24
6. Se da un sir x de nr intregi . SA se
3. Exempu de definire inconsistenta : realizeze subprograme in Pascal care sa
realizeze citrea si afiserea sirului x.
F(0) = 1
F(2) = f(4)*2 = f(6)*2*4 = f(8)*2*6*4 = …….
Procedure Cit_sir(x:Şir ; k,p : integer);
Begin
4. Realizati subprograme recursive in Pascal If (k=p) then readln(x[k]) else
care returneaza: Begin
1+2+3+….+n. Readln(x[k]);
Cit_sir(x , k+1 , p);
End
Program p1 ; End;
Uses crt; Procedure Afis_sir(x:Şir ; k,p : integer);
Var n:integer ; Begin
Function s(k , p :integer) :integer ; If (k=p) then write(x[k]:5) else
Begin Begin
If (k=p) then s:=k else s:=s(k,p-1)+p write(x[k]:5);
End; Afis_sir(x , k+1 , p);
Bein End
Write(‘n =’);readln(n); End;
Write(‘s =’, s(1,n)); Readln;
Readln; End.
End.
220
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
7. Se da un sir x de nr intregi . SA se
realizeze subprograme in Pascal care sa
calculeze : Function s(x:sir; k , p :integer) :integer ;
X5 +x6 +….+x12 . Begin
If (k=p) then s:=Tk else s:=s(x,k,p-1)+Tp
End;
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.
-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).
221
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
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.
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
222
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
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
223
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
RePart:=re;end;
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.
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:
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’.
begin
self:re:=self.re+c.re;
self.im:=self.im+c.im;end.
224
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
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:
Type complex=object
225
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Re,im:real;
Constructor init(a,b:real);
Constructor generare(x:real);
Function modul:real;
End;
Constructor complex.init(a,b:real);
begin
Re:=a;
Im:=b;
End;
Constructor complex.generare(x:real);
Begin
Re:=x;
Im:=0;
End;
Function complex.modul: real;
Begin
Modul:=sqrt(sqe(re)+sqr(im));
End;
Var z,u:complex;
Begin
z.init(3,4); writeln(z.modul);
u.generare(4); u.im:=3; writeln(u.modul);
end.
226
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
X:=0;y:=0;
End;
Function punct.distanta:real;
Begin
Distanta:=sqrt(sqr(x)+sqr(y));
End;
Dreptunghi
Definiti un tip de obiect care sa reprezinte notiunea geometrica de dreptunghiavand laturile paralele cu axele de
coordonate si atasati o metoda care sa furnizeze aria sa.
Program test;
Type punct=object
X,y:real;
Constructor generare;
Function distanta:real;
End;
Constructor punct.generare;
Begin
X:=0;y:=0;
End;
Function punct.distanta:real;
Begin
Distanta:=sqrt(sqr(x)+sqr(y));
End;
Type dreptunghi=object
U,v:punct;
Constructor generare(a,b:punct);
Function aria:real;
u.x:=a.x; u.y:=a.y;
v.x:=b.x; v.y:=b.y;
end;
function dreptunghi.aria:real;
begin
aria:=abs((u.x-v.x)*(u.y-v.y));
end;
var
a,b:punct;
x:dreptunghi;
begin
a.generare; a.x:=1; a.y:=1;
b.generare; b.x:=2; b.y:=2;
x.generare(a,b);writeln(x.aria);
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
227
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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.
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
228
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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;
graph set.color(get back color);
graph circle(x,y,r);end;
procedure circle expand(expandby:integer;)
begin
hide;
r;=r+expandby;if r<0 then r:=0;
show;end;
end.
In general numele unei functii sau proceduri dintr-o unitate poate fi prefixat cu numele unitatii ,pt evitarea unei
ambiguitati in apelasrea lor.Obiectul’circle’ este derivat din obiectul’point’,de la care mosteneste urmatoarele
metode:
setcolor:folosita fara modificari de circle;
init,show,hide,move to:redefinite incircle’
In plus,obiectul ‘circle’ adauga o metoda noua numita ‘expand’.
EXEMLPU
program desene ;
uses graph.figuri;
var gd,gm:integer;
punct:point;cerc:circle;
begin
gd:=detect;
init graph(gd,gm,’);punct.init(300,200);punct.show;readln;
punct.set color(yellow);punct.move to (400,300);readln;
cerc,init(200.100,60);cerc .show;readln;
cerc set color(red);cerc.move to (300,200);readln;set color(green);cerc expand(-20);readln;
end.
4.6.4 Polimorfism
Rescrierea metodelor
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;
229
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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)
begin
re:=x; im:=0; end;
function complex .modul:real;
begin
modul :=sqrt(sqr(re)+sqr(im));
end;
Prin mostenire datele si metodele se transmit urmasilor avand posibilitatea de modificare a metodelor.
type doi=object(unu);
function putere:integer;
end;
230
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
2.ATRIBUTUL VIRTUAL.
231
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
t>init(3);X.init*4); writeln(T.calcul(x)) ;
end.
4.6.5 Constructori si desconstructori
ALOCAREA DINAMICA A OBIECTELOR,DESTRUCTORI
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
5. Metode de programare
5.1 BACKTRACKING:prezentare generala,oportunitatea
utilizarii metodei;aplicatii specifice
232
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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ă.
Î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ă.
233
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Aceasta tehnica se foloseste in reezolvarea 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
234
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
235
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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).
3
1
4
2 ST(4)
ST(3)
ST(2)
ST(1)
236
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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.
writeln;
end;
LIMBAJUL PASCAL
procedure afis(x:sir;k:integer); PROBLEMA DAMELOR
var i:integer; type sir =array[1..100] of integer;
begin
for i:=1 to n do var x:sir;
write(v[x[i]],' '); p,i,k,n,s:integer;
237
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
as,ev:boolean; end
else
procedure succesor(var begin
x:sir;k:integer;var as:boolean); k:=k+1;
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);
238
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
239
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
240
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
s=2 x[k]:=x[k]+1;
1 este:=true;
2 end
3 else este:=false;
=>0 de 1 leu end;
1 de 2 lei} BEGIN
program plata; write('n=');
readln(n);
var x,a,nr:array[1..20] of write('s=');
integer; readln(s);
s,k,n,nr1,i,s1:integer; for i:=1 to n do begin
ok,este :boolean; writeln('valoarea bacnotei de
procedure afisare; tipul ',i);
var i:integer; readln(a[i]);nr[i]:=s div a[i];
begin end;
nr1:=nr1+1; k:=1;
writeln('solutia ',nr1); x[k]:=-1;
for i:=1 to k do nr1:=0;
writeln(x[i],'de ',a[i],' while k>0 do begin
lei'); ok:=false;
writeln; este:=true;
readln; while(not ok) and este do begin
end; succesor(k,este);
if este then cont (k,ok);
procedure cont (k:integer;var end;
ok:boolean); if not ok then k:=k-1
var i:integer; else if s1=s then
begin afisare
s1:=0; else
begin
for i:=1 to k do k:=k+1;
s1:=s1+x[i]*a[i]; x[k]:=-
if s1 <=s then ok:=true 1;
else end;
ok:=false; end;
END; readln;
procedure succesor END.
(k:integer;var este:boolean);
begin
if (x[k]<nr[k]) and (k<=n) then
begin
BACTRACKING IN PLAN
{fie o tabla de sah si un cal in coltul stinga sus writeln('solutia cu numarul ',ns,'este ');
Sa se afiseze toate modalitatile de mutare a for i:=1 to n do
calului asfel inacit sa begin
treaca o singura data prin fiecare patarat al for j:=1 to n do
tablei} write(a[i,j]:4);
uses crt; writeln;
type sir =array[1..8] of integer; end;
mat=array[1..20,1..20] of integer; end;
const
di:sir=(-2,-1,1,2,2,1,-1,-2); procedure calul(var
dj:sir =(1,2,2,1,-1,-2,-2,-1); A:mat;i,j:integer;pas:integer);
var a:mat; var k,i1,j1:integer;
i,j,n,ns,pas:integer; cond:boolean;
begin
procedure afis; for K:=1 to 8 do
var i,j:integer; begin
begin i1:=i+di[K];
ns:=ns+1; j1:=j+dj[k];
241
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
begin end;
clrscr; end;
writeln ('n='); end;
readln(n);
for i:=1 to n do begin
for j:=1 to n do clrscr;
a[i,j]:=0; writeln ('n=');
a[1,1]:=1; readln(n);
ns:=0; for i:=1 to n do
pas:=2; for j:=1 to n do
calul(a,1,1,pas); begin
readln; writeln('labirint[',i,',',j,']=');
end. readln(lab[i,j]);
{fie un labirint unde cifra 1 este culoar pe care end;
se poate circula for i:=1 to n do
iar zero nu se poate circula intr-o matrice for j:=1 to n do
Sa se afiseze toate modalitatile de deplasare 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);
242
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
243
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
BACTRACKING RECURSIV
{Sa se genereze toate descompunerile unui numar n ca bktr(p+1); end;
suma numere diferite end;
iar rezultatele sa le puna intr-un fisier end;
ex:n=4
=>1 3 begin
4} initializari;
assign(g,'desc.txt');
type vector =array[1..25] of integer; rewrite(g);
bktr(1);close(g);
var st:vector; readln;
n,k:integer;g:text; end.
function suma(p:integer):integer; DESCOMPU
var s,k:integer; {Sa se genereze toate descompunerile unui numar n ca
begin suma de k numere
s:=0; iar rezultatele sa le puna intr-un fisier
for k:=1 to p do ex:n=4
s:=s+st[k]; k=2
suma:=s; =>1 3}
end;
type vector =array[1..25] of integer;
244
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
else
end; bktr(p+1);
end;
procedure bktr(p:integer); end;
var pval:integer;
begin begin
for pval:=1 to n do initializari;
begin assign(g,'desc.txt');
st[p]:=pval; rewrite(g);
if valid(p) then bktr(1);close(g);
if p=k then readln;
tipar(p) end.
Backtracking recursiv după schemă
program permutari;
type stiva=array[1..100] of integer;
var st:stiva;
n,k:integer;
ev:boolean;
procedure init(k:integer;var st:stiva);
begin
st[k]:=0;
end;
function succesor(var st:stiva;k:integer):boolean;
begin
if st[k]<n then
begin
st[k]:=st[k]+1;
succesor:=true;
end
else succesor:=false;
end;
procedure valid(var ev:boolean;st:stiva;k:integer);
var i:integer;
begin
ev:=true;
for i:=1 to k-1 do
245
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
program damer;
type tabla=array[1..20] of integer;
var t:tabla;
i,n:integer;
procedure tipar;
var i:integer;
begin
for i:=1 to n do write(t[i]);
writeln;
end;
procedure dame(k:integer);
var i,j:integer;
c:boolean;
begin
if k=n+1 then tipar
246
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
else begin
for i:=t[k]+1 to n do begin
t[k]:=i;
c:=true;
for j:=1 to k-1 do
if (t[j]=t[k]) or (abs(t[k]-t[j])=(k-j)) then c:=false;
if c then dame(k+1);
end;
end;
t[k]:=0;
end;
Begin
write('n='); readln(n);
for i:=1 to n do t[i]:=0;
dame(1);
End.
247
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
program bancnote;
uses crt;
type vector=array[1..9] of integer;
var sol,a,b:vector;
n,i,s:integer;
procedure tipar(k:integer);
begin
writeln('Solutie');
for i:=1 to k do
if sol[i]<>0 then writeln(sol[i],'bancnote',a[i]);
readln;
end;
procedure plata(k,s0:integer);
begin
while (sol[k]<b[k]) and (s0+a[k]>=s) do
begin
sol[k]:=sol[k]+1;
if sol[k]>0 then s0:=s0+a[k];
if s0=s then tipar(k)
else if k<n then plata(k+1,s0)
end;
sol[k]:=-1;
end;
Begin
write ('cate tipuri de bancnote avem?');readln(n);
write ('suma=');readln(s);
for i:=1 to n do
begin
write('valoarea monedei de tipul',i,' ');
readln(a[i]);
b[i]:=s div a[i];
sol[i]:=-1;
end;
plata (1,0);
End.
Problema labirintului. Se dă un labirint sub formă de matrice cu m linii şi n
coloane. Fiecare element al matricei reprezintă o cameră a labirintului. Într-una din
camere, de coordonate x şi y, se găseşte un om. Se care să se găsească toate
ieşirile din labirint.
program ies_labirint;
type labirint=array [0…9,0..9] of integer;
drum=array [1…2,1…100] of integer;
var 1:labirint;
d:drum;
i,j,m,n,x,y,k: integer;
procedure tipar(k:integer;d:drum);
var i:integer;
begin
248
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
writeln(‘----------------’);
for i:=1 to k do
writeln(‘1=’,d[1,i],’’,’c=’,d[2,i])
end;
procedure ies (x,y:integer;var k:integer;var l:labirint;)
var d:drum;
var gasit:boolean;
i:integer;
begin
if l[x.y]=16
then tipar(k.d)
else
begin
k:=k+1;d[l,k]:=x;d[2,k]:=y;
gasit:=false;
for i:=1 to k-1 do
if (d[l,i]=d[l,k]) and (d[2,i]=d[2,k])
then gasit:=true;
if not gasit
then
for i:=1 to 4 do
case i of
1:if l[x,y] and 8<>0 then ies(x-1,y,k,l,d);
2:if l[x,y] and 4<>0 then ies(x,y+1,k,l,d);
3:if l[x,y] and 2<>0 then ies(x+1,y,k,l,d);
4:if l[x,y] and 1<>0 then ies(x,y-1,k,l,d);
end; {case}
k:=k-1;
end;
end;
Begin
Write(‘n=’);readln(n);
Write(‘m=’);readln(m);
For i:=1 to m do
For j:=1 to n do begin
Write(‘l[‘,i,’,’,j,’]=’);
Readln(l[i,j]);
End;
Write(‘X=’);readln(X);
Write(‘y=’);readln(y);
for i:=1 to n do
begin
l[0,i]:=16;
l[m+1,i]:=16
end;
for i:=1 to m do
begin
l[i,0]:=16;
l[i,n+1]:=16
end;
249
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
k:=0;
ies(x,y,k,l,d)
end.
Algoritmul de umplere a unei suprafeţe închise(FILL). Se dă o matrice binară
Valorile 1 delimitează o anumită suprafaţă închisă în cadrul matricei (elementele
aparţinând acestei suprafeţe sunt marcate cu 0).Se dau, de asemenea,
coordonatele x şi y ale unui element al matricei, semnificând un punct din interiorul
acestei suprafeţe.
program umplere;
type matrice=array [0…9,0…9]of integer;
var a:=matrice;
i,j,m,n,x,y:integer;
begin
write (‘M=’); readln(m);
write (‘N=’); readln(n);
for i:=1 to m do
for j:=1 to n do
begin
write(’a[‘,i,’,’,j,’]=’);
readln([i,j])
end;
for i:=1 to n do
begin
a[0,i]:=1;
a[m+1,i]:=1
end;
for i:=1 to m do
begin
a[i,0]:=1;
a[i,n+1]:=1
end;
write (‘X=’); readln(x);
write (‘Y=’); readln(y);
for i:=1 to m do
begin
250
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
program foto;
type matrice=array [0..9,0..9] of integer;
var a:matrice;
i,j,m,n,x,y:integer;
gasit:boolean;
procedure compact(x,y:integer;var a:matrice);
begin
if a[x,y]=1 then
begin
a[x,y]:=0;
compact(x-1,y,a);
compact(x-1,y+1,a);
compact(x,y+1,a);
compact(x+1,y+1,a);
compact(x+1,y,a);
compact(x+1,y-1,a);
compact(x,y-1,a);
compact(x-1,y-1,a);
end;
end;
begin
write('m='); readln(m);
write('n=');readln(n);
for i:=1 to m do
for j:=1 to n do
begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
for i:=1 to n do
begin
a[0,i]:=0;
a[m+1,i]:=0;
251
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
end;
for i:=1 to m do
begin
a[i,0]:=0;
a[i,n+1]:=0;
end;
x:=0;
repeat
x:=x+1; y:=0;
repeat
y:=y+1;
until (y=n) or (a[x,y]=1);
until (x=m) or (a[x,y]=1);
compact (x,y,a);
gasit:=false;
for i:=1 to m do
for j:=1 to n do
if a[i,j]=1 then gasit:=true;
if gasit then writeln('mai multe obiecte')
else writeln('un obiect')
End.
Săritura calului. Se consideră o tablă de şah nxn şi un cal plasat în colţul din
stânga, sus. Se cere să se afişeze toate posibilităţile de mutare a acestei piese de
şah, astfel încât să treacă o singură dată prin fiecare pătrat al tablei.
program cal1;
type tabla=array[-1..25,-1..25] of integer;
solutie=array[1..2,1..1000] of integer;
var t:tabla;
s:solutie;
i,j,n,nr,l,c:integer;
procedure tipar;
begin
writeln('solutie');
for i:=1 to n*n do
begin
writeln(s[1,i],' ',s[2,i]);
readln
end;
end;
procedure cal(l,c,nr:integer);
begin
if t[l,c]=0 then
begin
nr:=nr+1;
t[l,c]:=1;
s[1,nr]:=l;
s[2,nr]:=c;
252
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
1 2 2 2 2
1 1 1 1 1 1
1 2 3
253
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
254
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
255
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
end;
for i:=1 to n do
procedure valid(var
begin
write('numarul ',i,' este ev:boolean;st:stiva;k:integer);
'); var i:integer;
readln(v[i]); begin
end; ev:=true;
k:=1;
x[k]:=0;
for i:=1 to k-1 do if st[k]=st[i] then
while(k>0) do ev:=false;
begin end;
repeat function solutie(k:integer):boolean;
succesor(x,k,as); begin
if as then valid(x,k,ev)
until (as and ev) or solutie:=(k=p);
(not as); end;
if as then procedure tipar;
if (k=p) then var i:integer;
afis(x,k)
else
begin
begin for i:=1 to p do write(st[i]);
k:=k+1; writeln;
x[k]:=0; end;
end Begin
else
k:=k-1 ; write('n=');readln(n);
end; write('p=');readln(p);
readln; k:=1;init(k,st);
end. while (k>0) do
VARIANTA 2 begin
Generare aranjamentelor. Se citesc n repeat
si p. Sã se genereze toato succesor(as,st,k);
aranjamentele de n luate câte p. if as then
program aranjamente; valid(ev,st,k);
type stiva=array[1..100] of integer; until (not as) or(as and
var st:stiva; ev);
n,k,p:integer; if as then
as,ev:boolean; if solutie(k) then
procedure init(k:integer;var st:stiva); tipar
begin else begin
st[k]:=0;
end; k:=k+1;
procedure succesor(var as:boolean;var
st:stiva;k:integer); init(k,st);
begin end
if st[k]<n then else k:=k-1;
begin end
st[k]:=st[k]+1; End.
as:=true;
end
else as:=false;
256
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
257
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
258
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
end readln;
else end.
k:=k-1
end;
5.4.6 Partitii
a)Partitiile unui numar natural
{Sa se genereze toate diferite}
descompunerile unui numar n ca uses crt;
suma numere
259
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
260
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
261
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Descrierea metodei
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
Repeat
End
262
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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.
Vom construi o solutie dupa urmatorul algoritm:
P1 Sortam spectacolele dupa ora terminarii lor;
P2 Primul spectacol programat este celo care se termina cel ma devreme;
P3 Alegem primul spectacol dintre cele care urmeaza in sir ultimului spectacol programat care indeplineste
conditia ca incepe dupa ce s-a terminat ultimul spectacol programat;
P4 Daca tentativa de mai sus a esuat (nu am gasit un astfel de spectacol) algoritmul se termina,astfel se
progreameaza spectacolul gasit si algoritmul se reia de la P3
type spectacol=array[1..2,1..10] of integer;
ordine=array[1..10] of integer;
var s:spectacol;
o:ordine;
n,i,oradeinceputaspectacoluluicurent,siciteminutearespectacolulcurent,
oradesfirsitaspectacoluluiurmator,siciteminutearespectacolulurmator:integer;
procedure sortare;
var gata:boolean;
variabiladeschib,i:integer;
263
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
begin
repeat
gata:=true;
for i:=1 to n-1 do
if s[2,o[i]]>s[2,o[i+1]] then
begin
variabiladeschib:=o[i];
o[i]:=o[i+1];
o[i+1]:= variabiladeschib;
gata:=false;
end;
until gata;
end;
begin
write(' nr de spectacole n=');
readln(n);
for i:=1 to n do
begin
o[i]:=i;
write ('ora de inceput pentru spectacolul ',i); readln(oradeinceputaspectacoluluicurent);
write ('si cite minute ',i); readln(siciteminutearespectacolulcurent);
write ('ora de sfirsit pentru spectacolul ',i); readln(oradesfirsitaspectacoluluiurmator);
write ('si cite minute ',i); readln(siciteminutearespectacolulurmator);
s[1,i]:=oradeinceputaspectacoluluicurent*60+siciteminutearespectacolulcurent;
s[2,i]:=oradesfirsitaspectacoluluiurmator*60+siciteminutearespectacolulurmator;
end;
sortare;
write('primul este ',o[1]);
for i:=2 to n do
if s[1,o[i]]>=s[2,o[i-1]] then
264
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
265
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Problema comis-voiajorului
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.
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).
266
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
1
1 1
9
2
5 3
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]);
267
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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)
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.
268
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
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;
269
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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.
270
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
cautam valoarea 3
271
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
Etapa 1)
272
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
273
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
274
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
275
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
276
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
277
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
278
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
279
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
280
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
281
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
282
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
283
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
284
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
285
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
286
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
287
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
288
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
289
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
290
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
291
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
292
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
293
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
294
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
etapa2)finala
295
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
296
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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:
-se apeleaza poz;
-se apeleaza quick pentru li si k-1;
-se apeleaza quick pentru k+1 si ls.
297
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Etapa 1)
298
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
299
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
300
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
301
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
302
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
303
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
304
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
305
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
306
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
307
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
308
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
si in final
309
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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
310
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
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)
311
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
312
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
313
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
314
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Mentionam ca dreptunghiul de arie maxima fara gauri este retinut prin aceiasi
parametric ca si dreptunghiul cu gauri,in zonele XF,YF,LF,HF
315
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
316
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Vom forma un triunghi,de la baza catre varf,cu sumele maxime care se pot forma cu fiecare
numar.Daca am citit triunghiul de numere intr-o matrice T si calculam sumele intr-o matrice C
vom avea relatiile urmatoare:
C[n][1]:=T[n][1];
C[n][2]:=T[n][2];
C[n][n]:=T[n][n];
Pentru linia i (i<n), cele i sume maxime care se obtin aqstfel:
C[i][j]=max{T[i][j]+C[i+1][j],T[i][j]+C[i+1][j+1]},i apatine multimii {1,2,....,n-1) iar j apartine multimii
{1,.....,i}.
Sa rezolvam problema propusa ca exemplu:
Linia 4 a matricei C va fi linia n a matricei T:5 6 1 4;
Linia 3 se calculeaza astfel:
C[3][1]=max{6+5,6+6}=12;
C[3][2]=max{3+6,3+1}=9;
C[3][3]=max{4+1,4+4}=8;
Linia 2:
C[2][1]=max{3+12,3+9}=15;
C[2][3]=max{5+9,5+8}=14;
Linia 1
C[1][1]=max{2+15,2+14}=17.
Aceasta este si cea mai mare suma care se poate forma.
Pentru a tipari numerele luate in calcul se foloseste o matrice numita DRUM in care pentru
fiecare i apartinand multimii mai sus mentionate si j la fel apartinand multimii mentionate mai
sus se retine coloana in care se gaseste succesorul lui T[i][j].
{Fie un triunghi care are pe prima linie un numar pe a doua doua ....
Sa se calculeze cea mai mare dintre sumele ce aparpe drumurile ce pleaca
din virf si ajung la baza}
const dimmax=100;
type numar=0..9;
var c:array[1..dimmax,1..dimmax] of numar;
t,cc:array[1..dimmax,1..dimmax] of numar;
d,n,i,j:integer;
begin
writeln('cite linii avem in triunghi ');readln(n);
for i:=1 to n do
for j:=1 to i do
begin
writeln('t[',i,',',j,' ]=');
readln(t[i,j]);
end;
for i:=1 to n do
begin
cc[n,j]:=j;
c[n,j]:=t[n,j];
end;
for i:=n-1 downto 1 do
for j:=1 to i do
if c[i+1,j]+t[i,j]>c[i+1,j+1]+t[i,j]
then
begin
cc[i,j]:=j;
c[i,j]:=c[i+1,j]+t[i,j];
end
317
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
else
begin
cc[i,j]:=j+1;
c[i,j]:=c[i+1,j+1]+t[i,j] ;
end;
writeln('suma este ',c[1,1]);
d:=cc[1,1];
writeln(1);
for i:=1 to n-1 do
begin
writeln(cc[i,d]);
d:=cc[i,d];
end;
readln;
end.
{Sa se calculeze cit e lungimea unui subsir crescator al unui sir initial
in cazul in care este maxima}
var v:array[0..20] of integer;
n,i:integer;
function lungime(k:integer):integer;
var max,i:integer;
begin
if k=n then lungime:=1 else
begin
max:=0;
for i:=K+1 to n do
if (max<lungime(i)) and (v[i]>=v[k]) then
318
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
max:=lungime(i);
Lungime:=max+1;
end;
end;
begin
write('cite elemente are sirul ');readln(n);
v[0]:=0;
for i:=1 to n do
begin
writeln('v[',i,']=');
readln(v[i]);
end;
writeln(' lungimea maxima este ',lungime(0)-1);
readln;
end.
319
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
2)liniile si coloanele matricei A1 se gasesc in vectorul DIM pe pozitiile i si i+1, iar ale matricei
Ai+1-pe pozitiile i+1 si i+2;
3)
-inmultind matriceleAi x Ai+1 x Ak se obtine o matrice cu un nr de linii egal cu acela al matricei
Ai (DIM(i)) si cu un nr de coloane egal cu acela al matricei Ak (DIM(k+1));
-inmultind matricele Ak+1 x.....x Aj se obtine o matrice cu un nr de linii egal cu acela al
matricei Ak+1 (DIM(k+1)) si cu un nr de coloane egal cu acela al matricei Aj (DIM(j+1));
-prin inmultirea celor doua matrice se obtine matricea rezultat al inmultirii Aix....xAj, iar pt
aceasta inmultire de matrice se efectueaza DIM(i) xDIM(k+1) xDIM(j+1) inmultiri;
~Relatia sintetizeaza faptul ca pt a obtine nr de inmultiri optim pt produsul Aix....xAj se
inmultesc doua matrice, una obtinuta ca produs optim intre Aix....xAk si cealalalta obtinuta ca
produs optim intre Ak+1x....xAj, in ipoteza in care cunoastem nr de inmultiri necesar efectuarii
acestor doua produse orucare ar fi k, cuprins intre limitele date.
~Aceasta observatie este o consecinta directra a programarii dinamice si anume ca produsul
efectuat optim intre matricele prezentate se reduce in ultima istanta la a efectua un produs
intre 2 matrice cu conditia ca acestea sa fie calculate optim(produsul lor sa aiba un numar
minim de inmultit).
Se pune problema cum putem efectua acest calcul utilizand relatiile prezentate.Pentru
exemplificare vom utiliza exemplul dat la inceputul acestui capitol.Datorita relatiei 1, diagonala
pricipala a maricei A( cu 4 lini si 4 coloane) va fi alcatuita numai din elemente avand valoarea
0. s
Initial se pot calcula numai elemente A(i,i+1),adica A(1,2),A(2,3),A(3,4)-elemente situate pe o
paralela la digonala principala a matricei A.Este cazul sa observam ca portiunea din matrice
situata sub diagonala principala este neeutilizata.In concluzie,avem
A(1,2)=100,A(2,3)=10,A(3,4)=100.Matricea A va arata astfel:
0 100 x x
x 0 10 x
A= x x 0 100
x x x 0
In continuare calculam:
A(1,3)=min{A(1,k)
+A(k+1,3)+DIM(1)*DIM(k+1)*DIM(4)}=min{0+10+10*1*1,100+0+10*10*1}=20;
A(2,4)=min{A(2,k)
+A(k+1,4)+DIM(2)*DIM(k+1)*DIM(5)}=min{0+100+1*10*10,10+0+1*1*10}=20;
A(1,4)=min{A(1,k)
+A(k+1,4)+DIM(1)*DIM(K+1)*DIM(5)}=min{0+20+10*1*10,100+100+10*10,20+0+10*1*10}=12
0;
.
0 100 20 120
x 0 10 20
A= x x 0 100
x x x 0
In concluzie,pt. exemplul nostru, se fac minim 120 de inmultiri,rezultat luat din matricea A si
anume A(1,4).
320
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
program inm_optima;
const nmax=20;
type vector=array[1..nmax] of word;
tabl=array[1..nmax,1..nmax] of word;
var p:vector;
m:tabl;n,i,j,k,imin:integer;min,v:word;
procedure paranteze(i,j:integer);
var k:integer;
begin
if i<j then begin
k:=m[j,i];
if i<>k then begin
write('(');
paranteze(i,k);
write(')');
end
else paranteze(i,k);
write('x');
if k+1<>j then begin
write('(');
paranteze(k+1,j);
write(')')
end
else paranteze(k+1,j);
end
else write('A',i)
end;
begin
write('Nr. de matrici:');
readln(n);
writeln('Dimensiuni matricelor:');
for i:=1 to n+1 do read(p[i]);
for i:=n downto 1 do
for j:=i+1 to n do
begin
min:=m[i,i]+m[i+1,j]+p[i]*p[i+1]*p[j+1];
imin:=i;
for k:=i+1 to j-1 do
begin
v:=m[i,k]+m[k+1,j]+p[i]*p[k+1]*p[j+1];
if min>v then begin
min:=v;
imin:=k
end;
end;
m[i,j]:=min;
m[j,i]:=imin;
end;
writeln('Numarul minim de inmultiri este:',m[1,n]);
writeln('Aceasta se obtine pentru urmatoarea ordine a inmultirilor');
paranteze(1,n);
readln;
end.
6.Implementarea metodelor numerice
6.2 Rezolvarea sistemelor de ecuatii
liniare
321
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
( )
a11……………..0
( )
. . . 0……………0
N=D= , L= a12 .
. . . . .
. . .
0……….....ann an1……..ann-1.0
)
0 a12…………a1n
(
. . .
R= . . .
. an-1n
0………………0
P=N-A=-(L+R)=>A=N-P
Ax=b => Nx(K+1)=Px (K) +b , dorind sa aploximam solutia sistemului printr-un
termen al lui x^k.
OBS :
( ) -( )
A=L+D+R a11……………..0 a11……………..a1n
P=N-A= . . . . . .
. . .
. . . . . .
. . . an1……….....ann
0……….....ann
-(aij) , j<>i
=
aii=0
X (k+1) =N -1 *P*x (k) +N -1 *b, G, ma intereseaza norma lui si pun conditiile |g ij|<1 rezulta
n
∑aij >1 <= >∑|aii/aij|<1 = >||G||=max ∑|gij|=max ∑|aij/aii|<1
=>|aij|/
j=1 j=1 1≤i≤n ; j=1 j=1
j<>i j<>i j<>i
p→∞
Cum||G||<1=>||G||p 0
||x (m+1) -x (m) ||=||G(x (m) -x (m-1) ||=…=||G (m) || || (x (1) -x(0) )||
si deci cum
||x (k+p) -x (k) ||=|x (k+p) -x (k+p-1) +x (k+p-1) -x (k+p-2) +...-x (k) ||≤
≤||x (k+p) -x (k+p-1) ||+||x (k+p-1) -x (k+p-2) ||+...+)||+||x (k+p-1) -x (k+p-2) ||+...+||x (k+1) -
-x ( k) || ≤||G|| k+p-1 *||x (1) -x^ (0) ||+...||G|| k *||x (-1) -x (0) ||=
=(||G|| k+p-1 +...||G|| k )*||x (1) -x (0) ||=||G|| k *(1-||G|| p /(1-||G||)*||x (1) -x (0) ||
deci , cand p→∞ ||x (k+p) -x (k) || ≤ ||G|| (k) * (1-||G|| (p) )/1-||G||) * ||x (1) -x (0) || rezulta
322
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
PROGRAM JACOBI ;
Const max=10 ;
Type vector=array[1..10] of real;
Var x,b:vector; a:array[1..10,1..10]of real;
n,i:integer;
function rezolva (nit:integer :boolean;
var y:vector;c,j,k:integer; v:real; g:boolean;
function ZERO:Boolean;
var L,m:integer ; t:real;
begin
zero:=false;
L:=j;
While (l<n) and (a[I,j]=0 do L:=L+1
If (a[L,j]<>0 then zero:=true;
end;
begin
g:=true;i:=0;
repeat
for j:=1 to n do
if zero and g then
begin
y[j]:=x[j];v:=0;
for k:=1 to n do
if j<>k thenn v:=v +a[i,k]*y[k];
x[j]:=(=b[j]-v)/a[I,j]);
end
else g:=false;
v:=0;
i:=i+1;
for k:=1 to n do
v:=v + sqr(x[k]-y[k]);
until (sqrt(v),1.e-6) or (i>nit) or not g;
end;
rezolva:=g and (i<= nit);
end;
begin
citesc pe n, a[i,j], b[i]
for i:=1 to n do x[i]:=1;
if NOT rezolva (200) then writeln (‘incompatibil’)
else
begin writeln(‘solutia sistemului este’)
write(‘x=c’);
for i:=1 to n-1 do write (x[i]);
end;
end.
ETAPA1
Triangulizarea se face la randul ei intr-un numar finit de etape optinand de sirul martice
( 1) (2) (n)
323
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
( )
(k) (k) (k) (k) (k)
a11 a12…………….a1 k-1 a 1 k………………….a 1n
(k) (k) (k) (k)
0 a22…… ……....a 2 k-1 a 2 k…………………..a 2 n
………………………………………………………………………….
A= (k) (k) (k)
( k)
0 0………….ak-1k-1 ak-1k………………….ak-1n
akk≠0 (k) (k)
0 0……………..0 akk …………………….akn
…………………………………………………………………………
(k) (k)
0 0……………..0 ank…………………….ann
( )
1 0………0 0…………0
0 1………0 0…………0
Fie M= ……………………….………..
0 0………-mk+1 k 1…………0
………………………………..
0 0………-mn k 0…………1
(k) (k)
Mik=aik/akk , k+1≤i≤n
(k+1) (k)
A =Mk * A
(K+1) (k)
aij = aij ,1≤j≤n ,i≤j≤n =>primele k linii raman necunoscute in matrice
0 ,i≤j≤k , j+1≤i≤n=>primele j coloane de sub diagonala principala sub zero
(k) (k) (k) (k) (k) (k) (k) (k) (k) (k) (k)
aij -mik * akj = aij-aik / akk* akj=(aij * akk- akk * aik)/akk , i≥k+1
j≤n
j>i≥k+1
elementele situate in liniile
si coloanele k+1,k+2,k+3
….n se schimba dupa regula
dreptunghiului
(k) (k)
k……akk………akj………….
(k) (k)
i…….aik………aij…………..
( )
1 -1 2
2 1 1 (1) (1) (1) (1)
A= 1 2 -1 ,A=A , a 11=1 , m2 1=(a2 1)/a11=2/1=2
(1)
m31=a31=1/1=1
324
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
c1
( ) ( )
r11 r12 r13…….r1n .
0 r22 r23………..r2n .
R= ………………………… ,,, ,termenii liberi c = .
0 0 0………….rnn .
.
cn
( )
Y1
Sistemul devine Ry=c ,y= .
.
.
OBS : yn
R se obtine din prelucrarea matricei extrase (A,b) unde coloana n+1 care este ocupata de b sei
prelucreaza la fel ca celelalte componente.
Vectorul de solutii finale ale sistemului adica y se obtine dupa formele :
-yn=c / rnn
n
-yi=(ci - ∑ r ik * y k)/r ii, i=n-1,n-2,...,1.
k=i+1
Program Paranormal ;
Type matrice=array[1..10,1..10] of real ;
Var a:matrice;
b,x:vector;
i,iv,j,k,l:integer;
temp:real;
t:boolean;
BEGIN
Citesc pe n,aij,bi
For j:1 to n-1 do begin
iv:=j;
t:=true;
while (iv<=n) and t do
if a[iv,j]=0 then iv:=iv+1
else t:=false;
if t then begin
writeln(‘determinatul sistemului nul’);
end;
if (j<>iv) then begin
for k:=j to ndo begin
temp:=a[j,k];
a[[j,k]:=a[iv,k];
a[iv,k]:=Temp;
end;
temp:=b[j];
b[j]:=b[iv];
b[iv]:=temp;
end;
for l:=j+1 to n do begin
for k:=j+1 to n do
a[l,k]:=a[l,k]-a[j,k]*a[l,j]/a[j,j];
b[l]:=b[l]-b[j]*a[l,j]/z[j,j];
end;
end;
if a[n,n]=0 then begin
writeln)’determinantul principal nul’);
325
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
exit;
end;
x[n]:=b[n]/a[n,n];
for i:=n-1 downto 1do begin
temp:=b[i];
for j:=i+1 to n do temp:=temp-a[I,j]*x[j];
x[i]:=temp/a[i,i];
nd;
for i:=1 to n do
writeln(x[i]);
readln;
end.
Fie N-numarul variatiilor de semn din subsirul obtinut prin eliminarea elementelor nule
N-numarul variatiilor de semn din subsirul obtinut prin inlocuirea elementelor nule dupa
algoritmul :
Ck-1≠, Ck=Ck+1=...=Ck+L-1=0,Ck+L≠0
Inlocuit cu
l+i
C* k+i=(-1) sgn(Ck+l),i€[0,L-1];
Teorema Budan Founci,a<b€R,care nu sunt radacini ale lui P .
,Numarul radacinilor reale ale lui P din intervalul (a,b) este N(a)- N(b) sau interior acestuia cu un numar
par .
DEFINITIE
Se numeste polinom de interpolare al functiei f pe nodurile x1,...xn, un polinom P cu
proprietatile :gr(p)≤n-1,p(xi)=yi,1≤i≤n unde f :[a,b]→R, f(xi)=yi ,xi€[a,b],1≤i≤n.
n-1
326
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
1 x1......x1
D= .................. =∏(xi-xj)≠0,1≤j≤i≤n are solutii unice
n-1
1 xn.......xn n-1
n-1 n-1
a0+a1 xk+…an-1 * xk =f(xk) a0+a1 xk+…+an-1 xk +an f(xn)=0
n-1 n-1
a0+a1 x +…+an-1 * x =P(x) a0+a1 x+…+an-1 x +an-1 P(x)=0
system liniar omogen ,an≠0 are n+1 ecuatii si n+1 necunoscute =>determinantul e nul.
n- 1 n-1 n-1
1 x1…..x1 f(x1) 1 x1.....x1 0 1 x 1.....x1 f(x1)
n-1 ................................ ...............................
1 x2…...x2 f(x2) n-1 n-1
……………….. =0 1 xn......xn 0 + 1 xn.....xn f(xn) =0
n-1 n-1 n-1
1 xn……xn f(xn) 1 x......x P(x) 1 x .......x 0
n-1
1 x……x P(x)
n-1 n-1
1 x1......x1 1 x1......x1 f(x1)
P(x)* ..................... + .................... =0 => p(x)=D2/D1.
n-1 n-1
1 xn.......xn 1 xn.......xn f(xn)
n-1
1 x.......x 0
D1
D2
Interpolare Langrange
327
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
ω(x)= ∏(x-xi)
j=1
program lagrange;
type sir=array[1..100] of real;
var fx,vp,bk:real;
x,y:sir;
n,I,j,m:integer;
begin
readln(n);
n:=n+1;
readln(fx);
for i:=1 to n do
begin
readnl(x[i],y[i]);end;
for i:=1 to n do
begin
bk:=1;
for j:=1 to n do
if i<>j then
bk:=bk *(fx-x[i])/(x[j]-x[i]);
vp:=vp+b[k]*y[i];
end;
write(vp);
end.
Interpolare Newton
Stiu
F<x1,…xn>=(f<X1,…,X m-1>-< f<X2,…,X m>)/(X1-Xm)
P(x)=f(X1)+f(x1,x2) * (x-x1)+…
Program newton;
Var x,y:array[1..100] of integer;
S:real;
Xx,I,j,m:integer;
Begin
Readln(m);
For i:=1 to m do
Read(x[i],y[i]);
For j:=1 to m-1 do
For i:=m downto j+1 do
Y[i]:=(y[i-1]-y[i])/(x[i-j]-x[i]);
For j:=0 to m do
Begin
S:=y[m];
For i:=y[i]+(j-x[i]) *s;
Write(s);
End.
METODA BISECTIEI
(INJUMATATIRII),COARDEI,TANGENTEI
328
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
METODA INJUMATATIRII
siruri convergente
an -->a bn -->b cn -->c
METODA COARDEI
329
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
siruri convergente
an -->a bn -->b cn -->c
METODA TANGENTEI(NEWTON)
330
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
x:=a-(b-a)/(f(b)-f(a))*f(a);y:=f(x);end;
procedure tangenta(var a,b,x,y:real;f:functie);
function derivata(f:functie;x0:real):real;
const h=1.e-6;
begin
derivata:=(f(x0+h)-f(x0))/h;end;
begin
x:=x-f(x)/derivata(f,x);y:=f(x);
end;
procedure radacina(f:functie;p:procedura);
const eps=1.e-10;
var epsa,b,x,y:real;i:integer;
begin
write('inceputul intervalui a=');readln(a);
write('sfirsitul intervalui b=');readln(b);
i:=0;
repeat
p(a,b,x,y,f);i:=i+1;
if (f(a)<0)=(y<0) then a:=x else b:=x;
until (abs(a-b)<eps) or (y=0) or (i>200);
if i>200 then write('solutia nu afost gasita in 200 de pasi')
else
writeln('solutia ',x:12:7);
331
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
end;
begin
writeln('alegeti metoda de rezolvare a ecuatiei ');
write('a=metoda injumatairii intervalului ');
write('b=metoda coardei ');
write('c=metoda tangentei ');
writeln;
write('optiunea');readln(car);
case car of
'a':radacina(f,injumat);
'b':radacina(f,coarda);
'c':radacina(f,tangenta);
else
writeln('varianta eronata ');
end;
readln;
end.
332
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
integr:=semn+k*integr;
end;
writeln('recurent integrala este ',integr:20:11);
readln;
end.
{Sa se caculeze prin formula trapezelor o integrala dintr-o functie}
{$f+}
type ff=function(x:real):real;
var a,b,int:real;n:integer;
function f1(x:real):real;
begin
f1:=sin(ln(x))/x;
end;
procedure tr(a,b:real;f:ff;n:integer;var s:real);
var h:real;i:integer;
begin
h:=(b-a)/n;
s:=(f(a)+f(b))/2;
for i:=1 to n-1 do
s:=s+f(a+i*h);
s:=s*h;
end;
begin
write('a=');readln(a); write('b=');readln(b);write('n=');readln(n);
tr(a,b,f1,n,int);
writeln('integrala este ',int:8:2);
readln;
end.
333
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
s2:=0;
for i:=1 to n div 2 do
begin
s1:=s1+ss(m,(2*i-1)*h);
s2:=s2+ss(m ,2*i*h);end;
sim:=h/3*(ss(m,0)-ss(m,pi/2)+4*s1+2*s2);
end;
var m:integer;
begin
write(' m=');
readln(m);
writeln(' integrala este ',sim(m):20:11);
readln;
end.
7.Alocare dinamica
7.1 Tipuri specifice alocarii dinamice a memoriei
Memoria interna poate fi privita ca o succesiune de octeti.Numarul de ordine al unui octet se
numeste adresa lui.Adresa unei variabile nu trebuie confundata cu valoarea pe care aceasta o
memoreaza.
Definitie: Adresa primului octet al variabilei se numeste adresa variabilei.
Adresele variabilelor se memoreaza cu ajutorul variabilelor de tip pointer.
Notiunea de variabila dinamica
Ati invatat inca din clasa a IX-a ca o variabila este o entitate caracterizata prin trei
atribute:tip, valoare si adresa .Primele doua
atribute au fost foarte des intalnite pana acum.Atributul adresa va face obiectul notiunilor in acest
capitol.
Pentru inceput ,consideram un exemplu foarte simplu , o variabila x de tipul integer.Declaratia ei
va este cunoscuta:
var x: integer;
Variabila x de mai sus se numeste variabila statica. O variabila statica se caracterizeaza prin
faptul ca in momentul declarari ,
compilatorul ii un anumit spatiu de memorie. Marimea spatiului rezervat unei variabile depinde de tipul
acesteia . De exemplu ,pentru
o variabila de tipul integer se aloca 2 octeti, pentru una de tipul real 6 octeti .
Variabila x se numeste “pointer catre un intreg” sau”referinta catre un intreg”.Fireste ca tipul de
date al variabilei x nu va mai
fi integer ci ,un tip de date nou , numit “tipul pointer catre un intreg” sau “tipul referinta catre un
intreg “, notat integer .
Declaratia necesara este: var x:^integer:Pe scurt vom spune ca x este un pointer catre un
intreg.Caracterul “ ^ ” se numeste operatorul
De adresare “sageata”.
Tipurile de date “pointer catre ….” sunt anonime .Un tip pointer poate fi insa denumit ,ca
orice tip anonim, cu cuvantul cheie type.
Exemplu :
Pentru a declare trei pointeri catre numere reale ,putem scrie: var x,y,z:^real;
334
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Alocarea memoriei pentru o variabila dinamica , sau pe scurt alocarea dinamica a memoriei , se
realizeaza in program ,in
momentul utilizarii variabilei .Pentru aceasta folosim procedura new, care are doua forme:
new (<pointer>)
<pointer>:=new(<tip>);
unde: - <pointer>→numele (identificatorului) pointerului ;
- <tip>→ tipul pointerului;
Pentru eliberarea memoriei alocate unei variabile dinamice ,apelam procedura dispose , cu
sintaxa:
dispose(<pointer>);
Exemplu:
Memoria alocata anterior pentru variabila dinamica x^ alocata anterior, poate fi eliberata cu
dispose(x);
Pointerul NIL
In general ,un poiter contine adresa unei variabile dinamice ,mai exact adresa zonei de
mrmorie unde este depozitata valoarea
variabilei dinamice. Este insa posibil ca in timpul executiei unui program ,un pointer sa primeasca
drept valoare adresa unei locatii
de memorie “goala” ,in care nu se gaseste nici o valoare. In acest caz vom spune ca pointerul este “in
vant” si ca valoarea sa este NIL.
Acest NIL reprezinta de fapt o constanta predefinita a limbajului cu sens de “nimic”
(nul) ,si poate fi atribuit numai variabilelor
de un tip pointer.
Atribuiri de pointeri
Un pointer poate fi transmis ca parametru unei proceduri sau functii, dar pentru aceasta este
obligatoriu sa denumim tipul anonim al
pointerului respectiv (stim ca in antetul unui subprogram nu putem folosi tipuri anonime).
Exemplu :
Ne propunem sa declaram o procedura P care sa primeasca drept parametri doi pointeri x si y
catre intreg. Asadar x si y vor fi de
tipul ^ integer.
Este incorect sa scriem antetul procedurii astfel :
procedure P(x,y:^ integer);
Trebuie sa denumim tipul ^integer dandu-I de exemplu numele pint ;
type pint =^integer;
Acum putem scrie antetul procedurii in felul urmator :
procedure P(x,y :pint);
335
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Stiva funcţionează pe principiul LIFO (Last In First Out) – “ultimul intrat, primul ieşit”.
Pentru a înţelege modul de lucru cu stiva, ne imaginăm un număr n de farfurii identice, aşezate
una peste alta (o “stivă” de farfurii). Adăugarea sau scoaterea unei farfurii se face, cu uşurinţă, numai în
vârful stivei. Oricât ar părea de simplu principiul stivei, el are consecinţe uriaşe în programare.
Stivele se pot aloca secvenţial (ca vectori). Fie ST[i] un vector. ST[1], ST[2], … , ST[n] pot reţine numai
litere sau numai cifre. O variabilă k indică în permanenţă vârful stivei, adică ultimul element introdus.
B
A
Observaţii:
În mod practic, la scoaterea unei variabile din stivă, valoarea variabilei ce indică vârful stivei scade cu 1, iar atunci
când scriem ceva în stivă, o eventuală valoare reziduală se pierde.
Pe un anumit nivel se reţine, de regulă, o singură informaţie (literă sau cifră), însă este posibil, aşa cum va rezulta
din exemplele prezentate în lucrare, să avem mai multe informaţii, caz în care avem stive duble, triple, etc.
În cazul stivei, alocarea secvenţială nu prezintă mari dezavantaje, ca în cazul mai general, al listelor, pentru că nu
se fac operaţii de inserare sau ştergere în interiorul stivei. Singurul dezavantaj, în comparaţie cu alocarea dinamică
înlănţuită este dat de faptul că numărul de noduri care pot fi memorate la un moment dat este mai mic – depinde de
gradul de ocupare al segmentului de date.
În literatura de specialitate veţi întâlni termenul PUSH pentru operaţia de adăugare în stivă a unei înregistrări şi
POP, pentru extragere.
Exemple:
Vom începe prin a studia modul de calcul al funcţiei pentru x=15 şi x=8.
f(15)=14;
f(8)=f(f(10))=f(f(f(12)))=f(f(11))=f(f(f(13)))=f(f(12))=f(11)=f(f(13))= f(12)=11.
Algoritmul va folosi o stivă ST şi o variabilă k, ce indică în permanenţă vârful stivei. Algoritmul se
bazează pe următoarele considerente:
■ la o nouă autoapelare a funcţiei f, se urcă în stivă (k se incrementează cu 1) şi se pune noua valoare.
■ în situaţia în care pentru valoarea aflată pe nivelul k se poate calcula funcţia, se coboară în stivă, punându-se pe
acest nivel noua valoare.
12 13
10 10 11 11
8 337 8 12 13
8 8 8
11
12
8 11
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
f=11
338
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
339
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
□ Funcţia lui Ackermann. Se dă funcţia următoare, definită pe produsul cartezian NXN.. Se citesc m şi
n. Să se calculeze Ack(m, n).
n+1, m=0
Ack(m,n)= Ack(m-1, 1), n=0
Ack(m-1, Ack(m, n-1)), altfel
Pentru calculul acestei funcţii, folosim o stivă dublă, ST. Iniţial, valorile m şi n se reţin la nivelul 1. Pe
nivelul k al stivei se reţin valorile curente m şi n. În funcţie de valorile acestora se procedează astfel:
340
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
■ pentru m şi n diferite de 0, este necesar un nou calcul de funcţie, caz în care se urcă în stivă şi pe noul
nivel se pun argumente m şi n-1.
■ pentru cazul n=0, se rămâne pe acelaşi nivel în stivă, punând în locul lui m valoarea m-1, iar în locul
lui n valoarea 1.
■ în situaţia în care m=0, funcţia se poate calcula; se coboară în stivă şi se înlocuieşte valoarea lui m cu
m-1, valoarea lui n cu valoarea calculată anterior.
10 01
20 11 11 11
21 21 21 21 21
10
01 11 11
11
02 02 13 12 12
12
21 12
13 03
12 13 13
13 13 13 04
ack(2,1)=5.
341
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
O coadă este o listă pentru care toate inserările sunt făcute la unul din capete, toate ştergerile
(consultările, modificările) la celălalt capăt.
Coada funcţionează pe principiul FIFO (First In First Out) – “primul intrat, primul ieşit”.
1 2 3 4
2 3 4 5
3 4 5 6
v sf
7 3 5 2
Etapa 1)
342
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
343
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
p:=q; o; {L;
u:=p; writeln;}
end Li;
else readln;
begin end.
q^.leg:=nil;u^.leg:=q;u:=q; CU LISTE DUBLU INLANTUITE
end; { Sa se creeze o structura de coada}
end; type ref=^inr;
while (not eof(f)) do begin inr=record
new(q);q^.info:=a;q^.leg:=nil; nr:integer;
u^.leg:=q;u:=q; as,ad:ref;
read(f,a); end;
end; var p,u:ref;i,n:integer;
procedure b(var u:ref);
while (not eof(g)) do var c:ref;
begin begin
new(q);q^.info:=b;q^.leg:=nil;u^.leg:=q; new(c);
u:=q; writeln(' pe cine pui in coada ');readln(c^.nr);
read(g,b); c^.ad:=nil;
end; c^.as:=nil;
close(f);close(g); if u<>nil then u^.ad:=c else
end; p:=c;
procedure L; u:=c;
var c:po; end;
begin procedure s(var p:ref);
c:=p; var c:ref;
while(c<>nil) do begin
begin if p=nil then writeln(' e goala ') else
write(c^.info, ' '); begin
c:=c^.leg; writeln(' pe cine scot ');
end; writeln(p^.nr);
end; c:=p;p:=p^.ad;
procedure li; p^.as:=nil;
var H:text; dispose(c);
var c:integer; end;
begin end;
assign(h,'ff.pas');rewrite(h);
d:=p;c:=0; begin
while d<>nil do writeln(' cite elemente dai n>=3');readln(n);
begin for i:=1 to n do
writeln(d^.info);writeln(h,d^.info); b(u);
inc(c);d:=d^.leg; for i:=1 to n do
end; s(p);
writeln(' am atitea inregistrari',c);
readln;
close(h); end.
end;
begin
Prezentarea structurii
O listă liniară este o colecţie de n≥0 noduri, X₁, X₂, … , Xn aflate într-o relaţie de ordine.
Astfel, X₁ este primul nod al listei, X₂ este al doilea nod al listei … Xn este ultimul nod.
Operaţiile permise sunt:
344
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
□ Accesul la oricare nod al listei în scopul citirii sau modificării informaţiei conţinute de acesta.
Există două metode de alocare a unei liste liniare: alocarea secvenţială şi alocarea
înlănţuită.
Nodurile listei ocupă poziţii succesive în memorie. Acest tip de alocare l-am întâlnit des,
de câte ori am utilizat vectori.
Exemplu: un vector are n componente de tip real. Se cere să se sorteze vectorul crescător.
Algoritmul are ca dată de intrare o listă liniară, cu n noduri de tip real. Ieşirea este tot o listă
liniară, cu aceleaşi noduri, dar în altă ordine. Să presupunem că utilizăm sortarea prin
interschimbare. O interschimbare a nodurilor i şi j se reduce la următoarele operaţii, premise în
listă:
■ v[i] v[i+1]; - accesez nodul i+1 în vederea citirii (operaţie permisă) şi accesez nodul i în vederea
modificării informaţiei reţinute (operaţie permisă).
■ v[i+1] = man; - accesez nodul i+1 în vederea modificării informaţiei reţinute de el.
În concluzie, sortarea se realizează prin utilizarea operaţiilor permise asupra unei liste
liniare.
Avantajul alocării secvenţiale este dat de faptul că programatorul are acces direct la oricare din
nodurile listei, la fel ca la componentele unui vector.
Dezavantajul alocării secvenţiale este dat de faptul că operaţiile de adăugare, eliminare sau
schimbare de poziţie a unui nod necesită un efort mare de calcul, ca în exemplul următor, în care
se elimină un nod:
345
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
■ in₁, in₂, in₃, … , inn reprezintă informaţiile conţinute de noduri, de altă natură decât cele de adresă;
După cum observăm, fiecare nod, cu excepţia ultimului, reţine adresa nodului următor.
2. Alocarea dublu înlănţuită. Alocarea simplu înlănţuită permite parcurgerea listei într-un singur sens
(de la stânga la dreapta). În cazul în care se doreşte ca lista să poată fi parcursă în ambele sensuri
se utilizează alocarea dublu înlănţuită. Aici fiecare nod reţine adresele predecesorului şi
succesorului său, aşa cum se vede în figura următoare:
1. Accesul la un nod al listei se face prin parcurgerea nodurilor care în preced. Aceasta necesită un
efort de calcul.
2. Informaţiile de adresă, prezente în cadrul fiecărui nod, ocupă memorie.
Avantajele alocării înlănţuite sunt date de faptul că operaţiile de adăugare sau eliminare a unui nod se
fac rapid. Exemplele sunt date pentru lista liniară simplu înlănţuită, dar bine înţelese, ne permit să
deducem singuri modul de efectuare a operaţiilor respective pentru liste dublu înlănţuite.
Fie lista:
3 adr₂
7 adr₃ 9 nil
Etapele sunt:
7 adr₃
9 nil
346
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
3 adr₂
adr₁ adr₂ adrn
adrt
□ Se completează informaţiile pentru nodul creat – câmpul de adresă trebuie să conţină adresa nodului
care trebuie să-i urmeze în listă:
3 adr₂
7 adr₃
9 nil
5 adr₂
adrt
□ Se modifică adresa nodului care precede nodul nou creat. Adresa trebuie să fie a nodului nou creat:
adrt
5 adr₂
b) Ştergerea unui nod. Pentru a exemplifica operaţiile efectuate în acest caz vom folosi a de mai sus,
la care ştergem al doilea nod (cel cu informaţia 5). Iată etapele:
347
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
□ Informaţia de adresă a nodului care îl precede trebuie să reţină adresa nodului următor:
Observaţii:
În cazul alocării înlănţuite, adresele de memorare ale nodurilor consecutive nu sunt neapărat
consecutive. Pentru a realiza acest lucru este suficient să analizaţi cazul ştergerii unui nod (sau acela al
adăugării unui nod).
Prin alocarea memoriei pentru un nod înţelegem rezervarea spaţiului necesar memorării informaţiilor
conţinute de acesta. Evident, se poate aloca memorie doar dacă există memorie disponibilă, adică nu
este ocupată de alte variabile.
Pentru eliberarea memoriei ocupate de un nod înţelegem că spaţiul ocupat de acesta devine disponibil
– este pus la dispoziţia programatorului, pentru ca, eventual, acesta să fie din nou alocat.
Este important să folosim termenii corect. De exemplu, nu putem folosi în loc de “alocarea
memoriei” termenul “crearea memoriei”, tot aşa cum nu este corect să folosim în loc de “eliberarea
memoriei” termenul “ştergere a memoriei”.
Noţiunile care privesc alocarea şi eliberarea memoriei sunt prezentate în paragraful următor.
348
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
349
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
350
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
351
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
352
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
353
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
c:=c^.urm;
c:=p; writeln(' cu cine o modifici');
readln(c^.nr);
while (c<>nil) and (c^.nr<>cecaut) do end;
begin
oretin:=c;
c:=c^.urm;end; begin
if c=nil then potsterge :=false init;
else afisare;
begin inserareinaintedepa;
osterg:=c; afisare;
oretin^.urm:=c^.urm; inserareinaintedepamaimulte;
dispose(osterg); afisare;
end; adaugunlasfirsit;
end;end; afisare;
procedure afisare; adaugunlasfirsitmaimulte;
begin afisare;
c:=p;
while (c <>nil) do pununadupamaimulte;
begin afisare;
writeln(c^.nr:6); pununainaintedemaimulte;
c:=c^.urm; afisare; writeln('o sterg pe pa ');
end; stergpa ;afisare;
end; stergdelapamaimulte; afisare;
procedure modificpa; stergua;
begin writeln('o sterg pe ua ');
c:=p; afisare;
writeln('cu cine modifici pe pa');readln(c^.nr); sterguele;afisare;
stergdupaunacareocaut;
end; afisare;
procedure modificua; pununadupacecaut;afisare;
begin stergdupacecaut;
c:=u; afisare;
writeln('cu cine modifici pe ua');readln(c^.nr); stergcecaut;
afisare;
end; stergcecautdeciteoriapare; afisare;
procedure modificcepozitiecaut; modificpa;
var cecaut:integer; afisare;
begin modificua; afisare;
c:=p; modificcepozitiecaut; afisare;
writeln(' a cit-a inregistrare vrei sa o modifici'); readln;
readln(cecaut); end.
for i:=1 to cecaut-1 do
354
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
1) creare;
2) adaugare la dreapta;
3) adaugare la stanga;
4) adaugare in interiorul listei;
5) stergere din interiorul listei;
6) stergere la stanga listei;
7) stergere la dreapta listei;
8) listare de la stanga la dreapta;
9) listare de la dreapta la stanga.
1) Creare
2) Adaugare la dreapta
Functia add citeste informatia numerica, aloca spatiu pentru inregistrare, completeaza adresele,
modifica adresa la dreapta a inregistrarii din s cu adresa noii inregistrari si ii atribuie
lui s valoarea noii inregistrari.
3) Adaugare la stanga
Functia includ parcurge lista pentru a gasi inregistrarea cu informatia m, in dreapta careia urmeaza sa
introducem noua inregistrare, citeste informatia, aloca spatiu, completeaza informatia, completeaza
adresa stanga a noii inregistrari cu valoarea adresei inregistrarii de informatie m, si completeaza adresa
dreapta a noii inregistrari cu valoarea adresei dreapta a inregistrarii cu informatia utila m.
Functia Sterg parcurge lista pentru a gasi informatia care va fi stearsa, atribuie inregistrarii precedente
campul de adresa dreapta al inregistrarii care va fi stearsa, iar inregistrarii care urmeaza celei care va fi
stearsa i se atribuie campul de adresa stanga al inregistrarii pe care o stergem, dupa care se elibereaza
spatiul de memorie rezervat inregistrarii care se sterge.
Functia listare porneste din stanga listei si tipareste informatia numerica a fiecarei inregistrari, atata
timp cat nu s-a ajuns la capatul listei.
OPERATII CU LISTE DUBLU INLANTUITE
{Cu liste dublu inlantuite sa se simuleze var p,c,u:ref;
crearea ,listarea in ambele sensuri si stergerea n,i:integer;
ultimului,primului element ,inserarea dupa un procedure creare;
anumit numar de inregistrari begin
sau stergerea elementui care are un anumit writeln('n=');readln(n);
numar de inregistrare} new(c);
type ref=^inr; writeln(' primul element ');readln(c^.nr);
inr=record c^.ad:=nil;
as:ref; c^.as:=nil;
nr:integer; p:=c;
ad:ref; u:=c;
end; for i:=2 to n do
355
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
begin p:=p^.ad;
new(c); p^.as:=nil;
writeln(' dati integistrarea ',i); dispose(q);
readln(c^.nr); end;
c^.ad:=nil; procedure stergA_p1_componenta;
c^.as:=u; var p1:integer;q:ref;
u^.ad:=c; begin
u:=c; c:=p;
end; writeln(' dati componenta care o stergeti din
end; lista ');readln(p1);
procedure adauginaintedeprima; writeln('------------------');
begin for i:=1 to p1-1 do
new(c); c:=c^.ad;
writeln('pe cine adaug inainte de prima '); q:=c;
readln(c^.nr); c^.as^.ad:=c^.ad;
c^.ad:=p; c^.ad^.as:=c^.as;
p^.as:=c; dispose(q)
c^.as:=nil; end;
p:=c; procedure ins1;
end; var i:integer;d,q:ref;
procedure adugadupaultima; begin
begin writeln(' in fata cui inserati ');readln(i);
new(c); writeln('------------------');
writeln(' pe cine adugi dupa ultima '); d:=p;
readln(c^.nr); writeln('------------------'); while(i<>d^.nr) and (d<>nil) do
c^.ad:=nil; d:=d^.ad;
c^.as:=u; if d= nil then writeln(' nu ')
u^.ad:=c; else
u:=c; begin
end; new(q);
procedure adaugadupaa_p1_acomponenta; writeln('informatia care o inserati ');
var p1:integer;q:ref; readln(q^.nr);
begin q^.ad:=d;
c:=p; q^.as:=d^.as;
writeln(' dupa a cita componenta d^.as^.ad:=q;
adaugi(inserezi '); d^.as:=q;
readln(p1); writeln('------------------'); end;
for i:=1 to p1-1 do end;
c:=c^.ad;
new(q); procedure listare;
writeln(' dati componenta care o inserati '); var c:ref;
readln(q^.nr); writeln('------------------'); begin
q^.ad:=c^.ad; c:=p;
c^.ad^.as:=q; while(c<>nil) do
q^.as:=c; begin
c^.ad:=q; writeln(c^.nr,' ');
end; c:=c^.ad;
procedure stegultima; end;
var q:ref; end;
begin
q:=u; procedure listare1;
u:=u^.as; var c:ref;
u^.ad:=nil; begin
dispose(q); c:=u;
end; while(c<>nil) do
begin
procedure stegprima; writeln(c^.nr,' ');
var q:ref; c:=c^.as;
begin end;
q:=p; end;
356
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
listare; writeln('------------------');
begin adugadupaultima; listare;
creare; writeln('------------------');
writeln('------------------'); adaugadupaa_p1_acomponenta; listare;
listare; writeln('sterg pe ultima writeln(' sterg prima ------------------');
------------------'); stegprima;listare; writeln('------------------');
stegultima; stergA_p1_componenta; listare;
writeln('o listez de la sfirsit spre writeln('------------------');
inceput------------------'); ins1; listare;
listare1; readln;
adauginaintedeprima; end.
writeln('------------------');
Arbori binari
Definitie
Un arbore cu propietatea ca fiecare nod cu exceptia frunzelor , are cel mult doi descendenti
(succesori ) se numeste arbore binar.
Intr-un arbore binar ,cei doi succesori ai unui nod (daca exista), se numeste succesor stang
respectiv arbore drept.
Definitie
Un arbore cu propietatea ca fiecare nod ,cu exceptia frunzelor , are exact doi descendenti
(succesori) se numeste arbore binar complet .
Etapa 1)
357
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
358
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
359
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
360
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
361
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
1. INSERAREA
Crearea arborilor de cautare se face aplicand de un nr de ori operatia de inserare. Regula de inserare
este urmatoarea:
Se compara cheia asociata unui nod cu cheia inregistrarii care se insereaza. Avem trei posibilitati:
2. CAUTAREA
3. LISTAREA
362
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Informatia se poate lista utilizand oricare din metodele cunoscute pentru parcurgerea arborilor. Daca
dorim listarea informatiilor in ordinea strict crescatoare a cheilor,se utilizeaza metoda stang-varf-dreapta
(inordine), intrucat pentru orice nod avem urmatoarele:
cheile nodurilor din subarborele stang sunt mai mici decat cheia asociata
nodului;
cheile nodurilor din subarborele drept sunt mai mari decat cheia asociata
nodului.
4. STERGEREA
Dupa stergerea unui nod care are o anumita cheie, arborele ramas trebuie sa fie de cautare.
a) nodul care urmeaza sa fie sters este nod terminal – in acest caz se face stergerea
avand grija ca la parintele lui sa inlocuim adresa catre el cu nil;
b) nodul care urmeaza a fi sters subordoneaza un singur subarbor – cel drept – caz in
care parintelui se va inlocui adresa catre el cu adresa subarborelui drept,iar nodul
respectiv se sterge;
c) nodul care urmeaza a fi sters subordoneaza un singur subarbore – cel stang – caz in
care parintelui i se va inlocui adresa catre el cu adresa subarborelui stang, iar nodul
respectiv se sterge;
d) nodul care urmeaza a fi sters( dupa cum vom vedea, acesta se va sterge numai logic)
subordoneaza doi subarbori, caz in care se fac operatiile:
- se indentifica cel mai din dreapta nod al subarborelui stang coorespunzator nodului care
urmeaza a fi sters (acesta va fi sters in mod efectiv, nu inainte de a muta informatiile sale la
nodul care se sterge logic);
- cheia acestuia si alte informatii utile continute de el se muta la nodul care urmeaza a fi sters
- subarborele stang al nodului care se va sterge fizic se leaga:
- in stanga nodului care se sterge logic (daca nodul indentificat ca cel mai din dreapta din
subarborele stang este descendent direct al nodului care se sterge logic)
- in dreapta tatalui nodului care se sterge fizic( in caz contrar);
Exemple de stergere:
1. Arborelui din stanga i se sterge nodul 8. acesta nu subordoneaza nici un alt arbore.
2. Arborelui din stanga i se sterge nodul 9. acesta subordoneaza un singur subarbore, cel
drept.
363
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
3. Arborelui din stanga i se sterge nodul 3. Cel mai din dreapta nod al subarborelui stang este 1.
se obtine:
4. Arborelui din stanga i se sterge nodul 7. cel mai din dreapta nod al subarborelui stang este 6.
tatal nodului care se sterge fizic este 3. in dreapta sa se leaga subarborele 5 4 . se obtine:
Vezi procedura STERG. In situatia in care nodul care urmeaza a fi sters subordoneaza doi arbori,se
apeleaza procedura CMMD.
364
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
prelucrarii primele tri cazuri nu necesita comentarii. In cazul 4 se indentifica nodul cel
mai din dreaptadin arborele stang. Cheia acestuia trece in locul cheii nodului care se
sterge. Aceasta este mai mica decat cheia initiala,este in acelasi timp cea mai mare
din subarborele stang,deci este cea mai mare cheie mai mica decat cheia care se
sterge. Iata motivul pentru care aceasta trece in locul cheii sterse logic.
Transmiterea parametrului c se face prin referinta. Adresa de alocare va fi trimisa
automat parintelui,caadresa de subarbore stang sau drept (duopa caz).
Altgoritmul are complexitatea in cazul cel mai defavorabil 0(n 2). In cazul in care, de
exemplu cheile inserate sunt in ordine crescatoare, arborele va degenera intr-o lista
liniara –orice nod are numai un descendent drept,iar
inserarea unui nod inseamna parcurgerea tuturor nodurilor deja inserate in pasul
anterior.
Teoria regasirii informatiei este deosebit de importanta pentru viata practica. Aceasta conduce la o
cautare rapida (putine comparatii).
Etapa 1)
inserez un noduri
365
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
366
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
stergerea unui nod care are mai multe niveluri sub el de exemplu o sa stergem de mai jos elemental cu cheia 27
367
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
368
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
369
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
inord(r^.dr);
end;
end;
begin
write('n='); readln(n);
new(rad);
write('dati sirul:');
writeln(' primul nod ');
read(rad^.v);
rad^.st:=nil; rad^.dr:=nil;
for i:=2 to n do
begin
writeln(' nodul al ',i,'lea');
read(x);
adauga(rad,x);
end;
writeln('inord:');
inord(rad);
readln;
end.
370
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
else inserare(v,k)
if c^.nr<k then end;
sterg(c^.ad,k) 'l':parcurg(v);
else 'c':begin
sterg(c^.as,k) write ('k=');readln(k);
else caut(v,man,k);
writeln('numar absent -tentativa if (man<>nil) then writeln(k)
esuata') else writeln('nu exista acest nod');
end; end;
begin 's':begin
v:=nil; write('se sterge numarul');readln(k);
repeat sterg(v,k);
write('optiunea'); end;
readln(opt); end;
case opt of until opt='t'
'i':begin end.
write('k=');readln(k);
Forma poloneza –aplicatii-la coada
Exemple:
EXPRESIE ARITMETICA EXPREIE IN FORMA POLONEZA
A+b Ab+
A*(b+c) Abc+*
A*(b+c)-e/(a+d)+h Abc+*ead+/-h+
Forma poloneza este o forma de scriere a expresiilor aritmetice in care parantezele
nu mai sunt puse (din acest motiv o expresie scrisa in forma poloneza se mai
numeste expresie scrisa fara paranteze), dar aceasta nu duce la calculul eronat al
exp.
Exemplu: expresiei (a+b)*c-d/e i se asociaza arborele binar din figura de mai jos. Parcurgerea acestui
arbore in postordine va da chiar forma poloneza:ab+c*de/-. Utilizand cele spise pentru rezolvarea
problemei, vom proceda in felul urmator:
371
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
372
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Pentru constructia arborelui vom acorda prioriati operatorilor si operanzilor(mai putin parantezelor),dupa
cum urmeaza:
Utilizand efp si pfp cu ajutorul functieiarb se construieste arborele atasat expresiei aritmetice. Un nod al
acestui arbore are ca informatie utila un operator sau un operand.
373
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Ifc<>nil `)`:j:=j-10;
Then `(`:j:=j+10;
Begin `+`,`-`:p[i]:=j+1;
Parc(c^.as); `*`,`/`:p[i]:j+10
Parc(c^.ad); else p[i]:=1000
Write(c^.op) end;
End j:=1;
End; for i:=1 to n do
if(e[i]<>`)`) and(e[i]<>`(`)
Begin then begin
J:=0;read( a); n:=1; efp[j]:=e[i];
Whilea<>`.` do pfp[j]:=p[i];
Begin j:=j+1
E[n]:=a;n:=n+1;read( a); end;
End; c:=arb(1,j-1,efp,pfp);
N:=n-1; parc( c );
For i:=1 to n do writeln;
Case e[i] of end.
Aplicatie. Dandu-se o expresie in forma poloneza postfixata,sa se scrie un program care sa genereze
programul de calcul al expresiei utilizand numai instructiuni de atribuire cu un singur operator. Se vor
introduce variabelele auxiliare x0,x1,…,xn.
X0=b+c
X1=a*x0
X2=a+d
X3=e/x2
X4=x1-x3
X5=x4+h.
Procedeul se repeta ata timp cat nu au fost citite toate caracterele. Pe exemplul considerat, rularea
decurge astfel:
374
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
D
A
E E,a,d se incarca in stiva;
X1
X2
E Se tipareste x2=a+d;
X1
Program fp_pc;
Type stiva=array[1..100,1..2] of char;
Var st:stiva;
Fp:string[100];
I,j,k:integer;
C:string[1];
Begin
Write( ` forma poloneza este=`);
Readln( fp);
K:=0;j:=0;
For i:=1 to lenght(fp) do
Case fp[i] of
`a`..`z`:begin
375
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
k:=k+1;
st[k,2]:=fp[i];
st[k,1]:=` `
end;
`+`,`-`,`*`,`/`,:
begin
writeln(`x`,j,`=`,st[k-1,1],st[k-1,2],fp[i],st[k,1],st[k,2]);
k:=k+1;
st[k,1]:=`x`;str(j:1,c);st[k,2]:=c[1];
j:=j+1
end
end{case}
end.
procedeul indicat este utilizt pentru compilarea expresiilor. Se cunoaste faptul ca procesorul are
instructiuni care permit o singura operatie si doi operanzi. O expresie trbuie adusa sub forma
prezenta,pentru obtinerea codului masina. Altgoritmii utilizati sunt de acest tip (evident,acestia sunt si
optimizanti).
8.Teoria grafurilor
8.1 Definitie.Metode de reprezentare
Notiunea de graf neorientat , adiacente , incidenta, grad
Se numeste graf neorientat , o pereghe ordonata de multimi (X,U)unde:
-X este multimea finita si nevida de elemente numite varfuri sau noduri;
-U este o multime de perechi neordonate de cate doua elemete din X, numite muchii sau arce .
For k:=1 to m do
Begin
Write(‘dati muchia”);
Repeat
Readln(x,y);
Until (x>=1)and (x<=n)and(y>=1) and (y<=n) ;
A[x,y]:=1;
A[y,x]:=1;
End;
Listele vecinilor
376
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Pt fiecare nod I formam lista vecinilor lui I .Asta cuprinde toate nodurile care sunt extremitati ale
muchiilor care trec prin nodul I .
Fiecare muchie a grafului poate fi privita ca o inregistrare cu doua componente :cele doua varfuri care
constituie extremitatile muchiei .Notam aceste extremitati cu nod 1 si nod 2 , putem defini tipul de date
TMUCHIE, astfel :
Type tmuchie =record
Nod1 ,nod2:integer;
End;
Matricea de adiacenta
Este o matrice a cu n linii si n coloane , in care elementele a[I,j]se definesc astfel :
a[I,j]= 1 , daca exista muchia [I,j] cu I<>j
0 in caz contrar
3
U6
4
377 U7
Figura1
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Pentru graful G=(X,U) din figura 1. avem: X={1, 2, 3, 4} şi U={u1, u2, u3, u4, u5, u6, u7,}= {(1,1), (2,1),
(3,2), (2,3), (2,4), (3,4), (3,4)}
arc va fi de forma u= (x,y), unde x se numeşte extremitate iniţială, iar y se numeşte extremitate finală a
arcului. Cu alte cuvinte, “arcul iese din nodul x şi intră în nodul y”. La fel ca la grafurile neorientate, vom
spune că nodurile x şi y sunt adiacente, iar arcul u şi nodul x sunt incidente (la fel arcul x şi nodul y).
Nodul y se numeşte succesor al lui x, iar nodul x se numeşte predecesor al lui y. Un arc de forma (x,x),
care iese din nodul x şi intră tot x, se numeşte buclă.
Exemplu:
În graful din figura 1, avem bucla (1,1).
Într-un graf putem avea două sau mai multe arce identice.
Exemplu:
În graful din figura 1, există două arce identice, u6 = u7 = (3,4)
Definiţie
Se numeşte p-graf, un graf orientat în care numărul arcelor identice este mai mic sau egal cu o valoare
dată p.
În cele ce urmează vom analiza numai 1-grafuri fără bucle.
Graful unui vârf. Mulţimile Γ şi ω
Gradul exterior al unui vârf x, notat d*(x), reprezintă numărul arcelor care ies din nodul x, adică numărul
arcelor de forma (x,z) ε U.
Analog, se defineşte gradul interior al unui vârf x, notat d-(x), ca fiind numărul arcelor care intră în nodul
x (de forma (y,x) ε U).
Exemplu:
În graful reprezentat în figura 1, pentru nodul x=2, avem:
d*(2) =3 → există trei arce care ies din nodul 2, şi anume : u2=(2,1), u4=(2,3) şi u5 = (2,4).
d-(2) =1 → în nodul 2 intră un singur arc, în speţă arcul u3=(3,2).
Se mai definesc următoarele mulţimi:
x y X x, y U
→ mulţimea nodurilor ce constituie extremităţi finale ale arcelor care
pleacă din nodul x. Pe scurt, mulţimea succesorilor lui x;
x y X y, x U
→ mulţimea nodurilor ce constituie extremităţi iniţiale ale arcelor care
pleacă din nodul x. Pe scurt, mulţimea predecesorilor lui x;
Exemplu:
În graful din figura 1, pentru nodul x=2, avem:
- Γ+(2) = {1,3,4} → urmare a faptului că muchiile care pleacă din nodul 2 sunt (2,1), (2,3) şi (2,4), putem
spune că mulţimea succesorilor nodului 2 este {1,3,4}.
- Γ-(2) = {3} → în nodul 2 intră doar muchia (3,2), deci mulţimea predecesorilor lui 2 conţine doar nodul
3.
ω+(x) = {u = (x,y)| u ε U} → mulţimea arcelor care ies din nodul x;
ω-(x) = {u = (y,x)| u ε U} → mulţimea arcelor care intră în nodul x;
Exemplu:
În graful din figura 1, pentru nodul 2, avem:
ω+(x) = {(2,1), (2,3), (2,4)}, ω-(x) = {(3,2)}
Graf parţial şi subgraf
Fie graful G = (X,U). Un graf parţial al lui G, este un graf G 1= (X,V), cu V U . Altfel spus, un graf
parţial G1 al lui G, este chiar G, sau se obţine din G păstrând toate vârfurile şi suprimând nişte muchii.
Fie graful G = (X,U). Un graf parţial al lui G, este un graf G 1= (Y,T), unde V X şi T U , iar T va
conţine numai muchiile care au ambele extremităţi în Y. Altfel spus, un graf parţial G 1 al lui G, se obţine
din G eliminând nişte vârfuri şi păstrând doar acele muchii care au ambele extremităţi în mulţimea
vârfurilor rămase.
Exemplu:
Se consideră graful G = (X,U) din figura 2, în care X = {1,2,3,4,5,6} şi U={u1, u2, u3, u4, u5, u6, u7}.
- Construim graful parţial G1 = (X,V), unde X = {1,2,3,4,5,6} şi V = { u2, u3, u4, u6, u7} (figura 3)
din graful G au fost eliminate arcele u1 şi u5.
378
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
- Construim subgraful G2 = (Y,T), unde Y = {3,4,5,6} şi T = {u4, u5, u6, u7} (figura 4) din graful G
au fost eliminate nodurile 1 şi 2 precum şi arcele u1, u2 şi u3 care au o extremitate în afara
mulţimii nodurilor rămase.
Reprezentarea grafurilor orientate
Considerăm un graf orientat G= (X,U) cu m arce şi n noduri.
Cele mai cunoscute forme de reprezentare sunt: matricea de adiacenţă, matricea vârfuri – arce,
matricea drumurilor şi listele vecinilor.
Matricea de adiacenţă
u2 u2
1 2 1 2
u1
u3 u3
u4 u5 u4 u4
3 3 3 u5
4 4 4
5 5 5
u7 u6 u7 u7
u6 u6
6 6 6
Figura 2 Figura 3 Figura 4
Are aceeaşi semnificaţie ca în cazul grafurilor neorientate: fiecare element a[i,j], cu i,j ε {1,2,...,n}, este: 1
dacă există arcul (i,j), respectiv 0 în caz contrar.
Datorită orientării, aşa cum am mai spus, arcul (i,j) nu este totuna cu arcul (j,i). Prin urmare, a[i,j] ≠ a[j,i].
Aşadar matricea de adiacenţă nu mai este simetrică faţă de diagonala principală, aşa cum se întâmpla
în cazul grafurilor neorientate.
Exemplu:
Pentru graful G=(X,U) din figura 5, matricea de adiacenţă este:
coloana 1 2 3 4
0 0 0 0 1
1 0 1 1 2
A=
0 0 0 1 3
0 1 0 0 4
2
3
379
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
deci nu considerăm că mai sunt necesare alte explicaţii. Prezentăm în continuare procedurile
citire_matrice şi afişare_matrice.
Procedure citire_matrice;
{citeşte matricea de adiacenţă a de la tastatură}
var i,j: integer;
begin
writeln('Nr. Noduri: '); readln(n);
for i:=1 to n do
for j:=1 to n do
begin
write('[',i,',',j,']=');
readln(a[i,j]);
end;
end;
Procedure afişare_matrice;
{afişează matricea de adiacenţă a}
var i,j: integer;
begin
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j],' ');
writeln();
end;
end;
Aplicaţie:
Citirea matricei de adiacenţă dintr-un fişier text
Aceasta este absolut similară cu cea prezentată la grafuri neorientate, unde a fost explicată pe larg. De
fapt, este vorba despre algoritmul de citire a unei matrice oarecare dintr-un fişier text. Plecăm de la
presupunerea că fişierul conţine pe primul rând valoarea lui n, apoi pe fiecare din următoarele n rânduri
elementele unei linii a matricei separate de spaţii.
Procedure cit_matr_fis;
{citeşte numărul de noduri si matricea de adiacenta a din fişierul text cu descriptorul f}
var i,j: integer; nume_fis: string;
begin
write('Daţi numele fişierului '); readln(nume_fis);
assign(f,nume_fis); reset(f);
readln(f,n);
for i:=1 to n do
begin
for j:=1 to n do read(f,a[i,j]);
readln(f);
end;
close(f);
end;
Aplicaţie:
Construirea matricei de adiacenţă prin citirea “arcelor” de la tastatură
Se citesc de la tastatură m perechi de numere întregi de forma (x,y) reprezentând extremităţile celor m
arce ale grafului, şi se construieşte matricea de adiacenţă a, cu n linii şi n coloane.
Mai întâi citim m şi n (numărul de arce respectiv numărul de noduri), şi iniţializăm toată matricea de
adiacenţă cu 0, în două cicluri for. Apoi, într-un alt ciclu for, cu k de la i la m, citim cele m perechi de
întregi (x,y).
- Citirea fiecărei perechi (x,z) se face cu validare: repetă citirea lui x şi y până când ambele
valori sunt în intervalul [1,n].
repeat
readln(x,y);
until (x>=1) and x(<=n) and (y>=1) and (y<=n) and (x<>y);
380
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
- Pentru fiecare (x,y), marcăm în matricea de adiacenţă existenţa arcului (x,y), prin atribuirea
a[x,y]:=1. Spre deosebire de grafurile neorientate, nu se mai face şi atribuirea a[y,x]:=1,
deoarece arcul (x,y) nu e identic cu arcul (y,x).
Algoritmul prezentat a fost inclus în procedura citire_graf.
Procedure citire_graf;
var i, j, k, x, y: integer;
begin
write('Nr. Arce:'); readln(m);
write('Nr. Vârfuri'); readln(n);
{iniţializează cu 0 toata matricea de adiacenta}
for i:=1 to n do
for j:=1 to n do
a[i,j]:=0;
{citeşte m perechi (x,y) reprezentând arcele grafului}
for k:=1 to m do
begin
write('Muchia ',k,': ');
repeat
readln(x,y);
until (x>=1) and x(<=n) and (y>=1) and (y<=n) and (x<>y);
{pentru fiecare pereche, marchează arcul in matricea de adiacenta}
a[x,y]:=1;
end;
end;
Aplicaţie:
381
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
0 0 0 0 1
A= 1 0 1 1 2
0 0 0 1 3
0 1 0 0 4
2
3
Observaţie:
Destul de asemănător este şi algoritmul pentru determinarea gradului interior al nodului x (d- (x) ).
Acesta reprezintă numărul arcelor care intră în nodul x, adică numărul arcelor de forma (i,x), cu i ε {1,
2, ..., n}. Să vedem unde se regăsesc în matricea de adiacenţă arcele care intră în nodul x, luând ca
exemplu x=4 pentru graful anterior. Arcele care intră în nodul 4 sunt (3,4) şi (2,4). Rezultă că în matrice
avem a[3,4] = a[2,4] = 1. Am “reperat” astfel valorile de 1 de pe coloana 4 a matricei de adiacenţă. În
acest moment putem concluziona că gradul interior al unui nod oarecare x reprezintă numărul valorilor
de 1 de pe coloana x a matricei. Se poate scrie o funcţie asemănătoare cu cea de mai sus, care să
returneze câte valori de 1 se găsesc pe coloana x.
function d_minus(x: integer): integer;
{returnează gradul interior d- pentru un nod x; acesta este numărul valorilor de 1 de pe coloana x a
matricei de adiacenta}
var nr, i: integer;
382
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
begin
nr:=0;
for i:=1 to n do
if a[i,x]=1 then nr:=nr+1;
d_minus:=nr;
end;
-1 -1 -1 0 0
0 1 0 1 -1
0 0 1 -1 1
u1 u3
u2
1
u4
3 4
u5
Figura 6
383
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Prezentăm în continuare aceste liste ale vecinilor pentru graful din figura 6.
Matricea drumurilor
Această matrice va fi reprezentată în cadrul capitolului “Drumuri şi circuite în grafuri orientate”.
Reprezentarea grafului ca un vector de muchii
Fiecare arc al grafului poate fi privit ca o înregistrare cu două componente, în speţă cele două noduri
care constituie extremităţile arcului:
- nod_in -> nodul din care iese arcul (“nodul de început” al arcului);
- nod_sf -> nodul în care intră arcul (“nodul de sfârşit” al arcului);
Putem defini tipul de date ARC, astfel:
type ARC=record
nod_in, nod_sf: integer;
end;
Graful în ansamblul său, este o mulţime de arce, adică o mulţime de elemente de tipul ARC. În
consecinţă, definim graful ca un “vector de arce”, adică un vector de elemente de tipul ARC:
var v: array [1..25] of ARC;
Numărul real de elemente este numărul de arce m. Astfel, elementele efectiv folosite ale vectorului vor fi
v[1], v[2],..., v[m]. Fiecare element {1, 2, ..., m}) este de tipul ARC şi reprezintă unv[i] (cu i arc al
grafului, având două componente:
v[i].nod_in şi v[i].nod_sf -> nodurile extremităţi ale arcului.
384
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
write(i,' ');
nr:=nr+1;
end;
După încheierea acestei parcurgeri, dacă numărul vârfurilor izolate este diferit de 0 atunci îl afişăm, iar
în caz contrar tipărim un mesaj din care să rezulte că graful nu are noduri izolate.
Program XI_7;
type vect =array[1..20] of integer;
var n,m:integer;
a:array[1..20,1..20] of integer;
dp,dm:vect;
procedure noduri_izolate;
var i,j,k,x,y,nr:integer;
begin
write('Nr.arce : '); readln(m);
write('Nr.noduri: '); readln(n);
{iniţializează cu 0 vectorii gradelor dp şi dm}
for i:=1 to n do
begin
dp[i]:=0; dm[i]:=0;
end;
{citeşte m perechi (x,y) reprezentând arcele grafului}
for k:=1 to m do
begin
write('Arcul ',k,': ');
repeat
readln(x,y);
until (x>=1) and (x<=n) and (y>=1) and (y<=n) and (x<>y);
{pentru fiecare arc (x,y), incrementează gradul exterior al lui x şi gradul interior al lui y}
dp[x]:=dp[x]+1; dm[y]:=dm[y]+1;
end;
writeln; nr:=0; {nr=numărul nodurilor izolate}
for i:=1 to n do
{dacă ambele grade ale lui i sunt 0,am găsit un vârf izolat, pe care-l afişăm şi incrementăm nr}
if (dp[i]=0) and (dm[i]=0) then
begin
write(i,' '); nr:=nr+1;
end;
writeln;
if nr<>0 then writeln('Graful are ',nr, ' noduri izolate')
else writeln ('Graful nu are noduri izolate');
end;
begin
noduri_izolate;
end.
Celebritate.
Se dă un grup format din n persoane, care se cunosc sau nu între ele. De la tastatură se introduc m
perechi de numere întregi (x,y) cu semnificaţia ”persoana x cunoaşte pe persoana y”. relaţia de
cunoştinţă nu este neapărat reciprocă. Numim celebritate, o persoană care este cunoscută de către
toate celelalte persoane din grup, dar ea nu cunoaşte pe nici un alt membru al grupului. Să se
determine dacă din grup există o astfel de celebritate.
Interpretarea datelor.
Problema poate fi modelată într-un graf orientat, în care nodurile sunt persoanele 1,2,3...n, iar arcele
sunt relaţiile de cunoştinţă între aceste persoane. O relaţie de cunoştinţă este de forma (x,y) cu
semnificaţia “persoana x o cunoaşte pe persoana y”. De exemplu, dacă grupul are n=4 persoane, iar
cele m=5 “relaţii de cunoştinţă” sunt (1,3), (2,3), (4,3), (1,2), (1,4), atunci graful şi matricea sa de
adiacenţă arată astfel:
385
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
3
0 1 1 1
0 0 1 0
A
0 0 0 0
0 0 1 0 4
1
Să analizăm persoana reprezentată prin nodul 3:
- există relaţiile de cunoştinţă (1,3), (2,3) şi
(4,3), adică persoana 3 este cunoscută de
către 1,2 şi 4. Mai exact, persoana 3 2 este
cunoscută de către toate celelalte
persoane din grup;
- nu există nici o relaţie de cunoştinţă de forma (3,p). Cu alte cuvinte, persoana 3 nu cunoaşte
pe nimeni.
În concluzie, persoana 3 este ceea ce numim celebritate. În graf, existenţa celebrităţii se interpretează
astfel:
- în nodul 3 intră arce “ieşite” din toate celelalte noduri;
- din nodul 3 nu iese nici un arc.
Rezolvare
În procedura citire_graf se citesc de la tastatură m perechi de numere întregi de forma (x,y)
reprezentând extremităţile celor m arce ale grafului, şi se constituie matricea de adiacenţă a, cu n linii *
n coloane.
Algoritmul de căutare a celebrităţii cuprins în procedura celebritate.
Pentru început, vom căuta o persoană pe care o vom numi în continuare candidat la celebritate.
Memorăm acest candidat în variabila candid. Presupunem că iniţial candidatul este persoana 1
(candid:=1). “Cercetăm” celelalte persoane, într-un ciclu cu i de la 2 la n. Pentru fiecare persoană i,
trebuie să facem o testare. În cazul în care candidatul “actual” candid o cunoaşte i (a[candid,i] este 1)
candid nu mai poate fi celebritate (celebritate nu trebuie să cunoască nici o altă persoană din grup !). În
această situaţie, noul candidat la celebritate devine i (candid:=1).
La finele parcurgerii de mai sus, în variabila candid vom avea aşadar un candidat la celebritate. Mai
rămâne să vedem dacă acest candidat este cunoscut de către celelalte persoane. În exemplul de mai
sus, urmare a faptului că persoana 3 este celebritate, avem relaţiile (1,3), (2,3) şi (4,3), adică
a[1,3]=a[2,3]=a[4,3]=0. În consecinţă, pe coloana 3 avem n-1 valori de 1. Pe caz general, trebuie să
numărăm valorile de 1 de pe coloana candid în matricea de adiacenţă, în adiacenţă, iar dacă găsim n-1
valori, atunci persoana candid este într-adevăr celebritate.
Program XI_8;
var n, m: integer; a: array[1..20, 1..20] of integer;
procedure citire_graf;
var i, j, k, x, y: integer;
begin
write('Nr. arce: '); readln(m);
write('Nr. noduri: '); readln(n);
{iniţializează cu 0 toata matricea de adiacenta}
for i:=1 to n do
for j:=1 to m do
a[i,j]:=0;
{citeşte m perechi (x,y) reprezentând arcele grafului}
for k:=1 to m do
begin
write('Arcul ',k,': ');
repeat
readln(x,y);
until (x>=1) and (x<=n) and (y>=1) and (y<=n) and (x<>y);
{pentru fiecare pereche marchează arcul in matricea de adiacenta}
a[x,y]:=1;
end;
end;
386
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
procedure celebritate;
var i, j, candid, nr : integer;
begin
candid:=1; {candid va reprezenta candidatul la celebritate, care iniţial este persoana 1}
for i:=2 to n do
{daca candidatul îl cunoaşte pe i, el nu mai poate fi celebritate noul candidat devine i}
if a[candid, i]=1 then candid:=i;
nr:=0; {numaram in nr cate persoane îl cunosc pe candidatul candid}
for i:=1 to n do
if a[i, candid]=1 then nr:=nr+1;
{verificam daca intr-adevăr candid este celebritate}
if nr=n-1 then writeln('Persoana ', candid,' este celebritate')
else writeln('Nu exista celebritate in grup');
end;
begin
citire_graf; celebritate;
end.
Drumuri si circuite in grafuri orientate
Se numeşte lanţ intr-un graf orientat, o mulţime de arce L={u 1,u2,...,uk}, cu proprietatea ca oricare doua
arce vecine in mulţime au o extremitate comuna.
Un lanţ este de fapt un traseu care uneşte prin arce doua noduri numite extremităţile lanţului, fără a tine
cont de orientarea arcelor componente.
Se numeşte drum în graful G, un şir de noduri D={z 1, z2, z3, …, zk}, unde z1, z2, z3, …, zk aparţin lui x, cu
proprietatea că oricare două noduri consecutive sunt adiacente, adică există arcele [z 1, z2], [z2, z3], …,
[zk-1,zk] aparţin lui U.
Practic, un drum poate fi privit ca un traseu în care toate arcele au aceeaşi orientare, dată de sensul de
deplasare de la z1 la zk.
Dacă nodurile z1, z2, z3, …, zk sunt distincte două câte două, drumul se numeşte elementar. În caz
contrar, drumul este ne-elementar.
Asemenea uni lanţ într-un graf neorientat, un drum într-un graf orientat este de fapt un traseu pe care l-
am parcurge între două noduri deplasându-ne de-a lungul unor arce şi trecând prin nişte noduri
intermediare. Deosebirea unui drum faţă de un lanţ constă în faptul că de-a lungul unui arc ne putem
deplasa numai în sensul dat de orientarea arcului.
Se numeşte circuit într-un graf, un lanţ L={z 1, z2, z3, …, zk} cu proprietatea că z1=zk şi arcele [z1, z2], [z2,
z3], …, [zk-1,zk] sunt distincte două câte două.
Dacă într-un circuit, toate nodurile cu excepţia primului şi ultimului sunt distincte două câte două, atunci
circuitul se numeşte elementar. În caz contrar, el este ne-elementar.
u2
1 2
u1
u3
u4 u5
3
4
5
u7 u6
6
Figura 8
Matricea drumurilor.
Este o matrice d cu n linii şi n coloane, în care fiecare element d[i,j] este :
- 1, dacă există drum de la nodul i la nodul j în graf;
- 0, în caz contrar.
Algoritmul Roy-Warshall de determinare a matricei drumurilor
387
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Matricea drumurilor se obţine aplicând matricei de adiacenţă transformări succesive. Vom spune că
există drum de la nodul i la nodul j, dacă găsim un nod k (diferit de i, j) cu proprietatea că există drum de
la i la k şi drum de la j la k. Astfel:
un element a[i, j] care este 0, devine 1, dacă există un nod k astfel încât a[i, k]=1 şi a[k, j]=1.
Pentru a găsi arcele nodului k, trebuie parcurse pe rând în varianta k toate nodurile 1, 2, …, n.
for k:=1 to n do
for i:=to n do {i≠k}
for j:=1 to n do {j≠k}
if (a[i, j]=0) and (i<>k) and (j<>k) then
a[i, j]:=a[i,k]*a[k, j];
Atribuirea a[i, j]:=a[i,k]*a[k, j] este o scriere elegantă a regulii de mai sus:
în cazul în care unul din elementele a[i,k], a[k, j] este 0, a[i, j] va rămâne 0;
dacă a[i, k]=1 şi a [k, j]=1, atunci a[i, j] devine 1.
Un CD valoros
Într-un grup sunt n elevi, băieţi şi fete, pe care-i numerotăm 1, 2, … , n. Fiecare elev cunoaşte o parte
dintre ceilalţi elevi. Relaţia de cunoştinţă nu este neapărat reciprocă (dacă x îl cunoaşte pe y, asta nu
înseamnă că şi y trebuie să îl cunoască pe x). Unul dintre elevi are un CD foarte valoros, cu multe
jocuri demonstrative, pe care toţi membri grupului vor să-l aibă fie şi pentru scurt timp, pentru a şi-l
copia pe calculatorul propriu. CD—ul circulă printre membrii grupului în felul următor: fiecare elev după
ce l-a primit de la altcineva îl dă mai departe, dar numai unui elev pe care îl cunoaşte, pentru că nu
doreşte să ajungă în mâna unor persoane în care nu poate avea încredere. Determinaţi o modalitate
(dacă există) prin care CD-ul să circule exact o singură dată pe la fiecare elev, transmiterea lui făcându-
se numai către o cunoştinţă, iar în final CD-ul să ajungă din nou la proprietarul său.
Interpretarea datelor
Relaţiile de cunoştinţă din cadrul grupului pot fi reţinute într-o matrice a cu n linii şi n coloane, în fiecare
element a[i, j] este: 1 dacă elevul i îl cunoaşte pe elevul j, respectiv 0 în caz contrar. Cu datele
problemei putem construi un graf în care nodurile sunt elevii 1, 2, 3,…, n, iar arcele sunt relaţiile de
cunoştinţă din grup. Astfel, va exista arc de la nodul x la nodul y dacă elevul x în cunoaşte pe elevul y.
Întrucât în enunţ se precizează că relaţiile de cunoştinţă nu sunt neapărat reciproce („x cunoaşte pe y”
nu implică „y cunoaşte pe x”), rezultă că avem de-a face cu un graf orientat. Matricea a definită mai
înainte este tocmai matricea de adiacenţă a grafului.
„Traseul” pe care îl parcurge CD-ul pleacă dintr-un nod (proprietarul său), trecând prin fiecare nod (pe la
fiecare elev) o singură dată. Transmiterea se face numai către o cunoştinţă. Astfel, de la elevul x va
ajunge la elevul y numai dacă există arc (cunoştinţă) de la x la y. În final, traseul se încheie în nodul de
unde a plecat (CD-ul se întoarce la proprietarul iniţial). Un traseu care respectă condiţiile de mai sus nu
este altceva decât un circuit elementar care trece prin toate nodurile grafului: drum deoarece poate
trece de la un nod la altul numai printr-un arc, elementar deoarece nu trece de două ori prin acelaşi nod,
şi în sfârşit circuit pentru că revine în nodul de plecare.
Rezolvare
Folosim metoda backtracking. Fiecare astfel de circuit elementar care trece prin toate nodurile grafului,
va fi o soluţie memorată în vectorul stivă st. Aşadar elementele vectorului st sunt noduri ale grafului.
O soluţie (st[1], st[2], …, st[p] ) este finală dacă
- conţine n nivele, adică p=n (au fost „puşi pe stivă” toţi cei n elevi, adică toate cele n noduri)
- st[n]=x (pentru a fi ciclu trebui să revină în nodul de plecare, adică „elevul de pe ultimul nivel”, st[n],
trebuie să fie proprietarul memorat iniţial în x).
Procedura {citire_matrice;} citeşte matricea de adiacenţă (relaţiile de cunoştinţă). În două cicluri for,
cu i, j=1, 2, …, n, se citesc toate elementele a[i, j]. Această procedură a fost prezentată ca aplicaţie în
lecţia „Reprezentarea grafurilor orientate”
Procedura {iniţializări;} realizează iniţializarea stivei şi a proprietarului CD-ului.
- într-un ciclu for, se iniţializează cu 0 întreg vectorul-stivă;
- se citeşte numărul de ordine al proprietarului CD-ului în variabila x (nodul de plecare).
Procedura {tipar(p:integer):} afişează o configuraţie (st[1], st[2], …, st[p]) a vectorului-stivă.
Funcţia {valid(p:integer):boolean;} verifică pentru fiecare nivel p dacă st[p]I a generat o soluţie
(st[1], st[2], …, st[p]) validă.
Testarea se face prin intermediul unei variabile booleene ok, iniţializează cu TRUE. În primul rând, din
nodul st[p-1] se poate ajunge în
388
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
nodul st[p] numai printr-un arc (orice drum/circuit trece prin arce). Aşadar nodul st[p] este valid numai
dacă există arc de la st[p-1] la st[p], adică a[st[p-1], st[p]]=1 (această condiţie provine din faptul că
fiecare elev va transmite CD-ul numai prin cunoştinţă, ia relaţia de cunoştinţă este marcată în graf printr-
un arc). În caz contrar ok devine FALSE.
ok:=TRUE;
if a [ st[p], st[p-1]]=0 then
ok:=FALSE;
Dacă ok a rămas TRUE, urmează testarea celei de-a doua condiţii. Am spus că soluţia este finală dacă
p=n, iar pe ultimul nivel trebuie să se găsească nodul x. Dar pe ultimul nivel anterior lui n nu putem
avea nodul x (CD-ul revine la proprietar, dar numai după ce a trecut pe la ceilalţi elevi, pe la fiecare o
singură dată).
if ok then
if (p<n) and (st[p]=x)
then
ok:=FALSE
Dacă ok a rămas în continuare TRUE, mai avem şi o a treia condiţie. Nodul st[p] să nu se mai
găsească pe stivă (urmare a faptului că CD-ul trebuie să treacă pe la fiecare elev o singură dată).
Parcurgem într-un ciclu nivelele i=1, 2, …, p-1 anterioare lui p. Dacă găsim un st[i] egal cu st[p],
înseamnă că st[p] se mai găsesc pe un nivel anterior, deci ok devine şi în cazul acesta FALSE.
if ok then
for i:=1 to p-1 do
if st[p]= st[i] then
ok:=FALSE
Procedura recursivă {bktr(p:integer);} “tratează” un nivel oarecare p al stivei.
prin variabila val vor trece pe rând, într-un ciclu, toate valorile care teoretic ar putea fi puse pe
nivelul p. Pentru fiecare dintre aceste valori:
dacă respectiva valoare a generat o soluţie validă (dacă funcţia valid(p) a returnat
TRUE), atunci:
- dacă soluţia respectivă e şi finală o tipărim (apelând procedura tipar (p)); în
caz contrar trecem la nivelul următor (pentru a completa soluţia cu un nou
nivel), prin auto-apelul bktr(p+1).
În programul principal, apelăm procedurile iniţializări şi citire_matrice, apoi declanşăm lanţul recursiv
prin apelul bktr(1) (plecăm de la nivelul 1 al stivei).
Program XI_10;
var n,x:integer;
st:array[1..20] of integer;
a:array[1..20,1..20] of integer;
procedure citire_matrice;
{citeste matricea de adiacenta a de la tastatura}
var I,j:integer;
begin
write (‘numarul de noduri: ’); readln(n);
for i:=1 to n do
for j:=1 to n do
begin
write (‘[‘, i, ’,’, j, ‘]=’); readln(a[i, j]);
end;
end;
procedure initializari;
{initializeaza stiva si citeste datele problemei}
var i:integer;
begin
write (‘Cine este proprietarul: ’); readln(x);
for i:=1 to 25 do st[i]:=0;
end;
389
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
var k:integer;
begin;
write (x, ’ ’);
for k:=1 to p do write (st[k]:4, ‘ ’);
writeln;
end;
begin;
initializai; citire_matrice; bktr(1); {plecam de la nivelul 1 pe stiva}
end.
Definitie :
Numim graf orientat ,o pereche ordonata de multimi G=(X,U), unde :
- x este o multime finita si nevida numita miltimea nodurilor (varfurilor);
- U este o multime formata din perechi ordonate de elemente ale lui X,numita multimea
arcelor (muchiilor).
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).
Î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.
390
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Definitie
Se numeste p-graf ,un graf orientat in care numarul arcelor identice este mai mic sau egal cu o valoare
data p.
Pentru evidentierea costurilor tuturor arcelor unui graf cu n noduri se poate defini o matrice a, cu
n linii * n coloane.Exista doua forme ale acestei matrici:
Forma a): Fiecare element a[i,j] poate fi:
c , daca exista un arc de cost c>0 intre nodurile i si j;
0, daca i=j;
+∞ ,daca nu exista arc intre nodurile i si j .
Forma b): Este absolut similara,cu singura deosebire ca in loc de +∞ avem -∞.
Forma a) se foloseste pentru determinarea drumurilor de cost minim intre doua noduri , iar forma b)
este utilizata in aflarea drumurilor de cost maxim.
Daca dorim sa citim matrice costurilor ,evident ca nu putem introduce de la tastatura “+”! In loc de +
vom da un numar intreg foarte mare.
Definitie
Gradul exterior al unui varf x, notat d+(x), reprezinta numarul arcelor care ies din nodul x,adica
numarul arcelor de forma (x,y)
apartine de U.
Analog , se defineste gradul interior al unui varf x, notat d¯(x), ca fiind numarul arcelor care intra
in nodul x (de forma (x,y) apartine U)
391
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Cele mai cunoscute forme de reprezentare sunt : matricea de adiacenta , matricea varfuri-arce,
matricea drumurilor si listele vecinilor.
Matricea de adiacenta
Are aceeasi semnificatie ca in cazul grafurilor neorientate :fiecare element a[I,j] ,cu I,j apartine de
{1, 2,….,n} ,este: 1 daca exista arcul (I,j), respectiv 0 in caz contrar.
Datorita orientarii, asa cum am mai spus , arcul (I,j) nu este totuna cu arcul (j,I).Prin urmare ,
a[I,j]≠a[j,I].Asadar matricea de
adiacenta nu mai este simetrica fata de diagonala principala , asa cum se intampla in cazul grafurilor
neorientate .
Matricea varfuri-arce
Listele vecinilor
2 6
1 +8
3
5
7
4
Fig.1
392
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
7
4
Fig.2
Cu alte cuvinte, un graf parţial al unui graf se obţine păstrând aceeaşi mulţime de vârfuri şi
eliminând o parte din muchii.
Definiţie. Un subgraf al unui graf G=(X,U) este un graf H=(Y,V) astfel încât Y X iar V conţine
toate muchiile din U care au ambele extremităţi în Y. Vom spune că subgraful H este indus sau generat
de mulţimea de vârfuri Y.
Ex. Mai jos avem un subgraf al grafului din Fig.1 obţinut prin eliminarea nodului 3
2 6
+8
1
5
7
4
Definiţie. Gradul unui vârf x este numărul muchiilor incidente cu x.
Gradul vârfului x se notează cu d(x).
Ex. în Fig.1 d(1)=3, d(4)=2, d(8)=0, d(6)=1
Un vârf care are gradul 0 se numeşte vârf izolat.
Un vârf care are gradul 1 se numeşte vârf terminal.
Propoziţia 1. Dacă un graf G=(X,U) are m muchii şi n vârfuri iar X={x 1,x2,..,xn}, atunci
d(x1)+d(x2)+...+d(xn)=2m.
Corolar. În orice graf G există un număr par de vârfuri de grad impar.
Definiţie. Se numeşte graf complet cu n vârfuri un graf care are proprietatea că orice două
noduri diferite sunt adiacente.
Propoziţia 2. Un graf complet Kn are n(n-1)/2 muchii.
Definiţie. Un graf G=(X,U) se numeşte bipartit dacă există două mulţimi nevide A, B astfel
încât X=A U B, A B = şi orice muchie u a lui G are o extremitate în A iar cealaltă în B.
Definiţie. Un graf bipartit se numeşte complet dacă pentru orice x din A şi orice y din B, există
în G muchia [x,y].
393
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Definitie.Un subgraf al unui graf neorientat G=(X,g) este un graf H=(Y<G1), unde Y inclus in X, iar
muchiile din G1 sunt toate muchiile din G care au ambele extremitati in multimea Y.
Definitie.Lant.Pentru graful neorientat , un lant este o succesiune de varfuri cu proprietatea ca oricare
doua varfuri sunt adiacente.
Se numeste graf complet cu n varfuri , notat Kn , un graf G=(X,U) cu proprietatea ca oricare doua
varfuri sunt adiacente adica :
() x,y є x → ca exista muchia [x,y] apartine de U
Teorema:
Un graf complet cu n varfuri , are n(n-1)/2 muchii.
Definitia :
Se numeste graf bipatrat ,un graf G=(X,U) cu propietate ca exista doua multimi A si B incluse in X,
astfel incat :
-A ∩ B=Ø ,A U B=X,
-toate muchiile grafului au o extremitate in A si cealalta in B .
Definitie :
Se numeste graf bipatrat complet, un graf bipatrat cu propietatea ca pentru orice varf x din A si orice
varf y din B,exista muchia (x,y) (unde A si B sunt cele doua submultimi care partitioneaza miltimea
varfurilor X).
Definitie :
Se numeste lant in graful G ,o succesiune de varfuri (z1, z2,z3 ,….zk),unde x1,x2,…,xk apartine de X ,
cu propietatea ca oricare doua varfuri consecutive sunt adiacente ,adica exista muchiile [z1, z2],[z2 ,z3],
….,[zk-1,zk] apartine de U.
Varfurile z1 si zk se numesc extremitatile lantului ,iar numarul de muchii care intra in componenta sa
reprezinta lungimea lantului .
Definitie :
Se numeste ciclu intr-un graf ,un lant L=(z1,z2,….zk) cu propietatea ca z1=zk si muchiile [z1,z2 ],
[z2,z3], ….,[zk-1,zk] sunt disticte doua cate doua.
Daca intr-un ciclu , toate varfurile cu exceptia primului si a ultimului sunt disticte doua cate
doua ,atunci
ciclul se numeste elementar .In contrar, el este neelementar.
Problema rezolvata
Lant intr-un graf
Sa se verifice daca o secventa de varfuri data reprezinta un lant elementar si neelementar intr-un graf
neorientat. Numarul de varfuri si matricea de adiacenta se citesc de la tastatura, iar secventa testata se
gaseste in fisierul “lant .txt”(varfurile sunt scrise in fisier pe un singur rand separate prin spatii).
program X1-5;
uses crt;
var a:array[1..20,1..20] of integer ;
n,I,j,k:integer;
z:array[1..20] of integer;
procedure citire matrice;
{citeste numarul de muchi si muchiile de forma (x,y),si construieste matricea de adiacenta}
var I,j,x,y:integer
begin
{citeste numarul de varfuri n}
write (‘numarul de varfuri :’) ;
readln (n) ;
{initializeaza cu 0 diagonala principala}
394
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
procedure secventa ;
var f:text; ok:boolean;
begin
assign(f, ‘lant./txt’); reset(f);
{citeste secventa de varfuri din fisier in vectorul z=(z[1],z[2],…,z[k])
k:=0;
while not seekeoln (f) do
begin
k:=k+1; read(f,z[k]);
end;
close (f);
{afiseaza vectorul z ce contine secventa}
for I:=1 to k do write(z[I], ‘ ‘);
writeln ;
{verifica daca doua varfuri consecutive in secventa sunt adiacente (daca secventa e lant)}
ok:=TRUE;
for I:=1to k-1 do
if a[z[I],z[I+1]]=0 then ok:=FALSE;
if ok then write (‘lant’)
else writeln (‘secventa nu este in lant ‘);
if ok then
begin
{in cazul in care e lant ,testeaza daca varfurile sunt disticte intre ele(adica lant elementar ) }
for I:=1 to k-1 do
for j:=I+1 to k do
if z[I]=z[j] then ok:=FALSE;
if ok then writeln (‘elementar’)
else writeln (‘ne-elementar ‘);
end;
end;
begin
citire_matrice; secventa ;
end.
395
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
PARCURGEREA GRAFURILOR
{Parcuregerea in latime nerecursiv si recursivla
grafuri procedure pp(i:integer);
ex: var j:integer;
n=6 begin
8 muchii si anume (1,2),(1,3)(1,4),(2,4),(2,3),(3,4), for j:=1 to n do
(3,6),(4,5) if (a[co[i],j]=1) and( vi[j]=0) then begin
=>1 2 3 4 6 5 } u:=u+1;
uses crt; co[u]:=j;
var a:array[1..20,1..20] of integer; vi[j]:=1;
co,vi:array[1..20] of integer; end;
i,n,el,j,p,u,pl,m,x,y:integer; if i<=u then pp(i+1);
396
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
8
7
3 4 6
397
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Un graf G este conex , daca oricare ar fi doua varfuri ale sale ,exista un lant care le leaga.
Definitie:
Se numeste componenta conexa a grafului G=(X,U),un subgraf G1=(X1,U1) a lui
G ,conex , cu propietatea ca nu exista nici un lant care sa lege un nod din X1 cu un nod din X-
X1(pentru orice nod , nu exista un lant intre acel nod si nodurile care nu fac parte din subgraf).
Program componenteconexe; writeln(‘Dati muchia cu
var m,n ,pi,ps,prim, p, numarul de ordine’,k,’:’);
nc:integer; repeat
a:array[1..20,1..20] of readln(x,y);
integer; until(x>=1) and (x<=n)
d,c,viz:array[1..20] of and (y>=n) and (y<=n);
integer; a[x,y]:=1; a[y,x]:=1;
procedure citire_graf; d[x]:=d[x]+1; d[y]:=d[y]
{citeste numarul de muchii si +1;
muchiile de forma (x,y), si end;
construieste matricea de end;
adiacenta}
var I,j,k,x,y:integer; function nevizitat :integer;
begin {parcurge tabloul viz:
{citeste numarul de varfuri n returneaza primul nod
si numarul de muchii m} nevizitat,sau –1 daca nu mai
write (‘Numarul de varfuri :’); sunt noduri nevizitate}
readln(n); var prim_nev,j:integer:
write (‘Numarul de begin
muchii:’); readln(m); prim_nev:=-1;
{initializeaza cu 0 intreg j:=1;
vectorul gradelor d} while (j<=n) and
for i:=1 to n do d[i]:=0; (prim_nev= -1) do
{initializeaza cu 0 toata begin
matricea de adiacenta} if viz[j]=0 then
for i:=1 to n do prim_nev:=j;
for j:=1 to n do j:=j+1;
a[i,j]=0; end;
{citeste m perechi de numere nevizitat:=prim_nev;
intregi de forma (x,y)} end;
{pentru fiecare pereche,
actualizeaza cu 1 elementele function conex:boolean;
a[x,y] si a[y,x] care {verifica daca varful este
identifica muchia (x,y)} conex,returnand TRUE sau FALSE}
for k:=1 to mdo var k,pi,ps,z:imteger;
begin begin
398
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Definitie:
Un graf orientat G=(X,U) este tare conex, daca pentru oricare doua noduri x si y apartin
de X, exista un drum de la x la y precum si un drum de la y la x.
Definitie
Fiind dat un graf orientat G=(X,U), se numeste componenta tare conexa a lui G ,un
subgraf G1=(X1,U1),tare conex, si maximal in raport cu aceasta propietate (adica pentru orice
nod x apartine de X-X1, subgraful indus de X1 U{x} nu mai este tare conex).
APLICATIE
Algoritmul de descompunere a unui graf in componente tare conexe .
Componenta tare conexa din care face parte nodul i, este multimea :
S[i] ∩ P[i] U{i}
399
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
400
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
401
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Consideram un graf orientat G=(X,U) cu n noduri, in care fiecarui arc ii este asociat un numar
intreg numit cost. Semnificatia
acestui cost poate fi foarte variata , in functie de domeniul pe care il descrie graful .
Matricea costurilor
Pentru evidentierea costurilor tuturor arcelor unui graf cu n noduri se poate defini o matrice a, cu
n linii * n coloane.Exista doua forme ale acestei matrici:
Forma a): Fiecare element a[i,j] poate fi:
c , daca exista un arc de cost c>0 intre nodurile i si j;
0 , daca i=j;
+∞ ,daca nu exista arc intre nodurile i si j .
Forma b): Este absolut similara,cu singura deosebire ca in loc de +∞ avem -∞.
Forma a) se foloseste pentru determinarea drumurilor de cost minim intre doua noduri , iar
forma b) este utilizata in aflarea drumurilor de cost maxim.
Daca dorim sa citim matrice costurilor ,evident ca nu putem introduce de la tastatura “+”! In
loc de + vom da un numar intreg foarte mare.
Algoritmul lui Dijkstra
Se consideră un graf neorientat, conex cu N noduri. Graful este dat prin matricea
costurilor A.
Se consideră un nod iniţial R. Se cer lungimile drumurilor minime de la R la celelalte noduri ale
grafului, precum şi nodurile prin care trec aceste drumuri.
Problema are numeroase aplicaţii practice. Să presupunem că dispunem de o hartă cu oraşele
unei ţări. Acestea sunt unite prin şosele. Oraşele formează nodurile grafului, iar şoselele – arcele
acestuia. Algoritmul furnizează drumurile optime de la un oraş iniţial la celelalte oraşe. Este
interesant de observat faptul că, spre deosebire de alţi algoritmi, acesta furnizează şi nodurile
prin care trec drumurile optime, nu numai lungimile acestora.
402
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
0 13 16 8
0 6 10
13 0 14 11
6 14 0 5 17
16 5 0 7
8 10 11 17 7 0
Prezentarea algoritmului.
P1) Nodul R este adăugat mulţimii S iniţial vidă (S(R)=1);
- costurile drumurilor de la R la fiecare nod al grafului se preiau în vectorul D de pe linia R
a matricii A;
- pentru toate nodurile I având un cost al drumului de la R la ele finit, se pune T(I)=R.
P2) Se execută de n-1 ori secvenţa
- printre nodurile neselectate se caută cel aflat la distanţa minimă faţă de R şi se selectează
adăugându-l mulţimii S;
- pentru fiecare din nodurile neselectate se actualizează în D costul drumurilor de la R la
el, utilizând ca nod intermediar nodul selectat, procedând în felul următor: se compară distanţa
existentă în vectorul D cu suma dintre distanţa existentă în D pentru nodul selectat şi distanţa de
la nodul selectat la nodul pentru care se face actualizarea distanţei (preluată din A), iar în cazul
în care suma este mai mică, elementul din D corespunzător nodului pentru care se face
actualizarea capătă ca valoare aceasă sumă şi elementul din T corespuzător aceluiaşi nod ia
valoarea nodului selectat (drumul trece prin acest nod). Presupunând că a fost selectat nodul K,
se actualizează distanţa pentru nodul L şi se compară D(K)+A(K,L) cu D(L).
403
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
P3) Pentru fiecare nod al grafului, cu excepţia lui R, se trasează drumul de la R la el.
S 1 0
0 0 0 0
T 0 0
1 0 1 0
1 1 2 1
D 0 8 3 5 5 8
S 1 0 0 0 0 1
T 0 6 1 6 6 1
Se selectează nodul 3.
D(3)+A(3,2)=13+>18D(2)=18.
D(3)+A(3,4)=13+14=27>25D(3)=13.
D(3)+A(3,5)=13+>15D(5)=15.
0 1 1 2 1
D 8 3 5 5 8
S 1 0
1 0 0 1
T
0 6 1 6 6 1
Se selectează nodul 5.
D(5)+A(5,2)=15+>18D(2)=18.
D(5)+A(5,4)=15+5=20D(4)=20 şi T(4)=5.
1 1 2 1
D 0 8 3 0 5 8
404
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
S 1 0 1 0 1 1
T 0 6 1 5 6 1
Se selectează nodul 2.
D(2)+A(2,4)=18+6=24>20D(4)=20.
1 1 2 1 8
D 0 8 3 0 5
S 1 1 1 0 1 1
1
T 0 6 1 5 6
Se selectează nodul 4.
În continuare, pentru fiecare nod se trasează drumul de la nodul iniţial la el.
Vom considera, ca exemplu, nodul 4. Distanţa de la nodul 1 la el D(4) şi anume 20.
Avem T(4)=5; T(5)=6; T(6)=1; drumul trece prin nodurile 1,6,5.
Avem A(1,6)=8; A(6,5)=7; A(5,4)=5.Rezultă 8+5+7=20.
Întrucât drumul se trasează în ordine inversă faţă de cum este găsit, în program se foloseşte o
procedură recursivă.
În cele ce urmează vom nota nodurile cu Ni1,Ni2,…,Nin. Acestea sunt tot nodurile 1,2,…,R,
…,N cosiderate în altă ordine. Nodului R îi corespunde nodul Ni1.
Demonstrarea algoritmului.
Lema 1. Algoritmul selectează nodurile în ordinea costului drumului de la nodul iniţial la ele.
Demonstraţie:
Utilizăm metoda inducţiei matematice. Prima dată se selectează nodul Ni2 (are costul drumului
minim faţă de Ni1). Aceasta înseamnă că ipoteza de inducţie se verifică pentru prima selecţie.
Presupunem că nu au fost selectate nodurile Ni2,Ni3,…,Nip (p<n) în ordinea costului drumului
de la Ni1 la ele. Se selectează nodul Nip+1. Presupunem, prin absurd, că există un alt nod N1,
neselectat, care are un cost al drumului de la Ni1 la el mai scăzut decât al nodului Nip+1. Atunci,
acesta poate fi plasat în şirul nodurilor deja selectate, aşezate în ordinea distanţei faţă de Ni1, în
următoarele două moduri:
1) Ni1,…,N1,…,Nip,Nip+1.
În acest caz, se contrazice ipoteza de inducţie (nodurile Ni1,…,Nip erau aşezate în ordine
distanţei faţă de Ni1).
2) Ni2,…, Nip,N1,Nip+1.
Aici este contrazisă alegerea lui Nip+1. Acesta a fost ales ca nod cu distanţă minimă faţă de Nil
dintre toate nodurile neselectate, iar N1 este un nod neselectat.
Lema 2. Orice drum optim de la nodul iniţial la oricare din nodurile selectate trece numai prin
noduri selectate.
Demonstraţie:
Presupunem prin absurd că există un drum de cost mai mic de la Ni1 la Nik (Nik este un nod
deja selectat) care nu trece numai prin noduri selectate. Fie Nz primul nod prin care trece acest
drum şi care nu este selectat. Aceasta înseamnă că nodul Nz are costul drumului de la Ni1 la el
mai mic decât cel de la Ni1 la Nik (nod care este selectat). Aceasta contrazice LEMA 1.
TEOREMĂ.
405
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Odată selectat un nod, nu există un drum de cost mai mic între Ni1 şi el, decât drumul de cost
indicat de vectorul D.
Demonstraţie:
În demonstrarea acestui fapt utilizăm metoda inducţiei matematice.
Pentru selectarea lui Ni2 afirmaţia este evidentă, întrucât acesta este cel mai apropiat de Ni1.
Presupunem selectate nodurile Ni2,…,Nip. Selectăm Nip+1. Presupunem că de la Ni1 la el există
un drum de cost mai mic decât cel indicat de vectorul D.
Avem două posibilităţi:
procedure citeste;
var i,j,p,q:byte;
{Fiind dat un graf neorientat G si doua varfuri x si y begin
in acest graf, sa se assign(f,'in2.pas');reset(f);
determine un lant elementar de lungime minima, readln(f,n);
avand ca extremitati
varfurile date. Datele de intrare se citesc din fisierul for i:=1 to n do
Graf.dat care are for j:=1 to n do
urmatoarea componenta: if i=j then a[i,j]:=0
- pe prima linie se afla numarul de varfuri ale else a[i,j]:=infinit;
grafului(n); readln(f,x,y);
- pe a doua linie sunt inscrise cele doua extremitati while not eof(f) do
ale lantului begin
elementar separate prin spatii; readln(f,p,q);
- pe urmatoarele n linii se gasesc valorile matricei a[P,q]:=1; a[q,P]:=1;
de adiacenta separate end;
prin spatii. Datele de iesire se vor afrsa pe ecran si close(f)
vor consta in:
- mesajul "Nu exista lanl elementar Fntre cele doua end;
varfuri" prOcedure mat_drumuri;
sau var i,j,k:byte;
- mesajul "Lantul minim are lungimea .... ", iar pe begin
linia urmatoare varfurile for k:=1 to n do
lantului for i:=1 to n do
separate printr-un spatiu. for j:=1 to n do
if a[i,j]>a[i,k]+a[k,j] then
Rezolvare begin
Rezolvarea acestei probleme se bazeaza pe formarea a[i,j]:=a[i,k]+a[k,j];
matricei lanturilor. Un a[j,i]:=a[i,j];
element al acestei matrici va contine Iungimea end;
lantului minim dintre varfurile end;
corespunzatoare liniei si coloanei.} procedure drum(v1,v2:byte);
program lant_elementar; var k:byte;gasit:boolean;
const infinit=100; begin
type matrice=array[1..20,1..20] of byte; k:=1;gasit:=false;
var n,x,y:byte;a:matrice;f:text; while(k<=n)and not gasit do
406
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
begin write(‘a[‘,I,’,’,j,’]=’);
if(v1<>k)and(v2<>k)and(a[v1,v2]=a[v1,k] readln(a[I,j]); a[j,I]:=a[I,j];
+a[k,v2])then end;
begin writeln(‘Introduceţi nodul de pornire’);
drum(v1,k);drum(k,v2); write(‘r=’); readln(r);
gasit:=true; for I:=1 to n do
end; begin
k:=k+1; s[I]:=0; t[I]:=0;
end; a[I,I]:=0;
if not gasit then write(v2,' '); end;
end; s[r]:=1;
begin for I:=1 to n do
citeste; begin
mat_drumuri; d[I]:=a[r,I];
if a[x,y]=infinit then writeln('Nu exista lant if I<>r then
elementar intre cele doua varfuri') t[I]:=r;
else end;
begin for I:=1 to n-1 do
writeln('Drumul minim are lungimea:',a[x,y]); begin
write(x,' '); min:=30000;
drum(x,y); for j:=1 to n do
end; if s[j]=0 then
readln; begin
end. min:=d[j];
poz:=j;
ALGORITMUL DIJKSTRA end;
Program dijkstra; s[poz]:=1;
Type mat=array[1..10,1..10] of integer; for j:=1 to n do
vect=array[1..10] of integer; if s[j]=0 then
var a:mat; if d[j]>d[poz]+a[poz,j] then
s,t,d:vect; begin
n,I,j,r,min,poz:integer; d[j]:=d[poz]
+a[poz,j];
procedure drum(I:integer); t[j]:=poz;
begin end;
if t[i]<>0 end;
then for I:=1 to n do
begin if I<>r then
drum(t[i]);write(i); begin
end writeln(‘Distanţa de la nodul’,r,’la
else write(I); nodul’,’este ‘,d[I]);
end; drum[I];
begin writeln;
write (‘n=’);readln(n); end;
writeln(‘Introduceţi matricea end.
costurilor’);
for I:=1 to n do
for j:=I+1 to n do
begin
407
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Etapa 1)Caut drumurile optime intre oricare doua noduri dar drumurile trec prin nodul
intermediar 1
a[4,2]= ω >a[4,1]+a[1,2]=1+1=2 deci a[4,2]=2
a[4,5]=ω>a[4,1]+a[1,5]=1+3=4 deci a[4,5]=4
matricea ponderilor este
019ω 3
ω 0 7 3 ω
ω ω 0 ω ω
1 2 2 0 4
ω 4 ω 2 0
408
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Etapa 2)Caut drumurile optime intre oricare doua noduri dar drumurile trec prin nodul
intermediar 2
a[1,3]=9>a[1,2]+a[2,3]=1+7=8 deci a[1,3]=8
a[1,4]=ω>a[1,2]+a[2,4]=1+3=4 deci a[1,4]=4
a[5,3]=ω>a[1,2]+a[2,3]=4+7=11 deci a[5,3]=11
a[5,4]=ω>a[5,2]+a[2,4]=4+3=7 deci neschimbat
0184 3
ω 0 7 3 ω
ω ω 0 ω ω
1 2 2 0 4
ω 4 11 2 0
Etapa 3)Caut drumurile optime intre oricare doua noduri dar drumurile trec prin nodul
intermediar 3 dar nu avem nimic nou.
Etapa 4)Caut drumurile optime intre oricare doua noduri dar drumurile trec prin nodul
intermediar 4
a[1,3]=ω>a[1,4]+a[4,3]=4+2=6 deci a[1,3]=6
a[2,1]=ω>a[2,4]+a[4,1]=3+1=4 deci a[2,1]=4
a[2,3]=ω>a[2,4]+a[4,3]=3+2=5 deci a[2,3]=5
a[2,5]=ω>a[2,4]+a[4,5]=3+4=7 deci a[2,5]=7
a[5,1]=ω>a[5,4]+a[4,1]=2+1=3 deci a[5,1]=3
a[5,3]=ω>a[5,4]+a[4,3]=2+2=4 deci a[5,3]=4
409
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
0164 3
4 0 5 3 7
ω ω 0 ω ω
1 2 2 0 4
3 4 4 2 0
410
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
411
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
end;
var x:sir;
p,i,j,k,n,k1:integer; begin
as,ev:boolean;
a:array[1..50,1..50] of integer; write('dati numarul de noduri din graf');
readln(n);
procedure succesor(var x:sir;k:integer;var
as:boolean); for i:=1 to n-1 do
begin begin
if (x[k]<n) then begin for j:=i+1 to n do
as:=true; x[k]:=x[k]+1; begin
write('numarul ',i,',',j,' este ');
end readln(a[i,j]);
else a[j,i]:=a[i,j];
as:=false; end;
end; end;x[1]:=1;
k:=2; j:=0;
procedure valid(x:sir;k:integer;var x[k]:=1;
ev:boolean); while(k>0) do
var i:integer; begin
begin repeat
ev:=true; succesor(x,k,as);
if a[x[k-1],x[k]]=0 then ev:=false if as then valid(x,k,ev)
else until (as and ev) or (not as);
begin if as then
for i:=1 to k-1 do if (k=n) then
if x[k]=x[i] then ev:=false; afis(x,k)
if (k=n) and(a[x[n],x[1]]=0) then ev:=false; else
end; begin
end; k:=k+1;
x[k]:=1;
procedure afis(x:sir;k:integer); end
var i:integer; else
begin k:=k-1 ;
for i:=1 to k do end;
write( x[i] ,' '); readln;
write(x[1]:4); end.
writeln;
Grafuri euleriene
Definitie:
Se numeste ciclu eulerian intr-un graf, un ciclu care contine toate muchiile grafului.
Se numeste graf eulerian, un graf care contine un ciclu eulerian.
Teorema:
Un graf fara varfuri izolate este eulerian, daca si numai daca este conex, si gradele tuturor
varfurilor sunt numere pare
fara virfuri izolate si care are gradele fiecarui
{Stiind ca un graf conex(are o singura virf un numar par
componenta conexa) , Sa se determine daca este ciclu eulerian sa nu
ex:n=3
m=3 si anume (1,2),(1,3),(2,3)
412
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
413
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Definiţie. Se numeşte arbore un graf orientat care este conex si nu conţine cicluri.
Problema. Se citeşte un graf sa se scrie un program care sa verifice daca este arbore.
1. Mai întâi trebuie văzut daca graful este conex. In cazul grafurilor orientate aceasta problema se rezolva printr-o
simpla parcurgere in adâncime (DF). Dar in cazul grafurilor neorientate? Aici apare o problema. De la nodul i la
nodul j exista doua arce, de la i la j si de la j la i. Aceasta conduce la semnalarea unui ciclu fals. Pentru rezolvarea,
după alegerea unei muchii ,de exemplu de la i la j se elimina muchia de la j la i. In final daca au fost atinse toate
nodurile(adică daca orice componenta a vectorului s retine numai 1) înseamnă ca graful este conex.
2. Trebuie analizat daca graful nu are cicluri. Aceasta problema se rezolva tot cu ajutorul parcurgerii in adâncime.
Parcurgerea asigura selecţia unei muchi o singura data. Daca graful are cel puţin un ciclu, atunci un nod este atins
de doua ori. Cum ne putem da seama ca aceasta are loc? simplu, daca a fost atins un nod i , după care s[i]=1.
program arbore ;
uses grafuri;
var s:array[1.. 50] of byte;
A:mat_ad;
gasit:boolean;
n,i,suma:integer;
procedure df_r(nod:byte);
var k:byte;
begin
s[nod]:=1;
for k:=1 to n do
if (a[nod,k]=1)
then
begin
a[k,nod]:=0;
if s[k]=0; then df_r(k)
else gasit:=true;
end;
end ;
begin
clrscr;
citiren( ` graf.txt `,a,n);
df_r(1);
414
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
suma:=0;
for i:=1 to n do suma:=suma +s[i];
if suma<>n then
writeln( `graful nu este conex `);
else if gasit then writeln( ` graful are ce putin un ciclu `);
else writeln( ` este arbore `);
end. .
Mai jos este reprezentat grafic acelasi arbore in mai multe feluri. Ultimele 3 reprezentări sunt
făcute considerând pe rând ca vârf al arborelui nodurile 1,3,2. de asemenea ultimele trei
reprezentări justifica si denumirea data grafurilor conexe si fara cicluri, cea de arbori.
Teorema. Fie G un graf neorientat cu n noduri. G este arbore daca si numai daca g are n-1 muchii si nu
contine cicluri.
Demonstraţie :
Vom demonstra prin inducţie. Daca n=1,numarul muchiilor este 0(se verifica). Vom presupune
proprietatea adevărata pentru arbori cu n noduri(vom avea n-1 muchii). Fie un arbore cu n+1 noduri.
Exista cel putin un nod terminal(nod care are o singura muchie incident). Daca nu ar exista un astfel de
nod, arborele va contine cicluri(se contrazice definiţia). Eliminam nodul terminal si muchia care ii este
incident. Obţinem un arbore cu n noduri. Conform ipotezei făcute aceasta va avea n-1 muchii.
Înseamnă ca arborele cu n+1 noduri va avea n muchii(n- 1 +1).
Fie un graf cu n-1 muchii care nu contine cicluri. Rămâne de dovedit ca G este conex. Vom
demonstra prin reducere la absurd. Presupunem ca G nu este conex. Fie G 1, G2, .. ,Gp componentele
conexe. Fiecare dintre ele indeplineste conditiile:
415
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Rezulta ca fiecare dintre ele este arbore. Fie mi numarul muchiilor si ni numarul nodurilor fiecarui arbore
Gi. Avem mi=ni-1. Dar m1+m2+….+mp=n-1. Rezulta: n1-1+n2-1+…..np-1=n-1, deci n1+n2+…..+np=n+p-1.
Dar G are n noduri. Rezulta :n+p-1=n,deci p=1. In concluzie exista o singura componenta conexa care
nu contine cicluri. Deci G este arbore.
Ati reţinut, ca arborele poate fi privit ca avand un anumit varf ! Varf al arborelui poate
fi oricare nod al sau, deci si unul termial !
Fie G=(X,) un graf neorientat şi conex. Graful este dat prin matricea costurilor. Se cere să se
determine arborele de cost parţial minim (între oricare două noduri să existe un drum), iar în plus suma
muchiilor să fie minimă.
O problemă concretă, în care intervine problema enunţată, este cea a conectării oraşelor cu
cost minim.
Avem N oraşe precum şi costul conectării anumitor perechi de oraşe. Se cere să se genereze
muchii care asigură existenţa unui drum între oricare două oraşe astfel încât costul cuplării să fie
minim.
Pentru rezolvare se folosesc trei vectori:
-vectorul S, vector caracteristic. Avem S(I)=0 dacă nodul I nu aparţine arborelui construit şi
S(I)=1 în caz contrar;
-vectorul T reţine pentru fiecare nod care se adaugă arborelui nodul părinte al acestuia (cu
ajutorul acestui vector se poate reconstitui arborele);
-vectorul P reţine pentru fiecare nod C costul arcului de la părinte la el.
Prezentarea algoritmului.
P2) Se alege muchia de cost minim (L,C) care are o extremitate într-unul din nodurile
arborelui deja construit (S(L)=1), iar cealălaltă într-un nod care nu aparţine arborelui (S(C)=0). Se pune
T(C)=L şi P(C)=A(L,C);
416
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
3 2
5 2
5
2 1 5
4 3
4
Se porneşte cu nodul 1(v=1).
Alegem muchia de cost minim (1,2).
S=(0 0 2 2 1)
1
4
417
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
2 3
5
1
1
3
2 5
1
4
4
3
s=(0 0 0 0 0)
Am ales patru muchii şi s-a obţinut muchia de cost minim.
Configuraţiile finale ale vectorilor T şi P sunt:
1 2 3 4 5
T 0 1 4 2 1
P 0 2 4 1 3
Dacă pornim dintr-un alt nod, este posibil să obţinem un alt arbore dar şi el va avea costul
minim.
Demonstrarea algoritmului.
În urma aplicării algoritmului se obţine un arbore (vom avea N noduri şi N-1 muchii).
418
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Rămâne de demonstrat că acest arbore este de cost minim. Notăm cu Gk=(Xk,k) arborele
obţinut după alegerea a k muchii, cu k{1,2,…,N-1}. Fie G1 un arbore de cost minim. Fie M1,M2,
…,Mk primele k muchii găsite în urma aplicării algoritmului pentru arborele Gk+1. Considerăm că
muchia Mk este prima muchie care nu aparţine lui G1. Fie P şi Q cele două noduri unite de muchia Mk.
Este evident că în G1, cele două nu sunt unite direct (în caz contrar muchia Mk ar face parte din arborele
G1). Aceasta înseamnă că în G1, nodurile P şi Q sunt unite printr-un lanţ. Acest lanţ nu aparţine lui G k+1,
pentru că el împreună cu Mk ar forma un ciclu. Înseamnă că acest lanţ uneşte în G1 două noduri, P1 şi
Q1 cu P1Xk şi Q1Xk. În caz contrar dacă ar uni numai noduri din Xk înseamnă că Gkm ar conţine un
lanţ (conţine muchia Mk, care uneşte pe P şi Q, conţine şi restul lanţului din G1 pentru că primele k
noduri în G1 şi Gk sunt legate identic). Presupunem nodurile P1 şi Q1 unite prin muchia M1. Înlocuim
în G1 pe M1 cu Mk. În urma acestei înlocuiri,G1 se transformă într-un alt arbore G2. Dar
A(P,Q)A(P1,Q1) pentru că în caz contrar, prin logica algoritmului, s-ar fi ales muchia M1. Aceasta
înseamnă că arborele parţial G2 rămâne tot de cost minim. În plus G1 şi Gk+1 au k+1 muchii care
coincid. Repetăm procedeul până obţinem coincidenţa a n-1 muchii. Rezultă de aici că l-am
transformat pe G1 în arborele generat de algoritm fără a-i modifica costul. În concluzie arborele generat
de algoritm este de cost minim.
Program prim;
Type matrice=array[1..9,1..9] of integer;
vector=array[1..9]of integer;
var a:matrice;
s,t,p:vector;
n,I,j,k,v,min,l,c:integer;
begin
write(‘n=’); readln(n);
for l:=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;
write (‘nodul de pornire=’); readln(v);
for I:=1 to n do begin
s[I]:=0;
t[I]:=0;
p[I]:=0
end;
s[v]:=1;
for k:=1 to n-1 do begin
min:=30000;
for I:=1 to n do
for j:=1 to n do
if (s[I]=1)and (s[j]=0)and (min>a[I,j])then
begin
min:=a[I,j];
I:=I;
c:=j
end;
419
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
ARBORI SI ARBORESCENTE
Arbori
Noţiunea de arbore
Definiţie. Se numeşte arbore un graf orientat care este conex si nu conţine cicluri.
Problema. Se citeşte un graf sa se scrie un program care sa verifice daca este arbore.
420
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
1. Mai întâi trebuie văzut daca graful este conex. In cazul grafurilor orientate aceasta problema se rezolva printr-o
simpla parcurgere in adâncime (DF). Dar in cazul grafurilor neorientate? Aici apare o problema. De la nodul i la
nodul j exista doua arce, de la i la j si de la j la i. Aceasta conduce la semnalarea unui ciclu fals. Pentru rezolvarea,
după alegerea unei muchii ,de exemplu de la i la j se elimina muchia de la j la i. In final daca au fost atinse toate
nodurile(adică daca orice componenta a vectorului s retine numai 1) înseamnă ca graful este conex.
2. Trebuie analizat daca graful nu are cicluri. Aceasta problema se rezolva tot cu ajutorul parcurgerii in adâncime.
Parcurgerea asigura selecţia unei muchi o singura data. Daca graful are cel puţin un ciclu, atunci un nod este atins
de doua ori. Cum ne putem da seama ca aceasta are loc? simplu, daca a fost atins un nod i , după care s[i]=1.
program arbore ;
uses grafuri;
var s:array[1.. 50] of byte;
A:mat_ad;
gasit:boolean;
n,i,suma:integer;
procedure df_r(nod:byte);
var k:byte;
begin
s[nod]:=1;
for k:=1 to n do
if (a[nod,k]=1)
then
begin
a[k,nod]:=0;
if s[k]=0; then df_r(k)
else gasit:=true;
end;
end ;
begin
clrscr;
citiren( ` graf.txt `,a,n);
df_r(1);
suma:=0;
for i:=1 to n do suma:=suma +s[i];
if suma<>n then
writeln( `graful nu este conex `);
else if gasit then writeln( ` graful are ce putin un ciclu `);
else writeln( ` este arbore `);
end. .
Mai jos este reprezentat grafic acelasi arbore in mai multe feluri. Ultimele 3 reprezentări sunt
făcute considerând pe rând ca vârf al arborelui nodurile 1,3,2. de asemenea ultimele trei
reprezentări justifica si denumirea data grafurilor conexe si fara cicluri, cea de arbori.
421
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Teorema. Fie G un graf neorientat cu n noduri. G este arbore daca si numai daca g are n-1 muchii si nu
contine cicluri.
Demonstraţie :
Vom demonstra prin inducţie. Daca n=1,numarul muchiilor este 0(se verifica). Vom presupune
proprietatea adevărata pentru arbori cu n noduri(vom avea n-1 muchii). Fie un arbore cu n+1 noduri.
Exista cel putin un nod terminal(nod care are o singura muchie incident). Daca nu ar exista un astfel de
nod, arborele va contine cicluri(se contrazice definiţia). Eliminam nodul terminal si muchia care ii este
incident. Obţinem un arbore cu n noduri. Conform ipotezei făcute aceasta va avea n-1 muchii.
Înseamnă ca arborele cu n+1 noduri va avea n muchii(n- 1 +1).
Fie un graf cu n-1 muchii care nu contine cicluri. Rămâne de dovedit ca G este conex. Vom
demonstra prin reducere la absurd. Presupunem ca G nu este conex. Fie G 1, G2, .. ,Gp componentele
conexe. Fiecare dintre ele indeplineste conditiile:
Rezulta ca fiecare dintre ele este arbore. Fie mi numarul muchiilor si ni numarul nodurilor fiecarui arbore
Gi. Avem mi=ni-1. Dar m1+m2+….+mp=n-1. Rezulta: n1-1+n2-1+…..np-1=n-1, deci n1+n2+…..+np=n+p-1.
Dar G are n noduri. Rezulta :n+p-1=n,deci p=1. In concluzie exista o singura componenta conexa care
nu contine cicluri. Deci G este arbore.
Ati reţinut, ca arborele poate fi privit ca avand un anumit varf ! Varf al arborelui poate
fi oricare nod al sau, deci si unul termial !
422
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
- matricea de adiacenta;
- liste de adiacente.
2. O a doua forma de reprezentare a arborilor este legatura de tip TATA . arborele se
reprezinta sub forma unui vector t cu n componente: daca t[i]=k, atunci nodul i
este descendent al nodului k. Daca nodul i este varf, t[i]=0.
5 3 5 5 0 3 4 1 7--------- k
1 2 3 4 5 6 7 8 9 --------- t[i]
In mod evident, legatura de tip TATA este determinata si de nodul ales ca varf ! Daca, de exemplu
pentru acelasi arbor varful este 9, reprezentarea este alta. Este ca si cum „apucam” arborele de un nod
si celelalte cad !
035003 417
123456789
3.Codul lui Puffer(facultativ). Pentru a reprezenta un arbore oarecare se pot utiliza doi vectori, pe care-i
vom numi t-de la nodul terminal – si pt – de la parinte nod terminal. Modul in care acestia retin datele
423
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Se cauta cel mai mic nod terminal, acesta este retinut in vectorul t iar parintele sau este
memorat in vectorul pt.
Se obtine un nou arbore renuntand la nodul terminal si la muchia care-l uneste de parinte.
Procedeul se rea pana cand ramane un arbore cu un singur nod.
Exemplu .
Pentru arborele alaturat cel mai mic nod terminal este doi,iar parintele trei.
In noul arbore ,cel mai mic nod terminal este 6, iar parintele lui 6 este 3.
Cel mai mic nod terminal este 8, iar parintele sau este 1.
424
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Cel mai mic nod terminal este 1, iar parintele sau este 5.
425
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Prin logica altgoritmului nodul care ramane este cel mai mare adica nodul n. Acesta este ultimul
memorat in vectorul pt.Prin urmare, daca se cunoaste n sunt suficiente n-2 componente pentru vectorul
pt.
Foarte important! Vectorul t se poate reconstitui doar daca cunoastem vectorul pt. aceasta inseamna
ca un arbore cu n noduri a fost memorat doar printr-un vector cu n-2 componente!
Pentru reconstituirea vectorului t pornim de la pt,vom incepe prin a memora in pt, numarul n, pentru
componenta n-1. vectorul t se reconstituie prin formula:
i{1,2…n-1}
t[i]=min{kk{t[1]=t[2],…t[i-1],pt[i],pt[i+1]…pt[n-1]}}
- daca numarul se gaseste in pt[i],pt[i+1],…pt[n-1] inseamna ca nodul respectiv nu a fost eliminat pana
la pasul i, pentru ca este parinte.
- daca numarul se gaseste in t[1],t[2],…t[i-1] inseamna ca a fost extras la unul din pasii anteriori.
- dintre nodurile care nu se gasesc ca mai sus , la pasul i a fost extras nodul minim.
Pasul 2
T={2}
Pt={3 3 5 1 5 4 7,9}
Se alege 6.
Pasul 3.
T={2 6 }
Pt={3 3 5 1 5 4 7,9}
Se alege 3.
426
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Programul care urmeaza citeste de la tastatura n si pt, dupa care tipareste vectorul t.
Program puffer;
Var t,pt:array[1..50] of byte;
Var i,j,k,n:byte;
Gasit:boolean;
Begin
Write(`n=`);readln(n);
For i:=1 to n-2 do begin
Write(`pt[`,i,`]=`);readln(pt[i]);
End;
Pt[n-1]:=n;
K:=n;
For i:=1 to n-1 do
Begin
K:=1;
Repeat
Gasit:=false;
For j:=1 to i-1 do
If t[j]=k then
Gasit:=true;
If not gasit
Then
For j:=1 to n-1 do
If pt[j]=k then
gasit: = true;
if gasit then k:=k+1;
until not gasit;
st[i]:=k;
end;
for i:=1 to n-1 do
write(t[i],` `);
end.
Foarte important. Cati arbori cu n noduri exista? Vectorul pt are n-2 componente si
fiecare componenta poate retine valori intre 1 si n. Deci exista n n-2 arbori cu n noduri.
Pornind de la u un arbore ,i se asociaza prin codul lui Puffer un vector cu n-2
componente. Se arata usor ca daca arborii sunt diferiti codificarea lor este diferita. Tot
asa, pornind de la un vector cu n-2 componente, unde fiecare ia valori intr 1 si n se
ajunge la un arbore. Cu alte cuvinte am definit o functie f pe multim,ea arborilor care
ia valori in produsul cartezian:
(1,2,…n)*(1,2,…n)*…(1,2,…n)
Din cele aratate rezulta ca f este bijectiva. Prin urmare tinand cont de faptul ca functia
este definita pe o multime finita,numarul de elemente al codomeniului este egal cu
numarul de elemente al domeniului de definitie. Aceasta explica modul in care a fost
determinat numarul de arbori
Codul lui pruffer asociaza acelasi cod arborelui indiferent de reprezntarea grafica
folosita.
427
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Arbori
Arbori binari
Definitie
Un arbore cu propietatea ca fiecare nod cu exceptia frunzelor , are cel mult doi descendenti
(succesori )
se numeste arbore binar.
Intr-un arbore binar ,cei doi succesori ai unui nod (daca exista), se numeste succesor stang
respectiv arbore drept.
Definitie
Un arbore cu propietatea ca fiecare nod ,cu exceptia frunzelor , are exact doi descendenti
(succesori) se numeste arbore binar complet .
Notiunea de arborescenta
428
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Daca un graf orientat este tare conex, atunci el este conex, dar reciproca nu este
adevarata. Graful de mai sus este conex.
Definitie. Un graf orientat admite un ciclu daca exista un mod i, pentru care exista un lant de la i
la i.
Definitie. Un graf orientat este arbore daca nu este conex si nu admite cicluri.
Exemple:
Definitie. Un graf orentat g=(x,) admite o radacina vx daca pentru orice xx-(v) exista un drum
(atnete, nu lant) de la v la x.
Exemple:
429
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Definitie. Se numeste arborescenta un graf orientat care indeplineste simultant doua conditii :
1.Este arbore;
2.Admite radacina.
Intr-o arborestenta radacina este unica. Daca de exemplu exista doua radacini v 1 si v2 atunci exista
drum de la v1 la v2 si de la v2 la v1. aceasta presupune existenta unui ciclu, deci nu este arbore.
De regula, atunci cand se da o arborescenta se preciaza radacina sa.
Se observa ca din radacina pleaca arce, nu intra. Daca ar si intra s-ar obtine un ciclu.
de asemenea, orice nod are un singur predecesor. Daca, prin absurd, ar avea doi sau mai multi, s-ar
obtine un ciclu care include radacina.
Problema. Se citeste un graf orientat. Acesta este dat prin matricea de adiacenta.se cere ca programul
dv. sa decida daca graful este sau nu oarborescenta. In caz afirmativ, se va tipari radacina acesteia.
430
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Rezolvare.
1. Tebuie decis mai intai daca graful orientat este arbore. Acesta se face printr-o singura
parcurgere in adancime,asemanator cu altgoriymul aplicat in cazul grafurilor orienta.
2. In cazul cand graful este arbore , trebuie vazut daca acesta are o radacina. Se testeaza, pe
rand, fiecare nod daca indeplineste conditia de radacina. Fiecare test se face printr-o
parcurgere in adancime pornind de la nodul respectiv.
Program arborescent;
Uses grafuri;
Var s:array[1..50] of byte;
A,b:mat_ad;
Gasit,ok,radacina:boolean;
N,i,suma,r:integer;
Procedure df_r(nod:byte);
Var k:byte;
Begin
S[nod]:=1;
For k:=1 to n do
If (a[nod,k]=1) or (a[k,nod]=1)
Then
Begin
A[k,nod]:=0;a[nod,k]:=0;
If s[k]+0 then df_r(k)
Else gasit:=true;
End
End;
Procedure df_r1(nod:byte);
Var k:byte;
Begin
S[nod]:=1;
For k:=1 to n do
If(a[nod,k]=1)and(s[k]=0)
Then df_r1(k)
End;
Begin
Citire(‚graf.txt’,a,n);
B:=a; df_r(1); suma:=0;
For i:= 1 to n do suma:=suma=s[i];
If suma<>n then writeln(‚graful nu este conex’)
Else writeln(‚graful este conex’);
If gasit then writeln(‚graful are cel putin un ciclu’)
Else writeln(‚graful nu are cicluri’);
If (suma=n) and not gasit
Then
Begin
Writeln(‚este arbore’);ok:=true;
End;
A:=b;
If(ok)
Then
Begin
R:=1;
Repeat
Suma:=0;
For i:=1 to n do s[i]:=0;
431
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Df_r1( r ) ;
For i:=1 to n do suma:=suma +s[i];
If suma=n
Then
Begin
Writeln(‚radacina este’,r);writeln(‚este arborescenta’);
Radacina:=true;
End
Else r:=r+1;
Until (radacina) or (r>n);
If not radacina then writeln(‚nu are radacina’)
End
End.
Arbori binari
Programatorii folosesc de multe ori prin abuz de limbaj, termenul de arbore, in loc de arborescenta.
In astfel de cazuri se specifica radacina care se mai numeste si varf si se considera ca sensul arcelor
este implicit,motiv pentru care nu se mai reprezinta grafic.
In cazul in care arborescenta are cel mult doi descendenti, unul stang si unul drept, spunem ca avem
un arbore binar.
432
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Exemplu. Mai jos vedeti o arborescenta cu radacina 1 care este un arbore binar. Alaturat obs. Modul in
care se reprezinta grafic renuntand la sensurile arcelor, care sunt implicite.
433
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Un arbore binar poate fi reprezentat cu ajutorul a doi vectori, pe care ii vom numi st (de la stanga ) si dr
(de la dreapta). Pentru fiecare nod i dintre cele n, st[i] retine nr. de ordine al nodului stang subordonat
de i, iar dr[i] retine nr de ordine al nodului drept subordonat de i. Daca nu exista nod subordonat retine
0.
st 2 4 5 0 0 0 0
1 2 3 4 5 6 7
dr 3 0 6 0 7 0 0
Programul va retine doar adresa radacinii (varfului). In aplicatii veti intalni numeroase exemple in acest
sens, motiv pentru care ne oprim aici cu aceasta reprezentare.
434
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Aceasta a mai fost prezentata in cazul arborilor neorientati. Mentionam doar faptul ca aceasta
reprezentare este neconvenabila in majoritatea aplicatiilor.
In scopul prelucrarii,este necesar ca nodurile arborelui binar sa fie vizitate. Axista mai
multe modalitati de parcurgere a arborilor binari carer difera prin ordinea de vizitare
a nodurilor.
435
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
124000350700600
436
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Atat pentru introducerea arborelui, cat si pentru parcurgeri s-au utilizat tehnici
437
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Italic – înclinat,
Underline – subliniat;
alegerea unui anumit tip de caracter (Font) şi a mărimii acestuia (Size);
introducerea textului;
alinierea automată a textului:
la stânga (Left),
la dreapta (Rigth),
la centru (Center) sau
aliniere “la stânga şi la dreapta” (Justify);
inserarea în text a imaginilor; inserarea de tabele, grafice;
tipărirea documentului.
Prima grijă pe care trebuie să o avem când redactăm un document este de a
stabili tipul de pagină, marginile textului faţă de marginile paginii (încadrarea
documentului în pagină). După ce ne-am stabilit aceste caracteristici, putem să ne
concentrăm atenţia asupra următoarelor aspecte privind textul:
stabilirea tipului de caractere (font);
stabilirea dimensiunii font-ului;
numerotarea paginilor, ş.a.
FEREASTRA DE EDITARE
438
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Observaţii.
Oricare dintre opţiunile oferite de Bara de meniu general poate fi selectată direct cu
tastatura prin apăsarea tastei Alt simultan cu litera subliniată.
Cu mouse-ul, opţiunea dorită se selectează prin poziţionarea acestuia pe textul opţiunii şi
apăsarea pe butonul stâng.
Autorul şi-a propus o prezentare necesară şi suficientă pentru realizarea unor documente
corecte şi frumos prezentate.
O parte dintre facilităţile oferite prin opţiunile descrise anterior vor fi prezentate în această
carte, iar pentru celelalte urez succes celor care vor să se perfecţioneze în Word pentru
perseverenţa de a descoperi şi alte facilităţi.
Această bară, care poate să se întindă pe mai multe linii, conţine butoane a căror
apăsare ne conduce rapid spre o opţiune oferită de editorul Word prin meniurile sale descrise
anterior. Oricare dintre butoanele afişate pe ecran se află printre opţiunile meniurilor din bara
de meniu general.
439
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Butoanele afişate pe ecran pot fi cele standard, prezente de obicei imediat sub bara
de meniu general, dar utilizatorul îşi poate alege şi alte butoane care să fie afişate pe ecran, în
funcţie de preferinţele sale de lucru (butoane pentru desene, tabele, lucrul pe Internet, ş.a.).
Exerciţii.
1
3 Creare document
nou
2
Creare document nou
440
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
1 2
3
Popescu Carol Flaviu
Str. Ec Teodoroiu nr. 15
Timşoara.
Margins:
- Left - la stânga ;
- Rigth - la dreapta;
441
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
- Top - sus;
- Bottom - jos.
Deschiderea unui document existent se face printr-una din cele trei metode
de mai jos, primele două fiind reprezentate în figura care urmează:
1
Deschiderea unui
document creat
2
anterior
Deschiderea unui
document creat
anterior
Discul pe care
căutăm documentul;
Numele documentului;
Tipul documentului
442
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Folder Fişier
Documentele 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.
- SAVE - este utilizat pentru a da un nume documentului care este editat în acel moment. Pot fi
salvate mai multe versiuni ale aceluiaşi document (alegând opţiunea SAVE VERSION …). Se poate stabili
exact locul (folder-ul) unde sã se facã salvarea, cu opţiunea SAVE IN.
- SAVE AS - permite salvarea unui document existent şi sub un alt nume, de fapt executã o copiere a
fişierului existent.
443
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Dacă salvăm un document pentru prima dată, într-o fereastră dialog este solicitat
numele documentului.
1
Butonul Save
2
Opţiunea Save
Dacă documentul pe care îl edităm suferă prima operaţie de salvare, pe ecran apare o
fereastră de dialog ca în figura de mai jos, unde se va specifica numele pe care îl va primi
documentul.
Numele documentului
2 Butonul Print
1 Opţiunea Print
444
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
În urma efectuării uneia din operaţiile enumerate, pe ecran apare o fereastră de dialog, în care trebuie
să fixăm:
1 Tipul imprimantei
Caracteristicile
4
imprimantei
3 Nr. de copii
2
Ce tipărim
alegerea opţiunii Properties conduce la apariţia ferestrei de dialog din figura de mai
jos, ce va permite selectarea caracteristicilor imprimantei.
Calitatea imprimării
445
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Prin selectarea opţiunii Print Preview… din meniul File sau a butonului din
bara de butoane standard, vom vizualiza documentul înainte de trimiterea spre imprimantă.
Exerciţii.
Facilităţi de editare
Marcarea unei secvenţe dintr-un text.
Această operaţie are ca efect selectarea unui fragment de text în vederea efectuării
de operaţii asupra lui. Marcarea se realizează în două moduri:
folosind tastatura:
se poziţionează cursorul de scriere înaintea caracterului de început al
textului pe care dorim să-l marcăm;
cu tasta Shift apăsată simultan cu una din săgeţi, deplasăm cursorul până
la sfârşitul secvenţei de text pe care o marcăm.
folosind mouse-ul:
se poziţionează cursorul înaintea caracterului de început al textului pe
care dorim să-l marcăm;
cu butonul stâng al mouse-ului apăsat, deplasăm cursorul spre sfârşitul
secvenţei de text.
446
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Prin inserare înţelegem aducerea conţinutului din clipboard în locul unde se află
poziţionat cursorul în document. Inserarea unei secvenţe de text se poate face astfel:
Mutarea unei secvenţe de text marcat înseamnă ştergerea textului marcat din locul
unde se află şi copierea lui în Clipboard.
Meniul Edit, prin selectarea opţiunii Find, ne permite căutarea şi înlocuirea unor şiruri
de caractere sau cuvinte.
Căutare cu înlocuire
În tabelul de mai jos veţi găsi efectele produse de apăsarea unor taste sau combinaţii
de taste:
Tasta Efectul
Deplasare cursor cu un caracter spre dreapta
447
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Caps Lock Comută între folosirea tastelor ca litere mici sau mari. De obicei se
lucrează cu litere mici.
Shift - Dacă tastatura este setată pe litere mici (Caps Lock inactiv), prin
apăsarea simultană a tastei Shift şi a unei litere, se obţine litera mare,
iar pentru cifre – se obţine caracterul de sus inscripţionat pe tastă.
- Dacă tastatura este setată pe litere mari (Caps Lock activ), prin
apăsarea simultană a tastei Shift şi a unei litere, se obţine litera mică
End Sfârşitul liniei curente
Home Începutul liniei curente
PgUp Un ecran în sus
PgDown Un ecran în jos
Ctrl+Home Începutul documentului
Ctrl+End Sfârşitul documentului
Exerciţii
Formatarea caracterelor
Pentru formatarea caracterelor trebuie să stabilim:
448
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Pentru formatarea textului unui document putem folosi opţiunile Font şi Paragraph din
meniul Format.
449
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Exerciţii
1. Scrieţi un document în care fiecare paragraf să difere de celelalte prin : stil, font sau
culoare.
2. Modificaţi în text culoarea de scriere pentru toate cuvintele de început de paragraf.
3. În documentul în care lucraţi scrieţi o pagină în care fiecare paragraf să difere de
celelalte prin modul de aliniere a textului: aliniere la stânga ( Left ); aliniere la dreapta
( Rigth ); aliniere centrată ( Center ); aliniere “la stânga şi la dreapta” (Justify).
De cele mai multe ori dorim să obţinem un document mai deosebit, care să conţină
imagini grafice, texte artistice sau formule matematice. Acestea dau documentului un aspect
deosebit.
Prin obiecte grafice înţelegem imagini grafice, texte artistice, formule matematice,
ş.a.
Trasarea săgeţilor.
De pe bara Drawing alegem butonul pentru trasare săgeţi şi trasăm săgeata dorită.
Modificarea săgeţilor.
450
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Umbre.
Setarea umbrelor
Efecte 3-D
Alte butoane.
După ce am
derulat meniul Insert, ne
deplasăm cu bara de
opţiuni pe Clip Art… şi
executăm dublu-clic pe
butonul stâng al mouse-
ului sau apăsăm tasta
Enter.
451
Vom avea plăcerea să ne alegem din colecţia de imagini desenate oferite de Clip
Art şi afişate pe ecran ca în figura alăturată:
Iată cum procedăm: după ce am găsit-o printre imaginile din Clip Art, o selectăm şi :
fie executăm dublu-clic pe butonul stâng al mouse-ului,
fie apăsăm tasta Enter după poziţionarea pe opţiunea Insert,
fie executăm dublu-clic pe butonul stâng al mouse-ului după poziţionarea pe
opţiunea Insert.
În urma operaţiilor efectuate, imaginea dorită va fi inserată în documentul pe
care-l realizăm.
Odată inserată imaginea în document, ne interesează să o ajustăm la anumite dimensiuni, să o
aşezăm în pagină în anumite locuri, să o copiem în mai multe locuri, ş.a.
Operaţiile amintite anterior se pot realiza dacă vom şti următoarele:
1. Cum se selectează o imagine
2. Cum se copiază o imagine
3. Cum se mută o imagine
4. Cum se şterge o imagine
5. Cum se redimensionează o imagine
Selectarea unei imagini inserate în document se realizează prin dublu-clic pe butonul stâng al
mouse-ului când cursorul
mouse-ului se află în
interiorul imaginii.
Selectarea imaginii va fi
evidenţiată în document prin prezenţa
unor pătrate de marcare a figurii
selectate care marchează suprafaţa
ocupată de imagine.
Operaţiile 2 şi 3 (Copy,
Move) se realizează prin intermediul
Clipboad-ului, la fel ca în cazul
textelor selectate, numai că în acest caz
operaţiile se fac asupra unei imagini
selectate.
Pătrate de marcare a figurii selectate
Exerciţii
1. Descrieţi în cuvinte cum se realizează copierea unei imagini.
2. Descrieţi în cuvinte cum se realizează mutarea unei imagini.
3. Ce obţineţi prin folosirea opţiunii Paste din meniul Edit?
452
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
OBSERVAŢII.
Dacă poziţionăm cursorul mouse-ului pe pătratele din colţurile figurii, vom obţine o
deformare proporţională.
Dacă poziţionăm cursorul mouse-ului pe pătratele din unul dintre mijloacele laturilor
figurii, vom obţine o deformare neproporţională.
Exerciţii
1. Scrieţi o scrisoare pe hârtie format A4, cu marginile de 1,84 cm. Inseraţi din Clip
Art un PORUMBEL;
2. Concepeţi o felicitare de 8 Martie
3. În documentul ales anterior pentru explicaţii apare textul FELICITARE, scris cu
efecte speciale.
Observaţii.
Editare text
453 Formatul
Word-art-ului
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Inserarea de tabele
Linie
Celulă
Coloană
Când dorim să inserăm un tabel într-un document, mai întâi vom deplasa
cursorul în locul în care dorim să fie inserat tabelul.
Inserarea propriu-zisă a tabelului se poate face în mai multe feluri:
Folosirea opţiunii Insert Table… duce la apariţia unei ferestre de dialog Insert Table
în care putem selecta:
Numărul de coloane;
Numărul de linii;
Dimensiunea coloanelor;
Un format predefinit de tabel cu care este înzestrat
Word-ul.
454
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
O altă formă de inserare a unui tabel se poate face prin alegerea butonului
Tables and Borders pentru care butonul mouse-ului se transformă într-un creion cu care se
poate desena un tabel cu mâna.
Butonul Insert Table din bara de butoane standard permite inserarea unui tabel.
Selectarea butonului determină apariţia unei casete modificabile care simulează un tabel,
unde, prin menţinerea apăsată a butonului stânga al mouse-ului se pot stabili numărul de linii
şi coloane ale tabelului.
Rigleta cu marcajul
Marcajul pentru linii pentru coloane
Celula activă
455
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Exerciţii
1. Creaţi un tabel cu următoarea structură:
Date personale
Nume şi prenume
Data naşterii Adresa Telefon
1. Ionescu Andrei 01.01.1985 Str. Victoriei, Nr.2 212212
2. Vlad Liviu 15.03.1987 Str. 1 Decembrie 1918 213456
2. Inseraţi două linii în acest tabel, iar după aceea ştergeţi o coloană, de exemplu: Telefon.
10.2 Editorul de foi Microsoft Excel
EXCEL
Bara de meniuri
Bare cu
instrumente
Bara de formule
Capetele coloanelor
Selector
Capetele rândurilor
Suprafaţa foii
de calcul 456
Bara de stare
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
activităţii curente) şi bare cu instrumente (care conţin butoane şi liste derulante prin
care se obţine un acces rapid la comenzile şi facilităţile utilizate frecvent).
Fig. 3.1. Elementele ferestrei Excel
Introducerea textului
Textul este o combinaţie de litere, cifre şi spaţii. În configuraţia prestabilită, textul este aliniat
automat la stânga, în interiorul celulei.
Pentru a introduce text într-o celulă:
1. Se execută clic pe celula în care se doreşte introducerea textului.
2. Se introduce textul. Pe măsură ce este scris textul, acesta apare în celulă şi pe bara de
formule.
3. Se apasă tasta Enter. Textul introdus va apărea în celulă, aliniat la stânga. Dacă s-a făcut o
greşeală şi se doreşte renunţarea la datele introduse, se va apăsa tasta Esc.
457
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Introducerea cifrelor
Numerele care se pot introduce pot conţine caracterele numerice 0-9 şi următoarele caractere
speciale: + - / . , ( ) $ %. Aceasta înseamnă că se pot include virgule, puncte zecimale, semnul dolarului,
procent şi paranteze, împreună cu valorile introduse.
Deşi se pot include şi semnele de punctuaţie atunci când se introduc datele, nu este obligatoriu
să se facă acest lucru. De exemplu, în loc să se scrie nişte sume în dolari pe o coloană şi să se includă
semnul dolarului, virgule şi puncte zecimale, se pot scrie direct numerele, de exemplu 700 sau 81546,
iar apoi să formataţi coloana folosind opţiunea de formatare pentru valută. Excel va transforma valorile
introduse în $700.00 şi $81,546.00 sau în $700 şi $81546, în funcţie de numărul zecimalelor specificate.
Pentru a introduce un număr:
1. Se execută clic pe celula în care se introduce numărul.
2. Se introduce numărul. Pentru a introduce un număr negativ, se plasează în faţa lui un semn
minus, sau se trece numărul între paranteze. Pentru a introduce o fracţie, se plasează înaintea ei un 0,
de exemplu 0 1/2 (în caz contrar, Excel va interpreta intrarea ca pe o dată calendaristică).
3. Se apasă tasta Enter, iar numărul introdus va apărea în celulă aliniat la dreapta.
458
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
459
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Ordinea operaţiilor
Excel efectuează calculele din cadrul unei formule în următoarea ordine:
I. Operaţiile dintre paranteze
II. Ridicarea la putere
III. Înmulţiri şi împărţiri
IV. Adunări şi scăderi
Introducerea formulelor
Pentru a introduce formula de la tastatură se efectuează paşii următori:
1. Se selectează celula în care va apărea rezultatul formulei.
2. Se scrie semnul egal (=).
3. Se scrie formula. Aceasta va apărea pe bara de formule.
4. Apăsând tasta Enter Excel va calcula rezultatul.
460
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
461
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Custom 00.0%
(Personalizat)
462
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Crearea diagramelor
Tipuri de diagrame
În Excel se pot crea diferite tipuri de diagrame. Tipul ce va fi ales depinde de datele ce trebuie să
fie reprezentate. Principalele tipuri de diagrame, împreună cu destinaţia lor, sunt:
Pie (circulară) Se foloseşte acest tip pentru a reprezenta relaţia dintre părţile unui întreg.
Bar (bară) Acest tip se foloseşte pentru compararea valorilor într-un anumit moment.
Column (coloană) LA fel ca diagrama de tip bară, se poate folosi pentru evidenţierea
diferenţelor dintre elemente.
Line (linie) Se foloseşte pentru a sublinia tendinţele de evoluţie şi variaţia valorilor în timp.
Scatter (prin puncte) La fel ca diagrama liniară se foloseşte pentru a sublinia diferenţa dintre
două seturi de valori.
Area (zonală) La fel ca diagrama liniară se foloseşte pentru a sublinia amploarea variaţiei
valorilor în timp.
Majoritatea acestor tipuri de diagrame există şi în variante tridimensionale. Pe lângă faptul că au
un aspect mai profesionist decât diagramele standard, bidimensionale, diagramele 3-D sunt mai
relevante pentru diferenţele dintre seturile de date.
Terminologie specifică
463
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
464
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
465
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Domeniu de utilizare
Denumire
Chart Objects Executând clic aici se va putea selecta partea din diagramă care se va modifica. Se poate, de
asemenea, executa clic pe secţiunea vizată, pentru a o selecta.
Format Object Se execută clic aici pentru a modifica atributele de formatare ale obiectului a cărui denumire
apare în caseta de text Chart Objects.
Chart Type Se execută clic pe săgeată pentru a schimba tipul de digramă – de exemplu, din diagramă de
tip bară, în una de tip linie. Dacă se execută clic direct pe buton, va fi aplicat tipul de diagramă
afişat.
Legend Se execută clic pe aceasta pentru a afişa sau a ascunde o legendă.
Data Table Se execută clic pe aceasta pentru a introduce un tabel de date, sau o altă structură care
conţine datele ce stau la baza diagramei.
By Row Se execută clic pe acesta dacă seriile de date sunt structurate pe rânduri.
By Column Se execută clic pe acesta dacă seriile de date sunt aranjate pe coloane.
Angle Text Downward Se execută clic pe acest pentru a înclina textul în jos.
Angle Text Upward
Se execută clic pe acesta pentru a înclina textul în sus.
Obs.1: cele expuse mai sus sunt echivalente cu :File /New / avem optiunile ( general ;
presentation design fundal strategie template ; presentation fundal organizare ; Web
pagesfacilitati internet ).
Obs.2 : ca la Word avem submeniurile : Tools / Spelling ( verifica ortografia ); Tools / language
( aleg tipul de dictionar ); Tools / style checker ( verifica dintr-o data punctuatia , gramatica ,
claritatea ,/Options imi stabileste conditiile ) ,Tools / auto correct ( ne corecteaza greselile ce
le fac de regula ); Tools customize ( se definesc meniurile , iconurile si comenzile );Tools
/Options optiuni pt vizualizare , editare , tiperire , salvare , gramatica .
Tools / Add Ins activez meniurile ce lipsesc ca in Excel ); Tools / macro cu optiunile : macros
( aleg macroul ce-l aplic 0;record new macro ( creez un macro ) ca in Excel.
Daca cand pornesc calculatorul aleg “ auto contents wizard “( strategie ) ; next , tipul
prezentarii , numele autorului si celui ce prezinta enter .
Obs.3: in meniul Format avem submeniuri asemanatoare cu cele din Word : font , bullet ,
alignment , line spacing ).
466
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
In meniul FORMAT mai avem submeniurile : replace font ( ce tip de font inlocuim si cu ce ;
slide layout ( aleg un tip de diapozitiv ) ,slide color scheme ( schimbarea
fundalului ) ,background ( validez “omit background graphics from master , aleg fill effects ,
apply ) ; apply design ( stil de scris pe diferite niveluri ) .
Crearea unei noi prezentari File /new / presentation design / aleg tipul sablonului / O.K.
Daca fac clic pe dreapta pe un obiect ( chiar text ) avem optiunile : cut , paste , copy ( ca la
word ) , format auto shape ( fundal pt. obiect ); action settings / aleg “mouse Clink” si run
program unde cu Browse aleg un program executabil ; custom animation (efecte de
animatie la textul selectat ); set autoshape defaults anuleaza modificarile facute ) ; grouping
( grupari de elemente ); order ( pozitionarea pe straturi ) ; exit edit text ( iese din modul editare ).
Moduri de vizualizare : slide ( diapozitiv ); outline ( sinteza ) ; slide sorter ( sortare diapozitiv );
slide show ( pe tot ecranul ), toate astea sunt submeniuri ale submeniului VIEW.
Obs.4 : salvarea , inchiderea , deschiderea unui document se face ca in word (imprimarea ).
Marirea diapozitivelor – latime , inaltime , de unde incepe numerotarea se stabileste de la
File / page setup .
Editarea unui diapozitiv principal View / master/ slide master de la care se imprumuta
caracteristici catre alte diapozitive .
11.Reţele. Internet
11.1 Reţele de calculatoare, clasificarea reţelelor, protocoale
de reţea (noţiuni generale)
Structura reţelelor de calculatoare
Două sau mai multe calculatoare pot să facă schimb de date între ele prin două modalităţi:
On line – schimbul de date realizându-se prin intermediul unui cablu electric sau linii de
comunicaţie.
O reţea se formează atunci când mai multe PC sunt conectate unele la altele, astfel încât să
poată comunica între ele.
Dacă reţeaua este compusă din PC aflate în acelaşi loc este numită reţea locală (LAN).
Acestea sunt calculatoare care de obicei se afla în acelaşi departament, secţie de lucru sau sediu de
firma. O reţea locală a unei firme este denumită intranet, pentru a face distincţia de internet. Accesul la
intranet este în general limitat la angajaţii unei firme. Informaţiile existente în intranet sunt informaţii ale
firmei, şi deci intră din punct de vedere juridic şi organizatoric sub incidenţa secretului de serviciu.
467
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
In cazul în care calculatoarele sunt răspândite pe o arie mult mai mare, reţeaua este numită
reţea de mari dimensiuni (WAN). Aceste reţele pot fi alcătuite din calculatoare aflate în oraşe sau ţări
diferite.
Majoritatea reţelelor sunt formate din câte un server şi clienţii conectaţi la reţea.
O reţea de calculatoare oferă o gamă largă de avantaje, printre care putem enumera:
Resursele pot fi partajate între calculatoare (de exemplu modemuri, imprimante, etc);
Intr-o reţea locală de componente similare (tip Peer-to- peer) toate staţiile de lucru sunt
interconectate şi partajează imprimantele, fişierele, dosarele şi alte resurse. Toate persoanele care
folosesc reţeaua îşi salvează fişierele în propriile calculatoare, ceea ce face ca gestionarea fişierelor să
fie dificilă. Aceste reţele nu trebuie să includă mai mult de 10 calculatoare.
Intr-o reţea client-server, informaţiile sunt stocate mult mai eficient, prin intermediul calculatorului
principal folosit ca server de fişiere, în care toţi utilizatorii reţelei îşi salvează propriile date. Serverul de
fişiere este de regulă un calculator ce se află de obicei într-o cameră specială separată şi nu este folosit
individual.
Utilizatorii trebuie doar să ştie să se conecteze la reţea şi să acceseze resursele care sunt puse
la dispoziţie de către administrator. In Windows 95, dacă este folosită o reţea, pe suprafaţa de lucru
apare pictograma denumita Network Neighborhood, care prin activare afişează punctele de acces la
calculatoarele şi imprimantele din reţea. Dosarul Entire Network, a cărui pictogramă apare în dosarul
Network Neighborhood, afişează punctele de acces la resursele de calculatoare din afara grupei de
lucru.
După deschiderea ferestrei Network Neighborhood, se execută dublu clic pe un server sau alt
calculator din fereastră, pentru a vedea ce resurse sunt la dispoziţie pentru solicitant. Apoi se activează
dosarul sau un periferic cu care se lucrează ca şi cum ar aparţine calculatorului solicitant. Pentru
aceasta se foloseşte bara orizontală superioară.
Pentru închiderea ferestrei Network Neighborhood se foloseşte aceeaşi metodă ca pentru orice
fereastră Windows 95, selectând din meniul File opţiunea Close din meniul ferestrei sau executând clic
pe butonul Close (X) din coltul din dreapta sus al ferestrei. Inchiderea ferestrei nu determină
deconectarea de la reţea, decât atunci când se comandă întreruperea legăturii sau este închis
calculatorul.
468
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
a. Scurt istoric
In 1986, Fundaţia Naţională pentru ştiinţă a SUA a creat NSFNET (National Science Fondation
Network) pentru a conecta supercalculatoarele de mare viteză din SUA, aceasta din raţiuni ştiinţifice.
Această ultimă reţea a preluat şi reţelele ARPAnet.
Dezvoltarea reţelei Internet a fost spectaculoasă, astfel că în 1985 erau conectate aproximativ
2.000 de calculatoare, în 1997 cca. 9 milioane de calculatoare.
In prezent oricare posesor al unui calculator conectat la o linie telefonica poate avea acces la
Internet.
World Wide Web (WWW) sau pe scurt Web, este uriaşă colecţie de documente care conţin
informaţii ce sunt păstrate pe calculatoare răspândite în toată lumea. WWW a fost creat în
Elveţia la Centre Europeen de Recherche Nucleare (CERN). Documentele sunt create cu o
tehnologie specială, numită hipertext. Mulţi pun semnul egalităţii între Internet şi Web,
întrucât Web-ul are cea mai mare pondere în serviciile Internet. De altfel a apărut expresia Surf
in Web, care înseamnă plimbare prin Internet.
Use Net, protocol ce poate fi folosit pentru cuplarea la grupurile de discuţii, pentru a colabora
cu alţi colaboratori conectaţi la Internet.
Internet Relay Chat, poate fi folosit pentru a purta conversaţii în direct, chiar se pot organiza
conferinte video şi audio.
469
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Internet protocol (IP), fiind cel mai simplu protocol de comunicare între calculatoare;
Transmission Control Protocol (TCP), care este mai performant decât cel de mai sus
întrucât asigură corectarea erorilor de transmisie.
Deoarece cele două protocoale prezentate mai sus sunt folosite de regulă împreună, ele sunt
menţionate mereu împreună sub forma TCP / IP.
File Transfer Protocol (FTP), defineşte modul în care este transferat un fişier generic dintr-
un calculator în altul. fişierul poate fi de forma: document, program, o imagine, etc.
Hyper Text Markup Language (HTML), care defineşte o metodă de adăugare a atributelor
de formatare în fişierele de text, pentru a fi vizualizate fişierele de text citite ca nişte titluri,
paragrafe centrate şi imagini înglobate.
Hyper Text Transfer Protocol (HTTP), defineşte modul în care calculatoarele transmit
fişierele HTML în ambele direcţii.
WWW este o colecţie de milioane de documente cu diferite informaţii care sunt păstrate pe
calculatoare răspândite în întreaga lume. Pentru a uşura accesul la aceste informaţii se dau în
continuare câteva definiţii:
Situl Web este o colecţie de pagini Web, care aparţin aceleaşi instituţii sau persoane;
Pagina sursă (Home Page) este pagina principală dintr-un sit Web;
Hipertextul reprezintă metoda folosită pentru a organiza informaţia în reţeaua Web.
Folosindu-se această metodă, textele sau imaginile evidenţiate într-un document reprezintă
trimiteri la alte documente care conţin informaţii suplimentare;
Hypermedia reprezintă o extindere a metodei hypertext, prin care trimiterile sunt extinse şi la
alte medii cum sunt sunetele şi imaginile video;
URL (Uniform Resource Locator) reprezintă adresa unei locaţii cu informaţii din reţeaua
Internet. Aceasta este formată din trei părţi:
Numele protocolului. Precizează tipul resursei Internet. In tabelul 8.3 sunt prezentate
câteva tipuri de resursă.
Numele gazdei. Prezintă numele calculatorului pe care este stocată informaţia.
Calea fişierului. Precizează numele fişierului în care se găseste informaţia şi calea de
cataloage până la catalogul în care se află fişierul.
Browserul este un program care ajută la găsirea şi citirea informaţiilor în documentele html
ale reţelei Web şi asigură următoarele operaţii mai importante:
470
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Internet Explorer a fost creat de Microsoft şi inclus în sistemele de operare Windows 95
şi 98.
Netscape Navigator, care a fost creat de Netscape Communication Corporation, poate fi
folosit în sistemele windows 95 şi 98.
Poşta Internet – Email-ul este o formă modernă de comunicare, ce combină rapiditatea unui apel
telefonic cu înregistrarea şi expedierea unei scrisori. Transmiterea scrisorii durează doar câteva
secunde, iar destinatarul poate răspunde când doreşte şi în plus nu trebuie contactat direct destinatarul
pentru transmiterea scrisorii.
Un alt avantaj al poştei electronice este preţul scăzut al abonamentului, de cca. 2…3 $ pe lună şi
respectiv costul scăzut al transmisiei şi recepţiei scrisorilor prin E-mail, care se taxează pentru
impulsurile telefonice de câteva secunde dintre abonat şi server, server care se află de obicei în acelaşi
oraş cu abonatul.
O adresă de E-mail are două părţi, Prima parte este numele utilizatorului sau orice alt nume ales de
utilizator urmată de semnul @ şi a doua parte este numele contului de la posta electronică urmat adesea de
simbolul tării în care se află serverul. De obicei numele contului se confundă cu numele serverului la care
este abonat calculatorul gazdă. Deci o adresă poate fi scrisă sub forma: aalecu@fx.ro unde aalecu
reprezintă numele utilizatorului calculatorului gazdă., fx numele serverului şi ro prescurtarea de la România.
In caz că nu apare numele tării, se subînţelege că serverul se află în SUA şi în general aparţine de una din
următoarele şapte domenii de organizaţie diferite, aşa cum se observă din Tabelul 8.1
Tabelul 8.1.
Cod Domeniu
.com Entităţi comerciale
.edu Instituţii educaţionale
.gov Instituţii guvernamentale non-militare ale SUA
471
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Pentru utilizarea poştei electronice, firma gazdă la care se face abonamentul pentru E-mail
livrează clientului pachetul de programe care asigură funcţia de agent utilizator, printre care enumerăm:
Eudora.
Cu Outlook Express Mail se poate trimite mesaje prin E-mail oricărei persoane a cărei adresă de
E-mail există pe Internet, intranet şi post individual abonat la un server. Se pot trimite în plus fişiere,
rapoarte, scrisori şi foi de calcul tabelar – sub formă de anexe la mesajele transmise. De obicei
programul Outlook Express Mail este folosit de clienţii abonaţi la Internet.
Eudora este un pachet de programe folosit de obicei de clienţii abonaţi la o postă electronică (un
server), numai pentru E-mail.
Administrarea mesajelor primite: vizualizarea, arhivarea pe disc sau tipărirea lor, ştergerea;
Antetul (Header), care este un text cu care începe mesajul. Conţine informaţii despre destinatar,
autor, subiect şi ora transmisiei;
Semnătura (Signature), care este un text care se adaugă la sfârşitul mesajului poştal, şi
cuprinde cel puţin numele autorului. Mulţi autori introduc de obicei în plus numele firmei şi
numărul de telefon unde pot fi contactaţi.
472
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
La compunerea unui mesaj, este bine să se ţină cont de anumite facilităţi pe care programele
de postă electronică le asigură, prezentate în
Tabelul 8.2.
Facilitatea Semnificaţia
Pseudonim (Alias) Permite să se definească nume alternative, scurte
şi familiare pentru anumiţi utilizatori.
Copii (Carbon Copy) Permite să se transmită mesajul la mai multe
adrese.
Inserarea de fişiere Permite înserarea de fişiere în corpul mesajului.
(Including File)
Lista de adrese Se defineşte o lista de adrese sau grupuri de
(Mailing List) adrese cărora li se pot trimite mesaje prin
E-mail-uri .
Confirmarea primirii Permite trimiţătorului unui mesaj să primească
(Receipt Notification) confirmarea sosirii la destinaţie a mesajului.
Se execută clic pe un buton din fereastră pentru a expedia mesajul. Acest buton este
denumit de obicei Send;
Se face conectarea la reţea şi se execută clic pe comanda de expediere ( Send / Send
Only), şi / sau pe cea de expediere şi primire mesaje (Get All) sau alte comenzi similare pe
care le asigură programul. După ce s-a transmis mesajul, conţinutul acestuia este mutat
automat în dosarul Send items.
Dacă se doreşte doar primirea unor mesaje depuse la server, se face conectarea la reţea
prin comanda Get Mail sau alta asemănătoare, funcţie de programul folosit.
Răspuns către expeditor (Reply). In acest caz adresa destinatarului este completată automat,
fiind preluată din adresa expeditorului la al cărui mesaj se răspunde. Răspunsul poate fi de
două feluri, cu păstrarea textului sosit sau fără păstrarea lui în răspuns. La clicarea pe
butonul (Reply), apare mesajul (Quote original message) la care se poate răspunde cu
(Yes) sau (No).
Reexpedierea mesajului (Forward), acţiune prin care mesajul este retransmis către un alt
destinatar. Adresa expeditorului iniţial este înlocuită cu adresa utilizatorului care reexpediază
473
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
mesajul;
Redirecţionarea mesajului (Redirect), prin care mesajul este transmis către un alt destinatar,
păstrându-se ca adresă de expeditor, adresa expeditorului iniţial.
Dacă este folosită posta electronică, nu este nevoie de fax sau oficiu poştal pentru a trimite
documente. Acestea pot fi ataşate la un mesaj şi trimise destinatarului.
Pentru a ataşa un fişier la un mesaj, se trage cu mouse-ul fişierul din Windows Explorer şi se
plasează în corpul mesajului cu care trebuie transmis. Va apare o pictogramă şi numele fişierului în
corpul mesajului. Se pot ataşa oricâte fişiere în corpul unui mesaj.
In cazul utilizării programului Outlook Express Mail, se alege din meniul principal Insert, opţiunea
File Attachment. Apoi se alege fişierul dorit din caseta de dialog File Attachment şi în final se execută
clic pe Attach. Va apare un panou în partea de jos a ferestrei în care se află textul mesajului, care va
conţine câte o pictogramă pentru fiecare fişier ataşat la mesaj.
In cadrul programului Outlook Express, se poate afişa conţinutul unui fişier ataşat, efectuând
dublu clic pe icoana aferenta..
Se pot economisi timp, efort şi bani, comprimând fişierele înainte de a le ataşa la un mesaj de
postă. Pentru a crea un fişier Zip şi a adăuga fişiere în el, se vor executa următoarele manevre:
Se execută apoi clic-dreapta pe fişierele selectate şi în continuare se va alege comanda Add
to Zip. Dacă această comandă nu apare, înseamnă că programul WinZip nu este instalat pe
PC.
474
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Se execută apoi clic pe Add, iar WinZip va adăuga fişierele selectate în fişierul ZIP.
După examinarea conţinutului fişierului ZIP, se închide WinZip executând clic pe butonul X
din bara de titlu. Acum fişierul comprimat poate fi ataşat la mesajul E-mail.
Extragerea unui fişier ZIP ataşat la un mesaj de postă E-mail, se face după cum urmează:
Se execută dublu-clic pe pictograma fişierului ZIP din cadrul mesajului. Programul WinZip va
afişa conţinutul fişierului.
Se alege din meniul principal Action, Extract şi se va vizualiza caseta de dialog Extract.
Se execută dublu-clic pe fişierul ZIP din mesajul E-mail şi în cadrul programului WinZip va fi afişat
conţinutul fişierului ZIP.
World Wide Web (WWW) sau pe scurt Web, este uriaşă colecţie de documente care conţin
informaţii ce sunt păstrate pe calculatoare răspândite în toată lumea. WWW a fost creat în
Elveţia la Centre Europeen de Recherche Nucleare (CERN). Documentele sunt create cu o
tehnologie specială, numită hipertext. Mulţi pun semnul egalităţii între Internet şi Web,
întrucât Web-ul are cea mai mare pondere în serviciile Internet. De altfel a apărut expresia Surf
in Web, care înseamnă plimbare prin Internet.
Use Net, protocol ce poate fi folosit pentru cuplarea la grupurile de discuţii, pentru a colabora
cu alţi colaboratori conectaţi la Internet.
Internet Relay Chat, poate fi folosit pentru a purta conversaţii în direct, chiar se pot organiza
conferinte video şi audio.
Internet protocol (IP), fiind cel mai simplu protocol de comunicare între calculatoare;
Transmission Control Protocol (TCP), care este mai performant decât cel de mai sus
întrucât asigură corectarea erorilor de transmisie.
Deoarece cele două protocoale prezentate mai sus sunt folosite de regulă împreună, ele sunt
menţionate mereu împreună sub forma TCP / IP.
475
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
File Transfer Protocol (FTP), defineşte modul în care este transferat un fişier generic dintr-
un calculator în altul. fişierul poate fi de forma: document, program, o imagine, etc.
Hyper Text Markup Language (HTML), care defineşte o metodă de adăugare a atributelor
de formatare în fişierele de text, pentru a fi vizualizate fişierele de text citite ca nişte titluri,
paragrafe centrate şi imagini înglobate.
Hyper Text Transfer Protocol (HTTP), defineşte modul în care calculatoarele transmit
fişierele HTML în ambele direcţii.
WWW este o colecţie de milioane de documente cu diferite informaţii care sunt păstrate pe
calculatoare răspândite în întreaga lume. Pentru a uşura accesul la aceste informaţii se dau în
continuare câteva definiţii:
Situl Web este o colecţie de pagini Web, care aparţin aceleaşi instituţii sau persoane;
Pagina sursă (Home Page) este pagina principală dintr-un sit Web;
Hipertextul reprezintă metoda folosită pentru a organiza informaţia în reţeaua Web.
Folosindu-se această metodă, textele sau imaginile evidenţiate într-un document reprezintă
trimiteri la alte documente care conţin informaţii suplimentare;
Hypermedia reprezintă o extindere a metodei hypertext, prin care trimiterile sunt extinse şi la
alte medii cum sunt sunetele şi imaginile video;
URL (Uniform Resource Locator) reprezintă adresa unei locaţii cu informaţii din reţeaua
Internet. Aceasta este formată din trei părţi:
Numele protocolului. Precizează tipul resursei Internet. In tabelul 8.3 sunt prezentate
câteva tipuri de resursă.
Numele gazdei. Prezintă numele calculatorului pe care este stocată informaţia.
Calea fişierului. Precizează numele fişierului în care se găseste informaţia şi calea de
cataloage până la catalogul în care se află fişierul.
Browserul este un program care ajută la găsirea şi citirea informaţiilor în documentele html
ale reţelei Web şi asigură următoarele operaţii mai importante:
Internet Explorer a fost creat de Microsoft şi inclus în sistemele de operare Windows 95
şi 98.
476
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Netscape Navigator, care a fost creat de Netscape Communication Corporation, poate fi
folosit în sistemele windows 95 şi 98.
Tabelul 8.3.
Format Exemplu
http:// http:// www.pub.ro
telnet:// telnet://onramp.net
Gopher:// gopher:// gopher.umc.edu
ftp:// ftp:// ftp.mcp.com/que
file:/// file:/// cIwindows/readme.bat
Reţeaua Web funcţionează pe baza relaţiei client-server, serverul fiind calculatorul pe care se
găsesc unul sau mai multe situri Web, iar clientul este calculatorul de pe care se emite cererea de
informaţii.
In continuare este prezentat un exemplu de căutare a unor informaţii folosind browserul Internet
Explorer în cadrul unui calculator utilat cu sistemul de operare Windows 95 şi conectat la un server la
care este abonat.
Se execută un clic pe caseta Internet explorer din suprafaţa de lucru a mediului Windows 95.
Va apare pe ecran tabloul Dial-up Connection. Se vor completa rubricile: User name şi
Password cu cuvintele din protocolul de închiriere pentru folosirea reţelei Internet încheiat cu
serverul. Apoi se antrenează tasta Connect.
Va apare o suprafaţă de lucru pentru Internet. Se introduce în bara orizontală superioară
adresa unei locaţii în care se caută anumite informaţii.
477
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
In cazul prezent se va scrie www.pub.ro care reprezintă adresa în Web pentru Universitatea
Politehnică Bucuresti.
Va apare pagina sursă. Se va clica pe caseta relansin şi vor apărea o serie de informaţii
referitoare la programul de cercetare Relansin.
Apare din nou suprafaţa de lucru a mediului Windows 95. Se clichează caseta cu două
monitoare cuplate din bara orizontală de jos şi apare un tablou şi se va clica pe tasta
Disconnect.
Nu daţi adresa cutiei poştale unor persoane necunoscute, pentru ca să nu aveţi surprize
neplăcute.
Utilizatorii de Internet folosesc codul de conduită numit Netiquette. Dintre regulile sale se
enumera în continuare:
Nu scrieţi mesajele cu majuscule, sunt mai greu de citit şi dau impresia de nepoliteţe.
Furnizorul de servicii Internet la care sunteţi abonat poate închide conexiunea, dacă prea
mult timp fiind conectat on-line, nu o folosiţi.
Nu folosiţi munca altora fără a le cere permisiunea. Astfel unii utilizatori preiau din reţea
texte, imagini şi videoclipuri asupra cărora acţionează legea dreptului de autor.
478
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Dacă doriţi să citaţi o sursă on-line în propriile lucrări, informaţi-vă care sunt modalităţile legale
prin care se obţine aprobarea pentru citare.
Pentru citarea în lucrarea proprie a unor paragrafe sau informaţii culese on-line, Asociaţia
Americană de Fiziologie a propus aşa cum se vede din Tabelul 8.3, următorul standard pentru
integrarea citatelor: Autor (i), Data publicării, Titlul documentului, Tipul documentului, URL, Data
vizionării.
479
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Tabelul 8.4.
Titlul Conţinutul
Autor ( i ) Numele fiecăruia dintre autorii documentului. Dacă pagina
Web conţine doar / şi o adresă de e-mail sau un pseudonim,
treceţi-le şi pe acestea.
Data publicării Data la care a fost publicat documentul. De obicei la sfârşitul
documentului se găseşte data celei mai recente actualizări a
unei pagini Web.
Titlul Titlul paginii Web aşa cum apare în bara de titlu a
documentului browserului.
Tipul Poate fi unul din tipurile de documente enumerate în Tabelul
documentului 8.5.
URL Adresa URL completată, poate fi una din adresele
enumerate în Tabelul 8.3.
Data vizitării Data la care aţi găsit materialul citat în vizita pe Internet.
Este bine să fie menţionat deoarece informaţiile Internet se
schimbă în mod frecvent.
Tabelul 8.5.
9. Baze de date
9.1 Definirea bazei de date
SISTEME DE GESTIUNE A BAZELOR DE DATE
9.1.1Aspecte privind organizarea datelor
Organizarea datelor presupune umatoarelor activitati:
-definirea ,structurarea,ordonarea si gruparea in colectii de date;
-stabilirea relatiilor intre date,intre elementele unei colectii de date;
480
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
481
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
482
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
483
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
484
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
485
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Prin “integrată” înţelegem că baza de date poate fi gândită ca o unificare de mai multe fişiere
de date, distincte şi neredundante.
Prin “partajarea” unei baze de date se înţelege că bucăţile individuale de date
din baza de date pot fi partajate între mai mulţi utilizatori individuali, fiecare dintre ei
putând avea acces la aceeaşi bucată de date simultan (sisteme multiutilizator).
Hardul unui sistem de baze de date constă din volumele de memorare secundare (discuri,
dischete sau benzi magnetice) pe care rezidă baza de date, împreună cu aparatele, unităţile de control
şi canalele respective.
Între baza de date fizică (adică datele aşa cum sunt ele memorate pe suport) şi utilizatorii
sistemului există un nivel de software, numit sistem de gestionare a bazelor de date (DBMS – Data
Base Management System), care permite construirea unor baze de date, introducerea informaţiilor în
baza de date şi dezvoltarea de aplicaţii privind bazele de date.
Un DBMS dă posibilitatea utilizatorului să aibă acces la date folosind un limbaj de nivel înalt,
apropiat de modul obişnuit de exprimare, pentru a obţine informaţii, utilizatorul făcând abstracţie de
algoritmii aplicaţi pentru selectarea datelor implicate şi a modului de memorare a lor. DBMS-ul este deci
o interfaţă între utilizator şi sistemul de operare.
Orice DBMS conţine un limbaj de descriere a datelor (LDD) care permite descrierea structurii
unei baze de date, a fiecărei componente a ei, a relaţiilor dintre componente, a drepturilor de acces ale
utilizatorului la baza de date, a restricţiilor în reprezentarea informaţiilor, etc. LDD-ul este utilizat atât
pentru proiectarea bazelor de date, cât şi pentru redefinirea lor.
O altă componentă a DBMS este limbajul de cereri (LC) sau limbajul de prelucrare a datelor
(LPD), ce permite operaţii asupra datelor aflate în baza de date, cum ar fi:
încărcarea bazei de date;
inserarea unui nou element;
ştergerea unui element;
modificarea unui element;
căutarea unor elemente;
realizarea de diferite statistici asupra datelor.
Limbajele LDD şi LC sunt extinderi ale unor limbaje de programare numite limbaje gazdă.
Compilarea succesiunilor de comenzi pentru descrierea datelor sau pentru operarea cu date se reduce
la transformarea acestor comenzi într-o succesiune de instrucţiuni ale limbajelor gazdă care, prin
executare, să dea efectul dorit. O altă modalitate de operare este aceea a transformării comenzilor în
lansări de programe executabile.
486
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Entităţile de bază sunt elementele constitutive ale unei baze de date (expl. materialul
arheologic, materialul bibliografic, materialul grafic, etc.). Între aceste entităţi există
întotdeauna asociaţii sau relaţii ce le leagă într-o bază de date comună.
Relaţiile dintre entităţi sunt la rândul lor părţi ale datelor operaţionale, chiar mai
importante decât entităţile asociate. O relaţie poate fi asociată la una, două sau trei entităţi, iar
o entitate poate fi asociată la oricâte relaţii.
Independenţa datelor
Modul în care datele sunt organizate pe suportul secundar de stocare şi modul în care
ele sunt accesate depind de cerinţele aplicaţiei şi de ştiinţa organizării datelor şi tehnicile de
acces.
Imunitatea aplicaţiilor la modificările de structură a memorării şi a strategiei de acces
se numeşte independenţă a datelor.
Tipuri de modificări pe care administratorul bazei de date (DBA) poate să le facă:
reprezentarea datelor numerice (câmpul numeric poate fi memorat în formă
internă aritmetică sau ca un şir de caractere);
reprezentarea datelor caracter (un câmp şir de caractere poate fi memorat în
mai multe coduri de caractere : ASCII, EBCDIC, etc.).
Terminologie:
Un câmp este cea mai mică unitate de date stocată în baza de date.
Baza de date conţine mai multe ocurenţe sau instanţe pentru fiecare din
tipurile de câmpuri.
O înregistrare este o colecţie de nume de câmpuri asociate.
O ocurenţă sau instanţă de înregistrare constă dintr-un grup de ocurenţe de
câmp înrudite (asociate) şi reprezintă o asociere între ele.
Un fişier este o colecţie a tuturor înregistrărilor de unul sau mai multe tipuri.
Într-o bază de date, un câmp numeric poate avea două unităţi metrice (inches
şi centimetrii) la alegerea utilizatorului.
Structura înregistrărilor memorate
Într-o bază de date, două tipuri de înregistrări pot fi combinate într-unul singur.
Exemplu:
înregistrarea 1.: neolitic, Vinča, ceramică pictată, străchini (…)
înregistrarea 2.: neolitic, Petreşti, ceramică pictată, străchini (…)
structură integrată: neolitic, Vinča, Petreşti, ceramică pictată, străchini
(…)
Astfel se explică faptul că înregistrarea logică a unei aplicaţii poate consta dintr-o
submulţime a unei înregistrări memorate, adică anumite câmpuri memorate pot fi invizibile
pentru o aplicaţie particulară (de exemplu elementele care se repetă). La fel, un singur tip de
înregistrare memorată poate fi despicat în două, pentru a particulariza anumite aplicaţii.
Structura fişierelor memorate
Un fişier poate fi implementat fizic în memorie în mai multe moduri:
poate fi în întregime conţinut într-un volum de memorare (expl.: disc
magnetic);
poate fi împărţit pe mai multe volume de tipuri diferite;
poate fi sau nu fizic secvenţial, în concordanţă cu valorile unui anumit câmp;
poate avea unul sau mai mulţi indecşi asociaţi;
poate fi construit cu pointeri;
înregistrările pot fi blocate sau nu, etc.
487
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Baza de date trebuie să fie în stare să crească fără a afecta aplicaţiile existente,
aceasta fiind raţiunea majoră a independenţei datelor.
Arhitectura unui sistem de baze de date
a. a. nivelul exterior scheme exterioare
(vederile utilizatorilor
individuali)
488
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
model unitar. Acest tip de schemă trebuie să se bazeze pe un model teoretic şi să fie
simplă, adică uşor de înţeles şi de prelucrat.
Sistemele de gestiune a bazelor de date au fost clasificate în trei grupe mari,
în funcţie de tipul elementelor cu care lucrează şi a structurilor obţinute:
a. a. modelul reţea – permite lucrul cu entităţi şi relaţii binare de tipul 1:1 şi 1:N,
diagrama rezultată fiind un graf oarecare;
b. b. modelul arborescent (ierarhic) – permite lucrul cu entităţi şi relaţii binare de
tipul 1:1 şi 1:N, iar diagrama este alcătuită dintr-o mulţime de arbori;
c. c. modelul relaţional – în care intervin numai relaţii şi operaţii cu aceste relaţii.
Scheme interne
Schemele interne descriu diferitele fişiere utilizate pentru memorarea
informaţiilor bazei de date şi modul de operare cu ele. Există mai multe moduri de
organizare a fişierelor, cele mai cunoscute fiind:
organizarea secvenţială;
organizarea cu index rar;
organizarea cu index dens;
organizarea cu dispersie;
organizarea folosind B-arbori.
Traducerea schemelor conceptuale în scheme interne se face, de obicei,
automat de către DBMS. Pe lângă stabilirea diferitelor tipuri de înregistrări utilizate
în reprezentarea fizică a datelor, se specifică şi existenţa indecşilor asociaţi unor
fişiere, semnificaţia câmpurilor înregistrărilor, ordinea de apariţie a înregistrărilor şi
modul de acces.
Corespondenţa dintre scheme poartă numele de mapare şi este de două tipuri:
mapare conceptuală / internă (vederea conceptuală / baza de date memorată);
mapare externă / conceptuală (vedere externă particulară / vedere
conceptuală).
Sistemul de gestiune a bazelor de date (DBMS) este softul (programul) care
coordonează toate accesele la baza de date, în modul următor:
a. a. un utilizator emite o cerere de acces, folosind un limbaj particular de
manipulare a datelor;
b. b. DBMS-ul interceptează cererea şi o interpretează;
c. c. DBMS-ul inspectează, pe rând, schema externă, maparea
externă/conceptuală, schema conceptuală, maparea conceptuală/internă şi
definiţia de structură de memorare;
d. d. DBMS-ul realizează operaţiile necesare asupra bazei de date memorate.
Administratorul bazei de date (DBA) urmează apoi să gestioneze operaţiile
specifice, responsabilităţile lui incluzând:
decizia asupra conţinutului informaţiei inclusă în baza de date;
decizia asupra structurii de memorare şi a structurii de acces;
legătura cu utilizatorii;
definirea procedurilor de verificări autorizate şi de validări;
definirea unei strategii pentru salvări şi restaurări;
monitorizarea performanţei şi răspunsuri la schimbări de cerinţe.
Pentru aceasta DBA are la îndemână un număr de programe utilitare pentru a
se ajuta în rezolvarea acestor sarcini:
rutina de încărcare (pentru a crea versiunea iniţială a bazei de date);
489
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
490
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
491
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
anomaliile care pot apare in lucrul cu aceste relatii , deci in functie de anumite
dependente “nedorite”.
O relatie este intr-o anumita forma normala particulara daca satisface o
multime specificata de restrictii . Pana in prezent se cunosc cinci forme normale
ale relatiilor dintr-o baza de date.
Fie r[A1,…,An]o relatie si X={Ai1 ,…,Aip}{A1,…,Am} o multime de atribute .
Reamintim ca ,prin proiectia relatiei r pe X se intelege r’[A i1,…,Aip]=Ai1,
…,Ain(r)unde pt p=(a1,a2,…,an) r , avem x p=p[X]=(ai1 ,ai2 ,…,aip) r’ (si toate
elementele din r’ sunt distincte).
Fie relatiile r(X,Y), s(X,Z) si X,Y,Z multimi de atribute , XZφ.Prin join-
ul natural al relatiilor r si s se intelege :
r⊲⊳s={(x(t),y(t),z(v)) t r, v s,y(t)=y(v)}
O relatie r se poate descompune in mai multe relatii noi : r 1 ,r2 ,
…,rm.Aceasta descompunere este corecta , daca : r= r 1⊲⊳r2 ⊲⊳…⊲⊳rm.
Vom da un exemplu de descompunere care nu este corecta .Fie relatiile :
r[NUME,VARSTA,SALARIU,LOCALITATE]
r1[NUME,SALARIU]
r2[VARSTA,SALARIU,LOCALITATE].
si presupunem ca pt r avem urmatoarea extensie:
NUME VARSTA SALARIU LOCALITATE
NUME SALARIU
Ionescu 800000
Popescu 1200000
Georgescu 1500000
Calinescu 1200000
r 2
VARSTA SALARIU LOCALITATE
30 800000 Arad
40 1200000 Oradea
60 1500000 Iasi
25 1200000 Arad
492
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
r1 ⊲⊳r2
NUME VARSTA SALARIU LOCALITATEA
Ionescu 30 800000 Arad
Popescu 40 1200000 Oradea
Popescu 40 1200000 Arad
Avram 60 1500000 Iasi
Calinescu 25 1200000 Arad
Calinescu 25 1200000 Oradea
493
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
T …DISCIPLINA … PROFESOR
……………………………………
t1 …ANALIZA … POPA
t2 …ANALIZA … POPA
……………………………………..
494
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
495
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Definitia 2.2.12 [3] Orelatie este in a treia forma normala (FN3) daca si
numai daca relatia r este in a doua forma normala si fiecare atribut care nu este
cheie (nu participa la o cheie) nu este tranzitiv dependent de nici o cheie a lui r.
Exemplul 2.2.7 Se considera urmatoarea relatie (cu rezultatele obtinute de
absolventi la lucrarea de diploma):
diploma[NUME-ABSOLVENT,NOTA,CADRU-DID –INDR,CATEDRA]
cu cheia NUME-ABSOLVENT.
Se obseva ca avem urmatoarele dependente functionale:
CADRU-DID-INDRCATEDRA
NUME-ABSOLVENTCADRU-DID-INDR
Relatia initiala se poate , atunci descompunerea in urmatoarele doua relatii :
rezultate[NUME-ABSOLVENT,NOTA,CADRU-DID-INDR]
indrumatori[CADRU-DID-INDR,CATEDRA].
Dupa definitia ormei normale FN3 data de E.F/Codd[16] , ulterior , au mai
aparut o serie de noi definitii:
O relatie r este in a treia forma normala Boyce-Codd(FNBC) daca orice
determinant este cheie (principala sau seundara).
O relatie este in a treia forma normala C.J.Date (FN3 Date) [4] daca orice
atribut care nu este cheie, nu este tranzitiv dependent de cheia principala.
Exemplul 2.2.8 Transportul local pe timp de o saptamana dintr-un oras este
specificat de relatia:
transport [ZI,NR-TRASEU,NR-MASINA,COND-AUTO]
unde COND-AUTO este numele conducatorului auto (el conduce o singura
masina , dar pe acea masina o poate conduce si un alt conducator).Avem cheia :
{ZI,NR-TRASEU, NR-MASINA} si dependenta COND-AUTONR-MASINA.
Relatia definita este in FN3 Date (NR-MASINA)apare in cheie , dar nu este
in FNBC si se poate descompune in urmatoarele doua relatii :
traseu [ZI,NR-TRASEU,NR-MASINA]
soferi[NR-MASINA,COND-AUTO]
Definitia 2.2.13 Fie relatia r [A1, A2,…,An]si doua multimi de atribute
X,Y{A1,…,An} .Spunem ca Y este multiplu dependent funcional de X(XY)
daca si numai daca pt orice t 1, t2 r pt care x(t1)=x (t2) exista t1 si t2 r astfel
incat :
x(t1)=x(t2)=x(t3)=x(t4)
y(t1)=y(t2)=y(t3)=y(t4)
A-X-Y(t1)=y(t2)=A-X-Y(t3)=A-x-Y(t4)
Dependenta XY se numeste dependenta functionala multipla sau
dependenta multivaloare si se poate reprezenta astfel:
X Y A-X-Y
t1 v u1 w1
t2 v u2 w2
t3 v u1 w2
t4 v u2 w1
496
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Definitia 2.2.14 [3] O relatie r este in a patra forma normala (FN4) daca pt
dependentele funcionale multiple , avem XY este dependenta triviala sau X
este cheie pt r.
Aceasta definitie difera de definitia formei FNBC doar prin folosirea
dependentelor functionale multiple in locul celor simple.
497
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
COTA AUTOR
1 Popescu I.
1 Slavici I.
2 Tudor P.
2 Ioan S.
2 Vigu T.
COTA CUVANT-
CHEIE
1 Rom
1 Roman
2 Bdate
2 Rom
498
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Daca se calculeaza r1⊲⊳r2 , care este egala cu r , rezulta faptul ca mai avem
doua elemente t3 si t4 din r cu valorile urmatoare:
X-Y XY Y-X
t1 u1 v w1
t2 u2 v w2
…………………………………………………
t3 u1 v w1
t4 u2 v w2
CP# CA# PA PD
11 100 Sibiu Iasi
10 100 Iasi Sibiu
10 100 Sibiu Iasi
10 101 Sibiu Iasi
499
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
CP# CA#
11 100
10 100
10 101
r2
CP# PD PA
11 Sibiu Iasi
10 Iasi Sibiu
10 Sibiu Iasi
r3
CA# PD PA
100 Sibiu Iasi
100 Iasi Sibiu
101 Sibiu Iasi
r1⊲⊳r2
CP# CA# PD PA
11 100 Sibiu Iasi
10 100 Iasi Sibiu
10 100 Sibiu Iasi
10 101 Iasi Sibiu
10 101 Sibiu Iasi
500
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
501
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
502
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
503
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
D1={Bucuresti,Craiova,Timisoara}
D2={x / xєN , xє[1,100]}
Atributul reprezinta coloana unei tabele de date , caracterizata printr-un
nume. Numele coloanei (atributului ) exprima de obicei semnificatia valorilor
din cadrul coloanei respective .Fiecarui nume de atribut ii corespunde un
domeniu Di numit domeniu numit domeniul atributului Ai ,1in si se va nota
cu dom(Ai) .Pt a diferentia coloanele care contin valori ale aceluiasi domeniu si
a elimina astfel dependenta de pozitie in cadrul tabelei , se asociaza fiecarei
coloane un nume distinct.
Pentru tabelul din figura 2.2.1 avem atributele NR,PD,PA,OD,OA si
domeniile asociate dom(NR), dom(PD), dom (PA), dom (OD),dom (OA).
De exemplu , dom (PD) ={Bucuresti ,Craiova,Timisoara}.
Fie D1 , D2 , …,Dn domenii finite , nu neaparat disjuncte.Produsul cartezian
D1xD2x…xDn al acestora este definit de multimea tuplurilor <v1 ,v2,…, vn>
unde v1єD1,v2єD2,…,vn єDn. Numarul n defineste aritatea tuplului.
Definitia 2.2.2 O relatie r pe multimile D1,D2,…,Dn este o submultime a
produsului cartezian D1x D2 x … Dn , deci o multime de tupluri.
Exista si un alt mod de a defini o relatie, si anume , ca o multime finita de
functii. Asociem fiecarui domeniu Di un atribut Ai si definim relatia r ca fiind o
multime de tupluri {t1,t2,… ,tn} , unde ti : {A1, A2, … ,An} - D1 D2 … Dn si ti
(A j) єDj pentru orice valori ale lui i si j .Intr-o relatie , tuplurile trebuie sa fie
distincte (nu se admit duplicari ale tuplurilor). De obicei ,vom nota relatia cu r
sau r{A1,A2, … , An} .
Orarul din figura 2.2.1 reprezinta un exemplu de relatie pe care o vom numi
orar.Continutul informational al liniei nu depinde de ordinea coloanelor , de
exemplu coloanele PS si PA pot fi interschimbate.
Definirea unei relatii ca o multime de tupluri sau ca o multime de functii se
refera la multimi care variaza in timp (se adauga , se sterg, sau se modifica
elemente).Pentru a caracteriza o relatie este nevoie de un element invariant in
timp , iar acest invariant este dat de structura relatiei (schema relatiei).
Definitia 2.2.3 Multimea tuturor atributelor R={A 1, A2 , … ,
An}corespunzatoare unei relatii o numim schema relatiei si o notam r(A1 , A2 , …
, A n) .
Schema relatiei orar se defineste astfel: orar (NR,PD,PA,OD,OA).
Schema unei relatii mai este cunoscuta si sub numele de intensia unei relatii ,
ca expresie a proprietetilor comune si invariante ale tuplurilor care compun
relatia .Spre deosebire de intensie , extensia unei relatii reprezinta multimea
tuplurilor care compun la un moment relatia , multime care este variabila in
timp . De obicei , extensia unei relatii este stocata fizic in spatiul asociat bazei
de date , caz in care relatia se numeste relatie de baza .Exista situatii in care
extensia nu este memorata in baza de date . Este cazul asa numitelor relatii
virtuale , cunoscute si sub numele de relatii derivate sau viziuni. Acestea sunt
definite implicit , pe baza altor relatii , prin intrmediul unei expresii relationale
iar stabilirea tuplurilor care o compun se face prin evaluarea expresiei.
Asadar , putem reprezenta o relatie printr-un tabel bidimensional in care
fiecare linie corespunde unui tuplu si fiecare coloana corespunde unui
domenui din produsul cartezian. Numarul atributelor defineste gradul relatiei ,
iar numarul de tupluri cardinalitatea relatiei .
Fiecare linie a relatiei este o multime de valori , cate una pentru fiecare
nume de atribut .Linia relatiei se numeste tuplu. In figura 2.2.1 relatia orar este
formata din 5 tupluri . Unul dintre acestea , notat cu t , este definit astfel:
t(NR)=75 , t(PD) = Craiova , t(PA)=Bucuresti,t(OD)=7.25, t(OA)=8.25
Valoarea concreta a tuplului t pentru atributul A o numim Avaloarea
tuplului t , iar daca t este considerata ca functie , atunci Avaloarea tuplului o
504
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
vom nota cu t(a). Pentru X R, restrictia tuplului t la X o notam cu t/X sau t(X)
si o vom numi Xvaloarea tuplului t .
Pentru relatia orar , consideram un tuplu t oarecare , de exemplu primul
tuplu din relatie . {PD , PA} – valoarea tuplului t este tuplul t’ pentru care
t’(PD)=Bucuresti, t’(PA)= Craiova.
Asupra tuplurilor unei relarii se pot efectua urmatoarele operatii:
2. Adaugarea. Permite adaugarea de noi tupluri la o relatie .
Astfel , pentru relatia r{A1 , A2 , … , An} operatia are forma :
ADD(r: A1= d1 , A2 = d2 , … ,An = dn)
De exemplu , adaugarea unui tuplu la relatia orar se face astfel:
ADD(orar : NR =99, PD =Oradea , PA = Bucuresti , OD = 20 , OA =
22)
Cand ordinea atributelor este fixata aceasta poate fi scrisa sub forma :
ADD(orar : 99, Oradea , Bucuresti, 20 , 22)
Scopul operatiei de adaugare este de a adauga un tuplu la o anumita
relatie r ,dar rezultatul adaugarii nu este conform cu scopul acesteia in
urmatoarele cazuri:
- tuplul de adaugat nu corespunde schemei relatiei;
- anumite valori ale tuplului nu apartin domenuilui respectiv ;
- tuplul de adaugat coincide dupa cheie (vezi 2.2.1.3) cu tuplul din relatie .
De exemplu , adaugarea in relatia orar , a tuplului :
ADD (orar: NR :90 , PD :Iasi , PA : Sibiu , PD :16 , PA :12)
nu e permisa , deoarece nu respecta prima conditie .
2. Stergerea. Aceasta operatie se introduce pentru a elimina tupluri din relatie .
Pentru o relatie r , operatia are forma :
DEL(r :A1 =d1 , A2 =d2 , … , An =dn)
Atunci cand numele atributelor sunt ordonate , se pot scrie mai simplu :
DEL( r : d1 , d2 , … , dn)
De exemplu , pentru relatia orar , stergerea primului tuplu , se realizeaza
astfel:
DEL(orar : 70 , Bucuresti , Craiova , 16:59 , 17:50)
Deoarece , intr-o relatie , tuplurile sunt identifcate unic prin valoarea unei
chei (vezi 2.2.1.3) , este suficient pentru a realiza stergerea , sa definim numai
valoarea cheii .
Daca K= {B1 , B2 , … , Bn} este o cheie , atunci se poate utiliza urmatoarea
forma directa:
DEL ( r : B1 = c1 , B2 =c2 , … , Bn = cn )
De exemplu , varianta scurta a operatiei de strgere din relatia orar este :
DEL (orar : 70)
Daca tuplul ce doreste a fi sters , nu exista in relatia r atunci se genereaza o
eroare .
3.Modificarea . Se refera la faptul ca anumite valori dintr-un tuplu se pot
modifica .
Pentru o relatie oarecare r si pentru submultimea {c1 , c2 , … , cp} {A1 , A2 ,
… , An} , operatia de modificare are forma:
CH (r : A1 =d1 , A2 =d2 , … , An =dn ; C1 = c1 , … , Cp = cp)
Daca K ={B1 , … , Bn } este o cheie , atunci operatia de modificare se poate
scrie :
CH( r : B1 = d1 ,…, Bm = dm ; C1 = c1 ,…, Cp = cp)
Pentru relatia orar , operatia de modificare a primului tuplu are forma :
CH(orar : NR = 70 , PD = Bucuresti , PA = Craiova , OD = 16:59 ,
OA = 17:50 , OD = 18 , OA = 19) sau utilizand numai cheia operatiei :
CH (orar : NR = 70 , OD = 18 , OA = 19)
505
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
orar 2
NR PD PA OD OA
75 Craiova Bucuresti 07:15 08:25
506
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
507
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Popa 35
Vigu 40
Produsul cartezian al relatiei orar 1 din exemplul 2.2.1. si pilot , ne conduce la
urmatoarea relatie:
NR PD PA OD OA NUME VARSTA
508
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
PD PA
Craiova Bucuresti
Bucuresti Timisoara
TImisoara Bucuresti
Timisoara Craiova
Timisoar Timis
a
Craiova Dolj
Oradea Bihor
NR PD PA OD OA PD JUDET
509
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
510
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
511
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Dan AIRBUS
Dan TU154
Ion TU154
Ion AIRBUS
Mihai TU154
tip
Tip avion
AIRBUS
TU154
Pilot
Dan
Ion
512
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Dan IAR500
Ion IAR500
Mihai AIRBUS
Mihai IAR500
Andrei IAR500
Andrei AIRBUS
Andrei TU154
drept2
Pilot Tip avion
Ion TU154
Ion AIRBUS
Mihai TU154
513
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
(legatura)
PD PA
Bucuresti Iasi
Bucuresti Timisoara
Timisoara Arad
Timisoara Craiova
Bucuresti Arad
Bucuresti Craiova
514
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
De exemplu, expresiile:
E1= c(σA=a (r1⊲⊳r2))
E3 =c(B(σA=a(r 1)) ⊲⊳r 2)
sunt echivalente , considerand r 1 (A,B) si r2 (B,C).
Calculul relational (CR) reprezinta o adaptare a clculului cu predicate la
domeniul bazelor de date relationale .Ideea de baza o constituie identificarea
unei relatii cu un predicat .
Pe baza unor predicate (relatii) initiale , prin aplicarea unor operatori ai
calculului cu predicate se pot defini noi predicate (relatii).Spre deosebire de
derivarea “procedurala “a relatiilor din cadrul AR,CR permite definirea
neprocedurala , “declarativa ”a relatiilor , in sensul precizarii lor prin
intermeduil proprietatilor tuplurilor si nu prin maniera de derivare efectiva
acestor tupluri.
Calculul relational are doua variante :
1.Calculul relational orientat pe tuplu. Reprezinta varianta initiala , introdusa
de Codd E.[6] , in care CR utilizeza variabile definite asupra relatiilor , variabile
ale caror valori reprezinta tupluri de relatie .Din acest motiv , variabilele au fost
denumite variabile tuplu , iar calculul relational primit numele de calcul
relational orientat pe tuplu.
Cea mai simpla constructie a a calculului relational se numeste atom (sau
formula atomica) . Un atom este constituit din termeni (constante ,variabile
tuplu si operatori) si poate avea una din urmatoarele forme :
r(v), unde r este numele unei relatii , v variabila tuplu reprezentand un tuplu
al relatiei r.De exemplu , orar (z).
v[i] comp w[j] , unde v si w sunt variabile tuplu iar comp este un operator de
comparare (<,=,<=,>,>=,<>).Semnificatia atomului este a i-a componenta a
tuplului v se afla in relatia comp cu a j-a componenta a tuplului w.De
exemplu , v[2]=w[3].
v[i]compk sau k comp v[i], unde v variabila tuplu , comp este un operator de
comparare iar k o constanta .Semnificatia atomului este : a i-a componenta a
tuplului v se afla in relatia comp cu constanta k . De exemplu , v[2]>5 sau
5<v[2].
Pe baza atomilor cu ajutorul unor operatori se pot construi formule mai
complexe in cadrul calculului relational orientat pe tuplu sunt utilizati urmatorii
operatori:conectorii uzuali (conjunctia , disjunctia, negatia)precum si
cuantificatori universali ()si existentiali ().
Se numeste variabila tuplu libera o variabila asupra careia nu actioneaza
nici un cuantificator . O variabila tuplu legata reprezinta o variabila asupra
careia ationeaza un cuantificator universal sau existential.
Daca F1 si F2 sunt formule , atunci F1 F2 , F1 F2 , F1 , F2 , (s F1),
(sF2), (vF1) si ( v F2)sunt formule , in care s si v sunt variabile tuplu care
apar in F1 respectiv F2 .
Se numeste expresie a calculului relational orientat pe tuplu o constructie E
de forma : E={t/ F(t)} unde F reprezinta o formula din calculul relational
orientat pe tuplu , iar t este o variabila tuplu si anume singura variabila tuplu
libera din formula F.
Ca si expresiile din AR , expresiile din calculul relational orientat pe tuplu
reprezinta definitii ale unor relatii .In forma prezentata anterior , aceste expresii
515
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
516
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
JUDET
Timis
Aceeasi problema o putem rezolva si prin evaluarea expresiei E e , care se rescrie
astfel:
Ee ={t / (v) (s) (r(t)orar 1 (v) oras (s)
(v[1]=Timisoara)(s[1]=v[2])(t[1]=s[2]))}
Se observa faptul ca s[1] identifica atributul PD din relatia oras , v[2] identifica
atributul PD , din relatia orar 1 , deci se poate realiza join-ul natural al celor
doua relatii si apoi pe rezultatul join-ului se aplica selectia v[1]=Timisoara , iar
pe acest rezultat se identifica t[1] cu atributul s[2](adica JUDET) si proiectia pe
acest atribut conduce la relatia :
JUDET
Timis
Deci, cele doua expresii conduc la acelasi rezultat .
517
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
FUNCTII
FUNCTIA este o componenta a sistemului de gestiune a bazelor de date care se aplica unor
operanzi si reintoarce utilizatorului un rezultat(o valoare numerica,un sir de caractere, o valoare logica
etc.).Rolul si mecanismul de functionare este cel cunoscut din matematica.Functiile se impart in mai
multe clase in func
-tie de natura operanzilor carora li se aplica dar este dificila o delimitare clara in categorii distincte.
AT(expr_car1,expr _
Car2,[expr_num]) –Returneaza pozitia unei expresii de tip caracter in alta:
Expr_car1-este sirul care se cauta ;
Expr_car2-este sirul in care se cauta;
Expr_num-reprezinta a cata aparitie a expr-car1 in expr_car2 se cauta(implicit
expr_
Num =1,adica se cauta prima aparitie).
Daca expr_car1 nu se gaseste in expr_car2 se returneaza 0. Cautarea realizata
prin
AT() tine cont de scrierea cu litere mici si mari ; pentru a nu face diferente se
foloses
-te functi ATC().
BETWEEN(expr_1,
Expr_2,expr_3) -Indica daca o expresie de tip caracter,numerica sau data calendaristica se afla
intre
Alte doua expresii de acelasi tip.functia returneaza(.T.)daca expr_1 este mai mare
sau
Egala cu expr_2 si mai mica sau egala cu expr_3(expr_2<=expr_1<=expr_3), si
(.F.)
In caz contrar.
CHR(expr_num) -Returneaza caracterul al carui cod ASCII este dat de valoarea expresiei expr_num.
518
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
CTOD(expr_car) -Converteste o expresie de tip sir de caractere intr-o expresie de tip data. Expresia
de
Tip caracter trebie sa contina o data valida cuprinsa intre “1/1/100”si “12/31/9999”
ISALPHA(expr_
Car) -Returneaza (.T.) daca expresia caracter incepe cu o litera. Toate celelalte
caractere
Sunt ignorate.
ISLOWER(expr_
Car) -Returneaza (.T.) daca expresia caracter incepe cu o litera mica. Toate celelalte
caractere sunt ignorate.
ISUPPER(expr_
Car) -Returneaza (.T.) daca expresia caracter incepe cu o litera mare. Toate celelalte
carac
-tere sunt ignorate.
LEN(expr_car) - Returneaza lungimea unei expresii de tip caracter.
LOWER(expr_car)-Converteste toate literele din expr_car in litere mici.
LIKE(expr_car1,
Expr_car2) -Compara doua expresii de tip caracter. Expr_car1 poate contine caracterele *si?
pentru cautari globale .Functia returneaza(.T.) daca expresia expr_car2 se
potriveste
cu sablonul expr_car1 si(.F.) in caz contrar.
LEFT(expr_car,
Expr_num) -Returneaza caracterele din stanga.
Expr_car-reprezinta expresia din care se extrag caractere .
Expr_num-reprezinta numarul de caractere returnate.
Observatie: Functia LEFT() este identica cu o functie SUBSTR() cu pozitia de
inceput1.
Ltrim(expr_
Car) -Elimina spatiile nesemnificative dintr-o expresie. Se foloseste de obicei in combinatie
cu
Functia STR() pentru a converti numere in siruri de caractere .
OCCURS(expr
car1,expr_car2) –Returneaza numarul de aparitii ale unei expresii in interiorul celeilalte.
Expr_car1-expresia care se cauta ..
Expr_car2-expresia in care se cauta.
Daca o expresie nu se gaseste in cealalta se returneaza 0.
519
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
PADL(expr,expr
num,[expr_car]) –Aliniaza la dreapta.
PADR(expr,expr
num,[expr_car]) –Aliniaza la stanga.
PADC(expr,expr
num,[expr_car]) –Centreaza
expr- expresia care se aliniaza.
Expr_num-numarul de pozitii pe care se va face alinierea.
Expr_car – textul de fundal peste care se suprapune expresia de aliniat. Implicit
aceasta
Expresie este vida , se va face o aliniere simpla.
REPLICATE
(expr_car,expr
_num) -Returneaza un sir de caractere rezultata din repetarea expresiaei de tip caracter de
un
numar de ori .expr_car este sirul de caractere care se repeta iar expr_num indica de
ca
-te ori se va repeta expresia.
RIGHT(expr
car,expr_num) -Returneaza cararcterele cele mai din dreapta .
expr_num-indica cate caractere va avea noul sir. Daca se indica un numar de
caractere
mai mare decat lungimea expresiei expr_car se va returna tot sirul de caractere
desem-
nat de expr_car.
RTRIM(expr_car)-Elimina spatiile insignifiante dintr-o expresie. Functia este identica cu TRIM() .
SPACE(expr
num) -Returneaza un sir compus din spatii.expr_num reprezinta numarul de spatii returnate.
STR(expr_num1,
[expr_num2[,
expr_num3]]) -Converteste un numar intr-un sir de caractere.
Expr_num1-reprezinta numarul de convertit.
Expr_num2-reprezintanumarul de caractere pe care se face conversia,incluzand
punctul
Zecimal si cifrele zecimale. Daca se specifica o lungime mai mare decat
nr.
De cifre rezultate se vor adauga spatii in stanga nr-ului. Daca se
specifica o
Lungime mai maica decat nr.-ul de cifre rezultate ,STR() va returna un
sir
De asteriscuri indicand depasirea.
Expr_num3-reprezinta numarul de pozitii zecimale care se returneaza . Daca se
specifica
Mai putine zecimale decat are nr-ul se va face o trunchiere pe nr-ul de
pozi-
Tii specificat.
SUBSTR(expr_car,
Expr_num1[,expr
_num2]) -Returneaza un nr specificat de caractere dintr-o expresie de tip caracter.
Expr_car-expresia din care se extrag caractere
520
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
FUNCTII NUMERICE
Exista functii numerice corespondente pentru toate functiile trigonometrice,exponentiale,
loga-
Ritmi,radicali valoarea luiPi,etc.
INT(expr_num) -Returneaza partea intreaga a unei expresii numerice.
ROUND(expr_num1,
Expr_num2) -Rotunjeste o expresie numerica, cu un numar de zecimale precizat.SET
DECIMALS este ignorat.
Expr_num1-expresia de rotunjit
expr _num2 –numarul de zecimale la care se face rotunjirea. Daca se
precizeaza o valoare negativa, se va returna un numar intreg
continand in fata punctului zecimal un numar de zerouri pre-
cizat prin expr_num2.
Exemplu :ROUND(1234.1962,-1)produce 1230.0000
ROUND(1234.1962,-2)produce 1200.0000
ROUND(1234.1962,-3)produce 1000.0000
VAL(expr_car) -Returneaza valoarea numerica a unui sir de caractere compus din cifre .
Daca
Primul caracter din sir nu este o cifra VAL() returneaza 0.
Functii de tip data calendaristica
GOMONTH(expr_
Data,expr_num) -Returneaza o data cu un nr de luni inainte sau dupa data precizata .
MONTH(expr_data) -Returneaza nr-ul lunii (1-12) pentru o expresie data .
SECONDS() -Returneaza nr-ul de secunde care a trecut de la miezul noptii in forma de
mii
De secunde.
TIME() -Returneaza ceasul sistem intr-un format cu 24 de ore sub forma unui sir de
8
Caractere(hh:mm:ss)
YEAR(expr_data) -Returneaza anul pt o expresie de tip data. Valoarea returnata contine
intotdea-
Una si secolul, nu este afectata de SET CENTURY.
521
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
ALIAS([nr_zona]) -Returneaza aliasul zonei de lucru curente sau al unei zone de lucru
precizate.
Daca nu gaseste nici o baza de date deschisa in zona precizata va returna
sirul
Nul.
SELECT([0|1]) -Returneaza numarul zonei de lucru curente (SELECT (0))sau cel mai mare
nu
-mar de zona ne folosit (SELECT(1))
BOF([nr_zona|alias]) -Returneaza (.T.) daca pointerul dearticol este pozitionatla inceputul bazei de
Date implicit referirea se face la zona de lucru curenta dar se poate preciza
si o
Alta zona de lucru. Daca nu gaseste o baza de date deschisa va returna (.F.)
DELETED([alias|nr_
Zona]) -Returneaza (.T.) daca articolul curent este marcat pentru stergere . implicit
se
Refera la zona de lucru curenta dar se poate folosi pentru o zona de lucru
preci-
-zata prin alias sau nr_zona
EOF([nr_zona|alias]) -Returneaza (.T.) daca pointerul de articol este pozitiuonat la sfarsitul bazei
de
Date. Pointerul de articol este pozitionat la sfarsitul bazei de date:
-cand s-a incercat o mutare a pointerului de articol ultimul articol din baza de
date;
-cand o comanda LOCATE sau SEEK a esuat . In caz contrar
returneaza(.F.)
implicit referirea se face la zona de lucru curenta dar se poate preciza si o
alta
zona de lucru. Daca nu gaseste o baza de date deschisa va rteturna (.F.)
FCOUNT([nr_zona|
Alias]) -Returneaza numarul de campuri prntru o baza de date deschisa
FOUND([nr_zona|
Alias]) -Returneaza (.T.) daca ultima comanda Continue ,LOCATE sau SEEK s-a
teminat cu succes.
RECCOUNT([nr_
Zona|alias]) -Returneaza numarul de articole din baza de date
RECNO([nr_zona|
Alias]) -Returneaza numarul articolului curent.
RECSIZE([nr_zona|
522
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
sau logice, memo (cifre si litere),dupa care o sa fim intrebati daca introducem inregistrarile
si aleg YES si cu CTRL +W salvez informatiile.
In crearea tabelelor mai intervin comenzii ca :
COPY TO<noua tabela care se creeaza cu aceiasi stuctura cu cea
deschisa in prealabil >STRUCTURE
EXTENDED[ FIELDS<campurile care apar>]FIELDS
LIKE< conditia de aparitie a campurilor >]FIELDS
EXCEPT< conditie complementara >]
CREATE[<se creaza aceasta tabela cu aceiasi structura ca si tabela de dupa clauza from
>]FROM<numele tabelei ce se importa ca strucura>
523
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Deosebirea intere indexare si sortare este ca fisierele index ocupa spatiu mult mai mic.
In prealabil baza de date care o sortez trebuie deschisa iar baza de date sortata trebuie si ea
deschiosa si sortata .
SORT ON< campul dupa care se sorteaza >[A/C/D]
TO<nume tabela sortata> FOR< conditie de sortare >
SORT TO<nume tabela sortata> ON <nume camp >
FIELDS<lista campuri >|FIELDS LIKE<conditie>
|FIELDS EXCEPT<conditie complementara>]
INDEX ON <campul dupa care se indexeaza >TO <fisierul simplu index ce se creaza >|TAG <cheia
principala daca am mai multe campuri de indexat>[ OF <fisierul de unde iau campurile de indexare >]
[ FOR L<conditie de indexare >][COMPACT][ASCENDING][DESCENDING] [ADDITIVE]
Transformarea in sir de caractere a campurilor se face asa : STR <camp numeric>,DTOS<camp dat>
Deschiderea fisierelor index simple se poate face o data cu baza de date initiala iar cele compuse
separat astfel :
USE<baza de date sursa >INDEX <fisierele index>
USE<baza de date sursa >TAG<fisierele index>
SET INDEX TO [<fisierele index ce se deschid |?][ORDER< numarul fisierului index care se deschide
primul>][OF< numele fisierului index compus>][ASCENDING|DESCENDING][ADDITIVE]
SET ORDER TO TAG < cheia ce se deschide >
In cazul alterarii informatiilor cu operatii diverse avem REINDEX.
Gasirea inregistrarilor se face asa:{GO [RECORD]<numarul inregistrarii>[IN<unde caut>]
{GO TOP/GO BOTTOM [IN <unde caut>]
{SKIP<+-urca sau coboara cu atatea inregistrari >IN<unde>
{LOCATE FOR <conditie de localizare >[domeniu][WHILE<pana cand>]iae la bazele de date indexate
astfel:{SEEK<valoare pe care ma pozitionez din campul indexat>{FIND <sirul de caractere pe care-l
caut din campul indexat >
{SET FILTER TO <conditie de filtrare>}
Posibilitatea de a stabili relatii este una dintre facilitatile care confera putere FOXPRO-ului.O relatie
este o legatura intre doua fisiere deschise,bazata pe o referinta comuna cum ar fi un camp sau numarul
de articole.Se creaza relatii pentru a conecta temporar articole din diferite baze de date,ceea ce permite
accesul simultan la informatiile continute de acestea.
Sunt valabile consideratiile prezentate la instructiunea SET RELATION.
Cand se stabileste o relatie,nu conteaza daca baza de date parinte este indexata sau nu.In schimb
baza de date fiu trebuie sa fie indexata daca nu doriti sa se faca prin numarul de articole.
524
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
STABILIREA RELATIILOR
Inainte de a incepe legarea bazelor de date trebuie sa va asigurati ca sunteti in forma ecran
“View” a ferestrei “View”.Toate fisierele pe care doriti sa le legati trebuie sa fie deschise in zone de lucru
distincte.
Din lista zonelor de lucru,selectati baza de date care va deveni baza de date parinte.Alegeti
butonul Relations.Numele bazei de date parinte va apare in lista Relations cu o sageata care pleaca din
el.In continuare,din lista zonelor de lucru,selectati baza de date legata.
Daca baza de date legata este indexata si are stabilit indexul principal,va fi activat
generatorul de expresii.Daca baza de date legata este ordonata dupa un camp care exista identic in
baza de date parinte,FOXPRO va introduce automat acel camp in expresia de legatura.Puteti schimba
acest camp sau puteti crea alta relatie de legatura.
Daca baza de date legata este indexata dar nu are stabilit indexul principal,va apare un
dialog Set Index Order pentru a stabili indexul principal in maniera discutata la indexare.
Daca baza de date legata nu este indexata,FOXPRO presupune ca doriti sa creati o expresie
de legatura bazata pe numarul de articole.
Cand expresia de legatura are forma dorita,alegeti optiunea <<OK>> si observati in fereastra
“View” stabilirea relatiei.
UTILIZAREA INFORMATIILOR DIN
MAI MULTE BAZE DE DATE
Exemplu:
Consideram doua fisiere baza de date CLIENTI.DBF cu structura:
Cod_client N 7
Den_client C 35
Cont_banca C 15
Den_banca C 20
Cont_cec C 15
Adresa C 25
Den_loc C 20
Telefon C 12
Fox C 12
Si FACTURI.DBF cu structura
Nrf N 8
Dataf D 8
Cod_ben N 7
Val_fact N 14 2
525
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
SELECT 1
USE CLIENTI
SELECT 2
USE FACTURI
Deci instructiunea de selectare a zonei de lucru este SELECT si poate avea urmatoarea sintaxa:
SELECT n|alias
Implicit este activa zona de lucru 1.Puteti selecta o anumita zona de lucru precizandu-i numarul prin
n.SELECT 0 are ca efect
selectarea zonei de lucru ne folosite cu cel mai mic numar de ordine.
Dupa deschiderea unei baze dedat intr-o anumita zona,acesta poate fi selectata prin aliasul
sau.Aliasul implicit al unei baze de date este numele sau (fara extensia.DBF).Se poate atribui bazei de
date un alt nume _alias decat numele implicit prin specificarea lui in comanda USE astfel:
USE…ALIAS nume_alias
Un nume_alias poate fi format din maximum 10 caractere (litere,cifre si liniuta de subliniere) si
incepe obligatoriu printr-o litera sau cu liniuta de subliniere.
Specificarea campurilor dintr-o baza de date deschisa in alta zona de lucru decat zona curenta se
face cu ajutorul numelui_alias astfel:alias.camp sau alias->camp.
Inchiderea bazelor de date deschise in diferite zone de lucru se face prin selectarea fiecarei zone
in parte si inchiderea bazei de date din zona respectiva astfel:
SELECT 1
USE
SELECT 2
USE
1. Pe baza numarului de secventa a articolelor din bazele de date in cauza (se presupune de
regula,ca bazele de date au acelasi numar de articole);este o legatura fizica intre bazele de date;
2. Pe baza unei chei de indexare;prin acest procedeu,frecvent utilizat,se stabileste o legatura logica
intre articolele din bazele de date deschise simultan.
In ambele cazuri,sistemul gestioneaza pointeri de articol pentru fiecare zona de lucru .Pointerii se
pot sincroniza prin comanda:SET RELATION.
Formatul comenzii este:
Comanda SET RELATION stabileste o relatie intre doua baze de date deschise.Inainte de a
stabili relatia,o baza de date (baza de date parinte sau principala ) trebuie deschisa in zona de lucru
curenta iar cealalta(baza de date fiu sau legata) sa fie deschisa in alta zona de lucru.
Dupa crearea relatiei, o mutare a pointerului de articol in baza de date parinte,este insotita de
mutarea pointerului de articol in baza de date legata pe articolul corespunzator.Daca nu se gaseste un
articol corespondent in baza de date legata,pointerul de articol din baza de date fiu este pozitionat la
sfarsitul bazei de date.
Expresia de legatura expr_1este de obicei cheia de indexare a indexului principal al bazei de date
fiu.
INTO n1 | alias1,indica prin numar sau alias,zona de lucru in care este deschisa baza de date fiu.
Comanda SET RELATION TO anuleaza toate relatiile de legatura ale bazei de date din zona de
lucru curenta .
526
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Se pot crea mai multe relatii de legatura intre baza de date din zona de lucru curenta si baze de
date deschise in alte zone de lucru prin precizarea mai multor relatii separate prin virgula in forma
comenzii.
Utilizarea clauzei ADDITIVE are ca efect pastrarea tuturor relatiilor stabilite in zona de lucru
curenta,anterior.In caz contrar acestea sunt anulate.
Exemplu:
Considerand bazele de date descrise anterior si tinand cont de faptul ca in baza de date
FACTURI campul cod_ben constituie codul unui client,printr-o relatie intre cele doua baze de date
astfel:
SELE 1
USE clienti
INDEX ON cod_client TO codcind
SELE 2
USE facturi
SET RELA TO cod_ben INTO clienti
BROW FIELDS nrf,dataf,clienti.den_client,valf
Un caz particular al relatiilor intre bazele de date il constituie legatura”Unu la n” (1-To –Many).O
legatura”Unu la n”,pune in corespondenta mai multe articole din baza de date fiu,unui singur articol din
baza de date parinte .
Cand se prelucreaza baze de date legate prin legatura”Unu la n”,pointerul de articol ramane pozitionat
pe un articol din baza de date parinte,pana se prelucreaza toate articolele care ii corespund in baza de
date fiu.
Stabilirea unei relatii”Unu la n” se realizeaza intr-o maniera similara cu cea pentru stabilirea unei
relatii “Unu la unu”.Se incepe cu stabilirea unei relatii normale “Unu la unu” intre fiu si parinte (prin
comanda SET RELATION) dupa care se foloseste comanda SET SKIP pentru a transforma legatura
stabilita intr-o legatura”Unu la n”.]
Sintaxa comenzii SET SKIP este urmatoarea :
Daca baza de date parinte este legata de mai multe baze de date fiu (care au aliasurile alias1,
alias2, …) atunci relatiile respective pot fi transformate in relatii”Unu la n”printr-o comanda SET SKIP.
In comenziile care au efect asupra unui anumit domeniu de articole
(DISPLAY,LIST,etc.),articolele din baza de date parinte se vor repeta pentru fiecare articol
corespondent din baza de date fiu.
Anularea unei relatii “Unu la n” se realizeaza cu comanda SET SKIP TO (fara parametrii).
Exemplu:
In exemplul antertior s-a considerat ca parinte baza de date FACTURI iar baza de date CLIENTI
a fost considerata baza de date fiu.Daca schimbam modul de abordaresi consideram baza de date
CLIENTI ca baza de date parinte si baza de date facturi ca baza de date fiu si tinem cont de faptul ca
unui client ii pot corespunde mai multe facturi putem evidentia o relatie “Unu la n” astfel:
SELE 1
USE CLIENTI
SELE 2
USE FACTURI
INDEX ON cod_ben to FACTBEN
SELE CLIENTI
SET RELA TO cod_client INTO FACTURI
SET SKIP TO FACTURI
BROWSE FIELDS facturi.nrf,facturi.dataf,;den_client,facturi.valf
527
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
GESTIUNEA ECRANULUI
REGIUNI DE EDITARE:
Introducerea unor informatii de lungime variabila(care vor completa campuri memo din bazele de
date)se poate face prin instructiunea:
@lin,col EDIT variabila/camp
SIZE expr_num1,expr_num2
[FUNCTION expr_car] [DEFAULT expr]
[MESSAGE expr_car2]
[VALID expr_log1 [ERROR expr_car3]]
[WHEN expr_log2] [NOMODIFY] [SCROLL][TAB]
[COLOR SCHEME expr_num4/COLOR lista_culori]
Dupa activarea prin READ,continutul variabilei sau campului specificat este afisat in regiunea de
editare.La iesirea dintr-o regiune de editare,modificarile facute pot fi salvate.
Tastati TAB sau CTRL+TAB pentru a salva modificarile si a trece la obiectul urmator sau SHIFT+TAB
pentru a salva modificarile si a trece la obiectul anterior.Tastati ESC pentru a abandona modificarile si a
trece la obiectul urmator.Daca folositi clauza VALID pentru editarea unui camp memo,modificarile vor fi
salvate sau nu in functie de valoarea expresiei expr_log1.
Daca expr_log1 este adevarata(.T.),modificarile se salveaza daca tastati TAB,CTRL+TAB sau
SHIFT+TAB pentru a iesi dintr-o regiune de editare.Tastand ESC modificarile se pierd.
Daca tastati TAB,CTRL+TAB sau SHIFT+TAB pentru a salva modificarile dintr-un camp memo iar
expr_log1 este falsa (.F.) vi se cere confirmarea salvarii.Tastand apoi ESC modificarile se salveaza.
Toate facilitatile de editare din FOX PRO cum ar fi decuparea(CUT),
copierea(COPY),refacerea(PASTE) sunt disponibile si in regiunile de editare.Textul introdus poate fi
defilat pe verticala si va fi aranjat intre marginile regiunii
Important:
Clauzele care apar si la @...GET,au aceeasi semnificatie.
Clauza SIZE trebuie inclusa pentru a specifica inaltimea si latimea regiunii de
editare.Inaltimea(exprimata in numar de linii) este specificata prin expr_num1 iar latimea (exprimata in
numar de coloane)este specificata prin expr_num2.
Daca expr_num1 este 1, va aparea o regiune de editare speciala sub forma de linie.Se poate defila
orizontal continutul. Tastand ENTER se trece la urmatorul obiect
Pentru a specifica modul de aranjare al textului intre marginile regiunii de
editare se poate folosi clauza FUNCTION cu obtiunile I sau J .Orice alt caracter
inclus in clauza FUNCTION este ignorat
Optiune Efect
I Centreaza textul in regiunea de editare
J Aliniaza textul la dreapta. Implicit, textul este
aliniat la stinga.
In exemplul urmator se creaza o regiune de editare in care textul este
aliniat la dreapta:
STORE’ text ce se aliniaza la dreapta’ to text @2,2 EDIT text
FUNCTION’J’ size 5,50 READ
Clauza Semnificatia
NOMODIFY Indica doar afisarea textului fara a permite
Modificarea lui. Se poate defila si copia textul
Dar nu poate fi modificat.
SCROLL Prin includerea acestei clauze va apare o bara de
defilare in dreapta regiunii de editare( daca inaltimea
este minimum 3).Bara de defilare va permite o
deplasare rapida in interiorul textului cu ajutorul
mouse-ului si va da o imagine a pozitiei in zona de text
528
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
*Se folosesc culorile invers:Bara de defilare foloseste culoarea de prim plan iar
controlerele culoarea de fond.
Exemplu:
Considerand baza de date MARFURI, cu structura:
COD_MARFA Numeric 11
DEN_MARFA Character 30
UM Character 3
PRET Numeric 11 2
INFO Memo 10
Programul scris anterior pentru adaugare de articole in baza de date se va
modifica pentru a introduce informatii in campul memo.Se foloseste comanda
@...EDIT
*program ADAMARFA.PRG-‘adauga marfuri in catalog set talk off
set color of scheme 1 to w+ /b,n/bg
@ 0,0 clear to 24,79
@0,0 to 3,79 double
@1,2 say “Curs FOX PRO”
@2,1 say padc (“Exemplu-Program adaugare; articole intr-o BD”,78)
USE marfuri
adaug=.t.
do while adaug...
529
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
CLAUZA SEMNIFICATIA
530
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
GESTIUNEA CULORILOR
Culorile pot fi modificate in doua feluri:
1. Utilizand dialogul de “Alegere culori”(Color Picker) care apare dupa alegerea optiunii COLOR... din meniul WINDOW
2. Prin comenzi SET
1. Perechea de culori;
2. Lista de perechi de culori;
3. Schema de culori;
4. Setul de culori.
PERECHEA DE CULORI
Perechea de culori consta din culoarea de fundal si culoarea de prim plan.Culorile se specifica printr-o
abreviere.Se foloseste un * pentru a indica clipirea.Caracterul + va indica stralucirea.Codurile culorilor sunt prezentate in tabelul
urmator:
Culoarea Codul
Black(Negru) N
Blank X
Blue(Albastru) B
Brown(Ocru) GR
Cyan(Bleu) BG
Green(Verde) G
Magenta(Mov) RB
Red(Rosu) R
White(Alb) W
Yellow(Galben) GR+
1. Alb(W);
2. Negru(N);
3. Subliniere(U);
4. Video invers(I);
IMPORTANT:
Culoarea Blank se foloseste la introducerea parolelor.
531
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
In lista de perechi de culori pentru monitoare monocrome perechea a 8-a lipseste deoarece nu este permisa
umbrirea.
SCHEMA DE CULORI
Este un set de 10 perechi de culori .Schemele de culori controleaza culorile elementelor interfetei FOXPRO.(Ex.
Schema 8 pentru ferestrele sistem ).Fiecare pereche de culori din lista de perechi de culori corespunde unui element din schema.
SETUL DE CULORI
532
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
2 optiuni disponibile
3 bordura
4 titlurile meniurilor
5 mesajul explicativ
6 optiunea selectata
7 taste de apel
8 umbra
9 controlere active
10 controlere dezactivate
Tabele complete privind asignarea perechilor de culori pentru fiecare schema sunt cuprinse in Help-ul sistem prrecum si in
manualul “FOXPRO Developer’s Guide”.
O comanda de modificare a culorilor este :
Aceasta comanda permite modificarea culorilor unei scheme prin specificare unei liste de perechi de culori sau a altei scheme.
Clauza Semnificatia
Expr_num1 Reprezinta numarul schemei ale carei culori se modifica ; ppoate lua valori intre 1si
24.
lista_perechi_culori Reprezinta perechile de culori asignate schemei .Puteti specifica intre 1si 10 culori. Nu este
necesar sa se specifice toate cele 10 perechi de culori.Se pot modifica culorile selectiv prin
introducerea unei virgule pentru fiecare pereche care ramane neschimbata .
SCHEME expr_num2 Reprezinta schema din care se preiau noile culori .Se realizeaza o copiere a culorilor schemei
precizata prin expr_num2 pentru schema precizata prin expr_num1.
Exemplu:
Pentru a schimba culoarea bordurii(perechea 3) din
ferestrele utilizator (schema 1) in alb pe rosu si a lasa nemodificate
toate celelalte culori se utilizeaza comanda:
SET COLOR OF SCHEME 1 TO , , W/R
Putem afla care sunt culorile dintr-o anumita schema folosind functia SCHEME (expr_num1\,expr_num2\)
Functia returneaza un sir de caractere, care reprezinta o
pereche de culori sau o lista de perechi de culori dintr-o schema
precizata.
Prin expr_num1 se specifica numarul schemei ale carei culori intereseaza.Daca al doilea parametru lipseste se
returneaza toate cele 10 perechi de culori.
Daca se doreste doar o anumita pereche de culori din schema se va specifica prin expr_num2 pozitia perechii care
intereseaza.De exemplu daca expr_num2 este 4, se va returna a patra pereche de culori.
Exemplu:
Comanda urmatoare returneaza a treia pereche de culori din schema 4:
? SCHEME (4,3)
STERGEREA ECRANULUI
Pentru ca programatorul sa fie asigurat ca pe ecran nu exista alte informatii decat cele pe care le doreste ,este nevoie
sa stabileasca un regim de lucru adecvat prin instructiuni SET.
Dupa stabilirea regimului de lucru ecranul trebuie sters cu instructiunea CLEAR;aceasta sterge tot ecranul intre
coordonatele (0,0)si (24,79).
Daca situatia o cere, anumite informatii pot sa ramana pe ecran,iar programatorul poate sterge doar un dreptunghi,definit
prin coordonatele coltului stanga sus,respectiv dreapta jos.Aceasta stergere se poate realiza prin:
@ l1,c1\CLEAR\CLEAR TO l2,c2\
Daca lipseste clauza CLEAR sau CLEAR TO, se va sterge un dreptunghi al carui colt stanga sus este precizat, iar
coltul dreapta jos este coltul de jos al ecranului.
533
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
REALIZAREA DESENELOR
Pentru a trasa cutia cu un singur caracter se poate preciza un sir format dintr-un singur caracter.
Exemplu:
@ 10 ,0 TO 22,40 “*”
Efect similar comenzii @...TO in forma cu sir de caractere pentru chenar produce comanda :
@ l1,c1,l2,c2 BOX\ sir_de_caractere\
Comanda @...BOX traseaza o cutie.Daca se precizeaza un sir_de_caractere, aceasta se va oflosi pentru trasarea
cutiei.Trebuie precizate pana la 9 caractere(cate unul pentru fiecare colt, cate unul pentru fiecare latura si unul pentru
umplere).Caracterele din sir vor fi parcurse pentru trasare in sensul acelor de ceasornic incepand din coltul stanga sus.Pentru
umplere se foloseste al noualea caracter.Daca se specifica un singur caracter, acesta este folosit la trasarea cutiei.
Exemplu:
@ 10,20,14,60 BOX
@ 10,20,14,60 BOX REPLICATE (chr(177),9)
534
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Se va evalua expresia expr si rezultatul se va afisa in linia si coloana indicate pe ecran (daca este activ SET DEVICE
TO SCREEN) sau la imprimanta (daca este activ SET DEVICE TO PRINTER).
Prin aceasta instructiune ecranul poate fi gestionat dinamic, prin cresterea numarului de linie pentru afisare
(lin=lin+1).Deasemenea, afisarea informatiilor pe ecran se poate face in orice ordine, deoarece ecranul este considerat ca fiind
“adresabil”, in sensul ca fiecare caracter are coordonatele linie si coloana bine stabilite.Gestiunea dinamica a ecranului este
favorizata de functiile sistemului COL() si ROW() care returneaza coordonatele pozitiei curente a cursorului pe ecran.
Exemplu:
@ 10,20 say “Acesta este un text”
@ row ( ) +1,0 say “Text pe linia urmatoare”
@ row ( ) ,col ( ) +10 “scriu pe aceeasi linie”
In forma @ lin , col SAY expr, instructiunea permite numai afisarea sirurilor de caractere.Celelalte tipuri de date
(numerice,logice,date calendaristice), trebuie trasformate inainte de afisare in siruri de caractere.
La tiparire poate fi utilizat un sablon sau o functie de conversie sau ambele. Un sablon poate contine si coduri ale
functiilor de conversie caz in care incepe cu @ dar o functie de conversie nu poate contine decat codurile proprii.
Sablonul specificat dupa clauza PICTURE poate contine orice caracter ; numai cele care vor fi prezentate in continuare
au un rol activ in afisarea sau in preluarea datelor .Daca in sablon sunt incluse si alte caractere, acestea se afiseaza.
Exemplu:
@ 10,10 say “Hello!” PICT “@!”
@ 12,10 say 1234. 25 FUNCTION “$”
@ 14,10 say 1235. 25
PICT “9999999.99” FUNCTION “$”
535
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Efectul instructiunii este afisarea pe ecran a textului dintre ghilimele pe linia lin
Si in coloana col si initierea procesului de citire a variabilei variabila mentionata dupa GET.In program pot fi mai multe
asemenea instructiuni , succesuve sau nu.Citirea se realizeaza de fapt numai la intalnirea instructiunii READ care are ca efect
citirea tuturor varibilelor specificate prin toate optiunile GET anterioare ei . Utilizatorul va trebui sa tasteze valori pentru aceste
variabile.Textul dintre ghilimele are rol explicativ, pentru ca utilizatorul sa cunoasca in orice moment ce fel de date se introduc .
Exemplu:
CLEAR
SET TALK OFF
@ 1,1 to 23,79 DOUBLE
@ 2,3 say “B.B. Computer”
@ 2,50 say padl (“Curs FAP1, 29)
@ 5,1 say padc (“TEST MODUL 4 – FOXPRO”,77)
@ 7,5 to 20,75
*identificare cursant
nume=space (15)
prenume=space(20)
@ 10,8 say “ Nume :” get nume
@ 11,8 say “Prenume:” get prenume
read
In exemplul de mai sus, se initializeaza variabilele de memorie cu spatii, apoi se face initializarea citirii lor folosind
instructiunea GET si in final se face citirea efectiva prin instructiunea READ.
Instructiunea de citire poate sa impuna formatul variabilei,limitele in care trebuie sa fie cuprinsa variabila precum si
alte conditii de validare a datelor introduse.O forma mai generala a instructiunii GET este:
Daca se utilizeaza GET cu SAY in fata ,se va introduce automat un spatiu intre expresia tiparita prin SAY si pozitia
din care incepe GET.
Clauzele PICTURE si FUNCTION au aceeasi semnificatie cu cea prezentata pentru SAY.
Clauza Semnificatia
DEFAULT expr_2 Daca variabila specificata dupa GET, nu exista, ea va fi creata si initializata cu valoarea
specificata prin expr_2.DEFAULT nu are efect asupra campurilor dintr-un fisier.Daca nu exista
clauza DEFAULT si variabila specificata dupa GET nu exista, va apare o alerta cu mesajul
“Variable <variabila> not found”.Daca DEFAULT apare dar variabila specificata dupa
GET exista, DEFAULT este ignorat.
MESSAGE expr_car1 Are ca efect afisarea mesajului expr_car1 pe ultima linie a ecranului, atunci cand cursorul este
pozitionat pe GET-ul respectiv.
RANGE
Expr_3,expr_4 Poate fi utilizat cu variabile de tip caracter, numeric sau data pentru a specifica un domaniu de
valori permise.Daca valorile introduse nu se incadreaza in domeniul precizat,va apare un
mesajde eroare care va indica domeniul permis.verificarea domeniului se face doar in cazul
modificarii valorii variabilei precizate prin GET; daca ea ramane neschimbata(se tasteaza
ENTER),clauza RANGE nu are efect.
WHEN expr_log2 Permite sau nu accesul la GET in functie de rezultatul evaluarii expresiei logice expr_log2.Daca
expresia returneaza (.T.), este permis accesul la GET; in caz contrar cursorul se deplaseaza pe
GET-ul urmator.
VALID expr_log1 Permite validarea intrarii .Expresia logica expr_log1 este evaluata la fiecare iesire dintr-un
GET .Daca dupa evaluare expresia logica returneaza (.T.) , valoarea introdusa este
considerata corecta si se trece la citirea unei noi valori.In caz contrar, valoarea introdusa este
considerata incorecta , va apare un mesaj care va cere sa introduceti o alta valoare dupa ce
tastati un SPATIU (sa dispara mesajul de eroare), si nu se avanseaza la o alta citire decat
dupa introducerea unei valori corecte sau tastand ESC .
ERROR expr_car2 Permite specificarea de catre utilizator a mesajului de eroare care se va afisa atunci cand
conditia specificata dupa clauza VALID este falsa.
COLOR SCHEME
Expr_num \ COLOR
536
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Lista_culori Daca nu se include clauza COLOR , culorile folosite de @ ... GET sunt determinate de
schema de culori pentru fereastra principala FOXPRO care este ecranul.
Se pot specifica explicit culorile fie precizand numarul unei scheme de culoare prin clauza
COLOR SCHEME fie indicand un set de perechi de culori prin clauza COLOR.
Exemplu:
Virsta=0
An_nastere=0
Rasp=.F.
@ 5,5 say “Introduceti virsta:” get virsta;
pict “999” range 0,120
@ 6,5 say “Anul nasterii:” get an_nastere;
pict “9999” valid an_nastere<=year(date ( ) )
@ 7,5 say “Raspunsurile sunt corecte? (Y/N) “;
get rasp pict “Y”
read
Pentru a anula initierea proceselor de citire de variabile ,proces lansat prin secvente de GET-uri ,programatorul
poate folosi instructiunea CLEAR GETS.Acesta are ca efect invalidarea tuturor secventelor @ ... GET ,anterioare ei .Pot fi
initiate in continuare noi procese de citire de variabile.
Exemplu:
Program pentru introducerea datelor pprin dialog cu utilizatorul intr-o baza de date MARFURI ,.cu structura:
COD_MARFA Numeric 11
DEN_MARFA Character 30
UM Character 3
PRET Numeric 11 2
INFO Character 40
Imaginea ecranului pentru introducerea de date este cea din figura urmatoare:
537
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Crearea fisierelor .prg se realizeaza sciind in ferastra command MODI COMM NUME_FISIER
Procedura apelanta poate beneficia de rezultatele procedurii apelate prin parametrii rezultanti cu
comanda: DO < numele fisierului apelat > [ WITH ]
{<ce rezultate transmite la apelant > [ IN< numele fisierului in care se {apeleaza fisierul si in cadrul
caruia se executa>]
Obs1: avem parametrii globali:
-de intrare (cei care se prelucreaza si se dau in programul apelant efectiv)
-de iesire (rezultatele care se folosesc in programul apelant si sunt evaluate aici)
*parametrii locali (care nu folosesc in programul principal dar sunt rezultate necesare local)
Parametrii locali sunt definiti in procedura apelanta si contin rezultatele obtinute si nu sunt recunoscute
decat in procedura iar comenzile sunt :
{PRIVATE<.lista variabila memorie>
538
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Pentru a utiliza aceleasi nume de variabile ,atat in programul apelat cat si in programele
apelate,programatorul are posibilitatea de a declara variabile private (locale) prin instructiunea:
PRIVATE lista_de_variabile
Sau
Instructiunea poate mentiona variabile care se exclud din lista si care sunt deci variabile
globale. Optiunea ALL permite definirea tuturor variabilelor ca variabile locale
Pentru ca o variabila sa fie utilizata in acelasi fel de mai multe programe (variabila sa fi
purtatoare de informatie intre programele care se apeleaza),ea trebuie sa fie declarata variabila
publica printr-o instructiune:
PUBLIC lista_de_variabile
Toate variabilele continute in lista_de_variabile din declaratia de mai sus devin publice
(globale);cade in sarcina programatorului controlul corect al valorilor care se atribuie acestor
variabile in cursul derularii programelor.
PROCEDURI
Un caz particular de prgrame sursa sunt acele programe care contin secvente executabile
delimitate in proceduri .Din punctul de vedere al editorului de texte ,procedurile se editeaza la fel ca si
programele . fisierul de proceduri este un fisier de tip .PRG.
Lista de parametri contine atat parametrii de apel ai procedurii, care sunt transmisi de la
programul apelant, cat si paremetrii care contin valorile pe care le returneaza procedura. In particular
procedura poate sa nu returnze nimic ,si poate fi apelata fara parametrii (actioneaza asupra variabilelor
globale sau a mediului de lucru .paremetrii procedurii se specifica printr-o instructiune :
PARAMETRES lista _de_parametrii
Orice procedura poate fi apelata numai dupa activarea fisierului care contine procedura.Activarea
fisierului de proceduri se face cu instructiunea SET PROCEDURE TO nume fis_procedurii
Lansarea in executie a procedurii se face prin programul apelant asemanator cu lansarea in executie a
oricarui program dar este necesara specificarea suplimentara a parametrilor.Paramatrii de apel ai
procedurii se specifica la lansare ,astfel :
DO nume procedura [WITH lista_de _parametri]
Numarul de parametrii din declaratia PARAMETER aflata in corpul procedurii trebuie sa fie
identic cu numarul de parametrii din instructiunea de apel a procedurii.
Fisierul de proceduri prezentat contine trei proceduri care au numele UNU ,DOI si
SALAR.Fiecare procedura are specificata lista de parametrii necesari pentru executia procedurii in
cauza si se termina cu instructiunea RETURN.Procedurile se vor apela independent din priogramul
principal sau din alte programe ;fiecare declaratie de tip Procedure va reprezenta un punct de intrare in
program .Instructiunea Return determina iesirea din fisierul de proceduri ,transferul valorilor spre
programul apelant si executia urmatoarei instructiuni ,aflate imediat dupa apelul procedurii.
Programul de mai sus apeleaza proceduirile din fisierul de proceduri.Programatorul poate avea mai
multe fisiere de proceduri ,dar la un moment dat numai un singur fisier de proceduri este activ.Orice
539
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
instructiune de forma :
SET PROCEDURE TO fis_de_proceduri
Inchide fisierul din proceduri anterior deschis si-l activeaza pe cel specificat prin fis_de_proceduri
Fisirul de proceduri se inchide cu una din comenzile :
SET PROCEDURE TO
sau
CLOSE PROCEDURE.
{@ < linie stanga sus , coloana stanga sus , linie dreapta jos , coloana dreapta jos> BOX <
caracterul cu care se face chenarul >
{@< linie stanga sus , coloana stanga sus> TO <linie dreapta jos , coloana dreapta jos >
[ DOUBLE / PANEL / <caracter pentru bordura >]
[ PATTERN < fundal >]
DEFINE BAR < nr. asignat optiunii din meniu > OF < numele meniului vertical din care mai face parte >
PROMPT < mesajul intre ghilimele care apare ca submeniu > [ BEFORE <
plasarea meniului bar actual in fata barului cu nr. sau numele spus aici ]
[ KEY < combinatie de taste pentru selectie > ] [ MARK < caracterul din fata]
[MESSAGE<mesajul care apare la selectia submeniului>] [SKIP[FOR<o
coloana prin care este inclusa sau nu optiunea de submeniu in cadrul
meniului vertical >][COLOR<lista de culori >COLOR SCHEME<nr. schemei
>.]Crearea unui meniu orizontal se face asa:{DEFINE MENU <nume meniu
orizontal >[BAR AT LINE<nr. liniei unde imi apare meniul pe ecran >]
[IN[WINDOW<numele ferestrei unde imi apare meniul >][IN SCREEN]
[KEY<combinatia de taste cu care se activeaza >][MARK<caracterul care
apare in fata lui cind e selectat >][MESSAGGE<un mesaj cind e selectat >]
[NOMARGIN][COLOR<lipsa de culori > /COLOR SCHEME <schema>In
cadrul meniurilor orizontale se definesc submeniurile.;
Aplicatii de meniuri
PROGRAM . PRG.
540
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
MENIURI . PRG
541
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
Atribuirea <variabila>=<expresie>
STORE<valoarea>TO<variabilele ce iau valoarea specificata>
Comenzi de afisare pe ecran
?/??[<expresia ce se evalueaza si rezultatul il pune pe ecran>] [PICTURE<formatul afisajului>]
[AT<coloana unde se face afisarea>] [FONT<numele si marimea fontului>] [STYLE<stilul scrisului>].
???<evaluarea expresiei ce se va lista la imprimanta>. Afisarea la anumite coordonate de linie si
coloana se face asa:
@<linie,coloana>say<intre ghilimele se pune mesajul ce se va tipari>[PICTURE<cate caractere sa fie
si cum>] [FUNCTION<conditie valabila pentru toate caracterele>] [FONT<nume
font,marimea>]STYLE<stilul de litera>] [COLOR<lista de culori pentru font>]
Editarea variabilei unde se memoreaza raspunsul la mesajul@…say…de mai sus se face
asa:@<linie,coloana>GET<numele variabilei in care se editeaza>analog ca mai sus[ENABLE ?
DISABLE] [DEFAULT] [MESSAGE<mesajul la introducerea valorilor>[RANGE<minim,mazim pantru
variabila>] [SIZE<inaltime,latime pentru editare>] [VALID<conditia pentru camp>] [ERROR<mesajul de
eroarecand nu e indeplinita conditia din campul de la clauza valida] [WHEN<unul di campuri
indeplineste o anumita conditie>] [COLOR SCHEME<numar>]
542
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
<executa comanda>
[LOOP] -se reia comanda do while
[EXIT]-iesire fortata din ciclu
ENDDO
FOR <variabila ce ia valori>=valoare initiala TO finala
<comanda>
[EXIT]
[LOOP]
ENDFOR /NEXT
Pentru parcurgerea unei table
SCAN [domeniu] [FOR<conditie>] [WHILE<pana cand>]
<comenzile>
[LOOP]
[EXIT]
ENDSCAN
ELEMENTE DE GRAFICA
Ferestre in Fox Pro
Activare Window|nume_fereastra_1|nume_fereastra
543
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
|BOTTOM|TOP|SAME||NOSHOW|
Clauze Semnificatia
Nume_ fereastra_1 Reprezinta ferestrele care ur-
Nume_fereastra_2 meaza sa fie activate.
ALL Activeaza toate ferestrele
definite.
|N|WINDOW Plaseaza fereastra activata
nume_fereastra_n pe ecran.
BOTTOM|TOP| Controleaza locul unde
SAME ferestrele activate sunt plasate
terior.
NOSHOW Dicteaza iesirile catre fereastra
|IN |WINDOW|nume_fereastra_n|SCREEN|SAVE|
Clauze Semnificatia
Nume_fereastra_2 ascunse.
544
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
SCREEN
SAVE Plaseaza imaginea ferestrei pe
ecran sau intr-o alta fereastra
dupa ce a fost ascunsa .
Clauze Semnificatia
Nume_fereastra_1 Reprezinta ferestre care vor fi
Nume_fereastra_2 plane pe ecran.
ALL Plaseaza toate ferestrele pe ecran
IN|WINDOW| Fereastra este deschisa in interiorul.
Nume_fereastra_n unei ferestre parinte fara a prelua
insa caracteristicile acesteia.
IN SCREEN Permite amplasarea explicita a
frerestrei pe ecran si nu in interioru
altei ferestre.
REFRESH Clauza se foloseste pentru a redese-
na o fereastra ‘BROWSE’.
TOP Plaseaza fereastra in fata tuturor
celorlalte ferestre afisate
BOTTOM Plaseaza fereastra in spatele tutu-
ror ferestrelor afisate.
SAME Afecteaza numai ferestrele care au
afisate sau activate anterior si apoi
prin DEACTIVATE WIND
Clauze Semnificatia
SAVE Pastreaza imaginea ferestrei pe ecran
sau intr-o alta fereastra dupa ce fe-
reastra a fost ascunsa.
Mutarea ferestrelor
Comanda MOVE WINDOW
MOVE WINDOW nume fereastra TO lin,col
|BY expr_num 1.expr_num 2
Clauza Semnificatia
Nume fereastra Numele ferestrei care se muta
TO lin ,col Muta fereastra in pozitia deter-
minata de coordonatele lin si col
BY expr _num1 Muta fereastra intr-o pozitie re-Expr_num2
lativa fata de pozitia curenta
expr_num1 respectiv expr_num2
specifica numarul de linii res-
pectiv coloane cu care se depla-
Seaza fata de pozitia curenta.
GENERATORUL DE MACHETE ECRAN
Dupa ce a fost pornit generatorul de ecrane,vom stabili unde vor aparea obiectele pe ecran in timpul
executiei programului generat in acest caz
existand doua posibilitati :pe ecranul FoxPro sau in ferestre plasate in
545
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
546
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
OBIECTE
LISTE
PROPRIETATI ALE
FORMULARELOR(MACHETELOR
ECRAN)
var pt:real;
i,n:longint;
cod,j,m,maxp:integer;
www:byte;
fi:text;
a:array[0..100,0..100] of integer;
{$I PUNCTAJ.inc}
procedure eroare(s:string;p:real);
begin
writeln(s);
punctaj(paramstr(4),p);
halt;
end;
procedure date;
var i,j:integer;
begin
assign(fi,paramstr(1));
reset(fi);
readln(fi,n);
for i:=1 to n do
begin
for j:=1 to n do
begin
547
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
read(fi,a[i,j]);
if a[i,j]=1 then a[i,j]:=-1;
end;
readln(fi);
end;
close(fi);
end;
procedure calcul;
var i,j,b,k:integer;
begin
maxp:=0;
k:=0;
for i:=1 to n do
for j:=1 to n do
if a[i,j]<>-1 then
begin
b:=a[i-1,j];
if b>a[i,j-1] then b:=a[i,j-1];
if b>a[i-1,j-1] then b:=a[i-1,j-1];
if b<>-1 then
a[i,j]:=b+1
else a[i,j]:=1;
if maxp=0 then
begin
maxp:=b+1;{l1:=i;c1:=j;}
end
else
if maxp<b+1 then
begin
k:=0;
maxp:=b+1;
{l2:=l1;
c2:=c1;
l1:=i;
c1:=j;}
end
else
if maxp=b+1 then
begin
k:=1;
{l2:=i;
c2:=j;}
end;
end;
end;
function verific(l,c:integer):boolean;
begin
verific:=true;
if a[l,c+maxp-1]<>maxp then verific:=false;
end;
procedure citire;
var f,g:text;l,c,i,j,lc,cc,max,maxc,nr,nrc:integer;
x:array[1..100] of integer;
ok:boolean;
begin
date;
calcul;
548
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
assign(f,paramstr(2));
assign(g,paramstr(3));
reset(f);
{$I-}
reset(g);
{$I+}
if ioresult<>0 then eroare('Fisier de iesire inexistent!',0);
readln(g,max);
readln(f,maxc);
if max<>maxc then
eroare('Latura diferita!',0);
if seekeof(g) then
eroare('Lipseste nr. solutiilor!',0);
readln(g,nr);
readln(f,nrc);
if nr<>nrc then
eroare('Nr. solutiilor diferit!',0);
if seekeof(g) then
eroare('Lipsesc coordonatele!',0);
for i:=1 to nrc do
begin
readln(g,l,c);
readln(f,lc,cc);
if not verific(l,c) then
eroare('Coordonate gresite!',0);
if seekeof(f) then
if not seekeof(g) then
eroare('Nr. diferit de coordonate in fisierele soluie concurent
si comisie!',0);
if not seekeof(f) then
if seekeof(g) then
eroare('Nr. diferit de coordonate in fisierele soluie concurent
si comisie!',0);
end;
eroare('Corect!',10);
close(g);
close(f);
end;
begin
pt:=0;
val(paramstr(4),www,cod);
citire;
end.
EXEMPLU :
program verif;
var f:text;
c,e:array[1..40] of byte;
i,n:byte;s,ss,x:integer;
stri:string;
procedure error(a:string);
begin
writeln(a);halt
end;
begin
assign(f,'caramele.in');reset(f);
readln(f,n);s:=0;
for i:=1 to n do begin read(f,c[i]);s:=s+c[i] end;
close(f);
assign(f,'caramele.out');{$I-}reset(f);{$I+}
if ioresult<>0 then error('Fisier de date inexistent');
549
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
i:=0;ss:=0;
while not seekeof(f) do begin
{$I-}read(f,x);{$I+}
if ioresult<>0 then error('Date nenumerice');
if (i<0)or (i>n) then error('Indice incorect');
if e[x]=1 then error('Punguta duplicat');
e[x]:=1;ss:=ss+c[x];inc(i)
end;
if i<> n div 2 then error('Numar diferit de pungute pentru
L/B');
str(abs(s-2*ss),stri);
error('Date valide. Diferenta obtinuta='+stri)
end.
{$n+}
program eval_permanent;
{
Parametrii :
1 - fisier de intrare
2 - fisier iesire comisie
3 - fisier iesire concurent
4 - numarul testului
}
var pt:real;
i,a,b,n:longint;
cod,j,m:integer;
www:byte;
{$I PUNCTAJ.INC}
procedure eroare(s:string;p:real);
begin
writeln(s);
punctaj(paramstr(4),p);
halt;
end;
procedure citire;
var f,g:text;x,y:char;
begin
assign(f,paramstr(2));
assign(g,paramstr(3));
reset(f);
{$I-}
reset(g);
{$I+}
if ioresult<>0 then eroare('Fisier de iesire inexistent!',0);
{$I-}
while not eof(f) and not eof(g) do
begin
550
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
begin
pt:=0;
val(paramstr(4),www,cod);
citire;
end.
Unit Timer;
Interface
Implementation
Uses Dos;
Begin
Gettime(Hour, Minute, Second, Sec100);
Lhour := Hour;
Lminute := Minute;
LSecond := Second;
Total := Sec100;
Total := Total + (LSecond * 100);
Total := Total + ((LMinute * 60) * 100);
Ms := Total + (((LHour * 60) * 60) * 100);
End;
Function Seconds:longint;
{ returns number of 1/100 s since midnight }
var dostime:record t,s,m,h:byte end;
begin
asm
mov ax, 2c00h
int 21h
mov word ptr dostime.m, cx
mov word ptr dostime.t, dx
end;
with dostime do
Seconds:=(longint(h*60+m)*60+s);
551
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
end;
End.
CUPRINS
Prefata…………………………..……………………………………………………………..1
Exemple de roboti………….………………………………………………………………….2
Structura robotilor…………………………………………………………………………..…5
Sistemul mecanic al robotului…….……………………….………………………………..…
33
Sistemul de actionare si comanda la roboti……………………………………………………
39
Senzori…………………………………………………………………………………………
48
Aplicatii roboti ficşi si mobili in
industrie……………………………………………………..62
Constructia electronica a unui robot……….………………………………………………...…
93
Cuprins……………………………………………………………………………………...…
117
552
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin
553