Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Ritorno di valori inaspettato
Forum - C/C++ - Ritorno di valori inaspettato

Avatar
Trusted (Normal User)
Newbie


Messaggi: 14
Iscritto: 06/09/2015

Segnala al moderatore
Postato alle 16:27
Giovedì, 29/10/2015
Ciao a tutti Boys! :k:

Sto studiando il C e sono arrivato alla parte delle funzioni.
Sto svolgendo un esercizio che richiede di calcolare la potenza di un numero senza usare librerie matematiche.
Ecco il codice:
Codice sorgente - presumibilmente C#

  1. #include <stdio.h>
  2.  
  3. long integerPower( long base, long exponent); /*PROTOTIPO FUNZIONE*/
  4.  
  5. int main (void)
  6. {
  7.         long base;  /*Base*/
  8.         long exponent; /*Esponente*/
  9.         long result; /*Risultato della potenza*/
  10.  
  11.         printf("Enter the base and exponent: \n");
  12.         scanf("%ld%ld", &base, &exponent);
  13.  
  14.         result = integerPower(base, exponent);
  15.  
  16.         printf("The power of %ld ^ %ld is %ld\n",base, exponent, result );
  17.  
  18.         return 0;
  19.  
  20. }
  21.  
  22. long integerPower( long base, long exponent)
  23. {
  24.         long value; /*Risultato della potenza*/
  25.         while ( exponent != 0 ){
  26.                 value *= base;
  27.                 --exponent;
  28.         }
  29.         return value;
  30. }




L'unico problema è che immessi come valori 2 e 3 invece di restituire 8, ritorna

Enter the base and the exponent:
2 3
The power of 2 ^ 3 is 21494048

Possibile che il "^" possa causare problemi? :-|

Come al solito critiche, consigli, miglioramenti son ben accetti!

Hola :rofl:

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6379
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 16:43
Giovedì, 29/10/2015
value non è inizializzato


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 17:15
Giovedì, 29/10/2015
Codice sorgente - presumibilmente C#

  1. long integerPower( long base, long exponent)
  2. {
  3.         long value=base; /*Risultato della potenza*/
  4.         while ( exponent != 0 ){
  5.                 value *= base;
  6.                 --exponent;
  7.         }
  8.         return value;
  9. }



If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6379
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 17:20
Giovedì, 29/10/2015
Testo quotato

Postato originariamente da Ultimo:

Codice sorgente - presumibilmente C/C++

  1. long value=base;




No ... semmai

Codice sorgente - presumibilmente C/C++

  1. long value=1;




Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 17:22
Giovedì, 29/10/2015
Testo quotato

Postato originariamente da nessuno:

Testo quotato

Postato originariamente da Ultimo:

Codice sorgente - presumibilmente C/C++

  1. long value=base;




No ... semmai

Codice sorgente - presumibilmente C/C++

  1. long value=1;





si si giusto, :k:


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 20:22
Giovedì, 29/10/2015
Se uno passasse un valore negativo in exponent si finirebbe in un ciclo non infinito ma quasi, con valori in uscita fuori controllo, o no? Non sarebbe meglio così?

Codice sorgente - presumibilmente C++

  1. long integerPower( long base, unsigned long exponent ) {
  2.     long value = 1; // Risultato della potenza
  3.     while( exponent-- ) value *= base;
  4.     return value;
  5. }



ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6379
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:09
Giovedì, 29/10/2015
No, così non risolvi, anzi ...

Devi fare semplici considerazioni matematiche ... ovviamente avrai un risultato double ...

Codice sorgente - presumibilmente C#

  1. double Power( long base, long exponent )
  2. {
  3.         int sign=(exponent<0);
  4.         double value = 1.0; // Risultato della potenza
  5.         exponent=sign?-exponent:exponent;
  6.         while( exponent-- ) value *= base;
  7.         if(sign) value=1.0/value;
  8.     return value;
  9. }



Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 13:07
Venerdì, 30/10/2015
Be', sì, così "tratti" anche gli esponenti negativi. Nel post propostoci, dal procedimento impiegato, sembrava che l'interesse fosse solo verso gli esponenti positivi.

Edit: allora potrebbe anche essere...

Codice sorgente - presumibilmente C#

  1. double Power( long base, long exponent ) {
  2.     double value = 1.0; // Risultato della potenza
  3.     int inc = exponent > 0 ? -1 : 1;
  4.     for( ; exponent; exponent+=inc ) value *= base;
  5.     return inc<0 ? value : 1.0/value;
  6. }



Non so se cambi qualcosa in termini di efficienza (non credo proprio), però siccome il mio PC ha uno schermo 1024x600 quelle due righe di codice in meno sono molto comode. :asd:

Ultima modifica effettuata da AldoBaldo il 30/10/2015 alle 13:46


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6379
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 14:26
Venerdì, 30/10/2015
Il concetto fondamentale è che i risultati siano corretti ... se vuoi risparmiare righe, puoi scrivere la mia precedente così

Codice sorgente - presumibilmente C#

  1. double PowerS( long base, long exponent )
  2. {
  3.         double value = 1.0;
  4.         int sign = (exponent<0) ? -(exponent*=-1) : 0;
  5.         while( exponent-- ) value *= base;
  6.         return sign ? 1.0/value : value;
  7. }



Magari risulterà meno chiara ma è uguale ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote