Sunteți pe pagina 1din 29

Liceul Teoretic

Lucrare pentru atestarea


competențelor profesionale la
informatică

Tema: Aplicații de șiruri numere


naturale

Profesor coordonator: Elev:

Clasa a XII-a A

2023
Argument

Informatică ocupă în viaţa de zi cu zi un rol foarte important fiind


prezent în toate domeniile de activitate. Vor deveni din ce în ce mai
importante în viaţa fiecăruia dintre noi, deoarece, tehnologia avansează şi
munca omului va fi preluată în întregime de maşinării.

Am ales aceasta tema deoarece este problema 3 de la subiectul 3 de la


examenul de bacalaureat de la informatica.
Problema este formată din 2 subpuncte, primul subpunct care cere
rezolvarea efectiva a programului iar al doilea subpunct cere descrierea în
limbaj natural al programului, justificând eficiența acestuia și de aceea voi
oferii soluții la ambele subpuncte.

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

Un limbaj de programare este un set bine definit de expresii și


reguli(sau tehnici) valide de formulare a instrucțiunilor pentru un
computer. Un limbaj de programare are definite un set de reguli
sintactice și semantice. El da posibilitatea programatorului sa
specifice în mod exact și amănunțit acțiunile pe care trebuie sa le
execute calculatorul, in ce ordine și cu ce date. Specificarea consta
practice în întocmirea/scrierea programelor necesare(programare).
Limbajul de programare reprezinta un mijloc de comunicare între
utilizatorul uman, care este programator, și sistemul de calcul. C++
(pronunțat "și plas plas") este un limbaj de programare general. Este
un limbaj multi-paradigma cu verificarea statică a tipului variabilelor
ce suporta programare procedurala, abstractizare a datelor,
programare orientata pe obiect. În anii ’90, C++ a devenit unul din
cele mai populare limbaje de programare comerciale. Bjarne
Stroustrup de la Bell Labs a dezvoltat C++ (inițial numit „C cu Clase”)
în anii 1980 ca o serie de îmbunătățiri ale limbajului C. Acestea au
început cu adaugarea de clase apoi de funcţii virtuale,
supraincarcarea operatorilor, moștenire multiplă, template-uri și
excepții. O data cu evolutia limbajului C++, a evoluat și o biblioteca
standard. Prima adaugire a fost biblioteca de intrari-iesiri (I/O
stream), care oferă facilități pentru a înlocui funcțiile tradiționale C
cum ar fi printf si scanf. Mai târziu, printre cele mai semnificative
adaugari la biblioteca standard a fost STL (Standard Template
Library) (Biblioteca de formate standard). Exemplu: #include void
main() {cout<<"Hello World";} După ani de lucru, un comitet
ANSI-ISO a standardizat C++ în 1998.

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ă

Elementele de limbaj Limbajul C++ este caracterizat de:


• sintaxă – este formată din totalitatea regulilor de scriere corectă
a programelor;
• semantică – reprezintă semnificaţia construcţiilor corecte din
punct de vedere sintactic;
• vocabular – este format din totalitatea cuvintelor care pot fi
folosite într-un program.

Vocabularul limbajului C++ este format din:


• setul de caractere;
• identificatori;
• cuvinte cheie;
• comentarii;
• separatori.

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.

Un tip de date defineşte:


• mulţimea valorilor pe care le pot lua datele de tipul respectiv;
• modul de reprezentare a acestora în memorie;
• operaţiile care se pot efectua cu datele respective.

Clasificarea tipurilor de date:


• tipuri de date predefinite - asociate cu un cuvânt cheie, utilizat în
declaraţie;
• tipuri de date definite de utilizator.

Tipuri standard în C++:


• int şi long – pentru memorarea numerelor întregi;
•float şi double pentru memorarea numerelor reale; • char – pentru
memorarea caracterelor;
• void – pentru tip neprecizat.

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

b. Operatori de comparaţie (relaţionali )


• < mai mic
• > mai mare
• <= mai mic sau egal
• >= mai mare sau egal

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.

h. Operatorul de conversie explicită


Pentru ca un operand să intre în calcul convertit aşa cum ne dorim
(nu implicit) înaintea operandului se trece tipul său.

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.

1. Fiecare problema de tipul acesta folosește fișiere text, pe prima


linie se citește un număr(de obicei n) care reprezinta numarul de
elemente prezente pe a doua linie.
2. Fiecare problema dorește rezolvarea ei fără a se forma un
vector ceea ce înseamnă ca numerele trebuie prelucrate fix
după citirea lor.
3. Este de evitat folosirea mai multor structuri repetitive deoarece
folosirea lor duce la o eficiență scăzută ceea ce va fi depunctat la
bacalaureat.
4. Trebuie evitată folosirea vectorilor deoarece folosirea lor duce
la o utilizarea mai mare a memoriei RAM ceea ce va fi depunctat la
bacalaureat.

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>

Instrucţiunile limbajului C++ sunt:


• instrucţiunea expresie;
• instrucţiunea compusă;
• instrucţiunea if;
• instrucţiunea switch;
• instrucţiunea break;
• instrucţiunea while;
• instrucţiunea do while;
• instrucţiunea for.

Instrucţiunile limbajului C++ se împart în două categorii:


• instrucţiuni simple;
• instrucţiuni de control (structurate).

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 while este o instrucţiune repetitivă:


• cu test iniţial;
• cu număr necunoscut de paşi
Sintaxa:
while(expresie logică)
instrucţiune;

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

Fiecare problema este unică dar, majoritatea lor


au un sistem de gandire asemanator
deoarece programul trebuie sa fie eficient.

Problema pbinfo #187.

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.

Fişierul de ieşire ciffrecv.out va conţine pe prima linie două numere naturale


MAX şi NR_AP, cu semnificaţia din enunţ.

Exemplu: pentru citirea numerelor 5 8 9 1 9 5 1 1 2 2 se va afișa 5 2.

Pentru început trebuie sa știm ca numerele naturale prime din intervalul [0,9]
sunt {2,3,5,7}

La rezolvarea acestei probleme o sa avem nevoie de o variabila care sa țină minte


valoarea găsită în șir, de o variabila care contorizează de cate ori a apărut in sir
valoare memorata, și de o variablia care sa memoreze valoarea maximă citită.

Î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>

using namespace std;

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++;
}

cout << max << ' ' << nr;


return 0; }

Trebuie analizata problema înainte de a o rezolva, spre exemplu în aceasta


problema nu este nevoie de un algoritm care sa determine daca numărul este
prim deoarece știm din enunț că numere citite sunt de 0 cifra așa ca folosind 4
funcții if ne este mai rapid deoarece adăugarea algoritmului de verificare al
divizorilor crește complexitatea algoritmului.

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>

using namespace std;

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.

Fișierul de intrare sir13.in conține elementele șirului, separate printr-un spațiu.

Fișierul de ieșire sir13.out va conține pe prima linie mesajul DA sau NU,


corespunzător cerinței.

Utilizați un algoritm eficient din punctul de vedere al timpului de executare și al


memoriei necesare.

Î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.

Algoritmul este eficient din punct de vedere al executarii și al memoriei


utilizate deoarece nu folosim vectori iar prelucrarea numerelor se face imediat
după citire.

16
#include <fstream>

using namespace std;

ifstream fin("sir13.in");

ofstream fout("sir13.out");

int main(){

int ok = 1, p = -1, i = 1000000001, x;

while(fin >> x)

if(x % 2 == 0)

{ if(x < p) ok = 0;

p = x;}

else { if(x > i) ok = 0;

i = x; }

if(ok) fout << "DA";

else fout << "NU";

return 0;}

Exemplu: la citirea 7 2 5 2 4 3 8 se va afișa DA

la citirea 5 2 7 2 4 3 8 se va afișa NU

17
Problema pbinfo#242

Se dă un număr natural x și două șiruri a și b, cu n, respectiv m elemente,


numere naturale, ordonate strict crescător. Să se afișeze, în ordine
crescătoare, multiplii lui x care se află doar în unul dintre cele două șiruri.

Fișierul de intrare interclasm.in conține pe prima linie numărul x, pe linia a doua


numărul n; urmează n numere naturale, ordonate crescător, ce pot fi dispuse pe
mai multe linii. Linia următoare conține numărul m și urmează m numere naturale,
ordonate crescător, ce pot fi dispuse pe mai multe linii.

Fișierul de ieșire interclasm.out va conține pe prima linie valorile determinate,


separate printr-un spațiu.

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>

using namespace std;

ifstream fin("interclasm.in");

ofstream fout("interclasm.out");

int main()

{ int x, n, m, p=0, a[100000], b[100000], v[200000];

fin>>x>>n;

for(int i = 0 ; i < n ; ++i)

{ fin >> a[i];

v[p]=a[i];

p++; }

fin >> m;

for(int i = 0 ; i < m ; ++i)

{ fin >> b[i];

v[p]=b[i];

p++;}

sort(v , v+p);

for(int i = 0 ; i < p ; ++i)

{if(v[i]!=v[i-1] && v[i]!=v[i+1])

{ if(v[i]%x==0) fout << v[i] << ' '; }} return 0;}

19
Problema pbinfo#250

Se dau două şiruri a şi b, cu n, respectiv m elemente, numere naturale, ordonate


strict crescător. Să se afişeze, în ordine strict crescătoare, valorile existente
în cel puţin unul dintre cele două şiruri. În cazul în care o valoare apare în ambele
şiruri, va fi afişată o singură dată.

Fişierul de intrare interclasare1.in conţine pe prima linie numărul n; urmează n


numere naturale, ordonate strict crescător, ce pot fi dispuse pe mai multe linii.
Linia următoare conţine numărul m şi urmează m numere naturale, ordonate
strict crescător, ce pot fi dispuse pe mai multe linii.

Fişierul de ieşire interclasare1.out va conţine, în ordine strict crescătoare,


valorile existente în cel puţin unul dintre cele două şiruri. Aceste valori vor fi
afişate câte 10 pe o linie, separate prin spaţii. Ultima linie poate conţine mai
puţin de 10 de valori.

Î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.

Exemplu: după citirea 7

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>

using namespace std;

ifstream cin("interclasare1.in");

ofstream cout("interclasare1.out");

int main()

{ int n, m, k = 0;

int a[100001], b[100001], c[200001];

cin >> n;

for(int i = 1; i <= n; ++i)

cin >> a[i];

cin >> m;

for(int i = 1; i <= m; ++i)

cin >> b[i];

int i = 1, j = 1;

while(i <= n && j <= m)

if(a[i] < b[j]) c[++k] = a[i], i++;

else if(a[i] > b[j]) c[++k] = b[j], j++;

else i++;

while(i <= n) c[++k] = a[i], i++;

while(j <= m) c[++k] = b[j], j++;

for(int i = 1; i <= k; ++i){

cout << c[i] << " ";

if(i % 10 == 0)

cout << endl;}

return 0;}

21
Bacalaureat Informatica 2021.

Numărul natural a se numeste sufix al numărului natural b dacă a este egal cu b


sau dacă b se poate obține din a prin alipirea la stanga a unor noi cifre.

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.

Se cere sa se afișeze pe ecran ultimii doi termeni ai șirului, aflați pe poziții


consecutive în acesta, care îl au drept sufix pe numărul x. Numerele sunt afișate
în ordinea în care apar în și, separate printr-un spațiu, iar dacă nu exista doi
astfel de termeni, se afișează pe ecran mesajul nu exista. Proiectați un algoritm
eficient din punct de vedere al memoriei utilizate și al timpului de executare.

Exemplu: dacă fișierul conține numerele alaturate

210

3445 210 893210 1245 1210 3210 15210 67120 20210 12

atunci pe ecran se afișează 3210 15210.

#include <fstream>

#include <iostream>

using namespace std;

ifstream fin("bac.txt");

int main()

{ unsigned int sufix, nr_1, nr_2, ultim = -1, precedent = -1;

fin >> sufix >> nr_1;

while(fin >> nr_2)

{ if(nr_1 % 1000 == sufix && nr_2 % 1000 == sufix)

{ ultim = nr_2 , precedent = nr_1; }

nr_1 = nr_2; }

if(ultim != -1) cout << precedent << " " << ultim;

else cout << "nu exista"; return 0;}

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>

using namespace std;

ifstream fin("bac.in");

int AP[1000],x,nrMax,contorImp;

int main()

{ while(fin >> x)

{ AP[x]++;

if(x > nrMax) nrMax = x; }

for(int i = 1; i <= nrMax; i++)

{ if(AP[i] % 2 == 1) contorImp++; }

if(contorImp > 1) cout << "NU";

else cout << "DA"; return 0;}

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

În urma materialului prezentat, pot spune că am oferit


o rezolvare buna la problema ce tine de
șiruri de numere naturale de la examenul bacalaureat.
Am ales diverse probleme, unele dintre fiind mai ușoare
până la cele mai dificile, majoritatea avand și explicație.

Informatică ocupă în viaţa de zi cu zi un rol foarte important fiind


prezent în toate domeniile de activitate. Vor deveni din ce în ce mai
importante în viaţa fiecăruia dintre noi, deoarece, tehnologia avansează şi
munca omului va fi preluată în întregime de maşinării.

Am ales aceasta tema deoarece este problema 3 de la subiectul 3 de la


examenul de bacalaureat de la informatica.
Problema este formată din 2 subpuncte, primul subpunct care cere
rezolvarea efectiva a programului iar al doilea subpunct cere descrierea în
limbaj natural al programului, justificând eficiența acestuia și de aceea voi
oferii soluții la ambele subpuncte.

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

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