Documente Academic
Documente Profesional
Documente Cultură
Presstern Carte Informatica Limbajul C
Presstern Carte Informatica Limbajul C
Instruciuni C ....................................................................... 26
Instruciunea vid ......................................................................................................... 26
Instruciunea de atribuire............................................................................................. 26
Instruciunea compus ................................................................................................. 26
Instruciunea if.............................................................................................................. 26
Instruciunea while ....................................................................................................... 28
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
Recursivitate ........................................................................ 70
Calculul valorii n! .......................................................................................................... 70
Algoritmul lui Euclid recursiv ...................................................................................... 70
S se genereze primele n numere din irul lui Fibonacci ............................................. 71
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.
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
3 4 7 9 2 8
3 7 4 2 9 8
3 7 4 2 8 9
3 4 7 2 8 9
3 4 2 7 8 9
3 2 4 7 8 9
2 3 4 7 8 9
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
84
85
void main(void)
{
printf("Introd nr de turnuri:");
scanf("%d",&n);
muta(n,'S','M','D');
getch();
}
86