[Bacalaureat]


AICI-->variante BAC


INFORMATICĂ, limbajul C/C++

 Varianta I

 Subiectul I 
Specializarea Matematică-informatică
EXAMENUL DE BACALAUREAT – 2008 
Proba scrisă la INFORMATICĂ
PROBA E, limbajul C/C++ 
Specializarea Matematică-informatică
♦ Toate subiectele sunt obligatorii. Se acordă 10 puncte din oficiu. 
♦ Timpul efectiv de lucru este de 3 ore. 
♦ În rezolvările cerute, identificatorii utilizaţi trebuie să respecte precizările din enunţ
(bold), iar în lipsa unor precizări explicite, notaţiile trebuie să corespundă cu semnificaţiile 
asociate acestora (eventual în formă prescurtată). 
Subiectul I (30 de puncte)
Pentru itemul 1, scrieţi pe foaia de examen litera corespunzătoare răspunsului corect. 
1. Variabila x este de tip real. Care dintre următoarele expresii C/C++ are valoarea 1 dacă şi 
numai dacă numărul real memorat în variabila x aparţine intervalului (5,8]? (4p.)
a. (x<8) && (x>=5) b. (x<=8) || (x>5) 
c. (x>8) || (x<=5) d. (x<=8) && (x>5) 
Scrieţi pe foaia de examen răspunsul pentru fiecare dintre cerinţele următoare. 
2. Se consideră algoritmul alăturat, descris în pseudocod. 
S-a notat cu x%y restul împărţirii numărului întreg x la numărul 
întreg nenul y şi cu [a] partea întreagă a numărului real a.
a) Scrieţi valoarea care se va afişa dacă se citeşte 
n=103456. (6p.) 
b) Scrieţi toate numere naturale impare, distincte, fiecare 
având exact două cifre, care pot fi citite pentru variabila 
n astfel încât să se afişeze valoarea 3. (4p.)
c) Scrieţi în pseudocod un algoritm, echivalent cu cel dat, 
în care să se înlocuiască structura cât timp...execută
cu o structură repetitivă de alt tip. (6p.)
citeşte n (număr natural)
z=0 
p=1 
┌cât timp n>0 execută
│ c=n%10 
│ n=[n/10] 
│┌dacă c%3=0 atunci 
││ z=z+p*(9-c) 
││ p=p*10 
│└■
└■
scrie z
d) Scrieţi programul C/C++ corespunzător algoritmului dat. (6p)

Subiectul II (30 de puncte)
Pentru fiecare dintre itemii 1 şi 2 scrieţi pe foaia de examen litera care corespunde 
răspunsului corect. 
1. Se consideră o coadă în care iniţial au fost introduse, în această ordine, elementele cu 
valorile 1 şi 2: 
1 2 . Se notează cu AD(x) operaţia prin care se adaugă elementul cu 
valoarea x în coadă şi cu EL operaţia prin care se elimină un element din coadă. Câte 
elemente va conţine coada în urma executării secvenţei de operaţii: 
AD(4);EL;EL;AD(5);EL;AD(3)? (4p.)
a. 3 b. 1 c. 2 d. 5 
2. Care este numărul maxim de componente conexe pe care le poate avea un graf neorientat 
cu 20 noduri şi 12 muchii? (4p.)
a. 6 b. 12 c. 10 d. 15 
Scrieţi pe foaia de examen răspunsul pentru fiecare dintre cerinţele următoare. 
3. În declararea alăturată, câmpurile x şi y ale înregistrării pot 
memora coordonatele carteziene ale unui punct din planul xOy.
Scrieţi o secvenţă de instrucţiuni prin executarea căreia se 
calculează şi se afişează pe ecran distanţa dintre două puncte ale 
căror coordonate sunt memorate de variabilele A şi B. (6p.)
struct punct 
 { 
 float x,y; 
 } A,B; 
float d;
4. Pentru arborele reprezentat prin vectorul “de taţi” T=(6,6,5,0,6,4,4,7), scrieţi care este 
nodul cu cei mai mulţi fii şi care sunt frunzele arborelui. (6p.)
5. Scrieţi un program C/C++ care citeşte de la tastatură două numere naturale nenule n şi m
(2≤m≤10, 2≤n≤10) şi care construieşte în memorie şi apoi afişează o matrice A cu n linii 
(numerotate de la 1 la n) şi m coloane (numerotate de la 1 la m) cu proprietatea că fiecare 
element Aij memorează cea mai mică dintre valorile indicilor i şi j (1≤i≤n, 1≤j≤m). 
Matricea se va afişa pe ecran, câte o linie a matricei pe câte o linie a ecranului, elementele 
fiecărei linii fiind separate prin câte un spaţiu. 

Exemplu: pentru n=4 şi m=5 se va afişa matricea alăturată. 
 (10p.)
 1 1 1 1 1 
 1 2 2 2 2 
 1 2 3 3 3 
 1 2 3 4 4

Subiectul III (30 de puncte)
Pentru itemul 1, scrieţi pe foaia de examen litera corespunzătoare răspunsului corect. 
1. Utilizând metoda backtracking se generează în ordine lexicografică cuvintele de câte patru 
litere din mulţimea A={a,b,c,d}, cuvinte care nu conţin două vocale alăturate. Primele 
trei cuvinte generate sunt, în ordine: abab, abac, abad. Care este cel de-al şaselea 
cuvânt generat? (4p.)
a. abbb b. abbc c. abba d. abbd
Scrieţi pe foaia de examen răspunsul pentru fiecare dintre cerinţele următoare. 
2. Pentru definiţia de mai jos a subprogramului f, ce se afişează ca urmare a apelului
f(121,1);? (6p.)
//C 
void f(long n, int i) 
{ if(n!=0) printf("%d",i); 
 if(n%3>0) f(n/3,i+1); 
}
//C++ 
void f(long n, int i) 
{ if(n==0) cout<<i; 
 if(n%3>0) f(n/3,i+1); 
}
3. Fisierul text bac.txt conţine, pe o singură linie, cel mult 1000 de numere naturale nenule 
cu cel mult 4 cifre fiecare, numerele fiind separate prin câte un spaţiu. Scrieţi un program 
C/C++ care citeşte de la tastatură un număr natural nenul n (n≤999) şi numerele din fişierul 
bac.txt şi care afişează pe ecran, separate prin câte un spaţiu, toate numerele din fişier 
care sunt divizibile cu n. Dacă fişierul nu conţine niciun astfel de număr, atunci se va afişa 
pe ecran mesajul NU EXISTA. 
Exemplu: dacă fişierul bac.txt conţine numerele: 3 100 40 70 25 5 80 6 3798, 
pentru n=10 atunci pe ecran se va afişa: 100 40 70 80 (10p.)
4. Subprogramul sub, cu trei parametri, primeşte prin intermediul parametrului: 
– v un tablou unidimensional cu cel mult 100 de componente ce memorează numere 
întregi cu cel mult 4 cifre 
– n un număr natural nenul mai mic sau egal cu 100 ce reprezintă numărul efectiv de 
componente ale tabloului primit prin intermediul parametrului v
– a un număr întreg cu cel mult 4 cifre 
Subprogramul sub returnează numărul componentelor tabloului primit prin intermediul 
parametrului v ale căror valori sunt egale cu valoarea parametrului a. 
Exemplu: pentru valorile n=5, v=(1,21,9,21,403), a=21 ale parametrilor, în urma 
apelului, subprogramului sub va returna valoarea 2. 
a) Scrieţi definiţia completă a subprogramului sub. (4p.)
b) Scrieţi un program C/C++ care să citească de la tastatură un număr natural nenul n
(n≤100) şi n numere întregi, fiecare având cel mult 4 cifre, şi care, folosind apeluri utile ale 
subprogramului sub, să afişeze pe ecran mesajul DA dacă oricare două numere dintre cele 
n numere citite sunt distincte două câte două, sau mesajul NU în caz contrar. 
Exemplu: pentru n=6 şi cele n numere citite de la tastatură: 47 183 69 8 134 -56 
se va afişa pe ecran mesajul DA (6p.)



Pentru toate variantele la bac avem adresa

http://atestatbac.weebly.com/ atestate si bac subiecte si rezolvari .

Ca tema recapitulativa la clasa XI incercati :

-la atestate incercati pe subiectele rezolvate in C++ sa rezolvati cerinta c ) din fisierul cu probleme rezolvate si integral la celelalte subiecte  cu probleme in limbajul C++.


Tot la acesata adresa aveti si rezolvari date mult mai formal decat pe acest blog.

Acum urmează explicațiile :



SUB 1
Pentru itemul 1, scrieţi pe foaia de examen litera corespunzătoare răspunsului corect.
1. Variabila x este de tip real. Care dintre următoarele expresii C/C++ are valoarea 1 dacă şi
numai dacă numărul real memorat în variabila x aparţine intervalului (5,8]? (1p.)
a. (x<8) && (x>=5) b. (x<=8) || (x>5)
c. (x>8) || (x<=5) d. (x<=8) && (x>5)
Scrieţi  răspunsul pentru fiecare dintre cerinţele următoare.
2. Se consideră algoritmul alăturat, descris în pseudocod.
citeşte n (număr natural)
z=0
p=1
┌cât timp n>0 execută
│ c=n%10
│ n=[n/10]
│┌dacă c%3=0 atunci
││ z=z+p*(9-c)
││ p=p*10
│└■
└■
scrie z
S-a notat cu x%y restul împărţirii numărului întreg x la numărul
întreg nenul y şi cu [a] partea întreagă a numărului real a.
a) Scrieţi valoarea care se va afişa dacă se citeşte
n=103456. (3p.)
b) Scrieţi toate numere naturale impare, distincte, fiecare
având exact două cifre, care pot fi citite pentru variabila
n astfel încât să se afişeze valoarea 3. (2p.)
c) Scrieţi în pseudocod un algoritm, echivalent cu cel dat,
în care să se înlocuiască structura cât timp...execută
cu o structură repetitivă de alt tip. (2p.)

2p (of)

Rezolvare:
La 1 avem raspuns corect b si d
la 2 a)  se face un tabel (subiectele de acest tip se rezolva usor numai cu tabel) 

n
c
z
p

103456
6
0
1

10345

3
10

1034
5



103
4




3
63
100

10
0
963
1000

1
1



0








Cel mai probabil afiseaza 963  
2 b)  pt n=16 observam 
n
c
z
p

16

0
1

1
6
3
10

0
1




























presupunem ca daca prima cifra nu e diviz cu 3 dar ultima e 6 avem f probabil valorile 
16,26,46,56,76,86

c) citeşte n (număr natural)
z=0
p=1
daca n>0 atunci 
┌repeta 
│ c=n%10
│ n=[n/10]
│┌dacă c%3=0 atunci
││ z=z+p*(9-c)
││ p=p*10
│└■
 pana cand(n=0)
scrie z

S-a inlocuit instructiunea repetitiva cu test initial cu cea cu test final  si deoarece instr repetitiva cu test initial presupune ca daca testul nu e valid nu se executa nimic mai adaugam unde e subliniat cu rosu mai sus o instr conditionala daca . 
d) programul C++(codul sursa)


#include<iostream.h>
int p,c,z,n;
void main()
{
cout<<"n=";cin>>n;
z=0;p=1;
while(n>0) {
                  c=n%10;
                  n=n/10;
                  if(c%3==0) { z=z+p*(9-c)); p=p*10;}
                 }
cout<<z;
}

La corectie unele omisiuni cum ar fi "punctul si virgula" sau punct etc , daca nu se  repeta in toata lucrarea nu se depuncteaza . 


Subiectul II Rezolvare  (30 de puncte)


a. 3 b. 1 c. 2 d. 5



4





2
2
2

5

3
1
1
1
1
1
1
1

                       AD(4)           ;EL;             EL;           AD(5);          EL;              AD(3)

Corect este c pt ca raman in stiva 2 elemente!
2. Răspuns d) 15 componente conexe pt ca n=20 și m=12 și dacă se desenează un graf complet K5 și încă 1 nod  din  același subgraf legate de K5 cu 3 muchii și apoi cele 14 noduri izolate obtinem 15.


Se consideră și nodurile izolate la calculul componentelor conexe.

3. În declararea alăturată, câmpurile x şi y ale înregistrării pot

memora coordonatele carteziene ale unui punct din planul xOy.

Scrieţi o secvenţă de instrucţiuni prin executarea căreia se

calculează şi se afişează pe ecran distanţa dintre două puncte ale

căror coordonate sunt memorate de variabilele A şi B. (6p.)

#include <iostream>
#include<math.h>
using namespace std;
int main()
{

struct punct
  {
  float x,y;
  } A,B;
 float d;

cout<<"A.x="; cin>>A.x;cout<<"A.x=";cin>>A.x;
cout<<"B.x="; cin>>B.x;cout<<"B.x=";cin>>B.x;
d=sqrt(pow((B.x-A.x),2)+pow((B.y-A.y),2));
cout<<d;
return 0;
}


4.Pentru arborele reprezentat prin vectorul “de taţi” T=(6,6,5,0,6,4,4,7), scrieţi care este
nodul cu cei mai mulţi fii şi care sunt frunzele arborelui. (6p.)
Se observa ca 6 e tatal lui 1 si 2 si 5 al lui 3. 4 e radacina a arborelui pt ca are tatal 0  6 e tatal lui 5 .
4 -tatal lui 6 si 7
8 are tatal 7
logic - 6 e nodul cu cei mai multi fii 
frunzele nu au descendenti , deci 8 ar fi sigur frunza si nu e singurul nod .(mai sunt frunze 1,2,5)
Rezolvarea cere clar un desen , poate fi clar si pt examinator la proba scrisa  daca apar erori in barem ,

5. Scrieţi un program C/C++ care citeşte de la tastatură două numere naturale nenule n şi m
(2≤m≤10, 2≤n≤10) şi care construieşte în memorie şi apoi afişează o matrice A cu n linii
(numerotate de la 1 la n) şi m coloane (numerotate de la 1 la m) cu proprietatea că fiecare
element Aij memorează cea mai mică dintre valorile indicilor i şi j (1≤i≤n, 1≤j≤m).
Matricea se va afişa pe ecran, câte o linie a matricei pe câte o linie a ecranului, elementele
fiecărei linii fiind separate prin câte un spaţiu.

Exemplu: pentru n=4 şi m=5 se va afişa matricea alăturată.
 (10p.)
 1 1 1 1 1
 1 2 2 2 2
 1 2 3 3 3
 1 2 3 4 4

#include<iostream.h>
int n,m,A[10][10],i,j;
int main()
{
do{
cout<<"n=";cin>>n; cout<<"m=";cin>>m;
}while((n<2)||(n>10)||(m<2)||(m>10));
for(i=1;i<=n;i++) { for(j=1;j<=10;j++) { if(i<j) a[i][j]=i ; 
                                                                    else a[i][j]=j;
                                                                    cout<<a[i][j]<<"  ";   
                                                                  }
                               cout<<endl;
                            } return 0;
}

     
Subiectul III (30 de puncte)
Pentru itemul 1, scrieţi pe foaia de examen litera corespunzătoare răspunsului corect. 
1. Utilizând metoda backtracking se generează în ordine lexicografică cuvintele de câte patru 
litere din mulţimea A={a,b,c,d}, cuvinte care nu conţin două vocale alăturate. Primele 
trei cuvinte generate sunt, în ordine: abab, abac, abad. Care este cel de-al şaselea 
cuvânt generat? (4p.)
a. abbb b. abbc c. abba d. abbd

R abab abac abad abba abbb abbc abbd 
corect este punctul b 
2. Pentru definiţia de mai jos a subprogramului f, ce se afişează ca urmare a apelului
f(121,1);? (6p.)

//C++ 
void f(long n, int i) 
{ if(n==0) cout<<i; 
 if(n%3>0) f(n/3,i+1); 
}

Raspuns 
f(121,1) -->f(40,2)-->f(13,3)-->f(4,4)-->f(1,5)-->f(0,6) 
si f(0,6) afiseaza valoarea 6 
n%3 e restul impartirii lui n la 3 si are de mai multe ori la rand valoarea 1 

3. #include<iostream.h>
#include<stdio.h>
#include<io.h>
int s,nr,i,n,a[1000];
FILE *f;
int main()
{
f=fopen("bac.txt","r+");
do{
cout<<"n=";cin>>n;  }
while((n<0)||(n>999));
s=0;//s e variabila semafor , initial e 0 
while(!feof(f))
{ fscanf(f,"%f",&nr); if(nr%n==0)  { s=1;//semaforul devine 1 cand gaseste un divizor
     cout<<"  "<<nr;} 
}
if(s==0) cout<<"NU EXISTA"; return 0;
}


Alt exemplu de subiect 1 rezolvat
SUBIECTUL I al variantelor de BAC




VARIANTA 2 SUBIECTE rezolvate



sub I

sub II

SUB III


Rezolvarea
Rezolvare sub I 
a)
Se citesc 17 22 13 101 2 7 5 0 si ca efect variabilele x si y se modifica continuu pana x devine 0 
x
y
17
22
22
13
13
101
101
2
2
7
7
5
5
0
0
Se vor afisa 2  2  1  1  7  7  5

b) pentru a afisa 9877 se va citi de la tastatura sirul 
9,8,7,7,0
Am pus 0 pt ca algoritmul sa se opreasca
c) citeste x
daca x>0 atunci  repeat
                             citeste y;
                               daca x>y atunci scrie x%10 altfel scrie y%10;
                               x=y;
                               pana cand x=0
d) programul C++
#include<iostream.h>
int x,y;
int main()
{
cin>>x;
while(x>0)  { cin>>y;
                        if x>y cout<<x%10 ; else cout <<y%10;
                      }
x=y; return 0;
}