Professional Documents
Culture Documents
CURSO DE PROGRAMACIN EN
TURBO C
INDICE
Breve historia de C
Fases de un programa en Turbo C.........................................................................4
El entorno de Turbo C...........................................................................................4
El editor.................................................................................................................5
El debugger de Turbo C.........................................................................................5
Tipos de datos simples
El tipo char............................................................................................................6
El tipo int, short int y long int................................................................................6
El tipo float y double.............................................................................................6
El tipo void............................................................................................................6
Operadores
Operadores lgicos................................................................................................6
Operadores aritmticos..........................................................................................6
Operadores relacionales.........................................................................................6
Los componentes de un programa en Turbo C
La directiva #include.............................................................................................8
La directiva #define...............................................................................................8
Prototipos de funciones.........................................................................................8
Declaracin de variables........................................................................................8
La funcin main()..................................................................................................8
Funciones de E/S bsicas
La funcin printf().................................................................................................9
La funcin scanf()..................................................................................................9
Delimitacin de bloques de cdigo ({})................................................................10
Estructuras de seleccin
La sentencia if .......................................................................................................10
La sentencia if-else................................................................................................10
La sentencia switch-case.......................................................................................11
Pgina
Ciclos
El ciclo for.............................................................................................................12
El ciclo while.........................................................................................................13
El ciclo do-while....................................................................................................13
Tipos de datos estructurados
Arreglos unidimensionales....................................................................................14
Arreglos multidimensionales.................................................................................16
Estructuras.............................................................................................................17
Funciones de tipo char
Funciones de captura
La funcin getch().................................................................................................19
La funcin getche()................................................................................................20
La funcin gets()....................................................................................................20
La funcin puts()...................................................................................................20
Funciones de copia de cadenas..............................................................................20
La funcin strcpy()................................................................................................20
La funcin strncpy()..............................................................................................21
Funciones de concatenacin de cadenas................................................................21
La funcin strcat().................................................................................................21
La funcin strncat()...............................................................................................22
Funciones de comparacin de cadenas..................................................................21
La funcin strcmp()...............................................................................................21
Funciones de bsqueda en cadenas.......................................................................22
La funcin strchr().................................................................................................22
La funcin strrchr()................................................................................................22
La funcin strcspn()...............................................................................................22
La funcin strstr()..................................................................................................23
Funciones de conversin de cadenas.....................................................................24
La funcin strlwr().................................................................................................24
La funcin strupr().................................................................................................24
La funcin strrev().................................................................................................24
Conversin a nmeros ..........................................................................................24
La funcin atoi()....................................................................................................24
La funcin atof()....................................................................................................24
Funciones y Procedimientos
Funciones tipo void o procedimientos...................................................................25
Funciones simples.................................................................................................26
Funciones con parmetros.....................................................................................27
Paso de parmetros por valor................................................................................27
Pgina
Pgina
INTRODUCCIN
Breve historia de Turbo C
El lenguaje C fu diseado en 1972, por el cientfico Dennis Ritchie, en los laboratorios de
Bell Telephone Inc. Con un fin especfico, la creacin del sistema operativo Unix, por lo que este
sistema operativo tiene un entorno programable en C, el lenguaje C tuvo como predecesor al
lenguaje B, desarrollado por Ken Thompson tambin en los laboratorios Bell, hay varias
versiones de C, pero actualmente, todas ellas se apegan a la versin de C establecida por el ANSI,
que se encarg de regular (como lo hace con todo lo dems) las versiones de C. De aqu naci el
Estndar ANSI C (que es el que se utiliza en el entorno de Unix), un poco despus, nace C++,
que no es otra cosa que una mejora de C, as que todo lo que incluye C, funciona en C++, slo
que el C++ incorpora adems, herramientas que permiten la P.O.O., pero para este curso,
utilizaremos una versin de C hecha por Borland, es decir, Turbo C.
Fases de un programa en Turbo C
Las fases de un programa en Turbo C se pueden resumir en:
1.
2.
3.
4.
Edicin
Compilacin
Enlazado
Ejecucin
Pgina
El editor de Turbo C
El editor de Turbo C es una poderosa herramienta que nos facilita enormemente la edicin
de un programa, es como un editor de texto cualquiera, pero, para los que estn acostumbrados a
los editores que funcionan bajo Windows, tal vez se encuentren con una forma diferente de editar
texto, por ejemplo, para seleccionar un bloque de texto, en el editor de Turbo C, se presiona la
combinacin de teclas CTRL+K+B al inicio del bloque que se desea seleccionar, y la
combinacin CTRL+K+K al final del mismo. Despus, con ese bloque seleccionado, se pueden
hacer diversas cosas, como:
Pgina
En ocasiones, un programa que est lxica y sintcticamente bien escrito, puede no dar los
resultados correctos, estos resultados pueden deberse a errores comunes de programacin, tales
como errores lgicos, comnmente llamados bugs, aunque existen otros tipos de errores, tales
como errores en tiempo de ejecucin (tema del que nos ocuparemos ms adelante), el debugger
de Turbo C nos ayudar a detectar y corregir dichos errores lgicos. Por ejemplo, si deseamos
monitorear en todo momento el valor de una variable (watch) presionaremos la combinacin
CTRL+F7, y posteriormente, podremos ejecutar el programa lnea por lnea (F7) o funcin por
funcin (F8).
Tipos de datos simples
Los tipos de datos simples en C son:
Operadores
Los operadores son aquellos smbolos que nos ayudarn a relacionar y manipular los
operandos, existen los operadores lgicos, relacionales y aritmticos o matemticos.
Lgicos
AND
OR
NOT
&&
||
!
Aritmticos
Asignacin
Suma
Resta
Multiplicacin
Divisin
Divisin modular
Incremento
Decremento
Relacionales
*
Pgina
=
+
*
/
%
++
--
Igual que
Menor que
Mayor que
Menor o igual que
Mayor o igual que
Diferente que
==
<
>
<=
>=
!=
Componentes de un programa en C
La estructura bsica de un programa en C es la siguiente:
#include<stdlib.h>
#include<stdio.h>
Archivos de cabecera
#define pi 3.1416
int suma(int x, int y);
char nombre[30];
/* Inicia programa principal */
main()
{
int a,b;
printf(Introduzca su nombre...);
scanf(%s,&nombre);
printf(\nTeclee un entero...);
scanf(%d,&a);
printf(\nTeclee otro entero...);
scanf(%d,&b);
printf(El resultado es%d,suma(a,b));
getch();
}
int suma(int x, int y)
{
return x+y;
}
Pgina
Definiciones
Prototipo de funciones
Comentarios
Implementacin de funciones
La directiva #include
Por medio de esta directiva se indica al compilador cules son los archivos de cabecera que
deber incluir en la compilacin del programa, con la finalidad de indicarle donde estn los
prototipos e implementacin de las funciones que se utilizarn en dicho programa.
La directiva #define
A travs de ella se definen las constantes y macro definiciones que se utilizarn en el
programa.
Prototipos de funciones
Los prototipos de funciones no son otra cosa que una especie de declaracin de funciones,
donde se debe especificar el tipo de dato que devolvern dichas funciones, el nombre de la
funcin y sus parmetros, en caso de que los tenga, aunque en Turbo C no es obligatorio el uso de
prototipos de funciones, para efectos de claridad y como una prctica sana de programacin, se
recomienda usarlos.
Declaracin de variables
Es necesario declarar las variables que se utilizarn en el programa, de modo que el
compilador reserve un espacio en memoria para esas variables, la sintaxis es:
[tipo] [nombre_de_la_variable] [[dimension]] ; (la dimensin slo se usa para arreglos).
Ejemplo:
int x;
int arreglo [100];
Y ya que hablamos de variables, cabe mencionar que las variables pueden ser declaradas
globales o locales, solamente como referencia, las variables globales son aquellas variables que
conservan su valor durante la ejecucin de todo el programa y se declaran antes del main(),
mientras que las variables locales solamente tienen valor durante la ejecucin de la funcin o
procedimiento en que fueron declaradas y se declaran despus de la llave que indica el principio
de una funcin o procedimiento. De cualquier manera, las diferencias entre las variables locales y
globales sern objeto de estudio ms adelante.
La funcin main()
La funcin main() en un programa en C significa el cuerpo del programa o el programa
principal, ya que es la primer funcin que el enlazador busca para ejecutar; si la funcin main()
no tiene parmetros, significa que solamente la utilizaremos para decirle al programa cundo y
cmo debe hacer las cosas, pero, si tiene parmetros, es decir, si desde la lnea de comando se
Pgina
llama con valores de entrada, la cosa cambia, y nos ocuparemos de la funcin main() con
parmetros ms adelante.
La funcin printf
La funcin printf es la contraparte de la funcin scanf, ya que mientras scanf lee datos
desde el teclado, la funcin printf los escribe, es decir, provee la salida en pantalla, esta funcin
tambin utiliza los formatos de scanf, con la particularidad de que printf puede modificar la salida
de los datos, por ejemplo, si se declara una variable entera, y se le asigna el valor 65, y al
momento de imprimir el valor de la variable se especifica una salida de tipo caracter, la salida
ser el caracter A (el 65 equivale a la letra A en el cdigo ASCII).
scanf(%d,&x); /* Se lee la variable como entera */
printf(%c,x);
Estructuras de seleccin
Las estructuras de seleccin son usadas para bifurcar el control en un programa, es decir, se
utilizan para evaluar expresiones que pueden tomar valores de verdadero y falso, o 1 y 0,
respectivamente, ya que en C no existe el tipo de dato booleano, por lo que se usan sus
equivalentes.
La sentencia if
La sentencia if es usada para evaluar una expresin lgica que puede tomar valores de 1 y
0, es decir, verdadero o falso, la sentencia if se conoce como estructura de seleccin simple, ya
que si se cumple la condicin especificada entre los parntesis, se ejecuta un bloque de cdigo, y
si no se cumple, no se ejecuta nada, su sintaxis es la siguiente:
if (condicin)
{
Bloque de instrucciones
}
Ejemplo:
if (x==0)
{
printf(El nmero es 0);
printf(\a);
}
En este ejemplo, si la condicin (x==0) se cumple, se imprime el mensaje El nmero es 0
y se emite un pitido por el speaker de la computadora, y si no se cumple, pues no pasa nada.
La sentencia if - else
Esta sentencia es ms o menos como la anterior, con la diferencia que en este ejemplo, si la
condicin se evala como verdadera, se ejecuta una secuencia de instrucciones, mientras que si la
condicin se evala como falsa se ejecuta otra secuencia de instrucciones; su sintaxis es la
siguiente:
if (condicin)
Pgina
10
{
Bloque de instrucciones 1
}
else
{
Bloque de instrucciones 2
}
Ejemplo:
if (x==0)
{
printf(El nmero es 0);
printf(\a);
}
else
printf(Es un nmero diferente de 0);
Es posible anidar sentencias if para hacer una seleccin todava ms compleja, es de ir,
dentri de un if puede ir otro, y dentro de ste, otro ms, etc...
Ejemplo:
if (x==0)
{
printf(El nmero es 0);
printf(\a);
}
else
if(x<0)
printf(Es un nmero negativo);
else
printf(Es un nmero positivo);
En este ejemplo, si el nmero es 0, se visualizar un mensaje indicndolo, pero si no es
cero, se establece una segunda condicin para saber si se trata de un nmero negativo o positivo.
La sentencia switch case
Esta sentencia es la utilizada para evaluar las llamadas opciones de abanico, de donde se
saca una de varias opciones, es decir, switch permite mltiples ramificaciones con una sola
expresin a evaluar. Es ms eficiente que utilizar muchos if anidados. Un enunciado switch
evala una expresin. Su sintaxis es la siguiente:
switch ( selector )
Pgina
11
{
case valor posible 1: acciones 1;break; *
*
*
*
case valor posible n: acciones n; break;
default: /* Opcional */
acciones a realizar si ninguna opcin es la correcta
}
La sentencia break provoca que el control del programa dentro del switch termine, es decir,
si se encuentra un valor para la expresin, se ejecutan las acciones correspondientes, y si se
encuentra un break, el bloque switch-case termina, y las instrucciones para los otros valores
correspondientes al selector se ignoran.
Ciclos
Dentro de la programacin estructurada, se hace necesaria la ejecucin repetitiva de tareas,
lo cual no es problema, gracias a los ciclos...
El ciclo for
El ciclo for ejecuta un bloque de instrucciones n veces, es recomendable la utilizacin de
este ciclo cuando se conoce el nmero de iteraciones o repeticiones de una tarea, es decir, cuando
se sabe el nmero de veces que se va a repetir algo. Su sintaxis es la siguiente:
for(valor inicial; condicin de paro; incremento o actualizacin)
{
bloque de instrucciones
}
Donde el valor inicial se asigna a una variable de tipo entero llamada variable centinela,
cuya funcin es la de contar y controlar el nmero de iteraciones del ciclo.
Ejemplo:
for (i=0; i<10; i++)
{
printf(*);
}
Donde se establece como variable centinela la variable i y se inicializa con 0, la condicin
de paro del ciclo es que i no sea menor que 10, y el incremento o actualizacin de i es un
incremento de 1 en 1, el ciclo for anterior se lee as: se inicia i con 0, mientras que i sea menor
que 10, i se incrementa en 1.
*
Pgina
12
El ciclo while
Este ciclo ejecuta un bloque de instrucciones mientras una condicin determinada sea
correcta. Su sintaxis es la siguiente:
while(condicin)
{
bloque de instrucciones
}
Cuando la ejecucin de un programa llega al ciclo while, sucede lo siguiente:
1. Es evaluada la expresin de la condicin.
2. Si la condicin se evala como falsa (es decir, a cero), el ciclo while termina, y la
ejecucin pasa al primer enunciado que se encuentre a continuacin de los
enunciados del while.
3. Si la condicin se evala como verdadera (esto es, 1), se ejecutan los enunciados
(bloque de instrucciones ) del while.
4. La ejecucin regresa al paso 1.
Es decir, se evala la expresin de la condicin, y de resultar cierta, se ejecuta el bloque de
instrucciones del while, mientras que, si dicha condicin se evala como falsa, la ejecucin del
ciclo termina.
El ciclo do-while
El ciclo do-while es muy similar al while, es decir, tambin ejecuta un bloque de
instrucciones mientras una condicin determinada sea verdadera, pero tiene una diferencia
principal con respecto al while: en el ciclo while la expresin se evala antes de ejecutar el ciclo,
mientras que en el do-while, primero se ejecuta el bloque de instrucciones y luego se evala la
condicin. Su sintaxis es la siguiente:
do
{
bloque de instrucciones
}while(condicin);
Tipos de datos estructurados
Los tipos de datos estructurados son aquellos que constan de ms de un valor, como las
estructuras (tambin llamadas tipos de datos abstractos), los arreglos y las matrices.
Arreglos
Pgina
13
Arreglo tridimensional
Arreglos unidimensionales
Un arreglo unidimensional es un arreglo que tiene solamente un ndice, o una dimensin,
comnmente se les llama vectores, y su representacin puede ser indistintamente vertical u
horizontal:
Arreglo
Pgina
Arreglo
14
Elementos
Direcciones
0
1
2
3
4
5
6
7
8
9
5
3
7
9
1
0
2
6
9
0
Elementos
5
0
3
1
7
2
9
3
1
4
0
5
2
6
6
7
9
8
0
9
Direcciones
15
Arreglos multidimensionales
Un arreglo multidimensional tiene ms de un ndice. Un arreglo bidimensional (matriz)
tiene dos ndices, un arreglo tridimensional tiene tres ndices, etc., No hay lmite para la cantidad
de dimensiones que puede tener el arreglo, (sin embargo, s hay un lmite para el tamao total del
arreglo, y lo conoceremos ms adelante).
Matrices
Las matrices son arreglos bidimensionales, y generalmente se conoce a estos ndices como
filas y columnas, o utilizando los ndices ms comunes para matrices en las matemticas, i,j. Su
representacin sera ms o menos as:
0,0
0,1
6
1,0
0,2
5
0,1
1
2,0
0,2
6
0,1
20
3,0
10
0,2
9
0,2
0
ndices
0,0
Valor
16
12
0,1
Pgina
Los ndices i,j representan el nmero de fila y columna, respectivamente, ahora, veamos un
ejemplo:
#include <stdio.h>
#include <stdlib.h>
int i,j, M[3][3];
main()
{
clrscr(); /* Borra la pantalla */
printf("Introduzca los valores para la matriz...\n");
/* Se abren dos ciclos, uno para las filas y uno para las columnas */
for (i=0; i<3; i++)
for (j=0; j<3; j++)
scanf("%d", &M[i][j]);
printf("\nLos valores introducidos son...\n");
for (i=0; i<3; i++)
{
for (j=0; j<3; j++)
printf("%d", M[i][j]);
printf("\n");
}
getch();
}
En este caso, se declara una matriz de 3 * 3, es decir, una matriz de 3 filas y 3 columnas,
para este ejemplo, la matriz se ha llenado usando el mtodo llamado llenado por fila mayor,
que consiste en llenar la matriz empezando por llenar filas, mientras que el mtodo llenado por
columna mayor consiste en llenar la matriz empezando por las columnas.
Estructuras
Las estructuras son un tipo de dato abstracto, ya que no se conoce el tipo o los tipos que la
constituyen, una estructura la podemos definir como una coleccin de datos de tipos diferentes
identificados bajo un mismo nombre. A menudo, a las estructuras se les llama tambin registros,
trmino un poco encasillante, ya que si bien es cierto que las estructuras son la mejor solucin a
la hora de trabajar con archivos, sta no es su nica funcin. La sintaxis de la declaracin de las
estructuras es as:
struct nombre_de_la_estructura
{
variables de estructura
};
Ejemplo:
Pgina
17
#include <stdlib.h>
#include <stdio.h>
struct Datos
{
char nombre[30];
char direccion[40];
char telefono[15];
char sexo;
int edad;
};
main()
{
struct Datos x;
clrscr();
printf("Teclee los datos de la persona...");
printf("\nNombre...:");scanf("%s",&x.nombre);
printf("Direccin..:");scanf("%s",&x.direccion);
printf("Telfono...:");scanf("%s",&x.telefono);
flushall();
printf("Sexo.......:");scanf("%c",&x.sexo);
printf("Edad.......:");scanf("%d",&x.edad);
printf("\nLos datos de la persona son...:");
printf("\nNombre...:%s",x.nombre);
printf("\nDireccin..:%s",x.direccion);
printf("\nTelfono...:%s",x.telefono);
printf("\nSexo.......:%c",x.sexo);
printf("Edad.......:%d",x.edad);
getch();
}
En este ejemplo, se declara la estructura Datos con cinco componentes: nombre, direccin,
telfono, sexo y edad, con sus tipos correspondientes, posteriormente, en el main(), se declara una
variable de tipo struct Datos llamada x, y es precisamente esta x quien encapsula los datos de la
estructura, es decir, la variable x es el nombre con el que se conoce a la coleccin de datos antes
declarada. Para hacer referencia (leer o escribir)a los datos de una variable de tipo estructura, se
hace de la misma manera que con los dems datos (simples), es decir, con sus formatos
correspondientes (%s para cadenas, %d para enteros, etc.), pero se les antepone la variable de tipo
estructura, un punto, y el dato o variable al que se desea hacer la referencia:
scanf("%s",&x.nombre);
printf("\nNombre...:%s",x.nombre);
18
La funcin getche()
Pgina
19
Esta es una seccin corta, debido a que getche () es exactamente igual a getch (), a
excepcin de que replica cada carcter a stdout (salida estndar). Modifique el programa de la
funcin getch () cambiando solamente el getch () por el getche ().
La funcin gets()
Esta es una funcin llana, que lee una lnea de stdin y la guarda en una cadena. El prototipo
de funcin es:
Char *gets (char *str);
Probablemente podemos interpretar este prototipo por nosotros mismos. gets () toma un
apuntador a tipo char como argumento y regresa un apuntador a tipo char. La funcin gets () lee
caracteres de stdin hasta que encuentra una nueva lnea \n o un fin de archivo.
El valor de retorno es un apuntador a la cadena (el mismo que str). Si gets () encuentra un
error, o lee un fin de archivo antes de recibir cualquier entrada, regresa un apuntador nulo.
Antes de llamar a gets () se debe asignar suficiente espacio de memoria para guardar la
cadena. La funcin no tiene forma de saber se el espacio para str ha sido asignado o no. En
cualquier caso la cadena la cadena es recibida y guardada comenzando en ptr. Si el espacio no ha
sido asignado, la cadena puede sobreescribir otros datos y causar errores de programa.
La funcin puts()
La funcin puts() pone una cadena en la pantalla, y a esto se debe su nombre. El nico
argumento que toma puts() es una apuntador a la cadena que ha de ser desplegada. Debido a que
una cadena literal evala como un apuntador a una cadena, puts() puede se usado para desplegar
cadenas literales y variables de cadena. La funcin puts() inserta automticamente un carcter de
nueva lnea al final de cada cadena que despliega, por lo que cada cadena subsecuente desplegada
con puts() se encuentra en su propia lnea.
Funciones de copia de cadenas
La funcin strcpy()
La funcin strcpy() copia una cadena completa a otra posicin de memoria, su sintaxis es:
strcpy(cad1,cad2);
Donde cad1 es una cadena que recibe el valor o contenido de cad2, que puede ser una
variable o constante. Ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Pgina
20
21
Como es de esperarse, la funcin strncat es muy similar a strcat, con la diferencia de que
strncat concatena n nmeros de cad2 en cad1.
Funcines de comparacin de cadenas
La funcin utilizada para comparar cadenas es strcmp, esta funcin regresa un valor entero
menor de cero si cad1 es menor que cad2, regresa cero si cad1 es igual a cad2, y regresa un valor
mayor de cero si cad1 es mayor que cad2.
Un ejemplo:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char cad1[10], cad2[10];
main()
{
clrscr();
printf(Teclee una cadena...);
scanf(%s,&cad1);
printf(Teclee otra cadena...);
scanf(%s,&cad2);
if (strcmp(cad1,cad2) <0)
printf(La cadena 1 es menor a la cadena 2);
if (strcmp(cad1,cad2) ==0)
printf(Ambas cadenas son iguales.);
if (strcmp(cad1,cad2) >0)
printf(La cadena 1 es mayor a la cadena 2);
getch();
}
La funcin stricmp()
Esta funcin es similar que strcmp(), es decir, regresa los mismos tipos de valores, con la
diferencia que stricmp() ignora maysculas y minsculas por lo que la comparacin de Hola y
HOLA, regresara un cero.
Comparacin parcial de cadenas
La funcin strncmp() compara n caracteres de cad2 contra cad1, funciona de la misma
forma que strcmp().
Funciones de bsqueda en cadenas
Pgina
22
La funcin strchr()
Esta funcin busca la primera aparicin de un caracter especfico dentro de una cadena, esta
funcin regresa NULL si no encuentra el carcter dentro de la cadena, y si lo encuentra, regresa
un apuntador a l.
Ejemplo:
main()
{
char *loc, cadena[30];
int ch;
printf(Teclee una cadena);
gets(cadena);
printf(Ahora teclee el carcter a buscar);
ch=getche();
/* Ahora se hace la bsqueda */
loc=strchr(cadena,ch);
if (loc==NULL)
printf(El caracter %c no se encuentra en %s, ch, cadena);
else
printf(El carcter %c se encontr en la posicin %d ,ch, loc-cadena);
}
La funcin strrchr()
Esta funcin es idntica a strchr, con la diferencia que strchr busca la ltima aparicin de un
carcter en una cadena.
La funcin strcspn()
Esta funcin busca en una cadena la primera aparicin de cualquier carcter de una segunda
cadena. Si no encuentra ninguna coincidencia, regresa la longitud de la cadena 1, pero si
encuentra coincidencia, regresa el desplazamiento a partir del primer carcter de la cadena 1.
La funcin strstr()
Tal vez sta es la funcin ms til de las de tipo char, ya que busca una cadena dentro de
otra, y regresa:
Pgina
23
NULL si no la encuentra.
cad1 si la longitud de cad2 es cero.
Apuntador al primer carcter de la concordancia si se encuentra.
Pgina
24
Funciones y Procedimientos
Esta es la parte de la programacin estructurada que le da el nombre de estructurada, ya
que es la programacin que permite dividir el problema en mdulos, para resolver problemas, a
dichos mdulos se les conoce como funciones y procedimientos.
Funciones tipo void o procedimientos
Las funciones tipo void o procedimientos las podemos entender como subprogramas o
subrutinas que realizan una tarea especfica, pero que no devuelven ningn valor. Su sintaxis es
as:
void nombre_del_procedimiento(parmetros)
{
bloque de instrucciones
}
En este caso, los parmetros son opcionales, de no haber parmetros, se recomienda poner
la palabra void entre los parntesis.
Ejemplo:
#include <stdlib.h>
#include <stdio.h>
void imprime_datos(void);
struct Datos
{
char nombre[30];
char direccion[40];
char telefono[15];
char sexo;
int edad;
};
struct Datos x;
main()
{
clrscr();
printf("Teclee los datos de la persona...");
printf("\nNombre...:");scanf("%s",&x.nombre);
printf("Direccin..:");scanf("%s",&x.direccion);
printf("Telfono...:");scanf("%s",&x.telefono);
flushall();
printf("Sexo.......:");scanf("%c",&x.sexo);
Pgina
25
printf("Edad.......:");scanf("%d",&x.edad);
imprime_datos();
getch();
}
void imprime_datos(void)
{
printf("\nLos datos de la persona son...:");
printf("\nNombre...:%s",x.nombre);
printf("\nDireccin..:%s",x.direccion);
printf("\nTelfono...:%s",x.telefono);
printf("\nSexo.......:%c",x.sexo);
printf("\nEdad.......:%d",x.edad);
}
En este ejemplo, se declara el procedimiento imprime_datos(void) de tipo void, y se
especifica que no recibir parmetros, y una vez dentro del main(), se manda llamar como
cualquier otro procedimiento, es decir, se pone su nombre y parntesis:
imprime_datos();
Nota: Observemos que la forma de llamar al procedimiento imprime_datos() es igual a la forma
de llamar al procedimiento clrscr() (limpiar pantalla), por lo que deducimos que clrscr() es una
funcin de tipo void o procedimiento.
Funciones
Es necesario que elaboremos nuestras propias funciones, a medida que lo vamos
necesitando, la utilizacin de funciones reduce considerablemente la cantidad de cdigo que se
escribe en un programa. Hablando de funciones, podemos distinguir dos tipos principales: las
funciones simples y las funciones con parmetros.
Funciones simples
Las funciones simples son aquellas que no reciben parmetros pero que pueden devolver un
valor, para declarar una funcin simple se debe especificar el tipo de dato que va a devolver
(cualquier tipo de dato en C). Ejemplo:
#include <stdio.h>
#include <stdlib.h>
int suma(); /*Prototipo de funcin */
int n,m;
main()
{
clrscr();
printf("La suma es...%d",suma());
Pgina
26
getch();
}
int suma()
{
printf("Introduzca un entero...");
scanf("%d",&n);
printf("Introduzca otro entero...");
scanf("%d",&m);
return (m+n);
}
En este ejemplo, la funcin suma() que es de tipo entero, devuelve la suma de dos nmeros
capturados en esa misma funcin, el valor de la suma se devuelve al main(), ya que fue la funcin
que la llam.
Funciones con parmetros
La utilizacin de funciones con parmetros es tal vez la forma ms lgica de utilizar las
funciones, no son otra cosa que funciones que reciben valores o datos para poder calcular el valor
que devolvern. Ejemplo:
#include <stdio.h>
#include <stdlib.h>
int suma(int a, int b);
int n,m;
main()
{
clrscr();
printf("Introduzca un entero...");
scanf("%d",&n);
printf("Introduzca otro entero...");
scanf("%d",&m);
printf("La suma es...%d",suma(n,m));
getch();
}
int suma(int a, int b)
{
return (a+b);
}
En este ejemplo, los valores para las variables n y m se leen desde el main(), y se pasan a la
funcin suma() como parmetros. Observemos que los nombres para los parmetros que recibe
suma() son a y b, esto se llama paso de parmetros por valor...
Paso de parmetros por valor
Pgina
27
En el ejemplo anterior, las variables que se leen en el main() se llaman n y m, mientras que
los valores que recibe la funcin suma() se llaman a y b, esto es una paso de parmetros por
valor, o paso de parmetros por copia, ya que la funcin suma() copia los valores de n y m en a y
b, respectivamente. Pero existe otro tipo de paso de parmetros y es el llamado paso de
parmetros por referencia...
Paso de parmetros por referencia
En el paso de parmetros por valor, la funcin que recibe los parmetros copia el valor de
esos parmetros en variables propias de la funcin, mientras que en el paso de parmetros por
referencia, la funcin que recibe dichos parmetros, no recibe valores, sino direcciones,
confuso?, un poco. Veamos un ejemplo:
#include <stdio.h>
#include <stdlib.h>
int suma(int *a, int *b);
main()
{
int n,m;
clrscr();
printf("Introduzca un valor para n...");
scanf("%d",&n);
printf("Introduzca un valor para m...");
scanf("%d",&m);
printf("\nLa suma es...%d",suma(&n,&m));
printf("\nLos valores de n y m despus de la funcin son...%d y %d",n,m);
getch();
}
int suma(int *a, int *b)
{
int total; /*Variable local*/
total=*a+*b;
*a=0;
*b=0;
return total;
}
Y su salida es:
Pgina
28
En este ejemplo, la funcin suma() recibe dos direcciones como parmetros, y utiliza los
valores almacenados en esas direcciones para hacer sus clculos, una vez realizado el clculo, la
funcin suma() asigna 0 a las variables n y m, pero cmo es posible, si n y m son variables
locales del main()?, esto es posible porque los cambios que se le hagan a las variables que se
reciben como parmetros en las funciones con paso de parmetros por referencia, se hacen en sa
variable, sin importar si son variables locales o globales. Por lo que podemos concluir que la
ventaja de pasar parmetros por referencia es que podemos afectar el valor de las variables que se
pasan como parmetros, y esto, en el paso de parmetros por valor no es posible.
Funciones Recursivas
El trmino recursividad o recursin se refiere a la situacin en la que una funcin se llama a
s misma. Un ejemplo muy ilustrativo de la recursividad es la del clculo del factorial:
#include <stdio.h>
#include <stdlib.h>
int fact(int n);
main()
{
int numero;
clrscr();
printf("Introduzca un nmero...");
scanf("%d",&numero);
printf("El factorial es...%d",fact(numero));
getch();
}
int fact(int n)
{
if (n==1)
return 1;
else
return (n*fact(n-1));
}
Pgina
29
Y su salida es:
Pgina
30
Pgina
31
En este caso, solamente estamos validando que el dato introducido como calificacin est
entre el rango de 0 y 10.
Validacin con ciclos
Este tipo de validacin tambin se utiliza mucho en los programas, tal vez por la
simplicidad que tiene, consiste en establecer un ciclo (generalmente do while) que se repetir
mientras el dato introducido sea errneo, veamos el mismo problema anterior pero resuelto
utilizando ciclo de validacin:
#include <stdio.h>
#include <stdlib.h>
main()
{
char nombre[30];
float calif,acum=0,prom;
int i;
clrscr();
printf("Teclee el nombre del alumno...");
gets(nombre);
for (i=0;i<5;i++)
{
do
{
printf("\nIntroduzca la calificacin %d de %s...:",i+1,nombre);
scanf("%f",&calif);
if (calif < 0 || calif >10)
{
printf("\n No es un nmero vlido...\a");
printf("\n Intntelo de nuevo.");
}
}while(calif < 0 || calif > 10);
acum+=calif;
}
prom=acum/5;
printf("\nEl promedio es...%g",prom);
getch();
}
Y su salida sera la misma:
Pgina
32
Pgina
33
valor=5;
ptr=&valor;
printf("\nEl valor es...%d, y su direccin es...%p",*ptr,ptr);
*ptr=valor;
printf("\nEl valor es...%d, y su direccin es...%p",*ptr,ptr);
getch();
}
Veamos la salida:
Pgina
34
Sig
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <alloc.h>
struct nodo
{
int info;
struct nodo *sig,*ant;
};
typedef struct nodo NODO;
NODO *crea();
main()
{
NODO *head=NULL,*a;
int num;
char op;
clrscr();
do{
clrscr();
printf("1.-Insertar.");
printf("\n2.-Eliminar.");
printf("\n3.-Consultar.");
printf("\n4.-Salir.\n");
printf("Cual es su eleccion...?");
op=getch();
switch(op)
{
case '1':
if(!head)
{
printf("\nTeclee el numero a insertar...");
head=crea();
head->info=captura();
}
else
{
printf("\nTeclee el numero a insertar...");
num=captura();
if(enc(head,num))
{
printf("\n\aYa se encuentra.");
getch();
Pgina
35
}
if(num<head->info)
{
a=crea();
a->info=num;
a->sig=head;
head->ant=a;
head=a;
break;
}
altas(head,num);
}break;
case '2':if(!head)
{
printf("\a\nLa lista esta vacia.");
getch();
break;
}
printf("\nTeclee el numero a eliminar...");
num=captura();
if(num==head->info)
{
a=head;
head=head->sig;
free(a);
break;
}
bajas(head,num);break;
case '3':consultas(head);break;
case '4':break;
default:printf("\a\nNo existe esa opcion.\nPulse una tecla para continuar.");getch();break;
}
}while(op!='4');
}
int captura()
{
int i,valido;
char cadena[10];
do{
valido=1;
scanf("%s",&cadena);
for (i=0;i<strlen(cadena);i++)
{
if(!isdigit(cadena[i]))
{
Pgina
36
37
{
NODO *p,*q,*r;
if(!enc(h,n))
{
printf("\n\aNo se encuentra!");
getch();
}
else
{
q=h;
while(q->info!=n) q=q->sig;
p=q->ant;
r=q->sig;
p->sig=r;
r->ant=p;
free(q);
printf("El numero %d ha sido eliminado.",n);
getch();
}
}
consultas(NODO *h)
{
NODO *aux;
aux=h;
if(!h)
{
printf("La lista esta vacia.\a");
getch();
return 0;
}
printf("\nLista completa...\n");
while (aux)
{
printf("%d ",aux->info);
aux=aux->sig;
}
getch();
}
NODO *crea()
{
NODO *n;
n=malloc(sizeof(NODO));
n->sig=NULL;
n->ant=NULL;
n->info=0;
Pgina
38
return n;
}
inserta(NODO *h, NODO *p)
{
h->sig=p;
}
enc(NODO *h,int n)
{
NODO *aux,*p,*r;
aux=h;
while(aux)
{
if(aux->info==n)
{
return 1;
}
aux=aux->sig;
}
return 0;
}
Este es un programa simple para la utilizacin de una lista* doblemente ligada
Archivos
Los archivos son estructuras de datos permanentes, los hay de dos tipos, bsicamente,
binarios y de texto. Los archivos de texto son una secuencia de lneas, donde cada linea tiene cero
o ms caracteres y termina con uno o ms caracteres que indican el fin de lnea, en cambio, un
archivo binario es todo lo dems, los datos son escritos y ledos, sin embargo, los caracteres nulo
y fin de lnea no tienen significado especial.
Apertura de un archivo
Para poder usar un archivo, es necesario abrirlo, la funcin fopen() sirve para eso, su
sintaxis es:
ptr =fopen(Nombre_de_archivo,modo); Donde ptr es un apuntador a archivo.
Cuando se abre un archivo, queda disponible para leer de l, o escribir en l, segn sea el
caso. Veamos las diferentes formas en que se abre un archivo:
Modo Significado
*
Pgina
39
r
w
a
r+
w+
a+
Listas
Pilas
Colas
rboles
Archivos
En el prximo curso.
Pgina
40