Teste de informatică pentru liceu, articole C#, C/C++, PHP
Rândul 1
Toate subiectele sunt obligatorii. Se acordă 10 puncte din oficiu
Subiectul I (30 puncte)
Alegeţi variantele corecte din variantele de răspuns date:
1. Ce va afişa următorul program:
#include<iostream.h>
void P(int n)
{ if (n)
{ cout<<n%5 ; P(n/5) ; cout<<n%5 ; }
else cout<<’ ’
}
int main()
{ int n = 1234 ;
P(n) ; cout<<n ;
return 0 ; }
a) 1234 43211234 b) 41441 144141234 c) 14414 414410
d) 41441 144140 e) 14414 414410 f) 14414 414411234
2. Se consideră următoarea funcţie recursivă:
int F(int x)
{ if (x == 0) return 0 ;
else if (x%3 == 0) return F(x/10) + 1 ;
else return F(x/10) ;
}
Care din următoarele instrucţiuni afişează valoarea 4 :
a) cout<<F(13369) b) cout<<F(21369) c) cout<<F(4) d) cout<<F(2442) ;
3. Se consideră următoarea funcţie recursivă. Ce se afişează la ecran la apelul Scrie(21) ?
void Scrie(int x)
{ if (x > 1) scrie(x/2) ;
cout<<x%2 ;
}
a) 10101 b) 11111 c) 01010 d) 00000
Subiectul II (20 puncte)
Fie funcţia:
int Numar(int n, int k)
{
if (n<10) return n + k ;
else return Numar(n/10 , 10*(k + n%10)) ;
}
Faceţi corespondenţa între apelul funcţiei şi valoarea obţinută:
Apelul funcţiei |
Valoare rezultată |
1. Numar(100, 0) |
a) 1 |
2. Numar(123, 0) |
b) 101 |
3. Numar(321, 0) |
c) 123 |
4. Numar(100, 1) |
d) 421 |
5. Numar(123, 1) |
e) 321 |
Subiectul III (40 puncte)
III. 1. (20 puncte) Scrieţi o funcţie recursivă care returnează suma elementelor pare dintr-un vector de numere naturale.
III. 2. (20 puncte) Se consideră două şiruri de caractere s1, s2. Scrieţi o funcţie recursivă care returnează -1 dacă s1 este strict mai mic decât s2, returnează 0 dacă şirurile sunt egale şi returnează 1 dacă s1 este mai mare decât s2.
Rândul 2
Toate subiectele sunt obligatorii. Se acordă 10 puncte din oficiu
Subiectul I (30 puncte)
Alegeţi variantele corecte din variantele de răspuns date:
1. Ce va afişa pe ecran următorul program:
#include<iostream.h>
char x[11] = “abbbabaaab” ;
int Test(int i)
{ if (x[i] == 0) return 0 ;
return (x[i] == x[i+1]) + Test(i+1) ; }
int main()
{ cout<<Test(0) ;
return 0 ; }
a) 0 b) nimic, se obţine eroare la compilare c) 5 c) 3 d) 10 e) 4
2. Câte asteriscuri va afişa funcţia de mai jos la apelul sk(6) ?
void sk(int x)
{ int i ;
for (i = 1 ; i <= x/2 ; i++) sk(i) ;
cout<<” * ” ;
}
a) un număr impar de asteriscuri b) 2 c) 4 d) 6
3. Fie funcţia:
int F(int n, int x)
{
if (n < 2) return 1 ;
else if (n % x == 0) return F(n/x , x+1) ;
else return 0 ;
}
Pentru care din următoarele apeluri funcţia F va returna valoarea 1 :
a) F(25,2) b) F(36,2) c) F(24,2) d) F(5040, 2)
Subiectul II (20 puncte)
Fie funcţia:
void Numar(int n, int b)
{
if (n > 0)
{
Numar(n/b) ;
cout<<n%b ;
}
}
Faceţi corespondenţa între apelul funcţiei şi valoarea obţinută:
Apelul funcţiei |
Valoare rezultată |
1. Numar(32, 2) |
a) 100000 |
2. Numar(31, 2) |
b) 3000 |
3. Numar(21, 3) |
c) 210 |
4. Numar(81, 3) |
d) 300 |
5. Numar(27, 3) |
e) 11111 |
Subiectul III (40 puncte)
III. 1. (20 puncte) Scrieţi o funcţie recursivă care returnează suma cifrelor unui număr natural.
III. 2. (20 puncte) Se consideră două şiruri de caractere s1, s2. Scrieţi o funcţie recursivă care returnează 1 dacă şirurile sunt anagrame sau returnează 0 dacă şirurile nu sunt anagrame.
Barem de corectare
Rândul 1
Subiectul I
1. c
2. b , d
3. a
Subiectul II
1. a
2. e
3. c
4. b
5. d
Subiectul III
III. 1.
int Suma(int n)
{
if (n == 0) return 0 ;
else return n % 10 + Suma(n/10) ;
}
III. 2.
int Lex(char *s1, char *s2)
{
if ((*s1 == NULL) && (*s2 == NULL)) return 0 ;
if (*s1 == NULL) return -1 ;
if (*s2 == NULL) return 1 ;
if (*s1 < *s2) return -1 ;
else if (*s1 > *s2) return 1 ;
else return Lex(s1+1, s2+1) ;
}
Rândul 2
Subiectul I
1. f
2. d
3. c , d
Subiectul II
1. a
2. e
3. c
4. b
5. d
Subiectul III
III. 1.
int SumaPare(int *a, int i)
{
if (i == n) return 0 ;
else return (a[i]%2 == 0)*a[i] + SumaPare(a,i+1) ;
}
III. 2.
int Anagrame(char *s1, char *s2)
{
if ((*s1 == NULL) && (*s2 == NULL)) return 1 ;
if ((*s1 == NULL) || (*s2 == NULL)) return 0 ;
char *p = strchr(s2, s1[0]) ;
if (p == NULL) return 0 ;
else
{
strcpy(p,p+1) ;
return Anagrame(s1+1, s2) ;
}
}
Dan Pracsiu deţinător www.dponline.ro
Profesor, Liceul Teoretic "Emil Racoviță" Vaslui
Membru în Comisia Naţională a Olimpiadelor de Informatică
Pasiuni: istoria, călătoriile, fotografia, muzica clasică
un oarecare 21-2-2012 10:36:39
ati inversat in barem subiectele trei roman punct unu intre variante.(wink).
COLEGIUL DE INFORMATICA 14-12-2012 7:16:39
TEZA LA INFORMATICA INTREBARI SI RASPUNSURI 2012 NU AVETI???IMI TREBUE ASTAZI