AICI-->variante BAC
INFORMATICĂ, limbajul C/C++
Varianta I
Subiectul ISpecializarea 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
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)
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
┌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>
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;
}