Anda di halaman 1dari 79

I.P.E.T.

Juan XXIII

Laboratorio de Computadoras Electrnicas


Gustavo A. Yarce

Paran - Entre Ros 2012

Gustavo A. Yarce

ndice general
1. Introduccin 1.1. Problemas computacionales . . . 1.2. Etapas . . . . . . . . . . . . . . . 1.2.1. Denicin del problema . 1.2.2. Anlisis del problema . . . 1.2.3. Programacin . . . . . . . 1.2.4. Prueba . . . . . . . . . . . 1.2.5. Algoritmo . . . . . . . . . 1.3. PROGRAMACIN MODULAR 1.4. Documentacin de Programas . . 2. El Lenguaje C 2.1. Marco histrico . . . . . . . . . . 2.2. Caractersticas . . . . . . . . . . 2.3. Creacin del programa . . . . . . 2.4. Compilacin de C . . . . . . . . . 2.4.1. Descripcin . . . . . . . . 2.5. Entorno de programacin . . . . . 2.6. Estructura de programa en C . . 2.7. Bibliotecas estndares . . . . . . 2.8. Componentes del lenguaje C . . . 2.9. Estructura de un chero fuente . 2.10. Comentarios . . . . . . . . . . . . 2.11. CONSTANTES . . . . . . . . . . 2.12. Variables . . . . . . . . . . . . . . 2.12.1. Variables locales y globales 2.13. Tipos de datos . . . . . . . . . . 2.13.1. Calicadores de tipo . . . 2.13.2. Conversiones entre tipos . 2.14. Secuencias de escape . . . . . . . 2.15. Inclusin de archivos . . . . . . . 3 11 11 11 11 11 12 12 13 13 14 15 15 15 16 16 17 17 18 20 20 21 21 22 22 24 25 26 27 27 28

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

4 2.16. Operadores aritmticos . . . 2.17. Operadores de asignacin . . 2.18. Jerarqua de los operadores . 2.19. Sentencia printf . . . . . . . 2.19.1. Modicadores . . . . 2.20. Sentencia scanf . . . . . . . 2.21. Pantalla en modo texto . . . 3. Control de ujo de ejecucin 3.1. Operadores relacionales . . . 3.2. Estructura IF...ELSE . . . . 3.2.1. Estructura IF...ELSE 3.3. Estructura SWITCH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Gustavo A. Yarce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 30 31 32 33 35 36 39 39 39 40 41 43 43 44 45

. . . . . . IF... . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

4. Control de Programas 4.1. Instruccin FOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2. Instruccin WHILE . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3. Instruccin DO...WHILE . . . . . . . . . . . . . . . . . . . . . . . .

5. Funciones 47 5.1. Paso de parmetros a una funcin . . . . . . . . . . . . . . . . . . . 53 6. Arrays 6.1. Vectores . . . . . . . . . . . . . . 6.2. Operaciones . . . . . . . . . . . . 6.3. Mltiples dimensiones . . . . . . 6.4. Paso de parmetros a una funcin 7. Grcos 7.1. Librera WinbGim 7.2. Librera Graphics . 7.3. Instrucciones . . . 7.3.1. initwindow . 7.3.2. initgraph . . 7.3.3. cleardevice . 7.3.4. closegraph . 7.3.5. getmaxx . . 7.3.6. getmaxy . . 7.3.7. moveto . . . 7.3.8. Colores . . . 7.3.9. setcolor . . 57 57 58 59 59 61 61 61 62 62 63 64 64 64 65 65 65 66

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

Computadoras Electrnicas 7.3.10. setbkcolor . . . . . . . . 7.3.11. cleardevice . . . . . . . . 7.4. funciones de dibujo . . . . . . . 7.4.1. putpixel . . . . . . . . . 7.4.2. line . . . . . . . . . . . . 7.4.3. lineto . . . . . . . . . . . 7.4.4. circle . . . . . . . . . . . 7.4.5. rectangle . . . . . . . . . 7.4.6. arc . . . . . . . . . . . . 7.4.7. bar . . . . . . . . . . . . 7.4.8. bar3d . . . . . . . . . . 7.5. Funciones de escritura de texto 7.5.1. outtextxy . . . . . . . . 7.5.2. settextstyle . . . . . . . 7.5.3. getch . . . . . . . . . . . 7.5.4. delay . . . . . . . . . . . 8. Cadenas de texto 8.1. Introduccin . . . . . . . . . . 8.2. Comandos . . . . . . . . . . . 8.2.1. Captura de caracteres 8.2.2. Librera ctype.h . . . . 8.2.3. Librera stdlib.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5 66 66 66 66 67 67 67 67 67 68 69 70 70 70 70 71 73 73 73 75 77 78

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

Gustavo A. Yarce

ndice de guras

Gustavo A. Yarce

ndice de tablas
2.1. 2.2. 2.3. 2.4. 2.5.
Tipos de datos Tipo signed . Tipo unsigned Tipo short . . Tipo long . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

25 26 26 26 26

Prologo
Este documento no pretende ser un libro completo sobre microcontroladores, es una ayuda para el alumno, para su utilizacin como gua de aprendizaje. Se tiene como objetivo presentar los conceptos bsicos y las caractersticas generales de los dispositivos microprogramables, para el desarrollo y resolucin de problemas que se presentan en el mbito tcnico. Los temas tratados y el desarrollo que se realiza sobre ellos persiguen la enseanza en entornos educativos tcnicos de nivel medio que necesitan conocimientos sobre estas tecnologas. Se prioriza la enseanza de una metodologa de programacin correcta tratando de conservar la facilidad de uso como herramienta. Siempre se considera que lo ms importante es adquirir una base de conocimientos que permita una posterior evolucin hacia conocimientos relacionados con la Electrnica y la programacin.

Captulo 1 Introduccin
1.1. Problemas computacionales

As como cada persona tiene formas de encarar un problema y su propia manera de solucionarlo, computacionalmente hablando podemos hacer una analoga. Ante la presentacin de un problema encarar la mejor forma de resolverlo para arribar al resultado esperado y correcto es un desafo. Para ello debemos comprender exactamente qu se pide, qu resultados se pretenden y que restricciones y/o condiciones existen. Para realizar lo antes dicho dividiremos la resolucin de un problema en etapas.

1.2.
1.2.1.

Etapas
Denicin del problema

Est dada por la formulacin del problema en forma correcta y completa. Esta enunciacin de lo que se desea es primordial para el xito de la resolucin.

1.2.2.

Anlisis del problema

A partir del estudio del problema se deber identicar y conocer las partes princi-pales del mismo y de esa manera determinar los siguientes conjuntos: Datos: es la informacin con que contamos para resolver el problema Resultados: es lo que se desea obtener. Condiciones: una o ms relaciones que vinculan los dos conjuntos anteriores y que permitirn plantear la solucin del problema. 11

12

Gustavo A. Yarce

1.2.3.

Programacin

Esta etapa consiste en obtener la solucin del problema dado. Se divide en dos subetapas: Eleccin y creacin del mtodo: Se trata de buscar un procedimiento o mtodo general que permita resolver el problema planteado utilizando una computadora. Codiacin : Consiste en expresar el mtodo elegido en un lenguaje, llamado lenguaje de programacin, que pueda se interpretado por la computadora. Programa Un programa es una sucesin de instrucciones que pueden ser ejecutadas por la PC. De modo general la PC comprende, sin traduccin previa, los llamados comando en lenguaje mquina, que son especcos del procesador. Este tipo de lenguaje resulta ser bastante engorroso para realizar operaciones simples. Con el n de vencer esta dicultad, se desarrollaron los lenguajes superiores de programacin. El programador no tiene que preocuparse por la estructura interna de la PC, ya que puede trabajar en un lenguaje relativamente simple, transformar un determinado algoritmo en un programa adecuado. Un lenguaje de programacin lo nico que realiza es la traduccin escrita en lenguaje mquina de las diferentes instrucciones escrita en un lenguaje superior. Aqu pueden acreditarse dos procedimientos: 1. El programa usuario puede traducirse totalmente, antes de la ejecucin. El programa que realiza la traduccin se llama compilador. 2. Los diferentes comandos son traducidos e, inmediatamente despus ejecutados, an antes de que el programa traductor prosiga con la siguiente ejecucin. El programa de traduccin que trabaja de acuerdo con este procedimiento, es un INTERPRETE.

1.2.4.

Prueba

Esta etapa consiste en la ejecucin del cdigo del mtodo elegido, es decir, suministrar los datos al computador, y obtener los resultados. Luego se analizarn los mismos determinando si son realmente los esperados. Caso contrario, debern analizarse las etapas previas, comenzando por la ltima hacia atrs, y realizar las modicaciones necesarias, repitiendo esta proceso hasta obtener los resultados esperados.

Computadoras Electrnicas

13

1.2.5.

Algoritmo

En relacin al algoritmo, deseamos an entrar con detalle en unos conceptos que son independientes del procedimiento de notacin y de la descripcin formal. En primer lugar tenemos: FINITEZ: el algoritmo completo se tiene que representar en una sucesin nita de caracteres. EFECTIVIDAD: todos los pasos u operaciones que forman el algoritmo, han de ser ejecutables. Aqu hay que pensar en las limitaciones tcnicas de la PC. TERMINACIN: por razones de carcter practico, con frecuencia esta uno interesado que, en muchos procesos, conduzca a un nal. DETERMINISMO: un algoritmo determinativo es una serie de pasos de procesamiento, cuyo desarrollo est claramente prescrito. EFICIENCIA: para un determinado problema, existen, generalmente, varios algoritmos diferentes. Se distinguen por el volumen de trabajo que hay que desarrollar para alcanzar lo mismo.

1.3.

PROGRAMACIN MODULAR

Es un mtodo de diseo y tiende a dividir el problema en partes perfectamente diferenciadas que puedan ser analizadas, resueltas y puestas a punto por separado. Para atacar el anlisis de un problema, y siguiendo el diseo Top-Down, se pue-den utilizar criterios de programacin modular para dividirlos en partes indepen-dientes, probando cada uno por separado y realizando su recomposicin ascen-dente. Cada una de las partes independientes se llama Mdulo y para su determinacin se deben tener en cuenta los siguientes criterios: un mdulo debe corresponder a una funcin lgica perfectamente bien denida. los mdulos deben ser pequeos para que sean claros y de poca complejidad. un mdulo debe tener una estructura de caja negra, es decir la salida debe ser exclusivamente funcin de la entrada. cada mdulo deber tener una nica entrada y una nica salida.

14

Gustavo A. Yarce

1.4.

Documentacin de Programas

La documentacin es un aspecto muy importante en la programacin. Sin embargo, generalmente los programadores principiantes suelen dejar de lado el proceso de documentacin por falta de dedicacin o simple desconocimiento de su relevancia. La documentacin es todo el material anexo a un programa que no constituye parte del cdigo que se compila. Todo esto sirve para que el mantenimiento, la reparacin y la actualizacin del programa sean rpidas y seguras. En el caso de que estas tareas deban desarrollarlas otro programador la documentacin ser imprescindible. Pero ms an, cuando hayan pasado varios meses de hecho el programa, para usted mismo ser imprescindible la documentacin porque ya no podr recordar claramente lo que hizo y le constar mucho volver a entender el programa para poder hacer las modicaciones necesarias. La documentacin puede realizarse en el mismo archivo de texto del programa mediante comentarios. Los comentarios poseen una sintaxis particular y son totalmente ignorados por el compilador. Esta documentacin es denominada Interna ya que se encuentra en el mismo archivo de texto del programa. Por otra parte, cualquier tipo de informacin que no se encuentre en el mismo programa se denomina documentacin externa. La documentacin externa puede consistir por ejemplo en grcas, texto explicativo, manual de usuario, algoritmos en pseudocdigo, etc. Para convertir el algoritmo en un programa, se ha mostrado como muy adecuada la utilizacin de los llamados diagramas de ujo.Un diagrama de ujo es una representacin grca del programa, con la ayuda de smbolos.

Captulo 2 El Lenguaje C
2.1. Marco histrico

El lenguaje C fue creado entre 1970 y 1972 por Brian KERNIGHAN y Dennis RITCHIE para escribir el cdigo del sistema operativo UNIX. Desde su nacimiento se fue implantando como el lenguaje de programacin de sistemas favorito para muchos programadores, sobre todo por ser un lenguaje que conjugaba la abstraccin de los lenguajes de alto nivel con la eciencia del lenguaje mquina. Los programadores de sistemas que trabajaban sobre MS-DOS y Macintosh tambin utilizaban C, con lo cual la prctica totalidad de aplicaciones de sistema para microordenadores y para sistemas UNIX est escrito en este lenguaje. En 1983 el lenguaje C se convierte en un estndar internacional ANSI C (que es el que desarrollaremos). Este estndar incluye tanto la denicin del lenguaje como una enorme biblioteca de funciones para entrada/salida, tratamiento de textos, matemticas, etc. A mediados de los ochenta se crea el C++, extensin de C orientada a objetos. El C++ se convierte en estndar ISO en 1998. En el momento actual, el lenguaje C no va a modicarse ms. Ser el C++ el que incorporar nuevos cambios.

2.2.

Caractersticas

El lenguaje C tiene muy pocas reglas sintcticas, sencillas de aprender. Su lxico es muy reducido: tan solo 32 palabras. A menudo se le llama lenguaje de medio nivel, ms prximo al cdigo mquina que muchos lenguajes de ms alto nivel. Y por eso mismo es un lenguaje muy eciente. Permite el uso del lenguaje ensamblador en partes del cdigo, trabaja a nivel de bit, y permite modicar los datos con operadores que manipulan bit a bit la informacin. Tambin se puede acceder a las diferentes posiciones de memoria conociendo su 15

16

Gustavo A. Yarce

direccin. El lenguaje C permite con facilidad la programacin modular, creando unidades independientes que pueden compilarse de forma independiente, que pueden posteriormente enlazarse. As, se crean funciones o procedimientos, que se pueden compilar y almacenar, creando as bibliotecas de cdigo ya editado y compilado que resuelve distintas operaciones. Cada programador puede disear sus propias bibliotecas, que simplican luego considerablemente el trabajo futuro. El ANSI C posee una amplia coleccin de bibliotecas de funciones estndar y normalizadas.

2.3.

Creacin del programa

Se puede crear un archivo que contenga el programa completo. Se puede usar cualquier editor de textos ordinario con el que se este familiarizado. En caso de usar un entorno Por convencin el nombre del archivo debe terminar con .c por ejemplo: miprograma.c. El contenido del archivo deber obedecer la sintaxis de C.

2.4.

Compilacin de C

En el siguiente apartado se muestran las distintas etapas que cubre el compilador para obtener el cdigo ejecutable: 1. Cdigo Fuente 2. Preprocesador 3. Compilador 4. Cdigo Ensamblador 5. Ensamblador 6. Libreras 7. Cdigo Objeto 8. Ligador 9. Cdigo Ejecutable

Computadoras Electrnicas

17

2.4.1.

Descripcin

El proceso puede ser el globalmente dividido en varios programas: - Preprocesador: el proceso de archivo de origen antes de la compilacin. Que, por ejemplo, controlar y sustituir los archivos de macros e incluir en su fuente. Compilador: transformar su archivo de origen en el cdigo de ensamble (procesador de lenguaje humanamente legible) - Ensamblador: toma el cdigo de ensamble y generar cdigo legible por mquina (cdigo objeto binario) - Linker: rene y resuelve objeto cdigos juntos para crear un nico ejecutable.

2.5.

Entorno de programacin

Un entorno de programacin incluye todas las distintas herramientas de programacin necesarias para trabajar con un lenguaje de programacin en particular. El entorno de C incluye los siguientes componentes: Editores de texto: Permite introducir y modicar el cdigo fuente C. Administrador de proyectos: Un Proyecto es un centro para la gestin los archivos de origen y diferentes opciones. Le ayuda a navegar a travs de su cdigo y congurar fcilmente los distintos parmetros, como el tipo de programa que est haciendo (GUI, consola, DLL...). El preprocesador: Transforma el programa fuente, convirtindolo en otro archivo fuente predigerido. Las transformaciones incluyen: Eliminar los comentarios. Incluir en el fuente el contenido de los cheros declarados con #include <chero>(a estos cheros se les suele llamar cabeceras) Sustituir en el fuente las macros declaradas con #dene (ej. #dene CIEN 100) El compilador: Convierte el cdigo fuente entregado por el preprocesador en un archivo en lenguaje mquina: chero objeto, en un cdigo que comprende el ordenador (cdigo mquina). Algunos compiladores pasan por una fase intermedia en lenguaje ensamblador. El enlazador o linkeador: Un chero objeto es cdigo mquina, pero no se puede ejecutar, porque le falta cdigo que se encuentra en otros archivos binarios. El enlazador genera el ejecutable binario, a partir del contenido de los cheros objetos y de las bibliotecas.

18

Gustavo A. Yarce Depurador o debugger: Habitualmente los programas no se ejecutan correctamente la primera vez despus de compilarlos. Mientras unos errors son fciles de encontrar y corregir, otros pueden ser ms difciles de encontrar debido a la complejidad de los programas o inexperiencia del programador. El depurador o debugger es una herramienta compleja que nos puede ayudar a rastrear el cdigo y corregir esos errores.

Las bibliotecas contienen el cdigo de funciones precompiladas, a las que el archivo fuente llama (por ejemplo printf). El programa editado en C se llama chero fuente. El archivo donde se almacena ese cdigo tendr un nombre (el que se quiera) y la extensin .cpp, o .c. Un programa no es ms que archivo de texto. Al compilar, del chero fuente se llega al cdigo mquina, con el mismo nombre que el archivo donde est el cdigo fuente, y con la extensin .obj. Casi con toda probabilidad en cdigo fuente har uso de funciones que estn ya denidas y precompiladas en las bibliotecas. Ese cdigo precompilado est en archivos con la extensin .lib. Desde luego, para hacer uso de una funcin predenida, es necesario conocer su existencia y tener localizada la biblioteca donde est precompilada; eso es parte del aprendizaje de un lenguaje de programacin, aunque tambin se disponen de grandes ndices de funciones, de fcil acceso para su consulta. Con el archivo .obj y los necesarios .lib que se deseen emplear, se procede al linkado que genera un chero ejecutable con la extensin .exe.

2.6.

Estructura de programa en C

Ejemplo de programa en C #include <stdio.h> main() { /* Escribe un mensaje */ printf (Hola, mundo\n); }

Computadoras Electrnicas /* Preambulo */ # include 1 # include 2 . . . declaracin de funciones . . . denicin de variables globales . . .

19

/* Funcin Principal */ void main(void) { denicin de variables locales; Instrucciones; etc; } /* Funciones secundarias */ funcin 1() { denicin de variables locales instrucciones; etc; } funcin 2() { denicin de variables locales; instrucciones; etc; }

20

Gustavo A. Yarce

2.7.

Bibliotecas estndares

El lenguaje C es muy simple. Carece de tipos y servicios que forman parte de otros lenguajes. No tiene tipo booleano, ni manejo de cadenas, ni manejo de memoria dinmica. No obstante, el estndar de C dene un conjunto de bibliotecas de funciones, que necesariamente vienen con todo entorno de compilacin de C y que satisfacen estos servicios elementales. Las interfaces de estos servicios vienen denidas en unos cheros cabeceras (header les). El nombre de estos cheros suele terminar en .h Algunos de los servicios proporcionados por las bibliotecas estndares son: entrada y salida de datos (stdio.h) manejo de cadenas (string.h) memoria dinmica (stdlib.h) rutinas matemticas (math.h)

2.8.

Componentes del lenguaje C


literales tipos bsicos (todos numricos) tipos enumerados tipos estructurados (struct, union) punteros y vectores

Estructuras de datos

Construcciones algortmicas construcciones condicionales (if,switch) construcciones iterativas(while,for,do...while)

Computadoras Electrnicas subrutinas (funciones)

21

Adems de lo anterior, el C tiene otros elementos: comentarios inclusin de cheros macros compilacin condicional

2.9.

Estructura de un chero fuente

Un chero fuente en lenguaje C tendr esta estructura tpica: #include <biblioteca1.h> #include <biblioteca2.h> ... declaraciones de funciones ... ... definiciones (cuerpos de funciones) ... ... declaraciones de variables globales ... main() { ... cuerpo del main ... } ... otras definiciones de funciones ...

main es simplemente una funcin ms del programa, con la particularidad de que es el punto de entrada al programa.

2.10.

Comentarios

En C, tienen la forma /* cualquier texto */

22

Gustavo A. Yarce

2.11.

CONSTANTES

Se dene a una constante, como un elemento cuyo valor que no puede alterarse en el transcurso de la ejecucin de un algoritmo. Por ejemplo: 123, Lpez, 3.14459. Las constantes mantienen su valor a lo largo de todo el programa. Para indicar al compilador que se trata de una constante, usaremos la directiva #dene:

# define <identificador> <valor> Observa que no se indica el punto y coma de nal de sentencia ni tampoco el tipo de dato. La directiva #dene no slo nos permite sustituir un nombre por un valor numrico, sin tambin por una cadena de caracteres. El valor de una constante no puede ser modicado de ninguna manera.

Ejemplo 2.1 Constantes


/* Uso de las constantes */ #include <stdio.h> #define pi 3.1416 #define escribe printf main() /* Calcula el permetro */ { int r; escribe("Introduce el radio: "); scanf("%d",&r); escribe("El permetro es: %f",2*pi*r); }

2.12.

Variables

En un programa existen otros elementos cuyo valor cambia durante la ejecucin del mismo, llamados variables. Una variable es un elemento o lugar asociado a un valor el que puede variar conforme se ejecuta el algoritmo, se representa por un nombre que identica a una

Computadoras Electrnicas

23

posicin de memoria donde puede asignarse o almacenarse un nico valor por vez. Para proponer el nombre de una variable observaremos tres reglas simples:

1. Utilizar slo letras y/o dgitos, comenzando siempre con una letra. 2. No utilizar las palabras claves o reservadas del lenguaje de codicacin (por ahora, no endremos incovenientes en este aspecto, pues usaremos diagramas de ujo); o para las funciones internas o predenidas: RC, SEN, TRUNC, LN, etc. 3. No hacer distincin entre maysculas y minsculas. Esto implica que VENTA, venta y Venta, constituyen en el algoritmo la misma variable. Una variable slo puede pertenecer a un tipo de dato. Para poder utilizar una variable, primero tiene que ser declarada: [calificador] <tipo> <nombre> Es posible inicializar y declarar ms de una variable del mismo tipo en la misma sentencia: [calificador] <tipo> <nombre1>,<nombre2>=<valor>,<nombre3>=<valor>

Ejemplo 2.2 Variables


/* Uso de las variables */ #include <stdio.h> #include <conio2.h> main() /* Suma dos valores */ { int num1=4,num2,num3=6; printf("El valor de num1 es %d",num1); printf("\nEl valor de num3 es %d",num3); num2=num1+num3; printf("\nnum1 + num3 = %d",num2); getch(); }

24

Gustavo A. Yarce

2.12.1.

Variables locales y globales

Las variables pueden ser de dos tipos segn el lugar en que las declaremos: globales o locales. La variable global se declara antes de la main( ). Puede ser utilizada en cualquier parte del programa y se destruye al nalizar ste. La variable local se declara despus de la main( ), en la funcin en que vaya a ser utilizada. Slo existe dentro de la funcin en que se declara y se destruye al nalizar dicha funcin. Si una variable se declara dentro de una funcin, ser visible solo dentro de sta:

funcion1 () { char letra; .... }

En el ejemplo anterior, la variable tipo char llamada letra solo podr utilizarse dentro de la funcin funcion1(). Si intentamos utilizarla fuera de ella, el compilador nos dar un error. Si declaramos una variable fuera de cualquier funcin, el alcance de esta sera global, lo que quiere decir que estar disponible en cualquier parte de nuestro programa. Vemos un ejemplo de este ltimo caso. char letra; main() { .... }

funcion1() { ... }

Computadoras Electrnicas

25

La variable tipo char llamada letra podr utilizarse dentro de main() o de funcion1().

Ejemplo 2.3 Variables locales y globales


/* Declaracin de variables */ #include <stdio.h> #include <conio2.h> int a; main() /* Muestra dos valores */ { int b=4; printf("b es local y vale %d",b); a=5; printf("\na es global y vale %d",a); getch)(); }

2.13.

Tipos de datos

En C existen bsicamente cuatro tipos de datos, aunque como se ver despus, podremos denir nuestros propios tipos de datos a partir de estos cuatro. A continuacin se detalla su nombre, el tamao que ocupa en memoria y el rango de sus posibles valores. Tipo char int oat double Tamao 1 byte 2 bytes 4 bytes 8 bytes Rango de Valores -128 a 127 -32768 a 32767 3.4 E-38 a 3.4 E+38 1.7 E-308 a 1.7 E+308

Tabla 2.1: Tipos de datos

26

Gustavo A. Yarce

2.13.1.

Calicadores de tipo

Los calicadores de tipo tienen la misin de modicar el rango de valores de un determinado tipo de variable. Estos calicadores son cuatro: signed: Le indica a la variable que va a llevar signo. Es el utilizado por defecto. Tipo signed char signed int Tamao 1 byte 2 bytes Rango de Valores -128 a 127 -32768 a 32767

Tabla 2.2: Tipo signed

unsigned: Le indica a la variable que no va a llevar signo (valor absoluto). Tipo unsigned char unsigned int Tamao 1 byte 2 bytes Rango de Valores 0 a 255 0 a 65535

Tabla 2.3: Tipo unsigned

short: Rango de valores en formato corto (limitado). Es el utilizado por defecto. Tipo short char short int Tamao 1 byte 2 bytes Rango de Valores -128 a 127 -32768 a 32767

Tabla 2.4: Tipo short

long: Rango de valores en formato largo (ampliado). Tipo long int long double Tamao 4 bytes 10 bytes Rango de Valores -2.147.483.648 a 2.147.483.647 -3.36 E-4932 a 1.18 E+4932

Tabla 2.5: Tipo long

Tambin es posible combinar calicadores entre s:

Computadoras Electrnicas signed long int = long int = long unsigned long int = unsigned long 4 bytes (El mayor entero permitido en C) 0 a 4.294.967.295

27

2.13.2.

Conversiones entre tipos

El compilador nos permite mezclar diferentes tipos de variables dentro de una misma expresin. Y existen un conjunto de reglas que nos permiten saber que de que tipo ser el resultado de la misma. Por ejemplo, el compilador convertir automticamente a int cualquier expresin que contenga variables char, short o int. Esta conversin solo tiene efecto mientras se realizan los clculos. Las variables en s mismas no cambian su tipo. Las reglas de conversin de tipos hacen que el resultado de una operacin sea siempre el mismo que el de la variable ms larga que intervenga en ella. Sin embargo, podemos forzar a que el resultado sea de un tipo en particular, de la siguiente forma:

(tipo) valor

donde tipo es el tipo al que queremos que pertenezca valor.

2.14.

Secuencias de escape

Ciertos caracteres no representados grcamente se pueden representar mediante lo que se conoce como secuencia de escape. A continuacin vemos una tabla de las ms signicativas:

28 \n salto de lnea \b retroceso \t tabulacin horizontal \v tabulacin vertical \\ contrabarra \f salto de pgina \apstrofe \" comillas dobles \0 fin de una cadena de caracteres /* Uso de las secuencias de escape */ #include <stdio.h> #include <conio2.h> main() /* Escribe diversas sec. de escape */ { printf("Me llamo \"Nemo\" el grande"); printf("\nDireccin: C\\ Mayor 25"); printf("\nHa salido la letra \L\"); printf("\nRetroceso\b"); printf("\n\tEsto ha sido todo"); getch(); }

Gustavo A. Yarce

2.15.

Inclusin de archivos

En la programacin en C es posible utilizar funciones que no estn incluidas en el propio programa. Para ello utilizamos la directiva #include, que nos permite aadir libreras o funciones que se encuentran en otros cheros a nuestro programa. Para indicar al compilador que vamos a incluir cheros externos podemos hacerlo de dos maneras (siempre antes de las declaraciones). 1. Indicndole al compilador la ruta donde se encuentra el chero. #include "misfunc.h" #include "c:\includes\misfunc.h"

Computadoras Electrnicas 2. Indicando que se encuentran en el directorio por defecto del compilador. #include <misfunc.h>

29

2.16.

Operadores aritmticos

Existen dos tipos de operadores aritmticos: 1. binarios: + Suma -Resta * Multiplicacin / Divisin % Mdulo (resto) Su sintaxis es: <variable1><operador><variable2>

2. unarios: ++ Incremento (suma 1) - -Decremento (resta 1) - Cambio de signo Su sintaxis es: <variable><operador> y al revs, <operador><variable>.

Ejemplo 2.4 Operadores


/* Uso de los operadores aritmticos */

30 #include <stdio.h> #include <conio2.h> main() /* Realiza varias operaciones */ { int a=1,b=2,c=3,r; r=a+b; printf("%d + %d = %d\n",a,b,r); r=c-a; printf("%d - %d = %d\n",c,a,r); b++; printf("b + 1 = %d",b); getch(); }

Gustavo A. Yarce

2.17.

Operadores de asignacin

La mayora de los operadores aritmticos binarios explicados en el captulo anterior tienen su correspondiente operador de asignacin: = Asignacin simple += Suma -= Resta *= Multiplicacin /= Divisin %= Mdulo (resto) Con estos operadores se pueden escribir, de forma ms breve, expresiones del tipo:

n=n+3 se puede escribir n+=3 k=k*(x-2) lo podemos sustituir por k*=x-2

Ejemplo 2.5
/* Uso de los operadores de asignacin */ #include <stdio.h> #include <conio2.h>

Computadoras Electrnicas

31

main() /* Realiza varias operaciones */ { int a=1,b=2,c=3,r; a+=5; printf("a + 5 = %d\n",a); c-=1; printf("c - 1 = %d\n",c); b*=3; printf("b * 3 = %d",b); getch(); }

2.18.

Jerarqua de los operadores

Ser importante tener en cuenta la precedencia de los operadores a la hora de trabajar con ellos: ( ) Mayor precedencia ++, - *, /, % +, -Menor precendencia Las operaciones con mayor precedencia se realizan antes que las de menor precedencia. Si en una operacin encontramos signos del mismo nivel de precedencia, dicha operacin se realiza de izquierda a derecha. A continuacin se muestra un ejemplo sobre ello:

a*b+c/d-e 1. a*b resultado = x 2. c/d resultado = y 3. x+y resultado = z 4. z-e Fijarse que la multiplicacin se resuelve antes que la divisin ya que est situada ms a la izquierda en la operacin. Lo mismo ocurre con la suma y la resta.

32

Gustavo A. Yarce

Ejemplo 2.6 /* Jerarqua de los operadores */


#include <stdio.h> #include <conio2.h> main() /* Realiza una operacin */ { int a=6,b=5,c=4,d=2,e=1,x,y,z,r; x=a*b; printf("%d * %d = %d\n",a,b,x); y=c/d; printf("%d / %d = %d\n",c,d,y); z=x+y; printf("%d + %d = %d\n",x,y,z); r=z-e; printf("%d = %d",r,a*b+c/d-e); getch(); }

2.19.

Sentencia printf

La rutina printf permite la aparicin de valores numricos, caracteres y cadenas de texto por pantalla. El prototipo de la sentencia printf es el siguiente:

printf(control,arg1,arg2...); En la cadena de control indicamos la forma en que se mostrarn los argumentos posteriores. Tambin podemos introducir una cadena de texto ( sin necesidad de argumentos ), o combinar ambas posibilidades, as como Secuencias de escape (2.14).

En el caso de que utilicemos argumentos deberemos indicar en la cadena de control tantos modicadores como argumentos vayamos a presentar. El modicador est compuesto por el caracter

Ejemplo 2.7 /* Uso de la sentencia printf() 1. */


#include <stdio.h>

Computadoras Electrnicas #include <conio2.h> main() /* Saca por pantalla una suma */ { int a=20,b=10; printf("El valor de a es %d\n",a); printf("El valor de b es %d\n",b); printf("Por tanto %d+%d=%d",a,b,a+b); getch(); }

33

2.19.1.

Modicadores

La funcin printf tiene un carcter especial para formateo % un carcter(modicador) que dene un cierto tipo de formato para una variable. La sentencia printf(scanf) se encierra entre comillas , y enseguida las variables. Se debe asegurar que el orden de formateo y los tipos de datos de las variables coincidan, es decir, debe existir correspondencia entre las variables y los formatos. Los modicadores ms utilizados son: %c %d %u %o %x %e %f %s %p Un nico caracter Un entero con signo, en base decimal Un entero sin signo, en base decimal Un entero en base octal Un entero en base hexadecimal Un nmero real en coma flotante, con exponente Un nmero real en coma flotante, sin exponente Una cadena de caracteres Un puntero o direccin de memoria

Ejemplo 2.8
/* Uso de la sentencia printf() 2. */ #include <stdio.h> #include <conio2.h> main() /* Modificadores 1 */ {

34 char cad[]="El valor de"; int a=-15; unsigned int b=3; float c=932.5; printf("%s a es %d\n",cad,a); printf("%s b es %u\n",cad,b); printf("%s c es %e o %f",cad,c,c); getch(); }

Gustavo A. Yarce

El formato completo de los modicadores es el siguiente:

% [signo] [longitud] [.precisin] [l/L] conversin Signo: indicamos si el valor se ajustar a la izquierda, en cuyo caso utilizaremos el signo menos, o a la derecha ( por defecto ). Longitud: especica la longitud mxima del valor que aparece por pantalla. Si la longitud es menor que el nmero de dgitos del valor, ste aparecer ajustado a la izquierda. Precisin: indicamos el nmero mximo de decimales que tendr el valor. l/L: utilizamos l cuando se trata de una variable de tipo long y L cuando es de tipo double.

Ejemplo 2.9 /* Uso de la sentencia printf() 3. */


#include <stdio.h> #include <conio2.h> main() /* Modificadores 2 */ { char cad[ ]="El valor de"; int a=25986; long int b=1976524; float c=9.57645; printf("%s a es %9d\n",cad,a); printf("%s b es %ld\n",cad,b);

Computadoras Electrnicas printf("%s c es %.3f",cad,c); getch(); }

35

2.20.

Sentencia scanf

La rutina scanf permite entrar datos en la memoria del ordenador a travs del teclado. El prototipo de la sentencia scanf es el siguiente: scanf(control,arg1,arg2...); En la cadena de control indicaremos, por regla general, los modicadores 2.19.1 que harn referencia al tipo de dato de los argumentos. Al igual que en la sentencia printf los modicadores 2.19.1 estarn formados por el caracter % seguido de un caracter de conversin. Los argumentos indicados sern, nuevamente, las variables.

La principal caracterstica de la sentencia scanf es que necesita saber la posicin de la memoria del ordenador en que se encuentra la variable para poder almacenar la informacin obtenida. Para indicarle esta posicin utilizaremos el smbolo ampersand ( & ), conocido como operador de direccin, que colocaremos delante del nombre de cada variable. ( Esto no ser necesario en los arrays ).

Ejemplo 2.10 /* Uso de la sentencia scanf(). */


#include <stdio.h> #include <conio2.h> main() /* Solicita dos datos */ { char nombre[10]; int edad; printf("Introduce tu nombre: "); scanf("%s",nombre); printf("Introduce tu edad: "); scanf("%d",&edad); getch(); }

36

Gustavo A. Yarce

2.21.

Pantalla en modo texto

Las funciones aadidas para manejo de la pantalla en Lenguaje C, se encuentran accesibles a travs del chero de cabecera onio2.h c . En l encontramos funciones como: gotoxy - Desplaza el cursor a ciertas coordenadas. textcolor - Cambia el color del texto (el de primer plano). textbackground - Cambia el color del texto (el de fondo). textattr - Cambia el color (fondo y primer plano) del texto. cprintf - Escribe un mensaje en color. cputs - Escribe una cadena de texto en color. clrscr - Borra la pantalla. clreol - Borra hasta el nal de la lnea actual. textmode - Cambia el modo de pantalla. getche - Espera hasta que se pulse una tecla, y la muestra en pantalla. getch - Espera hasta que se pulse una tecla, pero no la muestra en pantalla. kbhit - Comprueba si se ha pulsado alguna tecla (pero no espera). wherex - Devuelve la coordenada x (columna) en que se encuentra el cursor. wherey - Devuelve la coordenada (la) en que se encuentra el cursor. window - Permite crear una ventana dentro de la pantalla. A partir de entonces, las rdenes como gotoxye referirn slo a esa ventana, no al total s de la pantalla.

Los colores de la pantalla se indican por nmeros. Por ejemplo: 0 es el negro, 1 es el azul oscuro, 2 el verde, 3 el azul claro, 4 el rojo, etc. Aun as, para no tener que recordarlos, tenemos denidas constantes con su nombre en ingls:

Computadoras Electrnicas BLACK BLUE GREEN CYAN RED MAGENTA BROWN LIGHTGRAY DARKGRAY LIGHTBLUE LIGHTGREEN LIGHTCYAN LIGHTRED LIGHTMAGENTA YELLOW WHITE

37

Una ltima consideracin: en MsDos slo se pueden usar como colores de fondo los 7 primeros: desde BLACK hasta LIGHTGRAY. Esto se puede evitar con las pantallas VGA, a cambio de perder la posibilidad de que el texto parpadee, pero no voy a entrar en esos detalles. El caso es que normalmentei hacemos algo como s textbackground(LIGHTBLUE); no obtendremos los resultados esperados, sino que ser como si hubisemos utilizado el equivalente en el rango de 0 a 7: textbackground(BLUE);

38

Gustavo A. Yarce /* Para funciones de pantalla */

Ejemplo 2.11 #include <conio2.h>


int i,j;

/* Para los bucles "for" */

main() { textbackground(BLUE); /* Fondo de la pantalla en azul */ clrscr(); /* Borro la pantalla */ for(i=0; i<=1; i++) /* Dos columnas */ for(j=0; j<=15; j++) /* Los 16 colores */ { gotoxy(10+ 40*i , 3+j); /* Coloco el cursor */ textcolor(j); /* Elijo el color */ if (j == 0) /* Si el color es 0 (negro) */ textbackground(LIGHTGRAY); /* dejo fondo gris */ else /* Si es otro color */ textbackground(BLACK); /* dejo fondo negro */ cprintf(" Este es el color %d ",j); /* Escribo en color */ } getch(); /* Final: espero a que se pulse una tecla, sin mostrarla */ }

Captulo 3 Control de ujo de ejecucin


Este tipo de sentencias permiten variar el ujo del programa en base a unas determinadas condiciones. Existen varias estructuras diferentes:

3.1.

Operadores relacionales

Los operadores relacionales se utilizan para comparar el contenido de dos variables. En C existen seis operadores relacionales bsicos:

>Mayor que <Menor que >= Mayor o igual que <= Menor o igual que == Igual que != Distinto que

El resultado que devuelven estos operadores es 1 para Verdadero y 0 para Falso. Si hay ms de un operador se evalan de izquierda a derecha. Adems los operadores == y != estn por debajo del resto en cuanto al orden de precedencia.

3.2.

Estructura IF...ELSE

Sintaxis: 39

40 if (condicin) sentencia1; else sentencia2;

Gustavo A. Yarce

La parte del else es optativa. La condicn se evala, si es verdadera, la sentencia1 se ejecuta. Si la condicin es falsa y si existe un else, la sentencia2 se ejecuta.

Ejemplo 3.1 /* Uso de la sentencia condicional IF. */


#include <stdio.h> main() /* Simula una clave de acceso */ { int usuario,clave=18276; printf("Introduce tu clave: "); scanf("%d",&usuario); if(usuario==clave) printf("Acceso permitido"); else printf("Acceso denegado"); }

3.2.1.

Estructura IF...ELSE IF...

Sintaxis: if (condicin) sentencia1; else if (condicin) sentencia2; else if (condicin) sentencia3; else sentencia4; Esta secuencia de instrucciones if es la forma mas general de escribir una decisin mltiple. Las condiciones se evaluan en orden; si cualquier condicin es verdadera, la sentencia asociada a ella se ejecuta, y esto termina toda la cadena. La sentencia puede ser una nica sentencia o un grupo de sentencias contenidas entre un par de llaves.

Computadoras Electrnicas

41

Ejemplo 3.2 /* Uso de la sentencia condicional ELSE...IF. */


#include <stdio.h> main() /* Escribe beb, nio o adulto */ { int edad; printf("Introduce tu edad: "); scanf("%d",&edad); if (edad<1) printf("Lo siento, te has equivocado."); else if (edad<3) printf("Eres un beb"); else if (edad<13) printf("Eres un nio"); else printf("Eres adulto"); } switch (variable){ case contenido_variable1: sentencias; case contenido_variable1: sentencias; default:

3.3.

Estructura SWITCH

Esta estructura se suele utilizar en los mens, de manera que segn la opcin seleccionada se ejecuten una serie de sentencias. Su sintaxis es: switch (variable){ case contenido_variable1: sentencias; break; case contenido_variable2: sentencias; break; default: sentencias; } Cada case puede incluir una o ms sentencias sin necesidad de ir entre llaves, ya que se ejecutan todas hasta que se encuentra la sentencia BREAK. La variable

42

Gustavo A. Yarce

evaluada slo puede ser de tipo entero o caracter. default ejecutar las sentencias que incluya, en caso de que la opcin escogida no exista.

Ejemplo 3.3 /* Uso de la sentencia condicional SWITCH. */


#include <stdio.h> main() /* Escribe el da de la semana */ { int dia; printf("Introduce el da: "); scanf("%d",&dia); switch(dia){ case 1: printf("Lunes"); break; case 2: printf("Martes"); break; case 3: printf("Mircoles"); break; case 4: printf("Jueves"); break; case 5: printf("Viernes"); break; case 6: printf("Sbado"); break; case 7: printf("Domingo"); break; } }

Captulo 4 Control de Programas


La mayor parte de los programas incluyen repeticiones o ciclos. Los bucles son estructuras que permiten ejecutar partes del cdigo de forma repetida mientras se cumpla una condicin. Esta condicin puede ser simple o compuesta de otras condiciones unidas por operadores lgicos. Segn cmo queramos que se controle ese bucle, tenemos tres posibilidades, que bsicamene se pueden describir como: for: La orden se repite desde que una variable tiene un valor inicial hasta que alcanza otro valor nal. while: Repite una sentencia mientras que sea cierta la condicin que indicamos. La condicin se comprueba antes de realizar la sentencia. do..while: Igual, pero la condicin se comprueba despus de realizar la sentencia. Las diferencias son: for normalmente se usa para algo que se repite un nmero jo de veces, mientras que "while"se basa en comprobar si una condicin es cierta, se repetir un nmero mienstras se cumpla la condicin.

4.1.

Instruccin FOR

Su sintaxis es: for (inicializacin;condicin;incremento) { 43

44 sentencia1; sentencia2; }

Gustavo A. Yarce

La inicializacin indica una variable (variable de control) que condiciona( 3.1) la repeticin del bucle. Si hay ms, van separadas por comas:

Ejemplo 4.1 /* Uso de la sentencia FOR. */


#include <stdio.h> #include <conio2.h> main() /* Escribe la tabla de multiplicar */ { int num,x,result; printf("Introduce un nmero: "); scanf("%d",&num); for (x=0;x<=10;x++) { result=num*x; printf("\n%d por %d = %d\n",num,x,result); } getch(); } Pueden utilizarse dos condiciones en un bucle for(Inicializacin1,inicializacin2;condicin1,condicin2;incremento1,incremento2) El programa sigue avanzando,no se sale del bucle for, hasta que se cumplen las dos condiciones.

4.2.

Instruccin WHILE

Con esta sentencia se controla la condicin antes de entrar en el bucle. Si sta no se cumple, el programa no entrar en el bucle. Naturalmente, si en el interior del bucle hay ms de una sentencia, stas debern ir entre llaves para que se ejecuten como un bloque. Su sintaxis es:

Computadoras Electrnicas while (condicin) sentencia;

45

Ejemplo 4.2 /* Uso de la sentencia WHILE. */


#include <stdio.h> #include <conio2.h> main() /* Escribe los nmeros del 1 al 10 */ { int numero=1; while(numero<=10) { printf("%d\n",numero); numero++; } getch(); }

4.3.

Instruccin DO...WHILE

Con esta sentencia se controla la condicin al nal del bucle. Si sta se cumple, el programa vuelve a ejecutar las sentencias del bucle. La nica diferencia entre las sentencias while y do...while es que con la segunda el cuerpo del bucle se ejecutar por lo menos una vez. Su sintaxis es:

do{ sentencia1; sentencia2; }while (condicin);

Ejemplo 4.3 /* Uso de la sentencia DO...WHILE. */


#include <stdio.h> #include <conio2.h> main() /* Muestra un men si no se pulsa 4 */

46 { char seleccion; do{ printf("1.- Comenzar\n"); printf("2.- Abrir\n"); printf("3.- Grabar\n"); printf("4.- Salir\n"); printf("Escoge una opcin: "); seleccion=getchar(); switch(seleccion){ case 1:printf("Opcin 1"); break; case 2:printf("Opcin 2"); break; case 3:printf("Opcin 3"); } }while(seleccion!=4); }

Gustavo A. Yarce

Captulo 5 Funciones
La programacin estructurada trata de dividir el programa en bloques ms pequeos, buscando una mayor legibilidad, y ms comodidad a la hora de corregir o ampliar. La idea es que un programa que cumpla una cierta misin tendr que seguir ciertos pasos. Por ejemplo: para resolver un sistema de ecuaciones, los pasos podran ser: Pedir Nmero de Ecuaciones y de Incgnitas. Para cada ecuacin: Pedir coecientes de x(i). Pedir trmino independiente. Escribir el sistema como matriz. Hacer ceros bajo la diagonal principal. Aplicar sustitucin regresiva. Mostrar resultados. Esos son los pasos que uno piensa cuando se plantea cmo resolver el problema (el algoritmo), pensamos en cosas a hacer, no en lneas de programa, por eso la forma ms natural de trabajar es descomponer el problema en partes, en vez de intentar resolverlo tecleando una lnea tras otra. Es la clsica idea del divide y vencers: un programa que hayamos dividido en bloques (con una cierta conexin, no a lo loco) ser ms fcil de crear y de mantener. En muchos lenguajes de programacin, como Pascal, estos bloques son de dos tipos: procedimientos (procedure) y funciones (function). 47

48

Gustavo A. Yarce

La diferencia entre ellos es que un procedimiento ejecuta una serie de acciones que estn relacionadas entre s, y no devuelve ningn valor, mientras que la funcin s que va a devolver valores. Por ejemplo, un procedimiento podra saludarnos: realizar una determinada cantidad de instrucciones, muestra un mensaje en pantalla y terminar. Saluda; Por el contrario una funcin podra ser la raz cuadrada: realizar una determinada cantidad de instrucciones, destinados a calcular cual es el valor, pero nalmente tiene que respondernos diciendo qu valor ha obtenido. x = Raiz(9); (y el ordenador debe devolverme el nmero: 3) En C slo existen funciones, pero stas pueden devolver unos valores de tipo nulo, con lo cual equivale a un procedimiento. Su sintaxis es: "tipo funcin" "nombre funcin" (tipo y nombre de argumentos) { bloque de sentencias } tipo funcin: puede ser de cualquier tipo de los que conocemos. El valor devuelto por la funcin ser de este tipo. Por defecto, es decir, si no indicamos el tipo, la funcin devolver un valor de tipo entero (int). Si no queremos que retorne ningn valor deberemos indicar el tipo vaco (void). nombre funcin: es el nombre que le daremos a la funcin. tipo y nombre de argumentos: son los parmetros que recibe la funcin. Los argumentos de una funcin no son ms que variables locales que reciben un valor. Este valor se lo enviamos al hacer la llamada a la funcin. Pueden existir funciones que no reciban argumentos. bloque de sentencias: es el conjunto de sentencias que sern ejecutadas cuando se realice la llamada a la funcin. Las funciones pueden ser llamadas desde la funcin main o desde otras funciones. Nunca se debe llamar a la funcin main desde otro lugar del programa. Por ltimo recalcar que los argumentos de la funcin y sus variables locales se destruirn al nalizar la ejecucin de la misma.

Computadoras Electrnicas

49

Ejemplo 5.1

#include <stdio.h> #include <conio.h> int potencia(int base, int exponente) { int temporal = 1; int i; for(i=1; i<=exponente; i++) temporal =temporal*base; return temporal; }

/* Valor que voy hallando */ /* Para bucles */ /* Multiplico "n" veces */ /* Y calculo el valor temporal */ /* Al final de las multiplicaciones, */ /* obtengo el valor que buscaba */

main() { int num1, num2; printf("Introduzca la base: "); scanf("%d", &num1); printf("Introduzca el exponente: "); scanf("%d", &num2); printf("%d elevado a %d vale %d", num1, num2, potencia(num1,num2)); getch(); }

base y exponente son dos valores que se le pasan a la funcin: son sus parmetros, unos datos que la funcin necesita. En nuestro caso, queremos elevar un nmero a otro, luego deberemos indicarle cual es el nmero que queremos elevar (la base) y a qu nmero lo queremos elevar (el exponente). El cuerpo de la funcin se indica entre llaves, como cualquier otro bloque de un programa. i y temporal son variables locales a la funcin potencia: no se puede acceder a ellas desde ninguna otra parte del programa. Igual ocurre con num1 y num2: slo se pueden leer o modicar desde main. Las variables que habamos visto hasta ahora no estaban dentro de ninguna funcin, por lo que eran globales a todo el programa. Un detalle importante: las variables

50

Gustavo A. Yarce locales se debern declarar al principio de la funcin, antes de que aparezca ninguna orden. Con return salimos de la funcin e indicamos el valor que queremos que se devuelva. En este caso es lo que habamos llamado temporal, que era el valor que bamos calculando para la potencia en cada paso. Si no queremos que retorne ningn valor deberemos indicar el tipo vacio (void).

Ejemplo 5.2

#include <stdio.h> #include <conio.h> void saludo(char nombre[]) { printf("Hola %s ", nombre); } main() { saludo("Eva"); printf("\n"); getch(); } Esta funcin es de tipo void (nulo), con lo que indicamos que no queremos que devuelva ningn valor. char nombre[] indicamos que le vamos a pasar una cadena de caracteres, pero no hace falta que digamos su tamao. As podremos pasar cadenas de caracteres tan grandes (o tan pequeas) como queramos. Esta funcin no termina en return, porque no queremos que devuelva ningn valor.

Tenemos que main es una funcin, de tipo entero (se considera as si no se indica el tipo, que es lo que estbamos haciendo hasta ahora), por lo que, podemos escribir de otra forma el ejemplo de la potencia, sera:

Ejemplo 5.3

#include <stdio.h> #include <conio.h> int potencia(int base, int exponente)

Computadoras Electrnicas { int temporal = 1; int i; for(i=1; i<=exponente; i++) temporal =temporal*base; return temporal; }

51

/* Valor que voy hallando */ /* Para bucles */ /* Multiplico "n" veces */ /* Y calculo el valor temporal */ /* Al final de las multiplicaciones, */ /* obtengo el valor que buscaba */

int main() { int num1, num2; printf("Introduzca la base: "); scanf("%d", &num1); printf("Introduzca el exponente: "); scanf("%d", &num2); printf("%d elevado a %d vale %d", num1, num2, potencia(num1,num2)); getch(); return 0; }

Las funciones pueden declararse antes de la funcin main y luego escribir el cuerpo de la funcin en otro lugar.

Ejemplo 5.4 #include <stdio.h>


#include <conio.h> void funcion(void); /* declaracin de la funcin int num=5; /* variable global */ */

main() /* Escribe dos nmeros */ { int num=10; /* variable local */ printf("%d este valor corresponde a una variable local \n",num);

52 funcion(); /* llamada */ getch(); }

Gustavo A. Yarce

/*Cuerpo de la funcin*/ void funcion(void) { printf("%d este valor corresponde a una variable global \n",num); }

En el ejemplo podemos ver la declaracin de una funcin . Al no recibir ni retornar ningn valor, est declarada como void en ambos lados. Tambin vemos que existe una variable global llamada num. Esta variable es reconocible en todas las funciones del programa. Ya en la funcin main encontramos una variable local llamada num. Al ser una variable local, sta tendr preferencia sobre la global. Por tanto la funcin escribir los nmeros 10 y 5.

Las funciones tambin pueden ser escritas en otro archivo. En este caso se lo indicaremos al compilador mediante la directiva #include.

Ejemplo 5.5

#include <stdio.h> #include <conio.h> #include <c:\potencia.cpp> main() { int num1, num2; printf("Introduzca la base: "); scanf("%d", &num1); printf("Introduzca el exponente: "); scanf("%d", &num2); printf("%d elevado a %d vale %d", num1, num2, potencia(num1,num2)); getch(); }

Computadoras Electrnicas

53

5.1.

Paso de parmetros a una funcin

Como ya hemos visto, las funciones pueden retornar un valor. Esto se hace mediante la instruccin return, que naliza la ejecucin de la funcin, devolviendo o no un valor. En una misma funcin podemos tener ms de una instruccin return. La forma de retornar un valor es la siguiente: return ( valor o expresin ); El valor devuelto por la funcin debe asignarse a una variable. De lo contrario, el valor se perder. En el ejemplo puedes ver lo que ocurre si no guardamos el valor en una variable. Fjate que a la hora de mostrar el resultado de la suma, en el printf, tambin podemos llamar a la funcin.

Ejemplo 5.6 #include <stdio.h>


#include <conio.h> int suma(int a,int b) { return (a+b); } main() /* Realiza una suma */ { int a=10,b=25,t; t=suma(a,b); /* guardamos el valor */ printf("%d=%d",suma(a,b),t); suma(a,b); /* el valor se pierde */ getch(); }

Paso de parmetros. Existen dos formas de enviar parmetros a una funcin: Por valor: cualquier cambio que se realice dentro de la funcin en el argumento enviado, NO afectar al valor original de las variables utilizadas

54

Gustavo A. Yarce en la llamada. Es como si trabajaramos con una copia, no con el original. No es posible enviar por valor arrays, deberemos hacerlo por referencia. Por referencia: lo que hacemos es enviar a la funcin la direccin de memoria donde se encuentra la variable o dato. Cualquier modicacin SI afectar a las variables utilizadas en la llamada. Trabajamos directamente con el original.

Ejemplo 5.7
#include <stdio.h> #include <conio.h> void intercambio (int x,int y) { int aux; aux=x; x=y; y=aux; printf("a=%d y b=%d",x,y); }

main() /* Intercambio de valores */ { int a=1,b=2; printf("a=%d y b=%d",a,b); intercambio(a,b); /* llamada */ printf("a=%d y b=%d",a,b); getch(); }

Para enviar un valor por referencia se utiliza el smbolo & ( ampersand ) delante de la variable enviada. Esto le indica al compilador que la funcin que se ejecutar tendra que obtener la direccin de memoria en que se encuentra la variable. Vamos a jarnos en los ejemplos. En el ejemplo anterior podrs comprobar que antes y despus de la llamada, las variables mantienen su valor. Solamente se modica en la funcin intercambio ( paso por valor ). En el siguiente ejemplo podrs ver como las variables intercambian su valor tras la llamada de la funcin ( paso por referencia ).

Computadoras Electrnicas

55

Las variables con un * son conocidas como punteros, el nico dato en C que puede almacenar una direccin de memoria.

Ejemplo 5.8
/* Paso por referencia. */ #include <stdio.h> #include <conio.h>

void intercambio (int *x,int *y) { int aux; aux=*x; *x=*y; *y=aux; printf("a=%d y b=%d",*x,*y); } main() /* Intercambio de valores */ { int a=1,b=2; printf("a=%d y b=%d",a,b); intercambio(&a,&b); /* llamada */ printf("a=%d y b=%d",a,b); getch(); }

Recursividad La idea es simplemente que una funcin recursiva es aquella que se llama a s misma. El ejemplo clsico es el factorial de un nmero: Partimos de la denicin de factorial: el factorial de un nmero es n! = n (n-1) (n-2) ... 3 2 1

Por otra parte, el factorial n-1 es

56 (n-1)! = (n-1) (n-2) (n-3) ... 3 2 1

Gustavo A. Yarce

Luego podemos escribir cada factorial en funcin del factorial del siguiente nmero: n! = n (n-1)!

Pues esta es la denicin recursiva del factorial, ni ms ni menos. Esto, programando, se hara:

Ejemplo 5.9 #include <stdio.h>


#include <conio.h> long fact(int n) { if (n==1) return 1; return n * fact (n-1); }

/* Aseguramos que termine */ /* Si no es 1, sigue la recursin */

main() { int num; printf("Introduzca un nmero entero: "); scanf("%d", &num); printf("Su factorial es: %ld\n", fact(num)); getch(); }

Captulo 6 Arrays
6.1. Vectores

Vectores Un vector es un array unidimensional, es decir, slo utiliza un ndice para referenciar a cada uno de los elementos. Su declaracin ser: tipo nombre [tamao]; El tipo puede ser cualquiera de los ya conocidos y el tamao indica el nmero de elementos del vector ( se debe indicar entre corchetes [ ] ). El primer elemento de cualquier vector es el elemento cero. En el ejemplo puedes observar que la variable i es utilizada como ndice, el primer for sirve para rellenar el vector y el segundo para visualizarlo. Como ves, las posiciones van de 0 a 9 ( total 10 elementos ). Podemos inicializar (asignarle valores) un vector en el momento de declararlo. Si lo hacemos as no es necesario indicar el tamao. Su sintaxis es: tipo nombre []={ valor 1, valor 2...} Ejemplos: int vector[]={1,2,3,4,5,6,7,8}; char vector[]="programador"; char vector[]={p,r,o,g,r,a,m,a,d,o,r}; Una particularidad con los vectores de tipo char (cadena de caracteres), es que deberemos indicar en que elemento se encuentra el n de la cadena mediante el caracter nulo ( \ 0 ). Esto no lo controla el compilador, y tendremos que ser nosotros los que insertemos este caracter al nal de la cadena. 57

58

Gustavo A. Yarce

Por tanto, en un vector de 10 elementos de tipo char podremos rellenar un mximo de 9, es decir, hasta vector[8]. Si slo rellenamos los 5 primeros, hasta vector[4], debemos asignar el caracter nulo a vector[5]. Es muy sencillo: vector[5]= \0. Ahora veremos un ejemplo de como se rellena un vector de tipo char.

Ejemplo 6.1 /* Declaracin de un array. */


#include <stdio.h> #include <conio2.h>

main() /* Rellenamos del 0 - 9 */ { int vector[10],i; for (i=0;i<10;i++) vector[i]=i; for (i=0;i<10;i++) { printf(" %d",vector[i]); } getch(); }

6.2.

Operaciones

Las principales operaciones que se pueden realizar son: Acceso: cada elemento de un array se nombra con el identicador del array al que perteneces seguido de su posicin entre corchetes [n-1]. Es decir, si en un array[10], queremos nombrar la 4 posicin, esta sera array[3]. La posicin de comienzo de un array es la 0. Asignacin: normalmente para asignar valores a un array utilizamos un bucle for, aunque los bucle do while y while tambin pueden utilizarse. Iniciacin: a un array le podemos dar valores iniciales, para ello se declarara de la siguiente forma: (Donde lista de valores es una lista de constante separadas por comas)

Computadoras Electrnicas Tipo nombre_array[tamao]={lista_valores};

59

int lista[6]={2,4,6,8,1,5}; int datos[100]={0}; int num[4]={4,5}; // todos se inicializan a 0 // equivale a {4,5,0,0}

6.3.

Mltiples dimensiones

Se pueden declarar matrices de dos o ms dimensiones, segn esta sintaxis: tipo matriz [ dimensin1 ] [ dimensin2 ] ... ;

Ejemplo 6.2 #include <stdio.h>


#include <conio.h> main() /* Rellenamos una matriz */ { int x,i,numeros[3][4]; /* rellenamos la matriz */ for (x=0;x<3;x++) for (i=0;i<4;i++) scanf("%d",&numeros[x][i]); /* visualizamos la matriz */ for (x=0;x<3;x++) for (i=0;i<4;i++) printf("%d",numeros[x][i]); }

6.4.

Paso de parmetros a una funcin

Para pasar cualquier argumento a una funcin, especique el nombre del arreglo, sin corchete alguno. Por ejemplo: int temp[20] la llamada a la funcin se hara como:

60

Gustavo A. Yarce

funcionvector(temp,20); la funcin tendr en su encabezado void funcionvector(int temper[], int n)

En este ejemplo se pasa el arreglo a la funcin y el tamao del mismo. Cabe mencionar que la funcin no puede devolver como valor un vector. Para modicar el valor de un arreglo con una funcin y que el valor modicado pueda ser utilizado posteriormente fuera de la funcin se debe realizar lo siguiente: nombre_de_la_funcin( & nombre_del_arreglo [0]);

int temp[20] la llamada a la funcin se hara como: funcionvector(&temp[0],20); la funcin tendr en su encabezado void funcionvector(int temper[], int n)

Captulo 7 Grcos
7.1. Librera WinbGim

Winbgim.h es una libreria de C++ que tiene como objetivo emular la librera graphics.h de Borland C++. Una de las ventajas de esta librera es que nos permite crear aplicaciones grcas con compiladores GNU tales como el Dev C++. Con el n de facilitar el uso de esta librera se dispone de un instalador para la versin 4.9.9.2 del Dev C++ que realiza todas las conguraciones necesarias. Una vez realizada la instalacin es necesario reiniciar la PC para que las modicaciones sean actualizadas. Se debe realizar al igual que la librera Conio la siguiente modicacin en el compilador, en Herramientas - Opciones del compilador - Aadir estos comandos...: -lbgi -lgdi32 -luser32

junto a la opcin de la librera Conio -lconio, resultando en: -lconio -lbgi -lgdi32 -luser32

7.2.

Librera Graphics

La librera WinbGim suele ser inestable cuando se utilizan instrucciones que no son grcas. Para modicar este comportamiento se puede instalar la librera 61

62

Gustavo A. Yarce

graphics.h. Esta librera provee un conjunto de funciones para realizar grcos en Dev en conjunto con la librera WinbGim. Se debe copiar la librera dentro de la carpeta de instalacin del Dev en la carpeta include. A continuacin copiaremos la librera libbgia.a dentro de la carpeta lib. Luego se deber poner en las Opciones del compilador:

-lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32

debe quedar: -lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32

7.3.

Instrucciones

7.3.1.

initwindow

Esta funcin inicializa el modo grco, creando una ventana del tamao especicado. Los parmetros obligatorios de esta funcin son los dos primeros, ancho y alto, ambos valores son enteros. Esta instruccin se complementa con la instruccin closegraph(), la cual cierra el modo grco.

Computadoras Electrnicas

63

Ejemplo 7.1
#include <graphics.h> main () { initwindow (400, 300); //Inicializar la ventana de grficos de 400 x 300 line (0, 0, getmaxx (), getmaxy ()); // Dibujar una lnea getch (); // Espera que se presione una tecla closegraph (); }

7.3.2.

initgraph

initgraph inicializa el sistema de grcos mediante la carga de un controlador de grcos desde el disco (o la validacin de un conductor registrado), y poner el sistema en modo grco. Para iniciar el sistema de grcos, en primer lugar llamar a la funcin initgraph. initgraph carga el controlador de grcos y pone el sistema en modo grco. Se puede decir initgraph utilizar un controlador de grcos y el modo particular, o para detectar automticamente el adaptador de vdeo adjunto en tiempo de ejecucin y seleccione el controlador correspondiente. Si se le dice initgraph para detectar automticamente, se llama detectgraph para seleccionar un controlador de grcos y el modo. initgraph tambin restablece todos los grcos los ajustes a sus valores por defecto (la posicin actual, la paleta, el color, la vista, y as sucesivamente) y se restablece a 0 graphresult.

Ejemplo 7.2
# include <graphics.h> # include <stdio.h> # include <stdlib.h> main(){ int gd = DETECT, gm; initgraph(&gd,&gm," ");

64

Gustavo A. Yarce outtextxy(25,240,"Presione una tecla para continuar"); getch(); setcolor(2); rectangle(50+i,275,150+i,400); delay(100); cleardevice(); rectangle(70,275,170,400); delay(100); cleardevice(); getch(); closegraph(); }

7.3.3.

cleardevice

Borra (es decir, se llena con el color de fondo actual) de la pantalla de grcos y se mueve toda la (posicin actual) CP a la casa (0,0).

7.3.4.

closegraph

cancela la asignacin de toda la memoria asignada por el sistema de grcos, a continuacin, vuelve a la pantalla con el modo en que estaba antes de que se llame a initgraph.

7.3.5.

getmaxx

Retorna la coordenada mxima horizontal. int xmax;

Computadoras Electrnicas

65

xmax=getmaxx();

7.3.6.

getmaxy

Retorna la coordenada mxima vertical. int ymax; ymax=getmaxy();

7.3.7.

moveto

Se mueve a las coordenadas indicadas moveto(50,40);

7.3.8.

Colores

Cdigos BLACK (0) BLUE (1) GREEN (2) CYAN (3) RED (4) MAGENTA (5) BROWN (6)

66 LIGHTGRAY (7) DARKGRAY (8) LIGHTBLUE (9) LIGHTGREEN (10) LIGHTCYAN (11) LIGHTRED (12) LIGHTMAGENTA (13) YELLOW (14) WHITE (15)

Gustavo A. Yarce

7.3.9.

setcolor

Selecciona el color de dibujo y texto indicado. Ej: setcolor(1);

7.3.10.

setbkcolor

Selecciona el color de fondo indicado. Ej: setbkcolor(4);

7.3.11.

cleardevice

Borra la pantalla. Ej: cleardevice( );

7.4.
7.4.1.

funciones de dibujo
putpixel

putpixel(int x , int y , color); Graca un pixel en las coordenadas y color indicados. Ej: putpixel(100,50,9);

Computadoras Electrnicas

67

7.4.2.

line

line(int x1 , int y1 , int x2 , int y2); Dibuja una linea desde x1,y1 a x2,y2. Ej: line(20,10,150,100);

7.4.3.

lineto

lineto(int x1 , int y1); Dibuja una linea desde el ltimo que se grac hasta el x1,y1 moveto(0,0) lineto(400 , 400);

//traza una diagonal en la pantalla

7.4.4.

circle

circle(int x , int y , int radio); Dibuja un crculo del radio indicado y con centro en x,y. Ej: circle(320,200,20);

7.4.5.

rectangle

rectangle(int x1 , int y1 , int x2 , int y2);

Dibuja un rectngulo con la esquina superior izquierda en x1,y1 y la inferior derecha en x2,y2. Ej: rectangle(280,210,360,270);

7.4.6.

arc

Dibuja un arco circular en el color de dibujo actual centrado en (x, y) con un radio dado por radio. El arco se desplaza desde Stangle a endangle. Si Stangle es igual a 0 y es igual a endangle 360, la llamada al arco dibuja un crculo completo. El ngulo de arco se calcula en sentido contrario al movimiento de las agujas del reloj.

68 arc (int x, int y, int ngulo_inicio, int ngulo_n , int radio);

Gustavo A. Yarce

Ejemplo 7.3
#include <graphics.h> #include <stdlib.h> #include <stdio.h> main() { int gdriver = DETECT, gmode, errorcode; int midx, midy; int stangle = 45, endangle = 135; int radius = 100; initgraph(&gdriver, &gmode, ""); midx = getmaxx() / 2; midy = getmaxy() / 2; arc(midx, midy, 0, 90, 135); getch(); closegraph(); }

7.4.7.

bar

dibuja una barra llena-en, rectangular, de dos dimensiones de barras. La barra se llena con el actual patrn de relleno y color de relleno. barra no se ofrece el bar, para dibujar una lnea delimitando dos dimensiones de barras, utilice bar3d con la profundidad igual a 0.

Ejemplo 7.4

Computadoras Electrnicas #include <graphics.h> #include <stdlib.h> #include <stdio.h> main(){ int gdriver = DETECT, gmode; int midx, midy, i; initgraph(&gdriver, &gmode, ""); midx = getmaxx() / 2; midy = getmaxy() / 2; bar(midx-50, midy-50, midx+5, midy+120); getch(); closegraph(); } \vx

69

7.4.8.

bar3d

bar3d dibuja una barra rectangular de tres dimensiones, a continuacin, rellena con el patrn actual de relleno y color de relleno. El contorno tridimensional de la barra se dibuja en el estilo de lnea actual y el color. La profundidad de la barra en pxeles est dada por la profundidad. Para calcular una profundidad tpica para bar3d, tomar 25 % de la anchura de la barra, as:

bar3d (izquierda, arriba, derecha, abajo, ( derecha - izquierda)/4,1);

Ejemplo 7.5
#include <graphics.h> #include <stdlib.h> #include <stdio.h>

70

Gustavo A. Yarce

main(){ int gdriver = DETECT, gmode; int midx, midy, i; initgraph(&gdriver, &gmode, ""); midx = getmaxx() / 2; midy = getmaxy() / 2; bar3d (midx-50, midy-50, midx+50, midy+50, 10, 1); getch(); closegraph(); }

7.5.

Funciones de escritura de texto

7.5.1.

outtextxy

outtextxy(int x , int y , char *); Muestra el texto indicado en las coordenadas x,y. Ej: outtextxy(50,50,Esto es texto en modo grco);

7.5.2.

settextstyle

settextstyle(int fuente , int direccin , int tamao); Selecciona el estilo del texto. Las fuentes ms comunes son las que van de 0 a 4. La direccin puede ser: 0 = horizontal y 1 = vertical. El tamao puede tomar un valor de 1 a 10. Ej: settextstyle(2,0,5);

7.5.3.

getch

La funcin getch est disponible en el winbgim la aplicacin de grcos BGI. No es necesario incluir conio.h, basta con incluir graphics.h. La funcin lee un carcter desde el teclado y devuelve su valor ASCII (sin esperar a una tecla de

Computadoras Electrnicas

71

retorno). Para que funcione, el usuario debe hacer clic en la ventana de grcos (es decir, el foco de Windows debe estar en la ventana de grcos)

7.5.4.

delay

La funcin produce un retardo, la funcin de pausa en el clculo para el nmero de lo especicado de milisegundos.

72

Gustavo A. Yarce

Captulo 8 Cadenas de texto


8.1. Introduccin

Una cadena de texto en C no es ms que un array de caracteres. Como a todo array, se le puede reservar espacio. Esto es de la siguiente forma: char texto[80]; En cualquier caso, una cadena de caracteres siempre terminar con un carcter nulo (\0). Por eso, si necesitamos 7 letras para un telfono, deberemos hacer char telefono[8]; dado que hay que almacenar esas 7 y despus un \0. Si sabemos lo que hacemos, podemos reservar slo esas 7, pero tendremos que usar nuestras propias funciones, porque las que nos ofrece el lenguaje C se apoyan todas en que al nal debe existir ese carcter nulo. Esto es debido a que las cadenas de caracteres se manejan muy parecido, pero no exactamente igual a un arreglo simple de caracteres. La diferencia es que, en una cadena de caracteres, al nal de la cadena, el procesador automticamente coloca un carcter especial conocido como el carcter nulo y representado por el smbolo\0.

8.2.

Comandos

Para leer un cadena desde el teclado se usa:

73

74 scanf(%s, telefono);

Gustavo A. Yarce

Observese que para las cadenas de caracteres no es necesario la inclusin de &. La funcin scanf leer la cadena hasta que encuentre un espacio, una nueva lnea o un indicador de fn.

La llamada gets(cad) lee todos los caracteres hasta encontrar el nal de lnea \n, que en la cadena cad se sustituye por \0

gets (cad);

Para escribir una cadena se utiliza la funcin printf(%s, string); Tambin tenemos una funcin imprimir en pantalla:

puts(string);

Para copiar el valor de una cadena de texto en otra, no podemos hacer texto1 = texto2;

porque estaramos igualando dos punteros. A partir de este momento, las dos cadenas se encontraran en la misma posicin de memoria, y los cambios que hiciramos en una se reejaran tambin en la otra. Se debe usar una funcin de biblioteca, strcpy (string copy), que se encuentra, como todas las que veremos, en string.h: strcpy (destino, origen);

Computadoras Electrnicas

75

Es nuestra responsabilidad que en la cadena de destino haya suciente espacio reservado para copiar lo que queremos. Si no es as, estaremos sobreescribiendo direcciones de memoria en las que no sabemos qu hay. Si queremos copiar slo los primeros n bytes de origen, usamos strncpy (destino, origen, n); Para aadir una cadena al nal de otra (concatenarla), usamos strcat (origen, destino); Para comparar dos cadenas alfabticamente (para ver si son iguales o para poder ordenarlas, por ejemplo), usamos strcmp (cad1, cad2); Esta funcin devuelve un nmero entero, que ser: 0 si ambas cadenas son iguales negativo, si cad1 < cad2 positivo, si cad1 > cad2

8.2.1.

Captura de caracteres

Se tiene las siguientes funciones: getchar(); getch(); getche();

Estas tres instrucciones estn especializadas en captura de un solo carcter y sustituyen a scanf en situaciones especiales. Estas funciones trabajan por igualacin, es decir para usarse:

76 char vocal; vocal=getch();

Gustavo A. Yarce

La diferencia es que getchar y getche devuelven el carcter ledo a la pantalla y el getch no devuelve el carcter a la pantalla. La llamada getch() puede ser utilizada para leer un carcter tecleado. Este carcter no se visualiza en pantalla

getch (); Esta funcin permite capturar una tecla presiona sin esperar un carcter de fn o salto de lnea. char tecla; . . . tecla=getch(); if(tecla==a){ printf("Se presiono una a");}

Puede utlizarse esta funcin de la librera conio para reconocer caracteres como Enter o Escape, de la siguiente forma: int vt; . . .

vt=getch(); if(vt ==13){ printf("Se presiono un ENTER"); } if(vt ==27){ printf("Se presiono un ESC");

Computadoras Electrnicas } system("pause");

77

La llamada toupper(caracter) cambia el carcter de minscula a mayusculas. Se debe utilizar la librera ctype. La llamada lower(caracter) cambia el carcter de mayusculas a minscula. La llamada strlen(cadena) devuelve la longitud de la cadena.

8.2.2.

Librera ctype.h

Esta librera posee algunas de las siguientes funciones:

islower (char): retorna true si char es minscula isupper (char): retorna true si char es mayscula isalpha(char): retorna true si char es un valor alfabtico isdigit(char): retorna true si char es un digito isalnum(char): retorna true si char es un valor alfanumrico ispunct(char): retorna true si char es smbolo de puntuacin isspace(char): retorna true si char es un carcter en blanco

78

Gustavo A. Yarce

8.2.3.

Librera stdlib.h

Esta librera posee algunas de las siguientes funciones: atof (char) : convierte el string en un valor double. atoi (char): convierte el string en un valor int. atol (char): convierte el string en un valor long int.

ndice alfabtico
conversin de tipos, 25

79

Anda mungkin juga menyukai