Laboratorio JuanXXIII

42
I.P.E.T. Juan XXIII Laboratorio de Computadoras Electrónicas Gustavo A. Yarce Paraná - Entre Ríos 2011

Transcript of Laboratorio JuanXXIII

Page 1: Laboratorio JuanXXIII

I.P.E.T. Juan XXIII

Laboratorio de ComputadorasElectrónicas

Gustavo A. Yarce

Paraná - Entre Ríos2011

Page 2: Laboratorio JuanXXIII

2 Gustavo A. Yarce

Page 3: Laboratorio JuanXXIII

Índice general

1. Introducción 91.1. Problemas computacionales . . . . . . . . . . . . . . . . . . . . . . 91.2. Etapas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

1.2.1. Definición del problema . . . . . . . . . . . . . . . . . . . . 91.2.2. Análisis del problema . . . . . . . . . . . . . . . . . . . . . . 91.2.3. Programación . . . . . . . . . . . . . . . . . . . . . . . . . . 101.2.4. Prueba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.2.5. Algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

1.3. PROGRAMACIÓN MODULAR . . . . . . . . . . . . . . . . . . . 111.4. Documentación de Programas . . . . . . . . . . . . . . . . . . . . . 12

2. El Lenguaje C 132.1. Marco histórico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132.2. Características . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132.3. Creación del programa . . . . . . . . . . . . . . . . . . . . . . . . . 142.4. Compilación de C . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

2.4.1. Descripción . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.5. Entorno de programación . . . . . . . . . . . . . . . . . . . . . . . . 152.6. Bibliotecas estándares . . . . . . . . . . . . . . . . . . . . . . . . . 162.7. Componentes del lenguaje C . . . . . . . . . . . . . . . . . . . . . . 172.8. Estructura de un fichero fuente . . . . . . . . . . . . . . . . . . . . 182.9. Comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.10. CONSTANTES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.11. Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

2.11.1. Variables locales y globales . . . . . . . . . . . . . . . . . . . 202.12. Tipos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

2.12.1. Calificadores de tipo . . . . . . . . . . . . . . . . . . . . . . 222.13. Secuencias de escape . . . . . . . . . . . . . . . . . . . . . . . . . . 232.14. Inclusión de archivos . . . . . . . . . . . . . . . . . . . . . . . . . . 232.15. Operadores aritméticos . . . . . . . . . . . . . . . . . . . . . . . . . 242.16. Operadores de asignación . . . . . . . . . . . . . . . . . . . . . . . . 25

3

Page 4: Laboratorio JuanXXIII

4 Gustavo A. Yarce

2.17. Jerarquía de los operadores . . . . . . . . . . . . . . . . . . . . . . . 262.18. Sentencia printf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272.19. Sentencia scanf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302.20. Pantalla en modo texto . . . . . . . . . . . . . . . . . . . . . . . . . 31

3. Control de flujo de ejecución 353.1. Operadores relacionales . . . . . . . . . . . . . . . . . . . . . . . . . 353.2. Estructura IF...ELSE . . . . . . . . . . . . . . . . . . . . . . . . . . 35

3.2.1. Estructura IF...ELSE IF... . . . . . . . . . . . . . . . . . . . 363.3. Estructura SWITCH . . . . . . . . . . . . . . . . . . . . . . . . . . 37

4. Control de Programas 394.1. Instrucción FOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394.2. Instrucción WHILE . . . . . . . . . . . . . . . . . . . . . . . . . . . 404.3. Instrucción DO...WHILE . . . . . . . . . . . . . . . . . . . . . . . . 41

Page 5: Laboratorio JuanXXIII

Índice de figuras

5

Page 6: Laboratorio JuanXXIII

6 Gustavo A. Yarce

Page 7: Laboratorio JuanXXIII

Índice de tablas

2.1. Tipos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.2. Tipo signed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222.3. Tipo unsigned . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222.4. Tipo short . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222.5. Tipo long . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

7

Page 8: Laboratorio JuanXXIII

Prologo

PrologoEste documento no pretende ser un libro completo sobre programación, es una

ayuda para el alumno, para su utilización como guía de aprendizaje.Se tiene como objetivo presentar los conceptos básicos y las característicasgenerales del lenguaje C que posibiliten la realización de programas para larepresentación de soluciones de problemas reales en una computadora.Los temas tratados y el desarrollo que se realiza sobre ellos persiguen la enseñanzaen entornos educativos técnicos de nivel medio que necesitan conocimientos deinformática como una herramienta para la resolución de problemas.Se prioriza la enseñanza de una metodología de programación correcta tratandode conservar la facilidad de uso como herramienta. Siempre se considera que lomás importante es adquirir una base de conocimientos que permita una posteriorevolución hacia conocimientos relacionados con la Electrónica y la programación.

Page 9: Laboratorio JuanXXIII

Capítulo 1

Introducción

1.1. Problemas computacionales

Así como cada persona tiene formas de encarar un problema y su propia manerade solucionarlo, computacionalmente hablando podemos hacer una analogía. Antela presentación de un problema encarar la mejor forma de resolverlo para arribaral resultado esperado y correcto es un desafío. Para ello debemos comprenderexactamente qué se pide, qué resultados se pretenden y que restricciones y/ocondiciones existen. Para realizar lo antes dicho dividiremos la resolución de unproblema en etapas.

1.2. Etapas

1.2.1. Definición del problema

Está dada por la formulación del problema en forma correcta y completa. Estaenunciación de lo que se desea es primordial para el éxito de la resolución.

1.2.2. Análisis del problema

A partir del estudio del problema se deberá identificar y conocer las partesprinci-pales del mismo y de esa manera determinar los siguientes conjuntos:

Datos: es la información con que contamos para resolver el problema

Resultados: es lo que se desea obtener.

Condiciones: una o más relaciones que vinculan los dos conjuntos anterioresy que permitirán plantear la solución del problema.

9

Page 10: Laboratorio JuanXXIII

10 Gustavo A. Yarce

1.2.3. Programación

Esta etapa consiste en obtener la solución del problema dado. Se divide en dossubetapas:

Elección y creación del método: Se trata de buscar un procedimiento ométodo general que permita resolver el problema planteado utilizando unacomputadora.

Codifiación : Consiste en expresar el método elegido en un lenguaje,llamado lenguaje de programación, que pueda se interpretado por lacomputadora.

Programa

Un programa es una sucesión de instrucciones que pueden ser ejecutadas porla PC. De modo general la PC comprende, sin traducción previa, los llamadoscomando en lenguaje máquina, que son específicos del procesador.Este tipo de lenguaje resulta ser bastante engorroso para realizar operacionessimples. Con el fin de vencer esta dificultad, se desarrollaron los lenguajessuperiores de programación. El programador no tiene que preocuparse por laestructura interna de la PC, ya que puede trabajar en un lenguaje relativamentesimple, transformar un determinado algoritmo en un programa adecuado.Un lenguaje de programación lo único que realiza es la traducción escrita enlenguaje máquina de las diferentes instrucciones escrita en un lenguaje superior.Aquí pueden acreditarse dos procedimientos:

1. El programa usuario puede traducirse totalmente, antes de la ejecución. Elprograma que realiza la traducción se llama compilador.

2. Los diferentes comandos son traducidos e, inmediatamente después ejecuta-dos, aún antes de que el programa traductor prosiga con la siguiente ejecu-ción. El programa de traducción que trabaja de acuerdo con este procedi-miento, es un INTERPRETE.

1.2.4. Prueba

Esta etapa consiste en la ejecución del código del método elegido, es decir,suministrar los datos al computador, y obtener los resultados. Luego se analizaránlos mismos determinando si son realmente los esperados. Caso contrario, deberánanalizarse las etapas previas, comenzando por la última hacia atrás, y realizarlas modificaciones necesarias, repitiendo esta proceso hasta obtener los resultadosesperados.

Page 11: Laboratorio JuanXXIII

Laboratorio de Computadoras Electrónicas 11

1.2.5. Algoritmo

En relación al algoritmo, deseamos aún entrar con detalle en unos conceptosque son independientes del procedimiento de notación y de la descripción formal.En primer lugar tenemos:

FINITEZ: el algoritmo completo se tiene que representar en una sucesiónfinita de caracteres.

EFECTIVIDAD: todos los pasos u operaciones que forman el algoritmo,han de ser ejecutables. Aquí hay que pensar en las limitaciones técnicas dela PC.

TERMINACIÓN: por razones de carácter practico, con frecuencia estauno interesado que, en muchos procesos, conduzca a un final.

DETERMINISMO: un algoritmo determinativo es una serie de pasos deprocesamiento, cuyo desarrollo está claramente prescrito.

EFICIENCIA: para un determinado problema, existen, generalmente,varios algoritmos diferentes. Se distinguen por el volumen de trabajo quehay que desarrollar para alcanzar lo mismo.

1.3. PROGRAMACIÓN MODULAR

Es un método de diseño y tiende a dividir el problema en partes perfectamentediferenciadas que puedan ser analizadas, resueltas y puestas a punto por separa-do. Para atacar el análisis de un problema, y siguiendo el diseño Top-Down,se pue-den utilizar criterios de programación modular para dividirlos en partesindepen-dientes, probando cada uno por separado y realizando su recomposiciónascen-dente. Cada una de las partes independientes se llama Módulo y para sudeterminación se deben tener en cuenta los siguientes criterios:

un módulo debe corresponder a una función lógica perfectamente biendefinida.

los módulos deben ser pequeños para que sean claros y de poca complejidad.

un módulo debe tener una estructura de caja negra, es decir la salida debeser exclusivamente función de la entrada.

cada módulo deber tener una única entrada y una única salida.

Page 12: Laboratorio JuanXXIII

12 Gustavo A. Yarce

1.4. Documentación de ProgramasLa documentación es un aspecto muy importante en la programación. Sin

embargo, generalmente los programadores principiantes suelen dejar de lado elproceso de documentación por falta de dedicación o simple desconocimiento desu relevancia. La documentación es todo el material anexo a un programa queno constituye parte del código que se compila. Todo esto sirve para que elmantenimiento, la reparación y la actualización del programa sean rápidas yseguras. En el caso de que estas tareas deban desarrollarlas otro programadorla documentación será imprescindible. Pero más aún, cuando hayan pasadovarios meses de hecho el programa, para usted mismo será imprescindible ladocumentación porque ya no podrá recordar claramente lo que hizo y le constarámucho volver a entender el programa para poder hacer las modificacionesnecesarias. La documentación puede realizarse en el mismo archivo de texto delprograma mediante comentarios. Los comentarios poseen una sintaxis particular yson totalmente ignorados por el compilador. Esta documentación es denominadaInterna ya que se encuentra en el mismo archivo de texto del programa. Por otraparte, cualquier tipo de información que no se encuentre en el mismo programase denomina documentación externa. La documentación externa puede consistirpor ejemplo en gráficas, texto explicativo, manual de usuario, algoritmos enpseudocódigo, etc.Para convertir el algoritmo en un programa, se ha mostrado como muy adecuadala utilización de los llamados diagramas de flujo.Un diagrama de flujo es unarepresentación gráfica del programa, con la ayuda de símbolos.

Page 13: Laboratorio JuanXXIII

Capítulo 2

El Lenguaje C

2.1. Marco histórico

El lenguaje C fue creado entre 1970 y 1972 por Brian KERNIGHAN yDennis RITCHIE para escribir el código del sistema operativo UNIX. Desde sunacimiento se fue implantando como el lenguaje de programación de sistemasfavorito para muchos programadores, sobre todo por ser un lenguaje que conjugabala abstracción de los lenguajes de alto nivel con la eficiencia del lenguaje máquina.Los programadores de sistemas que trabajaban sobre MS-DOS y Macintoshtambién utilizaban C, con lo cual la práctica totalidad de aplicaciones de sistemapara microordenadores y para sistemas UNIX está escrito en este lenguaje. En1983 el lenguaje C se convierte en un estándar internacional ANSI C (que es elque desarrollaremos). Este estándar incluye tanto la definición del lenguaje comouna enorme biblioteca de funciones para entrada/salida, tratamiento de textos,matemáticas, etc.A mediados de los ochenta se crea el C++, extensión de C orientada a objetos. ElC++ se convierte en estándar ISO en 1998. En el momento actual, el lenguaje Cno va a modificarse más. Será el C++ el que incorporará nuevos cambios.

2.2. Características

El lenguaje C tiene muy pocas reglas sintácticas, sencillas de aprender. Suléxico es muy reducido: tan solo 32 palabras. A menudo se le llama lenguajede medio nivel, más próximo al código máquina que muchos lenguajes de másalto nivel. Y por eso mismo es un lenguaje muy eficiente. Permite el uso dellenguaje ensamblador en partes del código, trabaja a nivel de bit, y permitemodificar los datos con operadores que manipulan bit a bit la información.También se puede acceder a las diferentes posiciones de memoria conociendo su

13

Page 14: Laboratorio JuanXXIII

14 Gustavo A. Yarce

dirección. El lenguaje C permite con facilidad la programación modular, creandounidades independientes que pueden compilarse de forma independiente, quepueden posteriormente enlazarse. Así, se crean funciones o procedimientos, quese pueden compilar y almacenar, creando así bibliotecas de código ya editado ycompilado que resuelve distintas operaciones. Cada programador puede diseñarsus propias bibliotecas, que simplifican luego considerablemente el trabajo futuro.El ANSI C posee una amplia colección de bibliotecas de funciones estándar ynormalizadas.

2.3. Creación del programa

Se puede crear un archivo que contenga el programa completo. Se puede usarcualquier editor de textos ordinario con el que se este familiarizado. En caso deusar un entorno Por convención el nombre del archivo debe terminar con “.c” porejemplo: miprograma.c. El contenido del archivo deberá obedecer la sintaxis de C.

2.4. Compilación de C

En el siguiente apartado se muestran las distintas etapas que cubre elcompilador para obtener el código ejecutable:

1. Código Fuente

2. Preprocesador

3. Compilador

4. Código Ensamblador

5. Ensamblador

6. Librerías

7. Código Objeto

8. Ligador

9. Código Ejecutable

Page 15: Laboratorio JuanXXIII

Laboratorio de Computadoras Electrónicas 15

2.4.1. Descripción

El proceso puede ser el globalmente dividido en varios programas:- Preprocesador: el proceso de archivo de origen antes de la compilación. Que,por ejemplo, controlar y sustituir los archivos de macros e incluir en su fuente. -Compilador: transformar su archivo de origen en el código de ensamble (procesadorde lenguaje humanamente legible) - Ensamblador: toma el código de ensambley generar código legible por máquina (código objeto binario) - Linker: reúne yresuelve objeto códigos juntos para crear un único ejecutable.

2.5. Entorno de programación

Un entorno de programación incluye todas las distintas herramientas deprogramación necesarias para trabajar con un lenguaje de programación enparticular. El entorno de C incluye los siguientes componentes:

Editores de texto: Permite introducir y modificar el código fuente C.

Administrador de proyectos: Un Proyecto es un centro para la gestión losarchivos de origen y diferentes opciones. Le ayuda a navegar a través desu código y configurar fácilmente los distintos parámetros, como el tipo deprograma que está haciendo (GUI, consola, DLL...).

El preprocesador: Transforma el programa fuente, convirtiéndolo en otroarchivo fuente predigerido. Las transformaciones incluyen:

• Eliminar los comentarios.

• Incluir en el fuente el contenido de los ficheros declarados con #include<fichero>(a estos ficheros se les suele llamar cabeceras)

• Sustituir en el fuente las macros declaradas con #define (ej. #defineCIEN 100)

El compilador: Convierte el código fuente entregado por el preprocesador enun archivo en lenguaje máquina: fichero objeto, en un código que comprendeel ordenador (código máquina). Algunos compiladores pasan por una faseintermedia en lenguaje ensamblador.

El enlazador o linkeador: Un fichero objeto es código máquina, pero no sepuede ejecutar, porque le falta código que se encuentra en otros archivosbinarios. El enlazador genera el ejecutable binario, a partir del contenido delos ficheros objetos y de las bibliotecas.

Page 16: Laboratorio JuanXXIII

16 Gustavo A. Yarce

Depurador o debugger: Habitualmente los programas no se ejecutancorrectamente la primera vez después de compilarlos. Mientras unos errorsson fáciles de encontrar y corregir, otros pueden ser más difíciles de encontrardebido a la complejidad de los programas o inexperiencia del programador.El depurador o debugger es una herramienta compleja que nos puede ayudara rastrear el código y corregir esos errores.

Las bibliotecas contienen el código de funciones precompiladas, a las que el archivofuente llama (por ejemplo printf).

El programa editado en C se llama fichero fuente. El archivo donde se almacenaese código tendrá un nombre (el que se quiera) y la extensión .cpp, o .c. Unprograma no es más que archivo de texto. Al compilar, del fichero fuente se llegaal código máquina, con el mismo nombre que el archivo donde está el código fuente,y con la extensión .obj. Casi con toda probabilidad en código fuente hará uso defunciones que están ya definidas y precompiladas en las bibliotecas. Ese códigoprecompilado está en archivos con la extensión .lib. Desde luego, para hacer usode una función predefinida, es necesario conocer su existencia y tener localizadala biblioteca donde está precompilada; eso es parte del aprendizaje de un lenguajede programación, aunque también se disponen de grandes índices de funciones, defácil acceso para su consulta. Con el archivo .obj y los necesarios .lib que se deseenemplear, se procede al linkado que genera un fichero ejecutable con la extensión.exe.

Ejemplo de programa en C

#include <stdio.h>main(){

/* Escribe un mensaje */printf (‘‘Hola, mundo\n’’);

}

2.6. Bibliotecas estándares

El lenguaje C es muy simple. Carece de tipos y servicios que forman partede otros lenguajes. No tiene tipo booleano, ni manejo de cadenas, ni manejo dememoria dinámica.

Page 17: Laboratorio JuanXXIII

Laboratorio de Computadoras Electrónicas 17

No obstante, el estándar de C define un conjunto de bibliotecas de funciones,que necesariamente vienen con todo entorno de compilación de C y que satisfacenestos servicios elementales.

Las interfaces de estos servicios vienen definidas en unos ficheros cabeceras(header files). El nombre de estos ficheros suele terminar en .h

Algunos de los servicios proporcionados por las bibliotecas estándares son:

entrada y salida de datos (stdio.h)

manejo de cadenas (string.h)

memoria dinámica (stdlib.h)

rutinas matemáticas (math.h)

2.7. Componentes del lenguaje CEstructuras de datos

literales

tipos básicos (todos numéricos)

tipos enumerados

tipos estructurados (struct, union)

punteros y vectores

Construcciones algorítmicas

construcciones condicionales (if,switch)

construcciones iterativas(while,for,do...while)

subrutinas (funciones)

Además de lo anterior, el C tiene otros elementos:

comentarios

Page 18: Laboratorio JuanXXIII

18 Gustavo A. Yarce

inclusión de ficheros

macros

compilación condicional

2.8. Estructura de un fichero fuente

Un fichero fuente en lenguaje C tendrá esta estructura típica:

#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 función más del programa, con la particularidad deque es el punto de entrada al programa.

2.9. Comentarios

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

2.10. CONSTANTES

Se define a una constante, como un elemento cuyo valor que no puede alterarseen el transcurso de la ejecución de un algoritmo. Por ejemplo: 123, ’López’, 3.14459.

Las constantes mantienen su valor a lo largo de todo el programa.

Page 19: Laboratorio JuanXXIII

Laboratorio de Computadoras Electrónicas 19

Para indicar al compilador que se trata de una constante, usaremos la directiva#define:

# define <identificador> <valor>

Observa que no se indica el punto y coma de final de sentencia ni tampoco eltipo de dato.La directiva #define no sólo nos permite sustituir un nombre por un valor numéri-co, sinó también por una cadena de caracteres. El valor de una constante no puedeser modificado de ninguna manera.

Ejemplo 2.1 Constantes

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

2.11. VariablesEn un programa existen otros elementos cuyo valor cambia durante la ejecución

del mismo, llamados variables.Una variable es un elemento o lugar asociado a un valor el que puede variar con-forme se ejecuta el algoritmo, se representa por un nombre que identifica a unaposición 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 sólo letras y/o dígitos, comenzando siempre con una letra.

2. No utilizar las palabras claves o reservadas del lenguaje de codificación (porahora, no endremos incovenientes en este aspecto, pues usaremos diagramas

Page 20: Laboratorio JuanXXIII

20 Gustavo A. Yarce

de flujo); o para las funciones internas o predefinidas: RC, SEN, TRUNC,LN, etc.

3. No hacer distinción entre mayúsculas y minúsculas. Esto implica queVENTA, venta y Venta, constituyen en el algoritmo la misma variable.

Una variable sólo puede pertenecer a un tipo de dato. Para poder utilizar unavariable, primero tiene que ser declarada:

[calificador] <tipo> <nombre>

Es posible inicializar y declarar más de una variable del mismo tipo en la mismasentencia:

[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();}

2.11.1. Variables locales y globales

Las variables pueden ser de dos tipos según el lugar en que las declaremos:globales o locales.

La variable global se declara antes de la main( ). Puede ser utilizada en cual-quier parte del programa y se destruye al finalizar éste.

Page 21: Laboratorio JuanXXIII

Laboratorio de Computadoras Electrónicas 21

La variable local se declara después de la main( ), en la función en que vayaa ser utilizada. Sólo existe dentro de la función en que se declara y se destruye alfinalizar dicha función.

Ejemplo 2.3 Variables locales y globales

/* Declaración 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.12. Tipos de datos

En C existen básicamente cuatro tipos de datos, aunque como se verá después,podremos definir nuestros propios tipos de datos a partir de estos cuatro. Acontinuación se detalla su nombre, el tamaño que ocupa en memoria y el rango desus posibles valores.

Tipo Tamaño Rango de Valoreschar 1 byte -128 a 127int 2 bytes -32768 a 32767float 4 bytes 3.4 E-38 a 3.4 E+38double 8 bytes 1.7 E-308 a 1.7 E+308

Tabla 2.1: Tipos de datos

Page 22: Laboratorio JuanXXIII

22 Gustavo A. Yarce

2.12.1. Calificadores de tipo

Los calificadores de tipo tienen la misión de modificar el rango de valores deun determinado tipo de variable. Estos calificadores son cuatro:

signed: Le indica a la variable que va a llevar signo. Es el utilizado por defecto.

Tipo Tamaño Rango de Valoressigned char 1 byte -128 a 127signed int 2 bytes -32768 a 32767

Tabla 2.2: Tipo signed

unsigned: Le indica a la variable que no va a llevar signo (valor absoluto).

Tipo Tamaño Rango de Valoresunsigned char 1 byte 0 a 255unsigned int 2 bytes 0 a 65535

Tabla 2.3: Tipo unsigned

short: Rango de valores en formato corto (limitado). Es el utilizado por defecto.

Tipo Tamaño Rango de Valoresshort char 1 byte -128 a 127short int 2 bytes -32768 a 32767

Tabla 2.4: Tipo short

long: Rango de valores en formato largo (ampliado).

Tipo Tamaño Rango de Valoreslong int 4 bytes -2.147.483.648 a 2.147.483.647

long double 10 bytes -3.36 E-4932 a 1.18 E+4932

Tabla 2.5: Tipo long

10mm

Page 23: Laboratorio JuanXXIII

Laboratorio de Computadoras Electrónicas 23

2.13. Secuencias de escapeCiertos caracteres no representados gráficamente se pueden representar

mediante lo que se conoce como secuencia de escape.A continuación vemos una tabla de las más significativas:\n salto de línea\b retroceso\t tabulación horizontal\v tabulación vertical\\ contrabarra\f salto de página\’apóstrofe\" 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("\nDirección: C\\ Mayor 25");printf("\nHa salido la letra \’L\’");printf("\nRetroceso\b");printf("\n\tEsto ha sido todo");getch();}

2.14. Inclusión de archivosEn la programación en C es posible utilizar funciones que no estén incluidas

en el propio programa. Para ello utilizamos la directiva #include, que nos permiteañadir librerías o funciones que se encuentran en otros ficheros a nuestro programa.

Para indicar al compilador que vamos a incluir ficheros externos podemos ha-cerlo de dos maneras (siempre antes de las declaraciones).

Page 24: Laboratorio JuanXXIII

24 Gustavo A. Yarce

1. Indicándole al compilador la ruta donde se encuentra el fichero.

#include "misfunc.h"#include "c:\includes\misfunc.h"

2. Indicando que se encuentran en el directorio por defecto del compilador.

#include <misfunc.h>

2.15. Operadores aritméticos

Existen dos tipos de operadores aritméticos:

1. binarios:

+ Suma-Resta* Multiplicación/ División% Módulo (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 revés, <operador><variable>.

Page 25: Laboratorio JuanXXIII

Laboratorio de Computadoras Electrónicas 25

Ejemplo 2.4 Operadores

/* Uso de los operadores aritméticos */

#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();}

2.16. Operadores de asignación

La mayoría de los operadores aritméticos binarios explicados en el capítuloanterior tienen su correspondiente operador de asignación:

= Asignación simple+= Suma-= Resta*= Multiplicación/= División%= Módulo (resto)

Con estos operadores se pueden escribir, de forma más breve, expresiones deltipo:

n=n+3 se puede escribir n+=3

k=k*(x-2) lo podemos sustituir por k*=x-2

Page 26: Laboratorio JuanXXIII

26 Gustavo A. Yarce

Ejemplo 2.5

/* Uso de los operadores de asignación */

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

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.17. Jerarquía de los operadoresSerá 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 pre-cedencia.Si en una operación encontramos signos del mismo nivel de precedencia, dichaoperación se realiza de izquierda a derecha. A continuación se muestra un ejemplosobre ello:

a*b+c/d-e

1. a*b resultado = x

2. c/d resultado = y

Page 27: Laboratorio JuanXXIII

Laboratorio de Computadoras Electrónicas 27

3. x+y resultado = z

4. z-e

Fijarse que la multiplicación se resuelve antes que la división ya que está situadamás a la izquierda en la operación. Lo mismo ocurre con la suma y la resta.

Ejemplo 2.6/* Jerarquía de los operadores */

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

main() /* Realiza una operación */{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.18. Sentencia printf

La rutina printf permite la aparición de valores numéricos, caracteres y cadenasde 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 mostrarán los argumentosposteriores. También podemos introducir una cadena de texto ( sin necesidad deargumentos ), o combinar ambas posibilidades, así como Secuencias de escape(2.13).En el caso de que utilicemos argumentos deberemos indicar en la cadena de control

Page 28: Laboratorio JuanXXIII

28 Gustavo A. Yarce

tantos modificadores como argumentos vayamos a presentar.El modificador está compuesto por el caracter

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

#include <stdio.h>#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();}

Los modificadores más utilizados son:

%c Un único caracter%d Un entero con signo, en base decimal%u Un entero sin signo, en base decimal%o Un entero en base octal%x Un entero en base hexadecimal%e Un número real en coma flotante, con exponente%f Un número real en coma flotante, sin exponente%s Una cadena de caracteres%p Un puntero o dirección de memoria

Ejemplo 2.8

/* Uso de la sentencia printf() 2. */

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

main() /* Modificadores 1 */{

Page 29: Laboratorio JuanXXIII

Laboratorio de Computadoras Electrónicas 29

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();}

El formato completo de los modificadores es el siguiente:

% [signo] [longitud] [.precisión] [l/L] conversión

Signo: indicamos si el valor se ajustará a la izquierda, en cuyo casoutilizaremos el signo menos, o a la derecha ( por defecto ).

Longitud: especifica la longitud máxima del valor que aparece por pantalla.Si la longitud es menor que el número de dígitos del valor, éste apareceráajustado a la izquierda.

Precisión: indicamos el número máximo de decimales que tendrá el valor.

l/L: utilizamos l cuando se trata de una variable de tipo long y L cuando esde 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);

Page 30: Laboratorio JuanXXIII

30 Gustavo A. Yarce

printf("%s b es %ld\n",cad,b);printf("%s c es %.3f",cad,c);getch();}

2.19. Sentencia scanfLa rutina scanf permite entrar datos en la memoria del ordenador a través 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 modificadores 2.18que harán referencia al tipo de dato de los argumentos. Al igual que en la senten-cia printf los modificadores 2.18 estarán formados por el caracter% seguido de uncaracter de conversión. Los argumentos indicados serán, nuevamente, las variables.

La principal característica de la sentencia scanf es que necesita saber laposición de la memoria del ordenador en que se encuentra la variable para poderalmacenar la información obtenida. Para indicarle esta posición utilizaremos elsímbolo ampersand ( & ), conocido como operador de dirección, que colocaremosdelante 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: ");

Page 31: Laboratorio JuanXXIII

Laboratorio de Computadoras Electrónicas 31

scanf("%d",&edad);getch();}

2.20. Pantalla en modo texto

Las funciones añadidas para manejo de la pantalla en Lenguaje C, se encuen-tran accesibles a través del fichero de cabecera conio2.h.

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 final de la línea 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 ÿ(fila) en que se encuentra el cursor.

window - Permite crear una ventana dentro de la pantalla. A partir deentonces, las órdenes como gotoxyse referirán sólo a esa ventana, no al totalde la pantalla.

Page 32: Laboratorio JuanXXIII

32 Gustavo A. Yarce

Los colores de la pantalla se indican por números. 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 tenerque recordarlos, tenemos definidas constantes con su nombre en inglés:

BLACK

BLUE

GREEN

CYAN

RED

MAGENTA

BROWN

LIGHTGRAY

DARKGRAY

LIGHTBLUE

LIGHTGREEN

LIGHTCYAN

LIGHTRED

LIGHTMAGENTA

YELLOW

WHITE

Una última consideración: en MsDos sólo se pueden usar como colores de fondolos 7 primeros: desde BLACK hasta LIGHTGRAY. Esto se puede evitar con laspantallas VGA, a cambio de perder la posibilidad de que el texto parpadee, perono voy a entrar en esos detalles. El caso es que normalmentesi hacemos algo como

textbackground(LIGHTBLUE);

no obtendremos los resultados esperados, sino que será como si hubiésemosutilizado el equivalente en el rango de 0 a 7:

Page 33: Laboratorio JuanXXIII

Laboratorio de Computadoras Electrónicas 33

textbackground(BLUE);

Ejemplo 2.11 #include <conio2.h> /* Para funciones de pantalla */

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

}

Page 34: Laboratorio JuanXXIII

34 Gustavo A. Yarce

Page 35: Laboratorio JuanXXIII

Capítulo 3

Control de flujo de ejecución

Este tipo de sentencias permiten variar el flujo del programa en base a unasdeterminadas condiciones. Existen varias estructuras diferentes:

3.1. Operadores relacionalesLos operadores relacionales se utilizan para comparar el contenido de dos va-

riables.

En C existen seis operadores relacionales básicos:

>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 más de un operador se evalúan de izquierda a derecha. Además losoperadores == y != están por debajo del resto en cuanto al orden de precedencia.

3.2. Estructura IF...ELSESintaxis:

35

Page 36: Laboratorio JuanXXIII

36 Gustavo A. Yarce

if (condición)sentencia1;else

sentencia2;

La parte del else es optativa. La condicón se evalúa, si es verdadera, lasentencia1 se ejecuta. Si la condición es falsa y si existe un else, la sentencia2se 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 (condición) sentencia1;else if (condición) sentencia2;else if (condición) sentencia3;else sentencia4;

Esta secuencia de instrucciones if es la forma mas general de escribir unadecisión múltiple.Las condiciones se evaluan en orden; si cualquier condición es verdadera, lasentencia asociada a ella se ejecuta, y esto termina toda la cadena. La sentenciapuede ser una única sentencia o un grupo de sentencias contenidas entre un parde llaves.

Page 37: Laboratorio JuanXXIII

Laboratorio de Computadoras Electrónicas 37

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

#include <stdio.h>

main() /* Escribe bebé, niño 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 niño");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 menús, de manera que según la opciónseleccionada se ejecuten una serie de sentencias.Su sintaxis es:

switch (variable){case contenido_variable1:sentencias;break;case contenido_variable2:sentencias;break;default:sentencias;}

Page 38: Laboratorio JuanXXIII

38 Gustavo A. Yarce

Cada case puede incluir una o más sentencias sin necesidad de ir entre llaves,ya que se ejecutan todas hasta que se encuentra la sentencia BREAK. La variableevaluada sólo puede ser de tipo entero o caracter. default ejecutará las sentenciasque incluya, en caso de que la opción escogida no exista.

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

#include <stdio.h>

main() /* Escribe el día de la semana */{

int dia;printf("Introduce el día: ");scanf("%d",&dia);switch(dia){

case 1: printf("Lunes"); break;case 2: printf("Martes"); break;case 3: printf("Miércoles"); break;case 4: printf("Jueves"); break;case 5: printf("Viernes"); break;case 6: printf("Sábado"); break;case 7: printf("Domingo"); break;

}}

Page 39: Laboratorio JuanXXIII

Capítulo 4

Control de Programas

La mayor parte de los programas incluyen repeticiones o ciclos. Los bucles sonestructuras que permiten ejecutar partes del código de forma repetida mientras secumpla una condición.

Esta condición puede ser simple o compuesta de otras condiciones unidas poroperadores lógicos. Según cómo queramos que se controle ese bucle, tenemos tres

posibilidades, que básicamene se pueden describir como:

for: La orden se repite desde que una variable tiene un valor inicial hastaque alcanza otro valor final.

while: Repite una sentencia mientras que sea cierta la condición queindicamos. La condición se comprueba antes de realizar la sentencia.

do..while: Igual, pero la condición se comprueba después de realizar lasentencia.

Las diferencias son: for normalmente se usa para algo que se repite un númerofijo de veces, mientras que "while"se basa en comprobar si una condición es cierta,se repetirá un número mienstras se cumpla la condición.

4.1. Instrucción FORSu sintaxis es:

for (inicialización;condición;incremento){

39

Page 40: Laboratorio JuanXXIII

40 Gustavo A. Yarce

sentencia1;sentencia2;}

La inicialización indica una variable (variable de control) que condiciona( 3.1)la repetición del bucle. Si hay más, 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 número: ");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(Inicialización1,inicialización2;condición1,condición2;incremento1,incremento2)

El programa sigue avanzando,no se sale del bucle for, hasta que se cumplen lasdos condiciones.

4.2. Instrucción WHILE

Con esta sentencia se controla la condición antes de entrar en el bucle. Si éstano se cumple, el programa no entrará en el bucle.Naturalmente, si en el interior del bucle hay más de una sentencia, éstas deberán

Page 41: Laboratorio JuanXXIII

Laboratorio de Computadoras Electrónicas 41

ir entre llaves para que se ejecuten como un bloque.Su sintaxis es:

while (condición) sentencia;

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

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

main() /* Escribe los números del 1 al 10 */{

int numero=1;while(numero<=10){

printf("%d\n",numero);numero++;

}getch();

}

4.3. Instrucción DO...WHILECon esta sentencia se controla la condición al final 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 elcuerpo del bucle se ejecutará por lo menos una vez. Su sintaxis es:

do{sentencia1;sentencia2;}while (condición);

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

Page 42: Laboratorio JuanXXIII

42 Gustavo A. Yarce

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

main() /* Muestra un menú si no se pulsa 4 */{

char seleccion;do{

printf("1.- Comenzar\n");printf("2.- Abrir\n");printf("3.- Grabar\n");printf("4.- Salir\n");printf("Escoge una opción: ");seleccion=getchar();switch(seleccion){

case ’1’:printf("Opción 1");break;

case ’2’:printf("Opción 2");break;

case ’3’:printf("Opción 3");}

}while(seleccion!=’4’);}