Documente Academic
Documente Profesional
Documente Cultură
Clasa a XII-a A
2023
Argument
2
CUPRINS
● Argument ………………………………………………………………………………………2
● Cuprins……………………………………………………………………………………………3
● Noțiuni introductive………………………………………………………………………4
● Instrucțiuni ce prelucrează șirurile
de numere naturale…………………………………………………………………………10
● Ideea pe care se bazează rezolvarea…………………………………………13
● Probleme bac……………………………………………………………………………………16
● Concluzie…………………………………………………………………………………………28
● Sitografie………………………………………………………………………………………29
3
Capitolul I
Noțiuni Introductive
4
Structura generală a unui program C++
• un program C++ este constituit dintr-o succesiune de module,
denumite funcţii
• una dintre aceste funcţii este funcţia principală, denumită main()
• main() este o funcţie specială, care trebuie să apară obligatoriu o
singură dată în orice program C++
• execuţia oricărui program începe cu funcţia main()
• o funcţii este constituită din antet şi corp
• antetul funcţiei conţine numele funcţiei, tipul rezultatului pe care
îl calculează funcţia şi o listă de parametri prin care funcţia
comunică cu exteriorul ei, încadrată între paranteze rotunde
• corpul funcţiei conține declarații și instrucțiuni care specifică
prelucrările realizate de funcția respectivă
5
Tipuri simple de date (standard)
Prin date se înţelege, în general, tot ceea ce este prelucrat de un
calculator. Fiecare dată are un anumit tip.
6
Operatori
Operatorii sunt caractere speciale care indică operaţia care se
efectuează în cadrul unui program.
Clasificarea operatorilor:
• operatori aritmetici;
• operatori relaţionali;
• operatori de egalitate;
• operatori de incrementare şi decrementare;
• operatori logici;
• operatori de atribuire;
• operatorul „ , ‟ (virgulă);
• operatorul de conversie explicită.
a. Operatori aritmetici
• - minus (unar) – pentru semn
• + plus (unar) – pentru semn
• + (binar) – adunare
• - (binar) – scădere
• * (binar) – înmulţire
• / (binar) – împărţire întreagă
• % (binar) – restul împărţirii întregi
c. Operatori de egalitate
• == egal
• != diferit
7
d. Operatori de incrementare şi decrementare
• ++ incrementare (adună 1)
• -- decrementare (scade 1)
e. Operatori logici
• && ŞI logic
• || SAU logic
• ! negaţie
f. Operatori de atribuire
• = egal
• *=
• /=
• %=
• +=
• -=
g. Operatorul ‘ , ’ (virgulă)
Separă mai multe expresii.
8
Examenul de bacalaureat este dificil iar subiectul 3 este cel mai
greu. Problema 3 se bazează pe aplicații de șiruri numere naturale.
De aceea vreau sa încep prin a prezenta cum sunt structurate
aceste probleme.
9
Capitolul II
Instrucțiuni ce prelucrează șirurile
de numere naturale
Lista instructiilor ce prelucrează șirurile de numere naturale.
Biblioteca C++ folosită este <fstream> și <iostream>
10
Instrucţiunea if
Instrucţiunea decizională (condiţională) if realizează selectarea în
vederea execuţiei a unei singure instrucţiuni din mai multe posibile.
Există două forme ale instrucţiunii decizionale if.
Forma 1 :
if(expresie logică)
instrucţiune1;
else
instrucţiune2;
Forma 2:
if(expresie logică)
instrucţiune;
Instrucţiunea switch
Instrucţiunea decizională switch realizează selectarea în vederea
execuţiei a unei singure instrucţiuni din mai multe posibile.
Instrucţiunea switch este o generalizare a instrucţiunii decizionale if,
putând fi înlocuită cu instrucţiuni decizionale if imbricate.
Sintaxa:
switch(expresie logică)
{ case c1: instrucţiune1;
break;
case c2: instrucţiune2;
break;
.................
case cn: instrucţiunen;
break;
[default: instrucţiunen+1;] }
11
Instrucţiunea while
Instrucţiunea repetitivă while specifică faptul că anumite instrucţiuni se
execută de mai multe ori.
Instrucţiunea do while
Instrucţiunea repetitivă do while specifică faptul că anumite instrucţiuni
se execută de mai multe ori.
Instrucţiunea do while este o instrucţiune repetitivă:
• cu test final;
• cu număr necunoscut de paşi.
Sintaxa:
do
instrucţiune;
while(expresie logică);
Instrucţiunea for
Instrucţiunea repetitivă for specifică faptul că anumite instrucţiuni se
execută de mai multe ori.
Instrucţiunea for este o instrucţiune repetitivă:
• cu număr cunoscut de paşi.
Sintaxa:
for(expresie1;expresie2;expresie3)
instrucţiune;
12
Capitolul III
Ideea pe care se bazează rezolvarea
Să se scrie un program care citeşte cel mult 1.000.000 de numere naturale din
intervalul închis [0,9] şi determină cel mai mare număr prim citit şi numărul său
de apariții.
Fișierul de intrare ciffrecv.in conţine cel mult 1.000.000 numere naturale din
intervalul închis [0,9], dispuse pe mai multe linii şi separate prin spaţii.
Pentru început trebuie sa știm ca numerele naturale prime din intervalul [0,9]
sunt {2,3,5,7}
În parcurgerea cifrelor dacă găsim un nr mai mare și prim decat decat primul
element citit contorul ajunge la valoarea 0 iar maximul primește o nouă valoare.
Contorul crește doar dacă valoare citită este egala cu valoarea max.
13
#include <fstream>
ifstream cin("ciffrecv.in");
ofstream cout("ciffrecv.out");
int main()
{
int max = 0, nr = 0;
int x;
while(cin >> x){
if(x == 2 && x > max)
max = x, nr = 0;
if(x == 3 && x > max)
max = x, nr = 0;
if(x == 5 && x > max)
max = x, nr = 0;
if(x == 7 && x > max)
max = x, nr = 0;
if(x == max)
nr++;
}
14
Problema pbinfo#267
Se dau n numere numere naturale cu cel mult două cifre fiecare. Să se
determine acele numere care apar o singură dată.
Fişierul de intrare unice.in conţine pe prima linie numărul n; urmează n numere
naturale cu cel mult două cifre fiecare, dispuse pe mai multe linii şi separate prin
spaţii.
Fişierul de ieşire unice.out va conţine pe prima linie, în ordine crescătoare,
valorile care apar o singură dată, separate printr-un spaţiu.
În acest tip de problema o sa fie nevoie de un vector deoarece nu se specifica ca
elementele sunt crescătoare și este imposibil altfel. Începem programul prin a
citi de pe prima linie numărul de elemente pentru a citi ulterior numerele. După
sortarea vectorului verificăm dacă numărul este diferit de vecinii sai și dacă
este afisam numarul.
Exemplu: pentru citirea 7
3 5 2 1 5 23 1 se va afișa 2 3 23.
ATENȚIE: la examenul de bacalaureat funcția sort() nu este punctată.
#include <fstream>
#include <algorithm>
ifstream fin("unice.in");
ofstream fout("unice.out");
int main()
{ int n;
fin >> n;
int a[100000];
for(int i = 0 ; i < n ; ++i)
fin >> a[i];
sort(a , a+n);
for(int i = 0 ; i < n ; ++i)
{ if(a[i]!=a[i-1] && a[i]!=a[i+1])
fout << a[i] << ' ';
} return 0;}
Acum ca am prezentat 2 probleme ușoare urmează sa trecem la adevăratele
probleme ce țin de subiectul 3 de la proba de bacalaureat.
15
Capitolul lV
Probleme bac
Problemele pe care urmează sa le rezolvăm
au un grad de dificultate ridicat.
Problema pbinfo#2834.
Se dă un șir de cel mult un milion de numere naturale din intervalul [0,10^9],
separate prin câte un spațiu. Șirul are cel puțin doi termeni pari și cel puțin doi
termeni impari.
Se cere să se afișeze mesajul DA dacă șirul aflat în fișier are un subșir ordonat
crescător, format din toți termenii pari ai săi, și un subșir ordonat descrescător,
format din toți termenii impari ai săi. Dacă nu există două astfel de subșiruri,
programul afișează pe ecran mesajul NU.
Începem problema prin a citi elementele șirului, la fiecare citire verifică dacă
numărul este par sau impar.
În cazul în care numărul este par verifică dacă este mai mare decat minimul
găsit ulterior (variabila p este initializata cu -1) și dacă este ok devine 0.
În cazul în care numărul este impar și mai mare decat maximul găsit anterior
(variabila i este initializata cu valoarea 10^9+1) și dacă este ok devine 0.
16
#include <fstream>
ifstream fin("sir13.in");
ofstream fout("sir13.out");
int main(){
while(fin >> x)
if(x % 2 == 0)
{ if(x < p) ok = 0;
p = x;}
i = x; }
return 0;}
la citirea 5 2 7 2 4 3 8 se va afișa NU
17
Problema pbinfo#242
Exemplu: la citirea
1 2 3 4 7 20 60
3 5 7 8 9 10 12 20 24 se va afișa 5 10 60
Începem programul prin a citi primii 2 vectori, elementele găsite vor fi puse și în
vectorul v pe care îl sortăm crescător, parcurgem vectorul vectorul v și
verificam dacă elementele sunt multipli de x și dacă vecinii lor nu sunt egali
atunci afisam elementele.
18
#include <fstream>
#include <algorithm>
ifstream fin("interclasm.in");
ofstream fout("interclasm.out");
int main()
fin>>x>>n;
v[p]=a[i];
p++; }
fin >> m;
v[p]=b[i];
p++;}
sort(v , v+p);
19
Problema pbinfo#250
Începem problema prin a citii cei 2 vectorii pentru ai interclasa crescător, dacă
elementele din primii 2 vectori sunt egale programul îi ignora. Afișarea se
realizeaza cate 10 numere pe linie. Algoritmul este eficient deoarece evităm
folosirea sortării ce va aduce o complexitate patratica astfel pastram o
complexitate lineara.
1 3 4 7 20 24 60
3 5 7 8 9 10 12 20 24
se va afișa:1 3 4 5 7 8 9 10 12 20
24 60
20
#include <fstream>
ifstream cin("interclasare1.in");
ofstream cout("interclasare1.out");
int main()
{ int n, m, k = 0;
cin >> n;
cin >> m;
int i = 1, j = 1;
else i++;
if(i % 10 == 0)
return 0;}
21
Bacalaureat Informatica 2021.
Fișierul bac.txt conține pe prima linie un număr natural x (x ∈ [100, 999]), iar
pe a doua linie un șir de cel mult 105 numere naturale din intervalul [0, 109].
Numerele din șir sunt separate prin cate un spatiu.
210
#include <fstream>
#include <iostream>
ifstream fin("bac.txt");
int main()
nr_1 = nr_2; }
if(ultim != -1) cout << precedent << " " << ultim;
22
Bacalaureat Informatica 2020 C++ iulie
3. Un șir finit se numește palindromic dacă parcurgându-l termen cu termen, de
la stânga la dreapta sau de la dreapta la stânga se obține același șir de valori.
Exemplu: șirul 12, 13, 16, 13, 12 este palindromic.
Fișierul bac.in conține un șir de cel mult 106 numere naturale din intervalul
[1,103], separate prin câte un spațiu. Se cere să se afișeze pe ecran mesajul DA,
dacă numerele din șir pot fi rearanjate, astfel încât să formeze un șir
palindromic, sau mesajul NU în caz contrar. Proiectați un algoritm eficient din
punctul de vedere al timpului de executare.
Exemplu: dacă fișierul conține numerele 100 30 100 30 500 30 30 se afișează
pe ecran DA
a. Pentru a rezolva aceasta problema vom apela la un vector de frecventa. Pe
masura ce citim numere din fisier, incrementam poziția corespunzătoare din
vector. După ce am citit toate numerele, parcurgem vectorul și verificam daca în
acesta se afla mai mult de o valoare impara. În cazul în care se afla, afisam
mesajul „NU” deoarece nu putem aseza numerele sa indeplineasca condiția de a
fi palindromic, în caz contrar afisam mesajul „DA”.
#include <fstream>
#include <iostream>
ifstream fin("bac.in");
int AP[1000],x,nrMax,contorImp;
int main()
{ while(fin >> x)
{ AP[x]++;
{ if(AP[i] % 2 == 1) contorImp++; }
23
Bacalaureat Informatica 2019 C++ sesiunea iulie
3. Un termen al unui șir de numere se numește vârf local al acestuia dacă nu
există niciun alt termen mai mare sau egal cu el care să îl preceadă în șir sau
dacă este egal cu termenul vecin anterior, iar acesta este vârf local. Fișierul
bac.txt conține un șir format din cel puțin două și cel mult 106 numere naturale
din intervalul [0,103], separate prin câte un spațiu. Se cere să se afișeze pe
ecran, separate prin câte un spațiu, toate vârfurile locale ale șirului aflat în
fișier. Proiectați un algoritm eficient din punctul de vedere al timpului de
executare și al spațiului de memorie utilizat.
Exemplu: dacă fișierul conține numerele 7 4 9 10 10 10 8 10 10 8 30
se afișează pe ecran 7 9 10 10 10 30.
Pe masura ce citim numerele, verificam daca numărul curent este mai mare decat
varful local. Dacă este mai mare, updatam acest varf. Dacă în schimb este egal
cu varful local, iar varful local este vecinul numărul curent, updatam varful local.
Algoritmul este eficient din punct de vedere al memoriei deoarece nu stocăm
întregul șir în memorie. Folosim fiecare variabila declarata. De asemenea,
algoritmul mai este eficient și din punct de vedere al timpului de execuție, fiind
liniar în timp, avand complexitatea O(n) unde n este numărul maxim de elemente
din fișier.
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("bac.txt");
int main()
{ unsigned int nr,nrAnterior = 0, varfLocal = 0, pozitieVarfLocal = 0,pozitie = 1;
while(fin >> nr)
{ if(nr > varfLocal)
{ varfLocal = nr;
pozitieVarfLocal = pozitie;
cout << nr << " "; }
else if(nr == nrAnterior && varfLocal == nr && pozitieVarfLocal ==pozitie-1)
{ varfLocal = nr;
pozitieVarfLocal = pozitie;
cout << nr << " "; }
pozitie = pozitie + 1;
nrAnterior = nr; } return 0;}
24
Bacalaureat Informatica 2018 C++ sesiunea iulie
4. Numim secvență neuniformă a unui șir de numere naturale un subșir al
acestuia, format din termeni aflați pe poziții consecutive în șirul dat, cu
proprietatea că oricare trei termeni aflați pe poziții consecutive sunt diferiți.
Lungimea secvenței este egală cu numărul de termeni ai acesteia.
Fișierul bac.txt conține un șir de cel mult 106 numere naturale din intervalul
[0,9]. Numerele sunt separate prin câte un spațiu, iar în șir există cel puțin trei
termeni diferiți pe poziții consecutive.
Se cere să se afișeze pe ecran lungimea maximă a unei secvențe neuniforme a
șirului aflat în fișier. Proiectați un algoritm eficient din punctul de vedere al
timpului de executare și al memoriei utilizate.
Exemplu: dacă fişierul bac.txt conţine numerele 7 7 1 3 7 7 5 3 3 3 7 8 9
atunci pe ecran se afișează valoarea 4.
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("bac.txt");
int main()
{ int n, precedent = -1, precedent2 = -1,contor = 1, contor_max = 0;
while(fin >> n)
{
if(precedent != n && precedent2 != n){
contor++;
if(contor > contor_max)
contor_max = contor;
}
else
contor = 1;
//cout << n << " ";
precedent2 = precedent;
precedent = n;
}
cout << contor_max;
return 0;
}
25
Bacalaureat Informatica 2019 C++ simulare
3. Un șir format din 2·n numere naturale se numește paritar dacă fiecare dintre
primii săi n termeni fie are aceeași paritate cu oricare dintre ultimii săi n
termeni, fie este strict mai mic decât oricare număr de paritate diferită aflat
printre aceștia. Fișierul bac.txt conține numere naturale din intervalul [0,106]:
pe prima linie un număr nenul, n, iar pe a doua linie un șir de 2·n numere, separate
prin câte un spațiu. Se cere să se afișeze pe ecran mesajul DA, în cazul în care
șirul aflat în fișier este paritar, sau mesajul NU, în caz contrar. Proiectați un
algoritm eficient din punctul de vedere al timpului de executare și al memoriei
utilizate.
Exemplu: dacă fișierul are unul dintre conținuturile de mai jos, se afișează pe
ecran mesajul DA.
5 5
20 3 11 4 15 25 49 18 53 16 20 3 11 4 15 25 49 81 53 61
Putem observa că avem nevoie doar de 4 numere din ambele șiruri: cel mai mare
număr impar din primul șir, cel mai mare număr par din primul șir, cel mai mic
număr par din al doilea șir și cel mai mic număr impar din al doilea șir. Astfel,
dacă par_sir_1 < impar_sir_2 și impar_sir_1 < par_sir_2, atunci se va afișa DA.
#include <fstream>
#include <iostream>
using namespace std;
ifstream f("bac.txt");
int main()
{ int n, par_sir_1 = -1, impar_sir_1 = -1, par_sir_2 = 999999, impar_sir_2 =
999999, x;
f >> n;
for(int i = 1; i <= n; i++)
{ f >> x;
if(x % 2 == 0) par_sir_1 = max(par_sir_1,x);
if(x % 2 == 1) impar_sir_1 = max(impar_sir_1,x); }
for(int i = 1; i <= n; i++)
{ f >> x;
if(x % 2 == 0) par_sir_2 = min(par_sir_2,x);
if(x % 2 == 1) impar_sir_2 = min(impar_sir_2,x); }
if(par_sir_1 < impar_sir_2 && impar_sir_1 < par_sir_2) cout << "DA";
else cout << "NU"; return 0;}
26
Bac informatica 2017 C++ sesiunea iulie
4. Numim secvență pară într-un șir o succesiune de termeni ai șirului cu
proprietatea că sunt numere pare și că se află pe poziții consecutive în șir; orice
secvență are cel puțin doi termeni și este maximală în raport cu proprietatea
precizată (dacă i se adaugă un alt termen, secvența își pierde această
proprietate). Lungimea secvenței este egală cu numărul termenilor săi. Fişierul
bac.txt conţine un şir de cel mult 106 numere naturale din intervalul [0,109].
Numerele din şir sunt separate prin câte un spaţiu. Se cere să se afişeze pe
ecran numărul de secvențe pare de lungime maximă din șir. Proiectați un algoritm
eficient din punctul de vedere al spațiului de memorie utilizat şi al timpului de
executare.
Exemplu: dacă fişierul bac.txt conţine valorile 1 2 3 4 6 10 2 8 5 7 9 4 6 10 121
20 4 11 10 2 5 2 6 8 10 16 se afişează pe ecran numărul 2.
Algoritmul este următorul: de fiecare cand citim un număr, îl analizăm. Dacă
numărul curent și numărul precedent sunt amandoua pare, crestem lungimea
șirului curent. În caz contrar, resetam lungimea șirului, deoarece nu s-a mai
îndeplinit condiția.
Mai apoi, analizam daca lungimea sirului este maxima, iar dacă este maximă,
incrementam numărul de apariții. Algoritmul are complexitatea liniara O(n).
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("bac.txt");
int main()
{int lungimeSir=0, lungimeSirMaxim=0, aparitii=0, numar, numarprecedent=-1;
while(fin >> numar)
{ if(numar % 2 == 0 && numarprecedent % 2 == 0)
lungimeSir++;
else lungimeSir = 0;
numarprecedent = numar;
if(lungimeSir > lungimeSirMaxim)
{ lungimeSirMaxim = lungimeSir;
aparitii = 0; }
if(lungimeSir == lungimeSirMaxim)
aparitii++; }
cout << aparitii; return 0;}
27
Concluzie
28
Sitografie
● https://tutoriale-pe.net
● https://www.pbinfo.ro
● https://www.competentedigitale.ro/c/Elementele-de
-baza-ale-limbajul-de-programare-C++.pdf
29