Implementamos paso a paso la función power en C: desde el boilerplate con stdio.h y el prototipo, hasta el for loop que multiplica la base por sí misma y el uso de printf para validar resultados. Verás cómo escribir código corto, claro y reutilizable, con buenas prácticas como declarar funciones arriba, evitar hardcodear valores y retornar el dato correcto.
¿Qué construimos y por qué es útil en C?
Creamos una función entera que calcula potencias mediante multiplicaciones sucesivas. Se declara su prototipo arriba para que el compilador reconozca su existencia, se define debajo de main, y se prueba con un ciclo que imprime 2 elevado a distintos exponentes.
Librería estándar: se usa <stdio.h> para printf.
Prototipo de función: declarar arriba avisa al compilador que la función existe.
Variables auxiliares: i como contador y p como acumulador del resultado.
Ciclo for: i++ para iterar hasta cumplir la condición.
Formato de salida: printf con %d y salto de línea \n.
Tipo y retorno: return type int y return del valor calculado.
Buena práctica: evitar quemar valores, parametrizar base y exponente.
Cierre de programa: return 0 al final de main.
¿Cómo se declara y define la función power?
Primero, el prototipo para que el compilador no marque error cuando vea llamadas a la función antes de su definición.
¿Qué hace el prototipo de función?
Indica nombre, parámetros y tipo de retorno.
intpower(int base,int n);
¿Cómo funciona el algoritmo iterativo?
Multiplica la base por sí misma n veces. p inicia en 1 para respetar que toda base a la 0 vale 1.
intpower(int base,int n){int i, p; p =1;for(i =1; i <= n; i++){ p = p * base;}return p;}
Inicialización: p = 1 garantiza que base^0 sea 1.
Iteración controlada: i va de 1 a n, realizando n multiplicaciones.
Acumulación: p = p * base guarda el progreso de la potencia.
Retorno correcto: se retorna p, que es el resultado esperado.
Además, se explica el concepto matemático clave: una potencia tiene base y exponente. Ejemplo: 2^3 es 2 por 2 por 2, que da 8.
¿Cómo se prueba con un ciclo for y printf?
Se recorre una serie de exponentes y se imprime el exponente n junto al resultado de power(2, n). Así verificas desde n=0 hasta un límite.
¿Qué imprime el programa?
El siguiente main itera y muestra resultados legibles.
#include<stdio.h>intpower(int base,int n);intmain(void){int i;for(i =0; i <=10; i++){printf("n es igual a %d, el resultado de la potencia es %d\n", i,power(2, i));}return0;}
Ejemplos esperados con base 2:
n=0: resultado 1.
n=1: resultado 2.
n=2: resultado 4.
n=3: resultado 8.
n=8: resultado 256.
¿Te gustaría extenderlo a otras bases o rangos de n? Prueba cambios y cuéntame en comentarios qué resultados obtuviste y qué dudas surgieron.
Esta bien que utilices el while en vez del for, digo, para practicar, pero como sabemos cuantos van a ser las veces que vamos a iterar el bucle, no tiene mucho sentido usarlo
Primero que nada debemos mencionar que como buena practica declaramos las funciones arriba del main y abajo de este las declaramos para darle más orden. Es decir, arriba solo la nombramos con sus parametros y abajo con su codigo completo.
Para llamar una función escribimos su nombre, luego parentesis y los parametros a enviar en caso que los tenga.
Ejemplo de uso:
#include <stdio.h>int power(int base, int n);int main(){ int i;for(i =0; i <10; i++){printf("n = %d El resultado de la potencia = %d\n",i,power(2,i));}return0;}int power(int base, int n){ int i, p; p =1;for(i =1; i <= n; i++){ p = p * base;}return p;}
Lo que hace el profesor es una convención de C, pero también puedes declararlas e inicializarlas por supuesto.
Hay que decir que en C cuando estas trabajando con varios módulos de códigos tendrás que generar dos archivos:
Un fichero de cabecera(header) de extensión .h
Un fichero de implementación de extensión .c
En los ficheros de cabecera lo que harás será declarar los prototipos de la función y en los ficheros de implementación se escribe los cuerpos de nuestras funciones.
Las funciones se deben declarar en la parte superior junto con las variables, ya que sirve para que el compilador sepa que esa función existe y si se usa mas adelante en el código sepa que es.
Siempre que se escribe código se debe decir que variables son las que se van a retornar, sino va a tomar el primer dato que se encuentre.
Buena explicación de cómo funcionan las potencias pero se te olvidó que TODO número elevado a n potencia SIEMPRE comienza elevándose por el exponente CERO (0), tal cual como aparece en tu código, en la primera iteración el exponente cero (2⁰) es MENOR (i =1 > n = 0) que la condición del for, por lo tanto en esta primera vuelta no se cumple la condición y da 1 porque la variable está inicializada en 1 al inicio de la función. Podrá ser un dato poco interesante porque en la práctica nunca elevamos el exponente a la cero pero tuve que ver la explicación dos veces para entender cómo funciona ya que hasta ahora no había entendido porque todo número elevado a la cero siempre daba uno y el código que escribiste en la función de la potencia lo explica perfectamente bien.
Agregué al código la posibilidad de elegir la base y el exponente. Ademas, trabajé con un ciclo while, que me resulta mas cómodo para este tipo de operaciones.
#include <stdio.h>int power(int base, int n);int main(){ int i;printf("Eliga la base para la potencia: ");scanf("%d",&i); int p;printf("Ahora, elija el exponente: ");scanf("%d",&p);printf("El numero elegido es %d, el exponente %d, por lo tanto el resultado de la potencia es %d\n", i, p,power(i, p));return0;}int power(int base, int e){ int i =1, result =0;while(i<e){if(result<base){ result = base * base;}else{ result = result * base;} i++;}return result;}```
La declaración de función se requiere solamente para evitar la generación de errores al compilar, solo en algunos casos, al no considerar el orden en que se definen las funciones. Veamos ejemplos para comprender:
#include <stdio.h>
void repetir_potencia(int base, int pot1, int pot2) {
for (int i = pot1; i <= pot2; i++)
printf("%d elevado a la %d es igual a %d\n", base, i, potencia(base, i));
}
int potencia(int base, int ex) {
if (base == 0 && ex == 0) {
printf("Error: base y potencia iguales a cero!\n");
return -1;
}
if (ex < 0) {
printf("Error: potencia menor a cero!\n");
return -2;
}
int result = 1;
while (ex--)
result *= base;
return result;
}
int main() {
int t;
t = potencia(0, 0);
t = potencia(0, -1);
int b = 3, p = 3;
t = potencia(b, p);
printf("%d elevado a la %d es igual a %d.\n", b, p, t);
repetir_potencia(2, 0, 4);
return 0;
}
En el ejemplo anterior se genera error al compilar debido a que la función llamada (potencia) está definida después de la función llamadora (repetir_potencia). Si se intercambia el orden de sus definiciones el error desaparece.
Los anterior evidencia que toda función llamada debe definirse antes de la función llamadora y esto suele ser un dolor de cabeza en casos en que se incrementa la cantidad de funciones que se llaman entre sí. La solución es sencilla: declarar todas las funciones al comienzo y posteriormente definirlas en cualquier orden. Ya no se presentará dicho problema.
#include <stdio.h>
void repetir_potencia(int, int, int);
int potencia(int, int);
void repetir_potencia(int base, int pot1, int pot2) {
for (int i = pot1; i <= pot2; i++)
printf("%d elevado a la %d es igual a %d\n", base, i, potencia(base, i));
}
int potencia(int base, int ex) {
if (base == 0 && ex == 0) {
printf("Error: base y potencia iguales a cero!\n");
return -1;
}
if (ex < 0) {
printf("Error: potencia menor a cero!\n");
return -2;
}
int result = 1;
while (ex--)
result *= base;
return result;
}
int main() {
int t;
t = potencia(0, 0);
t = potencia(0, -1);
int b = 3, p = 3;
t = potencia(b, p);
printf("%d elevado a la %d es igual a %d.\n", b, p, t);
repetir_potencia(2, 0, 4);
return 0;
}
Le quite la función que se declaro al principio debajo de la biblioteca de pronto porque en la ultima version de C, C23 ya no es necesario, al retirarla funcion de esa zona permitio compilar y lo hizo correctamente.
Supongo que se usa un ciclo for para introducirnos en los ciclos, pero se pudo haber hecho mucho mas sencillo elevando la potencia a la "n"
Ejemplo del código donde escribo 4 funciones:
función putchar que escribe una letra, enviada por argumento
función putstr que escribe un array de letras, enviado por argumento
función power que calcula la potencia de un número, enviando un argumento base y un argumento exponente.
función main donde se ejecuta el programa principal.
Notas:
no utilicé printf, de la libreria stdio.h
no utilicé bucle for sino bucle while
separo las declaraciones de las inicializaciones
#include<unistd.h>voidputchar(char a){write(1,&a,1);}voidputstr(char*a){int i; i =0;while(a[i]!='\0'){putchar(a[i]); i++;}}intpower(int base,int n){int i;int resultado; i =0; resultado =1;while(i++< n){ resultado *= base;}return(resultado);}intmain(void){int i; i =0;while(i <4){putstr("i = ");putchar('0'+ i);putstr(" resultado de la potencia = ");putchar('0'+power(2,i));putchar('\n'); i++;}return(0);}
resultado
i =0 resultado de la potencia =1i =1 resultado de la potencia =2i =2 resultado de la potencia =4i =3 resultado de la potencia =8
Con el código que está en los archivos y enlaces no da el resultado que debería, está un 0 en vez de un 1, les paso el código con la función funcionando correctamente y unos pequeños cambios😄
#include <stdio.h>int power(int base, int n);int main(){ int i, n =2;for(i =0; i <10; i++){printf("%d ^ %d = %d\n",n , i,power(n,i));}return0;}int power(int base, int n){ int i, p; p =1;for(i =1; i <= n; i++){ p = p * base;}return p;}
¡Hola! Les comparto una bella implementación recursiva :) Aquí el Repl.
#include<stdio.h>intnumberPower(unsignedint base,unsignedint exponente){if(exponente ==0)return1;if(exponente ==1)return base;return base *numberPower(base, exponente -1);}intmain(void){unsignedint base;unsignedint exponente;int resultado;printf("Ingresa la base:\n");scanf("%u",&base);printf("Ingresa el exponente:\n");scanf("%u",&exponente); resultado =numberPower(base, exponente);printf("\nEl resultado es: %d", resultado);return0;}