Sie sind auf Seite 1von 140

SISTEMAS INFORMTICOS

2 INGENIERA QUMICA

Profesores F. Prez Isidro Calvo

Departamento Ingeniera de Sistemas y Automtica

Curso Acadmico 2003-04

TITULACIN: ASIGNATURA: AO ACADMICO: CREDITOS: AO ACADMICO: OBJETIVOS:

INGENIERA QUMICA SISTEMAS INFORMTICOS 2 3Ty3P 2003-2004

El objetivo de la asignatura es introducir a los alumnos en el mundo de la informtica ms all del punto de vista del usuario. Para ello se imparten conocimientos avanzados sobre arquitectura de computadores, sistemas operativos y lenguajes de programacin.

TEMARIO TERICO:
Tema 1. Introduccin a la informtica. Conceptos bsicos. Origen y evolucin de los sistemas de clculo. Ordenadores personales. Estudio comparativo. Sistemas inteligentes. El PC. Memorias. Tema 2. Estructura general de un sistema de computacin. Descripcin general. Elementos de almacenamiento. Unidad de control. Buses. Estructura general. Fases de ejecucin de instrucciones. Tema 3. Codificacin de la informacin. Conceptos generales. Codificacin. Sistemas de numeracin. Representacin numrica. Cdigos de alfanumricos. Deteccin y correccin de errores. Tema 4. Fundamentos de sistemas operativos. Elementos de un sistema de computacin. Tipos de sistemas operativos. Funcionamiento de los sistemas de computacin. Arquitectura de los sistemas operativos. Elementos de los sistemas operativos. Tema 5. Lenguajes de programacin. Objetivos de la programacin. Tipos de lenguajes. Herramientas de programacin. Desarrollo de programas. Tema 6. Programacin estructurada. Elementos del lenguaje. Estructura general de un programa. Comentarios. Pasos de programacin. Funciones bsicas. Tema 7. Elementos base de programacin. Identificadores. Palabras reservadas. Constantes. Operadores. Separadores. Comentarios.

Tema 8. Tipos de datos simples. Tipos simples: Enteros, reales y caracteres. Variables y constantes. Expresiones y sentencia de asignacin. Conversiones. Operaciones de lectura y escritura.. Tema 9. Operadores. Operadores Aritmticos. Incremento y decremento. Operadores de relacin. Operadores de comparacin. Operadores lgicos. Operadores de acceso a los objetos. Direccin de un objeto. Tipos de direccionamiento. Conversin de tipos de variables. Prioridad de operadores. Evaluacin de expresiones. Tema 10. Instrucciones. Instrucciones simples y compuestas. Instrucciones de condicionales. Instrucciones repetitivas. Estructuras anidadas. Tema 11. Subprogramas Concepto de subprograma. Tiempo de vida y visibilidad de las variables. Paso de parmetros por valor y por referencia. Efectos laterales. Tema 12. Funciones Definicin, declaracin y llamada. Transmisin de informacin entre funciones. La funcin principal. Tema 13. Tipos estructurados Arrays unidimensionales y multidimensionales. Cadenas de caracteres. Funciones para el tratamiento de cadenas de caracteres. Estructuras. Estructuras anidadas. Punteros. Tema 14. Archivos Ficheros binarios y de texto. Entrada y salida estndar. Funciones para el manejo de ficheros.

PRCTICAS:
Sesiones 12: Sesiones 34: Sesiones 512: Sesiones 1315: Arquitectura del PC. Entorno de programacin. Programacin en C. Sistema operativo Linux.

Temario
Arquitectura del PC Estructura de Sistemas de Computacin Sistemas Operativos - Linux Lenguajes de Programacin Programacin en C Estructura de Programa Elementos del Lenguaje Sentencias de Control Modularidad Tipos de Datos Ficheros Sistemas Bsicos de Comunicacin

Bibliografa
Sistemas Operativos
Silberschatz, Galbin Ed. Pearson, Addison Wesley Longman

Linux - Edicin Especial


Tackett, Burnett Ed. Prentice Hall

Fundamentos de Programacin, Algoritmos y Estructura de Datos


Joyanes Ed. McGraw Hill

Programacin Estructurada en C
Antonakos, Mansfield Ed. Prentice Hall

Programacin en C
Joyanes, Zahonero Ed. McGraw Hill

Curso de Programacin C/C++


Ceballos Ed. RA-MA

SISTEMAS INFORMTICOS
MTODO DE CALIFICACIN
Examen Final Obligatorio (80% de la nota final). Nota mnima de aprobado 5. Calificacin por conocimiento demostrado. Dos partes: 9 Terica: Preguntas tericas, modelo tipo test 9 Prctica: Desarrollo de un programa en C Laboratorio Obligatorio (20% de la nota final). Nota mnima de aprobado 5. La nota se mantiene durante el ao posterior a la calificacin. Dos tipos de calificacin: 9 Asistencia + trabajos: Asistencia semanal y aprovechamiento. Entrega de los trabajos que se pidan. Disponibilidad de un disco con todas las prcticas desarrolladas. 9 Examen: Uno por convocatoria

Introduccin a los Sistemas Computacin


Sistemas Informticos

Fede Prez

ndice
TEMA - Introduccin a los Sistemas de Computacin 1. - Conceptos Bsicos 2. - Origen y Evolucin de los Sistemas de Clculo 2.1 Abaco 2.2 Calculadoras Mecnicas 2.3 Las Primeras Computadoras Mark I | ENIAC | ABC 2.4 Las Calculadoras de Von Neuman 3. - Generaciones de Ordenadores 4. - El Ordenador Personal 5. - Razones del xito de los Computadores 6. Estudio Comparativo de la Evolucin de los Computadores 7. Futuro de los Ordenadores

Definiciones
Informtica:
trata de la adquisicin, representacin, tratamiento y transmisin de la informacin. (Segn la Real Academia Espaola de la Lengua) Es el conjunto de conocimientos cientficos y tcnicos para hacer posible el tratamiento automtico de la informacin por medio de computadoras electrnicas

Computadora u Ordenador:

Es una mquina electrnica capaz de aceptar unos datos de entrada, efectuar con ellos una operaciones aritmticas y lgicas, y proporcionar la informacin resultante a travs de un medio de salida; todo ello sin intervencin de un operador humano y bajo el control de un programa de instrucciones previamente almacenado en la propia computadora (acepcin actual) Es una mquina capaz de efectuar operaciones aritmticas bajo el control directo del usuario

Calculadora: Datos:

Son conjuntos de smbolos utilizados para expresar o representar un valor numrico, un hecho, un objeto o una idea, codificada en la forma adecuada para ser objeto de tratamiento por medio de una computadora Datos tratados y organizados, con significado desde el punto de vista del usuario DATOS + INTERPRETACION = INFORMACION UTIL

Informacin:

Hardware vs. Software


Hardware:
Componentes fsicos, dispositivos de estado slido y similares, de un ordenador

Software:

Programas que dirigen el funcionamiento de un ordenador

Firmware:

Ente intermedio entre el hardware y el software

Ordenadores Dedicados y de Propsito General


Ordenador de Propsito General:
tareas de proceso de informacin Puede ejecutar un amplio rango de

Ordenador Dedicado:

Est diseado para una tarea especfica o para un rango reducido de tareas

Evolucin de los Sistemas de Calculo baco


baco: Serie de alambres paralelos, sujetos por los extremos en un armazn rectangular, sobre los que se pueden desplazar una serie de bolas o fichas

TIPOS DE BACOS Origen China Nombre suan pan Caractersticas Consta de 13 hileras de cuentas, divididas en dos partes por una varilla montada transversalmente en el marco, en la parte superior cada hilera con 2 cuentas con un valor de 5 unidades cada una, y en la parte de abajo 5 cuentas, cada una con el valor de una unidad Consta de 13 hileras de cuentas, divididas en dos partes, en la parte superior cada hilera con 1 cuenta con valor de 5 unidades cada una, y en la parte de abajo 4 cuentas, cada una con el valor de una unidad Se utiliza piedra caliza o mrmol que se deslizaban sobre ranuras de superficie plana, las pequeas piedras se les denomin con el nombre de calculi. ?

Japn

soroban

Roma Rusia

? stchoty

Evolucin Calculadoras Mecnicas 1


La Calculadora de Sckickard
En 1623 Wilhelm Sckickard construye la primera mquina de calcular

La Pascalina
1.642 Blaise Pascal. Conjunto de discos dentados, cada uno de los cuales tiene 10 divisiones, que representaban un dgito. Es capaz de realizar sumas y restas

La Calculadora Universal
1694 Gottfried W. Leibniz. Perfecciona la mquina de Pascal aadindole la multiplicacin y divisin.

La Lgica Matemtica
George Boole (1815-1864), es el fundador de la teora de la lgica matemtica.

Evolucin Calculadoras Mecnicas 2


El Padre de la Computadora
Se considera a Charles Babbage (17911871), como el padre de los sistemas actuales de computacin. A Charles Babbage se le atribuye el desarrollo de dos mquinas de clculo: La Mquina Diferencial: (1821) capaz de calcular polinomios de sexto grado y tabular mecnicamente hasta veinte cifras y ocho decimales La Mquina Analtica: (1833) sistema mecnico precursor de la computadora del siglo XX. Dispona de:
Dispositivo de entrada/salida de datos (tarjetas perforadas) Unidad de memoria Dispositivo de clculo llamado "Mill" (Unidad Aritmtica) Mecanismo de barras y palancas que accionaba el conjunto (Unidad de Control), conducido por un programa codificado sobre tarjetas perforadas

Evolucin Calculadoras Mecnicas 3


La Mquina de Tabular
En 1890 Herman Hollerith (1860-1929), invent su mquina tabuladora que utilizaba corriente elctrica para detectar los agujeros que estaban perforados y as hizo registrar la informacin en tarjetas, y el tiempo total del proceso se redujo. Sistema de automatizacin del censo.

Evolucin Las Primeras Computadoras 1


La Computadora Electromecnica
Z-1 (1935)
Konrad Zuse en Berln desarroll su computadora Z-1

Mark I Computer (ASCC) Automatic Sequence Controller Calculator (1944)


Desde 1937 hasta 1944, IBM patrocin el proyecto del Dr. Howard H. Aiken, profesor de la universidad de Harvard. En 1944 finaliz su objetivo con el nombre de Mark I.

Evolucin Primer Bug

Evolucin Las Primeras Computadoras 2


La Computadora Electrnica
ABC (Atanasoff Berry Computer) (1936/37)
John Vicent Atanasoff y Clifford Berry. Principios de las primeras computadoras.

ENIAC (Electronic Numerical Integrator and Computer) (1946)


Construido en la universidad de Pennsylvania, por John W. Mauchly y John Presper Eckert

Evolucin Las Primeras Computadoras 3


Calculadoras de Von Neuman
John Von Neumann (1903-1957)
1.946 "First Draft of a Report on to Edvac Principios ordenadores del tipo Von Neumann: Concepto de numeracin codificada Almacenamiento del programa en memoria Perfeccionamiento de la ruptura de secuencia

EDSAC (1.949)
M. Wikes, de la Universidad de Cambridge

UNIVAC (1.951)
Eckert y Mauchly, primera computadora adquirida con fines lucrativos.

Babbage vs. Von Newman


Modelo de Computadora segn Babage
Datos Programa

C.P.U. Memoria
Resultados

Entrada Modelo de Computadora segn Von Newman


Datos

U.A. C.P.U. Memoria

Salida

Resultados

Entrada
Programa

U.A.

Salida

Generaciones de Ordenadores 1
1 Generacin (1940-52)
9 Tecnologa empleada: Vlvulas de vaco 9 Uso: Cientfico y militar. 9 Programacin: Modificando directamente los valores de los circuitos de la mquina. No existan los lenguajes de programacin, ni siquiera el ensamblador. 9 Ordenadores caros, debido a la corta vida de la vlvulas de vaco y al gran calentamiento, as como al gran consumo de energa elctrica. 9 Ordenadores lentos. 9 Capacidad de almacenamiento muy pequea. 9 Incapacidad de ejecutar ms de una tarea a la vez. Algunas de las realizaciones son: UNIVAC | EDSAC | EDVAC | ORDAC | ILLIAC | MANIAC | JHONIAK | WEIZAK

Generaciones de Ordenadores 2
2 Generacin (1952-64)
9 Tecnologa empleada: Transistor 9 Dispona ya de una programacin previa, de un Sistema Operativo, capaz de interpretar instrucciones escritas en lenguajes de programacin como COBOL o FORTRAN. 9 Comienza el desarrollo de perifricos de E/S (impresoras) y los Lenguajes de alto nivel (y el ensamblador). 9 El modo de trabajo era generalmente el sistema por lotes. 9 Aumento de la velocidad en el clculo 9 Reduccin de tamao 9 Reduccin del consumo a energa y potencia disipada 9 Tiempo de vida media del transistor superior a la vlvula 9 Abaratamiento Algunas de las realizaciones son: Sperry Rand 1207 | IBM 700 | IBM 1400 | 1700

Generaciones de Ordenadores 3
3 Generacin (1964-75)
9 Tecnologa empleada: Circuito integrado (lmina de silicio embutida en plstico). Se utilizan materiales semiconductores en lugar de los ncleos de ferrita en la construccin de memorias. 9 Se mejoran los lenguajes de programacin y empezaron a aparecer programas comerciales, con lo que un usuario no tena que programar sus aplicaciones. 9 Capacidad de multiprogramacin, con lo cual los ordenadores son capaces de ejecutar varias tareas al mismo tiempo. 9 Aumento en la velocidad de clculo 9 Tamao disminuye Algunas de las realizaciones son: IBM System/360 | GE 600 | PDP-11

Generaciones de Ordenadores 4
4 Generacin (1975-?)
9 9 Tecnologa empleada: Circuitos de alta escala de integracin. Microprocesadores. Es el producto de una serie de avances tanto en el hardware, y su tecnologa de fabricacin, como en el software y sus posibilidades de aplicacin:
o Nuevas tecnologas de fabricacin de semiconductores que conducen a velocidades de transmisin cada vez mayores y mayor capacidad de almacenamiento. o Aparicin de paquetes software, que obedecen a nuevas concepciones y situaciones especficas: bases de datos, diseo asistido, tratamiento de texto, ... o Nuevas memorias de al almacenamiento: tecnologas Winchester, y burbujas magntica o Aparicin de los ordenadores personales o Ms lenguajes de alto nivel y herramientas informticas. o Desarrollo de perifricos inteligentes: descargan de trabajo a la CPU. o Hacia mediados de los 80, comienza el desarrollo de redes de computadoras personales que corren sistemas operativos en red y sistemas operativos distribuidos

Generaciones de Ordenadores 5
5 Generacin (?)
9 9 9 9 9 9 Arquitectura diferente a la propuesta por Von Neumann Ordenadores inferentes Ordenadores de transputers Ordenador ptico Mquinas neuronales Sistemas informticos distribuidos

El Ordenador Personal
9 9 9 9 Aos 70, primer microprocesador, el INTEL 4004, posibilidad de construccin de un ordenador utilizable por un solo usuario 1977, S. Wozniak y S. Jobs, fundaron una empresa llamada Apple 1.981, IBM PC (Personal Computer) Evolucin tanto en el microprocesador utilizado (8088, 8086, 80286, 80386, 80486, Pentium) y en el sistema operativo (UNIX para PC, el OS/2 de IBM y el Windows de Microsoft) Mediados de los 80, comienza el desarrollo de redes de computadoras personales

Estudio Comparativo de la Evolucin de los Computadores

Potencia Tamao Precio

Tiempo

Arquitectura y Componentes del PC


Sistemas Informticos

Fede Prez

ndice
TEMA Arquitectura y Componentes del PC 1. Componentes Bsicos 1.1 Funcionalidad 1.2 Emplazamiento 1.3 Caractersticas ms Importantes 2. Evolucin 4. - Conclusiones

El PC - Disposicin

Minitorre

Sobremesa

Chasis en disposicin de Torre

Estructura Interna de un Microcomputador

La Placa Base (I)


Elemento principal al que se conectan los restantes componentes y perifricos. Formatos
9 Baby AT
8 Conector grueso del teclado. 8 Dificultad al instalar tarjetas de expansin largas. 8 Mantenimiento farragoso.

Esquema del formato Baby AT.

La Placa Base (II)


9 ATX
8 Mejora la flexibilidad, integracin y funcionalidad. 8 Reorganizacin de la distribucin de componentes. 8 Disminucin de la longitud de los cables, mejora de la ventilacin. 8 Conectores PS/2 8 USB

Formato ATX.

Componentes de la Placa Base

Componentes de la Placa Base

La Fuente de Alimentacin
Niveles de c.c.
9 +/-12 V Amarillo. 9 +/-5 V Rojo. 9 GND Negro.

Convierte la energa alterna de la red a dos niveles de continua.

La Fuente de Alimentacin - Conectores

Conectores ATX en Placa Base Conectores ATX

Conectores en Y Conectores P6

El Chipset
Determina el rendimiento y caractersticas de la placa. Controla su modo de operacin e integra todas sus funciones.
9 Velocidad del bus 9 Controlador de IRQ 9 Tipos de memoria 9 Tipo de CPU 9 N de CPUs 9 Caractersticas PnP 9 Puente PCI-ISA 9 Controlador de DMA 9 Tipo de cach L2 9 ...

La Memoria
Memoria principal:
9 Ms y mayores programas al mismo tiempo. 9 SIMM (5V)-DIMM (3.3-5V), N de contactos 30, 72, 168. 9 Bus de datos { bus de memoria. Organizacin en bancos.

Memoria cach:
9 Acelera los procesos de la CPU, almacn ltimos datos transferidos. 9 Emplazamiento sobre placa o mdulos COAST.

Mdulo DIMM.

Papel de la memoria en un PC
Al referirnos a memoria generalmente nos referimos a la memoria RAM. Un ordenador utiliza la memoria RAM para guardar las instrucciones y los datos temporales que se necesitan para ejecutar las tareas. Esto permite a la CPU del ordenador (unidad central de proceso), acceder rpidamente a las instrucciones de acceso y a los datos almacenados en la memoria . Adems de la RAM en un PC encontramos otros muchos tips de memoria
9 9 9 9 SDRAM (RAM) ROM FLASH (BIOS) SRAM (cache) etc

Clasificacin de la Memoria por Tipos


TIPOS MEMORIA Voltiles FIFO RAM DINAMICA (DRAM) VIDEO VRAM WRAM SGRAM SDRAM DDR-RAM SISTEMA FPM EDO SDRAM DDR RDRAM (RAMBUS) ESTATICA SRAM No voltiles ROM PROM Y EPROM EEPROM FLASH MRAM

BIOS Pila
Memoria ROM, EPROM, FLASH que contiene las rutinas necesarias para arrancar el PC. Se apoya en una memoria CMOS, alimentada por una batera. Contiene el programa de configuracin del PC.

BIOS-Pila.

BIOS Pantalla de Configuracin

El Procesador (I)
Es el chip ms importante de la placa base. Est formado por:
9 ALU -Unidad Aritmtico Lgica. 9 UC -Unidad Central. 9 Memoria Central (R.A.M)
8 Cach interna (L1). 8 Cach externa (L2).

Pentium 4

El Procesador (II)
Principales Caractersticas:
9 Velocidad. 9 Tipo de zcalo. 9 Memoria Cach. 9 Instrucciones Especiales. 9 Bus de comunicacin. 9 Tecnologa de fabricacin.

Buses de Expansin (I)


Al conectar una tarjeta a un bus de expansin, sta funciona como si estuviera directamente conectada al procesador. Caractersticas de las principales:

PCI
9 9 9 9

SCSI
9 9 9 9

AGP
9 9

ISA
9 9

Independiente de la CPU Controlador de bus Plug & Play Color crema

E/S Inteligente Necesita de otros buses Direccionamiento lgico Hasta 15 dispositivos

Apartado grfico Color marrn

1 en aparecer Color negro

Buses de Expansin (II)

Vesa Local Bus

PCI Bus

Perifricos Internos
Dispositivos que se conectan a la placa base por medio de los buses o ranuras de expansin. Los ms comunes son:
9 Unidades de almacenamiento.
8 Disquetera 8 Disco duro 8 CD_ROM 8 DVD 8 Instalacin de varios dispositivos

9 Tarjetas de vdeo 9 Tarjetas de sonido

El Disco Duro (I)


Sistema de almacenamiento, en el se guardan los archivos de los programas (SO,Word..)

El Disco Duro (II)

Instalacin de Varios Disp. de Almacenamiento


Las controladoras EIDE, disponen de dos canales IDE independientes, pudiendo instalar hasta 4 dispositivos, 2 por canal.
9 1->primario master. 9 2->primario esclavo. 9 3->secundario master. 9 4->secundario esclavo.
8 El primario master arranca el computador.

Una controladora SCSI(las ms rpidas) se pueden conectar hasta 7 dispositivos o 15 si es WIDE SCSI.

Disquetera y CD-ROM
DISQUETERA
9 Slo han existido dos formatos considerados como estndar, el de 5 y el de 3 .

CD-ROM - DVD
9 Pueden almacenar gran informacin, aunque menor que un disco duro, pero la velocidad de recuperacin de informacin y la capacidad es menor. 9 Hay lectores, grabadores y regrabadores

Tarjetas de Vdeo y Sonido


TARJETAS DE VDEO
9 Los diferentes programas, envan sus salidas a travs de las llamadas tarjetas de vdeo a la pantalla. 9 Hoy en da, son grficas e incluyen aceleracin por hardware.

TARJETAS DE SONIDO
9 Permiten escuchar msica y sonidos al ejecutar las aplicaciones. 9 Es conveniente que admitan la modalidad full duplex, para programas de video conferencias. 9 Se suele conectar al CD-ROM para escuchar msica.

Puertos (I)
Sirven para conectar al PC los dispositivos externos de E/S. Puerto serie (RS232C) COM 1,COM 2, etc. Puerto paralelo (CENTRONICS): LPT1 o PRN. Puerto USB

Puertos (II)

Perifricos Externos
Dispositivos que se conectan a la placa base por medio de los puertos. Los ms comunes son:
9 Teclados 9 Ratones 9 Monitores 9 Impresoras 9 Scaners 9 Modems

Teclados y Ratones

Monitores
CRT LCD (TFT)

Impresoras
Matriciales Agujas Inyeccin de Tinta Laser

Escaners

Conclusiones
Modularidad y caractersticas Plug & Play. La placa base contiene los elementos mnimos necesarios. Las prestaciones de los computadores aumentan a un ritmo vertiginoso. Las posibilidades de configuracin y ampliaciones posteriores son prcticamente ilimitadas. Por todo ello son computadores a la carta, creados al gusto y necesidades del usuario.

Estructura General de un Sistema de Computacin


Sistemas Informticos

Fede Prez

ndice
TEMA 2 Estructura General de un Sistemas de Computacin 1. - Introduccin 2. - Seccin Primaria de Almacenamiento. Memoria Principal 2.1 Estructura General 2.2 Organizacin Interna de la Memoria 2.3 Direccionamiento 2.4 Operaciones de Lectura/Escritura en Memoria 2.5 Propiedades Fundamentales de las Memorias 2.6 Parmetros de Tiempo en Memoria 2.7 Tipos de Memoria 2.8 Jerarquas de Almacenamiento 3. - Unidad de Control de Procesos - C.P.U. 3.1 Unidad de Control 3.2 Unidad Aritmtico-Lgica - A.L.U. 4. - Buses 4. - Descripcin General 5. Fases de Ejecucin de una Instruccin 5.1 Fase FETCH - Bsqueda o Lectura de una Instruccin 5.2 Fase EXECUTE - Ejecucin

Organizacin Bsica de un SC

Estructura General de un SC Memoria

Memoria Principal Organizacin Interna

Memoria Principal Direccionamiento

Direccionamiento cableado en dos dimensiones

Direccionamiento cableado en tres dimensiones

Memoria Principal Operaciones de Lectura y Escritura

Lectura
1- Direccin de la palabra solicitada es recogida en registro de direcciones 2- Seal de control la operacin deseada (lectura) 3- La memoria decodifica la direccin, activa la celda correspondiente y deposita el dato en el registro de palabra; de ah la informacin pasa al bus de datos

Escritura
1- Direccin de la palabra solicitada es recogida en registro de direcciones 2- En el bus de datos la informacin a escribir en memoria, quedando almacenado en el registro de datos de la memoria 3- Seal de control la operacin deseada (escritura) 4- El dato del registro de datos de la M.P. se almacena en la clula de memoria activada

Memoria Principal Parmetros

Propiedades Fundamentales
1- Coste por Bit 2- Tiempo de Acceso 3- Capacidad de Almacenamiento

Parmetros de Tiempo
Ciclo de Lectura: Tiempo que transcurre
desde que a la memoria llega la seal de lectura, hasta que aparece el dato en el bus de datos

Ciclo de Escritura:

Tiempo que transcurre desde que a la memoria llega la seal de escritura (se accede a la direccin)

Tiempo de Acceso:

Espacio mnimo de tiempo requerido entre accesos sucesivos (lectura/escritura) a una memoria

Tipos de Memoria
De Lectura y Escritura - RAM (Random Access Memory / Read-Write Memory) 9 Dinmicas (DRAM) 9 Estticas (SRAM) De Solo Lectura - ROM (Read Only Memory) 9 ROM (Read Only Memory) 9 PROM (Programmable Read Only Memory) 9 EPROM (Erasible Programmable Read Only Memory) 9 EEPROM (Electrically Erasible Programmable Read Only Memory)

R/W Direccionamiento aleatorio Volatibilidad Capacidad Tiempo de Acceso

SRAM R/W Si Si Alta Alto

DRAM R/W Si Si Muy Alta Muy Alto

ROM/PROM R Si No Baja Bajo

EPROM/EEPROM R Si No Baja Bajo

FLASH R/W Si No Muy Alta Medio

Jerarqua de Almacenamiento
Registro Cach Memoria Principal Disco Electrnico
Almacenamiento secundario

accionador pista sector eje

Almacenamiento de acceso directo

Disco Magntico Disco Optico Cinta Magntica

cilindro

Cabeza de lectura y escritura

plato

brazo

Tasa de Transferencia: es la rapidez con que fluyen los datos de la unidad de disco a la CPU Tiempo de Posicionamiento o Tiempo de Acceso Aleatorio: es el tiempo que tarda en mover el brazo del disco al cilindro deseado

Latencia Rotacional: es el tiempo que el sector deseado tarda en girar hasta quedar debajo de la cabeza de disco Controladores de Disco: Se encargan de La transferencia de datos por los buses

Unidad de Control Acepciones y Funciones

Acepciones
1- Microprocesador (P):
la Unidad Aritmtico-Lgica (ALU) y la Unidad Central (UC)

Funciones
1- selecciona
e interpreta instrucciones del programa hacia la memoria las

2- Procesador Central:

el P (UC y ALU) ms la Memoria Principal (MP)

2- controla el flujo de datos desde y 3- supervisa el resto de componentes de


la CPU

3- Ordenador personal (PC): la Placa


Base (P+MP+...), Unidad de Alimentacin, Dispositivos de Almacenamiento Internos (discos, cintas, ...), ...

Unidad de Control Estructura General

Unidad de Control Registro de Instrucciones


Registro de Instrucciones
Instruccin = Cdigo de Operacin C.O. + Modo de Direccionamiento M.D. + Campo de Direcciones C.D.

Modos de Direccionamiento
1- Directo:
Absoluto Relativo

2- Indirecto 3- Inmediato

Unidad Aritmtico-Lgica ALU

Flags de Estado
Flag de Cero Flag de Acarreo Flag de Desbordamiento (Overflow) Flag de Paridad

Buses

Tipos de Buses
1- Bus de Datos 2- Bus de Direcciones 3- Bus de Control
Lneas de Control Lneas de Estado

Descripcin General

Fases de Ejecucin de una Instruccin

Fase Fetch
- Lectura de una Instruccin

Fase Execute
- Lectura de operandos y decodificacin de la instruccin - Ejecucin de la operacin - Almacenamiento de resultados 1.11.21.323Impulsos al secuenciador Acciones del secuenciador Acceso a operandos Ejecucin de la instruccin Almacenamiento de resultados

1- Transferir direccin desde Contador de Programa 2- Activacin de celda y paso a registro de palabra 3- Instruccin hasta registro de instrucciones

Lenguajes de Programacin
Sistemas Informticos

Fede Prez

ndice
TEMA - Lenguajes de Programacin 1. - Programacin 2. - Objetivos de la Programacin 3. Tipos de Lenguajes 3.1 Lenguaje Mquina 3.2 Lenguajes Ensambladores 3.3 Lenguajes del Alto y Bajo Nivel 4. - Procesadores de Lenguajes 4.1 Compiladores 4.2 Intrpretes 5. - Herramientas de Programacin 6. Desarrollo de Programa que Suma Dos Nmeros

Programacin
Definicin
Labor de desarrollar programas de computador

Anlisis Enunciado del Problema ( algortmico )

Diseo

Codificacin Programa ( en lenguaje de Programacin )

Problema

Algoritmo

Objetivos
1- Correccin 2- Claridad 3- Eficiencia

Ciclo de Vida del Software: Cascada de Behm

Anlisis y Especificacin Diseo Codificacin Validacin y pruebas Operacin y Mantenimiento Documentacin

Lenguajes de Programacin
Lenguaje Mquina
0101110111011001-----------------------------------------------------------------------------------------

Lenguaje Ensamblador
Resultados 1
MOV AX, -PUSH AX ------------------------ADD SP, 2 ------------------------PUSH CX ------------------------END
Progra ma Fuente
0101110111011001-----------------------------------------------------------------------------------------

Datos 1

Programa Objeto 1
--------------------------------------------------------0111010101110001---------------------------------

Ensa mblador
--------------------------------------------------------0111010101110001---------------------------------

Lenguaje Mquina 1

Lenguaje Mquina

01011100 ------------------------------------------------------------01110101

Progra ma Objeto - Ejecutable -

Mquina Base

1
01011100

Mquina Base

1111110001110000-----------------------------------------------------------------------------------------

---------------------------------------------------------

Datos 1

Programa Objeto 2
--------------------------------------------------------00000011110001110--------------------------------

Resultados 1

Datos

Prg. Objeto Ejecuta ble


---------------------------------------------------------

Resultados

01110101

Lenguaje Mquina 2

Lenguaje Mquina

Mquina Base

Mquina Base

Lenguajes de Alto Nivel 1- Independientes de la arquitectura del computador 2- Poseen instrucciones complejas 3- Notacin cercana al lenguaje cientfico y natural

Lenguaje Mquina
0101110111011001-----------------------------------------------------------------------------------------

Datos 1

Programa Ejecutable 1
--------------------------------------------------------0111010101110001---------------------------------

Resultados 1

Lenguaje LenguajeMquina Mquina11

Mquina Base

1111110001110000-----------------------------------------------------------------------------------------

Datos 1

Programa Ejecutable 2
--------------------------------------------------------00000011110001110--------------------------------

Resultados 1

Lenguaje LenguajeMquina Mquina22

Mquina Base

Lenguaje Ensamblador
a) Obtencin del programa ejecutable
MOV AX, -PUSH AX ------------------------ADD SP, 2 ------------------------PUSH CX ------------------------END
0101110111011001-----------------------------------------------------------------------------------------

Ensamblador
--------------------------------------------------------0111010101110001---------------------------------

Lenguaje LenguajeMquina Mquina

01011100 ------------------------------------------------------------01110101

Programa Fuente Mquina Base

Programa Ejecutable

b) Ejecucin del programa ejecutable

01011100

---------------------------------------------------------

Datos

Programa Ejecutable
---------------------------------------------------------

Resultados

01110101

Lenguaje LenguajeMquina Mquina

Mquina Base

Procesadores de Lenguajes
0101110111011001-----------------------------------------------------------------------------------------

Tra ductor 1
--------------------------------------------------------0111010101110001---------------------------------

/* PROGRA -#include --void main ( ) { int Cont, Edad -----------------------printf (El resul }
Progra ma Fuente PROGRAMA.C

Lenguaje Mquina 1

01111010 --------------------------------------------------------------------------------------------------------------------------------------------------------11001000
Progra ma Ejecuta ble ( en la m quina 1 )

Mquina Base

0111101111011101-----------------------------------------------------------------------------------------

Tra ductor 2
--------------------------------------------------------1111010101010111---------------------------------

Lenguaje Mquina 2

01111111 --------------------------------------------------------------------------------------------------------------------------------------------------------11011011
Progra ma Ejecuta ble ( en la mquina 2 )

N OTA: Un compila dor (tra ductor) cruzado es ca pa z de Genera r cdigo para una m quina diferente de a quella en la que se ejecuta

Mquina Base

Intrpretes

Programa Fuente PROGRAMA.BAS REM PROGRAMA.BAS

Datos

INPUT Introduce el valor : , Valor INPUT la cantidad : , Cant Total = Valor*Cant PRINT El precio total es: , Total

Resultados

Lenguaje LenguajeFuente Fuente


0101110111011001-----------------------------------------------------------------------------------------

Intrprete
--------------------------------------------------------0111010101110001---------------------------------

Lenguaje LenguajeMquina Mquina

Mquina Base

Compiladores
Compilado
/* PROGRA -#include -void main ( ) { int Cont, Edad -----------------------printf (El resul }
Progra ma Fuente PROGRAM A.C
0101110111011001-----------------------------------------------------------------------------------------

Compilador
--------------------------------------------------------0111010101110001---------------------------------

01011100 ------------------------------------------------------------01110101
Programa Objeto - N o ejecuta ble PROGRAMA.OBJ

Ejecucin
Progra ma Objeto - Ejecuta ble PROGRAMA.EXE

Lenguaje Mquina

Mquina Base

Datos

Enlazado
01011100 ------------------------------------------------------------01110101
PROGRAM A.OBJ
0101110111011001-----------------------------------------------------------------------------------------

01111010 --------------------------------------------------------------------------------------------------------------------------------------------------------11001000

Resultados

Lenguaje Mquina
Enlaza dor (Linker)
--------------------------------------------------------0111010101110001---------------------------------

Lenguaje Mquina

01111000 ------------------------------------------------------------11010001
RUTIN AS.LIB

01111010 --------------------------------------------------------------------------------------------------------------------------------------------------------11001000
Progra ma Objeto - Ejecuta ble PROGRAMA.EXE

Mquina Base

Mquina Base

Compiladores
Caso General
/* PROGRA #include void main ( ) { int A -printf (El res}
0101110111011001-------------------------------------------------

Compilador
------------------------------------0111010101110001

Lenguaje Mquina

01011100 ------------------------------------------------------------01110101
Progra ma Objeto PROG_1.OBJ

Progra ma Fuente PROG_1.C

Mquina Base

.../...
/* PROGRA void InterCamb (int { int Temp ---------------------return ----------}
0101110111011001-------------------------------------------------

11110000 ------------------------------------------------------------01100111
Progra ma Objeto PROG_2.OBJ

0101110111011001-------------------------------------------------

Enla zador (Linker)


------------------------------------0111010101110001

Lenguaje Mquina

Compilador
------------------------------------0111010101110001

Lenguaje Mquina

00010000 ------------------------------------------------------------01011111
Progra ma Objeto PROG_N .OBJ

Mquina Base

01111010 --------------------------------------------------------------------------------------------------------------------------------------------------------11001000
Progra ma Objeto - Ejecutable PROGRAMA.EXE

Progra ma Fuente PROG_N .C

Mquina Base

00010011 ------------------------------------------------------------01100001
Progra ma Objeto RUTIN AS.LIB

Libreras: Bibliotecas Estticas


01011100 ------------------------------------------------------------01110101 PROGR_1.OBJ 01111000 ------------------------------------------------------------11010001 RUTINAS.LIB Mquina Base
0101110111011001-----------------------------------------------------------------------------------------

Enlazador (Linker)
--------------------------------------------------------0111010101110001---------------------------------

Lenguaje LenguajeMquina Mquina

01011100 ---------------------------------------------------------01110101 ----------------------------------------------------------------------------11001000 Programa Ejecutable PROGR_1.EXE

11100100 --------------------01110000 PROGR_2.OBJ

0101110111011001-----------------------------------------------------------------------------------------

Enlazador (Linker)
--------------------------------------------------------0111010101110001---------------------------------

Lenguaje LenguajeMquina Mquina


01111000 ------------------------------------------------------------11010001 RUTINAS.LIB Mquina Base

11100100 -------------------01110000 ----------------------------------------------------------------------------11001000

Cdigo de las rutinas (copiado de la Biblioteca)

Programa Ejecutable PROGR_2.EXE

Libreras: Bibliotecas Estticas


Ejecucin utilizando bibliotecas estticas
01111010 ---------------------------------------------------------01110101 ----------------------------------------------------------------------------11001000 11100100 -------------------01110000 ----------------------------------------------------------------------------11001000

PROGR_1.EXE

Cdigo de las rutinas

PROGR_1.EXE

01111010 ---------------------------------------------------------01110101 ----------------------------------------------------------------------------11001000

PROGR_2.EXE

Cdigo de las rutinas

Cdigo de las rutinas

Lenguaje LenguajeMquina Mquina

Lenguaje LenguajeMquina Mquina

Mquina Base

Mquina Base

Libreras: Bibliotecas Dinmicas


01011100 ------------------------------------------------------------01110101 PROGR_1.OBJ 01111000 ------------------------------------------------------------11010001 RUTINAS.DLL Mquina Base
0101110111011001-----------------------------------------------------------------------------------------

Enlazador (Linker)
--------------------------------------------------------0111010101110001---------------------------------

01011100 ------------------------------------------------------------------------01110101------------Uso de Librera Rutinas.DLL Programa Ejecutable PROGR_1.EXE

Lenguaje LenguajeMquina Mquina

Los programa ejecutables necesitan el archivo RUTINAS.DLL para poderse ejecutar

11100100 --------------------01110000 PROGR_2.OBJ

0101110111011001-----------------------------------------------------------------------------------------

Enlazador (Linker)
--------------------------------------------------------0111010101110001---------------------------------

11100100 -------------------01110000 ------Uso de Librera Rutinas.DLL Programa Ejecutable PROGR_2.EXE

01111000 ------------------------------------------------------------11010001 RUTINAS.DLL

Lenguaje LenguajeMquina Mquina


01111000 ------------------------------------------------------------11010001 RUTINAS.DLL Mquina Base

Libreras: Bibliotecas Dinmicas


Ejecucin Utilizando Bibliotecas Dinmicas
PROGR_1.EXE 01011100 ------------------------------------------------------------------------01110101------------Uso de Librera Rutinas.DLL 11100100 -------------------01110000 ------Uso de Librera Rutinas.DLL 01111000 ------------------------------------------------------------11010001

PROGR_1.EXE

01011100 ------------------------------------------------------------------------01110101------------Uso de Librera Rutinas.DLL 01111000 ------------------------------------------------------------11010001

PROGR_2.EXE

RUTINAS.DLL

RUTINAS.DLL

Lenguaje LenguajeMquina Mquina

Lenguaje LenguajeMquina Mquina

Mquina Base

Mquina Base

Herramientas de Programacin
Programa Ejecutable PROGRAMA.EXE

Datos

01111010 ------------------------------------------------------------------------------------------------------------------------------------------------11001000

Resultados

Lenguaje Mquina
0101110111011001-----------------------------------------------------------------------------------------

Depura dor
--------------------------------------------------------0111010101110001---------------------------------

TRAZA DEL PROGRAMA

Lenguaje Mquina

Entornos de Programacin
Mquina Base

Depuradores
Progra ma Fuente PROGRAMA.C
/* PROGRA #include --void main ( ) { int A -printf (El res}

0101110111011001-----------------------------------------------------------------------------------------

/* PROGRA #include --void main ( ) { int A -printf (El res}

Editor
--------------------------------------------------------0111010101110001---------------------------------

Progra ma Fuente PROGRAM A.C

1101110111011111-----------------------------------------------------------------------------------------

Compilador
--------------------------------------------------------0000010101110001---------------------------------

01011100 Progra ma --------------------Objeto --------------------PROGRAMA.OBJ 01110101

Progra ma Objeto PROGRAMA.OBJ Progra ma Objeto Libreria de rutina s RUTIN AS.LIB

01011100 ----------------------------------------01110101 01111101 --------------------00000100 01111010 ----------------------------------------------------------------------------11001000

0001100110010001-----------------------------------------------------------------------------------------

Enlazador (Linker)
--------------------------------------------------------1111011101100001---------------------------------

01111010 ----------------------------------------------------------------------------11001000

Progra ma Ejecuta ble PROGRAM A.EXE

Progra ma Ejecuta ble PROGRAMA.EXE

0001110000011000-----------------------------------------------------------------------------------------

Resultados
TRAZA DEL PROGRAMA

Depurador
--------------------------------------------------------0100000101000001---------------------------------

Datos

Suma de dos Nmeros 1


Diseo
Sumar dos nmeros

Obtener Sumando 1

Obtener Sumando 2

Calcular la suma

Mostrar valor de la suma

Pedir Nmero

Leer Nmero

Pedir Nmero

Leer Nmero

Basic
REM REM Programa en BASIC: SUMA_BAS.BAS REM INPUT "Introduce un N entero: ", iEntero_1 INPUT "Introduce otro entero: ", iEntero_2 iSuma = iEntero_1 + iEntero_2 PRINT "La suma es: ", iSuma

Suma de dos Nmeros 2


Pascal
(* Programa en PASCAL: SUMA_PAS.PAS *) PROGRAM suma_pas ; VAR iEntero_1, iEntero_2, iSuma : Integer ; BEGIN Write ('Introduce un N entero: ') ; ReadLn (iEntero_1 ) ; Write ('Introduce otro entero: ') ; ReadLn ( iEntero_2 ) ; iSuma := iEntero_1 + iEntero_2 ; iSuma = iEntero_1 + iEntero_2 ; WriteLn ('La suma es: ', iSuma) END. } printf ("La suma es: %d", iSuma) ; #include <stdio.h> void main (void) { int iEntero_1, iEntero_2, iSuma ; printf ("Introduce un N entero: ") ; scanf ("%d", &iEntero_1) ; printf ("Introduce otro entero: ") ; scanf ("%d", &iEntero_2) ;

C
/* Programa en C: SUMA_C.C */

Suma de dos Nmeros Relacin entre Lenguajes


;|*** /* Programa en C SUMA_C.C */ ; Line 1 ;|*** ;|*** #include <stdio.h> ; Line 3 ;|*** ;|*** void main (void) ;|*** { ; Line 6 PUBLIC _main _main PROC NEAR *** 000000 55 push bp *** 000001 8b ec mov bp,sp *** 000003 b8 06 00 mov ax,6 *** 000006 e8 00 00 call __aNchkstk ; iEntero_1 = -2 ; iEntero_2 = -4 ; iSuma = -6 ;|*** int iEntero_1, iEntero_2, iSuma ; ;|*** ;|*** printf ("Introduce un N entero: ") ; ; Line 9 *** 000009 b8 00 00 mov ax,OFFSET DGROUP:$SG168 *** 00000c 50 push ax *** 00000d e8 00 00 call _printf *** 000010 83 c4 02 add sp,2 ;|*** scanf ("%d", &iEntero_1) ; ; Line 10 *** 000013 8d 46 fe lea ax,WORD PTR [bp-2] ; iEntero_1 *** 000016 50 push ax *** 000017 b9 17 00 mov cx,OFFSET DGROUP:$SG169 *** 00001a 51 push cx *** 00001b e8 00 00 call _scanf *** 00001e 83 c4 04 add sp,4 ;|*** printf ("Introduce otro entero: ") ; ; Line 11 *** 000021 b8 1a 00 mov ax,OFFSET DGROUP:$SG170 *** 000024 50 push ax *** 000025 e8 00 00 call _printf *** 000028 83 c4 02 add sp,2 ;|*** scanf ("%d", &iEntero_2) ; ; Line 12 *** 00002b 8d 46 fc lea ax,WORD PTR [bp-4] ; iEntero_2 *** 00002e 50 push ax *** 00002f b9 31 00 mov cx,OFFSET DGROUP:$SG171 *** 000032 51 push cx *** 000033 e8 00 00 call _scanf *** 000036 83 c4 04 add sp,4 ;|*** ;|*** iSuma = iEntero_1 + iEntero_2 ; ;|*** ;|*** printf ("La suma es %d", iSuma) ; ; Line 16 *** 000039 *** 00003c *** 00003f *** *** *** *** ;|*** } ; Line 17 *** *** *** 000042 000043 000046 000047 00004a 00004c 00004d 8b 46 fc 03 46 fe 89 46 fa 50 b8 34 00 50 e8 00 00 8b e5 5d c3 mov add mov push mov push call mov pop ret ax,WORD PTR [bp-4] ax,WORD PTR [bp-2] WORD PTR [bp-6],ax ; iEntero_2 ; + iEntero_1 ; iSuma

ax ax,OFFSET DGROUP:$SG172 ax _printf sp,bp bp

_main _TEXT END ;|***

ENDP ENDS

Ensamblador Lenguaje mquina (hexadecimal) Direccin de memoria (relativa)

Equivalencia de cdigos

En C: En Pascal:

iSuma = iEntero_1 + iEntero_2 iSuma := iEntero_1 + iEntero_2

Programacin en C
Sistemas Informticos

Fede Prez

ndice
TEMA - Lenguaje de Programacin C 1. - Introduccin 2. - Conceptos Bsicos 2.1 Tipos de Datos Base 2.2 Funciones de Entrada/Salida 2.3 Expresiones y Operadores 3. - Sentencias de Control 3.1 - Sentencias Selectivas 3.2 - Sentencias Repetitivas 4. - Funciones 5. Datos Estructurados 5.1 Arrays 5.2 Cadenas de Caracteres 5.3 Estructuras 6. Ficheros

Historia del Lenguaje C


Historia
9 9 9 9 9 9 9 9 Nacimiento aos 70 laboratorios Bell Telephone junto con UNIX UNIX Ken Thompson y Dennis Ritchie Transferencia PDP-7 PDP-9, PDP-11 1970 (Ken Thompson) definicin del lenguaje B (proviene del BCPL) 1972 (Dennis Ritchie) definicin del lenguaje C 1973 (UNIX versin 5) 90% en C para PDP-11 Aos 80 ANSI C estndar ISO Mediados de los 80 C++ estndar ISO 1998

Caractersticas del Lenguaje C


Caractersticas
9 9 9 9 9 9 9 Lenguaje de propsito general Poco tipificado Cercano a la mquina Variado juego de operadores Reemplaza ventajosamente al ensamblador Recursividad y reentrabilidad Utilizacin natural de las funciones primitivas del sistema de explotacin

Carencias
9 Manejo de tablas y cadenas de caracteres 9 Multiprogramacin, control de procesos, sincronizacin 9 Entrada/Salida, ficheros

Solucin
Programoteca Librera estndar

Componentes del Lenguaje C


Componentes del Lenguaje
9 Compilador: software que traduce a lenguaje de
mquina el programa C contenido en uno o ms ficheros fuente

9 Preprocesador: software que acta siempre por


delante del compilador facilitando su tarea y la del programador

9 Librera Estndar: funciones agrupadas en un


conjunto de libreras de cdigo objeto preprogramadas que se venden o se entregan junto con el compilador

Estructura General de un Programa I


Programa
Conjunto de instrucciones que se ejecutan ordinariamente de modo secuencial

Funcin
Divisin un programa muy grande en una serie de mdulos mucho ms pequeos y manejables. A estos mdulos se les ha slido denominar de distintas formas (subprogramas, subrutinas, procedimientos, funciones, etc.) segn los distintos lenguajes.

Ventajas de la Utilizacin de Funciones


1. 2. 3. Modularizacin Ahorro de memoria y tiempo de desarrollo Independencia de datos y ocultamiento de informacin

Programa Principal
Funcin concreta que juega el papel principal y que empieza a actuar Esta funcin en el lenguaje C ha de llevar por titulo o nombre el de "main"

Estructura General de un Programa II

Directivas de Preprocesador

#include #define - Prototipos de funciones - Variables globales main()

Declaraciones Globales

Programa Principal

Funciones de Usuario

- Definicin de funciones

Ficheros Fuente en C Un Mdulo


Ficheros Estndar
stdio.h
...

Fichero Principal
principal.c
#include <stdio.h> main() { ... f1(...); ... } f1(...) { ... f2(...); ... } f2(...) { ... }

Ficheros Fuente en C Varios Mdulos


Ficheros Estndar
stdio.h
...

Fichero Principal
principal.c
#include <stdio.h> main() { ... f1(...); f5(...); ... } f1(...) { ... f3(...); ... } f2(...) { ... } #include aux3.c

Ficheros Secundarios
aux1.c
f3(...) { ... f4(...); ... }

aux2.c
f4(...) { ... f2(...); ... }

aux3.c
f5(...) { ... }

Realizacin de un Programa en C No Modular

principal.C

Enlazador (Linker)

Compilador

Editor

principal.EXE

.LIB

Realizacin de un Programa en C Modular


principal.C

Compilador

principal.O

Editor
auxiliar.C

Enlazador (Linker)

auxiliar.O

objeto.O

principal.EXE

libreria.LIB

.LIB

Caractersticas de Edicin de un Programa C


Caractersticas
9 9 9 9 9 Sensible a maysculas y minsculas Indentacin y espacios en blanco Sentencias (terminan en punto y coma ; ) Bloques (delimitados entre llaves {} ) Elementos de un programa Palabras reservadas Funciones de librera estndar Variables y funciones definidas por el programador

Caractersticas de Edicin de un Programa C


Nombres de Ficheros y Extensiones
El nombre de un fichero consta de dos partes: el nombre base y la extensin.

Extensiones ms Comunes
.c .h .o (.obj) .out (.exe) .lib .dll
fichero fuente C fichero de cabeceras fichero objeto resultante de la compilacin de un fichero fuente. No es ejecutable fichero ejecutable librera esttica libreras dinmicas

Depuracin de un Programa
Errores
9 9 9 9 Errores de Sintaxis Edicin Errores Lgicos Algoritmo incorrecto Errores de Regresin Solucin de errores Errores de Ejecucin Situaciones imprevistas

Mensajes de Error
9 Error Fatal Sistema Operativo 9 Error de Sintaxis Compilador/enlazador 9 Advertencias (warnings) Compilador/enlazador (no traba)

El Programa Principal
Programa Principal
Funcin concreta que juega el papel principal y que empieza a actuar Esta funcin en el lenguaje C ha de llevar por titulo o nombre el de "main"

Declaraciones de la Funcin Main


main() int main() void main() void main(void) int main(int argc, char *argv[])
argc argv representa el nmero total de argumentos es el puntero que seala una tabla en cuyos registros estn contenidos los argumentos bajo la forma de serie de caracteres

Primer Programa C
Edicin (Fichero hola.c)
#include <stdio.h> main() { printf(Hola mundo!!\n); }

Compilado Ejecucin

Finalizacin de un Programa
Modos de Finalizacin de un Programa
1. 2. 3. Ejemplo 1
#include <stdio.h> main() { printf(Esto s se ejecuta\n); }

Se llega al final del programa principal (funcin main) La funcin main realiza una llamada a la sentencia return() Cualquier funcin realiza una llamada a la funcin exit()

Ejemplo 3
#include <stdio.h> #include <stdlib.h> /* necesario para exit() */ main() { printf(Esto s se ejecuta\n); exit(0); printf(Esto no se ejecuta\n); }

Ejemplo 2
#include <stdio.h> main() { printf(Esto s se ejecuta\n); return(0); printf(Esto no se ejecuta\n); }

Elementos Base del Lenguaje C


Elementos Base
Existen seis clases de componentes sintcticos o tokens en el vocabulario del lenguaje C: 1. 2. 3. 4. 5. 6. Identificadores Palabras Reservadas Constantes Operadores Separadores Comentarios

Identificadores I
Definicin
Los identificadores son nombres que permiten sealar, mencionar, hacer referencia a los diferentes objetos tratados por el programa. En particular a: las variables las funciones las constantes simblicas

Reglas ANSI C
1. Un identificador se forma con una secuencia de letras (minsculas de la a a la z; maysculas de la A a la Z; y dgitos del 0 al 9). 2. El carcter subrayado o underscore (_) se considera como una letra ms. 3. Un identificador no puede contener espacios en blanco, ni otros caracteres distintos de los citados, como por ejemplo (* , ; . : - + etc.) 4. El primer carcter de un identificador debe ser siempre una letra o un (_), es decir, no puede ser un dgito. 5. Se hace distincin entre letras maysculas y minsculas. As, Masa es considerado como un identificador distinto de masa y de MASA. 6. ANSI C permite definir identificadores de hasta 31 caracteres de longitud.

Identificadores II

Ejemplos
Identificadores Correctos
I BUFFER Direcci6n_Memoria cas_01 Z80

Identificadores Incorrectos
8080 1er Bus de datos cas:01 CP/M

Palabras Reservadas
Definicin
Palabras clave necesarias para la sintaxis y semntica del lenguaje: especificadores de tipo de objeto especificadores de clase de memoria instrucciones de control operador simblico etiquetas de control

Lista de Palabras Reservadas


Tipo
int char short long signed unsigned float double void struct union enum

Clase
auto extern static register volatile const typedef

Instruccin
if else while do for switch break continue goto return

Operador
sizeof

Etiqueta
case default

Constantes
Definicin
Valores que permanecen fijos durante la ejecucin de un programa: nmeros enteros nmeros reales caracteres serie de caracteres expresiones con constantes constantes simblicas

Tipos de Constantes
1. 2. 3. Constantes numricas. Son valores numricos, enteros o de punto flotante. Se permiten tambin constantes octales (nmeros enteros en base 8) y hexadecimales (base 16). Constantes carcter. Cualquier carcter individual encerrado entre apstrofos (tal como 'a', 'Y', ')', '+', etc.) es considerado por C como una constante carcter. Cadenas de caracteres. Un conjunto de caracteres alfanumricos encerrados entre comillas es tambin un tipo de constante del lenguaje C, como por ejemplo: "espacio", "Esto es una cadena de caracteres", etc. Constantes simblicas. Las constantes simblicas tienen un nombre (identificador) y en esto se parecen a las variables. Sin embargo, no pueden cambiar de valor a lo largo de la ejecucin del programa. En C se pueden definir mediante el preprocesador (#define) o por medio de la palabra clave const.

4.

Expresiones Constantes
Formato Bsico de Expresiones Constantes Una expresin real puede darse en notacin decimal (2.56) como cientfica (2.56E-4) En una expresin tipo long se aade una L al final (200L) Una expresin tipo carcter se define entre comillas simples (A) Una expresin de cadena de caracteres se define entre comillas dobles (expresin)

Expresin de Nmeros Enteros en Diferentes Bases Base Decimal: Expresin en formato normal. Ejemplo: 230 Base Octal: Comienza por cero. Ejemplo: 0346 Base Hexadecimal: Comienza por cero-x. Ejemplo: 0xE6 Definicin de Constantes Mediante Directiva de Preprocesador Es posible definir constantes asociadas a un identificador por medio de la directiva #define Ejemplo: #define PI 3.141593 #define MAXIMO 255 #define MAXINT 32767 Tabla de Caracteres de Control
nueva lnea tabulaci6n retroceso retorno de carro avance de pgina antibarra ap6strofe comillas sonido de alerta carcter nulo octeto binario NL o LF TAB o HT BS CR FF \ BELL NULL ddd \n \t \b \r \f \\ \ \ \a \0 \ddd

Operadores
Definicin
Los operadores pueden estar representados por uno o por dos caracteres especiales, por una palabra reservada, o por un especificador de tipo puesto entre parntesis.

Categoras de Operadores
Operadores Mondicos o Unarios: preceden a un identificador, a una expresin o a una constante Operadores Didicos o Binarios: establecen la relacin entre dos trminos o expresiones Operadores Tridicos o Ternarios: ponen en relacin tres trminos o expresiones

Tabla de Operadores
Unarios
* & ! ~ ++ -(tipo) sizeof

Binarios
== != > >= < <= || && = += -= *= /= %= |= &= = >>= <<=

Ternarios
? :

+ * / % | & >> << .

->

Separadores
Definicin
Se puede considerar que los separadores estn formados por: delimitadores espacios en blanco

Delimitadores
Son signos especiales que permiten al compilador separar y reconocer las diferentes unidades sintcticas del lenguaje
Principales Signos Delimitadores
; , ( ) [ ] { } termina una declaracin de variable o una instrucci6n separa dos elementos consecutivos en una lista enmarca una lista de argumentos o de parmetros enmarca la dimensi6n o el subndice de una tabla enmarca un bloque de instrucciones o una lista de valores iniciales

Espacios en Blanco
Pueden estar constituidos por uno o varios caracteres "espacios" o "blancos"; de uno o varios caracteres de "TABulacin", y del carcter de avance a la lnea siguiente, denominado normalmente nueva lnea (newline). Estos caracteres sirven para delimitar las diversas unidades sintcticas.

Comentarios
Definicin
Los llamados comentarios o memorandums, propiamente no forman parte de los elementos base del lenguaje, ya que son ignorados por el compilador y slo reflejados en el listado fuente del programa.

Tipos
1. Serie de caracteres que vaya encerrada entre los dos smbolos /* y */.Restriccin: los comentarios no deben estar imbricados o anidados 2. ANSI C permite tambin otro tipo de comentarios, tomado del C++. Todo lo que va en cualquier lnea del cdigo detrs de la doble barra (//)

Ejemplo
#include <stdio.h> main() { /* Comentario en varias lneas */ return(0); // comentario de lnea }

Tipos de Datos Bsicos Definicin y Modificadores


Definicin
Tres tipos fundamentales, que se expresan con la ayuda de palabras clave reservadas en el lenguaje: 1. Nmeros enteros (int) 2. Nmeros reales (float) 3. Caracteres (char)

Modificadores
Calificacin para adaptarse mejor a los diversos tamaos de la palabra interna del microprocesador, con el fin de mejorar la precisin o de reducir el espacio ocupado en memoria : 1.short 2.long 3.unsigned 4.double para un entero corto para un entero largo para un entero sin signo para un nmero real flotante de doble precisin

Ejemplo
unsigned int signed char long int unsigned long int

Tipos de Datos Bsicos Notaciones


Tipos de datos fundamentales (notacin completa) Datos enteros
char signed short int signed char signed int unsigned char signed long int unsigned long int long double

unsigned short int unsigned int

Datos reales

float

double

Tipos de datos fundamentales (notacin abreviada) Datos enteros


char short unsigned short signed char int unsigned double unsigned char long unsigned long long double

Datos reales

float

Tipos de Datos Bsicos Tamaos y Rangos


Tipo
char int short long unsigned float double

Tamao de palabra 16 bits 32 bits


8 16 16 32 16 32 64 bits bits bits bits bits bits bits 8 32 16 32 32 32 64 bits bits bits bits bits bits bits

Operador sizeof()
El operador sizeof se utiliza para determinar el nmero de bytes de un variable o un tipo int a; sizeof(a); sizeof(unsigned int);

Tipos de Datos Bsicos Rangos

Rangos para mquina de 16 bits


Tipo
char unsigned char int short long unsigned float double long double

Rango
-128..127 0.255 -32768..32767 -32768..32767 -232..232-1 0..65535 3.4E-38..3.4E+38 1.7E-308..1.7E+308 3.4E-4932.. 1.1E+4932

Tipos de Datos Bsicos Declaracin de variables


Declaracin
<Clase de memoria> [tipo de dato] [[Identificador]<=Valor Inicial>, ...];

Declaracin Simple
char ccar; unsigned int inum; float freal;

Declaracin Mltiple
char ccar, cdat; unsigned int inum, icoorx; float freal, fnum;

Declaracin y Asignacin
char ccar = A; unsigned int inum = 12432, icoorx = 5; float freal = 0.14, fnum = -4.2812e-4;

Punteros
Definicin
Las variable de tipo puntero representan direcciones donde almacenar valores. Es importante diferenciar entre puntero (espacio de memoria donde se almacena la direccin) y la propia direccin del puntero. Se declaran con un asterisco delante del identificador de variable

Operadores de Punteros
Si px es un puntero (direccin): *px es el contenido del puntero (el valor almacenado en la direccin) Si x es la variable: &x es la direccin de memoria donde est almacenada la variable

Ejemplo
int *px, x; /* px es un puntero a entero y x es un entero */

El Tipo void
La declaracin de punteros genricos a direcciones se asocian al tipo void Declarar un variable que no sea puntero de tipo void no tiene sentido

Direccin Contenido

main() { int *px, x = 3; px = &x; // px apunta a x

px35; ? ? ? ? x39; 0 0 0 3 px35; 0 0 0 39 x39; 0 0 0 3 px35; 0 0 0 39 x39; 0 0 0 5

Grfica px x ? 3 px 39 px 39 x 3 x 5

Ejemplo
void *pv, v; /* La variable v est mal declarada */

*px = 5; // x vale 5 }

mbito de las Variables


La declaracin de las variables lleva asociado un mbito, dentro del cual la variable es visible: mbito Global: La variable es visible en todas las funciones del programa mbito Local: La variable es visible dentro del bloque o funcin en el que encuentra definida. (Tiene prioridad sobre el mbito global)

Ejemplo
int x, y; // variables glogales main() { float x, z; // variables locales /* Aqu x, z son reales e y un entero */ } /* Aqu x e y son variables enteras */ /* La variable z no existe fuera de la funcin donde est definida */

Conversiones de Tipo Casting


Definicin
A menudo es necesario convertir valores de variables o expresiones de un tipo a otro diferente. Hay dos tipos de conversiones: Conversiones Implcitas (Promocin): Las realiza automticamente el programa. Variables o expresiones de menor rango promocionan a rangos superiores. Conversiones Explcitas (Casting): Conversin forzada por el programador. Se utiliza el tipo a convertir entre parntesis.

Rangos de Conversiones Implcitas


long double > double > float > unsigned long > long > unsigned int > int > char

Ejemplo de Casting
int inum; float rnum; char ccar; rnum = 65.0 inum = (int)rnum; //inum vale 65 ccar = (char)inum; //ccar vale 65 (cdigo ASCII de A)

Cdigo ASCII
ASCII
American Standard Code Information Interchange

Cdigo ASCII Caracteres imprimibles y no imprimibles

Cdigo ASCII Caracteres extendidos

Operadores
Definicin
Los operadores pueden estar representados por uno o por dos caracteres especiales, por una palabra reservada, o por un especificador de tipo puesto entre parntesis.

Tipos de Operadores
Operadores aritmticos Operadores de manipulacin de bits Operadores de asignacin Operadores de incremento y decremento Operadores de relacin Operadores de direccin

Categoras de Operadores
Operadores Mondicos o Unarios: preceden a un identificador, a una expresin o a una constante Operadores Didicos o Binarios: establecen la relacin entre dos trminos o expresiones Operadores Tridicos o Ternarios: ponen en relacin tres trminos o expresiones

Tabla de Operadores
Unarios
* & ! ~ ++ -(tipo) sizeof + * / % | & >> << .

Binarios
== != > >= < <= || && = += -= *= /= %= |= &= = >>= <<=

Ternarios
? :

->

Operadores Aritmticos
Operadores Aritmticos
+ * / % la adicin la sustraccin y el menos mondico la multiplicacin la divisin el residuo o resto de la divisin

Nota
El operador de asignacin bsico es el igual (=)

Divisin Entera vs Real


Depende de los operandos: 4/3 4.0 / 3 4/ 3.0 4.0 / 3.0 1 1.3333 1.3333 1.3333 Entero Real Real Real

Ejemplo
#include <stdio.h> main() /* comprobaciones de prioridad */ { int c = 2, d = 3, y = 4; printf(c * d %%y = %d\n, c * d % y); printf((c * d) %%y = %d\n, (c * d) % y); printf(c * (d %%y) = %d\n, c * (d % y)); }

Solucin
c * d % y = 2 (c * d) % y = 2 c * (d % y) = 6

Operadores de Manipulacin de Bits


Operadores de Manipulacin de Bits
& | ^ << >> Y lgico inclusivo (AND) O lgico inclusivo (OR) O lgico exclusivo (XOR) negacin, complementos a uno desplazamiento hacia la izquierda desplazamiento hacia la derecha

Ejemplo
#include <stdio.h> main() { long n = 0x12345678; // entero sobre 32 bits printf(%lx & 0X0F0F0F0F = %lx, n, n & 0x0f0f0f0f); }

Solucin
12345678 & 0X0F0F0F0F = 02040608

Operadores de Asignacin
Operadores de Asignacin
= += = *= /= %= |= &= ^= >>= <<= Asignacin Suma y asignacin Resta y asignacin Producto y asignacin Divisin y asignacin Resto y asignacin OR y asignacin AND y asignacin XOR y y asignacin Desplazamiento a izquierdas y asignacin Desplazamiento a derechas y asignacin

Utilizacin de Operadores Combinados Operador


+= *= -= /= %=

Asignacin Mltiple i = j = k = 0; /* primero k = 0 y luego j = 0 y luego i = 0 */ Asignacin Anidada


car = 0x5f & (c = getchar()); // mayscula

Explicacin
a = a + b a = a * b a = a - b a = a / b a = a % b

Uso
a += b a *= b a -= b a /= b a %= b

Operadores de Incremento y Decremento


Operadores de Incremento y Decremento
++ -Incremento de una unidad Decremento de una unidad

Utilizacin de Operadores Combinados Funcin


x = x + 1 x = x - 1

Abreviatura
x += 1 x -= 1

Operador izda
++x --x

Operador dcha
x++ x--

Ejemplos
a a a a = = = = 3; 3; 3; 3; b b b b = = = = a++; ++a; a--; --a; // // // // a a a a = = = = 4, 4, 2, 2, b b b b = = = = 3 4 3 2

Operadores de Relacin
Operadores de Comparacin
> >= < <= == != Mayor que Mayor o igual a Menor que Menor o igual a Igual a, igualdad Distinto de, desigualdad  && ||

Operadores Lgicos
Negacin mondica (NOT) Interseccin lgica (AND) unin lgica (OR)

Valores Booleanos
Verdadero Falso 1 0

Ejemplos
a = 3 > 7; // a vale 0 (falso) a = (3 > 2 || 5 == 4) && !1 // a vale 0 (falso) (index < MAX - 1 && (c = getchar()) != '\n') && c != EOF)

Prioridad de Operadores
Clasificacin de los Operadores segn sus Prioridades
( ) ! ++ -* + << < <= == & | && || ? : = += -= *= /= %= , >>= <<= &= |= = [ ] * / >> > != >= -> & % . (type) sizeof

Funciones de E/S Bsicas


Definicin
Las funciones de E/S en C no pertenecen a las palabras reservadas del lenguaje. Son funciones de la librera estndar cuyo formato se encuentra en el fichero de cabecera stdio.h. Las funciones de E/S bsicas recogen/insertan variables o constantes en los ficheros de E/S (stdin/stdout teclado/monitor)

Tipos
Las principales funciones de E/S se dividen por su propsito: Funciones de E/S de caracteres: recoger/insertar un carcter del fichero de E/S 9 getchar()/putchar() Funciones de E/S de cadenas de caracteres: recoger/insertar una cadena de caracteres del fichero de E/S 9 gets()/puts() Funciones de E/S con formato: leer/escribir con formato del fichero de E/S 9 scanf()/printf()

Funciones de E/S Bsicas E/S de Caracteres


getchar()
Leer un carcter desde techado: caracter = getchar();

putchar()
Presenta un carcter en pantalla: putchar(caracter);

Ejemplo de getchar/putchar
#include <stdio.h> // necesario para utilizar funciones de E/S main() { char ccar; ccar = getchar(); putchar(ccar); putchar(A); putchar(getchar()); }

// variable caracter // // // // recoge carcter de teclado escribe carcter en monitor escribe una A en monitor escribe lo ledo

Funciones de E/S Bsicas E/S de Cadenas de Caracteres


gets()
Leer una cadena de caracteres desde techado: gets(cadena);

puts()
Presenta una cadena de caracteres en pantalla: puts(cadena);

Ejemplo de gets/puts
#include <stdio.h> // necesario para utilizar funciones de E/S main() { char cadena[100]; gets(cadena); puts(cadena); puts(Hola socio); puts(gets(cadena)); }

// variable cadena de caracteres // // // // recoge la cadena de teclado escribe la cadena en monitor escribe la cadena constante en monitor escribe lo ledo

Funciones de E/S Bsicas printf()


printf()
Escribir en pantalla con formato: printf (formato, arg1, arg2, ..., argn); formato: cadena de formato de salida de datos. argi : argumentos a incluir dentro del formato (pueden ser variables o expresiones).
Formato
%d, %i %u %o %x, %X %f %e, %E %g, %G %c %s %p %ld, %lu,

Expresin Resultado
entero entero entero entero real real real carcter string puntero entero largo Entero decimal con signo Entero decimal sin signo Entero octal sin signo Entero hexadecimal sin signo Real en notacin punto Real en notacin cientfica Real en notacin ms corta Carcter Cadena de caracteres Direccin de memoria Entero largo (distitos formatos)

Ejemplo
#include <stdio.h> #define PI 3.141593 main() { int inum = 3; char ccar = A; printf(Hola mundo !!\n); printf(El nmero %8d\n, inum); printf(Un nmero %d y un carcter %c\n, inum + 2, ccar); printf(El valor de PI es %6.4f\n, PI); }

Otras Opciones de Formato


Signo : ajuste a la izquierda. nmero: longitud mnima en caracteres punto decimal: precisin de la parte fraccionaria

Funciones de E/S Bsicas scanf()


scanf()
Leer de teclado con formato: scanf (formato, dir1, dir2, ..., dirn); formato: cadena de formato de entrada de datos. diri : argumentos a incluir dentro del formato (direcciones de variables donde se almacenaran valores ledos).

Nota

Es importante destacar que los argumentos son direcciones. Cuando se utilizan variables base es necesario utilizar el operador de indireccin &.

Ejemplo
#include <stdio.h> main() { int inum, *pinum; float rnum; char ccar; scanf(%d, &inum); // lee un entero y lo almacena en inum scanf(%f %c, &rnum, &ccar); // lee un rnum y ccar scanf(%d, pinum); // PELIGROSO pinum = &inum; scanf(%d, pinum); // CORRECTO, lee inum }

Funciones de E/S Bsicas scanf() Lectura de strings


Ejemplo
#include <stdio.h> main() { char *pstr, str[100], cad[20]; scanf(%s, pstr); // PELIGROSO scanf(%s, str); // CORRECTO, lee str hasta blanco o fin de lnea pstr = str; scanf(%s, pstr); // CORRECTO, lee str hasta blanco o fin de lnea scanf(%[^\n], str); // Lee toda la lnea sobre str scanf(%s %*s %s, cad, str); /* Lee cad hasta blanco, deja una palabra y la siguiente palabra sobre str hasta blanco o fin de lnea */ }

Funciones de E/S Bsicas printf()/scanf() Ejemplo


Ejemplo
#include <stdio.h> #define DIAS_ANIO 365 main() { char nombre[100]; int dias, anios; printf(Cual es tu nombre? ); scanf(%s, nombre); printf(Y tu edad? ); scanf(%d, &anios); dias = anios * DIAS_ANIO; printf(%s tienes aproximadamente %d das, nombre, dias); }

Solucin
Cual es tu nombre? Jose Y tu edad? 20 Jose tienes aproximadamente 7300 das

Sentencias de Control
Definicin
Las sentencias de control van a determinar la cadena de ejecucin de las instrucciones.

Tipos de Sentencias de Control


Sentencias Condicionales o Selectivas: permiten la bifurcacin de la cadena de ejecucin 9 Sentencia if 9 Sentencia if ... else 9 Sentencia switch Sentencias Repetitivas o Iterativas: permiten la repeticin de un conjunto de instrucciones 9 Sentencia while 9 Sentencia do ... while 9 Sentencia for

Sentencia if
Diagrama de Flujo

condicin? verdadero expresin(es)

falso

Ejemplo
#include <stdio.h>

Ejecucin
if(condicin) { expresin(es) }

#define MAXIMO 100 main() { int inum; printf(Dame un nmero -> ); scanf(%d, &inum); if(inum > MAXIMO) { printf(El nmero introducido es mayor que el mximo\n); } }

Sentencia if...else
Diagrama de Flujo

verdadero

condicin?

falso

expresin(es) if

expresin(es) else

Ejemplo
#include <stdio.h>

Ejecucin
if(condicin) { expresin(es) if } else { expresin(es) else }

#define MAX_EDAD_JOVEN 25 main() { int edad; printf(Dime tu edad -> "); scanf(%d, &edad); if(edad <= MAX_EDAD_JOVEN) { printf(Con %d aos eres un chaval\n, edad); } else { printf(Con %d aos no ests para muchos trotes\n, edad); } }

Sentencia if...else Anidadas


Ejemplo de Ejecucin
if(condicin1) { if(condicin2) { expresin(es) if condicin 2 if(condicin3) { expresin(es) if condicin 3 } } else { expresin(es) else condicin 2 } } else { if(condicin4) { expresin(es) if condicin 4 } else { expresin(es) else condicin 4 } }

Sentencia switch
Ejecucin
switch(variable_opcin) { case opcion_1: expresin(es) opcion_1; break; case opcion_2: expresin(es) opcion_1; break; ... case opcion_N: expresin(es) opcion_N; break; default: expresin(es) default; }

Ejemplo
#include <stdio.h> main() { char letra; printf(Dame una inicial y te dar un animal -> ); scanf(%c, &letra); switch(letra) { case a: printf(antlope\n); break; case b: printf(buitre\n); break; case c: printf(cocodrilo\n); break; default: printf(No se me ocurre\n); } }

El Operador Condicional
Operador Condicional
": Condicionalidad

Equivalencia a Sentencia Condicional if..else si (expresin1) entonces expresin2 en_caso_contrario expresin3 expresin1 ? expresin2 : expresin3

Ejemplo
#include <stdio.h> main() { float num, abs; printf(Dame un nmero -> ); scanf(%f, &num); abs = num > 0 ? num : -num; printf(El valor absoluto de %6.4f es %6.4f\n, num, abs); } if(num > 0) { abs = num; } else { abs = -num; }

nte ale v i u eq

Sentencia while
Diagrama de Flujo Ejecucin
while(condicin) { expresin(es) }

condicin? verdadero expresin(es)

falso

Ejemplo
#include <stdio.h> #define TOPEMINIMO 250 main() { int total = 0, nuevas; while(total < TOPEMINIMO) { printf(Tienes %d piezas acumuladas\n, total); printf(Cuantas piezas nuevas tienes -> ); scanf(%d, &nuevas); total += nuevas; } printf(Has acumulado %d piezas.\n, total); }

Sentencia do...while
Diagrama de Flujo Ejecucin
do { expresin(es) } while(condicin); falso

expresin(es)

condicin? verdadero

Ejemplo
#include <stdio.h> #define ESCAPE \x1b //escape = ASCII(27), octal(33) //hexadecimal(1b) main() { char caracter; do { printf(Dame un caracter -> ); caracter = getchar(); } while(caracter != ESCAPE); }

Sentencia for
Diagrama de Flujo
expresin inicial

Ejecucin
for(expresin inicial; condicin; expresin bucle) { expresin(es) }

condicin? expresin bucle verdadero expresin(es)

falso

Ejemplo
#include <stdio.h> main() { int i; for(i = 0; i < 10; i++) { printf(Nmero -> %5d Cuadrado -> %5d\n, i, i * i); } }

Sentencias break, continue


break: permiten la salida del bucle sin tener en cuenta la expresin que lo controla continue: permiten la vuelta a la cabecera del bucle sin ejecutar las sentencias restantes

Ejemplo break
#include <stdio.h> main() { char car; while((car = getchar()) != X) { if(car == \x1b) { break; } printf(Has introducido %c\n, car); } } #include <stdio.h> main() { char car; while((car = getchar()) != X && ccar != \x1b) { printf(Has introducido %c\n, car); } }

Ejemplo continue
#include <stdio.h> main() { char car; while((car = getchar()) != X) { if(car == \x1b) { continue; } printf(Has introducido %c\n, car); } }
#include <stdio.h> main() { char car; while((car = getchar()) != X) { if(car != \x1b) { printf(Has introducido %c\n, car); } } }

Solucin estructurada

Solucin estructurada

Sentencias break, continue Ejemplo


Ejemplo break/continue
#include <stdio.h> main() { int i; for(i = 0; i < 100; i++) { if(i % 2 == 0) { continue; // comienza la iteracin } if(i % 17 == 0) { break; // sale del bucle } printf(Nuestro nmero es %d\n, i); } }

Solucin estructurada
#include <stdio.h> main() { int i; for(i = 0; (i < 100) && (i % 17 != 0); i++) { if(i % 2 != 0) { printf(Nuestro nmero es %d\n, i); } } }

Sentencias Repetitivas Anidadas


Ejemplo de Ejecucin
for(expresin inicial; condicin1; expresin bucle) { while(condicin2) { expresin(es) while condicin 2 for(expresin inicial; condicin3; expresin bucle) { expresin(es) for condicin 3 do { expresin(es) do..while condicin 4 } while(condicin4) } } expresin(es) for condicin 1 }

Sentencias Repetitivas Anidadas Ejemplo


Ejemplo
#include <stdio.h> main() { int base, linea, columna; printf(Nmero de asteriscos en base -> ); scanf(%d, &base); linea = 0; while(linea < base) { for(columna = 0; columna < linea; columna++) { printf(*); } printf(\n); linea++; } }

Enunciado
Generar un tringulo de asteriscos, indicando el nmero de asteriscos en la base:
* ** *** **** *****

Ejemplo
#include <stdio.h> main() { int base, linea, columna; printf(Nmero de asteriscos en base -> ); scanf(%d, &base); for(linea = 0; linea < base; linea++) { for(columna = 0; columna < linea; columna++) { printf(*); } printf(\n); } }

Nota
Los dos ejemplos expuestos son equivalentes

Funciones
Subrutinas
9 Procedimientos: son mdulos de programa que no ofrecen ningn tipo de valor asociado al nombre de la subrutina 9 Funciones: son mdulos de programa que ofrecen un valor asociado al nombre de la subrutina

Funcin
Parte de cdigo independiente, que puede ser llamada envindole unos datos (o sin enviarle nada), para que realice una determinada tarea y/o proporcione unos resultados

Definicin, Declaracin y Llamada de una Funcin


9 Definicin: cuerpo de la funcin en donde reside el cdigo de la misma. 9 Declaracin: presentacin de la funcin donde se expresa su nombre, parmetros y tipo de valor devuelto. 9 Llamada: utilizacin de la funcin desde un punto de programa referenciada por su nombre, indicando el valor de los parmetros de trabajo y utilizacin del valor devuelto.

Parmetros Formales vs. Parmetros Actuales


9 Parmetros Formales: lista de declaraciones de variables, precedidas por su tipo correspondiente y separadas por comas (,) declarados en el encabezamiento de la funcin. 9 Parmetros Actuales: lista de constantes, variables y expresiones de un tipo determinado, que aparecen en la llamada a una funcin.

Funciones Uso de una Funcin


Una funcin se invoca provocando valores a los argumentos de la llamada.
9 Los argumentos se pasan siempre por valor 9 El valor se devuelve por medio de la sentencia return() 9 Los procedimientos son funciones de tipo void 9 El control del nmero y tipo de argumentos es mnimo 9 Las funciones en C permiten recursividad y reentrabilidad

Ejemplo
#include <stdio.h> int factorial(int numero); main() { int factor;

declaracin
int factorial(int numero) { int i, out; for(i = 1, out = 1; i <= numero; i++) out *= i; return out; }

printf("Introduzca un nmero -> "); scanf("%d", &factor); printf("El factorial de %d es %d\n", factor, factorial(factor)); }

definicin llamada

Funciones Definicin de una Funcin


Definicin de una Funcin
Consiste en la definicin del cdigo necesario para que sta realice las tareas para las que ha sido prevista. La definicin de una funcin se debe realizar en alguno de los ficheros que forman parte del programa. La primera lnea recibe el nombre de encabezamiento (header) y el resto de la definicin encerrado entre llaves es el cuerpo (body) de la funcin.

Formato General
[clase] [tipo] nombre_funcion([lista de argumentos con tipos]) { [declaracin de variables y/o de otras funciones] codigo ejecutable // sentencias return (expresin); // optativo } 9 clase: define el mbito de la funcin, esto es, desde dnde puede ser llamada. La clase puede ser extern o static. 9 tipo: indica el tipo de valor devuelto por la funcin. 9 nombre: es el identificador que indica el nombre de la funcin. 9 lista de argumentos: secuencia de declaracin de parmetros separados por comas y encerrados entre parntesis. Son los llamados parmetros formales.

Funciones Declaracin de una Funcin


Declaracin de una Funcin
Toda funcin debe ser declarada antes de ser utilizada en la funcin o programa que realiza la llamada.

Formas de Declarar una Funcin


9 Mediante una llamada a la funcin: Se supone int como tipo del valor de retorno, y el tipo de los argumentos actuales como tipo de los argumentos formales 9 Mediante una definicin previa de la funcin 9 Mediante una declaracin explcita, previa a la llamada

Formato General
[clase] [tipo] nombre_funcion([lista de tipos de argumentos]);

Ejemplo
int factorial(int numero); int factorial(int); int factorial();

Funciones Llamada de una Funcin


Llamada de una Funcin
La llamada a una funcin se hace incluyendo su nombre en una expresin o sentencia del programa principal o de otra funcin. Este nombre puede ir seguido de una lista de argumentos separados por comas y encerrados entre parntesis, los parmetros actuales. Cuando se llama a una funcin se ejecuta el cdigo correspondiente a la funcin hasta que se llega a una sentencia return o al final del cuerpo de la funcin, y entonces se devuelve el control al programa que realiz la llamada, junto con el valor de retorno si es que existe.

Formato General
variable = expresin([parmetros actuales]); 9 variable: especifica la variable en donde va a ser almacenado el valor devuelto por la funcin. La llamada puede prescindir del valor devuelto por la funcin. 9 expresin: especifica la direccin que referencia a la funcin. En general se corresponde con el nombre de la funcin. 9 parmetros actuales: lista de expresiones separadas por comas. Las expresiones son evaluadas, pasadas a la funcin y asignadas a los parmetros formales. El nmero de parmetros actuales coincide con el parmetros formales, a no ser que especifique un nmero variable de parmetros.

Funciones Ejemplos
Ejemplo Clculo de una expresin absoluta
#include <stdio.h> double valor_abs(double); /* declaracin */ void main (void) { double z, y; y = -30.8; z = valor_abs(y) + y * y; /* llamada en una expresin */ printf("El valor calculado es %g\n", z); } double valor_abs(double x) { if (x < 0.0) return -x; else return x; }

Ejemplo Clculo de un logaritmo


#include <stdio.h> #include <math.h> double logaritmo(float numero, int base); void main (void) { float numero; int base; printf("Introduce un nmero -> "); scanf("%f", &numero); printf("Introduce la base -> "); scanf("%d", &base); printf("El logaritmo de %lg es %lg\n", numero, logaritmo(numero, base)); } double logaritmo(float numero, int base) { return log(numero)/log(base); }

Funciones Paso por Referencia


Paso por Referencia
El lenguaje C no tiene en si en paso por referencia. En su lugar se pasa por valor la direccin de la variable a modificar. Pero por correspondencia con los diferentes textos, llamaremos a este paso por direccin paso por referencia.

Ejemplo Permutar dos Nmeros


#include <stdio.h>

Ejemplo Permutar dos Nmeros


#include <stdio.h>

Incorrecto

Correcto

void permutar(double, double); main() { double a=1.0, b=2.0; printf("a = %lf, b = %lf\n", a, b); permutar(a, b); printf("a = %lf, b = %lf\n", a, b); } void permutar(double x, double y) { double temp; a = 1.000000, b = 2.000000 a = 1.000000, b = 2.000000 temp = x; Soluciones x = y; a = 1.000000, b = 2.000000 y = temp; a = 2.000000, b = 1.000000 }

void permutar(double *, double *); main() { double a=1.0, b=2.0; printf("a = %lf, b = %lf\n", a, b); permutar(&a, &b); printf("a = %lf, b = %lf\n", a, b); } void permutar(double *x, double *y) { double temp; temp = *x; *x = *y; *y = temp; }

Funciones La Funcin main con Argumentos


Argumentos de la Funcin main
9 argc: es una variable int que contiene el nmero de palabras que se teclean a continuacin del nombre del programa cuando ste se ejecuta. 9 argv: es un vector de punteros a carcter que contiene las direcciones de la primera letra o carcter de dichas palabras.

Prototipo de la Funcin main


int main(int argc, char *argv[]);

Ejemplo Mostrar Argumentos de Entrada


#include <stdio.h> int main(int argc, char *argv[]) { int cont; for (cont=0; cont<argc; cont++) printf("El argumento %d es: %s\n", cont, argv[cont]); printf("\n"); return 0; }

Funciones Funciones de Librera Estndar I


Funciones de Conversin de Datos
double atof (char *cadena); Convierte una cadena a valor real doble int atoi (char *cadena); Convierte una cadena a entero long atol (char *cadena); Convierte una cadena a entero largo char *fcvt (double valor, int decs, int *pdec, int *signo); Convierte un nmero real en una cadena de caracteres.

<stdlib.h>

Funciones de Conversin de Caracteres


int toascii (int numero); Convierte un nmero a un valor ASCII. int tolower (int caracter); Convierte un carcter a minscula, si procede. int toupper (int caracter); Convierte un carcter a mayscula, si procede.

<ctype.h>

Funciones Funciones de Librera Estndar II


Funciones Matemticas
double ceil (double valor); Redondea un nmero real al menor entero que es mayor que el valor parmetro double floor (double valor); Redondea un nmero real al mayor entero que es menor que el valor parmetro int abs (int valor); Calcula el valor absoluto del valor parmetro entero double fabs (double valor); Calcula el valor absoluto del valor parmetro real double fmod (double dividendo, double divisor); Calcula el resto de la divisin dividendo/divisor double sqrt (double valor); Devuelve la raz cuadrada del parmetro valor double pow (double base, double exponente); Calcula la potencia base elevado a exponente

<math.h>

Funciones Funciones de Librera Estndar III


Funciones Matemticas Exponenciales
double exp (double valor); Devuelve el valor exponencial para el parmetro valor double log (double valor); Devuelve el logaritmo neperiano del parmetro valor double log10 (double valor); Devuelve el logaritmo base 10 del parmetro valor

<math.h>

Funciones Matemticas Trigonomtricas


double sin (double valor); Devuelve el seno para el parmetro valor double cos (double valor); Devuelve el coseno del parmetro valor double tan (double valor); Devuelve la tangente del parmetro valor

<math.h>

double asin (double valor); Devuelve el arco seno para el parmetro valor double cos (double valor); Devuelve el arco coseno del parmetro valor double tan (double valor); Devuelve el arco tangente del parmetro valor

Funciones Funciones de Librera Estndar IV


Funciones Aleatorias
int rand (void); Devuelve un nmero entero pseudoaleatorio void srand (unsigned int semilla); Establece el comienzo de generacin de nmeros pseudoaleatorios

<stdlib.h>

Ejemplo

#include <stdio.h> #include <stdlib.h> #include <time.h> void main() { int i; srand((unsigned int) time(NULL)); for(i = 0; i < 5; i++) { printf("Aleatorio[%d] = %d\n", i, rand()); } }

mbito y Duracin de Variables

mbito de las Variables


La declaracin de las variables lleva asociado un mbito, dentro del cual la variable es visible: mbito Global: Las variables son visibles en todas las funciones del programa. Se declaran al principio de mdulo. mbito Local: Las variables son visibles dentro del bloque o funcin en el que encuentra definida. (Tiene prioridad sobre el mbito global)

Duracin de las Variables


Permanente: Se crean al comienzo de programa y permanecen hasta el final. Voltil: Su duraciones estn unidas con las de las ejecuciones de los bloques en las que estn definidas.

Almacenamiento de Variables
Mtodos de Almacenamiento
Auto: Mtodo de almacenamiento por defecto, se crean sobre la pila de programa. Se crean al comenzar a ejecutarse el bloque y dejan de existir cuando el bloque se termina de ejecutar. Son variables locales. No son inicializadas por defecto. Extern: Se definen fuera de cualquier bloque o funcin. Son variables globales. Por defecto, son inicializadas a cero. Para utilizarlas en otros mdulos deben ser declaradas como extern. Static: Conservan su valor entre distintas ejecuciones del bloque en que estn definidas. Por defecto, son inicializadas a cero. Las variables definidas como static extern son visibles slo para las funciones y bloques comprendidos desde su definicin hasta el fin del fichero. Una funcin puede tambin ser definida como static, y entonces slo es visible para las funciones que estn definidas despus de dicha funcin y en el mismo fichero. Register: Es un modo de recomendacin para el compilador, para que si es posible ciertas variables sean almacenadas en los registros de la CPU y los clculos con ellas sean ms rpidos.

Modo de Almacenamiento Automtico Registro Esttico Externo

Palabra Reservada auto register static extern

Duracin voltil voltil permanente permanente

mbito local local local global

Almacenamiento de Variables Ejemplo


Ejemplo
#include <stdio.h> int var_global = 1; void test_static(); main() { int var_local;

Solucin
Main: Funcin: Main: Funcin: Main: Funcin: global global global global global global = = = = = = 1, 2, 3, 4, 5, 6, local local local local local local = = = = = = 1 1, esttica = 1 2 1, esttica = 2 3 1, esttica = 3

for(var_local = 1; var_local <= 3; var_local++) { printf(Main: global = %d, local = %d\n, var_global++, var_local); test_static(); } } void test_static(void) { int var_local = 1; static int var_static = 1; printf(Funcin: global = %d, local = %d, esttica = %d\n, var_global++, var_local++, var_static++); }

Arrays Definicin e Inicializacin


Definicin
Para definir los arrays es necesario indicar el tipo de datos se quiere almacenar en el array, el nombre del array y la cantidad de elementos
int numeros [30]; char alfabeto [26]; long largos [500]; float temp_semana [7]; /* un array para /* un array para /* un array para tipo long */ /* un array para guardar 30 nmeros enteros */ guardar 26 caracteres */ guardar 500 nmeros enteros guardar 7 nmeros reales */

Inicializacin
Los arrays se pueden inicializar directamente en la definicin.
int numeros[3] = {2, 7, 11}; float temp[7] = {12.3, 13.4, 11.7, 10.2, 9.1, 10.8, 11.0}; char cadena[10] = {A, n, o, n, i, m, o, \0};

Arrays Indexacin
Indexacin
Para identificar cada elemento de un array se utiliza un nmero denominado ndice. El ndice obligatoriamente debe ser un nmero entero. El valor del ndice correspondiente al primer elemento es 0.
int a[6]; a[0] = 23; a[2] = a[0] + 5; for(i=0; i < 6; i++) { printf(%d, a[i]); }

23

28

a[0] a[1] a[2] a[3] a[4] a[5]

Ejemplo
#include <stdio.h> #define MESES 12

Solucin
el mes el mes el mes 1 tiene 31 das. 2 tiene 28 das. 3 tiene 31 das. ... el mes 11 tiene 30 das. el mes 12 tiene 31 das.

void main (void) { int cont = 0; static int meses[MESES] = {3l,28,3l,30,31,30,3l,31,30,3l,30,31}; for (cont = 0; cont < MESES; cont++) { printf ( "el mes %2d tiene %2d das\n", cont + l, meses[cont]); } }

Arrays Arrays Multidimensionales


Definicin
Es posible declarar arrays de varias dimensiones. Por cada dimensin habr un ndice. Mientras que los arrays de una dimensin pueden asemejarse a vectores, los arrays de dos dimensiones se pueden asemejar a matrices.
foat matriz[10]10]; static float lluvia[4][12] = { {10.2,4.1,12.2,2.4,7.7,6.8,7.0,8.7,11.5,8.3,4.7,9.2}, {11.2,10.1,11.2,6.4,7.9,9.3,9.0,8.7,11.5,8.3,4.7,9.2}, {13.2,8.6,12.3,3.4,7.8,9.8,8.0,8.7,11.5,8.3,4.7,9.2}, {1.2,8.9,42.2,9.4,7.8,4.8,10.0,8.7,11.5,8.3,4.7,9.2}, }; static int tres_dimen[3][2][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8} }, { {7, 9, 3, 2}, {4, 6, 8, 3} }, { {7, 5, 6, 8}, {0, 1, 9, 4} } };

Arrays Arrays y Punteros


Definicin
Un puntero puede referenciar un array o elemento de un array. El nombre de un array es la direccin del mismo array.
int meses[12] ; meses == &meses[0];

Ejemplo
#include <stdio.h> void main (void) { static int fechas [4] = {10, 20, 30, 40}; int i; for (i = 0; i < 4; i++) { printf ("fechas [%d] = %d, direccin: %lu\n", i, fechas[i], &fechas[i]); } }

Ejemplo
#include <stdio.h> void main (void) { static int fechas [4] = {10, 20, 30, 40}; int *entero_ptr; int i; entero_ptr = fechas;

for (i = 0; i < 4; i++) { printf ("fechas [%d] = %d, direccin: %lu\n", i, *(entero_ptr + i), (entero_ptr + i)); } }

Solucin
fechas fechas fechas fechas [0] [1] [2] [3] = = = = 10, 20, 30, 40, direccin: direccin: direccin: direccin: 70478 70480 70482 70484

Arrays Arrays y Funciones


Ejemplo
#include <stdio.h> #define CANTIDAD 20 void inicializa (int lista [], int *cuanto); int el_mayor (int lista [], int cuanto); void main (void) { int lista[CANTIDAD]; int longitud, num; } inicializa(lista, &longitud); num = el_mayor(lista, longitud); printf("El mayor nmero introducido es: %d\n", num); } int el_mayor(int lista[], int cuanto) { int mayor, i; mayor = lista[0]; for (i = l; i < cuanto; i++) { if (mayor < lista[i]) { mayor = lista[i]; } } return (mayor); } void inicializa(int lista [], int *cuanto) { int i; for (i = 0; i < CANTIDAD; i++) { printf("Introduzca el nmero[%d]: ", i); scanf("%d", &lista[i]); } *cuanto = CANTIDAD;

Strings Cadenas de Caracteres


Definicin
Las cadenas de caracteres son un tipo de arrays especiales cuya funcin principal es la manipulacin de caracteres. Una cadena de caracteres o un string, es un array formado por caracteres que tiene al final un carcter especial: '\0'. Los strings son arrays que almacena datos tipo char y como tales se declaran: char cadenadecaracteres [20] = "Esto es una cadena de caracteres"; Pueden inicializarse mediante una constante tipo string. No es necesario saber la longitud, para detectar l final basta con buscar el carcter '\0'. Se encuentran formatos especiales para las cadenas (printf, scanf). Se dispone en la librera estndar de un grupo de funciones especficas para procesar cadenas de caracteres.

Inicializacin
La inicializacin de una cadena de caracteres puede hacerse de la siguiente manera:
char char char char animales[] = {'g', 'a', 't', 'o', '\0'}; animales[] = "gato"; animales[10] = "gato"; *animales = "gato";

animales = "gato"; // error de compilacin

Strings Funciones de Librera Estndar


Funciones de Lectura y Escritura <stdio.h>
char *gets (char *cadena); Lee una lnea desde la entrada estndar (stdin) y la almacena en la variable especificada int puts (char *cadena); Escribe una cadena en la salida estndar (stdout)

Funciones de Manipulacin
int strlen (char *cadena); Devuelve la longitud en bytes de la cadena parmetro.

<string.h>

int strcmp (char *cadena1, char *cadena2); Compara cadena1 y cadena2, y devuelve 0 si son iguales <0 si cadena1<cadena2 y >0 al contrario char *strcpy (char *destino, char *origen); Copia la cadena origen en la posicin de la cadena destino. char *strcat (char *destino, char *origen); Aade la cadena origen en tras la cadena destino. char *strchr (char *cadena, char caracter); Devuelve un puntero a la primera ocurrencia del carcter en la cadena. NULL si no se encuentra. char *strstr (char *cadena1, char *cadena2); Devuelve un puntero a la primera ocurrencia de cadena2 en la cadena1. NULL si no se encuentra.

Estructuras Definicin, Declaracin e Inicializacin


Definicin
Es un tipo de datos complejo conformado por un conjunto de campos de otros tipos (bsicos o complejos) asociados a un identificador.
struct [etiqueta] { tipo campo1; tipo campo2; ... } [variable];

Declaracin del Tipo


Cuando realizamos la declaracin de tipo de la estructura tambin es posible definir variables que van a almacenar ese nuevo tipo de dato .
struct tsagente { char nombre[100]; int numero; } agente, agentes[10];

Declaracin e Inicializacin de Variables


Las variables de tipo estructuras se pueden inicializar en su declaracin.
struct tsagente agente1 = {"Mortadelo", 001}; struct tsagente agente2 = {"Filemn", 002};

Estructuras Acceso, Asignacin y Parmetro de Funciones


Acceso a los Campos
Variable normal: se utiliza el operador punto (). Variable puntero: se utiliza el operador flecha (->).
struct tsagente { char nombre[100]; int numero; } agente, *pagente; strcpy(agente.nombre, Mortadelo); agente.numero = 001; pagente = &agente; printf(Nombre: %10s Numero :%3d\n, pagente->nombre, pagente->numero);

Asignacin de Estructuras
Es posible la asignacin directa entre estructuras.
struct tsagente agente1, agente2 = {Mortadelo, 001}; agente1 = agente2;

Las Estructuras como Parmetro de Funciones


Las estructuras de datos son tipos complejos y (aunque ciertos compiladores lo admiten) no deben ser pasados como argumentos, ni devueltos por funciones. En su lugar se usan punteros a dichas estructuras.
struct tsagente *leer_agente(); void mostrar_agente(struct tsagente *agente);

Estructuras Anidacin y Arrays de Estructuras


Anidacin de Estructuras
Los campos de las estructuras pueden ser otras estructuras.
struct tspersona { char nombre[100]; int numero; }; struct tsagencia { char nombre[100]; char pais[30]; }; struct tsagente { struct tspersona persona; struct tsagencia agencia; }; struct tsagente agente; strcpy(agente.persona.nombre, Mortadelo); strcpy(agente.agencia.nombre, TIA);

Arrays de Estructuras
Los componentes de un array pueden ser estructuras.
struct tsagente agentes[10]; strcpy(agentes[0].persona.nombre, Mortadelo); agentes[0].persona.numero = 001;

Ficheros Concepto y Tipos


Concepto
El concepto de fichero en el lenguaje C es general; se incluyen en l tanto dispositivos (pantalla, impresora, teclado), cmo ficheros que se almacenan en memoria.

Tipos de E/S de Ficheros


entrada/salida estndar (standard I/O). entrada/salida a nivel de sistema (system-level I/O) .

Tipos de Ficheros de Datos


Ficheros de Texto: Datos se encuentran estructurados en modo texto. Contienen caracteres ASCII. Ficheros Binarios: Datos en formato de almacenamiento en memoria. Contienen todo tipo de datos.

Formas de Leer y Escribir Datos en Ficheros


Modo carcter: Los datos se leen y escriben carcter a carcter. Modo cadena: Los datos se leen y escriben como cadenas de caracteres. Modo formateado: Los datos se leen y escriben en modo formato. Modo bloque: Se utiliza para leer y escribir una cantidad fija de datos.

Ficheros Apertura de Fichero


Apertura de un fichero
Para acceder a un fichero es necesario abrirlo. Al abrir el fichero la informacin de control de acceso al fichero se guarda en una estructura denominada FILE (definida en el fichero stdio.h) y que se utiliza mediante un puntero. FILE *fopen(char *nombre, char *modo); 9 nombre: nombre del fichero con su path correspondiente 9 modo: modo de apertura del fichero.
Modo
r w a r+ w+ a+ Lecturas escrituras (crea fichero o lo sobrescribe) escritura en el final del fichero (de no haber fichero lo crea) lecturas + escrituras (fichero creado) lecturas + escrituras (crea fichero o lo sobrescribe) lecturas + escrituras a final de fichero (de no haber fichero lo crea)

Operaciones admitidas

Al modo de apertura hace falta aadir si se abre en modo texto (t) o en modo binario (b). La funcin devuelve el puntero al fichero abierto. Si se produce un error en la apertura devuelve un puntero nulo (NULL). FILE *fich; fich = fopen(\\ejemplos\\texto. txt", "w");

Ficheros Cierre y Fin de Fichero


Cierre de un fichero
Todo fichero abierto debe ser cerrado. int fclose(FILE *fichero);

<stdio.h>

Fin de un fichero
int feof(FILE * fichero); Devuelve un valor distinto de cero si no se encuentra al final de fichero (EOF).

<stdio.h>

Ejemplo
#include <stdio.h> void main (void) { FILE *fich; if((fich = fopen("texto.txt", "r")) != (FILE *) NULL) { printf("El fichero \"texto.txt\" puede abrirse.\n"); fclose(fichero_ptr); } else { printf("El fichero \"texto.txt\" no puede abrirse.\n"); } }

Ficheros E/S Carcter a Carcter


Funciones de E/S Carcter a Caracter
int fputc (int caracter, FILE *fichero); Introduce un carcter en el fichero. int fgetc (FILE *fichero); Leer un carcter del fichero.

<stdio.h>

Ejemplo
#include <stdio. h> void main (void) { FILE *fich; char caracter; if((fich = fopen("texto.txt ", "r")) != (FILE *) NULL) { while ((caracter = fgetc(fich)) != EOF) { printf("%c", caracter); } fclose(fich); } else { printf("\nEl fichero \"texto.txt\" no puede abrirse."); } }

Ficheros E/S en Modo Cadena


Funciones de E/S de Cadenas de Caracteres
int fputs (char *cadena, FILE *fichero); Introduce una cardena en el fichero. char *fgets (char *cadena, int longitud, FILE *fichero); Lee una cadena de caracteres de un fichero de cmo mximo longitud 1 caracteres.

<stdio.h>

Ejemplo
#include <stdio.h> #define CARACTERES 100 void main (void) { FILE *fich; char cadena[CARACTERES]; if((fich = fopen ("texto.txt", "r")) != (FILE *)NULL) { while (fgets(cadena, CARACTERES, fich) != (char *)NULL) { printf ("%s", cadena); } fclose (fich); } else { printf("\nEl fichero \"texto.txt\" no puede abrirse."); } }

Ficheros E/S en Modo Formateado


Funciones de E/S con Formato
int fprintf (FILE *fichero, char *formato[,arg]); Escribe los argumentos en el formato especificado en el fichero. int fscanf (FILE *fichero, char *formato[,arg]); Lee los argumentos en el formato especificado del fichero.

<stdio.h>

Ejemplo
#include <stdio.h> #include <string.h> #define CARACTERES 100 void main (void) { FILE *fich; char nombre[CARACTERES]; int codigo; float longitud; if((fich = fopen("texto.txt", "r")) != (FILE *)NULL) { while(fscanf (fich, "%s %d %f", nombre, &codigo, &longitud) != EOF) { printf("\n%10s %10d %10.2f", nombre, codigo, longitud); } fclose (fich); } else { printf ("n\El fichero \"texto.txt\" no puede abrirse"); } }

Ficheros E/S en Modo Bloque


Funciones de E/S Utilizando Registros o Bloques
Escribe un buffer de numero de elementos de un tamao en el fichero.
size_t fread (void *buffer, size_t tamanio, size_t numero, FILE *fichero);

<stdio.h>

size_t fwrite (void *buffer, size_t tamanio, size_t numero, FILE *fichero);

Lee un buffer de numero de elementos de un tamao del fichero.

Ejemplo
#include <stdio.h> #define CARACTERES 40 struct tspieza { char nombre[CARACTERES]; int numero; float peso; }; void main (void) { struct tspieza pieza; FILE *fich; if((fich = fopen("piezas.dat", "rb")) != (FILE *)NULL) { while(fread(&pieza, sizeof (struct tspieza), 1, fich) == 1) { printf("\nNombre : %s", pieza.nombre); printf("\nNmero : %d", pieza.numero); printf("\nPeso : %f", pieza.peso); } fclose (fich); } else { printf ( "\nEl fichero piezas.dat no puede abrirse"); } }

Ficheros Acceso Aleatorio a un Fichero


Funciones de Acceso Aleatorio a un Fichero
int fseek(FILE *fichero, long offset, int modo); Posiciona el puntero interno del fichero. Modo Offset
0 1 2 Desde el comienzo del fichero Desde la posicin actual Desde el final de fichero

<stdio.h>
Definicin
SEEK_SET SEEK_CUR SEEK_END

int ftell(FILE *fichero); Devuelve la posicin relativa respecto del comienzo de fichero mediante un nmero entero. void rewind(FILE *fichero); Coloca el puntero de fichero al comienzo del mismo, desactivando errores y fin de fichero.

Ejemplo
#include <stdio.h> void main (void) { FILE *fich; int posicion; else { printf ("n\El fichero \"datos.dat\" no puede abrirse"); } }

if((fich = fopen("datos.dat", "rb")) != (FILE *)NULL) { fseek(fich, 0L, SEEK_END); // fseek(fich, 0L, 2); Coloca al final de fichero rewind(fich); // Coloca al principio de fichero posicion = ftell(fich); // La posicin se cooresponde con el inicio de fichero fclose (fich); }

Ficheros Ejemplo 1
Ejemplo 1 Paso 1
#include <stdio.h> void main(void) { char nombre[100]; int entero; float real; printf("Dame un nombre un entero y un real\n"); scanf("%s %d %f", nombre, &entero, &real); printf("Nombre = %s, entero = %d, real = %f\n", nombre, entero, real); }

Ejemplo 1 Paso 3
#include <stdio.h> void main(void) { char nombre[100]; int entero; float real; FILE *fich; fich = fopen("fichero.txt", "rt"); if(fich != (FILE *) NULL) { fscanf(fich, "%s %d %f", nombre, &entero, &real); printf("Nombre = %s, entero = %d, real = %f\n", nombre, entero, real); fclose(fich); } else { printf("No se puede abrir fichero\n"); } }

Ejemplo 1 Paso 2
#include <stdio.h> void main(void) { char nombre[100]; int entero; float real; FILE *fich; printf("Dame un nombre un entero y un real\n"); scanf("%s %d %f", nombre, &entero, &real); fich = fopen("fichero.txt", "wt");

if(fich != (FILE *) NULL) { fprintf(fich, "%s %d %f", nombre, entero, real); fclose(fich); } else { printf("No se puede crear fichero\n"); } }

Ficheros Ejemplos 2 y 3 Paso 1 (Programa Principal)


Declaraciones, Tipos y Programa Principal
#include <stdio.h> #define MAXARRAY 100 struct rgarticulo { char nombre[100]; int unidades; float precio; }; void void void void leer_array(struct rgarticulo articulos[], int *longitud); mostrar_array(struct rgarticulo articulos[], int longitud); leer_registro(struct rgarticulo *articulo); mostrar_registro(struct rgarticulo *articulo);

void main(void) { struct rgarticulo articulos[MAXARRAY]; int longitud = 0; leer_array(articulos, &longitud); mostrar_array(articulos, longitud); }

Ficheros Ejemplos 2 y 3 (Funciones varias)


Funcin leer_array
void leer_array(struct rgarticulo articulos[], int *longitud) { char opcion; do { printf("Introducir elemento [s/n]? "); opcion = getchar(); if(opcion == 'S' || opcion == 's') { leer_registro(&articulos[*longitud]); (*longitud)++; } } while (opcion != 'N' && opcion != 'n'); } }

Funcin leer_registro
void leer_registro(struct rgarticulo *articulo) { struct rgarticulo articulin; printf("Nombre : "); scanf("%s", articulin.nombre); printf("Unidades : "); scanf("%d", &articulin.unidades); printf("Precio : "); scanf("%f", &articulin.precio); *articulo = articulin;

Funcin mostrar_array
void mostrar_array(struct rgarticulo articulos[], int longitud) { int i; for(i = 0; i < longitud; i++) { printf("\nRegistro %d\n", i + 1); mostrar_registro(&articulos[i]); } }

Funcin mostrar_registro
void mostrar_registro(struct rgarticulo *articulo) { printf("Nombre : %s\n", articulo->nombre); printf("Unidades : %d\n", articulo->unidades); printf("Precio : %f\n", articulo->precio); }

Ficheros Ejemplo 2 Paso 2 (E/S Modo Formateado)


Declaraciones, Tipos y Programa Principal
#include <stdio.h> #define MAXARRAY 100 #define NOMFICH "Articuls.txt" struct rgarticulo { char nombre[100]; int unidades; float precio; }; void leer_array(struct rgarticulo articulos[], int *longitud); void leer_registro(struct rgarticulo *articulo); void array_fichero(char *nomfich, struct rgarticulo articulos[], int longitud); void main(void) { struct rgarticulo articulos[MAXARRAY]; int longitud = 0; leer_array(articulos, &longitud); array_fichero(NOMFICH, articulos, longitud); }

Funcin array_fichero
void array_fichero(char *nomfich, struct rgarticulo articulos[], int longitud) { int i; FILE *fich; if((fich = fopen(nomfich, "wt")) != (FILE *) NULL) { for(i = 0; i < longitud; i++) { fprintf(fich, "%s %d %f\n", articulos[i].nombre, articulos[i].unidades, articulos[i].precio); } fclose(fich); } else { printf("No se ha podido crear el fichero %s\n", nomfich); } }

Ficheros Ejemplo 2 Paso 3 (E/S Modo Formateado)


Declaraciones, Tipos y Programa Principal
#include <stdio.h> #define MAXARRAY 100 #define NOMFICH "Articuls.txt" struct rgarticulo { char nombre[100]; int unidades; float precio; }; void mostrar_array(struct rgarticulo articulos[], int longitud); void mostrar_registro(struct rgarticulo *articulo); void fichero_array(char *nomfich, struct rgarticulo articulos[], int *longitud); void main(void) { struct rgarticulo articulos[MAXARRAY]; int longitud = 0; fichero_array(NOMFICH, articulos, &longitud); mostrar_array(articulos, longitud); }

Funcin fichero_array
void fichero_array(char *nomfich, struct rgarticulo articulos[], int *longitud) { struct rgarticulo articulin; FILE *fich; *longitud = 0; if((fich = fopen(nomfich, "rt")) != (FILE *) NULL) { while(fscanf(fich, "%s %d %f", articulin.nombre, &articulin.unidades, &articulin.precio) != EOF) { articulos[*longitud] = articulin; (*longitud)++; } fclose(fich); } else { printf("No se ha podido abrir el fichero %s\n", nomfich); } }

Ficheros Ejemplo 2 Paso 4 (E/S Modo Formateado)


Declaraciones, Tipos y Programa Principal
#include <stdio.h> #define #define #define #define MAXARRAY 100 NOMFICH1 "Articuls.txt" NOMFICH2 "Articul2.txt" PTSEURO 166.386

Funcin transformar_array
void transformar_array(struct rgarticulo articulos[], int longitud) { int i; for(i = 0; i < longitud; i++) { articulos[i].precio = articulos[i].precio / PTSEURO; } }

struct rgarticulo { char nombre[100]; int unidades; float precio; }; void mostrar_array(struct rgarticulo articulos[], int longitud); void mostrar_registro(struct rgarticulo *articulo); void transformar_array(struct rgarticulo articulos[], int longitud); void array_fichero(char *nomfich, struct rgarticulo articulos[], int longitud); void fichero_array(char *nomfich, struct rgarticulo articulos[], int *longitud); void main(void) { struct rgarticulo articulos[MAXARRAY]; int longitud = 0; fichero_array(NOMFICH1, articulos, &longitud); transformar_array(articulos, longitud); mostrar_array(articulos, longitud); array_fichero(NOMFICH2, articulos, longitud); }

Ficheros Ejemplo 3 Paso 2 (E/S Modo Bloque)


Declaraciones, Tipos y Programa Principal
#include <stdio.h> #define MAXARRAY 100 #define NOMFICH "Articuls.dat" struct rgarticulo { char nombre[100]; int unidades; float precio; }; void leer_array(struct rgarticulo articulos[], int *longitud); void leer_registro(struct rgarticulo *articulo); void array_fichero(char *nomfich, struct rgarticulo articulos[], int longitud); void main(void) { struct rgarticulo articulos[MAXARRAY]; int longitud = 0; leer_array(articulos, &longitud); array_fichero(NOMFICH, articulos, longitud); }

Funcin array_fichero
void array_fichero(char *nomfich, struct rgarticulo articulos[], int longitud) { int i; FILE *fich; if((fich = fopen(nomfich, "wb")) != (FILE *) NULL) { for(i = 0; i < longitud; i++) { fwrite(&articulos[i], sizeof(struct rgarticulo), 1, fich); } fclose(fich); } else { printf("No se ha podido crear el fichero %s\n", nomfich); } }

Ficheros Ejemplo 3 Paso 3 (E/S Modo Bloque)


Declaraciones, Tipos y Programa Principal
#include <stdio.h> #define MAXARRAY 100 #define NOMFICH "Articuls.dat" struct rgarticulo { char nombre[100]; int unidades; float precio; }; void mostrar_array(struct rgarticulo articulos[], int longitud); void mostrar_registro(struct rgarticulo *articulo); void fichero_array(char *nomfich, struct rgarticulo articulos[], int *longitud); void main(void) { struct rgarticulo articulos[MAXARRAY]; int longitud = 0; fichero_array(NOMFICH, articulos, &longitud); mostrar_array(articulos, longitud); }

Funcin fichero_array
void fichero_array(char *nomfich, struct rgarticulo articulos[], int *longitud) { FILE *fich; *longitud = 0; if((fich = fopen(nomfich, "rb")) != (FILE *) NULL) { while(fread(&articulos[*longitud], sizeof(struct rgarticulo), 1, fich) == 1) { (*longitud)++; } fclose(fich); } else { printf("No se ha podido abrir el fichero %s\n", nomfich); } }

Ficheros Ejemplo 3 Paso 4 (E/S Modo Bloque)


Declaraciones, Tipos y Programa Principal
#include <stdio.h> #define #define #define #define MAXARRAY 100 NOMFICH1 "Articuls.dat" NOMFICH2 "Articul2.dat" PTSEURO 166.386

Funcin transformar_array
void transformar_array(struct rgarticulo articulos[], int longitud) { int i; for(i = 0; i < longitud; i++) { articulos[i].precio = articulos[i].precio / PTSEURO; } }

struct rgarticulo { char nombre[100]; int unidades; float precio; }; void mostrar_array(struct rgarticulo articulos[], int longitud); void mostrar_registro(struct rgarticulo *articulo); void transformar_array(struct rgarticulo articulos[], int longitud); void array_fichero(char *nomfich, struct rgarticulo articulos[], int longitud); void fichero_array(char *nomfich, struct rgarticulo articulos[], int *longitud); void main(void) { struct rgarticulo articulos[MAXARRAY]; int longitud = 0; fichero_array(NOMFICH1, articulos, &longitud); transformar_array(articulos, longitud); mostrar_array(articulos, longitud); array_fichero(NOMFICH2, articulos, longitud); }

Examen Febrero 2001 1/2


Declaraciones, Tipos y Programa Principal
#include <stdio.h> #include <string.h> #define MAXARRAY 100 struct rgtemp { char hora[5]; float temp; }; void fichero_array(char void array_fichero(char int existe_fichero(char void modificacion(float *nomfich, struct rgtemp argtemp[], int *tamanio); *nomfich, struct rgtemp argtemp[], int tamanio); *nomfich); valor, struct rgtemp argtemp[], int tamanio); void main(void) { char nomfichdat[20], nomfichmod[20]; char dia[10], mes[10], anio[10]; struct rgtemp argtemp[MAXARRAY]; int tamanio; float valor; printf("Introduzca el da, mes y ao a tratar: "); scanf("%s %s %s", dia, mes, anio); strcat(strcat(strcat(strcpy(nomfichdat, dia), mes), anio), ".DAT"); if(existe_fichero(nomfichdat)) { printf("Encontrado fichero %s\n", nomfichdat); printf("Introduzca el tanto por ciento a aplicar: "); scanf("%f", &valor); printf("Procesando informacin...\n"); fichero_array(nomfichdat, argtemp, &tamanio); modificacion(valor, argtemp, tamanio); strcat(strcat(strcat(strcpy(nomfichmod, dia), mes), anio), ".MOD"); array_fichero(nomfichmod, argtemp, tamanio); printf("Generado fichero %s\n", nomfichdat); } else { printf("No existe el fichero %s\n", nomfichdat); } }

Examen Febrero 2001 2/2


Funcin fichero_array
void fichero_array(char *nomfich, struct rgtemp argtemp[], int *tamanio) { FILE *fich; struct rgtemp registro; *tamanio = 0; if((fich = fopen(nomfich, "r")) != (FILE *) NULL) { while(fscanf(fich, "%s %f", registro.hora, &registro.temp) != EOF) { argtemp[*tamanio] = registro; (*tamanio)++; } fclose(fich); } }

Funcin array_fichero
void array_fichero(char *nomfich, struct rgtemp argtemp[], int tamanio) { FILE *fich; int i; if((fich = fopen(nomfich, "w")) != (FILE *) NULL) { for(i = 0; i < tamanio; i++) { fprintf(fich, "%s %g\n", argtemp[i].hora, argtemp[i].temp); } fclose(fich); } }

Funcin existe_fichero
int existe_fichero(char *nomfich) { FILE *fich; int out = 0; if((fich = fopen(nomfich, "r")) != (FILE *) NULL) { out = 1; fclose(fich); } return out; }

Funcin modificacin
void modificacion(float valor, struct rgtemp argtemp[], int tamanio) { int i; for(i = 0; i < tamanio; i++) { if(strcmp(argtemp[i].hora, "1800") >= 0 && strcmp(argtemp[i].hora, "2000") <= 0) { argtemp[i].temp *= (1.0 + (valor / 100.0)); } } }

Examen Septiembre 2001 1/2


Declaraciones, Tipos y Programa Principal
#include <stdio.h> #include <string.h> #define MAXARRAY 500 struct { int char float }; rgtemp deposito; hora[5]; temp; void fichero_array(char *nomfich, struct rgtemp argtemp[], int *tamanio); int existe_fichero(char *nomfich); float media(int deposito, struct rgtemp argtemp[], int tamanio); void main(void) { char nomfichdat[20]; char dia[10], mes[10], anio[10]; struct rgtemp argtemp[MAXARRAY]; int tamanio, deposito; printf("Introduzca el da, mes y ao a tratar: "); scanf("%s %s %s", dia, mes, anio); strcat(strcat(strcat(strcpy(nomfichdat, dia), mes), anio), ".DAT"); if(existe_fichero(nomfichdat)) { printf("Encontrado fichero %s\n", nomfichdat); printf("Introduzca el nmero de depsito: "); scanf("%d", &deposito); fichero_array(nomfichdat, argtemp, &tamanio); printf("La temperatura media de depsito %d es: %.3f\n", deposito, media(deposito, argtemp, tamanio)); } else { printf("No existe el fichero %s\n", nomfichdat); } }

Examen Septiembre 2001 2/2


Funcin fichero_array
void fichero_array(char *nomfich, struct rgtemp argtemp[], int *tamanio) { FILE *fich; struct rgtemp registro; *tamanio = 0; if((fich = fopen(nomfich, "r")) != (FILE *) NULL) { while(fscanf(fich, "%d %s %f", &registro.deposito, registro.hora, &registro.temp) != EOF) { argtemp[*tamanio] = registro; (*tamanio)++; } fclose(fich); } }

Funcin media
float media(int deposito, struct rgtemp argtemp[], int tamanio) { int i, nummed; float suma, media, out; nummed = 0; suma = 0.0; out = 0.0; for(i = 0; i < tamanio; i++) { if(argtemp[i].deposito == deposito) { suma += argtemp[i].temp; nummed++; } } if(nummed > 0) { out = suma / nummed; } return out; }

Funcin existe_fichero

int existe_fichero(char *nomfich) { FILE *fich; int out = 0; if((fich = fopen(nomfich, "r")) != (FILE *) NULL) { out = 1; fclose(fich); } return out; }

Ejercicios programacin en C Laboratorio de Sistemas Informticos


Curso 2003-2004

Isidro Calvo Gordillo

Ejercicios programacin en C - Variables y operadores bsicos

Variables y operadores bsicos


1. Programa que pida un valor en pesetas y lo convierta en euros y otro programa que lleve a cabo la operacin inversa. (Nota 1 euro = 166.386 pts) Nota: La solucin en euros deber tener 3 decimales. Pedir un carcter por teclado y mostrar un mensaje que muestre el carcter introducido as como su cdigo ASCII tanto en formato decimal como hexadecimal. Programa que pida la temperatura en grados Celsius y la convierta a grados Fahrenheit (y viceversa) mostrando en pantalla un mensaje del tipo xxx.xx grados Celsius son yyy.yy grados Fahrenheit

2. 3.

F 32 C = 9 5
4. 5. Crear un programa que pida el radio de una circunferencia y que calcule la longitud de la misma as como el rea incluida dentro. Crear un programa que calcule la fuerza de atraccin gravitacional entre dos masas, M1 y M2 situadas a una distancia R.

F =G

M 1* M 2 ( Nw) R2

donde las masas se expresan en kilogramos y la distancia en metros y la constante de gravitacin universal vale:

G = 6.67 x10 11 Nw * m 2 / Kg 2
Nota: Utilizar #define para definir la constante G. 6. 7. Escribir un programa que pregunte el ao actual y la edad de una persona y calcule la edad de esa persona en el ao 2010. Escribir un programa que calcule el nmero de billetes de 10.000, 5.000, 1,000, as como de monedas de 500, 100, 25, 5 y 1 pesetas para desglosar una cantidad, C, de pesetas (menor de 2.147.483.647), de forma que se necesite la menor cantidad de monedas y billetes de cada tipo. Crear un programa que pida un numero real y muestre la tabla de multiplicar correspondiente a dicho nmero de tal manera que tanto los valores de los factores como del producto se presenten encolumnados y con una precisin de 2 dgitos. Ejemplo: Programa que muestra la tabla de multiplicar de un nmero Escribe un nmero: 5 (Valor introducido por el usuario) TABLA DE MULTIPLICAR DEL NUMERO 5.00 5.00 5.00 ... 5.00 9. * * * 1 2 10 = = = 5.00 10.00 50.00

8.

Mostrar en forma de tabla, el cuadrado y el cubo de los 5 primeros nmeros enteros que siguen a uno introducido por teclado. Los datos deben aparecer ajustados a la derecha siguiendo el siguiente formato: Numero Cuadrado Cubo

Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios programacin en C - Variables y operadores bsicos

-----xxx

-------xxxx

---xxxxxx

Nota: Ejecutar el programa utilizando variables de tipo int e introduciendo el nmero base 30 y utilizando variables de tipo unsigned int e introduciendo el nmero base 40. Qu sucede? Cmo se puede explicar lo que sucede? 10. Crear un programa que muestre en pantalla el tamao en bytes (8 caracteres) de las variables ms frecuentes: char, int, short int, long int, float y double. (Nota: Para calcular el tamao de una variable se puede usar el operador sizeof.) 11. Escribir un programa que tras preguntar el nmero de almacn asociado a un determinado tipo de pieza, la cantidad pedida de esa pieza y el precio por unidad, efecte el clculo del precio total de las piezas pedidas. El programa deber escribir toda la informacin de la pieza en la pantalla, adems del importe total del pedido. 12. Escribir un programa que lea el valor de un ngulo en radianes y muestre su valor en grados, minutos y segundos 13. Programa que tras pedir por teclado un nmero lo multiplique por 4 y divida por 2 utilizando los operadores de rotacin.

Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios de programacin en C - Sentencias condicionales

Sentencias condicionales
1. Ejecutar el siguiente cdigo fuente (Declarando valor_logico como entero y luego declarndolo como float): printf(Valores logicos de las siguientes expresiones\n); valor_logico=(3>5); printf((3 > 5) es %d\n, valor_logico); valor_logico=(5 > 3); printf((5 > 3) es %d\n, valor_logico); valor_logico=(15 > 3*5); printf((15 > 3*5) es %d\n, valor_logico); valor_logico=!(5 == 3); printf(!(5 == 3) es %d\n, valor_logico); Nota: No confundir el operador == de comparacin (para comprobar si dos valores son iguales) con el operador = de asignacin que escribe un valor en una variable. 2. 3. 4. Escribir un programa que tras pedir 2 nmeros por la pantalla muestra cul es el mayor nmero. (Hgase con la sentencia if y con el operador condicional expresion?valor1:valor2 ) Leer tres nmeros enteros y, si el primero de ellos es negativo, calcular el producto de los tres, en caso contrario calcular la suma de ellos. Crear un programa que calcule la cada de potencial producida por una resistencia segn la ley de Ohm (V=I*R) a partir de la resistencia y la intensidad que pasa a su travs. Nota: El programa no debe aceptar resistencias negativas, dado que no tienen sentido fsico, ni resistencias mayores que 1000 (requerimiento adicional del problema). En ambos casos el programa debe escribir un mensaje de error en pantalla diciendo que el valor de la resistencia est fuera de lmites aceptables indicando la causa por la que dicho valor para la resistencia ha sido rechazado. 5. Sea un sistema de ecuaciones de la forma:

ax + by = c dx + ey = f
que puede resolverse usando las siguientes frmulas:

x=

ce bf ae bd

y=

af cd ae bd

Escribir un programa que lea los coeficientes (a, b, c, d, e, f) y resuelva el sistema. El programa deber indicar los casos en los que el sistema de ecuaciones no tenga solucin. 6. Escribir un programa que calcule las races, bien reales o imaginarias, de una ecuacin de segundo grado. El programa tambin debe ser capaz de operar con valores nulos para el coeficiente de orden dos (Es decir deber de ser capaz de resolver ecuaciones de primer grado) En otras palabras, dada la ecuacin ax2 + bx + c=0 obtener x1, x2 de forma que: Si a=0 Si b2-4ac=0 Si b2-4ac > 0 Si b2-4ac < 0 Ec. 1er grado Raz nica. 2 races reales iguales 2 races reales distintas 2 races complejas conjugadas

7.

Dada la funcin U=f(x,y) tal que:

Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios de programacin en C - Sentencias condicionales 10 y2 si si x*y < 1 x*y 1

y dada la funcin V=f(x,y) tal que: 1 y2 si si x*y < 1 x*y 1

Escribir un programa que calcule los valores de las funciones U y V, una vez conocidas las coordenadas de un punto (x,y). 8. Escribir un programa que pida un ao y diga si es bisiesto o no. Nota: Un ao es bisiesto si es mltiplo de 4 salvo el caso en que sea mltiplo de 100, que no es bisiesto, y no sea mltiplo de 400. Por ejemplo, el ao 1900 no fue bisiesto, el 2000 s y el 2100 no lo es. 9. La fecha del Domingo de Pascua est relacionada con el calendario judo que es lunar. Para obtener en nuestro calendario cul sera el correspondiente fecha se puede utilizar el siguiente algoritmo a partir del ao para el que se quiere calcular la fecha. Sea X el ao para el que se quiere calcular la fecha. Sea A el resto de la divisin de X entre 19 Sea B el resto de la divisin de X entre 4 Sea C el resto de la divisin de X entre 7 Sea D el resto de la divisin de (19*A+24) entre 30 Sea E el resto de la divisin de (2*B+4*C+6*D+5) entre 7 La fecha para el Domingo de Pascua es el da (22+D+E) de Marzo (obsrvese que puede dar una fecha en Abril) Escribir un programa que pida como entrada un ao y saque por pantalla la fecha del Domingo de Pascua para ese ao. 10. Leer desde el teclado las coordenadas (x, y) de un punto y, mediante un men, elegir una entre las siguientes opciones: Comprobar si el punto pertenece a una circunferencia de radio 10 y centro (0,0) Averiguar el cuadrante en el que se encuentra el punto. Pasar las coordenadas cartesianas (x,y) a polares (r, arg). Salir

r arg
X

11. Escribir un programa que permita efectuar el clculo del rea de un cuadrado, un crculo o un tringulo equiltero segn la opcin seleccionada por el usuario. Crear una primera versin con la estructura de control if ... else Y una segunda versin con la estructura de control switch... case...

12. Escribir un programa que permita efectuar el clculo del rea de un cuadrado, un crculo o un tringulo equiltero segn la opcin seleccionada por el usuario a travs de un men.

Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios de programacin en C - Sentencias condicionales

13. Dada la longitud de una circunferencia, averiguar si dicha longitud corresponde, con una determinada precisin, a una circunferencia de radio R. El programa deber leer la longitud de la circunferencia, el radio y la precisin e indicar si es cierto o no que esa circunferencia tiene ese valor del radio. 14. Escribir un programa que pida dos caracteres por pantalla, los ordene alfabticamente, y los imprima ordenados.

Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios de programacin en C - Sentencias Repetitivas

Sentencias repetitivas
1. 2. Escribir un programa que escriba los nmeros del 1 al 100 en lneas de 10 nmeros. Despus de 100 el programa debe escribir Fin del programa en una lnea nueva. Programa que calcule el valor de elevar un nmero real, a, a un exponente entero, b, ab, multiplicando b veces el nmero a. Nota: Mejorar el programa para que compruebe que el exponente es mayor que 0 y si no lo es dar un mensaje de error y pedir otro exponente. 3. Programa que calcule el factorial (n!) de un numero entero positivo ledo por teclado. Nota: Probar el programa con los nmeros 6, 7, 8, 9... Qu pasa a medida que se va aumentando el nmero? Por qu? 4. Crear un programa que pida un numero real y muestre la tabla de multiplicar correspondiente a dicho nmero de manera que tanto los valores de los factores como del producto se presenten encolumnados y con una precisin de 2 dgitos. Ejemplo: Programa que muestra la tabla de multiplicar de un nmero Escribe un nmero: 5 (Valor introducido por el usuario) TABLA DE MULTIPLICAR DEL NUMERO 5.00 5.00 * 1 = 5.00 ... 5.00 * 10 = 50.00 5. Escribir un programa que calcule el sumatorio:

(1)
i =1

1 i2

donde S es un nmero entero positivo introducido por teclado. Solucin: El lmite de esa expresin cuando S tiende a infinito es: -0.822467. 6. Programa que escriba en pantalla una tabla con cuadrados y cubos a partir de un nmero base hasta otro tope, ambos pedidos por teclado. Nota: El programa deber evitar problemas de overflow. La tabla debe seguir el siguiente formato: Nmero -----xx 7. Cuadrado -------xxx Cubo ---xxxx

Escribir un programa que ayude a aprender las tablas de multiplicar. Para ello se ir pidiendo la tabla de multiplicar de un nmero (pedido por teclado con anterioridad) y comprobando que los valores introducidos son correctos. Si es as el programa escribir correcto y en caso contrario deber escribir Lo siento, se ha equivocado. La respuesta correcta era nmero La ltima lnea mostrar el nmero de aciertos. A continuacin se muestra un ejemplo de ejecucin:

Programa para aprender las tablas de multiplicar Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios de programacin en C - Sentencias Repetitivas

Con qu nmero quieres practicar?

5 (Introducido por el usuario)

5 * 1 = 5 (Introducido por el usuario) Valor correcto 5 * 2 = 11 (Introducido por el usuario) Lo siento se ha equivocado. La respuesta correcta era 10 ... Has acertado 9 veces de 10 nmeros. 8. Hacer un programa que lea caracteres desde teclado hasta que lea 10 veces la letra 'a'. Por cada carcter ledo que no sea una 'a' debe mostrar un mensaje indicndolo. Cuando lea las 10 letras 'a' el programa terminar. Hacer un programa que lea caracteres desde teclado y vaya contando las vocales que aparecen. El programa terminar cuando lea el carcter # y entonces mostrar un mensaje indicando cuntas vocales ha ledo (cuntas de cada una de ellas).

9.

10. Repetir el ejercicio leyendo caracteres hasta que se lea el carcter final de fichero EOF (^Z) en lugar del carcter #. 11. Programa que simule que se deja caer una pelota desde un edificio de X metros de altura (donde X se pide por teclado) mostrando en cada 0.1 segundos tanto la altura de la pelota como su velocidad. Mostrar para cada instante de tiempo (cada 0.1 segundos) una lnea del estilo: t=xx.x distancia al suelo=xx.xxx metros velocidad=xx.xxx m/s

12. Programa que calcule los ns primos del 1 al 100 y los saque por pantalla. 13. Escribir un programa que primero pida por pantalla con cuntos nmeros se va a trabajar digamos que sean X) y luego pida los X nmeros por pantalla. Despus de introducir los X nmeros se mostrar un mensaje por pantalla indicando cul es el mayor y menor valor introducido, as como el valor medio de todos los nmeros introducidos. 14. Programa que pida nmeros de cuatro cifras e indique si los nmeros son capicas o no. El programa deber ir pidiendo nmeros hasta que el usuario introduce -1 por teclado. El nmero 1 indicar la finalizacin de la ejecucin del programa. Nota1: Un nmero capica es simtrico p.e. 1221 25752 Nota2: Cuando el nmero no es de cuatro cifras se deber mostrar un mensaje de error por pantalla y se pedir otro nmero menor que 10000. En caso de que el nmero sea menor de cuatro cifras se completar con ceros a la izquierda. Nota3: El nico nmero negativo que se aceptar es -1 que indicar la finalizacin del programa. Cualquier otro nmero negativo, se mostrar un mensaje de error. 15. Escribir un programa que calcule los nmeros perfectos entre 1 y 10000. Nota: Un nmero perfecto es aqul tal que la suma de sus divisores menos el propio nmero es el propio nmero. Ej.: 6 Divisores(6)={1,2,3,6} Suma = 1+2+3+6 6 = 6 N. Perfecto 10 Divisores(10)={1,2,5,10} Suma = 1+2+5+10 10 10 N. no perfecto Solucin: 6, 28, 496, 8128

16. Escribir un programa que muestre el siguiente men y que permita pasar magnitudes de grados a radianes y de radianes a grados. 1. Pasar de grados a radianes Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios de programacin en C - Sentencias Repetitivas 2. Pasar de radianes a grados 3. Salir del programa 17. Escribir un programa que muestre una tabla con los caracteres ASCII mostrados en decimal, octal y hexadecimal. El programa mostrar la informacin con el siguiente formato: Dec: xx Octal: xx Hex: xx Car: x

El programa pedir el primer y ltimos caracteres que marcarn los lmites de la tabla.

Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios programacin en C - Funciones

Funciones
1. Escribir un programa que permita convertir grados Fahrenheit a Celsius y grados Celsius a Fahrenheit. El programa presentar el siguiente men: 1. 2. 0. Conversin de Celsius a Fahrenheit Conversin de Fahrenheit a Celsius Salir del programa.

Nota: Cada conversin se efectuar por medio de funciones, una que convertir de grados Celsius a grados Fahrenheit y otra que haga justo lo contrario. 2. Realizar un programa que escriba todos los nmeros enteros menores que un cierto entero N y que a su vez sean mltiplos de dos nmeros enteros A y B introducidos por teclado. Utilizar para ello una funcin que admita dos parmetros I, J e indique si I es mltiplo de J. Ej: N=25, A=2, B=3 => 0,6,12,18,24 3. Escribir una funcin (con su correspondiente programa de prueba) que tome un valor entero y devuelva el nmero con sus dgitos en reversa. Por ejemplo, dado el nmero 7631 la funcin deber devolver 1367. Escribir un programa que calcule masa radioactiva de carbono 14 que queda despus de t aos. La frmula que determina la masa restante en el tiempo t es:

4.

1h Mt = m* 2
donde: t Mt m h es el tiempo en aos es la masa que permanece en el tiempo t es la masa original es la vida media en aos

Para el carbono 14 la vida media es de 5700 aos; si la masa original es de 300 gramos, imprimir una tabla de la masa para t=500, 1000, 1500, 2000, ..., 10000 aos. Se deber utilizar un subprograma que permita evaluar la expresin (1/2)t/h para los diferentes valores de t. Nota: En TurboC existe la funcin double pow(double x, double y) que devuelve el valor xy. 5. 6. Escribir una funcin que escriba tantas lneas en blanco como se haya pedido con anterioridad al usuario en el programa principal. Escribir una funcin que tome el tiempo introducido por el usuario en el formato (horas:minutos:segundos) y lo convierta en segundos. El programa utilizar esta funcin para calcular la diferencia en segundos entre dos tiempos introducidos por el usuario. Escribir un programa que calcule el nmero combinatorio

7.

M! M = N N ! ( M N )!
Utilizar para ello una funcin que calcule el factorial de un nmero. Nota: La funcin para calcular el factorial de un nmero puede ser iterativa o recursiva. (Una funcin recursiva es una funcin que se llama a s misma)

Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios programacin en C - Funciones

8.

Escribir una funcin que calcule el factorial de un nmero y utilizar sta en un programa que muestre el siguiente men. 1. Factorial de un nmero 2. Clculo de e 3. Clculo de e^x 0. Salir Nota 1: El clculo de e debe hacerse con la siguiente expresin matemtica:

e = 1+
Sol: e=2.718282

1 1 1 + + + ... 1! 2! 3!

Nota 2: En un entorno de 1

e x puede calcularse mediante la frmula:

ex =1+
9.

x x2 x3 + + + ... 1! 2! 3!

El desarrollo en serie de Taylor de la funcin coseno entorno al 0 es:

cos ( x) = 1

x2 x4 x6 + +... 2! 4! 6!

donde el ngulo x viene expresado en radianes. Escribir un programa que calcule el valor aproximado de coseno (x), utilizando para ello los N primeros trminos de la serie de Taylor. El nmero de trminos N de la serie depender del valor del ltimo, es decir, se aadirn trminos a la serie hasta que el valor absoluto del ltimo trmino aadido sea menor que 0.0005. Obtener el coseno de 10 radianes? Comprese con el valor obtenido con la calculadora. Qu sucede? 10. Se desea realizar un programa que permita hacer clculos con polinomios de segundo grado. El programa deber presentar un men en pantalla que facilite las siguientes opciones: 1. 2. 3. 4. 0. Leer un polinomio Escribir un polinomio en su forma habitual Evaluar un polinomio en un punto Calcular el polinomio derivado Salir

Se debern utilizar los siguientes subprogramas: LEER mediante este subprograma se introducen los nmeros enteros que representan los coeficientes del polinomio. ESCRIBIR es un subprograma que permite la escritura de un polinomio en la forma Ax^2 + Bx + C Ejemplos vlidos: 5x^2+3x+5 5x^2-3x+5 5x^2-5 ejemplos no vlidos: 5x^2+ -3x+5 5x^2-0x+5 EVALUAR es un subprograma que retorna el valor de un polinomio para un nmero real que es introducido como parmetro. DERIVAR es un subprograma que calcula el polinomio derivada de uno dado. Nota: No est permitido el uso de variables globales. 11. Escribir un programa que realice la descomposicin en factores primos de un nmero introducido por teclado. El programa deber ir escribiendo la tabla de los factores primos, a medida que los va calculando, tal como muestra el ejemplo siguiente:

Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios programacin en C - Funciones

Introduce un N entero -> 84 N | Factores primos -| --------------84 | 2 42 | 2 21 | 3 7 | 7 1 | Ayuda: Se deber utilizar una funcin que nos diga si un nmero es primo o no. 12. Escribir un programa que cuente de un texto introducido por teclado: N. de caracteres en blanco N. de dgitos N. de letras N. de lneas N. de otras cosas

Nota 1: Se deben crear sendas funciones para comprobar si un carcter es numrico o alfanumrico. Nota 2: La funcin getchar() permite leer un carcter de teclado. Nota 3: Para marcar el final de lectura del texto, el usuario deber introducir un carcter que marque fin de fichero. Este carcter es ^D en Linux y ^Z en DOS / Windows.

Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios programacin en C Arrays unidimensionales / multidimensionales

Arrays
1. Escribir un programa que calcule el producto escalar de dos vectores de 3 elementos cuyos valores se introducen por pantalla con el programa principal. 2. Escribir un programa que calcule el producto vectorial de dos vectores de 3 elementos cuyos valores se introducen por pantalla con el programa principal. 3. Realizar un programa que lea 20 nmeros y muestre aquel o aquellos que hayan aparecido ms veces. 4. Escribir un programa que emplee un argumento de la lnea de comandos para realizar una conversin decimal a hexadecimal; es decir, el nmero decimal se introducir en la lnea de comandos, siguiendo al nombre del programa. Ej: C:> decihex 128 111 Deci= 128 Hex= 80 Deci= 111 Hex= 6F C:> Nota 1: Al igual que en el ejemplo, el programa deber ser capaz de convertir varios nmeros en una llamada. Nota 2: En caso de que el programa no reciba argumentos deber devolver un mensaje de error. Nota 3: La funcin atoi() convierte de cadenas a enteros. 5. Escribir un programa que pida un array de caracteres por pantalla e invierta el orden de los caracteres mostrndolo por pantalla. La inversin se har sin utilizar otro array auxiliar. 6. Escribir un programa que calcule los nmeros primos de 0 a 100 utilizando el llamado mtodo de la criba de Eratstenes. Este mtodo consiste en definir e inicializar con todos sus elementos a True un array de 100 elementos binarios e ir tachando (pasando a False) en pasadas sucesivas todos los mltiplos de los nmeros primos (2, 3, 5, 7...) hasta obtener slo los nmeros primos. Es decir: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

En el ejemplo en gris claro se sealan los mltiplos de 2, mientras que en gris oscuro los mltiplos de 3 (que no son mltiplos de 2). Nota: Aumentar el lmite superior y comparar la velocidad de ejecucin con el programa de Sentencias Repetitivas. 7. Realizar un programa que maneje un array de enteros a travs de un men con seis opciones: 1.2.3.4.5.0.Aadir un elemento al array (comprobando que el array no est lleno) Eliminar un elemento del array (comprobando que el array no est vaco) Listar el contenido del array Contar las apariciones de un nmero en el array Calcular la media y el mximo de los elementos del array Terminar

8. Escribir un programa que permita guardar las cuentas de un banco con sus respectivos saldos. Para ello se guardar la informacin en un array paralelo (dos arrays unidimensionales, uno con los nmeros de cuenta y otro los saldos) El programa deber mantener las cuentas ordenadas, de menor a mayor, por nmero de cuenta para facilitar la bsqueda de una cuenta. El programa mostrar un men con las siguientes opciones:

Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios programacin en C Arrays unidimensionales / multidimensionales

1.- Dar de alta una nueva cuenta (comprobando que el array no est lleno y colocando la cuenta en la posicin correspondiente dentro del array) 2.- Eliminar una cuenta (comprobando que el array no est vaco y reposicionando las cuentas en el array) 3.- Mostrar una cuenta (mostrar el nmero de cuenta y el saldo correspondiente) 4.- Mostrar informacin (Nmero de cuentas dadas de alta y dinero total de todas ellas) 5.- Calcular el saldo medio, mximo y mnimo de las cuentas del array. 6.- Mostrar todas las cuentas (1 lnea por cuenta). 0.- Terminar 9. Escribir un programa que rellene automticamente una matriz 4x7 con la suma de sus ndices (Es decir, el elemento a11 = 1+1=2, a47 = 4+7=11). El programa mostrar la matriz resultante por pantalla. 10. Escribir un programa que pida una matriz de orden 3x3 y calcule y muestre por pantalla su matriz transpuesta. 11. Crear un programa que permita reservar asientos de una sala de cine (8 filas x 20 columnas). La posicin de cada asiento se definir con una letra (A-H) para la fila y un nmero (1-20) para la columna. El programa deber visualizar qu sitios estn disponibles para que el cliente pueda decidir dnde sentarse. Antes de hacer la reserva, el programa deber comprobar que el asiento est libre, en caso contrario devolver un mensaje de error. Ej. de visualizacin: 1...5....0 1...5....0 _______________________ A B C D E F G H ** **** ** **** *** * ** ***** **** ******** ** **** ******* 1...5....0 *** ** **** *** ** *** ** ** *** * ** **** ** *** 1...5....0 A B C D E F G H

12. Un histograma es un grfico que muestra la frecuencia con que aparecen en una array dado valores dentro de subintervalos especificados de su intervalo. Por ejemplo, si un array unidimensional de enteros tiene elementos de tipo 0..9 y contiene los siguientes valores: 6 4 4 1 9 7 5 6 4 2 3 9 5 6 4

Su histograma sera: Frecuencia Valor 4 3 2 1 0 * * * * 4 * * * 6

* 1

* 2

* 3

* * 5

* 7

* * 9

Esto indica que los valores 0 y 8 no aparecen en el array, los valores 1, 2, 3 y 7 aparecen una vez, el valor 5 aparece dos veces, el valor 6 tres veces y el valor 4 aparece 4 veces. Escribir un programa que, tras leer las notas de los alumnos en una asignatura, genere y visualice el histograma de las notas redondeadas a valores enteros: 0, 1, 2,...10

Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios programacin en C Arrays unidimensionales / multidimensionales Las notas ledas desde el teclado son valores de tipo real y el nmero de alumnos no es fijo aunque siempre es menor de 300. Nota: Para la realizacin del histograma se tendrn en cuenta las dimensiones de la pantalla no permitindose ms de 22 filas, por tanto si la mxima frecuencia es mayor de 22 se deber mostrar el histograma a escala. 13. Realizar un programa que permita calcular el NIF., conocido el DNI. de una persona. El programa deber leer el nmero del DNI. del interesado. Seguidamente deber averiguar si es un valor vlido (debe representar un valor entre 100.000 y 99.999.999). Si la entrada es vlida se deber calcular el NIF. y representar el nmero completo con los puntos de millares y millones en las posiciones correspondientes, as como la letra del NIF al final de la cadena de caracteres separada por un espacio en blanco. Clculo de la letra del NIF.: Se obtiene el resto de la divisin del nmero del DNI. entre 23, y en funcin del resultado se asigna un carcter segn la siguiente tabla: 0=T 1=R 2=W 3=A 4=G 5=M 6=Y 7=F 8=P 9=D 10=X 11=B 12=N 13=J 14=Z 15=S 16=Q 17=V 18=H 19=L 20=C 21=K 23=E

Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios de programacin en C - Punteros

Punteros
1. Escribir un programa que efecte las siguientes operaciones. a) b) c) d) e) f) g) h) Declarar las variables enteras largas value1 y value2 e inicializar value1 a 200000 Declarar la variable lPtr como apuntador a un objeto de tipo long. Asignar la direccin de la variable value1 a la variable de apuntador lPtr. Imprima el valor del objeto al que apunta lPtr. Asgnele a la variable value2 el valor del objeto al que apunta lPtr. Imprima el valor de value2. Imprima la direccin de value1. Imprima la direccin almacenada en lPtr. Es igual el valor impreso que la direccin de value1?

Nota: %p muestra el valor de la variable como puntero 2. Crear un programa que calcule el valor de la intensidad que pasa a travs de una resistencia dada, cuando se le aplica un voltaje determinado. El programa deber estar dividido en las siguientes funciones: explicar_programa() Esta funcin mostrar una introduccin del programa por la pantalla. obtener_valores() Esta funcin pedir los valores para la resistencia y voltaje los cuales se pasarn por referencia al programa principal. calcular() Esta funcin efectuar el clculo de la intensidad a partir de la resistencia y el voltaje aplicado. imprimir_respuesta() Esta funcin se encargar de mostrar un mensaje con los resultados. Crear una funcin que intercambie el contenido de dos variables. Para ello se pasarn como parmetros las direcciones de las variables. Para probar la funcin escribir un programa que pida los datos por pantalla y muestre los contenidos despus de llamar a la funcin. Crear un programa que lea un nmero determinado (<100) de nmeros reales introducidos por teclado los almacene en un vector para mostrarlos luego en orden inverso. Nota: Para recorrer el array se deber usar aritmtica de punteros en lugar de usar los ndices del array. Escribir una funcin que tras pedir un da de la semana (de 1 a 7) devuelva un puntero a cadena con el nombre del da. La funcin contendr un array de apuntadores a cadena. Para probar la funcin se realizar un programa que pida un da de la semana en nmero y escriba el da de la semana en letra. Escribir un programa que inicialice una cadena con una palabra cualquiera. El programa deber obtener la direccin de la primera letra de la cadena. Una vez sabida esta direccin la mostrar por pantalla y realizar un bucle dando 3 oportunidades para que el usuario introduzca la direccin de la tercera letra de la cadena. En caso de no introducirla bien despus de los 3 intentos, deber sacar un mensaje indicando cul es la direccin correcta.

3.

4.

5.

6.

Dpto. Sistemas y Automtica UPV/EHU

Ejercicios programacin en C - Cadenas

Cadenas
1. Escribir un programa que pida una cadena de caracteres (de longitud mxima 80 caracteres) y devuelva la cadena escrita al revs. Ayuda: Para saber la longitud de la cadena se puede usar la funcin strlen() de la librera string.h. 2. Realizar un programa que lea una cadena de caracteres de una longitud menor de 80 y visualice los caracteres de la siguiente forma: primero, ltimo, segundo, penltimo, tercero, antepenltimo, ... 3. Escribir una funcin que cambie las letras maysculas de una cadena a minsculas y viceversa. El programa principal pedir una cadena por pantalla y se la pasar a dicha funcin esperando el resultado correcto que se mostrar por pantalla. Escribir un programa que pida primero un carcter por teclado y que luego pida una cadena. El programa calcular cuntos caracteres tiene la cadena hasta que lea el carcter introducido primero. Se deber mostrar un mensaje en pantalla con el nmero de caracteres introducidos hasta llegar al carcter primero. Escribir un programa que cuente el nmero de letras, dgitos y signos comunes de puntuacin de una cadena introducida por teclado. Ayuda: Para saber si un carcter es numrico comparar que su valor es mayor que 0 y menor que 9, para saber si es alfabtico comprobar que est entre a y z y considerar signos de puntuacin el resto de los caracteres. Nota: No considerar ni la ni las letras acentuadas, ya que tienen cdigos ASCII fuera del rango a-z 6. 7. Realizar un programa que lea una cadena de caracteres con espacios en blanco excesivos: elimine los espacios en blanco iniciales y finales y slo deje uno entre cada dos palabras. Crear un programa que pida una cadena de caracteres y devuelva otra sin signos de puntuacin ni nmeros. La cadena devuelta debe tener todos los caracteres en maysculas. Ayuda: Se pueden usar las siguientes funciones estndar de C: ispunct(), islower(), gets() En TurboC tambin existe la funcin strupr() Cdigo ASCII de A 65 a 97 8. Crear un programa que pida por pantalla una cadena de 80 caracteres de longitud mxima y que calcule el nmero de veces que aparece otra cadena determinada, tambin pedida por teclado. Como salida el programa debe escribir un mensaje con el nmero de veces que aparece la palabra dada. Ayuda: Se pueden usar las funciones siguientes: strstr(), gets() 9. Escribir un programa que compruebe si una cadena pedida por teclado es un palndromo o no. (Un palndromo es una palabra que se lee igual al derecho que al revs.) El programa no tendr en cuenta si la palabra est escrita con maysculas o minsculas. Ej: radar, 11011011, Ana, Otto

4.

5.

10. Escribir una funcin que compare 2 cadenas de caracteres devolviendo 1 si son iguales y 0 si son distintas.

Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios programacin en C - Cadenas 11. Escribir un programa que pida dos cadenas (de longitud mxima 10 caracteres) y devuelva lo siguiente: La longitud de ambas cadenas Un mensaje diciendo si ambas cadenas son iguales y si no los son que diga qu cadena es la mayor y cul la menor. Concatene la segunda cadena al final de la primera, dejando un espacio blanco entre ambas. Copia del contenido de la segunda cadena en la primera y la muestre por pantalla.

12. Escribir un programa con un men que permita las siguientes opciones: Introducir una cadena de 40 caracteres de longitud mxima Pasar a maysculas una cadena leda desde teclado. Para ello, escribir un procedimiento que transforme caracteres de letras minsculas a maysculas dejando como estn las letras maysculas. Nota: Para llevar a cabo esta operacin tener en cuenta la representacin de los caracteres en ASCII. (A 65, a 97) Pasar a minsculas una cadena desde teclado. Para ello, escribir un procedimiento que transforme caracteres de letras minsculas a maysculas. Dejando como estn las letras minsculas. Dada la cadena de caracteres introducida en el punto 1, obtener otra, de forma que la cadena resultante tenga sus caracteres a una distancia d (en el cdigo ASCII) de los caracteres de la cadena original. Se considerar el alfabeto circular, es decir que tras la letra z viene la letra A. La distancia d se introducir desde teclado. Nota: Antes de traducir la cadena se convertir en una cadena de letras minsculas, tal y como se hace en el punto 2. Salir del programa

Nota comn: En todos los casos si se intenta efectuar alguna operacin antes de introducir la cadena se deber mostrar un mensaje de error comunicando al usuario que la cadena est vaca. 13. Julio Cesar enviaba mensajes a sus legiones encriptando los mensajes mediante el siguiente algoritmo: Se escoga un nmero n como clave y se sumaba a cada letra en el alfabeto n posiciones. As, si la clave escogida fuese 5, la a pasara a ser la f, mientras que la f pasara a ser la k. Para las ltimas letras del abecedario se seguira desde el principio. As, con la clave de 5 la y pasara a ser la d. Se pide crear un programa que encripte una frase mediante este algoritmo. 14. Construir un programa que implemente una calculadora para nmeros enteros: El programa pedir primero la operacin y luego los operandos. Las operaciones vlidas sern: sumar, restar, multiplicar, dividir, salir. Si la operacin es distinta de salir se pedirn los operandos y luego se mostrar el resultado. Si la orden es distinta de las anteriores se mostrar un error diciendo que se trata de una orden desconocida. Los operandos se recogern como cadenas de caracteres y se convertirn en nmeros enteros con la funcin atoi() Otras funciones que se pueden usar sern: gets() y strcmp(). 15. Tal vez el esquema de codificacin ms famoso de todos es el cdigo Morse, desarrollado por Samuel Morse en 1832 para el sistema telegrfico. El cdigo Morse asigna una serie de puntos y rayas a cada letra del abecedario, a cada dgito y a algunos caracteres especiales (punto, coma, dos puntos y punto y coma). Ver tabla adjunta. Escribir un programa que lea una frase y la codifique en cdigo Morse. Tambin escriba un programa que lea una frase en cdigo Morse y la convierta en su equivalente en castellano. La separacin entre

Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios programacin en C - Cadenas letras se indicar mediante un espacio, mientras que la separacin entre palabras se indicar mediante 3 espacios. Carcter A B C D E F G H I J K L M N O P Q R S Cdigo .-.. -.-. -.. . ..-. --. . .. .---..-.. --. --.--. --..-. T U V W X Y Z Dgitos 1 2 3 4 5 6 7 8 9 0 Carcter Cdigo ......--..-.---.. .---..--...-......... -.... --... ---.. ----. -----

16. Escribir un programa que permita al usuario realizar las siguientes operaciones: 1. 2. 3. 4. 5. Mostrar la fecha y hora por pantalla Sacar por pantalla el contenido de un fichero ASCII. Sacar por pantalla el contenido de un directorio Limpiar la pantalla Salir del programa

Para ello se har uso de los comandos del sistema operativo: En Linux: date, cat, ls, clear En DOS: date, time, type, dir, cls

Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios programacin en C Estructuras y arrays de estructuras

Estructuras
1. Realizar un programa que permita realizar las operaciones bsicas (sumar, restar, multiplicar y dividir) nmeros complejos. El programa deber utilizar una variable que represente el nmero complejo en su forma polar, con sus dos componentes mdulo y argumento. 2. Crear un programa que lea las siguientes variables proporcionadas desde teclado con el siguiente formato: Posicin de los caracteres Campo 1-8 Matricula 9-13 Cilindrada 14-16 Potencia 17-27 Modelo 28-38 Marca Ej: BI6755CC1400 75FIESTA FORD

Y las introduzca en la correspondiente estructura. El programa deber mostrar la estructura obtenida para comprobar que la conversin ha sido correcta. Nota: Construir una funcin que muestre la estructura por pantalla que recibir la estructura pasada por referencia (para no malgastar espacio en la pila) 3. Disponemos de la informacin correspondiente a una jaula de un Zoo en una variable de tipo registro con los siguientes campos: Numero de jaula Especie del animal Nombre del animal Edad Peso Kilogramos de comida diaria Frecuencia de limpieza de jaula Estado de la salud del animal Descendencia Peligroso Entero Cadena de caracteres Cadena de caracteres Entero Real Real Entero (veces al da) Carcter (B, R, M -> Buena, Regular o Mala) S o No S o No

Por motivos de transferencia de informacin a otros organismos necesitamos descomponer la informacin contenida en esa variable en dos variables diferentes. Una va a contener los datos de mantenimiento de la jaula del animal: Numero de jaula Kilogramos de comida diaria Frecuencia de limpieza de jaula Peligroso Otra, los datos del animal: Especie del animal Nombre del animal Edad Peso Estado de la salud del animal Descendencia Cadena de caracteres Cadena de caracteres Entero Real Carcter (B, R, M -> Buena, Regular o Mala) S o No Entero Real Entero S o No

(veces al da)

Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios programacin en C Estructuras y arrays de estructuras Escribir un programa que lea una variable de informacin global y la descompongan en dos variables, una de informacin de mantenimiento y otra de informacin del animal y visualice ambas variables. Nota: Dentro de los subprogramas que considere necesarios deber haber uno, llamado descomponer, que tome un registro y lo descomponga en dos. 4. Crear un programa que permita introducir cierta informacin relativa a los vuelos diarios que parten de un aeropuerto en un array formado por registros. Cada registro contendr la siguiente informacin sobre el vuelo correspondiente: a) Nmero de vuelo (No tiene por qu coincidir con el ndice del array) b) Hora de partida: Que a su vez, tiene dos componentes: 1. Hora: 0..23 2. Minutos: 0..59 c) Origen del vuelo: Cadena de caracteres d) Destino del vuelo: Cadena de caracteres e) Nmero de pasajeros: Entero Una vez introducidos los datos de todos los vuelos se preguntar si se desea obtener informacin de algn vuelo. En caso de que el usuario responda afirmativamente se pedir el nmero de vuelo. El programa buscar el vuelo en al array y acceder a la informacin que contiene a partir de su nmero de vuelo, mostrando por pantalla todos sus datos. El programa se ejecutar repetitivamente hasta que el usuario indique que no desea obtener ms informacin de ningn vuelo. Nota: Se deben disear las funciones que visualicen un vuelo, busquen un vuelo en el array, introduzcan la informacin de un vuelo en el array, etc... 5. Una compaa utiliza aviones para fumigar las cosechas contra una gran variedad de plagas. Lo que la compaa cobra a los granjeros depende de contra qu es lo que desean fumigar, y de cuantos m2 de tierra quieren que se fumiguen de acuerdo con la siguiente tabla: Tipo1: Tipo2: Tipo3: Tipo4: Fumigacin contra malas hierbas Fumigacin contra langostas Fumigacin contra gusanos Fumigacin contra todo lo anterior 3000 Pts/ m2 6000 Pts/ m2 9000 Pts/ m2 15000 Pts/ m2

Adems, si el rea a fumigar es mayor que 10.000 m2, el granjero goza de un descuento del 7%. Se trata de escribir un programa que lea los datos de un conjunto de granjeros y al final calcule, para cada uno de ellos, la factura correspondiente. De cada granjero se tendr la siguiente informacin: Nombre Tipo de fumigacin (cdigo entre 1 y 4) Nmero de m2 que se van a fumigar. 6. Escriba un programa que genere un array de 50 nmeros enteros entre 1 y 1000 de forma aleatoria. A continuacin, partiendo de ese array genere otro array de 50 estructuras tal que cada estructuras tenga un campo para el nmero y otro (cadena de caracteres) para indicar si dicho nmero es mltiplo primo o no. Por ejemplo:

Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios programacin en C Estructuras y arrays de estructuras 203 672 23 319 426 1 ........ 862 373 273 203

203 NO

672 NO

23 SI

319 NO

426 NO

1 SI

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

862 NO

373 SI

273 NO

203 NO

Finalmente muestre en pantalla la suma de todos los nmeros del array que sean primos. 7. Escribir un programa que cree una base de datos temporal sobre el personal de agentes de polica. La base de datos almacenar cuatro datos acerca de cada persona: Nombre (Array de caracteres) Apellido (Array de caracteres) Cdigo (Entero) Categora (Entero: 0: detective, 1: ayudante, 2: director)

El programa preguntar acerca de cuntos datos se aadirn a la base de datos y luego mostrar los datos de todos los agentes introducidos. 8. Programa que implemente una agenda. Se guardarn los siguientes datos por persona: Nombre: Apellidos: Sobrenombre: Telfono: Mximo 20 caracteres. Mximo 40 caracteres. Mximo 10 caracteres. Mximo 10 caracteres.

Se crear un men con las siguientes opciones: Alta de una nueva persona a la agenda con los correspondientes datos. Eliminar a una persona de la agenda. Bsqueda de un nombre en particular (La bsqueda se har por sobrenombre) Listado de todas las personas empezando por la primera introducida (Para pasar a la siguiente se deber pulsar intro). 5. Guardar agenda en disco. 0. Salir 9. Se deber escribir un programa que permita introducir y consultar la tabla peridica de los elementos qumicos. Para ello, se construir un men con las siguientes opciones: 1. Introducir elementos de la tabla peridica 2. Listar todos los elementos de tabla peridica 3. Mostrar elemento de la tabla peridica por nmero atmico 4. Mostrar elemento de la tabla peridica por smbolo 5. Salir La opcin 1 preguntar cuntos elementos de la tabla peridica se quieren introducir e ir preguntando sucesivamente por ellos. Evidentemente, no es necesario rellenar el array con todos los elementos de la tabla peridica. La opcin 2 listar la informacin acerca de todos los elementos qumicos introducidos ordenados por nmero atmico. La opcin 3 pedir el nmero atmico del elemento que se quiere consultar y mostrar por pantalla la informacin correspondiente a dicho elemento. 1. 2. 3. 4.

Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios programacin en C Estructuras y arrays de estructuras La opcin 4 pedir el smbolo del elemento que se quiere consultar y mostrar por pantalla la informacin correspondiente a dicho elemento. Se guardar la siguiente informacin sobre cada elemento. 1. Smbolo del elemento 2. Nombre completo 3. Peso Atmico El nmero atmico vendr indicado por la posicin en el array de elementos que representa la tabla peridica, y por tanto no ser necesario almacenar esta informacin en el registro correspondiente. Nota: Se puede mejorar el programa aadiendo una opcin que permita guardar los datos en un fichero de disco.

Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios programacin en C - Ficheros

Ficheros
1. Crear un programa que abra un fichero y escriba en l dos nmeros enteros y otro programa que lea el segundo nmero escrito del fichero. Ayuda: sense las funciones fprintf y fscanf. 2. Leer completamente un fichero de texto, carcter a carcter (o en cantidades mayores, para que sea ms rpido). El programa debe contar las vocales, los caracteres alfabticos y los dgitos que hay en el fichero. Crear un programa que abra un fichero y escriba en l dos cadenas, cada una acabada con el carcter de nueva lnea y otro programa que lea la segunda cadena escrita en el mismo fichero. Comprobar que el fichero existe y visualizar su contenido con un editor de textos (p.e. el Block de Notas de Windows) Nota: Escribir una cadena con espacios intercalados. Ayuda: sense las funciones fputs y fgets. Consultar la ayuda. 4. 5. Escribir un programa que tome caracteres de teclado y, de uno en uno, los escriba en un fichero cuyo nombre es previamente pedido por pantalla. Escribir un programa que saque por pantalla el contenido de un fichero cuyo nombre es pedido por pantalla. Nota: El nombre del fichero debe proporcionarse mediante la lnea de argumentos al llamar al fichero. Es decir: C:> MostrFic fichero.txt 6. Escribir un programa que comprueba que un fichero de cdigo contiene el mismo nmero de { que de } en su cdigo. En caso de que no sea as el programa mostrar un mensaje indicando que el nmero de { es distinto que el nmero de }. Escribir un programa que use dos ficheros: uno de lectura y otro de escritura. El programa leer los caracteres de un fichero, y tras una operacin de cambio de maysculas a minsculas y viceversa, escogida por el usuario, los escribir en un segundo fichero. Escribir el cdigo necesario en el programa de la agenda de la leccin de estructuras (Ejercicio 8) para que la informacin de la agenda pueda leerse desde disco al arrancar el programa y actualizarse su contenido en disco cuando el usuario lo requiere con la opcin de Guardar. Escribir un programa que permita visualizar el contenido de un fichero pasado desde la lnea de comando en formatos hexadecimal y carcter, siguiendo el esquema del ejemplo: C:> Ver Fichero.txt 48 6F 6C 61 2C 20 73 6F-79 20 75 6E 61 20 63 61 64 65 6E 61 0D 0A 59 20-79 6F 20 6F 74 72 61 0D 0A EB 11 80 3E AF D2 00-74 03 E8 B2 E8 E8 FC E6 Hola, soy una ca dena..Y yo otra. ....>...t.......

3.

7.

8.

9.

Ayuda: Para averiguar si un carcter se puede imprimir existe la funcin isprint(). 10. Escribir un programa que pida el nombre de un fichero y lo borre de disco. Ayuda: Usar la funcin remove(). 11. Crear una base de datos almacenada en un fichero para personal universitario. Cada elemento de la base de datos constar de 3 campos: Nombre, apellido y edad.

Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios programacin en C - Ficheros Adicionalmente, ser necesario crear otro programa que lea los registros de la base de datos y los muestre secuencialmente por pantalla. 12. Escribir un programa que haga una conversin de un tipo de formato de fichero a otro. El formato de partida ser el siguiente: Posicin de los caracteres 1-8 9-13 14-16 17-27 28-38 Ej: BI6755CC1400 75FIESTA FORD Campo Matricula Cilindrada Potencia Modelo Marca

y el formato de destino sern las correspondientes estructuras, es decir: Matrcula Cilindrada Potencia Modelo Marca 8 caracteres entero entero 10 caracteres 10 caracteres

Nota: Los datos de partida pueden introducirse con el programa 2. 13. Una entidad bancaria posee en un fichero la siguiente informacin para un conjunto de personas: Nombre. Nmero de cuenta. Crdito solicitado. El programa funcionar basndose en un men con las siguientes operaciones: 1.2.3.4.Aadir un crdito al archivo Visualizar en pantalla la informacin correspondiente al crdito mayor Copiar en otro fichero el conjunto de personas que hayan solicitado un crdito superior a cierta cantidad establecida por el banco (la cual deber ser introducida por teclado). Visualizar todo el contenido de un archivo

14. Se pide crear un programa que a partir de la frmula de un compuesto qumico, supuestamente puro, y su peso en gramos presente un informe con la cantidad en gramos de cada elemento del compuesto. Evidentemente, el programa deber consultar la informacin contenida en la tabla peridica. Esta informacin deber estar disponible en un fichero que el programa leer al empezar a ejecutarse. La informacin de la tabla peridica que ser relevante, por ejemplo para el elemento qumico hierro ser la siguiente: Nmero atmico 26 Smbolo del elemento qumico Fe Nombre completo del elemento Hierro Peso atmico 55,87 Nota 1: Para todas las ejecuciones del programa los datos de la tabla peridica debern estar disponibles por el programa. Se deja a eleccin de los alumnos el mtodo de creacin del fichero con los datos de la tabla peridica. Nota 2: Se recuerda que el nmero atmico indica la posicin de un elemento en la tabla peridica. Habr que pensar cmo se organiza esta informacin para que el programa pueda funcionar de la forma ms sencilla posible.

Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Ejercicios programacin en C - Ficheros El programa pedido presentar el siguiente men: 1. 2. 3. 0. Donde: Opcin 1 mostrar un listado con todos los elementos de la tabla peridica. Dado que la tabla peridica tiene 118 elementos y slo hay 40 lneas por pantalla, el programa deber mostrar los elementos en grupos de 40 lneas para poder visualizar la informacin de todos los elementos. Ejemplo de la primera pantalla: N. Atmico Smbolo Nombre 1 H Hidrgeno ... 38 Sr Estroncio Pulsa una tecla para continuar Peso Atmico 1.001 87.62 Listar tabla peridica Mostrar elemento de la tabla peridica Mostrar composicin del compuesto Salir

Opcin 2 mostrar toda la informacin de un elemento qumico. Para ello permitir buscar un elemento bien por nmero atmico o por smbolo. As, previamente se preguntar si se busca el elemento por nmero atmico o por smbolo: INFORMACIN DEL ELEMENTO QUMICO Nmero atmico: Smbolo: Nombre completo: Peso atmico: 26 Fe Hierro 55.85

Opcin 3 permitir obtener la composicin del compuesto qumico a partir de la frmula y del peso del compuesto. Se deber comprobar que la frmula escrita es vlida, esto implicar comprobar que TODOS los elementos escritos existen en la tabla peridica y que se ha seguido el formato: Elemento[Nmero de tomos]Elemento[Nmero de tomos]... Tal y como sucede en la notacin usual el nmero de tomos es opcional, sobreentendindose en caso de que no haya ningn nmero especificado que slo hay un tomo del elemento en el compuesto. La frmula podr tener un mximo de 10 elementos y un mnimo de 1. Nota 3: Se recuerda que todos los tomos empiezan por letra mayscula y que algunos tomos tienen una letra minscula mientras que otros no. No hay tomos de tres letras. Una vez que se haya comprobado que la frmula es correcta y se hayan identificado tanto los elementos componentes como el nmero de tomos de cada tipo en la molcula el programa se presentar el siguiente informe: COMPOSICIN Compuesto qumico Peso (en gramos): Gramos de Silicio: Gramos de Oxgeno SiO2 1000 467,5 532,5

Dpto. Ingeniera de Sistemas y Automtica UPV/EHU

Das könnte Ihnen auch gefallen