Sunteți pe pagina 1din 33

1) Disciplina Programarea Calculatoarelor. Notiunea de algoritm.

Forme de reprezentare
a algoritmilor.
Algoritm-un set finit de operatii(actiuni) pentru a rezolva problema data.
Algoritmul are 3 parti:
1) Introducerea datelor de intrare(initiale)
2) Prelucrarea datelor de intrare in scopul obtinerii datelor de iesire(rezultatele).
3) Evidentierea datelor de iesire
Forme de reprezentare a algoritmilor:
1) Forma limbajului natural
2) Forma grafica
3) Pseudocodul
4) Programul

2) Simboluri grafice pentru operatiuni. Schema logica a algoritmului.

Schemele logice sunt notaii grafice formate din blocuri legate ntre ele prin sgei. O schem
logic descrie grafic paii unui algoritm Totodat ea specific prelucrrile care se execut
asupra datelor
Operatia de startareSTART
De stopare STOP
Introducerea de la tastatura
De afisare pe ecran
De calcul(atribuire)
De apel la subprogram
De decizie

3) Structura programului in limbajul C. Structura functiei main()


4)

Un program are structura:


Directivele preprocesorului
Declaratii si definitii globale
Functii
Functia main( int main(void)) e formata din :
Antetul functiei
Titlul functiei
Denumirea functiei
Parametrii functiei

Functiile scamf() si printf() pentru operatii de intrare si iesire. Specificatori de format.


Functia printf()
Cu ajutorul acestei functii putem afisa mesaje pe ecran. Cand programul dvs. foloseste printf, datele pe care vreti sa le
afisati reprezinta parametrii sau argumentele functiei printf.

Atunci cand doriti ca printf sa afiseze o valoare sau o variabila, trebuie sa includeti informatia despre
tipul variabilei in primul parametru. Pe langa caractere in primul parametru puteti sa introduceti
specificatori de format, care arata functiei printf cum sa afiseze ceilalti parametri.
Spre ex. pentru a afisa o valoare de tip int, veti folosi %d. De asemenea, pentru a tipari o valoare in
virgula mobila (float), puteti folosi %f. Functia printf permite utilizarea unor specificatori de format care furnizeaza
informatii despre tipurile parametrilor (cum ar fi int, float, char etc.) Pentru a afisa valorile de tip int cu printf se foloseste
specificatorul de format %d.

Funtia scanf()

Functia scanf este o functie cu ajutorul careia putem citi date de la tastatura.

Aceasta functie realizeaza urmatoarele operatii:


- citeste din fisierul standard de intrade stdio o secventa de campuri de intrare, caracter cu
caracter, pana la terminarea introducerii campurilor si apasarea tastei <enter>
- formateaza fiecare camp conform formatului specificat in lista de formate Din caracterele
citite se calculeaza valori numerice sau literale, conform tipului fiecarei variabile,
dimensiunile de format specificate si a separatorilor de campuri predefiniti (spatiu, tab si
enter) sau impusi explicit
- valorile astfel construite sunt stocate la adresele variabilelor specificate ca argumente;
Pentru functia de citire scanf trebuie folosit operatorul de adresa &. Pentru variabilele citite cu aceasta functie
trebuie precizate adresele la care se stocheaza in memoria calculatorului valorile variabilelor. Functia va
introduce valorile citite direct la acele adrese.

Specificatorii de format ai functiei scanf sunt prezenti in lista urmatoare:

%c citeste un caracter

%d citeste un intreg zecimal

%i citeste un intreg zecimal

%e citeste un numar float

%f citeste un numar float

%g citeste un numar float

%o citeste un nr octal fara semn

%s citeste un sir de caractere

%x citeste un nr hexazecimal fara semn

%p citeste un pointer

%n argumentul asociat primeste o valoare intreaga egala cu numarul de caractere deja citite

%u citeste un numar intreg fara semn

%[] scanare pentru set de caractere

5) Algoritmi cu structura liniara si ramificata. Instructiuni conditionate if, if-else, if-else ifelse
Structuri de algoritmi:

Structura liniara
Structura ramificata
Structura ciclica

Structura mixta
Structura liniara (n-are operatia de conditie) include operaiile de:
- citirea date de intrare;
- calculul valorii unei/unor expresii i atribuirea valorii unei/unor variabile;
- afiarea rezultatelor
Structura de decizie (se mai numete i structur alternativ sau structur ramificat) introduce n
algoritm operaia de ramificare, adic evaluarea unei condiii stabilirea valorii adevrat sau fals a
acesteia i adoptarea unei decizii privind modul n care se continu calculele.
Structura obligatorie a secvenei de decizie este:
- o condiie

- dou subblocuri de instruciuni (notate aciune 1 , aciune 2) a cror interpretare este decis de
valoarea logic a condiiei DA/NU; (adevrat/fals; true/false). Niciodat nu se pot interpreta i executa
ambele subblocuri.
Instruciunea introdus prin cuvntul cheie if exprim o decizie binar i poate avea dou forme: o form
fr cuvntul else i o form cu else:
Sintaxa: If (expresie)
instructiune1
else
instructiune2 SAU:
If (expresie)
Instructiune

6) Algoritmi cu structura ciclica. Ciclu preconditionat si postconditionat. Instructiuni de ciclu


while, do-while
7) Algoritmi cu structura ciclica.Ciclu cu eveniment si cu contor. Instructiunea de ciclu for
Ciclul este o parte a algoritmului (programului) care se repeta de mai multe ori. Pentru a
stabili un ciclu treuie de stabilit conditia ciclului si corpul ciclului.
Dupa locul conditiei ciclului, ciclul se divizeaza in:
- Ciclul preconditionat(conditia se afla pina la corpul ciclului) cu instructiunile de ciclu if si
goto, while, for
- Ciclul postconditionat(conditia se afla dupa corpul ciclului) cu instructiunile de ciclu if si
goto, do while
Exp1
exp2
While(conditia ciclului)
{corpul ciclului;(exp3)
}
Do
{corpul ciclului;
}
While(conditia ciclului);
For (exp1;exp2;exp3)
{
}
-

Ciclurile dupa sensul conditiei se impart in:


Cu contor (cu un numar stabilit de repetari)
Cu eveniment (cu un numar necunoscut de repetari)

8) Algoritmi cu structura ciclu in ciclu. Instructiunile continue, break, goto.


Exist trei instruciuni de salt n limbajul C: break, continue i goto.
Instruciunea break

Instructiunea break se poate folosi in doua scopuri: pentru a incheia executia


instructiunii case din instructiunea switch si pentru iesirea fortata dintr-un ciclu (while, dowhile si for) prin omiterea testarii conditiei de ciclare.
Utilizarea instructiunii break pentru a incheia executia instructiunii case din
instructiunea switch:
switch (expresie)
{
case constanta1:
secventa1_de_instructiuni;
break;
case constanta2:
secventa2_de_instructiuni;
break;
..
default
secventa_de_instructiuni;
}
Utilizarea instructiuni break pentru iesirea fortata dintr-un ciclu while prin omiterea testarii
conditiei de ciclare:
while (conditie)
{
instructiunea1;
instructiunea2;
if(conditie_iesire_fortata) break;
..
instructiunean;
}
Instructiunea continue
Instructiunea continue este asemanatoare cu instructiunea break. Dar spre deosebire de
instructiunea break care forteaza incheierea executarii unei instructiuni de ciclare, instructiunea
continue forteaza trecerea la urmatoarea iteratie a ciclului, prin omiterea orcarei linii de program dintre
cele doua iteratii. Pentru instructiunile while si do-while instructiunea continue forteaza trecerea la
iteratia urmatoare prin executarea testelor conditionale iar pentru instructiunea for se executa
incrementarile precizate.
Utilizarea instructiuni continue pentru fortarea iteratiei urmatoare dintr-un ciclu while prin
omiterea executarii urmatoarelor instructiuni aflate dupa instructiunea continue:
while (conditie)
{
instructiunea1;
instructiunea2;
if(conditie_iteratie_fortata) continue;
..
instructiunean;
}
sau
Utilizarea instructiuni continue pentru fortarea iteratiei urmatoare dintr-un ciclu do-while prin
omiterea executarii urmatoarelor instructiuni aflate dupa instructiunea continue:
do
{

instructiunea1;
instructiunea2;
if(conditie_iteratie_fortata) continue;
..
instructiunean;
}
while (conditie);
Utilizarea instructiuni continue pentru fortarea iteratiei urmatoare dintr-un ciclu for prin
omiterea executarii urmatoarelor instructiuni aflate dupa instructiunea continue:
for ([expresie1];[expresie2];[expresie3])
{
instructiunea1;
instructiunea2;
if(conditie_iteratie_fortata) continue;
..
instructiunean;
}
Instructiunea goto
Instructiunea goto muta controlul execuiei programului ctre o instruciune etichetat (n cadrul aceleiai
metode!). Instructiunea goto are sintaxa:
goto eticheta;
unde:
- eticheta este un identificator ales de programator care eticheteaza (identifica) o anumita
instructiune din program astfel:
eticheta: instructiune;
Folosirea acestei instructiuni NU este recomandata!
eticheta;
for()
{
if(conditia)
{goto eticheta;}
}

9) Clasificarea variabilelor in C. Declararea variabilelor.


Dupa numarul de valori stocate:
- simple
- compuse(tablouri, structuri)
Dupa alocarea memoriei pot fi:
- Statice
- Dinamice
Dupa sensul valorii stocate:
- Regulate
- Pointeri(adrese)

Dupa tipul valoarei:


Tipuri numerice

Intreg
Real
Caracter
Tip vid

10) -12) Tipuri de date

13)

Tablouri unidimensionale. Declararea si prelucrarea tablourilor unidimensionale

Tabloul este o colectie finita de elemente de acelasi tip, numit tip de baza al tabloului, care
ocupa un spatiu continuu de memorie.
Forma generala de declarare a unui tablou unidimensional este:
Tip nume_tablou[dimensiune]; unde:
Tip declara tipul de baza al tabloului, tipul fiecarui element al tabloului;
Dimensiune specifica numarul de elemente ale tabloului;
Nume_tablou este numele dat tabloului;
De exemplu , pentru a declara un tablou t cu 10 elemente de tip int cu elementele t[0],t[1]
t[9] vom scrie:
Int t[10];
Pentru prelucrarea tabloului unidimensional este nevoie de a declara 2 variabile de ex n si I ,
unde:
N numarul de locuri prelucrate
I indicele elementului current
For(i=0;i<n;i++)
{procesarea A[i];
}
Utilizarea unui vector presupune repetarea unor operaii asupra fiecrui element din vector
deci folosirea unor structuri repetitive. De obicei, pentru a realiza o prelucrare asupra tuturor
elementelor tabloului se folosete instruciunea for cu o variabil contor care s ia toate
valorile indicilor.

14) Elemente de baza ale limbajului C


Elementele limbajului C:
- variabile
- Tipuri de date
- instructiuni(simple, compuse)
- expresii(aritmetice, logice)

- operatori
- functii(subprograme)

15)

Operatori si expresii aritmetice si logice.Operatori speciali.


-

Expresii:
Aritmetice(au valori)
Logice(poate avea 2 valori: 0 sau 1) (a+b)-aritmetica

Operatori dupa numarul operanzilor prelucrati


-

Binar(2 operanzi)
Unar(1 operand)
Ternar(3 operanzi)

Operatori dupa tipul operanzilor si al prelucrarii:


-

16)

Instructiuni
In sens general o instructiune este o portiune de program ce poate fi executata, adica specifica o
actiune:atribuire, selectie, iterare, salt etc.
Instructiuni declarative
Instructiune executabile
a)simple:
variabila=expresie
Break-iesire din ciclu
Goto eticheta
Continue;
Nume functia()
; - instructiunea vida
Return exp, return
b) compuse :
- if-else
- switch
- while
-do while
-for
Instructiuni conditionale:
If-else
Switch
Instructiuni de repetitie
While
Do while
For
Instructiuni de salt(speciale):
Break
Continue
Return
Goto

Aritmetice(+,-,/,*,%)
Operatorul de atribuire
Logici si relationali(++,--)
Operatori de atribuire compusa
Operatorul de conversie explicita
Operatorul sizeof
Operatorul virgule(,)
Speciali(=,&,*,.,

Pointeri si operatii cu pointeri in C

(a<b)- logica

Un pointer este o variabil care reine o adres de memorie.


n C, un pointer poate reprezenta:
1. adresa unor date de un anumit tip

tip elementar, structur, ir de caractere etc.

operaiile cu pointeri sunt determinate de dimensiunea tipului de date


2. adresa unei funcii

adresa la care punctul curent de execuie va sri, n cazul n care acea funcie este apelat
3. adresa unei adrese de memorie

acest tip de pointer poate fi redus la prima situaie


4. adresa unei zone cu coninut necunoscut (pointer ctre void)

Pointerii se declara punnd un asterisc (*) n fata numelui variabilei:


int variabila; /*definire variabila intreg*/
int *variabila_ptr; /*definire pointer la un intreg */
Operatorii specifici pointerilor sunt: operatorul de dereferentiere * (pentru un pointer, returneaza
entitatea referita de pointer) si operatorul de adresa & (pentru o entitate, returneaza adresa
entitatii).
Exemplul urmator explica folosirea acestor operatori. Variabila pointer obiect_ptrprimeste adresa
variabilei obiect, astfel obiect_ptr va indica spre zona de memorie unde este memorata variabila obiect. n
ultima linie, se stocheaza valoarea 5 la zona de memorie spre care arata obiect_ptr, adica n
variabila obiect.
int obiect; /* variabila de tip intreg */
int * obiect_ptr; /* pointer la un intreg */
obiect=4;
obiect_ptr=&obiect; /* obiect_ptr va indica
spre obiect */
printf("%d\n", *obiect_ptr); /* afiseaza valoarea
spre care indica
obiect_ptr */
*obiect_ptr=5; /* atribuie lui obiect
valoarea 5 */
17)

Legaturi dintre tablouri si pointeri


In C, exista o relatie strinsa intre pointeri si tablouri, atit de strinsa incit pointerii si tablourile pot fi
tratate simultan. Orice operatie care poate fi rezolvata prin indicierea tablourilor poate fi rezolvata si
cu ajutorul pointerilor. Versiunea cu pointeri va fi in general, mai rapida dar, pentru incepatori, mai
greu de inteles imediat.
Declaratia
int a[10]
defineste un tablou de dimensiunea 10, care este un bloc de 10 obiecte consecutive numite a[0], a[1], ...,
a[9] notatia a[i] desemneaza elementul deci pozitiile, ale tabloului, numarate de la inceputul acestuia.
Daca pa este un pointer pe un interg, decalarat ca

int *pa
atunci asignarea
pa = &a[0]
face ca pa sa pointeze pe al "zero-ulea" element al tabloului a; aceasta inseamna ca pa contine adresa lui
a[0]. Acum asignarea
x = *pa
va copia continutul lui a[0] in x.

Numele unui tablou este un pointer constant spre primul sau element. Expresiile de mai jos sunt deci echivalente :
nume_tablou

&nume_tablou

*nume_tablou

nume_tablou[0]

&nume_tablou[0]

18)

Sortarea tabloului unidimensional prin metoda de selectie liniara

19)

Sortarea tabloului unidimensional prin metoda de selectie si interschimbari


Algoritmul de sortare prin interschimbare este unul din cei mai simpli
algoritmi de sortare, dar nu i cel mai eficient. Acesta are la baz
urmtoarea metodde sortare: fiecare element din vector a[i], 0<=i<n-1,
este comparat cu toate elementele situate n vector dupel, a[j], i<j<n;n
cazul n care cele douelemente nu sunt n ordinea dorit, acestea se vor
interschimba.
main()
{int a[20], n, i, j, aux;
....................................
for (i=0; i<n-1; i++)
for (j=i+1, j<n; j++)
if (a[i]>a[j])
{aux=a[i];
a[i]=a[j];
a[j]=aux;
}
.
}
Dac vectorul aconinea la nceput elementele: 7, 2, 9, 1, 3, iat civa
pai din execuia algoritmului:
i=0, j=1 este a[0]>a[1]? da, deci sevor interschimba primele 2 elemente:
a devine: 2, 7, 9, 1, 3
i=0, j=2 este a[0]>a[2]? nu, deci nu se ntmplnimic;
i=0, j=3 este a[0]>a[3]? da, deci sevor interschimba elementele a[0] i
a[3]:
a devine: 1, 7, 9, 2, 3
i=0, j=4 este a[0]>a[4]? nu, deci nu se ntmpl nimic;
Se trece la urmtoarea valoare pentru i, deoarece for-ul pentru js-a

terminat:
i=1, j=2 este a[1]>a[2]? nu, deci nu se ntmpl nimic;
i=1, j=3 este a[1]>a[3]? da, deci sevor interschimba elementele a[1] i
a[3]:
a devine: 1, 2, 9, 7, 3
..
n final, componentele vectoruluivor fi: 1, 2, 3, 7, 9

20) Sortarea tabloului unidimensional prin metoda bulelor.


Prin metoda de sortare prin metoda buleleor se parcurge vectorul i se compar fiecare element cu succesorul su. Dac
nu sunt n ordine cele dou elemente, acestea se interschimb ntre ele. La prima parcurgere elementul de valoare
maxim se deplaseaz ctre ultima poziie. La a doua parcurgere, elementul imediat urmtor ca valoare dup elementul
maxim se deplaseaz ctre penultima poziie. Vectorul se parcurge de mai multe ori, pn cnd la o parcurgere complet
nu se mai execut nici o interschimbare ntre elemente, nici o deplasare.
for(i=0;i<n;i++)
{ for(k=0;k<n-1-I;k++)
{ if(A[k]>A[k+1])
{ t=k[i];
A[k]=A[k+1];
A[k+1]=t;
}

21) Sortarea tabloului unidimensional prin metoda de insertie


Acest algoritm este unul simplu, bazandu-se pe construirea treptata a listei sortate, adaugand element cu element. Este
mult mai putin eficient decat alti algoritmi ca sortarea rapida, sortarea prin interclasare, heapsort, dar are anumite
avantaje, cum ar fi usurinta de implementare si eficienta pentru liste de dimensiuni mici. traversm elementele, inserm
elementul curent pe poziia corect n subirul care este deja ordonat. n acest fel elementele care au fost deja procesate
sunt n ordinea corect. Dup ce am traversat tot irul toate elementele vor fi sortate.
for(i=0;i<n;i++)
{ t=A[i]
for(k=i-1;k>=0&&t<A[k]);k--)
{ A[k+1]=A[k]; }
{ A[k+1]=t;
}

22)Tablouri bidimensionale.Declararea si prelucrarea tablourilor bidimensionale.


Tablourile bidimensionale funcioneaz ca o matrice i se pot declara astfel:
Matricea se declara folosind comanda: tip [numar max. de linii] [numar max. de coloane];. Exemplu: int x[10][5]. Am declarat o
matrice de tip int cu maxim 10 linii si 5 coloane. Ca si la vectori, matricea declarata este goala. Trebuie sa ii atribuim elemente
fiecarui spatiu liber. Atribuirea se face aproximativ ca la vectori, doar ca aici vom avea doua repetitii, deoarece fiecarei linii ii
corespunde n-1 coloane, etc, si vom avea nevoie de o variabila i, ce va reprezenta linia, si una j, ce va reprezenta coloana. Vom mai
folosi inca 2 variabile, n si m, care vor reprezenta numarul actual de linii, respectiv coloane

Citire:
for(i=1;i<n;i++){
for(j=1;j<m;j++){
scanf(%f,&a[i][j];}}
Afisare:
for(i=1;i<n;i++)
{
for(j=1;j<j;j++)
printf(%f\t,a[i][j]
Printf(\n)
}

23) Functii in limbajul C.Declararea functiei,definitia functiei si apelul la functie.


O funcie n C este o construcie independent care conine declaraii i instruciuni i care realizeaz o anumit aciune.
Funciile pot fi:

Funcii standard (din biblioteci)


Programatorului (utilizatorului)
Pentru a construi i folosi o funcie trebuie s cunoatem trei elemente care sunt implicate n utilizarea funciilor:
[3]

Declararea funciei
Forma general a unei funcii este urmtoarea:
tip nume_funcie (lista de parametri)
{
declaraii locale instruciuni
}

Apelul funciei
Apelul unei funcii se face astfel:
nume_functie(pa1, pa2, . . . ,pan);
Unde pa1, pa2, . . . ,pan, reprezint lista parametrilor actuali (reali) cu care se folosete funcia respectiv.

Prototipul funciei
Pentru a funciona corect programul, orice funcie trebuie declarat anterior folosirii ei. Declararea este necesar
dac funcia este definit n alt parte dect n fiierul n care este apelat, sau dac este definit n acelai fiier
dar n urma apelrii. Prototipul unei funcii are urmtoarea form general:
tip nume_funcie(lista declaraii parametrii);
24)Interschimbarea datelor inre 2 functii. Trimiterea si obtinerea datelor.
Trimiterea datelor:

Utilizind variabilele globale(nu se recomanda)


Utilizind parametrii functiei(void functia(void))

Obtinerea datelor:

Variabile globale(nu se recomanda)

Utizind valoarea returnabila a functiei (o singura valoare)


Utilizind parametrii functiei(de tip pointeri)

Tablourile nu sunt transmise ci transmitem adresele tablourilor.


Trimiterea tablourilo in functie
Tablou unidimensional: tip*nume; sau ti nume[] ex: flaot A[],float *A
Tablou bidimensional: ex: float A[][30], float(*A)[30]

25)Tipul si valoarea returnabila a functiei.Apelul la functie ca o expresie si ca o instructiune.


Daca functia determina o valoare noi scrim variabila de ex: float sumadiag(float A[][],int n,int m)
Iar daca nu determina o valoare noi scriem void ex: void Mintab(float A[][],int n,int m)
Apel la functie ca o expresie: nume(lista argumentelor)
Iar ca o instructiune: clrscr(), k=sumadiag(A,n,m); y=sin(x+1);
26) Alocarea statica si dinamica a memoriei in limbajul C.
Alocarea statica:

Se face de compilator la momentul compilarii


Nu poate fi dealocata sau realocata

O variabil sau o funcie declarat (sau implicit) static are durata de via egal cu cea a programului. In
consecin, o variabil static declarat ntr-o funcie i pstreaz valoarea ntre apeluri succesive ale funciei,
spre deosebire de variabilele auto care sunt realocate pe stiv la fiecare apel al funciei i pornesc de fiecare dat
cu valoarea primit la iniializarea lor (sau cu o valoare imprevizibil, dac nu sunt iniializate).
Alocarea dinamic:

Se execut la momentul lurii programului (funciei)


Poate fi dealocat (eliberat) sau realocat.
Reamintim c pentru variabilele alocate dinamic memoria se aloc dinamic (la execuie) n zona heap ataat
programului, dar numai la cererea explicit a programatorului, prin apelarea unor funcii de bibliotec (malloc,
calloc, realloc). Memoria este eliberat numai la cerere, prin apelarea funciei free

27) Functii pentru alocarea,realocarea si dealocarea dinamica a memorie in limbajul C.


Funciile standard de alocare i de eliberare a memoriei sunt declarate n fiierul antet stdlib.h.

void* malloc(size_t size); alocarea memoriei


void* calloc(size_t nmemb, size_t size); alocarea memorie
void* realloc(void *ptr, size_t size); realocarea memorei
void free(void *ptr); eliberarea memorie

Cele trei funcii de alocare (malloc, calloc i realloc) au ca rezultat adresa zonei de memorie alocate (de tip void*)
i ca argument comun dimensiunea, n octei, a zonei de memorie alocate (de tip size_t ). Dac cererea de alocare
nu poate fi satisfcut pentru c nu mai exist un bloc continuu de dimensiunea solicitat, atunci funciile de

alocare au rezultat NULL (ce reprezint un pointer de tip void * la adresa de memorie 0, care prin convenie este o
adres nevalid - nu exist date stocate n acea zon).

28)Alocarea dinamica a memoriei pentru un tablou unidimensional.


Alocarea dinamica a tablourilor unidimensionale:
float *P;
int n;
printf("Dati n:");
scanf("%i",&n);
P=(float*)malloc(n*sizeof(float));
if(!P)
{ puts("Memoria nu a fost alocata");
exit(1);
}for(i=0;i<n;i++)
{ Procesarea P[i];
}free(P);
P=(float*)realloc(P,(n*2)*sizeof(*P));

29) Tabloul bidimensional alocat static. Pointer la tablou unidimensional.


Prin alocare static nelegem faptul c memoria este alocat automat nc de la pornirea execuiei instruciunilor unei
funcii, iar eliberarea memoriei se face tot automat la prsirea funciei. Cu alte cuvinte, cnd se intr ntr-o funcie
(inclusiv funcia main) se face alocarea static a memoriei, iar eliberarea se face la prsirea acelei funcii. Lungimea
zonei de memorie allocate static este constant, adic de fiecare dat cnd se intr cu execuia ntr-o funcie, se aloc
automat acelai numr de octei.Matrice declarate static sunt tablouri de dimensiuni al cror numr i dimensiune lor
sunt cunoscute la momentul compilrii.
int a1 [100];

char c1 [50];

Pentru a arta c folosim pointeri la tablouri (i nu tablouri la pointeri) avem pentru declaraie sintaxa urmtoare:
Tip (*p) [dim] ;
Diferena dintre pointerii la tablouri de un tip i tablourile de pointeri la acelai tip este modul de stabilire a unitii de
deplasare.
In definiia
a) int (*x) [50];
x este un pointer la un tablou de 50 ntregi.
b) int* x[50];
x este un tablou de 50 pointeri la ntregi

30) Trimiterea tabloului bidimensional alocat static in functie.


31) Tabloul unidimesnional de pointeri. Pointer la pointer.

Pointerii fiind variabile, pot fi folosii pentru a forma alte tipuri de date compuse. Spre exemplu se pot forma tablouri de
pointeri. Sintaxa general de utilizare este :
Tip *tablou[dim] ;
Exemple: Declaraia char *s[25]; reprezint un tablou de 25 pointeri la caracter.
Pentru a atribui adresa unei variabile de tip intreg cu nume num elementului al doilea al tabloului de pointeri x se va
scris: x[1]=&num iar pentru a obtine valoarea num se va scrie *x[1]. Tablourile de pointeri sunt folosite de obicei
pentru a pastra pointeri catre siruri de caractere.
Este posibil sa avem un pointer care puncteaza un alt pointer. Cind un pointer puncteaza un alt pointer primul pointer
contine adresa celui de al doilea pointer care puncteaza locatia ce contine obiectul ,valoarea dorita. Pentru a declara un
pointer catre un alt pointer trebuie plasat un asterix suplimentar in fata numelui pointerului. De ex: char**p

32)Alocarea dinamica a memoriei pentru un tablou bidimensional folosind pointer la


pointer,33)Trimiterea tabloului bidimensional alocat dynamic in functie
float **ADT2(int n)
{ float **P;
int i;
P=(float**)malloc(n*sizeof(float*));
if(P==NULL)
{ return NULL; }
for(i=0;i<n;i++)
{
P[i]=(float*)malloc(n*sizeof(float));
if (P[i]==NULL)
{ return NULL; }
}
return P;
}

34)Trimiterea functiei in functie.Pointer la functie.


Putem declara pointeri ctre orice tip de date, att ctre tipurile standard C, ct i ctre tipurile pe care le definim noi. n
plus, limbajul C ne permite s declarm pointeri la funcii. n anumite situaii pointerii la funcii se dovedesc foarte
utili.Sintaxa de definire a pointerilor la funcii este asemntoare cu sintaxa de definire a funciilor. Un pointer la funcie
se declar dup sintaxa:
tip_returnat (*nume_variabila_pointer)(lista_parametri);
n rest cu pointerii la funcii se lucreaz la fel ca i cu pointerii la orice tip de date. Se folosete operatorul & pentru a
obine adresa de memorie a unei funcii. Se folosete operatorul * pentru a obine funcia spre care indic un pointer.

O funcie poate s apeleze la rndul ei alte funcii. Dac o funcie se apeleaz pe sine nsi, atunci funcia este
recursiv. Pentru a evita un numr infinit de apeluri recursive, trebuie ca funcia s includ n corpul ei o condiie de
oprire, astfel ca, la un moment dat, recurena s se opreasc i s se revin succesiv din apeluri. Condiia trebuie s fie

una generic, i s opreasc recurena n orice situaie. Aceast condiie se refer n general la parametrii de intrare,
pentru care la un anumit moment, rspunsul poate fi returnat direct, fr a mai fi necesar un apel recursiv suplimentar.

35) Functiile standard qsort() si bsearch() pentru sortatrea rapida si cautarea binara.
Bsearch
void * bsearch(const void *key, const void *base, size_t nelem, size_t width, int (*fcmp)(const void * , const void *));
returneaz adresa primei intrri din tablou care coincide cu parametrul cutat i zero dac acesta nu exist n tablou
(cutare binar)
key- adresa cheii cutate base - nceputul tabloului nelem - nr.elemente din tablou width - dim. unui elem. de tablou
fcmp - funcia de comparare definit de utilizator i care primete doi parametric
qsort
void qsort (void *base, size_t nelem, size_t width, int (*fcmp)(const void * , const void *));
sorteaz tabloul dat (algorimtul Quicksort)
base - nceputul tabloului nelem - nr.elemente din tablou width - dim. unui elem. de tablou fcmp - funcia de
comparare definit de utilizator i care primete doi parametric

36)Ciclu infinit si instructiunea switch pentru meniul de obtiuni.


Instructiunea switch este o instruciune decizional multipl (cu mai multe ramuri).
Sintaxa este,

switch ( expresie ) {
case value1:
instructiune 1;
instructiune 2;
......
break;
case valuen:
instructiune k_1;
.......
break;
default:
.......
.......
break;
}
Cuvintul cheie break trebuie pus la sfirsitul fiecarei instructiuni case. Ramura default este optionala, si se executa
atunci cind nici unul din celelalte cazuri nu a fost intilnit.

int main()
{float **A;
int n,m;
int nm;
float s,sum;
while(1)
{system("cls");

puts("\tMeniu\n");
puts("1.Alocarea dinamica a memoriei pentru tabloul bidimensional");
puts("2.Introducerea elementelor in tabloul bidimensional");
puts("3.Afisarea tabloului bidimensional pe ecran");
puts("4.Suma elementelor negative ce se afla sub diagonala principala");
puts("5.Suma elementelor pozitive ce se afla mai sus de elementul minimal din fiecare rind");
puts("6.Eliberarea memoriei");
puts("0.Exit");
printf("\n\tAlegeti optiunea:");
scanf("%d",&nm);

37) Tipul de date character.Declararea si initializarea variabilelor de tip character.


Limbajul C nu dispune de un tip de date nativ pentru reprezentarea irurilor de caractere de lungime variabil. n
acest scop se utilizeaz structuri de date de tip tablou de caractere. ntruct irurile de caractere prelucrate n
programe au n general lungime variabil, s-a stabilit o convenie prin care ultimul caracter utilizat al unui ir este
urmat de un caracter cu valoarea zero ('\0'), numit terminator de ir.
Ex:
char sir [10];
Dac se dorete doar accesarea i prelucrarea elementelor unui ir de caractere care a fost alocat anterior, static
(declaraie de tablou) sau dinamic, se poate utiliza i o variabil de tip pointer ctre caracter:
char sir [10];
char *ptrsir;

ptrsir = sir;

38) Functiile standard pentru introducerea de la tastatura unui caracter.


Functiile standard pentru introducerea caracterelor de la tastatura:
Char ch;

scanf(%c,&ch); buferizate
ch=getchar();
buferizate
ch=getch();
nebuferizate
ch=getche(); nebuferizate

pentru cele buferizate inainte de scris:fflush(stdin) ;


39) Functiile standard pentru afisarea pe ecran unui caracter.
Afisarea caracterelor pe ecran:
Char ch;

printf(%c,ch);
putchar(ch);
putch(ch);

40) Tabloul unidimensional de caractere si string-uri in limbajul C.


n limbajul C/ C++ irul de caractere se obine prin ataarea unui terminator (\0) dup ultimul caracter al irului.
n acest fel irul de caractere este considerat ca fiind un ansamblu unitar, un string.
Char str[10]={N,o,r,o,c,\0}
Pentru a realiza diferite prelucrri asupra irurilor de caractere, putem, desigur, imagina diferi i algoritmi simpli.
Mai simplu, ns, ar fi s folosim funcii predefinite, cuprinse n bibllioteca <string>. Vom face o enumerare, n cele
ce urmeaz a celor mai uzuale, oferind i exemple de utilizare a lor.
Funcia strlen--Returneaz lungimea unui ir de caractere, dat ca parametru
strlen(id_sir_caractere);

strcpy
Funcia determin copierea unui ir surs peste un ir destinaie, incluznd caracterul NULL. Sintax:
strcpy(sir_destinatie,sir_sursa)

strncpy
Funcia determin copierea unui ir surs peste un ir destinaie, incluznd caracterul NULL. Sintax:

strcpy(sir_destinatie,sir_sursa)

strcmp
Funcia este folosit pentru compararea lexicografica a doua siruri de caractere. Forma general este: strcmp(sir1,
sir2 );

41) si 42) Functii pentru introducere si afisare a unui string.


Pentru citirea si afisarea unui ir de caractere se poate folosi flagul 's' la citirea cu scanf sau afiarea
cuprintf. Deasemenea biblioteca stdio.h definete funciile gets() i puts() pentru lucrul cu iruri de
caractere.
gets(zona) - citete de la terminalul standard un ir de caractere terminat cu linie noua (enter).

Funcia are ca parametru adresa zonei de memorie n care se introduc caracterele citite.

Funcia returneaza adresa de nceput a zonei de memorie.


puts(zona) afieaza la terminalul standard irul de caractere din zona data ca parametru, pn la

caracterul terminator de ir(\0), care va fi nlocuit prin caracterul linie noua.

Funcia are ca parametru adresa zonei de memorie de unde ncepe afiarea caracterelor.

Funcia returneaza codul ultimului caracter din irul de caractere afiat i -1 daca a aparut

o eroare.
Funcia gets() va citi de la tastatura cte caractere sunt introduse, chiar daca irul declarat are o lungime
mai mic. Presupunem un ir declarat: char a[]=unsir , care va avea deci 5 caractere. Citind un ir de
lungime mai mare ca 5 de la tastatura, n irul a, la afiare vom vedea ca s-a reinut tot sirul!(nu doar
primele 5 caractere). Nimic deosebit pn acum. Dar dac lum n considerare c citirea caracterelor
auxiliare se face n continuare n zona de memorie, ne punem problema ce se va suprascrie?! Raspunsul
este: nu se tie poate nimic important pentru programul nostru, poate ceva ce il va bloca sau duce la
obinerea de date eronate.
Pentru a evita aceasta se recomand utilizarea fgets().
fgets(zona, lung_zona, stdin) - citete de la stdin un ir de caractere terminat printr-o linie nou
dac lungimea lui este mai mic decat lung_zona sau primele lung_zona - 1 caractere n caz
contrar. Parametrii sunt: zona de memorie, lungimea maxima admis a irului, i terminalul
standard de intrare. n cazul n care irul dorit are lungime mai mic dect cea maxim, naintea
terminatorului de ir (\0), n zona de memorie va fi reinut i enter-ul dat(\n).

43) Functii din biblioteca standard pentru prelucrarea caracterelor si a string-urilor


Pentru manipularea irurilor de caractere n limbajul C se folosesc funcii declarate n fiierul <string.h>.
Vom ncerca s le detaliem putin pe cele mai des folosite:
strlen()
size_t strlen(const char *str);
Returneaza lungimea unui ir dat ca parametru. (numarul de caractere pn la ntalnirea terminatorului de
ir:\0)
Exemplu:

#include <stdio.h>
#include <string.h>
#define N 256
int main () {
char text[N];
printf("Introduceti un text: ");
gets(text);
printf("Textul are %u caractere.\n", strlen(text));
return 0;
}
Iesire:
Introduceti un text: just testing
Textul are 12 caractere.
memset()
void* memset(void *ptr, int val, size_t num);
n zona de memorie dat de pointerul ptr, sunt setate primele num poziii la valoarea dat de val. Funcia
returneaz irul ptr.
Exemplu:
#include <stdio.h>
#include <string.h>
int main () {
char str[] = "nu prea vreau vacanta!";
memset(str, '-', 7);
puts(str);
return 0;
}
Iesire:
------- vreau vacanta!
memmove()
void* memmove(void *destination, const void *source, size_t num);
Copiaz un numr de num caractere de la surs, la zona de memorie indicat de destinaie. Copierea are
loc ca i cum ar exista un buffer intermediar, deci sursa si destinatia se pot suprapune. Funcia nu verific

terminatorul de ir la surs, copiaz mereu num bytes, deci pentru a evita depsirea trebuie ca
dimensiunea sursei sa fie mai mare ca num. Funcia returneaz destinaia.
Exemplu:
#include <stdio.h>
#include <string.h>
int main () {
char str[] = "memmove can be very useful......";
memmove(str + 20, str + 15, 11);
puts(str);
return 0;
}
Iesire:
memmove can be very very useful.
memcpy()
void* memcpy(void *destination, const void *source, size_t num);
Copiaz un numr de num caractere din irul surs in irul destinaie. Funcia returneaz irul destinaie.
Exemplu:
#include <stdio.h>
#include <string.h>
#define N 40
int main () {
char str1[] = "Exemplu";
char str2[N];
char str3[N];
memcpy(str2, str1, strlen(str1) + 1);
memcpy(str3, "un sir", 7);
printf("str1: %s\nstr2: %s\nstr3: %s\n", str1, str2, str3);
return 0;
}
Iesire:
str1: Exemplu
str2: Exemplu
str3: un sir

strcpy()
char* strcpy(char *destination, const char *source);
Copiaz irul surs in irul destinaie. irul destinaie va fi suprascris. Funcia asigur plasarea
terminatorului de ir n irul destinaie dup copiere. Funcia returneaza irul destinaie.
strncpy()
char* strncpy(char *destination, const char *source, size_t num);
Asemeni cu strcpy(), dar in loc de a fi copiat toata sursa sunt copiate doar primele num caractere.
Exemplu:
#include <stdio.h>
#include <string.h>
#define N 40
int main () {
char str1[] = "Exemplu";
char str2[N];
char str3[N];
strcpy(str2, str1);
strncpy(str3, "un sir", 2);
str3[2] = '\0';
printf("str1: %s\nstr2: %s\nstr3: %s\n", str1, str2, str3);
return 0;
}
Iesire:
str1: Exemplu
str2: Exemplu
str3: un
strcat()
char* strcat(char *destination, const char *source);
Concatenenaza irul surs la irul destinaie. Funcia returneaz irul destinaie.
strncat()
char* strncat(char *destination, const char *source, size_t num);

Asemeni cu strcat(), dar n loc de a fi concatenat toat sursa sunt concatenate doar primele numcaractere.
Exemplu:
#include <stdio.h>
#include <string.h>
#define N 80
int main () {
char str[N];
strcpy(str, "ana ");
strcat(str, "are ");
strcat(str, "mere ");
puts(str);
strncat(str, "si pere si prune", 7);
puts(str);
return 0;
}
Iesire:
ana are mere
ana are mere si pere
strcmp()
int strcmp(const char *str1, const char *str2);
Compar irul str1 cu irul str2, verificndu-le caracter cu caracter. Valoarea returnat este 0 daca cele
iruri sunt identice, mai mare ca 0 daca str1 este mai mare(alfabetic) i mai mic ca 0 altfel.
Exemplu:
#include <stdio.h>
#include <string.h>
#define N 80
int main () {
char cuv[] = "rosu";
char cuv_citit[N];
do {
printf ("Ghiceste culoarea...");
gets(cuv_citit);
} while (strcmp(cuv,cuv_citit) != 0);
puts("OK");

return 0;
}
strchr()
char* strchr(const char *str, int character);
Caut caracterul character n irul str i returneaz un pointer la prima sa apariie.
strrchr()
char* strrchr(const char *str, int character);
Caut caracterul character n irul str i returneaz un pointer la ultima sa apariie.
strstr()
char* strstr(const char *str1, const char *str2);
Caut irul str2 n irul str1 i returneaz un pointer la prima sa apariie, sau NULL dac nu a fost gsit.
strdup()
char* strdup(const char *str);
Realizeaz un duplicat al irului str, pe care l i returneaz.
Exemplu:
#include <stdio.h>
#include <string.h>
#define N 80
int main () {
char str[N], *d;
do {
if (gets(str) == 0) {
break;
}
d = strdup(str);
puts(d);
} while (1);
return 0;
}

strtok()
char* strtok(char *str, const char *delimitators);
Funcia are rolul de a mpari irul str n tokens(subiruri separate de orice caracter aflat n lista de
delimitatori), prin apelarea ei succesiv.
La primul apel, parametrul str trebuie sa fie un ir de caractere, ce urmeaz a fi mpartit. Apelurile
urmatoare, vor avea n loc de str, NULL coninund mparirea aceluiai ir.
Funcia va returna la fiecare apel un token(un subsir), ignornd caracterele cu rol de separator aflate n
irul de delimitatori. O dat terminat irul, funcia va returna NULL.
Implementarea curent din <string.h> nu permite folosirea strtok() n paralel pe mai mult de un ir.
Exemplu:
#include <stdio.h>
#include <string.h>
int main () {
char str[] = "- Uite, asta e un sir.";
char *p;
p = strtok(str, " ,.-");
/* separa sirul in "tokeni" si afiseaza-i pe linii separate. */
while (p != NULL) {
printf("%s\n", p);
p = strtok(NULL, " ,.-");
}
return 0;
}
Iesire:
Uite
asta
e
un
sir

44) Tipuri de date definite de utilizator.Caracteristica generala. Utilizarea instructiunii typedef


Limbajul C ofera posibilitati de definire a unor tipurilor de date, cu ajutorul:

structurilor - permit gruparea unor obiecte (date) de tipuri diferite, referite printr-un nume
comun;

cmpurilor de biti - membri ai unei structuri pentru care se aloca un grup de biti, n interiorul
unui cuvnt de memorie;
uniunilor - permit utilizarea n comun a unei zone de memorie de catre mai multe obiecte de
diferite tipuri;
declaratiilor typedef - asociaza nume tipurilor noi de date;
enumerarilor - sunt liste de identificatori cu valori constante, ntregi.

Limbajul C pune la dispoziie o facilitate numit typedef pentru crearea de noi nume de tipuri de date.
Declaraia:
typedef int Lungime;
face numele Lungime sinonim cu int. Tipul Lungime poate fi folosit n declaraii, conversii etc.,
Declaraia typedef char *Sir; face numele Sir sinonim cu char * ( pointer spre caracter );
O declaraie typedef nu creeaz un tip nou. Ea doar atribuie un nume unui tip existent. Motivele
principale pentru utilizarea construciilor typedef sunt:
1. Creterea portabilitii programelor: dac se folosesc construcii typedef pentru tipuri de date care pot fi
dependente de main, numai construciile typedef trebuie modificate atunci cnd programul este mutat
pe alt calculator.
2. Furnizarea unei documentaii mai bune pentru un program

45)Tipuri de date structura. Declaratia unui tip de date struct si a variabilelor de tip struct.

46) Cimpurile structurii. Operatiuni de acces la cimpurile structurii. Operatiunea de atribuire


pentru variabile de tip structura

Campurile unei structuri pot fi de orice tip, simplu sau derivat, dar nu void sau functie. Un camp al unei
structuri poate fi de tip structura, dar nu aceeasi cu cea definita - se poate insa sa se declare un camp
pointer la structura definite.

Selectarea unui camp al unei variabile structura se realizeaza folosind operatorul de selectie . .
Campul selectat se comporta ca o variabila de acelasi tip, deci i se pot aplica aceleasi prelucrari
ca oricarei variabile de tipul respectiv.

.nume_camp

variabila_structura

Selectia campurilor pentru variabila p de mai sus:


p.nume //tablou de caractere
p.nume[0] //primul caracter din nume
p.nume[strlen(p.nume)-1] //ultimul caracter din nume
p.data_nasterii.an
p.data_nasterii.luna
p.data_nasterii.an

Unei variabile de tip structura:i se pot aplica operatorii & si sizeof

O variabila structura poate fi initializata la declarare prin precizarea intre {} a valorilor


campurilor; cele neprecizate sunt implicit 0

O variabila structura poate fi copiata in alta variabila de acelasi tip

Cu declaratiile de mai sus:


printf("%d %d\n",sizeof(pers),sizeof(struct persoana));
ppers=&pers;
persoane[0]=*ppers; //atribuirea intre doua variabile structura

O variabila structura nu poate fi citita sau scrisa direct, ci prin intermediul campurilor

Functiile pot avea parametrii de tip structura

Tipul rezultatului returnat de o functie poate fi structura - a se studia exemplele de mai jos.

47) Tabloul unidimensional de structuri. Baza de date in forma de tablou de structure. Operatiuni
de prelucrare a tabloului de structure.

48) Tipul de date uniunea. Declaratia unui tip de date union si a variabilelor de tip union.

49) Cimpurile variabilei de tip union.Operatiuni de acces si de atribuire.Deosebiri dintre variabile


de tip struct si de tip union.
Declararea uniunilor se face folosind cuvntul cheie union:
Sintax:
union {
tip_comp1 nume_comp1;
tip_comp2 nume_comp2; }
[lista_variabile_structur];
unde: tip_comp1, tip_comp2,... este tipul componentei i nume_comp1, nume_comp2,... este
numele unei component
Accesul la membrii unei uniuni foloseste acceiasi metoda pe care o folosesc structural,adica
nume variabile urmat de punct si de nume membru:
Gama.y=765.862;
Gama.ch[1]=a;

O uniune este o locatie de memorie care poate fi accesata de 2 sau mai multe variabile de diferite tipuri in momente
diferite. Iar Structurile sunt tipuri de date n care putem grupa mai multe variabile eventual de tipuri diferite.
Uniunile sunt asemntoare structurilor, dar lor li se rezerv o zon de memorie ce poate conine, la momente de
timp diferite, variabile de tipuri diferite.

50) Tipul de date enumerarea .Declaratia unui tip de date enum si a variabilelor de tip enum
Tipul enumerare este un caz particular al tipurilor intregi. Se utilizeaza pentru a realiza o reprezentare comoda si
sugestiva a unor obiecte ale caror valori sunt identificate printr-un numar finit de nume simbolice. Tipul enumerare
declara constante simbolice, carora li se asociaza coduri numerice de tip intreg, astfel:
enum nume_tip { lista_constante_simbolice };
Compilatorul asociaza constantelor enumerate cate un cod intreg din succesiunea incepand cu 0.
Exemple:
enum zile_lucr { luni, marti, miercuri, joi, vineri }; /* luni e asociat cu 0, marti cu 1, ..., vineri cu 4 */
Daca se doreste o alta codificare a constantelor din enumerare decat cea implicita, pot fi folosite in enumerare
elemente de forma:
nume_constanta=valoare_intreaga;
Constantelor simbolice ce urmeaza unei astfel de initializari li se asociaza numerele intregi urmatoare:
enum transport { tren, autocar=5, autoturism, avion };

51) Argumentele(parametrii) functiei main()


La lansarea n execuie a unui fiier executabil, n linia de comand, pe lng numele fiierului se pot
specifica argumente, care se transmit ca parametrii funciei main. Argumentele = date iniiale pentru
program: nume de fiiere folosite de program, opiuni diverse de lucru. Antetul funciei main va fi:
int main( int argc, char ** argv )
argc - numrul de argumente argv - adresa vectorului de pointeri la iruri, reprezentnd argumentele
Argumentele liniei de comand sunt n acest caz:

gcc
-Wall
-I/usr/include/sys
-DDEBUG
-o
My Shell
myshell.c

52) Directivele preprocesorului include si define. Macro-definitie si pseudo-functie


Preprocesorul este componenta din cadrul compilatorului C care realizeaz preprocesarea. n urma acestui pas,
toate instruciunile de preprocesare sunt nlocuite (substituite), pentru a genera cod C pur.

Definirea de simboluri este cel mai des folosit n conjuncie cu instruciunile de procesare condiionat, fiind
folosit pentru activarea i dezactivarea unor segmente de cod n funcie de prezena unor simboluri. Definirea unui
simbol se face n cod cu instruciunea
#define SIMBOL
Probabil cea mai des folosit instruciune de preprocesare este cea de incluziune, de forma
#include <nume_fiier>
care are ca rezultat nlocuirea sa cu coninutul fiierului specificat de nume_fiier.
Instruciunile de preprocesare mai pot fi folosite i pentru definirea de constante simbolice i macroinstruciuni. De
exemplu
#define CONSTANTA valoare
va duce la nlocuirea peste tot n cadrul codului surs a irului CONSTANTA cu irul valoare. nlocuirea nu se
face totui n interiorul irurilor de caractere.

53) Pointer de tip fisier. Deschiderea si inchiderea a unui fisier folosind functiile fopen( ) si fclose().
Prelucrarea unui fiier presupune asocierea acestuia cu un canal de I/E (numit flux sau stream). *fopen-pointer spre
fisier
FILE *fopen(char *nume_fis,char *mod);
deschide fiierul cu numele dat pentru acces de tip mod.
Returneaz pointer la fiier sau NULL dac fiierul nu poate fi deschis; valoarea returnat este memorat n
variabila fiier, care a fost declarat pentru accesarea lui.
Modul de deschidere poate fi:

r - readonly , este permis doar citirea dintr-un fiier existent


w - write, creaz un nou fiier, sau dac exist deja, distruge vechiul continut
a - append, deschide pentru scriere un fiier existent ( scrierea se va face n continuarea
informaiei deja existente n fiier, deci pointerul de acces se plaseaz la sfritul fiierului )

+ - permite scrierea i citirea - actualizare (ex: r+, w+, a+). O citire nu poate fi direct
urmat
de o scriere i reciproc. nti trebuie repoziionat cursorul de acces printr-un apel la fseek.

b - specific fiier de tip binar


t - specific fiier de tip text (implicit), la care se face automat conversia CR-LF(\n\f) n sau
din CR ('\n').
int fclose(FILE *fp);
nchide fiierul i elibereaz zona tampon; returneaz 0 la succes, EOF la eroare

54) Functii standard de citire si de scriere pentru fisiere.


Cite un caracter
int fputc(int c, FILE *stream) // scrie caracter in fisier
int fgetc(FILE *stream) // citeste caracter din fisier
// getc, putc: ca si fgetc, fputc
int ungetc(int c, FILE *stream) // pune caracter c inapoi
Citire/scriere formatata (la fel ca printf/scanf, din fisierul indicat)
int fscanf (FILE *stream, const char *format, ...)
int fprintf(FILE *stream, const char *format, ...)
Cite o linie de text
int fputs(const char *s, FILE *stream) // scrie un sir
int puts(const char *s) // scrie sirul + \n la stdout
char *fgets(char *s, int size, FILE *stream)
//citeste din fisier in tabloul s, max. size caract. + \0

55) Operatiuni pe biti in limbajul C. Caracteristica generala


Se aplic fiecrui bit din reprezentarea operanzilor ntregi. Restul operatorilor se aplic valorilor
operanzilor. Sunt 6 operatii:

x & y (I): bitul al k-lea are valoarea 1 dac ambii bii k din x i y au valoarea 1;

x | y (SAU): bitul al k-lea are valoarea 1 dac cel puin un bit k din x i y are valoarea 1;

x ^ y (XOR sau SAU EXCLUSIV): bitul al k-lea are valoarea 1 dac exact un bit k din x i y are
valoarea 1;
~x (NOT): bitul al k-lea are valoarea 1 dac bitul k din x are valoarea 0;

x >> k (SHIFT DREAPTA): deplaseaz numrul n baza 2 cu k bii spre dreapta, pierznd
ultimii k bii i completnd cu k zerouri la stnga;

x << k (SHIFT STNGA): deplaseaz numrul n baza 2 cu k bii spre stnga, pierznd
primii k bii i completnd cu k zerouri la dreapta;

56) Operatori pentru operatiuni logice pe biti.

Conditiile mai complexe se obtin aplicand conditiilor simple operatorii logici:


!

negatie logica

&& si logic
||
sau logic
Operanzii sunt intregi, interpretati ca valori logice. Operatorii trateaza operanzii ca valori logice, deci orice
valoarea diferita de 0 este interpretata ca adevarat, iar 0 ca fals. Aplicand unui intreg operatorul de negatie logica,
se obtine 1 daca operandul e fals, respectiv 0 daca operandul este adevarat.
int a=4,b=6;
printf("%d %d %d %d\n", !a, !!a, a&&b-6, a||(b=8));
printf("b=%d\n");

57)Operatori pentru operatiuni de deplasare pe biti.


Primul operand este cel al crui bii sunt deplasati
Al doilea indic numrul de bii cu care se face deplasarea:
a<<n, a>>n
La deplasarea la stnga cu o poziie, bitul cel mai semnificativ se pierde, iar n dreapta se completeaz cu bitul 0.
La deplasarea la dreapta cu o poziie, bitul cel mai puin semnificativ se pierde, iar n stnga se completeaz cu un
bit identic cu cel de semn. Cu excepia cazurilor cnd se produce depire, deplasarea la stnga cu n bii
echivaleaz cu nmulirea cu 2 la puterea n. Deplasarea la dreapta cu n bii echivaleaz cu mprirea cu 2 la puterea
n.

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