Informatică
1. Algoritmi
1.1. Noţiunea de algoritm, caracteristici
1.2. Date, variabile, expresii, operaţii
1.3. Structuri de bază (liniară, alternativă şi repetitivă)
1.4. Descrierea algoritmilor (programe pseudocod)
2. Elementele de bază ale unui limbaj de programare (Pascal sau C, la alegere)
2.1. Vocabularul limbajului
2.2. Constante. Identificatori
2.3. Noţiunea de tip de dată. Operatori aritmetici, logici, relaţionali
2.4. Definirea tipurilor de date
2.5. Variabile. Declararea variabilelor
2.6. Definirea constantelor
2.7. Structura programelor. Comentarii
2.8. Expresii. Instrucţiunea de atribuire
2.9. Citirea/scrierea datelor
2.10. Structuri de control (instrucţiunea compusă, structuri alternative şi repetitive)
3. Subprograme predefinite
3.1. Subprograme. Mecanisme de transfer prin intermediul parametrilor
3.2. Proceduri şi funcţii predefinite
4. Tipuri structurate de date
4.1. Tipul tablou
4.2. Tipul şir de caractere
– operatori, proceduri şi funcţii predefinite pentru: citire, afişare, concatenare,
căutare, extragere, inserare, eliminare şi conversii (şir ↔ valoare numerică)
4.3. Tipul înregistrare
5. Fişiere text
5.1. Fişiere text. Tipuri de acces
5.2. Proceduri şi funcţii predefinite pentru fişiere text
6. Algoritmi elementari
6.1. Probleme care operează asupra cifrelor unui număr 2
Un algoritm reprezinta pasii care trebuie parcursi pentru a rezolva o anumita probleama. Exemplu
de algoritm:
Pentru ca o maşină de calcul să poată rezolva o anumită problemă, programatorul trebuie mai întâi să
stabilească un algoritm care sa rezolve problema respectiva.
Caracteristicile algoritmilor
1) Finitudine – proprietatea algoritmilor de a furniza datele de ieşire într-un timp finit (adica dupa un
număr finit de paşi).
2) Claritatea - algoritmul trebuie să descrie operaţiile clar şi fără ambiguiăţi.
3) Generalitatea – proprietatea algoritmilor de a rezolva o intreagă clasă de probleme de acelaşi fel.
(algoritmul de rezolvare a ec. de gr. II va rezolva orice ecuatie de gradul II, indiferent de datele de
intrare)
4) Corectitudinea – spunem că un algoritm este corect dacă el furnizează în mod corect datele de ieşire
pentru orice date de intrare.
5) Realizabilitatea: orice algoritm trebuie sa poată fi codificat într-un limbaj de programare.
6) Eficienţa se referă la timpul de execuţie (în care sunt folosite resursele calculatorului: memorie,
procesor) şi la spaţiul de memorie utilizat. Un algoritm este cu atât mai eficient cu cât spaţiul de
memorie utilizat este mai mic şi numărul de operaţii mai puţine.
1.2. Date, variabile, expresii, operatori
Datele
Informaţiile din lumea reală se pot codifica sub forma unor date.
Data este modelul de codificare a informaţiei, accesibil calculatorului pentru
prelucrare.
Datele sunt caracterizate de următoarele atribute: identificator (nume), valoare,
adresă de memorie, tip.
Tipul unei date defineşte mulţimea valorilor posibile, modul de reprezentare internă,
dimensiunea locaţiei de memorie alocate şi operaţiile ce se pot efectua cu aceasta.
Clasificarea datelor - în funcţie de valoare:
o variabile: îşi pot modifica valoarea pe parcursul execuţiei algoritmului
o constante: nu îşi modifică valoarea pe parcursul execuţiei algoritmului.
Clasificarea datelor - în funcţie de modul de compunere:
o elementare
o structurate.
Tipuri elementare de date:
Întregi ; ex. 120, -120
Reale ; ex. 3.12, 12.
Logice(boolean); ex. TRUE(adevarat), FALSE(fals)
Caracter
sir de caractere; ex. 'un text' .
pointer
????Operatii
Clasificare operatii :
Operatii de intrare si iesire ;
Operatii de atribuire ;
Operatii de decizie ;
Operatii de decizie
În general, în functie de anumite conditii, trebuie facute anumite operatii sau altele. Operatia prin care testam
acele conditii se numeste operatia de decizie. În functie de rezultatul testului, algoritmul executa anumite operatii.
????
Structura liniară (secventiala) este o secvenţă de instrucţiuni care se execută de sus in jos, o singură dată. O
astfel de structură poate să conţină instrucţiuni pentru citirea şi scrierea datelor, calcule matematice (expresii) —
instrucţiuni de atribuire.
Ex. structura liniara pseudocod Ex. structura liniara schema logica
Pas 1;
Pas 2;
Pas 3;
...... Pas 1;
Pas n; Pas 2;
Pas 3;
......
Pas n;
citeste a,b,c
s ← a+b+c
med ← s/3
scrie med
Structura alternativa (de decizie) este o operaţie de decizie şi două blocuri procedurale acţiune 1 şi acţiune 2
dintre care se execută numai unul : fie acţiune 1 în cazul în care condiţia este adevărată, fie acţiune 2 în cazul în
care condiţia este falsă.
Cele două ramuri ale structurii alternative se închid apoi în acelaşi punct al structurii care determină continuarea
algoritmuluicu operaţiile din structura următoare structurii alternative.
Executia instrucţiunii:
Pas 1: Se evaluează condiţia
Pas 2: Dacă conditia este falsă, se iese din instrucţiunea cât_timp; Dacă conditia este adevărată, se execută
instructiunile, apoi se revine la Pas 1, la evaluarea conditiei.
Observaţii:
Instrucţiunea se execută, cât timp valoarea condiţiei este adevărat
Dacă condiţia are de la început valoarea fals, instrucţiunea nu se execută nici măcar o dată.
Ex: Calculati produsul p=1*2*3*..*n
Date de intrare: n intreg.
Date de iesire:p intreg
Citeste n;
p1 i1
cat_timp(i<=n)executa
pp*i
ii + 1
sfarsit cat_timp
Scrie p
3) Structura cu numar necunoscut de repetitii si cu test final (executa… cat timp DO-WHILE)
Structura repetitivă cu test final executa … cât_timp
execută
instrucţinuni
cât_timp (condiţie)
Executia instrucţiunii:
Pas 1: Se executa instructiunile
Pas 2: Dacă conditia este falsă, se iese din instrucţiunea cât_timp;Dacă conditia este adevărată, se trece la Pas 1
Observaţii:
Instrucţiunile se execută, cât timp valoarea condiţiei este adevărat
Instrucţiunile se execută cel putin o dată.
4) Structura cu numar necunoscut de repetitii si cu test final (repeta ..pana cand REPEAT UNTIL )
repeta
instrucţinune;
pana cand conditie
Executia instrucţiunii:
Pas1: Se execută secvenţa de instructiuni, apoi se verifică condiţia
Pas2: dacă condiţia este falsă, se execută din nou secvenţa(se trece la pasul 1); Dacă valoarea este adevărată, se
iese din repetare.
Observaţii:
este un ciclu cu test final pentru că mai întâi se execută secvenţa şi apoi se verifică condiţia;
este un ciclu cu număr necunoscut de paşi, numărul minim de execuţii asigurat pentru secvenţă este
1 (când din start condiţia este adevărată);
Descrierea algoritmilor se poate face cu ajutorul schemelor logice, cu pseudocod sau cu un limbaj de
programare.
Programarea structurata a inceput la inceputul anilor 70. Este un concept cu o importanta fundamentala
in scrierea algoritmilor. In general, algoritmii se eleboreaza prin utilizarea exclusiva a anumitor structuri
(liniar, alternativa, repetitiva). Prin structura se intelege o anumita forma de imbinare a operatiilor cu
care lucreaza algoritmii.
Structuri de bază:
o structurile liniară
o alternativă
o repetitivă
2.Elemente de baza ale limbajului de programare C++
2.2. Constante.Identificatori
O constant este o valoare care nu se modifica pe parcursul executiei unui program. Se declare cu
cuvantul cheie „const”.
Constantele pot fi: intregi, constantelogice( booleene), reale, de tip catacter si sir de caractere.
Constantele de tip intregi (int,long sau long long) sunt numere întregi: 45, -123, 0, 8965 etc.
Constantele logice(booleene) – de tip bool sunt true şi false
Constantele de tip float sau double sunt numere reale: 3.14, 1.6867, 0.0001, 7.0
Constantele de tip caracter (char) reprezintă un singur caracter ASCII.
De exemplu, 'a', 'h', 'O', 'F'. Caracterele se pun întotdeauna între două apostrofuri.
Sirurile de caractere, se pun între ghilimele. Exemplu: "acesta este un string.".
Simbolul "P" este un string, nu un caracter de tip char.
Orice limbaj de programare dispune de un set de tipuri predefinite (standard)ex:int, float, char etc .
Tipuri standard de date: 1)Tipul INTREG ex: 100 , -100 (char,int,long, long long,unsigned int..)
2)Tipul REAL ex. 2.1231, -123.32, 102(float,double,long double)
Operatori aritmetici
+ (adunare) a+b
- (scadere) a-b
* (inmultire) a*b
% (modulo restul impartirii 10%3 este 1, 125%10 este 5)
/ (impartire sau div(=câtul))
1) / este „div” - atunci cand ambele numere din operatie sunt intregi ex:
13/2=6 5/2= 2
2) / „este impartire” - atunci cand cel putin unul din numere este un numar real
Ex:7.0/2=3.5
Operatori logici
! not (negat)
&& and (si)
|| or (sau)
Ex: a<=b && a<c (explicatie: a<=b si a<c)
c!=a || c!=b (c diferit de a sau c diferit de b)
!a (explicatie: not a)
!(a<=b) a>b
!(a<b) a>=b
!(a!=b) a==b
Operatori relationali
> (mai mare)
< (mai mic
>= (mai mare si egal)
<= (mai mic si egal)
== (egal
!= (diferit)
Ex: (3>1) este adevarat(valoarea 1)
(3==1) este fals (valoarea 0)
Exemplu:
typedef float real; //se defineste tipul de date „real”
Tipul enumerat defineste o multime ordonata de valori prin enumerarea identificatorilor care
desemneaza valorile. Un tip enumerat poate primi un nume:
enum tip_enumerat
{identificator 1 [=valoare 1],identificator 2 [=valoare 2], ...identificator n [=valoare n]};
identificator 1 desemneaza cea mai mica valoare, avand numarul de ordine 0; ceilalti identificatori au
numerele de ordine.
Exemple:
#include<iostream>
using namespace std;
enum disciplina{mate,info,fizica};
disciplina disc_pref=info;
int a,b,s;
int main()
{ if(disc_pref==info)cout<<"El indrageste informatica";
else cout<<"El indrageste matematica sau fizica";
return 0;}
} //sfarsitul programului
Instrucţiunile reprezintă comenzi către calculator; sarcinile pe care acesta trebuie să le îndeplinească.
Toate instrucţiunile trebuie să se termine cu punct şi virgulă ;
Puteţi avea mai multe instrucţiuni pe aceeaşi linie atâta timp cât le separaţi prin punct şi virgulă.
In program pot exista comentarii . Comentariile nu fac nimic (nu sunt instrucţiuni).
Sunt de 2 feluri:
- comentariile întinse pe un rând (încep cu //);
- comentariile întinse pe mai multe rânduri (încep cu /* şi se termină cu */).
Programul de mai sus afisaza „Salut” pe ecran.
In C++ este diferenta intre literele mari si mici. Ex: Void ≠void , MAIN ≠main
Operatorul condiţional ? este un operator ternar. Prima expresie se evaluează şi dacă ea este diferită
de zero sau adevărată, rezultatuleste valoarea celei de-a doua expresii, altfel rezultatul este
valoareaexpresiei a treia. De exemplu expresia: z = (a>b) ? a : b; calculeaza maximul dintre a si b si
se atribuie maximul lui z.
Atribuirea (asignarea) se noteaza cu semnul „ = ”. Atribuirea este operaţia prin care puteţi schimba
valoarea unei variabile în mod direct.
Forma generala a unei atribuiri: variabila=expresie;
Mecanismul de atribuire funcţionează astfel: se calculeaza valoarea expresiei din partea dreapta si apoi
rezultatul expresiei se da partii din stanga, care trebuie să fie o variabilă.
x=2; // x primeste valoarea 2
a=a+1; //a creste cu 1
s=s+x; //s creste cu x
p=p*x; //p creste de x ori
x=y; // lui x i se atribuie valoarea lui y
Afisarea se face cu comanda cout – realizeaza afisarea pe ecran a unui mesaj si/sau a unei variabile
1)cout<<"Salut"; //afiseaza cuvantul salut pe ecran
2)cout<<s; //afiseaza cotinutul variabilei s pe ecran
3)cout<<"suma este: "<<s<<endl;
//daca variabila s are valoarea 201 se afiseaza pe ecran „ suma este: 201” si apoi cursorul
trece la rand nou
4)cout<<"suma este: "<<s<<endl <<"produsul este: "<<p;
//afiseaza suma este: 201
produsul este: 330 (pe randuri diferite din cauza lui „endl”)
if(conditie) operatie1;
else operatie2;
varianta a)
if(conditie) operatie1;
varianta b)
Interpretare
Varianta a)
Daca conditia este adevarata se executa „operatie1”, iar daca este falsa se executa „operatie2”.
Nu se pot executa ambele operatii ( „operatie1” si „operatie2” ).
La executia if-ului se face „operatie1” sau „operatie2”, nu se poate sa nu se execute nici una.
Varianta b)
La if-ul simplificat se realizeaza executia „operatie1” daca condita este adevarata, si daca conditia este
falsa nu se face nimic.
Daca if-ul are mai multe operatii ( 2,3,..) acestea se grupeaza intre acolade {….}-instructiunea compusa.
Ex: Min a doua numere
#include <iostream>
using namespace std;
int a,b;
int main()
{
cout <<"Dati valori pentru a si b";
cin>>a>>b;
if (a<b)
cout << "minimul este:"<<a<<endl;
else
cout << "minimul este:"<<b<<endl;
return 0;
}
structura alternativa switch
switch(expresie) {
case expresie1: instructiune1; break;
case expresie2: instructiune2; break;
...
case expresien: instructiunen; break;
default: instructiune
}
Observatie:
Expresie 1, 2, ...n, sunt expresii constante.
Interpretare:
Se evalueaza expresie; daca valoarea ei coincide cu una din valorile expresiilor specificate se executa
secventa corespunzatoare si toate secventele care urmeaza pana la intalnirea instructiunii break sau
pana la intalnirea '}'; altfel se executa default: instructiune;
Ex:
#include<iostream>
using namespace std;
char lit;
int main()
{
cin>>lit;
switch(lit) {
case 'a': cout<<"litera tastata este a "; break;
case 'A': cout<<"itera tastata este A"; break;
default: cout<<"litera tastata nu este A sau a";
}
return 0;
}
executie:
i - ia valorile vali,vali+1,vali+2, ….valf-1,valf si pentru fiecare valoare a lui i se executa „operatie1”.
s=0;
for(i=1;i<=100;i++) s+=i; //sau s=s+i;
cout<<”suma este: ”<<s;
sau
while(cond){
instructiuni1;
}
Execututie: Daca conditia (cond) este adevarata se realizeaza executia repetata.
Cand conditia (cond) este falsa se iese din repetare.
Ex:
Suma a n numere dintr-un sir
#include <iostream>
using namespace std;
int i,n,x,s;
int main()
{
cout << "Dati un nr n:";
cin>>n; i=1;
while(i<=n){
cin>>x;
s+=x;
i++;
}
cout<<"Suma nr din sir este:"<<s;
return 0;
}
do{
instructiune1;
}while(cond);
Ex:
3. Subprograme predefinite
Tabloul este o structură de date statică (dimensiunea este fixă) care memoreză o succesiune de elemente
de acelaşi tip. Elementele tabloului sunt identificate prin indici.Cele mai utilizate tipuri de tablouri sunt
vectorii (tablouri unidimensionale) si matricile (tablouri bidimensionale).
//se initializeaza numele cu ”Pop” , prenumele cu ”Ana”, varsta cu 10, si campul ”sex”
cu ’f’
atribuire/copiere
accesare caractere
s[i] - este caracterul de pe pozitia i ,i=0,...254, s1[254] este ’\0’
s[0] - este primul caracter din sir
operatori
- lungime sir
strlen(s2) - returneaza numarul de caractere din sir
- copiere
strcpy(destinatie,sursa) ex: strcpy(s1,s2); (copiere totala)
strncpy(destinatie,sursa,n) (copiere max n caract. ) ex: strncpy(s1,s2,2)
- comparare
strcmp(s1,s2);
stricmp(s1,s2); (nu se face diferenta intre litere mici si mari)
- funcţiile de mai sus returneaza o valoare:
< 0 (dacă s1<s2 – ordine lexicografica)
= 0 (daca sunt siruri identice)
>0 (dacă s1>s2 – ordine lexicografica)
- Concatenare
strcat(s1,s2); - adauga la sirul s1 sirul s2 (maxim n caractere) la sirul s1
Subsir
strstr(s1,s2) - verifica daca subsirul s2 este subsir al lui s1 si returneaza adresa de început a
subşirului s2 în s1 dacă există şi NULL (0) în caz contrar.
(se stie)
Cmmdc –ul a doua numere se poate calcula cu Algoritmul lui Euclid (exista doua varianta prin scaderi
repetate sau prin impartiri repetate)
Algoritmul lui Euclid prin scaderi repetate – se scade din x pe y (daca x>y),sau se scade din y pe x
(daca y>x) in mod repetat până x devine egal cu y
Algoritmul lui Euclid prin impartiri repetate– împarte x la y, apoi împarte y la x%y si tot asa p ână
restul obtinut devine 0. Împartitul este cmmdc.
3 6 12 45 -1 20
-1 3 6 12 45 20
-1 3 6 12 20 45
cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
for(i=1;i<=n;i++){
mini=a[i];k=i;
for(j=i+1;j<=n;j++)
if(a[j]<mini)
{mini=a[j];k=j;}
swap(a[i],a[k]);
}
for(i=1;i<=n;i++) cout<<a[i]<<" ";
Ex: numeric (se afla minimul din sirul pe fond roz )
12 3 45 6 -1 20
-1 3 45 6 12 20
-1 3 45 6 12 20
-1 3 6 45 12 20
-1 3 6 12 45 20
-1 3 6 12 20 45
cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(a[i]>a[j])k[i]++;
else k[j]++;
for(i=1;i<=n;i++)b[k[i]+1]=a[i];
for(i=1;i<=n;i++)cout<<b[i]<<" ";
6.6. Interclasarea
Se considera doi vectori ordonati(sa presupunem crescator)
Se considera doua siruri de elemente ambele ordonate( fie crescator). Interclasarea înseamnă relizarea
unui sir rezultant ordonat crescator cu elementele celor doua siruri.
Se percurg simultan cei doi vectori si se compara un element dintr-un vector cu un element din celălalt
vector. Elementul cu valoarea mai mic
este copiat în vectorul destinatie si se avanseaza la urmatorul element dupa cel copiat. Se continua
procesul pana cand se termina unul dintre cele doua siruri restul sirului ramas este copiat direct in sirul
rezultant.
#include <iostream>
using namespace std;
int i, j, n,k,a[100], b[100], c[100],m;
int main()
{
cin>>n>>m;
for(i=1; i<=n; i++)
cin>>a[i];
for(j=1; j<=m; j++)
cin>>b[j];
i=j=k=1;
while(i<=n and 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++];
for(i=1; i<=k-1; i++) cout<<c[i]<<' ';
return 0;
}
cin>>n>>x;
for(i=1;i<=n;i++) cin>>a[i];
gasit=false;
for(i=1;i<=n;i++)
if(a[i]==x) gasit=true;
if(gasit==true)cout<<"elementul exista";
else cout<<"elementul nu exista";
return 0;
}
6.8. Analiza complexitatii unui algoritm
Ex:
Complexitate timp - O(1) –in general se fac cateva calcule
ordonarea Bubble Sort, ordonarea prin selectie si ordonarea prin insertie si prin numarare are
tot complexitate O(n2)
7. Subprograme definite de utilizator
Subprogramele sunt părţi ale unui program, identificabile prin nume, care se pot apela la
cerere prin intermediul acestor nume.
Ex2: de trasmitere prin adresa; Parametrul actual ss este transmis prin adresa parametrului formal s;
parametri actuali x si y trasmit valoarea parametrilor formali a si b
#include <iostream>
using namespace std;
int x,y,ss; //variabile globale
void suma(int a, int b, int &s){ //suma a doua numere parametrul s – trasmitere prin adresa
s=a+b;
}
int main()
{
cin>>x>>y;
suma(x,y,ss); //apel functie void; parametri efectivi x,y,ss; parametrul ss este trasmis prin adresa
g<<"suma este:"<<ss<<'\n';
return 0;
}
7.2. proiectarea modulara a rezolvarii unei probleme
Prin proiectare(programare) modulară înţelegem metoda de proiectare(programare) a unui algoritm
pentru rezolvarea unei probleme prin folosirea modulelor.
Modulul este considerat o unitate structurală de sine stătătoare, fie program, fie subprogram, fie o
unitate de program.
Programarea modulară se bazează pe descompunerea problemei în subprobleme şi proiectarea şi
programarea separată a subalgoritmilor corespunzători.
Avantajele programării modulare:
• Descompunerea unei probleme complexe în subprobleme este un mijloc convenabil şi eficient de a
reduce complexitatea.
• Testarea unui modul se poate face mult mai uşor decât testarea întregului algoritm.
• Permite munca mai multor programatori. S-a ajuns astfel la munca în echipă, prin care se ajunge la
scurtarea termenului de realizare a produsului program.
• Modulele se pot refolosi ori de câte ori avem nevoie de ele. Astfel, s-a ajuns la compilarea separată a
subprogramelor şi la păstrarea subprogramelor obţinute în biblioteci de subprograme, de unde ele se
pot refolosi la nevoie.
• Reutilizabilitatea acestor subprograme duce la mărirea productivităţii în programare, dar şi la
creşterea siguranţei în realizarea unui produs corect.