Documente Academic
Documente Profesional
Documente Cultură
Curs 1 Si 2
Curs 1 Si 2
Burileanu, D., Dan, C., Pdure, M., Programare n C. Culegere de probleme, Editura Printech,
Bucureti, 2004.
Cristea, V., Ciumale, C., Kalisz, E., Panoiu, A., Limbajul C standard, Editura Teora, Bucureti,
1992.
Negrescu, L., Limbajele C i C++ pentru nceptori, Vol. I, Editura Microinformatica, ClujNapoca, 1996.
Rusu, I., Gavrilescu, D., Grosu, V., ndrumar de laborator pentru programarea calculatoarelor,
Editura MATRIX ROM, Bucureti, 2004.
Rusu, I., Gavrilescu, D., Grosu, V., Programarea calculatoarelor n limbaj C, Editura MATRIX
ROM, Bucureti, 2002.
prile componente ale problemei reale, dezasamblat n timpul analizei, i prile componente ale
modelului abstract asociat. Odat descoperit, formulat precis i dovedit, aceast perfect oglindire
a problemei reale n planul obiectelor matematice ofer certitudinea c toate proprietile i legturile ce
exist ntre subansamblele modelului abstract se vor regsii precis (prin reflectare) ntre prile interne
ale problemei reale, i invers. Atunci, soluiei abstracte descoperite cu ajutorul modelului matematic
abstract i va corespunde o soluie real concretizat printr-un algoritm ce poate fi implementat ntr-un
program executabil.
Ideea central a etapei a doua proiectarea unui algoritm de soluionare eficient poate fi formulat
astfel: din studiul proprietilor i limitelor modelului matematic abstract asociat problemei se deduc
limitele inferioare ale complexitii minimale (efortului minimal obligatoriu) inerente oricrui
algoritm ce va soluiona problema n cauz. Complexitatea intern a modelului abstract i complexitatea
soluiei abstracte se va reflecta imediat asupra complexitii reale a algoritmului, adic asupra eficienei
de soluionare a problemei. Acest fapt permite prognosticarea nc din aceast faz faza de proiectare
a algoritmului de soluionare a eficienei practice, msurabil ca durat de execuie, a programului.
Algoritmul
Se tie c la baza oricrui program st un algoritm (care, uneori, este numit metod de rezolvare).
Noiunea de algoritm este o noiune fundamental n informatic i nelegerea ei, alturi de nelegerea
modului de funcionare a unui calculator, permite nelegerea noiunii de program executabil. Vom oferi
n continuare o definiie unanim acceptat pentru noiunea de algoritm:
Definiie. Prin algoritm se nelege o mulime finit de operaii (instruciuni) elementare care executate ntr-o
ordine bine stabilit (determinat), pornind de la un set de date de intrare dintr-un domeniu de valori posibile
(valide), produce n timp finit un set de date de ieire (rezultate).
Descrierea algoritmilor
Dou dintre metodele clasice de descriere a algoritmilor sunt Schemele logice i Pseudo-Codul.
Ambele metode de descriere conin doar patru operaii (instruciuni) elementare care au fiecare un
corespondent att schem logic ct i n pseudo-cod.
n cele ce urmeaz vom descrie doar varianta oferit de pseudo-cod deoarece folosirea schemelor
logice s-a redus drastic n ultimii ani. Schemele logice mai pot fi ntlnite sub numele de diagrame de
proces n anumite cri de specialitate inginereti. Avantajul descrierii algoritmilor prin scheme logice
este dat de libertatea total de nlnuire a operaiilor (practic, sgeata care descrie ordinea de execuie,
pleac de la o operaie i poate fi trasat nspre orice alt operaie). Este demonstrat matematic riguros
c descrierea prin pseudo-cod, dei pare mult mai restrictiv (operaiile nu pot fi nlnuite oricum, ci
trebuie executate n ordinea citirii: de sus n jos i de la stnga la dreapta), este totui perfect echivalent.
Deci, este dovedit c plusul de ordine, rigoare i simplitate pe care l ofer descrierea prin pseudo-cod nu
ngrdete prin nimic libertatea programrii. Totui, programele scrise n limbajele de asamblare, care
sunt mult mai compacte i au dimensiunile mult reduse, nu ar putea fi descrise altfel dect prin scheme
logice.
1. Atribuirea
var:=expresie;
2. Intrare/Ieire
Citete var1, var2, var3, ;
Scrie var1, var2, var3, ; sau Scrie expresia1, expresia2, expresia3,;
3. Condiionala
Dac <condiie_logic> atunci instruciune1 [altfel instruciune2];
4. Ciclurile Exist (din motive de uurin a descrierii algoritmilor) trei tipuri de instruciuni de
ciclare. Ele sunt echivalente ntre ele, oricare variant de descriere putnd fi folosit n locul celorlalte
dou, cu modificri sau adugiri minimale:
repet instruciune1, instruciune2, pn cnd <condiie_logic>;
ct timp <condiie_logic> execut instruciune;
pentru var_contor:=val_iniial pn la val_final execut instruciune;
n cazul ciclurilor, grupul instruciunilor ce se repet se numete corpul ciclului iar condiia logic
care permite sau nu reluarea execuiei ciclului este denumit condiia de ciclare. Observm c ciclul de
tipul Repet are condiia de repetare la sfrit ceea ce are ca i consecin faptul c, corpul ciclului se
execut cel puin odat, n mod obligatoriu, nainte de verificarea condiiei logice. Nu acelai lucru se
ntmpl n cazul ciclului de tipul ct timp, cnd este posibil ca instruciunea compus din corpul ciclului
s nu poat fi executat nici mcar odat. n plus, s mai observm c ciclul de tipul Pentru pn la
conine (n mod ascuns) o instruciune de incrementare a variabilei contor.
Limbajele de programare care sunt relativ apropiate de limbajele naturale sunt denumite limbaje
de nivel nalt (high-level), de exemplu limbajul Pascal, spre deosebire de limbajele de programare mai
apropiate de codurile numerice ale instruciunilor microprocesorului. Acestea din urm se numesc
limbaje de nivel sczut (low-level), de exemplu limbajul de asamblare. Limbajul de programare C are un
statut mai special el putnd fi privit, datorit structurii sale, ca fcnd parte din ambele categorii.
Peste tot unde n pseudo-cod apare cuvntul instruciune el poate fi nlocuit cu oricare din cele
patru instruciuni elementare. Aceast substituire poart numele de imbricare. Prin instruciune se va
nelege atunci, fie o singur instruciune simpl (una din cele patru), fie o instruciune compus.
Instruciunea compus este format dintr-un grup de instruciuni delimitate i grupate n mod precis (ntre
acolade { } n C).
Spre deosebire de pseudo-cod care permite doar structurile noi formate prin imbricarea repetat
a celor patru instruciuni n modul precizat, schemele logice permit structurarea n orice succesiune a
celor patru instruciuni elementare, ordinea lor de execuie fiind dat de sensul sgeilor. Repetm c
dei, aparent, pseudo-codul limiteaz libertatea de descriere doar la structurile prezentate, o teorem
fundamental pentru programare afirm c puterea de descriere a pseudo-limbajului este aceeai cu cea
a schemelor logice.
Forma de programare care se bazeaz doar pe cele patru structuri se numete programare
structurat (spre deosebire de programarea nestructurat bazat pe descrierea prin scheme logice).
Teorema de echivalen a puterii de descriere prin pseudo-cod cu puterea de descriere prin schem
logic afirm c programarea structurat (aparent limitat de cele patru structuri) este echivalent cu
programarea nestructurat (liber de structuri impuse). Evident, prin ordinea, lizibilitatea i fiabilitatea
oferit de cele patru structuri elementare (i asta fr a ngrdi libertatea de exprimare) programarea
structurat este net avantajoas. n fapt, limbajele de programare nestructurat (Fortran, Basic) au fost
de mult scoase din uz, ele (limbajele de asamblare) sunt necesare a fi folosite n continuare doar n
programarea de sistem i n programarea industrial (n automatizri).
Programul
Prin program se nelege un ir de instruciuni-main care sunt rezultatul compilrii algoritmului
proiectat spre rezolvarea problemei dorite ce a fost descris ntr-un limbaj de programare (ca i cod surs).
Etapele realizrii unui program sunt:
editarea codului surs, etap ce se realizeaz cu ajutorul unui program editor de texte rezultatul fiind
un fiier C, cu extensia .c (.cpp);
compilarea, etapa de traducere din limbajul de programare C n limbajul intern al micro-procesorului,
i este realizat cu ajutorul programului compilator C i are ca rezultat un fiier obiect, cu extensia
.obj (n limbajul C) sau .exe (n limbajul Pascal);
link-editarea, etap la care se adaug modului obiect rezultat la compilare diferite module coninnd
subprograme i rutine de bibliotec, rezultnd un fiier executabil (aceast etap este comasat n
Turbo Pascal sau Borland Pascal cu etapa de compilare), cu extensia .exe
execuia (Run), etapa de lansare n execuie propriu-zis a programului obinut, lansare realizat de
interpretorul de comenzi al sistemului de operare (command.com pentru sistemele DOS+Windows)
Observm c aceste etape sunt complet independente n timp unele de altele i necesit pentru
limbajul C utilizarea a patru programe ajuttoare: editor de texte, compilator C, link-editor i
interpretorul de comenzi al sistemului de operare. n cazul mediilor de programare integrate (Borland)
comandarea acestor patru programe ajuttoare precum i depanarea erorilor de execuie este mult
facilitat.
OBSERVAIE: Link-editarea reprezint asamblarea unor module precompilate pentru a rezulta un fiier
executabil. De exemplu, dac avem mai multe module de program (s zicem diverse funcii) le putem
compila pe fiecare n mod separat i n felul acesta putem observa i erorile mai uor iar la sfrit le
linkeditm i va rezulta programul. Fiierele precompilate (pe care le vom link-edita) au avantajul c se
pot folosi la diferite proiecte pstrnd de exemplu o oarecare paternitate asupra lor, va fi foarte dificil
ca cineva s obin codul surs i s-l poat modifica fr s depun un efort considerabil. Deci va putea
utiliza funciile dar e destul de dificil s modifici sau s copiezi ntr-un program personal doar cteva din
aceste funcii. E mai uoar i depanarea programului pe module.
De asemenea, merit subliniat faptul c n timp ce fiierul text C, ce conine codul surs, poate fi
transportat pe orice main (calculator) indiferent de micro-procesorul acesteia urmnd a fi compilat la
faa locului, n cazul fiierului obiect acesta nu mai poate fi folosit dect pe maina (calculatorul) pentru
care a fost creat (datorit instruciunilor specifice micro-procesorului din care este compus). Deci, pe
calculatoare diferite (avnd micro-procesoare diferite) vom avea nevoie de compilatoare C diferite.
n plus, s remarcm faptul c fiierele obiect rezultate n urma compilrii pot fi link-editate
mpreun, chiar dac provin din limbaje de programare diferite. Astfel, un program rezultat (un fiier
.exe sau .com) poate fi compus din module obiect care provin din surse diferite (fiiere Pascal, C,
asamblare, etc.).
unde nume_funcie reprezint numele unei funcii, iar instruciuni reprezint secvena de instruciuni (una
sau mai multe) care aparine funciei declarate.
n ceea ce privete numele funciei (i nu numai) trebuie spus c limbajul C este de tip CASESENSITIVE, ceea ce presupune ca programatorul s aib n vedere faptul c, compilatorul C face
deosebire ntre litere mari i litere mici.
Orice program n limbajul C conine cel puin o funcie: funcia main(). Execuia fiecrui program
ncepe cu funcia main(), ceea ce nseamn c dac programatorul omite scrierea acestei funcii,
compilatorul va fi n imposibilitatea compilrii programului editat. Astfel, atunci cnd se execut un
program, primele instruciuni executate sunt cele care fac parte din funcia main. Dac programul conine
mai multe funcii, numele acestora va fi definit de utilizator.
Toate programele scrise n limbajul C sunt memorate ntr-un fiier sau mai multe, acestea avnd
extensia .c. Un fiier care conine un program scris n C sau care conine numai o parte a acestuia
se numete fiier surs.
Prin compilarea fiierului surs rezult un fiier obiect, care are extensia .obj. Fiierele surs
care intr n compunerea unui program pot fi compilate mpreun sau separat. n urma unei compilrii
rezult un fiier obiect; fiierele obiect aferente aplicaiei pot fi reunite ntr-un program executabil prin
link-editare. n urma link-editrii rezult un fiier executabil, cu extensia .exe.
Un nume este o succesiune de litere i eventual cifre, primul caracter fiind liter. Pot fi utilizate
litere mici i litere mari precum i caracterul subliniere (_).
Exist un numr de cuvinte mprumutate din limba englez care au o semnificaie predefinit.
Utilizatorul nu poate da o alt utilizare acestora i de aceea se mai numesc cuvinte cheie. Acestea se scriu
mereu cu litere mici i reprezint nume cu destinaii speciale (for, if, while, break, exit, etc.).
Atomi lexicali
Ca i alte limbaje, C are un alfabet i reguli pentru scrierea programelor corecte folosind semne
de punctuaie. Aceste reguli formeaz sintaxa limbajului C. Compilatorul C are rolul de a testa dac un
program editat este corect. Dac sunt erori, atunci va afia o list de mesaje de eroare i se va opri. Iniial,
compilatorul mparte mulimea caracterelor (programul surs) n atomi lexicali, care reprezint
vocabularul de baz al limbajului. n ANSI C (ANSI = American National Standards Institute) sunt ase
tipuri de atomi lexicali (care se mai numesc i elemente lexicale sau uniti lexicale):
cuvinte rezervate;
identificatori;
constante;
iruri constante;
operatori;
semne de punctuaie.
Caractere i atomi lexicali
Un program C este o secven de caractere; caracterele permise n programele C sunt:
literele mici i literele mari ale alfabetului: a b ... z, A, B, , Z
cifre : 0 1 ... 9
alte caractere: * / = ( ) { } [ ] < > ' " ! @ # $ % & _ | ^ ~ \ . , ; : ?
spaii: blank, newline i tab
Identificatori
Un identificator este un atom lexical compus dintr-o secven de litere, cifre sau caracterul
underscore ("_") cu restricia c primul caracter este o liter sau underscore. n multe implementri C, se
face distincie ntre litere mici i mari. n general, se obinuiete ca identificatorii s fie scrii cu nume
sugestive care s uureze citirea i documentarea programului.
Exemple:
1. k, _id, contor, un_identificator sunt identificatori;
2. gresit#unu, 100_gresit_doi, -plus nu sunt identificatori.
Comentarii n C
Comentariile sunt iruri de caractere cuprinse ntre /* i */. Comentariile nu reprezint atomi
lexicali. Practic, compilatorul va traduce comentariile ntr-un singur caracter spatiu, de aceea
comentariile nu fac parte din codul executabil.
Avantajele folosirii comentariilor:
uurarea documentrii ulterioare; scopul documentrii este explicarea clar a folosirii
programelor;
un comentariu poate conine informaii care argumenteaz demonstraia corectitudinii unui
algoritm;
alegerea unui limbaj sau altul pentru rezolvarea unei probleme. n limbajul C exist o serie de tipuri
simple de date predefinite (tabelul 2.1), a cror lungime poate s difere de la un calculator la altul i de
la o implementare la alta.
Un tip de date descrie un set de date (care se mai numesc i obiecte) care au aceeai reprezentare.
De asemenea, exist un numr de operaii asociat unui tip de date (spre exemplu, cu tipul ntreg se
asociaz cele patru operaii aritmetice i eventual i altele).
Pentru fiecare tip predefinit din limbajul C exist cuvinte rezervate, care reprezint modificatori
de tip: unsigned, signed, long i short pentru tipul int; signed i unsigned pentru tipul char; long pentru
tipul double. Cuvintele rezervate dintre parantezele ptrate sunt opionale i diferitele combinaii
definesc acelai tip de dat.
Tipurile de date specifice limbajului C sunt prezentate n tabelul 2.1.
De asemenea, o component important a unui program C o reprezint biblioteca funciilor C (a
funciilor executate de un program) care pot realiza:
operaii de intrare/ieire,
operaii matematice,
operaii cu iruri, etc.
Printre cele mai des folosite funcii din C se numr funcia printf, care este principala funcie de
ieire aferent limbajului C, i este redat sub urmtoarea form:
printf(sir de caractere);
Pentru exemplul prezentat, pe ecran se va afia irul de caractere inclus ntre ghilimele.
Nr.octei
Interval de valori
[-2147483648 2147483647]
(-231 231-1)
[-32768 32767]
(-215 215-1)
int
short int
long int
unsigned int
[0 2147483647] (0-231 1)
[signed]
char
unsigned
char
[0 255] (28-1)
Float
[3,4*10-38 3,4*1038]
double
[1,7*10-308 1,7*10308]
long double
12
[3,4*10-4932 1,1*104932]
Semnificaie
conine numere ntregi cu semn,
reprezentate binar pe 4 octei
conine numere ntregi cu semn,
reprezentate binar pe 2octei
conine numere ntregi cu semn,
reprezentate binar pe 8 octei
se folosete pentru a crea ntregi fr
semn. Diferena dintre ntreg cu semn i
fr semn const n modul n care
compilatorul interpreteaz bitul de semn.
Dac bitul de semn este 0, numrul este
pozitiv, i dac bitul de semn este 1,
numrul este negativ. De cele mai multe
ori, numerele negative se reprezint n
complement fa de doi. Dac un ntreg
este declarat cu unsigned, cnd bitul de
semn este 1, numrul devine 231-1
sunt
caractere,
adic
simboluri
tipografice elementare: litere, cifre,
semne
de
punctuaie,
simboluri
matematice, etc;
caracter fr semn
zecimal n virgul flotant simpl
precizie conin numere reprezentate n
virgul flotant (pot avea partea
fracionar)
zecimal n virgul flotant dubl precizie
conin numere reprezentate n virgul
flotant (pot avea partea fracionar)
Reprezentare flotant n dubl precizie
Fiecare program scris n limbajul C poate fi prelucrat naintea procesului de compilare prin
intermediul preprocesrii, care este un proces automat realizat de compilator naintea compilrii
programului surs. Rolul preprocesrii este de a include diferite fiiere cu texte surs, definiii i apeluri
de macrouri sau de a realiza compilarea condiionat.
Astfel, o alt component important care caracterizeaz majoritatea programelor C sunt fiierele
header. Toate informaiile aferente funciilor din biblioteca standard se afl n fiiere care sunt transmise
mpreun cu compilatorul, aceste fiiere recunoscndu-se prin intermediul extensiei: .h. Informaiile din
aceste fiiere sunt folosite de compilator pentru lucrul cu funciile din bibliotec. Toate fiierele necesare
se adaug prin intermediul directivei preprocesor #include, care are rolul de a determina compilatorul
s citeasc un alt fiier i s-l includ n program.
Preprocesarea presupune prelucrarea informaiilor specifice care sunt precedate de caracterul diez
(#). Astfel, un fiier cu text surs poate fi inclus n cadrul programului curent prin intermediul construciei
#include, folosind unul din formatele:
Un fiier cu text surs poate fi inclus cu ajutorul construciei #include. Aceast construcie are
formatul:
#include specificator_fiier sau
#include<specificator_fiier>
unde specificator_fiier (care depinde de sistemul de operare) definete un fiier cu text surs pstrat pe
disc. n faza de preprocesare, textul fiierului respectiv se substituie construciei #include. Astfel, textul
fiierului respectiv ia parte la compilare mpreun cu textul n care a fost inclus.
n cazul sistemului de operare DOS, specificatorul de fiier trebuie s fie un nume de fiier
mpreun cu extensia lui (.C pentru compilatorul C, .H pentru fiiere de tip header fiiere cu
prototipuri, etc.). De asemenea, n afar de numele i extensia fiierului, specificatorul de fiier poate
conine i o cale dac este necesar, pentru localizarea fiierului.
Diferena dintre cele dou formate const n modul de cutare al fiierului de inclus:
formatul cu paranteze unghiulare <> se folosete la includerea fiierelor standard, cum sunt cele
care conin prototipuri pentru funcii din bibliotec;
n cazul n care se folosete formatul cu ghilimele, fiierul este cutat n directorul curent sau conform
cii dac aceasta este prezent.
Spre exemplu, pentru a include fiierul surs stdio.h care conine prototipul funciilor de
intrare/ieire se va folosi construcia: #include <stdio.h>. Dac se folosete construcia #include
un_fisier.c, atunci compilatorul va include fiierul un_fisier din cadrul directorului curent. De
asemenea, pentru a include n program fiierul un_fisier care se gsete n folderul Aplicaii, n directorul
C, se va folosi construcia: #include c:\\Aplicatii\\un_fisier.c. n cadrul ultimului exemplu prezentat,
se oberv c pentru a descrie calea, caracterul backslash se dubleaz n concordan cu convenia de
reprezentare a caracterului backslash ntr-un ir de caractare.
Un fiier standard care se include frecvent este stdio.h; acesta conine prototipurile pentru o serie
de funcii ce realizeaz operaii de intrare/ieire.
Construciile #include se scriu de obicei la nceputul fiierelor surs, pentru ca textele inserate s
fie valabile n tot fiierul surs care se compileaz.
Pentru a putea folosi ntr-un program funcia printf(), este necesar includerea directivei
#include<stdio.h> deoarece, aa cum spuneam anterior, aceast directiv conine informaii cu privire la
aceast funcie de ieire. Directivele incluse n program nu se finalizeaz cu caracterul ;, deoarece nu
reprezint un cuvnt cheie al programului, ci o instruciune ctre compilatorul C.
un exponent care poate fi i vid ncepe cu litera e sau E, dup care urmeaz un semn opional
(plus sau minus) i un ir de cifre zecimale. Exponentul definete un factor care exprim o putere
a lui 10.
Ex:
100. 100
100.48 100,48
.48 0,48
12e5 12*105
.5E-5 0,5*10-5
15.255e2 15,255*102
1500.123e-3 1500,123*10-3
caracter o constant caracter are ca valoare codul ASCII al caracterului pe care-l reprezint i are
tipul int. O constant caracter corespunztoare unui caracter imprimabil se reprezint prin caracterul
respectiv inclus ntre caractere apostrof:
A valoarea 65
a valoarea 97
* valoarea 42