Documente Academic
Documente Profesional
Documente Cultură
Teorie UBB PDF
Teorie UBB PDF
Bulzan Sergiu
Cuprins
Algoritmi ............................................................................................................................................. 1
1.1
1.2
1.3
1.4
2.2
Constante.Identificatori ...................................................................................................... 9
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.10
Subprograme predefinite.................................................................................................................. 16
3.1
3.2
Tipul Tablou....................................................................................................................... 20
4.2
Tipul ir de caractere......................................................................................................... 21
4.3
Fiiere text......................................................................................................................................... 23
5.1
5.2
6.3
irul lui Fibonacci. Calculul unor sume cu termenul general dat. ..................................... 26
6.4
Metode de ordonare......................................................................................................... 27
6.5
Interclasare ....................................................................................................................... 29
7.2
7.3
7.4
Apelul funciilor................................................................................................................. 32
7.5
7.6
Recursivitate ..................................................................................................................................... 36
8.1
Algoritmi
1.1 Notiunea de algoritm. Caracteristici
Algoritmul = metoda de solutionare a unui tip de probleme, constand
intr-o multime finita,bine definita si ordonata de operatii.
Un algoritm reprezint o metod de rezolvare a problemelor de un
anumit tip.
A rezolva o problem nseamn a obine, pentru anumite date de
intrare, rezultatul problemei (date de ieire):
Date de intrare
ALGORITM
Date de ieire
Proprietati:
1) Generalitate algoritmul rezolva o clasa de probleme nu o problema
particulara
Ex : Nu 3+2 ci a+b
2) Claritate algoritmul nu contine ambiguitati
3) Finitudine algoritmul se termina dupa un numar finit de pasi
Alte proprietati:
Completitudinea algoritmul tine cont de toate cazurile particulare
ale problemei generale.
Ex : calculul lui 2 la n. Caz particular : 2 la 0 care trebuie
tratat separat.
Eficienta algoritmul se va executa cu numar minim de pasi,
folosind un minim
de memorie
Rezolvabilitate Algoritmul sa aiba cel putin o solutie
Expresii
In scopul efectuarii calculelor, algoritmii folosesc expresii. O expresie
este alcatuita din unul sau mai multi operanzi legati intre ei prin
operatori.
o
In limbajul de programare C/C++ -
2. Structura alternativa se defineste prin selectia intre doua sau mai multe
actiuni in functie de datele problemei.Poate fi de doua tipuri:
A.
STRUCTURA ALTERNATIVA SIMPLA: Intre doua posibilitati alternative(adevarat;fals)
si care are ca instructiuni de baza instructiunile urmatoare:
daca conditie
atunci
actiune1;
altfel
actiune2;
sfarsit_daca.
B.
STRUCTURA ALTERNATIVA GENERALIZATA: Este atunci cand vom alege intre mai
multe posibilitati (diferite de principiul adevarat si fals) in functie de o variabila de memorie
numita selector,variabila care contine elemente de acelasi tip;executarea actiunilor se va
face in functie de valoarea selectorului in ordinea in care ne sunt date elementele lui.
in cazul ca selector
cazul v1:actiune1;
cazul v2:actiune2;
...........................
cazul vi:actiune i;
...........................
cazul vn:actiune n;
altfel actiune n+1
sfarsit_in_caz_ca.
Exemplu:
1)
Cat timp
Efect:
Pas 1: se evalueaz expresia;
Pas 2: dac valoarea expresiei este fals(0), se iese din instruciunea ct timpexecut;
daca valoarea expresiei este adevrat, se execut instruciunea, apoi se revine la Pas 1.
Efect:
3) Pentru
Pentru contor <- exp_i, exp_f, x executa
Instructiune;
Sf Pentru
Efect:
Pas 1: se execut instruciunea;
Pas 2: se evalueaz expresia;
Pas 3:dac valoarea expresiei este adevrat(1) se iese din instruciunea repetitiv; dac
valoarea expresiei este fals(0), se revine la Pas 1.
exp_i si exp_f sunt expresii ale caror valori sunt evaluate in cadrul repetitiilor
contor este o variabila ce va lua prima data valoarea expresiei initiale exp_i urmand
apoi sa se modifice pana la valoarea expresiei finale exp_f
x este o valoare numerica, in aces caz contorul va creste din x in x. in cazul in care
x=1, atunci acesta poate sa lipseasca.
Operaia de citire
Sintaxa: citete variabila1, variabila2, ..., variabilan;
Efect: Prin operaia de citire (denumit 1 operaie de intrare) se preiau succesiv valori
de la tastatur i se asociaz, n ordine, variabilelor specicate.
Operaia de scriere
Sintaxa: scrie expresie1, expresie2, ..., expresien;
Efect: Operaia de scriere (denumit i operaie de ieire) presupune evaluarea n
ordine a expresiilor specicate
Operaia de atribuire
Sintaxa: variabila expresie;
Efect: se evalueaz expresia, apoi se atribuie valoarea expresiei variabilei din membrul
stng.
Sintaxa
= reprezint totalitatea regulilor care trebuie respectate pentru
definirea elementelor limbajului;
Semantica = definete semnificaia construciilor sintactic corecte;
Pragmatica = definete modul de utilizare a elementelor limbajului.
Exemplu:
nume corect de variabil: a, a3, _56, nr_cuv
nume greit de variabil: 3aq, nr cuv
Observaii:
- un identificator poate s aib orice lungime, semnificative sunt primele 31
caractere.
- C/C++ este case-sensitive (face distincie ntre literele mari i mici; adic un
identificator a difer de identificatorul A)
- identificatorii ar trebui s aib denumirea n conformitate cu scopul utilizrii lor.
O categorie special de identificatori este reprezentat de cuvintele rezervate
sau cuvinte cheie ale limbajului.
Din punct de vedere sintactic cuvintele cheie sunt identificatori utilizai numai n
scopul pentru care au fost creai.
Separatorii
Sunt utilizai pentru a separe unitile sintactice ntre ele;
Exist mai multe tipuri de separatori:
- separatori standard: spaiul ( ), tab(\t), enter (new line \n)
- delimitatori: operatorul virgul (,)
- separatori speciali: ;(este utilizat la finalul unei instruciuni), (apostroafe)
i (utilizai pentru constantele de tip caracter i ir de caractere)
Comentariile
Reprezint o succesiune de caractere pe care compilatorul (cel care transcrie
codul surs n limbaj main) nu le ia n considerare.
Exist n C/C++ dou tipuri de comentarii:
- pe mai multe linii cu marcajul /**/
- pe o singur linie (de la marcaj pn la sf. de linie) cu marcajul //
Sunt utilizate pentru a crete gradul de lizibilitate a programului i ajut
utilizatorii multiplii la nelegerea programului.
2.2 Constante.Identificatori
Constantele - sunt date ce nu pot fi modificate n cadrul programului.
n limbajul C, preprocesorul poate crea macrouri i poate substitui valori. Preprocesorul
realizeaz o simpl nlocuire de text i nu ofer posibiliti de verificri pentru tipuri de date.
Acest lucru poate introduce anumite efecte ascunse. Acest aspect poate fi rezolvat prin
folosirea valorilor const. nlocuirea tipic a valorilor prin nume se face ca n exemplul
urmtor:
DIMENSIUNE este un nume care exist doar n faza de preprocesare, dup care nu va fi
stocat n memorie. Declaraia se poate plasa n fiiere header pentru a furniza o singur
valoare pentru toate fiierele surs care l vor utiliza.
Dac se dorete evitarea eventualelor probleme (bug-uri) provocate de aceast declaraie,
n special prin lipsa verificrii tipurilor de date utilizate, se poate folosi o variabil const care
poate fi plasat oriunde n program, astfel nct s poat fi folosit n faza compilrii:
double vector[DIMENSIUNE];
Se poate folosi const pentru toate tipurile predefinite de date (char, int, float i double) i
pentru cele derivate din acestea.
Tipul operaiei
Semne (operatori unari)
De multiplicitate (operatori binari)
Aditivi (operatori binari)
Operatorii logici sunt de dou tipuri: logici globali i logici pe bii (sunt operatori binari toi n
afar de negaia logic i pe bii care sunt unari)
Operatori logici globali (&&, ||, !)
Operatori relaionali (<,>,<=,>=,!=) se aplic datelor de tip standard i returneaz un rezultat
de tip logic.
Nr. octei
Valori
int
2 octei cu semn
[-32768, 32768]
unsigned int
2 octei fr semn
[0, 65535]
long int
unsigned long int
4 ocei cu semn
4 ocei fr semn
[-2147483648, 2147483647]
[0, 4294967295]
2) Tipul char
Tipul char este, de asementea, un tip intreg, care se reprezinta pe un octet, cu semn. Acest
tip suporta un singur modificator unsigned:
Denumirea
char
unsigned char
Nr. octei
1 octet cu semn
1 octet fr semn
Valori
[128, 127]
[0, 255]
3) Tipul real
Tipurile reale ale limbajului C/C++ sunt float si double. Tipul double accepta si modificatorul
long.
ex:
int a, b=2, c=2+4;
char z;
float x=b*2.5, y;
Exemplu:
# include <iostream.h> // am inclus fiierul antet iostream.h care
conine funcii pentru citire/scriere
Observaie:
Dac realizm noi fiiere pe care vrem s le includem n antet acestea vor fi incluse ntre ghilimele ca
de exemplu: # include fisierul_meu.cpp
n zona de preprocesare se pot defini i constante simbolice de forma:
# define PI 3.1415
Comentariile
Reprezint o succesiune de caractere pe care compilatorul (cel care transcrie codul surs n
limbaj main) nu le ia n considerare.
Exist n C/C++ dou tipuri de comentarii:
- pe mai multe linii cu marcajul /**/
- pe o singur linie (de la marcaj pn la sf. de linie) cu marcajul //
Sunt utilizate pentru a crete gradul de lizibilitate a programului i ajut utilizatorii multiplii la
nelegerea programului.
Sintaxa: cout<<expresie;
Citirea i scrierea de date este gestionat din fiierul antet iostream.h
instructiune_n
}
Efect: Se executa in ordine instructiunile specificate.
3. Instructiunea IF
if(expresie)
instructiune_1
else
instructiune_2
Efect: Se evalueaza expresia. Daca valoarea expresiei este diferita de 0, se executa
instructiune_1, altfel se executa instructiune_2
4. Instructiunea WHILE
while(expresie)
instructiune
Efect:
Pas1: Se evalueaza expresia;
Pas2: daca valoarea expresiei este 0, se iese din instructiunea while. daca valoarea expresiei
este diferita de 0, se executa instructiunea, apoi se revine la pas1.
5. Instructiunea DO-WHILE
do
instructiune;
while(expresie);
Efect:
Pas1: se executa instructiunea;
Pas2: se evalueaza expresia;
Pas3: daca valoarea expresiei este 0, se iese din instructiunea repetitiva. daca valoarea
expresiei este diferita de 0, se revine la Pas1.
6. Instructiunea FOR
for(expresieinitializare ; expresiecontinuare ; expresiereinitializare)
instructiune;
Efect:
Pas1: se evalueaza expresia de initializare;
Pas2: se evalueaza expresia de continuare;
Pas3: daca valoarea expresiei de continuare este 0, se iese din instructiunea repetitiva for;
daca valoarea expresiei de continuare este diferite de 0:
- se executa instructiunea;
- se evalueaza expresia de reinitializare
- se revine la Pas 2.
Subprograme predefinite
3.1 Subprograme. Mecanisme de transfer prin intermediul
parametrilor
Un subprogram este un ansamblu ce poate conine tipuri de date, variabile i
instruciuni destinate unei anumite prelucrri (calcule, citiri, scrieri). Subprogramul poate fi
executat doar dac este apelat de ctre un program sau de ctre un alt subprogram.
n limbajul C si C++, subprogramele sunt denumite funcii.
Funciile reprezinta un element fundamental al limbajului C/C++. Aa cum tim, orice
program C/C++ este constituit dintr-o succesiune de funcii, dintre care una este funcia
principal main(). La lansarea execuiei a unui program C/C++ este apelata funcia main().
n concluzie, ntr-un program C/C++ toate prelucrrile sunt organizate ca o ierarhie
de apeluri de funcii, baza acestei ierarhii fiind funcia main().
de sir).
Exemplu:
char a[50]=ora de informatica; strlen(a) = 18
Functia strcpy
strcpy(sir_destinatie,sir_sursa); copiaza sirul sir_ sursa in sir_destinatie (se
Functia strncat
strncat(dest,sursa,nr);
Functia strchr
strchr(sir,c); are rolul de a cauta caracterul c in sirul sir. Cautarea se face de la stanga la
dreapta, iar functia intoarce adresa subsirului care incepe cu prima aparitie a caracterului c. Daca nu
este gasit caracterul, functia returneaza 0. Diferenta dintre adresa sirului initial si cea a subsirului
returnat reprezinta chiar pozitia caracterului cautat in sirul dat.
Exemplu:
char *a=acesta este un sir,b=t,c=x,d;
cout<<strchr(a,b); se tipareste ta este un sir;
Functia strcmp
int strcmp(sir1,sir2); are rolul de a compara doua siruri de caractere. Valoarea returnata
este <0 (daca sir1<sir2), =0 (daca sir1=sir2) si >0 (daca sir1>sir2). Functia strcmpface
Functia strtok
strtok(sir1,sir2); are rolul de a separa sirul sir1 in mai multe siruri (cuvinte) separate
intre ele prin unul sau mai multe caractere cu rol de separator. Sirul sir2 este alcatuit din unul sau
mai multe caractere cu rol de separator.
Functia strtok actioneaza in felul urmator:
o
Primul apel trebuie sa fie de forma strtok(sir1,sir2); Functia intoarce adresa primului
caracter al primei entitati. Dupa prima entitate, separatorul este inlocuit automat prin caracterul
nul.
o
Urmatoarele apeluri sunt de forma strtok(NULL,sir2); De fiecare data, functia intoarce
adresa de inceput a urmatoarei entitati, adaugand automat dupa ea caracterul nul.
o
Cand sirul nu mai contine entitati, functia returneaza adresa nula.
Exemplu:
//Sa se separe cuvintele dintr-un text.
#include <iostream.h>
#include <conio.h>
#include <string.h>
void main()
{char text[100],cuv[10][10],*p,*r,separator[]=",. !?";int i=0,nr=0;
clrscr();
cout<<"Dati sirul:";cin.get(text,100);
strcpy(p,text);
p=strtok(p,separator);
while (p)
{strcpy(cuv[++nr],p);
p=strtok(NULL,separator);}
cout<<"Sunt "<<nr<<" cuvinte:"<<endl;
for (i=1;i<=nr;i++) cout<<cuv[i]<<endl;
getch();}
nume[0]
nume[1]
nume[2]
Deoarece elementele unui tablou sunt memorate n ordine, unul dup altul ntr-o zon contigu,
pentru a ne referi la un element al unui tablou putem specifica numele tabloului din care face parte
elementul i poziia sa n tablou, prin numrul su de ordine (numerotarea ncepnd de la 0). Dac
dorim s numerotm de la 1 poziiile din tablou atunci tabloul trebuie declarat cu nr_max_elem+1
elemente.
Referirea la un element al tabloului se face astfel:
nume[indice] ;
Am specificat elementul indice al tabloului nume (indice reprezint numrul de ordine al
elementului n tablou, cuprins ntre 0nr_max_elem-1 sau 1 - nr_max_elem). Parantezele ptrate
[ ] constituie operatorul de indexare. Operatorul de indexare are prioritate maxim.
OBSERBAII
1. La ntlnirea unei declaraii de variabil tablou, compilatorul verific dac dimensiunea
zonei de memorie necesar pentru memorarea tabloului nu depete memoria disponibil.
Dimensiunea zonei de memorie necesar unui tablou se calculeaz nmulind numrul de
elemente cu numrul de octei necesari pentru memorarea unui element, adic
nr_max_elem*sizeof (tip).
Observaie
Din modul de reprezentare a unui ir de caractere deducem c o constant caracter (de
exemplu, 'a') nu este echivalent cu o constant ir de caractere (de exemplu cu "a").
Constanta 'a' este stocat pe un singur octet care conine codul ASCII al caracterului.
Constanta "a" este stocat pe doi octei (primul conine codul ASCII al caracterului, iar al
doilea, marcajul de sfrit de ir - NULL).
Fiiere text
5.1 Fiiere text. Tipuri de acces
Un fiier este o colecie de date de acelai tip, memorate pe suport extern(hard-disk,
discheta, cd, etc).
Avantajele utilizrii fiierelor sunt o consecin a proprietilor memoriilor externe. Fiierele
permit memorarea unui volum mare de date persistente (care nu se "pierd" la ncheierea
execuiei programului sau la nchiderea calculatorului).
Declararea fiierelor
Operaiile de intrare/ieire n limbajul C++ au utilizat pn acum stream-urile cin i cout,
care erau automat asociate tastaturii, respectiv ecranului. Pentru ca un program s poat
citi informaii dintr-un fiier, respectiv s scrie informaii ntr-un fiier, trebuie s asociem
fiierul respectiv unui stream de intrare/ieire.
n fiierul antet <fstream> sunt declarate clasele ifstream, ofstream i fstream. Pentru a
utiliza ntr-un program operaii de intrare/ieire folosind fiiere trebuie s declarm variabile
de tipurile ifstream, ofstream sau fstream. Mai exact:
ifstream - declarare stream de intrare (numai pentru operaii de citire);
ofstream - declarare stream de ieire (numai pentru operaii de scriere);
fstream - declarare stream de intrare/ieire (n care se pot realiza att operaii de
citire, ct i operaii de scriere, n funcie de modul specificat la deschidere).
Una dintre particularitile citirii cu operatorul >> este faptul c ignor caracterele
albe. Prin urmare, dac intenionm s citim toate caracterele din fiier(inclusiv
spaiu,tab,enter), acest mod de citire este inadecvat. Se va folosi pt acest scop funcia get().
|ifstream f1(text.in);
|char c[10];
|f.get(c,10);
Scrierea datelor ntr-un fiier:
Dup deschiderea fiierului ca fiier de ieire, se pot realiza operaii de scriere
utilizbd operatorul de scriere <<.
|ofstream fout(date.out);
|fout<<Salut;
Detectarea sfritului de fiier:
Pentru a testa dac pointerul de fiier a ajuns la sfritul fiierului putem utiliza
funcia membr eof(). Funcia eof() returneaz valoarea 0 dac nu am ajuns la sfritul
fiierului, respectiv o valoare diferit de 0 daca s-a ajuns la sfrit.
ifstream f(file.in);
int v[10], i=0;
while(!f.eof())
f>>v[++i];
nchiderea unui fiier:
Dup realizarea tuturor operaiilor cu un fiier acesta trebuie nchis. nchiderea unui
fiier se realizeaz prin apelarea funciei membre close().
|f1.close();
Algoritmi elementari
6.2 Divizibilitate. Numere prime. Algoritmul lui Euclid
Divizibilitate
void nr_divizori(int n)
{
int d,nr;
nr=0;
for(d=1;d<=n;d++)
if(n%d==0)
nr++;
return nr;
}
Numere prime
bool prim(int n)
{
ind d=3;
if(x==2)
return true;
if(x%2==0 || x==1)
return false;
while(d*d<=x)
if(x%d==0)
return false;
else
d=d+2;
return true;
}
Algoritmul lui Euclid
int euclid(int a, int b)
{
int rest;
while(b)
{
rest=a%b;
//calculez restul
a=b;
//impartitorul devine deimpartit
b=rest;
//restul devine impartitor
}
return a;
//ultimul rest diferit de 0
}
int main()
{
int n,d=2,p;
cin>>n; // numarul de descompus
while(n>1)
{
p=0;
while(n%d==0)
{
p++;
n=n/d;
}
if(p)
cout<<d<<la puterea<<p<<endl;
d++;
}
return 0;
}
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
if(a[j]<a[i])
{
aux=a[i];
a[i]=a[j];
a[j]=aux;
}
O(n*n)
6.5 Interclasare
Fie a un vector cu n elemente si b un vector cu m elemente, sortai n ordine cresctoare.
Pentru a construi un al treilea vector, c, sortat cresctor, se parcurg cei doi vectori,
comparnd la fiecare pas elementul curent din a cu elementul curent din b. Cel mai mic
dintre cele dou elemente va fi copiat n vectorul c, avansnd doar n vectorul din care am
copiat. Cnd am epuizat elementele din unul din cei doi vectori, copiem elementele rmase
n cellalt, deoarece nu mai avem cu ce le compara.
i=j=1;
k=0;
while(i<=n && j<=m)
if(a[i]<b[j])
c[++k] = a[i++];
else
c[++k] = b[j++];
while(i<=n)
c[++k]=a[i++];
while(j<=m)
c[++k]=b[j++];
Parametrii formali sunt denumii astfel deoarece cu ajutorul lor se descriu n mod
formal operaiile la care vor fi supuse datele ce vor fi transmise de programul apelant spre
program.
Lista de parametrii formali poate s fie vid, ns i n acest caz parantezele trebuie
s apar.
Dac tipul rezultatului returnat de funcie nu este specificat, implicit acesta este
considerat int. Dac funcia nu trebuie s ntoarc nicio valoare, se specific tip al
rezultatului void.
Exemplu:
int x=10;
int &rx=x;
cout<<x;
cout<<rx;
Cout<<x si cout<<rx vor avea acelai efect!
Observaii:
1. Valoarea atribuit unei referine NU poate fi schimbat, ea rmne valabil pe toat
durata execuiei blocului de program n care este declarat.
2. Dei referina seamn cu o variabil, ea nu este nsi o variabil, ci doar o referire
la variabila respectiv (o adres).
Referinele nu sunt utile dect n utilizarea acestora drept parametrii ai unei funcii.
void interschimba(int &a, int &b)
{
int aux;
aux=x; x=y; y=aux;
}
n acest caz, n urma executrii funciei valorile variabilelor din parametri actuali ii vor
pstra valoarea cu care au rmas n urma executrii blocului de instruciuni din funcie.
n concluzie, n cazul utilizrii referinelor drept parametri, beneficiem de toate
avantajele pointerilor(posibilitatea de a modifica valorile parametrilor), fr complicaii de
sintax.
Observaii:
1. Numele unui tablou este un pointer ctre primul element al tabloului! Prin urmare,
cnd se utilizeaz vectori ca parametrii, la definirea/declararea funciei se pot utiliza
pentru declararea parametrului una din construciile: tip [], sau tip[Max].
2. La apelarea unei funcii care are un parametru de tip tablou, trebuie transmis doar
numele tabloului (acesta este el nsui o adres)
Exemplu:
Declarare: void functie(int a[], int n);
Apel: functie(a,n);
Variabilele globale
Variabilele locale
iniializat automat;
durata de via: memoria rmne alocat pn la sfritul execuiei blocului n care
este declarat variabila;
domeniu de vizibilitate: sunt vizibile numai n blocul n care sunt declarate.
Regula de omonimie
Deoarece variabilele globale au alt clas de memorare dect variabilele locale, este permis
s declarm o variabil local care s aib acelai nume cu cel al unei variabile gloable. O
astfel de situaie este denumit omonimie.
Regula de omonimie: n interiorul blocului n care sunt declarate, variabilele locale au
prioritate fa da variabilele globale omonime.
Recursivitate
8.1 Prezentare general
n informatic i n matematic, recursivitatea este un concept fundamental.
Spunem c o noiune este definit recursiv dac n cadrul definiiei intervine insi
noiunea care se definete.
Reguli fundamentale pentru ca recursivitatea s fie definit corect sunt:
1. trebuie s existe cazuri elementare, care se pot rezolva direct ;
2. pentru cazurile care nu se rezolv direct, recursivitatea trebuie s progreseze ctre
un caz elementar.
Recursivitatea se realizeaz prin intermediul funciilor.
O funcie se numete recursiv dac se autoapealeaz .