Elevar un número a una potencia en C

Iniciado por eaguel, 21 Noviembre 2012, 09:41 AM

0 Miembros y 1 Visitante están viendo este tema.

eaguel

Hola, bueno días veréis estaba haciendo este programa:

#include <stdio.h>
#include "potencia.h"

int potencia (int num1, int num2);

int main ()
{

int num1 = 0;
int num2 = 0;

potencia (num1, num2);

return 0;
}


int potencia (int num1, int num2)
{

int valor ;

printf ("BASE:\n");
printf ("Introduzca un número no negativo: ");
 scanf ("\n%d", &num1);
printf ("EXPONENTE:\n");
printf ("Introduzca un número no negativo: ");
 scanf ("\n%d", &num2);

 valor = num1 ^ num2;
 printf("%d elevado a %d es %d\n", num1, num2, valor);


return valor;
}


pero no se porque esta expresión no funciona  valor = num1 ^ num2;
¿Me podéis iluminar con vuestra sabiduría ;D?

тαптяα

Tio eres tonto o que?

Para hacer potencias en C tienes la función pow definida en la libreria math.h

Mira los errores que te da tu compilador colega


Ruso_x

Con respecto a lo que ha dicho mi compañero añado:

Busca aqui ;D

http://en.cppreference.com/w/c/numeric/math/pow

Saludos
Saludos

eaguel

El problema esta en que no puedo usar la librería libreria math.h
sino que tengo que usar el archivo .h que me dan que contiene:

#ifndef POTENCIA_H
#define POTENCIA_H

/*Textos a utilizar en la funcion printf*/
#define T_BASE              "BASE:\n"
#define T_EXPONENTE         "EXPONENTE:\n"
#define T_RESULTADO         "%d elevado a %d es %d\n"
#define T_INTRODUZCA_NUMERO "Introduzca un numero no negativo: "

#endif

Oblivi0n

Asi de simple, creo que esto debería de funcionar


#include <stdio.h>
#include "potencia.h"

int potencia (int base, int exponente);

int main(){

int num1,num2;

printf(T_INTRODUZCA_NUMERO);
scanf("%d"&num1); // base
printf(T_INTRODUZCA_NUMERO);
scanf("%d", &num2); // exponente
printf(T_RESULTADO,num1,num2,potencia(num1,num2));
}

int potencia(int base, int exponente){

if(exponente == 0){
return 1;
}else{
return base*potencia(base,expontente-1);
}
}

eaguel

#6
Ahora si funciona pero ¿habría alguna posibilidad de poner los printf en la función potencia sin joderlo todo?, lo he estado intentando y se me cambian los valores.

Oblivi0n

Si, metiendo las variables num1 y num2 en la funcion potencia, no como parametros, en caso de querer usarlas como paramatros, haciendo uso de punteros

eaguel

A ver si me aclaro  :-\  que estoy ya amargao con la porquería esta  :D
He hecho esto:

#include <stdio.h>
#include "potencia.h"

int potencia (int base, int exponente);

int main()
{
int base;
int exponente;

potencia (base,exponente);

return 0;
}


int potencia(int base, int exponente)
{
int num1;
int num2;

        printf (T_BASE);
printf (T_INTRODUZCA_NUMERO);
scanf ("%d", &num1); // base
printf (T_EXPONENTE);
printf (T_INTRODUZCA_NUMERO);
scanf ("%d", &num2); // exponente
printf (T_RESULTADO,num1,num2,potencia(num1,num2));


      if (exponente == 0)
        {
return 1;
}
      else
        {
return base*potencia(base,exponente-1);
}
}

El problema esta en que solo realiza printf y scanf todo el rato , para solucionarlo ¿podría introducir un blucle do-while no?
Pd: Muchas gracias por tu amabilidad y ayuda Oblivi0n

rir3760

Cita de: eaguel en 21 Noviembre 2012, 10:45 AM
El problema esta en que no puedo usar la librería libreria math.h
sino que tengo que usar el archivo .h que me dan que contiene:
#ifndef POTENCIA_H
#define POTENCIA_H

/*Textos a utilizar en la funcion printf*/
#define T_BASE              "BASE:\n"
#define T_EXPONENTE         "EXPONENTE:\n"
#define T_RESULTADO         "%d elevado a %d es %d\n"
...
Honestamente como ejemplo del uso de macros en C es, de parte de tu profesor, uno muy malo.

El objetivo de las macros es hacer el código fuente mas claro y fácil de seguir y, por ello, menos propenso a los errores. Considerando eso ultimo si comparamos:
printf(T_RESULTADO, a, b, c);

printf("%d elevado a %d es %d\n", a, b, c);

Resulta obvio que es mas difícil detectar errores en la llamada que utiliza la macro "T_RESULTADO" que en la que utiliza la literal.

Cita de: eaguel en 21 Noviembre 2012, 12:58 PMEl problema esta en que solo realiza printf y scanf todo el rato , para solucionarlo ¿podría introducir un blucle do-while no?
Correcto, debes cambiar el proceso de uno recursivo a uno iterativo. También hay que cambiar la función eliminando los parámetros y cambiando su tipo de retorno a "void".

El programa con las correcciones:
#include <stdio.h>

void potencia(void);

int main(void)
{
  potencia();
 
  return 0;
}

void potencia(void)
{
  int x;
  int y;
  long pot;
 
  puts("Indica la base:");
  scanf("%d", &x);
 
  puts("Indica el exponente:");
  scanf("%d", &y);
 
  printf("%d^^%d", x, y);
  pot = 1;
  while (y-- > 0)
     pot *= x;
  printf(" == %d\n", pot);
}


Edito: el uso de las macros te toca a ti. En buen plan: yo no las toco ni con un palito.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language