[c]programma $a^b$

Kashaman
Salve ragazzi, per esercizio, sto cercando di scrivere un programma in C che mi consente di calcolare , preso in input in intero $a$ , ed un $n>=0$ mi restituisca $a^n$.
ecco il codice
/* Funzione potenza , definizione*/
long  int potenza(int a, int i) {
    if (i<0) printf("Indice di potenza non accettata!\n"); 
    else {
    int k=1 ;
    long int pot=1;
    while (k<=i) {
          pot=pot*a;
          ++k; }
      return pot ; };
      }
      /* corpo del main() */
main()
{ 
      long int a,n,po;
      
      do {
      printf("Enter a\n");
      scanf ("%d",&a);
      printf("Enter n\n");
      scanf("%d",&n);
      po=potenza(a,n);
      printf("%d^%d = %d" , a,n,po); 
      } while (a!=-1); 
}

C'è un problema, al momento della compilazione se $a,n$ sono positivi, non ci sono problemi, ma se immetto ad esempio $a=2$ e $n=-3$ mi parte la prima istruzione dell'if seguita da una cosa del genere
$2^(-3)=4206635$. Dove è il problema? Non riesco a vederlo, grazie mille.

Risposte
Rggb1
"Kashaman":
$2^(-3)=4206635$. Dove è il problema?

Semplicemente la funzione ritorna un long che però nessuno ha inizializzato, e quindi il risultato è impredicibile.

Sposta la dichiarazione della variabile locale pot, dal secondo ramo dell'if all'inizio della funzione, ed aggiungile una assegnazione iniziale (pe. a zero).

Kashaman
Ciao Rggb , dici di modificare la funzione più o meno cosi?
/* Funzione potenza , definizione*/
long  int potenza(int a, int i) {
    long int pot=1;
    if (i<0) printf("Indice di potenza non accettata!\n"); 
    else {
    int k=1 ;
    while (k<=i) {
          pot=pot*a;
          ++k; }
      return pot ; };
      }

Il problema sembra permanere.

Rggb1
Eh si, perché anche l'istruzione return è dentro il secondo ramo dell'if. Mettila alla fine della funzione.

Kashaman
No Rggb , mi dava errore sempre, anche seguendo i tuoi consigli.
ho risolto così
/* Funzione potenza , definizione*/
long  int potenza(int a, int i) {
    int k=1 ;
    long int pot=1;
    while (k<=i) {
          pot=pot*a;
          ++k; }
      return pot ; 
      }
      /* corpo del main() */
main()
{ 
      long int a,n,po;
      
      do {
      printf("Enter a\n");
      scanf ("%d",&a);
      printf("Enter n\n");
       scanf("%d",&n);
      if (n<0) printf("indice di potenza non accettata!\n") ;else {
      po=potenza(a,n);
      printf("%d^%d = %d\n" , a,n,po);  }
      } while (a!=-1); 
}

anche se non sono pienamente soddisfatto visto che ho agito sul programma e non sulla funzione

lordb
Ti ricordo che se includi la libreria hai già pronta la funzione
pow(double base,double exp)

Kashaman
"lordb":
Ti ricordo che se includi la libreria hai già pronta la funzione
pow(double base,double exp)

ti ringrazio lordb, lo sapevo. A me comunque interessava programmarlo da zero, graize mille lo stesso :-)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.