Blog

,

SUBIECTE BACALAUREAT 2018 -INFORMATICĂ PROFIL MATEMATICA INFORMATICA

2018 iunie II 5

Fiind dat un cuvânt s, format numai din litere, și un cod c, de aceeași lungime cu s, format

numai din cifre, numim codificare a lui s pe baza codului c operația de construire a unui

nou șir, în care inițial se copiază prima literă din s, apoi, parcurgând de la stânga la dreapta

restul șirului s, se adaugă litera curentă la începutul noului șir, dacă cifra corespunzătoare

de pe aceeași poziție în c este pară, sau la finalul noului șir, în caz contrar.

Exemplu: dacă șirul s este etalon, iar codul este 025843 se obține cuvântul oltean

(inițial șirul conține litera e, apoi se adaugă, în ordinea parcurgerii lui s, literele t, l și o la

început, iar restul literelor la final).

Scrieţi un program C/C++ care citeşte de la tastatură două cuvinte, notate cu s și c, fiecare

având cel mult 102 caractere, s fiind format doar din litere mici ale alfabetului englez, iar c

fiind format doar din cifre. După primul cuvânt se tastează Enter. Programul construiește în

memorie și afișează pe ecran cuvântul obținut prin codificarea lui s pe baza lui c, dacă cele

două cuvinte au aceeași lungime, sau mesajul cod incorect, în caz contrar.

Exemplu: dacă se citesc cuvintele alăturate, se afişează pe ecran cuvântul

oltean (10p.)

etalon

025843

#include <iostream>

#include <string.h>

using namespace std;

int main() {

char s[101],c[101];

cin.get(s,100);

cin.get();

cin.get(c,100);

int n;

if ((n = strlen(c)) != strlen(s)) {

cout << “cod incorect\n”;

return 0;

}

int i, pozPare = 0, pozImpare = n – 1; // variabilele poz folosite

// pentru a sti unde adaug litera

// daca in cod am cifra para sau nu

char permutare[101];

for (i = n – 1; i > 0; i–) {

if ((c[i] – ‘0’) % 2 == 0)

permutare[pozPare++] = s[i];

else

permutare[pozImpare–] = s[i];

}

permutare[pozPare] = s[0];

permutare[n] = ‘\0’;

cout << permutare << ‘\n’;

return 0;

}

 

 

 

 

 

 

 

 

 

 

2018 iunie III 3

Subprogramul resturi are patru parametri, n, x, y și r, prin care primeşte câte un număr

natural din intervalul [1,109], r<x<y<n. Subprogramul returnează numărul de valori

naturale din intervalul [1,n] pentru care atât restul împărțirii la x, cât și restul împărțirii la

y, sunt egale cu r.

Scrieţi definiţia completă a subprogramului.

Exemplu: pentru n=200, x=5, y=14 și r=2, subprogramul returnează numărul 3 (pentru

numerele 2, 72 și 142 atât restul împărțirii la 5, cât și restul împărțirii la 14, este 2). (10p.)

 

#include <iostream>

using namespace std;

int resturi(int n, int x, int y, int r) {

int nr = 0, i;

// interschimb ca sa stiu ca in y voi avea valoarea mai mare

if (x > y) {

int temp = y;

y = x;

x = temp;

}

for (i = r; i <= n; i += y) {

if (i % x == r)

nr++;

}

return nr;

}

int main() {

int n, x, y, r;

cin >> n >> x >> y >> r;

cout << resturi(n,x,y,r);

return 0;

}

 

 

2018 iunie III 3

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

  1. a) Descrieţi în limbaj natural algoritmul proiectat, justificând eficienţa acestuia. (2p.)
  2. b) Scrieţi programul C/C++ corespunzător algoritmului descris.

 

#include <iostream>

#include <fstream>

using namespace std;

 

int main() {

 

ifstream f(“bac.txt”);

int a, b = -1, c = -1, nr = 0, lungMax = 0;

 

while (f >> a) {

 

if (a != b && a != c) {

nr++;

b = c;

c = a;

} else {

if (nr > lungMax)

lungMax = nr;

if (a == c) {

c = a;

b = -1;

nr = 1;

} else {

b = c;

c = a;

nr = 2;

}

}

}

 

cout << lungMax << ‘\n’;

return 0;

 

}

Related Posts