Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: fruz en 4 Abril 2019, 01:37 am



Título: Programación C
Publicado por: fruz en 4 Abril 2019, 01:37 am
Hola! ¿Alguien me puede explicar, línea por línea, lo que hace este programa de ejemplo del libro de Ritchie y Kernighan?

#include <stdio.h>

int power(int m, int n);

/* prueba la función power */
main()
{
   int i;
   
   for (i = 0; i < 10; ++i)
      printf ("%d %d %d\n", i, power(2,i), power (-3,i);
   return 0;
}

/* power: eleva la base a la enésima potencia; n > = 0 */

int power(int base, int n)
{
   int i, p;
   
   p = 1
   for ( i = 1; i < = n; + + i)
      p = p * base
   return p;
}


Título: Re: Programación C
Publicado por: K-YreX en 4 Abril 2019, 04:05 am
Coloca tus códigos entre etiquetas de código GeSHi (puedes seleccionar el lenguaje apropiado en el desplegable que hay encima del cuadro de texto)... :rolleyes:

Código
  1. // incluyes la libreria <stdio.h> para poder usar las funciones que contiene (printf() en este caso)
  2. #include <stdio.h>
  3.  
  4. int power(int m, int n); // prototipo de una funcion <power()> que recibe dos enteros <int> como parametros y devuelve otro entero <int>
  5.  
  6. /* prueba la funcion power */
  7. main() // funcion principal (lo que realmente se ejecuta. PD: Aunque funciona asi es recomendable poner <int main()> ya que devuelve un <int>
  8. {
  9.   int i; // declaras una variable <i> de tipo entero <int>
  10.   for (i = 0; i < 10; ++i) // bucle que empieza asignando 0 a <i>, se ejecuta mientras (i < 10) y en cada vuelta se suma 1 a <i> [(++i) es igual que (i = i+1) y que (i += 1)]
  11.      printf ("%d %d %d\n", i, power(2,i), power (-3,i); // muestra por pantalla 3 enteros, primero <i>, luego 2 elevado a <i> y luego -3 elevado a <i>
  12.   return 0; // devuelve 0, es lo que suele indicar que el programa se ha ejecutado correctamente hasta el final
  13. }
  14. /* power: eleva la base a la enesima potencia; n > = 0 */
  15. int power(int base, int n) // implementas la funcion cuyo prototipo has puesto al principio
  16. {
  17.   int i, p; // declaras dos variables enteras <int> que son <i> y <p>
  18.   p = 1 // asignas a p el valor 1. PD: Has olvidado el ;
  19.   for ( i = 1; i < = n; + + i) // bucle empezando en 1,  e incrementando de 1 en 1 mientras (i <= n)
  20.      p = p * base // asignas a <p> el producto de <p> por la variable <base> (primer parametro de la funcion. Se puede abreviar como p *= base
  21.   return p; // devuelve el valor que tiene <p> al terminar la funcion
  22. }


Título: Re: Programación C
Publicado por: MAFUS en 4 Abril 2019, 16:35 pm
No funcionará. El operador de incremento es ++, no + +. No puede tener espacios en medio.


Título: Re: Programación C
Publicado por: fruz en 4 Abril 2019, 20:49 pm
No entiendo. ¿Cuál es el resultado de printf? Cuando en printf dice "power(2,i)" ¿llama a la fución power?


Título: Re: Programación C
Publicado por: K-YreX en 4 Abril 2019, 22:07 pm
La función <printf()> tiene unos parámetros que cuesta ver si no se conocen. Te dejo  AQUÍ  (http://www.cplusplus.com/reference/cstdio/printf/) un enlace a una página donde puedes ver todo lo relacionado con esa función.

El primer parámetro siempre es una cadena de <char> que puede:
  • Ser literal: Muestra tal cual lo que le pones.
Código
  1. printf("Hello World"); // Salida: Hello World
  • Usar especificadores de formato: Permite mostrar el valor de variables o funciones que devuelven algo.
Código
  1. int a = 3, b = 2;
  2. printf("La suma de %d + %d es %d", a, b, a+b); // Salida: La suma de 3 + 2 es 5
Puedes encontrar todos los especificadores de formato que hay en el enlace que te he dejado antes. Según el tipo de variable que quieres mostrar o literales (como en este caso) tienes que usar un especificador u otro.


Título: Re: Programación C
Publicado por: fruz en 7 Abril 2019, 01:40 am
Lo que yo no entendía era que "power" en printf llama a la función "power" y está regresa el valor. Ahora lo entiendo.
Tengo una duda: ¿Cómo sabe el compilador que se trata de una función y no simplemente de una variable?


Título: Re: Programación C
Publicado por: K-YreX en 7 Abril 2019, 01:50 am
Para que lo entiendas es como que el compilador coge lo que devuelve cada parámetro. Si es una variable simple coge el propio valor, si es una función coge el valor de retorno de la función o si es una operación coge su resultado.


Título: Re: Programación C
Publicado por: fruz en 7 Abril 2019, 02:48 am
Si entiendo bien cuando el programa llega a printf y encuentra "power" se ejecuta la función "power". ¿No podría pasar que lo tome cómo una variable?


Título: Re: Programación C
Publicado por: K-YreX en 7 Abril 2019, 03:04 am
Al estar escrito con unos paréntesis, el compilador sabe que es una función.
Código
  1. int power; // variable power de tipo entero
  2. int power(); // funcion power que retorna un entero

Más que el compilador, el ensamblador, cuando traduce el programa de C a ensamblador ya traduce las instrucciones correspondientes para llamar a la función correspondiente. Eso puedes verlo si te adentras un poco más en las fases de compilación que sufre un código fuente y los ficheros que se generan en cada fase.


Título: Re: Programación C
Publicado por: fruz en 7 Abril 2019, 03:06 am
Mi duda es cómo se sabe en printf que power no es una variable, que es una función.


Título: Re: Programación C
Publicado por: K-YreX en 7 Abril 2019, 03:09 am
Porque así se ha traducido en la compilación del programa. He editado mi mensaje anterior con otra explicación un poco más concreta pero sin entrar demasiado en materia.


Título: Re: Programación C
Publicado por: fruz en 7 Abril 2019, 03:14 am
Si no existiera
   int power()
 
al estar
   int power;

¿printf tomaría "power" como una variable?


 


Título: Re: Programación C
Publicado por: K-YreX en 7 Abril 2019, 03:19 am
Existan las que existan <printf()> toma cada parámetros como lo que es:
Código
  1. int power = 2;
  2. int power(){return 5;};
  3. printf("%d - %d", power, power()); // Salida: 2 - 5
Código
  1. int power = 2;
  2. printf("%d", power()); // ERROR printf() espera una funcion llamada power() que no existe
Código
  1. int power(){return 5;}
  2. printf("%d", power); // ERROR printf() espera una variable power que no existe

No sé si con esto ya queda más claro


Título: Re: Programación C
Publicado por: fruz en 7 Abril 2019, 03:31 am
Ahora entiendo. El hecho de que tenga () lo hace una función y si no tiene es una variable. Perdón por mi ignorancia.