Sunteți pe pagina 1din 11

MODULUL 1

Introducere in programare

Acest modul ofera o fundatie generala a programarii. Pe parcursul unei lectii sunt
prezentate o privire de ansamblu a partilor componente ale unui calculator, punandu-
se accent pe modul de organizare al memoriei; notiunile de program, programare si
limbaje de programare; notiunile de limbaj cod masina si limbaje de programare de
nivel inalt;modalitatile de compilare, link-are si executie a unui program; o scurta
istorie a celor mai importante si mai cunoscute limbaje de programare. Se introduc de
asemenea notiunile de algoritm si top-down design;

La sfarsitul parcurgerii acestui modul studentul va trebui


ƒ sa cunoasca modul de organizare a memoriei calculatorului
ƒ sa inteleaga notiunile de program, programare si limbaje de programare;
ƒ sa invete despre translatarea unui program in limbaj cod masina
ƒ sa-si insuseasca notiunea de algoritm
ƒ sa stie sa scrie algoritmi in formatul top-down

Organizarea materialului este următoarea:


ƒ prezentarea notiunilor teoretice de mai sus si a unui numar de exemple de
algoritmi
ƒ o lista de exercitii si probleme care testeaza insusirea notiunii de algoritm si a
principalelor structuri algoritmice. Mentionam ca aceste probleme nu sunt
ordonate dupa gradul lor de dificultate.
ƒ bibliografie recomandata.

Recomandam parcurgerea materialului in ordinea sa fireasca. Pentru o mai buna


intelegere a notiunii de algoritm si a structurilor algoritmice se recomanda scrierea
algoritmilor ceruti in lista de probleme folosind toate cele trei metode (limbaj natural,
pseudocod si scheme logice).

Timpul mediu necesar parcurgerii şi însuşirii noţiunilor teoretice, formării


deprinderilor practice de rezolvare şi dobândirii competenţelor anunţate este de
aproximativ 4-6 ore de studiu pentru acesta lecţie.
Lectia 1

Cursul prezentat in acest material este despre programare, mai precis despre
scrierea programelor in limbajul C. In acest capitol vom discuta despre programarea
calculatoarelor in general.
Calculatorul poate fi privit ca o "masina" care primeste date de intrare,
proceseaza aceste date si produce date de iesire. De altfel primele calculatoare se
chemau data processing machines. Datele de intrare si iesire pot fi reprezentate sub
forma de text, imagin sau sunete. Ceea ce face ca un calculator sa fie diferit de orice
alta masina este faptul ca un calculator este controlat de catre un program stocat in
interiorul calculatorului. Modificand programul putem determina calculatorul sa
execute comenzi diferite.

1.1 Programe

Un program este alcatuit dintr-un set de instructiuni. Cand este executat,


unitatea de control citeste instructiunile din memoria RAM, una cate una si le executa
in ordinea citirii. Deci putem spune ca o instructiune este de fapt o combinatie de 0 si
1. Spunem despre program ca este reprezentat in cod masina. Acesta este limbajul pe
care il „vorbeste” calculatorul. La inceputurile calculatoarelor se programa direct in
acest cod masina, o munca destul de anevoioasa dupa cum va imaginati. Din fericire
astazi, de regula nici macar nu ne intereseaza care este codul masina al unui calculator
iar programele sunt scrise, dupa cum veti vedea, in limbaje de nivel inalt care sunt
apropiate de limbajul natural.
Un program scris intr-un limbaj de programare contine de fapt un set de
instructiuni scrise dupa anumite reguli foarte precise, reguli ce alcatuiesc sintaxa
limbajului. Programul poate fi scris cu ajutorul oricarui editor de texte si salvat cu
terminatia specifica limbajului de programare. Pentru programele scrise in C aceasta
extensie este .C. Programul este salvat ca fisier de obicei pe hardisk. Inainte de a fi
executat un program trebuie translatat( tradus) in cod masina, limbajul pe care
calculatorul il intelege. Aceasta se face prin intermediul compilatorului, care nu este
altceva decat tot un program.
compilator
Limbaj de Cod masina
programare

Orice limbaj de programare are asociat un compilator, specific acelui limbaj


de programare. Fara acesta programele nu pot fi executate. Compilatorul, cand este
apelat, verifica intai daca regulile de sintaxa ale limbajului sunt respectate. Daca nu
atunci erorile sunt semnalate (numim aceste erori, erori de compilare sau erori de
sintaza) si programul va trebui corectat. In momentul in care nu mai este nici o eroare
de sintaxa compilatorul translateaza programul in cod masina si creeaza un fisier cu
extensia .o ce se numeste fisier obiect si care contine traducerea programului in cod
masina. De obicei un program mare contine mai multe fisiere care evident vor genera
mai multe fisiere obiect. De asemenea in programe se pot folosi pachete de programe,
fisiere obiect create inainte. Pentru a pune toate fisierele obiect impreuna se apeleaza
un alt program numit linker. Acest program produce un fisier executabil (de obicei cu
extensia .exe). Ultimul stadiu este transferarea programului executabil in memoria
RAM pentru a fi executat. Aceasta se face de catre un alt program, program stocat in
memoria RAM la fiecare pornire a calculatorului si numit sistem de operare.
Utilizatorul poate comunica cu sistemul de operare via tastatura sau mouse si ii poate
comunica ce fisier trebuie executat. Atunci sistemul de operare va cauta fisierul in
memoria secundara, il va incarca in memoria RAM dupa care programul este
executat.

1.3 Editarea, compilarea si rularea unui program C in mediul


de programare Visual C++

Compilatorul poate fi apelat de la linia de comanda sau prin intermediul unui


mediu de programare. Prezentam in cele ce urmeaza cum se poate edita, compila si
executa un program scris in C in mediul de programare Visual C++.
1. Lanseaza mediul de programare (facand click pe icoana sa sau din meniul de
start - Start up meniu). Veti obtine o fereastra divizata in mai multe zone.
2. Alege New din meniul File si fa click pe Files. Din fereastra care se deschide
alege optiunea C++ source file. O zona de editare se deschide si poti sa-ti scrii
programul acolo.
3. Salveaza fisierul cu numele dorit si extensia .C (compilatorul va sti ca este un
fisier C - nu C++ - si va aplica regulile de sintaxa din C).
4. Compileaza programul alegand Build din meniul Build
5. Orice program trebuie sa fie inclus intr-un project (workspace). Un project
contine informatii despre program. Cel mai usor este sa lasi Visual C++ sa
creeze un workspace pentru tine. Acest lucru se intampla in momentul in
momentul in care incerci sa compilezi un program. Visual C++ te va intreba
daca doresti sa creeze un project pentru tine. Raspunde Yes.
6. Daca sunt gasite erori de sintaxa mesajele de eroare se vor afisa in partea de
jos a ferestrei. Daca nu sunt erori atunci este apelat linker-ul.
7. Programul este rulat prin apasarea butonului ! sau prin alegerea alternativei
Execute in meniul Build.
8. O alta fereastra in MSDOS se deschide pentru afisarea rezultatelor
programului.
Prezentăm, în cele ce urmează, cum se poate edita, compila şi executa un
program scris în C în mediul de programare DevCpp ce poate fi descărcat gratuit de
pe site-ul www.bloodshed.net, mediu de programare ce foloseşte compilatorul gcc.

‰ în mediul de programare DevCpp

1. Lansează mediul de programare (facând click pe icoana sa sau din meniul de


start). Veti obţine o fereastră divizată în mai multe zone.
2. Alegeţi New din meniul File şi faceţi click pe Source File. O zonă de editare
se deschide şi puteti să scrieţi programul acolo.
3. Salvaţi fişierul cu numele dorit şi extensia .C (compilatorul va şti că este un
fişier C şi nu C++ şi va aplica regulile de sintaxă din C) alegând din meniul
File opţiunea Save as.
4. Compilaţi programul alegând Compile din meniul Execute. O fereastră cu
titlul Compile Progress se deschide.
5. Dacă sunt gasite erori de sintaxă mesajele de eroare se vor afişa în partea de
jos a ferestrei. Dacă nu sunt erori atunci este apelat linker-ul automat de
calculator şi fişierul executabil este creat.
6. Programul este rulat prin alegerea comenzii Run din meniul Execute.
7. O altă fereastra în MSDOS se deschide pentru afişarea rezultatelor
programului. Observatie: Pentru ca rezultatele să poata fi vizualizate (această
fereastra să rămână pe ecran şi după execuţia programului) trebuie să
includem la sfârşitul programului scris în C una sau mai multe instrucţiuni. Pe
acestea le vom prezenta în Lectia 3 când vom da şi un prim exemplu de
program în C.

1.4 Limbaje de programare - scurt istoric

La inceputurile calculatoarelor se programa in cod masina, apoi au aparut


limbajele de asamblare (assembler) in care o instructiune de tipul c = a + b poate fi
scrisa
LOAD A
ADD B
STORE C
In limbajele de asamblare orice linie era o instructiune in cod masina. Translatarea
limbajelor de asamblare in cod masina se face printr-un assembler.
Limbajele de nivel inalt au fost create in anii '50. Programele scrise in aceste
limbaje sunt mult mai apropiate de modul in care ne exprimam decat cele scrise in
limbajele de asamblare. Pentru exemplificare puteti urmari programul hello.C din
capitolul 2 scris in limbajul C. Primul limbaj de nivel inalt a fost FORTRAN(
FORmuleTRANslator). Au aparut apoi versiuni noi FORTRAN 77 si FORTRAN 90.
In 1959 a aparut COBOL introdus pentru programarea in domeniul finantelor.
COBOL ramane unul din cele mai folosite limbaje de acest tip. In 1960 a aparut
ALGOL, un limbaj cu o structura buna. Ca o extensie a lui ALGOL a fost introdus in
1967 SIMULA care permite scrierea de programe orientate pe obiecte. In 1971 a fost
introdus PASCAL, un limbaj simplu, usor de invatat care este folosit pe scara larga.
Cel mai mare dezavantaj al sau este acela ca nu permitere scrierea programelor mari
in module si este limitat in manipularea textelor. Limbajul C a fost creat in 1972 ca un
limbaj de nivel inalt dar avand caracteristicile unui limbaj de nivel scazut. Astazi
multe sisteme de operare si programe de sistem sunt scrise in C.
Ideea de programare orientata pe obiecte introdusa de SIMULA a fost preluata
de un alt limbaj de programare, Smalltalk creat in 1980. In 1983 apare Ada, un limbaj
de programare care ofera programarea pe module. Ada poate fi folosit si pentru
programare paralela (parti de program sunt executate in acelasi timp). Versiunea noua
Ada95 permite si programarea orientata pe obiecte.
Cel mai popular limbaj de programare orientata pe obiecte este C++, o
extensie a limbajului C. C++ a fost creat in 1985 dar a devenit standard numai in
1998. Un alt limbaj de programare orientata pe obiecte este Java ce a fost creat in
1995 si care este bine cunoscut pentru scrierea unor apleti (applets) care, integrate in
pagini web, produc efecte deosebite( sunete, imagini in miscare).
Lectia 2
2.1 Algoritmi

Programele sunt scrise pentru rezolvarea a multiple probleme, efectuarea unor


calcule, afisarea unor date, prelucrarea unor imagini, prelucrarea sunetelor, etc. Pentru
a scrie un program trebuie sa stim precis care este problema ce trebuie rezolvata si
cum trebuie rezolvata pentru obtinerea rezultatului dorit. Descrierea metodei de
rezolvare se numeste algoritm. Un algoritm este un set de instructiuni clare, precise,
neambigue, instructiuni ce duc la obtinerea rezultatului dorit. Un algoritm trebuie sa
se termine dupa un numar finit de pasi. Un algoritm este ca o reteta pe care trebuie sa
o urmarim pas cu pas ca sa obtinem solutia.
Algoritmi se pot reprezenta prin mai multe modalitati. O modalitate este aceea
de a scrie in limbaj natural, o alta este reprezentarea prin scheme logice, alta
reprezentare este in pseudocod, reprezentare foarte apropiata de scrierea in limbajul
de programare.
Un exemplu de algoritm este urmatorul set de instructiuni pentru
a face o cafea:
Pas 1. Scoate din dulap cutia de cafea, cutia de zahar, o lingurita si o ceasca.
Pas 2. Daca doresti sa faci cafeaua pe aragaz atunci mergi la Pasul 4.
Pas 3. Daca doresti sa faci cafeau la filtru atunci mergi la Pasul 15.
Pas 4. Scoate din dulap un ibric.
Pas 5. Umple ceasca cu apa.
Pas 6. Toarna continutul cestii in ibric.
Pas 7. Adauga o lingurita cu varf de cafea in ibric.
Pas 8. Adauga o lingurita rasa de zahar in ibric.
Pas 9. Pune ibricul pe aragaz.
Pas 10. Aprinde chibritul.
Pas 11. Porneste aragazul.
Pas 12. Asteapta sa fiarba cafeaua.
Pas 13. Toarna cafeaua in ceasca.
Pas 14. STOP
Pas 15. Pune apa in filtru pana la semnul care indica o cana.
Pas 16. Pune o lingurita cu varf de cafea in filtrul special.
Pas 17. Baga filtrul in priza.
Pas 18. Apasa pe butonul ON al filtrului pentru a-l porni.
Pas 19. Asteapta sa se scurga toata apa din filtru.
Pas 20. Inchide filtrul de cafea apasand pe butonul OFF.
Pas 21. Toarna cafeaua din vasul de sticla in ceasca.
Pas 22. Adauga o lingurita rasa de zahar in ceasca.
Pas 23. STOP

Un alt exemplu: Consideram urmatoarea problema: avem un cont in banca in


care am depus suma de 10 milioane de lei vechi (1000 lei noi). Banca ofera o dobanda
de 2% pe an pentru acest tip de cont. Vrem sa aflam care va fi suma din acest cont
peste trei ani daca se presupune ca nici o extragere din sau depunere in cont nu vor fi
efectuate.
Algoritmul este urmatorul:
1. Calculeaza dobanda acumulata in primul an
dobanda = 1000 * 2 / 100 = 20lei noi
2. Calculeaza suma de bani din cont dupa primul an
suma = 1000 + dobanda = 1000 + 20 = 1020
3. Calculeza dobanda acumulata in al doilea an
dobanda = 1020 * 2 / 100 = 20,4
4. Calculeaza suma de bani din cont dupa al doilea an
suma = 1020 + dobanda = 1020 + 20,4 = 1040,4
5. Calculeza dobanda acumulata in al treilea an
dobanda = 1040,4 * 2 / 100 = 20,808
6. Calculeaza suma de bani din cont dupa al treilea an
suma = 1040,4 + dobanda = 1040,4 + 20,808 = 1061,208
sau scris intr-o forma mai compacta:
balanta = 1000
an = 1
dobanda = balanta * 2 / 100( = 20)
balanta = balanta + dobanda( = 1020)
an = 2
dobanda = balanta * 2 / 100( = 20,4)
balanta = balanta + dobanda( = 1040,4)
an = 3
dobanda = balanta * 2 / 100( = 20,808)
balanta = balanta + dobanda( = 1061,208)
sau si mai compacta:
1. balanta = 1000
2. Repeta pasii 3-4 de trei ori
3. dobanda = balanta * 2 / 100
4. balanta = balanta + dobanda
5. Afiseaza balanta
6. STOP

Acest algoritm scris cu scheme logice este:

balanta = 1000

an = 1

NU DA
an > 3 Scrie
balanta STOP

dobanda = balanta *2/100

balanta = dobanda+balanta *2/100


an =an + 1

Orice algoritm este o combinatie de trei structuri algoritmice:


• secventa: o serie de pasi ce se executa in ordinea aparitiei. De exemplu, pasii
3 si 4 din algoritmul de mai sus.
• selectie: se alege una dn doua sau mai multe alternative posibile. De exemplu,
pasul 2 din algoritmul cafea sau urmatorul algoritm pentru calculul valorii
absolute a unei variabile reale x:
daca x>0 atunci valoarea absoluta = x
altfel valoarea absoluta = - x
• repetitie: una sau mai multe instructiuni sunt repetate. De exemplu intreaga
secventa de pasi 2- 4 din algoritmul de mai sus.

Alt exemplu de algoritm: calculam suma 1 + 2 + ... + n, n > 0.


Acest algoritm scris in pseudocod este:
read n
suma = 0
i=1
while i <= n
suma = suma + i
i=i+1
endwhile
write suma

2.2 Reprezentarea algoritmilor în limbajul pseudocod

Structurile secvenţiale pot fi reprezentate prin instrucţiuni de intrare/ieşire a


datelor şi prin instrucţiuni de atribuire. Reprezentarea acestora în pseudocod este:
‰ Instructiunile de intrare/ieşire sunt:

read lista variabile şi respectiv write lista de expresii.


‰ Instructiunea de atribuire este: variabila = expresie.

Structurile alternative se reprezintă prin instrucţiunile de decizie.


Reprezentarea acestora în pseudocod este:
‰ Instructiunea de decizie are două forme:

şi if condiţie then S1
if condiţie then S
endif else S2
endif

endif
în care S, S1, şi S2 sunt secvente de instrucţiuni. Efectul acestei instrucţiuni este
următorul: dacă condiţia este adevărată atunci secvenţa S1 este executată, dacă este
falsa atunci secvenţa S2 este executată. În cazul primei forme, dacă condiţia este
adevărată atunci este executată secvenţa S, în caz contrar neexecutându-se nici o
instrucţiune.
Structurile repetitive pot fi de două feluri: cu testare iniţială, adică se
testează întâi dacă condiţia este adevărată şi dacă da atunci se repetă instrucţiunile atât
timp cât condiţia rămâne adevărată şi cu testare finală, adică se repetă instrucţiunile şi
apoi se testează dacă condiţia este adevărată şi dacă da atunci se repetă instrucţiunile
atât timp cât condiţia rămâne adevărată. În pseudocod structurile repetitive au trei
forme: while, do-while şi for.

‰ Instructiunea while:
while condiţie
S
endwhile
în care S este o secvenţă de instrucţiuni care se repetă atât timp cât condiţia este
adevărată. Această instrucţiune corespunde structurilor repetitive cu testare iniţială.
‰ Instructiunea do-while:
do
S
while condiţie
în care S este o secvenţă de instrucţiuni care se execută întâi, apoi se testează condiţia,
după care S se repetă atât timp cât condiţia este adevărată. În consecinţă această
instrucţiune corespunde structurilor repetitive cu testare iniţială.
‰ Instructiunea for se foloseşte în cazul în care se ştie de câte ori trebuie
repetată o
secvenţă de instrucţiuni S. De obicei există o variabilă contor care poate lua mai
multe valori şi în funcţie de care secvenţa S se repetă. Notăm cu val_iniţiala valoarea
iniţială a contorului pentru care S se repetă şi cu val_finala, valoarea finală, iar cu pas
valoarea care precizează modul de modificare a contorului. Atunci instrucţiunea for
se va scrie:
for contor = val_iniţiala, val_finala, pas
S
endfor
şi indică faptul că S se va repeta pentru valorile contorului: val_iniţiala, val_iniţiala
+ pas, val_iniţiala + 2 * pas, ..., val_finala. Această instrucţiune este echivalentă cu
următoarea secvenţă de algoritm, secvenţă ce foloseşte instrucţiunea while:
contor = val_iniţiala
while contor <= val_finala
S
contor = contor + pas
endwhile
În cazul în care valoarea pasului este 1, acesta de obicei nu se mai scrie, fiind
subînţeles.
Exemplu Să calculăm suma 1 + 2 + ... + n, n natural. 
Un algoritm de rezolvare a acestei probleme, scris în pseudocod, este
următorul:
read n
suma = 0
i=1
while i <= n
suma = suma + i
i=i+1
endwhile
write suma
Acestă reprezentare este echivalentă cu următoarea:
read n
suma = 0
for i = 1, n
suma = suma + i
endfor
write suma

Exemplu : Se citesc n numere întregi. Să se calculeze suma numerelor citite.  
Algoritm de rezolvare a acestei probleme, scris în pseudocod, foloseşte
instrucţiunea for şi este următorul:
read n
suma = 0
for i = 1, n
read x
suma = suma + x
endfor
write suma

2.3 Algoritmi scrisi in formatul „de sus in jos”( top- down


design)

Pentru rezolvarea unor probleme mai complexe este folositor sa impartim


problema in mai multe subprobleme pe care apoi sa le rezolvam separat. Aceste
subprobleme pot fi la randul impartite in subprobleme pana cand se ajunge la
probleme simple ce pot fi rezolvate intr-un singur pas. Aceasta tehnica de scriere a
unui algoritm se numeste scriere in formatul „de sus in jos”.
Consideram urmatoarea situatie: avem un suport de CD-uri orizontal cu sloturi
pentru fiecare CD. CD-urile sunt asezate in ordine alfabetica, dupa numele
interpretului de la stanga la dreapta fara spatii goale intre ele. Presupunem ca mai sunt
cel putin 5 sloturi neocupate in partea dreapta. Presupunem ca am cumparat 5 CD-uri
noi pe care vrem sa le punem in suport pastrand in permanenta ordinea alfabetica.
CD-urile sunt pe masa si le vom lua unul cate unul si le vom pune in suport la locul
lor.
Algoritmul de rezolvare este urmatorul:

Problema: Pune cele 5 CD-uri noi in suport pastrand in permanenta ordinea alfabetica.
Subprobleme:
1. Pentru fiecare CD nou executa:
1.1 Ia CD-ul de pe masa.
1.2 Pozitioneaza CD-ul in suport in ordine alfabetica.

1.1 este o problema simpla deci nu va mai fi impartita in subprobleme.


1.2 se imparte in subproblemele:
1.2.1 Gaseste pozitia slotului in care trebuie introdus CD-ul. Numim aceasta
pozitieCD.
1.2.2 Daca slotul din pozitia pozitieCD este gol executa pasul 1.2.4, altfel
executa 1.2.3 .
1.2.3 Muta toate CD-urile de la dreapta pozitiei pozitieCD si pe cel din pozitia
pozitieCD un slot spre dreapta.
1.2.4 Introduceti CD-ul in pozitia sa( pozitieCD).

1.2.1 se imparte la randul ei in subproblemele:


1.2.1.1 Numeste slot curent primul slot din stanga suportului.
1.2.1.2 Daca slot curent este gol atunci pozitieCD = slot curent,
altfel executa 1.2.1.2.1
1.2.1.2.1 Daca interpretul CD-ului nou este in ordine alfabetica
dupa interpretul CD-ului slotului curent atunci
slot curent = slotul din dreapta slotului curent
Daca slot curent este gol atunci
pozitieCD = slot curent
altfel repeta pasul 1.2.1.2.1
altfel pozitieCD=slot curent

1.2.3 se imparte la randul ei in subproblemele:


1.2.3.1 slot curent = pozitia ultimului slot care contine un CD, de la stanga la
dreapta.
1.2.3.2 Repeta pasii de mai jos pana cand slot curent este la stanga slotului
pozitieCD
Muta CD-ul din slotul curent un slot spre dreapta
slot curent = slotul din stanga slotului curent

EXERCITII SI PROBLEME PROPUSE

1. Scrieti un algoritm pentru calculul lui n! = 1 * 2 * ... * n, n > 0.

2. Scrieti un algoritm pentru calculul sumei 12 + 22 + ... + n2, n > 0.

3. Intr-un cont in banca am depus o suma de bani initiala S. Banca ofera o


dobanda de 2% pe an pentru tipul de cont. Vrem sa aflam peste cati ani suma
initiala se va dubla (adica balanta contului va fi mai mare sau egala cu 2S)
daca nu se efectueaza nici o extragere din sau depunere in cont.

4. Valoarea lui π se poate calcula dupa formula:


1 1 1
π = 1 − + − + ...
3 5 7
Scrieti un algoritm care calculeaza numarul π. Deoarece formula este o serie
Infinita, iar un algoritm trebuie sa se opreasca dupa un numar finit de pasi,
determinati algoritmul sa se termine in momentul in care ati obtinut valoarea
lui π cu 6 zecimale exacte.

5. Scrieti un algoritm in format top- down design pentru rezolvarea urmatoarei


probleme: Avem un suport de 50 de CD-uri plin in totalitate. CD-urile sunt
sunt asezate in ordine aleatoare. Ordonati CD-urile in ordinea alfabetica a
interpretului. Se presupune ca nu puteti lua din suport mai mult de 2 CD-uri
odata (cate unul in fiecare mana).

Bibliografie recomandata:

1. Daniela Joita, Programare procedurala, Editura Universitatii Titu Maiorescu, 2008

S-ar putea să vă placă și