Cate numere prime au fost citite?

Rezolvarea problemelor de matematica prin realizarea unor programe.
bossy
utilizator
utilizator
Mesaje: 3
Membru din: 12 Mai 2015, 17:00

Cate numere prime au fost citite?

Mesaj de bossy » 12 Mai 2015, 17:09

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:

Cod: Selectaţi tot

#include <iostream>
using namespace std;

unsigned long i,n,nr,x;

int prim&#40;unsigned long x&#41;
&#123;
    int p;
    unsigned long d;
    if&#40;x%2==0&#41;
        return x==2;
    else
        if&#40;x==1&#41;
            return 0;
        else
            &#123;
                p=1;
                d=3;
                while&#40;p && d*d<=x&#41;
                    if&#40;x%d==0&#41;
                        p=0;
                    else
                        d+=2;
                    return p;
            &#125;
&#125;

int main&#40;&#41;
&#123;
    cout<<"n=";
    cin>>n;
    nr=0;
    cout<<"Dati numerele&#58;";
    for&#40;i=1;i<=n;i++&#41;
        &#123;
            cin>>x;
            if&#40;prim&#40;x&#41;&#41;
                nr++;
        &#125;
    cout<<nr;
&#125;
Pe mine din acest cod ma intereseaza subprogramul "prim".
Nu inteleg ceva din subprogramul asta, de ce zice

Cod: Selectaţi tot

if&#40;x%2==0&#41;
    return x==2;


Multumesc anticipat!

A_Cristian
guru
guru
Mesaje: 1976
Membru din: 23 Feb 2015, 17:15

Mesaj de A_Cristian » 12 Mai 2015, 18:19

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.

bossy
utilizator
utilizator
Mesaje: 3
Membru din: 12 Mai 2015, 17:00

Mesaj de bossy » 12 Mai 2015, 18:47

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. :oops:

Uite aici e cerinta exacta:

Cod: Selectaţi tot

Scrieţi un program C/C++ care citeşte de la tastatură un număr natural nenul n şi apoi n
numere naturale, cu maximum 9 cifre fiecare. Programul calculează şi afişează pe ecran, câte
numere prime conţine şirul citit.
Exemplu&#58; pentru n=5 şi valorile 12 3 9 7 1 se va afişa pe ecran valoarea 2 &#40;în şirul dat
există două numere prime şi anume 3 şi 7&#41;.


P.S. : Si totusi ce face acel
if(x%2==0)
return x==2;

?


Multumesc de raspuns!

A_Cristian
guru
guru
Mesaje: 1976
Membru din: 23 Feb 2015, 17:15

Mesaj de A_Cristian » 12 Mai 2015, 19:30

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.

Cod: Selectaţi tot

if&#40;x%2==0&#41;
    return x==2;
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

Cod: Selectaţi tot

if&#40;x%2==0&#41;
  if&#40; x==2 &#41;
   return 1;
  else
    return 0;

gigelmarga
profesor
profesor
Mesaje: 1537
Membru din: 21 Oct 2014, 11:31

Mesaj de gigelmarga » 12 Mai 2015, 19:45

A_Cristian scrie: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.
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.

A_Cristian
guru
guru
Mesaje: 1976
Membru din: 23 Feb 2015, 17:15

Mesaj de A_Cristian » 12 Mai 2015, 19:58

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.

gigelmarga
profesor
profesor
Mesaje: 1537
Membru din: 21 Oct 2014, 11:31

Mesaj de gigelmarga » 12 Mai 2015, 20:12

A_Cristian scrie:
- numarul insusi daca numarul este prim diferit de 2.
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.

A_Cristian
guru
guru
Mesaje: 1976
Membru din: 23 Feb 2015, 17:15

Mesaj de A_Cristian » 12 Mai 2015, 20:21

:).
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,

bossy
utilizator
utilizator
Mesaje: 3
Membru din: 12 Mai 2015, 17:00

Mesaj de bossy » 12 Mai 2015, 20:54

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".

Scrie răspuns
  • Subiecte similare
    Răspunsuri
    Vizualizări
    Ultimul mesaj