C++ cum folosesc unsigned int

cpp

(JustSM) #1

Avem de ex functia clasica ce calculeaza factorialul unui numar:

 int fact( int n) {
    if(n==0)
        return 1;
    else
        return n*fact(n-1);
}

Cum as putea face ca aceasta functie sa se execute doar pentru valori pozitive(>=0).Adica daca primeste o valoare negativa(ex: -5) sa nu se execute,am incercat sa folosesc unsigned dar tot se executa(se blocheaza programul dar tot se executa,nu primesc eroare in consola)

unsigned int fact(unsigned int n) {
    if(n==0)
        return 1;
    else
        return n*fact(n-1);
}

Se poate face asta?ma refer fara o conditie de genul if(n>=0)


(Serghei Amelian) #2

Pai şi ce înseamnă “să nu se execute”? Vrei să crape programul dacă e număr negativ? :slight_smile:


(JustSM) #3

oricum crapa daca e numar negativ,ma refer sa apara eroare in Build Messages si sa nu se deschida consola


(Serghei Amelian) #4

Adică vrei să-ţi apară eroare la compilare dacă bagi număr negativ?


(Tudor) #5

Încearcă folosind #error.


(Serghei Amelian) #6

Poate sa foloseasca static_assert, dar nu prea cred că este ceea ce vrea de fapt.


(Cosmin Popescu) #7
int fact (int n)
{
   if(n < 0)
     return -1; //nu vrem valoare negativa. eventual poti sa pui si un mesaj aici

   else if(n==0)
        return 1;

   else
        return n*fact(n-1);
}

sper ca te ajuta :slight_smile:
acel unsigned se refera doar la tipul de data. tu doar ii zici functie sa faca pt nr intre 0 si 232(thanks to Ionut !)
https://msdn.microsoft.com/ro-ro/library/s3f49ktz.aspx

Am lucrat cu int, nu cu unsigned. Daca tu lasi unsigned si o sa ii dai un nr negativ, o sa iti tranteasca stackoverflow. (merci pt observatie @serghei )

PS: Serghei, sper ca nu am zis o tampenie
@iamntz este posibila adaugarea in editorul de text a superscript si subscript ? Ca la word


(Ionuț Staicu) #8

2 postări au fost mutate într-un nou subiect: Sintaxă matematică în comentarii


(Serghei Amelian) #10

De fapt “signed” şi “unsigned” sunt simple convenţii. Dacă asignezi “-5” unei variabile “unsigned” este că si cum i-ai da valoarea “4294967291”. Fiind vorba de o funcţie recursivă şi numărul foarte mare, îţi dă “stack overflow” (nu segfault). Exact acelasi rezultat l-ai avea daca ai folosi un numar pozitiv foarte mare.