Informatică, întrebare adresată de pmariusus, 8 ani în urmă

Se da functia furmatoare:

int f(lint a[ ], int N){
int i,j;
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++)
if(a[i]==a[j])return 0;
return 1; }
Daca vectorul a contine numerele: 2,1,3,0,3, ce valoare va fi afisata la apelul functiei f:
cout<<f(a,5);

Ma puteti ajuta va rog ?
Si daca se poate sa imi explicati ce face programul.​

Răspunsuri la întrebare

Răspuns de artur99
6

Întâi să aranjăm puțin codul (am atașat și o poză cu el aranjat):

int f(int a[], int N){

   int i,j;

   for(i=0; i<N-1; i++) {

       for(j=i+1; j<N; j++) {

           if(a[i] == a[j]) {

               return 0;

           }

       }

   }

   return 1;

}

Observăm că funcția primește un vector de int-uri (a) și un număr N, probabil lungimea vectorului.

Iar apoi parcurge cu i, vectorul, însă merge de la 0 până la penultimul element (N-2, adică mai mic decât N -1).

Iar pentru fiecare dintre aceste repetiții (iterații) cu acest i, mai avem un for, care pornește de la i + 1 și merge până la ultimul element (N-1, adică < N).

Deci să încercăm să simulăm un exemplu simplu, să zicem că N = 6.

În acest caz, i-ul o să aibă, pe rând, următoarele valori: 0, 1, 2, 3, 4, și atât (se oprește la i < N - 1, adică la i < 5, adică la 4), deci va parcurge doar pentru primele 5 elemente din vector (fără ultimul).

Bun, și să luăm prima iterație a for-ului:

o să fie i = 0, și începe al 2-lea for, în care j-ul merge de la i + 1 (adică de la 1) până la j < N (adică până la 5), deci j va fi pe rând 1, 2, 3, 4, 5 (adică toate elementele, dar începând de la al doilea).

Și pentru fiecare dintre acestea se face o verificare dacă elementul de pe poziția i este egală cu cea de pe poziția j. Dacă condiția este adevărată, se returnează 0 și se încheie funcția (imedat după un return într-o funcție, se iese din funcție, nu se mai execută nimic altceva), iar dacă condiția e falsă, de fiecare dată, se termină for-urile și se returnează 1.

Deci, practic, se verifică următoarele numere

i = 0

--> j = 1  => a[0] == a[1]

--> j = 2  => a[0] == a[2]

...

--> j = 5  => a[0] == a[5]

i = 1

--> j = 2  => a[1] == a[2]

--> j = 3  => a[1] == a[3]

...

--> j = 5  => a[1] == a[5]

...

până la i = 4 și j = 5 (a[4] == a[5])

Deci vedem că sunt verificate toate numerele între ele 2 câte 2 (1-2, 1-3, 1-4, ..., 3-4, 3-5, 4-5), și dacă vreunul din ele este egal, se returnează 0 și se oprește funcția. Iar dacă niciunul din ele nu este, și scăpăm de return 0 ăla, se încheie for-ul și ajungem la return 1, deci funcția returnează 1.

În cazul cerinței tale, când va ajunge i-ul la 2 (a[2], adică 3) și j-ul la 4 (a[4], adică celălalt 3), condiția ca a[i]==a[j] este adevărată și se returnează 0.

Mai general vorbind, funcția respectivă verifică în vectorul a (considerând că N este numărul de elemente din el) dacă toate elementele sunt unice. Dacă sunt, se returnează 1, iar dacă există dubluri, se returnează 0.

Anexe:

pmariusus: Multumesc mult !
1cineva1: Bună ,mă poți ajuta și pe mine ?(cu o temă pawer point)(Tema se află pe contul meu ...Ofer coroană și puncte
Alte întrebări interesante