Académique Documents
Professionnel Documents
Culture Documents
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);
}
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:
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
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.
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.
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:
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.
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.
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 [)]];
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 );
}
Cuando una funcin es llamada, esta recibe unos valores como argumentos conocidos como parmetros
actuales.
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
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
}
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
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.
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
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.
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
14
decs
*pdec
*signo
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
*cadena
base
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
*cadena
base
15
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);
}
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
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.
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