Newsgroup: it.comp.lang.c
Titolo: Elevamento a potenza

Salve a tutti,
avrei bisogno di una mano con una funzione che sto scrivendo il cui 
scopo e' l'elevazione a potenza. Questa funzione si serve di un'altra 
funzione che ho scritto che esegue la moltiplicazione (e che funziona).
Non sono diventata pazza: non riscrivo le operazioni per puro piacere, 
ma si tratta di un progetto per l'esame di Programmazione. La 
particolarita' di queste funzioni e' che devono essere ricorsive e gli 
operandi possono essere solo incrementati o decrementati di una unita'.
La funzione che ho scritto e' questa: 
extern int potenza(int base, int esponente)
{
	int i, 		/* variabile di controllo del loop */
           risultato = 0;	/* variabile che conterra' il risultato */
	risultato = base;							
 
	if (esponente == 0)       	
		risultato = 1; 
	else if (esponente == 1)  
     		risultato = base;
	else if (base == 0)
		risultato;
	else					
		for (i = 1; i < esponente; i++)	
			risultato = moltiplicazione(base, risultato); 
     return(risultato);
}
Purtroppo non funziona a dovere: dove sbaglio?
P.S.: il professore vuole che le funzioni siano ricorsive, questa puo' 
essere considerata ricorsiva?
Grazie mille per l'attenzione
-- 
Monica --  IAFa Telecom #187
UIN 55084330
"Se la vita ti sorride, ha una paresi."
                             D'Alcatraz

 
Facciamo cosi': io ti faccio una funzione che fa le potenze e poi per la 
ricorsione ci pensi tu, dato che e' un tuo esercizio :)
int pot (int base, int esp){
int ris;
if (esp==0)
	ris=1;
if (esp==1)
	ris=base;
ris=base;
while (esp-->1)
	ris=ris*base;
return (ris);
}
Spero ti sia utile,
Maldoror.

 essere considerata ricorsiva?
No :)
Una soluzione ricorsiva NON completa perche' non c'e' il passo base, ma come 
esempio e' chiaro:
int potenza(int valore, int exp) {
    return valore * potenza(valore, exp-1)
}
Se poi anche al moltiplicazione la devi fare ricorsiva, la cosa da fare e' 
analoga, solo che al posto del '*' usi il '+' :)
Mi ricorda quando 'giocavo' con le funzioni primitive ricorsive per il 
laboratorio di metodi 1... solo che li l'operazione fondamentale che avevo 
a disposizione era l'incremento :P
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

 }
E invece facciamo che per farti bello con una ragazza eviti di risponderle
con una funzione sbagliata!!
La tua funzione richiamata con il valore 0 come esponente restituisce il
valore di base e non 1.
Forse con questa funzione le cose vanno un po' meglio...
int Potenza (int base, int esponente)
{
int risultato;
if (esponente == 0)
   {
   risultato = 1;
   }
else if (esponente == 1)
   {
   risultato = base;
   }
else
   {
   risultato = base * Potenza (base , (esponente-1));
   }
return (risultato;
}
Questa funzione e' corretta e anche ricorsiva.
Scusa Molli, ma che cosa significa la tua firma?
Bye
GIGI
--------------------------------
Inviato via 
http://usenet.libero.it

Il 18 Apr 2003, 08:53, 
luco...@despammed.com
 (GIGI) ha scritto:
Scusa Molli non avevo letto che puoi solamente utilizzare l'operatore di
incremento unitario.
int Potenza (int base, int esponente)
{
int risultato;
int i, j
if (esponente == 0)
   {
   risultato = 1;
   }
else
   {
   risultato = 0;
   for ( i = 0 ; i < Potenza (base , (esponente-1)) ; i++)
      {
      for ( j = 0 ; j < base ; j++)
         {
         risultato++;
         }
      }
   }
return (risultato;
}
Penso che questa rispetti meglio la richiesta del tuo professore.


On  Fri,  18  Apr  2003  07:08:46 GMT, 
luco...@despammed.com
 (GIGI)
Questa  e'  un'ulteriore  evoluzione,  con  i  segni  degli  operandi
corretti. Funziona solo con operandi senza segno positivi.
L'altra  versine  avrebbe  dei  problemi  se se passassi un esponente
negativo.
unsigned int Potenza ( unsigned  int base,  unsigned  int  esponente)
{
unsigned  int risultato;
unsigned int i, j, overflow;
overflow = 0;
if (esponente == 0)
   {
   risultato = 1;
   }
else
   {
   risultato = 0;
   for  (  i  =  0  ;  i  <  Potenza  (base  ,  (esponente-1)) ; i++)
      {
      for ( j = 0 ; j < base ; j++)
         {
         risultato++;
         }
      }
   }
if  ((overflow  ==  1)   &&   (   ((int)   (risultato))   ==   -1   )
	{
	/* Situazione di errore                     */
             /* stampare un messaggio di errore */ 
	}
return (risultato;
}
Bye 
GIGI
-- 
   THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
visit my home page:
http://web.tiscali.it/KilometroZero

 a disposizione era l'incremento :P
Ah, l'informatica! :p


 Spero ti sia utile,
Senza dubbio. Grazie ancora!


 Scusa Molli, ma che cosa significa la tua firma?
IAFa Telecome? Sono la 187esima IAFa (it.arti.fantasy) e come ben sai la 
Telecom ha quel meraviglioso strumento di tortura che e' il 187 :)
UIN e' il mio numero di icq
La frase diciamo che esprime bene quello che sento ora... ma mai quanto 
questa (prego osservare :p):
-- 
Monica --  IAFa Telecom #187
-Ho visto una luce in fondo al tunnel...
-E' da dove siamo entrati.

 negativo.
Non ci dovrebbero essere perche' prima faccio un controllo sui numeri 
(devono essere naturali)
Cosi', giusto se avete la curiosita', questo e' il link al testo del 
progetto: 
www.sti.uniurb.it/bernardo/teaching/prog_elab/progetto-2003-
giugno.html
Grazie ancora
-- 
Monica -- IAFa Telecom #187
UIN# 55084330


correttamente (credo)...
Tu si, ma Maldoror no.
La mia critica si riferisce a quando a scritto lui.


giugno.html
Non  riesco  ad  accedere  alla  pagina,  scarico  solamente  qualche
carattere, ma poi nulla altro.
Forse il file ha qualche errore di sintassi?
Senz'offesa, ma ho dato un'occhiata all'home page del tuo professore,
mi pare un po' megalomane. Adesso sto scaricando il curriculum,  sono
curioso di sapere che cosa ha combinato nella vita...


 Forse il file ha qualche errore di sintassi?
Scrivere una libreria ANSI C contenente cinque funzioni che realizzano
rispettivamente le operazioni di addizione, sottrazione, moltiplicazione,
divisione, ed elevamento a potenza per due numeri naturali, sotto i seguenti
vincoli:
  a.. le cinque funzioni richieste debbono preventivamente effettuare gli
opportuni controlli per garantire che i due numeri su cui esse operano siano
numeri naturali e che il risultato sia ben definito;
  b.. la parte di calcolo vero e proprio di ciascuna funzione richiesta
(cioè la parte successiva ai controlli) deve essere ricorsiva;
  c.. gli unici operatori aritmetici ANSI C utilizzabili per implementare le
cinque funzioni richieste sono gli operatori unari di incremento e
decremento di una unità.

 
Si ma dai non te la prendere, non cerco mica di rubarti la giovane :) 
Eheheheheheh!
Mi scuso per l'imperfezione (che cmq si fa presto a correggere); ieri 
ero un po' cotto!!
Saluti,
Maldoror.

 wrote:
Grazie per il testo Tommy.


 mi pare un po' megalomane. 
E perche' mi dovrei offendere? Odio cordialmente quell'uomo :)


 La mia critica si riferisce a quando a scritto lui.
L'avevo capito, era per far presente che cmq quella parte l'avevo gia' 
risolta.
Ad ogni modo, do l'annuncio che ho finito il programma :D
Grazie, grazie e ancora grazie a tutti :*
-- 
Monica -- IAFa Telecom #187
UIN# 55084330
