Está en la página 1de 127

UNIVERSIDAD CSAR VALLEJO - PIURA

ESCUELA DE INGENIERA DE SISTEMAS

AUTOR Ing. CIP. Aldo Segismundo Pereda Castillo

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

P ESE

Estimado alumno de la Escuela de Ingeniera de Sistemas UCV Piura Con el propsito de solidificar tu formacin acadmica y con el objetivo de que dispongas de un gua al 100% que conduzca el proceso de enseanza -aprendizaje de la i E c , te presentamos el mdulo de esta asignatura Es una obra resultado de la recopilacin de . experiencias del autor en la enseanza por ms de siete aos en sta y otras asignaturas relacionadas con la programacin de computadoras. El mdulo ha sido diseado con un lenguaje claro y fcil de comprender, siguiendo la metodologa de enseanza del docente. La organizacin del mdulo consta de dos unidades y los temas tratados en cada una corresponden a los indicados en el slabo de la asignatura. Por c ada captulo, se presenta el sustento terico, ejemplos explicados, ejercicios de programacin resueltos y ejercicios propuestos. Empieza de lo ms elemental y clave para el xito de este curso: la programacin modular hasta abordar los temas propios de la asignatura: recursividad, ordenamiento y bsqueda, registros, pilas, colas, listas enlazadas, rboles y archivos. En el mdulo se implementa los diferentes ejercicios de programacin en lenguaje Turbo C++, lenguaje que sin lugar a dudas es el principal lenguaje para aprender a programar, porque el C s te obliga a programar ... El mdulo presenta una enseanza gradual, inicialmente presenta la solucin completa a los ejercicios resueltos; a medida que se va avanzando se suprime ciertos elementos y se deja para que el alumno complete. Con el objeto de reforzar lo aprendido presenta ejercicios propuestos, los cuales servirn adems como banco de preguntas para las evaluaciones y trabajos encargados. Adems te presenta modelos de evaluaciones de experiencias a nteriores a fin de que dispongas de material de estudio para consolidar an ms tu experiencia en esta asignatura. Ahora que tienes un gua disponible para ti al 100%, y con la ayuda de las herramientas tecnolgicas que cada vez proveen ms y mejores forma de enseanza-aprendizaje; unido con la s asesora constante del docente; slo depende de ti el xito de tu formacin profesional; esfurzate por aprender y aplicar cada da algo nuevo. Les agradecera, estimados alumnos y lectores en general, que cualquier crtica, sugerencia, error de escritura o cualquier otra inquietud la dirija a l p 01@y h .c m, que gustoso le responder con nimo de mejorar este mdulo en sus prximas versiones. El

Pereda Castillo Aldo S.

-2-

    



 

 



Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

Presentacin Introduccin Competencia General I I: c Competencias Capacidades Actitudes I. P ivi ,

..................................................................................... ............................. ............................................. ........................................ ............................. ......................................... ....................................... .............................. i y Pil ....................................... .................................................................................. ............................................... ................................... .................................................................................. .............................. .............................. .............................. ..............................

m ci l .................................... ................................ .............................. Subprogramas .................................................................................. .............................. Parmetros .................................................................................. .............................. Funciones y Procedimientos ....................................................... .............................. Recordando los tipos de datos .................................................... ................................. Tipos de datos bsicos ............................................................... ................................. Modificadores de tipos ............... ................................................ ................................. Ejercicios resueltos ............................................................... ................................. Ejercicios propuestos ............................ ................................... .................................

II.

c ivi .............................................................................. ................................. Ejercicios resueltos ............................................................... ................................. Ejercicios propuestos ............................................................... ................................. Modelo de evaluacin 01 ............................................................ ................................. Modelo de evaluacin 02 ............................................................ ................................. Modelo de evaluacin 03 ........................ .................................... ................................. mi y b q ........................................................ ................................. Ordenamiento ............................................... ......................... ................................. Mtodos de ordenamiento ............................................................ ................................. Ordenamiento por el mtodo de la Burbuja ............................. ................................. Bsqueda .................................................................................. ................................. Bsqueda secuencial ............................................................... ................................. Bsqueda binaria ............................................................... ................................. Ejercicios resueltos ............................................................... .......................... ....... Ejercicios propuestos ............................................................... .................................

III.

IV.

i (E c ) ............................................................... ................................. La estructura de datos Registro ............................................... ................................. Declarar registros ............................................................... ................................. Declarar variables registro ............................................................ ................................. Uso de typedef ..................................................................... ................................. Declarar arreglos de registros ...................................................... ................................. Ejercicios resueltos ............................................................ ................................. .. Ejercicios propuestos ............................................................ ................................... Modelo de evaluacin 04 ............................................................ ...................................

Pereda Castillo Aldo S.

-3-

 

I E
02 05 06 07 08 08 08 09 09 09 10 12 12 12 14 33 35 36 49 50 51 52 53 53 53 53 56 56 56 58 66 67 67 69 69 70 70 72 83 85

(0

(3'2( 1%$ )0) ('& %$ "#" ! 0)%& ( (0'&2 &'2( (3'2( 1%$ '0 &)35 4 0 0'13' 324% 04%)'6 )0) ('& %$

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

V. Pil .......................................................................................... .................................... Implementacin de una pila ................................................. ......... ............................. Implementacin con arreglos ................................................. ..................................... Estructura de una pila ................................................. ..................................... Operaciones en una pila ................................................. ..................................... Formatos de expresiones aritmticas ................................... ..................................... Orden de prioridad de los operadores aritmticos .................. ................................... Conversin de infijo a postfijo ................................................. ................................... Mtodo algortmico de conversin de Infijo a Postfijo ................ ................................ Ejercicios resueltos ....................................................................... ............................. Ejercicios propuestos ............................................................................. .......................

86 86 86 87 89 92 92 93 94 95 98

Pereda Castillo Aldo S.

87

-4-

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

La asignatura de E c es una asignatura del rea de formacin profesional. Pertenece al rea de desarrollo de software a travs del conocimiento y aplicacin de diferentes soportes de almacenamiento de datos y tcnicas de programacin de computadoras para su tratamiento efecti vo. Comprende el estudio de diferentes formas y tcnicas de almacenamiento de conjuntos de datos, as como de las operaciones que se pueden realizar con esos almacenes, tales como insercin, eliminacin, bsqueda, ordenamiento, etc. Aprender a seleccionar, organizar y estructurar los datos en forma eficiente y adecuada es la base y soporte fundamental para el desarrollo de aplicaciones de software que son de gran utilidad en las instituciones. Esta asignatura sirve como fundamento para posteriores asignaturas que traten acerca del procesamiento de datos, que luego unido a la metodologas de la ingeniera de la informacin y la ingeniera de software lograrn el desarrollo de software de calidad que satisfaga las necesidades de los usuarios. m ci m l , enfatizando El c p l I. El mdulo empieza con un repaso acerca de la p la importancia de la descomposicin funcional de un problema en subproblemas; y por ende de un programa en subprogramas . Refuerza la creacin de subrutinas: funciones y procedimientos, aplicando los principios de cohesin y acoplamiento. El c p l II. trata el tema de la c ivi como tcnica de programacin, alternativa a los procesos repetitivos, que ofrece la ventaja de la naturalidad en la escritura del cdigo fuente. mi y b q , enfatizando El c p l III. Presenta los diferentes mtodos de particularmente el mtodo de ordenacin por burbuja as como la bsqueda secuencial y binaria. Es muy importante que el alumno conozca al menos estos mtodos ya que son de gran utilidad al momento en que el software deba presentar la informacin al usuario. El c p l IV. Presenta el tema de i ; bloque fundamental bsico para el tratamiento de conjuntos de datos acerca de una entidad. Son los registros los que p roporcionan el fundamento para la creacin y administracin de bases de datos. El c pi l V. Trata de un tipo especial de estructura de datos: las Pil , que por sus mltiples aplicaciones en la vida real as como en los sistema operativos, adquieren esp ecial importancia en esta asignatura. En este captulo se analiza e implementa las diferentes operaciones que definen el comportamiento de una pila. El c p l VI. Trata acerca de la estructura de datos l , caracterizada porque en esta estructura el primer elemento que entra es el primer elemento que sale. Lsa colas tienen mltiples aplicaciones en la vida real. El c p l VII. Trata acerca de las i l z . Iniciando con esto la administracin dinmica de la memoria del computador. Estas listas adquieren especial importancia porque ya no tienen la limitacin de capacidad y permiten un mejor uso de la memoria, aunque presentan la desventaja de la linealidad. Se estudiaran las listas simples y dobles. El c pi l VIII. b l . Tipo especial de estructura dinmica de datos que supera la desventaja de la linealidad. Permite el almacenamiento y recuperacin de informacin de un modo ms dinmico y rpido. El c p l IX. chiv . Los archivos son muy importantes para el almacenamiento de datos en medios secundarios, consiguiendo con este que la informacin perdure en el tiempo. Aqu se conocer las diferentes instrucciones que proporciona el lenguaje C para el uso de archivos.

Pereda Castillo Aldo S.

-5-

HP IQT V P PHUTH

PQRI F

FP

TGVR PVRQHT

FPQP P VR FPGF Y

P TX

FTGPS RQ PHIG IHGF 9 EEDCBA @9


I I

QPQ FHI RH FTHGF URW

FT

FR T H

H`

T IG P

T IG P

T IG P T IG P

T IG P

T IG P

T IG P

T IG P

T IG P

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

COMPE E CI

Conoce y utiliza las diferentes estructuras de datos y tcnicas de programacin que permiten el almacenamiento y procesamiento esttico y dinmico de conjuntos de datos construyendo ; programas de aplicacin que solucionen problemas reales, reconociendo la importancia de la investigacin, del trabajo en equipo; siendo reflexivo, creativo y responsable en el cumplimiento de los trabajos encomendados; reconociendo la importancia de la programacin de computadoras y el valor que actualmente posee la informacin para las instituciones.

Pereda Castillo Aldo S.

f ce b d c b a
E E -6-

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

COMPE E CI S y Identifica procesos recursivos, discute y reflexiona sobre la importancia de la recursividad como tcnica de programacin, construyendo subrutinas recursivas que solucione problemas de modo ms natural n al pensamiento humano. Es participativo y demuestra interes por conocer diferentes tcnicas de programacin.
y

Analiza, selecciona, organiza y crea registros de datos. Reconoce la importancia de stos en la construccin de bases de datos como soporte fundamental para el desarrollo de programas de computadora. Adems, codifica subrutinas de ordenamiento y bsqueda de datos en arreglos, valorando el aporte de los diferentes autores, que ayud a presentar la informacin de modo en adecuado; ofreciendo diferentes alternativas de rpido acceso a la informacin a los usuarios. Valora la importancia de la aplicacin de la estructuras de datos conocidas como Pilas. Codifica sus operaciones y las encapsula como un tipo abstracto de dato; aplicndolas en la solucin de problemas donde la tcnica LIFO (ltimo en entrar, primero en salir) es la base del procesamiento.

CAPACI ADES y Divide un problema en subproblemas. Asimismo construye e programa de solucin dividindolo en l mdulos, manteniendo los principios de cohesin y acoplamiento.
y y y y y y y

Define un proceso recursivo, evaluando la potencialidad y su posibilidad de uso en lasolucin de problemas a travs de programas de computadora. Explica las caractersticas de las estructuras de datos estticas, estableciendo similitudes y diferencias y determinando la conveniencia de su uso para el soporte de los datos a manejar. Ordena un conjunto de datos a travs e mtodo de la burbuja. Implementa las subrutinas de bsqueda secuencial y binaria, estableciendo ventajas y desventajas en cada uno de los mtodos. Comprende la utilidad de los arreglos y registros en el manejo de conjuntos de datos. Selecciona, organiza y estructura los datos de una entidad en registros; implementando la estrategia de solucin en un programa de computadora. Conoce el TAD Pila, implementa sus operaciones a travs de arreglos, determina su conveniencia de uso y lo aplica en la solucin algortmica de problemas

ACTITUDES y Es crtico, reflexivo y automotivado. Escucha con inters las consultas hechas por sus compaeros.
y y y

Es constante en la asistencia a clases. Asimismo es puntual tanto en el ingreso a las sesiones de clase como en la entrega de sus trabajos. Es disciplinado y acepta las normas de convivencia dentro y fuera del aula. Tiene iniciativa para plantear diversos modelos de solucin y utilizar estructuras de datos. Acepta diversas estrategias para resolver un mismo problema, demostrando inters en la bsqueda de alternativas de solucin a un mismo problema. Valora la importancia del trabajo en equipo. En las tareas grupales muestra un espritu de colaboracin, desarrollando actitudes para la accin coordinada. Manipula con responsabilidad los materiales y equipos de ayuda al proceso deenseanza-aprendizaje: laptops, proyecto multimedia, laboratorio de cmputo, etc., tanto los de propiedad de la universidad como los de sus compaeros.

y y

Pereda Castillo Aldo S.

i h g p

-7-

Uni E

V ll j Pi Ingenier e Si temas

E t

I. PROGRAMACI N MODULAR
Ca a idades Asigna adecuadamente los ti os de datos. Utili a funciones redefinidas i ide el rograma rinci al en mdulos reutili ables subrutinas) Establece la diferencia entre funciones rocedimientos. or referencia. Establece la diferencia entre armetros or alor Utili a arreglos como armetros. odifica funciones rocedimientos ara resol er roblemas especficos. Aplica los principios de cohesin acoplamiento en el diseo de subrutinas.

a Programacin modular es uno de los mtodos de diseo ms flexibles potentes para mejorar la producti idad de un programa. En programacin modular el programa se di ide en mdulos partes independientes), cada una de las cuales ejecuta una nica acti idad o tarea cohesin) se codifican independientemente de otros mdulos. ada uno de estos mdulos se anali an, codifican ponen a punto por separado.

a Programa i n modular permite la descomposicin de un problema en un conjunto de subproblemas ue pueden ser tratados separadamente unos de otros. independientes entre s, ms sencillos de resol er racias a la modulari acin se pueden probar los subprogramas o mdulos de manera independiente, depurndose sus errores antes de su inclusin en el programa principal almacenarse para su posterior utili acin cuantas eces se precise. Su Programas Se les conoce tambin como Subrutinas. Son programas en miniatura ue ejecutan una tarea especfica. Al igual ue todo programa constan de tres partes: entrada, proceso

salida.

Entrada

Proceso

Salida

a entrada est constituida por el conjunto de datos ue recibe el subprograma del exterior, a sea del mdulo principal o de otros mdulos ue lo invocan

El proceso es el conjunto de tareas representadas a travs de sentencias ue el subprograma debe reali ar. a salida est constituida por los resultados objetivo de su creacin. ue el subprograma debe devolver al exterior

a utilidad e importancia de descomponer el programa en subrutinas radica en la reutili acin del cdigo la flexibilidad del mismo, pues se codifica una sola vez se invoca la cantidad de veces ue sea necesario; si se necesita realizar alguna modificacin, es suficiente realizarla en la subrutina lgicamente se ver reflejado el cambio en todas las invocaciones ue se realicen de ella. Parmetros Son los datos ue sirven de interfaz entre el subprograma el exterior. Entindase el exterior como el programa principal u otro subprograma. Se dice ue los parmetros son la interfaz pues a travs de stos se establece la comunicacin, a sea recibiendo datos /o devolviendo resultados.

os parmetros van asociados a variables, constantes, expresiones, etc., , por tanto, se indican mediante los correspondientes identificadores o expresiones. os parmetros ue se utilizan en la llamada o invocacin al subprograma se denominan parmetros actuales, reales o argumentos, son los ue entregan la informacin al subprograma. os parmetros ue la reciben en el subprograma se denominan parmetros formales, ficticios o simplemente parmetros y se declaran en la cabecera del subprograma. Algunos subprogramas carecen de parmetros cuando realizan tareas ue no requieren recibir informacin de otro mdulo.

Pereda

astill Aldo S.

ty v ru vs s t
t t
ue son el

ed

e g

ed

uv u v vs t y r v svtxw ur u tsr q t v r l e d g e e g h

i i i i

Parmetros or Valor or Referen ia El paso de parmetros se realiza de dos formas: por Valor y por eferencia; tambin conocidas comnmente como parmetros de Entrada y de Entrada/Salida respectivamente. Paso or Valor Parmetros de Entrada En este caso el subprograma trabaja con una copia del valor del parmetro; por tanto, si dentro del subprograma se modifica su valor; cuando termine la ejecucin del subprograma no se ver reflejado el cambio en la variable del mdulo llamador. El paso por valor es un canal de transferencia de datos en una sola direccin, es decir, de entrada al subprograma. Paso or Referen ia Parmetros de Entrada/Salida onocido tambin como paso por Variable. En este caso la subrutina trabaja directamente con el valor del parmetro, es decir, con la misma posicin de memoria. Por tanto, cualquier modificacin del parmetro dentro de la subrutina; cuando sta termine su ejecucin, s se ver reflejado el cambio en el mdulo principal o el llamador.

El paso por referencia es un canal bidireccional de transferencia de datos, es decir, desempean el rol tanto de entrada de datos hacia la subrutina, como de salida hacia el programa principal o mdulo llamador. En el lenguaje de programacin , para indicar que un parmetro es por referencia, se le debe anteponer el operador asterisco *) en la declaracin de parmetros; de lo contrario ser considerado como parmetro por valor.

Paso por Valor o por Referencia? Si no queremos que una subrutina modifique el contenido de una variable del mdulo principal, debemos realizar el paso por valor. En cambio, si queremos que s modifique, debemos emplear el paso por referencia.
Fun iones Pro edimientos En el lenguaje , los subprogramas se clasifican en unciones y Procedimientos. Se denomina Fun iones a los subprogramas cuya finalidad es retornar devolver) un nico valor al mdulo que la invoc. Por ejemplo: r = sqrt n);

uncin predefinida que calcula la raz cuadrada del parmetro n, y el resultado lo asigna a la variable r. uncin predefinida que transforma a mayscula el parmetro letra, y el resultado lo almacena en la misma variable letra. uncin definida por el programador.

Se denomina Pro edimientos a todos los subprogramas cuya finalidad principal es ejecutar acciones y no necesariamente devolver un nico valor. Por ejemplo: gotoxy(a,b) Procedimiento predefinido que ubica el cursor en las coordenadas (a,b) de la pantalla. Procedimiento predefinido que se encarga de limpiar la pantalla. Procedimiento definido por el usuario que se encarga de ordenar un vector de nombres de personas.

clrscr( )

ordenar(vnombres) El uadro N

establece la comparacin entre unciones y Procedimientos

Pereda

astillo Aldo S.

pqp

rn = raizn num);

letra = toupper letra);

Universidad sar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de

atos

rs

v t

tx s

|{

r r

Cuadro N Com ara i n entre Fun iones Pro edimientos Fun iones Pro edimientos Retornan un nico valor al mdulo llamador Pueden devolver ninguno (0), uno, dos o ms valores, pero como parmetros de salida. En la invocacin, deben asignarse a una variable, la En la invocacin, no se asignan a ninguna cual debe ser de mismo tipo que el dato de retorno. variable. Es suficiente con escribir el nombre y los parmetros correspondientes ado que retornan un slo valor, las funciones irectamente no pueden utilizarse en pueden utilizarse directamente en expresiones. expresiones. Primero se les debe invocar y luego sus parmetros (variables) podrn ser utilizadas en las expresiones. Al crear, las funciones empiezan con el tipo de dato Al crear, los procedimientos empiezan con la de retorno. palabra reservada void.

a sintaxis de creacin de una funcin es:

ti odato nombrefuncin (tipodato param1, tipodato param2, ...) { declaracin variables locales;

cuerpo de la funcin; return expresin;

} a sintaxis de creacin de procedimiento es: void nombreproced (tipodato param1, tipodato param2, ...) { declaracin variables locales; cuerpo del procedimiento; }

En caso de que la subrutina no lleve parmetros se coloca la palabra oid entre los parntesis donde se declaran los parmetros. Fun iones o Pro edimientos? Una de las preguntas ms frecuentes que podemos plantearnos es: cundo utilzar una funcin y cundo un procedimiento?. Si bien no existen normas rgidas al respecto es aconsejable utilizar lasiguiente regla:

Deben utilizarse funciones cuando slo tenga que devolver un solo valor al mdulo llamador. En todos los dems casos utilizar procedimientos.

Re uerda ue El orden de los parmetros al r ear la subrutina no es importante, basta con que se siga un orden logico; pero al invocar cada argumento enviado debe corresponderse con el parmetro, en tipo y nmero. Re ordando los ti os de datos omo los valores de los datos son de diferente naturaleza, es decir, algunos valores aceptan slo nmeros enteros, otros slo nmeros positivos, otros nmeros decimales, otros slo caracteres, etc.; es necesario que los lenguajes de programacin puedan reconocer de qu tipo de dato se trata a fin de poder realizar el acepta los siguientes tipos de datos: procesamiento adecuado. urbo Ti os de datos si os char int long float double : permite almacenar un solo caracter : para representar nmeros enteros : para representar nmeros enteros de rango amplio : para representar nmeros reales de precisin simple : para representar nmeros reales de precisin doble

Pereda

astillo Aldo S.

Universidad sar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de

atos

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


Modi ic dores de ipos short long signed unsigned Tipo de dato unsigned char char unsigned int short int int unsigned long long loat

Estructura de Datos

Memoria oc pada ( de bytes)

01 01 02 02 02 04 04 04 08 10

0 a 255 128 a 127 0 a 65535 32 768 a 32 767 32 768 a 32 767 0 a 4 294 967 295 2 147 483 648 a 2 147 483 647 3.4 x 1038 a 3.4 x 10+38 1.7 x 10 308 a 1.7 x 10 +308 3.4 x 10
4932

double long double

a 3.4 x 10

Las cadenas de caracteres se consideran arreglos unidimensionales del tipo char. Ejemplo: Indique el tipo de dato ms adecuado para la variable que almacene los siguientes valores: 1. 2. 3. 4. 5. 6. 7. 8. 9. El precio de un libro mero de alumnos de un aula mero de D I mero de libreta militar mero de habitantes de Per __________________________ __________________________ __________________________ __________________________ __________________________ __________________________ __________________________ __________________________ _________ __________________________ __________________________ __________________________ __________________________ __________________________ __________________________

Cantidad de libros que existen en la biblioteca El valor de la constante PI El sueldo neto de un empleado

Valor de retorno de una funcin que indica si un nmero es perfecto

10. El color de ojos de una persona 11. La direccin de email de un alumno 12. El nmero de hermanos 13. La potencia de un nmero 15. Precio del boleto de pasaje a Lima 14. mero de horas de estudio

Pereda Castillo Aldo S.

- 11 -

: corto : largo : con signo (negativo) : sin signo (slo positivos) ango de valores

+4932

I. PROGRAMACI N MODULAR EJERCICIOS RESUELTOS


EJERCICIO Desarrollar un programa que permita calcular la raz ensima de un nmero positivo. a) Utilizando una funcin b) Utilizando un procedimiento Solu i n Anlisis: El primer paso para desarrollar un programa en cualquier lenguaje de programacin es entender el ro lema. Para esto debemos comprender claramente qu es lo que se nos pide. En este ejemplo se ha pedido calcular la raz ensima de un nmero; esto es: n nmero Por ejemplo:

!?

esto se lee: raz quinta de

Ahora determinamos cules son los datos de entrada, el proceso y la salida. Entrada:

omo observamos en las expresiones de ejemplo anteriores, se necesitan ingresar dos valores al computador para que ste pueda calcular la raz ensima de un nmero: el nmero (num) y el ndice (n) de la raz.

a variable num que almacenar el valor del nmero a calcularse su raz debe ser un tipo de dato numrico; en algunas ocasiones tomar un valor entero y en otras un valor real por tanto, su tipo de dato se debe generalizar a un tipo real (float); y por condicin del problema ser positivo. a variable n, que almacenar el ndice de la raz, tambin es un dato numrico; pero en este caso slo se considerar valores enteros; por tanto el tipo de dato ser int.

Proceso: Entendido el problema, el siguiente paso es saber cmo se resuelve. Es probable que para un mismo problema hayan varias soluciones; por ello debemos elegir la que sea factible en trminos de eficiencia; y sobre todo que se pueda traducir a un mtodo algortmico que es lo que finalmente entienden las computadoras a travs de los lenguajes de programacin. Veamos:

nm mo se calcula la raz ensima de un nmero Alternativas: a) A travs de una funcin predefinida en el lenguaje b) A travs de un mtodo iterativo c) A travs de algn mtodo matemtico
a) En el lenguaje de programacin ensima de un nmero.

b)

Se puede disear un algoritmo que iterativamente vaya dividiendo al nmero por mitad y comprobar si sta es su raz ensima (ensayo-error). unciona, pero no es eficiente pues el computador tendra que realizar muchas iteraciones. Si no existiera otro mtodo sera el elegido. Veamos si este mtodo es ms rpido:

c)

n num ! num /n
Base 12

Pereda

astillo Aldo S.

esto se lee raz stima de

!r

no existe una funcin que calcule directamente la raz

Exponente

Universidad sar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de

atos

Universidad sar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

a expresin anterior indica que matemticamente, una raz se puede convertir en exponente fraccionario. omo vemos, el problema de calcular la raz ensima se convirti en elevar una base a un exponente. Y cmo realizar esto?. Afortunadamente existe una funcin predefinida que permite elevar una base a un exponente: pow (base, exponente) que pertenece a la librera <math.h>

De las alternativas de solucin planteadas, seleccionamos la tercera pues es la ms directa y por tanto ms eficiente. El proceso sera : r = pow (num, 1.0/n) Es este proceso el que se realizar empleando subrutinas predefinidas por el programador. Salida

a salida, es decir, los datos que el computador debe mostrar para el usuario, van de acuerdo al objetivo de programa. Este es: calcular la raz ensima de un nmero; por tanto lo que debe mostrar en pantalla es ese resultado. :

Proceso : Salida

r = raizn(num,n) :

a Utili ando una fun i n a funcin sera:

float

fraizn(float num, int n){ //Calcula la raz n de num float r; r = pow (num, 1.0/n); return r;

//calcular la raz quinta de 32. //La variable r recibe el resultado (2) cout<<La raiz 5 de 32 es :<<r; Otra forma (directa) cout<<La raiz 5 de 32 es :<< fraizn(32,5);

Pereda

astillo Aldo S.

- 13 -

invo ando a la fun i n float r; r = fraizn(32,5);

Resumen: Entrada

eer nmero (num) eer ndice (n)

ostrar r

En forma ms simplificada sera: return (pow(num,1.0/n);

Universidad sar Vallejo Piura Escuela de Ingeniera de Sistemas


El programa completo :

Estructura de Datos

float

fraizn(float num, int n);

void main(void){ float num, r; int n;

clrscr(); cout<< *** RAZ ENSIMA **** \n==================\n; cout<<Ingrese el nmero: ; cin>>num; cout<<Ingrese el ndice de la raz: ; cin>>n; r = fraizn(num,n); cout<<La raz <<n << es : <<r; getch(); } // fin main // ==================== Subrutinas ===================== float fraizn(float num, int n){ //Calcula la raz n de num float r; r = pow (num, 1.0/n); return r; } // fin fraizn

Pereda

astillo Aldo S.

- 14 -

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

omentarios de abecera

ibreras Prototipos de Subrutinas

Programa Principal

uerpo de las Subrutinas

Guardar omo rog _ /* ------------------------------------------------------------------Descripcin: Programa que calcula la raz ensima de un nmero Autor : Ing. Aldo Pereda Castillo Fecha : 12.01.2008 1:34 pm --------------------------------------------------------------------*/

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


b) Utilizando un procedimiento El procedimiento sera:

Estructura de Datos

void

praizn(float num, int n, float *r){ //Calcula la raz n de num *r = pow (num, 1.0/n);

} Observe como en este caso no se utiliza return para devolver el valor, sino que se est empleando un terce r parmetro de salida: el par.a (indicado por el asterisco) Invocando al procedimiento: float r; praizn(32,5,&r); cout<<La raiz 5 de 32 es :<<r;

otas de inters

Pereda Castillo Aldo S.

- 15 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

E E CICIO 1 02 Se necesita un programa que indique si un ao es bisiesto. Un ao es bisiesto cuando es mltiplo de 400 o, cuando es mltiplo de 4 y no de 100; en otro caso no es bisiesto. Solucin El objetivo del programa es que la computadora nos pida que ingresemos un ao (un nmero) y luego sta nos responder con el mensaje Es bisiesto o o es bisiesto Identi icando subrutinas ecesitamos una subrutina que analice el ao en base a las condiciones dadas en el enunciado y luego responda que S es o o bisiesto. Cada vez que se tenga que implementar una subrutina para que responda S o o, se le debe implementar como una funcin lgica. Una funcin lgica es aquella que devuelve el valor verdadero (true : 1) o falso (false : 0); de este modo hacemos a la subrutina reutilizable para otros casos. La subrutina es: y esbisiesto: funcin que retorna 1 cuando el ao es bisiesto y 0 en caso contrario.

main

Cdigo uente uardar como prog1 02.cpp /* ------------------------------------------------------------------Descripcin: Programa que determina si un ao es bisiesto Autor: Ing. Aldo S. Pereda Castillo Fecha: 29.01.2008 7:09 am ------------------------------------------------------------------*/ #include <iostream.h> #include <conio.h> int esbisiesto(int anio); void main(void){ int anio,rpta; clrscr(); gotoxy(5,2); cout<<"*** AO BISIESTO ***"; gotoxy(3,4); cout<<"Ingrese el ao:"; cin>>anio; rpta=esbisiesto(anio); gotoxy(3,6); if (rpta==1) cout<<"El ao "<<anio<<" S es bisiesto "; else cout<<"El ao "<<anio<<" NO es bisiesto"; getch(); }//fin main // ================== Sub Rutinas ============================ int esbisiesto(int anio){ //Retorna 1 si anio es bisiesto Retorna 0 en caso contrario . //anio: Parmetro de entrada que almacena el valor del ao a analizar if (anio%400==0 || (anio%4==0 && anio%100!=0)) return 1; else return 0; }//fin esbisiesto

Pereda Castillo Aldo S.

- 16 -

Determinar si un ao es bisiesto esbisiesto

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

E E CICIO 1 03 Ahora nos piden un programa que liste todos los aos bisiestos entre dos valores lmites indicados por el usuario. Realice las validaciones necesarias. Solucin De hecho que casi siempre existe ms de una forma para resolver un problema en computadora. En este ejemplo consideraremos que dados los dos aos lmites (e primero menor que el segundo), se analizar ao a ao (de uno en uno) para determinar si es bisiesto (haremos uso de la subrutina esbisiesto creada en el mento de reutilizar la ejemplo anterior) Recuerda lo que se dijo acerca de la reutilizacin ; ahora es el mo subrutina anterior. Se validar que los aos lmite no acepten valores negativos ni cero. Adems el segundo ao debe ser mayor que e primero. Identi icando subrutinas ecesitamos una subrutina que se encargue de determina si un ao es bisiesto: esbiesto (funcin, y pues devuelve uno o cero) y ecesitamos una subrutina que se encargue de mostrar en pantalla todos los aos que cumplen la condicin de ser bisiestos: listabisiestos (procedimiento, pues no devuelve un valor, sino que escribe en pantalla ...)

main

lis tar bis ies tos lis tabis ies tos

Determinar s i un ao es bis ies to es bis ies to

Hacer paus a paus a

uardar como prog1 03.cpp Cdigo uente /* ------------------------------------------------------------------Descripcin: Programa que muestra una lista de aos bisiestos entre dos valores lmite ingresados por el usuario Autor: Ing. Aldo S. Pereda Castillo Fecha: 18.02.200? - 10:13 am ------------------------------------------------------------------*/ #include <iostream.h> #include <conio.h> int esbisiesto(int anio); void listabisiestos(int limi,int lims); void pausa(void); void main(void){ int lim1,lim2; clrscr(); gotoxy(5,1); cout<<"LISTA DE AOS BISIESTOS";

Pereda Castillo Aldo S.

- 17 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

do{ gotoxy(3,2); clreol(); cout<<"Ingrese el limite inferior:"; cin>>lim1; if (lim1<=0) { cout<<Error. El valor debe ser positivo. pausa(); } }while (lim1<=0); do{ gotoxy(3,3); ................... cout<<"Ingrese el limite superior:"; cin>>lim2; ...................... ...................... ...................... ...................... }while (..................); listabisiestos(......., ........); pausa(); }//fin main // ===================== Sub Rutinas ======================== int esbisiesto(int anio){ // el cdigo est en el EJERCICIO anterior }//fin esbisiesto void listabisiestos(int lim 1,int lim2){ //muestra en pantalla la lista de aos bisiestos entre lim1 y lim2 //lim1,lim2: parmetros de entrada que almacenan el limite //inferior y el limite superior. int x=1,y=5; //variables para las coordenadas de la pantalla for(int i=lim1;i<=lim2;i++){ if (esbisiesto(i)){ gotoxy(x,y); cout<<i; y++; if (y>20) { .............. .............. } // fin if if (x>70){ pausa(); .............. .............. .............. } // fin if } // fin if }//fin for } // fin listabisiestos void pausa(void){ //Pausa el programa esperando la pulsacin de cualquier tecla gotoxy(3,45); clreol(); cout<<"Pulse cualquier tecla para continuar..."; getch(); }// fin pausa

E E CICIO 1 04

Pereda Castillo Aldo S.

- 18 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

El Instituto Meteorolgico de la Regin orte mide la temperatura ambiental diaria en grados centgrados; pero para realizar las simulaciones y predicciones del clima necesita expresar esa temperatura en grados Fahrenheit, kelvin y rankine. Construya el programa que permita realizar estas conversiones. Solucin El programa debe leer un nmero real que representa la temperatura en grados centgrados y luego segn las frmulas de conversin debe calcular y mostrar sus equivalentes en las otras escalas: Fahrenheit, kelvin y ranking. Dado que son tres clculos (De C a F, de C a K y de C a R) necesitaremos tres subrutinas. Identi icando subrutinas y Se necesita una subrutina que convierta de C a F: afahrenheit (funcin) y Se necesita una subrutina que convierta de C a K: akelvin (funcin) y Se necesita una subrutina que convierta de C a R: arankine (funcin)

Convertir de C a F afahrenheit

Convertir de C a arankine

uardar como prog1 04.cpp Cdigo uente /* ------------------------------------------------------------------Descripcin: Programa que convierte una temperatura de grados centgrados a su equivalente en grados Fahrenheit, Kelvin y Rankine Autor: Ing. Aldo S. Pereda Castillo Fecha: 18.02.200? - 11:30 pm ------------------------------------------------------------------*/ #include <iostream.h> #include <conio.h> float afahrenheit(float centi); float akelvin(float centi); float arankine(float centi); void main(void){ float centi,fahr,kelv; clrscr(); cout<<"*** CONVERSION DE TEMPERATURAS *** \n\n"; cout<<"Ingrese la temperatura en C:"; cin>>centi; //calculando fahr=afahrenheit(centi); kelv=akelvin(centi); //mostrando resultados cout<<"\nEn grados Fahrenheit :"<<fahr; cout<<"\nEn grados Kelvin :"<<kelv; cout<<"\nEn grados Rankine :"<<arankine(centi); getch(); }//fin main

Pereda Castillo Aldo S.

- 19 -

ain

Convertir de C a akelvin

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

// ==================== Sub Rutinas ================= float afahrenheit(float centi){ //convierte de grados centigrados a fahrenheit //centi: parametro de entrada que almacena los grados centigrados float fahr; fahr = 9*centi/5+32; return ...............; }//fin afahrenheit float akelvin(float centi){ //convierte de grados centgrados a Kelvin //centi: parmetro de entrada que almacena los grados centgrados return ...............; }//fin akelvin float arankine(float centi){ //convierte de grados centgrados a rankine //centi: parmetro de entrada que almacena los grados centgrados ................................. }//fin arankine

Notas de inters

Pereda Castillo Aldo S.

- 20 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

E E CICIO 1 05 A fin de mejorar la interfaz de los programas codificados en TurboC++, se necesita implementar una subrutina que se encargue de mostrar un marco (recuadro) en la pantalla. Para darle flexibilidad y con e l propsito de reutilizar esta subrutina en el resto de programas, el marco debe ser flexible en el sentido que debe poder ubicarse en las coordenadas de la pantalla que el usuario indique. Solucin Debemos recordar que el lenguaje Turbo C++, en modo texto, considera a la pantalla como una matriz de 49 filas por 80 columnas. Los ndices de fila y columna inician en 1, As: 1 2 3 4 5 6 7 8 9 1 1 1 1 1 . . . 0 1 2 3 4 1 2 3 4 5 7 7 7 8 7 8 9 0

49 En cada casillero entra un carcter. Identi icando subrutinas y ecesitamos una subrutina que se encargue de ubicar, en las coordenadas adecuadas, los caracteres de la tabla ASCII que sirven para dibujar recuadros. (procedimiento ya que no devolver ningn valor) Por ejemplo, para un recuadro con lnea doble tenemos los siguientes caracteres: (ALT 186) Para el borde vertical (ALT 205) Para el borde horizontal (ALT 201) Para la esquina superior izquierda ........... Para la esquina superior derecha ........... Para la esquina inferior izquierda ........... Para la esquina inferior derecha

Pereda Castillo Aldo S.

- 21 -

!      

! )(  )( '&

$#"

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

Cdigo uente uardar como prog1 05.cpp /* ------------------------------------------------------------------Descripcin: Programa que dibuja un marco en la pantalla en las coordenadas indicadas por el usuario. Autor: Ing. Aldo S. Pereda Castillo Fecha: 15.01.200? - 4:49 pm ------------------------------------------------------------------*/ void main(void){ char rpta; int xi,yi,xf,yf; clrscr(); marco(1,1,80,40); gotoxy(3,3); cout<<"Esto es un marco de coordenadas (1,1) y (80,40)"; pausa(); do{ clrscr(); gotoxy(3,3); cout<<"Ingrese las coordenadas: x [1 -80]; y [1-45] "; gotoxy(3,5);cout<<"xi: ";cin>>xi; gotoxy(3,6);cout<<"yi: ";cin>>yi; gotoxy(3,7);cout<<"xf: ";cin>>xf; gotoxy(3,8);cout<<"yf: ";cin>>yf; marco(xi,yi,xf,yf); gotoxy(3,24);cout<<"Desea continuar (S/N)?"; rpta=toupper(getch()); }while(rpta=='S'); }//fin main //==================== Sub Rutinas =============================== void marco(int xi, // Dibuja un marco // xi, yi: son las // xf, yf: son las int yi, int xf, int yf) { en las coordenadas indicadas coordenadas iniciales esquina superior izquierda : coord enadas finales: esquina inferior derecha

int i,j; //dibujando las lneas verticales for(i=yi+1; i<yf; i++) { gotoxy(xi,i);cout<<" "; // ALT 186 gotoxy(xf,i);cout<<" "; //ALT 186 } //dibujando las lneas horizontales for(j=xi+1; j<xf; j++) { gotoxy(j,yi);cout<<" ";// ALT 205 gotoxy(j,yf);cout<<" ";//ALT 205 } //Completando los vrtices gotoxy(xi,yi);cout<<" "; // ALT 201 gotoxy(xf,yi);cout<<" "; // ALT 187 gotoxy(xi,yf);cout<<" "; // ALT 200 gotoxy(xf,yf);cout<<" "; // ALT 188 } //fin marco void pausa(void){ }// fin pausa

Pereda Castillo Aldo S.

- 22 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

E E CICIO 1 06 Escriba un programa que permita simular el inicio de sesin a una aplicacin. El programa debe permitir establecer el usuario y clave iniciales, para luego compararlos con otros valores que se ingresen.

Dibu ar marco (marco) Cdigo uente uardar como prog1 06.cpp /* ------------------------------------------------------------------Descripcin: Programa que simula el inicio de sesin a una aplicacin Autor: Ing. Aldo S. Pereda Castillo Fecha: 15.01.200? - 6:54 pm ------------------------------------------------------------------/ * void main(void){ char usuini[20],claveini[20]; //almacenan los valores iniciales de usuario y clave char usuario[20],clave[20]; // almacenan los valores del usuario y clave que intenta iniciar sesin char msje[40]; clrscr(); marco(3,3,50,12); gotoxy(6,4);cout<<"Establezca los par metros iniciales"; gotoxy(6,6);cout<<"Usuario: "; gets(usuini); gotoxy(6,8);cout<<"Clave: ";................ ; pausa(); clrscr(); marco(3,3,50,12); gotoxy(6,4);cout<<"Inicio de Sesi n"; gotoxy(6,6);cout<<"Usuario: "; gets(usuario); gotoxy(6,8);cout<<"Clave: "; ......................... strcpy(msje,comprobar( ....................................... )); gotoxy(6,10);cout<<msje; pausa(); }//fin main

//======================= Sub Rutinas ======================= char * comprobar(char usuini[],char claveini[],char usuario[],char clave[]) { // comprueba si el usuario y la clave son correctos comparndolos // con el usuario y clave establecidos: usuini y claveini //retorna el mensaje correspondiente como cadena

Pereda Castillo Aldo S.

- 23 -

4 3

Comprobar datos (comprobar)

main

Hacer pausa (pausa)

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

char msje[40]; if (strcmp(usuini,usuario)==0) if (strcmp(claveini,clave)==0) strcpy(msje,"Ingreso correcto. -Bienvenido!"); else strcpy(msje,"Error. Clave incorrecta"); else strcpy(msje,"Error. Usuario incorrecto"); return msje; } // fin comprobar void marco(int xi,int yi,int xf,int yf){ } //fin marco

E E CICIO 1 07 Programa que permita ingresar tres nmeros; y luego, a travs de subrutinas calcule la suma, el promedio, la media geomtrica y el mayor de los tres. Cdigo uente uardar como prog1 07.cpp /* Descripcin: Programa que a travs de funciones permite calcular la promedio, media geomtrica y el mayor de tres nmeros. Autor: Ing. Aldo Pereda Castillo Fecha: 30.08.200? 6:40 pm */ void main(){ float n1,n2,n3; float suma,prom,mgeom,mayor; clrscr(); cout<<"Ingrese el primer numero:";cin>>n1; cout<<"Ingrese el segundo numero:";cin>>n2; cout<<"Ingrese el tercer numero:";cin>>n3; suma = fsuma(n1,n2,n3); prom = ..........................................; mgeom = ..........................................; mayor = ..........................................; cout<<"\nLa suma es:"<<................; cout<<"\nEl promedio es:"<< ................; cout<<"\nLa media geomtrica es:"<< ................; cout<<"\nEl nmero mayor es:"<< ................; getch(); // pausa }//fin main

//--------------------- SUB RUTINAS ------------float fsuma(float n1,float n2,float n3) { float s; s=n1+n2+n3; return s; } float fpromedio(float n1,float n2,float n3) { .................; prom =(n1 + n2 + n3)/3; return .................; }

Pereda Castillo Aldo S.

- 24 -

A @

suma,

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


float fmediag(float n1,float n2,float n3) { float mg; mg = pow(n1*n2*n3,(1.0/3.0)); return ..........; } float fmayor(float n1,float n2,float n3) { if ((n1>n2)&&(n1>n3)) return ; else if ((n2>n1)&&(..........)) return ; else return ; }

Estructura de Datos

E E CICIO 1 08 Programa que permite ingresar una cadena, muestre una copia de sta pero eliminando todos los espacios en blanco y adems en maysculas uardar como prog1 08.cpp Cdigo uente /* Descripcin: Programa que permite ingresar una cadena, muestre una copia de sta pero eliminando todos los espacios en blanco y en maysculas Autor: Ing. Aldo Pereda Castillo Fecha: 01.09.200? - 3:20 pm. */ void main(){ char cad1[50], cad2[50]; char rpta; do{ clrscr(); cout<<"Ingrese la cadena: "; .........(cad1); transformar(.......... ,...........); cout<<"La cadena resultante es:"<<cad2; cout<<"\n\nDesea continuar (S/N)?"; rpta=toupper(getch()); }while(rpta==..............); }//fin main void transformar(char *cad1, char *cad2) { int i, longitud, j=0; longitud = ............(cad1); for(i=0;i<=longitud;i++) if (................................. .) //si no es el espacio en blanco cad2[j++]=cad1[i]; cad2[j]='\0'; strupr(cad2); }

E E CICIO 1 09 Programa que calcule el rea del cuadrado, del crculo, del tringulo y del rectngulo. Presente al usuario un men con estas opciones. Cdigo uente uardar como prog1 09.cpp /* Descripcin: Programa que muestra un men para calcular el rea de diferentes figuras geomtricas (usando Subrutinas) Autor: Ing. Aldo Pereda Castillo Fecha: 04.09.200? */ void main(){ char opcion; float lado,radio,area;

Pereda Castillo Aldo S.

- 25 -

P V

H T

G F S R

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

..................................... do{ clrscr(); menu(&opcion); clrscr(); switch(opcion){ case '1': gotoxy(13,5);cout<<"*** AREA DEL CUADRADO ***"; gotoxy(10,7);cout<<"Ingrese lado:"; cin>>lado; area=acuadrado(lado ); gotoxy(10,9);cout<<"El rea del cuadrado es:"<<area; getch(); break; case '2': gotoxy(13,5);cout<<"*** AREA DEL CIRCULO ***"; gotoxy(10,7);cout<<"Ingrese el radio:"; cin>>radio; area = .; gotoxy(10,9);cout<<"El rea del crculo es:"<<area; getch(); break; case '3': // Ud. complete el cdigo case '4': // Ud. complete el cdigo }//fin switch }while (opcion!='5'); }//fin main //------------------- SUB RUTINAS ------------------void men(char *opcion) {

}//fin menu

float acuadrado(float lado) { return lado*lado; } float acirculo(float radio) { float ar; ar=M_PI*radio*radio; return ........................; }

Pereda Castillo Aldo S.

- 26 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

E E CICIO 1 10 Programa que a travs de subrutinas muestra un listado de nmeros primos entre dos valores lmite. El listado aparece en varias columnas en la pantalla Cdigo uente uardar como prog1 10.cpp /* Descripcin: Programa que a travs de subrutinas muestra un listado de nmeros primos entre dos valores lmite. El listado aparece en varias columnas en la pantalla Autor: Ing. Aldo Pereda Castillo Fecha: 06.09.200? 7:00 pm */ void main(){ int lim1,lim2; char rpta; do{ clrscr(); gotoxy(1,1);cout<<"*** LISTA DE NUMEROS PRIMOS *** \n"; gotoxy(1,3);cout<<"Ingrese el limite inferior: "; .................; gotoxy(1,4);cout<<"Ingrese el limite superior: "; .................; ; gotoxy(1,5);cout<<"Los n meros primos comprendidos en este rango son:"; mostrarprimos(lim1,lim2); gotoxy(1,24);cout<<"Desea continuar (S/N)?"; rpta=toupper(getch()); }while(rpta=='S'); }//fin main //-------------------- SUB RUTINAS --------------int esprimo(int numero) { // retornar 1 SI es primo. Retornar 0 cuando NO es primo int i,mitad; mitad=numero/2; for(i=2;i<=mitad;i++) if (numero%i==0) return 0; // no es primo return 1; // si el flujo llega hasta aqu, es primo. } void mostrarprimos(int lim1,int lim2) { //muestra la lista de numeros primos. int i,j,num; i=1; j=8; for(num=lim1;num<=lim2;num++) { if(esprimo(num)) { gotoxy(i,j++); cout<<num; if(j>=20) //la fila 20 { j=8; i=i+6; } if(i>=75) {gotoxy(1,24); cout<<"Presione una tecla para continuar..."; getch(); clrscr(); i = .; j = .; } } // fin if } // fin for }

Pereda Castillo Aldo S.

- 27 -

Y X

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

E E CICIO 1 11 Programa que muestra un texto en pantalla con una alineacin horizontal indicada por el usuario (izquierda, centro o derecha). Adems, si el usuario lo indica, el texto aparecer encerrado en un marco. Cdigo uente uardar como prog1 11.cpp /* Descripcin: Programa que muestra un texto en pantalla con una alineacin horizontal indicada por el usuario. Adems si el usuario lo indica aparecer encerrado en un marco Autor: Ing. Aldo S. Pereda Castillo Fecha: 16.01.200? - 4:49 pm */ void main(){ char opcion; char texto[50]; int posx=3; //posicin horizontal inicial clrscr(); gotoxy(3,3);cout<<"Ingrese el texto:"; gotoxy(3,5);gets(texto); do{ menuh(&opcion); gotoxy(1,4);clreol(); gotoxy(1,6);clreol(); gotoxy(1,5);clreol(); //limpia la linea a partir de (3,5) switch(opcion){ case 'I'://Izquierda posx=3; break; case 'C'://Centro posx=(80-strlen(texto))/2; break; case 'D'://Derecha posx=80-strlen(texto); break; case 'M'://Activa el marco del texto marco(posx-1,4,posx+strlen(texto),6); break; }// fin switch gotoxy(posx,5); cout<<texto; }while (opcion!='S'); }//fin main

//======================= Sub Rutinas ======================== void menuh(char *opcion){ //Muestra un men horizontal con las opciones de alineacin y marco gotoxy(2,40); cout<<"[I]zquierda [C]entro [D]erecha [M]arco [S]alir"; *opcion=toupper(getch()); } // fin menuh

Pereda Castillo Aldo S.

- 28 -

e d

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

E E CICIO 1 12 En un trabajo de investigacin, de cierta cantidad de alumnos universitarios, se registr el nombre, el sexo, la edad y el nmero de horas dedicado al Internet por semana. o se conoce el nmero exacto de alumnos, sino que se ingresan al software conforme van llegando las encuestas. El programa debe realizar: a) Registrar los datos de los alumnos conforme vayan llegando las encuestas. b) Mostrar el listado de alumnos registrados. c) Determinar el nmero total de personas registradas. d) Determinar el nmero de varones y de mujeres. e) Calcular la edad promedio. f) Calcular la edad promedio de los varones y de las mujeres. g) Calcular el nmero de horas promedio dedicado a Internet por semana. h) Calcular el nmero de horas promedio dedicado a Internet por semana de los varo nes y de las muejres. i) Indicar si los varones o las mujeres utilizan ms el Internet por semana. j) Quin es la persona que ms horas dedica al Internet por semana. Si i t t i i ti t . P bi Chi

Pereda Castillo Aldo S.

- 29 -

xt v u t vx t y x vux wxyvt xu t t t t t yx w vtut

q p

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


P OGRAMACIN MODULAR E ERCICIOS PROPUESTOS 1. Indicar el tipo de dato ms adecuado para representar/almacenar:
                

Estructura de Datos

El nmero de pginas de un libro . El precio de un CD . El cdigo de un libro . El ttulo de un libro . El nombre del autor de un libro . La edad de una persona . El nmero de hijos de un empleado . El nmero telefnico . El estado civil . El valor de la constante matemtica psilon . El factorial de un nmero . El ao de edicin de un libro de algoritmos . El nmero de hermanos de una persona . La raz cuadrada de un nmero . El cdigo universitario. . El valor de retorno de una funcin lgica . El pago de un empleado por horas extras .

2.

La Cadena de Supermercados Compra gil nos ha encargado escribir un programa que determine el precio al detalle de un artculo a partir de las entradas apropiadas. Su poltica de precios es que cualquier artculo que se espera vender en una semana o menos debe llevar un sobreprecio de 5% respecto al precio al mayoreo, y cualquier artculo que se espera permanezca en anaqueles durante ms de una semana lleva un sobreprecio de 10%. Es importante indicar con precisin en qu momento el programa debe cambiar de una forma de clculo a otra. Subrutina que convierta un ngulo expresado en sexagesimales a su equivalente en radianes y centesimales. Programa que calcule mnimo comn mltiplo (mcm) de dos nmeros enteros y el mximo comn divisor (mcd) de los mismos. Programa que permita ingresar un nmero entero, y a travs de subrutinas realice: a. b. c. d. e. f. Mostrar todos sus divisores Determine si es nmero perfecto. Un nmero es perfecto cuando la suma de sus divisores (excepto el mismo nmero) es igual al nmero dado. Por ejemplo: 6 ya que sus divisores son: 1+2+3 6 (excepto el 6) Calcular y mostrar su factorial La raz cbica del nmero, redondeada a 2 decimales. Determinar si es capica. Un nmero es capica cuando al invertir su escritura (de derecha a izquierda) se obtiene el mismo nmero. Ejemplo: 121 22 333 15851, etc Mostrar su equivalente en octal. Sugerencia: Investigue la funcin predefinida itoa.

3. 4. 5.

6. 7. 8.

Dado el valor de un ngulo, escribir subrutina(s) que muestre el valor de todas sus funciones trigonomtricas. Programa que permita ingresra una fraccin (numerador y denominador) y luego simplifique la fraccin. La fraccin original y simplificada deben aparecer en la forma a/b. Programa que lea una cadena de caracteres y a travs de subrutinas realice: b) c) d) Devuelva los n caracteres del lado izquierdo de la cadena. Devuelva los n caracteres del lado derecho de la cadena. ombre a la subrutina como i a) Quite los espacios en blanco al final y al inicio de la cadena. ombre a la subrutina espaci s

ombre a la subrutina como derecha ombre a esta subrutina

9.

Escriba un programa que pida la estatura (en metros), el peso (en Kg.) y la edad (en aos) del usuario y luego calcule las tallas de ropa segn las frmulas:

Pereda Castillo Aldo S.

Tamao de sombrero multiplicado por 2.9.

peso en libras dividido entre estatura en pulgadas y el resultado

- 30 -

Devuelva n caracteres a partir de una posicin indicada de la cadena . como extraer

ed

ierda

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

Use funciones para cada clculo.

Pereda Castillo Aldo S.

- 31 -

Equivalencias: 1 Kg

2.2 Libras.

peso dividido entre 5.7. Se hace un ajuste sumando 1/10 de Cintura en pulgadas pulgada por cada 2 aos despus de los 28 aos de edad. Cabe sealar que el ajuste slo se hace una vez transcurridos 2 aos completos. As pues, no se hace un ajuste para las edades de 29, pero se suma 1/10 de pulgada por los 30 aos. 1 pulgada 2.54 cm

Tamao de saco (pecho en pulgadas) altura multiplicada por peso y dividida entre 288. Se hace un ajuste sumando 1/8 de pulgada por cada 10 aos despus de los 30 aos de edad. Cabe sealar que el ajuste slo se hace una vez transcurridos 10 aos completos. As pues, no se hace un ajuste para las edades de 30 a 39, pero se suma 1/8 de pulgada por los 40 aos.

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas MODELO DE EVALUACIN 01


1. Indicar el tipo de dato (en C) ms adecuado para: (5 ptos) a. Direccin de una pgina web b. c. d. e. f. g. h. i. j. Logaritmo de un nmero Estado civil de una persona Cantidad de aulas en la UCV El numero de una tarjeta de crdito umero de pginas de un libro ombre de un programa

Estructura de Datos

Precio del galn de petrleo Precio del dlar.

2. Colocar V o F (5 ptos) a. La funcin pow permite calcular slo potencias de 10 b. c. d. e. f. g. h. i. j. Al invocar un parmetro de salida se le antepone el operador mpersand La instruccin strlwr, convierte una cadena a minsculas El tipo de dato float tiene un tamao de 32 bits que es igual a decir 4 bytes Los datos de un arreglo residen en el disco duro Los parmetros de entrada se les conoce tambin por referencia Las funciones utilizan return para devolver los valores calculados La funcin sin pertenece a la librera math.h La cadena peruano es menor que la cadena monitor ( ) ) ( ( ( ) ) )

La funcin isalpha devuelve cero cuando su parmetro no es un carcter alfabtico (

3. Declarar arreglos para almacenar las siguientes situaciones: a. Sueldo neto de 500 trabajadores b. c. d. e.

Cdigo de 500 libros, se sabe que los cdigos de los libros constan de 10 caracteres. Los nombres y el stock de 1000 productos (declare dos arreglos) Registrar el email de los 300 docentes de la universidad. Se necesita registrar en el mes actual, la temperatura ambiental diaria de cada una de las provincias del departamento de Piura.

Pereda Castillo Aldo S.

- 32 -

h h h

umero de personas que trabajan en una empresa

..

( ( ( (

) ) ) )

(5 ptos)

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


MODELO DE EVALUACIN 02 1. Coloque V o F (4 ptos)

Estructura de Datos

a. A los parmetros de salida se les conoce tambin como parmetros por referencia ( b. La funcin strcmp pertenece a la librera ctype.h tipo ( ) ) ( ) ( ) ) ( ( )

c. Los arreglos se dice que son homogneos porque todos los datos que almacenan son del mismo d. Los arreglos siempre son parmetros por referencia ( f. Una subrutina es cohesiva cuando realiza una sola tarea

e. La ventaja de la recursividad es que permite crear subrutinas infinitas g. Al invocar una subrutina, los parmetros por valor van precedidos por & 2. Programas (12 ptos)

Elabore todo el programa : main y subrutinas La empresa de Transportes El Churre octurno actualmente tiene 10 unidades mviles (buses) que brindan el servicio de transporte de Piura a Trujillo. Cada bus est identificado por el nmero de placa y tiene asignado slo un conductor. Los buses realizan los viajes de lunes a domingo en el horario de 10:00 pm a 6:00 am, con salidas programadas cada 40 minutos (cada bus realiza slo un viaje por noche). Los buses tienen una capacidad mxima de 60 pasajeros. Se necesita un programa que realice lo siguiente: a) b) c) d) Que permita registrar el nmero de pasajeros que viajaron en cada bus y por cada da de la semana (slo el nmero, no el nombre). Calcular el total de pasajeros que viajan por da (considere todos los buses) Calcular el total de pasajeros que viajan por bus, considerando toda la semana Indicar en qu da de la semana viajan ms pasajeros.

Pereda Castillo Aldo S.

- 33 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas MODELO DE EVALUACIN 03


1. Coloca V o F (3 ptos) a. El tipo de dato float ocupa 2 bytes b. Los arreglos como parmetros siempre son considerados por referencia c. El operador flecha se utiliza para declarar una estructura d. El carcter nulo \0 indica el fin de una cadena e. La funcin toupper pertenece a la librera string.h f. La funcin isdigit devuelve cero cuando su parmetro no es un dgito g. La bsqueda secuencial necesita que el vector est ordenado h. El mtodo de la burbuja sirve para buscar un valor Responda brevemente: (3 ptos) a. Por qu son tiles los arreglos b. Enumere los mtodos de ordenamiento de arreglos c. Cul es la ventaja de la bsqueda secuencial frente a la binaria .. .. .. .. ..

Estructura de Datos

( ( ( ( ( ( ( (

) ) ) ) ) ) ) )

Pereda Castillo Aldo S.

- 34 -

p p p

p p o pn

3.

(2 ptos) Coloque >, a. capacidad b. siete c. 849 d. ^ e. Departamento

asignacin validacin 99 @ REGIO

2.

l l

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

ORDENAMIENTO Y BSQUEDA

Capacidades Conoce el mtodo de la burbuja para ordenar los elementos de un arreglo Identifica ventajas y desventajas de las dos versiones del mtodo de la burbuja Adapta el algoritmo de burbuja para ordenar vectores tanto ascendente como descendentemente Crea subrutinas reutilizables que permiten ordenar un arreglo Diferencia la bsqueda secuencial de la binaria Identifica ventajas y desventajas de cada mtodo de bsqueda Crea subrutinas de bsqueda de elementos en vectores

ORDENAMIENTO Ordenar consiste en ubicar los elementos de un conjunto en alguna secue ncia especfica, la cual puede ser ascendente o descendente. Una de las tareas ms frecuentes durante el procesamiento de datos es la ordenacin o clasificacion de un conjunto de valores de acuerdo con el contenido de un campo clave o referencial. Existen n umerosos mtodos de ordenamiento dependiendo de si los datos estn almacenados en memoria RAM (arreglos) o si los datros se encuentran en dispositivos de almacenamiento externos (archivos) La principal condicin que tienen que cumplir los mtodos de orde nacin interna es el empleo eficiente de la memoria de la coputadora. En otras palabras, la ordenacin de los tems debe realizarse sobre las mismas posiciones de memoria ocupadas por los datos, salvo alguna posicin auxiliar. Existen tres familias de mtodos de ordenacin: intercambio, seleccin e insercin; distinguindose cda una de ellas por el mtodo base que utilizan para colcoar los datos en el orden final deseado. Mtodos de ordenamiento 1. Burbuja 2. SeleccinInsercin 3. QuickSort 4. Ordenacin por montculo 5. Ordenacin Shell Ordenamiento por el mtodo de la Burbuja Es el mtodo de ordenamiento ms popular, sencillo e intuitivo, y, por tanto, el ms fcil de entender (y tambin el menos eficiente). Este mtodo se basa en la comparacin de parejas de elementos adyacentes e intercambio de los mismos si stos no estn en el orden deseado. El proceso de comparacin empieza con la primera pareja: los elementos de las posiciones 0 y 1; y avanza hasta la ltima pareja: los elementos de la posicin 2 y 1 ( es el nemro de elementos del conjuto). Si se comparan e intercambian elementos consecutivos o adyacentes del arreglo, es evidente que despus de realizar un recorrido o pasada por toda la estructura, el elemento mayor se encontrar en la posicin ms alta del arreglo. En pasadas sucesivas se irn colocando en las posiciones ms altas los inmediatamente menores. Por tanto el nmero de pasadas mximo para que el arreglo resulte ordenado es 1, ya que en la ltima pasada se colocarn los dos elementos ms pequeos en sus posiciones finales. 1 es el nmero de pasadas mximo, pero dependiendo de la ubicacin de los elementos puede que el vector quede ordenado antes de las 1 pasadas. E EMPLO 01 Comprendamos el procedimiento con el siguiente ejemplo: Sea el vector V {23, 45, 18, 33, 72, 12} y se desea ordenarlo en forma ascendente. Muestre cmo va quedando e vector en cada pasada.

Pereda Castillo Aldo S.

- 35 -

Como e nmero de elementos es 6; esto indica que se necesitan como mximo que el vector quede totalmente ordenado.

1 : 5 pasadas para

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


V = 23, 45, 18, 33, 72, 12 V {23, 18, 45, 33, 72, 12} V {23, 18, 33, 45, 72, 12} V = 23, 18, 33, 45, 12, 72

Estructura de Datos

E EMPLO 02

Como e vector tiene 6 elementos, se necesitan, como mximo cinco pasadas o iteraciones (6 1). Veamos que ocurre y en cunatas pasadas quedar ordenado el vector.

Pasada 2:

Respuesta: El vector ha quedado ordenado en la segunda pasada. Algoritmo de ordenacin por burbuja 1 Implementaremos ods versiones de mtodo de la burbuja. El primero fcil de entender, realiza pasadas obligatoriamente; el segundo corrige esta desventaja y detecta cuando el vector ya qued ordenado a fin de evitar desperdicio de procesamiento. Para ambos casos, sea v el vector numrico de n elementos; y se desea ordenarlos ascendentemente. Algoritmo versin1: utiliza las N 1 pasadas void burbuja1(float v[100], int n) { for (int i = 0; i< (n 1); i++) for(int j=0; j< (n i 1); j++ ) if (v[j] > v[j+1]) { //intercambiar aux = v[j]; v[j]=v[j+1]; v[j+1]=aux; } } //fin burbuja1

Pereda Castillo Aldo S.

- 36 -

v v

Pasada 1:

V = 28, 12, 10, 33, 45, 72 V {12, 28 10, 33, 45, 72} V = 12, 10, 28, 33, 45, 72 V = 12, 10, 28, 33, 45, 72 V {10, 12, 28, 33, 45, 72}

Observe cmo el elemento mayor, en este ejemlo, ya est en la ltima posicin. Ahora el vector ya qued ordenado. Sin embargo necesitaba 5 pasadas como mximo, peor claramente observamos que este vector ha quedado ordenado antes.

Realice el mismo procedimiento con el siguiente vector V pasadas ha quedado ordenado el vector

u u

Pasada 5:

V = 18, 12, 23, 33, 45, 72 V {12, 18, 23, 33, 45, 72}

Pasada 4:

V = 18, 23, 12, 33, 45, 72 V {18, 12, 23, 33, 45, 72}

Pasada 3:

V = 18, 23, 33, 12, 45, 72 V {18, 23, 12, 33, 45, 72}

Pasada 2:

V = 23, 18, 33, 45, 12, 72 V {18, 23, 33, 45, 12, 72} V = 18, 23, 33, 12, 45, 72

u u u

Pasada 1:

v v

Como resultado de la primera pasada (iteracin) se obtiene que el valor mayo (72) ya se encuentra en la ltima posicin; pero an el vector no est ordenado.

w w w w w

El siguiente valor mayor (45) se ha colocado en la siguiente posicin ms alta. An no est ordenado el vector.

Despus de quinta pasada, el vector ya ha quedado ordenado

{28, 12, 10, 33, 45, 72}. Despus de cuntas

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


Algoritmo versin2: Detecta cuando el vector ya qued ordenado void burbuja(float v[100], int n) { int sw; float aux; sw = 0; while (sw ==0){ sw = 1; for(int j=0; j< (n 1); j++ ) if (v[j] > v[j+1]) { //intercambiar aux = v[j]; v[j]=v[j+1]; v[j+1]=aux; sw = 0; } } //fin while } //fin burbuja Invocando: leer(vector,n); mostrar(vector,n) burbuja(vector,n); mostrar(vector,n);

Estructura de Datos

Esta segunda versin no obliga a que el proceso de comparacin de parejas de elementos se repita n 1 veces, sino que incluye el uso de una variable bandera (centinela) llamada sw que permite que la comparacin se repita (las pasadas) mientras el vector an no est ordenado. Mientras sw sea igual a cero indica que el vector no est ordenado. Cuando sw es igual a uno indica que ya est ordenado y por tanto no vuelve a ejecutarse la estructura while. En adelante usaremos este segundo algoritmo por ser ms eficiente.

Pereda Castillo Aldo S.

- 37 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

BSQUEDA

La bsqueda es una operacin que tiene por objeto la localizacin de un elemento dentro de la estructura de datos. El elemento que se busca se caracteriza o distingue por el valor de una clave o la combinacin de varias si la clave es compleja. En lo sucesivo entenderemos por clave el valor, ya sea simple o no, que caracteriza al elemento sendo el array de una dimensin o lista de una estructura de acceso directo y a su vez de acceso secuencial, veremos dos tcnicas que utiliza estos dos mtodos de acceso, para encontrar n elementos dentro de un arreglo de una dimensin. Bsqueda secuencial La bsqueda secuencial es la tcnica ms simple para buscar un elemento en un arreglo. Consiste en recorrer el arreglo elemento a elemento e ir comparando con la clave o valor buscado. El recorrido termina al encontrar el elemento o bien porque se rebasa la posicin del ltimo componente del arreglo, situacin que indica que el elemento buscado no se encuentra en el arreglo. La bsqueda puede realizarse en dos circunstancias diferenciadas: estando el arreglo desordenado u ordenado de acuerdo a la clave. Algoritmo de bsqueda secuencial Implementaremos el algoritmo de bsqueda secuencial en una subrutina que retorne la posicin del elemento buscado en el arreglo o que retorne 1 en caso de que no se encuentre. Dado que queremos que retorne un valor , se implementar como una funcin:

int bsecuencial(float vector[ ], float vbuscado, int n) { //retorna la posicin del valor buscado si lo encuentra // o retorna 1 en caso de que no lo encuentre for(int i=0;i < n ; i++) if(vector[i] == vbuscado) return i; return -1; } // fin bsecuencial

invocando: leer(vector,n); cout<<Valor a buscar:; cin>>vbuscado; p = bsecuencial(vector, vbuscado,n); if (p == -1) cout<<El valor no existe; else cout<<Elemento encontrado en la posicin <<p;

Bsqueda binaria La bsqueda binaria o dicotmica es el mtodo ms eficiente para encontrar elementos en un arreglo ordenado. El proceso comienza comparando el elemento central del arreglo con el valor buscado (esto divide literalmente al arreglo en dos partes). Si ambos coinciden (son iguales) finaliza la bsqueda. Si no ocurre as, el elemento buscado ser mayor o menor en sentido estricto que el elemento central del arreglo. Si el elemento buscado es mayor se procede a hacer bsqueda binaria en el sub arreglo superior, es decir, el delimitado por los ndices central + 1 y n 1. Si el elemento es menor haremos bsqueda binaria entre los ndices central 1 y 0. El proceso finaliza cuando se encuentra el elemento o cuando el sub arreglo de bsqueda se queda sin elementos. Este mtodo exige que la lista est ordenada. Algoritmo de bsqueda binaria Implementaremos el algoritmo de bsqueda binaria en una subrutina que retorne la posicin del elemento buscado en el arreglo o que retorne 1 en caso de que no se encuentre. Dado que queremos que retorne un valor , se implementar como una funcin:

Pereda Castillo Aldo S.

- 38 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

int bbinaria(float vector[ ], float vbuscado, int n ) { //busqueda binaria int bajo,alto,central,esta; esta= bajo = 0; alto = n-1; do{ central = (bajo+alto)/2; if (vbuscado==vector[central]) esta=1; else if (vbuscado > vector[central]) //busca a la derecha bajo = central+1; else // busca a la izquierda alto = central-1; }while(!esta&&bajo<=alto); if (esta) return central; else return -1; } // fin bbinaria

invocando: leer(vector,n); cout<<Valor a buscar:; cin>>vbuscado; p = bbinaria(vector,vbuscado,n); if (p == -1) cout<<El valor no existe; else cout<<Elemento encontrado en la posicin <<p;

Pereda Castillo Aldo S.

- 39 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


ORDENAMIENTO Y BSQUEDA E ERCICIOS RESUELTOS E ERCICIO 3 01

Estructura de Datos

Programa que permita ingresar nmeros y luego los muestre ordenados ascendentemente por el mtodo de la burbuja (versin 1). Codifique la lectura y escritura del vector en forma recursiva. Solucin Cdigo uente Guardar como prog3 01.cpp /* Descripcin: Programa que permite ingresar N nmeros y los muestra ordenados ascendentemente por el mtodo de Burbuja versin 1 Autor: Aldo Pereda C. Fecha: 27.03.200? 8:00 am */ #define TMAX 30 //define el tama mximo del vector o

void main() { float numeros[TMAX]; int n; char rpta; do{ clrscr(); cout<<"*** ORDENAR N NUMEROS *** \n\n"; cout<<"\nIngrese la cantidad de elementos: "; ingreso(numeros,n); cout<<"\nElementos Originales:"; vervector(numeros,n); ordenar(.............................); cout<<"\n\nElementos Ordenados:"; vervector(............................); cout<<"\n\nDesea continuar (S/N)?"; rpta=toupper(getch()); }while(............); } // fin main // ------------------ Sub Rutinas ------------------void ingreso(float vector[ ], int n) {

cin>>n;

} //fin ingreso void ordenar(float vector[ ], int n) //ordena ascendentemente { float aux; for(.............................) for(int j=0;) if (vector[ j ] > vector[ j+1] ) // intercambiar { ................................... ................................... ................................... } //fin if } // fin ordenar void { vervector(float vector[ ], int n)

} // fin vervector

Pereda Castillo Aldo S.

- 40 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


E ERCICIO 3 02

Estructura de Datos

Programa que permita ingresar cualquier cantidad de nombres de clientes hasta que se ingrese el centinela FI y luego los muestre ordenados alfabticamente por el mtodo de la burbuja versin 2. Codifique slo el ingreso de datos en forma recursiva. Solucin Cdigo uente Guardar como prog3 02.cpp /* Programa que permite ingresar N nombres de clientes y ordenarlos por el mtodo de Burbuja mejorado. Autor: A.Pereda C. Fecha: 27.03.200? 8:30 am */ #define TMAX 30 //define el tamao mximo del vector void main() { char clientes[TMAX][20]; int n; char rpta; do{ clrscr(); cout<<"*** ORDENAR N NOMBRES ***\n\n"; ingreso.; pausa(); clrscr(); cout<<"\nLos elementos originales son:"; verlista(clientes,n); pausa(); clrscr(); cout<<"\nLos elementos ordenados son:"; ordenar(clientes,n); ........................................; cout<<"\n\nDesea continuar (S/N)?"; rpta=toupper(getch()); }while(.................); } // fin main // --------------------------- Sub Rutinas --------------------------------void ingreso(char vectorcad[TMAX][20], int n) {

} //fin ingreso void ordenar(char vectorcad[TMAX][20], int n) { int sw; // Metodo Burbuja mejorado char cadaux[20]; sw=0; while(.............) { ........; for(int j=0;j<=(n-2);j++) if (strcmp(vectorcad[j],vectorcad[j+1])>0) //intercambiar { strcpy(cadaux,vectorcad[j]); ..................................................; ............................. ........................ ; ...........; } //fin if }//fin while } // fin ordenar void verlista(char vectorcad[TMAX][20], int n) { gotoxy(2,4);cout<<"*** LISTADO DE CLIENTES ***"; gotoxy(2,6);cout<<"Nro."; gotoxy(7,6);cout<<"Nombre"; gotoxy(2,7);cout<<"===================="; for(int i=0;i<n;i++)

Pereda Castillo Aldo S.

- 41 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


{ gotoxy(2,i+8);cout<<i+1<<". -"; gotoxy(7,i+8);cout<<.;

Estructura de Datos

} } // fin verlista

E ERCICIO 3 03 Programa que permita registrar el nombre y la estatura de cierta cantidad de estudiantes de un centro educativo. El programa debe permitir: e) f) g) h) i) Registrar cualquier cantidad de estudiantes junto con su estatura. Visualizar la relacin de alumnos ordenada descendentemente por estatura. Calcular y mostrar la mediana de las estaturas. La mediana es el valor que ocupa la posicin central de un conjunto de valores previamente ordenados. El programa debe indicar los nombres de los estudiantes que conformarn la escolta. La escolta la conforman los sesis estudiantes de mayor estatura. Para los desfiles escolares, se necesita la relacin de alumnos que conformarn cada batalln. Cada batalln consta de 18 estudiantes y cada centro presentar como mximo dos batallones conformados por los alumnos de mayor estatura.

Solucin

#define TMAX 100 void main() { //arreglos paralelos char nombres[TMAX][31]; float estaturas[TMAX]; int n=0; char opcion; do{ clrscr(); menu(&opcion); clrscr(); gotoxy(5,3); switch(opcion){ case 'A': case 'B':

cout<<"A. Registrar alumno"; ingreso(nombres,estaturas,&n); break; cout<<"B. Ver lista de alumnos"; if (n!=0) verlista(nombres,estaturas,n); else { gotoxy(5,10); cout<<"Error. Datos no ingresados"; } getch(); break;

case 'C':

case 'D':

Pereda Castillo Aldo S.

- 42 -

Cdigo uente /* Descripcin:la indicada en el enunciado Autor: A.Pereda C. Fecha: 27.04.200? 8:30 am */

Guardar como prog3 03.cpp

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

case 'E':

case 'F':

}//fin switch }while(opcion!='G'); }// fin main // -------- SUB RUTINAS -------void menu(char *opcion) { gotoxy(15,5); cout<<"ALUMNOS - ESTATURAS"; gotoxy(8,7); cout<<"A. Registrar alumno"; gotoxy(8,8); cout<<"B. Ver lista"; gotoxy(8,9); cout<<"C. Ordenar por estatura"; gotoxy(8,10); cout<<"D. Mediana de estaturas"; gotoxy(8,11); cout<<"E. Alumnos para Escolta"; gotoxy(8,12); cout<<"F. Formar batallones"; gotoxy(8,13); cout<<"G. Salir"; gotoxy(8,14); cout<<"Su opcion"; *opcion=toupper(getch()); } void ingreso( { //permite agregar solo un registro en la posicion n gotoxy(5,5); cout<<"Nombre del alumno:"; strupr(gets(nombres[*n])); gotoxy(5,6); cout<<"Estatura :"; cin>>estaturas[*n]; (*n)++; }//fin ingreso )

void ordenarestat( ) { ...................... ; //ordena descendentemente ......................; while (............){ sw = 1; for(int j=0; j< (n - 1); j++ ) if (................................. ) { //intercambiar las estaturas y los nombres ................................. ; sw = 0; } } //fin while } //fin ordenaredad void intercambiar(char nombres[TMAX][31], float estaturas[TMAX], int j) { .................................................. auxestatura=estaturas[j]; estaturas[j]=............................. ; estaturas[j+1]=........................... ; strcpy(auxnombre,nombres[j]); strcpy(nombres[j],........................ ); strcpy(.................................. ); }//fin intercambiar void verlista(.................................................... ) { gotoxy(5,5);cout<<"N"; gotoxy(9,5);cout<<"Alumno"; gotoxy(50,5);cout<<"Estatura";

Pereda Castillo Aldo S.

- 43 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

gotoxy(5,6);cout<<"=========================================="; for(int i=0;i<n;i++) { gotoxy(5,7+i);cout<<(i+1)<<". -"; ........................................ ; ........................................ ; }//fin for }//fin verlista float mediana( float estaturas[TMAX], int n) { int pos1,pos2; float med; if (............){ //si n es impar pos1=(n+1)/2 -1; med=estaturas[pos1]; } else { //n es par ......................... ; ......................... ; ................................................ ; } return med; }//fin mediana

Pereda Castillo Aldo S.

- 44 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


E ERCICIO 3 04 Con respecto al programa anterior, implementar subrutinas que permitan: a) b)

Estructura de Datos

Buscar un alumno por nombre. En caso de que lo encuentre visualizar su estatura. Utilice bsqueda secuencial Utilice bsqueda binaria para buscar estaturas. El usuario ingresa una estatura y el programa informa si existe o no esa estatura en el registro.

Solucin Se implementarn las subrutinas y la invocacin respectiva, la integracin en el programa anterior queda como ejercicio para el alumno.

int bsecuencial(.................................................... ) { //busca por nombre de alumno for(int i=0;; i++) if(...................................) return i; return -1; } // fin bsecuencial int bbinaria(float estaturas[TMAX], float vbuscado, int n ) { //busca una estatura ...................................... ; esta= bajo = 0; alto = n-1; do{ central = ..................... ; if (vbuscado==estaturas[.........]) ................; else if (vbuscado>estaturas[central]) //busca a la derecha ........................... ; else //busca a la izquierda ....................... ; }while(!esta&&bajo<=alto); if (esta) ......................; else return -1; } // fin bbinaria

invocaciones case ?: cout<<Nombre a buscar:; strupr(gets(nombuscar); p = bsecuencial(nombres,nombuscar,n); if (p!= 1) cout<<La estatura de <<nombuscar<< es <<estaturas[p]; else cout<<El nombre no existe. No ha sido registrado.; getch(); break; cout<<Estatura a buscar:; cin>>vbuscado; p = bbinaria(estaturas,vbuscado,n); if (p!= 1) cout<<La estatura s ha sido registrada; else

case ?:

Pereda Castillo Aldo S.

- 45 -

Cdigo uente

Guardar como prog3 04.cpp

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

cout<<La estatura no existe. No ha sido registrada.; getch(); break;

El xit es aprender a ir de fracaso en fracaso sin desesperar. Wi

Chu hill

Pereda Castillo Aldo S.

- 46 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


ORDENAMIENTO Y BSQUEDA E ERCICIOS PROPUESTOS

Estructura de Datos

1.

Se lee una lista de nmeros desde teclado y se desea saber si entre dichos nmeros se encuentra el nmero 333. En caso afirmativo visualizar su posicin en la lista. Resolver e problema por bsqueda l secuencial y por binaria. Se leen dos listas de nmeros enteros A y B, de m y n elementos respecitvamente. Se desea resolver mediante subrutinas las siguientes tareas: a. Ordenar cada una de las listas A y B b. Crear una lista C por intercalacin o mezcla de las listas A y B c. Localizar si existe en la lista C un valor ingresado por el usuario. d. Visualizar cada una de las listas. Se dispone de un array que almacena fechas en formato cadena (ddmmaaaa). Disear un programa que muestre las fechas ordenadas ascedentemente. Se quiere construir una agenda telefnica con la siguiente info rmacin: nombre, domicilio, nmero telefnico y email. Disear un programa para mantener la agenda, que como mucho almacenar informacin sobre 200 personas de tal forma que la bsqueda se realice por el nombre de la misma y que se mantenga durante su procesamiento ordenada alfabticamente. Un restaurante almacena en arreglos unidimensionales las caloras correspondientes al primero, segundo plato y postre de su carta del da. Si una persona se encuentra sometida a un regimen de comidas inferior o igual a cierta cantidad de caloras; determinar todas las combinaciones posibles de primero, segundo plato y postre que le permiten mantener su rgimen. Programa que permita ingresar valores numricos a dos conjuntos A y B con m y n elementos respectivamente. El programa a tarvs de subrutinas debe hallar las siguientes operaciones con conjuntos en un nuevo conjunto C.. Adems al visualizar los conjuntos, sus elementos deben aparecer ordenados ascendentemente. a. A u B (unin) b. A n B (interseccin) c. A B (diferencia) d. B A (diferencia) e. A ( B (diferencia simtrica, equivale a (A B) u (B A) ) La Escuela de Ingeniera de Sistemas de la UCV-Piura ha creado los talleres extracurriculares gratuitos a fin de reforzar la formacin acadmica de nuestros alumnos. Actualmente se dictan 3 talleres: y OLAP (22 vacantes) y PHP (22 vacantes) y Oratoria (40 vacantes) o exista restriccin en la inscripcin asi que varios alumnos se han registrado en ms de un taller. Se necesita un programa qe realice: a) Muestre la lista ordenada alfabticamente de alumnos en cada uno de los talleres. b) Indique en qu taller an quedan vacantes. c) Muestre la relacin de alumnos, ordenada alfabticamente, que est inscrito en OLAP-Oracle y n PHP y MySQL. d) Muestre la relacin de alumnos que slo est llevando Oratoria y Liderazgo.

2.

3. 4.

5.

6.

7.

Pereda Castillo Aldo S.

- 47 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

REGISTROS (ESTRUCTURAS)

Capacidades Conoce el concepto de registro y su importancia en la solucin de problemas. Declara estructuras y variables estructura. Lee y escribe datos en los campos de una estructura. Referencia los elementos de las variables estructura. Crea arreglos de estructura. Crea subrutinas con estructuras como parmetros. Crea subrutinas que devuelven estructuras. Crea subrutinas para ordenar y buscar elementos en estructuras. La estructura de datos Registro Un registro es una coleccin de datos de igual o diferente tipo acerca de una entidad. Es una estructura heterognea de datos, denominados campos, y a diferencia de un arreglo, se accede a ellos por nombre y no por meido de un ndice. Los registros poseen la ventaja de que los datos se encuentran fsicamente adyacentes en la memoria RAM lo que permite un mejor uso de sta, a diferencia de los arreglos paraleos en que los datos de un arreglo se encuentran alejados del otro y slo se relacionan con el ndice. Cundo emplear registros? Cuando tengamos que alamacenar un conjunto de datos acerca de una entidad. Adems cuando una variable se componga de dos o ms campos. Los registros se comportan como un nuevo tipo de dato: un tipo de dato compuesto. Declarar registros Al igual que cualquier otro tipo de datos, el dato tipo registro (struct) antes de poder ser utilizado debe ser declarado. La sintaxis es: struct nombre{ tipodato campo1; tipodato campo2; tipodato campon; }; En esta forma de declaracin del registro, siempre va punto y coma despus de la llave de cierre. Los campos (campo1, campo2, campon) son variables de tipo de dato simple asi como tambin pueden ser arreglos o registros. El nmero de bytes que ocupa el registro ser la suma del nmero de bytes de cada uno de sus campos. E EMPLO 01 Una fecha consta de da, mes y ao. Podemos estructurala como registro struct tipofecha{ int dia; int mes; int anio; };

Pereda Castillo Aldo S.

- 48 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


E EMPLO 02

Estructura de Datos

Se necesita registrar los siguientes datos de una asignatura: cdigo, nombre, nmero de horas, crditos y tipo. Como puedes ver, son varios datos de una misma entidad, entonces los unificamos en un registro: codigo nombre numhoras int creditos int tipo char[25]

E EMPLO 03 Un punto en el plano cartesiano est conformado por la distancia en el eje de las abscisas y la distancia en el eje de ordenadas (x, y). Entonces se puede declarar como una estructura: struct punto{ float x; float y;

E EMPLO 04 Para una mejor organizacin en el acceso, una direccin podemos estructurarla como ubicacin, distrito, provincia. struct tipodireccion{ char ubicacion[41]; char distrito[21]; char provincia[26]; char departamento[26]; };

E EMPLO 05 Los datos personales de un alumno universitario son: codigo universitario, el cual consta de diez digitos, apellidos, nombres, fecha de nacimiento, direccin, sexo, estado civil, documenot de identidad, fecha de ingreso, apoderado, telfono fijo, telfono mvil, email y colegio de procedencia.

Pereda Castillo Aldo S.

char[5] char [21] y declaramos la estructura struct tipocurso{ char codigo[5]; char nombre[21]; int numhoras; int creditos; char tipo[25];

}; Este registro ocupa 55 bytes, que es el resultado de la suma de 5 + 21 +2 + 2 +25

};

- 49 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

Declarar variables registro Como se ha dicho, los registros (estructuras) se comportan como un nuevo tipo de dato: un tipo de dato compuesto. Para poder utilizarlos es necesario crear variables registro. La sintaxis para crear variables registro es la misma que para crear cualquier otra variable. Primero se coloca el tipo de dato y luego el nombre de la variable. As: Nombre_o_alias_del_registro nombrevariable; E EMPLO 06 Podemos crear variables de la estructura tipofecha declarada anteriormente: struct tipofecha fecha1; En este caso se ha declarado la variable fecha1 correspondiente a la estructura tipofecha. La variable fecha1 tendr la siguiente estructura: fecha1 dia mes E EMPLO 07 Para el caso de la estructura tipocurso, podemos crear variables as: struct tipocurso c1,c2,c3; En este caso se ha declarado tres variables de la estructura tipocurso. La estructura de cada una de ellas es: c1 codigo c2 codigo c3 codigo nombre numhoras creditos tipo anio

Uso de typedef Es una buena prctica de programacin asignarle un alias a los tipos de datos, es decir un nuevo nombre. Con esto conseguimos mayor feixibilidad y adaptacin a las modificaciones que se tengan que realzar en el i programa. Una manera elegante de declarar variables registro es justamente primero cambiarle de nombre al tipo de dato compuesto; y luego declarar las variables con este nuevo nombre. Se prefiere que el uso de typedef sea general a todo el programa, por eso se le debe escribir arriba de mdulo main; obviamente antes de utilizar el nuevo nombre. E EMPLO 08 Vamos a declarar variables de la estructura punto creada anteriormente.

struct

punto{ float x; float y;

};

Pereda Castillo Aldo S.

- 50 -

nombre

numhoras

creditos

tipo

nombre

numhoras

creditos

tipo

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

typedef struct punto pto; ... void main() { pto p1, p2, p3; }

//aqu se le cambi de nombre a pto

En este fragmento de cdigo se observa que despus de declarar la estructura punto (struct punto) se le ha cambiado de nombre; ahora se llama tambin pto; el nuevo tipo de dato es pto. Dentro de main se ha declarado tres variables p1, p2 y p3 del tipo pto. Declarar arreglos de registros Es frecuente el uso de arreglos (vectores matrices) de registros. Para declararlos se sigue la misma sintaxis, aadiendo el tamao del arreglo. Para un vector Para una matriz : E EMPLO 09 ecesitamos registrar los datos de los cursos que se ensean en la escuela de Ingeniera de Sistemas de la UCV. Son alrededor de 50 cursos. Entonces necesitamos un vector que pueda almacenar el cdigo, nombre, numero de horas, crditos y tipo de cada uno de los 50 cursos. Tenemos: struct tipocurso{ char codigo[5]; char nombre[21]; int numhoras; int creditos; char tipo[25]; tcurso; //cambio de nombre : Nombre_o_alias_del_registro nombrevector[tamao]; Nombre_o_alias_del_registro nombrematriz[nfilas][ncol];

Esto origina la siguiente representacin grfica del vector en la memoria RAM. codigo 0 1 2 3 4 5 6 7 .. .. 49 nombre vcursos numhoras creditos tipo

Pereda Castillo Aldo S.

}; typedef struct tipocurso ...

void main() { tcurso vcursos[50]; //aqu se declara el vector de tamao 50 ... }

- 51 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

E EMPLO 10 Se necesita registrar 500 direcciones de clientes. Declare el vector correspondiente utilizando la estructura del ejemplo 04.

Pereda Castillo Aldo S.

- 52 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


REGISTROS (ESTRUCTURAS) E ERCICIOS RESUELTOS E ERCICIO 4 01

Estructura de Datos

Programa que utilizando registros (estructuras) calcule la distancia entre dos puntos del plano cartesiano. Adems debe calcular la pendiente de la recta que une dichos puntos, considerando el caso de recta vertical Solucin: Un punto del plano cartesiano tiene la forma P(x,y), es decir est formado por un nmero x que representa la distancia en el eje horizontal (abscisas) y un nmero y que representa la distancia en el eje vertical (ordenadas). Por eso se le puede tratar como un registro (estructura) Cdigo fuente Guardar como prog4 01.cpp /* Descripcin: Programa que utilizando registros (estructuras) calcule distancia entre dos puntos del plano cartesiano. Adems debe calcular pendiente de la recta que une dichos puntos. Autor: Ing. Aldo Pereda Castillo Fecha: 11.04.200? 10:40 am */ struct punto{ float x; float y; }; typedef struct punto pto; void ingreso(pto *p); float distancia(pto p1, pto void main(){

p2);

//fin main

//----------------- sub rutinas -------------------void ingreso(pto *p) { //solicita los valores de x y y y devuelve el punto //como parmetro de salida cout<<\nX:; cin>>p->x; cout<<\nY:; cin>>; }//fin ingreso float distancia(pto p1, pto p2) // Calcula la distancia entre 2 puntos p1 y p2 { float d; d = .......................................................; ............................; } // fin distancia float pendiente(...........................................)

Pereda Castillo Aldo S.

- 53 -

la la

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


{

Estructura de Datos

}//fin pendiente E ERCICIO 4 02 Matemticamente, un tringulo es la unin de tres puntos no colineales del plano cartesiano. Crear un programa que utilizando estructuras permita ingresar las coordenadas de los vrtices, calcule el rea y el permetro de un tringulo Solucin Cdigo fuente Guardar como prog4 02.cpp /* Descripcin: Programa que utilizando estructuras calcula el area y permetro de un triangulo. Autor: Ing. Aldo Pereda Castillo Fecha: 18.10.200? 6:50 pm */ struct punto { float x; float y; }; struct triangulo { struct punto p1; struct punto p2; struct punto p3; }; Typedef struct triangulo tr; void main(void) { tr t1; float ar; char rpta; do{ clrscr(); ingreso(&t1); ar=calarea(t1); cout<<"El area es: "<< ........; ..................................................... cout<<"\n\nDesea continuar (S/N)?"; rpta=toupper(getch()); }while(rpta=='S'); } // fin main

// -------------------------- Sub Rutinas ----------------------struct punto crearpunt o(float x, float y) { struct punto pto; pto.x=x; .......................... ; .......................... ; }//fin crearpunto void ingreso(tr *t1) { struct punto p1,p2,p3; float x,y; cout<<"\nPunto P1:\n"; cout<<"x : ";cin>>x;

Pereda Castillo Aldo S.

- 54 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


cout<<"y : ";cin>>y; t1->p1=crearpunto(x,y); cout<<"\nPunto P2:\n"; cout<<"x : ";cin>>x; ................................... ; ................................... ; ...................................; ...................................; ...................................; ...................................; }//fin ingreso float { distancia(struct punto p1, struct punto p2)

Estructura de Datos

} //

fin distancia

float area( ) {

} //fin area

Pereda Castillo Aldo S.

- 55 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


E ERCICIO 4 03

Estructura de Datos

La empresa Textiles del orte necesita una aplicacin de computadora que le permita elaborar la planilla de salarios de sus empleados. Actualmente a los empleados poseen un cdigo nico de 3 dgitos; se les paga por hora trabajada, a un precio (variable por empleado). Los descuentos a aplicar dependen de la AFP a la que estn afiliados: Horizonte 12.8%, Integra 12.3%, Profuturo 13% y Prima AFP 12.1%. Horas extras. Si el empleado trabaja ms de 200 horas en el mes, la hora extra se paga en 30% ms que el precio de hora normal. Especficamente, el programa a travs de mens debe permitir: a) Registrar los datos de los empleados. b) Visualizar el registro de empleados c) Visualizar la planilla de empleados por AFP d) Visualizar la planilla de empleados que trabajaron horas extras; ordenado alfabticamente. e) Calcular y mostrar la planilla de pagos, con todos los datos pertinentes f) Buscar empleados por apellido (bsqueda aproximada) g) Ordenar y Alfabticamente por apellido y Alfabticamente por afp y Descendentemente por sueldo neto h) Mostrar datos estadsticos: y Sueldo neto promedio y Sueldo neto mximo y el nombre del empleado que recibe este sueldo. y Sueldo neto mnimo y el nombre del empleado que recibe este sueldo. y La mediana del sueldo neto y Cuntos empleados reciben ms que el promedio y cuntos menos o igual que el promedio.

Pereda Castillo Aldo S.

- 56 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


Solucin

Estructura de Datos

Cdigo fuente Guardar como prog4 03.cpp /* Programa que, utilizando estructuras, permite calcular la planilla de salarios de los empleados de una empresa. Autor: Ing. Aldo Pereda Castillo Fecha: 18.03.200? 9:35 am */ #define #define #define #define TMAX TCOD TAPE TAFP 50 4 21 11 //define //define //define //define el el el el tamao tamao tamao tamao mximo del vector para el cdigo del empleado los apellidos y nombres del empleado para el nombre de la AFP

struct tipoplanilla{ char codigo[TCOD]; char apenom[TAPE]; float horas; float precio; char nombreafp[TAFP]; float hextras; float sbruto; float dsctos; float sneto; }; typedef struct tipoplanilla tplan; void main() { tplan empleados[..........]; char rpta; .................; do{ clrscr(); menu(&rpta); clrscr(); switch(rpta) { case '1':

case '2':

case '3':

case '4':

case '5':

case '6':

Pereda Castillo Aldo S.

- 57 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

// fin switch

}while(...........); } // fin main // ----------------------- Sub Rutinas --------------------void menu(char *opcion) { marco(3,2,29,14); gotoxy(6,4);cout<<"PLANILLA DE SALARIOS"; gotoxy(5,6);cout<<"1. Registro de empleados"; gotoxy(5,7);cout<<"2. Planilla"; gotoxy(5,8);cout<<"3. Ver listado"; gotoxy(5,9);cout<<"4. Buscar"; gotoxy(5,10);cout<<"5. Ordenar"; gotoxy(5,11);cout<<"6. Estadsticas"; gotoxy(5,12);cout< <"7. Salir"; gotoxy(5,13);cout<<"Su opcin:"; *opcion=getch(); }//fin menu void registrar(tplan empleados[TMAX], int *n ) { //permite agregar un nuevo empleado //muestra un men horizontal para ingresar la AFP

} //fin registrar

Pereda Castillo Aldo S.

- 58 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

void calcular(tplan empleados[TMAX], int n) { //calcula los datos pertinentes de la planilla de pagos para cada , //uno de los n empleados for(.............................. ) { //calculando horas extras if (empleados[i].horas > 200) empleados[i].hextras = ................................. else empleados ................................. = //calculando sueldo bruto .............................................................. //calculando descuentos if(strcmp(empleados[i].nombreafp,"HORIZONTE")==0) empleados[i].dsctos = .......*empleados[i].sbruto; else if(strcmp(empleados[i].nombreafp, .. )==0) empleados[i].dsctos = .......................... ; else if(strcmp(..................................... )==0) ..................................... ; else // es prima afp ....................................... ; empleados[i].sneto = .......................................... ; } // fin for } // fin calcular char *extraer(char cadena[APE],int x) { // extrae la cantidad de x caracteres por izquierda char cad[TAPE]; for(int i=0; ....................... ) cad[i] = ..................; cad[i]='\0'; return ...............; } // fin extraer void buscaraprox(.................................................. ) { char apellido[TAPE];//es el apellido a buscar (parte de) int x, j=0; gotoxy(1,3); cout<<"Ingrese las primeras letras del apellido a buscar:"; strupr(gets(..................)); cabecera2(); x = strlen(....................); for(...................................) { if(strcmp(apellido,extraer( .............................. ))==0) { gotoxy(1,7+j);cout<<j+1<<". -"; gotoxy(5, ......);cout<<empleados[i].codigo; gotoxy(10, ......);cout<<empleados[i].apenom; gotoxy(31, ......);cout<<empleados[i].horas; gotoxy(........);cout<<empleados[i].precio;

j++; } //fin if }// fin for } //fin buscaraprox void cabecera1(void) { // cabecera del ingreso de datos slo los datos de entrada : gotoxy(1,5);cout<<"No."; gotoxy(5,5);cout<<"Cdigo"; gotoxy(10,5);cout<<"Apellidos y Nombres"; gotoxy(31,5);cout<<"Horas";

Pereda Castillo Aldo S.

- 59 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

gotoxy(36,5);cout<<"Precio"; gotoxy(45,5);cout<<"AFP"; gotoxy(1,6); cout<<"========================= ============================== =="; } // fin cabecera1 void cabecera2(void) { // cabecera total: para la planilla gotoxy(1,5);cout<<"No."; gotoxy(5,5);cout<<"Cd."; gotoxy(10,5);cout<<"Apellidos y Nombres"; gotoxy(31,5);cout<<"Horas"; gotoxy(36,5);cout<<"Precio"; gotoxy(45,5);cout<<"AFP"; gotoxy(59,5);cout<<"H ext"; gotoxy(64,5);cout<<"S.Bruto"; gotoxy(69,5);cout<<"Dscto"; gotoxy(75,5);cout<<"S.Neto"; gotoxy(1,6); cout<<"=================== ============================== ========="; } // fin cabecera2 void verlista(tplan empleados[TMAX],int n) { cabecera2(); for(int i=0;i<n;i++) { gotoxy(1,7+i);cout<<i+1<<". -"; gotoxy(5,7+i);cout<<empleados[i].codigo; gotoxy(10,7+i);cout<<empleados[i].apenom; gotoxy(31,7+i);cout<<empleados[i].horas; gotoxy(...........);cout<<empleados[i].precio;

} } //fin verlista

Pereda Castillo Aldo S.

- 60 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


E ERCICIO 4 04 Crear un programa que permita : a) b) c) d) e) ingresar 2 fracciones calcule y muestre la suma calcule el producto simplifique las fracciones Invierta las fracciones

Estructura de Datos

Solucin Cdigo fuente Guardar como prog4 04.cpp /* Descripcion: Programa que utilizando estructuras permite hacer operaciones con fracciones. Autor: Ing. Aldo Pereda Castillo Fecha: 19.10.200? 8:40 am */ struct tipofraccion { int num; int den; }; typedef struct tipofraccion tfraccion;

void main(void) { tfraccion f1,f2,f3; char rpta; int num,den; do{ clrscr(); menu(&rpta); clrscr(); switch(rpta) { case '1': gotoxy(1,1);cout<<"1. Ingreso de Fracciones"; gotoxy(1,3);cout<<"Fraccin 1:"; gotoxy(1,5);cout<<"Numerador:";cin>>num; gotoxy(1,6);cout<<"Denominador:";cin>>den; f1=crearf(num,den); gotoxy(1,8);cout<<"Fraccion 2:"; gotoxy(1,9);cout<<"Numerador:";cin>>num; gotoxy(1,10);cout<<"Denominador:";cin>>den; ....................; pausa(); break; case '2': gotoxy(1,1);cout<<"2. Ver fracciones"; gotoxy(1,3);cout<<"Fraccion 1: "; ver(f1); gotoxy(1,5);cout<<"Fraccion 2: "; ................................; pausa(); break; gotoxy(1,1);cout<<"3. Sumar fracciones"; f3 = ................; gotoxy(1,3);cout<<"Fraccion 1: "; ver(f1); gotoxy(1,5);cout<<"Fraccion 2: "; ver(f2);

case '3':

Pereda Castillo Aldo S.

- 61 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


gotoxy(1,7);cout<<"Fraccion Suma: "; ............................... pausa(); break; case '4':

Estructura de Datos

gotoxy(1,1);cout<<"3. Multiplicar fracciones"; .......................... ; gotoxy(1,3);cout<<"Fraccion 1: "; ver(.....); gotoxy(1,5);cout<<"Fraccion 2: "; ...................... ; gotoxy(1,7);cout<<"Fraccion Producto: "; ...................... ; pausa(); break; gotoxy(1,1);cout<<"3. Simplificar"; ......................; ......................; ......................; ......................; ......................; ......................; ......................;

case '5':

} // fin switch }while(................ ); } // fin main // ----------------------- SUB RUTINAS ------------------------void menu(char *opcion) { marco(3,2,35,16); gotoxy(6,4);cout<<"OPERACIONES CON FRACCIONES"; gotoxy(5,6);cout<<"1. Ingresar"; gotoxy(5,7);cout<<"2. Ver"; gotoxy(5,8);cout<<"3. Sumar"; gotoxy(5,9);cout<<"4. Multiplicar"; gotoxy(5,10);cout<<"5. Simplificar"; gotoxy(5,11);cout<<"6. Invertir"; gotoxy(5,12);cout<<"7. Salir"; gotoxy(5,14);cout<<"Su opcion:"; *opcion=getch(); }//fin menu tfraccion crearf(int num, int den) { struct fraccion fr; fr.num=num; ............; return ............; } // fin crearf

................. sumar(........................................... ) { tfraccion fr; fr.num=(f1.num*..); fr.den=f1.den*f2.den; return .. } // fin sumar ............ multiplicar(........................................... .) { tfraccion fr; fr.num=..; fr.den=; ; } // fin multiplicar

Pereda Castillo Aldo S.

- 62 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

void ver(........................... ) { cout<<fr.num<<"/"<<fr.den; } // fin ver ................... simplificar(............................... ) { ................ fr; // fr sera la fraccion simplificada int menor,i=2; fr.num=f1.num; fr.den=f1.den; do{ if(fr.num %i==0 && ..................) { fr.num =..; fr.den =...; } else i++; if(fr.num<fr.den) ..; else menor=fr.den; }while(i<=menor); return fr; } // fin simplificar

Pereda Castillo Aldo S.

- 63 -

"La ente se arregla todos los das el cabello, Por P bi Chi .

no el corazn?".

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


REGISTROS (ESTRUCTURAS) E ERCICIOS PROPUESTOS

Estructura de Datos

1.

La informacin correspondiente a un alumno de un centro acadmico est compuesta por nombre, curso, edad y lugar de nacimiento. Siendo el nmero de alumnos inferior a 200, codificar un programa que: a) b) c) d) e) f) Muestre la relacin de alumnos ordenados por edad Muestre la relacin de alumnos ordenada por curso Muestre la relacin de alumnos ordenada primero por curso y dentro de cada curso alfabticamente por nombre de alumno. Indique los nacidos entre dos aos ingresadas por el usuario. Escriba el nombre y edad de los nacidos en Sullana. Muestre la relacin de alumnos que ya son mayores de edad.

2.

Modificar la solucin el ejercicio 4-03 para que adems permita: a) Validar el ingreso de datos. Especficamente:

y y
b) c)

Las horas ingresadas: que acepte slo nmeros (enteros o decimales) entre 0 y 250 inclusive El precio: es poltica de la empresa que a un empleado no se le puede pagar menos de S/.5.00 ni ms de S/. 20.00

Bsquedas por AFP: El usuario escribe el nombre de una afp y el programa debe mostrar todos los empleados afiliados a esa AFP Estadsticas:

y y y
3.

empleados por AFP

Monto a abonar a cada una de las AFP Monto total a desembolsar por concepto de pago de salarios

Tomando como referencia el ejercicio resuelto 4-01 escriba un programa que dados tres puntos del plano cartesiano, indique si los tres son puntos colineales, es decir, si pertenecen a la misma r cta. e Sugerencia: la pendiente de la recta es la misma en cada uno de sus puntos. La Empresa Regional de Abastecimiento de Energa Elctrica (ERAEE) cada fin de mes debe calcular el monto a pagar de los usuarios de la regin. Para tal actividad, 10 das antes de que el mes culmine, un empleado de la compaa se acerca a los domicilios y registra la lectura actual del medidor de energa elctrica (en kilowatts). Luego, en oficina, se calcula: a. b. c. El consumo de energa: por diferencia de la lectura actual con la anterior (previamente registrada en e mes anterior) El monto por consumo: se sabe que el kilowatt (Kw) cuesta S/. X . El costo d kilowatt debe fluctuar entre S/. 0.50 a S/.1.00 (valide) Cargo fijo: Existen cuatro tipos de zonas de acuerdo a la economa de los uaurios: A, B, C y D. Los usuarios que viven en el tipo de zona A tienen un cargo fijo de S/.6.00, los de B tienen un cargo fijo del 1% del monto por consumo. A los usuarios que viven en el tipo de zona C o D no se les cobra cargo fijo. Descuento: Slo los usuarios del tipo de zona C o D y cuyo consumo no supera los 100 Kw tienen un descuento del 3.5% sobre el monto por consumo. Total a pagar: totalizando el monto por consumo(+), el cargo fijo (+) y el descuento(-).

4.

d. e.

Adems de los clculos anteriores, el programa debe realizar: a) Listado de usuarios y monto total a pagar. Ordenado alfabticamente por cliente.

Pereda Castillo Aldo S.

- 64 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


b) c) d)

Estructura de Datos

Buscar los datos de consumo de un determinaod cliente. Se ingresa el D I del cliente y debe mostrar el consumo, e monto, cargo fijo y total a pagar. Usuarios por tipo de zona, ordenados por tipo de zona y a la vez alfabticamente. Calcular el consumo total (en kw) de energa elctrica por tipo de zona.

CASO : ADMISIN UNIVERSITARIA Programa que permita calcular el puntaje que obtienen los alumnos al rendir un examen de admisin en una universidad. El proceso es el siguiente: 1. Registro de postulantes Conforme los interesados se acercan a la oficina de Admisin, se registra sus nombres y apellidos, el sexo, su edad y la especialidad a la que postulan. Adems se les asigna un cdigo el cual es un nmero correlativo. Las especialidades junto con la cantidad de vacantes son: ADMI ISTRACIO (100), CO TABILIDAD (80), SISTEMAS (90), I DUSTRIAL (60) Y PSICOLOGA (50). Actualmente slo estas. Publicacin de listas: Asignacin de aulas Un da antes, la universidad publica las listas de todos los postulantes indicando en qu aula debe rendir su examen. La capacidad de cada aula es de 30 alumnos. Son tres modos de distribuir a los postulantes. Modo 1: Alfabticamente Modo 2: Por cdigo de postulante (es el ms inseguro) Modo 3: Aleatoriamente (ms seguro) La comisin acuerda bajo qu modo va a distribuir a los postulantes y el programa debe emitir los listados que sern publicados en el panel principal de la universidad as como pegados en la puerta de cada aula a fin de que el postulante verifique su nombre al momento de ingresar. Evaluacin El examen se administra de 9:00 am a 12:00 m. El examen consta de 100 preguntas. Por cada respuesta correcta obtiene 5 puntos, por cada respuesta incorrecta se le descuenta un punto; y las preguntas no respondidas tienen 0 puntos. Para obtener el puntaje total, la comisin evaluadora anota en cada examen el total de respuestas correctas y el total de incorrectas; las no contestadas el sistema las calcula. Si el postulante obtiene 280 puntos o ms, aprueba el examen, en cuyo caso para ingresar depender del nmero de vacantes de la carrera a la que postula. Si el postulante obtiene menos de 280 puntos desaprueba el examen y no puede ingresar. 4. Publicacin de resultados A las 4:00 pm se deben publicar las listas de resultados. Son varios listados: a) Listado general que muestre todos los postulantes ordenados alfabticamente, junto con la carrera y su puntaje total obtenido. b) Listado agrupado por carreras que indique el nombre de los postulantes, su puntaje y la condicin: I GRES, ACCESITARIO O DESAPROBADO. Se considera Accesitario si es que el postulante aprob el examen pero no puede ingresar porque el nmero de vacantes lo limita.

2.

3.

Otros requerimientos Se desea becar de todo pago a los postulantes que ocuparon el primer puesto en cada una de las carreras, pero siempre y cuando su puntaje haya sido superior a 300 puntos. Se necesita saber quin es el postulante que ocup el primer puesto a nivel general, ya que adems se le premiar otorgndole un beneficio econmico de S/.500. Listado de los postulantes accesitarios ordenados por especialidad (alfabticamente) y a la vez por puntaje en forma descendente. Buscar un postulante por cdigo e indicar su resultado: puntaje y condicin. Quin es el ingresante(s) ms joven as como el(los) que tiene ms edad Indicar las especialidades que cubrieron todas sus vacantes. Indicar las especialidades que no cubrieron todas sus vacantes.

Pereda Castillo Aldo S.

- 65 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


-

Estructura de Datos

Relacin de postulantes desaprobados, ordenada alfabticamente. El departamento de Planificacin y Estadstica de la universidad necesita el reporte que indique: o El nmero total de ingresantes y por sexo o El nmero total de ingresantes por especialidad y por sexo. o El nmero total de ingresantes por rango de edades: Menos de 16 aos, entre 17 a 22 aos, de 23 a 30 ; y ms de 30 aos.

Pereda Castillo Aldo S.

- 66 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas MODELO DE EVALUACIN 04

Estructura de Datos

Complete ( 2 ptos) y Es un tipo definido por el programador, con constantes de nombres de tipo entero, que internamente se asocian con los valores constantes 0, 1, 2, : ..
y

Agrupacin de uno o ms tipos de elementos llamados , cada uno de los cuales puede ser de diferente tipo de dato: ..

Declare ( 8 ptos) y Se necesita crear un registro para almacenar el cdigo universitario, apellidos y nombres, edad, sexo, escuela, direccin, ciclo y promedio ponderado de un alumno. Declare la estructura correspondiente.
y y

Declare una fecha como estructura, considere el nombre del da, el da, el mes y el ao. Defina constantes, usando una enumeracin para las AFPs. Considere que Profuturo es la AFP con el valor 0; el resto Ud. decide. Declara un tipo de dato enumerado para representar los meses del ao. El mes enero se debe asociar al valor 1.

( 4 ptos) Coloque V o y La instruccin sizeof permite imprimir los datos de una estructura ( ) y Para acceder a una estructura slo se utiliza el operador -> ( ) y Una estructura no se considera como un tipo de dato compuesto ( ) y Una estructura puede contener a otra estructura ( ) y Los miembros de una estructura no pueden ser arrays ( ) y Es posible asignar una variable estructura a otra tan slo con el operador de asignacin ( ) y El tamao en bytes de una estructura se obtiene del campo con mayor nmero de bytes ( ) y El tamao de una unin es la suma de los tamaos (bytes) de cada uno de sus miembros( )

Pereda Castillo Aldo S.

- 67 -

Responda ( 6 ptos) Para qu se utiliza typedef 02 ejemplos. y y Cundo se utiliza el operador punto (.) y el operador fecha(->) al acceder a una estructura Qu son Uniones y cundo recomienda utilizarlas y y

Universidad sar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

Ca a idades Analiza la solucin de un problema desde el punto el vista recursivo, identificando la definicin recursiva y la condicin de trmino. rea subrutinas recursivas. Aplica la recursividad en la solucin de problemas. Ejecuta una subrutina recursiva, verificando y analizando los valores devueltos en cada llamada a s misma. Re ursividad. Un objeto es recursivo cuando puede definirse en funcin de s mismo. En matemticas existen definiciones de elementos, operaciones, etc., que pueden definirse de esta forma. As por ejemplo, tenemos los casos del factorial de un nmero (N! = (N 1)! x N, la potencia de una base con exponente E E 1 ), la suma de un conjunto de N nmeros (Suma (N) = An Suma(N 1), etc. entero (B = B x B permite que los procedimientos o funciones se invoquen a s mismos, es decir, que sean recursivos y as resolver algunos problemas de manera sencilla y elegante, aunque costosa desde el punto de vista de los recursos del computador

Sub rutina

a recursividad es una tcnica de programacin que la aceptan muchos lenguajes. Aparece como una alternativa a los procesos con estructuras repetitivas y consiste en crear subrutinas que se invocan a s mismas. Presenta las siguientes ventajas:

y y y

Naturalidad en la escritura del cdigo fuente, ya que sta se expresa sintcticamente ms acorde al pensamiento humano al momento del diseo de solucin de un probl ma. e

ayor legibilidad y comprensin del cdigo.

Se minimiza el nmero de lneas de cdigo y por tanto aumenta la velocidad en la escritura del mismo.

Para comprender el mecanismo de la recursividad , es preciso imaginar que cada llamada a una subrutina recursiva no es ms que una llamada a una copia de s misma. ada una de estas copias se comportan como una subrutina independiente, ya que as variables locales y los parmetros correspondientes, existen de modo distinto en cada una de las llamadas.

Para crear una subrutina recursiva es necesario tener en cuenta lo siguiente: 1. 2. 3.

a recursividad es una alternativa a procesos repetitivos.

Se debe encontrar la defini i n re ursiva del proceso de solucin; es decir, analizar el problema y determinar como es que se define sobre si mismo. Encontrar la ondi i n de trmino de la recursividad, es decir, determinar qu condicin debe cumplirse para que el proceso ya no se invoque a si mi mo. Esto es muy importante, pues de no s considerarlo corremos el riesgo de elaborar subrutinas recursivas infinitas.

Pereda

astillo Aldo S.

RECURSIVIDAD

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas RECURSIVIDAD E ERCICIOS RESUELTOS
E ERCICIO 2 01 Analice el siguiente programa:

Estructura de Datos

Cdigo fuente Guardar como prog2 01.cpp /* Descripcin: Muestra un mensaje en pantalla, infinitas veces... Autor: Ing. Aldo S. Pereda Castillo Fecha: 08.04.200? - 4:49 pm */ void main(){ clrscr(); mensaje(); getch(); }//fin main //======================= Sub Rutinas ======================== void mensaje(void){ cout<<Fumar es daino para la salud ; mensaje(); // Aqu se invoca a s misma } // fin saludo

Se trata de una subrutina recursiva llamada mensaje; es recursiva porque dentro del cuerpo de la misma existe una invocacin a ella misma. En la primera llamada, el procedimiento mensaje (sin parmetros) lo primero que hace es mostrar en pantalla el texto Fumar es daino para la salud ; (es la primera lnea); luego hace una invocacin al mismo procedimiento (obsreve como en la invocacin no lleva parmetros); en esta seguna llamada, vueleve a mostrar el mismo texto e invoca por tercera vez al mismo procedimiento; el cual entrar y volver a mostar el mismo mensaje. Lo que provoca este programa es qe se muestra repetidamente el mensaje Fumar es daino para la salud ; como no hay una condicin de trmino etse procedimiento se ejecuta infinitamente hasta que el programa desborda la memoria y se cuelga ... El resultado de la ejecucin se puede ver en la siguiente figura (Turbo C++ 4.5)

Pereda Castillo Aldo S.

- 69 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


E ERCICIO 2 02

Estructura de Datos

Modifique el programa anterior para que muestre 15 veces el mensaje Fumar es daino para la salud

Solucin En este caso, ya se nos pide mostra slo 15 veces el mensaje. La solucin con estructuras repetitivas sera la siguiente: for(int i=1; i<=15 ; i++) cout<<Fumar es daino para la salud \n; Observe que se necesita una variable contador (la variable i) que junto con la estructura for lleva el control del nmero de veces que se repetir la instruccin cout. En la solucin recursiva, tambin necesitamos una especie de contador para que controle el nemero de invocaciones que la subrutina tiene que hacer a s misma; podemos aprovechar el paso de un parmetro y considerar la inclusin de una condicin de trmino. Cdigo fuente Guardar como prog2 02.cpp /* Descripcin: Muestra 15 veces un mensaje en pantalla Autor: Ing. Aldo S. Pereda Castillo Fecha: 08.04.200? - 4:49 pm */ void main(){ clrscr(); mensaje(15); getch(); }//fin main //======================= Sub Rutinas ======================== void mensaje(int n){ if (n>=1) { cout<<Fumar es daino para la salud \n; mensaje(n 1); // Aqu se invoca a s misma } } // fin mensaje

Observe como en la subrutina se ha aadido el parmetro entero n. La condicin para que se vuelva a invocar a s misma es que n debe ser mayor o igual que 1; pero en la invocacin dentro de la subrutina ya no se llama slo con el parmetro n, sino que se le pasa el valor n1 : mensaje (n 1) ; de este modo va contando (de 1 en 1) en forma decreciente el nmero de veces que debe invocarse. La condicin de trmino est dada porque como el valor de n va disminuyendo de 1 en 1, llegar el momento en que el parmetro llegue a cero y en ese caso ya no vuelve a invocarse dando por concluida la recursividad. Y dnde se le indica e son 15 eces las e debe ostrar el ensaje? Eso lo hace desde la invocacin principal en e mdulo main, ah se le enva el parmetro 15; si quisiera mostrarlo 20 veces pues aqu colocamos 20 El resultado de la ejecucin se muestra en la siguiente figura:

Pereda Castillo Aldo S.

- 70 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

E ERCICIO 2 03 Programa recursivo que solicite valores numricos hasta que se ingrese un valor centinela que es el nmero cero. Solucin El enunciado de problema da a entender que el programa debe solicitar, repetidamente, valores numricos; pero en el caso de que se ingrese el nmero cero, el programa termina. cout<<Ingrese un valor numrico:; cin>>numero; Estas dos lneas deben volver a ejecutarse (repetirse) mientras el nmero ingresado no sea cero (numero ! 0) La solucin recursiva se muestra en el siguiente cdigo: Cdigo fuente Guardar como prog2 03.cpp /* Descripcin: Permite ingresar nmeros hasta que se ingresa cero Autor: Ing. Aldo S. Pereda Castillo Fecha: 08.04.200? - 5:14 pm */ void main(){ clrscr(); ingreso(); getch(); }//fin main //======================= Sub Rutinas ======================== void ingreso(void) { ........................... cout<<Ingrese un valor numrcio:; cin>>numero; if (...................) ingreso();// Aqu se invoca a s misma } // fin ingreso

Observe que en este caso la subrutina ingreso no es necesario que tenga parmetros, pues de acuerdo con el enunciado, no se indica qu accin realizar con los nmer s ingresados. Es un ejemplo que slo o demuestra el uso de la recursividad.

Pereda Castillo Aldo S.

- 71 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

E ERCICIO 2 04 En una tienda comercial se necesita registrar el nombre de los artculos que ha enviado el proveedor. La lista indica cuntos artculos son, sino que considera una valor centinela FI . Escriba el programa recursivo que permita ingresar los nombres de los artculos hasta que se ingresar FI . Adems e programa debe devolver el nmero de artculos ingresados. Solucin Es parecido al ejemplo anterior, solo que en este caso ya no se comparan valores numricos, sino cadenas de caracteres; pues se debe comparar el nombre del artculo ingresado con el valor FI , si no son iguales, se vueve a ingresra otro artculo (recursivo). Adems necesitamos un contador que vaya incrementndose conforme se lee un artculo. Para comparar cadenas se debe emplear la funcin strcmp de la librera <string.h> Cdigo fuente Guardar como prog2_04.cpp /* Descripcin: Permite ingresar nombres de artculos hasta que se ingresa FIN Autor: Ing. Aldo S. Pereda Castillo Fecha: 08.04.200? - 5:34 pm */ void main() { int n=0; clrscr(); articulos(&n); cout<<"\nSe ingresaron "<<n<<" artculos"; getch(); }//fin main //-----------------SUB RUTINAS -------------void articulos(int *n) { char articulo[31]; cout<<"ingrese nombre del artculo:"; ......................; (*n)++; if (strcmp(articulo,"FIN")!=0) articulos(&(*n)) ; //aqu se invoca a s misma }//fin articulos Observe como en este caso s necesitamos devolver el nmero de artculos ingresados; por eso se tiene un parmetro de salida (para que conserve el valor). Observe tambin la sintaxis de invocacin de la subrutina: articulos(&(*n)) Recuerde que cada vez que un parmetros es de salida (precedido por asterisoc) siempre se le debe invocar con mpersand (&); pero ocurre algo curioso, el parmetro con asterisco, en una subrutina siempre se le considera con el asterisco. Por eso en este caso lleva mpersan y asterisco a la vez. Nota: Los operadores mpersand (&) y asterisco ( ) son operadores opuestos; escritos en una misma lnea se anulan. Por o tanto escribir articulos(&(*n)) es equivalente a escribir articulos(n)

Pereda Castillo Aldo S.

- 72 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

E ERCICIO 2 05 Programa recursivo que permite ingresar n valores numricos a un vector y luego los muestra en pantalla, calcula la suma y el promedio. Solucin Cdigo fuente Guardar como prog2_05.cpp /* Descripcin: Programa recursivo que permite ingresar n valores numricos a un vector y luego los muestra en pantalla, calcula la suma y el promedio. Autor: Ing. Aldo S. Pereda Castillo Fecha: 08.04.200? - 4:49 pm */ void main() { ......................................................... ......................................................... do{ clrscr(); ......................; clrscr(); gotoxy(3,5); switch(opcion){ case 'A': cout<<"A. Ingresar valores"; gotoxy(3,7); cout<<"Ingrese la cantidad de valores:"; cin>>n; lectura(v,n-1); getch(); break; case 'B':

} }while(....................); }//fin main // -------------- sub rutinas ------------void menu(char *opcion) { marco(15,3,50,14); gotoxy(25,5); cout<<"VECTOR RECURSIVO";

*opcion=toupper(getch());

void lectura(float v[100],int n) {if (n>=0) { cout<<"Ingrese valor:"; cin>>v[n]; .............................; }

Pereda Castillo Aldo S.

case 'C':

case 'D':

- 73 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


} void mostrar(float v[100],int n) { if (n>=0) { cout<<"\n"<<v[n]; ................................; } } float suma(............................. ) { if (n>=0) return ...............................; else return v[n]; }

Estructura de Datos

E ERCICIO 2 06 Programa que calcula el rea de un crculo. Valide recursivamente el ingreso del valor del radio. Solucin El uso de la recursividad en este ejmplo est en la valuidacin del radio. Pues si se ingresa un valor negativo o cero debe volver a pedirse el radio. La recursividad termina cuando se ingrese un valor positivo. Luego se calcula el rea. La funcin que calcule el rea no puede ser recursiva porque slo es aplicacin de frmula.

Cdigo fuente #define PI 3.14159 void main() { ........................

Pereda Castillo Aldo S.

El rea del crculo es A

PIxR2 donde R

Radio. Guardar como prog2_06.cpp

- 74 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

clrscr(); ingreso(&radio); cout<<"El rea del crculo de radio << radio<< es:"<<area(radio); getch(); } //------------ sub rutinas --------void ingreso(float *radio) { clrscr();gotoxy(10,6); cout<<"ingresa radio:"; cin>>(*radio); if (*radio<=0){ cout<<"Error. El radio debe ser positivo. Vuelva a intentarlo"; getch(); ingreso(&(*radio)); } }//fin ingreso float area(float radio) { return (PI*radio*radio); } //fin area

Pereda Castillo Aldo S.

- 75 -

Universidad sar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

EJERCICIO Programa recursivo que calcule el factorial de un nmero. Realice las validaciones necesarias. Solu i n El factorial de un nmero es una operacin matemtica eminentemente recursiva. Por ejemplo: actorial del nmero , se representa simblicamente as: ! y se calcula : (multiplicacin sucesiva desde la unidad hasta el mismo nmero)

El fa torial del nmero cinco se puede expresar como el fa torial del nmero cuatro multiplicado por cinco. En general, el factorial de un nmero N se expresa como: N!

Condi i n de trmino s Si seguimos la expresin recursiva en el ejemplo de ! tenemo ! = 4! x 4! = 3! x 4 3! = 2! x 3 ! ! 1! = 0! x 1 0! = ( - 1)! x 0, etc. Si continuamos, sera absurdo porque no existe factorial de nmeros negativos; de hecho a la expresin recursiva de definicin de factorial le falta una condicin que indique cundo continuar y obviamente cuando terminar.

Podemos terminar cuando se tenga que halar el factorial de uno 1! ya que se sabe que es uno. Por tanto, la condicin se expresa as: si el nmero es uno, entonces el factorial de uno es uno y ah ya no se aplicara la definicin recursiva (ya no se volvera a invocar).

a validacin est referida a que le nmeor no puede ser negativo.

C digo fuente Guardar omo rog - . /* Descripcin: Programa que calcula el factorial de un numero a trav de una s funcin recursiva Autor: Ing. Aldo Pereda Castillo Fecha: 12.09.200? - 6:50 pm*/ void main() { ...................................................... ...................................................... do{

cout<<"\n\nDesea continuar (S/N)?"; rpta=toupper(getch()); }while(rpta=='S'); }//fin main //--------------------------------- SUB RUTINAS --------------------void ingreso(int *num) { clrscr();gotoxy(10,6); cout<<"Ingresa el nmero:"; cin>>(*num);

Pereda

astillo Aldo S.

En o ntrando la defini n re ursiva Observemos con atencin: !

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

}//fin ingreso long double factorial(int num) { if (num == 1) .............................; else .......................................; }

Notas de inters

Pereda Castillo Aldo S.

- 77 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


Estructura de Datos

E ERCICIO 2 08 Programa que a travs de una subrutina recursiva calcule la potencia de un nmero real a un exponente entero positivo. Solucin Cdigo fuente Guardar como prog2_08.cpp /* Descripcin: Programa que calcula la potencia de una base a un exponente ente ro travs de una funcin recursiva Autor: Ing. Aldo Pereda Castillo Fecha: 12.03.200? - 7:20 pm */ void { main()

}//fin main //-------------------- SUB RUTINAS --------------float potencia(float base,int expo) { if (expo .......) .................; else return (potencia(...............,expo 1) ..............); }

Pereda Castillo Aldo S.

- 78 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


E ERCICIO 2 09 Programa recursivo que calcule la suma de los valores positivos.

Estructura de Datos

Cdigo fuente Guardar como prog2 09.cpp /* Descripcin: Programa que calcula la suma de los N primeros nmeros naturales a traves de una funcin recursiva Autor: Ing. Aldo Pereda Castillo Fecha: 12.03.200? - 8:20 pm */ void main() {

}//fin main //-------------------- SUB RUTINAS --------------void ingreso(................) {

} long suma(int n) { if (n ==1 ) ........................... else return (..........................); }

Pereda Castillo Aldo S.

- 79 -

primeros nmeros naturales. Valide para que

slo acepte

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas




Estructura de Datos

E ERCICIO 2 10 Programa recursivo que convierte un nmero entero positivo al sistema binario. Valide con una subrutina recursiva para que el valor del nmero slo acepte nmeros positivos. Cdigo fuente Guardar como prog2 10.cpp /* Descripcin: Programa recursivo que convierte un nme o a binario. r Autor: Ing. Aldo S: Pereda Castillo Fecha: 08.04.2009 11:08 am */ void main() {

} //---------------- sub rutinas --------------void binario(int num) { if (num>0) .......................; cout<<num%2; }//fin binario void ingreso(int *num) {

Pereda Castillo Aldo S.

- 80 -

Universidad sar Vallejo Piura Escuela de Ingeniera de Sistemas


 
EJERCICIO -

Estructura de Datos

Dadas las siguientes subrutinas:

int fun1(int n) { if(n<=1) return 2*n; else return n*fun1(n-1); }

allar el resultado de: a) r = fun1(7); b) r = fun1(1) EJERCICIO Dado el siguiente cdigo recursivo:

void modulo1(int a) { if (a>0) { cout<<a<<endl; modulo1(a 1); } else cout <<Fin }


ul es el resultado de prog1(5)?

EJERCICIO Dado el siguiente cdigo recursivo:

void prog1(int a) { if (a>1) { cout<<a<<endl; prog1(a 1); } else cout <<Fin cout<<Fin <<a<< \n; }
ul es el resultado de prog1(5)? EJERCICIO Dado el siguiente cdigo recursivo:

void modulo(int a, int b) { if (a>0) { modulo(a-1, b+a); else cout <<b<< y <<a<< \n; }

ul es el resultado de modulo(4, ) ?

La confianza en s mismo es el secreto del xito . Ralp Waldo Emerson

Pereda

astillo Aldo S.

- 1-

"

 

 

 

int fun2(int n) { if(n<=1) return n; else return fun2(n%2) n ; }

c) r = fun2(10); d) r = fun2(1)

Universidad sar Vallejo Piura Escuela de Ingeniera de Sistemas


% $

Estructura de Datos

RECURSIVIDAD EJERCICIOS PROPUESTOS


Programe utili ando su r utinas re ursivas. Reali e las valida iones ne esarias. 1. 2. 3. 4. Programa recursivo que convierta un nmero al sistema hexadecimal (base 16)

odifique el ejemplo 05 para hallar, a travs de una subrutina recursiva, el valor mayor de los nmeros ingresados al vector. odifique el EJER I IO 08 para considerar el caso de exponente negativo.

Programa que a travs de dos funciones recursivas calcule: a) la suma de los N primeros nmeros pares b) El producto de los mismos.

5. 6. 7. 8.

Programa que a travs de una funcin recursiva calcule el n-simo trmino de la serie de nmeros de ibonacci: 1, 1, 2, 3, 5, 8, ... Escribir una funcin recursiva que dado un nmero entero positivo calcule su imagen especular. Por ejemplo f(345) = 543. Escribir un programa que transforme nmeros enteros en base 10 a otra base b, siendo la base b de 8 a 16. a transformacin se ha de realizar siguiendo una estrategia recursiva. Programa recursivo que invierta una cadena. Por ejemplo, si la cadena es NO UMES el resultado debe ser SEMUF ON Escribir una funcin recursiva para calcular nmeros combinatorios. Para resolver este ejercicio se utiliza la definicin recursiva de los nmeros combinatorios:

sabiendo que (condiciones de trmino):


m Cn = 1 ; m Cn = m ;

10. ul es la secuencia numrica generada por la funcin recursiva siguiente, si la llamada es F(8)?

long {

F ( int n) if (n == 0 | | n == 1) return n; else if (n% 2 == 0) return 2 + F (n 1); else return 3 + F (n 2);

&

Pereda

astillo Aldo S.

m Cn

m m C n 1  C n 1 1

si n = 0 si n = m si n = 1 si n = m 1

- 2-

11

'

0 0

Universidad sar Vallejo Piura Escuela de Ingeniera de Sistemas


9 8 H

Estructura de Datos

PILAS
Ca a idades onoce el concepto de Pila y sus aplicaciones en la informtica. Implementa una pila con arreglos. Identifica los elementos de una pila. onoce la sintaxis para acceder a los elementos de una pila. Implementa las operaciones del AD Pila. Aplica y adapta el AD Pila a la solucin de problemas reales. onvierte una expresin de formato infijo a postfijo, utilizando el modo directo asi como el modo algortimo a travs de una pila. Evala una expresin aritmtica en formato postfijo. Pila Una pila (stack) es un tipo especial de lista que tiene muchas aplica ciones en informtica y en la vida real. Una pila es una estructura de datos homognea, es decir, todos los datos que almacena son del mismo tipo y en la que los elementos se aaden y eliminan por un nico extremo llamado cima o tope de la pila. os tipos pila se suelen denominar LIFO (last input, fist output) que significa que el ltimo elemento en ingresar es el primero en salir; sta es la caracterstica bsica de una pila.

Por este extremo ingresa el elemento

36 24 08 12 10

Por este mismo extremo sale el elemento

Ejem los 1. Un cilindro de Ds es una pila, pues nosostros vamos almacenando los Ds colocndolos uno tras otro (encima). En caso de que querramos un D sacamos el que est arriba: e ltimo d guardado ser e primer en ser utilizado. 2. 3. Una pila de platos, una pila de libros, etc. Al usar los navegadores web, abrimos una y otra pgina haciendo clic en los links. Podemos afirmar que las direcciones visitadas se van apilando en algn sitio de la memoria, pues cuando pulsam el os botn Atrs de navegador 4. regresamos a ltima pgina visitada.

Al crear un programa con subrutinas, el sistema operativo junto con el lenguaje de programacin, cada vez que se entra en una subrutina, va apilando la direccin de la instruccn que invoc a la subrutina, de tal modo que al terminar la subrutina pueda regresar al lugar donde est e mdulo llamado y continuar con la ejecucin.

Im lementa i n de una ila as pilas se pueden implementar con arreglos y con listas enlazadas. En este cap tulo se tratar la implementacin con arreglos. Im lementa i n on arreglos Para implementar una pila con arreglos se necesitan los siguientes elementos:

Pereda

astillo Aldo S.

- 83 -

1.

Un alma n de datos, que guardar los datos que va a contener la pila. Este almacn es un vector, el cual puede ser de un tipo de dato simple (int, char, float, double) o un registro (struct). a desventaja que presenta la implementacin con arreglos es que el vector, por ser una estructura de datos esttica, tiene una capacidad limitada. A este almacn le llamaremos item.

H IH

IH

AB @ F B B

F P F

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

item 5 4 08 3 12 2 36 1 24 0 10 pila de int 2. 6 5 4 3 2 1 0

item Segis Quimey Oscar Olga Yeimy Pedro pila de cadenas

El TAD Pila queda definido por las operaciones que se realizan. La caracterstica fundamental de las pilas es la tcnica LIFO, es decir, debemos hacer (programar) que la insercin de datos y la eliminacin de los mismos se realice por un solo extremo; garantizando con esto que el ltimo elemento que ingresa debe ser el primero que sale. En la implementacin con arreglos (vectores) necesitamos una variable que almacene el ndice del vector donde se encuentra el ltimo elemento ingresado. Esta variable debe ser de tipo int y le llamaremos cima. cima es una variable (campo) muy eliminacn de elementos. item 5 4 08 3 12 2 36 1 24 0 10 pila de int importante, pues con sta se va a controlar a insercin y item 6 5 4 3 2 1 0 cima 5

cima 4

Segis Quimey Oscar Olga Yeimy Pedro pila de cadenas

Estructura de una pila Como observamos, una pila est compuesta de un vector con tamao preestablecido (limitado) llamado item y una variable entera llamada cima. Entonces podemos afirmar que se trata de un registro (struct) Con el propstio de hacer flexible la declaracin de la estructura de la pila, el tipo de dato del vector le definiremos un alias, de este modo cuando se tenga que modificar el tipo de dato de la pila tan solo tendremos que recurrir a esta seccin y variar el tipo de dato. Por ejemplo, suponga que necesitamos crear una pila de nmeros enteros. #define MAXPILA 50 typedef int tipodato; struct tipopila{ tipodato item[MAXPILA]; int cima; }; typedef struct tipopila tpila; ... void main() { tpila p1, p2; } //para definir el tamao mximo del vector // aqu modificamos si queremos cambiar el // tipo de dato de la pila

Pereda Castillo Aldo S.

- 84 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

En la primera lnea de fragmento de cdigo se est definiendo una constante llamada MAXPILA (el tamao mximo de la pila). sta servir para declarar el vector llamado item. En la segunda lnea, se le est asignando un nuevo nombre al tipo de dato int, ahora se le va a llamar tambin tipodato. Esto con la finalidad de actualizar rpidamente el TAD Pila. Luego se est declarando la estructura de la pila. Como podemos observar consta de un vector (item) y una variable entera cima. Por qu no se le puso tipodato dato que se refiere tambin a int . La respuesta queda como ejercicio para el alumno. Luego, a la estructura llamada struct tipopila se le est cambiando de nombre a uno mas corto: tpila. Por ltimo, dentro de main se est declarando dos pilas: p1 y p2. stas almacenarn nmeros enteros y cada una tiene la siguiente representacin grfica: Pila p1 item cima 49 . . . 8 7 6 5 4 3 2 1 0 Pila p2 item cima 49 . . . 8 7 6 5 4 3 2 1 0

Operaciones en una Pila Las operaciones que caracterizan el comportamiento del TAD Pila son: 1. Crear la pila 2. Pila vaca 3. Pila llena 4. Insertar elementos (push) 5. Eliminar elementos (pop) 6. Cima 7. Recorrido (ver pila) 1. Crear Pila Esta operacin consiste en inicializar la pila como vaca. Recuerda que cuando declaramos una variable, es una buena prctica de programacin, inicializarla con un valor; ya que de lo contrario quedara con el valor que la variable encuentra en esa posicin de memoria. Lo mismo sucede con la pila, su vector item, aparentemente est vaco, pero realmente cada casillero est almacenando un valor, podramos decir aleatorio, que ha encontrado en esa posicin de memoria. Lo mismo sucede con el campo cima, ste tiene un valor aleatorio que ha encontrado en la RAM; si lo dejamos con este valor estara indicando que la pila tiene esa cantidad de datos; y no puede ser porque la acabamos de crear. Para evitar ese inconveniente, debemos inicializar la pila como vaca. Una pila est vaca cuando su cima tiene el valor 1; seleccionamos 1 por ser un valor apropiado ya que los vectores empiezan con su ndice en cero. Subrutina void crearpila(tpila *pila) { // crea una nueva pila pila->cima = 1 ; } // fin crear

Pereda Castillo Aldo S.

- 85 -

S S

T T T T T T S S S

T T T T T S S S S

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


invocando: crearpila(&p1); crearpila(&p2); // se ha creado la pila p1 // se ha creado la pila p2

Estructura de Datos

2.

Pila vaca Siempre resulta til saber el estado de una pila a fin de evitar problemas en otras operaciones. La operacin vaca consiste en determinar si la pila se encuentra o no vaca. Recuerda que una pila est vaca si su cima tiene el valor 1. La subrutina vacia retornar 1 (verdadero) si la pila est vaca; y retornar 0 (falso) en caso contrario (no est vaca) Subrutina int vacia(tpila pila) {//retorna 1 si est vaca, 0 en caso contrario if (pila.cima == ..) return 1; else return 0; } // fin vacia o de un modo ms elegante, tenemos int vacia(tpila pila) { return (pila.cima == 1); } // fin vacia

invocando: int v; v = vacia(p1); if (v) cout<<La pila est vaca; else cout<<La pila no est vaca;

3.

Pila llena Esta operacin indica si la pila se encuentra llena o no. Esta operacin es til en la implementacin con arreglos, pues como se dijo, el vector tiene una capacidad limitada. Si la cima de la pila es igual a la capacidad mxima del vector (menos uno), entonces la pila est llena, en caso contrario, la pila no est llena.

invocando

4.

Insercin (push) Esta operacin agrega un elemento a la pila. Para ello, lo primero que se debe hacer es verificar si la pila no est llena, pues de estarlo, ya no se puede insertar porque ocurrira el error de desbordamiento. En caso de que no est llena, lo siguiente que se debe hacer es incrementar la cima en uno(el siguiente ndice) y asignar el elemento que se desea insertar en esta posicin indicada por cima.

Pereda Castillo Aldo S.

- 86 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

Un parmetro lgico xito (almacena 1 0) indicar si se pudo o no insertar el elemento en la pila. Subrutina void push(tpila *pila, tipodato valor, in *exito) t { // permite agregar un elemento a la pila if(....................) // si no est llena { (pila->cima)++; pila->item[...........................] = ......; *exito = ..............; } else ......................................; } // fin push

invocando

5.

Eliminar (pop) Esta operacin quita el elemento que se encuentra en la cima de la pila. Para ello, lo primero que se debe hacer es verificar que la pila no est vaca, pues de estarlo, ya no se puede eliminar porque ocurrira el error de subdesbordamiento. En caso de que no est vaca, lo siguiente que se debe hacer es asignar a una variable el elemento que se encuentra en la posicin cima (el que va a ser eiminado); decrementar la cima en uno (el l anterior ndice) y retornar el elemento que se va a eliminar (en caso de que se necesite) Un parmetro lgico xito (almacena 1 0) indicar si se pudo o no eliminar el elemento de la pila. tipodato pop(tpila *pila, int *e xito) { // saca un elemento de la pila tipodato valor; if (!vacia(*pila)) { valor = .................. ...............................; (pila->cima) - - ; ..............................; } else *exito=0; return ................... } // fin pop invocando

Pereda Castillo Aldo S.

- 87 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


6.

Estructura de Datos

Cima Esta operacin consiste en obtener una copia del elemento que se encuentra en la cima de la pila (sin eliminarlo). La subrutina que implementa esta operacin es semejante a la operacin pop, pero eliminando la lnea que decrementa la cima. tipodato cima(tpila pila, int *exito) { // saca un elemento de la pila tipodato valor; if (!vacia(*pila)) { valor = .................................................; *xito=1; } else *exito=0; return valor; } // fin pop invocando

7.

Recorrido (ver pila) Esta operacin consiste en mostrar los elementos de la pila.

void verpila(topila pila) { for(int i=0; i<= pila.cima; i++) { gotoxy(1+4*i,10); cout<<pila.item[ i ]; } } //fin verpila

invocando verpila(p1); getch();

ormatos de expresiones aritmticas

Dentro de las aplicaciones de las pilas est la conversin de formato de una expresin aritmtica. Existen tres formatos para representar una expresin aritmtica: 1. 2. 3. Prefijo Postfijo : el operador va delante de los operandos. Ejemplo : + AB : En este caso el operador va depus de los operandos. Ejemplo AB+ Infijo o Entre fijo: es el formato usual. Aqu e operador va entre los dos operandos. Ejemplo A+B

Orden de prioridad de los operadores aritmticos Es necesario recordar el orden de prioridad que tienen los operdores matemticos al momento de evaluar una expresin aritmtica. La prioridad sirve para indicar en qu orden se debe evaluar la expres in. A continuacin mostramos el orden de prioridad de cada uno de los operado res, empezando por el de ms alta prioridad hacia el de menos prioridad: 1 ) (circunflejo) : Potencia 2 ) / : multiplicacin y divisin 3 ) + : sumas y restas

Pereda Castillo Aldo S.

W X W V

- 88 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

Como observamos, el operador de mxima prioridad es la potencia; y los de mnima prioridad son las sumas y restas. Claro est que esta prioridad se ve afectada por el uso de parntesis. En caso de que stos existan, la operacin dentro de ellos se debe evaluar primero. Si existen parntesis anidados, se evala de lo interno hacia lo externo. Si en una expresin aritmtica existen operadores de la misma prioridad, entonces la expresin se evala de izquierda a derecha; excepto el operador de potencia que es e nico que se evala de derecha a izquierda l (cuando hay ms de uno consecutivo en una misma expresin) Conversin de Infijo a Postfijo Una de las aplicaciones de las pilas es la conersin del formato infijo a postfijo. Este formato es de especial importancia para el procesamiento en computadoras debido a que no presenta parntesis. Ejemplo Convertir a postfijo las siguientes expresiones a) A B C b) c) d) e) f) g) h) i) j) (A B) C Y H / ( P) F^B + E/K (Z + D) A ^ / (P (W E ) F) Y K^Z^T (H+Y^E) ^ (P/(Q )) (A + B/C ^ (D G)) ^ (P/Q R) A T C M ^ (W / )

Pereda Castillo Aldo S.

`Y

Y Y

/ ( + F)

- 89 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

Mtodo algortmico de conversin de Infijo a Postfijo Para convertir una expresin de formato infijo a postfijo se necesita: a) Una cadena que almacene la expresin infijia. La expresin infija se compone de operandos (letras) y operadores (smbolos). A esta le llamaremos cadinf. b) Una cadena que almacenar la expresin postfija. A esta le llamaremos cadpost c) Una pila de caracteres (char) que slo almacenar operadores y parntesis izquierdos: +, , , / , ^ , ( El procedimiento algortmico es el siguiente: Se analiza la cadena que contiene la expresin infija (cadinf) carcter a carcter. Por cada carcter se realiza lo siguiente: o o o Si el carcter es un operando (letra), ste pasa directamente a formar parte de la cadena postfija (cadpost). Si el carcter es un parntesis izquierdo siempre se inserta en la pila; dentro de sta se le considera de mnima prioridad para que luego todo operador pueda entrar a la pila. Si el carcter es el operador de potencia (^) siempre entra a la pila, pues es el operador de mxima prioridad. o importa qu operador est en la cima, siempre ingresa (as haya otro operador de potencia en la cima). Si el carcter es otro operador, entrar a la pila siempre que est vaca; en caso contrario, entrar a la pila si es que es de mayor prioridad que el operador que se encuentra en la cima. En caso de ser de menor o igual prioridad que el operador cima, entonces ste se saca y pasa a formar parte de la cadena postfija; luego se vuelve a verificar si es que puede entrar a la pila. Si el carcter es el parntesis derecho, se empieza a sacar los operadores que se encuentran en la pila, pasando cada uno a formar parte de la cadena postfija (en e orden que salen), hasta sacar un parntesis izquierdo; el cual no se agrega a la cadena postfija. Recuerde que una expresin en postfijo no lleva parntesis.

Despus de analizar toda la cadena infija (cadinf), se debe vaciar la pila, sacando cada operador que est dentro de ella y pasndolo a la cadena postfija. El algoritmo termina cuando la pila quede vaca.

Pereda Castillo Aldo S.

- 90 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas PILAS E ERCICIOS RESUELTOS
E ERCICIO 5 01

Estructura de Datos

Desarrolle un programa que implemente las operaciones del TAD Pila. Las operacones se deben gestionar a travs de un men. Considere la pila de nmeros reales. Adems valide para obligar al usuario a crear primero la pila antes de efectuar otra operacin. E ERCICIO 5 02 Implemente la operacin verpila en forma recursiva

E ERCICIO 5 03 Desarrolle un programa que convierta una expresin aritmtica en formato infijo a postfijo Solucin

/* Descripcin: Programa que convierte una expresin aritmtica en formato infijo a postfijo Autor: Ing. Aldo Pereda Castillo Fecha: 23.02.200? 8:00 pm */ #define MAXPILA 100 #define MAXLINE 60 //define la longitud mxima de caracteres en la //expresin infija

typedef char tipodato; //la pila ser de caracteres struct tipopila{ tipodato item[MAXPILA]; int cima; }; typedef struct pila tpila; // Aqu prototipos... void postfijo(char cadinf[ ],char cadpost[ ]); void main() { char cadinf[MAXLINE],cadpost[MAXLINE]; char rpta; do{ clrscr(); gotoxy(1,1); cout<<"CONVERSION DE EXPRESIONES EN FORMATO INFIJO A POSTFIJO"; gotoxy(1,3);cout<<"Ingrese expresin infija: "; gets(cadinf); postfijo(................................................); gotoxy(1,5); cout<<"La expresin en formato postfijo es: "<< .............;

Pereda Castillo Aldo S.

- 91 -

Cdigo fuente

e e e

d d d

Guardar como prog5 03.cpp

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


gotoxy(1,7);cout<<" Desea continuar (S/N)?"; rpta=toupper(getch()); }.......................... ; } //fin main //----------------------SUB RUTINAS -------------------void postfijo(char cadinf[ ], char cadpost[ ]) { tpila pila; int exito, j = 0; tipodato .....................; crearpila(.........); lg = strlen(cadinf);

Estructura de Datos

for (int i=0;i < lg; i++) { if (isalpha(cadinf[i])) // si es operando (letra) cadpost[ j++] = .............; //va a la cadena postfija else if(cadinf[i]=='(' || .............................. ) ......................... ; //siempre se inserta en la pila else if (cadinf[i]=='*' || ..................) if (..................... ) push (&pila,cadinf[i], ...........); else { elem = cima(pila,&exito); // se observa la cima if (elem =='+' || elem== ' -' || elem == '(' ) //si son de < prioridad ....................................... ; else // en la cima hay * / ^ { do{ tem=pop( ); .......................... ; }while (tem!='*' && tem!='/' && tem!='^' && !vacia(pila)); } } push(&pila, .........., .....);

else if (................................... ) if (vacia(pila)) push(......................... ); else { ....................... // se observa la cima ; if (elem=='(') push(&pila,cadinf[i], ...............); else // en la cima hay + - * / ^ { do{ tem=pop( ); cadpost[j++]=tem; }while (tem!='+'&&tem!=' -'&&!vacia(pila)); push(&pila, cadinf[i], ); } } else if(cadinf[i]==')') do{ tem=pop(................... ); if (..............) cadpost[ j++]=tem; }while (....................... ); } // fin for while (!vacia(pila)) { ............................ ; cadpost[j++] = tem; } cadpost[j] = '\0';

Pereda Castillo Aldo S.

- 92 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


} // fin postfijo

Estructura de Datos

// ------------------- SUB RUTINAS : PILA ----------------// CODIFICAR AQU LAS OPERACIONES UTILIZADAS DE LAS PILAS

Pereda Castillo Aldo S.

- 93 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas PILAS E ERCICIOS PROPUESTOS
4. Modifica el ejercicio 5-03 para que permita: a) b) c)

Estructura de Datos

Validar la cadena que representa la expresin en formato infijo, en lo relacionado al uso de los parntesis. Ingresar los valores de cada una de las variables utilizadas en la expresin infjia Evaluar (hallar el resultado) la expresin en formato postfijo segn los valores de asignados a las variables

5. 6. 7. 8. 9.

Programa que permita convertir una expresin de formato infijo a prefijo. Investigue el mtodo. Programa que convierta un nmero en base 10 al sistema octal. Utilice una pila para almacenar los residuos. Escribir una funcion que permita copiar el contenido de una pila en otra Escribir una funcin para determinar si una secuencia de caracteres de entrada es de la forma x & y donde x es una cadena de caracteres y y es la inversa. Programa en el que se manejen un total de n 5 pilas: p1, p2, p3, p4, p5 .La entrada de datos sera pares de enteros (i,j) tal que 1 abs(i) n. El criterio de seleccion de pila: Si i es positivo, debe de insertarse el elemento j en la pila p1. Si i es negativo, debe de eliminarse el elemento j de la pila p1. Si i es cero; fin del proceso de entrada. Los datos de entrada se introducen por teclado. Cuando termina el proceso el programa debe escribir el contenido de la n pilas en pantalla .

10. Se desea sumar dos nmeros enteros positivos arbitrariamente grandes. Estos nmeros son tan grandes que no pueden almacena rse en una variable numrica. Utilizando el TAD pila, escribir un programa para realizar la suma de dos numeros enteros grandes. 11. Resolver el siguiente problema: El estacionamiento El Corralito tiene un solo carril que acepta hasta 10 autos. nicamente hay una entrada/salida al estacionamiento en un extremo del carril. Si llega un cliente, para remover un auto que no est cerca de la salida, todos los carros que bloquean su ruta se quitan, se remueve el auto del cliente y los otros autos vuelven a ingresar en el mismo orden que estaban. Escribir un programa que procese un grupo de lneas de entrada. Cada lnea de entrada contiene una L para llegada y una S para salida y un nmero de placa. Se supone que los autos llegan y salen en el orden especificado en la entrada. El programa debe imprimir un mensaje cada vez que llega o sale un auto. Cuando llega un auto, el mensaje debe especificar si hay o no espacio para el auto en el estacionamiento. Si no hay espacio , el auto se va sin entrar. Cuando sale un auto, el mensaje debe incluir la cantidad de veces que se ha removido del estacionamiento para permitir que salgan autos.

Pereda Castillo Aldo S.

- 94 -

hi

hi

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

UNIDAD II Colas Estructuras Dinmicas

Pereda Castillo Aldo S.

- 95 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

Pereda Castillo Aldo S.

- 96 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

TAD COLA
CASO : BANCO Utilice el TAD Cola para representar el sistema de atencin a los clientes de una entidad Bancaria, la cual utiliza una ticketera para obtener el turno correspondiente. Los clientes de este banco se clasifican como Clientes con Tarjeta (C) y Sin Tarjeta (S). Cuando el cliente llega al Banco se acerca a la mquina ticketera y de acuerdo a su tipo (Con tarjeta o Sin tarjeta) obtiene el ticket; en ste figura el nmero de atencin y el tiempo promedio estimado de espera para ser atendido (considere 4 minutos promedio de atencin de cada cliente). El nmero de ticket generado es secuencial, as por ejemplo para los clientes con tarjeta: C01, C02, C03, etc.; y S01, S02, S03, etc. para los clientes sin tarjeta. El orden de atencin es secuencial (cola); pero existe una preferencia del 70% de atencin hacia los clientes con tarjeta. Lgicamente si no hay clientes de alguna cola, se llaman en secuencia a los de la otra cola. Considere el caso de un solo cajero (persona) en ventanilla que atiende las dos colas (clientes con tarjeta y sin tarjeta). ste llama a travs del sistema al cliente que va a ser atendido (el nmero de ticket aparece en pantalla). Cuando se acerca el cliente, el cajero le solicita su nombre y las operaciones a realizar (depsito, retiro, transferencia, pago de servicios); cuando termina, el cajero nuevamente llama a otro cliente.

En la ciudad de La Unin existe un hospital de EsSalud que brinda atencin mdica en las especialidades de Pediatra, Obstetricia y Medicina General. En esta ciudad existen alrededor de 10000 habitantes, de los cuales 6000 son pacientes asegurados y el resto no tienen seguro de EsSalud. Recientemente se ha implementado un sistema de informacin que se encarga del proceso de atencin de los pacientes, desde Admisin hasta la entrega de medicina en Farmacia; este sistema emplea mquinas ticketeras para generar los tickets de atencin en las diferentes fases y el orden de atencin es un sistema de colas (orden de llegada). Las fases son: Fase I: Admisin Fase II: Atencin mdica Fase III: Farmacia ase I: Admisin

Cuando un paciente desea ser atendido en alguna especialidad, se acerca al rea de Admisin donde existe una mquina ticketera que le entregar un ticket (la mquina empieza a estar operativa desde las 5:30 am). El nmero de ticket es A01, A02, A03, etc, correlativo; donde la letra A significa Admisin. A partir de las 7:30 am, llega el encargado de Admisin y desde el mdulo del sistema instalado en su PC, elige la opcin

Pereda Castillo Aldo S.

APLICACIN DEL TAD COLA- CASO HOSPITAL

- 97 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


r

Estructura de Datos

correspondiente para llamar a los pacientes en espera. En las pantallas de los TV instalados en la sala de espera aparece el nmero de ticket para que el paciente se acerque a ventanilla. En ventanilla se le solicita al paciente su nmero de D I, sus apellidos y nombres, la especialidad en que desea ser atendido y se le pregunta si es o no asegurado. Las especialidades son: Especialidad Medicina General Obstetricia Pediatra Nro. Tickets mximo por especialidad 50 40 30

En caso ya no haya cupo para una especialidad se le informa al paciente que lamentablemente el da de hoy no puede ser atendido. Al elegir una especialidad el sistema muestra la cantidad de cupos, cuntos ya fueron ocupados y cuntos quedan disponibles. Despus de indicar en qu especialidad va a ser atendido el paciente, se le entrega otro ticket que contiene:
-

El nmero de atencin. El nmero de atencin est formado por el cdigo de la especialidad y un nmero correlativo. El nmero de atencin se forma dependiendo de la especialidad a la que se dirige el paciente. Por ejemplo: M1, M2, O1, O2, P1, P2, P3, P4, P5, etc. Y la atencin se da por orden de llegada (segn lo genere el galeno) de cada especialidad. Los apellidos y nombres del paciente El tiempo promedio de espera. Se ha calculado que cada mdico demora aproximadamente 20 minutos en atender a cada paciente.

Fase II: Atencin mdica La atencin mdica inicia desde las 8:00 am. En los consultorios, los galenos desde su PC llaman a los pacientes eligiendo la opcin correspondiente del sistema. En las pantallas de los TV ubicados en la sala de espera, aparece la especialidad, el nmero de ticket y el nombre del paciente que le corresponde ser atendido. El mdico atiende al paciente y elabora la receta mdica y las indicacio nes (esto lo registra en el sistema informtico); al elaborar la receta mdica, automticamente genera el ticket de atencin en Farmacia, el cual tiene la siguiente codificacin: F01, F02, F03, F04, etc.; donde F significa farmacia. Luego el mdico imprime receta, indicaciones y el ticket para farmacia y lo entrega al paciente. En caso sea medicina que se necesita con carcter de urgente, el mdico indica en el sistema que esa receta es Urgente para que tenga prioridad en la atencin en Farmacia. Fase III: Farmacia En la sala de espera de Farmacia, el paciente debe esperar a que su ticket aparezca en la pantalla de los TV para ser atendido con su receta (aparece el nmero de ticket, el nombre del paciente, el tipo de paciente: asegurado o no asegurado y el tiempo promedio de espera). El orden de atencin en farmacia es por orden de llegada (segn el momento en que el mdico gener el ticket para farmacia); pero se tiene cierta preferencia cuando hay pacientes en espera que son de distinta clasificacin. La clasificacin para la atencin en farmacia es:
-

Los pacientes asegurados Pacientes no asegurados Pacientes con receta etiquetada como URGE TE.

Pereda Castillo Aldo S.

- 98 -

Cdigo M O P

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

Cuando no hay recetas con carcter de URGE TE, existe una preferencia de atencin en Farmacia del 70% a favor de los pacientes asegurados y lo restante para los no asegurados. Pero si hay tickets en espera de recetas que fueron etiquetas como Urgentes, stas se atienden primero.

Se sabe que el tiempo promedio de atencin en Farmacia, desde que el paciente se acer a a la ventanilla c hasta que se le entrega la medicina es de 5 minutos por paciente. REQUERIMIENTOS Se pide implementar un programa usando el TAD cola para representar todo el proceso descrito anteriormente. La interfaz del programa debe ser en modo grfico.

Pereda Castillo Aldo S.

- 99 -

Universidad sar Vallejo Piura Escuela de Ingeniera de Sistemas


y x

Estructura de Datos

LISTAS ENLAZADAS
Estru turas Dinmi as de datos En captulos anteriores se han estudiado estructuras de datos estticas (arreglos, registros, etc.) cuya caracterstica esencial es que su almacenamiento en memoria (nmero de elementos) se determina a priori en el momento de escribir el programa y se fija durante la compilacin. Durante la ejecucin de programa sus valores se pueden modificar, pero no se puede cambiar el nmero de elementos de la estructura que es fijo. Para resolver superar inconveniente se utilizan estructuras dinmicas de datos, que sonaquellas en las que podemos aumentar o reducir su nmero de elementos (nodos) de acuerdo a las necesidades de programa. Punteros Un puntero es una variable cuyo valor o contenido es la direccin de una posicin de memoria. Al definir un tipo puntero, se debe indicar el tipo de valores que se almacenarn en las posiciones designadas o referenciadas por los mismos. a razn es que los diferentes tipos de datos requieren diferentes cantidades de memoria para almacenar sus valores. LISTAS SIMPLEMENTE ENLAZADAS

EJEMPLO

Dada la siguiente lista simplemente enlazada:


Algoritmia lgebra

Filosofa

NULL

Fsica II

Ing.

Redaccin

Ecologa

omplete el siguiente mapa de memoria Dire i n de INFO SIG memoria 0059 lgebra 100A Estructura 125B Medio 1F3A Algoritmia 1A07 Ecologa 138C Fsica II 156D Filosofa 180E Ing. eb 2006 gico Mat. 340F Matemtica 852A S 900B Redes 950C POO A054 Electrnica A356 Redaccin A34A eora Sist. astillo Aldo S.

Pereda

- 100 -

Lgico Mat.

Matemtica

a e a

eora Sist.

POO

eb

NULL

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas E EMPLO 02 Usando el mapa anterior. Complete:

Estructura de Datos

a) Cul es el valor del puntero cabeza ......................................... b) cabeza -> info ................................ c) Si los punteros p y q tienen los valores 1F3A y 138C respectivamente, complete: y p -> info y p -> sig .. y q ->sig .. y q -> info .. y (p -> sig) - > sig .. y (q -> sig) -> info .. y (q -> sig) -> sig .. E EMPLO 03 Usando la lista y el mapa de memoria del Ejemplo 01: Indique los valores finales de cada uno de los punteros; adems indique qu es lo que se muestra en pantalla segn el caso. a) p cabeza; q p -> sig; strcpy(valor,q->info); cout valor p->info; b) p cabeza ->sig; while(p! ULL) { cout p -> info p p->sig; }
g ee d d d eef ee ee d d

endl;

E EMPLO 04 a) Dibuje la lista si el puntero cabeza tiene el valor a. 0059 b. A356 b) Suponga que los punteros p, q y r tienen los valores 340F, 950C, A356 respectivamente. Dibuje la lista si ocurre lo siguiente: b. q - > sig
d f f f

a. p -> sig

q r

Pereda Castillo Aldo S.

d) n 0; for(p cabeza ; p! ULL; p { cout p -> info endl; n++; } cout \n n;


g ee d ee ee ee d d

p->sig)

c) for(p cabeza ->sig; p! ULL; p cout p -> info endl;


g d ee ee d

ee

p->sig)

- 101 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas E EMPLO 05


h

Estructura de Datos

Dado el siguiente mapa de memoria, dibuje la lista enlazada correspondiente, si el puntero cabeza tiene el valor: a) 1247 Direccin Memoria 0100 0150 1200 1247 2321 2450 A498 A520 B600 D650 F700 E EMPLO 06 Desarrolle un programa que implemente las operaciones que se realizan en una lista enlazada de nmeros enteros SOLUCIN
h

b) B600 INFO

c) 0150 SIG F700 1 D650 2450 B600 0100 0150 F700 1200 1 A498

CPU Mainboard Fuente Cooler Chipset Monitor USB Audio Impresora Estabilizador Bios

/ Descripcin: Programa que muestra las operaciones en una lista enlazada de nmeros enteros Autor: Ing. Aldo Pereda Castillo Fecha: 03.07.09 8:56 pm / typedef int tipodato; // el tipo de dato del campo info del nodo struct nodo{ tipodato info; struct nodo *sig; ; typedef struct nodo nodolista; //cambiando de nombre typedef nodolista *ptrnodo;
j i i

do{ clrscr(); menu(&rpta); clrscr(); switch(rpta){ case '1': //insertar al inicio gotoxy(1,1); cout "1. Insertar al inicio"; gotoxy(1,3);cout "Ingrese un valor: "; cin>>valor; Pereda Castillo Aldo S.
mm mm

void main() { ptrnodo cabeza ptrnodo rb; tipodato valor; char rpta;

ULL;//inicializa la lista como vaca

- 102 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas insprimero(&cabeza,valor); verlista(cabeza); pausa(); break; case '2': //insertar al final gotoxy(1,1); cout "2. Insertar al final"; gotoxy(1,3);cout "Ingrese un valor: "; cin>>valor; pausa(); break; case '3': // Compltalo
nn nn

Estructura de Datos

break; case '4': //Buscar gotoxy(1,1); cout "4. Buscar un valor"; gotoxy(1,3);cout "Ingrese el valor a buscar: "; cin>>valor; rb localizar(cabeza,valor); gotoxy(1,5); if (.....................) cout "El valor S se encuentra \n"; else cout "El valor O se encuentra\n"; verlista(cabeza); pausa(); break; case '5': //eliminar primer nodo gotoxy(1,1); cout "4. Eliminar primer nodo"; gotoxy(1,3);cout "Lista original:"; verlista(cabeza); eliprimero(&cabeza); gotoxy(1,6);cout " ueva Lista:"; verlista(cabeza); pausa(); break; case '6': //eliminar ltimo nodo. Compltalo
q oo oo oo oo q oo oo oo oo p

break; case '7': //eliminar especifico. Compltalo

break; case '8': //ver lista gotoxy(1,1); cout "7. Ver Lista"; ...............................; pausa(); break; Pereda Castillo Aldo S. - 103 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

} // fin switch }while(rpta! '9'); // fin do while } // fin main // -------------------------------------------- Sub Rutinas -------------------------------------void menu(char *opcion) { marco(3,2,43,17); gotoxy(8,4);cout "LISTA E LAZADA DE UMEROS E TEROS"; gotoxy(5,6);cout "1. Insertar al inicio"; gotoxy(5,7);cout "2. Insertar al final"; gotoxy(5,8);cout "3. Insertar despus de... "; gotoxy(5,11);cout "4. Buscar un valor"; gotoxy(5,9);cout "5. Eliminar primer nodo"; gotoxy(5,9);cout "6. Eliminar ltimo nodo"; gotoxy(5,10);cout "7. Eliminar especifico..."; gotoxy(5,12);cout "8. Ver Lista"; gotoxy(5,13);cout "9. Salir"; gotoxy(5,15);cout "Su opcion:"; opcion getch(); }//fin menu // ptrnodo crearnodo(tipodato valor) { //crea un nuevo nodo asignando un valor al campo info. Devuelve un puntero al nuevo nodo //creado o ULL si ocurre un error ptrnodo ....................... ; nuevo (ptrnodo) malloc(sizeof(nodolista)); if (nuevo! ULL) { nuevo->info valor; nuevo->sig ..................; } return ; } // fin crearnodo // int vacia(ptrnodo cabeza) { //retorna 1 si est vaca; 0 en caso contrario return cabeza ULL; }
uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu t t t ss ss ss ss ss ss ss ss ss ss ss v v t t v v v u r

//

void insinicio(ptrnodo *cabeza, tipodato valor , int *exito) { //inserta un nuevo nodo al inicio de la lista .................................. ; nuevo crearnodo(................ ); if (nuevo! ULL) { //si no hay error en la creacin nuevo->sig ....................; cabeza ....................... ; xito 1; } else xito ..............; } //fin insprimero
uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

//

void insfinal(ptrnodo *cabeza, tipodato valor, int *exito) { //inserta un nuevo nodo al final de la lista Pereda Castillo Aldo S. - 104 -

vv

u u u

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas ptrnodo ; nuevo crearnodo(valor); if (nuevo! ULL) //si no hay error en la creacin { p cabeza; if( p ! ULL) { //se recorre hasta llegar al ultimo nodo while () .; ................... nuevo; } else // cuando la lista est vaca cabeza ................. e xito 1; //se tuvo xito en la insercin } else ........................................... } //fin insfinal

Estructura de Datos

tipodato eliprimero(ptrnodo *cabeza) { //elimina el primero nodo de la lista (el apuntado por el puntero cabeza). retorna el campo info tipodato temp; ptrnodo q; ................................; ................................; ................................; free(q);//libera memoria apuntada por q return temp; } // fin eliminar tipodato eliultimo(ptrnodo *cabeza) {

} // fin eliminar tipodato elimespecifico(ptrnodo *cabeza, ................................... ) { //elimina el nodo apuntado por p. retorna el campo info

Pereda Castillo Aldo S.

yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

//

xw yw xw w w y

- 105 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

} // fin elimespecifico //*************************************************************************** void verlista(ptrnodo p) { if (vacia(p)) cout "\nLa lista est vaca \n\n"; else { cout "\n"; do{ cout p->info " > "; p p->sig; }while (); cout " ULO\n\n"; } } // fin verlista //*************************************************************************** ptrnodo localizar(ptrnodo cabeza, tipodato vbuscado) { //Retorna el puntero del nodo que contiene el dato buscado o ULL cuando no se encuen tra ptrnodo p; for( p cabeza; p! ULL; p p->sig) if(vbuscado p->info) return p; // retorna el puntero p (la direccin) y cancela el for return ULL; // si el flujo de programa llega hasta aqu, significa que no se encontr } // fin localizar
} ~ } ~ ~~ } ~ {{ zz zz | zz zz zz {

E EMPLO 07 Desarrolle un programa que permita realizar el mantenimiento a la data de libros de una biblioteca, es decir, debe permitir: a. Registrar los datos de los libros. Los datos que se consideran son el cdigo, el cual consta de cinco dgitos, el ttulo, la materia, e nmero de ejemplares y el precio de compra. b. Modificar los datos de los libros c. Eliminar libros d. Buscar libros por cdigo y ttulo e. Listar f. Ordenar , etc.

Ejercicio 05: Listas enlazadas: Aplicacin

/ Descripcion: Programa que permite realizar el mantenimiento (insercin, modificacin, eliminacin, bsqueda,etc) a los Libros de una Biblioteca Autor: Ing. Aldo Pereda Castillo Fecha: 15.06. 8:56 pm / struct tipolibro{ char codigo[6]; char titulo[25]; Pereda Castillo Aldo S. //cdigo del libro // titulo del libro - 106

Guardar como: TAL06_05

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas char materia[20]; int nejem; float precio; }; // materia del libro // nmero de ejemplares // precio de libro

Estructura de Datos

typedef struct tipolibro tipodato; // el tipo de dato del campo info del nodo struct nodo{ tipodato info; struct nodo *sig; }; typedef struct nodo nodolista; //cambiando de nombre typedef nodolista *ptrnodo;

// A

void main() { ptrnodo lista ULL; ptrnodo rb; tipodato estlibro; char codigob[6]; char rpta;

case '2': gotoxy(1,1); cout "2. Ver Lista"; verlista(lista); pausa(); break; case '3': gotoxy(1,1); cout "3. Bsqueda por Cdigo"; buscar1(lista); pausa( ); break; case 4: // completarlo case '5': gotoxy(1,1); cout "5. Eliminar Libro"; if (lista! ULL) { verlista(lista); cout "\n\nIngrese el cdigo del libro a eliminar:"; ................................; rb localizar1(........................., ..........................); if (.........................) // si es encontrado { estlibro elimespecifico(&lista,rb); cout "\nEl libro se elimin correctamente"; pausa(); Pereda Castillo Aldo S.

prototipos //inicializa la lista como vaca // .................................................................... // variable estructura que contiene los datos del libro //

do{ clrscr(); menu(&rpta); clrscr(); switch(rpta){ case '1': gotoxy(1,1); cout "1. Registro de Libros"; gotoxy(1,5);cout "Cdigo : ";gets(estlibro.codigo); gotoxy(1,6);cout "Ttulo : ";gets(estlibro.titulo); gotoxy(1,7);cout "Materia : "; gotoxy(1,8);cout " Ejemplares: ";cin>>estlibro.nejem; ............................................................................................ ...................... insfinal(&lista,.............................); pausa( ); break;

- 107 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas clrscr(); verlista(lista); } else } else

Estructura de Datos

cout cout pausa(); break;

"El Libro no existe";

"\n\nLa lista est vaca";

} // fin switch }while(rpta! '6'); // fin do while } // fin main // --------------------------------------- SUB RUTI AS -------------ptrnodo crearnodo(tipodato valor) { //crea un nuevo nodo asignando un valor al campo info //devuelve un puntero al nuevo nodo creado o ULL si ocurre un error ptrnodo nuevo; nuevo (ptrnodo)malloc(sizeof(nodolista)); if (nuevo! ULL) { nuevo->info ...............; nuevo->sig ..............; } return nuevo; } // fin crearnodo void insfinal(ptrnodo *cabeza, tipodato valor) { //inserta un nuevo nodo al final de la lista ptrnodo nuevo, p; nuevo crearnodo(valor); if (nuevo! ULL){ //si no hay error en la creacin p cabeza; if (p! ULL) { while (p->sig! ULL) //se recorre hasta llegar al ultimo nodo .; p->sig nuevo; } else //cuando la lista est vaca cabeza .......................; } else

} //fin insfinal tipodato elimespecifico(ptrnodo *cabeza, ................................... ) { //elimina el nodo apuntado por p. retorna el campo info tipodato temp; ptrnodo q; q cabeza; if(q->sig! ULL) // cuando hay mas de 1 nodo, { while(......................) // entonces se recorre hasta que q>> apunte al nodo antes de p>> q q->sig; q->sig p->sig; }

Pereda Castillo Aldo S.

- 108 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas else // cuando hay un solo nodo cabeza ULL; temp p->info; .............................;//libera m emoria apuntada por p return temp; } // fin elimespecifico void verlista(ptrnodo p) { int i 1; cabecera(); if (vacia(p)) cout "\nLa lista est vaca \n\n"; else { do{ gotoxy(1,i+4);cout i ".-"; gotoxy(5,i+4);cout p->info.codigo; gotoxy(13,i+4);cout p->info.titulo; gotoxy(39,i+4);.; gotoxy(56,i+4);.; gotoxy(65,i+4);.; i++; .. // avanza p; }while (p! ULL); } } // fin verlista void vernodo(ptrnodo p) { //permite ver el campo info del nodo apuntado por p cabecera(); if (vacia(p)) cout "\nLa lista est vaca \n\n"; else { gotoxy(1,5);cout "1.-"; gotoxy(5,5);cout p->info.codigo; gotoxy(13,5);cout p->info.titulo; } } // fin verlista

Estructura de Datos

ptrnodo localizar1(ptrnodo cabeza, char codigob[ 6 ]) { // Busca por cdigo // Retorna el puntero del nodo que contiene el dato buscado o ULL cuando no se encuentra ptrnodo p; for(p cabeza;p! ULL;p p->sig) if(stricmp(codigob,p->info.codigo) 0) // compara los cdigos return .............; //retorna el puntero p (la direccin) y cancela el for return ...............; //si el flujo de programa llega hasta aqu, indica que no se encontr } // fin localizar void buscar1(ptrnodo lista) { // permite la bsqueda por cdigo de libro char codigob[6]; ptrnodo rb; gotoxy(1,3);cout "Ingrese el cdigo: "; gets(codigob); rb....................................................; if (rb! ULL) vernodo(rb); else cout "El Libro O se encuentra\n"; } // fin buscar1 Pereda Castillo Aldo S.

- 109 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

Pereda Castillo Aldo S.

void cabecera(void) { gotoxy(1,3);cout " ro Codigo Titulo gotoxy(1,4);cout " } // fin cabecera

Materia

- 110 -

void menu(char *opcion) { marco(3,2,43,17); gotoxy(8,4);cout " SISTEMA DE I VE TARIO gotoxy(12,5);cout "MODULO 1: PRODUCTOS"; gotoxy(5,7);cout "1. Registrar"; gotoxy(5,8);cout "2. Listar"; gotoxy(5,9);cout "3. Buscar"; gotoxy(5,10);cout "4. Modificar"; gotoxy(5,11);cout "5. Eliminar"; gotoxy(5,12);cout "6. Salir"; gotoxy(5,14);cout "Su opcin:"; opcion getch(); }//fin menu

";

Ej em Precio";

";

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas E ERCICIOS PROPUESTOS

Estructura de Datos

4. Escribir una subrutina que devuelva el nmero de nodos de una lista enlazada 5. Escribir una funcin que elimine el nodo que ocupa la posicin i, considerando que el nodo cabecera ocupa la posicin 0. 6. Escribir un programa que a travs de subrutinas realice las siguientes tareas: a. Crear una lista enlazada de nmeros enteros positivos aleatorios; la insercin se realiza por el ltimo nodo. b. Recorrer la lista para mostrar los elementos en pantalla c. Eliminar todos los nodos que superen un valor dado 7. Supongamos que una lista llamada LstEnteros est ordenada ascendentemente (la informacin de los primeros nodos ser menor que la de los ltimos) y la informacin de cada nodo es de tipo entero. Se desea insertar un elemento X en el sitio apropiado en la lista de tal forma que siga quedando ordenada. 8. Desarrollar un programa que muestre la implementacin de las operaciones en una lista doblemente enlazada.

Pereda Castillo Aldo S.

- 111 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

TRABAJO LISTAS DOBLES


En modo grfico. Implementar el TAD Lista enlazada doble de nmeros decimales y considerar las siguientes operaciones:
1. Lista vacia 2. Bsqueda 3. Insercin de nodos a. Al Inicio b. Al final c. Despus de otro nodo d. Antes de otro nodo 4. Eliminacin a. El primer nodo b. El ltimo nodo odo especfico c. 5. Ver Lista (recursivo) 6. Devolver la direccin del penltimo nodo de la lista asi como el campo info de ese nodo. 7. Listar los nodos cuyo valor es inferior a un valor indicado por el usuario (recursivo) 8. Eliminar los nodos cuyo valor coincide con el valor ingresado por el usuario 9. Se busca un valor. El programa debe permitir visualizar todos los nodos (el campo info) anteriores o posteriores a ese nodo (segn lo que el usuario desea ver)

Pereda Castillo Aldo S.

- 112 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

R OLES
Ca a idades Al finalizar el taller, Usted ser capaz de: y Conocer y comprender el concepto de rbol y Conocer los tipos de rboles: rboles Binarios y rboles Binarios de Bsqueda. y Simular un mapeo de memoria segn un rbol dado. y Declarar la estructura rbol. y Conocer las operaciones diversas que se realizan en un rbol. y Codificar recursiva e iterativamente las operaciones del AD rbol. y Conocer los mtodos para recorrer un rbol, en secuencia Inorden, PreOrden y PostOrden. y Activar el modo grfico del lenguaje C/C++ y Conocer y aplicar las funciones bsicas relacionadas con el entorno grfico. EJERCICIOS RESUELTOS

1.

Dado el siguiente rbol binario:


raz
Lgico Mat. Fsica

Algoritmos

null

EDA

null

null

Computacin

null Comunic.

POO

null

Informacin null

null

I.Software null

Complete el mapa de memoria correspondiente:

Dire i n e a

IZ

INFO

DER

Pereda Castillo Aldo S.

03E8 044C 04B0 04FF 0514 056F 0578 05DC 0640 05BF 06C4 0708 076C 07D0 0834

Francs Informacin Filosofa Electrnica Lgico Mat. I eb Arquitectura POO Comunic. Operativos Algoritmos I. Software Ingls EDA Fsica

- 113 -

null

Electrnica

null

Ingls

null

null

Arquitec tura

null Operativos null

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas 08A0 08FF A670 Programacin Computacin Arquitectura

Estructura de Datos

2. Con respecto al mapa anterior, si tenemos los punteros p, q y r con los valores 0640, 06C4 Y 05DC respectivamente, complete: a) b) c) d) e) f) p -> info................................. p -> der................................. p -> izq ................................. q -> izq ................................. q -> der................................. r -> info ................................. g) h) i) j) k) r -> izq ................................. (r -> izq) -> info ................................. (p -> izq) -> der ................................. ((r -> der) -> izq) - > info............................. ((r -> izq) -> izq) -> info .............................

3. Con respecto al mapa de memoria de la pregunta 1. Completar: a) Cunto vale raiz ................................. b) raiz ->info ................................. c) Indique la direccin de los nodos hoja ................................................................................. d) Indique la direccin del nodo padre del nodo que se encuentra en la siguiente direccin: i. 05DC ......................................... ii. 0640 ......................................... iii. 06C4 ......................................... iv. 0514 ......................................... v. 0708 ......................................... 4. Dados los siguientes fragmentos de cdigo. Indique la accin realizada en cada uno (con respecto al rbol de la pregunta 1) Caso A for (p raz; p ! ULL; p p->der) cout p->info \n;

Caso B for (p raz; p ! ULL; p p->izq) cout p->info \n;

Caso E: subrutina recursiva void subrutina01(ptrnodoar p) { if (p ! ULL){ cout p-> info endl; subrutina01(p->der); } } La invocacin es: Caso E.1 p raz; Pereda Castillo Aldo S.

Caso D for (p raz; p -> izq ! cout p->info \n;


ULL; p

Caso C for (p raz; p ! cout p->info


ULL; p \n;

p -> der) ;

p -> izq) ;

- 114 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas subrutina01(p); Caso E.2 Si el puntero q tiene el valor 08FF subrutina01(q) Caso F: subrutina recursiva void subrutina02(ptrnodoar p) { if (p ! ULL){ cout p-> info endl; subrutina02(p->izq); } } La invocacin es: Caso F.1 subrutina02(raiz); Caso F.2 Si el puntero q tiene el valor 0834 subrutina02(q)

Estructura de Datos

Caso G: subrutina recursiva void subrutina03(ptrnodoar p) { if (p ! ULL){ cout p-> info endl; subrutina03(p->izq); subrutina03(p->der); } } La invocacin es: Caso G.1 subrutina03(raiz); Caso G.2 Si el puntero q tiene el valor 0834 subrutina03(q)

5. Dado el siguiente mapa de memoria, dibuje el rbol binario correspondiente, si el nodo raiz se encuentra en la direccin: a) 1388 b) 2328 c) 2EE0
I Q

01F4 03E8 05DC 07D0 09C4 0BB8 0DAC

0DAC 157C null 157C 05DC 251C null

Pereda Castillo Aldo S.

Direccin (Hexa)

INFO

DER

Isack Bari Kotharu Miguel Pal Isabel Lila - 115 -

null null null 30D4 251C 07D0 null

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

5. Inserte en un r ol inario de s ueda los siguientes datos (Disee los rboles): a) 15, 27, 10, 20 b) 34, 89, 23, 10, 90, 105, 14, 10, 45 c) 3, 67, 14 y 89 d) 5, 9, 7, 3, 8, 12, 6, 4 y 20 e) Per, Ecuador, Brasil, Uruguay, Argentina y Chile f) Paraguay, Per, Bolivia, Ecuador, Brasil, Uruguay y Argentina.

7. Dados los siguientes rboles binarios de expresiones aritmticas, construya las expresiones, teniendo en cuenta los recorridos: a) Inorden b) Pre orden c) Post Orden

7.1) a) Inorden + A B C b) Preorden c) Postorden .................................................. .................................................. ..................................................

7.2)

+
/

Pereda Castillo Aldo S. *

- 116 -

6. Dadas las siguientes expresiones, construya su r correspondiente: a) ^ b) (12 3 ) * 5 c) 12.56 * 14 10 d) A / B + E e) F K / f) (A + B*C) / (G ^ (H E))

0FA0 1194 1388 157C 1770 1964 1B58 1D4C 1F40 2134 2328 251C 2710 2904 2AF8 2EE0 30D4 32C8

null null 1D4C 1194 0FA0 null null 03E8 03E8 null 0FA0 0DAC 03E8 null 1964 05DC null null

enry Shirley Manuel Leidy alter Edwin Jos Kike Frederick Sergio Jorge Jeimy uillermo Maril Karlo Olga Karina Carlota

null null 2134 null null null null 2AF8 0BB8 09C4 2EE0 2904 0FA0 null 32C8 1F40 1B58 null

ol inario de e

resiones

g) h) i) j) k)

P ^ ^ (R + *H) (A B) * (C / D) P * / (R + S) ^ D (M + B ^ (Q + E)) / (A 1.25 / 8 + (5 ^ 2 )*3

B*P + Q)

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

a) Inorden ................................................................... b) Preorden ................................................................... c) Postorden ...................................................................

7.3)

+ /
+
H A B G

a) Inorden ...................................................................

b) Preorden E ................................................................... c) Postorden ...................................................................

*
H

Pereda Castillo Aldo S.

- 117 -

8. Disear el programa que im lemente las o era iones de un r ol inario de


7.4)

a) Inorden / ................................................................... ............ b) Preorden / ................................................................... ............ c) Postorden b


c

3 p

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

s ueda.

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas EJERCICIOS PROPUESTOS

Estructura de Datos

9. Tomando como referencia el ejercicio resuelto cuenta los recorridos a) preorden

6, construya las expresiones teniendo en

b) postorden

10. Dado el siguiente mapa de memoria, dibuje el rbol binario correspondiente, si : b) raiz 0D7A c) raiz 15AE a) raiz 012C I Q 1194 null null 1450 0ABE null 0C1C null null 012C 012C 12F2 03E8 null 0960 0ED8 null 1036 null 186A

11. Despus de disear los rboles binarios anteriores, muestre el campo info en secuencia, segn los recorridos: a) Inorden b) PreOrden c) PostOrden 12. Escribir un programa en el que dado un rbol, determine: a) El nmero de nodos b) El nmero de hojas 13. Dados dos rboles binarios de bsqueda, escribir un programa que construya su rbol espejo. rbol espejo es el que se construye a partir de un nodo dado, convirtiendo el subrbol izquierdo en subrbol derecho y viceversa.

14. Con respecto al mapa de memoria del ejercicio 10, si tenemos los punteros raiz 1450 y q 19C8. Responder (Completar) a) raiz -> info ............................ ..................... b) p -> info ................................................. c) q -> info ................................................. d) raiz -> der ................................................. e) (raiz -> izq) - > info ......................... ........................ f) q -> der ................................................. g) (p -> izq) -> izq ................................................. h) ((p -> izq) -> izq) -> info .................................................

Pereda Castillo Aldo S.

- 118 -

Direccin (Hexa) 012C 028A 03E8 0546 06A4 0802 0960 0ABE 0C1C 0D7A 0ED8 1036 1194 12F2 1450 15AE 170C 186A 19C8 1B26

INFO Teclado Parlantes Impresora Computadora Cooler Chipset Mainboard IC Drivers Monitor Mouse DVD Micrfono Multimedia CPU Scanner Webcam USB Paralelo Serie

DER 170C 186A null 0D7A null null 0802 null null 028A 1450 null 19C8 null 06A4 1B26 null null null 0802

15AE, p

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

15. Modifique el ejercicio 08 (Programa) para: a) Agregar la opcin de Buscar>> en el men (Recuerde que esta opcin ya est codificada, slo falta enlazarla al men) b) Reto: Realizar la transicin de todo el programa a modo grfico.

Pereda Castillo Aldo S.

- 119 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

SOLUCI N TALLER
Ejer i io : rbol Binario de Bsqueda (ABB) ar ol .

R OLES

Guardar omo

Dado que el siguiente programa tiene la opcin de dibujar el rbol binario, se necesita activar el modo grfico del lenguaje C/C++; para ello se debe habilitar la libreri grfica, as: a Ir al Menu O tions Lin er Li raries , a ilitar la li rera grfi a. En C/C

/******************************************************************************************************** Descripcin : Programa que muestra las operaciones de un rbol Binario de Bsqueda Autor : Adrian Baca Cardenas - Escuela Politecnica Nacional. Octubre 2002 Modificado por: Ing. Aldo Pereda Castillo. /******************************************************************************************************/ //Declarando la estructura nodo del arbol t edef int ti odato;

stru t nodo{

// Prototipos del AD Arbol trnodoar rearnodo ti odato elemento ; void insertar trnodoar rai , ti odato elemento ; void inorden trnodoar rai ; // Completar .

// Programa Prin i al main void main { int gdriver DETECT, gmode, oderror; // Para activar el modo grfico int elemento, valor, opcion, i; char *dato; ptrnodoar raiz=NULL; clrscr(); // Permite permanecer en un ciclo infinito. til para el men for ; ; nuevo //esta es una etiqueta valor=0; opcion=menu(); if((opcion>=8 && opcion<=16) && raiz==NULL){ window , , , ; //crea un area (ventana) Pereda Castillo Aldo S.

t t

; ;

};

edef stru t nodo NODOAR OL; edef NODOAR OL trnodoar;

- 120 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas

Estructura de Datos

textattr(YELLOW + BLINK); textbackground(BLACK); cprintf(" o hay nodos en el rbol "); indow(1,1,80,25); // crea otra vez el rea (ventana) de tamao original getch(); continue;

} // fin if switch(opcion){ case 6: //Seleccion Insertar clrscr(); gotoxy(2,2); cout "Ingrese elemento a insertar [0 : 99]: "; gets(dato); for(i 0;i strlen(dato);i++) if( isdigit(dato[ i ])){ cout ("\nDato invlido"); getch(); goto nuevo; // regresa a ejecutar desde el punto llamado nuevo } // fin if elemento atoi(dato); //convierte la cadena en numero entero if(elemento 0 || elemento>99){ cout "\nDato desbordado"; getch(); break; } insertar(&raiz, elemento); break; case 8: //Seleccion Eliminar clrscr(); cout ("\nIngrese elemento a eliminar [0 : 99]: "); gets(dato); for(i 0;i strlen(dato);i++) if(!isdigit(dato[i])){ cout "\nDato invlido"; getch(); goto nuevo; // regresa a ejecutar desde el punto llamado nuevo } elemento atoi(dato); if(elemento 0 || elemento>99){ cout "\nDato desbordado"; getch(); break; } buscar(raiz, elemento, &valor); if(valor 1){ // valor 1 indica que s se encuentra raiz eliminar( raiz, elemento); cout "\n odo eliminado con xito\n"; getch(); } break; case 10://Seleccion Inorden clrscr(); cout "El rbol inorden es: "; inorden(raiz); getch(); break; case 12://Seleccion Preorden clrscr(); Pereda Castillo Aldo S. - 121

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas cout "El rbol preorden es: "; preorden(raiz); getch(); break; case 14://Seleccion PostOrden clrscr(); cout "El rbol postorden es: "; getch(); break;

Estructura de Datos

postorden(raiz);

case 16://Seleccion Graficar clrscr(); // Inicializa el modo grafico initgraph(&gdriver, &gmode, "C:\\tc\\bgi"); coderror graphresult(); if (coderror ! grOk) // Ocurri un error en el Modo Grfico { cout "\nOCURRIO ERROR: " grapherrormsg(coderror); cout "\nPulse una tecla para CERRAR el programa"; getch(); } else // o hay error { setcolor(10); // establece el color a verde claro (Ver Ayuda del programa) rectangle(5,5,500,40); // Dibuja un rectngulo rectangle(10,10,495,35); outtextxy(20,20,"EDA - REPRESE TACIO GRAFICA DEL ARBOL BI ARIO DE BUSQUEDA"); dibujar(raiz, 15, 3, 7, 0); outtextxy(10,450,"Pulse cualquier tecla para continuar..."); getch(); cleardevice( ); closegraph( ); break; } case 18: exit(0); //Termina el programa }//fin switch } //fin for } // FI MAI /******************************************************************************************* SUB RUTINAS ********************************************************************************************/ // subrutinas del TAD ARBOL ptrnodoar crearnodo(tipodato elemento) { // Permite crear el nodo: reserva y asigna memoria ptrnodoar nuevo; nuevo (ptrnodoar) ; if (nuevo! ULL){ nuevo->info .; nuevo->izq ; .; } return nuevo; } //fin crearnodo //******************************************************************************************* void insertar(ptrnodoar *raiz, tipodato elemento) { //Permite insertar el nodo en la posicin adecuada (recursiva) if( raz ULL) //La primera vez, cuando est vaco Pereda Castillo Aldo S.

- 122 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas


Estructura de Datos

raiz crearnodo(elemento); else if(elemento ( raiz)->info) insertar(& (*raiz)->izq, elemento); else if(elemento > ( raiz)->info) . ; else { cout ("\n o puede insertar: valor duplicado\n\n"); getch(); } }// fin insertar //******************************************************************************************* void inorden(ptrnodoar raiz) { //Recorrido inorden (Recursivo) if(raiz! ULL){ inorden(raiz->izq); cout raiz->info " - "; inorden(raiz->der); } } // fin inorden //******************************************************************************************* void preorden(ptrnodoar raiz){ if(raiz! ULL){ cout raiz->info " - "; preorden(raiz->izq); .; } } // fin preorden //******************************************************************************************* void postorden(ptrnodoar raiz){

} // fin postorden //******************************************************************************************* void buscar(ptrnodoar ., tipodato , int *valor) { if(raiz! ULL){ if((raiz)->info elemento) valor 1; else{ if(elemento (raiz)->info) buscar((raiz)->izq, .); else .; } } else{ cout "\nDato no encontrado\n"; getch(); } } // fin buscar //******************************************************************************************* ptrnodoar eliminar(ptrnodoar raiz, tipodato elemento) { ptrnodoar p1, p2; if(elemento raiz->info){ if(raiz->izq raiz->der){ free(raiz); return( ULL); Pereda Castillo Aldo S.

- 123 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas }

Estructura de Datos

else if(raiz->izq p1 raiz->der; free(raiz); return(p1); }


else{ p2 raiz->der; p1 raiz->der; while(p1->izq) p1 p1->izq; p1->izq raiz->izq; free(raiz); return(p2); } } if(raiz->info elemento) raiz->der=eliminar(raiz->der, elemento); else raiz->izq=eliminar(raiz->izq, elemento); return(raiz); } // fin eliminar //******************************************************************************************* void dibujar(ptrnodoar raiz, int a, int b, int c, int d) { //Dibuja en modo grafico el rbol BB correspondiente char numcad[4]; if(raiz! ULL){ itoa(raiz->info,numcad,10); //convierte el numero en cadena setcolor(WHITE); circle(250+a,75+b,14); // Dibuja un circulo setcolor(YELLOW); //Establece el color a amarillo outtextxy(245+a,71+b,numcad); // Muestra el valor del nodo (info) setcolor(WHITE); //Establece el color a blanco if(d 1) line(250+a+pow(2,c+1),b+14,250+a,61+b); // Dibuja la lnea izquierda else if(d 2) line(250+a-pow(2,c+1),b+14,250+a,61+b); // Dibuja la lnea derecha dibujar(raiz->izq,a-pow(2,c) pow(2,d-4),b+75,c-1,1); dibujar(raiz->der,a+pow(2,c)+pow(2,d-4),b+75,c-1,2);} } // fin dibujar // subrutinas de pantalla void barra(void){ // Muestra una barra de estado gotoxy(1,25); textattr(WHITE); textbackground(BLUE); cprintf("F10 -> SALIR "); gotoxy(49,25); textcolor(WHITE); cprintf(" ARBOL 1.0 (C)opyright 2011 "); Pereda Castillo Aldo S. - 124

else if(raiz->der p1 raiz->izq; free(raiz); return(p1); }

ULL){

ULL){

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas gotoxy(1,1); textcolor(WHI E); textbackground(RED); cprintf(" Utilice las teclas cursoras para desplazarse."); gotoxy(48,1); textcolor(WHI E); cprintf(" Enter para aceptar su opcin.");

Estructura de Datos

void re uadro void { //Muestra el Men Principal int i; textbackground(RED); clrscr(); textcolor(BLACK); textbackground(CYAN); gotoxy(23,4); cprintf("****** Men Principal ******"); for(i=0;i<16;i++){ // Crea el borde con * gotoxy(23,i+5); textbackground(CYAN); cprintf("* *"); gotoxy(23,20); cprintf("******* rboles 1.0 ********"); textcolor(WHI E); textbackground(RED); gotoxy(28,6); cprintf(" Insertar "); en blanco gotoxy(28,8); cprintf(" Eliminar "); gotoxy(28,10); cprintf(" Inorden "); gotoxy(28,12); cprintf(" Preorden "); gotoxy(28,14); cprintf(" Postorden "); gotoxy(28,16); cprintf(" Graficar "); gotoxy(28,18); cprintf(" Salir "); barra(); } //

int menu { //Muestra el Menu Principal y permite seleccionar alguna opcin con las teclas cursoras //Retorna la posicin del cursor, segn la opcin seleccion ada int pos=6; //es la posicin de fila del cursor: 6, 8, 10, 12, 14, 16 o 18 (segn men) char tecla; recuadro(); for ; ; { switch(pos){ //pos: Posicin de Fila del cursor case 6 : gotoxy(28,pos); textcolor(YELLOW); textbackground(BLACK); Pereda Castillo Aldo S.

} //

// Escriba tal y conforme lo ve, es decir, con los espacios


Los espacios en blanco deben ingresarse, es til para poder ver el texto con color de fondo. Todos las opciones deben tener el mismo tamao (ancho) Aqu y ms adelante

- 125 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas cprintf(" Insertar "); tecla getch(); //lee la tecla pulsada textcolor(15); textbackground(4); gotoxy(28,pos); cprintf(" Insertar "); break; case 8 : gotoxy(28,pos); textcolor(YELLOW); textbackground(BLACK); cprintf(" Eliminar "); tecla getch(); textcolor(15); textbackground(4); gotoxy(28,pos); cprintf(" Eliminar "); break; case 10 : gotoxy(28,pos); textcolor(YELLOW); textbackground(BLACK); cprintf(" Inorden "); tecla getch(); textcolor(15); textbackground(4); gotoxy(28,pos); cprintf(" Inorden "); break; case 12 : gotoxy(28,pos); textcolor(YELLOW); textbackground(BLACK); cprintf(" Preorden "); tecla getch(); textcolor(15); textbackground(4); gotoxy(28,pos); cprintf(" Preorden "); break; case 14 : gotoxy(28,pos); textcolor(YELLOW); textbackground(BLACK); cprintf(" Postorden "); tecla getch(); textcolor(15); textbackground(4); gotoxy(28,pos); cprintf(" Postorden "); break; case 16 : gotoxy(28,pos); textcolor(YELLOW); textbackground(BLACK); cprintf(" Graficar "); tecla getch(); textcolor(15); textbackground(4); gotoxy(28,pos); Pereda Castillo Aldo S.

Estructura de Datos

- 126 -

Universidad Csar Vallejo Piura Escuela de Ingeniera de Sistemas cprintf(" Graficar break; ");

Estructura de Datos

case 18 : gotoxy(28,pos); textcolor(YELLOW); textbackground(BLACK); cprintf(" Salir "); tecla getch(); textcolor(15); textbackground(4); gotoxy(28,pos); cprintf(" Salir "); break; } switch(tecla){ case 0x48 : pos pos-2; // 0x48 es el cdigo (en Hexadecimal) de Flecha Arriba if(pos 4) pos 18; break; // 0x50 es el cdigo de Flecha Abajo case 0x50 : pos pos+2; if(pos 17) pos 3; break; case 0x0d : return pos; // 0x0d es el cdigo de Enter case 0x44 : // 0x44 es el cdigo de F10 exit(0); //Salir sin error }//fin switch tecla } // fin for } // fin menu //*******************************************************************************************

Pereda Castillo Aldo S.



 

- 127 -

También podría gustarte