Page 204

3.7 Macros int impar (int a);

1 2 3 4 5 6 7 8 9

int par (int a) { if (a==0) return 1; else return ( impar (a-1) ); }

10 11 12 13 14 15 16 17

int impar (int a) { if (a==0) return 0; else return (par (a-1)); }

La primera l´ınea es una declaraci´ on anticipada de la funci´on impar , pues se usa antes de haber sido definida. Con la declaraci´ on anticipada hemos ((adelantado)) la informaci´on acerca de qu´e tipo de valores aceptar´ a y devolver´ a la funci´on. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . · 211 Dibuja el estado de la pila cuando se llega al caso base en la llamada recursiva impar (7). ............................................................................................. La declaraci´ on anticipada resulta necesaria para programas con recursi´on indirecta, pero tambi´en la encontrar´ as (o usar´ as) en programas sin recursi´on. A veces conviene definir funciones en un orden que facilite la lectura del programa, y es f´acil que se defina una funci´on despu´es de su primer uso. Pongamos por caso el programa ordena.c en el que hemos implementado el m´etodo de ordenaci´ on por fusi´ on: puede que resulte m´as legible definir primero mergesort y despu´es merge pues, a fin de cuentas, las hemos desarrollado en ese orden. De definirlas as´ı, necesitar´ıamos declarar anticipadamente merge: ordena.c 1

#include <stdio.h>

2 3

#define TALLA 100

4

void merge(int v[], int inicio1, int final 1, int final 2) ; // Declaraci´ on anticipada.

5 6 7 8 9 10 11 12 13 14 15 16

void mergesort(int v[], int inicio, int final ) { if (final - inicio == 0) return; else { mergesort ( v, inicio, (inicio+final ) / 2 ); mergesort ( v, (inicio+final ) / 2 + 1, final ); merge( v, inicio, (inicio+final ) / 2, final ) ; // Podemos usarla: se ha declarado antes. } }

17 18 19 20

void merge(int v[], int inicio1, int final 1, int final 2) // Y ahora se define. { ...

3.7.

Macros

El preprocesador permite definir un tipo especial de funciones que, en el fondo, no lo son: las macros. Una macro tiene par´ ametros y se usa como una funci´on cualquiera, pero las llamadas no se traducen en verdaderas llamadas a funci´on. Ahora ver´as por qu´e. Vamos con un ejemplo: 198

Introducci´ on a la Programaci´ on con C

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c  

Advertisement