Documente Academic
Documente Profesional
Documente Cultură
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ă 1, care nu-şi pierd conţinutul
atunci când sistemul de calcul este oprit. Exemple de suporturi de memorie externă:
discuri magnetice:
benzi magnetice;
CD-ROM-uri.
display (monitor)
imprimanta
plotter.
1
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).
5. reteaua de comunicatie sau magistrala de comunicatii (bus) care interconecteaza toate
elementele sistemului si conecteaza sistemul cu exteriorul.
Dispozitivele I/O sunt componente care din pdv functional, asigura sch de informatii intre
microprocessor si celelalte elemente din calculator. Se mai numesc si dispozitive periferice.
Dispozitivele periferice de intrare permit utilizatorului sa introduca date, comenzi si programe in
CPU. Cel mai cunoscut disp de intr este tastatura.
Dispozitivele de iesire permit utilizatorului sa vada rezultatele calculelor efect de catre calc sau al
manipularii datelor. Cel mai cunoscut disp de iesire este monitorul.
Unitatea centrala (CPU- central processing unit) - poate fi constituita dintr-un singur cip sau o serie
de cipuri care efectueaza calcule aritmetice si logice si in ac timp controleaza si operatiile altor elemente
din system.
Majoritatea cipurilor cu unitati centrale de prelucrare si a microprocesoarelor sunt compuse din 4
blocuri functionale:
- unit aritmetico-logica – furnizeaza abilitatea de calcul si permite efect operatiilor aritm si logice;
- register – zone de stocare temporara care mentin date, urmaresc instructiuni si pastreaza
locatii de memorie si rezultatele acestor operatii;
- bloc de control – are 3 functii:
o planifica si regleaza operatiile intregului system de calcul;
o decodorul sau de instructii citeste forma datelor si o transforma intr-o activitate cum ar
fi adunarea sau compararea;
o unit de intreruperi indica ordinea in care CPU este utilizata de catre operatii
individuale, stabilind timpul CPU alocat pentru fiecare operatiune.
- magistrala interna – o retea de linii de comunicatii care conecteaza elementele interne ale
microprocesorului si de asemeni conduce la conectori externi care leaga procesul cu alte elem
ale sist de calcul. Cele 3 tipuri de magistrale sunt:
o magistrala de control
o magistrala de adrese
o magistrala de date
Componenta hardware a unui calculator este formată din echipamentele fizice în care se asigură
prelucrarea automată a informaţiei şi din echipamentele care asigură comunicarea între utilizator şi
calculator. Ea este formată din următoarele subansamble.
Memoria internă, în care se păstrează programele şi datele cu care se lucrează la un moment
dat;
Memoria externă, hard- discul în care se păstrează toate programele şi datele de care poate
avea nevoie calculatorul la un moment dat pentru prelucrare. Hard discul este un pachet de
discuri pe care se pot face înregistrări de date şi programe. El este montat în interiorul
calculatorului, şi are o memorie care în zilele noastre poate depăşi 9 Go. In general
calculatoarele au o singură unitate de hard-disc, care este folosită pentru păstrarea
permanentă a programelor, inclusiv a sistemului de operare şi a datelor.
Memoria internă, în care se păstrează programele şi datele cu care se lucrează la un moment
dat;
Memoria externă, hard- discul în care se păstrează toate programele şi datele de care poate
avea nevoie calculatorul la un moment dat pentru prelucrare. Hard discul este un pachet de
discuri pe care se pot face înregistrări de date şi programe. El este montat în interiorul
calculatorului, şi are o memorie care în zilele noastre poate depăşi 9 Go. In general
calculatoarele au o singură unitate de hard-disc, care este folosită pentru păstrarea
permanentă a programelor, inclusiv a sistemului de operare şi a datelor.
Memoria interna are o viteza de stocare si regasire a informatiei mai mare decit memoria externa.
Memoria externa are o capacitate de stocare a informatiei mai mare decit memoria interna.
Memoria interna e folosita pentru programe si date care sunt utilizate frecvent dar ocupa un volum mai
mic de informatie, iar memoria externa e utilizata pentru programe si date care necesita un volum mare
de informatie si atunci cind sunt utilizate se transfera partial sau integral in memoria interna.
Se utilizeaza ca unitate de masura a capacitatii memoriei octetul (BYTE), care este un cuvint de 8biti
impreuna cu multiplii sai:
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
Interfaţa ocupă un loc aparte în arhitectura unui sistem de calcul. Ea poate fi definită ca o
componentă care asigură o conexiune între două elemente, astfel încât acestea să poată lucra împreună.
Componentele electronice care fac ca dispozitivele periferice de intrare-ieşire şi unităţile de memorie
externă să poată comunica cu procesorul sunt interfeţele hardware. Suportul fizic al comunicării îl
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.
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).
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
9. - Audio IN
10. - Antene TV,FM
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
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:
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:
Discul cu dublă densitate (DD), cu o capacitate de 720 ko;
Mouse–ul
Operaţia clic (click) prin care se acţionează scurt un buton al mouse-lui;
Operaţia dubluclic (double click), prin care se acţionează scurt, de două ori succesiv un
buton al mouse-lui;
Operaţia de tragere (drag), prin care se deplasează mouse-ul pe masa reală cu un buton
acţionat.
Compact discul
Discul compact (CD-ROM), este o memorie externă pe un suport optic special de pe care se pot
citi datele înregistrate în unitatea de citire compact disc. Inregistrarea datelor şi programelor pe CD-
ROM se face în fabrică cu o aparatură ce foloseşte laserul. Memoria unui CD-ROM este de ordinul a
sute de Mocteţi.
Scannerul
Scannerul este un dispozitiv de intrare prin care pot fi citite imaginile grafice (fotografii, desene
tipărite pe hârtie). Imaginea pe care o citeşte scannerul este o suprafaţă formată din puncte, fiecare
punct fiind definit printr-un cod de culoare, şi coordonatele sale.
Rezoluţia, care reprezintă numărul de puncte pe inci pătrat pe care le poate citi;
Numărul de culori, reprezintă setul de culori care pot fi codificate de scanner;
Viteza de scannare, reprezintă viteza cu care un scanner citeşte şi prelucrează o imagine de
mărime standard.
Monitorul
Este dispozitivul care permite vizualizarea rapidă a rezultatelor date de calculator. Caracteristicile
unui monitor sunt: claritatea imaginii, numărul de culori afişate, nivelul de radiaţii electromagnetice.
Calitatea este dată de rezoluţie care reprezintă numărul de pixeli ai ecranului, unde un pixel este un
punct de pe ecran. In tabelul de mai jos sunt prezentate principalele tipuri de monitoare:
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.
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:
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ă.
În capitolul Sisteme de calcul s-a făcut o clasificare a componentelor fizice de bază
care pot compune un calculator. În continuare vom descrie, pe scut, partea de programe care
trebuie să pună în legătură părţile fizice ale calculatorului (cele mai uzuale fiind sistemele de
operare MS-DOS şi Windows).
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>).
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.
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.
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”.
Depanare rapida - Gasirea rapida ( in mod automat) a solutiilor la diverse probleme de depanare
a calc si eventual aplicarea acestora prin facilitatea windows
Interfaţa realizată printr-un sistem de meniuri. In acest tip de interfaţă utilizatorul transmite comenzile
calculatorului prin intermediul unui sistem de meniuri şi opţiuni de meniu sau poate folosi combinaţia
de taste care apare în dreapta numelui opţiunii cunoscută şi sub numele de scurtătură (shortcut
keys).
Acest tip de interfaţă presupune existenta unui interpretor de comenzi care să folosească un
sistem de meniuri sau interpretorul de comenzi să folosească un program care se suprapune peste
interpretorul de comenzi.
Pentru deschiderea meniurilor, declanşarea unei comenzi se realizează prin folosirea tastaturii
(tehnica barei selectoare-dreptunghi evidenţiat pe ecran cu altă culoare sau tehnica literei de
identificare-litera de identificare subliniată) sau mouse-ul.
Sisteme de operare cu interfaţa realizata grafic: Windows NT, Windows 95, Windows 98,
Windows 2000.
Windows 95 are o interfaţă grafică orientată pe ferestre, care permite utilizatorului lansarea
concomitent a mai multor aplicaţii, fiecare în fereastra ei, precum şi schimbul de informaţii între acestea.
Windows 2000 este ultima interfaţă lansată de Microsoft în 1999, de la care se aşteaptă o
compatibilizare a platformelor Windows şi performante superioare.
La începutul fiecărei sesiuni de lucru trebuie încărcat în memoria internă nucleul sistemului de
operare (conţine programele necesare gestionării resurselor calculatorului). Sistemul de operare se
livrează pe suport magnetic împreună cu calculatorul (disc sistem). Acest suport conţine un program de
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.
Se cere:
1. Să se copieze subdirectorul Dana pe o disketă.
2. Directorul curent fiind BP, să se copieze fişierul b.cpp conţinut de subdirectorul XIC, pe disketă într-
un subdirector ClsXIC. Să se vizualizeze rezultatul copierii.
Rezolvare.
Cazuri:
Dacă directorul curent este c: , comanda va fi:
Comanda cd .. trece în directorul părinte al subdirectorului Dana, deoarece putem copia din
directorul curent numai ceea ce conţine el (dacă nu mai specificăm calea până la el). Deoarece
discul curent este C: , în comanda a doua putem omite discul sursă, preczând doar ce se copiază
de pe el.
Cazuri:
Succesiunea de comenzi va fi:
a:
md ClsXIC
copy C:\BP\Users\ XIC\ b.cpp A:\ ClsXIC
dir /p
sau
a:
md ClsXIC
c:
copy BP\Users\ XIC\ b.cpp A: :\ ClsXIC
a:
dir /p
sau
a:
md ClsXIC
copy C:\bP\Users\ XIC\ b.cpp ClsXIC
dir /p
La formatarea discului sau dischetei se creează directorul rădăcină (Root Director). In acesta
sunt memorate: numele fiecărui fişier cu extensia sa, spaţiul ocupat de acesta pe disc în octeţi, data şi
ora la care a fost creat sau modificat.
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
c:
În capitolul Editare de text, se va arăta că d ocumentele create în Word au un nume, un punct şi extensia
doc. Pe suportul magnetic informaţiile sunt de mai multe feluri, nu numai documente Word, iar aceste informaţii
memorate poartă denumirea de fişiere. Deci documentul Word este şi el un fişier.
Numele discului
Calea prin care se ajunge la fişier
Numele(obligatoriu) şi extensia fişierului.
Exemplu:
a: \my documents\referate\ carol.doc
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.
Icon (Pictogramă) – reprezintă “containere”
al căror conţinut va fi afişat printr-un
clic pe butonul stâng al mouse-ului.
Exemple:
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ă
Fereastra de aplicaţie Word
activă şi minimizată.
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
Move Here
Copy Here
Create Shortcuts Here
Cancel
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.
Folder Fişier
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.
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ă.
Tema 2)
Algoritmi
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.
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
6. Testarea programului.
Testarea se face pe mai multe seturi de date care să acopere cazurile posibile ce pot
apărea.
TEMA 3)
PRINCIPIILE PROGRAMARII STRUCTURATE
Structuri fundamentale( secvenţa, decizia, repetiţia)
START
CITESTE
i
EITES
SUBRUTINA X
TE
PRINT i
STOP
V=Vi
A
A
C
NU V=V+r
C
DA
A V>Vr
Exemplu:
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ă
Diagrama arborescentă constituie o altă modalitate de reprezentare grafică a algoritmilor. Ca şi
în cazul schemelor logice, există mai multe convenţii de reprezentare a operaţiilor în cadrul algoritmilor.
IN PSEUDOCOD AVEM:
a) Secvenţa – este o structură realizată prin scrierea succesivă (în secvenţă) a comenzilor
componente.
Exemplu: citeşte A,B
atribuie C A + B
scrie A , B , C
stop
Efectul execuţiei unei comenzi depinde de poziţia comenzii în cadrul secvenţei .
b) Decizia – este o structură care asigură alegerea pentru execuţie a unei secvenţe din două
alternative posibile.
Structura comenzii: dacă condiţie atunci
secvenţa1
altfel
secvenţa 2
[]
Începutul comenzii de decizie este marcat de cuvântul cheie “dacă” iar sfârşitul său de semnul []
Execuţia acestei comenzi comportă următoarele etape:
se evaluează “ condiţia”;
dacă rezultatul evaluării este adevărat (condiţie îndeplinită) se execută secvenţa 1;
în caz contrar se execută secvenţa 2.
După executarea secvenţei 1 sau a secvenţei 2 se trece la următoarea comandă (cea după
semnul [] )
Observaţie: În cazul în care secvenţa care urmează după cuvântul cheie “altfel” lipseşte, se utilizează
forma simplificată a deciziei:
dacă condiţie atunci
secvenţa1
[]
În cazul în care condiţia nu este îndeplinită se trece direct la comanda ce urmează deciziei
Exemplul:
dacă A > B atunci
scrie A
altfel
scrie B
[]
Efectul execuţiei exemplului de mai sus este următorul:dacă valoarea variabilei A este mai
mare decât a variabilei B se scrie valoarea lui A în caz contrar se scrie valoarea variabilei B şi nu
valoarea variabilei A.
Exemplul: Decsrierea în Pseudocod a algoritmului de aflare a celui mai mare element
din 3 valori reale desemnate prin variabilele a,b,c.Variabila “x” va conţine cel mai mare element din cele
3 valori.Algoritmul de rezolvare a unei probleme nu este unic.Ca atare se dau două descrieri
Pseudocod pentru rezolvarea acestei probleme.
a) varianta 1
citeşte a,b,c
dacă a>b atunci
atribuie x a
altfel
atribuie x b
[]
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 [].
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
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
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:
START
CITESTE
i
EITES
SUBRUTINA X
TE
PRINT i
STOP
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;
14. dacă I<N atunci treci la pasul 4;
15. scrie valoare lui P;
16. stop.
Schema logică corespunzătoare algoritmului:
Diagrama arborescentă
Diagrama arborescentă constituie o altă modalitate de reprezentare grafică a algoritmilor. Ca şi
în cazul schemelor logice, există mai multe convenţii de reprezentare a operaţiilor în cadrul algoritmilor.
Limbajul Pseudocod
Spre deosebire de schemele logice, limbajele Pseudocod folosesc cuvinte cu înţeles
prestabilit (numite cuvinte cheie) şi câteva reguli simple de aliniere a textului scris.
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
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
[]
Î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.
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:
1-se execută secvenţa
2-se evaluează condiţia şi dacă rezultatul este fals(condiţie neîndeplinită)se continuă cu etapa 1 , altfel
execuţia comenzii se termină şi se trece la comanda următoare.
Exemplu: Se dă algoritmul lui Euclid pentru afişarea celui mai mare divizor comun a
două numere întregi m,n(m>=n>0).
10. citeşte valorile lui m şi n
11. atribuie lui c valoarea lui n ( în variabila c se reţine cel mai mare divizor
comun )
12. atribuie lui r restul împărţirii întregi a lui m la n
13. dacă r diferit de 0 atunci treci la 7
14. scrie valoarea lui c
15. stop
16. atribuie lui m valoarea lui n
17. atribuie lui n valoarea lui r
18. treci la pasul 2
Se observă că operaţiile care se realizează calculul restului şiactualizarea valorilor c, m şi n se
repetă.
Folosind Descrierea în Pseudocod a algoritmului şi ciclul cu test final vom avea:
citeşte m,n
repetă
atribuie c n , r m-int(m/n)*n
atribuie mn , n r
până r=0
_[]
scrie c
stop
Condiţia de terminare a ciclului poate fi orice expresie logică.Secvenţa de operaţii din ciclu
alcătuieşte corpul ciclului .Ea poate conţine oriceoperaţii, inclusiv iteraţii.
l) Ciclul cu test iniţial – În cazul ciclurilor sau iteraţiilor condiţia de ciclare poate apare şi la
începutul secvenţei de ciclare
Forma generală este :
cât timp condiţia execută
secvenţa
[]
Condiţia poate fi orice expresie logică , iar secvenţa poate conţine orice comenzi , inclusiv
comenzi de ciclare.
Modul de execuţie al ciclului cu test iniţial :
1-se evaluează condiţia;dacă rezultatul este fals(condiţie neîndeplinită) execuţia se termină,iar dacă
rezultatul este adevărat se continuă secvenţa(etapa 2)
2-se execută secvenţa,după care se continuă cu 1.
În cazul în care rezultatul evaluării condiţiei este fals încă de la început,secvenţa nu se
execută niciodată spre deosebire de ciclul cu test final,când secvenţa se executa cel puţin o dată.
Scrierea algoritmului lui Euclid în Pseudocod folosindciclul cu test iniţial ne conduce la:
citeşte m,n
atribuie c n , r m-int(m/n)*n
cât timp r <> 0 execută
atribuie m n , n r, c n
atribuie r m-int(m/n)*n
[]
scrie c
stop
m) Ciclul de contor, cu forma generală:
pentru contor = val iniţială, val.finală,pas execută
secvenţa
[]
unde prin contor se înţelege o variabilă cu valori întregi:”valoarea iniţială, finală şi pas” pot fi expresii
aritmetice cu valori întregi.
Execuţia ciclului cu contor se explicitează astfel:
5) variabilei contor i se atribuie valoarea iniţială;
6) se verifică condiţia contor > val. Finală; dacă rezultatul este fals se continuă cu, astfel
execuţia ciclului se termină;
7) se execută secvenţa
8) se modifică valoarea contorului cu pasul p şi se continuă cu pasul 2)
Exemplu: aflarea lui n!
Observaţii: 1. Dacă pasul de ciclare este 1, se poate omite
2. Algoritmul a fost completat şi pentru cazul în care n = 0
citeşte n
atribuie p = 1
dacă n>0 atunci
pentru i=1,n execută
atribuie p=p*i
[]
[]
scrie p
stop
n) Proceduri şi funcţii
În rezolvarea unor probleme apar frecvent situaţii când un număr decomenzi se repetă
schimbându-se numai variabilele ce compun aceste comenzi,structura comenzilor rămânând aceeaşi.
Pentru a nu repeta acel număr de comenzi în mai multe locuri în cadrul descrierii algoritmului de
rezolvare a problemei se folosesc procedurile şi funcţiile.
Procedura – descrie în termeni generali un algoritm cu posibilitatea de a aplica acel algoritm în
diverse cazuri particulare concrete.
Pentru a se identifica,procedurii i se asociază un nume.La definirea procedurii trebuie să se
asocieze un se de parametri , variabile care specifică mărimile ce se modifică la fiecare apelare a
procedurii.
Structura unei proceduri, în Pseudocod este :
Procedure nume (parametrii) este:
secvenţa
sfârşit
unde:
- nume = numele procedurii
- parametrii = parametrii formali ai procedurii
Apelul unei procedurei specifică numeleprocedurii,precum şi parametrii actuali prin care se
transmit valorile cu care se efectuează comenzile din procedură.
Structura apelului unei proceduri este :
execută nume ( parametrii )
unde : - nume = numele procedurii ce se apelează
- parametrii = parametrii actuali ( efectivi ),adică cei pentru care urmează a se
efectua comenzile din procedură.
Exemplu: Să se construiască o procedură pentru aflarea normei unui vector.Se ştie că
norma unui vector A de n componente se defineşte prin relaţia:
S=
Descrierea în Pseudocod a procedurii este :
Procedura norma (a, n; s) este :
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 :
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:
= =
Să se calculeze pentru un n dat , toţi termenii şirului lui Fibonacci, cunoscând relaţia de
recurenţă f k = f k-1+ f k-2 , pentru orice k >= 2 şi f0 =0, f1 = 1
a) Descrierea algoritmului în limbaj natural
Relaţia de recurenţă necesită două valori iniţiale f 0 şi f . Această relaţie va fi aplicată de n-2 ori ,
actualizând de fiecare dată pe f k-2 şi f k-1.Deci pentru calculul termenului curent f k sunt suficienţi 2
termeni consecutivi din şir. Vom nota cu “a” termenul f k-2 ,cu “b” f k-1 şi cu “c” termenul f k calculat.
b.) Descrierea algoritmului în pseudocod:
citeşte n
scrie n
{iniţializează primi 2 termeni ai şirului}
atribuie a 0, b 1
scrie a,b {primi doi termeni}
pentru k=3, n, 1 execută
atribuie c a+b {calculează termenul curent}
a b {actualizarea ultimilor doi}
b c {termeni din şir}
scrie c
stop
d.) Programul PASCAL:
program fibonacii;
var
a,b,c,k,n:integer;
BEGIN{main}
write('Introduceti nr. de
termeni:');
readln(n);
a:=0; b:=1;
write(a:3);
for k:=3 to n do
begin
c:=a+b;
a:=b; b:=c;
write(c:3)
end;
END.
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
Program divizorii ;{descompunere în factori primi}
var n,d,m:integer;
BEGIN{main}
write (‘introduceti n:integer’);
readln(n);
writeln(n:4,’are urmatorii factori primi’);
writeln(‘factor’,’‘:5,’multiplicitate’);
d:=2;{cel mai mic numar prim}
while d<= trunc(sqrt(n+0.5)) do
begin
m:=0;
while(n mod d)= 0 do
begin
n:=n div d;
m:=m+1;
end;
if m>0 then
writeln(d:5,’ ‘:9,m:2);
if d = 2 then d:=3
else d:=d+2;
end;
if n>1 then writeln(n:5,’ ‘:10,’1’);
END.
3.5.3 Algoritmul lui Euclid
1)Să se calculeze c.m.m.d.c. şi c.m.m.m.c a două numere întregi aplicând algoritmul lui
Euclid.
a.) Descrierea algoritmului în limbaj natural:
Se ştie că c.m.m.m.c a două numere A şi B este egal cu raportul dintre produsul celor două numere
şi c.m.m.d.c. al celor două numere. Ca atare în variabila p se va reţine produsul celor două numere.
Variabila CMMMC va reţine c.m.m.m.c, iar variabila CMMDC va reţine c.m.m.d.c. Conform
algoritmului lui Euclid de aflare a c.m.m.d.c se împarte cel mai mare număr (A) la cel mai mic (B) şi se
calculează restul împărţirii întregi (R). Dacă restul împărţiirii este 0 atunci c.m.m.d.c. este B. În caz
contrar se fac atribuirile: lui A i se atribuie B iar lui B i se atribuie R şi procesul se continuă până R=0.
Dacă la introducerea datelor B>A, se schimbă între ele cele două valori.
Dacă cel mai mic număr este 0 se va tipări mesajul ‘unul dintre numere este 0’ şi nu se va calcula
c.m.m.m.c.
Pentru calculul restului împărţirii se va folosi operatorul PASCAL ,,mod”.
b.) Descrierea şi semnificaţia structurilor de date folosite:
A,B : cele două numere întregi
CMMDC, CMMMC : variabile întregi pentru calculul c.m.m.d.c. şi c.m.m.m.c.
c)Descrierea şi semnificaţia structurilor de date folosite
a,b : cele două numere întregi
cmmdc,cmmmc : variabile xîntregi pt.calculul cmmdc şi cmmmc
p : produsul celor două numere ( pentru calculul cmmmc)
x : variabilă auxiliară
d)Descrierea algoritmului în Pseudocod
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
zero’);
END.
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
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.
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;
TEMA 4)
ELEMENTE DE BAZA ALE LIMBAJULUI PASCAL
4. Limbaje de programare
4.2.2 Identificatori
Un identificator este o succesiune de litere sau cifre sau caracterul special’_’ din
care primul caracter nu poate fi cifră. Cu ajutorul identificaorilor se asociază nume
constantelor, variabilelor, procedurilor etc.
Exemple de identificatori: a1, tasta, un_numar.
Exemple eronate: 4ar, mt& (primul începe cu o literă , al doilea conţine un
caracter nepermis). O categorie specială de identificatori este dată de cuvintele cheie
ale limbajului(au un înţeles bine definit şi nu pot fi folosite în alte context).
Acestea sunt:
AND,ARRAY,BEGIN,CASE,CONST,DIV,DO,DOWNTO,ELSE,END,FILE,FOR,FUNCT
ION,GOTO,IF,IN,LABEL,MOD,NILL,NOT,PROCEDURE,PROGRAM,RECORD,REPE
AT,SET,OF,OR,ORIGIN,OTHERWISE,PACKED,THEN,TO,TYPE,UNTIL,
VAR,WHILE,WITH.
Citiri, scrieri
Să analizăm programul de mai jos, care citeşte un număr întreg(pe care noi îl
introducem de la tastatură) şi îl tipăreşte:
program c1;
var a:integer;
begin
read(a);write(a)
end.
În cazul în care introducem numărul 10, calculatorul va tipării 10, dacă
introducem 16, calculatorul va tipării 16 ş.a.m.d.
Citirea datelor se face cu ajutorul procedurii READ şi READLN. În acest
paragraf sunt prezentate aceste proceduri într-o formă mult simplificată. Pentru
amănunte, vezi fişier text. Procedura READ are forma READ(var), unde var are
semnificaţia de variabilă(variabile de tip boolean şi enumerare nu se citesc). Se citeşte
de la tastatură o dată care se depune în variabila var. Procedura READLN se
foloseşte exact ca READ, cu deosebirea că, după citire, cursorul sare pe linia
următoare a ecranului.
Scrierea datelor se face cu ajutorul procedurii WRITE şi WRITELN. În ambele
cazuri se scrie începând cu poziţia curentă a cursorului pe ecran. Diferenţa între
WRITE şi WRITELN este aceea că, după scriere, prin utilizarea procedurii WRITE
cursorul rămâne după ultimul caracter scris, iar prin utilizarea procedurii WRITELN el
sare pe prima poziţie a liniei următoare.
Exemple:
WRITE (a), unde a este o variabilă care conţine numărul 3 - scrie 3 începând din
poziţia curentă a cursorului.
WRITE (a,b), unde a şi b sunt variabile întregi care au conţinuturile 2, respectiv 3
- va avea ca efect scrierea numărului 2 urmat de numărul 3 (apare 23).
WRITE (‘a=’,a) - are ca rezultat scrierea şirului de caractere ‘a=’urmat de data
reţinută de variabila întreagă a.
Presupunem că b este o variabilă reală (care reţine numere reale) şi conţine
numărul 3.25 WRITELN (b:4:2) va determina apariţia pe monitor a numărului 3.25.
Cifra 4 are semnificaţia de număr total de poziţii pe care să se scrie numărul real, iar
cifra 2 numărul de poziţii pe care să se scrie partea zecimală (în absenţa acestor
parametri, data reală se va scrie într-o formă greu inteligibilă).În situaţia in care partea
întreagă a datei reale nu încape în formatul prestabilit, nu se mai ţine cont de acest
format.
O utilizare specială o au instrucţiunile readln şi writeln fără parametri. Să
analizăm programul de mai jos.Acesta tipăreşte numărul 6 (se poate tipări un număr în
acest mod). Observăm că programul se termină cu instrucţiunea readln. Ce rol are ea?
După ce un program îşi încheie execuţia, se revine în mod automat în mediul în care
se găseşte textul sursă. Rezultatele se pot vizualiza tastând ALT + F5. Pentru ca
revenirea să nu se facă automat (să avem timp să vedem rezultatul), vom utiliza
instrucţiunea readln fără parametri. Efectul? Se va aştepta să se tasteze Enter. În
acest timp, avem posibilitatea să vedem ce s-a tipărit.
program c2
begin
writeln(6)
readln;
end.
Programul de mai jos tipăreşte numerele 6 şi 7. Între cele două numere există un
rând liber. De ce? Pentru că am utilizat writeln. Instrucţiunea writeln fără parametri are
rolul de a determina saltul cursorului pe rândul următor.
program c3;
begin
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ă reală
Constantă
Sir caractere
Constantă simbolică
Constante întregi. Sunt alcătuite dintr-o submulţime a numerelor întregi care pot
fi reprezentate în memoria calculatorului.
Observaţie: Nu se pot reprezenta în calculator numere oricât de mari sau oricât
de mici (orice număr ocupă un spaţiu în memoria internă a calculatorului). Prin
utilizarea limbajului Turbo Pascal se pot reprezenta numere întregi cuprinse în
intervalul [-2.147.483.648, 2.147.483.647].
Numerele se pot reprezenta în baza 10 sau în baza 16 (mai rar utilizată). Pentru
baza 16, numărul este precedat de caracterul special ‘$’.
Exemple: 32, -164, +131, $a1.
Cifră
Constantă
întreagă
Cifră
hexazecimală
Constante reale. Sunt alcătuite dintr-o submulţime a numerelor reale (mai precis
a numerelor raţionale) care pot fi reprezentate în calculator. Numerele se găsesc în
intervalul [3.4*10-4932, 1,1*104932]. În locul virgulei se foloseşte punctul Exemple: 2.34, -
45.26, 512E+23, -45.1E-3.
Ultimele două numere folosesc o scriere neîntâlnită în matematică. Ele
reprezintă numerele 512*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;
identificator = expresie;
Exemplu.
const NrMaxValori = 30;
Dim = NrMax Valori*2-1;
Mesaj = ‘Nu exista solutie’#10#13'
PI = 3.14;
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ă
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]
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]
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.
În programul următor definim tipul timp. Acesta este format din 4 valori numite:
dimineaţa, prânz, seara şi noaptea. Tot aici, am declarat o variabilă de tip timp, căreia
i-am atribuit o valoare.
program ordinal3;
type timp= (dimineaţa, prânz, seara, noaptea);
var a:timp;
begin
a:= dimineaţa;
end.
Observaţii:
Valorile unui tip enumerare nu se citesc şi nu se tipăresc.
Ordinul primei valori din şir este 0, următoarea valoare din şir are ordinul
1, următoarea are ordinul 2 ş.a.m.d.
Tipul subdomeniu. Fiind dat un tip ordinal – numit tip părinte, putem construi un
alt tip ordinal numit tip subdomeniu al părintelui. Tipul subdomeniu conţine o
submulţime de valori consecutive(în şirul crescător al valorilor tipului părinte).
Precizarea valorilor tipului subdomeniu se face după formatul următor:
valoare1..valoare2
unde:
valoarea1 reprezintă prima valoare din submulţime(cu ordinul cel mai
mic);
valoarea2 reprezintă a doua valoare din submulţime(cu ordinul cel mai
mare);
În programul de mai jos am definit următoarele tipuri de subdomeniu:
TreiValori – subdomeniu al tipului enumerare Valori (definit mai sus)
care conţine valorile a,b,c;
CifreNenule – subdomeniu al unui tip întreg şi conţine numerele
naturale 1,2…9;
Litere – subdomeniu al tipului char şi conţine caracterele ‘c’,’d’,…,’k’.
De asemenea , am declarat câteva variabile din fiecare tip şi i-am atribuit câte o
valoare a tipului respectiv.
program test;
type Valori =(a,b,c,d);
TreiValori= a..c;
CifreNenule =1..9;
Litere = ‘c’..’k’;
var x: TreiVAlori; z: CifreNenule; z: Litere;
i: integer;
begin
i:=9;y:= i;z:= ‘e’; x:= b
end.
Observaţie. În cazul unui tip subdomeniu, ordinul oricărei valori este acelaşi cu
ordinul în tipul părinte. Să analizăm programul de mai jos:
program test;
type Litere = (a,b,c,d);
Lit = b..d;
var l:Lit;
begin
1:= b;
writeln(ord(1));
end.
Tipul Lit este un tip subdomeniu al tipului Litere. Ordinul valorii b este 1(acesta
este ordinul ei din tipul Litere.
4.2.5 Variabile
Variabile. Declararea variabilelor
VA identificator : tip ;
R
:
Prioritatea operatorilor
Operatorii au o anumita prioritate. De exemplu. Operatorul de inmultire are o prioritate mai mare decat
cel de adunare. Aceasta inseamna ca se executa intai inmultirea, apoi adunarea. Operatoriisunt
impartiti in 4 grupe,dupa priorutate. Astfel, operatoriidin grupa 1 au prioritatea cea mai mare,urmeaza
operatorii din grupa 2, grupa 3,iar la sfarsit cei din grupa 4. Iata cele 4 grupe de prioritate:
Grupa 1 (operatori unari- prioritate maxima): not, + (operator unar) , -
(operator unar);
Grupa 2 (operatori multiplicativi): and,*,/,div,mod;
Grupa 3 (operatori aditivi): or,xor,+,-;
Grupa 4 (operatori relationali- prioritate minima): <,<=,>,>=,=.
Aceasta nu înseamnă că este bine să procedăm astfel. Să ne imaginăm că avem în faţă un program
mare scris aşa. El poate fi rulat, dar care programator va mai înţelege ceva, dacă îl priveşte?
Observaţie 3. Versiunea Borland a limbajului permite ca secvenţa program nume să lipsească. De
exemplu putem scrie şi aşa:
begin
end.
Dacă suntem ordonaţi nu procedăm astfel. Un program scris în Pascal (oricât de complex ar fi) are
structura următoare:
program nume;
definiţii de constante;
definiţii de tipuri;
declaraţii de variabile;
declaraţii de subprograme;
begin
instrucţiuni
end.
Nu este obligatoriu ca într-un program să figureze toate acestea, dar dacă figurează, trebuie să apară în
această ordine.
4.2.8 Comentarii
Separatori şi comentarii. Cele mai simple elemente alcătuite din caractere cu
semnificaţie lingvistică poartă denumirea de unităţi lexicale. Acestea se repetă între
ele, după caz, prin unul sau mai multe blancuri, caracterul CR, sfârşit de linie sau
caracterul ’;’. Pentru ca un program să fie uşor de înţeles se folosesc comentariile.
Acestea se plasează oriunde în program. Un comentariu poate fi scris în două feluri:
între acolade, exemplu: {un comentariu}
între paranteze rotunde urmate de *, exemplu (*un comentariu*).
4.2.9 Expresii
<expresie>::=<operand>|<operator_unar><expresie>|
<expresie><operator_binar><expresie>
Clase de precedenta a operatorilor:
1. Operatorii unari + si -
2. Operatorul unar NOT
3. * DIV / MOD AND SHR SHL
4. + - OR XOR * (intersectie) + (reuniune) - (diferenta)
5. < <= > >= = <> IN
O expresie este fie o constanta, fie o variabila, fie un apel de functie, fie o combinatie
corecta (din punct de vedere sintactic) de expresii mai simple.
“Combinarea” se realizeaza cu ajutorul operatorilor. Elementele care se combina se
numesc operanzi. In general, se lucreaza cu expresii algebrice, in care regulile de formare sunt
aceleasi ca si in matematica, insa, dupa cum am mai spus, expresiile se scriu liniarizat. Pot
exista,de asemenea,si expresii nenumerice,cum ar fi de pilda:’Turbo’+’Pascal’,aici simbolul +
reprezentand alipirea (concatenarea) celor doua siruri de caractere.Rezultatul este sirul
‘TurboPascal’.
Prioritate Operator
Atentie! O alta eroare ce poate surveni in scrierea unei expresii este urmatoarea: daca a, b
si c sunt valori intregi, de pilda, expresia (a>b) and (b<c) nu este echivalenta cu expresia a>b
and b<c, deoarece aceasta din urma este incorecta, fiindca mai intai se efectueaza operatia pe
biti: b and b si expresia isi pierde sensul!
expresie
+
termen
factor operator multiplicativ
factor
Un factor este fie un numar fara semn, fie o constanta sau o variabila, fie un identificator
de functie avand ca argument o alta expresie (intre paranteze), fie un alt factor precedat de
operatorul unar NOT.
Erori frecvente in scrierea expresiilor
Tipul expresiilor
4.2.10 Atribuirea
Sintaxa instructiunii de atribuire
LIMBAJUL PASCAL
id_variabila:=valoare/expresie;
Precizare: Tipul variabilei trebuie sa coincida
cu tipul valorii/expresiei.
Prin operatia de atribuire se retine o anumita data dintr-o variabila. Ea are mai multe forme ,pe
care le vom prezenta pe rand.
Forma1.
V:=data
Semnificatia este urmatoarea:
V este numele unei variabile de un tip oarecare;
:= notatia pentru operatia de atribuire;
data – o valoare de un tip oareacare.
Cu o singura exceptie ,tipul variabileitrebie sa coincida cu tipul valorii atribuite. Exceptia este
urmatoarea: unei variabile de tip real i se poate atribui o data de tip intreg.
Real d;
D:=7;
Forma 2
V1:=v2; unde v1 si v2sunt nume de variabile. Cu o exceptie , tipul celor doua variabile
trebuie dsa coincida. Efectul este ca variabila v1 va retine continutul variabilei v2. Dupa aplicarea
acestei operatii,continutul variabilei v2 ramane nemodificat, iar continutul variabilei v2 se pierde.
Observatie: Nu este indiferentmodul de scriere a variabilelor in cadrul atribuirii. Atribuirea a:=b
nu este identica cu b:=a. Este adevarat ca , dupa atribuire ,cele doua variabile vor avea acelasi continut.
Insa este important ce continut( al lui b dupa prima atribuire, al lui a dupa a doua).
Forma 3
V:=expresie;
Initial se evalueaza expresia, iar valoarea obtinuta este atribuita variabilei v. Consideram ca daca
cel putin unul din operanzi este real, tipul expresiei este real si poate fi atribuit doar unei variabile de
tip real,iardaca toti operanzii sunt intregi, tipul expresiei este intreg si poate fi atribuit unei variabile de
tip intreg sau real. Facem conventia ca operatorul da intot deauna un rezultat de tip real,chiar daca
ambii operanzi sunt intregi.
Exemplu: Fie c o variabila de tip integer care retine numarul 4 si d o variabila de tip real care
contine numarul 7.3. Efectuam atribuirea d:=c+1. Dupa atribuire continutul lor va fi: c=4;d=5.
Explicatie: Am vazut ca este posibil ca unei variabile de tip real sa-i atribuim o valoare
intreaga. Este normal sa fie asa pentru ca multimea numerelor intregi este submultome a numerelor
reale.
Exista multe moduri in care putem gresi atunci cand acriem o instructiune de atribuire. Vom
incerca totusi o sistematizare a erorilor.
Eroare 1.Gresim scierea expresiei.
Orice atribuire contine o expresie (fie ea si redusa la un singur operand). Evident, daca nu am scris
corect expresia , nici atribuirea nu se poate efectua. Exemplu: Fie a o variabila de tip integer. Scriem
atribuirea; a:=1+3(4+5). Expresia este gresita (lipseste operatorul de inmultire ). Prin urmare,atribuirea
este imposibila. Corect este a:=1+3*(4+5).
Eroare 2.Tipul variabilei nu coincide cu tipul expresiei, chiar daca expresia este scrisa
corect.Erorile de acest tip apar foarte des.
Fie atribuirea c:=9,unde c este o valoare de tip string.
La ce foloseste atribuirea ? Atribuirea are un rol urias in programare. Sa inceracam o sistematizare
a cazurilor cand folosim atribuirea.
o Intializari.
Stabilirea valorilor cu care anumite variabile intra in calcule se numeste initializare. Initializarile se
fac cu ajutorul instructiunii de atribuire.
o Calcule.
Majoritatea programelor efectueaza calcule. In afara tiparirii imediate a rezultatului evaluarii unei
expresii, exista si posibilitatea dca acesta sa fie pastrata intr-o variabila. In astfel de cazuri se foloseste
operatia de atribuire. Exista doua forme in care atribuirea intervine in calcule.
Forma directa. Unei variabile i se atribuie o expresie cu operanzivariabile, constante, altii
decat variabila care va retine rezultatul. Dupa atribuire, toti operanzii raman nemodificati.
Exemplu: Fie a, b, c trei variabile de tip integer, care contin, respectiv, valorile 2, 3, 4. Se
efectueaza atribuirea a:=b*c. Inurma atribuirii, continutul celor trei variabile devine: a=12, b=3, c=4.
Forma indirecta. Unei variabile i se atribuie o expresie cu operanzi variabile, constante, in
care intra si valoarea pe care o retine variabila careia i se face atribuirea. Revenim la exemplul
anterior (aceleasi variabile cu aceleasi valori initiale). Efectuam atribuirea a:=a+b*c. Iata ce retin cele
trei variabile: a=14, b=3, c=4.
o Copiere. De multe ori, este necesar ca o valoare retinuta de o variabila sa fie retinuta si de alta. O
simpla operatie de atribuire ne rezolva problema de mai sus. De exemplu, daca x si y sunt douia variabile de tip real
care retin doua valori oarecare, is dorim ca variabila x sa retina valoarea pe careo retine y, efectuam atribuirea x:=y.
Atentie! Dupa atribuire, continutul variabilei ramane neschimbat.
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.
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.
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:
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:
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
atunci cand se doreste prelucrarea de linii de caractere, cu dimensiuni variabile.
Program demonstrativ
Sa se citeasca mai multe linii de caractere de la tastatura si sa se afiseze fiecare linie, inlocuind
caracterele mici cu majusculele corespunzatoare. Prelucrarea se va incheia la aparitia caracterului ‘$’.
Pentru a transforma literele mici in litere mari se va folosi functia UpCase.
Program ConversieMinusculeMajuscule;
Var linie_vida,gata: Boolean; c:Char;
begin
Gata:=False;
While not gata do
begin
Write(‘Dati linia: ‘);
While not EoLn do
begin
Read(c);Write(UpCase(c));
linie_vida:=False;
if c=’$’ then gata:=True
end;
if linie_vida then WriteLn(‘Linia este vida!’)
else WriteLn
end.
TEMA 5)
INSTRUCTIUNILE LIMBAJULUI PASCAL
4.4.12 Structuri de control
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:
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;
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.
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
Operatia de decizie este if. Iata care este forma ei generala:
If expresie logica then operatie
Else operatie
endif
Modul de executie este urmatorul:
1.)Se evalueaza expresia logica;
2.) Daca expresia logica produce valoarea true, se executa operatia aflata dupa then , altfel (daca
expresia logica ia valoarea false) se executa operatia aflata dupa else.
Observatie: Decizia consta in a alege o operatie sau alta spre a fi executata ( in nici un caz amandoua). Sa dam
un exemplu: se citesc doua numere intregi a si b. Se cere sa se tipareasca cel mai mare dintre ele.
Integer: a,b;
Read a;
Read b;
If a>b then write a
Else write b
Endif
In primul rand, se evalueaza expresia logica. In exemplul nostru ea este a>b. In cazul in care numarul retinut
de variabila a este mai mare decat cel retinut de variabila b, expresia logica ia valoarea true si setipareste a.
Contrar, expresia logica ia valoarea false si se tipareste b.
Avem posibilitatea ca una sau ambele operatii subordonate operatiei if sa fie tot operatie (operatii if) if.
Exemplu: se citesc 4 valori reale a, b, c, d. Sa se evalueze expresia:
a+b, c+d>0
E= a-b, c+d=0
a*b, c+d<0
Exemplu numeric. Fie a=1, b=2, c=3, d=4. Avem c+d=7>0, rezulta ca se va tipari a+b=1+2=3. Analizati
algoritmul care urmeaza:
Real a, b, c, d, rez;
Read a, b, c, d
If c+d>0 then rez:=a+b
Else if c+d=0 then rez:=a-b
Else rez:=a*b
Endif
Endif
Write rez
Daca suma c+d nu este mai mare decat 0, rezulta ca este mai mica sau egala cu 0. Din caest motiv,clauza else
a primului if va contine o alta operatie if in urma careia se va decide daca c+d=o sau c+d<0 (pentru care nu
mai facem testul c+d<0).
O problema interesanta este si aceasta: daca algoritmul impune ca instructiunea care urmeaza cuvantului cheie
then, sau cea care urmeaza cuvantului cheie else sa lipseasca –cum procedam?
Principiul de executie:
Se evalueaza expresia logica;
In cazul in care acesta are valoarea true, se executa operatia aflata dupa then, altfel se trece la operatia
urmatoare.
Exemplu. Se citeste o valoare intreaga. In cazul in acre aceasta este para( se imparte exact la 2) se va citi
mesajul “am citit un numar par”. Altfel, programul nu va da nici un mesaj.
Integer nr;
Read nr;
If nr mod 2=0 then write(‘am citi un numar par’)
Endif
Cum putem gresi?
O eroare des intalnita este asa numita eroare a testului inutil. Reluam exemplul in care evaluam expresia:
a+b, c+d>0
E= a-b, c+d=0
a*b, c+d<0
Unii scriu instructiunea if (corespunzatoare) astfel:
If c+d>0 then rez:=a+b:5
Else if c+d=0 then rez:=a-b
Else if c+d<0 then rez:=a*b
Endif
Endif
Endif
Daca c+d>0 nu este adevarat, inseamna ca este mai mic sau egal cu 0, si daca nu este 0, este in mod sigur
strict mai mic decat 0. Nu are rost sa facem un test suplimentar. Calculatorul nu gandeste, il face, programul
functioneaza corect, dar se pierde timp inutil de calcul.
Am lasat in mod intentionat la sfarsit erorile care apar in scrierea expresiilor logice. De multe ori se greseste
in scrierea expresiilor logice care contin operatori relationali si operatorul logic not.
Exemple. Fie expresia logica a>b. Cum o negam? Daca scriem not a>b nu este corect. De ce? Operatorul not
are cea mai mare prioritate. Prin urmare, se va evalua mai intai not a, apoi se va face comparatia. Corect se
scrie not(a>b) ( es compara a cu b, se obtine true sau false, iar rezultatul se neaga).
Fie x si y doua variabile logice. Avem formulele(de Morgan):
not (x or y)=not x and not y
not (x and y)=not x or not y
Demonstram prima formula:
daca x=false,y=false → x or y= false →not(x or y)=true; tot asa not x=true, not y=true, not x and not y=true
daca x=false, y=true →x or y=true →not(x or y)=false; tot asa not x=true, not y=false →not x and not
y=false
daca x=true ,y=false →x or y= true →not ( x or y)=false; tot asa not x=false, not y=true →not x and not
y=false
daca x=true, y=true →x or y=true →not (x or y)=false; tot asa not x=false, not y=false →not x and not
y=false
Sa presupunem ca ne intereseaza sa es execute o operatie atunci cand la citirea a doua valori intregi a si b nu
sunt amandoua strict pozitive.
Corect este: not((a>0) and (b>0)). Dar tot corect este su asa: not(a>0) or not(b<0)
E:=a+b
E=:a*b
E:=a-b
c>0,c=0,c<0
Programul p3, care rezolva aceasta problema,exemplifica folosirea unei instructiuni IF,plasata in corpul unei alte
instructiuni IF.
Program p3 ;
Var a,b,c,e :real;
Begin
Write(‘a=’);readln (a);
Write (‘b=’);readln (b);
Write(‘c=’);readln (c);
If c>0 then e:=a+b
Else if c=0 then e:=a*b
Else e:=a-b;
Writeln(‘e=’,e:3:2);
End.
Exemplul 3.Se citeste o valoare intreaga.In cazul in care aceasta este para (se imparte exact la 2),se va afisa
mesajul”am citit un nr.par”.altfel programul nu va da nici un mesaj.
Program if2
Var nr:integer;
Begin
Write (‘nr=’);readln (nr);
If nr mod 2=0
Then writeln (‘am citit un nr par’);
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 :
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;
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.
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
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.
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.
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.
TEMA 6)
TIPURI STRUCTURATE DE DATE
4.3 Tipuri de date structurate
Tablouri
Tabloul in interpretare matematica
Fie Ani ={1,2,…,ni} multimea primelor ni numere naturale.Fie M=An1 X An2 X … XAnk
produsul cartezian a k astfel de multimi.
Se numeste tablou o functie f:MàT, unde T este o multime oarecare.Numarul k este
dimensiunea tabloului.Daca k=1 tabloul se mai numeste si vector.Vectorul are n 1 componente.Daca k=2
tabloul se mai numeste si matrice.Matricea are n1 X n2 elemente.
Declarare: ARRAY[d1,d2,…,dn] OF tip_element
VAR
x:ARRAY[-10..10]; y:ARRAY[CHAR];
a:[BOOLEAN,1..10]; t:[operatii,1..10,BOOLEAN];
CONST I : ARRAY[1..2,1..2] OF BYTE = ( (1,0), (0,1) )
Referire elemente: x[1]; y[‘z’]; a[false,10]; a[false][10] t[creare,5,true]
Exemple:
1. Vector cu 5 componente numere naturale
V = (1,3,6,2,4 )
Aici k=1,n1 =5,T=N, elementele vectorului sunt v1=1,v2=3,…,v5=4.
2.Vector cu n componente reale
Z=(z1, z2,…,zn), zi real, i=1,n
Aici k=1,n1 =n,T=R.
MASIVE UNIDIMENSIONALE(vectori)
Sunt puţine programele în care nu apar definite masive unidimensionale.Problemele de
ordonare a şirurilor, de calcul a indicatorilor statistici medie şi dispersie ,programele pentru găsirea
elementului minim şi multe altele presupun stocarea valorilor numerice ale şirurilor în zone de
memorie ,care se întâlnesc în practică sub denumirea de vectori.
Definirea :
X: array[ 1..10] of integer;
se specifică:
- x este o dată compusă din 10 elemente;
- elementele sunt de tip întreg;
- primul element al structurii este x[1] , al doilea element este x[2]
- ultimul element este x [10]
Modelul grafic
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)
EXEMPLU:
{Se citesc n numere naturale intr-un vector.sa var i,n:byte;
se calculeze media aritmetica a acestora} a:array[1..50]of integer;
program media; s:integer;m:real;
uses crt; begin
clrscr; begin
write('n='); clrscr;
readln(n); write('n=');
for i:=1 to n do begin readln(n);
write('a[',i,']='); for i:=1 to n do begin
readln(a[i]); write('a[',i,']=');
end; readln(a[i]);
s:=0;for i:=1 to n do end;
s:=s+a[i]; repeat;
m:=s/n; ordonat:=true;
write('media este',m:8:2); for i:=1 to n-1 do
readkey; if a[i]>a[i+1] then begin
end. aux:=a[i];
a[i]:=a[i+1];
{ SE DA UN VECTOR CU N ordonat:=false;
ELEMENTE.SA SE ORDONEZE end;
CRESCATOR PRIN METODA BULELOR. } until ordonat;
program PR10; writeln('sirul ordonat este');
uses crt; for i:=1 to n do
var i,n:byte; write(a[i],'');
A:array[1..20] of integer; readkey;
aUX:integer; end.
ORDONAT:BOOLEAN;
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
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 .
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=
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.
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=
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;
- este înlocuită cu secvenţa:
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
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:
{ Se considera un tablou bidimensional a cu n linii si n coloane (1<=n<=50) componente intregi si un numar intreg
k.
Se cere sa se afiseze tabloul a cu componente intregi .
Se cere ca prin operatii de interschimbare de linii si
coloane sa se obtina un tablou cu elementele de pe diagonala principala
ordonate crescator.}
uses crt ;
var
a: array [1..50,1..50] of integer;
i,j,n,sw: byte;
aux: integer;
begin
clrscr;
write ('n='); readln (n); writeln('dati elementele matricei ');
for i:=1 to n do
for j:=1 to n do begin
gotoxy (4*j,i+2);
readln (a[i,j]);
end;
sw:=1;
while sw=1 do begin
sw:=0;
for i :=1to n-1 do
if a[i,i]> a[i+1,i+1] then
begin
for j:=1 to n do begin
aux:=a[i,j];
a[i,j]:=a[i+1,j];
a[i+1,j]:=aux;
end;
for j:=1 to n do begin
aux:=a[j,i];
a[j,i]:=a[j,i+1];
a[j,i+1]:=aux;
end;
sw:=1;
end;
end;
writeln;
for i:=1 to n do begin
for j:=1 to n do
write (a[i,j],' ');
writeln;
end;
readln;
end.
{Sa se parcurga in spirala o matrice adica sub forma
a[k,k]----------------------->a[k,n-k+1]
a[k-1,k]---------> |
| |
| |
a[n-k+1,k] <---------------- a[n-k+1,n-k+1] }
var a:array[1..10,1..10] of integer;
i,j,k,l,n:integer;
begin
write('n=');readln(n);
for i:=1 to n do
begin
for j:=1 to n do
begin
write('a[',i,',',j,']=');readln(a[i,j]);
end;end; for i:=1 to n do
begin for j:=1 to n do
write(a[i,j]:4);
writeln;
end;
if n=n div 2*2 then
L:=n div 2 else
L:=n div 2 +1;
for k:=1 to L do
begin
for j:=k to n-k do
write(a[k,j]:4);
for i:=k to n-k do
write(a[i,n-k+1]:4);
for j:=n-k+1 downto k+1 do
write(a[n-k+1,j]:4);
for i:=n-k+1 downto k+1 do
write(a[i,k]:4);
end;
readln;
end.
{Sa se elemntele care se afla in interiorul celor patru zone
triunghiulare determinate de cele doua diagonale
Sa se determine o matrice simetrica fata de cea initiala (fata de orizontala)
Sa se determine o matrice simetrica fata de cea initiala (fata de verticala)
Sa se efectueze o rotatie a matricei de 90 de grade,o rotatie de 270 de grade}
type maa=array[1..10,1..10] of integer;
var n,i,j:integer;b,a:maa;
begin
write('n=');readln(n);
for i:=1 to n do
begin
for j:=1 to n do
begin
write('a[',i,',',j,']=');readln(a[i,j]);
end;end;
writeln('zona 1');
for i:=1 to n do
for j:=i+1 to n-i do
write(a[i,j]:3,' '); writeln ;
writeln('zona 2');
for i:=1 to n do
for j:=i+1 to n-i do
write(a[n-i+1,j]:3,' ');
writeln ;
writeln('zona 3');
for j:=1 to n do
for i:=j+1 to n-j do
write(a[i,j]:3,' ');writeln ;
writeln('zona 4');
for j:=1 to n do
for i:=j+1 to n-j do
write(a[i,n-j+1]:3,' '); writeln ; writeln(' simetrica pe orizontala ');
for i:=1 to n do
for j:=1 to n do
b[i,j]:=a[n-i+1,j];
for i:=1 to n do
begin
for j:=1 to n do
write(b[i,j]:3,' ');
writeln ;end; writeln(' simetrica pe verticala ');
for i:=1 to n do
for j:=1 to n do
b[i,j]:=a[i,n-j+1];
for i:=1 to n do
begin
for j:=1 to n do
write(b[i,j]:3,' ');
writeln;
end;
writeln(' o rotatie de 90 de grade ');
for i:=1 to n do
for j:=1 to n do
b[i,j]:=a[j,n-i+1];
for i:=1 to n do
begin
for j:=1 to n do
write(b[i,j]:3,' ');
writeln;
end;
writeln(' o rotatie de 270 de grade ');
for i:=1 to n do
for j:=1 to n do
b[i,j]:=a[n-j+1,i];
for i:=1 to n do
begin
for j:=1 to n do
write(b[i,j]:3,' ');
writeln;
end;
readln;end.
TEMA 7)
FISIERE
Fisiere .Operatii specifice
1.FIŞIERE TEXT, în care sunt memorate caractere organizate în linii consecutive ce sunt separate
printr-un marcaj de sfârşit de linie ( caractere de control CARRIAGE, RETURN şi LINE FEED). În această
categorie intră fişiere ce conţin programe sursă, fişiere document şi orice alte fişiere cu componentele caractere
grupate în linii.
Fişierele text reprezintă nişte fişiere secvenţiale; componentele lor pot fi prelucrate numai în ordinea în
care apar.
După modul în care a fost deschis, asupra unui astfel de fişier pot fi efectuate numai operaţii de un singur
tip. Dacă fişierul a fost deschis prin RESET, asupra lui pot fi efectuate numai operaţii de citire, iar dacă a fost
deschis prin REWRITE sau APPEND, asupra lui se pot efectua numai operaţii de scriere.
- PROCEDURA RESET deschide fişierul pentru executarea unor operaţii de citire şi are prototipul:
- PROCEDURA REWRITE deschide un fişier vid pentru executarea de operaţii de scriere şi are
prototipul:
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.
Procedure Erase (VAR F);
Procedure Rename (VAR F ; NEWNAME); unde NEWNAME reprezintă noul nume care urmează să
fie dat fişierului.
- FUNCŢIA EOLN – ia valoarea TRUE dacă urmează marcajul de sfârşit de linie sau marcajul de
sfârşit de fişier.
- 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.
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;
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.
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.
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]),
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.
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.
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(f1,'f.1');assign(f2,'f.2'); read(x);
assign(f,'f.3'); write(f2,x);
rewrite(f1);writeln; readln;
m:=0; n:=n+1;
read(x);
writeln('f1 are ',m ,'articole f2 are ',n ,' articole read(f,x);
');
write(x:5:0);
reset(f1);reset(f2);rewrite(f);
end;
writeln;
readln;
read(f1,x);read(f2,y);i:=1;j:=1;
end.
while (i<=m) and (j<=n) do
{Sa se scrie un fisier cu tip care memoreaza
if x<y then begin numele elevilor,clasa si
o suma de care dispun si in care sa se faca
write(f,y); totalul pe clase
Sa se determine suma maxima si cine o detine,
if j<n then read(f2,y);j:=j+1; sa se adauge elevi la o clasa si sa se listeze
Sa se extraga o anumita suma sau sa se depuna
de catre un elev de la o anumita clasa}
end type ar=record
cl:string[5];
else nu:string[20];
su:word
begin end;
var fis1,fis2: file of ar;
write(f,x); art1,art2:ar;nr,tot,i,n:word;sfirsit,b:boolean;op:
char;
num,c1:string[5];sum,nm,max:word;
if i<m then read(f1,x);i:=i+1;
nn:array[1..100] of longint;s,j:longint;
end; begin
assign(fis1,'cec');
while i<=m do rewrite(fis1);
write('n=');readln(n);
begin for i:=1 to n do
with art1 do
write(f,x); begin
write('clasa ');readln(cl);
write('nume');readln(nu);
if i<m then read(f1,x);i:=i+1;
write('suma');readln(su);
write(fis1,art1);
end; end;
reset(fis1);read(fis1,art1);tot:=art1.su;c1:=art1.
while j<=n do cl;writeln;
writeln('clasa',art1.cl);
begin writeln('numele ',art1.nu);
writeln(art1.su);
write(f,y);if j<n then read(f2,y);j:=j+1; while not eof(fis1) do
begin
read(fis1,art1);
end; with art1 do
if c1=cl then begin
writeln;writeln(' fisierul f este '); writeln(' ' ,nu,' ',su); tot:=tot+su;
end
reset(f); else
begin
while not eof(f) do writeln(' suma totala ',tot);
tot:=su;
c1:=cl;
begin
writeln('clasa',cl);
writeln(' ',nu,' ',cl); begin
end; end; seek(fis1,nr);
writeln(' suma totala=',tot); read(fis1,art1);
close(fis1); with art1 do
reset(fis1); begin
max:=0; if (c1<>cl) or (num<>nu) then writeln(' nr de
while not eof(fis1) do ordine gresit pentru ',num,' ',c1)
begin else
read(fis1,art1); begin
if art1.su>max then begin b:=true;
i:=1; if op in['i','I'] then
nn[i]:=filepos(fis1)-1;max:=art1.su; su:=su+sum
end else
else if sum>su-25 then
if art1.su=max then begin begin
i:=i+1; writeln(' operatia sau suma data gresit',op,'
nn[i]:=filepos(fis1)-1 ',c1);
end; b:=false;
end; end
reset(fis1); else
writeln('urmatorii detin suma maxima ',max); su:=su-sum;
for j:=1 to i do if b then
begin begin
seek(fis1,nn[j]); seek(fis1,nr);write(fis1,art1);end;
read(fis1,art1); end;
writeln(art1.nu); end;
end; end;
close(fis1); end;
reset(fis1); close(fis1);
write('citi adaugati n=');readln(n); reset(fis1);
writeln(' la ce clasa ');readln(art1.cl); while not eof(fis1) do
seek(fis1,filesize(fis1)); begin
for i:=1 to n do read(fis1,art1);
with art1 do with art1 do begin
begin writeln('clasa',cl);writeln;
write('nume');readln(nu); writeln('SUMA--> ',su,' CLASA----> ',cl);
write('suma ');readln(su); end; end; close(fis1);
write(fis1,art1); readln;
end; end.
close(fis1); {Intr-un fisier cu tip sa se memoreze numele si
reset(fis1); virsta unor persoane
while not eof(fis1) do Dindu-se doua fisiere sa se listeze}
begin type inr=record
read(fis1,art1); nume:string[10];
with art1 do begin virsta:byte;
writeln('clasa',cl); end;
writeln(' ',su,' ',cl); fisier=file of inr;
end; end; close(fis1); var i,inreg:inr;
reset(fis1);nm:=filesize(fis1)-1; f2,f1:fisier;
write('citi modificati n=');readln(n); c:char;
for i:=1 to n do begin
begin assign(f1,'ff.dat');
write('clasa');readln(c1); rewrite(f1);
write('nume');readln(num); repeat
write(' nr de ordine ');readln(nr); write('numele ');readln(inreg.nume);
write('tipul operatiei I?E');readln(op); write('virsta');
write('suma ');readln(sum); readln(inreg.virsta);
if nr>nm then write(f1,inreg);
writeln(' nr de ordine gresit pentru ',num,' ',c1) write('continuati y/n');readln(c);
else until c='n';
assign(f2,'fff.dat');
writeln(' dati inregistrari in al doilea fisier ');
rewrite(f2);
repeat
write('numele ');readln(inreg.nume);
write('virsta');
readln(inreg.virsta);
write(f2,inreg);
write('continuati y/n');readln(c);
until c='n';
reset(f1); writeln(' primul fisier ');
while not eof(f1) do
begin
read(f1,i);
writeln(i.nume,' ',i.virsta);
end;
close(f1);close(f2);
readln;
end.
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 :
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.
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).
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+}.
· 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.
TEMA 8)
APLICATII PRACTICE LA TIPURI STRUCTURATE DE DATE
7 Metode de ordonare
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.
etapa 1)
…
etapa2)
matematic:
v=(3 7 9 1 2)
i=1 j=2
a=v[j]=2=7
deci
APLICATIA:
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
Procedeul continuă până când vectorul este ordonat crescător
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:
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)
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)
…
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
}
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 end;
Se da un vector cu n elemente ordonat readkey;
crescator si o valoare v.Sa se indice end.
daca aceasta valoare exista in sir ,daca 2)Cautare secventiala
da ,sa se precizeze pe ce pozitie se Se citesc n numre naturale intr-un
afla ,folosind metoda cautarii binare . vector.sa se calculeze
ex:3 media aritmetica a acestora
123 ex:n=3
p=2 caut pe 2
=> pe pozitia a doua este} 123
program cautarebinara;
uses crt; =>este 2}
const Nmax=20; program media;
var i,n:byte; uses crt;
a:array[1..20] of integer; var i,n:byte;
v,st,dr,m,k:integer; a:array[1..50]of integer;
ok:boolean; x,s:integer;m:real;
begin begin
clrscr; clrscr;
write('n='); write('n=');
readln(n); readln(n,x);
for i:=1 to n do begin for i:=1 to n do begin
write('a[',i,']='); write('a[',i,']=');
readln(a[i]); readln(a[i]);
end; end;
write('pe cine cautati'); for i:=1 to n do
readln(v); if x=a[i] then
if v=a[1] then write('este',x)
write('valoarea este pe pozitia 1') else
else write(' NU este',x)
if v=a[n] then readkey;
write('valoarea este pe pozitia ',n) end.
else begin
st:=1;
dr:=n;
ok:=false;
while (dr-st>1) and not ok do begin
m:=trunc((st+dr)/2);
if v=a[m] then begin
k:=m;
ok:=true;
end else
if v>a[m] then st:=m
else dr:=m;
end;
if ok then
writeln('valoarea cautata e in sir pe
pozitia ',k)
else
writeln('valoarea cautata nu e in sir');
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.