Vous êtes sur la page 1sur 22

Descomposici n Funcional

Elaborado por:
Luis Ernesto Daz Beteta

UNAN-Len
Facultad de Ciencias y Tecnologa
Departamento de computacin

Bibliografa
Enciclopedia del lenguaje C
Francisco Javier Ceballos
Editorial Ra-Ma
C/C++ Curso de programacin, segunda edicin
Francisco Javier Ceballos
Editorial Ra-Ma
Programacin en C, Metodologa, algoritmos y estructura de datos
Luis Joyanes Aguilar, Ignacio Zahonero Martinez
Editorial McGraw Hill

1 http://www.geany.org/

Estructura de un programa en C
Un programa fuente C est formado por una o ms funciones, una funcin es un conjunto de instrucciones
que realizan una tarea especfica. Muchas de las funciones que utilizaremos pertenecen a la biblioteca de C,
por lo tanto ya estn escritas y compiladas. Otras tendremos que escribirlas nosotros mismos cuando
necesitemos ejecutar una tarea que no est en la biblioteca de C. Todo programa debe contener una funcin
nombrada main, como se muestra a continuacin:
int main()
{
//Cdigo
}

Esta funcin main es el punto de entrada de ejecucin de un programa, por tal motivo siempre un programa
en C lleva esta funcin.
El diseo top down de programas, consiste precisamente en encontrar la solucin de un problema mediante la
aplicacin sistemtica de descomposicin del problema en subproblemas cada vez ms simples, aplicando la
mxima de dividir para vencer.
El empleo de esta tcnica de desarrollo de programas, as como la utilizacin nicamente de estructuras
secuenciales, alternativas y repetitivas, nos conduce a la denominada programacin estructurada.
En ocasiones se piensa que todo el proceso se podra haber hecho utilizando solamente la funcin main, lo
cual es cierto. Pero, lo que se pretende es que pueda ver de una forma clara que, en general, un programa C es
un conjunto de funciones que se llaman entre s con el fin de obtener el resultado perseguido, y que la forma
sencilla de resolver un problema es descomponerlo en subproblemas ms pequeos y por lo tanto ms fciles
de solucionar; cada subproblema ser resuelto por una funcin C.
Otro detalle importante es que las funciones que escriba deben ser autnomas, para posteriormente poderlas
utilizar sin dificultades en otros programas. Una funcin es autnoma cuando depende nica y
exclusivamente de sus propios argumentos.
Por ejemplo:
printf(\nValor de a es: %d, a );

No importa lo que se le pase entre parntesis a la funcin, siempre y cuando cumpla con el requisito de lo
que la funcin acepta como argumentos y como logra esta funcin presentar los datos en pantalla es
irrelevante.
Ejemplo de estructuracin de un programa en C
#include <stdio.h>
void EscribirCadena( char *cadena );
int main() {
EscribirCadena("\nHola mundo!!!");
return 0;
}
void EscribirCadena(char *cadena ){
printf("%s", cadena);
}

En el ejemplo podemos observar que nuestro programa consta de:

Directrices del preprocesador

Definiciones y/o declaraciones

Funcin main

Otras funciones
Todos estos elementos mencionados pueden aparecer en orden distinto e incluso no estar en la construcin de
un programa en C.
As mismo una funcin consta de:

Definiciones y/o declaraciones

Sentencias a ejecutar
Algo que si debemos cumplir al escribir un programa en C, es que las definiciones y/o declaraciones en las
funciones deben de realizarse antes de escribir la primer sentencia.
Procederemos a explicar cada una de las partes de un programa C

Directrices del preprocesador


La finalidad de las directrices es facilitar el desarrollo, la compilacin y el mantenimiento de un programa.
Una directriz se identifica porque inicia con el carcter #. Las ms usuales son la directriz de inclusin,
#include, y la directriz de sustitucin #define.
Las directrices son procesadas por el preprocesador de C, que es invocado por el compilador antes de
proceder a la traduccin del programa fuente.

Directriz de inclusi n #include


En general, cuando se invoca a una funcin antes de su definicin , es necesario incluir previamente a la
llamada el prototipo de la funcin (esto se vera con mayor detalle en el apartado de funciones). Como
ejemplo observe la funcin EscribirCadena del programa anterior. La definicin de est escita a continuacin
de la funcin main y la funcin main llama a dicha funcin.
Esto es as para todas las funciones, incluidas las funciones de la biblioteca de C, como printf. Las
declaraciones de las funciones de la biblioteca de C se localizan en los ficheros de cabecera (ficheros con
extensin .h). Estos ficheros generalmente se encuentran en el directorio predefinido include o en el
directorio de trabajo.
Para incluir la declaracin de una funcin de la biblioteca de C, basta con incluir el fichero de cabecera que
la contiene antes de que ella sea invocada. Esto se hace utilizando la directriz #include. Si el fichero de
cabecera se encuentra en el directorio predefinido include, utilizaremos #include <fichero.h>.
Por ejemplo:
#include <stdio.h> /* declaraciones de 1as funciones C estndar de E/S */

Si el fichero se encuentra, en el directorio de trabajo o en el directorio include, utilice #include "fichero.h".

Por ejemplo:
#include "misfunciones.h"

La directriz anterior busca el fichero especificado primero en el directorio de trabajo y si no lo localiza, sigue
la bsqueda en el directorio include.

Directriz de sustituci n #def ine


Mediante la directriz #define identificador valor se indica al compilador, que toda aparicin en el programa
de identificador, debe ser sustituida por valor. Por ejemplo:
#include <stdio.h>
#define MAX 10
int main() {
int i;
for(i=0; i < MAX; i++ )
printf("%d ", i+1);
return 0;
}

Cuando el preprocesador de C procese las directriz del ejemplo anterior, todas las apariciones de MAX en el
programa fuente son sustituidas por el valor 10.

Def iniciones y declaraciones


Una declaracin introduce uno o ms nombres (identificadores) en un programa. Una declaracin es una
definicin, a menos que no haya asignacin de memoria como ocurre cuando se declara una funcin sin
especificar el cuerpo, cuando se define un nuevo tipo, cuando se declara un sinnimo de un tipo o cuando
con una variable definida en alguna parte se utiliza el calificador extern para hacerla accesible.
Toda variable debe ser definida antes de ser utilizada. La definicin de una variable, declara la variable y
adems le asigna memoria. Adems, una variable puede ser inicializada en la propia definicin:
Ejemplo
int nGradosCentigrados = 0; //Se define la variable y se inicializa al valor 0
nt incremento = 6; //Se define la variable y se inicializa al valor 6

La definicin de una funcin, declara la funcin y adems incluye el cuerpo de la misma:


float convertir(int gcent) {
float gfahr;
gfahr = (float)9 / (float)5 * qcent + 32;
return (gfahr);
)

La declaracin o la definicin de una variable, as como la declaracin de una funcin, pueden realizarse a
nivel interno (dentro de la definicin de una funcin) o a nivel externo (fuera de toda definicin de funcin).
La definicin de una funcin, siempre ocurre a nivel externo.

Funci n main
Todo programa C tiene una funcin denominada main. Esta funcin es el punto de entrada al programa y
tambin el punto de salida. Aunque algunos compiladores no requieren que se especifique el tipo retornado
por esta funcin, generalmente int o void, conviene hacerlo porque hay compiladores que dan un mensaje de
aviso (warning) si no se hace; concretamente, los compiladores que incluyen la caracterstica de
comprobacin de tipos. Nos referimos a los compiladores de C++ y a algunos compiladores de C. Es una
buena costumbre indicar explcitamente si la funcin devuelve o no un resultado. Por ejemplo:
int main() {
//...
return 0;
}

El ejemplo anterior indica que cuando la funcin main finalice, devolver un cero. Este valor es devuelto al
proceso que invoc al programa para su ejecucin.
Tambin podemos especificar que no devuelve nada, as:
void main() {
//...
}

Sentencia simple
Una sentencia simple es la unidad ejecutable ms pequea de un programa C. Las sentencias controlan el
flujo u orden de ejecucin. Cuando se escriba una sentencia hay que tener en cuenta las siguientes
consideraciones:

Toda sentencia simple termina con un punto y coma (;).


Dos o ms sentencias pueden aparecer sobre una misma lnea, separadas por una de otra por un
punto y coma.
Una sentencia nula consta solamente de un punto y coma.

Sentencia compuesta o bloque


Una sentencia compuesta o bloque, es una coleccin de sentencias simples incluidas entre llaves - { } -. Un
bloque puede contener a otros bloques. Un ejemplo de una sentencia de este tipo es el siguiente:
{
float gfahr;
gfahr = (float)9 / (float)5 * qcent + 32;
return (gfahr);
)

Funciones
Una funcin es considerada como un micro programa dentro de un programa, una funcin contiene un grupo
de sentencias bajo un mismo nombre con la finalidad de hacer ms fcil la solucin a un problema dado. Es
decir, una funcin es una coleccin independiente de declaraciones y sentencias enfocadas a realizar una
tarea especifica.
Al trabajar con funciones el problema se convierte en problemas ms pequeos y fciles de resolver. Un
programa escrito en lenguaje C consta de varias funciones cada una de las cuales realiza una tarea en
particular.
Intuitivamente hemos venido utilizando ciertas funciones entre ellas la funcin main esta es la funcin
principal del programa.

Declaraci n y definicin de una funcin


Al momento de definir una funcin en lenguaje C se deben de tomar en cuenta los siguientes aspectos:

El lenguaje C se basa en el uso de funciones.

El lenguaje C no permite el uso de procedimientos, slo el uso de funciones. Para emular los
procedimientos se utilizan funciones que no devuelven valor alguno (void).

No se puede definir una funcin dentro de otra funcin, es decir, todas las funciones deben de estar
en el mismo nivel.

Siempre ha de existir la funcin main ya que esta es la funcin que se ejecutar al iniciarse el
programa.

Definicin
La definicin de una funcin consta de la cabecera y del cuerpo de la funcin, la sintaxis es la siguiente:
TipoRetorno NombreFuncin(ParmetrosFormales)
{
[declaraciones]
sentencias
}

TipoRetorno
Indica el valor devuelto por la funcin, puede ser un tipo de dato fundamental o definido por el usuario. Una
funcin no puede retornar un arreglo o una funcin, sino un puntero al arreglo o a la funcin.

NombreFuncin
Es el identificador que indica el nombre de la funcin, cuando al nombre le precede el operador de
indireccin ( * ) indica que la funcin devuelve un puntero.
ParmetrosFormales
Componen la lista de argumentos de la funcin, esta lista es un conjunto de variables con sus tipos. Estos
parmetros reciben los valores de las variables pasadas en la llamada a la funcin.
Ejemplos
void Campana( void ); //Declaracin de la funcin campana

En este ejemplo se declara una funcin llamada Campana la cual no recibe nada y no devuelve nada.

int Suma( int a, int b ); //Declaracin de la funcin suma

En este ejemplo se declara una funcin llamada Suma que recibe dos valores enteros y devuelve un valor
entero,
La definicin de una funcin consiste en escribir la funcionalidad de la misma, en otras palabras. Se
construye el cuerpo de la funcin, el cual esta formado por el conjunto de sentencias que definen lo que hace
la funcin. Tambin puede contener declaraciones de variables, las cuales sern locales a la funcin.
Una funcin puede devolver un valor cuyo tipo se indica en la cabecera, el valor se devuelve por medio de la
sentencia return, cuya sintaxis es:
return[[(] expresin [)]];

Si no se especifica la expresin, la funcin no devolver valor alguno.


A la declaracin de una funcin se le conoce como funcin prototipo. la intencin del prototipo es darle a
conocer al compilador el nombre de la funcin, el tipo de valor devuelto y los parmetros formales de la
misma. El prototipo de una funcin, no define el cuerpo de la misma.
Una funcin no puede ser llamada sin antes ser definida o declarada, esta regla tiene una excepcin la cual se
muestra a continuacin:
#include <stdio.h>
int Suma( int a, int b ) { //definicin de la funcin suma
return( a + b );
}
main(){
int suma;
suma = Suma(5, 4);
printf(\nLa suma es %d\n, suma);
}

Observe que la definicin de la funcin se realiza antes de la llamada, si esto no es as, entonces es necesario
declarar el prototipo de la funcin antes de que sea llamada. Tal y como se muestra a continuacin:

#include <stdio.h>
int Suma( int a, int b ); //Prototipo de la funcin
main(){
int suma;
suma = Suma(5, 4);
printf(\nLa suma es %d\n, suma);
}
int Suma( int a, int b ) { //Definicin de la funcin
return( a + b );
}

Llamada a una funcin


Una funcin es sencillamente un conjunto de sentencias que se pueden llamar desde cualquier punto del
programa. Cuando desde una parte del cdigo se llama a una funcin, el control es pasado a la misma para su
ejecucin; al finalizar la ejecucin de la funcin el control es devuelto al punto donde se realizo la llamada.
En la siguiente figura se muestra como se llama una funcin:

Cuando una funcin es llamada, esta recibe unos valores como argumentos conocidos como parmetros
actuales.

Paso de parmetros a una funci n


Cuando se hace una llamada a una funcin se pueden pasar valores a la misma a travs de los parmetros
actuales (argumentos). Existen dos formas de pasar los parmetros actuales a sus respectivos parmetros
formales y estas son:

Por valor
Por referencia

Para entender mejor que significa por valor o por referencia, vamos a recordar el concepto de variable, una
variable en un programa es algo con un nombre, que contiene un valor que puede variar. El modo en que el
compilador y el enlazador (linker) manejan esto es que asignan un bloque especfico de la memoria dentro de
la computadora para guardar el valor de una variable .
Cuando una variable es declarada le informamos al compilador dos cosas, el nombre de la variable y el tipo
de la variable. Por ejemplo, declaramos una variable de tipo entero llamada k al escribir: int k=2;

Cuando el compilador encuentra la declaracin de la variable k la agrega en una tabla de smbolos, en esa
tabla a la variable se le asocian el valor de la variable y la correspondiente direccin de la memoria en donde
se encuentra la variable.
Entonces tiene sentido decir que hay dos valores asociados con a la variable k , uno es el valor del entero
alojado ah y el otro es la direccin de la localidad de la memoria donde se ha guardado el valor entero,
Por ejemplo:
Podemos asumir que cuando se declara a la variable k, se crea la tabla de smbolos
k
Direccin

Valor

0x4fdfff34

mbito de una variable


Una variable posee un mbito (accesibilidad) dentro de un programa, se entiende por mbito de la variable a
la parte del programa donde la variable puede ser referenciada por su nombre.
Cuando una variable se declara fuera de todo el bloque (fuera de main) se dice que esa variable es global,
una variable global existe y tiene valor desde el principio hasta el final de la ejecucin del programa. Si la
declaracin de la variable se hace dentro de un bloque, el acceso queda limitado al bloque y a los bloques
contenidos dentro de est. En este caso la variable recibe el nombre de local o automtica, este tipo de
variable existe y tiene valor desde donde se declara hasta donde termina el bloque.
En el siguiente ejemplo se muestra el modo de acceso (global o local) de una variable.
/*Modo de uso de una variable*/
#include <stdio.h>
int x = 15; //variable global
void Funcion( void ); //Prototipo
int main()
{
int x = 25; //variable local
printf("\nEl valor de la variable local x es: %d", x); //Acceso a la variable local
Funcion(); //Llamada a la funcion
putchar(\n);
return 0;
}
void Funcion( void ) {
printf("\nEl de la variable global x es: %d", x); //Acceso a la variable global
}

La variable x definida dentro del bloque main es local al mismo, mientras que la variable x definida fuera de
main es global a todo el programa y por ende se puede acceder a ella desde cualquier punto.

Departamento de Computacin

AED

Parmetros por valor


Pasar un parmetro por valor, significa que los parmetros actuales se copiaran a sus respectivos
parmetros formales; es decir, que al pasar un parmetro por valor su contenido se copia en la zona de
memoria donde est ubicado el parmetro formal.
Esta operacin se realiza por defecto cuando se hace la llamada a la funcin, se debe de tener en cuenta que
al pasar los parmetros por valor el contenido del parmetro actual no ser modificado dentro de la
funcin. Esto quiere decir que si el contenido del parmetro formal cambia el cambio no se refleja en el
correspondiente parmetro actual.
Ejemplo:
#include <stdio.h>
void Intercambiar( int a, int b );
int main() {
int a = 5, b = 10;
printf("\nValores antes de la llamada a=%d, b=%d", a, b);
Intercambiar(a, b); //Llamada a la funcin Intercambiar
printf("\nValores despues de la llamada a=%d, b=%d", a, b);
return 0;
}
void Intercambiar( int a, int b )
{
int aux = a;
a = b;
b = aux;
printf("\nFuncin intercambiar a=%d, b=%d", a, b);

}
En el ejemplo anterior se tiene una funcin Intercambiar que recibe (por valor) dos valores enteros, cuando
se manda a llamar a la funcin de la forma Intercambiar(a, b), los contenidos de las variables a y b
(parmetros actuales) son copiados en sus respectivos parmetros formales a y b respectivamente.

Esto quiere decir que dentro de la funcin Intercambiar las variables a y b (parmetros formales de la
funcin) son copias exactas de sus respectivos parmetros actuales y cualquier cambio a los valores de los
parmetros formales no se ven reflejados en sus parmetros actuales.
Podemos apreciar mejor lo antes mencionado por medio de las siguientes figuras

Memoria antes de llamar a la funcin

a y b en la funcin Intercambiar son copias exactas


de las variables a y b de la funcin main

10

Todo cambio que se realice sobre los valores de las variables a y b de la funcin Intercambiar no se ven
reflejados en los valores de las variables en la funcin main.

Parmetros por referencia


Pasar un parmetro por referencia, significa que lo transmitido a la funcin no son los valores sino la
direccin en memoria de las variable que contiene dichos valores. Al pasar los valores por referencia si se
modifican los valores en los parmetros formales de la funcin, estos cambios se reflejan en los parmetros
actuales.
Cuando se pasa un valor por referencia, se pasa la direccin del parmetro actual a sus correspondiente
parmetro formal. Para ello se utiliza en operador de direccin (&) antes del nombre de la variable. Al
momento de recibir un parmetro actual su correspondiente parmetro actual debe de ser un puntero, es
decir que este debe de estar precedido del operador de indireccin (*).
Ejemplo:
#include <stdio.h>
void Intercambiar( int *a, int *b );
int main() {
int a = 5, b = 10;
printf("\nValores antes de la llamada a=%d, b=%d", a, b);
Intercambiar(&a, &b); //Parmetros por referencia
printf("\nValores despues de la llamada a=%d, b=%d", a, b);
return 0;
}
void Intercambiar( int *a, int *b )
{
int aux = *a;
*a = *b;
*b = aux;
printf("\nFuncin intercambiar a=%d, b=%d", *a, *b);
}

En el ejemplo se tiene una funcin Intercambiar que recibe las direcciones de memoria (referencias) de dos
valores enteros, cuando se manda a llamar a la funcin de la forma Intercambiar(&a, &b), las direcciones de
memoria de las variables a y b (parmetros actuales) son tomadas por sus respectivos parmetros formales a
y b.
Esto quiere decir que dentro de la funcin Intercambiar las variables a y b (parmetros formales de la
funcin) contienen las direcciones de memoria de sus respectivos parmetros actuales y cualquier cambio a
los valores de los parmetros formales se ven reflejados en sus parmetros actuales.
Podemos apreciar mejor lo antes mencionado por medio de las siguientes figuras

11

Memoria antes de llamar a la funcin


a y b en la funcin Intercambiar poseen las
direcciones de memoria de las variables a y b de la
funcin main
Cuando en la funcin Intercambiar los contenidos de a y b cambian, tambin cambian los contenidos de las
variables a y b de la funcin main.

Diferencias entre paso de var iables por valor y por referencia


Las reglas que se han de seguir cuando se transmiten variables por valor y por referencia son las siguientes:

Los parmetros valor reciben copias de los valores de los argumentos que se les pasan;, la asignacin
a parmetros valor de una funcin nunca cambian el valor del argumento original pasado a los
parmetros;

Los parmetros para el paso por referencia (declarados como punteros * ) reciben la direccin de
los argumentos pasados; a estos les debe de preceder del operador &, excepto los arrays. En una
funcin, las asignaciones a parmetros referencia (punteros) cambian los valores de los argumentos
originales.

Ms ejemplos de paso de par metros a una funci n


#include <stdio.h>
void FuncionSumaPorValor( int a, int b, int c );
void FuncionSumaPorReferencia( int a, int b, int *c );
int main() {
int a = 15, b = 20, c = 0;
FuncionSumaPorValor( a, b, c ); //Pasando parmetros por valor
printf("\nLa suma es: %d", c);
FuncionSumaPorReferencia( a, b, &c ); //Pasando parmetro por referencia
printf("\nLa suma es: %d\n", c);
return 0;
}
void FuncionSumaPorValor( int a, int b, int c ) {
c = a + b;
}
void FuncionSumaPorReferencia( int a, int b, int *c ) {
*c = a + b;
}

12

#include <stdio.h>
void DemoLocal(int valor);
int main ( )
{
int n = 10;
printf("Antes de llamar a DemoLocal, n = %d\n",n);
DemoLocal(n);
printf("Despues de llamada a DemoLocal, n = %d\n",n);
return 0;
}
void DemoLocal(int valor)
{
printf ("Dentro de DemoLocal, valor = %d\n", valor);
valor = 999;
printf ("Dentro de DemoLocal, valor = %d\n", valor);
}

#include <stdio.h>
void Incrementar(int *valor);
int main ( ){
int n = 10;
printf("Antes de llamar a Incrementar, n = %d\n",n);
Incrementar( &n );
printf("Despues de llamada a Incrementar, n = %d\n",n);

return 0;
}
void Incrementar(int *valor)
{
(*valor)++; //Incrementa el valor en uno
}

Funciones recursivas
Recursividad
La recursividad es un concepto fundamental en matemticas y en computacin. Es una alternativa diferente
para implementar estructuras de repeticin (ciclos). Se puede usar en toda situacin en la cual la solucin
pueda ser expresada como una secuencia de movimientos, pasos o transformaciones gobernadas por un
conjunto de reglas no ambiguas.

Ejemplo de recursividad

13

AED

Departamento de Computacin
La Matrushka es una artesana tradicional rusa. Es una
mueca de madera que contiene otra mueca ms pequea
dentro de s. Esta mueca, tambin contiene otra mueca
dentro. Y as, una dentro de otra.

Una funcin es recursiva cuando esta se llama a si misma. Cada vez que una funcin es llamada los
parmetros formales y las variables auto y register son inicializadas, las variables static solamente son
inicializadas una vez (en la primera llamada).
Para apreciar mejor el concepto de recursividad utilizaremos un ejemplo que calcule el factorial de un
nmero, el factorial es el nmero n multiplicado por el factorial de n-1, Ejemplo el 5!
5! = 5 * 4! = 5 * 4 * 3! = 5 * 4 *3 * 2! = 5 * 4 * 3 * 2 * 1! = 5 * 4 * 3 * 2 * 1 * 0! = 5 * 4 * 3 * 2 * 1 *1
El factorial de cero es 1, despus de realizar todos los clculos se obtiene que el factorial de 5 es 120.
Esto es el resultado de multiplicar 5 * 4 * 3 * 2 * 1 * 1
De forma grfica lo anterior mencionado sera

Acontinuacin se presenta el cdigo del programa


#include <stdio.h>
long Factorial( int n );
int main() {
int n;
long fact;
printf("\nIngrese un numero positivo: ");
scanf("%d", &n);
fact = Factorial( n );
printf("\nEl factorial de %d es %ld\n", n, fact);
return 0;
}
long Factorial( int n ) {
long f = 1;
if( n == 0 || n == 1 )
return( f );
else
f = n * Factorial( n - 1 );
return( f );
}

14

Funciones de uso comn


Funciones para conversin de datos
Estas funciones se encuentran en la librera stdlib.h
double atof( const char *cadena );
Convierte una cadena a valor double
int atoi( const char *cadena );
Convierte una cadena a valor entero
long atol( const char *cadena );
Convierte una cadena a valor long
char *fcvt(double valor, int decs, int *pdec, int *signo)
Convierte un numero real a una cadena de caracteres, la funcin devuelve un puntero a la cadena de
caracteres. Los argumentos se describen a continuacin:
valor

Este es el numero real a convertir.

decs

Numero de decimales despus del punto decimal, si es necesarios se aaden


ceros.

*pdec

Es un puntero a un valor entero el cual especifica la posicin del punto decimal.

*signo

Devuelve un puntero a un valor 0 si el numero es positivo en caso contrario


devuelve un valor distinto de 0.

char *itoa( int valor, char *cadena, int base );//Solo para MS-DOS
Convierte un valor entero a cadena de caracteres, devuelve un puntero a la cadena de caracteres. Los
argumentos se describen a continuacin:
valor

Este es el numero entero a convertir.

*cadena

Cadena de caracteres resultante.

base

La base es un valor entre 2 y 36. Si la base es 10 y el numero es negativo, el


primer carcter de la cadena sera el correspondiente al signo.

char *ltoa( long valor, char *cadena, int base ); //Solo para MS-DOS
Convierte un valor a entero largo, devuelve un puntero a la cadena de caracteres. Los argumentos se
describen a continuacin:
valor

Este es el numero a convertir.

*cadena

Cadena de caracteres resultante.

base

La base es un valor entre 2 y 36. Si la base es 10 y el numero es negativo, el


primer carcter de la cadena sera el correspondiente al signo.

15

Funciones para clasificacin y conversin de caracteres


Estas funciones se encuentran en la librera ctype.h
int isalnum( int c );
Comprueba si c es una letra (A Z, a - z ) o dgito (0 9)
int isalpha( int c );
Comprueba si c es una letra (A Z, a - z )
int isascii( int c );
Comprueba si c es un carcter ascii (0 - 127)
int isnctrl( int c );
Comprueba si c es un carcter de control (0-31 y 127)
int isdigit( int c );
Comprueba si c es un dgito (0 - 9)
int isgraph( int c );
Comprueba si c es un carcter escribible exceptuando el espacio (33 - 126)
int islower( int c );
Comprueba si c es una letra minscula
int isprint( int c );
Comprueba si c es un carcter escribible (32 - 126)
int ispunct( int c );
Comprueba si c es un carcter de puntuacin
int isspace( int c );
Comprueba si c es un espacio en blanco (9 13 o 32)
int isupper( int c );
Comprueba si c es un carcter es maysculas
int isxdigit( int c );
Comprueba si c es un carcter hexadecimal
Todas las funciones descritas anteriormente devuelven un valor distinto de cero si se satisface la condicin,
en caso contrario devuelven cero.
int toascii( int c);
Convierte a c en un carcter ascii
int tolower( int c);
Si es posible convierte a c en una letra minscula
int toupper( int c);
Si es posible convierte a c en una letra mayscula

16

Ejercicios resueltos
1.- Realizar una funcin llamada par, que toma un nmero entero como parmetro, y devuelve 1 si es par o
devuelve 0 si es impar. NOTA: Para saber si un nmero entero es par, al dividirlo entre 2 su resto debe ser 0.
/* mpar.c: Permite probar la funcin par. */
#include <stdio.h>
int par(int); // igueal seria: int par(int numero);
int main() {
int numero, resultado;
printf("Introduzca un nmero:\n");
scanf("%d",&numero);
resultado = par(numero);
if( resultado==1 )
printf("Es par.\n");
else
printf("Es impar.\n");
return(0);
}
/* Funcin par: Devuelve un valor indicando si un nmero entero es par o no. */
int par(int numero) {
if( (numero%2)==0 )
return(1);
else
return(0);
}

Otra forma de escribir la funcin par es:


int par(int numero) {
return ( ( numero % 2 == 0 ) ? 1 : 0 );
}

2.- Realizar una funcin llamada mayor, que tome como parmetros dos nmeros enteros y devuelva el valor
mayor.
//mayor.c
#include <stdio.h>
int mayor(int, int);
int main() {
int numero1, numero2, resultado;
printf("Introduzca los nmeros:\n");
scanf("%d %d",&numero1, &numero2);
resultado = mayor(numero1, numero2);
printf("El mayor es: %d\n", resultado);
return(0);
}
int mayor(int numero1, int numero2) {
return ( ( numero1 > numero2 ) ? numero1 : numero2 );
}

17

3.- Realice un programa que diga cual de cuatro nmeros es el mayor, luego que se obtiene el nmero mayor
diga si este es par o impar.
#include <stdio.h>
int mayor(int, int);
int par( int );
int main() {
int numero1, numero2, numero3, numero4;
int resultado;
printf("Introduzca los nmeros:\n");
scanf("%d %d %d %d",&numero1, &numero2, &numero3, &numero4);
resultado = mayor(numero1, numero2);
resultado = mayor( resultado, numero3);
resultado = mayor( resultado, numero4);
printf("El mayor es: %d\n", resultado);
resultado = par( resultado );
if( resultado==1 )
printf("Es par.\n");
else
printf("Es impar.\n");
return(0);
}
int mayor(int numero1, int numero2) {
return ( ( numero1 > numero2 ) ? numero1 : numero2 );
}
int par(int numero) {
return ( ( numero % 2 == 0 ) ? 1 : 0 );
}

4.- Escriba una funcin que reciba un carcter y devuelva 1 si el carcter es una letra de la A-Z o a-z
(alfabeto ingles) o cero en el caso contrario.
#include <stdio.h>
int EsCaracter( char );
int main() {
char car;
int resultado;
printf("Introduzca los un caracter:\n");
scanf("%c",&car);
resultado = EsCaracter( car );
printf("El caracter %s una letra\n", (resultado == 1) ? "ES" : "NO ES");
return(0);
}
int EsCaracter( char car ) {
if( (car >= a && car <= z) || (car >= A && car <= Z) )
return 1;
else
return 0;
}

18

5.- Realice una funcin que calcule el factorial de un numero, esta deber de recibir el numero al que se le
calculara el factorial y una variable por referencia donde se almacenar el resultado.
#include <stdio.h>
void factorial( long, long * );
int main() {
long num, resultado;
printf("Introduzca un numero:\n");
scanf("%ld",&num);
factorial( num, &resultado );
printf("El resultado es %ld", resultado);
return(0);
}
void factorial( long num, long *resul ) {
long r = 1;
while( num > 0 ) {
r = r * num;
num--;
}
*resul = r;
}

19

Ejercicios Propuestos
Ejercicio 1
Si un cuadrado tiene 4 cm de lado, su rea ser 16 cm2. Al trazar una diagonal el tringulo que resulta tiene 8
cm2. El rea del cuadrado es el doble de la del tringulo. Por eso el rea del tringulo es base x altura
dividido por 2.
Realice un programa que calcule el rea de un triangulo, el prototipo es:
int Area( int b, int a );

Ejercicio 2
Realice un programa en C que utilice una funcin para calcular el rea de un rectngulo, tomando en cuenta
que el rea = base x altura.
El prototipo de la funcin es:
int Area( int b, int a );

Ejercicio 3
Escribir una funcin que imprima por pantalla una pirmide como la de la figura:
*
***
*****
*******
*********
El prototipo de la funcin es:
void Piramide( int altura );

Ejercicio 4
Realizar una funcin a la que se le pase un carcter y determine si ste es una letra, un nmero u otro
carcter que no sea ni letra ni nmero. No utilizar las funciones de C. El prototipo de la funcin es:
void FuncionCaracter( char car );

Ejercicio 5
Realice un programa que por medio de una funcin calcule la raz cuadrada de un numero, el algoritmo seria
de la siguiente manera:
El prototipo de la funcin es el siguiente:
double raiz(double x)

20

Ejercicio 6
Dada la longitud, ancho y profundidad (en pies) de una piscina, calcular el volumen se segn la siguiente
frmula: volumen = longitud*ancho*profundidad
Dado que un pie cbico de agua es equivalente a 7.8 galones, la capacidad de agua de la piscina viene dada
por la frmula: capacidad = volumen * 7.8
Si el flujo de agua en la piscina es de 20 galones por minuto, entonces el tiempo (en horas) que se requiere
para llenar la piscina se calcula mediante la frmula: Tiempo = (capacidad/20)/60
escriba un programa que pida la longitud, el ancho y la profundidad de una piscina, luego que presente en
pantalla el volumen, la capacidad y el tiempo de llenado de la misma.
Se recomienda utilizar funciones para realizar cada uno de los clculos.

Ejercicio 7
Realizar un programa que muestre el siguiente men en pantalla
MENU
+ -->
- -->
* -->
/ -->
s -->
Elija

Sumar
Restar
Multiplicar
Dividir
Salir
opcin:

Luego se pedirn dos nmeros sobre los que hay que realizar la operacin, el prototipo de la funcin es:
void Operacion( int num1, int num2, char oper, int *resul, int *error );

Donde:

num1, num2 (parmetros pasados por valor) representan los dos nmeros sobre los que se quiere
operar.
oper (parmetro pasado por valor) indica el tipo de operacin que se debe realizar
result (parmetro pasado por referencia) donde se almacenar el resultado de la operacin.
error (parmetro pasado por referencia) donde se almacenar el resultado de la operacin. se realizo
con xito o no. Los valores que esta variable puede tomar son:
-1: si ha habido problemas al realizar la operacin, como por ejemplo una divisin entre cero.
1: si la operacin concluy con xito.

Ejercicio 8
Cree un programa que utilice una funcin que por medio de sentencias for a imprimir un tablero de
en el que las casillas blancas se simbolizarn con una B y las negras con B * B N B *
una N. As mismo, el programa deber marcar con * las casillas a las que N B * B * B
se puede mover un alfil desde una posicin dada.
B N B
*
B N
N

En el ejemplo que se muestra a la derecha se asume que el alfil se coloca B


*
en la fila 3, columna 4
B
N
Para lograr la solucin el ejercicio lo primero ser definir las variables que

vamos utilizar en los clculos.


int fila_a1fil, colum_alfil; /* posicin inicial del alfil */

21

B
*
B
N
B

*
B
N
B
N

B
N
B
N
B

*
B
N
B
N

B
*
B
N
B

ajedrez
B
N
B
N
B
*
B
N

N
B
N
B
N
B
*
B

Partiendo de la posicin. fila 1, columna 1 y recorriendo el tablero por filas imprimir un *, una B o una B en
dependencia de las siguientes condiciones:

Imprimir un * si se cumple, que la suma o diferencia de la fila y columna actuales, coincide con la
suma o diferencia de la fila y columna inicial del coloca el alfil.

Imprimir una B si se cumple que la fila ms columna actuales es par.

Imprimir una N si se cumple que la fila ms columna actuales es impar.

El prototipo de la funcin:
void Tablero(int posfila, int poscol ); //posfila y poscol son la posicin inicial del alfil

Ejercicio 9
Realice un programa que calcule el exponente de un nmero de forma iterativa, el prototipo es como sigue:
void Exponente(int num, int exp, int *resul );

Observe que la funcin recibe: el nmero al que se le calculara el exponente, tambin recibe el exponente a
calcular y recibe a resul (por referencia) que es donde se almacenar el resultado.

Ejercicio 10
Cree una funcin que muestre en pantalla el siguiente triangulo (triangulo de Pascal).

22

Vous aimerez peut-être aussi