Вы находитесь на странице: 1из 13

Funciones Un programa en el lenguaje C est formado por un conjunto de funciones que al menos contiene la funcin main.

Una funcin se declara con el nombre de la funcin precedido del tipo de valor que retorna y una lista de argumentos encerrados entre parntesis. El cuerpo de la funcin est formado por un conjunto de declaraciones y de sentencias comprendidas entre llaves. Veamos un ejemplo de utilizacin de funciones: #include <stdio.h> #define VALOR 5 #define FACT 120 int fact_i ( int v ) { int r = 1, i = 0; while ( i <= v ) { r = r * i; i = i + 1; } return r; } int fact_r ( int v ) { if ( v == 0 ) return 1; else return v * fact_r(v-1); } main()

{ int r, valor = VALOR; if ( (r = fact_i(valor)) != fact_r(valor) ) printf("Codificacin errnea!!.\n"); else if ( r == FACT ) printf("Codificacin correcta.\n"); else printf("Algo falla!!.\n"); } Se definen dos funciones, fact_i y fact_r, adems de la funcin main. Ambas toman como parmetro un valor entero y devuelven otro entero. La primera calcula el factorial de un nmero de forma iterativa, mientras que la segunda hace lo mismo de forma recursiva.

Todas las lneas que comienzan con el smbolo # indican una directiva del precompilador. Antes de realizar la compilacin en C se llama a un precompilador cuya misin es procesar el texto y realizar ciertas sustituciones textuales. Hemos visto que la directiva #include incluye el texto contenido en un fichero en el fuente que estamos compilando. De forma parecida #define nombre texto, sustituye todas las apariciones de nombre por texto. As, en el fuente, la palabra VALOR se sustituye por el nmero 5. El valor que debe devolver una funcin se indica con la palabra return. La evaluacin de la expresin debe dar una valor del mismo tipo de dato que el que se ha definido como resultado. La declaracin de una variable puede incluir una inicializacin en la misma declaracin. Se debe tener muy en cuenta que en C todos los argumentos son pasados 'por valor'. No existe el concepto de paso de parmetros 'por variable' o 'por referencia'. Veamos un ejemplo: int incr ( int v ) { return v + 1; } main() { int a, b; b = 3;

a = incr(b); /* a = 4 mientras que b = 3. No ha cambiado despus de la llamada. */ } En el ejemplo anterior el valor del parmetro de la funcin incr, aunque se modifique dentro de la funcin, no cambia el valor de la variable b de la funcin main. Todo el texto comprendido entre los caracteres /* y */ son comentarios al programa y son ignorados por el compilador. En un fuente C los comentarios no se pueden anidar.

Control de flujo Sentencia if La sentencia de control bsica es if (<e>) then <s> else <t>. En ella se evala una expresin condicional y si se cumple, se ejecuta la sentencia s; si no, se ejecuta la sentencia t. La segunda parte de la condicin, else <t>, es opcional. int cero ( double a ) { if ( a == 0.0 ) return (TRUE); else return (FALSE); } En el caso que <e> no sea una expresin condicional y sea aritmtica, se considera falso si vale 0; y si no, verdadero. Hay casos en que se evala una sola condicin y otros en que se deben evaluar mltiples condiciones.

Setencia switch Se puede programar con un grupo de sentencias if then else anidadas, aunque ello puede ser engorroso y de complicada lectura. Para evitarlo nos puede ayudar la sentencia switch. Su utilizacin es: switch (valor) { case valor1: <sentencias> case valor2: <sentencias> ... default: <sentencias> } Cuando se encuentra una sentencia case que concuerda con el valor del switch se ejecutan las sentencias que le siguen y todas las dems a partir de ah, a no ser que se introduzca una sentencia break para salir de la sentencia switch. Por ejemplo: ver_opcion ( char c ) { switch(c) { case 'a': printf("Op A\n"); break; case 'b': printf("Op B\n"); break; case 'c': printf("Op C\n"); case 'd': printf("Op D\n"); break; default: printf("Op ?\n");

} }

Sentencia while Otras sentencias de control de flujo son las que nos permiten realizar iteraciones sobre un conjunto de sentencias. En C tenemos tres formas principales de realizar iteraciones. La sentencia while (<e>) <s> es seguramente la ms utilizada. La sentencia, o grupo de sentencias <s> se ejecuta mientras la evaluacin de la expresin <e> sea verdadera. long raiz ( long valor ) { long r = 1; while ( r * r <= valor ) r++; return r; } Una variacin de la sentencia while es: do <s> while ( <e> ); en ella la sentencia se ejecuta al menos una vez, antes de que se evale la expresin condicional. Setencia for Otra sentencia iterativa, que permite inicializar los controles del bucle es la sentencia for ( <i>; <e>; <p> ) <s>. La sentencia for se puede escribir tambin como: <i>; while ( <e> ) { <s>; <p>; } El ejemplo anterior se podra escribir como: long raiz ( long valor )

{ long r; for ( r = 1; r * r <= valor; r++ ); return r; }

Recursividad Una funcin recursiva no necesita llamarse a s misma de manera directa. En su lugar, puede hacerlo de manera indirecta como en el siguiente ejemplo: a (formal parameters) b (formal parameters) {{ .. b (arguments); a (arguments); .. } /*fin de a*/ } /*fin de b*/ En este ejemplo la funcin a llama a b, la cual puede a su vez llamar a a, que puede llamar de nuevo a b. As, ambas funciones a y b, son recursivas, dado que se llaman a s mismas de manera indirecta. Sin embargo, el que lo sean no es obvio a partir del examen del cuerpo de una de las rutinas en forma individual. La rutina a, parece llamar a otra rutina b y es imposible determinar que se puede llamar as misma de manera indirecta al examinar slo a a. Pueden incluirse mas de dos rutinas en una cadena recursiva. As, una rutina a puede llamar a b, que llama a c, ..., que llama a z, que llama a a. Cada rutina de la cadena puede potencialmente llamarse a s misma y, por lo tanto es recursiva. Por supuesto, el programador debe asegurarse de que un programa de este tipo no genere una secuencia infinita de llamadas recursivas. Definicin recursiva de expresiones algebraicas: Como ejemplo de cadena recursiva consideremos el siguiente grupo de definiciones:

a. una expresin es un trmino seguido por un signo mas seguido por un trmino, o un trmino solo b. un trmino es un factor seguido por un asterisco seguido por un factor, o un factor solo. Un factor es una letra o una expresin encerrada entre parntesis. A continuacin se codificar una funcin para un programa que lea e imprima una cadena de caracteres y luego imprime "valida" si la expresin lo es y "no valida" de no serlo. Se usan tres funciones para reconocer expresiones, trminos y factores, respectivamente. Aqu se presenta una funcin auxiliar getsymb que opera con tres parmetros: str, length y ppos. Str contiene la entrada de la cadena de cadena de caracteres; length representa el nmero de caracteres en str. Ppos apunta a un puntero pos cuyo valor es la posicin str de la que obtuvimos un caracter la ltima vez. Si pos < length, getsymb regresa el caracter cadena str [pos] e incrementa pos en 1. Si pos > = length, getsymb regresa un espacio en blanco. getsymb (str, length, ppos) char str[]; int length, *ppos; { char c; if (*ppos < length) c = str [*ppos]; else c=; (*ppos) ++; return ( c ); } /* fin de getsymb*/

Para definir una funcin en forma recursiva es necesario especificar:

Caso(s) base: Donde la recursividad se detiene Paso de recursin: Como se define un elemento distinto del base, en trminos de elementos anteriores.

Usualmente los lenguajes de programacin permiten definir funciones de manera recursiva. El lenguaje C es uno de ellos. La definicin recursiva para el factorial sera:
int factorial(int n) { if ((n == 0) || (n == 1)) return(1); else return(n*factorial(n-1)); }

Normalmente las definiciones recursivas pueden expresarse en forma no recursiva. Sin embargo, dependiendo del caso, el resultado puede ser ms confuso. Por ejemplo, una funcin en C que calcula el factorial en forma iterativa sera:
int factorial(int n) { int i, fact = 1; for (i=2; i<=n; i++) fact = fact * i; return(fact); }

Sin embargo, los algoritmos iterativos tienen una ventaja en cuanto al uso de memoria, si se comparan con los recursivos. La recursividad requiere que se guarde el estado de la ejecucin antes de cada llamado recursivo, implicando un gasto considerable de memoria. Es probable que, por esta razn, las versiones recursivas tengan mayores limitaciones al ejecutarse en un computador.

Punteros Cada variable de un programa tiene una direccin en la memoria del ordenador. Esta direccin indica la posicin del primer byte que la variable ocupa. En el caso de una estructura es la direccin del primer campo. En los ordenadores actuales la direccin de inicio se considera la direccin baja de memoria. Como en cualquier caso las variables son almacenadas ordenadamente y de una forma predecible, es posible acceder a estas y manipularlas mediante otra variables que contenga su direccin. A este tipo de variables se les denomina punteros. Los punteros C son el tipo ms potente y seguramente la otra clave del xito del lenguaje. La primera ventaja que obtenemos de los punteros es la posibilidad que nos dan de poder tratar con datos de un tamao arbitrario sin tener que moverlos por la memoria. Esto puede ahorrar un tiempo de computacin muy importante en algunos tipos de aplicaciones. Tambin permiten que una funcin reciba y cambie el valor de una variable. Recordemos que todas las funciones C nicamente aceptan parmetros por valor. Mediante un puntero a una variable podemos modificarla indirectamente desde una funcin cualquiera.

Un puntero se declara de la forma: tipo *nombre; float *pf; PLANETA *pp; char *pc; Para manipular un puntero, como variable que es, se utiliza su nombre; pero para acceder a la variable a la que apunta se le debe preceder de *. A este proceso se le llama indireccin. Accedemos indirectamente a una variable. Para trabajar con punteros existe un operador, &, que indica 'direccin de'. Con l se puede asignar a un puntero la direccin de una variable, o pasar como parmetro a una funcin. void prueba_puntero ( void ) { long edad; long *p; p = &edad; edad = 50; printf("La edad es %ld\n", edad ); *p = *p / 2; printf("La edad es %ld\n", edad ); } void imprimir_string ( char string[] ) { char *p; for ( p = string; *p != '\0'; p++ ) imprimir_char(*p); }

EVALUACION: Marca con una x la respuesta correcta:

1) Se declara con un nombre, precedido del tipo de valor que retorna y una lista de argumentos encerrados entre parntesis. El anterior concepto hace referencia a ? a)include b)Lenguaje C c)void d)Funcin

2) El valor que debe devolver una funcin se indica con la palabra: a)include b)main c)define d)return

3) Para realizar comentarios dentro de los programa en lenguaje C, utilizamos ? a)[ ] b)Funciones c)/* y */, // d){ }

4)

En la sentencia if, el programa que muestra por pantalla, si el valor digitado por usuario es 5? a)Ingrese un numero b)El numero no es par c)El numero es par d)Cero 5)switch(var int o char) { case const1: instruccin(es); break; case const2: instruccin(es); break; case const3: instruccin(es); break; default: instruccin(es); }; En el anterior programa cuando no encuentra el valor de igualdad entonces se ejecutan las instrucciones asociadas a ?

a)break b) switch c)case d)default 6)void main() { clrscr(); // declaracion variables int x=1; // instruccion while while(x<=10) { gotoxy(10, x+3); printf("%d PATO",x); x++; }; getchar(); } }
El programa anterior muestra como resultado cuantas veces la palabra PATO?

a)1 vez b)tres veces c)nueve veces d)10 veces 7) De acuerdo con la lectura anterior el concepto de recurso es: a)devuelva un parametro b)uso correcto de variables c)cuando una funcion se llama a si misma d)aplicable solo con enteros

8)/* Funcin recursiva para clculo de factoriales */ int factorial(int n) { if(n < 0) return 0; else if(n > 1) return n*factorial(n-1); /* Recursividad */ return 1; /* Condicin de terminacin, n == 1 */ } El resultado cuando n vale 4 es: a)10 b)24 c)64 d)cero 9) Cul es el operador que utilizamos para trabajar con punteros? a)El operador > b)El operador = y el operador de direccin (&) c)El operador * y el operador de direccin (<) d)(&)operador de direccin 10) int X =15;int*ptrX; ptrX =&X;
ptrX es:

a)un operador b)tiene un valor diferente de x c)un puntero a X d)variable

Вам также может понравиться