Vous êtes sur la page 1sur 113

PROGRAMACIN ESTRUCTURADA

CONFERENCIA # 1
Introduccin
Resolucin de problemas computacionales por medio de la tecnologa top

down o de lo complejo a lo simple


Definicin
de:
Secuenciacin, repeticin,
refinamiento
sucesivo,
procedimientos
Ejemplo: Copiar el contenido de un rollo antiguo a rollo nuevo utilizando la
tecnologa top - down o de lo complejo a lo simple

INTRODUCCIN
A menudo nos hacemos la pregunta del por qu los programadores escriben un
programa. Esto es para resolver un problema por lo que el propsito de nuestro
estudio ser el ensear y aprender un mtodo de solucin de problemas con
programas de computadora mediante el estudio de la programacin estructurada.
Para llegar a nuestros objetivos, es necesario tambin presentar al C++ en un
estilo diseado para fomentar buenos hbitos de programacin.
Lenguajes de programacin
Permite expresar un algoritmo comprensible para un ordenador
Qu

es un algoritmo?
Frmula para resolver un problema
Consta de una serie de pasos
Se aplica de forma mecnica
Se aplica en un tiempo finito

Se definir un algoritmo como un conjunto finito de instrucciones que especifican


la secuencia ordenada de operaciones a realizar para resolver un problema. En
base a lo anterior, si el procesador del algoritmo es una computadora, el algoritmo
debe estar expresado en forma de un programa, el cual se escribe en un lenguaje
de programacin. A la actividad de expresar un algoritmo en un lenguaje de
programacin determinado se le denomina programar
Formas de programar:
Programacin modular
Programacin estructurada
Programacin dinmica

Carrera Ingeniera En Sistemas

Pgina: N 1

PROGRAMACIN ESTRUCTURADA

DISTINTAS TECNOLOGAS
Lenguaje de programacin: refleja un paradigma

Programacin imperativa
Programa en un lenguaje imperativo:
o Lista de instrucciones, rdenes elementales
o Ejecucin: una tras otra, en el orden del programa
Las instrucciones de un programa imperativo utilizan variables
o Variable: dato almacenado en la memoria del ordenador
Ejemplos de lenguajes imperativos: BASIC, Pascal, C.
Programacin imperativa
Elementos principales
Variable
o Nombre de celdas en memoria donde se almacenan los datos
o Estado del programa en un momento dado: Conjunto de valores de
las variables del programa
Operaciones de asignacin
o Se calcula un nuevo valor y se asigna a la variable
o As se modifica el estado del programa
Repeticin
o Ejecucin repetida de una secuencia de pasos elementales

Carrera Ingeniera En Sistemas

Pgina: N 2

PROGRAMACIN ESTRUCTURADA

Programacin funcional
Basada en el concepto matemtico de funcin
Funcin = regla de correspondencia que asocia a cada elemento de un
conjunto origen un elemento de un conjunto destino
o Conjunto origen = dominio de la funcin
o Conjunto destino = rango de la funcin
Composicin funcional: el resultado de un clculo es el argumento del
siguiente
Ejemplos de lenguajes de programacin funcional: LISP, Haskell, Gofer.
Elementos principales de la programacin funcional
Tipos de datos
Expresiones condicionales
Recursin (mtodo de programacin en el cual una rutina se llama a si
misma varias veces)
Abstraccin en programacin funcional
Abstraccin del problema a solucionar, modelndolo como una composicin
de funciones
Ms cercanos al espacio del problema que al espacio de la solucin
Programacin orientada a objetos
Permite representar en el programa los elementos del dominio del problema
Estos elementos se denominan objetos
El cdigo del programa contiene la solucin del problema
Cada objeto tiene un estado, representado por:
o Atributos (parecido a las variables) y
o Operaciones que puede realizar
Ejemplos de lenguajes orientados a objeto: Smalltalk, C++ y Java

Carrera Ingeniera En Sistemas

Pgina: N 3

PROGRAMACIN ESTRUCTURADA

Programa: objetos que se comunican mediante "mensajes"


Un objeto puede estar formado por otros objetos
Cada objeto en una "instancia" de una "clase" o categora
Clase: definicin de las caractersticas comunes de un conjunto de objetos
o Interfaz: conjunto de mtodos
o Estructura: conjunto de variables
Cada objeto de la misma "clase" puede recibir los mismos mensajes
Un objeto tiene: identidad nica, "state" (estado interno, datos propios),
"methods" (para generar un comportamiento)

Carrera Ingeniera En Sistemas

Pgina: N 4

PROGRAMACIN ESTRUCTURADA

Cmo se ejecuta un programa?


Cdigo fuente: programas escritos en un lenguaje de alto nivel
Traduccin a un lenguaje ejecutable por procesador del ordenador
o Compilador: traduce cdigo fuente a instrucciones bsicas del
ordenador (cdigo mquina), que luego se ejecutan
o Intrprete: traduce instruccin a instruccin del cdigo fuente, a
cdigo mquina, y la ejecuta

HISTORIA DEL LENGUAJE C

C fue creado por Dennis Ritchie en 1972 en un computador DEC PDP-11,


con sistema operativo UNIX
C es sucesor del antiguo lenguaje B, desarrollado por Ken Thompson
La primera versin de C fue el estndar utilizado para la construccin del
verdadero UNIX actual UNIX System V
Su rpida aparicin ocasiona la aparicin de muchas variantes y problemas
de compatibilidad

Existe un estndar ISO de 1986 denominado ANSI(American National Standars


Institute) C. En teora, un lenguaje 100% ANSI C sera portable entre plataformas
y/o arquitecturas pero en la prctica esto no es siempre cierto.
En 1989 se adopta el primer estndar con lo cual aparecen los primeros
compiladores para C.
En 1999 se adopt el ltimo estndar conocido como C99 con algunas mejoras e
ideas de C++.
Actualmente coexisten ambos estndares (C89 y C99) pero se est migrando a
este ltimo.

Carrera Ingeniera En Sistemas

Pgina: N 5

PROGRAMACIN ESTRUCTURADA

CARACTERISTICAS

C es un lenguaje estructurado que permite trabajar a alto y bajo nivel, esto


permite mayor potencia y flexibilidad a cambio de menos abstraccin
No es un lenguaje fuertemente tipado, lo que significa que se permite casi
cualquier conversin de tipos de datos
Tiene un reducido nmero de palabras clave: 32 en C89 y 37 en C99
Los compiladores de C, en general, producen programas ejecutables muy
eficientes y portables
C dispone de una biblioteca estndar de funciones
Se distingue entre maysculas y minsculas
Palabras clave: siempre en minsculas
Todas las sentencias y declaracin de variables terminan en punto y coma
La ejecucin siempre comienza con la funcin main()
En resumen:
C es un lenguaje muy flexible, muy potente, muy popular pero que NO
PROTEGE AL PROGRAMADOR DE SUS ERRORES

PORTABILIDAD DE C
El compilador de C genera cdigo ejecutable multiplataforma

RESOLUCIN DE PROBLEMAS COMPUTACIONALES POR MEDIO DE


LA TECNOLOGA TOP-DOWN O DE LO COMPLEJO A LO SIMPLE
Se cree que uno de los aspectos ms importantes en la solucin de problemas
utilizando mtodos estructurados es el desarrollo de la solucin de problemas
desde una perspectiva descendente (Top-Down). Esto significa que primero
debemos concentrarnos en qu hacer en vez de cmo hacerlo. El proceso de
refinamiento, completado por etapas o pasos es frecuentemente llamado
refinamiento sucesivo o progresivo.
Ejemplo:
Supongamos que ha sido localizado un antiguo rollo (contribucin arqueolgica
sugiere que fue escrito a mediados de los aos cincuenta). La escritura en este
rollo est en ingls y se cree que contiene alguna nueva historia muy importante
acerca de los orgenes de la msica de rock. Sin embargo, el rollo es muy frgil,
y slo puede ser manipulado una sola vez. Por lo tanto, todos los interesados
acuerdan que al manipular deber ser copiado, para que su contenido pueda
estudiarse con profundidad.

Carrera Ingeniera En Sistemas

Pgina: N 6

PROGRAMACIN ESTRUCTURADA

Recursos
Un robot
Una caja de papel de formas continas (de la clase utilizada por las impresoras
de computadora)
Mquina de escribir
El robot es lo bastante complejo como para ser programado para ejecutar cierto
nmero de tareas simples: puede leer textos un carcter a la vez, y escribir cada
carcter presionando la tecla apropiada en una mquina de escribir. El robot puede
hacer esto rpidamente sin cometer errores nunca. Puede tambin reconocer el
final de una lnea escrita y el final del propio texto.
El que hacer:
Copiar RolloAntiguo a RolloNuevo
Refinamiento:
Preparar RolloAntiguo para lectura
Preparar RolloNuevo para escritura
Copiar una lnea de RolloAntiguo a RolloNuevo
Mientras haya ms lneas por copiar
SECUENCIACIN
Una Secuenciacin es una serie de operaciones que son llevadas a cabo
(ejecutadas) una despus de la otra. Adems las operaciones en una serie se
agrupan y se consideran como una sola operacin. Las series de operaciones que
escribimos primero como solucin a un problema se convierten en la primera parte
de un programa.
Por ltimo, una secuenciacin puede tener una o ms
operaciones; la secuenciacin ms corta tiene una sola operacin.
REPETICIN
Recuerde que la tercera operacin de nuestra solucin presenta la repeticin:
Copiar una lnea de RolloAntiguo a RolloNuevo
Mientras haya ms lneas por copiar.
Entonces se realiza la pregunta Hay ms lneas por copiar?
Si la respuesta es s copiamos una lnea de RolloAntiguo a RolloNuevo.
respuesta es no la operacin est completa.

Si la

REFINAMIENTO SUCESIVO
Si el robot comprende el cmo preparar el RolloAntiguo y el RolloNuevo entonces
estas dos operaciones no necesitan ningn refinamiento y se convierten en parte
del cmo ejecutar la operacin copiar.
Si el robot no entiende lo que se requiere, entonces sera necesario un refinamiento
adicional.
Sabemos que el robot no comprende cmo copiar una lnea entonces debemos
refinar nuestra solucin para poder describir cmo llevarla a cabo:
Copiar un carcter de RolloAntiguo a RolloNuevo
Mientras haya ms caracteres en la lnea.

Carrera Ingeniera En Sistemas

Pgina: N 7

PROGRAMACIN ESTRUCTURADA

Despus:
Copiar un carcter de RolloAntiguo a RolloNuevo
Mientras haya ms caracteres en la lnea.
Colocarse al principio de la siguiente lnea de RolloAntiguo
Colocarse al principio de la siguiente lnea de RolloNuevo
El robot no sabe como copiar un carcter:
Mientras haya ms caracteres en la lnea de RolloAntiguo
Leer un carcter de RolloAntiguo
Escribir ese carcter en RolloNuevo presionando
La tecla correspondiente en la mquina de escribir
Colocarse al principio de la siguiente lnea de RolloAntiguo
Colocarse al principio de la siguiente lnea de RolloNuevo
Esto sugiere que el robot repita la lectura y la escritura de un carcter mientras
haya ms caracteres en una lnea.

CONCLUSIONES

Plantearnos la solucin de un problema en trminos generales Qu hacer y


omitiendo los detalles de Cmo hacerlo
La solucin de un problema se puede plantear como una secuencia de
procedimientos donde cada procedimiento en s se convierte en un problema
de menor escala por resolver
En las primeras etapas no queremos ocuparnos de los detalles de bajo nivel de
la solucin, es decir del cmo hacerlo. Primero organizamos nuestras ideas de
tal manera que podamos esbozar la solucin como una serie de procedimientos
Cuando estamos trabajando los detalles ms minuciosos de una operacin nos
preocupamos nicamente por esa operacin. Lo que simplifica nuestro trabajo
De este enfoque se dice que es de arriba-debajo de lo general a lo especfico.
Tambin se le ha llamado refinamiento paso a paso o sucesivo programas que
requieren subprogramas (procedimientos), los cuales en su momento pueden
requerir subprocedimientos

PROGRAMAS Y PROCESOS
Refinemos nuestra solucin convirtindola en un programa.
El programa se llama Copiar que comprende tres operaciones:
Las dos primeras (preparar para leer y preparar para escribir)
Tercera operacin copiar una lnea
El robot entiende la tarea de preparar y el copiar una lnea no es un procedimiento
comprendido por el robot.
Procesos.- Es una secuencia de operaciones; el nombre del proceso se refiere a
una secuencia de operaciones especfica. Entonces un proceso es muy parecido a
un programa, pero est subordinado o es controlado por un programa. A los
procedimientos o procesos tambin se los llama como subprogramas.

Carrera Ingeniera En Sistemas

Pgina: N 8

PROGRAMACIN ESTRUCTURADA

1.
2.
3.
4.
5.

Deber:
Algoritmo
Algoritmo
Algoritmo
Algoritmo
Algoritmo

para
para
para
para
para

llegar a la ESPOCH
cambiar un neumtico bajo en el automvil
cambiar un foco quemado
aprobar la materia de lenguajes de programacin I
realizar un pastel

CONFERENCIA # 2

Herramientas para la solucin de problemas


Diagramas estructurales del programa
Estructuras de control lgico
Estructuras de datos
Lenguaje de definicin del programa (PDL)
Ejemplo: Tratamiento en PDL del problema de copiar el contenido del Rollo
antiguo a un Rollo Nuevo

HERRAMIENTAS PARA LA SOLUCIN DE PROBLEMAS


Las herramientas para la solucin de problemas son 4 y son las siguientes:
1. Diagramas estructurales del programa
2. Estructuras de control lgico
3. Estructuras de datos
4. Lenguaje de definicin del programa

DIAGRAMAS ESTRUCTURALES DEL PROGRAMA


Una forma alterna de enfocar la solucin a un problema es dibujar un diagrama
estructural del programa, en el cual se muestran las relaciones entre un programa
y sus procesos. Ejemplo COPIAR

COPIAR

Preparar RolloAntiguo

Preparar RolloNuevo

CopiarUnaLinea

Un diagrama estructural es una representacin grfica de la relacin entre un


programa y sus procesos. Proporciona una documentacin visual de la estructura
en conjunto de la solucin de un problema.

ESTRUCTURAS DE CONTROL
Las estructuras de control se usan para mostrar la lgica de una solucin. Una
estructura de control muestra las condiciones que controlan, o determinan, si una
operacin debe terminarse. Podemos decir que las estructuras de control son los
medios por los cuales organizamos y decidimos si se ejecutan o no diversas partes
de la solucin y bajo qu condiciones. Es este modo las estructuras de control son
las herramientas que utilizamos para organizar y controlar la solucin lgica de un
problema.
Existen tres estructuras de control:

Carrera Ingeniera En Sistemas

Pgina: N 9

PROGRAMACIN ESTRUCTURADA

Secuenciacin (agrupamiento de uno o ms pasos que son manejados como


uno solo)
Repeticin de una secuenciacin
Seleccin de una secuenciacin

Secuenciacin.- es un agrupamiento de una o ms operaciones que describe


qu o cmo hacer alguna tarea.
Repeticin.La estructura de repeticin est diseada para controlar la
repeticin de una secuenciacin. Prueba si una repeticin deber realizarse. La
prueba consiste en formular una pregunta; si la respuesta es s, entonces se
ejecuta la secuenciacin indicada. El proceso se repite hasta que la respuesta a la
pregunta sea no. Despus se ejecuta la operacin que sigue a la repeticin.
Seleccin.- La estructura de seleccin nos permite determinar cul de los
diversos cursos posibles de accin se escoge. La forma ms simple de la estructura
de seleccin es el enunciado if / else.

ESTRUCTURAS DE DATOS
Una estructura de datos es algo parecido a un modelo. Nos proporciona una
manera precisa de ver cmo diferentes datos se almacenan en la memoria de la
computadora. Y ms que eso, el tipo de estructura de datos define cules
operaciones estn permitidas y cules no para los diferentes datos. Por ejemplo
para los tipos de datos numricos estn permitidas las operaciones aritmticas y
de comparacin. Para los datos tipo carcter no est permitidas las operaciones
aritmticas, pero s estn permitidas las operaciones de comparacin.
Operaciones aritmticas:
Sumar
Restar
Multiplicar
Dividir
Races cuadradas
Tablas
Vectores
Operaciones con caracteres:
Comparar
Leer
Escribir
Construir palabras
Lneas
Pginas
Volmenes

LENGUAJE DE DEFINICIN DEL PROGRAMA


Un Lenguaje de Definicin de Programa, o PDL (Program Definition Language), es
una manera razonablemente precisa de describir cmo las estructuras de control
controlan las operaciones sobre los datos. Algunos llaman a este lenguaje
pseudolenguaje (lenguaje falso), ya que se parece un poco al lenguaje de
programacin y un poco al lenguaje natural, sin ser ninguno realmente. En la
ingeniera de software el PDL se usa extensamente para describir las soluciones a
un problema antes de escribir dichas soluciones en un lenguaje de computadora.

Carrera Ingeniera En Sistemas

Pgina: N 10

PROGRAMACIN ESTRUCTURADA

Ntese el uso de la palabra Programa (main) para mostrar que estamos


describiendo la lgica para un programa, usaremos { (Comienza) y } (termina o
fin.) La cabecera del programa se escribe cargada a la izquierda como la cabecera
principal de un bosquejo. Todos los elementos definidos dentro del programa
aparecen indentados para resaltar que son elementos subordinados.
Adems se utilizarn las palabras clave While
do (Mientras Ejecutar) { }
formando un conjunto de llaves alrededor de las operaciones que se repiten. Por
lo tanto While y }se usan para delimitar las operaciones que se repetirn.
Ejemplo:
Programa Copiar de RolloAntiguo a RolloNuevo
CUERPO DE ROGRAMA
{ Operaciones de Copiar
Preparar RolloAntiguo para lectura
Preparar RolloNuevo para escritura
While existan ms lneas en RolloAntiguo Do
{
CopiarUnaLinea de RolloAntiguo a RolloNuevo
}
} operaciones de Copiar
Ahora construiremos la lgica de nuestro procedimiento CopiarUnaLnea. El PDL
para un procedimiento es bastante similar al de un programa. La diferencia ms
grande es que se usa la palabra Proceso en lugar de Program.
Ejemplo:
Proceso CopiarUnaLnea
{operaciones de CopiarUnaLnea
While existan ms caracteres en esta lnea de RolloAntiguo Do
{
Leer un carcter de RolloAntiguo
Escribir un carcter en RolloNuevo presionando
La tecla correcta en la mquina de escribir
}
Colocarse al principio de la siguiente lnea de RolloAntiguo
Colocarse al principio de la siguiente lnea de RolloNuevo
} operaciones de CopiarUnaLnea
Ahora debemos ensamblar todas las partes dentro del programa completo. Los
procesos se definen antes de utilizarse en el programa.
Ejemplo:

Carrera Ingeniera En Sistemas

Pgina: N 11

PROGRAMACIN ESTRUCTURADA

Programa Copiar de RolloAntiguo a RolloNuevo


Proceso CopiarUnaLnea
{ operaciones de CopiarUnaLnea
While existan ms caracteres en esta lnea de RolloAntiguo Do
{
Leer un carcter de RolloAntiguo
Escribir un carcter en RolloNuevo presionando
La tecla correcta en la mquina de escribir
}
Colocarse al principio de la siguiente lnea de RolloAntiguo
Colocarse al principio de la siguiente lnea de RolloNuevo
} operaciones de CopiarUnaLnea
CUERPO DEL PROGRAMA
{
Operaciones de Copiar
Preparar RolloAntiguo para lectura
Preparar RolloNuevo para escritura
While existan ms lneas en RolloAntiguo Do
{
CopiarUnaLinea de RolloAntiguo a RolloNuevo
}
} operaciones de Copiar

Deber:
1. Contar el nmero de lneas que contiene Rollo Nuevo
2. Reemplazar @ por la palabra "en" en el Rollo Nuevo
3. Proceso para facturar un pedido
4. Proceso para matricularse en la materia de Lenguajes de programacin I
5. Aadir uno propio

CONFERENCIA # 3

Proyecto informtico
Pasos para la solucin de problemas
Ejemplo: Ingresar por teclado 5 pares de nmeros y comparar si son iguales,
si el primer nmero es mayor que el segundo o, si el primer nmero es menor
que el segundo

PROYECTO INFORMTICO
Ordenadores e informtica son trminos que van unidos y se complementan. La
informtica estudia el tratamiento automtico de la informacin a travs de medios
electrnicos. Y estos son los ordenadores.
El ordenador es la mquina electrnica que trata la informacin mediante el
programa almacenado en su memoria.
El proceso de datos con ordenador mecaniza y automatiza la realizacin de tareas
rutinarias.

PASOS PARA LA SOLUCIN DE PROBLEMAS


Cada paso deber seguirse cuidadosamente. Intentar abreviar el proceso pasando
demasiado aprisa por los primeros pasos aumenta la posibilidad de errores en la
solucin.

Carrera Ingeniera En Sistemas

Pgina: N 12

PROGRAMACIN ESTRUCTURADA

1. Comprender el problema
Primero debemos analizar cuidadosamente los requerimientos del problema.
Debemos insistir en que los requerimientos del problema sean claramente
especificados en trminos de los resultados esperados. Se debe de determinar:
La fuente y el tipo de datos para la entrada
La interaccin de los datos y su transformacin
El destino y el formato de la salida
2. Disear una solucin
Los pasos preliminares de una solucin pueden escribirse como una secuenciacin
sin tomar mucho en cuenta la necesidad de comunicar nuestra solucin a otros.
Adems necesitamos organizar la informacin para que sea comprensible para
nosotros y los dems. Utilizaremos un PDL.
3. Probar el diseo
Debemos estar convencidos de que la lgica escrita resuelve de hecho el problema
planteado. S realizamos la secuenciacin obtendremos la salida que esperamos
a partir de la entrada suministrada?. Si no, debemos regresar al paso 2, corregir
el diseo y luego probar otra vez.
4. Traducir el diseo a un lenguaje de programacin
Este paso tambin se lo llama codificacin, o sea traducir un diseo a un lenguaje
de programacin. Ahora debemos considerar todas las reglas de organizacin y
puntuacin del lenguaje de programacin.
5. Preparar el problema en el lenguaje seleccionado (Pascal, C. etc.)
Capturar en la computadora con la ayuda de un editor el programa traducido. Este
paso requiere la edicin (creacin o modificacin) del texto. Aqu es donde
comenzamos a utilizar el Ambiente Integrado de Desarrollo del sistema en nuestro
caso C++.
6. Compilacin del programa
El traductor del lenguaje seleccionado, o tambin llamado compilador, nos indicar
si hemos empleado correctamente la organizacin y la puntuacin. Si existen
errores hay que regresar al paso 5.
7. Correr el programa y comprobar los resultados
Debemos probar nuestra lgica para determinar si es correcta, probar el programa
con datos que estn al lmite, nmeros grandes o pequeos.
Si existen problemas es necesario descubrir qu pudo haber causado los resultados
errneos podemos usar diversas tcnicas para eliminar el error.
8. Depurar si es necesario (debug)
La eliminacin de errores se conoce como depuracin (debugging).
determina si el error es causado por:
Mal entendido del lenguaje de programacin (regresar al paso 4).
Por el diseo defectuoso (regresar al paso 2)
O por falta de comprensin del problema (regresar al paso 1).

Carrera Ingeniera En Sistemas

Aqu se

Pgina: N 13

PROGRAMACIN ESTRUCTURADA

CASO DE ESTUDIO: DISEO DESCENDENTE Y PRUEBA


Ejercicio:
Debemos disear un programa que procese cinco pares de nmeros. Los nmeros
estn arreglados por pares en cada una de las cinco lneas. El programa debe
examinar cada par y devolver uno de tres mensajes, dependiendo de s:
Los nmeros son iguales
El primero es mayor que el segundo, o
El segundo es mayor que el primero
Comprender el programa
Se determinarn las entradas y salidas requeridas.
Un posible conjunto de datos de entrada para el programa es:
35
52
49
67
35

46
38
23
67
-63
Los datos sern captados por el teclado de una terminal o de una
microcomputadora.
El mensaje de peticin aparecer en la pantalla.
Los resultados de la comparacin debern aparecer en la pantalla.
Debemos saber lo que significa pares de nmeros.
En la muestra se ven nicamente nmeros enteros.
En nuestro caso hay 5 entradas.

Pantalla:
Comparacin de parejas de nmeros enteros
Ingrese dos nmeros enteros
35
46
El primer nmero 35 es menos que el segundo nmero 46
Ingrese dos nmeros enteros
52
38
El primer nmero 52 es mayor que el segundo nmero 38
Ingrese dos nmeros enteros
49
23
El primer nmero 49 es mayor que el segundo nmero 23
Ingrese dos nmeros enteros
67
67
El primer nmero 67 es igual que el segundo nmero 67
Ingrese dos nmeros enteros
35
-63
El primer nmero 35 es mayor que el segundo nmero -63

Carrera Ingeniera En Sistemas

Pgina: N 14

PROGRAMACIN ESTRUCTURADA

Diseo de la solucin
CompararParDeNumeros

ImprimirEncabezado

ProcesarNumeros

Determinaremos una secuencia o procesos a seguir.


Los procesos no necesitan ser explicados al detalle.
Los procesos tomados en conjunto debern resolver completamente el
problema.

ImprimirEncabezado.- Es una tarea relativamente fcil.


ProcesarNumeros.- Esta es la tarea a refinar.

Llevar la cuenta del nmero de veces que se hayan completado los tres pasos.
Utilizacin de variables para el almacenamiento.

For (inicializacin desde I=1; condicin(I<= 5);incremento I++)


{ Proceso 2a: PedirParNumeros
Proceso 2b: LeerParDeNumeros
Proceso 2c: CompararNumerosEImprimirMensaje.
}
CompararParDeNumeros

ImprimirEncabezado

PedirParDeNumeros

ProcesarNumeros

LeerParDeNumeros

CompararNumerosEImpri
mirMensaje

Prueba del diseo


Debemos estar convencidos de que nuestra solucin, expresa en trminos
generales, resolver el problema, antes de que podamos comenzar con los
detalles.
Revisar los datos y la secuencia de los procedimientos.
Revisar en el papel si los procesos que estn fuera del for se ejecutan una sola
vez.
Refinamiento sucesivo y procesos
El refinamiento proseguir hasta que cada paso haya sido traducido a las
instrucciones necesarias en un lenguaje de programacin.

Carrera Ingeniera En Sistemas

Pgina: N 15

PROGRAMACIN ESTRUCTURADA

1. ImprimirEncabezado
2. ProcesarNumeros.- se ha dividido en tres pasos:
2.1 PedirParDeNumeros
2.2 LeerParDeNumeros
2.3 CompararNumerosEImprimirMensaje
Las tres operaciones se realizan completamente por cada par de nmeros
introducidos desde el teclado
2.1 PedirParDeNumeros.- es un proceso bastante fcil
2.2 LeerParDeNumeros.- Este proceso requiere que tengamos dos nombres de
variables uno por cada nmero. Primero y Segundo para nombrar las
localidades de memoria.
2.3 CompararNumerosEImprimirMensaje.- es ms complicado y se muestra de la
siguiente manera:
If el nmero en Primero es menor que el nmero en Segundo
Imprimir Mensaje1
Else
Hacer ms comparaciones
If el nmero en Primero es menor que el nmero en Segundo
ImprimeMensaje1
Else
If el nmero en Primero es Mayor que el nmero en Segundo
ImprimeMensaje2
Else
{
Los dos nmeros deben ser iguales as que
ImprimeMensaje3
}
Este diseo detallado muestra tres procesos ms.
CompararNumerosEImprimirMensaje

ImprimeMensaje1

ImprimeMensaje2

ImprimeMensaje3

Lo que sigue es el diseo de ImprimeMensaje1 (Mensaje1 se imprime cuando el


primer nmero es el menor). Debern escribirse diseos similares para imprimir
los otros dos mensajes.
Imprimir una copia del nmero almacenado en Primero
Imprimir el mensaje: ' es menor que el segundo nmero'
Imprimir una copia del nmero almacenado en Segundo
Terminar la lnea de salida (retorno de carro)
El programa PDL completo representado en una versin de alto nivel de
ComparaParDeNumeros:

Carrera Ingeniera En Sistemas

Pgina: N 16

PROGRAMACIN ESTRUCTURADA

Programa ComparaParDeNumeros
CUERPO DEL PROGRAMA
{operaciones de ComparaParDeNumeros
ImprimirEncabezado
ProcesarNumeros
} operaciones de CompararParDeNumeros.
Deber:
1. Completar el PDL del ejercicio.
2. Tomar una cpsula cuatro veces al da (a intervalos regulares). Asegrese de
tomar todas las cpsulas del frasco. No suspenda el medicamento an si los
sntomas desaparece.
3. Suponga que el RolloAntiguo contiene un carcter, digamos @, que significa
en. Tambin suponga que esta abreviatura ya no se usar en adelante.
Redisee el programa Copiar para que cada @ que aparezca en el RolloAntiguo
sea traducida como "en" en el RolloNuevo.
4. Suponga que a uno de los arquelogos involucrados en el estudio del
RolloAntiguo le gustara que nuestro programa Copiar reportara el nmero de
lneas que fueron copiadas. Redisee el programa Copiar para que cuente el
nmero de lneas copiadas, as estn vacas. Use la variable Lneas para llevar
la cuenta. Recuerde asignar el valor cero a Lnea antes de comenzar la cuenta.
5. Redisee el programa CompararParDeNumeros para que procese ms de cinco
pares de nmeros.

APLICACIN PRCTICA # 4

Aplicacin de las herramientas y de los pasos para la solucin de problemas


computacionales
Ejemplo: Dados los 3 lados de un tringulo: L1, L2 y L3 verificar si el tringulo
es Issceles (dos lados iguales), Equiltero (tres lados iguales) o Escaleno (tres
lados distintos).

Deber:
1. Probar si los tres lados L1, L2, L3 pertenecen o no a un tringulo: es un
tringulo si la suma de sus dos lados menores es mayor al lado mayor. Si es
tringulo identificar qu tipo de tringulo
2. Verificar si un nmero ingresado por teclado es o no un nmero primo
3. Verificar si un nmero ingresado por teclado es o no un nmero perfecto
4. Cmo se realiza un cobro de una planilla elctrica?
5. Cmo se realiza la compra de distintos productos en un almacn

APLICACIN PRCTICA # 5

Tarea de investigacin: Los sistemas operativos ms difundidos en el


mercado

QU ES UN SISTEMA OPERATIVO?
Un sistema operativo es un conjunto de instrucciones que ejecuta el procesador del
sistema que tiene por misin el controlar todos los dispositivos instalados en el
sistema y permitir que los otros programas de ordenador puedan usarlos.

ESTRUCTURA DE UN SISTEMA OPERATIVO

Carrera Ingeniera En Sistemas

Pgina: N 17

PROGRAMACIN ESTRUCTURADA

El sistema operativo est formado por dos componentes principales:


Ncleo
Sistemas utilitarios.
N
U
C
L
E
O

A d. Tra ba jo

A d. Ta rea s

A d. Da to s

A d.
D isp os itivos

S .O .

E . Tex to

H . Ele ctr nic as

B . D at os

E dit ore s

G rfico s

Im pres ora s

F orm a t

P ro g ram as
U tilitario s

P ro g ram as
E xte rrno s
al
S is te m a O p e rativo

Ju eg os

Administracin de trabajos
En computadoras pequeas, el sistema operativo responde a los comandos del
usuario y carga en memoria el programa de aplicacin requerido para su ejecucin.
En grandes computadoras, el sistema operativo lleva a cabo las instrucciones de
control de trabajos, las que pueden describir la mezcla de programas que deben
ser ejecutadas para un conjunto completo de tareas.
Administracin de tareas
En computadoras monotarea, el sistema operativo no tiene virtualmente ninguna
administracin de tareas que realizar, pero en computadoras multitarea es
responsable de la operacin simultnea de uno o ms programas. En los sistemas
operativos modernos poseen la habilidad de asignar prioridades a los programas
de modo tal que se ejecute un trabajo antes de otro (Gestionar una cola de tareas
a imprimir). Primero en entrar primero en salir.
Los sistemas operativos avanzados disponen de mayores capacidades para
acelerar o retardar un trabajo por medio de comandos del operador de la
computadora.
Administracin de datos
Una de las funciones principales de un sistema operativo es la de llevar la cuenta
de los datos en el disco; de aqu la denominacin DOS (Disk operating system
sistema operativo en disco). Los programas de aplicacin no saben dnde se
encuentran almacenados los datos o cmo obtenerlos. Estos conocimientos estn
contenidos en las rutinas de mtodos de acceso del sistema o controladores de

Carrera Ingeniera En Sistemas

Pgina: N 18

PROGRAMACIN ESTRUCTURADA

dispositivos. Cuando un programa est listo para aceptar datos, le pasa una seal
al sistema operativo mediante un mensaje codificado. El sistema operativo busca
el dato y lo entrega al programa. A la inversa, cuando el programa est listo para
emitir datos, el sistema operativo transfiere estos datos del programa al espacio
disponible en el disco.
Administracin de dispositivos
En teora, el sistema operativo debe ser capaz de administrar todos los
dispositivos, no solamente los controladores de disco. Se supone que puede
manejar las entradas y las salidas a la pantalla de presentacin, as como la
impresora. Manteniendo los detalles del dispositivo perifrico dentro del sistema
operativo, el dispositivo puede ser reemplazado por un modelo ms moderno, y
slo debe cambiarse en el sistema operativo la rutina que se encarga de este
dispositivo.
Seguridad
Los sistemas operativos multiusuario mantienen una lista de los usuarios
autorizados y proveen proteccin de claves de acceso (passwords) contra los
usuarios no autorizados que pueden intentar introducirse en el sistema. Los
sistemas operativos ms potentes mantienen asimismo registro de actividad del
sistema y contabilidad del tiempo del usuario con fines de facturacin. Tambin
proveen rutinas de respaldo y recuperacin para comenzar nuevamente en el caso
de un fallo del sistema.

FUNCIONES DEL SISTEMA OPERATIVO

Ordenamiento en el tiempo
Administracin de recursos
Inicia y controla las operaciones de entrada/salida, manipula errores
(interrupciones)
Coordina la comunicacin entre el operador y la mquina
Controla el modo de programacin que puede ser
Serial
Tiempo compartido
Tiempo real
Optimizar el rendimiento del sistema
Controlar el acceso de usuarios
Permite cambiar la configuracin del equipo (en DOS es el archivo
CONFIG.SYS9)

CONSIDERACIONES TCNICAS PARA LA SELECCIN DE UN SISTEMA


OPERATIVO

El nmero de usuarios.
El tipo de aplicaciones que se van a utilizar.
Qu lenguajes soporta el sistema operativo.
Que proteccin se va a dar a los usuarios contra accidentes, e interrupciones.
Proporciones seguridades en cuanto al control del usuario.
Que posee las utilidades bsicas como son programas de formato, editores, etc.

RELACIN DEL SISTEMA OPERATIVO, HARDWARE Y USUARIO

Carrera Ingeniera En Sistemas

Pgina: N 19

PROGRAMACIN ESTRUCTURADA

1
2

10
11

12

13

14

15
1. Usuario
2. Programas utilitarios: Base de Datos
3. Hojas electrnicas
4. Editores de texto
5. Programas de aplicacin
6. Programas de utilidad: Lenguajes de programacin
7. Programas compiladores
8. Ensambladores
9. Cargadores
10.Sistema operativo
11.Administrador de trabajos
12.Administrador de tareas
13.Administrador de datos
14.Administrador de dispositivos
15.Hardware.

CONFERENCIA # 6

Lenguaje de programacin C++


Generalidades
Historia y desarrollo de C++
Tarea de investigacin: Componentes del IDE de C++ (composicin del
men principal)

HISTORIA Y DESARROLLO DEL C++


La historia del lenguaje de programacin C++ comienza a principios de los aos
70, con un programador de nombre Dennis Ritchie que trabajaba en los
laboratorios de AT&T Bell.
Trabajando con un lenguaje llamado BCPL inventado por Martin Richards (que
luego influy para crear el B de Ken Thompson), Dennis deseaba un lenguaje que
le permitiese manejar el hardware de la misma manera que el ensamblador pero
con algo de programacin estructurada como los lenguajes de alto nivel. Fue
entonces que cre el C que primeramente corra en computadoras PDP-7 y PDP11 con el sistema operativo UNIX. Pero los verdaderos alcances de lo que sera
ste, se veran poco tiempo despus cuando Dennis volvi a escribir el compilador
C de UNIX en el mismo C, y luego Ken Thompson (diseador del sistema) escribi
UNIX completamente en C y ya no en ensamblador.

Carrera Ingeniera En Sistemas

Pgina: N 20

PROGRAMACIN ESTRUCTURADA

Al momento de que AT&T cedi (a un precio bastante bajo) el sistema operativo a


varias universidades, el auge de C comenzaba. Cuando fueron comerciales las
computadoras personales, empezaron a disearse varias versiones de
compiladores C, ste se convirti en el lenguaje favorito para crear aplicaciones.
En 1983, el Instituto Americano de Normalizacin (ANSI) se dio a la tarea de
estandarizar el lenguaje C, aunque esta tarea tard 6 aos en completarse, y
adems con la ayuda de la Organizacin Internacional de Normalizacin (ISO), en
el ao de 1989 defini el C estndar.
A partir de ste, se dio pie para evolucionar el lenguaje de programacin C. Fue
en los mismos laboratorios de AT&T Bell, que Bjarnes Stroutstrup dise y
desarroll C++ buscando un lenguaje con las opciones de programacin orientada
a objetos.
Ahora el desarrollo del estndar de C++ acaparaba la atencin de los diseadores.
En el ao 1995, se incluyeron algunas bibliotecas de funciones al lenguaje C. Y con
base en ellas, se pudo en 1998 definir el estndar de C++.
Algunas personas podran pensar que entonces C++ desplaz a C, y en algunos
aspectos podra ser cierto, pero tambin es cierto que algunas soluciones a
problemas requieren de la estructura simple de C ms que la de C++, C
generalmente es usado por comodidad para escribir controladores de dispositivos
y para programas de computadoras con recursos limitados.
La base del lenguaje fue creada por programadores y para programadores, a
diferencia de otros lenguajes como Basic o Cobol que fueron creados para que los
usuarios resolvieran pequeos problemas de sus ordenadores y el segundo para
que los no programadores pudiesen entender partes del programa.
C++ es un lenguaje de nivel medio pero no porque sea menos potente que otro,
sino porque combina la programacin estructurada de los lenguajes de alto nivel
con la flexibilidad del ensamblador. La siguiente tabla muestra el lugar del lenguaje
respecto a otros.

Carrera Ingeniera En Sistemas

Pgina: N 21

PROGRAMACIN ESTRUCTURADA

Ejemplos de lenguajes estructurados:

C++ es un superconjunto de C, cualquier compilador de C++ debe ser capaz de


compilar un programa en C. De hecho la mayora admite tanto cdigo en C como
en C++ en un archivo. Por esto, la mayora de desarrolladores compilan con C++
su cdigo escrito en C, incluso hay quienes, siendo cdigo en C ponen la extensin
CPP (extensin de los archivos de cdigo C++) y lo compilan con C++.

APLICACIN PRCTICA # 7

Familiarizacin y utilizacin del IDE de C++


Creacin de programas
Conservacin, compilacin, y ejecucin de un programa en el entorno de C++

CONFERENCIA # 8

Palabras reservadas del lenguaje C++


Tipos de datos
Estructura de un programa en C++
Declaracin y uso de constantes en un programa

PALABRAS RESERVADAS
Tienen un significado predeterminado para el compilador y slo pueden ser usadas
con dicho sentido.
auto
break
case
char
const
continue
default
do

double
else
enum
extern
float
For
goto
if

int
long
register
return
short
signed
sizeof
static

struct
switch
Typedef
Union
Unsigned
void
Volatile
While

Adems cada compilador puede aadir al conjunto de palabras estndar las suyas
de propia creacin.

IDENTIFICADORES
Los identificadores son nombres creados para designar constantes, variables,
tipos, funciones, etc., que forman parte de un programa.
Un identificador consta de uno o ms caracteres (letras, dgitos y caracteres de
subrayado); el primero debe ser una letra o el carcter _. El nmero de caracteres
no debe superar 31.

Carrera Ingeniera En Sistemas

Pgina: N 22

PROGRAMACIN ESTRUCTURADA

En C/C++ hay diferencia entre maysculas y minsculas. Entre todos los


identificadores distinguimos un conjunto de ellos, predefinidos, con un significado
especial para el compilador (palabras clave).

DIAGRAMA DE SINTAXIS DE UN IDENTIFICADOR VALIDO


Identificador

Letra
Letra
Dgito
Subrayado

Tipos de datos simples


El tipo de dato determina la naturaleza del valor que puede tomar una variable.
Un tipo de dato define un dominio de valores y las operaciones que se pueden
realizar con stos valores.
C++ dispone de unos cuantos tipos de datos predefinidos (simples) y permite al
programador crear otros tipos de datos

Tipo int
Tamao en bytes: 2 bytes (16 bits)
Dominio: son todos los nmeros enteros entre los valores -32.768 y 32.767
Operaciones:

Carrera Ingeniera En Sistemas

Pgina: N 23

PROGRAMACIN ESTRUCTURADA

Tipo float
Tamao en bytes: 4 bytes
Dominio: son todos los nmeros reales que contienen una coma decimal,
comprendidos entre los valores:

Tipo double
Tamao en bytes: 8 bytes
Dominio: son todos los nmeros reales que contienen una coma decimal
comprendido entre los valores:

Carrera Ingeniera En Sistemas

Pgina: N 24

PROGRAMACIN ESTRUCTURADA

Adems de estas operaciones, C++ dispone de un gran conjunto de funciones


matemticas.

Tipo bool
Tamao en bytes: 1 byte
Dominio: dos nicos valores: {true, false}
No todos los compiladores de C++ tienen ste tipo de dato. En su lugar se utiliza
el tipo int para representar el tipo de datos bool, de forma que el valor entero 0
representa false y cualquier otro valor representa true.

Tabla de verdad:

Carrera Ingeniera En Sistemas

Pgina: N 25

PROGRAMACIN ESTRUCTURADA

Escritura de valores bool


Raramente se tiene la necesidad de escribir o leer valores de tipo bool ya que ste
tipo de datos se utiliza sobre todo para evaluar expresiones lgicas.
En caso necesario, si escribimos un dato de tipo bool cuyo valor es true, en consola
se visualiza el valor 1.
La lectura es anloga.
Tipo char
Tamao en bytes: 1 byte
Dominio: dgitos, letras maysculas, letras minsculas y signos de puntuacin.
Internamente, los caracteres se almacenan como nmeros. El tipo char representa
valores en el rango -128 y 127 y se asocian con el cdigo ASCII. As, el carcter
A se almacena como el nmero 65, etc. ...

0 < 1 < 2 . < 9 < A < B < < Z < a < b < < z
Operaciones:
Dado que los caracteres se almacenan internamente como nmeros enteros, se
pueden realizar operaciones aritmticas con los datos de tipo char. Se puede
sumar un entero a un carcter para obtener otro cdigo ASCII diferente.
Ejemplos:
Para convertir una letra minscula en mayscula basta con restar 32.
a - 32 = A
Para convertir una letra mayscula en minscula basta con sumar 32.
B + 32 = b
Para convertir el carcter 4 en el nmero 4 basta con restar 48.
4 - 48 = 4

Carrera Ingeniera En Sistemas

Pgina: N 26

PROGRAMACIN ESTRUCTURADA

Funciones:

Modificadores de tipos de datos


Los tipos de datos int, double y char tienen variaciones o modificadores de tipos
de datos.

Las computadoras realizan numerosas operaciones para la resolucin de


problemas,
- Operaciones aritmticas y lgicas
- Operaciones condicionales
Adems, puede ocurrir que en una misma expresin concurran varios tipos de
datos. Ante sta situacin, debemos saber cmo se comporta el compilador.

Carrera Ingeniera En Sistemas

Pgina: N 27

PROGRAMACIN ESTRUCTURADA

ESTRUCTURA DE LOS PROGRAMAS


Estructura de un programa
Un programa en C++ puede verse como un grupo de bloques construidos
llamados funciones. Una funcin es una o ms instrucciones en C++ designadas
para una tarea especfica.

#include <iostream.h>
La parte del #include se refiere a la biblioteca de funciones que vamos a utilizar.
Es decir para llamar a una biblioteca en particular debemos hacer lo siguiente:
#include <librera_solicitada>
El estndar de C++ incluye varias bibliotecas de funciones, y dependiendo del
compilador que se est usando, puede aumentar el nmero.
int main(void){
Todo programa en C++ comienza con una funcin main(), y slo puede haber una.
En C++ el main() siempre regresa un entero, es por eso se antepone int a la
palabra main. Los parntesis que le siguen contienen lo que se le va a mandar a
la funcin. En este caso se puso la palabra void que significa vaco, es decir que
a la funcin main no se le est mandando nada, podra omitirse el void dentro de

Carrera Ingeniera En Sistemas

Pgina: N 28

PROGRAMACIN ESTRUCTURADA

los parntesis, el compilador asume que no se enviar nada. La llave que se abre
significa que se iniciar un bloque de instrucciones.
cout<<hola mundo<<endl;
Esta es una instruccin. La instruccin cout est definida dentro de la biblioteca
iostream.h, que previamente declaramos que bamos a utilizar. Una funcin, en
este caso main() siempre comienza su ejecucin con una instruccin (la que se
encuentra en la parte superior), y contina as hasta que se llegue a la ltima
instruccin (de la parte inferior). Para terminar una instruccin siempre se coloca
;. Pero adems de instrucciones se pueden invocar funciones definidas por el
usuario (por supuesto diferentes de main) como se ver ms adelante.
return 0;
Esta es otra instruccin, en este caso la instruccin return determina que es lo que
se devolver de la funcin main(). Habamos declarado que main devolvera un
entero, as que la instruccin return devuelve 0. Lo cual a su vez significa que no
han ocurrido errores durante su ejecucin.
}
La llave de cierre de la funcin main() indica el termino del bloque de instrucciones.
En algunos programas de ejemplo, notar el uso de dobles diagonales (//). Estas
diagonales se usan para escribir comentarios de una lnea dentro del cdigo del
programa. Adems podr encontrar el uso de /* */ estos caracteres encierran
un comentario de varias lneas y cualquier cosa que se escriba dentro de ella no
influenciar en el desempeo del programa.
Directivas del preprocesador
Existen archivos de cabecera estndar muy utilizados

El uso ms frecuente en C++ de las directivas del preprocesador es la inclusin de


archivos de cabecera, pero tambin se usan para definir macros, nombres de
constantes, etc.
Comienzan con el smbolo # y son rdenes dadas al preprocesador para efectuar
determinadas acciones sobre el fichero fuente C/C++.
El preprocesador de C es un procesador de texto que manipula el archivo que
contiene el texto del programa fuente, como una primera fase de la compilacin.
Cuando se ejecuta la orden para compilar un fichero, el preprocesador procesa el
texto fuente antes de que lo haga el compilador, realizando las siguientes acciones:
1. Se elimina caracteres dependientes del sistema.
2. El texto fuente se descompone en elementos reconocibles por el C.
3. Se ejecuta las directivas, se expanden las macros, etc..

Carrera Ingeniera En Sistemas

Pgina: N 29

PROGRAMACIN ESTRUCTURADA

4. Se compila el cdigo fuente resultante.


Fuente.c
Preprocesador

Fuente_resultante.c

Compilador

Fichero.obj
Libreras

Link

fichero_ejecutable.exe

La funcin main()
Una funcin C++ es un subprograma que devuelve un valor, un conjunto de
valores o realiza una tarea especfica.
Todo programa C++ tiene una nica funcin main() que es el punto inicial de
entrada al programa.

DECLARACIN DE CONSTANTES Y VARIABLES


Constantes y variables C++
Son porciones de memoria que almacenan un valor
Las variables son palabras que manipulan datos. Dicho valor puede ser
modificado en cualquier momento durante la ejecucin del programa
Una constante es una variable cuyo valor no puede ser modificado
Las variables pueden almacenar todo tipo de datos: caracteres, nmeros,
estructuras, etc Dependiendo del valor de la variable, decimos que dicha
variable es de un tipo de dato
Tanto las variables como las constantes estn constituidas por un nombre
y un valor. El nombre lo llamaremos identificador

Carrera Ingeniera En Sistemas

Pgina: N 30

PROGRAMACIN ESTRUCTURADA

Declaracin de variables
La declaracin de una variable consiste en escribir una sentencia que proporciona
informacin al compilador de C++.
El compilador reserva un espacio de almacenamiento en memoria.
Los nombres de las variables se suelen escribir en minsculas.
El procedimiento para declarar una variable:

Una forma de expresar el procedimiento para declarar una variable es mediante


los diagramas sintcticos:

Declaraciones locales
Son variables locales aquellas que estn declaradas dentro de las funciones o de
los bloques.
Declaraciones globales ( variables globales, funciones, ) La zona de
declaraciones globales de un programa puede incluir declaraciones de variables y
declaraciones de funciones (prototipos).

Carrera Ingeniera En Sistemas

Pgina: N 31

PROGRAMACIN ESTRUCTURADA

Declaracin de constantes
Una constante es una variable cuyo valor no puede ser modificado.
Los nombres de las constantes se suelen escribir en maysculas.
1. Constantes declaradas const
La palabra reservada const es un calificador de tipo variable e indica que el valor
de variable no se puede modificar.

2. Constantes definidas
Se declaran mediante la directiva #define

3. Constantes enumeradas
Las constantes enumeradas permiten crear listas de elementos afines.

Carrera Ingeniera En Sistemas

Pgina: N 32

PROGRAMACIN ESTRUCTURADA

Ejemplo del funcionamiento de enumeraciones

CONFERENCIA # 9

Uso de las variables


Sentencia de asignacin
Operaciones bsicas
Operadores en C++
Funciones predefinidas
Operaciones de entrada/salida
Ejemplo: Uso de un programa que contenga constantes y variables

Carrera Ingeniera En Sistemas

Pgina: N 33

PROGRAMACIN ESTRUCTURADA

CONSTANTES DE CARCTER NO IMPRIMIBLES

Declaracin de variables
Todas las variables deben de ser declaradas antes de utilizarlas, aunque ciertas
declaraciones se realizan implcitamente por el contexto. Una declaracin
especifica un tipo, y le sigue una lista de una o ms variables de ese tipo.
Ejemplo:
int a, b;
char c;
Las variables tambin se pueden inicializar en su declaracin.
Ejemplo:
int i = 0;
float x = 3.4;
EJEMPLO: texto completo de condolar.cpp
// Programa: CONDOLAR.CPP
// Desc. : Convierte pesos a dlares
#include <iostream.h>
void main(void){
int pesos;
float dolares;
cout << endl << "Cuantos pesos desea convertir a dolares? ";
cin >> pesos;
dolares = pesos / 11;
cout << "Dolares = " << dolares;
}
Una variable es una posicin de memoria con nombre, empleada para guardar
un dato, que puede ser modificado durante la ejecucin del programa.

Carrera Ingeniera En Sistemas

Pgina: N 34

PROGRAMACIN ESTRUCTURADA

Sintaxis:

tipo_de_almacenamiento

tipo

nombre_de_variable;

ASIGNACIN: diagrama de sintaxis de la operacin de asignacin

Se evaluar la expresin y el resultado es asignado a la variable. El tipo resultante


de la expresin debe coincidir con el tipo de la variable.
Ejemplo:
a8
a = 8;
b5+3*2 -a
b = 5 + 3*2 a;

OPERACIONES BSICAS
Operadores aritmticos
Operador
Accin
resta y menos unario
+
suma
*
multiplicacin
/
divisin
%
modulo de divisin
-decremento
++
incremento
Operadores relacinales
Operador
Accin
>
mayor que
>
= mayor que o igual que
<
menor que
<=
menor o igual que
==
igual
!=
no igual
Nota: El doble signo igual == es la notacin de C++ para "es igual a". Este smbolo
se distingue de la condicin de igualdad del simple = empleado en las asignaciones.

Carrera Ingeniera En Sistemas

Pgina: N 35

PROGRAMACIN ESTRUCTURADA

Operadores lgicos
Operador
&&
||
!

Accin
and
or
not

Incremento
++ Incrementa en uno
Decremento
-- Decrementa en uno
Ejemplos:

Al usar la forma de prefijo la variable se incrementa o decrementa antes de ser


usada; en la forma pos fijo la variable primero se usa y despus se incrementa o
decrementa segn sea el caso.
EJEMPLO: texto completo de mas_mas.cpp
//Programa : mas_mas.cpp
// Descripcin: Demostracin del operador unario ++
#include <iostream.h>
void main(void) {
int i;
i = 10;
i++;
cout << "i = " << i;
cout << "\nSalida en posfija de i++ = " << i++;
cout << "\n\Salida de i = " << i;
cout << "\nSalida prefija de ++i = " << ++i;
}

Carrera Ingeniera En Sistemas

Pgina: N 36

PROGRAMACIN ESTRUCTURADA

1.6 Precedencia y orden de evaluacin de operadores

EJEMPLOS DE ASIGNACIONES
Operadores se asignacin
Operador Descripcin
++
Incremento.
-Decremento.
=
Asignacin simple.
*=
Multiplicacin ms asignacin.
/=
Divisin ms asignacin.
%=
Mdulo ms asignacin
+=
Suma ms asignacin.
-=
Resta ms asignacin
&=
Operacin AND sobre bits ms
asig.
|=
Operacin OR sobre bits ms
asig.

Ejemplo C
a ++
a-a =1
a *=5
a /=2
a %2
a +=2
a -=3
a&b

Pseudocdigo
a a+1
a a-1
a1
a a*5
a a/2
a a%2
a a+2
a a-3
aa&b

a |= b

aa|b

OPERACIONES DE ENTRADA/SALIDA
Instrucciones de Entrada / Salida
En C++ la entrada y salida se lee y escribe en flujos. Cuando se incluye la biblioteca
iostream.h en el programa, se definen automticamente dos flujos:

Esta biblioteca tambin nos proporciona dos operadores, uno de insercin (<<),
que inserta datos en el flujo cout y otro operador de extraccin ( >> ) para
extraer valores del flujo cin y almacenarlos en variables.

Carrera Ingeniera En Sistemas

Pgina: N 37

PROGRAMACIN ESTRUCTURADA

C++ utiliza secuencias de escape para visualizar caracteres que no estn


representados por los smbolos tradicionales.
Las ms utilizadas las mostramos en la siguiente tabla:

Deber:
1. Declaracin de constantes y variables de tipo entero, float, char
2. Realizar un programa que lea dos nmero y realice el clculo de suma, resta
multiplicacin y divisin entre dichos nmeros
3. Disear un programa que permita obtener el promedio de 4 notas

APLICACIN PRCTICA # 10

Uso de la estructura de un programa en C++


Declaracin de constantes y variables
Evaluacin de expresiones

CONFERENCIA # 11

Programacin estructurada
Estructura secuencial
Estructura de seleccin simple (IF /ELSE)
Omisin de la clusula ELSE
Sentencias compuestas

Programacin estructurada
Introduccin. Teorema de la programacin estructurada
El principio fundamental de la programacin estructurada es que en todo momento
el programador pueda mantener el programa dentro de la cabeza.
Esto se consigue con:
a) Un diseo descendente del programa,
b) Unas estructuras de control limitadas y
c) Un mbito limitado de las estructuras de datos del programa.
Hace ms fcil la escritura y verificacin de programas. Se adapta perfectamente
al diseo descendente.

Carrera Ingeniera En Sistemas

Pgina: N 38

PROGRAMACIN ESTRUCTURADA

Para realizar un programa estructurado existen tres tipos bsicos de estructuras


de control:
Secuencial: Ejecuta una sentencia detrs de otra.
Condicional: Se evala una expresin y, dependiendo del resultado, se
decide la siguiente sentencia a ejecutar.
Iterativa: Repetimos un bloque de sentencias hasta que sea verdadera una
determinada condicin.

Existe un teorema debido a que establece lo siguiente:


Todo programa propio se puede escribir utilizando nicamente las estructuras
de control secuencial, condicional e iterativa
Un programa propio es aquel que:
Tiene un nico punto de entrada y un nico punto de salida
Existen caminos desde la entrada hasta la salida que pasan por todas las
partes del programa
Todas las instrucciones son ejecutables y no existen bucles sin fin
Este teorema implica que la utilizacin de la sentencia GOTO es totalmente
innecesaria, lo que permite eliminar esta sentencia. Un programa escrito
con GOTO es ms difcil de entender que un programa escrito con las
estructuras mencionadas
Estructura secuencial
Ejecucin de sentencias una detrs de la otra. En C++, toda una estructura
secuencial se agrupa mediante los smbolos { y }.
Ejemplo:

Todo el bloque se considera una sola sentencia. Despus de las llaves no se pone
punto y coma.
Estructura condicional
Alternativa simple:

Carrera Ingeniera En Sistemas

Pgina: N 39

PROGRAMACIN ESTRUCTURADA

Alternativa doble:

Carrera Ingeniera En Sistemas

Pgina: N 40

PROGRAMACIN ESTRUCTURADA

Sentencias if anidadas:
Cuando la sentencia dentro del if es otra sentencia if.

Carrera Ingeniera En Sistemas

Pgina: N 41

PROGRAMACIN ESTRUCTURADA

EL MAYOR DE TRES NMEROS


#include <iostream.h>
#include <conio.h>
#include <stdio.h>

void main(void)
{
clrscr();
int a,b,c;
chart k;
printf(Se sale con ESC\n\n);
while(tk!=27)
{
printf(\n Ingresa A);
scanf(%d, &a);
printf(\n Ingresa B);
scanf(%d, &b);
printf(\n Ingresa C);
scanf(%d, &c);
printf(\n\n Ingresaste: %d,%d,%d\n,a,b,c);
if(a==b && b==c)
printf(Los tres nmeros son iguales\n\n);
else
if(a>b)

Carrera Ingeniera En Sistemas

Pgina: N 42

PROGRAMACIN ESTRUCTURADA

if(a>c)
printf(A es el mayor\n\n);
else
printf(C es el mayor\n\n);
else
if(b>c)
if(a==b)
printf(A
else
printf(B
else
if(c==b)
printf(B
else
printf(C

y B son los mayores\n\n);


es el mayor\n\n);
y C son los mayores\n\n);
es el mayor\n\n);

tk=getch();
}
}
Deber:
1. Disear un programa que permita determinar si un ao es bisiesto. Un ao es
bisiesto si es mltiplo de 4. Los aos mltiplos de 100 no son bisiestos salvo
si ellos son tambin mltiplos de 400 (Ejemplo: 2000 es bisiesto, 1800 no lo
es).
2. Disear un programa que permita ingresar una letra y decir si es no vocal
3. Encontrar el mayor de 3 nmeros
4. Encontrar el mayor, menor y el nmero intermedio entre 3 nmeros considere
tambin los casos en los que exista ms de un nmero igual
5. Dada la siguiente ecuacin:
AX 2 BX C 0
Encontrar:
B 2 4 AC
X 1, X 2 B
2A
Considere los casos:
Si el discriminante es mayor a 0 la respuesta ser dos nmeros reales
distintos
Si el discriminante es igual a 0 la respuesta ser dos nmeros reales
iguales
Si el discriminante es menor a 0 la respuesta ser dos nmeros
imaginarios

CONFERENCIA # 12

Sentencia de seleccin mltiple (switch)

Alternativa mltiple:

Carrera Ingeniera En Sistemas

Pgina: N 43

PROGRAMACIN ESTRUCTURADA

Pseudocdigo:

La expresin ya no es lgica, sino de tipo ordinal.


Una forma de implementar esta estructura es mediante sentencias if anidadas.

Carrera Ingeniera En Sistemas

Pgina: N 44

PROGRAMACIN ESTRUCTURADA

Carrera Ingeniera En Sistemas

Pgina: N 45

PROGRAMACIN ESTRUCTURADA

Importante resaltar la utilizacin de la palabra reservada break como seal de


final de las sentencias que van con cada opcin o conjunto de opciones.
Deber:
1. Disear un programa que permita ingresar 3 notas valoradas cada una de ellas
sobre una nota de 20 puntos. Obtener su promedio e imprimir uno de los
siguientes mensajes:
20-19 Sobresaliente
18-16 Muy buena
15-13 Buena
12-10 Regular
09-0 Insuficiente
2. Disear un programa que permita ingresar un caracter e imprimir un mensaje
que diga si es vocal, consonante, cifra o carcter especial
3. Ingresar un nmero que se encuentre entre 1 y 31 y decir si es un nmero
primo o no primo
4. Simular el trabajo de una calculadora en la que se sume, reste, multiplique y
divida siempre con un nmero fijo cualesquiera.
5. Disear un programa que permita calcular las funciones trigonomtricas

Carrera Ingeniera En Sistemas

Pgina: N 46

PROGRAMACIN ESTRUCTURADA

APLICACIN PRCTICA # 13

Uso de las estructuras de seleccin


IF/ELSE
Switch
Ejemplo: Control de los nmeros que sean pares
Deber
1. Pago de la factura de alquiler de un automvil
2. La fecha de Pascua se corresponde al primer domingo despus de la primera
luna llena que sigue al equinoccio de primavera y se calcula con las
siguientes expresiones
A = ao mod 19
B = ao mod 4
C = ao mod 7
D = (19*A+24) mod 30
E = (2*B+4*C+6*D+5) mod 7
N = 22 +D+ E
En el que N indica el nmero del da del mes de marzo (o abril s N es mayor a
31) correspondiente al domingo de pascua.
3. Disear un programa que permita resolver un sistema de 2 ecuaciones,
verificando que no se produzca divisin para cero
aX + bY = C
dX + eY = F
X= ce- df/ae-bd
Y= af - cd/ae-bd

CONFERENCIA # 14

Estructuras de repeticin
Sentencia While Do
Reglas de funcionamiento del While do
Sentencia do While
Reglas de funcionamiento del do While
Comparacin de los bucles while do/ do While
Ejemplo: Disear un programa que permita sumar n nmero enteros positivos
ingresados por el usuario y obtener su promedio utilizando While do y do While

ESTRUCTURAS REPETITIVAS
Son aquellas que crean un bucle (repeticin continua de un conjunto de
instrucciones) en la ejecucin de un programa respecto de un grupo de sentencias
en funcin de una condicin.
Las tres sentencias repetitivas de C++ son:
SENTENCIA WHILE
SENTENCIA DO WHILE
SENTENCIA FOR
Cabe destacar que todos funcionan hasta que se cumple con una condicin que es
la encargada de hacer parar el ciclo y continuar con el resto de instrucciones del
programa.

Carrera Ingeniera En Sistemas

Pgina: N 47

PROGRAMACIN ESTRUCTURADA

La sentencia puede no ejecutarse nunca si la condicin no se cumple.


Si la condicin est mal hecha, el bucle puede no acabar nunca. Es lo que se
denomina un bucle infinito
En C++ la sintaxis sera:
while (expresin lgica)
sentencia
Ejemplo:
cin >> n;
num = 1;
while (num <= n)
{
cout << num << endl;
num++;
}
Con el bucle mientras se puede construir cualquier estructura iterativa. De todas
maneras, por comodidad existen otras estructuras iterativas.
REGLAS DE FUNCIONAMIENTO DEL WHILE DO
1. Permite repetir un bloque de sentencias cero o ms veces dependiendo del
valor que se evala para una expresin booleana.

Carrera Ingeniera En Sistemas

Pgina: N 48

PROGRAMACIN ESTRUCTURADA

2. Primero se evala la condicin; si la expresin booleana es verdadera se


ejecuta el cuerpo del bucle y se vuelve a evaluar la condicin.
3. El proceso se repite mientras la condicin resulte cierta en cada evaluacin
y termina cuando la condicin evaluada es falsa.
Repetir (o hacer)

Repite la sentencia mientras la expresin sea cierta.


La sentencia siempre se ejecuta como mnimo una vez.

La sintaxis en C++:
do
sentencia
while (expresin lgica);

Se utiliza sobre todo en preguntas o mens, puesto que siempre se han de ejecutar
al menos una vez.

Carrera Ingeniera En Sistemas

Pgina: N 49

PROGRAMACIN ESTRUCTURADA

do
{
cout << "Introduce un entero";
cin >> i;
cout << "Es correcto (s/n)?";
cin >> c;
}
while (c != 's');
REGLAS DE FUNCIONAMIENTO DEL DO WHILE
1. Permite repetir un bloque de sentencias una o ms veces dependiendo del
valor que se evala para una expresin booleana.
2. Primero se ejecuta el cuerpo del bucle y luego se evala la condicin; si la
expresin booleana es verdadera se ejecuta el cuerpo del bucle.
3. El proceso se repite mientras la condicin resulte verdadera en cada
evaluacin y termina cuando la condicin evaluada es falsa.

POTENCIAS NUMRICAS
#include <iostream.h>
#include <conio.h>
void main (void)
{
double x, y, ac, i;
clrscr();
cout<< Programa que calcula potencias numricas \n;
cout<<digite la base (x)\n; cin>>x;
cout<<digite el exponente(y)\n; cin>>y;
ac=1;
i= 1;
while (i<=y)
{
ac=ac*x;
i++;
}
cout<<\n El resultado es: \n<<ac;
getch();
}

MANEJO DE CARACTERES
#include <stdio.h>
#include <conio.h>
void main (void)
{
char tk;
clrscr();
printf(se sale con Esc\n\n);
while (tk!= 27)
{
tk =getch();
}
}

Carrera Ingeniera En Sistemas

Pgina: N 50

PROGRAMACIN ESTRUCTURADA

Deber:
1. Disear un programa que permita encontrar la sumatoria de los n primeros
nmeros primos
2. Disear un programa que permita encontrar la sumatoria de los n primeros
nmeros perfectos. Un nmero es perfecto cuando es igual a la suma de todos
los nmeros para los cuales es divisible excepto el mismo nmero. (6 =
1+2+3).
3. Disear un programa que permita realizar la operacin de multiplicacin de dos
nmeros utilizando sumas sucesivas
4. Disear un programa que permita realizar la operacin de potenciacin
utilizando sumas sucesivas
5. Disear un programa que permita encontrar el factorial de un nmero

CONFERENCIA # 15

Sentencia FOR
Reglas de funcionamiento del FOR
Bucles anidados
Ejemplo: Disear un programa que permita generar la sumatoria de la serie:
1 2! 2 3! 3 .... n! n
2
2
2
2

Para (o desde)
Es como una estructura mientras, pero especialmente preparada para incorporar
un contador.
Pseudocdigo
para <variable> <- <valor inicial> hasta <valor final> hacer
<sentencia>
fin_para
La variable del bucle se denomina variable de control.
Ejemplo:
leer n
para num 1 hasta n hacer
escribir n
fin_para
Se utiliza cuando se conocen el nmero de veces que se van a repetir las
sentencias.
La variable de control NO se puede modificar dentro del bucle.
Cuando el bucle acaba, el valor de la variable de control es indeterminado.
La sintaxis en C++ es:
for(inicializacin; condicin; incremento)
sentencia

Carrera Ingeniera En Sistemas

Pgina: N 51

PROGRAMACIN ESTRUCTURADA

En C++, la instruccin for es como una instruccin while, con la salvedad de que
tiene espacios especiales para poner la inicializacin de la variable de control, la
condicin de repeticin y el incremento de la variable de control.
El incremento se realiza siempre despus de ejecutar la sentencia.
Al igual que en la instruccin while, la sentencia puede no ejecutarse nunca si la
condicin no se cumple.
Ejemplo:
cin >> n;
for(num = 1; num <= n; num ++)
cout << num << endl;
Se utiliza tambin para realizar sumatorias o productos con la ayuda de una
variable acumuladora:

Tipos de control de bucles


Existen tres formas tpicas de controlar cuando se ejecuta un bucle:
a) Bucles con contador (ya vistos).
b) Bucles controlados por indicadores (banderas o flags).

Decir si un nmero introducido por teclado contiene slo cifras menores que cinco;
bool menor;
int num;
cin >> num;
menor = true;
while (menor && (num > 0) )
{
if (num % 10 >= 5)

Carrera Ingeniera En Sistemas

Pgina: N 52

PROGRAMACIN ESTRUCTURADA

menor = false;
num = num / 10;
}
if (menor)
cout << Todas las cifras son menores que 5;
else
cout << Hay alguna cifra mayor o igual que 5;

c) Bucles controlados por centinela.

Bucles anidados
Los bucles, al igual que las sentencias condicionales, tambin se pueden anidar.
Esto es especialmente til para el manejo de matrices, como veremos en los temas
posteriores

CUNDO UTILIZAR WHILE DO/DO WHILE/FOR?


Utilizar la sentencia o estructura FOR cuando se conozca el nmero de
iteraciones, y siempre que la variable de control de bucle sea de tipo ordinal.

Carrera Ingeniera En Sistemas

Pgina: N 53

PROGRAMACIN ESTRUCTURADA

Utilizar la estructura DO WHILE cuando el bucle se realice por lo menos una


vez.
En todos los dems casos utilizar la sentencia WHILE.

SUMATORIAS
Disear un programa que sume los n primeros trminos de la serie:
1 2! 3!
+ + ..
2 22 23
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
void main(void)
{
clrscr();
int n,i,j,k,pot,fact;
float t, sum;
sum=0;
cout<<Ingrese el valor de n: << endl;
cin>> n;
for(i=1; i<=n;i++)
{
fact=1;
for(j=1; j<=i;j++)
{
fact=fact*j;// calcula el factorial
}
// calcula la potencia utilizando pow pot=pow(2,i);
pot=1;
for(k=1; k<=i;k++)
{
pot=pot *2;
}
t=fact/pot;
sum=sum +t;
}
}

MANEJO DE CADENAS
#include <iostream.h>
char mensaje[80];
int main()
{
system(cls);
cout<<Ingresa un mensaje;
cin.getline(mensaje, 79);

Carrera Ingeniera En Sistemas

Pgina: N 54

PROGRAMACIN ESTRUCTURADA

int i;
for(i=0;mensaje[i]!=\0;i++)
mensaje[i]=toupper(mensaje[i]);
cout<<\n El mensaje en maysculas es: <<mensaje;
return 0;
}
#include
#include
#include
#include

<stdio.h>
<ctype.h>
<iostream.h>
<conio.h>

int main()
{
char cadena[]=Esto es una cadena de prueba;
int i;
for(i=0;cadena[i];i++)
cadena[i]=toupper(cadena[i]);
cout<<\n El mensaje en maysculas es: <<cadena;
return 0;
}
Deber:
1. Disear un programa que permita generar la sumatoria de la serie:

a (a1)! a (a2)! a (a3)! .......


2. Disear un programa que permita generar la sumatoria de la serie:

2 4 4 6 6
......
3 3 5 5 7

3. Disear un programa que permita generar las tablas de multiplicacin


4. Imprimir todos los caracteres en minsculas que existen entre un intervalo de
maysculas ejemplo: A b c d e f g H

APLICACIN PRCTICA # 16

Uso del While do/ Do While / For


Tarea de investigacin: Consultar sobre todos los procedimientos y funciones
que se utilizan en el manejo de cadenas.
Ejemplo:
Disear un programa que permita calcular cuntas palabras existen en una
frase
Probar si una palabra ingresada por el usuario es o no palndromo. Una
palabra es palndromo cuando se lee igual de derecha a izquierda que de
izquierda a derecha ejemplo Ana, Radar, Oso
Deber:
1. Disear un programa que permita calcular cuntas vocales existen en una frase
2. Contar la incidencia de las letras en una palabra. Es decir cuantas veces se
repiten
3. En una frase contar palabras de longitud par y las de longitud impar que existan
en ella
4. Reemplazar las palabras de longitud par en una frase por asteriscos
5. Visualizar las palabras de longitud impar en una frase al revs

Carrera Ingeniera En Sistemas

Pgina: N 55

PROGRAMACIN ESTRUCTURADA

CONFERENCIA # 17
Programacin modular
Diseo descendente
Procedimientos
Declaracin de los procedimientos
Llamada al procedimiento
Ventajas de utilizar procedimientos
Los parmetros: transferencia de informacin a/desde procedimientos
Variables locales y globales
Funciones definidas por el usuario
Definicin
Llamada de funciones
Subprogramas. Funciones y procedimientos
Los subprogramas (procedimientos y funciones) constituyen una unidad de
ejecucin mayor que el bloque. Proporcionan abstraccin operacional al
programador y constituyen una unidad fundamental en la construccin de
programas.
Los subprogramas pueden ser vistos como un mini programa encargado de
resolver algortmicamente un subproblema que se encuentra englobado dentro de
otro mayor.
En ocasiones tambin pueden ser vistos como una
ampliacin/elevacin del conjunto de operaciones bsicas (acciones primitivas) del
lenguaje de programacin, proporcionndole un mtodo para resolver nuevas
operaciones.

Funciones y procedimientos
Dependiendo de su utilizacin (llamada) podemos distinguir dos casos:
Procedimientos: encargados de resolver un problema computacional. Se les
enva los datos necesarios y produce unos resultados que devuelve al lugar donde
ha sido requerido:
int main()
{
int x = 8;
int y = 4;
ordenar(x, y);
...
}
Funciones: encargados de realizar un clculo computacional y generar un
resultado (normalmente calculado en funcin de los datos recibidos) utilizable
directamente:
int main()
{
int x = 8;
int y = 4;
int z;
z = calcular_menor(x, y);
Definicin de subprogramas
Su definicin podra ser como se indica a continuacin:

Carrera Ingeniera En Sistemas

Pgina: N 56

PROGRAMACIN ESTRUCTURADA

void ordenar(int &a, int &b)


{
if (a > b)
{
int aux = a;
a = b;
b = aux;
}
}
int calcular_menor(int a, int b)
{
int menor;
if (a < b)
{
menor = a;
}
else
{
menor = b;
}
return menor;
}
La definicin de un subprograma comienza con una cabecera en la que se
especifica en primer lugar el tipo del valor devuelto por este si es una funcin, o
void en caso de ser un procedimiento.
A continuacin vendr el nombre del subprograma y la declaracin de sus
parmetros.
El cuerpo del subprograma determina la secuencia de acciones necesarias para
resolver el problema especificado. En el caso de una funcin, el valor que toma
tras la llamada vendr dado por el resultado de evaluar la expresin de la
construccin return. Aunque C++ es ms flexible, y nosotros slo permitiremos
una nica utilizacin del return y deber ser al final del cuerpo de la funcin.
Nota: la funcin calcular_menor anterior tambin podra haber sido definida de la
siguiente
forma:
int calcular_menor(int a, int b)
{
return ( (a < b) ? a : b ) ;
}
Normalmente la solucin de un subproblema o la ejecucin de una operacin
depender del valor de algunos datos, modificar el valor de otros datos, y
posiblemente generar nuevos valores.
Todo este flujo de informacin se realiza a travs de los parmetros o argumentos
del subprograma.

Carrera Ingeniera En Sistemas

Pgina: N 57

PROGRAMACIN ESTRUCTURADA

Parmetros por valor y por referencia


Llamaremos argumentos o parmetros de entrada a aquellos que se utilizan para
recibir la informacin necesaria para realizar la computacin. Por ejemplo los
argumentos a y b de la funcin calcular_menor anterior.
Los argumentos de entrada se reciben por valor, que significa que son valores que
se copian desde el sitio de la llamada a los argumentos en el momento de la
ejecucin del subprograma.
Se declaran especificando el tipo y el identificador asociado.
Llamaremos argumentos o parmetros de salida a aquellos que se utilizan para
transferir informacin producida como parte de la solucin realizada por el
subprograma.
Ejemplo:
int main()
{
int cociente;
int resto;
dividir(7, 3, cociente, resto);
// ahora cociente valdr 2 y resto valdr 1
}
Su definicin podra ser la siguiente:
void dividir(int dividendo, int divisor, int &cociente, int &resto)
{
cociente = dividendo / divisor;
resto = dividendo % divisor;
}
As, dividendo y divisor son argumentos de entrada y son pasados por valor como
se vio anteriormente. Sin embargo, tanto cociente como resto son argumentos de
salida (se utilizan para devolver valores al lugar de llamada), por lo que es
necesario que se pasen por referencia que significa que ambos argumentos sern
referencias a las variables que se hayan especificado en la llamada. Es decir,
cualquier accin que se haga sobre ellas es equivalente a que se realice sobre las
variables referenciadas.
Se declaran especificando el tipo, el smbolo ampersand (&) y el identificador
asociado.
Llamaremos argumentos o parmetros de entrada/salida a aquellos que se utilizan
para recibir informacin necesaria para realizar la computacin, y que tras ser
modificada se transfiere al lugar de llamada como parte de la informacin
producida resultado de la computacin del subprograma. Por ejemplo los
argumentos a y b del procedimiento ordenar anterior.
Los argumentos de entrada/salida se reciben por referencia y se declaran como se
especific anteriormente.

Carrera Ingeniera En Sistemas

Pgina: N 58

PROGRAMACIN ESTRUCTURADA

Tambin es posible recibir los parmetros de entrada por referencia constante de


tal forma que el parmetro ser una referencia al argumento especificado en la
llamada, tomando as su valor, pero no podr modificarlo al ser una referencia
constante, evitando as la semntica de salida asociada al paso por referencia.
Para ello, se declaran como se especific anteriormente para el paso por
referencia, pero anteponiendo la palabra reservada const.
int calcular_menor(const int &a, const int &b)
{
return ( (a < b) ? a : b ) ;
}
En la llamada a un subprograma, una expresin de un tipo compatible es adecuada
para un parmetro que se pase por valor, sin embargo, si el parmetro se pasa
por referencia es obligatorio que sea pasada como parmetro actual una variable
que concuerde en tipo. Si el paso es por referencia constante ((const int &x)) es
posible que el parmetro actual sea una expresin de tipo compatible.

Declaracin de subprogramas

Los subprogramas, al igual que los tipos, constantes y variables, deben ser
declarados antes de ser utilizados. Dicha declaracin se puede realizar de dos
formas: una de ellas consiste simplemente en definir el subprograma antes de
utilizarlo. La otra posibilidad consiste en declarar el subprograma antes de su
utilizacin, y definirlo posteriormente. El mbito de visibilidad del subprograma
ser global al fichero, es decir, desde el lugar donde ha sido declarado hasta el
final del fichero.
Para declarar un subprograma habr que especificar el tipo del valor devuelto (o
void si es un procedimiento) seguido por el nombre y la declaracin de los
argumentos igual que en la definicin del subprograma, pero sin definir el cuerpo
del mismo. En lugar de ello se terminar la declaracin con el carcter punto y
coma (;).
int calcular_menor(int a, int b); // declaracion de calcular_menor
int main()
{
int x = 8;
int y = 4;
int z;
z = calcular_menor(x, y);
// ahora z contine el calcular_menor numero de x e y
..............}
Ejemplo de un programa que imprime los nmeros primos menores que
100.
//- fichero: primos1.cpp -------------------------------------------#include <iostream>
const int MAXIMO = 100;
bool es_divisible(int x, int y)
{
return ( x % y == 0 );

Carrera Ingeniera En Sistemas

Pgina: N 59

PROGRAMACIN ESTRUCTURADA

}
bool es_primo(int x)
{
int i;
for (i = 2; ((i < x) && ( ! es_divisible(x, i))); ++i) {
// vacio
}
return (i >= x);
}
void escribir(int x)
{
cout << x << " ";
}
void primos(int n)
{
for (int i = 1; i < n; ++i) {
if (es_primo(i)) {
escribir(i);
}
}
cout << endl;
}
int main()
{
primos(MAXIMO);
// return 0;
}
//- fin: primos1.cpp ---------------------------------

FUNCIONES SIN ARGUMENTOS


Son funciones que no recogen ni devuelven ningn valor.

Carrera Ingeniera En Sistemas

Pgina: N 60

PROGRAMACIN ESTRUCTURADA

FUNCIONES CON ARGUMENTOS


Son funciones que recogen uno o ms parmetros del mismo o distinto tipo.

Carrera Ingeniera En Sistemas

Pgina: N 61

PROGRAMACIN ESTRUCTURADA

FUNCION QUE DEVUELVE UN VALOR


#include < stdio.h >
double suma(double x, double y);
int maximo(int x, int y);
void main (void)
{ int a,b, mayor;
double x, y ,total;
x=22.2; y= 443.0;
a=1; b=2;
total = suma (x,y);
mayor= maximo (a,b);
}
double suma(double x, double y)
{
return (x+y);
}
int maximo(int x, int y)
{
// si (x>y) entonces devuelve x, sino devuelve y
return (x >y) ? x:y;
}
EJEMPLO:
#include < stdio.h >
void uno(void);
void dos(void);
Carrera Ingeniera En Sistemas

Pgina: N 62

PROGRAMACIN ESTRUCTURADA

void main (void)


{
uno( );
}
void uno( )
{
printf(\n UNO 1);
dos( ); // desde una funcin llamamos a otra funcin
}
void dos( )
{
printf(\n DOS 2);
}
Variables locales y globales
Locales
#include < stdio.h>
void fun(void);
void main (void )
{ int a,b; /* Variables locales */
a=b= 1;
printf("\n Antes de llamar a fun: a = %d, b= %d", a,b);
fun( );
printf("\n Despus de llamar a fun: a = %d, b= %d",a,b);
}
void fun()
{ int a,b; // son locales a esta funcin
a=b=11;
printf {"\n En la funcin: a = %d b= %d", a,b);
}
_________________________________________________________
#include < stdio.h >
int suma(int,int);
void main(void)
{ int a,b,total; /* Variables locales */
a=b=1;
total = suma(a,b);
printf ("\n a = %d, b= %d, suma = %d",a,b,total);
}
int suma(int a, int b)
{ //a y b son locales en suma
int total;
total = a+b;
a++;
b++;
return ( total) ;
}
Globales
#include < stdio.h >
void suma(int a, int b);
int total; /* Variable global , declarada fuera del main */

Carrera Ingeniera En Sistemas

Pgina: N 63

PROGRAMACIN ESTRUCTURADA

void main (void)


{ int a,b; /* Variables locales */
a=b=1;
suma(a,b);
printf("\n a = %d, b= %d, suma = %d1,a,b,total);
}
void suma(int a, int b )
{ /* a y b son locales en suma */
total = a+b; /* Total es variable global */
a++; b++;
}

Funciones definidas por el usuario


Una funcin es un bloque de cdigo con un nombre asignado, este cdigo es
privado a la funcin y no puede ser accesazo por ninguna declaracin en ninguna
otra funcin excepto a travs de argumentos y variables globales.
Las variables definidas dentro de una funcin son variables locales dinmicas.
(Empiezan a existir cuando la funcin es llamada y se destruyen al terminar).
Forma general:
especificador_tipo nombre_funcion(declaracin de argumentos )
{
cuerpo de la funcin
}
El especificador_de_tipo especifica el tipo de valor que la funcin devolver
mediante el return.
La lista_de_argumentos es una lista de nombres de variables separados por comas
que recibe los valores de los argumentos cuando se llama la funcin.
Las funciones terminan y devuelven automticamente al lugar que la llamo cuando
se encuentra la ultima llave o mediante la sentencia return.
EJEMPLO:texto completo de mayusculas.cpp
// Programa : mayusculas.cpp
// Convierte una cadena de caracteres a mayusculas
#include <iostream.h>
char mensaje[80] =Esta es un prueba;
void mayusculas(void) {
int i;
for (i = 0; mensaje[i] != '\0'; i++)
mensaje[i] = toupper(mensaje[i]);
}
int main() {
system("cls");
cout << "Programa para cambiar a maysculas un mensaje ";
mayusculas();
cout << "\nEl mensaje en maysculas es " << mensaje;
}
Carrera Ingeniera En Sistemas

Pgina: N 64

PROGRAMACIN ESTRUCTURADA

Argumentos de funciones
Hay tres tipos de argumentos para las funciones
1. Por valor
2. Por puntero
3. Por referencia
Llamada por valor
Este mtodo copia el valor del argumento dentro de los parmetros formales de la
funcin y todos los cambios que sufran los parmetros no afectan el valor del
argumento usado para llamar la funcin. Los parmetros formales de la funcin
son las declaraciones de las variables que aceptan los valores de los argumentos.
EJEMPLO: texto completo de sqr.cpp
// Programa : SQR.CPP
// Descripcion: Usa una funcion que recibe y regresa un valor entero
#include <iostream.h>
int sqr(int num) {
num = num * num;
return num;
}
main() {
int n, x;
cout << "Ingresa un numero ";
cin >> n;
x = sqr(n);
cout << endl << "El cuadrado de " << n << " es " << x;
}
EJEMPLO: texto completo de cambiarf.cpp
// Prog: CambiaRf.Cpp
// Desc: Usa una funcion que intercambia los valores de sus argumentos
// utilizando paso por Referencia
#include <iostream.h>
void cambia(int &a, int &b) {
int paso;
paso = a;
a = b;
b = paso;
}
main() {
int x, y;
x = 10; y = 20;
cambia(x, y);
cout << endl << "X = " << x;
cout << endl << "Y = " << y;
}

EL MXIMO COMN DIVISOR ENTRE DOS NMEROS


MCD 18 y 10
18%10=8
10%8=2

Carrera Ingeniera En Sistemas

Pgina: N 65

PROGRAMACIN ESTRUCTURADA

8%2=0
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
void leer_datos(int &a, int &b)
{
do
{
cout<< ingrese el primer valor que debe ser sel mayor: ;
cin>>a;
cout<< ingrese el segundo valor: ;
cin>>b;
}
while((a<b)||(a<=0)||(b<0))
}
int MCD(int x,int y)
{
int z;
do
{
z=x%y;
x=y;
y=z;
}
while(z!=0)
return(x);
}
void mensaje(int a1, int b1, int c1)
{
cout<<el MCD entre: <<a1<< y <<b1<< es: <<c1;
}
Void main()
{
int num1, num2, resp;
leer_datos(num1, num2);
resp= MCD(num1, num2);
mensaje(num1, num2, resp);
getch();
}
Deber de procedimientos:
1. Transformar un nmero de cualquier base a base 10
2. Disear un programa que permita encontrar cuantas palabras existen en una
frase que no contengan vocales
3. Disear un programa que calcule la siguiente serie:

Carrera Ingeniera En Sistemas

Pgina: N 66

PROGRAMACIN ESTRUCTURADA

(a! X ) a ((a 1)! X ) ( a 1) ((a 2)! X ) ( a 2)

....
ea
e ( a 1)
e( a 2)
X Toma valores de 1 .. 5 y a indica el nmero de trminos que deber ser entre
3y6
4. Encontrar cuantas palabras de longitud 3 existen en una frase ingresada por el
usuario
5. Transformar la frase: La _ _ EIE _ _ _ esta _ en _ la _ _ _ _ ESPOCH. Retirando
los espacios en blanco que estn de ms
La _ EIE _ esta _ en _ la _ ESPOCH

1.
2.
3.
4.

Deber de funcines:
Hallar el nmero relativo de un nmero
Convertir un nmero dado en su respectivo nmero pero en Romanos
Halar el mximo comn divisor entre dos nmeros
Hallar la siguiente sumatoria
3
X X

3!

5
X

5!

7
X

....
7!

5. Cuntas palabras que tienen al menos 2 letras "a" existen en una frase
ingresada por el usuario

APLICACIN PRCTICA # 18

Uso de procedimientos y funciones


Ejemplo:
Cuntas palabras palndromo existen en una frase ingresada por el usuario:
ejemplo: El oso de Ana se llama Radar. Respuesta = Existen 3 palabras
palndromos en al frase oso, Ana, Radar
Deber:
1. Hallar las siguientes sumatorias:

aan! aa(n1)! aa(n2)!.....


2.

2 3 5 7 11 13

...
2! 3! 4! 5! 6! 7!

(( n * X ) 1) n!
((( n 1) * X ) 2) ( n 1)!
((( n 2) * X ) 3) ( n 2 )!

....
n
(n 1)
(n 2)
3.
Con todos los valores para X de 1 a 5

4.

( X 1) ( X 2) ( X 3)
2!2 3!3 ....
11!1
2
3

Con todos los valores para X entre 1 y 10 y el nmero de trminos solamente


entre 1 y 9
5. Cuntas palabras de longitud 5 existen en la frase y visualizarlas en una
lnea diferente cada una

Carrera Ingeniera En Sistemas

Pgina: N 67

PROGRAMACIN ESTRUCTURADA

CONFERENCIA # 19

Concepto de los arreglos


Arreglos unidimensionales: Los vectores
Operaciones con vectores
Arreglos como parmetros en procedimientos y funciones
Ejemplo:
Ingresar n nmeros en un vector, sumar y visualizar cada elemento
Cuntos nmeros entre a y b se encuentran almacenados en un vector
Tarea de investigacin: Consultar sobre los distintos mtodos de ordenacin
y bsqueda de los elementos de un vector.

ARREGLOS

Un arreglo se compone de elementos de igual tamao almacenados


linealmente en posiciones de memoria consecutiva.

Un arreglo es un conjunto finito de posiciones de memoria consecutivas que


tienen el mismo nombre y el mismo tipo de dato. Los arreglos de una
dimensin (Unidimensionales) se llaman vectores. Los arreglos de dos
dimensiones (bidimensionales) se llaman matrices.

int A [ 7 ];
A es un vector de 7 elementos que C++ reconoce de la posicin 0 a la 6.
Se puede ignorar la posicin 0 y trabajar de la 1 a la 6.
int A [ 7 ] = {0,72,53,43,23,46,35};
En este caso se inicializa el valor de los elementos al momento de declarar el
vector. Tambin puede hacerse desde el programa:
A[1] = 72;
A[2] = 53;
.etc.

Un vector o array -arreglos en algunas traducciones- es una secuencia de


objetos del mismo tipo almacenados consecutivamente en memoria. El tipo
de objeto almacenado en el array puede ser cualquier tipo definido en
C/C++. Los vectores y matrices son pasados siempre por referencia como
argumentos de una funcin. La nica diferencia con los tipos simples es que
no se usa el & ya que basta simplemente el nombre del vector o matriz.

Carrera Ingeniera En Sistemas

Pgina: N 68

PROGRAMACIN ESTRUCTURADA

Forma general de un arreglo unidimiensional:


tipo nombre_variable[tamao]
En C++ todos los arreglos usan el cero como ndice del primer elemento.
Los siguientes son dos ejemplos de declaraciones de arreglos vlidas en C/C++
int CoordenadasDePantalla[5]; /*Un arreglo de 5 enteros */
char IDCompania[20]; /*Un arreglo de 20 caracteres */

En la figura 1 se muestra el primer arreglo que fue declarado con el tipo de


nmeros enteros, llamado CoordenadasDePantalla, ocupa en memoria 5
localidades de memoria contiguas, cada una de ellas capaz de almacenar un
nmero entero. Actualmente es comn que los nmeros enteros sean de 32 bits,
esto hace que el arreglo CoordenadasDePantalla ocupe 32 5 = 160 bits
No se permite utilizar nombres de variables dentro de los corchetes. Por esto no
es posible evitar la especificacin del tamao del arreglo hasta la ejecucin del
programa. La expresin debe ser un valor constante, para que el compilador sepa
exactamente cunto espacio de memoria tiene que reservar para el arreglo.
Una buena prctica de programacin es usar constantes predefinidas.
#define Coordenadas_Max 20
#define Tamano_MaX_Compania_Id 15
int CoordenadasDePantalla[Coordenadas_Max];
char IDCompania[Tamano_MaX_Compania_Id];
El uso de constantes predefinidas garantiza que futuras referencias al arreglo no
excedan el tamao del arreglo definido.

Iniciacin del arreglo


C/C++ proporciona 3 maneras de iniciar elementos del arreglo:
Por defecto: Cuando son creados, se aplica solamente a arreglos globales y
estticos.
Explcita: Cuando son creados, suministrando datos de iniciacin
Tiempo de ejecucin: Durante la ejecucin del programa cuando se asignan o
copias datos en el arreglo.

Carrera Ingeniera En Sistemas

Pgina: N 69

PROGRAMACIN ESTRUCTURADA

Acceso a los elementos de un arreglo


Si se tiene un error cuando se utilizan arreglos en C/C++, de seguro el error
involucra el acceso a los elementos del arreglo, por la simple razn de que el
primer elemento est en una posicin 0, no 1. De manera que el ltimo elemento
del arreglo lo encontramos en n-1, donde n es el nmero de elementos.
Supongamos la siguiente declaracin:
int Estado[Rango_Maximo_Estado]={-1,0,1};
La siguiente sentencia tiene acceso a -1:
Estado[0];
Si escribimos Estado[3] causar un error porque no hay 4 elementos.

Carrera Ingeniera En Sistemas

Pgina: N 70

PROGRAMACIN ESTRUCTURADA

Ejemplo:
int lista[10]
El ejemplo declara un arreglo llamado lista con diez elementos desde lista[0] hasta
lista[9].
EJEMPLO: texto completo de fecha.cpp
// fecha.cpp
#include <iostream>
using namespace std;
void main() {
int fecha[3];
fecha[0] = 8; // mes
fecha[1] = 21; // dia
fecha[2] = 2003;// ao
cout << "Fecha ";
cout << fecha[0] << '/' << fecha[1] << '/' << fecha[2];
}

Arreglos como argumentos de funciones


Se pueden pasar vectores como argumentos de una funcin
Prototipo:
tipo_devuelto NombreFun(tipo_vec nom_vec[ ]);
Llamada: var = NombreFun(nom_vec);
Carrera Ingeniera En Sistemas

Pgina: N 71

PROGRAMACIN ESTRUCTURADA

PROCEDIMIENTO PARA IMPRIMIR EL CONTENIDO DE UN VECTOR


void imprimir(int b[], int tamano)
{
int i;
for(i=0; i<tamano; i++)
cout<<Nro:<<i<< <<b[i]<<endl;
}
imprimir(a, 5);

Deber:
1. Sumar dos vectores de igual longitud
2. Sumar dos vectores de distinta longitud
3. Buscar el mayor y menor nmero que se encuentran almacenados en un
vector
4. Ordenar un vector
5. Reemplazar en un vector todos los nmeros repetidos por un -5

CONFERENCIA # 20

Arreglos multidimensionales
Arreglos bidimensionales (Tablas)
Declaracin de arreglos bidimensionales
Variables del tipo matriz
Operaciones con matrices
Matrices como parmetros en procedimientos y funciones
Ejemplo: En una fbrica de componentes electrnicos se desea conocer la
cantidad de componentes fabricados en dos semanas consecutivas. Para
resolver este problema hay que realizar las siguientes tares:
a) Conocer cuntos tipos diferentes de componentes se fabrican y cuntos das
a la semana se trabaja
b) Leer la cantidad fabricada por cada componente en cada da laborable en al
primera semana
c) Leer la cantidad fabricada por cada componente en cada da laborable en al
segunda semana

Carrera Ingeniera En Sistemas

Pgina: N 72

PROGRAMACIN ESTRUCTURADA

d) Hallar la suma total en la primera semana


e) Hallar la suma total en la segunda semana

ARREGLOS MULTIDIMENSIONALES
El trmino dimensin representa el nmero de ndices utilizados para referirse a
un elemento particular en el arreglo. Los arreglos de ms de una dimensin se
llaman arreglos multidimensionales.

Matrices en C++
int M [ 4 ] [ 4 ];
M es una matriz de 4 renglones y 4 columnas que C++ reconoce de la posicin
0 a la 3.
Se puede ignorar la posicin 0 y trabajar de la 1 a la 3.
int M [ 4 ] [ 4 ] = { 0,0,0,0,
0,5,1,9,
0,8,6,4,
0,3,7,2 };
En este caso se inicializa el valor de los elementos al momento de declarar la
matriz. Tambin puede hacerse desde el programa:
A[1][1] = 5;
A[1][2] = 1;
.etc.

Carrera Ingeniera En Sistemas

Pgina: N 73

PROGRAMACIN ESTRUCTURADA

EJEMPLO:Matrices
#include<stdio.h>
#define M 3
#define N 2
int main(void)
{
int a[M][N]; /* matriz bidimensional */
int i, j;
for (i=0;i<M;i++) { /* lectura de cada elemento */
for (j=0;j<N;j++) {
printf(Elemento %d,%d : , i,j);
scanf(%d,&a[i][j]);
}
}
printf(\nLa matriz introducida es:\n\n); /* muestra cada elem */
for (i =0;i <M;i++) {
for (j =0;j <N;j++) {
printf(%d ,a[i][j]);
}
printf(\n); /* para cambiar de lnea al final de cada fila */
}
}

Paso de matrices a funciones


Vector multidimensional:

Carrera Ingeniera En Sistemas

Pgina: N 74

PROGRAMACIN ESTRUCTURADA

En el prototipo hay que indicar el tamao de todas las dimensiones, excepto la


primera

Dado que un vector no tiene tamao predefinido, pasar su contenido como un


parmetro por valor es un costo innecesario que C/C++ no asume.
Un vector completo (a travs de su referencia) se puede pasar a una funcin como
parmetro.
Recordemos que la referencia a un vector o la direccin inicial, se especifica
mediante su nombre, sin corchetes ni subndices.
char caracteres[80] = esta cadena es constante;

foo(caracteres, longitud);

El parmetro formal debe ser definido dentro de la funcin, se escribir un par de


corchetes vacos, es decir, el tamao del vector no se especifica.
void foo(char cadena_entrada[], int lng)
En C/C++ los arreglos en general son pasados como parmetros por referencia.
Esto es, el nombre del arreglo es la direccin del primer elemento del arreglo.
En C/C++ un elemento cualquiera de un arreglo puede ser pasado a una funcin
por valor o por referencia, tal y como se hace con una variable simple.
Ejemplo
float media(int a, float x[]) // Definicin de la funcin
{ // Note que se incluyen los corchetes
// calculo de la media
// Fijese que el tamao del vector x es pasado en a
}
void main ()
{
int n;
float med;
float lista[100];

med = media(n, lista); // Esta llamada pasa como parmetros

Carrera Ingeniera En Sistemas

Pgina: N 75

PROGRAMACIN ESTRUCTURADA

// actuales la longitud del vector y


// el vector. Note que no se incluyen los
// corchetes

}
Ejemplo
#include <ctype.h>
#include <string.h>
void F1(char cadena[], int lng) {
int i;
for (i=0; i!=lng; i++)
cadena[i] = toupper(cadena[i]);
}
int main () {
char caracteres[80] = Ejemplo;
int longitud = strlen(caracteres);
puts(caracteres);
F1(caracteres, longitud);
puts(caracteres);
return 0;
}
Ejemplo
Disear un programa que calcule y escriba el rea y la circunferencia de n crculos,
tal que todos n radios se deben almacenar en el vector R.
#include <stdio.h>
#define n 100
void leerRadios(float radios[], int &numEltos) {
// Parametros de salida: vector radios su numero de
elementos numEltos
int j;
printf(Cuantos radios seran introducidos ?\n);
scanf(%i,&numEltos);
for (j = 0; j < numEltos; j++) {
printf(radio %i = );
scanf(%i,&radios[j]);
}
}
void AreaCirc (float radio, float &area, float &cir)
// Parametros de entrada: radio
// Parametros de salida: area y cir
{
float pi = 3.14159;
area = pi * pow(radio, 2);
cir = 2 * pi * radio;
}
void AreasCircs(float radios[], int numEltos, float
areas[], float cirs[]) {
// Parametros de entrada: vector radios
// Parametros de salida: vectores areas y cirs

Carrera Ingeniera En Sistemas

Pgina: N 76

PROGRAMACIN ESTRUCTURADA

int I;
for (I = 0; I < numEltos; I++)
AreaCirc(radios[I], areas[I], cirs[I]);
}
void escribirAreasCircs (float radios[], int numEltos, float
areas[], float cirs[]) {
int j;
for (j = 0; j < numEltos; j++) {
printf(Para la circunferencia de radio %i,radios[j]);
printf(su area es: %i\n, areas[j]);
printf(su circunferencia es: %i\n,cirs[j]);
}
}
int main() {
float R[n], A[n], C[n];
int nRadios;
leerRadios(R, nRadios);
AreasCircs(R, nRadios, A, C);
escribirAreasCircs (R, nRadios, A, C);
return 0;
}

1.
2.
3.

Deber:
Sumar dos matrices de igual dimensin
Sumar dos matrices de distinta longitud
Ingresar en una matriz las n notas de m estudiantes y encontrar el promedio
de notas por estudiante y el promedio de cada nota
4. Cuntas palabras de longitud 4 existen en una matriz
5. Disear un programa que simule el juego de la sopa de letras

CONFERENCIA # 21

Recursividad
Definicin
Ejemplo:
Disear un programa utilizando recursividad que permita encontrar el
factorial de un nmero
Disear un programa utilizando recursividad que permita multiplicar dos
nmeros
Hallar el ensimo trmino de la serie de fibonacci

RECURSIVIDAD
Decimos que un objeto es recursivo si en su definicin se nombra a s mismo.

En programacin, una funcin es recursiva si en el mbito de esa funcin hay


una llamada a s misma, C/C++ permite esta clase de acciones. Los algoritmos
recursivos dan elegancia a las soluciones de los problemas.

La recursividad se presenta cuando una funcin se invoca a si misma.

Carrera Ingeniera En Sistemas

Pgina: N 77

PROGRAMACIN ESTRUCTURADA

Una funcin recursiva se programa simplemente para resolver los casos ms


sencillos, cuando se llama a una funcin con un caso ms complicado, se divide
el problema en dos partes, la parte que se resuelve inmediatamente y la que
necesita de ms pasos, sta ltima se manda de nuevo a la funcin, que a su
ves la divide de nuevo, y as sucesivamente hasta que se llegue al caso base.
Cuando se llega al final de la serie de llamadas, va recorriendo el camino de
regreso, hasta que por fin, presenta el resultado.

Un ejemplo clsico para este problema es calcular el factorial de un nmero, (n!).


Conocemos los casos base, 0!=1, 1!=1. Sabemos que la funcin factorial puede
definirse como n!=n*(n1)! . Entonces:
5! = 5*4! = 5*4*3! = 5*4*3*2! = 5*4*3*2*1! = 120.
Nuestro programa quedara como sigue:
#include <iostream.h>
long factorial(long numero)
{
if(numero<=1)
return 1;
else
return numero*factorial(numero-1);
}
int main()
{
long numero;
cout<<"nmero para calcular el factorial:"<<endl;
cin>>numero;
cout<<"el factorial es: "<<factorial(numero)<<endl;
return 0;
}
Nuestro programa llama a la funcin factorial con un nmero inicial,
posteriormente, esta funcin se llama a s misma cada vez con nmero ms
pequeo hasta que llega al caso base (numero<=1).

Carrera Ingeniera En Sistemas

Pgina: N 78

PROGRAMACIN ESTRUCTURADA

1. factorial(4) := 4 * factorial(3) Se invoca a si misma y crea una segunda


variable cuyo nombre es numero y su valor es igual a 3.
2. factorial(3) := 3 * factorial(2) Se invoca a si misma y crea una tercera
variable cuyo nombre es numero y su valor es igual a 2.
3. factorial(2) := 2 * factorial(1) Se invoca a si misma y crea una cuarta
variable cuyo nombre es numero y su valor es igual a 1.
4. factorial(1) := 1 * factorial(0) Se invoca a si misma y crea una quinta
variable cuyo nombre es numero y su valor es igual a 0.
5. Como factorial(0) := 1, con ste valor se regresa a completar la invocacin:
factorial(1) := 1 * 1 , por lo que factorial(1) := 1
6. Con factorial(1) := 1, se regresa a completar: factorial(2) := 2 * 1, por lo
que factorial(2) := 2
7. Con factorial(2) := 2, se regresa a completar : factorial(3) := 3 * 2, por lo
que factorial(3) := 6
8. Con factorial(3) := 6, se regresa a completar : factorial(4) := 4 * 6, por lo
que factorial(4) := 24 y ste ser el valor que la funcin factorial devolver
al mdulo que la haya invocado con un valor de parmetro local igual a 4 .

Cundo utilizar la recursin?


Para empezar, algunos lenguajes de programacin no admiten el uso de
recursividad, como por ejemplo el ensamblador o el FORTRAN. Es obvio que en
ese caso se requerir una solucin no recursiva (iterativa).
Tampoco se debe utilizar cuando la solucin iterativa sea clara a simple vista. Sin
embargo, en otros casos, obtener una solucin iterativa es mucho ms complicado

Carrera Ingeniera En Sistemas

Pgina: N 79

PROGRAMACIN ESTRUCTURADA

que una solucin recursiva, y es entonces cuando se puede plantear la duda de si


merece la pena transformar la solucin recursiva en otra iterativa.
La recursin, y se basa en almacenar en una pila los valores de las variables locales
que haya para un procedimiento en cada llamada recursiva. Esto reduce la claridad
del programa. An as, hay que considerar que el compilador transformar la
solucin recursiva en una iterativa, utilizando una pila, para cuando compile al
cdigo del computador.
Por otra parte, casi todos los algoritmos basados en los esquemas de vuelta atrs
y divide y vencers son recursivos, pues de alguna manera parece mucho ms
natural una solucin recursiva.
Aunque parezca mentira, es en general mucho ms sencillo escribir un programa
recursivo que su equivalente iterativo.
La recursividad es un tema importante en el mundo de la programacin, la utilidad
de este tipo de funciones se aprovecha en el diseo de algoritmos de criptografa,
de bsqueda, entre otros. La implementacin de la recursividad en nuestros
programas debe de evaluarse con mucho cuidado, debemos de tratar de evitar
que se usen funciones de complejidad exponencial, que se llamen a s mismas
una y otra vez sin que se tenga un control claro.

SUMA RECURSIVA
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
int suma(int vec[], int tam)
{
if(tam==0)
return(vec[0]);
else
return(vec[tam]+suma(vec, tam-1));
}
void visual(int v[], int t)
{
int i;
for(i=0;i<t;i++)
cout<< v[i]<<
cout<<endl;
}

void main()
{
int a[5]={1,2,3,4,5};
int t, sum;
clsrsc();
t=5;
visual(a,t);
t=t-1;

Carrera Ingeniera En Sistemas

Pgina: N 80

PROGRAMACIN ESTRUCTURADA

sum=suma(a,t);
cout<<La suma es: <<sum<<endl;
getch();
}

FUNCIN POTENCIA
int potencia(int base, int exp)
{
if(exp==0)
return 1;
else
return (base*potencia(base,exp-1));
}

FUNCIN DE FIBONACCI
long int fib (int numero)
{
long int result;
if((numero ==1)||(numero==2))
result =1;
else
result= fib(numero-1)*fib(numero-2);
return(result);
}

1.
2.
3.
4.
5.

Deber:
Cambiar un nmero de base 10 a base 2
Hallar el mximo comn divisor de dos nmeros
Hallar la potencia de un nmero
Sumar los n primeros nmeros pares
Sumar los n primeros nmeros impares

APLICACIN PRACTICA # 22
Utilizacin de procedimientos y funciones
1. Hallar las siguientes sumatorias:

(n n )!
((n 1) ( n 1) )! ((n 2) ( n2) )!

....
( X n)! ( X (n 1))! ( X (n 2))!
Con todos los valores de X entre 1 y 5, b es un valor constantes ingresada
el usuario y n el nmero de trminos entre 1 y 10
2. Con todos los valores de X entre 10 y 20, n el nmero de trminos entre 1 y
5
n

5( X n) 10( X (n 1))

n
!
(
n

1
)!

n 1

15( X (n 2))

(
n

2
)!

n2

....

3. Con todos los valores de X entre 6 y 20, n el nmero de trminos entre 1 y 5

Carrera Ingeniera En Sistemas

Pgina: N 81

PROGRAMACIN ESTRUCTURADA

X 1 X 22 X 32 ...
1!2
2!2
3!2
4. Con todos los valores de X entre 2 y 7, n el nmero de trminos entre 1 y 5

3(a n)

6(a (n 1))

(n 1)

9(a (n 2))

( n 2)

NOTA: Consultar sobre el problema de las TORRES DE HANOI. Problema que se


resuelve con recursividad.

APLICACIN PRCTICA # 23

1.
2.
3.
4.

Uso de la recursividad
Deber:
Buscar el dgito mayor en una cifra entera: ejemplo 12354 Respuesta = 5
Buscar el dgito menor en una cifra entera: ejemplo 12354 Respuesta = 1
Sumar 1234 = 10 de forma recursiva
Longitud de una cifra 123564 Respuesta=6 dgitos

CONFERENCIA # 24

Tipos de datos definidos por el usuario


Enumerados

TIPOS DE DATOS
Tipos enumerados
La declaracin de un tipo enumerado es simplemente una lista de valores que
pueden ser asumidos por una variable del tipo definido. Los valores del tipo
enumerado se representan mediante identificadores que sern las constantes del
nuevo tipo.
Ejemplo:
enum dia_semana { lunes, martes, mircoles, sbado, domingo};
Con esta declaracin el tipo dia_semana es ya conocido, podremos por lo tanto,
definir variables del tipo anterior.
enum dia_semana ayer, hoy;
Estas variables pueden tomar cualquiera de los valores incluidos en la declaracin
de tipo.
Sintaxis:
enum nombre_de_tipo_enumerado
{
lista de nombre de constantes enteras,

};
enum nombre _de_tipo_enumerado lista de variables...

Carrera Ingeniera En Sistemas

Pgina: N 82

PROGRAMACIN ESTRUCTURADA

Los valores asociados a los identificadores de constantes son 0 para la primera


constante, 1 para la segunda, etc., aunque con una simple asignacin, cuando se
declara la constante, sirve para modificar estos enteros asociados. En el ejemplo
lunes vale 0, martes 1, mircoles 2, etc.
typedef
La palabra clave typedef permite declarar nuevos nombres de tipos de datos para
tipos fundamentales o previamente definidos. Estos nuevos nombres pueden ser
utilizados para sucesivas declaraciones.
Sintaxis:
typedef
Ejemplo:
typedef
int

nombre_de_tipo

nuevo_nombre_de_tipo

ENTERO;

ENTERO n;

Declaracin simplificada de variables tipo enumeracin


Las enumeraciones (variables enum) permiten definir variables de tipo entero
con un nmero pequeo de valores que estn representados por identificadores
alfanumricos. Estos identificadores permiten que el programa se entienda ms
fcilmente, dando un significado a cada valor de la variable entera. Las variables
tipo enum son adecuadas para representar de distintas formas valores binarios
(SI o NO; VERDADERO o FALSO; EXITO o FRACASO, etc.), los das de la semana
(LUNES, MARTES, MIERCOLES, ...), los meses del ao (ENERO, FEBRERO, MARZO,
...), y cualquier conjunto anlogo de posibles valores. En C las variables de tipo
enum se hacan corresponder con enteros, y por tanto no hacan nada que no se
pudiera hacer tambin con enteros.
La principal razn de ser de las variables enum es mejorar la claridad y facilidad
de comprensin de los programas fuente.
Por ejemplo, si se desean representar los colores rojo, verde, azul y amarillo se
podra definir un tipo de variable enum llamada color cuyos cuatro valores
estaran representados por las constantes ROJO, VERDE, AZUL Y AMARILLO,
respectivamente. Esto se puede hacer de la siguiente forma:
enum color {ROJO, VERDE, AZUL, AMARILLO};
Utilizar maysculas para los identificadores que representan constantes es una
convencin estilstica ampliamente adoptada. En el ejemplo anterior se ha definido
el tipo color, pero no se ha creado todava ninguna variable con ese tipo.
Por defecto los valores enteros asociados empiezan en 0 y van aumentando de
uno en uno. As, por defecto, los valores asociados sern:
ROJO = 0 VERDE = 1 AZUL = 2 AMARILLO = 3
Sin embargo, el programador puede asignar el valor que desee a cada uno de esos
identificadores, asignando incluso el mismo entero a varios identificadores
diferentes. Por ejemplo, siguiendo con el tipo color:
enum color {ROJO = 3, VERDE = 5, AZUL = 7, AMARILLO};

Carrera Ingeniera En Sistemas

Pgina: N 83

PROGRAMACIN ESTRUCTURADA

Lgicamente en este caso los valores enteros asociados sern:


ROJO = 3 VERDE = 5 AZUL = 7 AMARILLO = 8
Cuando no se establece un entero determinado para un identificador dado, se toma
el entero siguiente al anteriormente asignado. Por ejemplo, en el caso anterior al
AMARILLO se le asigna un 8, que es el nmero siguiente al asignado al AZUL.
Una vez que se ha definido un tipo enum, se pueden definir cuantas variables de
ese tipo se desee. Esta definicin es distinta en C y en C++. Por ejemplo, para
definir las variables pintura y fondo, de tipo color, en C hay que utilizar la
sentencia:
enum color pintura, fondo; /* esto es C */
Mientras que en C++ bastara hacer:
color pintura, fondo; // esto es C++
As pues en C++ no es necesario volver a utilizar la palabra enum. Los valores
que pueden tomar las variables pintura y fondo son los que puede tomar una
variable del tipo color, es decir: ROJO, VERDE, AZUL Y AMARILLO. Se puede
utilizar, por ejemplo, la siguiente sentencia de asignacin:
pintura = ROJO;
Hay que recordar que al imprimir una variable enum se imprime su valor entero
y no su valor asociado.

CONFERENCIA # 25

Registros
Declaracin simplificada de variables correspondientes a estructuras
Implantacin de registros
Inicializacin de un registro
Asignacin entre registros y paso como parmetro a un subprograma
Uso de registros en estructuras de datos complejas
Registros y arreglos con componentes estructurados
Uniones
Arreglos de registros
Registros con vectores

REGISTROS

Es una estructura de datos compuesta de un nmero fijo de de componentes


de distintos tipos
Tambin se conocen como estructuras
Son estructuras lineales y de longitud fija
Los registros, tambin llamados a veces por vicio del lenguaje estructuras,
son tipos compuestos de datos heterogneos, es decir, que agrupan datos
que pueden ser de diferentes tipos
Los componentes de registros:
Se llaman campos
Pueden ser heterogneos
Se designan con nombres simblicos (nombre del campo)

Carrera Ingeniera En Sistemas

Pgina: N 84

PROGRAMACIN ESTRUCTURADA

Un registro es una estructura de datos compuesta de un nmero fijo de


componentes de distintos tipos, sus componentes se llaman campos. Tambin se
conocen simplemente como estructuras. Son estructuras lineales y de longitud fija,
al igual que los vectores, pero difieren de estos ltimos en que sus componentes
pueden ser heterogneos y se designan con nombres simblicos.
Declaracin simplificada de variables correspondientes a estructuras
De modo anlogo a lo que pasa con la palabra clave enum, en C++ no es necesario
colocar la palabra clave struct para declarar una variable del tipo de una
estructura definida por el usuario. Por ejemplo, si se define la estructura alumno
del modo siguiente:
struct alumno {
long nmat;
char nombre[41];
};
En C++ se puede declarar despus una variable delegado del tipo alumno
simplemente con:
alumno delegado; // esto es C++
Mientras que en C es necesario utilizar tambin la palabra struct en la forma:
struct alumno delegado; /* esto es C */

Implantacin de registros

La declaracin del registro determina:


El tamao de los componentes
La posicin de los componentes en el bloque de almacenamiento
durante la traduccin

La representacin de almacenamiento para un registro consiste de un solo bloque


secuencial de memoria en el cual se guardan los componentes en serie.
Los componentes individuales pueden requerir descriptores para indicar su tipo de
dato y otros atributos, pero ordinariamente en tiempo de ejecucin no se requiere
del descriptor del registro.
La seleccin de componentes se implanta con facilidad porque los subndices
(nombres de campos) se conocen durante la traduccin en vez de calcularse en
tiempo de ejecucin.
struct persona{
char nombre[40];
int edad;
char domicilio[100];
} x;
strcpy(x.nombre,Ana Laura);
x.edad=22;
printf (%s tiene %d aos, x.nombre, x.edad);
Salida: Ana Laura tiene 22 aos

Carrera Ingeniera En Sistemas

Pgina: N 85

PROGRAMACIN ESTRUCTURADA

Consideremos por ejemplo una ficha de venta de un libro para una librera. En ella
se guarda la siguiente informacin:
Titulo del libro
Autor
Editorial
Nmero de pginas
Precio
Toda esta informacin puede guardarse en una estructura de datos de tipo
registro. Para definirla se utiliza la palabra reservada struct y tiene la siguiente
sintaxis:
struct ficha{
char titulo[ ];
char autor[ ];
char editorial[ ];
int num_pag;
float precio;
};
Esta declaracin debe entenderse como una declaracin de tipo (de ah el punto y
coma final) y no como un subprograma.
Para declarar una variable de tipo ficha deberemos hacerlo dentro de un
subprograma de la manera habitual:
int main(){
ficha venta;
....
return 0;
}
Ahora la variable venta es de tipo ficha.
A cada uno de los componentes de un registro se denomina campo. As, los datos
titulo, autor, editorial, num_pag, precio, son los campos del registro.
Para acceder a cada uno de los campos de un registro se utiliza el operador punto
.
venta.titulo = El conde de Montecristo;

Inicializacin de un registro
Un registro puede inicializarse en el momento de su declaracin como variable:
struct dimensiones_libro{
float alto;
float ancho;
};
int main(){
dimensiones_libro dim={12.4, 20.8};

Carrera Ingeniera En Sistemas

Pgina: N 86

PROGRAMACIN ESTRUCTURADA

....
return 0;
}
La alternativa es la inicializacin campo a campo que podemos hacer en cualquier
punto del programa:
int main(){
ficha libro;
...
libro.titulo = El conde de Montecristo;
libro.autor = Alejandro Dumas;
libro.editorial = Aguilar;
libro.num_pag = 324;
libro.precio = 12.35;
...
return 0;
}

Entrada y salida de registros

Tanto la entrada como la salida de un registro debe hacerse campo a campo,


siempre que el campo sea de un tipo de dato que tenga salida directa con cout o
entrada directa con cin (tipo de dato simple o tipo string).

Asignacin entre
subprograma

registros

paso

como

parmetro

un

En C++ est permitida la asignacin entre registros:


dimensiones_libro libroA, libroB;
libroA.alto = 13.56;
libroA.ancho = 12.56;
libroB = libroA; //ahora libroB tiene el mismo contenido que libroA
Como consecuencia de esta propiedad, un registro puede pasarse por valor o
por referencia como parmero a una funcin. Igualmente una funcin
puede devolver un registro.
dimensiones_libro carga_informacion(ficha &mi_libro){
dimensiones_libro dim;
cout << Escribe titulo \n;
cin >> mi_libro.titulo;
cout << Escribe autor \n;
cin >> mi_libro.autor;
cin >> mi_libro.editorial;
cout << Escribe numero de paginas \n;
cin >> mi_libro.num_pag;
cout << Escribeprecio \n;
cin >> mi_libro.precio;
cout << Escribe centimetros de alto\n;
cin >> dim.alto;
cout << Escribe centimetros de ancho \n;
cin >> dim.ancho;
Carrera Ingeniera En Sistemas

Pgina: N 87

PROGRAMACIN ESTRUCTURADA

return(dim);
}
int main(){
ficha libroA;
dimensiones_libro dimA;
dimA = carga_informacion(libroA);
...
return 0;
}

Uso de registros en estructuras de datos complejas


Registros con campos de registros
Un registro puede tener como campo otro registro. Para ello el registro que hace
de campo debe declararse antes que en el momento de su uso como tipo de dato
de un campo de otro registro.
struct dimensiones_libro{
float alto;
float ancho;
};
struct ficha_modif{
char titulo[ ];
char autor[ ];
char editorial[ ];
int num_pag;
float precio;
dimensiones_libro tamanyo;
};
El acceso a los campos del registro tamanyo se hace usando dos veces el
operador punto .
ficha_modif libro;
cout << El libro mide << libro.tamanyo.alto << cm de alto \n;
El campo registro tiene todas las propiedades de los registros (asignacin,...).
Registros y arreglos con componentes estructurados
Su implantacin es una extensin de la representacin de almacenamiento
de las estructuras simples.

Carrera Ingeniera En Sistemas

Pgina: N 88

PROGRAMACIN ESTRUCTURADA

En lenguajes que suministran arreglos y registros como tipos bsicos de datos,


comnmente se proveen de recursos para que los componentes de los dos tipos
se entremezclen con componentes de tipos elementales.
Cuando se tiene un arreglo de registros, sus componentes se seleccionan usando
una serie de operaciones de seleccin para elegir primero un componente del
vector y luego un componente del registro.
Tambin se pueden tener registros cuyos componentes sean otros registros, lo
cual conduce a registros con una estructura jerrquica consistente en un nivel
superior de componentes, algunos de los cuales pueden ser registros. Los
componentes de estos componentes de segundo nivel tambin pueden ser
registros.
Un vector de registros tiene una representacin semejante a la de un vector de
vectores, pero por cada fila sustituida por la representacin de almacenamiento
de un registro.

Uniones

Otra construccin til, aunque no muy utilizada, son las uniones, y sirven para
compactar varias entidades de diferentes tipos en la misma zona de memoria. Es
decir, todas las entidades definidas dentro de una unin compartirn la misma
zona de memoria, y por lo tanto su utilizacin ser excluyente. Se utilizan dentro
de las estructuras:
enum Tipo { COCHE, MOTOCICLETA, BICICLETA };
struct Vehiculo {
Tipo vh;
union {
float capacidad;// para el caso de tipo COCHE
int cilindrada; // para el caso de tipo MOTOCICLETA
int talla; // para el caso de tipo BICICLETA
};
};
Y su utilizacin:
Vehiculo xx;
Vehiculo yy;
xx.vh = COCHE;

Carrera Ingeniera En Sistemas

Pgina: N 89

PROGRAMACIN ESTRUCTURADA

xx.capacidad = 1340.25;
yy.vh = MOTOCICLETA;
yy.cilindrada = 600;
Obviamente, los tipos de los campos de la unin pueden ser tanto simples como
compuestos.
Es responsabilidad del programador utilizar los campos adecuados en funcin del
tipo que se est almacenando.

Vectores o arreglos de registros


Esta estructura de datos es muy til para hacer colecciones de datos. Por ejemplo
para tener los datos de todos los libros en venta de una librera, podemos guardar
las fichas de los libros en un vector.
const int MAX_TAM= 500;
ficha inventario[MAX_TAM];
La variable inventario guardara hasta un mximo de 500 fichas de libros en venta.

Registros con vectores


Igualmente un campo de un registro puede ser un vector o una matriz.
En nuestro ejemplo sera interesante llevar la cuenta de la ocupacin til de
nuestro vector de fichas.
Para ello se creo un registro ms complejo que ser:
struct titulos_en_venta{
ficha stock[MAX_TAM];
int cuantos;
};
El campo cuantos de este registro, indica el nmero de fichas rellenas del vector
stock.
Para listar todos los ttulos disponibles podemos hacer un bucle:
titulos_en_venta oferta;
//Inicializamos oferta
for(i=0;i<oferta.cuantos;i++)
cout << oferta.stock[i].titulo;

CONFERENCIA # 26

Archivos o ficheros
Conceptos bsicos de archivos
Definiciones de datos, registros y archivos
Apertura de archivos
Clasificacin de archivos por tipo de contenido
Clasificacin de archivos por tipo de acceso
Direcciones lgicas y direcciones fsicas
Funciones de manejo de archivos en lenguaje c++

Carrera Ingeniera En Sistemas

Pgina: N 90

PROGRAMACIN ESTRUCTURADA

Declaracin del alias del archivo


Funciones de manejo de archivos
Aplicaciones de archivos en c++

FICHEROS
CONCEPTOS BSICOS DE ARCHIVOS
Esta seccin presenta las generalidades relacionadas con archivos antes de
empezar a utilizarlos y programarlos. Es necesario involucrarse con la terminologa
relacionada como archivo, registro, campo, etc. Tambin es recomendable conocer
las clasificaciones generales y las operaciones fundamentales con archivos.
Cmo surge la necesidad de utilizar archivos?
Hasta antes del tema de archivos, muchas de las aplicaciones que hemos
programado han sido usando la memoria principal o memoria RAM como nico
medio de almacenamiento (usando variables, arreglos o estructuras de datos mas
complejas), con el inconveniente que esto representa: la volatilidad de la memoria
RAM; es decir, si se apaga la computadora se pierden los datos. Adems, algunas
aplicaciones exigen transportar los datos de una computadora a otra. De ah surge
la necesidad de almacenar dichos datos de forma permanente que permita
retenerlos en ciertos dispositivos de almacenamiento secundario por un perodo
de tiempo largo sin necesidad de suministrarles energa, de tal forma que permitan
transportarlos y utilizarlos en otro equipo computacional.

DEFINICIONES DE DATOS, REGISTROS Y ARCHIVOS


Datos: Bsicamente se refieren a los testimonios individuales relacionados con
hechos, ya sean caractersticas de ciertos objetos de estudio o condiciones
particulares de situaciones dadas. Los elementos individuales de los archivos
se llaman datos o campos. Por ejemplo un cheque de un banco tiene los
siguientes campos: Cuenta habiente, Nmero de cheque, Fecha, Persona a la
que se le paga, Monto numrico, Monto con letra, Nota, Identificacin del
banco, Nmero de cuenta y Firma. Cada campo es definido por un tipo de dato.
Registro: Es el conjunto completo de datos relacionados pertenecientes a una
entrada. Por ejemplo: Un almacn puede retener los datos de sus productos en
registros de acuerdo al formato mostrado en la figura a continuacin.

Carrera Ingeniera En Sistemas

Pgina: N 91

PROGRAMACIN ESTRUCTURADA

El registro de la figura anterior puede ser declarado globalmente (por encima de


la funcin main) en el Lenguaje C++ utilizando struct:

Archivo: En trminos computacionales es una coleccin de datos que tiene un


nombre y se guardan en dispositivos de almacenamiento secundario, los cuales
pueden ser magnticos, pticos, electrnicos, etc. Por ejemplo: Diskettes,
discos duros, CDs, ZIP drives, flash drives, memory sticks, etc. Por ejemplo:
La figura de acontinuacin muestra la estructura de un archivo con registros
homogneos de Productos (con la misma estructura) declarados previamente.

Apertura de archivos
Antes de escribir o leer datos de un archivo es necesario abrirlo. Al abrir el archivo
se establece comunicacin entre el programa y el sistema operativo a cerca de
cmo accesarlo. Es necesario que el programa le proporcione al sistema operativo
el nombre completo del archivo y la intencin de uso (leer o escribir datos),
entonces se definen reas de comunicacin entre ellos. Una de estas reas es una
estructura que controla el archivo (alias del archivo), de esta forma cuando se
solicita una operacin del archivo, se recibe una respuesta que informa el resultado
mediante un apuntador. Cada archivo abierto requiere un alias para poder realizar
operaciones en l.

Carrera Ingeniera En Sistemas

Pgina: N 92

PROGRAMACIN ESTRUCTURADA

La estructura del archivo contiene informacin del archivo que se est usando, as
como el tamao actual y la localizacin de los buffers de datos.
Clasificacin de archivos por tipo de contenido
Existen muchas clasificaciones de archivos de acuerdo a diferentes criterios o
aplicaciones. Aqu se presenta una muy importante: de acuerdo al contenido.

Archivos de texto
Son aquellos que pueden contener cualquier clase de datos y de tal manera que
son entendibles por la gente. Los datos en un archivo de texto se almacenan
usando el cdigo ASCII, en el cual cada carcter es representado por un simple
byte. Debido a que los archivos de texto utilizan el cdigo ASCII, se pueden
desplegar o imprimir. En este tipo de archivos, todos sus datos se almacenan como
cadenas de caracteres, es decir, los nmeros se almacenan con su representacin
ASCII y no su representacin numrica, por lo tanto no se pueden realizar
operaciones matemticas directamente con ellos. Por ejemplo: Si se guarda el dato
3.141592 en un archivo de texto, se almacena como 3.141592 y ntese que ...
3.141592 3.141592
Archivos binarios
Este tipo de archivos almacenan los datos numricos con su representacin
binaria. Pueden ser archivos que contienen instrucciones en lenguaje mquina
listas para ser ejecutadas. Por ejemplo, cuando escribimos un programa en un
lenguaje en particular (como C++, Pascal, Fortran, etc), tenemos las instrucciones
almacenadas en un archivo de texto llamado programa fuente, pero una vez que
lo sometemos a un proceso de compilacin y ejecucin nuestro programa lo
trasladamos a un programa ejecutable (en lenguaje mquina), que es
directamente entendido por la computadora y se crea un archivo binario. En este
tipo de archivos tambin se pueden almacenar diferentes tipos de datos incluyendo
datos numricos; sin embargo, cabe destacar que los datos numricos se graban
con su representacin binaria (no con su representacin ASCII), por tal razn,
cuando se despliegan con un editor de textos o por medio de comandos del sistema
operativo, aparecen caracteres raros que no se interpretan. Por ejemplo: Si se

Carrera Ingeniera En Sistemas

Pgina: N 93

PROGRAMACIN ESTRUCTURADA

guarda el dato 27 en un archivo binario, se almacena como 00001111 y no como


27.
Clasificacin de archivos por tipo de acceso
De acuerdo a la forma de acceder los datos de los archivos, stos se clasifican en
secuenciales o directos (tambin conocidos como de acceso directo, relativos o
aleatorios). En esta seccin no se pretende analizar las diferentes estructuras de
datos involucradas en estas clasificaciones de archivos ni desarrollar aplicaciones
complejas debidamente diseadas usndolos, sino conocer esencialmente sus
conceptos tericos y la forma de manejarlos.

Archivos secuenciales
Como su nombre lo indica, en este tipo de archivos los registros se graban en
secuencia o consecutivamente y deben accesarse de ese mismo modo, es decir,
conforme se van insertando nuevos registros, stos se almacenan al final del
ltimo registro almacenado; por lo tanto, cuando se desea consultar un registro
almacenado es necesario recorrer completamente el archivo leyendo cada registro
y comparndolo con el que se busca. En este tipo de archivo se utiliza una marca
invisible que el sistema operativo coloca al final de los archivos: EOF (End of File),
la cual sirve para identificar dnde termina el archivo
Consulta o recorrido secuencial
A continuacin se muestra un diagrama de flujo de una rutina de consulta de un
registro en particular mediante un recorrido secuencial. En esta rutina se maneja
un archivo que almacena datos de productos (PRODUCTO.SEC) segn el registro
declarado anteriormente y lo recorre completamente en forma secuencial (registro
por registro) hasta encontrar el producto solicitado.

Carrera Ingeniera En Sistemas

Pgina: N 94

PROGRAMACIN ESTRUCTURADA

Archivos directos (relativos, de acceso directo o aleatorios)


A diferencia de los archivos secuenciales, en los archivos directos no es necesario
recorrerlo completamente para acceder un registro en particular, sino se puede
colocar el apuntador interno del archivo directamente en el registro deseado,
permitiendo con esto mayor rapidez de acceso. Cabe destacar que para
reposicionar este apuntador se utiliza el comando SEEK indicndole la direccin
del registro que se desea.
Direcciones lgicas y direcciones fsicas
El lenguaje C++ utiliza direcciones fsicas para los archivos (a diferencia de
direcciones lgicas de otros lenguajes como PASCAL), esto es, que el
direccionamiento consiste en el espacio ocupado por los datos en el archivo
(calculado en bytes) no en el rengln al que se asign dicho registro. Por ejemplo:
Suponga que tiene un archivo llamado PRODUCTO.SEC que almacena registros
con el formato mostrado en las figuras anteriores. Dicho registro tiene cinco
campos, cada uno con un tipo de dato determinado, un tamao especfico y que
al sumarlos se obtiene el espacio ocupado por cada registro con este formato.

Carrera Ingeniera En Sistemas

Pgina: N 95

PROGRAMACIN ESTRUCTURADA

Clculo de direcciones fsicas


Para poder reposicionar el apuntador de un archivo en un registro especfico es
necesario calcular su direccin fsica correspondiente de acuerdo al espacio
ocupado por sus registros predecesores.

De esta forma, para convertir direcciones lgicas en direcciones fsicas se utiliza la


frmula mostrada a continuacin.

FUNCIONES DE MANEJO DE ARCHIVOS EN LENGUAJE C++


Esta seccin presenta los aspectos generales de la implementacin de programas
de archivos en lenguaje C++. Aunque se puede almacenar cualquier tipo de datos
en archivos, aqu se muestran las operaciones del manejo de registros (struct) en
archivos, por lo que las funciones que se mencionan a continuacin son las ms
importantes para este tipo de datos.
Declaracin del alias del archivo
Para realizar programas de manejo de archivos en lenguaje C++ se requiere el
encabezado Standard I/O y se necesita incluirlo de la siguiente forma:
#include <stdio.h>
Adems es necesario declarar una variable de tipo FILE que opere como el
apuntador a la estructura del archivo (alias), esto se logra con la siguiente lnea:
FILE *alias;
Funciones de manejo de archivos
En esta seccin se presentan las funciones ms importantes para el manejo y
control de registros en archivos.

Carrera Ingeniera En Sistemas

Pgina: N 96

PROGRAMACIN ESTRUCTURADA

La funcin fopen() y modos de apertura de archivos


Se usa la funcin fopen para abrir un archivo, determinar el modo de apertura y
establecer la va de comunicacin mediante su alias correspondiente.
Adems determinar el tipo de contenido del archivo (texto o binario). Esta funcin
tiene dos argumentos: el nombre del archivo y su modo que se muestra ms
adelante. La figura muestra los modos de apertura de archivos de texto y binarios.

Validar la apertura de un archivo


Algunas funciones requieren la existencia del archivo para realizar operaciones,
por ello es necesario verificar que cuando se intenta abrir un archivo haya tenido
xito la operacin. Si un archivo no se puede abrir, la funcin fopen devuelve el
valor de 0 (cero), definido como NULL en stdio.h. A continuacin se muestra un
ejemplo de la manera de detectar la apertura de un archivo.
#include <stdio.h>
FILE *alias;
alias = fopen(EJEMPLO.DAT, rb);

Carrera Ingeniera En Sistemas

Pgina: N 97

PROGRAMACIN ESTRUCTURADA

if (alias==NULL)
{
cout << \n\r No se puede abrir el archivo !!!;
getch();
return();
}
Cierre de archivos usando fclose() y fcloseall()
Antes de dejar de utilizar un archivo es necesario cerrarlo. Esto se logra mediante
las funciones fclose o fcloseall. Si se usa fclose es necesario indicarle el alias del
archivo que se desea cerrar. La funcin fcloseall cierra todos los archivos abiertos.
Escritura de registros usando fwrite()
La funcin fwrite proporciona el mecanismo para almacenar todos los campos de
un registro en un archivo. Cabe destacar que al utilizar esta funcin, se almacena
una variable (de tipo struct) que representa un bloque de datos o campos; es
decir, no se almacena campo por campo. Esta funcin tiene cuatro argumentos: la
variable que se desea grabar, su tamao en bytes, la cantidad de variables y el
alias del archivo donde se desea almacenar.
#include <stdio.h>

Vaciando los buffers con fflush()


Un buffer es un rea de almacenamiento temporal en memoria para el conjunto
de datos ledos o escritos en el archivo. Estos buffers retienen datos en trnsito
desde y hacia al archivo y tienen la finalidad de hacer ms eficiente las operaciones
de entrada/salida en los archivos de disco, provocando menor cantidad de accesos,
los cuales son ms lentos que la memoria. Por ejemplo. Si se requiere consultar
constantemente un dato del archivo, no es necesario calcular su direccin fsica,
Carrera Ingeniera En Sistemas

Pgina: N 98

PROGRAMACIN ESTRUCTURADA

reposicionar el apuntador del archivo, cargar el dato en memoria mediante una


operacin de lectura cada vez que se necesita, sino que el sistema operativo
controla y mantiene este dato en los buffers de memoria y de ah lo toma cuando
lo requiera. Slo hay una consideracin importante al utilizar los buffers, los datos
escritos en ellos no se reflejan exactamente en los archivos de disco en forma
inmediata, sino hasta que se vaca el buffer. Para ello se utiliza la funcin fflush
y basta enviarle el alias del archivo como argumento. Los buffers tambin se vacan
cuando se cierra el archivo.
Lectura de registros usando fread()
La funcin fread permite cargar todos los campos de un registro en un archivo,
es decir, lee un registro y lo copia en la memoria RAM. Esta funcin tiene los
mismos argumentos que la funcin fwrite.
Reposicionando el apuntador mediante fseek()
Para comprender la operacin de esta funcin es necesario estar relacionado con
el apuntador del archivo, el cual indica la posicin dentro del archivo. Cuando se
abre un archivo en modo de slo lectura, slo escritura o lectura/escritura, el
apuntador del archivo se posiciona al inicio del mismo y cuando un archivo se abre
en modo agregar se posiciona al final, sin embargo, se puede reposicionar este
apuntador del archivo mediante la funcin fseek. Tambin es importante
mencionar que cada vez que se realiza una operacin de lectura o de escritura de
cualquier tipo de datos (caracter, cadena, estructura, etc.), el apuntador del
archivo se mueve al final de dicho dato, de tal forma que est posicionado en el
siguiente, por lo que es muy importante asegurarse que se encuentre en la
posicin deseada antes de realizar cualquier operacin.
Como se mencion en las secciones anteriores los archivos en lenguaje C++ son
controlados por direcciones fsicas (no lgicas) indicadas en bytes y la funcin
fseek permite reposicionar el apuntador del archivo en la direccin fsica deseada
mediante tres argumentos: el alias del archivo, la direccin fsica (en bytes) y el
punto de referencia. Para poder reposicionar el apuntador del archivo es necesario
que ste se encuentre abierto y se le haya asignado el alias correspondiente,
tambin es necesario calcular la direccin fsica donde se desea colocar e indicarle
el punto de referencia de donde se partir en el conteo de la cantidad de bytes
indicado por la direccin fsica, los cuales pueden ser desde el principio, desde
donde se encuentre el apuntador del archivo y desde el final.
Puntos de referencia de la funcin fseek()
El ltimo argumento de la funcin fseek es conocido como el punto de referencia
o el modo y se refiere desde dnde se iniciar el conteo de bytes determinado por
la direccin fsica.

Carrera Ingeniera En Sistemas

Pgina: N 99

PROGRAMACIN ESTRUCTURADA

Conociendo la posicin del apuntador del archivo con la funcin ftell()


Se usa la funcin ftell para conocer la posicin actual del apuntador de un archivo
abierto. La posicin se expresa en bytes (direccin fsica) contados desde el
principio del archivo.

Detectando el final del archivo con feof()


Se usa el macro feof() (definido en stdio.h) para determinar si se ha encontrado
el final de un archivo. Si se encuentra el final de un archivo, devuelve un valor
diferente de cero y cero en caso contrario. Para invocarlo es necesario colocar el
alias del archivo abierto como argumento. Se utiliza mucho esta funcin en
recorridos de tipo secuencial.
Cambiando nombres de archivos mediante rename()
Esta funcin tiene como objetivo cambiar el nombre de un archivo o subdirectorio
especificado por su ruta de acceso. Slo necesita dos argumentos: el nombre
anterior del archivo y el nuevo nombre. Es importante destacar que esta
funcin slo puede aplicarse a archivos cerrados.

Carrera Ingeniera En Sistemas

Pgina: N 100

PROGRAMACIN ESTRUCTURADA

Eliminando archivos con la funcin remove()


La funcin remove elimina definitivamente un archivo especificando su nombre.
Es importante destacar que esta funcin slo puede aplicarse a archivos
cerrados.

APLICACIONES DE ARCHIVOS EN C++


Aqu se analizarn los procedimientos de insercin, consulta y eliminacin de
registros tanto en archivos secuenciales como directos, as como el listado
secuencial. En ambos tipos de archivos se tratarn como archivos binarios.
Para apoyar el anlisis, diseo e implementacin de estas rutinas, se tomar el
ejemplo del control de PRODUCTOS que se mencion anteriormente as como la
definicin del registro.
Declaraciones globales
Antes de analizar, disear e implementar las rutinas es necesario establecer las
consideraciones iniciales tales como el uso de los encabezados (*.h), las
declaraciones globales del registro de productos y el alias correspondiente. La
figura siguiente muestra las declaraciones globales necesarias para estas
aplicaciones.
Para
efectos
de
identificacin,
se
usar
el
nombre
PRODUCTO.SEC para el archivo secuencial y el nombre PRODUCTO.DIR
para el archivo directo.

Carrera Ingeniera En Sistemas

Pgina: N 101

PROGRAMACIN ESTRUCTURADA

Archivos secuenciales en lenguaje C++


En esta seccin se analizar la manera de disear rutinas que manipulen registros
de productos o artculos en un archivo secuencial. Como su nombre lo indica, en
este tipo de archivo se hace un recorrido secuencial para localizar la direccin del
registro solicitado, es decir, se lee registro por registro hasta llegar al deseado.
Altas secuenciales
Aqu se presenta una rutina que inserta registros de productos en un archivo
secuencial. Se considera un nmero de producto (campo no_prod) que servir
como referencia para identificarlo y diferenciarlo de otros productos y no se
permite que se graben dos productos diferentes con el mismo nmero, por lo que
es necesario realizar un recorrido secuencial completo del archivo para asegurarse
que no haya duplicados.
La primera ocasin que se intente insertar registros en un archivo, ste debe
crearse; sin embargo debe cuidarse no crear el archivo cada vez que se
invoque esta rutina porque debe tenerse presente que si se crea un archivo
existente, se pierde su contenido anterior.
Codificacin de la rutina de ALTAS secuenciales
A continuacin se muestra el cdigo de la rutina de ALTAS secuenciales:
void ALTA_SECUENCIAL(void)
{
int no_prod; // Variable local para el numero de producto
clrscr();
cout << "\n\rALTAS DE REGISTROS DE PRODUCTOS";
alias=fopen("PRODUCTO.SEC","rb+"); // Intenta abrir el archivo
// en modo de lectura/escritura

Carrera Ingeniera En Sistemas

Pgina: N 102

PROGRAMACIN ESTRUCTURADA

if(alias==NULL)
alias=fopen("PRODUCTO.SEC","wb"); // Crea el archivo en caso de no
// existir
cout << "\n\n\n\rNumero de producto: "; cin >> no_prod;
fread(&Registro,sizeof(Registro),1,alias);
// Lee el "Registro", de tamano=sizeof(Registro) del archivo "alias"
while(!feof(alias)) // Ciclo mientras no se encuentre el final del
// archivo
{
if(Registro.no_prod==no_prod)
{
cout << "\n\n\n\rRegistro duplicado !!!";
fclose(alias);
getch();
return;
}
fread(&Registro,sizeof(Registro),1,alias);
}
cout << "\n\rDescripcion: "; gets(Registro.descrip);
cout << "\n\rCantidad : "; cin >> Registro.cantidad;
cout << "\n\rPrecio : "; cin >> Registro.precio;
do
{
cout << "\n\rGarantia : "; Registro.garantia=toupper(getche());
}while(Registro.garantia!='S' && Registro.garantia!='N');
Registro.no_prod=no_prod;
fwrite(&Registro,sizeof(Registro),1,alias); // Grabar el Registro
fclose(alias); // Cierra el archivo
cout << "\n\n\n\rProducto registrado !!!";
cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
getch();
return;
}
CONSULTAS secuenciales
En esta seccin se analiza una rutina que busca un registro particular de un
producto en un archivo secuencial. En este tipo de archivo se inicia el recorrido
desde el primer registro almacenado y se detiene cuando se localiza el registro
solicitado o cuando se encuentre el final del archivo.
Codificacin de la rutina de CONSULTAS secuenciales
A continuacin el cdigo de la rutina de CONSULTAS secuenciales:
void CONSULTA_SECUENCIAL(void)
{
int no_prod;
clrscr();
cout << "\n\rCONSULTA DE REGISTROS DE PRODUCTOS";
alias=fopen("PRODUCTO.SEC","rb"); // Intenta abrir el archivo PRODUCTO.SEC
// en modo de solo lectura
if(alias==NULL)
{

Carrera Ingeniera En Sistemas

Pgina: N 103

PROGRAMACIN ESTRUCTURADA

cout << "\n\n\n\rNo existe el archivo !!!";


cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
getch();
return;
}
cout << "\n\n\n\rNumero de producto: "; cin >> no_prod;
fread(&Registro,sizeof(Registro),1,alias);
// Lee el "Registro", de tamano=sizeof(Registro) del archivo "alias"
while(!feof(alias))
{
if(Registro.no_prod==no_prod)
{
cout << "\n\rNo Prod Descripcion Cantidad Precio Garantia";
cout << "\n\r-----------------------------------------------------------------------";
printf("\n\r%3d\t%30s\t%3d\t\t$%4.2f\t%c",Registro.no_prod,Registro.descrip,
Registro.cantidad,Registro.precio,Registro.garantia);
fclose(alias);
cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
getch();
return;
}
fread(&Registro,sizeof(Registro),1,alias);
}
cout << "\n\rNo se encuentra ese registro !!!";
fclose(alias); // Cierra el archivo
cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
getch();
return;
}
LISTADO secuencial
Esta rutina es muy semejante a la de CONSULTAS secuenciales, solo que en el
LISTADO se despliegan todos los registros lgicos que contiene el archivo.
En este tipo de archivo se inicia el recorrido desde el primer registro almacenado
y se detiene cuando se encuentre el final del archivo.
Codificacin de la rutina de LISTADO secuencial
A continuacin el cdigo de la rutina de LISTADO secuencial.
void LISTADO_SECUENCIAL(void)
{
clrscr();
cout << "\n\rLISTADO DE REGISTROS DE PRODUCTOS";
alias=fopen("PRODUCTO.SEC","rb"); // Intenta abrir el archivo PRODUCTO.SEC
// en modo de solo lectura
if(alias==NULL)
{
cout << "\n\n\n\rNo existe el archivo !!!";
cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";

Carrera Ingeniera En Sistemas

Pgina: N 104

PROGRAMACIN ESTRUCTURADA

getch();
return;
}
cout << "\n\rNo Prod Descripcion Cantidad Precio Garantia";
cout << "\n\r---------------------------------------------------------------------";
fread(&Registro,sizeof(Registro),1,alias);
// Lee el "Registro", de tamano=sizeof(Registro) del archivo "alias"
while(!feof(alias)) // Ciclo mientras no se encuentre el final del archivo
{
printf("\n\r%3d\t%30s\t%3d\t\t$%4.2f\t%c",Registro.no_prod,Registro.descrip,
Registro.cantidad,Registro.precio,Registro.garantia);
fread(&Registro,sizeof(Registro),1,alias);
}
fclose(alias); // Cierra el archivo
cout << "\n\r-----------------------------------------------------------------------";
cout << "\n\rFin del listado !!!";
cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
getch();
return;
}
MODIFICACIONES de datos en un archivo secuencial
La forma de modificar el contenido de los campos de registros de un archivo,
depende mucho de la rutina de consulta, ya que es necesario localizar previamente
el registro que se desea modificar, capturar los nuevos valores y posteriormente
grabar el registro completo en la misma posicin que se encontraba. Esto
ltimo es muy importante porque recuerde que cuando se termina de leer un
registro del archivo, el apuntador se posiciona al inicio del siguiente registro, por
lo que, antes de grabar el registro modificado, es necesario reposicionar el
apuntador del archivo en la direccin correcta.
Codificacin de la rutina de MODIFICACIN secuencial
Se muestra la codificacin de la rutina de modificaciones de campos de un registro
particular en un archivo secuencial.
void MODIFICACION_SECUENCIAL(void)
{
int no_prod; // Variable local para el numero de producto que desea modificar
clrscr();
cout << "\n\rMODIFICACION DE REGISTROS DE PRODUCTOS";
alias=fopen("PRODUCTO.SEC","rb+"); // Intenta abrir el archivo PRODUCTO.SEC
// en modo de lectura/escritura
if(alias==NULL) // Valida la existencia del archivo
{
cout << "\n\n\n\rNo existe el archivo !!!";
cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
getch();
return;
}
cout << "\n\n\n\rNumero de producto: "; cin >> no_prod;
fread(&Registro,sizeof(Registro),1,alias);
// Lee el "Registro", de tamano=sizeof(Registro) del archivo "alias"

Carrera Ingeniera En Sistemas

Pgina: N 105

PROGRAMACIN ESTRUCTURADA

while(!feof(alias)) // Ciclo mientras no se encuentre el final del archivo


{
if(Registro.no_prod==no_prod)
{
cout << "\n\rNo Prod Descripcion Cantidad Precio Garantia";
cout << "\n\r-----------------------------------------------------------------------";
printf("\n\r%3d\t%30s\t%3d\t\t$%4.2f\t%c",Registro.no_prod,Registro.descrip,
Registro.cantidad,Registro.precio,Registro.garantia);
cout << "\n\n\n\rAnote los nuevos datos ...";
cout << "\n\rDescripcion: "; gets(Registro.descrip);
cout << "\n\rCantidad : "; cin >> Registro.cantidad;
cout << "\n\rPrecio : "; cin >> Registro.precio;
do
{
cout << "\n\rGarantia : "; Registro.garantia=toupper(getche());
}while(Registro.garantia!='S' && Registro.garantia!='N');
// Es necesario reposicionar el apuntador del archivo al principio del
// registro que desea modificar, ya que al leer un registro, el
// apuntador se posiciona en el registro siguiente
// La funcion ftell(alias) devuelve la posicion donde se encuentra el
// apuntador
fseek(alias,ftell(alias)-sizeof(Registro),SEEK_SET);
fwrite(&Registro,sizeof(Registro),1,alias); // Graba el registro con
// los nuevos campos
fclose(alias); // Cierra el archivo
cout << "\n\n\n\rRegistro modificado !!!";
cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
getch();
return;
}
fread(&Registro,sizeof(Registro),1,alias);
}
cout << "\n\rNo se encuentra ese registro !!!";
fclose(alias); // Cierra el archivo
cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
getch();
return;
}
Bajas de registros en un archivo secuencial (bajas lgicas y bajas fsicas)
Bsicamente existen dos formas de eliminar registros en un archivo: lgica y
fsicamente. La diferencia radica en que cuando se elimina un registro en forma
lgica de un archivo, slo se le coloca una marca especial en alguno de sus campos
que lo identifique como registro borrado, sin embargo, el registro sigue
existiendo en el archivo y por lo tanto ocupa espacio. En cambio en la baja fsica
de registros, se elabora una rutina que elimine fsicamente el registro del archivo,
es decir, que el archivo solo conserve los registros vlidos. Las bajas fsicas
tambin son conocidas como rutinas de compactacin o compresin del archivo.
Codificacin de la rutina de BAJAS lgicas en un archivo secuencial
Codificacin ntegra de esta rutina.
void BAJA_LOGICA_SECUENCIAL(void)

Carrera Ingeniera En Sistemas

Pgina: N 106

PROGRAMACIN ESTRUCTURADA

{
int no_prod; // Variable local para el numero de producto que desea eliminar
char op; //Variable local
clrscr();
cout << "\n\rBAJAS LOGICAS DE REGISTROS DE PRODUCTOS";
alias=fopen("PRODUCTO.SEC","rb+"); // Intenta abrir el archivo PRODUCTO.SEC
// en modo de lectura/escritura
if(alias==NULL) // Valida la existencia del archivo
{
cout << "\n\n\n\rNo existe el archivo !!!";
cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
getch();
return;
}
cout << "\n\n\n\rNumero de producto: "; cin >> no_prod;
fread(&Registro,sizeof(Registro),1,alias);
// Lee el "Registro", de tamano=sizeof(Registro) del archivo "alias"
while(!feof(alias)) // Ciclo mientras no se encuentre el final del archivo
{
if(Registro.no_prod==no_prod)
{
cout << "\n\rNo Prod Descripcion Cantidad Precio Garantia";
cout << "\n\r----------------------------------------------------------";
printf("\n\r%3d\t%30s\t%3d\t\t$%4.2f\t%c",Registro.no_prod,Registro.descrip,
Registro.cantidad,Registro.precio,Registro.garantia);
Registro.no_prod=0;
strcpy(Registro.descrip,"");
Registro.cantidad=0;
Registro.precio=0.0;
Registro.garantia=' ';
do {
cout << "\n\n\rEsta seguro que desea borrarlo? [S/N] ---> ";
op=toupper(getche());
}while(op!='S' && op!='N');
if(op=='S')
{
// Es necesario reposicionar el apuntador del archivo al principio del
// registro que desea modificar, ya que al leer un registro, el
// apuntador se posiciona en el registro siguiente
// La funcion ftell(alias) devuelve la posicion donde se encuentra el
// apuntador
fseek(alias,ftell(alias)-sizeof(Registro),SEEK_SET);
fwrite(&Registro,sizeof(Registro),1,alias); // Graba el registro con
// los nuevos campos
cout << "\n\n\n\rRegistro eliminado !!!";
}
fclose(alias); // Cierra el archivo
cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
getch();
return;
}
fread(&Registro,sizeof(Registro),1,alias);

Carrera Ingeniera En Sistemas

Pgina: N 107

PROGRAMACIN ESTRUCTURADA

}
cout << "\n\rNo se encuentra ese registro !!!";
fclose(alias); // Cierra el archivo
cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
getch();
return;
}
Codificacin de la rutina de BAJAS fsicas en un archivo secuencial
(compactar)
Codificacin ntegra de esta rutina.
void BAJA_FISICA_SECUENCIAL(void)
{
FILE *temporal; //Declaracion local de una variable para controlar el
// archivo temporal
clrscr();
cout << "\n\rBAJAS FISICAS DE REGISTROS DE PRODUCTOS";
alias=fopen("PRODUCTO.SEC","rb"); // Intenta abrir el archivo PRODUCTO.SEC
// en modo de solo lectura
if(alias==NULL) // Valida la existencia del archivo
{
cout << "\n\n\n\rNo existe el archivo !!!";
cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
getch();
return;
}
temporal=fopen("TEMPORAL.TMP","wb"); // Crea el archivo TEMPORAL.TMP
fread(&Registro,sizeof(Registro),1,alias);
// Lee el "Registro", de tamano=sizeof(Registro) del archivo "alias"
while(!feof(alias)) // Ciclo mientras no se encuentre el final del archivo
{
if(Registro.no_prod!=0)
fwrite(&Registro,sizeof(Registro),1,temporal);
// Graba el registro valido en el archivo temporal
fread(&Registro,sizeof(Registro),1,alias);
}
fcloseall(); // Cierra todos los archivos abiertos
remove("PRODUCTO.SEC"); //Elimina el archivo original
rename("TEMPORAL.TMP","PRODUCTO.SEC");
//Renombra el archivo temporal con el nombre del archivo original
cout << "\n\n\n\rArchivo compactado !!!";
cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
getch();

Archivos directos en lenguaje C++


En esta seccin se analizar la manera de disear rutinas que manipulen registros
de productos o artculos en un archivo directo. A diferencia del archivo secuencial
en el que se hace un recorrido secuencial para localizar la direccin del registro
solicitado, en el archivo de acceso directo, se calcula la direccin fsica y se
posiciona el apuntador del archivo directamente en el registro solicitado usando la
funcin fseek.

Carrera Ingeniera En Sistemas

Pgina: N 108

PROGRAMACIN ESTRUCTURADA

Altas directas
Aqu se presenta una rutina que inserta registros de productos en un archivo
directo. Se tomar el mismo ejemplo del registro de producto que se us en el
archivo secuencial. En este caso se nombrar el archivo como PRODUCTO.DIR
La primera ocasin que se intente insertar registros en un archivo, ste debe
crearse; sin embargo debe cuidarse no crear el archivo cada vez que se
invoque esta rutina porque debe tenerse presente que si se crea un archivo
existente, se pierde su contenido anterior.
Codificacin de la rutina de altas directas
Codificacin de la rutina de altas en un archivo relativo o de acceso directo.
void ALTA_DIRECTA(void)
{
int no_prod; // Variable local para el numero de producto
clrscr();
cout << "\n\rALTAS DE REGISTROS DE PRODUCTOS";
alias=fopen("PRODUCTO.DIR","rb+"); // Intenta abrir el archivo PRODUCTO.DIR
// en modo de lectura/escritura
if(alias==NULL)
alias=fopen("PRODUCTO.DIR","wb"); // Crea el archivo en caso de no existir
cout << "\n\n\n\rNumero de producto: "; cin >> no_prod;
dir_fisica=no_prod*sizeof(Registro); // Calculo de la dir. fisica
fseek(alias,dir_fisica,SEEK_SET); //Posicionar el apuntador del archivo
fread(&Registro,sizeof(Registro),1,alias);
// Lee el "Registro", de tamano=sizeof(Registro) del archivo "alias"
if(Registro.no_prod==no_prod)
{
cout << "\n\n\n\rRegistro duplicado !!!";
fclose(alias);
getch();
return;
}
cout << "\n\rDescripcion: "; gets(Registro.descrip);
cout << "\n\rCantidad : "; cin >> Registro.cantidad;
cout << "\n\rPrecio : "; cin >> Registro.precio;
do
{
cout << "\n\rGarantia : "; Registro.garantia=toupper(getche());
}while(Registro.garantia!='S' && Registro.garantia!='N');
Registro.no_prod=no_prod;
fseek(alias,dir_fisica,SEEK_SET); //Posicionar el apuntador del archivo
fwrite(&Registro,sizeof(Registro),1,alias); // Grabar el Registro completo
fclose(alias); // Cierra el archivo
cout << "\n\n\n\rProducto registrado !!!";
cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
getch();
return;
}
CONSULTAS directas

Carrera Ingeniera En Sistemas

Pgina: N 109

PROGRAMACIN ESTRUCTURADA

En esta seccin se analiza una rutina que busca un registro particular de un


producto en un archivo directo. En este tipo de archivo no es necesario hacer el
recorrido secuencial desde el primer registro almacenado, sino se calcula la
direccin fsica del registro que se desea consultar y se posiciona el apuntador del
archivo directamente.
Codificacin de la rutina de CONSULTAS directas
Cdigo de la rutina de CONSULTAS directas
void CONSULTA_DIRECTA(void)
{
int no_prod; // Variable local para el numero de producto que desea consultar
clrscr();
cout << "\n\rCONSULTA DE REGISTROS DE PRODUCTOS";
alias=fopen("PRODUCTO.DIR","rb"); // Intenta abrir el archivo PRODUCTO.DIR
// en modo de solo lectura
if(alias==NULL)
{
cout << "\n\n\n\rNo existe el archivo !!!";
cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
getch();
return;
}
cout << "\n\n\n\rNumero de producto: "; cin >> no_prod;
dir_fisica=no_prod*sizeof(Registro); // Calculo de la dir. fisica
fseek(alias,dir_fisica,SEEK_SET); //Posicionar el apuntador del archivo
fread(&Registro,sizeof(Registro),1,alias);
// Lee el "Registro", de tamano=sizeof(Registro) del archivo "alias"
if(Registro.no_prod==no_prod)
{
cout << "\n\rNo Prod Descripcion Cantidad Precio Garantia";
cout << "\n\r----------------------------------------------------------------------";
printf("\n\r%3d\t%30s\t%3d\t\t$%4.2f\t%c",Registro.no_prod,Registro.descrip,
Registro.cantidad,Registro.precio,Registro.garantia);
}
else
{
cout << "\n\n\n\rNo existe ese registro !!!";
}
fclose(alias);
cout << "\n\n\n\n\r<<< Oprima cualquier tecla para continuar >>>";
getch();
return;
}
MODIFICACIONES directas
Al igual que en el archivo secuencial, la forma de modificar el contenido de los
campos de registros de un archivo, depende mucho de la rutina de consulta, ya
que es necesario localizar previamente el registro que se desea modificar, capturar
los nuevos valores y posteriormente grabar el registro completo en la misma
posicin que se encontraba. Esto ltimo es muy importante porque recuerde
que cuando se termina de leer un registro del archivo, el apuntador se posiciona

Carrera Ingeniera En Sistemas

Pgina: N 110

PROGRAMACIN ESTRUCTURADA

al inicio del siguiente registro, por lo que, antes de grabar el registro modificado,
es necesario reposicionar el apuntador del archivo en la direccin correcta.
Codificacin de la rutina de MODIFICACIONES directas
Codificacin de la rutina de modificaciones de campos de un registro particular en
un archivo directo.
void MODIFICACION_DIRECTA(void)
{
int no_prod; // Variable local para el numero de producto que desea modificar
clrscr();
cout << "\n\rMODIFICACION DE REGISTROS DE PRODUCTOS";
alias=fopen("PRODUCTO.DIR","rb+"); // Intenta abrir el archivo PRODUCTO.DIR
// en modo de lectura/escritura
if(alias==NULL) // Valida la existencia del archivo
{
cout << "\n\n\n\rNo existe el archivo !!!";
cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
getch();
return;
}
cout << "\n\n\n\rNumero de producto: "; cin >> no_prod;
dir_fisica=no_prod*sizeof(Registro); // Calculo de la dir. fisica
fseek(alias,dir_fisica,SEEK_SET); //Posicionar el apuntador del archivo
fread(&Registro,sizeof(Registro),1,alias);
// Lee el "Registro", de tamano=sizeof(Registro) del archivo "alias"
if(Registro.no_prod==no_prod)
{
cout << "\n\rNo Prod Descripcion Cantidad
Precio Garantia";
cout << "\n\r------------------------------------------------------------------------";
printf("\n\r%3d\t%30s\t%3d\t\t$%4.2f\t%c",Registro.no_prod,Registro.descrip,
Registro.cantidad,Registro.precio,Registro.garantia);
cout << "\n\n\n\rAnote los nuevos datos ...";
cout << "\n\rDescripcion: "; gets(Registro.descrip);
cout << "\n\rCantidad : "; cin >> Registro.cantidad;
cout << "\n\rPrecio : "; cin >> Registro.precio;
do
{
cout << "\n\rGarantia : "; Registro.garantia=toupper(getche());
}while(Registro.garantia!='S' && Registro.garantia!='N');
// Es necesario reposicionar el apuntador del archivo al principio del
// registro que desea modificar, ya que al leer un registro, el
// apuntador se posiciona en el registro siguiente
// La funcion ftell(alias) devuelve la posicion donde se encuentra el
// apuntador
fseek(alias,dir_fisica,SEEK_SET); //Posicionar el apuntador del archivo
fwrite(&Registro,sizeof(Registro),1,alias); // Graba el registro con
// los nuevos campos
fclose(alias); // Cierra el archivo
cout << "\n\n\n\rRegistro modificado !!!";
cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";

Carrera Ingeniera En Sistemas

Pgina: N 111

PROGRAMACIN ESTRUCTURADA

getch();
return;
}
else
{
cout << "\n\n\n\rNo se encuentra ese registro !!!";
}
fclose(alias); // Cierra el archivo
cout << "\n\n\n\n\r<<< Oprima cualquier tecla para continuar >>>";
getch();
return;
}
Bajas de registros en un archivo de acceso directo (bajas lgicas)
Para el ejemplo que se ha estado manejando en este archivo directo, NO se pueden
realizar bajas fsicas (nicamente bajas lgicas), ya que existe una relacin directa
entre la direccin lgica y el nmero del producto: esto es, que el producto 1 se
almacena en el registro lgico 1, o sea que cada producto se almacena en su
respectivo registro de acuerdo al nmero de producto y si se aplicase la rutina de
bajas fsicas (compactacin), los registros se recorreran a otras direcciones que
no corresponderan con su nmero de producto y dichos registros no podran ser
localizados por las rutinas de consultas, modificaciones y las mismas bajas lgicas.
Al igual que en las bajas lgicas de los archivos secuenciales, cuando se elimina
un registro en forma lgica de un archivo, slo se le coloca una marca especial en
alguno de sus campos que lo identifique como registro borrado, sin embargo, el
registro sigue existiendo en el archivo y por lo tanto ocupa espacio.
Codificacin de la rutina de BAJAS lgicas directas
Rutina de bajas lgicas en un archivo directo.
void BAJA_LOGICA_DIRECTA(void)
{
int no_prod; // Variable local para el numero de producto que desea eliminar
char op;
clrscr();
cout << "\n\rBAJA LOGICA DE REGISTROS DE PRODUCTOS";
alias=fopen("PRODUCTO.DIR","rb+"); // Intenta abrir el archivo PRODUCTO.DIR
// en modo de lectura/escritura
if(alias==NULL) // Valida la existencia del archivo
{
cout << "\n\n\n\rNo existe el archivo !!!";
cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
getch();
return;
}
cout << "\n\n\n\rNumero de producto: "; cin >> no_prod;
dir_fisica=no_prod*sizeof(Registro); // Calculo de la dir. fisica
fseek(alias,dir_fisica,SEEK_SET); //Posicionar el apuntador del archivo
fread(&Registro,sizeof(Registro),1,alias);
// Lee el "Registro", de tamano=sizeof(Registro) del archivo "alias"
if(Registro.no_prod==no_prod)

Carrera Ingeniera En Sistemas

Pgina: N 112

PROGRAMACIN ESTRUCTURADA

{
cout << "\n\rNo Prod Descripcion Cantidad
Precio Garantia";
cout << "\n\r------------------------------------------------------------------------";
printf("\n\r%3d\t%30s\t%3d\t\t$%4.2f\t%c\n\n\n\n\r",Registro.no_prod,Regist
ro.descrip,Registro.cantidad,Registro.precio,Registro.garantia);
Registro.no_prod=0;
strcpy(Registro.descrip,"");
Registro.cantidad=0;
Registro.precio=0.0;
Registro.garantia=' ';
// Es necesario reposicionar el apuntador del archivo al principio del
// registro que desea modificar, ya que al leer un registro, el
// apuntador se posiciona en el registro siguiente
// La funcion ftell(alias) devuelve la posicion donde se encuentra el
// apuntador
do
{
cout << "\n\rEsta seguro que desea eliminar este registro? [S/N] ---> ";
op=toupper(getche());
}while(op!='S' && op!='N');
if(op=='S')
{
fseek(alias,dir_fisica,SEEK_SET); //Posicionar el apuntador del archivo
fwrite(&Registro,sizeof(Registro),1,alias); // Graba el registro con
// los nuevos campos
cout << "\n\n\n\rRegistro eliminado logicamente !!!";
}
else
{
cout << "\n\n\n\rRegistro NO eliminado !!!";
}
fclose(alias); // Cierra el archivo
cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
getch();
return;
}
else
{
cout << "\n\n\n\rNo se encuentra ese registro !!!";
}
fclose(alias); // Cierra el archivo
cout << "\n\n\n\n\r<<< Oprima cualquier tecla para continuar >>>";
getch();
return;
}

Carrera Ingeniera En Sistemas

Pgina: N 113

Vous aimerez peut-être aussi