Sunteți pe pagina 1din 14

Cuprins

Gndirea algoritmic ..............................................................1


Problema cutrii ............................................................................................................. 1
Problema intrrii ntr-un cabinet medical ..................................................................... 2

Structura unui program i a unei funcii C............................ 4


Reprezentarea numrului n binar ................................................................................. 5
Transmiterea parametrilor n cadrul unei funcii .......................................................... 6

Construciile de baz ale limbajului C ................................... 7


Caracterele .......................................................................................................................7
Identificatorii ...................................................................................................................7
Cuvinte cheie ....................................................................................................................7
Tipuri de date .................................................................................................................. 8
Tipuri aritmetice ............................................................................................................. 8
Tipul ntreg ...................................................................................................................... 9
Tipul flotant..................................................................................................................... 9
Tipul caracter .................................................................................................................. 9
Constante i variabile .....................................................................................................10
Comentarii...................................................................................................................... 11
Operatori ........................................................................................................................ 12
Operatori aritmetici ....................................................................................................... 12
Operatorul de conversie explicit (cast) ........................................................................ 12
Operatorul dimensiune (sizeof)..................................................................................... 13
Operatorul condiional .................................................................................................. 14

Structuri de date ...................................................................15


Lista liniar simplu nlnuit ....................................................................................... 15
Structura de tip stiv (LIFO Last In First Out) ............................................................. 19
Structura de tip coad ................................................................................................... 23

Instruciuni C ....................................................................... 26
Instruciunea vid ......................................................................................................... 26
Instruciunea de atribuire............................................................................................. 26
Instruciunea compus ................................................................................................. 26
Instruciunea if.............................................................................................................. 26
Instruciunea while ....................................................................................................... 28

Cel mai mare divizor comun .................................................................................... 28


Instruciunea do while .................................................................................................. 28
Instruciunea for ........................................................................................................... 29
Programul C care calculeaz n! ................................................................................ 29
Instruciunea return ...................................................................................................... 29
O funcie care returneaz maximul a 2 numere ...................................................... 30
Numrul de elemente ale unei ir ............................................................................ 30
Comparaia celor 2 iruri ......................................................................................... 31
Concateneare ............................................................................................................ 31
Instruciunea break ....................................................................................................... 31
Funcia exit .................................................................................................................... 32
Instruciunea continue .................................................................................................. 32
Numerarea cifrelor existente ntr-un ir ................................................................. 33
Instruciunea goto ......................................................................................................... 33
Instruciunea switch...................................................................................................... 34

Pointeri C ............................................................................. 35
Operatori specifici pointerilor ...................................................................................... 35
Pointeri i tablouri......................................................................................................... 36
Pointeri la funcii........................................................................................................... 38
Tipuri structurate de date ............................................................................................. 39
Structuri.................................................................................................................... 39
Cmpuri de bii ......................................................................................................... 39
Uniuni .......................................................................................................................40
Enumerri................................................................................................................. 41

Funcii de bibliotec ............................................................ 42


Funcia printf................................................................................................................. 42
Funcia scanf ................................................................................................................. 43
Funcii de conversie ...................................................................................................... 44
Funcii generatoare de numere aleatoare................................................................ 45
Funcii pentru operaii cu caractere i iruri de caractere ...................................... 45

Operaii cu fiiere ................................................................ 47


Calcul Matriceal ................................................................... 49
Produsul a dou matrici ................................................................................................ 49
Inversa unei matrici ...................................................................................................... 50
Metoda lui Gauss ........................................................................................................... 53

Metode de sortare ................................................................ 55


Sortare ordinar ............................................................................................................ 55
Sortare prin selecie (Selection Sort).............................................................................57
Sortarea prin inserie direct (Direct Insertion Sort) .................................................. 58
Sortare prin inserie binar (Binary Insertion Sort) .................................................... 60
Sortare prin inserie direct folosind o santinel ........................................................ 62
Sortarea prin metoda bulelor (Bubble Sort) ................................................................ 64
Sortare rapid (Quick Sort) .......................................................................................... 65
Sortare prin interclasare (Merge Sort) ......................................................................... 67

Recursivitate ........................................................................ 70
Calculul valorii n! .......................................................................................................... 70
Algoritmul lui Euclid recursiv ...................................................................................... 70
S se genereze primele n numere din irul lui Fibonacci ............................................. 71

Metoda backtracking ........................................................... 72


Permutrile ................................................................................................................... 72
Problema aranjamentelor ............................................................................................. 73
Problema combinrilor ................................................................................................. 74
Problema reginelor ........................................................................................................75
Problema labirintului.................................................................................................... 76
Problema calului ........................................................................................................... 79
Problema mingii.............................................................................................................81

Metoda Divide et Impera ..................................................... 84


Suma elementelor unui ir............................................................................................ 84
Problema Turnurilor din Hanoi ................................................................................ 85
Elementul maxim ntr-un ir ........................................................................................ 86
Problema cutrii binare .............................................................................................. 87

Grafuri neorientate .............................................................. 88


Implementarea parcurgerii n lime pentru un graf neorientat ................................ 88
Implementarea parcurgerii n adncime pentru un graf neorientat ........................... 89
Drumuri ntr-un graf ..................................................................................................... 91
Grafuri ponderate ......................................................................................................... 92
Graful hamiltonian........................................................................................................ 94
Grafuri euleriene ........................................................................................................... 96
Implementarea unui graf utiliznd matricea de adiacen ......................................... 97
Implementarea unui graf utiliznd pointeri ................................................................ 99
Drumul optim ntr-un graf ......................................................................................... 100

Gndirea algoritmic
Problema cutrii
Exist i cazul care, pentru o aceeai problem putem prezenta dou soluii, n care
una este mai rapid ca alta. De pild, fie un ir de numere natural oarecare, de
exemplu 4,2,10,1,8,15,7. Vream s testm dac un numr dat (s zivem numrul 8) se
afl n aceast secven sau nu.
O astfel de cutare, prin parcurgerea de a stnga la dreapta a ntregii secvene de
numere, pn se gsete numrul dorit sau se epuieaz toate elementele din secven,
se numete cutarea secvenial. Dac avem un ir S de n elemente (notat S[1..n]),
atunci cutarea secvenial a lui x n S se descrie prin:
Cutare_secvential(x,S[1..n]) nseamn
nceput
Fie elemental_curent = primul_element;
Att timp ct (elemental_curent <> x) si (pozitia elementului current <= pozitia
ultimului element (n)) execut
nceput
Dac elemental_curent = x atunci mesaj("gsit")
Altfel treci la urmtorul element
Sfrit
Sfrit.
n continuare s presupunem c numerele erau dj ordonate cresctor 1, 2, 4, 7, 8,
10, 15. n acest caz particular, cutarea secvenial a unui numr cum este 8 nu este
prea eficient, deoarece 8 se afl n a doua jumtate a secvenei, deci ar fi de preferat
s nu-l cutm n prima jumtate. Acest procedeu este mai rapid:
Dac numrul din mijloc este mai mic dect numrul cutat, atunci cutm a doua
jumtate;
Dac numrul din mijloc este mai mare ca numrul cutat, atunci cutm n
prima jumtate;
Dac numrul din mijloc este egal cu numrul cutat, nseamn c am gsit
numrul n cauz i trebuie s oprim cutarea.
Cutarea n jumtatea aleas se face tot la fel, deci se va njumti i aceast zon
Procedeul anterior se numete cutare binar, deoarece, de fiecare dat, o secven
de numere este divizat n dou jumti. Putem descrie cutarea binar a unui
numr x ntr-o secven S[1..n] astfel.

Cutarea_binar(x, S[1..n]) nseamn


nceput
Stabileste elemental_curent ca fiind elemental din mijlocul secventei;
Dac n=1 atunci
Dac x = elemental_curent atunci mesaj("gsit")
Altfel mesaj("negsit")
Altfel
nceput
mparte secventa n cele dou jumtti (S[1..mijloc] si S[mijloc+1..n]);
Dac elemental_curent = x atunci mesaj("gsit")
Altfel
Dac elemental_curent < x atunci Cutare_binar(x,S[mijloc+1..n])
Altfel cutarea_binar(x.S[1..mijloc])
Sfrit
Sfrit.

Problema intrrii ntr-un cabinet medical


Dac un om vrea s intre pentru consult la un medic, atunci, mai nti va bate la u:
dac medicul rspunde prin poftim!, atunci va intra, atlfel va atepta pn cnd
pacientul dinuntru va iei; abia dup ce cabinetul va fi liber, va intra.
Intrare_la_medic nseamn
nceput
Bate la_u;
Dac rspunsul = "poftim!" atunci
ntr_n_cabinet;
Altfel
nceput
Att timp ct cabinetul_este_ocupat_de_alt_pacient execut
Citeste_un_ziar;
Sfrit
Sfrit.
O intruciune compus este format dintr-o secven de intruciuni, ncadrate de
cuvinte nceput i sfrit, care pot conine, la rndul lor, blocuri de alternativ i
repetiie.
Programarea este tehnica realizrii de algoritmi descrii prin proceduri i programe.
Ea devine o art, atunci cnd se folosesc cele trei elemente de structurate i se
numete programare structurat. Pentru a vedea ce ar nsemna programare
nestructurat, s reconsiderm procedura de intrare n cabinetul medical:

Intare_la_medic nseamn
nceput
Bate_la_u;
Dac rspunsul = "poftim!" atunci intr_n_cabinet;
Altfel nceput
Att timp ct cabinetul_este_ocupat_de_alt_pacient execut
Citeste_un_ziar;
ntr_n_cabinet
Sfrit
Sfrit.

Instruciuni C
Instruciunile C implementeaz structurile de baz ale programrii structurate:
structura secvenial (instruciunea compus)
structura alternativ (instruciunea if)
structura repetitiv condiionat anterior (instruciunea while) i condiionat
posterior (instruciunea do while)
Toate instruciunile limbajului C se termin cu ; excepie fcnd instruciunile care
se termin cu } (instruciunea compus i instruciunea switch) dup care nu se pune
;.

Instruciunea vid
Instruciunea vid se reduce la caracterul ; i se folosete n acele construcii n care
este necesar prezena unei instruciuni fr a fi nevoie s se realizeze anumite
operaii.

Instruciunea de atribuire
Instruciunea de atribuire se obine punnd ; dup o expresie de atribuire. Deci o
expresie devine o instruciune dac este urmat de ; (punct i virgul).

Instruciunea compus
Instruciunea compus este o succesiune de declaraii urmate de instruciuni,
succesiune care se include ntre acolade. Dac exist declaraii atunci ele definesc
variabile care sunt valabile numai n cadrul instruciunii compuse respective.

Instruciunea if
n limbajul C, instruciunea condiional de baz este instruciunea if. Formatul
general al instruciunii if este:
if (expresie) instruciune1;
else instruciune2;

26

Efectul acestei instruciuni este urmtorul: se evalueaz expresia din paranteze. Dac
valoarea este adevrat (diferit de 0) atunci se execut instruciune1 altfel se execut
instruciune2, apoi n ambele situaii se trece la instruciunea urmtoare instruciunii
if.
Deoarece instruciunea if testeaz valoarea numeric a unei expresii, urmtoarele
construcii sunt echivalente:
if(expresie!=0)
if(expresie)
Exemplu:
if(x)
if(y)
printf("1");
else
printf("2");
n acest caz, ramura else care tiprete valoarea 2 este legat de instruciunea if(y).
if(x)
{
if (y) printf("1");
}
else
printf("2");
n acest caz, datorit instruciunii compuse, ramura else care tiprete valoarea 2
aparine instruciunii if(x).
Orice instruciune de atribuire nchis ntre parantezele expresiei din cadrul
instruciunii if este de fapt o expresie, a crei valoare de adevr este egal cu valoarea
atribuit.
Exemplul:
if(i=0) printf("Variabila i are valoarea 0");
else printf("variabila i are o valoare diferit de 0");
este greit deoarece n loc s se foloseasc operatorul == se folosete operatorul de
atribuire iar n acest caz valoarea de adevr a expresiei de atribuire este 0 (fals), deci
ntotdeauna se va afia mesajul variabila i are o valoare diferit de 0 indiferent de
valoarea iniial a lui i.

27

Metode de sortare
Sortare ordinar
Cel mai simplu algoritm de sortare (dar i cel mai ineficient) se bazeaz pe urmtorul
principiu: un ir este sortat dac prin parcurgerea lui de la nceput pn la sfrit,
fiecare element este mai mic dect succesorul. Dac aceast condiie nu este
ndeplinit, inversm cele 2 elemente. Sortarea se ncheie n momentul n care
parcurgerea irului se face fr a fi necesar nici o inversare (fiecare element este mai
mic dect succesorul su).

3 7 4 9 2 8

i=1; inversam a[1]=7 cu a[2]=4; k=1

3 4 7 9 2 8

i=3; inversam a[3]=9 cu a[4]=2; k=1

3 7 4 2 9 8

i=4; inversam a[4]=9 cu a[5]=8; k=1

3 7 4 2 8 9

k<>0 deci pornim un nou ciclu;


i=1 inversam a[1]=7 cu a[2]=4; k=1

3 4 7 2 8 9

i=2; inversam a[2]=7 cu a[3]=2; k=1

3 4 2 7 8 9

k<>0 deci pornim un nou ciclu;


i=1 inversam a[1]=4 cu a[2]=2; k=1

3 2 4 7 8 9

k<>0 deci pornim un nou ciclu;


i=0 inversam a[0]=3 cu a[1]=2; k=1

2 3 4 7 8 9

k ramane 0 (nu facem nici o inversare)


deci sirul este sortat

55

#include<stdio.h>
#include<conio.h>
void sortare_ordinara(int a[], int n)
{
int i,j,k,elem;
do
{
for(i=0,k=0;i<n-1;i++)
//la fiecare nceput de parcurgere a irului, k este iniializat cu 0
if(a[i]>a[i+1])
//dac elementul curent este mai mare dect succesorul este necesar inversarea
//lor; atenie: dac punem mai mare sau egal i avem 2 elemente egale, vom
//ajunge la ciclu infinit
{
elem=a[i];
a[i]=a[i+1];
a[i+1]=elem;
k=1;
//k diferit de 0 indic faptul c s-a fcut o inversare
}
} while(k);
//sortarea se ncheie n momentul n care k a rmas 0 (deci nu s-a fcut nici o
//inversare de elemente
}
void main(void)
{
int n,a[100],i;
printf("Introd dim sirului:");
scanf("%d",&n);
printf("Introd elem sirului:\n");
for(i=0;i<n;i++)
{
printf("a[%d]=",i);
scanf("%d",a+i);
}
sortare_ordinara(a,n);
printf("Sirul sortat este: ");
for(i=0;i<n;i++) printf("%d ",a[i]);
putchar('\n');
getch();
}

56

Metoda Divide et Impera


Suma elementelor unui ir
S se calculeze suma elementelor unui ir folosind Divide et Impera.
#include<stdio.h>
#include<conio.h>
int a[20];
int divide(int ls, int ld)
{
int mijloc,d1,d2;
if(ls!=ld)
{
mijloc=(ls+ld)/2;
d1=divide(ls,mijloc);
d2=divide(mijloc+1,ld);
return(d1+d2);
}
else
return(a[ls]);
}
void main(void)
{
int I,n;
printf("Introd nr de elem ale sirului:");
scanf("%d",&n);
for(I=0;I<n;I++)
{
printf("a[%d]=");
scanf("%d",a+I);
}
printf("Suma elem este: %d\n",divide(0,n-1));
getch();
}

84

Problema Turnurilor din Hanoi


Legenda acestei probleme spune c Brahma a fixat pe Pmnt trei tije de diamante i
pe una din ele a pus n ordine cresctoare 64 de discuri de aur de dimensiuni diferite,
cu discul cel mai mare jos. Singura operaiune permis clugrilor era mutarea a cte
unui singur disc de pe o tij pe alta, astfel nct niciodat s nu se pun un disc mai
mare peste unul mai mic. Legenda spune c atunci cnd clugrii vor muta toate cele
64 de discuri respectnd regulile de maa sus, atunci va veni sfritul lumii.
Presupunnd c n fiecare secund se mut un disc, lucrnd fr ntrerupere, cele 64
de discuri nu pot fi mutate nici n 500 de miliarde de ani de la nceputul aciunii!
Vom considera trei tije verticale notate Stnga, Mijloc, Dreapta. Pe tija Stnga se
gsesc aezate n discuri de diametre diferite, n ordinea descresctoare a diametrelor,
privind de jos n sus. Iniial, tijele Mijloc i Dreapta sunt goale. S se afieze toate
mutrile prin care discurile de pe tija Stnga se mut pe tija Mijloc, n aceeai ordine,
respectnd urmtoarele reguli:
la fiecare micare se mut un singur disc
un disc mai mare nu poate fi plasat peste un disc cu diametrul mai mic
un disc mai mare nu poate fi plasat peste un disc cu diametrul mai mic
#include<stdio.h>
#include<conio.h>
int n;
void scrie(char a, char b)
{
printf("Muta discul de pe %c pe %c\n",a,b);
}
void muta(int n, char a, char b, char c)
{
if (n==1)
{
scrie(a,b);
return;
}
else
{
muta(n-1,a,c,b);
scrie(a,b);
muta(n-1,c,b,a);
}
}

85

void main(void)
{
printf("Introd nr de turnuri:");
scanf("%d",&n);
muta(n,'S','M','D');
getch();
}

Elementul maxim ntr-un ir


Se citete un ir de n elemente numere ntregi. S se gseasc maximul elementelor
acestui ir utiliznd metoda divide et impera.
#include<stdio.h.h>
int a[10],n;
int max(int i ,int j)
{
int a,b;
if (i==j)
return a[i];
else
{
a=max(i, (i+j)/2), b=max((i+j)/2+1,j);
if (a>b)
return(a);
else
return(b);
}
}
void main(void)
{
int i;
printf("n="); scanf("%d",&n);
for (i=0;i<n;i++)
{
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
printf("maximul este %d\n",max(0,n-1));
}

86