Está en la página 1de 13

Funciones

Un programa 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.

ct 3 : Reconocimiento Unidad I

ara con un nombre, precedido del tipo de valor que retorna y una lista de argumentos encerrados entre parntesis. El anterior con

Su respuesta :
Funcin
Respuesta correcta

ct 3 : Reconocimiento Unidad I

El valor que debe devolver una funcin se indica con la


palabra
Su respuesta :
return
Respuesta correcta

ct 3 : Reconocimiento Unidad I

Para realizar comentarios dentro de los programa en lenguaje C, utilizamos ?

Su respuesta :

/* y */, //
Correcta
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;
}

ct 3 : Reconocimiento Unidad I

En la sentencia if, el programa que muestra por pantalla ?

Su respuesta :
El numero es par
Respuesta correcta

ct 3 : Reconocimiento Unidad I

switch(var int o char)


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 ?
Su respuesta :
default
Respuesta correcta

ct 3 : Reconocimiento Unidad I

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 ?

Su respuesta :
10 veces
Correcta
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 posen 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.

ct 3 : Reconocimiento Unidad I

de acuerdo con la lectura anterior el concepto de recurso es:

Su respuesta :
cuando una funcion se llama a si misma
Respuesta correcta

ct 3 : Reconocimiento Unidad I

/* 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:

Su respuesta :
24
Correcta
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);
}

ct 3 : Reconocimiento Unidad I

cual es el operador que utilizamos para trabajar con punteros

Su respuesta :
(&)operador de direccion
Respuesta correcta

ct 3 : Reconocimiento Unidad I
int X =15;int*ptrX; ptrX =&X;
ptrX es:

Su respuesta :
un puntero a X

Correcta

También podría gustarte