Documente Academic
Documente Profesional
Documente Cultură
INTRODUCERE ÎN INFORMATICĂ
1. Gândirea algoritmică
Să considerăm, însă, că numărul elevilor este un milion. De această dată, persoana care va
rezolva problema va fi pusă în situaţia dificilă de a privi deodată toţi cei un milion de elevi,
pentru a-i compara între ei. În plus, în nici un moment nu va putea fi sigură că elevii sunt
puşi în ordinea crescătoare a înălţimilor lor, decât dacă le poate privi vârfurile capetelor
tuturor:
Lecţia 1 Introducere în informatică
Chiar dacă va reuşi, îi va veni foarte greu să facă această ordonare care, probabil va dura
foarte mult. De aceea, într-o astfel de problemă trebuie să se aplice o tehnică generală, un
procedeu bine stabilit, care să permită ordonarea crescătoare, în timp util, a oricâtor elevi,
indiferent de numărul lor sau de aşezarea lor iniţială. Se constată că, indiferent care va fi
procedeul sau strategia care se va adopta, acesta va necesita efectuarea unor comparaţii
între câte doi elevi.
Iată o metodă generală de soluţionare a problemei date: se ia cel mai scund dintre elevi şi
se aşază deoparte, apoi se procedează la fel cu restul elevilor; adică se ia cel mai scund din
cei rămaşi şi se aşază alături de primul scos din rând şi tot aşa. Metoda soluţionează
problema, dar ea implică rezolvarea unei subprobleme (probleme mai mici): alegerea unui
cel mai scund elev din mai mulţi, puşi la rând.
Problema determinării minimului.
Ultima problemă pusă mai înainte se rezolvă după cum urmează: se consideră primul elev
din rând ca fiind, până la proba contrarie, cel mai scund elev. Se parcurge rândul de elevi şi,
dacă se întâlneşte un elev mai scund, se renunţă la primul, declarând noul elev drept cel mai
scund; cu acesta se procedează la fel, în continuare. Fireşte, pentru a decide care din doi
elevi este mai mic în înălţime, se vor compara înălţimile lor. Iată cum am depistat, mai sus,
că elevul E3 e cel mai scund din lista E1, E2, E3, E4, E5: Îl considerăm pe E1 (deci primul
din şir, de la stânga la dreapta) drept cel mai mic. Îl comparăm pe E1 cu E2. Observăm că
E1 e mai mic decât E2 (să notăm: E1<E2). Atunci îl păstrăm pe E1 (deci îl considerăm tot
cel mai mic dintre toţi), renunţăm la E2 şi trecem la următorul, deci la E3. Comparându-l pe
E1 cu E3, observăm că E3<E1, deci am dat peste proba contrarie pentru E1, deci va trebui
să-l considerăm pe E3 cel mai mic, de-acum încolo.
8
Lecţia 1 Introducere în informatică
9
Lecţia 1 Introducere în informatică
Să revenim la procedeul (A). Primul pas era crearea şirului vid de elevi. Ne putem imagina
această operaţie prin rezervarea unui spaţiu, în altă parte decât pe locul unde sunt situaţi
elevii nearanjaţi încă. Acel spaţiu se va umple, pe rând, cu câte un elev, până când nu vor
mai rămâne deloc elevi în spaţiul iniţial. Aşadar, avem nevoie de 10 mici suprafeţe pătrate,
pe care să stea cei 5 elevi:
10
Lecţia 1 Introducere în informatică
11
Lecţia 1 Introducere în informatică
12
Lecţia 1 Introducere în informatică
mijloc, vedem ce număr are pagina de acolo şi, în funcţie de el, ne îndreptăm atenţia spre
paginile din faţă sau spre cele din spate, pentru care procedăm la fel.
13
Lecţia 1 Introducere în informatică
14
Lecţia 1 Introducere în informatică
Fireşte, prin instructiune se poate înţelege, în toate cele trei cazuri, fie o instrucţiune
simplă, fie una compusă.
15
Lecţia 1 Introducere în informatică
O astfel de schemă grafică, realizată din romburi, cu o intrare şi două ieşiri, din
dreptunghiuri, cu o intrare şi o ieşire, precum şi din dreptunghiurile racordate START
(obligatoriu unic), cu o ieşire, şi STOP, fără ieşire şi cu cel puţin o intrare, se numeşte
schemă logică. Folosirea lor pentru a descrie un algoritm nu este recomandată, deoarece,
utilizând structurile secvenţială, alternativă şi repetitivă, se pot descrie algoritmi mult mai
inteligibil prin cuvinte. Programarea este tehnica realizării de algoritmi descrişi prin
proceduri şi programe. Ea devine o artă, atunci când se folosesc cele trei elemente de
structurare şi se numeşte programare structurată.
Pentru a vedea ce ar însemna programare nestructurată, să reconsiderăm procedura de
intrare în cabinetul medical:
intrare_la_medic înseamnă
început
bate_la_usă;
dacă răspunsul = ‘poftim !’ atunci intră_în_cabinet;
altfel început
atât timp cât cabinetul_este_ocupat_de_alt_pacient execută
citeste_un_ziar;
intră_în_cabinet
sfârsit
sfârsit.
Instrucţiunea încadrată mai sus se mai poate scrie şi astfel:
A dacă cabinetul este ocupat atunci
început
citeşte_un_ziar;
treci la pasul A
sfîsit
Această întoarcere (“treci la pasul A”) (care seamănă cu întoarcerile din schemele logice)
deranjează deoarece trecerea la pasul anterior A înseamnă nerespectarea regulii conform
16
Lecţia 1 Introducere în informatică
căreia într-o procedură instrucţiunile se execută una după alta, de sus în jos. Iată cel puţin
un motiv pentru care o astfel de instrucţiune, numită instrucţiunea de salt necondiţionat,
nu trebuie folosită.
Dacă saltul ar fi către o instrucţiune foarte îndepărtată, atunci ar fi mai greu de urmărit
procedura. Informaticienii au demonstrat că nici nu e nevoie să fie folosită această
instrucţiune de salt, deoarece cele trei elemente ale programării structurate sunt suficiente
pentru a descrie orice procedură. Dacă, însă, folosirea instrucţiunii de salt ar face procedura
mai lizibilă, atunci se poate apela la această instrucţiune.
17
Lecţia 1 Introducere în informatică
Dacă nu se întâmplă cele de mai sus (deci minim rămâne acelaşi), atunci executăm 4.fie
i=i+1. Pare ciudat, dar i=i+1 nu înseamnă o relaţie matematică, ci pur şi simplu faptul că
i se măreşte cu 1. Astfel, când spuneam fie i=1 însemna că lui i îi dăm valoarea 1,
când spuneam fie minim=hi însemna că lui minim îi dăm valoarea lui hi, deci, în
general, dacă spunem “fie...=...” înseamnă că ce este în stânga primeşte valoarea a
ceea ce este în dreapta (fără ca ceea ce este în dreapta să-şi modifice valoarea). Aşadar,
are sens fie i=i+1, pentru că în dreapta avem o valoare cunoscută. Dacă i=3, de
exemplu, atunci i+1 va fi 4, deci fie i=i+1 echivalează cu a spune fie i=3+1, deci
fie i=4.
În continuare, orice instrucţiune de forma fie x=e va fi notată prin x:=e. Ceea ce este în
dreapta este, într-adevăr. un “x”, adică ceva care se schimbă, primind o nouă valoare. x se
numeşte, de aceea, variabilă. Pe de altă parte, e desemnează o expresie (atât 1, cât şi hi
sau i+1 sunt expresii matematice (i este un nume de variabilă). 1 e o constantă (ca şi 3,
100.45, -24), deci e o expresie constantă numerică, hi este un nume de variabilă
indexată (în programare se notează prin h[i]), deci este o expresie, iar i+1 este tot o
expresie aritmetică, aşa cum şi x+1, 2*n+1, x+y*5-(i+j)/k sunt tot expresii (simbolurile
* şi / notează înmulţirea, respectiv împărţirea).
Prin x:=e înţelegem că lui x i se atribuie valoarea expresiei e, iar o astfel de instrucţiune se
numeşte instrucţiune de atribuire (sau asignare).
• Având o sintaxă foarte simplă, limba engleză s-a impus în lumea ştiinşifică, astfel încât
şi în domeniul nostru ea este aproape singura utilizată. Traducând în engleză termenii
învăţaţi în paragraful despre programarea structurată, avem:
atât timp cât ... execută → while ... do ...
dacă ... atunci ... altfel ... → if ... then ... else ...
precum si început → begin ; sfârsit → end .
Procedura autoapelantă de ordonare se poate scrie acum:
ordonare (n) înseamnă
begin
if n > 0 then
begin
alegere_scund(n); adăugare_scund;
ordonare(n-1)
18
Lecţia 1 Introducere în informatică
end
end.
• Convenim să renunţăm la cuvântul “înseamnă”. Faptul că urmează descrierea
procedurii ordonare se va preciza folosind cuvântul “procedure”, la început:
procedure ordonare(n) ;
begin
if n>0 then
begin
alegere_scund(n) ; adăugare_scund ;
ordonare(n-1)
end
end ;
• Observăm că am folosit, simbolul “;” în două cazuri diferite: pentru a separa cele două
apeluri de alte proceduri (care sunt nişte instrucţiuni) precum şi pentru a marca sfârşitul
descrierii procedurii de ordonare (în loc de punct) sau pentru a delimita antetul ei (în loc
de ”înseamnă”).
• Dacă noi am scrie această procedură pe o foaie de hârtie şi i-am da-o cuiva să o
execute, pentru un anumit n, el va ajunge la apelul alegere_scund(n), deci va trebui
să apeleze o altă procedură, pe care ar trebui să o ştie deja. De aceea, e bine ca
procedura alege_scund să fie descrisă undeva înainte, pe foaia de hârtie. La fel ar
trebui să se întâmple şi cu adăugare_scund.
Iată, deci, câteva convenţii folosite în descrierea procedurilor:
1. Dacă o procedură P foloseşte o procedură Q, atunci mai întâi se scrie Q, apoi P.
2. Orice descriere a unei proceduri începe cu cuvântul procedure, urmat de numele
procedurii şi, în paranteze, argumentele sale; noţiunea de argument va fi explicatâ în lecţia
5. Argumentul unei proceduri este similar celui a unei funcţii: x pentru f(x).
3. instrucţiunile dintr-o procedură, inclusiv la început şi la sfârşit, sunt despărţite de simbolul
punct şi virgulă “;” .
4. Procedurile se pot autoapela.
5. în descrierile procedurilor se folosesc cuvintele “begin” şi “end” pentru a marca corpul
acesteia.
Observăm, aşadar, utilizarea unor reguli de scriere a procedurilor. Descrierile procedurilor
utilizează, de asemenea, o mulţime de cuvinte englezeşti: begin, end, procedure, if,
then, else, while, do. Deci procedurile se descriu conform unor reguli asemănătoare
regulilor de sintaxă adică de scriere a propoziţiilor într-o limbă. Ele utilizează un vocabular
adecvat. Sintaxa şi vocabularul constituie un limbaj. Cum acest limbaj ne permite să
descriem proceduri (programe), el se poate numi limbaj de programare.
Dacă vom urmări cu atenţie, vom observa că limbajul nostru (unii autori numesc un astfel de
limbaj - pseudocod) are unele deficienţe. Una ar fi aceea că, de exemplu, nu putem lucra
decât cu numere; astfel, când scriam “procedure ordonare(n);” intuiam că n este un
număr natural, dar un limbaj mai evoluat ar preciza acest lucru.
De-a lungul anilor, au fost create şi perfecţionate mai multe limbaje de programare. Mai mult
chiar, s-au creat maşini electronice automate care să poată “citi” programe scrise în astfel de
limbaje şi să le execute întocmai. Aceste maşini poartă denumirea de calculatoare
electronice. Ele pot realiza nu doar calcule matematice, ci şi alte operaţii, de pildă de
sortare şi căutare.
Practic, în aranjarea crescătoare a elevilor, ceea ce ne interesează şi trebuie “spus”
calculatorului este că elevii există, sunt în număr de cinci şi că ei au înălţimile pe care le au.
19
Lecţia 1 Introducere în informatică
Acestea se numesc informaţii. În urma aplicării algoritmului dat de noi, calculatorul reuşeşte
să ne prezinte lista elevilor în ordinea crescătoare a înălţimilor lor. Prin urmare el s-a folosit
de algoritmul nostru de sortare pentru a face ceva cu informaţiile primite iniţial. Adică a
prelucrat informaţiile. Noi nu am intervenit în nici un fel în timpul prelucrării. Deci calculatorul
electronic prelucrează automat informaţiile date, în conformitate cu un algoritm dat de om.
Francezii au reunit denumirile de “information” (informaţie) şi “automatique” (automat) într-un
singur termen “informatique” care în româneşte a devenit informatică, termen ce
denumeşte, aşadar, prelucrarea automată, cu ajutorul calculatoarelor electronice
programate, a informaţiilor, tocmai disciplina sau, mai bine zis, ansamblul de discipline în
tainele căruia încercăm să pătrundem împreună, pe parcursul acestor lecţii.
5. Tipuri de date.
Într-o declaraţie de forma procedure ordonare(n), n reprezintă argumentul procedurii;
adică procedura ordonare ordonează n elevi, unde n se va preciza ulterior. Noi convenim
ca n să fie număr natural, chiar dacă din declaraţia de mai sus nu rezultă acest lucru.
În limbajele evoluate de programare, fiecare argument, fiecare variabilă are un anumit tip
bine definit, adică poate lua valori dintr-o mulţime precizată de valori.
De pildă, acel n din ordonare(n) este un număr natural, dar putem considera că ar fi un
număr întreg sau un număr real, caz în care nu ar mai avea sens procedura. Când o
variabilă x poate lua valori din mulţimea tip vom scrie x:tip. În algoritmii simpli, putem
folosi următoarele tipuri de date: Integer = mulţimea numerelor întregi, Real = mulţimea
numerelor reale, Char = caracter, String = şir de caractere şi Boolean = logic.
Ce noteazâ ultimele trei tipuri? Prin x:Char înţelegem că x este un caracter, adică o literă
(mică sau mare), o cifră sau un simbol special: +,[,),‘,$,#,@,:,? etc.. Prin s: String vom
înţelege că s este o înşiruire de astfel de caractere, de pildă s = a0+Z# $M. Pentru a
elimina unele ambiguităţi, s-a convenit să se noteze caracterele şi şirurile de caractere între
apostrofuri: deci, de exemplu: x = ‘a’, s = ‘a0+Z# $M’.
Prin p: Boolean vom înţelege că p este o variabilă logică, în sensul că ea poate avea
doar două valori: adevărat (true) şi fals (false). Astfel, true şi false sunt constante de
tipul Boolean şi, printr-o atribuire de forma p:=true, înţelegem că p devine adevărată, iar
prin q:=false înţelegem că q devine falsă, unde p:boolean şi q:boolean (p şi q sunt
de tip boolean).
E de la sine înţeles că aceste tipuri de date nu sunt singurele de care avem nevoie în
soluţionarea unei probleme cu ajutorul calculatorului. Astfel, în ordonarea crescătoare a
elevilor va trebui să dispunem de acea variabilă n care să reprezinte numărul de elevi. În cu
totul alt mod va trebui să reţinem înălţimile elevilor. Astfel, fiecare înălţime este un număr
real, iar ansamblul acestor înălţimi este ceea ce se numeşte un vector (şir) de numere
reale. Dacă ar trebui să memorăm şi alte date despre fiecare elev în parte, atunci fiecare
elev ar fi o structură (înregistrare, articol) mai complexă, iar mulţimea elevilor ar fi un
vector de astfel de structuri.
Deci, aşa cum programele mari se realizează din îmbinarea armonioasă a procedurilor şi
structurilor elementare, aşa şi tipurile de date se pot forma, pornind de la cele simple,
menţionate mai sus sau de la altele mai complexe, definite deja.
20
Lecţia 1 Introducere în informatică
6. Exerciţii recapitulative
21
Lecţia 1 Introducere în informatică
22