Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. 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:


Io oso tutto ciò che è degno di un uomo, chi osa di più non lo è.
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
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 ...
PM Quote
Avatar
Ultimo (Member)
Expert


Messaggi: 513
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. }



Ultimo (Hai voluto la bicicletta ? ....)

Studiare LINQ, WPF, ASP.NET MVC, Entity Framwork, C#, Blend, XAML, Javascript, HTML5, CSS .....(tanta roba)

https://www.dropbox.com/s/c2aots5x4urgbhf/setup_game_sudoku ...
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
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 ...
PM Quote
Avatar
Ultimo (Member)
Expert


Messaggi: 513
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:


Ultimo (Hai voluto la bicicletta ? ....)

Studiare LINQ, WPF, ASP.NET MVC, Entity Framwork, C#, Blend, XAML, Javascript, HTML5, CSS .....(tanta roba)

https://www.dropbox.com/s/c2aots5x4urgbhf/setup_game_sudoku ...
PM Quote
Avatar
AldoBaldo (Member)
Expert


Messaggi: 345
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. }



Ma cosa vuoi che ne sappia? Io ci gioco, col codice, mica ci lavoro!
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
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 ...
PM Quote
Avatar
AldoBaldo (Member)
Expert


Messaggi: 345
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


Ma cosa vuoi che ne sappia? Io ci gioco, col codice, mica ci lavoro!
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
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 ...
PM Quote