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
http://www.cplusplus.com/reference/clibrary/cmath/pow/
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
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
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);
}
}
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.
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
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
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
Me temo que tenemos la misma practica para entregar el lunes.. Pero no se te olvida declarar la funcion leeNumero????
JeJe, si ya conseguí hacerlo con la función leeNumero y con la aportación de Oblivi0n
¿Estas en la ETSI?
Pero esta función de potencia no puede hacer potencias de número negativo.
Yo una vez hice este ejemplo, un poco sucio, pero que te lo comparto para ver si te sirve:
double potencia (double base, int exp)
{
double dResult;
if ((base != 0) && (exp == 0))
dResult = 1;
else if ((base == 0) && (exp > 0))
dResult = 0;
else if ((exp < 0) && (base != 0))
dResult = 1 / potencia (base, -exp);
/* else if ((exp == 0) && (base == 0)) {
double num = numeric_limits<double>::quiet_NaN();
}*/
else {
for (dResult = 1; exp > 0; exp--)
{
dResult *= base;
}
}
return dResult;
}
En principio debería permitirte hacer potencias de base positiva y negativa, y de exponente positivo y negativo.
No sé si sirve con exponentes en fracciones.
EN el caso de la potencia indeterminada 00 (cero elevado a cero) aún no lo había resuelto, pero se puede utilizar una plantilla numeric_limits para invocar la función miembro estática, 'quiet_NaN()', o hacer un return 0.0 / 0.0.
si no queres usar las math podes hacer lo siguiente
#include<stdio.h>
main(){
int potencia=1,base,exponente,i;
printf("ingrese numero base\n");
scanf("%i", &base);
printf("ingrese exponente\n");
scanf("%i", &exponente);
for(i=0;i<exponente;i++){
potencia=potencia*base;
}
printf("la potencia es: %i\n" , potencia);
}