III.2 iulie 2023

Sesiunea Iulie 2023

Subiectul al III-lea – Exerciţiul 2

Pentru a identifica punctele în care se concentrează apa în albia unui râu în cazul secetei, se determină talvegul acesteia – linia care unește punctele cele mai adânci ale albiei. În acest scop s-au stabilit ns secțiuni transversale pe cursul apei, numerotate începând de la 1, și în cadrul fiecărei secțiuni s-a măsurat adâncimea apei în np puncte, numerotate începând de la 1. Din fiecare secțiune, în ordine, se include în talveg cel mai adânc punct al acesteia, iar dacă în secțiune sunt mai multe puncte aflate la aceeași adâncime, maximă, se va lua în considerare doar primul dintre ele, ca în exemplu. Scrieți un program C/C++ care citește de la tastatură două numere naturale, ns și np (ns∈[1,103], np∈[1,50]), și cele ns∙np elemente ale unui tablou bidimensional, valori naturale din intervalul [0,102].
Fiecare linie a tabloului corespunde câte unei secțiuni, în ordinea numerotării acestora, iar valorile memorate pe linie reprezintă adâncimile celor np puncte stabilite pentru acea secțiune, în ordinea numerotării lor. Programul afișează pe ecran, pentru fiecare secțiune, o pereche formată din numărul de ordine al secțiunii și numărul de ordine al punctului său care s-a inclus în talveg. Numerele din fiecare pereche sunt afișate separate prin câte un caracter : (două puncte), iar fiecare pereche este urmată de un spațiu.
Exemplu: pentru ns=6, np=4 și tabloul alăturat, se afișează pe ecran valorile: 1:3 2:2 3:2 4:2 5:4 6:3                

Exerciţiul solicită determinarea pentru fiecare linie a coloanei pe care apare prima dată valoarea maximă de pe linia respectivă.

Notarea rezolvării propuse:

  • variabilă de tip tablou bidimensional, declarată conform cerinței (1p.)
    int a[1001][51];
  • date citite conform cerinței (1p.)
    cin>>ns>>np;
    […]
    for(i=1;i<=ns;++i) for(j=1;j<=np;++j) cin>>a[i][j];
  • valori cu proprietatea cerută determinate () () Se acordă câte 2p. pentru fiecare aspect specific:
    -algoritm de bază pentru determinare a valorii maxime dintr-o serie de valori:
    for(i=1;i<=ns;++i) { int mx=-1; […] for(j=1;j<=np;++j) if(a[i][j]>mx)
    {
    mx=a[i][j];
    […]
    }
    […]
    }
    -determinare a poziției unui maxim într-o serie de valori:
    int mx=-1;
    int poz;
    for(j=1;j<=np;++j) if(a[i][j]>mx)
    {
    mx=a[i][j];
    poz=j;
    }

Observaţie:
O altă variantă de determinare a poziției unui maxim într-o serie de valori:
int poz=1;
for(j=2;j<=np;++j) if(a[i][j]>a[i][poz])
poz=j;
-valori suport verificate pentru determinarea unui maxim pentru fiecare secțiune conform cerinței:
for(i=1;i<=ns;++i)
{
[…]
}

  • date afişate în format conform cerinței (1p.)
    […]
    cout<<i<<‘:'<<poz<<‘ ‘;
    -variabile simple declarate conform cerinței, corectitudine globală a programului (structura, sintaxa, alte aspecte neprecizate în barem)
    int ns,np;
    […]
    int mx;
    […]
    int poz;
    Observaţie:
    Exerciţiul poate fi rezolvat şi fără utilizarea variabilei de tip tablou bidimensional. Nu se recomandă această rezolvare în situaţia în care în cerinţă se solicită explicit citirea elementelor unui tablou bidimensional (Scrieți un program C/C++ care citește de la tastatură două numere naturale, ns și np ([…]) și cele ns∙np elemente ale unui tablou bidimensional […]).
#include <iostream>
using namespace std;
int a[1001][51];
int ns,np;
int main()
{
cin>>ns>>np;
int i,j;
for(i=1;i<=ns;++i) for(j=1;j<=np;++j) cin>>a[i][j];
for(i=1;i<=ns;++i) { int mx=-1; int poz; for(j=1;j<=np;++j) if(a[i][j]>mx)
{
mx=a[i][j];
poz=j;
}
cout<<i<<':'<<poz<<' ';
}
return 0;
}