Buna ziua, am rezolvat niste variante de bac la informatica si am dat peste o problema la care nu inteleg o portiune din cod.
Pe scurt problema zice asa: se citeste un numar n si apoi n numere naturale. Sa se verifice cate numere sunt prime din numerele citite si sa se afiseze numarul lor.
exemplu: n=5 si numerele citite 12, 3, 9, 7, 1; se va afisa 2 (pentru ca 3,7 sunt numere prime din cele citite)
Initial eu am rezolvat-o diferit, desi cu o mica eroare, ca mi-l citea si pe 1 ca fiind numar prim.
M-am uitat la rezolvarea subiectului si e asa:
<i> </i>#include <iostream> using namespace std; unsigned long i,n,nr,x; int prim(unsigned long x) { int p; unsigned long d; if(x%2==0) return x==2; else if(x==1) return 0; else { p=1; d=3; while(p && d*d<=x) if(x%d==0) p=0; else d+=2; return p; } } int main() { cout<<"n="; cin>>n; nr=0; cout<<"Dati numerele:"; for(i=1;i<=n;i++) { cin>>x; if(prim(x)) nr++; } cout<<nr; }
Pe mine din acest cod ma intereseaza subprogramul „prim”.
Nu inteleg ceva din subprogramul asta, de ce zice
<i> </i>if(x%2==0) return x==2;
Multumesc anticipat!
Trebuie sa dai o interpretare a functiei prim pentru inceput.
Dupa cum este ea implementata, prim va intoarce 0 daca numarul nu este prim si numarul insusi in caz contrar.
A doua chestiune tine de limbajul C in sine.
int numar =0;
…
atribuie o valoare lui numar
..
if (numar) {
…
}
Structura conditionala va fi executata daca si numai daca „numar” este nenul.
Se putea evita ambiguitatea daca functia returna 1 in cazul in care numarul ar fi fost prim.
PS: Este pacat sa zici C++ cand folosesti doar 2 chestiuni din C++, iar restul este un C chior.
PS2: primele 2 „else”-uri sunt complet inutile ca functionalitate. Cel mult ar putea ridica gradul de lizibilitate al textului.
Scuza-ma, dar nu am inteles ce vrei sa spui prin „interpretare a functiei prim”.
Nu e o problema daca prim va returna valoarea 0, ea trebuie sa returneze cate numere prime sunt citite. Daca nu e citit nici un numar prim ea va returna 0.
Si functia returneaza 1 in cazul in care numarul e prim, returneaza acel p, care daca e 1 atunci inseamna ca numarul e prim. Nu?
Scuze, poate zic numai prostii, incerc sa le pricep si eu mai bine, mai am mult de invatat.😳
Uite aici e cerinta exacta:
P.S. : Si totusi ce face acel
if(x%2==0)
return x==2;
?
Multumesc de raspuns!
Tu ai 2 functii in programul tau. Una se numeste „main”, iar cea de-a doua „prim”.
Poate la scoala vi s-a predat notiunea de „subprogram”, doar ca acest termen este de multa vreme depasit. In C si multe alte limbaje de programare ele se numesc functii.
Functia/subprogramul „prim” va intoarce ca rezultat un intreg, iar valoarea am specificat-o in postul anterior.
Se pare ca am fost nitel neatent asa ca voi detalia codul de mai jos.
Toate numerele pare, cu execeptia lui 2, nu sunt prime.
Astfel, blocul de mai sus verifica daca numarul este par, iar daca este par va intoarce 1 (x==2, este o instructiune de comparatie cu valoare de adevar), in rest va intoarce 0. Codul are aceeasi semnificatie ca si cel de mai jos
Din ce văd eu (folosesc o analogie cu alte limbaje pe care le mai ştiu, nu am lucrat în C), prim întoarce 0 dacă x e impar neprim, întoarce 1 dacă x e prim impar şi întoarce „x==2” dacă x e par.
Mai jos, if(prim(x)) va evalua True pentru x=2 şi False pentru x par, x>2.
Initial am tratat superficial codul si mi-a scapat chiar intrebarea initiatorului. Am incercat sa spun unde am gresit, dar se pare ca n-am fost foarte clar (o meteahna de-ale mele).
prim va intoarce:
– 0 daca numarul nu este prim
– 1 daca numarul este 2
– numarul insusi daca numarul este prim diferit de 2.
Din pacate, codul prezentat este un amalgam de idei pentru ca nu este consistent in ceea ce priveste valorile returnate.
In ceea ce priveste predarea materiei „informatica” vad foarte multe probleme, dar in mare se rezuma la programa si predare invechite.
Mă îndoiesc. Cred că ceea ce am postat mai sus e corect, cu menţiunea că prim întoarce pentru x par valoarea de adevăr a expresiei „x==2”. Dar nu văd cum prim(5)=5.
Aveti perfecta dreptate. Asta trebuie sa-mi fie invatatura de minte si sa acord atentie sporita codului, mai ales atunci cand in loc de nume sugestive de variabile se „arunca” literele alfabetului.
M-am uitat doar la linia in care se returneaza valoarea si fara sa citesc codul, am presupus ca p este numarul pasat ca argument.
== este operator in C/C++, care intoarce o valoarea booleana (de adevar).
LE: Poate ar fi bine pentru mine si ceilalti, sa aruncati o privire mai critica si pe celelalte posturi ale mele de azi. De fapt doar unul este mai important,
Multumesc amandurora de raspunsuri, am inteles acum cum functioneaza functia „prim” si in special partea cu „x==2”. Nu am mai intalnit pana acum o functie care sa returneze o valoarea booleana scrisa asa: „x==2”.