Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2º INGENIERÍA QUÍMICA
OBJETIVOS:
El objetivo de la asignatura es introducir a los alumnos en el mundo de la
informática más allá del punto de vista del usuario. Para ello se imparten conocimientos
avanzados sobre arquitectura de computadores, sistemas operativos y lenguajes de
programación.
TEMARIO TEÓRICO:
Tema 1. Introducción a la informática.
Conceptos básicos. Origen y evolución de los sistemas de cálculo. Ordenadores
personales. Estudio comparativo. Sistemas inteligentes. El PC. Memorias.
Tema 9. Operadores.
Operadores Aritméticos. Incremento y decremento. Operadores de relación.
Operadores de comparación. Operadores lógicos. Operadores de acceso a los
objetos. Dirección de un objeto. Tipos de direccionamiento. Conversión de tipos
de variables. Prioridad de operadores. Evaluación de expresiones.
PRÁCTICAS:
- Sesiones 1–2: Arquitectura del PC.
- Sesiones 3–4: Entorno de programación.
- Sesiones 5–12: Programación en C.
- Sesiones 13–15: Sistema operativo Linux.
Temario
• Arquitectura del PC
• Estructura de Sistemas de Computación
• Sistemas Operativos - Linux
• Lenguajes de Programación
• Programación en C
• Estructura de Programa
• Elementos del Lenguaje
• Sentencias de Control
• Modularidad
• Tipos de Datos
• Ficheros
• Sistemas Básicos de Comunicación
Bibliografía
Sistemas Operativos
Silberschatz, Galbin
Ed. Pearson, Addison Wesley Longman
Programación Estructurada en C
Antonakos, Mansfield
Ed. Prentice Hall
Programación en C
Joyanes, Zahonero
Ed. McGraw Hill
Sistemas Informáticos
Fede Pérez
Índice
TEMA - Introducción a los Sistemas de Computación
1. - Conceptos Básicos
2. - Origen y Evolución de los Sistemas de Cálculo
2.1 – Abaco
2.2 – Calculadoras Mecánicas
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 Evolución de los Computadores
7. – Futuro de los Ordenadores
Definiciones
Informática: trata de la adquisición, representación, tratamiento y transmisión de la
información.
(Según la Real Academia Española de la Lengua) Es el conjunto de conocimientos
científicos y técnicos para hacer posible el tratamiento automático de la
información por medio de computadoras electrónicas
Ordenador Dedicado: Está diseñado para una tarea específica o para un rango
reducido de tareas
TIPOS DE ÁBACOS
China suan pan 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
Japón soroban 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
Roma ? Se utiliza piedra caliza o mármol que se deslizaban sobre ranuras de superficie plana, las
pequeñas piedras se les denominó con el nombre de calculi.
Rusia stchoty ?
Evolución – Calculadoras Mecánicas 1
La Calculadora de Sckickard
En 1623 Wilhelm Sckickard construye la
primera máquina de calcular
La Pascalina
1.642 Blaise Pascal. Conjunto de discos
dentados, cada uno de los cuales tiene 10
divisiones, que representaban un dígito. Es
capaz de realizar sumas y restas
La Calculadora Universal
1694 Gottfried W. Leibniz. Perfecciona la
máquina de Pascal añadiéndole la
multiplicación y división.
La Lógica Matemática
George Boole (1815-1864), es el fundador
de la teoría de la lógica matemática.
EDSAC (1.949)
M. Wikes, de la Universidad de Cambridge
UNIVAC (1.951)
Eckert y Mauchly, primera computadora adquirida con
fines lucrativos.
Datos Resultados
Entrada U.A. Salida
Modelo de C.P.U.
Computadora
según
Von Newman Memoria
Datos Resultados
Entrada U.A. Salida
Programa
Generaciones de Ordenadores 1
1ª Generación (1940-52)
9 Tecnología empleada: Válvulas de vacío
9 Uso: Científico y militar.
9 Programación: Modificando directamente los valores de los circuitos de la máquina. No
existían los lenguajes de programación, ni siquiera el ensamblador.
9 Ordenadores caros, debido a la corta vida de la válvulas de vacío y al gran calentamiento,
así como al gran consumo de energía eléctrica.
9 Ordenadores lentos.
9 Capacidad de almacenamiento muy pequeña.
9 Incapacidad de ejecutar más de una tarea a la vez.
Generaciones de Ordenadores 2
2ª Generación (1952-64)
9 Tecnología empleada: Transistor
9 Disponía ya de una programación previa, de un Sistema Operativo, capaz de interpretar
instrucciones escritas en lenguajes de programación como COBOL o FORTRAN.
9 Comienza el desarrollo de periféricos 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 cálculo
9 Reducción de tamaño
9 Reducción del consumo a energía y potencia disipada
9 Tiempo de vida media del transistor superior a la válvula
9 Abaratamiento
Algunas de las realizaciones son: Sperry Rand 1207 | IBM 700 | IBM 1400 | 1700
Generaciones de Ordenadores 3
3ª Generación (1964-75)
9 Tecnología empleada: Circuito integrado (lámina de silicio embutida en plástico). Se
utilizan materiales semiconductores en lugar de los núcleos de ferrita en la construcción
de memorias.
9 Se mejoran los lenguajes de programación y empezaron a aparecer programas
comerciales, con lo que un usuario no tenía que programar sus aplicaciones.
9 Capacidad de multiprogramación, con lo cual los ordenadores son capaces de ejecutar
varias tareas al mismo tiempo.
9 Aumento en la velocidad de cálculo
9 Tamaño disminuye
Generaciones de Ordenadores 4
4ª Generación (1975-?)
9 Tecnología empleada: Circuitos de alta escala de integración. Microprocesadores.
9 Es el producto de una serie de avances tanto en el hardware, y su tecnología de
fabricación, como en el software y sus posibilidades de aplicación:
o Nuevas tecnologías de fabricación de semiconductores que conducen a velocidades de
transmisión cada vez mayores y mayor capacidad de almacenamiento.
o Aparición de paquetes software, que obedecen a nuevas concepciones y situaciones
específicas: bases de datos, diseño asistido, tratamiento de texto, ...
o Nuevas memorias de al almacenamiento: tecnologías Winchester, y burbujas magnética
o Aparición de los ordenadores personales
o Más lenguajes de alto nivel y herramientas informáticas.
o Desarrollo de periféricos 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ª Generación (?)
9 Arquitectura diferente a la propuesta por Von Neumann
9 Ordenadores inferentes
9 Ordenadores de transputers
9 Ordenador óptico
9 Máquinas neuronales
9 Sistemas informáticos distribuidos
El Ordenador Personal
9 Años 70, primer microprocesador, el INTEL 4004, posibilidad de construcción de un
ordenador utilizable por un solo usuario
9 1977, S. Wozniak y S. Jobs, fundaron una empresa llamada Apple
9 1.981, IBM PC (Personal Computer)
9 Evolución 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)
9 Mediados de los 80, comienza el desarrollo de redes de computadoras personales
Estudio Comparativo de la Evolución de los
Computadores
Potencia
Tamaño
Precio
Tiempo
Arquitectura y Componentes del
PC
Sistemas Informáticos
Fede Pérez
Índice
TEMA – Arquitectura y Componentes del PC
1. – Componentes Básicos
1.1 – Funcionalidad
1.2 – Emplazamiento
1.3 – Características más Importantes
2. – Evolución
4. - Conclusiones
El PC - Disposición
Minitorre Sobremesa
Ö Formatos
9 Baby AT
8 Conector grueso del teclado.
8 Dificultad al instalar tarjetas de
expansión largas.
8 Mantenimiento farragoso.
9 ATX
8 Mejora la flexibilidad,
integración y funcionalidad.
Formato ATX.
8 Reorganización de la
distribución de componentes.
8 Disminución de la longitud de
los cables, mejora de la
ventilación.
8 Conectores PS/2
8 USB
Componentes de la Placa Base
Conectores en Y
Conectores P6
El Chipset
La Memoria
Ö Memoria principal:
9 Más 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. Organización en
bancos.
Ö Memoria caché:
9 Acelera los procesos de la
CPU, almacén últimos datos
transferidos.
9 Emplazamiento sobre placa
o módulos COAST.
Módulo DIMM.
Papel de la memoria en un PC
Ö Al referirnos a “memoria”
generalmente nos referimos a la
memoria RAM.
Ö Además de la RAM en un PC
encontramos otros muchos tipòs de
memoria
9 SDRAM (RAM)
9 ROM FLASH (BIOS)
9 SRAM (cache)
9 etc
TIPOS MEMORIA
Volátiles No volátiles
FIFO RAM ROM
SGRAM SDRAM
SDRAM DDR
BIOS-Pila.
El Procesador (II)
Ö Principales Características:
9 Velocidad.
9 Tipo de zócalo.
9 Memoria Caché.
9 Instrucciones Especiales.
9 Bus de comunicación.
9 Tecnología de fabricación.
Buses de Expansión (I)
PCI Bus
Periféricos Internos
9 Tarjetas de vídeo
9 Tarjetas de sonido
Ö DISQUETERA
9 Sólo han existido dos formatos
considerados como estándar, el
de 5 ¼ y el de 3 ½.
Ö CD-ROM - DVD
9 Pueden almacenar gran
información, aunque menor que
un disco duro, pero la velocidad
de recuperación de información
y la capacidad es menor.
9 Hay lectores, grabadores y
regrabadores
Ö TARJETAS DE VÍDEO
9 Los diferentes programas, envían
sus salidas a través de las
llamadas tarjetas de vídeo a la
pantalla.
9 Hoy en día, son gráficas e
incluyen aceleración por
hardware.
Ö TARJETAS DE SONIDO
9 Permiten escuchar música 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 música.
Puertos (I)
Puertos (II)
Periféricos Externos
Teclados y Ratones
Monitores
Ö CRT
Ö LCD (TFT)
Impresoras
Ö Matriciales
Ö Agujas
Ö Inyección de Tinta
Ö Laser
Escaners
Conclusiones
Sistemas Informáticos
Fede Pérez
Índice
TEMA 2 – Estructura General de un Sistemas de Computación
1. - Introducción
2. - Sección Primaria de Almacenamiento. Memoria Principal
2.1 – Estructura General
2.2 – Organización Interna de la Memoria
2.3 – Direccionamiento
2.4 – Operaciones de Lectura/Escritura en Memoria
2.5 – Propiedades Fundamentales de las Memorias
2.6 – Parámetros de Tiempo en Memoria
2.7 – Tipos de Memoria
2.8 – Jerarquías de Almacenamiento
3. - Unidad de Control de Procesos - C.P.U. –
3.1 – Unidad de Control
3.2 – Unidad Aritmético-Lógica - A.L.U. –
4. - Buses
4. - Descripción General
5. – Fases de Ejecución de una Instrucción
5.1 – Fase FETCH - Búsqueda o Lectura de una Instrucción
5.2 – Fase EXECUTE - Ejecución
Organización Básica de un SC
Lectura Escritura
1- Dirección de la palabra solicitada 1- Dirección de la palabra solicitada
es recogida en registro de es recogida en registro de
direcciones direcciones
2- Señal de control la operación 2- En el bus de datos la información
deseada (lectura) a escribir en memoria, quedando
3- La memoria decodifica la almacenado en el registro de
dirección, activa la celda datos de la memoria
correspondiente y deposita el 3- Señal de control la operación
dato en el registro de palabra; de deseada (escritura)
ahí la información pasa al bus de 4- El dato del registro de datos de
datos la M.P. se almacena en la célula
de memoria activada
Jerarquía de Almacenamiento
Registro accionador
de acceso directo
Almacenamiento
pista eje
sector
Caché
Memoria Principal
Disco Electrónico
Cabeza de
Almacenamiento
lectura y
secundario
Disco Optico
brazo
Cinta Magnética plato
Tasa de Transferencia: es la rapidez con que Latencia Rotacional: es el tiempo que el sector
fluyen los datos de la unidad de disco a la deseado tarda en girar hasta quedar debajo de
CPU la cabeza de disco
Tiempo de Posicionamiento o Tiempo de Acceso Controladores de Disco: Se encargan de La
Aleatorio: es el tiempo que tarda en mover el transferencia de datos por los buses
brazo del disco al cilindro deseado
Unidad de Control – Acepciones y Funciones
Acepciones Funciones
1- Microprocesador (µP): la Unidad 1- selecciona e interpreta las
Aritmético-Lógica (ALU) y la Unidad Central
instrucciones del programa
(UC)
Registro de Instrucciones
Modos de Direccionamiento
1- Directo:
Absoluto
Relativo
2- Indirecto
3- Inmediato
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
Líneas de Control
Líneas de Estado
Descripción General
Fases de Ejecución de una Instrucción
Sistemas Informáticos
Fede Pérez
Índice
TEMA - Lenguajes de Programación
1. - Programación
2. - Objetivos de la Programación
3. – Tipos de Lenguajes
3.1 – Lenguaje Máquina
3.2 – Lenguajes Ensambladores
3.3 – Lenguajes del Alto y Bajo Nivel
4. - Procesadores de Lenguajes
4.1 – Compiladores
4.2 – Intérpretes
5. - Herramientas de Programación
6. – Desarrollo de Programa que Suma Dos Números
Programación
Definición
Labor de desarrollar programas de
computador
Enunciado Programa
Problema del Problema Algoritmo ( en lenguaje de
( algorítmico ) Programación )
Objetivos
1- Corrección
2- Claridad
3- Eficiencia
Análisis y
Especificación
Diseño
Codificación
Validación y
pruebas
Operación y
Mantenimiento
Documentación
Lenguajes de Programación
Progra ma Objeto
Progra ma Fuente - Ejecutable -
01011100
---------------------------------------------------------
1111110001110000---------------------------------
---------------------------------------------------------
Datos Prg. Objeto Ejecuta ble Resultados
Datos 1 Programa Objeto 2 Resultados 1 ---------------------------------------------------------
---------------------------------------------------------
01110101
00000011110001110--------------------------------
Lenguaje Máquina
Lenguaje Máquina 2
Lenguaje Máquina
0101110111011001----------------------------------
--------------------------------------------------------
Lenguaje
LenguajeMáquina
Máquina11
Máquina Base 1
1111110001110000----------------------------------
--------------------------------------------------------
Lenguaje
LenguajeMáquina
Máquina22
Máquina Base 2
Lenguaje Ensamblador
Programa
Programa Fuente Ejecutable
Máquina Base
Lenguaje
LenguajeMáquina
Máquina
Máquina Base
Procesadores de Lenguajes
0101110111011001--------------------------------- 01111010
--------------------------------------------------------- --------------------
Tra ductor 1 --------------------
---------------------------------------------------------
--------------------
0111010101110001--------------------------------- --------------------
--------------------
/* PROGRA -- Lenguaje Máquina 1 --------------------
#include --- --------------------
--------------------
11001000
void main ( )
{
int Cont, Edad --
Progra ma Ejecuta ble
-----------------------
printf (“El resul -
Máquina Base 1 ( en la má quina 1 )
}
0111101111011101--------------------------------- 01111111
Progra ma Fuente --------------------------------------------------------- --------------------
PROGRAMA.C Tra ductor 2 --------------------
---------------------------------------------------------
--------------------
1111010101010111--------------------------------- --------------------
--------------------
Lenguaje Máquina 2 --------------------
--------------------
--------------------
11011011
N OTA: Un compila dor (tra ductor) cruzado es
ca pa z de Genera r código para una Progra ma Ejecuta ble
má quina diferente de a quella en la
que se ejecuta
Máquina Base 2 ( en la máquina 2 )
Intérpretes
Programa Fuente
PROGRAMA.BAS
REM PROGRAMA.BAS
Lenguaje
LenguajeFuente
Fuente
0101110111011001----------------------------------
--------------------------------------------------------
Intérprete
---------------------------------------------------------
0111010101110001---------------------------------
Lenguaje
LenguajeMáquina
Máquina
Máquina Base
Compiladores
Compilado
/* PROGRA --
#include -- 0101110111011001--------------------------------- 01011100
--------------------------------------------------------- ---------------------
Compilador ---------------------
void main ( )
{ ---------------------------------------------------------
0111010101110001---------------------------------
---------------------
01110101 Ejecución
int Cont, Edad --
----------------------- Lenguaje Máquina
printf (“El resul - Programa Objeto Progra ma Objeto
} - N o ejecuta ble - - Ejecuta ble -
PROGRAMA.OBJ
PROGRAMA.EXE
Progra ma Fuente
PROGRAM A.C
Máquina Base 01111010
--------------------
--------------------
--------------------
Datos -------------------- Resultados
--------------------
--------------------
Enlazado --------------------
--------------------
11001000
01011100 Lenguaje Máquina
---------------------
--------------------- 0101110111011001--------------------------------- 01111010
---------------------------------------------------------
--------------------- --------------------
01110101 Enlaza dor (Linker) --------------------
--------------------------------------------------------- --------------------
0111010101110001--------------------------------- --------------------
PROGRAM A.OBJ --------------------
Lenguaje Máquina --------------------
-------------------- Máquina Base
01111000 --------------------
--------------------- 11001000
---------------------
---------------------
11010001
Progra ma Objeto
Máquina Base - Ejecuta ble -
RUTIN AS.LIB
PROGRAMA.EXE
Compiladores
Caso General
0101110111011001------------- 01011100
/* PROGRA -------------------------------------
Compilador
---------------------
#include ---------------------
-------------------------------------
void main ( )
0111010101110001
---------------------
{ Lenguaje Máquina
01110101
int A --
printf (“El res-
} Progra ma Objeto
PROG_1.OBJ
Progra ma Fuente
PROG_1.C Máquina Base 11110000
---------------------
---------------------
--------------------- 0101110111011001------------- 01111010
-------------------------------------
--------------------
.../... 01100111
Progra ma Objeto
Enla zador (Linker)
-------------------------------------
0111010101110001
--------------------
--------------------
PROG_2.OBJ Lenguaje Máquina --------------------
--------------------
0101110111011001------------- 00010000 --------------------
/* PROGRA -------------------------------------
Compilador
--------------------- --------------------
void InterCamb (int ------------------------------------- --------------------- --------------------
{ 0111010101110001
--------------------- Máquina Base 11001000
int Temp --
---------------------
Lenguaje Máquina 01011111
return -----------
} Progra ma Objeto
PROG_N .OBJ Progra ma Objeto
Progra ma Fuente - Ejecutable -
PROG_N .C 00010011
Máquina Base
--------------------- PROGRAMA.EXE
---------------------
---------------------
01100001
Progra ma Objeto
RUTIN AS.LIB
01011100
---------------------
--------------------- 0101110111011001---------------------------------- 01011100
--------------------------------------------------------
--------------------- --------------------
01110101 Enlazador (Linker) --------------------
--------------------------------------------------------- --------------------
0111010101110001--------------------------------- 01110101
PROGR_1.OBJ --------------------
Lenguaje
LenguajeMáquina
Máquina --------------------
--------------------
01111000 --------------------
--------------------- 11001000
---------------------
---------------------
11010001
Programa Ejecutable
Máquina Base PROGR_1.EXE
RUTINAS.LIB
11100100
---------------------
01110000 0101110111011001---------------------------------- 11100100
--------------------------------------------------------
--------------------
Enlazador (Linker) 01110000
PROGR_2.OBJ --------------------------------------------------------- --------------------
0111010101110001--------------------------------- --------------------
-------------------- Código de las rutinas
Lenguaje
LenguajeMáquina
Máquina --------------------
11001000
(copiado de la Biblioteca)
01111000
---------------------
---------------------
---------------------
11010001
Programa Ejecutable
Máquina Base PROGR_2.EXE
RUTINAS.LIB
Librerías: Bibliotecas Estáticas
Ejecución utilizando bibliotecas estáticas
01111010
--------------------
--------------------
--------------------
PROGR_1.EXE 01110101
--------------------
--------------------
-------------------- Código
-------------------- de las rutinas
01111010 11001000
--------------------
-------------------- 11100100
-------------------- --------------------
PROGR_1.EXE 01110101 01110000
-------------------- PROGR_2.EXE -----------------------
-------------------- -----------------------
-------------------- Código ----------------------- Código
-------------------- de las rutinas ----------- de las rutinas
11001000 11001000
Lenguaje
LenguajeMáquina Lenguaje
Máquina LenguajeMáquina
Máquina
01111000
11100100 ---------------------
--------------------- ---------------------
01110000 0101110111011001---------------------------------- 11100100 ---------------------
--------------------------------------------------------
-------------------- 11010001
Enlazador (Linker) 01110000 -------
PROGR_2.OBJ ---------------------------------------------------------
0111010101110001--------------------------------- ”Uso de Librería RUTINAS.DLL
Lenguaje Rutinas.DLL”
LenguajeMáquina
Máquina
01111000
--------------------- Programa Ejecutable
---------------------
--------------------- PROGR_2.EXE
11010001
Máquina Base
RUTINAS.DLL
Librerías: Bibliotecas Dinámicas
Ejecución Utilizando Bibliotecas Dinámicas 01011100
PROGR_1.EXE -------------------------
-------------------------
-------------------------
01110101-------------
”Uso de Librería
Rutinas.DLL”
01011100
PROGR_1.EXE ------------------------- 11100100
------------------------- --------------------
------------------------- 01110000 -------
01110101------------- PROGR_2.EXE
”Uso de Librería
”Uso de Librería
Rutinas.DLL”
Rutinas.DLL”
01111000 01111000
------------------------- -------------------------
------------------------- RUTINAS.DLL -------------------------
RUTINAS.DLL ------------- -------------
11010001 11010001
Lenguaje
LenguajeMáquina Lenguaje
Máquina LenguajeMáquina
Máquina
Herramientas de Programación
Programa Ejecutable
PROGRAMA.EXE
01111010
------------------------------------- Resultados
Datos -------------------------------------
-------------------------------------
-------------------------------------
11001000
Lenguaje Máquina
0101110111011001---------------------------------
---------------------------------------------------------
Entornos de Programación
Máquina Base /* PROGRA
0101110111011001--------------------------------- #include ---
--------------------------------------------------------- Progra ma
Depuradores
void main ( ) Fuente
Editor {
PROGRAM A.C
int A --
--------------------------------------------------------- printf (“El res-
0111010101110001---------------------------------
}
/* PROGRA
#include --- 1101110111011111---------------------------------
Progra ma --------------------------------------------------------- 01011100 Progra ma
Fuente void main ( ) ---------------------
{ Compilador Objeto
PROGRAMA.C int A --
---------------------
printf (“El res- --------------------------------------------------------- 01110101 PROGRAMA.OBJ
} 0000010101110001---------------------------------
Progra ma
01011100
Objeto
--------------------- 01111010
0001100110010001---------------------------------
--------------------- --------------------------------------------------------- --------------------
PROGRAMA.OBJ
01110101 -------------------- Progra ma
Enlazador (Linker) -------------------- Ejecuta ble
--------------------------------------------------------- -------------------- PROGRAM A.EXE
Progra ma Objeto 01111101 1111011101100001---------------------------------
Libreria de rutina s --------------------- 11001000
RUTIN AS.LIB 00000100
01111010
Progra ma --------------------
Ejecuta ble -------------------- 0001110000011000--------------------------------- Resultados
PROGRAMA.EXE -------------------- ---------------------------------------------------------
--------------------
11001000 Depurador
---------------------------------------------------------
0100000101000001--------------------------------- TRAZA DEL
Datos PROGRAMA
Suma de dos Números 1
Diseño
Sumar
dos números
Basic
REM
REM Programa en BASIC: SUMA_BAS.BAS
REM
Pascal C
(* Programa en PASCAL: SUMA_PAS.PAS *) /* Programa en C: SUMA_C.C */
Sistemas Informáticos
Fede Pérez
Índice
TEMA - Lenguaje de Programación C
1. - Introducción
2. - Conceptos Básicos
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 Nacimiento años 70 – laboratorios Bell Telephone – junto con UNIX
9 UNIX – Ken Thompson y Dennis Ritchie
9 Transferencia PDP-7 PDP-9, PDP-11
9 1970 (Ken Thompson) definición del lenguaje B (proviene del BCPL)
9 1972 (Dennis Ritchie) definición del lenguaje C
9 1973 (UNIX versión 5) 90% en C para PDP-11
9 Años 80 ANSI C estándar ISO
9 Mediados de los 80 C++ estándar ISO 1998
Carencias
9 Manejo de tablas y cadenas de caracteres
9 Multiprogramación, control de procesos, sincronización
9 Entrada/Salida, ficheros
Solución
Programoteca Librería estándar
Componentes del Lenguaje C
Función
División un programa muy grande en una serie de módulos mucho más
pequeños y manejables. A estos módulos se les ha sólido denominar de
distintas formas (subprogramas, subrutinas, procedimientos, funciones, etc.)
según los distintos lenguajes.
Programa Principal
Función concreta que juega el papel principal y que empieza a actuar
Esta función en el lenguaje C ha de llevar por titulo o nombre el de "main"
Estructura General de un Programa II
#include
Directivas de Preprocesador
#define
- Prototipos de funciones
Declaraciones Globales
- Variables globales
principal.C principal.EXE
.LIB
Realización de un Programa en C – Modular
Compilador
principal.C principal.O
Editor
auxiliar.C auxiliar.O
Enlazador (Linker)
objeto.O principal.EXE
libreria.LIB
.LIB
Depuración de un Programa
Errores
9 Errores de Sintaxis Ö Edición
9 Errores Lógicos Ö Algoritmo incorrecto
9 Errores de Regresión Ö Solución de errores
9 Errores de Ejecución Ö 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
Función concreta que juega el papel principal y que empieza a actuar
Esta función en el lenguaje C ha de llevar por titulo o nombre el de "main"
Primer Programa C
Edición (Fichero hola.c)
#include <stdio.h>
main()
{
printf(”Hola mundo!!\n”);
}
Compilado
Ejecución
Finalización de un Programa
Modos de Finalización de un Programa
1. Se llega al final del programa principal (función main)
2. La función main realiza una llamada a la sentencia return()
3. Cualquier función realiza una llamada a la función exit()
Ejemplo 1
#include <stdio.h> Ejemplo 3
main() #include <stdio.h>
{ #include <stdlib.h> /* necesario para
printf(”Esto sí se ejecuta\n”); exit() */
} main()
{
printf(”Esto sí se ejecuta\n”);
exit(0);
Ejemplo 2 printf(”Esto no se ejecuta\n”);
#include <stdio.h> }
main()
{
printf(”Esto sí se ejecuta\n”);
return(0);
printf(”Esto no se ejecuta\n”);
}
Elementos Base
Existen seis clases de componentes sintácticos o
tokens en el vocabulario del lenguaje C:
1. Identificadores
2. Palabras Reservadas
3. Constantes
4. Operadores
5. Separadores
6. Comentarios
Identificadores I
Definición
Los identificadores son nombres que permiten señalar, mencionar, hacer
referencia a los diferentes objetos tratados por el programa. En particular a:
¾ las variables
¾ las funciones
¾ las constantes simbólicas
Reglas ANSI C
1. Un identificador se forma con una secuencia de letras (minúsculas de la a a la z; mayúsculas de
la A a la Z; y dígitos del 0 al 9).
3. Un identificador no puede contener espacios en blanco, ni otros caracteres distintos de los citados,
como por ejemplo (* , ; . : - + etc.)
4. El primer carácter de un identificador debe ser siempre una letra o un (_), es decir, no puede ser
un dígito.
5. Se hace distinción entre letras mayúsculas y minúsculas. Así, Masa es considerado como un
identificador distinto de masa y de MASA.
Identificadores II
Ejemplos
Identificadores Correctos Identificadores Incorrectos
I 8080
BUFFER 1er
Direcci6n_Memoria Bus de datos
cas_01 cas:01
Z80 CP/M
Palabras Reservadas
Definición
Palabras clave necesarias para la sintaxis y semántica del lenguaje:
¾ especificadores de tipo de objeto
¾ especificadores de clase de memoria
¾ instrucciones de control
¾ operador simbólico
¾ etiquetas de control
Constantes
Definición
Valores que permanecen fijos durante la ejecución de un programa:
¾ números enteros
¾ números reales
¾ caracteres
¾ serie de caracteres
¾ expresiones con constantes
¾ constantes simbólicas
Tipos de Constantes
1. Constantes numéricas. Son valores numéricos, enteros o de punto flotante. Se permiten
también constantes octales (números enteros en base 8) y hexadecimales (base 16).
2. Constantes carácter. Cualquier carácter individual encerrado entre apóstrofos (tal como 'a', 'Y',
')', '+', etc.) es considerado por C como una constante carácter.
¾ Base Decimal: Expresión en formato normal. Ejemplo: 230 Tabla de Caracteres de Control
¾ Base Octal: Comienza por cero. Ejemplo: 0346
nueva línea NL o LF \n
¾ Base Hexadecimal: Comienza por cero-x. Ejemplo: 0xE6 tabulaci6n TAB o HT \t
retroceso BS \b
retorno de carro CR \r
avance de página FF \f
Definición de Constantes Mediante Directiva de Preprocesador antibarra \ \\
ap6strofe ‘ \’
Es posible definir constantes asociadas a un identificador por medio de comillas “ \”
sonido de alerta BELL \a
la directiva #define carácter nulo NULL \0
Ejemplo: octeto binario ddd \ddd
#define PI 3.141593
#define MAXIMO 255
#define MAXINT 32767
Operadores
Definición
Los operadores pueden estar representados por uno o por dos caracteres
especiales, por una palabra reservada, o por un especificador de tipo puesto
entre paréntesis.
Categorías de Operadores
¾ Operadores Monádicos o Unarios: preceden a un identificador, a una expresión o a una constante
¾ Operadores Diádicos o Binarios: establecen la relación entre dos términos o expresiones
¾ Operadores Triádicos o Ternarios: ponen en relación tres términos o expresiones
Tabla de Operadores
Unarios Binarios Ternarios
- == = ? :
* + != +=
& - > -=
! * >= *=
~ / < /=
++ % <= %=
-- | || |=
(tipo) & && &=
sizeof ˆ ˆ=
>> >>=
<< <<=
. ->
Separadores
Definición
Se puede considerar que los separadores están formados por:
¾ delimitadores
¾ espacios en blanco
Delimitadores
Son signos especiales que permiten al compilador separar y reconocer las
diferentes unidades sintácticas del lenguaje
Espacios en Blanco
Pueden estar constituidos por uno o varios caracteres "espacios" o "blancos";
de uno o varios caracteres de "TABulación", y del carácter de avance a la
línea siguiente, denominado normalmente nueva línea (newline). Estos
caracteres sirven para delimitar las diversas unidades sintácticas.
Comentarios
Definición
Los llamados comentarios o memorandums, propiamente no forman parte de
los elementos base del lenguaje, ya que son ignorados por el compilador y
sólo reflejados en el listado fuente del programa.
Tipos
1. Serie de caracteres que vaya encerrada entre los dos símbolos /* y
*/.Restricción: los comentarios no deben estar imbricados o anidados
Ejemplo
#include <stdio.h>
main()
{
/* Comentario en varias
líneas */
return(0); // comentario de línea
}
Tipos de Datos Básicos – Definición y Modificadores
Definición
Tres tipos fundamentales, que se expresan con la ayuda de palabras clave
reservadas en el lenguaje:
1. Números enteros (int)
2. Números reales (float)
3. Caracteres (char)
Modificadores
Calificación para adaptarse mejor a los diversos tamaños de la palabra
interna del microprocesador, con el fin de mejorar la precisión o de reducir el
espacio ocupado en memoria :
1.short para un entero corto
2.long para un entero largo
3.unsigned para un entero sin signo
4.double para un número real flotante de doble precisión
Ejemplo
unsigned int
signed char
long int
unsigned long int
Operador sizeof()
El operador sizeof se utiliza para determinar el número
de bytes de un variable o un tipo
int a;
sizeof(a); sizeof(unsigned int);
char -128..127
unsigned char 0.255
int -32768..32767
short -32768..32767
long -232..232-1
unsigned 0..65535
float 3.4E-38..3.4E+38
double 1.7E-308..1.7E+308
long double 3.4E-4932.. 1.1E+4932
Tipos de Datos Básicos – Declaración de variables
Declaración
<Clase de memoria> [tipo de dato] [[Identificador]<=Valor Inicial>, ...];
Declaración Simple
char ccar;
unsigned int inum;
float freal;
Declaración Múltiple
char ccar, cdat;
unsigned int inum, icoorx;
float freal, fnum;
Declaración y Asignación
char ccar = ’A’;
unsigned int inum = 12432, icoorx = 5;
float freal = 0.14, fnum = -4.2812e-4;
Punteros
Definición Operadores de Punteros
¾ Las variable de tipo puntero representan direcciones donde ¾ Si px es un puntero (dirección): *px es el
almacenar valores. Es importante diferenciar entre puntero contenido del puntero (el valor almacenado
(espacio de memoria donde se almacena la dirección) y la en la dirección)
propia dirección del puntero.
¾ Si x es la variable: &x es la dirección de
¾ Se declaran con un asterisco delante del identificador de memoria donde está almacenada la variable
variable
Ejemplo
int *px, x; /* px es un puntero a entero y
x es un entero */
Ejemplo
int x, y; // variables glogales
main()
{
float x, z; // variables locales
Ejemplo de Casting
int inum;
float rnum;
char ccar;
rnum = 65.0
inum = (int)rnum; //inum vale 65
ccar = (char)inum; //ccar vale 65 (código ASCII de ’A’)
Código ASCII
ASCII
American
Standard
Code
Information
Interchange
Operadores
Definición
Los operadores pueden estar representados por uno o por dos caracteres especiales, por una palabra
reservada, o por un especificador de tipo puesto entre paréntesis.
Tipos de Operadores
¾ Operadores aritméticos ¾ Operadores de incremento y decremento
¾ Operadores de manipulación de bits ¾ Operadores de relación
¾ Operadores de asignación ¾ Operadores de dirección
Categorías de Operadores
¾ Operadores Monádicos o Unarios: preceden a un identificador, a una expresión o a una constante
¾ Operadores Diádicos o Binarios: establecen la relación entre dos términos o expresiones
¾ Operadores Triádicos o Ternarios: ponen en relación tres términos o expresiones
Tabla de Operadores
Unarios Binarios Ternarios
- == = ? :
* + != +=
& - > -=
! * >= *=
~ / < /=
++ % <= %=
-- | || |=
(tipo) & && &=
sizeof ˆ ˆ=
>> >>=
<< <<=
. ->
Operadores Aritméticos
Operadores Aritméticos
+ la adición
* la multiplicación
/ la división
Ejemplo
#include <stdio.h>
main()
{
long n = 0x12345678; // entero sobre 32 bits
Ejemplos
a = 3; b = a++; // a = 4, b = 3
a = 3; b = ++a; // a = 4, b = 4
a = 3; b = a--; // a = 2, b = 3
a = 3; b = --a; // a = 2, b = 2
Operadores de Relación
Operadores de Comparación Operadores Lógicos
> Mayor que Negación monádica (NOT)
>= Mayor o igual a && Intersección lógica (AND)
Falso 0
Ejemplos
a = 3 > 7; // a vale 0 (falso)
a = (3 > 2 || 5 == 4) && !1 // a vale 0 (falso)
Prioridad de Operadores
Clasificación de los Operadores según sus Prioridades
( ) [ ] -> .
! ˜ ++ -- - * & (type) sizeof
* / %
+ -
<< >>
< <= > >=
== !=
&
ˆ
|
&&
||
? :
= += -= *= /= %= >>= <<= &= |= ˆ=
,
Funciones de E/S Básicas
Definición
Las funciones de E/S en C no pertenecen a las palabras reservadas del lenguaje. Son funciones de la librería estándar
cuyo formato se encuentra en el fichero de cabecera stdio.h.
Las funciones de E/S básicas 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 propósito:
¾ Funciones de E/S de caracteres: recoger/insertar un carácter 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()
putchar()
Presenta un carácter en pantalla: putchar(caracter);
Ejemplo de getchar/putchar
#include <stdio.h> // necesario para utilizar funciones de E/S
main()
{
char ccar; // variable caracter
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]; // variable cadena de caracteres
Nota Es importante destacar que los argumentos son direcciones. Cuando se utilizan variables base es necesario
utilizar el operador de indirección &.
Ejemplo
#include <stdio.h>
main()
{
int inum, *pinum;
float rnum;
char ccar;
main()
{
char *pstr, str[100], cad[20];
pstr = str;
scanf(”%s”, pstr); // CORRECTO, lee str hasta blanco o fin de línea
scanf(”%s %*s %s”, cad, str); /* Lee cad hasta blanco, deja una palabra y la
siguiente palabra sobre str hasta blanco o fin de línea */
}
Funciones de E/S Básicas – printf()/scanf() Ejemplo
Ejemplo
#include <stdio.h>
main()
{
char nombre[100];
int dias, anios;
Solución
¿Cual es tu nombre? Jose
¿Y tu edad? 20
Jose tienes aproximadamente 7300 días
Sentencias de Control
Definición
Las sentencias de control van a determinar la cadena de ejecución de las instrucciones.
falso
¿condición?
verdadero
expresión(es)
Ejemplo
#include <stdio.h>
Sentencia if...else
Diagrama de Flujo
verdadero falso
¿condición?
Ejemplo
#include <stdio.h>
#define MAX_EDAD_JOVEN 25
Ejecución
main()
if(condición) {
int edad;
{
expresión(es) if printf(”Dime tu edad -> ");
scanf(”%d”, &edad);
}
else if(edad <= MAX_EDAD_JOVEN)
{ {
printf(”Con %d años eres un chaval\n”, edad);
expresión(es) else }
} else
{
printf(”Con %d años no estás para muchos trotes\n”, edad);
}
}
Sentencia if...else Anidadas
Ejemplo de Ejecución
if(condición1)
{
if(condición2)
{
expresión(es) if condición 2
if(condición3)
{
expresión(es) if condición 3
}
}
else
{
expresión(es) else condición 2
}
}
else
{
if(condición4)
{
expresión(es) if condición 4
}
else
{
expresión(es) else condición 4
}
}
Sentencia switch
Ejecución
switch(variable_opción)
{
case opcion_1:
expresión(es) opcion_1; Ejemplo
break; #include <stdio.h>
Ejemplo
#include <stdio.h>
if(num > 0)
main() {
{ abs = num;
float num, abs; }
nte
else
printf(”Dame un número -> ”);
iv ale {
u
scanf(”%f”, &num); eq abs = -num;
}
abs = num > 0 ? num : -num;
Sentencia while
Diagrama de Flujo Ejecución
while(condición)
{
expresión(es)
falso }
¿condición?
verdadero
expresión(es)
Ejemplo
#include <stdio.h>
main()
{
int total = 0, nuevas;
falso
¿condición?
verdadero
Ejemplo
#include <stdio.h>
do
{
printf(”Dame un caracter -> ”);
caracter = getchar();
}
while(caracter != ESCAPE);
}
Sentencia for
Diagrama de Flujo
Ejecución
for(expresión inicial; condición; expresión bucle)
expresión inicial {
expresión(es)
}
falso
¿condición?
expresión bucle
verdadero
Ejemplo
#include <stdio.h>
expresión(es)
main()
{
int i;
main() main()
{ {
char car; char car;
main() main()
{ {
int i; int i;
for(expresión inicial;
condición3;
expresión bucle)
{
expresión(es) for condición 3
do
{
expresión(es) do..while condición 4
}
while(condición4)
}
}
Función
Parte de código independiente, que puede ser llamada enviándole unos datos (o sin enviarle nada),
para que realice una determinada tarea y/o proporcione unos resultados
Ejemplo declaración
#include <stdio.h>
int factorial(int numero)
int factorial(int numero); {
int i, out;
main()
{ for(i = 1, out = 1; i <= numero; i++)
int factor; out *= i;
Formato General
[clase] [tipo] nombre_funcion([lista de argumentos con tipos])
{
[declaración de variables y/o de otras funciones]
codigo ejecutable // sentencias
return (expresión); // optativo
}
9 clase: define el ámbito de la función, esto es, desde dónde puede ser llamada. La clase puede ser
extern o static.
9 tipo: indica el tipo de valor devuelto por la función.
9 nombre: es el identificador que indica el nombre de la función.
9 lista de argumentos: secuencia de declaración de parámetros separados por comas y encerrados
entre paréntesis. Son los llamados parámetros formales.
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 Función
Llamada de una Función
La llamada a una función se hace incluyendo su nombre en una expresión o sentencia del programa
principal o de otra función. Este nombre puede ir seguido de una lista de argumentos separados por
comas y encerrados entre paréntesis, los parámetros actuales.
Cuando se llama a una función se ejecuta el código correspondiente a la función hasta que se llega a
una sentencia return o al final del cuerpo de la función, 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 = expresión([parámetros actuales]);
9 variable: especifica la variable en donde va a ser almacenado el valor devuelto por la función. La
llamada puede prescindir del valor devuelto por la función.
9 expresión: especifica la dirección que referencia a la función. En general se corresponde con el
nombre de la función.
9 parámetros actuales: lista de expresiones separadas por comas. Las expresiones son evaluadas,
pasadas a la función y asignadas a los parámetros formales. El número de parámetros actuales
coincide con el parámetros formales, a no ser que especifique un número variable de parámetros.
Funciones – Ejemplos
Ejemplo Cálculo de una expresión absoluta
#include <stdio.h>
main() main()
{ {
double a=1.0, b=2.0; double a=1.0, b=2.0;
printf("\n");
return 0;
}
Funciones – Funciones de Librería Estándar I
Funciones de Conversión de Datos <stdlib.h>
¾ double atof (char *cadena);
Convierte una cadena a valor real doble
¾ char *fcvt (double valor, int decs, int *pdec, int *signo);
Convierte un número real en una cadena de caracteres.
Ejemplo
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
int i;
Almacenamiento de Variables
Métodos de Almacenamiento
¾ Auto: Método 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 función. Son variables globales. Por defecto, son
inicializadas a cero. Para utilizarlas en otros módulos deben ser declaradas como extern.
¾ Static: Conservan su valor entre distintas ejecuciones del bloque en que están definidas. Por
defecto, son inicializadas a cero. Las variables definidas como static extern son visibles sólo
para las funciones y bloques comprendidos desde su definición hasta el fin del fichero. Una
función puede también ser definida como static, y entonces sólo es visible para las funciones
que están definidas después de dicha función y en el mismo fichero.
¾ Register: Es un modo de recomendación para el compilador, para que –si es posible– ciertas
variables sean almacenadas en los registros de la CPU y los cálculos con ellas sean más rápidos.
void test_static(void)
{
int var_local = 1;
static int var_static = 1;
Definición
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
Inicialización
Los arrays se pueden inicializar directamente en la definición.
int a[6];
a[0] = 23;
a[2] = a[0] + 5; a 23 28
a[0] a[1] a[2] a[3] a[4] a[5]
for(i=0; i < 6; i++)
{
printf(”%d”, a[i]);
}
Ejemplo Solución
#include <stdio.h> el mes 1 tiene 31 días.
el mes 2 tiene 28 días.
#define MESES 12 el mes 3 tiene 31 días.
...
void main (void) el mes 11 tiene 30 días.
{ el mes 12 tiene 31 días.
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 días\n", cont + l, meses[cont]);
}
}
foat matriz[10]10];
int meses[12] ;
meses == &meses[0];
Ejemplo
#include <stdio.h>
void inicializa (int lista [], int *cuanto); for (i = 0; i < CANTIDAD; i++)
int el_mayor (int lista [], int cuanto); {
printf("Introduzca el número[%d]: ", i);
void main (void) scanf("%d", &lista[i]);
{ }
int lista[CANTIDAD];
int longitud, num; *cuanto = CANTIDAD;
}
inicializa(lista, &longitud);
num = el_mayor(lista, longitud); int el_mayor(int lista[], int cuanto)
{
printf("El mayor número introducido es: %d\n", int mayor, i;
num);
} mayor = lista[0];
return (mayor);
}
Strings – Cadenas de Caracteres
Definición
Las cadenas de caracteres son un tipo de arrays especiales cuya función principal es la manipulación
de caracteres.
Una cadena de caracteres o un string, es un array formado por caracteres que tiene al final un
carácter especial: '\0'.
Los strings son arrays que almacena datos tipo char y como tales se declaran:
Inicialización
La inicialización de una cadena de caracteres puede hacerse de la siguiente manera:
struct [etiqueta]
{
tipo campo1;
tipo campo2;
...
} [variable];
struct tsagente
{
char nombre[100];
int numero;
} agente, agentes[10];
Asignación de Estructuras
Es posible la asignación directa entre estructuras.
agente1 = agente2;
Arrays de Estructuras
Los componentes de un array pueden ser estructuras.
strcpy(agentes[0].persona.nombre, ”Mortadelo”);
agentes[0].persona.numero = 001;
r Lecturas
Al modo de apertura hace falta añadir si se abre en modo texto (t) o en modo binario (b).
FILE *fich;
fich = fopen(“\\ejemplos\\texto. txt", "w");
Ejemplo
#include <stdio.h>
Ejemplo
#include <stdio. h>
fclose(fich);
}
else
{
printf("\nEl fichero \"texto.txt\" no puede abrirse.");
}
}
Ejemplo
#include <stdio.h>
#define CARACTERES 100
Ejemplo
#include <stdio.h>
#include <string.h>
¾ size_t fread (void *buffer, size_t tamanio, size_t numero, FILE *fichero);
Lee un buffer de numero de elementos de un tamaño del fichero.
Ejemplo
#include <stdio.h>
fclose (fich);
}
#define CARACTERES 40
else
{
struct tspieza
printf ( "\nEl fichero piezas.dat no puede abrirse");
{
}
char nombre[CARACTERES];
}
int numero;
float peso;
};
Ejemplo
#include <stdio.h>
else
{
void main (void)
printf ("n\El fichero \"datos.dat\" no puede abrirse");
{
}
FILE *fich;
}
int posicion;
Ficheros – Ejemplo 1
Ejemplo 1 Paso 1 Ejemplo 1 Paso 3
#include <stdio.h> #include <stdio.h>
struct rgarticulo
{
char nombre[100];
int unidades;
float precio;
};
void main(void)
{
struct rgarticulo articulos[MAXARRAY];
int longitud = 0;
leer_array(articulos, &longitud);
mostrar_array(articulos, longitud);
}
Función mostrar_array
void mostrar_array(struct rgarticulo articulos[], int longitud)
{
int i;
if(existe_fichero(nomfichdat))
{
printf("Encontrado fichero %s\n", nomfichdat);
if(existe_fichero(nomfichdat))
{
printf("Encontrado fichero %s\n", nomfichdat);
return out;
}
Ejercicios programación en C
Laboratorio de Sistemas
Informáticos
Curso 2003-2004
1. Programa que pida un valor en pesetas y lo convierta en euros y otro programa que lleve a cabo la
operación inversa. (Nota 1 euro = 166.386 pts)
Nota: La solución en euros deberá tener 3 decimales.
2. Pedir un carácter por teclado y mostrar un mensaje que muestre el carácter introducido así como su
código ASCII tanto en formato decimal como hexadecimal.
3. 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”
F − 32 C
=
9 5
4. Crear un programa que pida el radio de una circunferencia y que calcule la longitud de la misma así
como el área incluida dentro.
5. Crear un programa que calcule la fuerza de atracción gravitacional entre dos masas, M1 y M2
situadas a una distancia R.
M 1* M 2
F =G ( Nw)
R2
donde las masas se expresan en kilogramos y la distancia en metros y la constante de gravitación
universal vale:
6. Escribir un programa que pregunte el año actual y la edad de una persona y calcule la edad de esa
persona en el año 2010.
7. Escribir un programa que calcule el número 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.
8. Crear un programa que pida un numero real y muestre la tabla de multiplicar correspondiente a dicho
número de tal manera que tanto los valores de los factores como del producto se presenten
encolumnados y con una precisión de 2 dígitos.
Ejemplo:
9. Mostrar en forma de tabla, el cuadrado y el cubo de los 5 primeros números enteros que siguen a uno
introducido por teclado.
Nota: Ejecutar el programa utilizando variables de tipo int e introduciendo el número base 30 y
utilizando variables de tipo unsigned int e introduciendo el número base 40. ¿Qué sucede? ¿Cómo se
puede explicar lo que sucede?
10. Crear un programa que muestre en pantalla el tamaño en bytes (8 caracteres) de las variables más
frecuentes: char, int, short int, long int, float y double.
(Nota: Para calcular el tamaño de una variable se puede usar el operador sizeof.)
11. Escribir un programa que tras preguntar el número de almacén asociado a un determinado tipo de
pieza, la cantidad pedida de esa pieza y el precio por unidad, efectúe el cálculo del precio total de
las piezas pedidas. El programa deberá escribir toda la información de la pieza en la pantalla, además
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 número lo multiplique por 4 y divida por 2 utilizando los
operadores de rotación.
Sentencias condicionales
1. Ejecutar el siguiente código fuente (Declarando valor_logico como entero y luego declarándolo como
float):
Nota: No confundir el operador ‘==’ de comparación (para comprobar si dos valores son iguales)
con el operador ‘=’ de asignación que escribe un valor en una variable.
2. Escribir un programa que tras pedir 2 números por la pantalla muestra cuál es el mayor número.
(Hágase con la sentencia if y con el operador condicional ”expresion?valor1:valor2 )
3. Leer tres números enteros y, si el primero de ellos es negativo, calcular el producto de los tres, en
caso contrario calcular la suma de ellos.
4. Crear un programa que calcule la caída de potencial producida por una resistencia según la ley de
Ohm (V=I*R) a partir de la resistencia y la intensidad que pasa a su través.
Nota: El programa no debe aceptar resistencias negativas, dado que no tienen sentido físico, 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 límites aceptables indicando la causa por la que dicho valor para la resistencia ha sido
rechazado.
6. Escribir un programa que calcule las raíces, bien reales o imaginarias, de una ecuación de segundo
grado. El programa también 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 ecuación ax2 + bx + c=0 obtener x1, x2 de forma que:
10 si x*y < 1
y2 si x*y ≥ 1
1 si x*y < 1
y2 si 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).
Nota: Un año es bisiesto si es múltiplo de 4 salvo el caso en que sea múltiplo de 100, que no es
bisiesto, y no sea múltiplo de 400. Por ejemplo, el año 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 judío que es lunar. Para obtener
en nuestro calendario cuál sería el correspondiente fecha se puede utilizar el siguiente algoritmo a
partir del año para el que se quiere calcular la fecha.
La fecha para el Domingo de Pascua es el día (22+D+E) de Marzo (obsérvese que puede dar una
fecha en Abril)
Escribir un programa que pida como entrada un año y saque por pantalla la fecha del Domingo de
Pascua para ese año.
10. Leer desde el teclado las coordenadas (x, y) de un punto y, mediante un menú, elegir una entre las
siguientes opciones:
y r
arg
X
11. Escribir un programa que permita efectuar el cálculo del área de un cuadrado, un círculo o un
triángulo equilátero según la opción seleccionada por el usuario.
12. Escribir un programa que permita efectuar el cálculo del área de un cuadrado, un círculo o un
triángulo equilátero según la opción seleccionada por el usuario a través de un menú.
13. Dada la longitud de una circunferencia, averiguar si dicha longitud corresponde, con una determinada
precisión, a una circunferencia de radio R.
14. Escribir un programa que pida dos caracteres por pantalla, los ordene alfabéticamente, y los imprima
ordenados.
Sentencias repetitivas
1. Escribir un programa que escriba los números del 1 al 100 en líneas de 10 números. Después de
100 el programa debe escribir “Fin del programa” en una línea nueva.
2. Programa que calcule el valor de elevar un número real, a, a un exponente entero, b, ab,
multiplicando b veces el número 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 leído por teclado.
Nota: Probar el programa con los números 6, 7, 8, 9... ¿Qué pasa a medida que se va
aumentando el número? ¿Por qué?
4. Crear un programa que pida un numero real y muestre la tabla de multiplicar correspondiente a
dicho número de manera que tanto los valores de los factores como del producto se presenten
encolumnados y con una precisión de 2 dígitos.
Ejemplo:
6. Programa que escriba en pantalla una tabla con cuadrados y cubos a partir de un número base
hasta otro tope, ambos pedidos por teclado.
Para ello se irá pidiendo la tabla de multiplicar de un número (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 número”
8. Hacer un programa que lea caracteres desde teclado hasta que lea 10 veces la letra 'a'. Por cada
carácter leído que no sea una 'a' debe mostrar un mensaje indicándolo. Cuando lea las 10 letras 'a' el
programa terminará.
9. Hacer un programa que lea caracteres desde teclado y vaya contando las vocales que aparecen. El
programa terminará cuando lea el carácter # y entonces mostrará un mensaje indicando cuántas
vocales ha leído (cuántas de cada una de ellas).
10. Repetir el ejercicio leyendo caracteres hasta que se lea el carácter final de fichero EOF (^Z) en
lugar del carácter #.
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 línea del estilo:
12. Programa que calcule los nºs primos del 1 al 100 y los saque por pantalla.
13. Escribir un programa que primero pida por pantalla con cuántos números se va a trabajar
digamos que sean X) y luego pida los X números por pantalla.
Después de introducir los X números se mostrará un mensaje por pantalla indicando cuál es el
mayor y menor valor introducido, así como el valor medio de todos los números introducidos.
14. Programa que pida números de cuatro cifras e indique si los números son capicúas o no. El
programa deberá ir pidiendo números hasta que el usuario introduce ‘-1’ por teclado. El número
–1 indicará la finalización de la ejecución del programa.
15. Escribir un programa que calcule los números perfectos entre 1 y 10000.
Nota: Un número perfecto es aquél tal que la suma de sus divisores menos el propio número es
el propio número.
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
Solución: 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.
17. Escribir un programa que muestre una tabla con los caracteres ASCII mostrados en decimal,
octal y hexadecimal. El programa mostrará la información con el siguiente formato:
El programa pedirá el primer y últimos caracteres que marcarán los límites de la tabla.
Funciones
1. Escribir un programa que permita convertir grados Fahrenheit a Celsius y grados Celsius a
Fahrenheit.
El programa presentará el siguiente menú:
Nota: Cada conversión 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 números enteros menores que un cierto entero N y que a
su vez sean múltiplos de dos números enteros A y B introducidos por teclado.
Utilizar para ello una función que admita dos parámetros I, J e indique si I es múltiplo de J.
3. Escribir una función (con su correspondiente programa de prueba) que tome un valor entero y
devuelva el número con sus dígitos en reversa. Por ejemplo, dado el número 7631 la función deberá
devolver 1367.
4. Escribir un programa que calcule masa radioactiva de carbono 14 que queda después de t años. La
fórmula que determina la masa restante en el tiempo t es:
t
1h
Mt = m*
2
donde:
t es el tiempo en años
Mt es la masa que permanece en el tiempo t
m es la masa original
h es la vida media en años
Para el carbono 14 la vida media es de 5700 años; si la masa original es de 300 gramos, imprimir una
tabla de la masa para t=500, 1000, 1500, 2000, ..., 10000 años.
Se deberá utilizar un subprograma que permita evaluar la expresión (1/2)t/h para los diferentes valores
de t.
Nota: En TurboC existe la función double pow(double x, double y) que devuelve el valor xy.
5. Escribir una función que escriba tantas líneas en blanco como se haya pedido con anterioridad al
usuario en el programa principal.
6. Escribir una función que tome el tiempo introducido por el usuario en el formato
(horas:minutos:segundos) y lo convierta en segundos. El programa utilizará esta función para
calcular la diferencia en segundos entre dos tiempos introducidos por el usuario.
Nota: La función para calcular el factorial de un número puede ser iterativa o recursiva. (Una
función recursiva es una función que se llama a sí misma)
8. Escribir una función que calcule el factorial de un número y utilizar ésta en un programa que muestre
el siguiente menú.
1. Factorial de un número
2. Cálculo de e
3. Cálculo de e^x
0. Salir
Nota 1: El cálculo de e debe hacerse con la siguiente expresión matemática:
1 1 1
e = 1+ + + + ...
1! 2! 3!
Sol: e=2.718282
Nota 2: En un entorno de 1 e x puede calcularse mediante la fórmula:
x x2 x3
ex =1+ + + + ...
1! 2! 3!
Escribir un programa que calcule el valor aproximado de coseno (x), utilizando para ello los N
primeros términos de la serie de Taylor. El número de términos N de la serie dependerá del valor del
último, es decir, se añadirán términos a la serie hasta que el valor absoluto del último término
añadido sea menor que 0.0005.
¿Obtener el coseno de 10 radianes? Compárese con el valor obtenido con la calculadora. ¿Qué
sucede?
10. Se desea realizar un programa que permita hacer cálculos con polinomios de segundo grado.
El programa deberá presentar un menú en pantalla que facilite las siguientes opciones:
1. Leer un polinomio
2. Escribir un polinomio en su forma habitual
3. Evaluar un polinomio en un punto
4. Calcular el polinomio derivado
0. Salir
LEER mediante este subprograma se introducen los números 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 válidos: 5x^2+3x+5 5x^2-3x+5 5x^2-5
ejemplos no válidos: 5x^2+ -3x+5 5x^2-0x+5
EVALUAR es un subprograma que retorna el valor de un polinomio para un número real que
es introducido como parámetro.
DERIVAR es un subprograma que calcula el polinomio derivada de uno dado.
11. Escribir un programa que realice la descomposición en factores primos de un número 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:
Nota 1: Se deben crear sendas funciones para comprobar si un carácter es numérico o alfanumérico.
Nota 2: La función getchar() permite leer un carácter de teclado.
Nota 3: Para marcar el final de lectura del texto, el usuario deberá introducir un carácter que marque
fin de fichero. Este carácter es ^D en Linux y ^Z en DOS / Windows.
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 números y muestre aquel o aquellos que hayan aparecido más veces.
4. Escribir un programa que emplee un argumento de la línea de comandos para realizar una conversión
decimal a hexadecimal; es decir, el número decimal se introducirá en la línea 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 números en una
llamada.
Nota 2: En caso de que el programa no reciba argumentos deberá devolver un mensaje de error.
Nota 3: La función 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
mostrándolo por pantalla. La inversión se hará sin utilizar otro array auxiliar.
6. Escribir un programa que calcule los números primos de 0 a 100 utilizando el llamado método de la
criba de Eratóstenes. Este método 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
múltiplos de los números primos (2, 3, 5, 7...) hasta obtener sólo los números 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 señalan los múltiplos de 2, mientras que en gris oscuro los múltiplos de
3 (que no son múltiplos de 2).
7. Realizar un programa que maneje un array de enteros a través de un menú con seis opciones:
8. Escribir un programa que permita guardar las cuentas de un banco con sus respectivos saldos. Para
ello se guardará la información en un array paralelo (dos arrays unidimensionales, uno con los
números de cuenta y otro los saldos)
El programa deberá mantener las cuentas ordenadas, de menor a mayor, por número de cuenta para
facilitar la búsqueda de una cuenta.
1.- Dar de alta una nueva cuenta (comprobando que el array no esté lleno y colocando la cuenta en la
posición correspondiente dentro del array)
2.- Eliminar una cuenta (comprobando que el array no esté vacío y reposicionando las cuentas en el
array)
3.- Mostrar una cuenta (mostrará el número de cuenta y el saldo correspondiente)
4.- Mostrar información (Número de cuentas dadas de alta y dinero total de todas ellas)
5.- Calcular el saldo medio, máximo y mínimo de las cuentas del array.
6.- Mostrar todas las cuentas (1 línea por cuenta).
0.- Terminar
9. Escribir un programa que rellene automáticamente 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
posición de cada asiento se definirá con una letra (A-H) para la fila y un número (1-20) para la
columna. El programa deberá visualizar qué sitios están disponibles para que el cliente pueda decidir
dónde 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 visualización:
1...5....0 1...5....0
_______________________
A ** A
B **** *** B
C ** **** ** **** C
D *** * ** *** ** *** D
E ***** **** ** ** E
F ******** *** * ** F
G ** **** **** ** G
H ******* *** H
1...5....0 1...5....0
12. Un histograma es un gráfico 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 sería:
4 *
Frecuencia 3 * *
2 * * * *
1 * * * * * * * *
Valor 0 1 2 3 4 5 6 7 8 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
Las notas leídas desde el teclado son valores de tipo real y el número de alumnos no es fijo aunque
siempre es menor de 300.
Nota: Para la realización del histograma se tendrán en cuenta las dimensiones de la pantalla no
permitiéndose más de 22 filas, por tanto si la máxima 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 número del DNI. del interesado. Seguidamente deberá averiguar si es un
valor válido (debe representar un valor entre 100.000 y 99.999.999). Si la entrada es válida se deberá
calcular el NIF. y representar el número 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.
Punteros
a) Declarar las variables enteras largas value1 y value2 e inicializar value1 a 200000
b) Declarar la variable lPtr como apuntador a un objeto de tipo long.
c) Asignar la dirección de la variable value1 a la variable de apuntador lPtr.
d) Imprima el valor del objeto al que apunta lPtr.
e) Asígnele a la variable value2 el valor del objeto al que apunta lPtr.
f) Imprima el valor de value2.
g) Imprima la dirección de value1.
h) Imprima la dirección almacenada en lPtr. ¿Es igual el valor impreso que la dirección de value1?
2. Crear un programa que calcule el valor de la intensidad que pasa a través de una resistencia dada,
cuando se le aplica un voltaje determinado.
El programa deberá estar dividido en las siguientes funciones:
• explicar_programa()
Esta función mostrará una introducción del programa por la pantalla.
• obtener_valores()
Esta función pedirá los valores para la resistencia y voltaje los cuales se pasarán por referencia al
programa principal.
• calcular()
Esta función efectuará el cálculo de la intensidad a partir de la resistencia y el voltaje aplicado.
• imprimir_respuesta()
Esta función se encargará de mostrar un mensaje con los resultados.
3. Crear una función que intercambie el contenido de dos variables. Para ello se pasarán como
parámetros las direcciones de las variables.
Para probar la función escribir un programa que pida los datos por pantalla y muestre los contenidos
después de llamar a la función.
4. Crear un programa que lea un número determinado (<100) de números reales introducidos por
teclado los almacene en un vector para mostrarlos luego en orden inverso.
Nota: Para recorrer el array se deberá usar aritmética de punteros en lugar de usar los índices del
array.
5. Escribir una función que tras pedir un día de la semana (de 1 a 7) devuelva un puntero a cadena con
el nombre del día. La función contendrá un array de apuntadores a cadena.
Para probar la función se realizará un programa que pida un día de la semana en número y escriba el
día de la semana en letra.
6. Escribir un programa que inicialice una cadena con una palabra cualquiera. El programa deberá
obtener la dirección de la primera letra de la cadena. Una vez sabida esta dirección la mostrará por
pantalla y realizará un bucle dando 3 oportunidades para que el usuario introduzca la dirección de la
tercera letra de la cadena. En caso de no introducirla bien después de los 3 intentos, deberá sacar un
mensaje indicando cuál es la dirección correcta.
Cadenas
1. Escribir un programa que pida una cadena de caracteres (de longitud máxima 80 caracteres) y
devuelva la cadena escrita al revés.
Ayuda: Para saber la longitud de la cadena se puede usar la función strlen() de la librería 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:
3. Escribir una función que cambie las letras mayúsculas de una cadena a minúsculas y viceversa. El
programa principal pedirá una cadena por pantalla y se la pasará a dicha función esperando el
resultado correcto que se mostrará por pantalla.
4. Escribir un programa que pida primero un carácter por teclado y que luego pida una cadena. El
programa calculará cuántos caracteres tiene la cadena hasta que lea el carácter introducido primero.
Se deberá mostrar un mensaje en pantalla con el número de caracteres introducidos hasta llegar al
carácter primero.
5. Escribir un programa que cuente el número de letras, dígitos y signos comunes de puntuación de una
cadena introducida por teclado.
Ayuda: Para saber si un carácter es numérico comparar que su valor es mayor que ‘0’ y menor que
‘9’, para saber si es alfabético comprobar que está entre ‘a’ y ‘z’ y considerar signos de puntuación el
resto de los caracteres.
Nota: No considerar ni la ñ ni las letras acentuadas, ya que tienen códigos ASCII fuera del rango a-z
6. Realizar un programa que lea una cadena de caracteres con espacios en blanco excesivos: elimine los
espacios en blanco iniciales y finales y sólo deje uno entre cada dos palabras.
7. Crear un programa que pida una cadena de caracteres y devuelva otra sin signos de puntuación ni
números. La cadena devuelta debe tener todos los caracteres en mayúsculas.
8. Crear un programa que pida por pantalla una cadena de 80 caracteres de longitud máxima y que
calcule el número de veces que aparece otra cadena determinada, también pedida por teclado.
Como salida el programa debe escribir un mensaje con el número de veces que aparece la palabra
dada.
9. Escribir un programa que compruebe si una cadena pedida por teclado es un palíndromo o no.
(Un palíndromo es una palabra que se lee igual al derecho que al revés.) El programa no tendrá en
cuenta si la palabra está escrita con mayúsculas o minúsculas.
10. Escribir una función que compare 2 cadenas de caracteres devolviendo –1 si son iguales y 0 si son
distintas.
11. Escribir un programa que pida dos cadenas (de longitud máxima 10 caracteres) y devuelva lo
siguiente:
12. Escribir un programa con un menú que permita las siguientes opciones:
• Pasar a mayúsculas una cadena leída desde teclado. Para ello, escribir un procedimiento que
transforme caracteres de letras minúsculas a mayúsculas dejando como están las letras
mayúsculas.
Nota: Para llevar a cabo esta operación tener en cuenta la representación de los caracteres en
ASCII. (‘A’ – 65, ‘a’ – 97)
• Pasar a minúsculas una cadena desde teclado. Para ello, escribir un procedimiento que
transforme caracteres de letras minúsculas a mayúsculas. Dejando como están las letras
minúsculas.
• 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 código 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 minúsculas, tal y como
se hace en el punto 2.
Nota común: En todos los casos si se intenta efectuar alguna operación antes de introducir la cadena
se deberá mostrar un mensaje de error comunicando al usuario que la cadena está vacía.
13. Julio Cesar enviaba mensajes a sus legiones encriptando los mensajes mediante el siguiente
algoritmo:
Se escogía un número n como clave y se sumaba a cada letra en el alfabeto n posiciones. Así, si la
clave escogida fuese 5, la ‘a’ pasaría a ser la ‘f’, mientras que la ‘f’ pasaría a ser la ‘k’. Para las
últimas letras del abecedario se seguiría desde el principio. Así, con la clave de 5 la ‘y’ pasaría 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 números enteros:
El programa pedirá primero la operación y luego los operandos.
Las operaciones válidas serán: sumar, restar, multiplicar, dividir, salir.
Si la operación es distinta de salir se pedirán 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 recogerán como cadenas de caracteres y se convertirán en números enteros con la
función atoi()
Otras funciones que se pueden usar serán: gets() y strcmp().
15. Tal vez el esquema de codificación más famoso de todos es el código Morse, desarrollado por
Samuel Morse en 1832 para el sistema telegráfico. El código Morse asigna una serie de puntos y
rayas a cada letra del abecedario, a cada dígito 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 código Morse. También escriba un programa
que lea una frase en código Morse y la convierta en su equivalente en castellano. La separación entre
letras se indicará mediante un espacio, mientras que la separación entre palabras se indicará mediante
3 espacios.
16. Escribir un programa que permita al usuario realizar las siguientes operaciones:
Estructuras
1. Realizar un programa que permita realizar las operaciones básicas (sumar, restar, multiplicar y
dividir) números complejos.
El programa deberá utilizar una variable que represente el número complejo en su forma polar, con
sus dos componentes módulo y argumento.
2. Crear un programa que lea las siguientes variables proporcionadas desde teclado con el siguiente
formato:
Posición de los caracteres Campo
1-8 Matricula
9-13 Cilindrada
14-16 Potencia
17-27 Modelo
28-38 Marca
Ej:
BI6755CC1400 75FIESTA FORD
Nota: Construir una función que muestre la estructura por pantalla que recibirá la estructura pasada
por referencia (para no malgastar espacio en la pila)
3. Disponemos de la información correspondiente a una jaula de un Zoo en una variable de tipo registro
con los siguientes campos:
Escribir un programa que lea una variable de información global y la descompongan en dos
variables, una de información de mantenimiento y otra de información 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 información relativa a los vuelos diarios que parten
de un aeropuerto en un array formado por registros. Cada registro contendrá la siguiente información
sobre el vuelo correspondiente:
a) Número 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) Número de pasajeros: Entero
Una vez introducidos los datos de todos los vuelos se preguntará si se desea obtener información de
algún vuelo. En caso de que el usuario responda afirmativamente se pedirá el número de vuelo. El
programa buscará el vuelo en al array y accederá a la información que contiene a partir de su número
de vuelo, mostrando por pantalla todos sus datos.
El programa se ejecutará repetitivamente hasta que el usuario indique que no desea obtener más
información de ningún vuelo.
Nota: Se deben diseñar las funciones que visualicen un vuelo, busquen un vuelo en el array,
introduzcan la información de un vuelo en el array, etc...
5. Una compañía utiliza aviones para fumigar las cosechas contra una gran variedad de plagas. Lo que
la compañía 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:
Además, 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 información:
Nombre
Tipo de fumigación (código entre 1 y 4)
Número de m2 que se van a fumigar.
6. Escriba un programa que genere un array de 50 números enteros entre 1 y 1000 de forma aleatoria. A
continuación, partiendo de ese array genere otro array de 50 estructuras tal que cada estructuras tenga
un campo para el número y otro (cadena de caracteres) para indicar si dicho número es múltiplo
primo o no. Por ejemplo:
Finalmente muestre en pantalla la suma de todos los números del array que sean primos.
7. Escribir un programa que cree una base de datos temporal sobre el personal de agentes de policía. La
base de datos almacenará cuatro datos acerca de cada persona:
El programa preguntará acerca de cuántos datos se añadirán a la base de datos y luego mostrará los
datos de todos los agentes introducidos.
9. Se deberá escribir un programa que permita introducir y consultar la tabla periódica de los elementos
químicos. Para ello, se construirá un menú con las siguientes opciones:
La opción 4 pedirá el símbolo del elemento que se quiere consultar y mostrará por pantalla la
información correspondiente a dicho elemento.
El número atómico vendrá indicado por la posición en el array de elementos que representa la
tabla periódica, y por tanto no será necesario almacenar esta información en el registro
correspondiente.
Nota: Se puede mejorar el programa añadiendo una opción que permita guardar los datos en un
fichero de disco.
Ficheros
1. Crear un programa que abra un fichero y escriba en él dos números enteros y otro programa que lea
el segundo número escrito del fichero.
2. Leer completamente un fichero de texto, carácter a carácter (o en cantidades mayores, para que sea más
rápido). El programa debe contar las vocales, los caracteres alfabéticos y los dígitos que hay en el
fichero.
3. Crear un programa que abra un fichero y escriba en él dos cadenas, cada una acabada con el carácter
de nueva línea 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)
4. 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.
5. 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 línea de argumentos al llamar al
fichero. Es decir:
6. Escribir un programa que comprueba que un fichero de código contiene el mismo número de “{“ que
de “}” en su código. En caso de que no sea así el programa mostrará un mensaje indicando que el
número de “{“ es distinto que el número de “}”.
7. 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 operación de cambio de mayúsculas a minúsculas y viceversa,
escogida por el usuario, los escribirá en un segundo fichero.
9. Escribir un programa que permita visualizar el contenido de un fichero pasado desde la línea de
comando en formatos hexadecimal y carácter, siguiendo el esquema del ejemplo:
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.
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 conversión de un tipo de formato de fichero a otro. El formato de
partida será el siguiente:
Ej:
BI6755CC1400 75FIESTA FORD
Matrícula 8 caracteres
Cilindrada entero
Potencia entero
Modelo 10 caracteres
Marca 10 caracteres
13. Una entidad bancaria posee en un fichero la siguiente información para un conjunto de personas:
• Nombre.
• Número de cuenta.
• Crédito solicitado.
14. Se pide crear un programa que a partir de la fórmula de un compuesto químico, supuestamente puro,
y su peso en gramos presente un informe con la cantidad en gramos de cada elemento del compuesto.
• Número atómico 26
• Símbolo del elemento químico Fe
• Nombre completo del elemento Hierro
• Peso atómico 55,87
Nota 1: Para todas las ejecuciones del programa los datos de la tabla periódica deberán estar
disponibles por el programa. Se deja a elección de los alumnos el método de creación del fichero con
los datos de la tabla periódica.
Nota 2: Se recuerda que el número atómico indica la posición de un elemento en la tabla periódica.
Habrá que pensar cómo se organiza esta información para que el programa pueda funcionar de la
forma más sencilla posible.
Donde:
Opción 1 mostrará un listado con todos los elementos de la tabla periódica. Dado que la tabla
periódica tiene 118 elementos y sólo hay 40 líneas por pantalla, el programa deberá mostrar los
elementos en grupos de 40 líneas para poder visualizar la información de todos los elementos.
Opción 2 mostrará toda la información de un elemento químico. Para ello permitirá buscar un
elemento bien por número atómico o por símbolo. Así, previamente se preguntará si se busca el
elemento por número atómico o por símbolo:
Número atómico: 26
Símbolo: Fe
Nombre completo: Hierro
Peso atómico: 55.85
Opción 3 permitirá obtener la composición del compuesto químico a partir de la fórmula y del peso
del compuesto.
Se deberá comprobar que la fórmula escrita es válida, esto implicará comprobar que TODOS los
elementos escritos existen en la tabla periódica y que se ha seguido el formato:
Nota 3: Se recuerda que todos los átomos empiezan por letra mayúscula y que algunos átomos tienen
una letra minúscula mientras que otros no. No hay átomos de tres letras.
Una vez que se haya comprobado que la fórmula es correcta y se hayan identificado tanto los
elementos componentes como el número de átomos de cada tipo en la molécula el programa se
presentará el siguiente informe:
COMPOSICIÓN