Asignatura: Catedrtico: Ing. Carol Rojas Moreno Huancayo-Per 2008-II 2 Ing. Carol Rojas Moreno INTRODUCCCION En la actualidad, la exigencia competitiva exige profesionales que se distingan no solamente por elaborar sistemas de informacin satisfactoriamente, sino haciendo uso de mtodos y fundamentos que le permitan superar con xito las pruebas y control de calidad de los mismos, para ello se requiere conocimientos necesarios en las tcnicas y estructuras de datos para la programacin, en este caso basada en el enfoque estructurado, requeridos en su formacin bsica para poder desarrollar programas y sistemas de informacin en posteriores niveles avanzados. Ing. Carol Rojas Moreno 3 4 Ing. Carol Rojas Moreno MAPA CONCEPTUAL ALGORITMIA Y ESTRUCTURA DE DATOS Ing. Carol Rojas Moreno 5 ESTRUCTURA DE DATOS ESTRUCTURA DE DATOS ESTTICAS se definen ESTRUCTURA DE DATOS DINMICAS ARREGL OS REGISTR OS CLASES LISTAS PILAS COLAS ARBOLE S GRAFO S ALGORITMOS ACTUALIZACIO N DE DATOS REPORTE DE DATOS INGRESO DE DATOS ELABORACION DE PROGRAMAS como como ienen !"#" o!e#"# en $ERRAMIENTAS DE %ROGRAMACI&N ESTRUCTURADA T'CNICAS DE %ROGRAMACI&N ( ESTRUCTURA DE DATOS im!)emen"n cons" * Ing. Carol Rojas Moreno INDICE Pag. MAPA CONCEPTUAL UNIDAD 1: ALGORITMOS Y PROGRAMACIN ESTRUCTURADA !ntroduccin "# $lgoritmo "" %epresentacin del $lgoritmo "& Programacin Estructurada "' (entencias )sicas de Programacin "* (entencia (ecuencial "* (entencia (electiva +& (entencia %epetitiva &+ UNIDAD 2: MODULARIZACION EN LA PROGRAMACIN ESTRUCTURADA !ntroduccin '+ ,unciones y Procedimientos '& -ibrer.as de Programacin creadas por el usuario " /ema 01 #2 ,unciones %ecursivas & UNIDAD 3: ESTRUCTURAS DE DATOS !ntroduccin 3 Estructuras de 4atos 5 Estructuras de 4atos Estticas 5 $rreglos 6nidimensionales 5 $rreglos )idimensionales *' %egistros 37 6niones 35 Programacin 8rientada a 8b9etos 5" Estructuras de 4atos 4inmicas 5& Punteros 5& Estructuras de 4atos 4inmicas -ineales 53 -istas Enlazadas 53 :olas "# Pilas "#* Estructuras de 4atos 4inmicas 0o -ineales ""# $rboles ""# $rboles )inarios "" $rboles )inarios de );squeda "" <rafos ""5 UNIDAD 4: FICHEROS (ARCHIVOS) !ntroduccin "+' ,icheros =$rchivos> "+ Ing. Carol Rojas Moreno + , Ing. Carol Rojas Moreno UNIDAD N 01 ALGORITMOS Y PROGRAMACIN ESTRUCTURADA COMPETENCIA DE LA UNIDAD !"#$ $l trmino dela unidad se espera que el alumno elabore algoritmos con su respectiva representacin y cdigo escrito en un lengua9e de programacin, usando las sentencias bsicas de programacin. P%&% '"#$ Para permitir la construccin de programas de computadora sobre algoritmos conocidos en el mundo real. P(& '"#$ Esto le permitir diferenciar los algoritmos que se pueden codificar y los que no lo necesitan, formalizando de esta manera los conocimientos previos sobre programas de computadora. C)*($ (e propondr e9ercicios basados en contexto reales, para desarrollar el algoritmo de solucin y su codificacin en un lengua9e de programacin. Ing. Carol Rojas Moreno - ALGORITMOS Y PROGRAMACIN ESTRUCTURADA INTRODUCCION El algoritmo es una solucin ordenada a un problema definido, que puede ser elaborado como un con9unto de l.neas de instruccin, llamado programa, que a su vez el con9unto de programnas conforman un sistemna de informacin automatizado. El algoritmo computacional posee caracteristicas importantes como el de ser ordeando, finito y eficiente, adems de contar con fromas de reprenetacin. -as representaciones mas conocidas de un algortmo computacional son el Pseudocodigo, que es una escritura seme9ante al lengua9e natural, el 4iagrama de ,lu9o Estructurado y el 4iagrama de 0assi?(chneiderman. El programa es el algoritmo escrito en un lengua9e de progrqamacin, y desde la perspectiva de la ingenieria de softr@are, existen dos enfoques que otorgan sus herramientas y tcnicas para elaborar programas, estos enfoques son el Enfoque 8rientado a 8b9etos y el Enfoque Estructurado. -a programacin desde el enfoque estructurado permite concoer con facilidad sus tcnicas de programacin2 (entencias )sicas de Programacin2 (ecuenciales, (electivas y %epetitivas. ./ Ing. Carol Rojas Moreno ALGORITMO 1+ A,-(&./*( -a palabra algoritmo se di en honor del matemtico persa del siglo !A, Bho@CrizmD. 6n algoritmo es un con9unto ordenado y finito de instrucciones que conducen a la solucin de un problema. Por e9emplo2 E $l instalar un equipo de sonido e9ecutamos las instrucciones =algoritmo> contenidas en el manual del equipo. E $lgoritmo matemtico de Euclides para la obtencin del mximo com;n divisor de dos n;meros. (i un algoritmo puede ser e9ecutado por una computadora, se dice que es un %,-(&./*( 0(*1"/%0.(2%,F en caso contrario, se dice que es un %,-(&./*( 2( 0(*1"/%0.(2%,. Para que un algoritmo sea computacional se debe expresar en instrucciones atraves de un lengua9e de programacin, teniendo como resultado un programa. /odo algoritmo puede ser descompuesto en tres partes2 Entrada de datos. Proceso. (alida de resultados. En cada uno de ellos se necesita el uso de variables2 V%&.%3,4: Es una localizacin o casillero en la memoria principal que almacena un valor que puede cambiar en el transcurso de la e9ecucin del programa. /iene un 2(*3&4, un /.1( 54 5%/( y un 6%,(&. $ntes de poder utilizar una variable es necesario declararla especificando su nombre y su tipo de dato. E9emplo "2 Entero edad E9emplo +2 %eal peso, talla Ing. Carol Rojas Moreno .. %ROCESO E D"os S Res0)"do 2+ C%&%0/4&78/.0%8 54 "2 %,-(&./*( S4& 1&40.8(2 los pasos del algoritmo deben desarrollarse en un orden estricto, ya que el desarrollo de cada paso debe obedecer a un orden lgico. S4& 549.2.5(. en el rea de programacin, el algoritmo se desarrolla como paso fundamental para desarrollar un programa. El computador solo desarrollar las tareas programadas y con los datos suministradosF no puede improvisar el dato que necesite para realizar un proceso. S4& 9.2./(2 implica que el n;mero de pasos de un algoritmo, por grande y complicado que sea el problema que soluciona, debe ser limitado, es decir debe llegar a un final. P&4842/%0.)2 9(&*%,2 para que el algoritmo sea entendido por cualquier persona interesada es necesario que se exprese en alguna de las formas com;nmente aceptadasF si no puede no ser muy ;til ya que solo lo entender quien lo diseG. -as formas de presentacin de algoritmos son2 el pseudocdigo, diagrama de flu9o y diagramas de 0assi?(chneiderman, entre otras. C(&&400.)22 el algoritmo debe ser correcto, debe solucionar el problema para el cual fue diseGado. Para garantizar que el algoritmo logre el ob9etivo, es necesario ponerlo a prueba2 verificacin o prueba de escritorio. E9.0.420.%2 es evaluar los recursos que requiere para almacenar datos y para e9ecutar operaciones frente al beneficio que ofrece. En cuanto menos recursos requiere ser ms eficiente el algoritmo. 3+ I28/&"00.(248 A,-(&7/*.0%8 :;8.0%8 Existen tres instrucciones algor.tmicas bsicas que son las siguientes 1+ E2/&%5% :onsiste en obtener un dato de un dispositivo de entrada, como el teclado, y almacenarlo en una variable. En general, la accin de ingresar un dato a una 6%&.%3,4 se expresa en el pseudocdigo mediante la palabra LEER, de la siguiente forma2 LEER variable E9emplo2 LEER edad 2+ S%,.5% :onsiste en mostrar el valor de una variable en un dispositivo de salida, como la pantalla. En general, la accin de mostrar el valor de una 6%&.%3,4 se expresa en el pseudocdigo mediante la palabra IMPRIMIR =E(:%!)!%> de la siguiente forma2 IMPRIMIR variable E9emplo2 IMPRIMIR /otal:ompra 3+ A8.-2%0.)2 :onsiste en dar a una 6%&.%3,4 el valor de una 4<1&48.)2. -a asignacin se expresa en el pseudocdigo de la siguiente forma2 variable H expresin o variable expresin 4onde 6%&.%3,4 y el valor de 4<1&48.)2 deben tener el mismo tipo de dato. E9emplo2 resultado numero" I numero + .2 Ing. Carol Rojas Moreno REPRESENTACIN DEL ALGORITMO ". Pseudocdigo2 es la representacin del algoritmo en lengua9e natural. E9emplo2 sumar dos n;meros enteros. !0!:!8 entero numero", nuemro+, resultado -eer numero" -eer numero+ resultado numero" I numero + Escribir JEl resultado de la suma es2 K Escribir resultado ,!0 +. 4iagrama de ,lu9o Estructurado2 representacin con flu9os entre los procesos a realizar. -os principales s.mbolos de representacin para este diagrama son.
&. 4iagrama 0E(2 representacin en bloques, es decir cada uno de los procesos como ingreso?salida de datos, decisiones, acciones, repeticionesF estn representados en bloques de tareas consecutivos. Ing. Carol Rojas Moreno .3 !0!:!8 4eclaracin de variables -ectura de 4atos $ccin " $ccin + $ccin n %eporte de 4atos ,!0 InicioFin !el algori"#o Procesos !el algori"#o En"a!aSali!a Es"$n!ar !e Da"os !el algori"#o Fl%jo !e recorri!o en"re Procesos !el algori"#o P%n"o !e Decisi&n !el algori"#o S%'r%"inas en el algori"#o Conec"or !el algori"#o en la #is#a (oja Conec"or !el algori"#o en o"ra (oja PROGRAMACIN ESTRUCTURADA 1+ P&(-&%*% (ecuencia de instrucciones que especifican las operaciones que debe realizar la computadora, en la cual cada paso del algoritmo est expresado por medio de una instruccin. 2+ L42-"%=48 54 P&(-&%*%0.)2> T.1(8 a. -engua9e Lquina b. -engua9e de )a9o 0ivel c. -engua9e de $lto 0ivel 3+ P&(-&%*%8 T&%5"0/(&48 /raducen los programas fuente de a cdigo mquina. Pueden ser2 ". !ntrpretes 2 es un traductor que toma un programa fuente, lo traduce y a continuacin lo e9ecuta. +. :ompilador 2 es un traductor que toma un programa fuente, y lo traduce sentencia por sentencia. -a compilacin es el proceso de traduccin del programa fuente a programa ob9eto =traducido a cdigo mquina>, a travs de un programa enlazador, para conducir al programa e9ecutable. .4 Ing. Carol Rojas Moreno P%8<%$L$ ,6E0/E !0/E%P%E/E P%8<%$L$ EME:6/$)-E P%8<%$L$ ,6E0/E :8LP!-$48% P%8<%$L$ 8)ME/8 P%8<%$L$ ,6E0/E :8LP!-$48% =/raductor> P%8<%$L$ 8)ME/8 Ing. Carol Rojas Moreno .5 P%8<%$L$ E0-$N$48% P%8<%$L$ EME:6/$)-E 4+ P&(-&%*%0.)2 E8/&"0/"&%5% :on9unto de tcnicas para escribir, verificar, depurar, y mantener los programas, es una metodolog.a de desarrollo de programas llamada refinamientos sucesivos2 se plantea una operacin como un todo y se divide en segmentos ms sencillos o de menor comple9idad. 6na vez terminado todos los segmentos del programa, se procede a unificar las aplicaciones, esta integracin debe ser sencilla. -a representacin grafica de la programacin estructurada se realiza a travs de diagramas de flu9o o flo@ chart, 4iagramas 0E(, el cual representa el programa con sus entradas, procesos y salidas. El con9unto de tcnicas para este enfoque son2 1+ R40"&8(8 A38/&%0/(8 4escomponer una determinada accin comple9a en acciones ms simples, para ser e9ecutadas y que sern instrucciones. 2+ D.84?( D48042542/4 El problema se descompone en niveles o pasos sucesivos2 que hace? como lo hace? 3+ E8/&"0/"&%8 3;8.0%8 (on estructuras de control para el programa2 E (ecuenciales E (electivas E %epetitivas Oste con9unto de tcnicas permite elaborar programas en cualquier lengua9e de programacin. -as estructuras bsicas mencionadas sern desarrolladas mas adelante en otras sesiones de clase. 4+ R48(,"0.)2 54 "2 P&(3,4*% -os siguientes pasos propuestos para la resolucion de problemas estan basados en el :iclo de Pida :lsico en la :onstruccin de un (oft@are. ". $nlisis del Problema +. 4iseGo del $lgoritmo &. Expresar el algoritmo en un programa. '. E9ecucin y Palidacin del programa. .* Ing. Carol Rojas Moreno Que hace :omo hace E=4*1,( P&(1"48/( 6na 6niversidad necesita implementar una $ula Pirtual para cursos de extensin, en la cual una persona se %egistra como alumno ingresando un deposito de cuenta por el costo total de los cursos que desea llevar, ingresando sus datos personales y su correo electrnico, e indicando los cursos a llevar. :uando es aceptado como alumno =comprobando el monto del deposito con el costo de los cursos>, se le env.a a su correo electrnico el nombre de usuario =el cual es la misma direccin de eEmail2 e9em2 9uangarciaRhotmail> y cuyo pass@ord es el login =e9em2 9uangarcia> El alumno ingresa al aula virtual donde encontrar una seccin con la descripcin por curso y el material necesario para desarrollar el curso. El alumno es autoevaluado en una fecha correspondiente. $plicar las tcnicas2 %ecurso $bstracto2 4iseno 4escendente2 Ing. Carol Rojas Moreno .+ SENTENCIAS :@SICAS DE PROGRAMACIN -as sentencias de programacin a utilizar es una las tcnicas de programacin del enfoque estructurado2 E8/&"0/"&%8 :;8.0%8+ Recordando: son estructuras bsicas de control para el programa2 E (imples o (ecuenciales E (electivas E %epetitivas R41&4842/%0.)2 54, A,-(&./*( 42 0%5% E8/&"0/"&% :;8.0% 1+ E8/&"0/"&% :;8.0% S.*1,4 ( S40"420.%,: es una estructura paso a paso, sin bifurcaciones ni repeticionesF donde la salida de un proceso es entrada para otro. 4iagrama de ,lu9o 4iagrama 0E( !0!:!8 4eclaracin de variables -ectura de 4atos $ccin " $ccin + $ccin n %eporte de 4atos ,!0 E9emplo2 :alcular el rea de un tringulo. $rea H =base S altura> ? + ., Ing. Carol Rojas Moreno INICIO Declaraci&n !e )aria'les Lec"%ra !e Da"os Acci&n * Acci&n n FIN Acci&n + Re,or"e !e Da"os (olucin2 4iagrama de ,lu9o 4iagrama 0E( !0!:!8 real base, altura, $rea -eer base -eer altura $rea =base S altura> ? +F Escribir KEl valor del rea para el tringulo es2 K Escribir $rea ,!0 :digo en :2 #include<iostream> using namespace std; Ing. Carol Rojas Moreno .- -eyenda de 4atos base2 valor de la base del tringulo altura2 valor de la altura del triangulo $rea2 valor del resultado del clculo del rea del tringulo INICIO real 'ase- al"%ra- Area Leer 'ase FIN Area .'ase / al"%ra0 + Escri'ir Area Leer al"%ra Escri'ir 1El 2alor !el $rea ,ara el "ri$ng%lo es3 4 int main( ) { float base, altura, Area; cout<<Ingrese valor de la base: ; cin>>base; cout<<\n; //Salto de lnea cout<<Ingrese valor de la altura: ; cin>>altura; cout<<\n; Area = (base * altura) / 2; cout<<El valor del rea para el tringulo es: ; cout<<Area; cout<<\n; return 0; } TRA:AAO APLICATIVO Elaborar el Pseudo cdigo, 4iagrama de ,lu9o y 4iagrama 0E( respectivo para2 ". -a presin, el volumen y la temperatura de una masa de aire se relacionan por la formula2 Lasa H =presin S volumen>?=#.&* S =temperatura I '7#>> :alcular la masa respectiva. +. Escribir un programa que convierta una distancia medida en pulgadas a cent.metros. =" pulg H +.' cm.> &. :alcular el numero de pulsaciones que una persona debe tener por cada "# segundos de e9ercicio, si la formula es2 0umTpulsaciones H =++# E edad>?"# '. En un hospital existen tres reas2 <inecolog.a, Pediatr.a, /raumatolog.a. El presupuesto anual del hospital se reparte conforme a la siguiente tabla2 rea Porcentaje del presupuesto i. <inecolog.a '#U 2/ Ing. Carol Rojas Moreno Con! * ii. /raumatolog.a &#U iii. Pediatr.a &#U 8btener la cantidad de dinero que recibir cada rea, para cualquier monto presupuestal. 4+ E8/&"0/"&% :;8.0% S4,40/.6%: es una estructura que tiene un punto de decisin para realizar un con9unto de acciones. Pueden ser2 E E. ). (electiva (imple E E. ). (electiva :ompuesta E E. ). (electiva $nidada E E. ). (electiva L;ltiple a. Estructura )sica (electiva (imple2 se tiene un punto de decisin que eval;a una condicin y si es Perdadero, e9ecuta un con9unto de $cciones. 4iagrama de ,lu9o 4iagrama 0E( !0!:!8 4eclaracin de variables -ectura de 4atos
Ing. Carol Rojas Moreno 2. INICIO Declaraci&n !e )aria'les Lec"%ra !e Da"os Acci&n n FIN Acci&n * Re,or"e !e Da"os Con! * 1 F P , $ccin " $ccin + $ccin n %eporte de 4atos ,!0 E9emplo2 (umar dos n;meros enteros positivos c H a I b (olucin2 4iagrama de ,lu9o
4iagrama 0E( 22 Ing. Carol Rojas Moreno -eyenda de 4atos a2 valor del primer numero entero positivo b2 valor del segundo numero entero positivo c2 valor del resultado la suma de dos n;meros a y b en"ero a- '- c Leer a - ' FIN c a 5 ' Escri'ir 1El 2alor !e la s%#a es4 - c a 67 88 '67 1 F INICIO :digo :2 #include<iostream> using namespace std; int main( ) { float a, b, c; cout<<Ingrese primer nmero: ; cin>>a; cout<<\n; cout<<Ingrese segundo nmero: ; cin>>b; cout<<\n; if (a>0 && b>0) { c = a + b; cout<<El valor la suma es: ; cout<<c; cout<<\n; } return 0; Ing. Carol Rojas Moreno 23 !0!:!8 entero a, b, c -eer a , b a V# WW bV# P , c a I b Escribir JEl valor la suma es2 K , c ,!0 } 24 Ing. Carol Rojas Moreno Con! * b. Estructura )sica (electiva :ompuesta2 se tiene un punto de decisin que eval;a una condicin y si es Perdadero, e9ecuta un con9unto de $cciones, y si es ,alsa e9ecuta otro con9unto de acciones. 4iagrama de ,lu9o 4iagrama 0E( !0!:!8 4eclaracin de variables -ectura de 4atos
P , $ccin " $ccin + X X. $ccin n $ccin m %eporte de 4atos ,!0 Ing. Carol Rojas Moreno 25 INICIO Declaraci&n !e )aria'les Lec"%ra !e Da"os Acci&n n FIN Acci&n * Re,or"e !e Da"os Con! * 1 F Acci&n # Acci&n + E9emplo2 (umar dos n;meros enteros si son positivos, sino multiplicarlos. (olucin2 4iagrama de ,lu9o 4iagrama 0E( 2* Ing. Carol Rojas Moreno !0!:!8 entero a, b, c -eer a , b a V# WW bV# P , c a I b c a S b Escribir JEl valor la suma es2 K , c Escribir JEl valor la multiplicacin es2 K , c ,!0 INICIO en"ero a- '- c Leer a - ' FIN c a 5 ' Escri'ir 1El 2alor !e la s%#a es 4 - c a 67 88 '67 1 F c a / ' Le9en!a !e Da"os a3 2alor !el ,ri#er n%#ero en"ero ,osi"i2o '3 2alor !el seg%n!o n%#ero en"ero ,osi"i2o c3 2alor !el res%l"a!o la s%#a o #%l"i,licaci&n !e !os n:#eros a 9 ' Escri'ir 1El 2alor !e la #%l"i,licacion es 4 - c :digo :2 #include<iostream> using namespace std; void main( ) { int a, b, c; cout<<Ingrese primer nmero: ; cin>>a; cout<<\n; cout<<Ingrese segundo nmero: ; cin>>b; cout<<\n; if(a>0 && b> 0) { c = a + b; cout<<El valor la suma es: ; cout<<c; cout<<\n; } else { c = a * b; cout<<El valor la multiplicacion es: ; cout<<c; cout<<\n; } } Ing. Carol Rojas Moreno 2+ b. Estructura )sica (electiva $nidada2 se tiene un punto de decisin que eval;a una condicin y si es Perdadero, e9ecuta un nuevo punto de decisin y as. sucesivamente, y si es ,alsa e9ecuta otro con9unto de acciones. 4iagrama de ,lu9o 2, Ing. Carol Rojas Moreno INICIO Declaraci&n !e )aria'les Lec"%ra !e Da"os Acci&n n FIN Acci&n * Re,or"e !e Da"os Con! * 1 F Acci&n # Acci&n + Con! + 1 F Con! * 4iagrama 0E( !0!:!8 4eclaracin de variables -ectura de 4atos
, P $ccin + P , X $ccin " X X. $ccin m $ccin n %eporte de 4atos ,!0 E9emplo2 !ngresar un n;mero entero y si es positivo y diferente de cero, reportar si se encuentra entre los diez primeros n;meros. (olucin2 4iagrama de ,lu9o 4iagrama 0E( Ing. Carol Rojas Moreno 2- Con! + En"ero a Leer a FIN a 6 7 1 F a6;* 88 a6*7 1 F INICIO -eyenda de 4atos a2 valor del numero entero Escri'ir 1No es %n n:#ero #a9or <%e cero4 Escri'ir 1Pri#eros *74 Escri'ir 1Son #as !e los ,ri#eros *74 F 1 F 1 !0!:!8 entero a -eer a a V # Escribir J0o es un n;mero mayor que ceroK aVH" WW aV"# Escribir J(on mas de los primeros "#K Escribir JPrimeros "# ,!0 :digo :2 #include<iostream> using namespace std; int main( ) { int a; cout<<Ingrese nmero: ; cin>>a; if(a>0) if(a>=1 && a<10) cout<<Primeros 10; else cout<<Son ms de los primeros 10; else cout<<No es un nmero mayor que cero; return 0; } 3/ Ing. Carol Rojas Moreno Con! * 3 2 . 2 3 c. Estructura )sica (electiva L;ltiple2 se tiene un punto de decisin que eval;a mas de dos alternativas para realizar un con9unto de acciones. 4iagrama de ,lu9o 4iagrama 0E( !0!:!8 4eclaracin de variables -ectura de 4atos
default $ccin " $ccin + $ccin & $ccin ' X X X X $ccin n $ccin m $ccin m $ccin m %eporte de 4atos ,!0 E9emplo !ngresa cinco n;meros e imprime que vocal es. Ing. Carol Rojas Moreno 3. INICIO Declaraci&n !e )aria'les Lec"%ra !e Da"os Acci&n # FIN Acci&n + Re,or"e !e Da"os Con! * def"0) . Acci&n n Acci&n * Acci&n # Acci&n = Acci&n # Acci&n > Acci&n > 3 2 4 5 (olucin2 4iagrama de ,lu9o 4iagrama 0E( !0!:!8 entero num -eer num num " + & ' default Escribir JPocal $K Escribir JPocal EK Escribir JPocal !K Escribir JPocal 8K Escribir JPocal 6K Escribir J0o es PocalK ,!0 32 Ing. Carol Rojas Moreno en"ero n%# Leer n%# FIN n%# def"0) . Escri'ir 1)ocal A4 -eyenda de 4atos num2 valor del numero entero positivo INICIO Escri'ir 1)ocal E4 Escri'ir 1)ocal I4 Escri'ir 1)ocal O4 Escri'ir 1)ocal U4 Escri'ir 1No es )ocal4 :digo :2 #include<iostream> using namespace std; int main( ) { int num; cout<<Ingrese nmero: ; cin>>num; switch(num) { case 1: cout<<Vocal A; break; case 2: cout<<Vocal E; break; case 3: cout<<Vocal I; break; case 4: cout<<Vocal O; break; case 5: cout<<Vocal U; break; default: cout<<No es numero para una vocal; } return 0; } Ing. Carol Rojas Moreno 33 1 B+ E8/&"0/"&% :;8.0% R414/./.6%: es una estructura permite iterar o repetir un con9unto de acciones dada una condicin. Pueden ser2 E E. ). %epetitiva Lientras E E. ). %epetitiva YacerELientras E E. ). %epetitiva Para a. Estructura )sica %epetitiva Lientras2 primero eval;a una expresin condicional y si es verdadera permite realizar el con9unto de acciones y regresa evaluar nuevamente la expresin condicional, hasta que de9e de cumplir =,also>. 4iagrama de ,lu9o 4iagrama 0E( !0!:!8 4eclaracin de variables -ectura de 4atos :ond " $ccin " X. $ccin n $ccin + %eporte de 4atos ,!0 E9emplo en :digo :2 !mprimir la serie ,ibonacci, menor a un l.mite dado2 #,",",+,&,,3,"&,X. #include<iostream.h> 34 Ing. Carol Rojas Moreno INICIO Declaraci&n !e )aria'les Lec"%ra !e Da"os Acci&n n FIN Acci&n * Con! * F Acci&n + 1 F int main( ) { int lim, a=0, b=1,c; cout<<Ingrese lmite: ; cin>>lim; cout<<a; while(b<lim) { cout<<b; c=a+b; a=b; b=c; } return 0; } b. Estructura )sica %epetitiva Yacer E Lientras2 realiza al menos una vez un con9unto de acciones, y luego eval;a una expresin condicional, si es Perdadero regresa a repetir el con9unto de acciones, si no cumple, sale del bucle. 4iagrama de ,lu9o 4iagrama 0E( !0!:!8 Ing. Carol Rojas Moreno 35 INICIO Declaraci&n !e )aria'les Lec"%ra !e Da"os Acci&n n FIN Acci&n * Re,or"e !e Da"os Con! * Acci&n + 4eclaracin de variables -ectura de 4atos $ccin " X. $ccin n :ond + $ccin + %eporte de 4atos ,!0 E9emplo en :digo :2 (e tiene un (tocZ inicial, del cual se realizan ventas a n clientes, si la venta supera al stocZ, contar a los clientes insatisfechos. Lostrar la cantidad de clientes satisfechos, cantidad de clientes insatisfechos, /otal de ventas, y lo que queda en stocZ. El usuario debe indicar si desea continuar o no. #include<iostream> using namespace std; int main() { int n,m, cs=0,ci=0, venta=0; char ops,op; cout<<"-----Venta de Producto------"; cout<<"\n\n"; do{ do{ cout<<"Ingrese valor de stock inicial: "; cin>>n; }while(n<=0); do{ do{ cout<<"Ingrese venta: "; cin>>m; }while(m<=0); if(n>=m && m>0) { n=n-m; venta=venta+m; cs++; if(n>0) { cout<<"\n"; cout<<"Desea Continuar?"; cin>>ops; cout<<"\n"; } else break; } else { ci++; cout<<"\n"; cout<<"Es mayor q el stock actual "; cout<<"\n"; cout<<"Clientes Satisfechos: "; cout<<cs; cout<<"\n"; 3* Ing. Carol Rojas Moreno cout<<"Clientes Insatisfechos: "; cout<<ci; cout<<"\n"; cout<<"Total de Ventas: "; cout<<venta; cout<<"\n"; cout<<"Queda de Stock: "; cout<<n; cout<<"\n"; cout<<"---------------------------"; cout<<"\n\n"; cout<<"Desea Continuar?"; cin>>ops; cout<<"\n\n"; } }while(ops=='S' || ops=='s'); cout<<"------REPORTE FINAL------"; cout<<"\n"; cout<<"Clientes Satisfechos: "; cout<<cs; cout<<"\n"; cout<<"Clientes Insatisfechos: "; cout<<ci; cout<<"\n"; cout<<"Total de Ventas: "; cout<<venta; cout<<"\n"; cout<<"Queda de Stock: "; cout<<n; cout<<"\n"; cout<<"--------------------------"; cout<<"\n\n"; if(n==0) {cout<<"Se completo ultimo pedido, su stock actual es CERO"; cout<<"\n"; cs=0; ci=0; venta=0; cout<<"Desea Otro Stock Inicial? (s)"; cin>>op; } else break; }while(op=='S' || op=='s'); return 0; } Ing. Carol Rojas Moreno 3+ 1 F c. Estructura )sica %epetitiva Para2 permite repetir un con9unto de acciones, secuencialmente hasta llegar a un l.mite dado. 4iagrama de ,lu9o 3, Ing. Carol Rojas Moreno INICIO Declaraci&n !e )aria'les Lec"%ra !e Da"os Acci&n n FIN Iniciali?ar la 2aria'le !e recorri!o Re,or"e !e Da"os )aria'le recorri!o es #enor a l@#i"e Acci&n * DeAinir 2aria'le !e recorri!o 9 l@#i"e Incre#en"ar )aria'le !e Recorri!o Acci&n + 4iagrama 0E( !0!:!8 4eclaracin de variables -ectura de 4atos i H # F i [H limite F iII $ccin " X. $ccin n $ccin + %eporte de 4atos ,!0 E9emplo en :digo :2 :alcular el ,actorial de un n;mero. #include<iostream> using namespace std; int main( ) { int p=1; cout<<Ingrese numero para factorial: ; cin>>num; for(i=1;i<=num; i++) { p=p * i; } cout<<El factorial de <<n<<es: <<p; return 0; } Ing. Carol Rojas Moreno 3- TRA:AAO APLICATIVO Elabore el 4iagrama 0E ( y :digo :II para los sgtes. E9ercicios2 ". Encuentre el menor de tres n;meros dados. +. -ea un n;mero que represente un mes e indique de que mes se trata. &. 6na fbrica de /P necesita que le ayuden a controlar el mane9o de sus inventarios y pedidos de venta. :uando llega un pedido, un programa debe verificar si existe suficiente cantidad de /P en inventario. (i es as., debe reportar un mensa9e JPE4!48 :8LP-E/8Ky se debe dar la disminucin del inventario. $dems se necesita reportar2 El n;mero de /P que quedan en el inventario final. El n;mero de pedidos completos. El n;mero de pedidos incompletos. El n;mero de /P vendidos. El n;mero de /P que faltan para completar los pedidos incompletos. '. :alcular el n;mero de pulsaciones que debe tener una persona por cada "# segundos de e9ercicio aerbicoF la frmula que se aplica para el sexo femenino es 0umpulsH =++#Eedad>? "# y para el sexo masculino es 0umpulsH =+"#Eedad>? "# %epetir para n personas. . -ea un n;mero entero e indique cual es su d.gito mayor. 7. (uponga que tiene la calificacin final de un grupo de '# alumnos, calcular la calificacin promedio y la calificacin mas ba9a de todo el grupo. *. :uantos d.gitos pares y cuantos d.gitos impares tiene un n;mero entero. 3. En una universidad se pueden llevar hasta ++ crditos en un ciclo. Elabora el cdigo que permita a un alumno matricularse sen pasarse del l.mite. 5. 6na vendedora de pan tiene n unidades de pan al comenzar el d.a. (i cada cliente le pide m panes, cuantos clientes son atendidos completamente, cuantos panes quedan para el ultimo cliente\ "#. Elabore el cdigo para una tienda para leer por cada cliente el monto total de su compraF $l final del d.a reportar la cantidad total de ventas y el n;mero de clientes atendidos. "". 6n censador recopila datos del ;ltimo censo nacional, al final de un d.a desea conocer de las persona encuestadas el porcenta9e que tiene estudios de primaria, el porcenta9e que tiene estudios de secundaria, porcenta9e de carrera tcnica, porcenta9e de estudios profesionales, y porcenta9e con estudios de post grado. "+. En el congreso se realiza una encuesta con todos los integrantes, para determinar que porcenta9e de los n diputados est a favor del /-:, que porcenta9e en contra, y que porcenta9e se abstiene de opinar. 4/ Ing. Carol Rojas Moreno :I:LIOGRAFIA N AUTOR TITULO EDITORIAL " M8]$0E( $<6!-$%, -uis ,undamentos de Programacin Editorial Lc<ra@EYill, :olombia, +##&. + %$,,8 -E::$, Eduardo /urbo :II Lundigraf, -imaEPer;, +### Ing. Carol Rojas Moreno 4. 42 Ing. Carol Rojas Moreno UNIDAD N 02 MODULARIZACION EN LA PROGRAMACIN ESTRUCTURADA COMPETENCIA DE LA UNIDAD !"#$ $l trmino dela unidad se espera que el alumno elabore programas computacionales usando porciones de programas =mdulos> que luego se integran para diferentes proyectos de solucin. P%&% '"#$ Para permitir la reutilizacin de l.neas de cdio en la construccin de programas de computadora. P(& '"#$ Esto le permitir valorar la utilizacin de los mdulos de programa al brindar facilidad de mantenimiento, es decir, los cambios realizados en cada porcin de programa son indepenientes y no afecta al todo, ahorrando tiempo de elaboracin. C)*($ $ travs del uso de librer.as de cabecera =header>, se construirn los mdulos de programa, y sern invocados por cada proyecto de programa fuente. Ing. Carol Rojas Moreno 43 MODULARIZACION EN LA PROGRAMACIN ESTRUCTURADA INTRODUCCION $l conocer el uso de las sentencias bsicas de programacin, se puede dividir a un programa comple9o, en segmentos de programa mas simples =Lodularizacin>, y poder ser reutilizados en otros programas, a travs del uso de funciones y procedimientos, y en algunos casos usando el concepto de recursividad. -a ,uncin, es un tipo de mdulo de programa que permite devolver un valor hacia la l.nea de cdigo que la invoc, mientras que el Procedimiento que tambien es un mdulo de programa, no devuelve ning;n valor. El concepto de %ecursividad es la invocacin asi misma, tanto de una ,uncin como de un procedimiento, por lo que permite reutilizarse y disminuir la elaboracin de l.neas de cdigo. -os mdulos2 ,unciones y Procedimientos, pueden ser creados en el mismo proyecto de solucin =cdigo fuente> o en librer.as de cabecera, que permitirn su reutilizacin entre diferentes proyectos de solucin. -os programas computacionales que se desarrollan a partir de ahora, estarn basados en esta nueva tcnica de programacin, para optimizar el uso de recursos del computador y del usuario. 44 Ing. Carol Rojas Moreno FUNCIONES Y PROCEDIMIENTOS 1+ C(2041/( 54 M)5",( 54 P&(-&%*% En algunas ocasiones se debe llamar un bloque de cdigo mas de una vez, una forma de hacerlo es escribir las instrucciones tantas veces como se necesite, dando programas con exceso de cdigo y dificultad para descubrir posibles errores. -a otra forma es tener las instrucciones en subprogramas que se invocan cada vez que se necesiten. -os subprogramas son partes separadas de cdigo que e9ecutan tareas pequeGas de un programa principal. 2+ P%8( 54 P%&;*4/&(8 42 "2 M)5",( 54 P&(-&%*% P%&;*4/&(8 54 42/&%5% (6%,(&) -a diferencia de pasar parmetros por referencia respecto a parmetros por valor radica en que en estos ;ltimos se guarda en memoria una copia temporal de la variable, dentro del procedimiento solo se utiliza la copia, cuando se modifica el valor del parmetro solo afecta al almacenamiento temporal, la variable actual fuera del procedimiento nunca se toca. P%&;*4/&(8 54 42/&%5%C8%,.5% (&494&420.%) :uando se pasa una variable a un procedimiento como parmetro por referencia, los cambios que se efect;en sobre dicha variable dentro del procedimiento se mantienen incluso despus de que este haya terminado, es decir los cambios afectan al programa principal. E9emplo2 Ing. Carol Rojas Moreno 45 3+ P&(045.*.42/( (e utiliza para imprimir valores a ser utilizados en el programa. 4eclaracin2 void NombreProcedimiento= > void NombreProcedimiento =argumentos> 4+ F"20.)2 (e utilizan para retornar un valor a ser utilizado en el programa. 4eclaracin2 /ipoTdato NombreFuncin= > /ipoTdato NombreFuncin argumentos> (i se tiene el siguiente programa simple para sumar dos n;meros, sin utilizar ,unciones ni Procedimientos2 4* Ing. Carol Rojas Moreno //Programa Simple #include<iostream> using namespace std; void main() { int a,b,c; cout<<"Ingrese valor de a: \t"; cin>>a; cout<<"Ingrese valor de b: \t"; cin>>b; c=a+b; cout<<c; cout<<"\n"; } //Procedimientos con Argumentos: Ejemplo1 #include<iostream> using namespace std; void sumar(int a, int b) { int c; c=a+b; cout<<c; cout<<"\n"; } nt main() { int a,b; cout<<"Ingrese valor de a: \t"; cin>>a; cout<<"Ingrese valor de b: \t"; cin>>b; sumar(a,b); return 0; } :on Procedimientos2 Ing. Carol Rojas Moreno 4+ //Procedimientos sin Argumentos: Ejemplo2 #include<iostream> using namespace std; void sumar() { int a,b,c; cout<<"Ingrese valor de a: \t"; cin>>a; cout<<"Ingrese valor de b: \t"; cin>>b; c=a+b; cout<<c; cout<<"\n"; } int main() { sumar( ); return 0; } //Funciones con Argumentos: Ejemplo1 #include<iostream> using namespace std; int sumar(int a, int b) { int c; c=a+b; return c; } int main() { int sum,a,b; cout<<"Ingrese valor de a: \t"; cin>>a; cout<<"Ingrese valor de b: \t"; cin>>b; sum=sumar(a,b); cout<<"Valor de la suma de a y b: "<<sum; cout<<"\n"; return 0; } :on ,unciones2 4, Ing. Carol Rojas Moreno //Funciones sin Argumentos: Ejemplo2 #include<iostream> using namespace std; int sumar() { int a,b,c; cout<<"Ingrese valor de a: \t"; cin>>a; cout<<"Ingrese valor de b: \t"; cin>>b; c=a+b; return c; } int main() { int sum; sum=sumar(); cout<<"Valor de la suma de a y b: "<<sum; cout<<"\n"; return 0; } 8tra Lanera de definir un Procedimiento y una ,uncin2 Ing. Carol Rojas Moreno 4- //Procedimientos con Argumentos #include<iostream> using namespace std; void sumar(int a, int b); int main() { int a,b; cout<<"Ingrese valor de a: \t"; cin>>a; cout<<"Ingrese valor de b: \t"; cin>>b; sumar(a,b); return 0; } void sumar(int a, int b) { int c; c=a+b; cout<<c; cout<<"\n"; B //Funciones con Argumentos #include<iostream> using namespace std; int sumar(int a, int b); int main() { int sum,a,b; cout<<"Ingrese valor de a: \t"; cin>>a; cout<<"Ingrese valor de b: \t"; cin>>b; sum=sumar(a,b); cout<<"Valor de la suma de a y b: "<<sum; cout<<"\n"; return 0; } int sumar(int a, int b) { int c; c=a+b; return c; } E=4*1,(: ". Elaborar un programa para calcular a la funcin de acuerdo a lo sgte.2 y H x + I si x [H # y H &x E " si # [ x [ + y H x + E 'x I si x VH + 5/ Ing. Carol Rojas Moreno #include<iostream> using namespace std; float ecuaciones() { float x,y; cout<<"Ingresar valor de x para calcular funcion f(y)=x <<\t"; cin>>x; if(x<=0) { cout<<"Ecuacion a usar es y=(x^2)+5\n"; y=(x*x)+5; } else if(x>0&&x<2) { cout<<"Ecuacion a usar es y=3x+1\n"; y=(3*x)-1; } else if(x>=2) { cout<<"Ecuacion a usar es y=(x^2)-4x+5\n"; y=(x*x)-(4*x)+5; } return y; } int main() { float res;
res=ecuaciones(); cout<<"Resultado de la funcion es f(y)=\t"<<res; cout<<"\n"; return 0; } +. (e repartir la herencia entre los hi9os de un seGor como sigue2 (i la cantidad de hi9os es menor a ', se repartir exactamente entre el n;mero de hi9osF si son cuatro o mas hi9os, la mitad le tocar al hermano mayor y el resto se dividir entre los dems hermanos. (e debe reportar cuanto le corresponde a cada hi9o. (e debe ingresar la herencia y el n;mero de hi9os. Ing. Carol Rojas Moreno 5. #include<iostream> using namespace std; //procedimientos sin argumentos void herencia() { float her,may; int num;
cout<<"Ingresar importe de herencia \n"; cin>>her; cout<<"Ingresar cantidad de hijos \n"; cin>>num;
if(num<4) { her=her/num; cout<<"Herencia a cada hijo es "<<her; } else { may=her/2; her=her/2; her=her/(num-1);
cout<<"\nHerencia de hermano mayor es"<<may; cout<<"\nHerencia de cada hijo es "<<her; } } void main( ) { herencia( ); } TRA:AAO APLICATIVO ". %ealizar un programa que tenga un mdulo reciba dos argumentos a, b =enteros> y que intercambie los valores de dichas variables. EV Elaborar un mdulo para leer a y b. +. En una banco, a los clientes que de tipo ", +, &, que aperturan cuentas de $horro=$>, :orriente =:> , o Palores =P>, todos en nuevos soles, se les otorga un bono =dlares>, de acuerdo a la sgte. /abla2 %eportar el /ipo de :liente, la :uenta que apertura, el monto total de la cuenta. :onsidere el ingreso del tipo de cambio de moneda al d.a. &. En un colegio, a la pensin de sus alumnos de tipo $, ), :, de acuerdo al promedio obtenido, le asignan becas2 4e acuerdo a la beca obtenida, se le descuenta al pago de su pensin2 Lostrar el tipo de alumno, la beca obtenida, y el monto total de pago de pensin, de acuerdo a la beca obtenida. 52 Ing. Carol Rojas Moreno :uenta2 /ipo cliente $ : P " ^ ## ^ '## ^ &## + ^ '## ^ &## ^ +## & ^ &## ^ +## ^ "## Promedio $lumno # _ "# "" E "7 "* E+# $ $ II $ I $ E ) ) II ) I ) E : : II :I : E $ II H U $ I H *U $ E H "# U ) II H & U ) I H U ) E H * U : II H " U :I H &U : E H U '. Elaborar los mdulos de programa adecuados que permita leer las edades de n personas y reporte el mayor, el menor y el promedio de edades. Ing. Carol Rojas Moreno 53 LI:RERDAS DE PROGRAMACIN CREADAS POR EL USUARIO -as librer.as estndar del procesador del lengua9e :2 iostream.h, math.h, conio.h, stdio.h, etc., existen liber.as de cabecera =header, de alli la extensin J.h> que pueden ser creadas por el programador, y ser invocadas en diferentes programas fuente =el programa con extensin .cpp> como parte de la reutilizacin de cdigo. E9emplo "2 -eer un n;mero entero diferente a cero, y si es positivo, reportar JEl n;mero es positivoK, caso contrario es negativo. (olucin2 E :rear la librer.a con extensin .h para la funcin de lectura de datos enteros, llamado lecturadato.h. E :rear el programa .cpp que invoca a la librer.a .h lecturadato.h, creada por el programador. 54 Ing. Carol Rojas Moreno #include<iostream> using namespace std; int leedatoe() { int dato; do{ cout<<Ingrese valor del dato; cin>>dato; }while(dato==0); return dato; } #include<iostream> #include c:\programas\lecturadato.h using namespace std; void main() { int num;
num=leedatoe();
if(num>0) cout<<El numero es positivo; else cout<<El numero es negativo; } E9emplo +2 4esarrollar la sgte. Ecuacin solo si son n;meros positivos y diferentes a cero. y H x S =+x E a> (olucin2 E -a funcin para la lectura de datos enteros y diferentes a cero ya fue creada para el programa del e9emplo ". E (olo se crear el programa fuente con extensin .cpp para desarrollar la ecuacin. TRA:AAO APLICATIVO Elaborar el :digo utilizando ,unciones y?o Procedimientos y -ibrer.as de Programacin. ". (i compramos al por mayor "## o mas art.culos nos descuentan el '#U, si compramos entre + y "##, el descuento es de +#U y si compramos entre "# y + el descuento es de "#U. 0o hay descuento si adquirimos menos de "# art.culos. !ndique el monto a pagar, sabiendo la cantidad de art.culos comprados y su precio. +. 6na empresa categoriza a sus art.culos como $, ) y :, adems a sus clientes como Excelente=E>, )ueno=)>, %egular=%> y Lalo=L>, estableciendo pol.ticas de descuento =en U> de acuerdo a la sgte. tabla2 /ipo $rt.culo /ipo :liente $ ) : Excelente =E> '# &# +# )ueno =)> &# +# "# %egular =%> +# "# # Lalo =L> # # # Ing. Carol Rojas Moreno 55 #include<iostream> #include c:\programas\lecturadato.h using namespace std; int main() { int x,a,y;
x=leedatoe(); a=leedatoe();
if(x>0 && a>0) { y=x*((2*x)-a); cout<<El resultado es:<<y; } else cout<<Con estos valores no se puede calcular; return 0; } El cliente Excelente y )ueno puede pagar en Efectivo, :heque o crdito, el cliente %egular puede pagar en Efectivo o :heque y el cliente Lalo solo paga en efectivo. -eer el tipo de cliente y el tipo de art.culo para indicar el descuento y el tipo de cliente. &. En un ca9ero se puede realizar las operaciones de depsito, saldo, y retiro. Elabore un programa permitir a un cliente realizar estas operaciones las veces que lo requiera. '. Escribir un programa el cual permita leer n;meros enteros diferentes a cero, y que al finalizar reporte2 a. El n;mero mayor y el n;mero menor. b. -a cantidad de n;meros positivos, y la cantidad de n;meros negativo. c. El total de n;meros le.dos. 0o considerar el valor cero. . -a tasa de inters sobre un prstamo es del 3U si la cantidad es menor que (?. +##, pero es de 7U si excede a +##. !ngrese la cantidad y reporte el inters de esa cantidad y el monto total por devolver. FUNCIONES RECURSIVAS (e denominan funciones recursivas a aquellas que se invocan a s. mismas en un programa. Yay que tener algunas cosas en cuenta en las funciones recursivas2 E /oda funcin recursiva debe tener alg;n punto de finalizacin. E -a funcin debe tender a ese punto de finalizacin. L% 9"20.)2 9%0/(&.%,: nC >C ; > / = / + / * > / =C Es !ecir n/.nD*0C =C ; = / + / * = / +C Es !ecir n/.nD*0C +C ; + / * + / *C Es !ecir n/.nD*0C *C ; * / 7C 7C ; * int factorial(int n) { if (n == 0) return 1; else return n*factorial(n-1); } 5* Ing. Carol Rojas Moreno >C ; > / = / + / * > / =C =C ; = / + / * = / +C +C ; + / * + / *C *C ; * / 7C 7C ; * * / * / + / = / > ; +> La funcin multiplicacin: a / ' = / > ; = 5 = 5 = 5 = = 5 .= / =0 = / = ; = 5 = 5 = = 5 .= / +0 = / + ; = 5 = = 5 .= /*0 = / * ; = int multiplica(int a, int b) { if (a == 0 || b == 0) return 0; else if (b == 1) return a; else return a+multiplica(a,b-1); } TRA:AAO APLICATIVO Elaborar el algoritmo y programa computacional para2 ". Potencia. +. (uma. &. %esta. '. (erie ,ibonacci. . /orres de Yanoi. 8bservaciones2 a. `:mo determin el valor m.nimo o punto de finalizacin de la funcin recursiva\ b. 6na funcin puede invocarse recursivamente mas de una vez, en un programa\ c. `(olo existe recursividad para las funciones\ `Qu pasa con la recursividad para procedimientos\ Ing. Carol Rojas Moreno 5+ = / > ; = 5 = 5 = 5 = = 5 .= / =0 = / = ; = 5 = 5 = = 5 .= / +0 = / + ; = 5 = = 5 .= /*0 = / * ; = :I:LIOGRAFIA N AUTOR TITULO EDITORIAL " M8]$0E( $<6!-$%, -uis ,undamentos de Programacin Editorial Lc<ra@EYill, :olombia, +##&. + %$,,8 -E::$, Eduardo /urbo :II Lundigraf, -imaEPer;, +### 5, Ing. Carol Rojas Moreno Ing. Carol Rojas Moreno 5- UNIDAD N 03 ESTRUCTURAS DE DATOS COMPETENCIA DE LA UNIDAD !"#$ $l trmino dela unidad se espera que el alumno elabore programas computacionales usando las diferentes estructuras de datos2 estticas y dinmicas, seg;n la necesidad del programa computacional. P%&% '"#$ Para permitir la me9or estructuracin del programa computacional a travs de estructuras de datos que le permitan manipular la informacin almacenado en los mismos. P(& '"#$ Esto le permitir valorar la utilizacin de difrentes estructuras de datos y dar solucin a problemas como busquedas secuenciales =arreglos>, teor.a de autmatas =arboles> o la determinacin de rutas cr.ticas =grafos>. C)*($ (e mantiene el uso de mdulos de programa y de librer.as de cabecera para construir las estructuras de datos estticas y dinmicas. */ Ing. Carol Rojas Moreno ESTRUCTURAS DE DATOS INTRODUCCION $l conocer el uso de los mdulos de programa, se debe manipular la informacin que se encuentre en ellos. 4icha informacin, por la naturaleza de la presente asignatura, se almacena temporalmente en el computador, de esta manera, permite atender la construccin de las estructuras de datos que almacenaran la informacin. -as estructuras de datos, que almacenan informacin son de tipo esttica y dinmica, es decir si para manipularlas, hacen uso de las direcciones de memoria del computador o no. Entre las estructuras de datos estticas se encuentran los tipos de datos que se pueden asignar a las variables, tipos de datos definidos por el programador, los arreglos multidimensionales y los registros. :omo estructuras de datos dinmicas se encuentra el concepto de listas simples, listas dobles y listas circulares, las colas y pilas, los arboles de expresin general y arboles binarios, y los grafos. Ing. Carol Rojas Moreno *. 2 Arreglos 2 Regis"ros 2 Arc(i2os 2 Ca!enas 2 Lis"as 2 Pilas 2 Colas 2 Ar'oles 2 GraAos ESTRUCTURAS DE DATOS 1+ D49.2.0.)2 6na estructura de datos es una coleccin de datos que se caracteriza por su organizacin y por el con9unto de operaciones que se definen para su manipulacin. 2+ C,%8.9.0%0.)2 Es"r%c"%ra !e Da"os Si#,les Es"r%c"%ras !e Da"os Co#,%es"os 3+ E8/&"0/"&%8 54 D%/(8 E8/;/.0%8 (on aquellas en las que la cantidad de memoria que ocupan se define antes de e9ecutar el programa. 4urante la e9ecucin del mismo este tamaGo asignado no puede alterarse. 3+1 A&&4-,(8 U2.5.*428.(2%,48 /ambin llamado vectores, es un con9unto finito y ordenado de elementos de un mismo tipo de dato. -a definicin de un arreglo es como sigue2 /ipo4ato 0ombre$rreglobtamaGoc E9m. Entero Lb"#c A0048( % ,(8 4,4*42/(8 54 "2 %&&4-,( "2.5.*428.(2%, Para hacer referencia a un elemento de un arreglo unidimensional es necesario indicar el nombre del arreglo y la posicin de dicho elemento. En lengua9e :II, esto se hace de la siguiente manera2 E9emplo3 ed"d3/4 ed"d3.4 ed"d324 ed"d334 ed"d344 edad
*2 Ing. Carol Rojas Moreno 23 45 34 19 62 / . 2 3 4 Nom5#e de) "##e6o 3!osici7n de) e)emeno48 2 En"eros 2 Reales 2 Carac"er Es"r%c"%ras !e Da"os Es"$n!ar Es"r%c"%ras !e Da"os No Es"$n!ar .DeAini!os ,or el ,rogra#a!or0 Lineales Es"r%c"%ras !e Da"os Din$#icos Es"r%c"%ras !e Da"os Es"$"icos No Lineales //Sumar alturas de alumnos con funciones y arreglos #include<iostream> #define N 5 using namespace std; void leerarre(double array[ ]) { int i; for(i=0;i<=N-1;i++) { cout<<"Ingrese altura alumno A"<<"["<<i<<"]"<<":\t"; cin>>array[i]; cout<<"\n"; } } double sumar(double array[ ]) { int i; double suma=0; for(i=0;i<=N-1;i++) { suma=suma+array[ i ]; } return suma; } void main() { double A[N],sum; leerarre(A); sum=sumar(A); cout<<"La SUMA es "<<sum; } //Programa para promediar las alturas de los alumnos #include<iostream> #define N 5 using namespace std; void leerarre(double array[ ]) { int i; for(i=0;i<=N-1;i++) {cout<<"Ingrese altura alumno A"<<"["<<i<<"]"<<":\t"; cin>>array[i]; cout<<"\n"; } } double suma(double array[ ]) { int i; double suma=0; for(i=0;i<=N-1;i++) { suma=suma+array[i]; } return suma; } double promedio(double sum) { double prom; prom=sum/N; return prom; } void main() { double A[N],sum,promed; leerarre(A); sum=suma(A); promed=promedio(sum); cout<<"\t\tLa suma es "<<sum; cout<<"\n\n"; cout<<"\t\tEl promedio es "<<promed; cout<<"\n\n"; } Ing. Carol Rojas Moreno *3 El siguiente programa lee un arreglo de n;meros enteros y encuentra el mayor y menor elemento. El mx de elementos es "## pero solo ingresa n elementos. *4 Ing. Carol Rojas Moreno //Programa para hallar el mayor y menor elemento de un arreglo #include<iostream> #define MAXIMO 100 using namespace std; int leenumelem() { int n; do{ cout<<"\n"; cout<<"Ingrese cantidad de elementos (>= a CERO y <= que 100): "; cin>>n; }while(n<=0 || n>MAXIMO); return n; } void leerarre(int N, int array[]) { int i; for(i=0;i<=N-1;i++) { cout<<"Ingrese altura alumno A"<<"["<<i<<"]"<<":\t"; cin>>array[i]; cout<<"\n"; } } void comparar(int N, int array[]) { int i, mayor, menor; mayor=array[0]; menor=array[0];
for(i=0;i<=N-1;i++) { if (array[i]>mayor) mayor=array[i]; if (array[i]<menor) menor=array[i]; } cout<<"El mayor es :"<<mayor<<"\n"; cout<<"El menor es :"<<menor<<"\n"; } void main() { int A[MAXIMO]; int n; n=leenumelem(); leerarre(n,A); comparar(n,A); } A+ ACTUALIZACIN DE ARREGLOS -os $rreglos necesitan actualizarse mientras se efect;a alg;n proceso con ellos. -a actualizacin de arreglos consiste en tres operaciones2 $Gadir elementos al final del arreglo =siempre y cuando exista espacio en el arreglo>, !nsertar elementos en cualquier posicin del arreglo y Eliminar elementos. A?%5.& ??$Gadir un valor en la ultima posicin #include<iostream> #define MAX 100 using namespace std; int leenum() { int num; do{ cout<<"Ingrese numero de elementos para el arreglo: "; cin>>num; cout<<"\n"; }while(num<=0 || num>MAX); return num; } void ingresadatos(int V[MAX], int n) { int i; cout<<"Ingrese elementos para el arreglo "; cout<<"\n"; for(i=0;i<=n-1;i++) { cout<<"Elemento ["<<i<<"]"<<":"; cin>>V[i]; } } void mostrar(int V[MAX], int n) { int i; cout<<"Los elementos del arreglo son"; cout<<"\n"; for(i=0;i<=n-1;i++) { cout<<"Elemento"<<"["<<i<<"]"<<":\t"; cout<<V[i]; cout<<"\n"; } } Ing. Carol Rojas Moreno *5 int ultimoelemento(int a[MAX], int n) { int i,p = n; if (p<MAX) { for(i=p;i<=n;i++) //ingresa nuevo elemento {cout<<"\n Ingrese nuevo elemento de arreglo "<<":\t"; cin>>a[i]; } n=n+1; return n; } } void main() { int A[MAX]; int num,elem; num=leenum(); ingresadatos(A,num); cout<<"\n"; mostrar(A,num); cout<<"\n"; elem=ultimoelemento(A, num); mostrar(A,elem); } I284&/%& ??!nsertar un valor en cualquier posicin #include<iostream> #define MAX 100 using namespace std; int leenum() { int num; do{cout<<"Ingrese numero de elementos para el arreglo: "; cin>>num; cout<<"\n"; }while(num<=0 || num>MAX); return num; } void ingresadatos(int V[MAX], int n) { int i; cout<<"Ingrese elementos para el arreglo "; cout<<"\n"; for(i=0;i<=n-1;i++) { cout<<"Elemento ["<<i<<"]"<<":"; cin>>V[i]; } } ** Ing. Carol Rojas Moreno void mostrar(int V[MAX], int n) { int i; cout<<"Los elementos del arreglo son"; cout<<"\n"; for(i=0;i<=n-1;i++) { cout<<"Elemento"<<"["<<i<<"]"<<":\t"; cout<<V[i]; cout<<"\n"; } } int posicion(int a[MAX], int n) {int i,p; cout<<"\n Ingrese posicion a insertar elemento de arreglo A"<<":\t"; cin>>p; i=n-1; while (i>=p) { a[i+1]=a[i]; i=i-1; } return p; } int nuevoelemento(int a[MAX],int p, int n) { int elem; cout<<"\n Ingrese nuevo elemento de arreglo a"<<":\t"; cin>>elem; a[p]=elem; n=n+1; return n; } void main() { int A[MAX]; int num,pos,elem; num=leenum(); ingresadatos(A,num); cout<<"\n"; mostrar(A,num); cout<<"\n"; pos=posicion(A,num); elem=nuevoelemento(A,pos, num); mostrar(A,elem); } Ing. Carol Rojas Moreno *+ E,.*.2%& ??Eliminar un valor en cualquier posicin #include<iostream> #define MAX 100 using namespace std; int leenum() { int num; do{cout<<"Ingrese numero de elementos para el arreglo: "; cin>>num; cout<<"\n"; }while(num<=0 || num>MAX); return num; } void ingresadatos(int V[MAX], int n) { int i; cout<<"Ingrese elementos para el arreglo "; cout<<"\n"; for(i=0;i<n;i++) { cout<<"Elemento ["<<i<<"]"<<":"; cin>>V[i]; } } void mostrar(int V[MAX], int n) { int i; cout<<"Los elementos del arreglo son"; cout<<"\n"; for(i=0;i<n;i++) { cout<<"Elemento"<<"["<<i<<"]"<<":\t"; cout<<V[i]; cout<<"\n"; } } int elimina(int a[MAX], int n) {int i,p; cout<<"\n Ingrese posicion a eliminar elemento de arreglo "<<":\t"; cin>>p; i=p; while (i<=n) { a[i]=a[i+1]; i++; } return n-1; } void main() { int A[MAX]; int num,el; num=leenum(); ingresadatos(A,num); cout<<"\n"; mostrar(A,num); cout<<"\n"; el=elimina(A,num); mostrar(A,el); } *, Ing. Carol Rojas Moreno :+ :US!UEDA DE ARREGLOS -a b;squeda es la recuperacin de la informacin de los elementos de un arreglo. Para ello se necesita recorrer el arreglo y hacer uso de uno de los mtodos de b;squeda de un elemento tales como2 );squeda (ecuencial );squeda )inaria. :+ S40"420.%, CC:E8'"45% S40"420.%, 1 #include<iostream> #define MAX 100 using namespace std; . //Se entiende que se realizan los procedimientos de lectura de datos void bsecuencial(int a[MAX], int n) { int elem,i; cout<<"\n Ingrese elemento a buscar en el arreglo "<<":\t"; cin>>elem;
for(i=1;i<=n;i++) if(a[i]==elem) { cout<<"\n Encontrado\t Posicion :\t"<<i<<"\t"; cout<<"\n\n"; } } void main() { int A[MAX]; int num; num=leenum(); ingresadatos(A,num); cout<<"\n"; mostrar(A,num); cout<<"\n"; bsecuencial(A,num); } Ing. Carol Rojas Moreno *- CC:"8'"45% S40"420.%, 2 #include<iostream> #define MAX 100 using namespace std; . //Se entiende que se realizan los procedimientos de lectura de datos void bsecuencial(int a[MAX], int n) { int elem,i; bool Encontrado = false; cout<<"\n Ingrese elemento a buscar en el arreglo "<<":\t"; cin>>elem;
for(i=1;i<=n;i++) { if(a[i]==elem) { Encontrado=true; cout<<"\n Encontrado\t Posicion :\t"<<i<<"\t"; cout<<"\n\n"; } } if(Encontrado==false) { cout<<"\n No Encontrado\t "; cout<<"\n\n"; } } void main() { int A[MAX]; int num; num=leenum(); ingresadatos(A,num); cout<<"\n"; mostrar(A,num); cout<<"\n"; bsecuencial(A,num); } +/ Ing. Carol Rojas Moreno :+ :E8'"45% :.2%&.% #include<iostream> #define MAX 100 using namespace std; int leenum() { int num; do{ cout<<"Ingrese numero de elementos para el arreglo: "; cin>>num; cout<<"\n"; }while(num<=0 || num>MAX); return num; } void ingresadatos(int V[MAX], int n) { int i; cout<<"Ingrese elementos para el arreglo "; cout<<"\n"; for(i=1;i<=n;i++) { cout<<"Elemento ["<<i<<"]"<<":";cin>>V[i]; } } void mostrar(int V[MAX], int n) { int i; cout<<"Los elementos del arreglo son"; cout<<"\n"; for(i=1;i<=n;i++) {cout<<"Elemento"<<"["<<i<<"]"<<":\t";cout<<V[i]; } } void bbinaria(int a[MAX], int n) { int elem; int BAJO, ALTO, CENTRAL; BAJO=1; ALTO=n; cout<<"\n Ingrese elemento a buscar"<<":\t"; cin>>elem; CENTRAL=((BAJO+ALTO)/2); while ((BAJO<=ALTO) && (a[CENTRAL]!=elem)) { if(elem<a[CENTRAL]) {ALTO=CENTRAL-1; CENTRAL=(BAJO+ALTO)/2; } else{ BAJO=CENTRAL+1; CENTRAL=(BAJO+ALTO)/2; } } if(elem==a[CENTRAL]) { cout<<"\n ENCONTRADO \n"; cout<<"\n a["<<CENTRAL<<"] = "<<a[CENTRAL]; cout<<"\n";} else cout<<"\n NO ENCONTRADO \n "; } void main() {int A[MAX]; int num; num=leenum(); ingresadatos(A,num); cout<<"\n"; mostrar(A,num); cout<<"\n"; bbinaria(A,num);} Ing. Carol Rojas Moreno +. C+ ORDENACIN DE ELEMENTOS -a ordenacin es la clasificacin de un orden particular de los elementos de un arreglo, es decir ya sea en forma ascendente o descendente. El Ltodo !ntercambio permite comparar elementos e intercambiar posiciones. CCO&542%0.(2 1(& :"&3"=% #include<iostream> #define MAX 100 using namespace std; . //Se entiende que se realizan los procedimientos de lectura de datos void burbuja(int a[MAX], int n) { int i,j,temp; for(i=0;i<n-1;i++) for(j=n-1;j>=i+1;j--) if (a[j]<a[j-1]) { temp=a[j]; a[j]=a[j-1]; a[j-1]=temp; } } void main() { int A[MAX]; int num; num=leenum(); ingresadatos(A,num); cout<<"\n\n"; burbuja(A,num); mostrar(A,num); } +2 Ing. Carol Rojas Moreno E=4*1,(8: ". Elaborar un programa que dado dos arreglos numricos $ y ) de n" y n+ elementos respectivamente, guarde en un tercer arreglo : los elementos que estn en $ pero no estn en ). E9emplo2 E *E E F G *+ *+ F + H H G >E + ++ I S(,"0.)2: #include<iostream> #define MAX 100 using namespace std; void ingresadatos(int V[MAX], int n,char titu[20]) { int i; cout<<"Ingrese elementos para el arreglo "<<titu;cout<<"\n"; for(i=0;i<=n-1;i++) { cout<<"Elemento ["<<i<<"]"<<":"; cin>>V[i]; } } int separacion(int VA[MAX],int na,int VB[MAX],int nb,int VC[MAX]) { int i,j; int k=0, ban=0; //busqueda de arreglos for(i=0;i<na;i++) {for(j=0;j<nb;j++) if(VA[i]==VB[j]) { ban=1; break; } if(ban==0) { VC[k]=VA[i]; k++; } else ban=0; } return k; } Ing. Carol Rojas Moreno +3 A 9 C n*;H n+;I ele#;= void mostrar(int V[MAX], int n, char titu[20]) { int i; cout<<"Los elementos del arreglo "<<titu; cout<<" son:"; cout<<"\n"; for(i=0;i<=n-1;i++) { cout<<"Elemento"<<"["<<i<<"]"<<":\t"; cout<<V[i]; cout<<"\n"; } } void main() { int A[MAX],B[MAX],C[MAX]; int na,nb,elem; na=leenum(); ingresadatos(A,na,"Arreglo A"); nb=leenum(); ingresadatos(B,nb,"Arreglo B"); cout<<"\n"; mostrar(A,na,"Arreglo A"); cout<<"\n"; mostrar(B,nb,"Arreglo B"); cout<<"\n"; elem=separacion(A,na,B,nb,C); mostrar(C,elem,"Arreglo C"); } +. Elaborar un programa que dado dos arreglos numricos $ y ) de n" y n+ elementos respectivamente, guarde en un tercer arreglo : los elementos que estn en $ y en ). E9emplo2 E *E F F G H *+ F G H H G >E + ++ I +4 Ing. Carol Rojas Moreno A 9 C n*;H n+;I ele#;= S(,"0.)2: #include<iostream> #define MAX 100 using namespace std; void ingresadatos(int V[MAX], int n,char titu[20]) { int i; cout<<"Ingrese elementos para el arreglo "<<titu;cout<<"\n"; for(i=0;i<=n-1;i++) { cout<<"Elemento ["<<i<<"]"<<":"; cin>>V[i]; } } int interseccion(int VA[MAX],int na,int VB[MAX],int nb,int VC[MAX]) { int i,j; int k=0; //busqueda de arreglos for(i=0;i<na;i++) { for(j=0;j<nb;j++) if(VA[i]==VB[j]) { VC[k]=VA[i]; k++; } } return k; } void mostrar(int V[MAX], int n, char titu[20]) { int i; cout<<"Los elementos del arreglo "<<titu; cout<<" son:"; cout<<"\n"; for(i=0;i<=n-1;i++) { cout<<"Elemento"<<"["<<i<<"]"<<":\t"; cout<<V[i]; cout<<"\n"; } } void main() {int A[MAX],B[MAX],C[MAX]; int na,nb,elem; na=leenum(); ingresadatos(A,na,"Arreglo A"); nb=leenum(); ingresadatos(B,nb,"Arreglo B"); cout<<"\n"; mostrar(A,na,"Arreglo A"); cout<<"\n"; mostrar(B,nb,"Arreglo B"); cout<<"\n"; elem=interseccion(A,na,B,nb,C); mostrar(C,elem,"Arreglo C"); } Ing. Carol Rojas Moreno +5 TRA:AAO APLICATIVO ". Elaborar un programa dado las notas de & alumnos, se debe reportar la nota mas alta, la nota mas ba9a y el promedio de notas ingresadas. +. Elaborar un programa para que se ingresen los sgtes. valores del arreglo mostrado, sume el valor en la posicin # con el valor en la posicin & y luego multiplicar por el valor en la posicin . &. -eer las edades de n personas y reportar2 a. :uantas edades son menores a "#. b. :uantas edades son mayores iguales a "# y menores a +#. c. :uantas edades son mayores iguales a +# y menores a &#. d. :uantas edades son mayores iguales a &# y menores a '#. e. :uantas edades son mayores iguales a '# y menores a #. '. !ngresar n pesos =Zg.> de personas a un arreglo, insertar un nuevo peso de una persona en la posicin '. . $Gadir dos elementos al final del arreglo, modificando el algoritmo de aGadir un elemento al final. 7. 4ado un arreglo de tamaGo "##, y de nH "# elementos, eliminar el elemento de la posicin 7 e insertar el valor de # en una posicin cualquiera. *. 4ado un arreglo de n elementos, aGadir un elemento al final y luego eliminar el segundo elemento de todo el arreglo. 3. 4ado un arreglo de n elementos, buscar un elemento y solo si se encontr, indicar la posicin encontrada y aGadir el valor encontrado al final del arreglo, y mostrar. 5. :rear un mdulo de programa donde se ingrese como algunos de sus argumentos dos $rreglos $ y ), con n y m elementos respectivamente, y sumar los valores de las posiciones impares de $ con los valores de las posiciones pares de ). "#. :rear un mdulo de programa donde se eliminen los elementos repetidos en un $rreglo de n elementos. "". )uscar un elemento en un arreglo de n elementos, utilizando b;squeda binaria =previamente ordenado con el mtodo de la burbu9a y sin que exista elementos repetidos>, y eliminarlo. +* Ing. Carol Rojas Moreno "#.7 &.' 5 +.& '. %osicion / . 2 3 4 5 ARRA( 3+2 A&&4-,(8 :.5.*428.(2%,48 /ambin llamado matrices, es un con9unto finito y ordenado de elementos de un mismo tipo de dato. -a definicin de un arreglo es como sigue2 /ipo4ato 0ombreLatrizbndfilascbn1columnasc E9m. Entero Lb'cbc columnas
filas Para declarar un arreglo bidimensional en lengua9e :II se sigue la siguiente sintaxis2 Ti!o de D"o Nom5#e de) "##e6)o 3: fi)"s4 3: co)0mn"s48 A+ LECTURA DE DATOS Y PRESENTACIN DE LOS ELEMENTOS DE UNA MATRIZ #include<iostream> #define MAX 100 using namespace std; int leenum() {int num; do{ cin>>num; cout<<"\n"; }while(num<=0 || num>MAX); return num; } void ingresadatos(int M[MAX][MAX], int nf,int nc) {int i,j; cout<<"Ingrese elementos para la matriz "; cout<<"\n"; for(i=0;i<=nf-1;i++) for(j=0;j<=nc-1;j++) { cout<<"Elemento ["<<i<<"]"<<"["<<j<<"]"<<":"; cin>>M[i][j]; } } Ing. Carol Rojas Moreno ++ / . 2 3 4 / . 2 3 +, Ing. Carol Rojas Moreno void mostrar(int M[MAX][MAX], int nf, int nc) {int i,j; cout<<"Los elementos de la matriz son"; cout<<"\n"; for(i=0;i<=nf-1;i++) for(j=0;j<=nc-1;j++) { cout<<"Elemento ["<<i<<"]"<<"["<<j<<"]"<<":"; cout<<M[i][j]; cout<<"\n"; } } void main() { int B[MAX][MAX]; int nf,nc; cout<<"Ingrese numero de filas "; nf=leenum(); cout<<"Ingrese numero de columnas "; nc=leenum(); ingresadatos(B,nf,nc); cout<<"\n"; mostrar(B,nf,nc); cout<<"\n"; } CCE, *%F(& 4,4*42/( 54 "2% *%/&.G ... //Se entiende que se realizan los procedimientos de lectura de datos void mayor(int M[MAX][MAX], int nf, int nc) { int i,j,mayor; mayor =M[0][0]; for(i=0;i<=nf-1;i++) for(j=0;j<=nc-1;j++) { if (M[i][j]>mayor) mayor=M[i][j]; } cout<<"\n"; cout<<"El nmero mayor es: "<<mayor; cout<<"\n"; } void main() { int B[MAX][MAX]; int nf,nc; cout<<"Ingrese numero de filas "; nf=leenum(); cout<<"Ingrese numero de columnas "; nc=leenum();
ingresadatos(B,nf,nc); cout<<"\n";
mostrar(B,nf,nc); cout<<"\n"; mayor(B,nf,nc); } Ing. Carol Rojas Moreno +- CCD.%-(2%, P&.20.1%, F D.%-(2%,48 54 "2% *%/&.G ... //Se entiende que se realizan los procedimientos de lectura de datos void diagonal_principal(int M[MAX][MAX], int nf, int nc) {int i,j;
if(nf==nc) { for(i=0;i<=nf-1;i++) { for(j=0;j<=nc-1;j++) if(i==j) { cout<<"\n"; cout<<M[i][j]<<"\n"; } else cout<<" "; cout<<"\n"; } } else { cout<<"Para la Diagonal Principal: columnas y filas deben ser iguales"; cout<<"\n\n"; } } void diagonalsecundaria(int M[MAX][MAX], int nf, int nc) { int i,j,k;
k=nc-1; if(nf==nc) { for(i=0;i<nf;i++) { for(j=0;j<nc;j++) if(j == k) { cout<<M[i][j]; } else cout<<"\t"; k--; cout<<"\n"; } } else { cout<<"Para la Diagonales: columnas y filas deben ser iguales"; cout<<"\n\n"; } } ,/ Ing. Carol Rojas Moreno void diagonales(int M[MAX][MAX], int nf, int nc) { int i,j,k;
k=nc-1; if(nf==nc) { for(i=0;i<=nf-1;i++) { for(j=0;j<=nc-1;j++) if(i==j || j==k) { cout<<"\n"; cout<<M[i][j]<<"\n"; } else {cout<<" ";} k--; cout<<"\n"; } } else { cout<<"Para la Diagonales: columnas y filas deben ser iguales"; cout<<"\n\n"; } } void main() { int B[MAX][MAX]; int nf,nc;
cout<<"Los elementos de la diagonal Principal: "<<"\n"; diagonal_principal(B,nf,nc); cout<<"\n";
cout<<"Los elementos de las diagonales : "<<"\n"; diagonales(B,nf,nc); cout<<"\n"; } Ing. Carol Rojas Moreno ,. :+ ACTUALIZACIN CCI284&/%& 9.,% F 0(,"*2% 54 "2% *%/&.G . //Se entiende que se realizan los procedimientos de lectura de datos int insertar_fila(int M[MAX][MAX], int nf, int nc) { int i,j,pos; do{ cout<<"Ingrese posicion para insertar fila: "; cin>>pos; }while(pos<0 || pos>nf); for(i=nf-1;i>=pos;i--) for(j=0;j<=nc-1;j++) M[i+1][j]=M[i][j]; for(j=0;j<=nc-1;j++) { cout<<"M["<<pos<<"]"<<"["<<j<<"] : "; cin>>M[pos][j]; } nf++; return nf; } int insertar_columna(int M[MAX][MAX], int nf, int nc) {int i,j,pos; do{ cout<<"Ingrese posicion para insertar columna: "; cin>>pos; }while(pos<0 || pos>nc); for(i=0;i<=nf-1;i++) for(j=nc-1;j>=pos;j--) M[i][j+1]=M[i][j]; for(i=0;i<=nf-1;i++) { cout<<"M["<<i<<"]"<<"["<<pos<<"] : "; cin>>M[i][pos]; } nc++; return nc; } void main() { int B[MAX][MAX]; int nf,nc,fil,col;
cout<<"Ingrese numero de filas "; nf=leenum(); cout<<"Ingrese numero de columnas "; nc=leenum(); ingresadatos(B,nf,nc); cout<<"\n"; ,2 Ing. Carol Rojas Moreno
cout<<"Matriz Inicial con columna insertada"; mostrar(B,nf,col); cout<<"\n"; } CC:(&&%& 9.,% F 0(,"*2% 54 "2% *%/&.G ... //Se entiende que se realizan los procedimientos de lectura de datos int borrar_fila(int M[MAX][MAX], int nf, int nc) { int i,j,pos; do{ cout<<"Ingrese posicion para borrar fila: "; cin>>pos; }while(pos<0 || pos>=nf); for(i=pos;i<nf-1;i++) for(j=0;j<=nc-1;j++) M[i][j]=M[i+1][j]; nf--; return nf; } int borrar_columna(int M[MAX][MAX], int nf, int nc) { int i,j,pos; do{ cout<<"Ingrese posicion para insertar columna: "; cin>>pos; }while(pos<0 || pos>=nc); for(i=0;i<=nf-1;i++) for(j=pos;j<=nc-1;j++) M[i][j]=M[i][j+1]; nc--; return nc; } Ing. Carol Rojas Moreno ,3 void main() { int B[MAX][MAX] nf,nc,fil,col;
cout<<"Ingrese numero de filas "; nf=leenum();
cout<<"Ingrese numero de columnas "; nc=leenum(); ingresadatos(B,nf,nc); cout<<"\n";
cout<<"Matriz Inicial con columna eliminada"; mostrar(B,nf,col); cout<<"\n"; } E=4*1,(8 ". !mprimir lo n;meros que rodean a un n;mero A, la primera vez que se encuentra en la Latriz incluido el n;mero A2 > = I G = I G M * > E F > E F + E > * I DH = > ,4 Ing. Carol Rojas Moreno S(,"0.)2: ... //Se entiende que se realizan los procedimientos de lectura de datos void rodean(int M[MAX][MAX], int nf, int nc,int n) { int i,j; int f,c; int ban=0; for(i=0;i<=nf-1;i++) for(j=0;j<=nc-1;j++) if( M[i][j]==n && ban==0) { f=i; c=j; ban=1; } if (ban=1) {cout<<"Los Numeros que rodean son: \n"; for(i=0;i<=nf-1;i++) {for(j=0;j<=nc-1;j++) if((i>=f-1 && i<=f+1) && (j>=c-1 && j<=c+1)) cout<<M[i][j]<<"\t"; else cout<<" "; cout<<"\n"; } } else cout<<"El numero ingresado no existe"; } void main() { int B[MAX][MAX]; int nf,nc,num; cout<<"Ingrese numero de filas "; nf=leenum(); cout<<"Ingrese numero de columnas "; nc=leenum(); ingresadatos(B,nf,nc); cout<<"\n"; cout<<"Ingrese el numero a buscar "; cin>>num; rodean(B,nf,nc,num); cout<<"\n";} Ing. Carol Rojas Moreno ,5 / . 2 3 / . 2 / . 2 3 / . 2 / . 2 3 / . 2 / . 2 3 / . 2 +. !ngresa un 0umero 0 y luego imprime fila y columna 0 de la matriz, si solo existe la fila 0, solo se imprime dicha fila. = E + * * H DE I G G F * > D= D=
= E + * + H DE I G I F * > D= F * > D=
S(,"0.)2: ... //Se entiende que se realizan los procedimientos de lectura de datos void seleccion(int M[MAX][MAX], int nf, int nc) { int i,j,n; do{ cout<<"Ingrese valor de N: "; cin>>n; }while(n<0 || (n>=nf && n>=nc)); cout<<"\n\n\n"; for(i=0;i<=nf-1;i++) { for(j=0;j<=nc-1;j++) { if(i==n || j==n) cout<<M[i][j]<<"\t";
,* Ing. Carol Rojas Moreno N ; 3< se im!#ime )" co)0mn" 3 N ; 2< se im!#ime )" fi)" 2 = )" co)0mn" 2 else cout<<" "; } cout<<"\n"; } } void main() { int B[MAX][MAX]; int nf,nc; cout<<"Ingrese N filas "; nf=leenum(); cout<<"Ingrese N columnas "; nc=leenum(); ingresadatos(B,nf,nc); cout<<"\n"; seleccion(B,nf,nc); cout<<"\n"; } &. !nvertir 4iagonal Principal de una Latriz2 H F > = F > M I + E M I + E * E = * E H
... //Se entiende que se realizan los procedimientos de lectura de datos void mostrar(int M[MAX][MAX], int nf, int nc) { int i,j; cout<<"Los elementos de la Matriz son"; cout<<"\n"; for(i=0;i<=nf-1;i++) { for(j=0;j<=nc-1;j++) { cout<<M[i][j];cout<<"\t"; } cout<<"\n"; } } Ing. Carol Rojas Moreno ,+ void invierte_principal(int M[MAX][MAX], int nf, int nc) { int i,k,temp; if( nf==nc ) { k=nf-1; for(i=0;i<nf/2;i++) { temp=M[i][i]; M[i][i]=M[k][k]; M[k][k]=temp; k--; } } else cout<<"No es Posible"; } void main() { int B[MAX][MAX]; int nf,nc; cout<<"Ingrese numero de filas "; nf=leenum(); cout<<"Ingrese numero de columnas "; nc=leenum(); ingresadatos(B,nf,nc); cout<<"\n"; mostrar(B,nf,nc); cout<<"\n"; cout<<"Diagonal Principal Invertida"; invierte_principal(B,nf,nc); mostrar(B,nf,nc); cout<<"\n"; } '. !ntercambiar ,ilas por :olumnas =Latriz /ranspuesta> H F > H I * G M I + E M F + E I * E = > E = D* G I D* . //Se entiende que se realizan los procedimientos de lectura de datos void mostrar(int M[MAX][MAX], int nf, int nc) { int i,j; cout<<"Los elementos de la Matriz son"; cout<<"\n"; for(i=0;i<=nf-1;i++) { for(j=0;j<=nc-1;j++) { cout<<M[i][j];cout<<"\t"; } cout<<"\n"; } ,, Ing. Carol Rojas Moreno } void transpuesta(int M[MAX][MAX], int nf, int nc,int T[MAX][MAX]) { int i,j; for(i=0;i<=nf-1;i++) for(j=0;j<=nc-1;j++) { T[j][i]=M[i][j]; } } void main() { int B[MAX][MAX],T[MAX][MAX]; int nf,nc,ft,ct,temp; cout<<"Ingrese numero de filas "; nf=leenum(); cout<<"Ingrese numero de columnas "; nc=leenum(); ingresadatos(B,nf,nc); cout<<"\n"; mostrar(B,nf,nc); cout<<"\n"; cout<<"Matriz Transpuesta"; transpuesta(B,nf,nc,T); ft=nf; ct=nc; temp=ft; ft=ct; ct=temp; mostrar(T,ft,ct); cout<<"\n"; } Ing. Carol Rojas Moreno ,- TRA:AAO APLICATIVO Elaborar el programa en : II para2 *. 4ada una matriz de n filas y m columnas, elaborar los mdulos de programa para2 indicar el menor elemento y la=s> pocisin=es> en que se encuentra y para hacer rotar a la matriz & veces =intercambiar filas y columnas>. +. %ealizar el ordenamiento descendente de una fila en un arreglo bidimensional. =. %ealizar el ordenamiento descendente de una columna en un arreglo bidimensional. >. Escriba el mdulo de programa para invertir la diagonal secundaria en un arreglo bidimensional. 3+3+ T.1(8 54 D%/(8 A38/&%0/(8 (TDA) Es un tipo de dato definido por el programador, que consta de datos y operaciones. E9m2 clases, listas, pilas, colas. TDA H %epresentacin =datos> I 8peraciones =funciones y procedimientos> 3+4 R4-.8/&(8 (E8/&"0/"&%8) 6na estructura =registro> es un tipo definido por el usuario en base a otros tipos de datos con el ob9eto de reunir informacin de un mismo elemento o entidad, a diferencia de un arreglo que tiene datos homogneos. E9emplo2 Juan !" !#$% &M' no#'re .ca!ena0 e!a! .in"0 Talla .Aloa"0 seJo .c(ar0 :ada componente de la estructura se denomina campo. D40,%&%0.)2: struct nombre{ char f[5]; char e[3]; int s; char a; }; -/ Ing. Carol Rojas Moreno class alumno { private: string nombre; string carrera; public: alumno(); ~alumno(); void ingresar(); void imprimir(); }; ")0mno nom5#e c"##e#" in6#es"# im!#imi# 4atos afines respecto a la estructura> Podemos darle una variable2 struct { char f[5]; char e[3]; int s; char a; }nomb_variable; E9emplo2 Ing. Carol Rojas Moreno -. #include<iostream> using namespace std; struct{ int dia; int mes; long int anual; }hoy; vvoid main( ) { cout<<"Ingrese dia: \t"; cin>>hoy.dia; cout<<"Ingrese mes: \t"; cin>>hoy.mes; cout<<"Ingrese anno: \t"; cin>>hoy.anual; cout<<hoy.dia<<" / "<<hoy.mes<<" / "<<hoy.anual; cout<<"\n"; } #include<iostream> using namespace std; struct domicilio{ char nombre[30]; char calle[30]; int num; }; void main( ) { domicilio oficina, casa; cout<<"Datos Oficina";cout<<"\n"; cout<<"Ingrese su nombre: \t"; cin>>oficina.nombre; cout<<"Ingrese calle: \t"; cin>>oficina.calle; cout<<"Ingrese num calle: \t"; cin>>oficina.num; cout<<"Ingrese ciudad: \t"; cin>>oficina.ciudad;cout<<"\n"; cout<<oficina.nombre<<"---"<<oficina.calle<<"---"<<oficina.num<<"---"<<ofi cina.ciudad; cout<<"\n"; cout<<"\n"; cout<<"Datos Casa";cout<<"\n"; cout<<"Ingrese su nombre: \t"; cin>>casa.nombre; cout<<"Ingrese calle: \t"; cin>>casa.calle; cout<<"Ingrese num calle: \t"; cin>>casa.num; cout<<"Ingrese ciudad: \t"; cin>>casa.ciudad;cout<<"\n"; cout<<casa.nombre<<"---"<<casa.calle<<"---"<<casa.num<<"---"<<casa.ciudad; } U8( 54, /F14549: (iempre en los programas se realiza una tarea de *(54,%5( de los datos que consiste en convertir los datos reales en datos aplicables en un programa informtico. En : existe una palabra reservada llamada /F14549 que sirve para crear tipos de datos propios. Permite dar una mayor claridad y simplicidad al cdigo, aunque su uso es opcional. (u sintaxis es la siguiente2 /F14549 definicinDelTipo 0ombre4el/ipo4e4atos D49.2.& 48/&"0/"&%8 0(2 typedef A8.-2%0.)2 54 48/&"0/"&%8 #include<iostream> #include<string> using namespace std; typedef struct{ char nombre[25]; char apellidos[50]; int edad; } Persona; void main( ) { Persona pepe,jaime; strcpy(pepe.nombre,"Pepe"); strcpy(pepe.apellidos,"Villegas Varas"); pepe.edad=12; jaime=pepe; // Asignacin de estructuras cout<<"\n ---- Reporte de Datos de Pepe ----\n"; cout<<pepe.nombre;cout<<"\n"; cout<<pepe.apellidos;cout<<"\n"; cout<<pepe.edad;cout<<"\n"; cout<<"\n ---- Reporte de Datos de Jaime ----\n"; cout<<jaime.nombre;cout<<"\n"; cout<<jaime.apellidos;cout<<"\n"; cout<<jaime.edad;cout<<"\n"; cout<<"\n";} F"20.(248 F E8/&"0/"&%8 #include<iostream> #include<string> using namespace std; typedef struct{ char nombre[25]; char apellidos[50]; int edad; -2 Ing. Carol Rojas Moreno Se !0ede ?"ce# odo )o "ne#io# de es" fo#m" @definiendo )" es#0c0#" = c#e"ndo e) i!o " )" AeBCD typedef struct{ char nombre[25]; char apellidos[50]; char dni[10]; int edad; }Persona; void main( ) { Persona individuo; } struct domicilio{ char nombre[30]; char calle[30]; int num; char ciudad[20]; }; void main( ) { typedef struct domicilio Oficina, casa; } } Persona; void subirEdad(Persona pers) { pers.edad++; cout<<pers.edad;cout<<"\n"; } void main() { Persona pepe; strcpy(pepe.nombre,"Pepe"); strcpy(pepe.apellidos,"Villegas Varas"); pepe.edad=12; cout<<"\n ---- Reporte de Datos de Pepe ----\n"; cout<<pepe.nombre;cout<<"\n"; cout<<pepe.apellidos;cout<<"\n"; cout<<pepe.edad;cout<<"\n"; cout<<"\n ---- Reporte de Nuevos Datos de Pepe ----\n"; cout<<pepe.nombre;cout<<"\n"; cout<<pepe.apellidos;cout<<"\n"; subirEdad(pepe); // Invoca al procedimiento } 3+B UNIONES (on a primera vista, entidades muy similares a las estructuras, estn formadas por un n;mero cualquiera de miembros, al igual que aquellas, pero en ste caso no existen simultneamente todos los miembros, y slo uno de ellos tendr un valor vlido. $ diferencia de la Estructura, esta es una localidad de memoria que se utiliza para compartir datos de diferentes tipos. E9emplo2 Entonces struct tabla { char nombre[30]; char tipo; char cadena[5]; int entero; }; E=4*1,( 554 E8/&"0/"&%8 A2.5%5%8: 6tilizar estructuras anidadas2 una para fecha con d.a, mes y aGoF y otra para persona, la cual se invocar como inscrito y tiene nombres, apellidos, nacimiento =que es del tipo fecha>, y sexo. %eportar los datos ingresados. #include<iostream> #include<string> #define N 50 using namespace std; struct fecha{ int dia; int mes; long int anual; }; struct persona{ char nombres[N]; char apellidos[N]; Ing. Carol Rojas Moreno -3 (i tipo es ec a, se utiliza cadena, pero si es e e a, se utiliza entero. struct tabla{ char nombre[30]; char tipo; union { char cadena[5]; int entero; } dato; }; fecha fnacimiento; char sexo[10]; }; void main() { persona inscrito; cout<<"\n\n-----Ingrese datos----- \n\n"; cout<<"Ingrese nombre \t"; cin>>inscrito.nombres; cout<<"Ingrese apellidos \t"; cin>>inscrito.apellidos; cout<<"\n\n-----Fecha de Nacimiento----- \n\n"; cout<<"Ingrese dia \t"; cin>>inscrito.fnacimiento.dia; cout<<"Ingrese mes \t"; cin>>inscrito.fnacimiento.mes; cout<<"Ingrese ao \t"; cin>>inscrito.fnacimiento.anual; cout<<"Ingrese sexo \t"; cin>>inscrito.sexo; cout<<"\n\n----Los Datos ingresados fueron----- \n\n"; cout<<inscrito.nombres<<"\n"; cout<<inscrito.apellidos<<"\n"; cout<<inscrito.fnacimiento.dia<<"\n"; cout<<inscrito.fnacimiento.mes<<"\n"; cout<<inscrito.fnacimiento.anual<<"\n"; cout<<inscrito.sexo<<"\n\n"; } TRA:AAO APLICATIVO ". -os alumnos de & secciones =$, ), :> han rendido & exmenes =E", E+, E&> (e quiere escribir un programa que lea los datos de los n alumnos2 nombre, seccin y las notas de los & exmenes y que imprima los sgte.2 E -a lista de los n alumnos exonerados del examen final en orden de mritos. E -os alumnos que no han sido exonerados tienen derecho a un examen sustitutorio al que reemplaza la nota ms ba9a para calcular nuevamente el promedio. En este caso se aprueba con promedio VH"". E !mprimir la lista de alumnos que a pesar de aprobar el sustitutorio no aprueban el curso. -4 Ing. Carol Rojas Moreno PROGRAMACIN ORIENTADA A O:AETOS Es una tcnica o estilo de programacin basada en elementos bsicos llamados ob9etos. O3=4/(: Es una entidad que se caracteriza por determinados atributos llamados datos miembro y por ciertas funciones denominados funciones miembro o mtodos que permiten su manipulacin. C,%84: 6na clase es la definicin formal de los atributos y funciones miembro de un con9unto de ob9etos que se realiza en un programa. class < nombre de la clase > { < priate:/pu!lic: " tipodato atributo; tipodato atributo; tipodato atributo; < priate:/pu!lic: > Funcion/procedimiento(); Funcion/procedimiento(); Funcion/procedimiento(); }; -os datos y funciones miembro pueden ser definidos como private o public. 1&.6%/4: slo pueden ser accesados desde funciones miembro. 1"3,.0: pueden ser accesados directamente, sin utilizar funciones miembro. 6sualmente se debe declarar los datos miembro tipo private y las funciones miembro tipo public. Para accesar desde fuera del ob9eto a sus datos p;blicos y funciones miembro p;blicas escribe. [ nombre del ob9eto V.[ dato miembro V [ nombre del ob9eto V.[ funcion miembro V C(28/&"0/(&: 6n constructor es una funcin miembro que permite inicializar los datos miembro de un ob9eto. /iene las siguientes caracter.sticas2 E (u nombre es igual al de la clase. E 0o devuelve valores. E Puede haber ms de un constructor. E (e invoca al momento de declarar al ob9eto. D48/&"0/(&: 6n destructor es una funcin que permite liberar el rea de memoria ocupada por un ob9eto cuando este ya no va ser usado .(us caracter.sticas son2 E (u nombre es igual al de la clase pero precedido por el s.mbolo J f K. E 0o devuelve valores. E (lo puede haber un destructor. E (e invoca al momento de salir o abandonar el mbito donde fue creado el ob9eto. Ing. Carol Rojas Moreno -5 #include <iostream> #include <string> using namespace std; class alumno { private: string nombre; string carrera; public: alumno(); ~alumno(); void ingresar(); void imprimir(); }; alumno::alumno() { nombre=" "; carrera=" "; } alumno::~alumno() { } void alumno::ingresar() { cout<<"Ingrese nombre: "; cin>>nombre; cout<<"Ingrese carrera: "; cin>>carrera; } void alumno::imprimir() { cout<<"Nombre Alumno: "; cout<<nombre<<"\n"; cout<<"Carrera: "; cout<<carrera<<"\n"; } void main() { alumno al; cout<<"Ingrese Alumno";cout<<"\n"; al.ingresar();cout<<"\n"; cout<<"Mostrar Alumno"<<"\n"; al.imprimir();cout<<"\n\n"; cout<<"Eliminar Alumno"<<"\n"; al.~alumno();cout<<"\n"; cout<<"Mostrar Alumno"<<"\n"; al.imprimir();cout<<"\n"; system("PAUSE"); } E=4*1,( 54 P&(-&%*% O&.42/%5( % O3=4/(8 -* Ing. Carol Rojas Moreno 4+ E8/&"0/"&%8 54 D%/(8 D.2;*.0%8 (on aquellas en las que no es necesario reservar espacio de memoria antes de e9ecutar el programa, ya que este espacio se puede asignar durante su e9ecucin seg;n se necesite. $s. mismo dicho espacio puede ser liberado para poder ser utilizado por otros datos. E9emplos2 2 -istas 2 Pilas 2 :olas 2 grboles 2 <rafos PUNTEROS 6n puntero es un tipo especial de variable, que almacena el valor de una direccin de memoria, esta direccin puede ser la de una variable individual, pero mas frecuentemente ser la de un elemento de un array, una estructura u ob9eto de una clase. -os punteros, tambien pertenecen a un tipo, se dice que un puntero hapunta ah ese tipo al que pertenece. MEMORIA 200 p 800 800 x 23
p es una variable tipo puntero. x es una variable tipo int apuntada por p. D40,%&%0.)2 54 6%&.%3,48 /.1( 1"2/4&( tipo de dato apuntado S variable tipo puntero2 E9emplos2 int *p; ?? p es una variable tipo puntero que apunta a una variable tipo int. float *q; ?? q es una variable tipo puntero que apunta a una variable tipo float. char *r; ?? r es una variable tipo puntero que apunta a una variable tipo char. Ing. Carol Rojas Moreno -+ Para hacer referencia a la variable apuntada se usa la notacin2 Svariable tipo puntero E9emplo2 MEMORIA 200 p 800 800 x 23 *p
Sp es otro nombre para la variable x Variables estticas (on aquellas que se declaran expresamente en los programas y a las que el sistema operativo asigna una posicin de memoria antes de la e9ecucin del mismo. Variables dinmicas (on variables que se crean y se destruyen durante la e9ecucin del programa. 0o son declaradas expl.citamente en los programas. O14&%5(& H 4evuelve la direccin de memoria de una variable. (u sintaxis es2 W nombre de variable -, Ing. Carol Rojas Moreno E9emplo2 #include <iostream> using namespace std; void main () { int x,y; ?? Pariables de tipo entero int *px; ?? Puntero a una variable de tipo entero ?? -eemos la direccin =compartimiento> de la variable =informe> x mediante W y lo almacenamos en la variable puntero px
px = &x; ?? px contiene la direccin en la que se encuentra x
?? 6tilizando el operador S, podemos acceder a su informacin. Spx representa ahora el valor de la variable x
*px = 10; ?? $hora x contiene el valor "#
cout<<x;cout<<"\n"; ?? Pisualiza si x tiene el valor que recibi su puntero px cout<<*px;cout<<"\n"; ?? Pisualiza el valor de x
y = 15;
?? (i ahora hacemos que el puntero apunte a la variable y utilizando de nuevo el operador W
px = &y;
cout<<y<<"\n"; ??visualiza el valor de y
?? El valor que ahora toma Spx ser el valor de y puesto que es el compartimiento al que ahora estamos apuntando
*px = 125; ?? $hora y contiene el valor "+ x = *px; ?? $hora x contiene tambin "+ cout<<y<<"\n"; ??visualiza el nuevo valor de y cout<<x<<"\n"; ??visualiza el nuevo valor de y
cout<<*px<<"\n"; ??Pisualiza el valor de x
cout<<&x<<"\n"; ??visulaiza la direccion de memoria cout<<px<<"\n"; ??visualiza la direccion de memoria } Ing. Carol Rojas Moreno -- C&4%0.)2 54 6%&.%3,48 5.2;*.0%8 Para crear variables dinmicas se usa el ob9eto 24I cuya sintaxis es la siguiente2 2aria'le !e "i,o ,%n"ero ( neK "i,o !e !a"o !e la 2aria'le crea!a ) E9emplo2 int *p; float *q; p = new int; // crea una variable dinmica de tipo int y hace que p apunte a ella. q = new float; // crea una variable dinmica de tipo float y hace que q apunte a ella. NOTA: 0o se puede asignar un valor constante a una variable tipo puntero ni ingresar un valor por teclado para ella. int *p; p = 800; EE ERROR cin>>p; EE ERROR (i es posible imprimir el valor de un puntero2 cout<<p; E9emplo2 void main() { int *p, *q; p = new int; *p = 8; q = p; } E9emplo2 void main() { int *p, *q; p = new int; q = new int; *p = 8; *q = *p; } .// Ing. Carol Rojas Moreno NOTA: 0o se puede asignar una variable tipo puntero a otra que no sea de su mismo tipo. int *p, *q; float *r; p = new int; *p =7; q = p; r = p; E,.*.2%0.)2 54 6%&.%3,48 5.2;*.0%8 !ele"e L2aria'le "i,o ,%n"ero <%e a,%n"a a la 2aria'le !in$#ica <%e ser$ eli#ina!a6M (e libera el espacio ocupado por la variable dinmica para poder ser utilizado nuevamente. -a variable tipo puntero que la apuntaba mantiene de la variable dinmica, aunque ya no tenga significado su apuntamiento. void main() { int *p; p = new int; *p = 17; cout<<p; delete p; cout<<p; } C(28/%2/4 NULL Es una constante predefinida en :II cuyo valor es cero =#> y sirve para inicializar una variable tipo puntero que no apunta a ninguna variable. 2aria'le "i,o ,%n"ero ; NULLM void main() { int *p; p = new int; *p = 17; cout<<p; delete p; cout<<p; p = NULL; cout<<p; } Ing. Carol Rojas Moreno ./.
4+1 E8/&"0"/&%8 54 D%/(8 D.2;*.0%8 L.24%,48 4+1+1 LISTAS ENLAZADAS 6na lista enlazada es una estructura de datos dinmica formada por un con9unto de elementos llamados nodos. :ada nodo consta de dos partes2 E 6na que contiene el dato. E 8tra que contiene la direccin del siguiente nodo. Nodo D"o di#ecci7n de) nodo si60iene -os nodos son variables dinmicas que se crean y destruyen de acuerdo a los requerimientos del proceso. 2 Para acceder a la lista es necesario un puntero que contenga la direccin del primer nodo. 2 (i la lista est vac.a dicho puntero tendr el valor 06--. 2 El ;ltimo elemento de la lista se reconoce porque su puntero al siguiente tiene valor 06--. R41&4842/%0.)2 G&;9.0% 54 "2% L.8/% E2,%G%5% Lis" N0)o LISTAS SIMPLEMENTE ENLAZADAS Es un con9unto de elementos en los que cada elemento contiene la posicin o direccin del sgte. campo de la -ista. 4onde cada elemento de la lista simplemente enlazada llamado nodo se define2 struct nodo{ int n; //el campo puede ser string, float, estructura, etc. nodo * sgte; // direccin al siguiente nodo }; ./2 Ing. Carol Rojas Moreno .2 3/ 2. 54 NULL NULL Lis" ListasSE.h #include <iostream> #include <string> #define MAX 100 using namespace std; struct nodo { int dato; nodo *sig; }; typedef nodo *pnodo; class lista { private: pnodo pL; public: lista(); ~lista(); void insertar_comienzo(); void insertar_final(); void insertar_despues(); void eliminar_inicio(); void eliminar_final(); void buscar(); pnodo buscar_despues(int x); void buscar_anterior(); void imprimir(); }; lista::lista() { pL = NULL; } lista::~lista() { pnodo p,q; if ( pL != NULL ) { p = pL; while ( p != NULL ) { q = (*p).sig; delete p; p = q; } pL=p; } } Ing. Carol Rojas Moreno ./3 void lista::insertar_comienzo() { pnodo nuevo; int valor; cout<<"Ingrese dato:";cin>>valor; nuevo = new nodo; (*nuevo).dato = valor; (*nuevo).sig = pL; pL = nuevo; } void lista::insertar_final() { pnodo nuevo,aux; nuevo = new nodo; int valor; cout<<"Ingrese dato:"; cin>>valor; (*nuevo).dato = valor; (*nuevo).sig = NULL; if ( pL == NULL ) pL = nuevo; else { aux = pL; while ( (*aux).sig != NULL ) aux = (*aux).sig; (*aux).sig = nuevo; } } void lista::insertar_despues() { pnodo nuevo,r,temp; int num; nuevo=new nodo; cout<<"Ingrese dato"; cin>>(*nuevo).dato; cout<<"Ingrese despues del alumno con codigo"; cin>>num; r=lista::buscar_despues(num); if(r==NULL) { cout<<"Lista vacia o no se encontro"; }
else { while((*aux).sig!=NULL) { temp=aux; aux=(*aux).sig; } (*temp).sig=NULL; } cout<<"elemento eliminado"<<(*aux).dato ; delete aux; } } void lista::imprimir() { pnodo p; if ( pL == NULL ) cout<<"Lista vacia"<<endl; else { p = pL; while (p != NULL) { cout<<(*p).dato<<" -> "; p = (*p).sig; } cout<<"NULO"<<endl; } } ListasSE.cpp #include <iostream.h> #include "ListasSE.h" using namespace std; void main() { lista L; pnodo b; int valor,opc; do { cout<<"\nmenu"; cout<<"\n1 insertar al inicio"; cout<<"\n2 insertar al final"; cout<<"\n3 insertar despues del nmero"; cout<<"\n4 Eliminar al inicio"; cout<<"\n5 Eliminar al final"; cout<<"\n6 Eliminar Lista"; cout<<"\n7 Buscar en lista"; cout<<"\n8 Buscar Anterior en lista"; cout<<"\n9 Visualizar lista"; cout<<"\n10 Salir"; do { cout<<"\n Seleccione opcin"; cin>>opc; } while(opc>10); Ing. Carol Rojas Moreno ./+ switch(opc) { case 1:L.insertar_comienzo();break; case 2:L.insertar_final();break; case 3:L.insertar_despues();break; case 4:L.eliminar_inicio();break; case 5:L.eliminar_final();break; case 6:L.~lista();break; case 7:L.buscar();break; case 8:L.buscar_anterior();break; case 9:L.imprimir();break; } } while(opc!=10); } LISTAS ENLAZADAS CIRCULARES 6na -ista Enlazada :ircular = -E: > es un con9unto de nodos. :ada nodo es un registro que tiene dos campos2 6n campo para almacenar informacin de alg;n tipo de dato y otro campo tipo puntero que contiene la direccin del nodo siguiente. -a particularidad que presenta una -ista Enlazada :ircular es que el ;ltimo nodo de la lista no contiene 06-8 en su campo 8.- sino la direccin del primer nodo, lo que le da la caracter.stica circular a la lista. Para tener acceso a la lista es necesario un puntero -c que contenga la direccin del primer nodo. ListaC
LISTAS DO:LEMENTE ENLAZADAS 6na -ista 4oblemente Enlazada = -4E > es un con9unto de nodos. :ada nodo es un registro que tiene tres campos2 6n campo para almacenar informacin de alg;n tipo de dato y dos campos tipo puntero que contienen las direcciones de los nodos anterior y siguiente respectivamente. <racias a los punteros ant y sig es que puede recorrerse la -4E en forma bidireccional, lo cual constituye una venta9a importante frente a una lista enlazada simple que slo puede recorrerse en un sentido. En contraparte, el espacio ocupado en memoria es mayor debido a la inclusin de un segundo puntero. Para tener acceso a la lista es necesario un puntero -d que contenga la direccin del primer nodo. El campo %2/ del primer nodo tiene valor 06-8, pues no existe un nodo anterior a este, anlogamente, el ;ltimo nodo tiene tambin en su campo 8.- el valor 06-8 para expresar el hecho de que no existe un siguiente nodo. ListaDE NULL
NULL ./, Ing. Carol Rojas Moreno ant dato sig .2 3/ 2. 54 .2 3/ 2. 54 4+1+2 C(,%8 6na :ola es una lista ordenada de elementos en la cual las inserciones se realizan por un extremo llamado ,inal y las eliminaciones por el otro extremo denominado ,rente. 6na :ola es una estructura tipo ,!,8 = ,irst !n E ,irst 8ut > ya que los elementos se sacan de la cola en el mismo orden en que fueron insertados. -a estructura de los nodos de una cola es la siguiente2 Para especificar una cola son necesarios dos punteros, uno que apunte al primer elemento de la cola y el otro al ;ltimo elemento de la cola. Cola NULL
En una cola se definen dos operaciones2 E20(,%&: insertar un nuevo elemento al final de la cola D48420(,%&: eliminar el elemento del comienzo de la cola Cola.h #include <iostream> using namespace std; struct nodo { int dato; nodo *sig; }; typedef nodo *pnodo; class cola { private: pnodo pL; public: cola(); ~cola(); void encolar(); void desencolar(); void mostrar(); }; cola::cola() { pL = NULL; } cola::~cola() { pnodo p,q; if ( pL != NULL ) { p = pL;
Ing. Carol Rojas Moreno ./- dato sig .2 3/ 2. 54 while ( p != NULL ) { q = (*p).sig; delete p; p = q; } pL=p; } } void cola::encolar() { pnodo nuevo,aux; nuevo = new nodo; int valor; cout<<"Ingrese valor:"; cin>>valor; (*nuevo).dato = valor; (*nuevo).sig = NULL; if ( pL == NULL ) pL = nuevo; else { aux = pL; while ( (*aux).sig != NULL ) aux = (*aux).sig; (*aux).sig = nuevo; } } void cola::desencolar() { pnodo aux; if(pL==NULL) { cout<<"cola vacia"; } else { aux=pL; if((*pL).sig==NULL) // un nodo { pL=NULL; } else { pL=(*pL).sig; } cout<<"elemento eliminado"<<(*aux).dato; delete aux; } } void cola::mostrar() { pnodo p; if ( pL == NULL ) cout<<"cola vacia"<<endl; else { p = pL; while (p != NULL) { cout<<(*p).dato<<" -> "; p = (*p).sig; } cout<<"NULO"<<endl; } } ../ Ing. Carol Rojas Moreno Cola.cpp #include <iostream> #include "Cola.h" using namespace std; void main() { cola C; int opc; do { cout<<"\nmenu"; cout<<"\n1 encolar"; cout<<"\n2 desencolar"; cout<<"\n3 mostrar"; cout<<"\n4 Salir"; do { cout<<"\n Seleccione opcin"; cin>>opc; } while(opc>4); switch(opc) {case 1:C.encolar();break; case 2:C.desencolar();break; case 3:C.mostrar();break; } } while(opc!=4); } 4+1+3 P.,%8 6na Pila es una lista de elementos en la cual las inserciones y las eliminaciones se realizan por un mismo extremo llamado :ima. 6na Pila es una estructura tipo -!,8 = -ast !n E ,irst 8ut > ya que los elementos se sacan de la pila en orden contrario al que fueron insertados. -a estructura de los nodos de una pila es la siguiente2 Para especificar una pila es necesario un puntero, que apunte al primer elemento de la pila, es decir a la cima. Pila NULL
En una pila slo estn permitidas dos operaciones2 A1.,%&: !nsertar un elemento por el lado de la cima D48%1.,%&: Eliminar el elemento de la cima de la pila Ing. Carol Rojas Moreno ... dato sig .2 3/ 2. 54 Pila.h #include<iostream> using namespace std; struct nodo { int dato; nodo *sig; }; typedef nodo *pnodo; class stack { private: pnodo pL; public: stack(); ~stack(); void apilar(); void desapilar(); void mostrar(); }; stack::stack() { pL = NULL; } stack::~stack() { pnodo p,q; if ( pL != NULL ) { p = pL; while ( p != NULL ) { q = (*p).sig; delete p; p = q; } pL=p; } } void stack::apilar() { pnodo nuevo; int valor; cout<<"Ingrese dato:";cin>>valor; nuevo = new nodo; (*nuevo).dato = valor; (*nuevo).sig = pL; pL = nuevo; } ..2 Ing. Carol Rojas Moreno void stack::desapilar() {pnodo aux=pL,temp; if(pL==NULL) { cout<<"Pila vacia"; } else { if((*pL).sig==NULL) { pL=NULL; } else { while((*aux).sig!=NULL) { temp=aux; aux=(*aux).sig; } (*temp).sig=NULL; } cout<<"elemento eliminado"<<(*aux).dato; delete aux; } } void stack::mostrar() { pnodo p; if ( pL == NULL ) cout<<"Pila vacia"<<endl; else { p = pL; while (p != NULL) { cout<<(*p).dato<<" -> "; p = (*p).sig; } cout<<"NULO"<<endl; } } Pila.cpp #include <iostream> #include "Pila.h" using namespace std; void main() { stack S; int opc; do { cout<<"\nmenu"; cout<<"\n1 apilar"; cout<<"\n2 desapilar"; cout<<"\n3 mostrar"; cout<<"\n4 Salir"; do { cout<<"\n Seleccione opcin"; cin>>opc; } while(opc>4); switch(opc) {case 1:S.apilar();break; case 2:S.desapilar();break; case 3:S.mostrar();break; } } while(opc!=4); } Ing. Carol Rojas Moreno ..3
4+2 E8/&"0/"&%8 54 D%/(8 D.2;*.0%8 N( L.24%,48 4+2+1 @&3(,48 6n rbol es un con9unto de nodos, en el que existe un nodo distinguido llamado %a.z y cero o ms subrboles, cada uno de los cuales tiene su ra.z conectada a la ra.z por medio de una arista. E9emplo2 A * C D E + G , I J - L M N P . C(2041/(8 :;8.0(8 8(3&4 @&3(,48 H(=% /odo nodo que no tiene hi9os. E9emplo2 ), :, Y, !, P, Q, B, -, L, 0 C%*.2( Enlace entre dos nodos consecutivos y rama es un camino que termina en ho9a. E9emplo2 camino = $ , Q > H $ _ E _ M _ Q L(2-./"5 54, 0%*.2( Es la cantidad de aristas que conforman un camino. E9emplo2 longitudTcamino = $ , Q > H & N.64, :ada nodo tiene asociado un nivel, determinado por la logintud de camino desde la raiz hasta el nodo especifico. E9emplo2 0ivel # $ 0ivel " ),:,4,E,,,< 0ivel + Y,!,M,B,-,L,0 0ivel & P,Q P&(9"25.5%5 54 "2 %&3(, Es el numero maximo de nodos en una rama. Es decir nivel mas alto de los nodos mas uno. E9emplo2 profundidad H nivel I" profundidad H & I" H ' ..4 Ing. Carol Rojas Moreno R41&4842/%0.)2 P&.*4& H.=( J S.-".42/4 H4&*%2( :ada nodo del rbol solo tiene dos punteros, uno para apuntar a su primer hi9o y otro para apuntar a su siguiente hermano. A * C D E + G , I J - L M N P . #include <iostream> #define MAX 10 using namespace std; struct nodo { int dato; nodo * hijo; nodo * her; }; typedef nodo *pnodo; class arbol {private: pnodo rpri; public: arbol(); ~arbol(); pnodo buscar(pnodo aux, pnodo pos,int d); pnodo mostrar(pnodo aux); void inserta_principal(); void inserta_hijo(); void inserta_hermano(); }; arbol::arbol() {rpri =NULL;} arbol::~arbol() { } pnodo arbol::buscar(pnodo aux, pnodo pos, int d) { pnodo aux2; if (aux==NULL) { pos=NULL; }
Ing. Carol Rojas Moreno ..5 else { if((*aux).dato ==d) { pos=rpri; } else { aux2=(*aux).hijo; do { while(aux2!=NULL && (*aux2).hijo ==NULL) { if((*aux2).dato==d) { pos=aux2; return pos; } aux2=(*aux2).her; } if(aux2==NULL && pos==NULL) return NULL; pos=buscar(aux2,pos,d); aux2=(*aux2).her; }while(aux2!=NULL); } } return pos; } pnodo arbol::mostrar(pnodo aux) {pnodo aux2, pos; aux=rpri; if (aux==NULL) { cout<<"\t--*** No existe arbol ***--"<<endl; } else { cout<<(*aux).dato<<endl; aux2=(*aux).hijo; do { while(aux2!=NULL && aux2->hijo==NULL) { cout<<aux2->dato<<endl; aux2=aux2->her; } if(aux2==NULL) return NULL; pos=mostrar(aux2); aux2=aux2->her; }while(aux2!=NULL); } return pos; } void arbol::inserta_principal() {rpri = new nodo; cout<<"\t Ingresar la raiz: "; cin>>rpri->dato; cout<<endl; rpri->hijo=NULL; } ..* Ing. Carol Rojas Moreno void arbol::inserta_hijo() {nodo *hij,*pos=NULL; int num; hij=new nodo; cout<<"-- ***De que nodo desea que sea el hijo: "; cin>>num; cout<<endl; pos=buscar(rpri,pos,num); if(pos==NULL) { cout<<"\t--** Arbol vacio o no se encontro **--"; } else { if(rpri->hijo==NULL) { cout<<"\t Ingrese nro a insertar: "; cin>>hij->dato; pos->hijo=hij; hij->her=NULL; hij->hijo=NULL; } else cout<<"***--NO SE PUEDE INGRESAR UN HIJO A LA RAIZ PRINCIPAL-- ***"<<endl; } } void arbol::inserta_hermano() {pnodo herma,pos=NULL; int num; herma=new nodo; cout<<"\t De que nodo desea que sea el hermano: "<<endl; cin>>num; if(num==rpri->dato) cout<<"***--NO SE PUEDE INGRESAR UN HERMANO A LA RAIZ PRINCIPAL--***"<<endl; else { pos=buscar(rpri,pos,num); if(pos==NULL) { cout<<"\t---*** Arbol vacio o no se encontro ***---"<<endl; } else { cout<<"\t Ingrese nro a insertar: "; cin>>herma->dato; pos->her=herma; herma->her=NULL; herma->hijo=NULL; } } } Ing. Carol Rojas Moreno ..+ void main() { int opc; arbol p; pnodo pos, rpri=NULL;
bool band=false; do { cout<<endl;cout<<"\t --- MENU --- "<<endl<<endl; if(band==false) { cout<<"\t 1 -> insertar raiz principal"<<endl; band=true; } else { cout<<"\t 2 -> insertar hijos"<<endl; cout<<"\t 3 -> insertar hermano"<<endl; cout<<"\t 4 -> Visualizar Arbol"<<endl; cout<<"\t 5 -> Salir"<<endl; } do {cout<<"\t Seleccione opcion: "; cin>>opc; cout<<endl; }while(opc>8); switch(opc) {case 1:p.inserta_principal();break; case 2:p.inserta_hijo();break; case 3:p.inserta_hermano();break; case 4:pos=p.mostrar(rpri);break; } } while(opc!=5); } 4+2+2 @&3(,48 :.2%&.(8 6n grbol )inario es aquel en el que cada uno de sus nodos puede tener #, " o + hi9os. Rai/ Su0a102l I/3ui4152 Su0a102l D414c62 E9emplo2 A * C D E + G .., Ing. Carol Rojas Moreno R40(&&.5( 54 @&3(,48 :.2%&.(8 %ecorrer un rbol binario significa visitar cada uno de sus nodos para poder procesar su informacin. %) R40(&&.5( 42 O&542 %ecorrer el subrbol izquierdo en (&542 Pisitar el nodo ra.z %ecorrer el subrbol derecho en (&542 3) R40(&&.5( 42 P&4>O&542 Pisitar el nodo ra.z %ecorrer el subrbol izquierdo en 1&4>(&542 %ecorrer el subrbol derecho en 1&4>(&542 0) R40(&&.5( 42 P(8/>O&542 %ecorrer el subrbol izquierdo en 1(8/>(&542 %ecorrer el subrbol derecho en 1(8/>(&542 Pisitar el nodo ra.z @&3(, 54 E<1&48.)2 Es un rbol binario en el que las ho9as contienen los operandos y los nodos internos los operadores de una expresin matemtica. E9emplo2 ( a ( ! " c # # $ ( ( d " e # % & # ' g # 7 8 a 9 0 c : f 5 4 ; ; < 4+2+3 @R:OLES :INARIOS DE :KS!UEDA ( A:: ) 6n $)) es un rbol binario en el que para todos sus nodos = excepto sus ho9as > se cumple que el dato almacenado en l, es mayor a todos los datos de los nodos del subrbol izquierdo pero menor a todos los datos de los nodos del subrbol derecho. E9emplo2 = > ? ! @ % !A " Ing. Carol Rojas Moreno ..- Para poder tener acceso al rbol es necesario un puntero que contenga la direccin de la ra.z. a(!ola!!.h #include<iostream> using namespace std; struct nodoABB.h { nodoABB *hizq; int dato; nodoABB *hder; }; typedef nodoABB *pnodoABB; class abb { private: pnodoABB praiz; public: abb(); ~abb(); pnodoABB getraiz(); pnodoABB buscar( int x ); void insertar( int x ); void imprimeenorden( pnodoABB p ); void imprimepreorden( pnodoABB p ); void imprimepostorden( pnodoABB p ); void eliminaarbol( pnodoABB p ); }; abb::abb() { praiz = NULL; } abb::~abb() { eliminaarbol(praiz); praiz = NULL; } pnodoABB abb::getraiz() { return praiz;} pnodoABB abb::buscar( int x ) { pnodoABB p; int ok; if ( praiz == NULL ) return NULL; else { ok = 0; p = praiz; while ( p != NULL && ok == 0 ) if ( (*p).dato == x ) ok = 1; else if ( x < (*p).dato ) p = (*p).hizq; else p = (*p).hder; return p; } } .2/ Ing. Carol Rojas Moreno void abb::insertar( int x ) { pnodoABB p,q,r,pos; char h; p = new nodoABB; (*p).dato = x; (*p).hizq = NULL; (*p).hder = NULL; if ( praiz == NULL ) praiz = p; else { pos=buscar(x); if(pos!=NULL) cout<<"Elemento ya existe"; else { q = praiz; while ( q != NULL ) { r = q; if ( x < (*q).dato ) { q = (*q).hizq; h = 'i'; } else { q = (*q).hder; h = 'd'; } } if ( h == 'i' ) (*r).hizq = p; else (*r).hder = p; } } } void abb::imprimeenorden( pnodoABB p ) { pnodoABB Ai,Ad; if ( p != NULL ) { Ai = (*p).hizq; Ad = (*p).hder; imprimeenorden(Ai); cout<<(*p).dato<<" "; imprimeenorden(Ad); } } void abb::imprimepreorden( pnodoABB p ) { pnodoABB Ai,Ad; if ( p != NULL ) { Ai = (*p).hizq; Ad = (*p).hder; cout<<(*p).dato<<" "; imprimepreorden(Ai); imprimepreorden(Ad); } } Ing. Carol Rojas Moreno .2. void abb::imprimepostorden( pnodoABB p ) { pnodoABB Ai,Ad; if ( p != NULL ) { Ai = (*p).hizq; Ad = (*p).hder; imprimepostorden(Ai); imprimepostorden(Ad); cout<<(*p).dato<<" "; } } void abb::eliminaarbol( pnodoABB p ) { pnodoABB Ai,Ad; if ( p != NULL ) { Ai = (*p).hizq; Ad = (*p).hder; eliminaarbol(Ai); eliminaarbol(Ad); delete p; } } )(!ol*ina(io.cpp #include <iostream.h> #include "arbolabb.h" using namespace std; void main() { abb A; pnodoABB b,r; int i, x, sn, n, cn,opc; do { cout<<"\n Menu \n"; cout<<"\n1 insertar nodo"; cout<<"\n2 mostrar in orden"; cout<<"\n3 mostrar pre orden"; cout<<"\n4 mostrar post orden"; cout<<"\n5 Salir"; do { cout<<"\n\n Seleccione opcion: "; cin>>opc; } while(opc>5); switch(opc) { case 1:{cout<<"Ingrese hoja: "; cin>>x; A.insertar(x); r = A.getraiz(); }break; case 2:A.imprimeenorden(r);break; case 3:A.imprimepreorden(r);;break; case 4:A.imprimepostorden(r);break; }
} while(opc!=5); } .22 Ing. Carol Rojas Moreno 4+2+4 G&%9(8 En matemticas y en ciencias de la computacin, un grafo es el ob9eto abstracto bsico de estudio en teor.a de los grafos. !nformalmente, un grafo se concibe y se representa como un con9unto de ob9etos llamados vrtices o nodos unidos por enlaces llamados aristas. -as aristas pueden tener direccin =grafo dirigido>. 6n grafo consta de vrtices =o nodos> y aristas. -os vrtices son ob9etos que contienen informacin y las aristas son conexiones entre vrtices. Para representarlos, se suelen utilizar puntos para los vrtices y l.neas para las conexiones, aunque hay que recordar siempre que la definicin de un grafo no depende de su representacin. 6n camino entre dos vrtices es una lista de vrtices en la que dos elementos sucesivos estn conectados por una arista del grafo. El grafo ser conexo si existe un camino desde cualquier nodo del grafo hasta cualquier otro. (i no es conexo constar de varias componentes conexas. 6n camino simple es un camino desde un nodo a otro en el que ning;n nodo se repite =no se pasa dos veces>. (i el camino simple tiene como primer y ;ltimo elemento al mismo nodo se denomina ciclo. :uando el grafo no tiene ciclos tenemos un rbol =ver rboles>. Parios rboles independientes forman un bosque. 6n rbol de expansin de un grafo es una reduccin del grafo en el que solo entran a formar parte el n;mero m.nimo de aristas que forman un rbol y conectan a todos los nodos. (eg;n el n;mero de aristas que contiene, un grafo es completo si cuenta con todas las aristas posibles =es decir, todos los nodos estn conectados con todos>, disperso si tiene relativamente pocas aristas y denso si le faltan pocas para ser completo. -as aristas son la mayor parte de las veces bidireccionales, es decir, si una arista conecta dos nodos $ y ) se puede recorrer tanto en sentido hacia ) como en sentido hacia $2 estos son llamados !ra"os no diri!idos. (in embargo, en ocasiones tenemos que las uniones son unidireccionales. Estas uniones se suelen dibu9ar con una flecha y definen un !ra"o diri!ido. :uando las aristas llevan un coste asociado =un entero al que se denomina peso> el grafo es ponderado. 6na red es un grafo dirigido y ponderado. Grafo no dirigido Grafo dirigido Propiedades 4os aristas de un grafo son llamadas adyacentes si tienen un vrtice en com;n. 4e forma similar, dos vrtices son llamados adyacentes si una arista los une. (e dice que una arista es incidente a un vrtice si sta lo une a otro. (i un grafo slo tiene un vrtice y ninguna arista, se le conoce como trivial. (i un grafo no tiene ni vrtices ni aristas, se conoce como vac.o nulo, aunque no hay un consenso sobre si deba de seguir existiendo, ya que no cumple con muchas propiedades. En un grafo d.grafo ponderado, a cada arista se le asocia un valor, como costo, peso, longitud, etc. seg;n sea lo que modele, en general se usan para problemas de optimizacin como el problema del vendedor o el camino ptimo. 0ormalmente los vrtices y las aristas de un grafo, por su naturaleza como elementos de un con9unto, son distinguibles. Este tipo de grafos son llamados etiquetados, tambin pueden slo etiquetarse los vrtices o aristas. Ing. Carol Rojas Moreno .23 Ejemplos -a imagen es una representacin del siguiente grafo2 #2Hi",+,&,',,7j $2Hii",+j,i",j,i+,&j,i+,j,i&,'j,i',j,i',7jj El hecho que el vrtice " sea adyacente con el vrtice + puede ser denotado como " f +. En la /eor.a de las categor.as una categor.a puede ser considerada como un multigrafo dirigido, con los ob9etos como vrtices y los morfismos como aristas dirigidas. En ciencias de la computacin los grafos dirigidos son usados para representar mquinas de estado finito y algunas otras estructuras discretas. 6na relacin binaria R en un con9unto % es un grafo dirigido simple. 4os vrtices a, b en % estn conectados por una arista dirigida ab si aRb. .24 Ing. Carol Rojas Moreno :I:LIOGRAFIA N AUTOR TITULO EDITORIAL " M8]$0E( $<6!-$%, -uis ,undamentos de Programacin Editorial Lc<ra@EYill, :olombia, +##&. + %$,,8 -E::$, Eduardo /urbo :II Lundigraf, -imaEPer;, +### Ing. Carol Rojas Moreno .25 .2* Ing. Carol Rojas Moreno UNIDAD N 04 FICHEROS (ARCHIVOS) COMPETENCIA DE LA UNIDAD !"#$ $l trmino dela unidad se espera que el alumno elabore programas computacionales usando un tipo de almacenamiento de datos pero ya no temporales, en formato texto. P%&% '"#$ Para permitir la me9or manipulacin y modificacin de los datos almacenados, y as. conocer las primeras formas de almacenamiento computacional. P(& '"#$ Esto le permitir valorar el almacenamiento de datos en formatos permanentes que posteriormente se reemplazarn por registros y tablas en asignaturas posteriores. C)*($ (e mantiene el uso de mdulos de programa y de librer.as de cabecera para programas computacionales invocando a ficheros de almacenamiento. Ing. Carol Rojas Moreno .2+ FICHEROS (ARCHIVOS) INTRODUCCION $l conocer el uso de estructuras de datos como formas de almacenar informacin, se encuentra la dificultad de que dicho almacenamiento es temporal, es decir en tiempo de e9ecucin del programa computacional. 8tra tcnica de almacenar los datos pero que perduren con los cambios realizados sobre los mismos, se denomina ,icheros =$rchivos>. Para utilizar los ,icheros, es necesario conocer los conceptos de campos, registros, base de datos, que sirven para manipular los datos, es decir registrarlos, eliminarlos, modificarlos, los cuales permaneceran almacenados permanentemente en el computador. Existen tipos para acceder a los archivos, de manera secuencial =de inicio a fin del fichero>, y de manera aleatoria =acceden a cualquier parte del archivo>. .2, Ing. Carol Rojas Moreno +IC,EROS BARC,ICOSD 1+ F.0L4&(8 (A&0L.6(8) Existen programas que traba9an con informacin almacenada en memoria principal, pero no es apropiado por que2 E -os datos con los que necesita traba9ar el programa son demasiado grandes =ocupan mucha memoria> para que entren en la memoria principal. E !nteresa mantener la informacin despus de cada e9ecucin, por eso se necesita utilizar datos procedentes de otros programas =editores, etc.>, o generar datos para que puedan ser utilizados por otros programas. Para estos casos se necesitan ficheros para contener la informacin en memoria secundaria =disco duro, cds, etc.>. 2+ C(2041/(8 :%8.0(8 CAMPO El campo es la unidad minima de informacin de un registro. Es un item de campos elementales como nombre, numero de empleados, ciudad, etc. -os caracteres se agrupan en campos de datos. (e caracteriza por su tamano o longitud y su tipo de dato, por lo general se supone como longitud fi9a. E9emplo2 Ca#,os No#'re Direccion Fec(aNaci#ien"o -os datos contenidos en un campo pueden dividirse en subcampos. E9emplo para el campo fecha2 7 I 7 > + 7 7 F Dia Mes Ano REGISTRO Es una coleccin de informacin por lo general relacionada a una entidad en particular. -os registros organizados en campos se llaman registros logicos. E9emplo2 E#,lea!o Pueden ser todos de longitud fi9a, es decir para el e9emplo anterior, los registros empleados pueden contener el mismo n;mero de campos2 nombre, fecha de nacimiento, direccion, etc. Ing. Carol Rojas Moreno .2- No#'re Direccion Fec(aNaci#ien"o FICHERO Es una coleccin de registros relacionados entre si, con aspectos en comun y oranizados para un proposito especifico. E9emplo2 Fic(ero3 Clase !e Al%#nos :ASE DE DATOS Es una coleccin de archivos que contienen datos relacionados y se acceden a traves de un con9unto de programas. En :II un fichero es simplemente un flu9o externo que se puede abrir para entrada =dando lugar a un "lu&o de archivo de entrada>, para salida =dando lugar a un "lu&o de archivo de salida> o para entradaEsalida =archivo o fichero de entradaEsalida o archivo de E?(>. 6na biblioteca en :II que proporciona JfuncionesK y operadores para el mane9o de ficheros es la biblioteca "stream. kinclude [fstreamV 3+ D49.2.0.)2M A14&/"&% F C.4&&4 54 F.0L4&(8+ 'eclaracin de #ariables de tipo (Fichero(: ifstream nombrefichero; // Para ficheros de entrada ofstream nombrefichero; // Para ficheros de salida )pertura de Ficheros de *exto: +-a lectura y la escritura en un archivo de texto se puede realizar directamente con los operadores [[ y VV al igual que se realiza sobre los flu9os estndares cin y cout. .3/ Ing. Carol Rojas Moreno ====== Maria Lo,e? C%?co +=> ++++++ N%an Sanc(e? Real >EH Co!igo No#'re Direccion IIIIII Pa'lo So"o Real +=* EEEEEE L%is Men!e? Ancas( FGI Regis"ro3 // Apertura para Lectura in.open(nombrefichero); // Apertura para Escritura(borra el contenido si lo hubiera) out.open(nombrefichero); // Apertura para aadir datos al final out.open(nombrefichero,ios::app); // Apertura para Lectura y Escritura in.open(nombrefichero,ios::in|ios:: out); // Apertura para Lectura y Escritura out.open(nombrefichero,ios::in|ios:: out); )pertura de Ficheros ,inarios: /iene la informacin tal cual est en memoria, es decir, sin convertirla a texto, -a manera de leer y escribir en ficheros binarios consiste en utilizar las funciones read+- y .rite+-. // Apertura para Lectura in.open(nombre,ios::binary); // Apertura para Escritura(borra el contenido si lo hubiera) out.open(nombre,ios::binary); // Apertura para aadir datos al final out.open(nombre,ios::binary| ios::app); // Apertura para Lectura y Escritura in.open(nombre, ios::binary |ios::in | ios:: out); // Apertura para Lectura y Escritura out.open(nombre, ios::binary |ios::in | ios:: out); /ierre de "icheros. 6n fichero anteriormente abierto y con un descriptor asociado a l debe ser cerrado con el fin de liberar los recursos asociados a l de la siguiente forma2 nombrefichero.close() Ing. Carol Rojas Moreno .3. E9emplo "2 :rear $rchivos".cpp =para crear un fichero llamado Je9emplo.txtK> D4/400.)2 54 9.2 54 9.0L4&( F (/&%8 9"20.(248+ -a funcin eof=> que devuelve /&"4 si se ha alcanzado el final del fichero y falso en cualquier otro caso. E9emplo+2 -eer el archivo creado Je9emplo.txtK. .32 Ing. Carol Rojas Moreno #include<iostream> #include <fstream> using namespace std; void main() { ofstream fichero("ejemplo.txt"); //Fichero de salida fichero << "Hola" << endl; fichero << "Adios" << endl; fichero.close(); system("pause"); } #include<iostream> #include <fstream> #include <iostream> using namespace std; void main() { fstream fichero; // Declaracion de la variable fichero char texto[200];
fichero.open("ejemplo.txt", ios::in); // Abrir para lectura fichero >> texto; // Leer una primera linea while (!fichero.eof()) // Mientras nos sea final de fichero { cout << texto << endl; // Mostrar lo leido fichero >> texto; // Vovlver a leer } fichero.close(); // Cerrar Fichero system("pause"); } Eje#,lo =3 Lec"%raEscri"%ra !e Fic(eros3 Una Agen!a !e TelOAonos #include <fstream> // Biblioteca para el manejo de ficheros #include <iostream> // Biblioteca para la entrada-salida estndar #include <cstdlib> // Biblioteca estndar de C using namespace std; // Ejemplo de una agenda de telfonos con toda la informacin en disco. //CONSTANTES const char FINCAD = char(0); const int MAXCAD = 80; const int ENTER = '\n'; const char SP = ' '; //TIPOS typedef char TCadena[MAXCAD+1]; // MAXCAD caracteres + FINCAD struct TPersona { TCadena nombre; TCadena apellido1; TCadena apellido2; int telefono; }; // CABECERA DE PROCEDIMIENTOS Y FUNCIONES char menu(); void pausa(); void borrar_pantalla(); bool confirmar_salida(); void LeerPersona(TPersona &p); void EscribirPersona(TPersona p); // Algoritmos de Manejo de Ficheros de Texto void insertarPersonaTXT(TCadena nombreFichero, TPersona p); void listarAgendaTXT(TCadena nombreFichero); void LeePersonaFicheroTXT(ifstream &fichero, TPersona &p); void EscribePersonaFicheroTXT(ofstream &fichero, TPersona p); // Algoritmos de Manejo de Ficheros Binarios void insertarPersonaBIN(TCadena nombreFichero, TPersona p); void listarAgendaBIN(TCadena nombreFichero); void LeePersonaFicheroBIN(ifstream &fichero, TPersona &p); void EscribePersonaFicheroBIN(ofstream &fichero, TPersona p); // PROGRAMA PRINCIPAL int main() { TPersona p;; char opcion; int num; bool fin,encontrado; TCadena nomFich; fin = false; do { borrar_pantalla(); opcion = menu(); Ing. Carol Rojas Moreno .33 switch(opcion) { case 'A': cout << "Nombre del Fichero: "; cin >> nomFich; LeerPersona(p); insertarPersonaTXT(nomFich,p); break; case 'B': cout << "Nombre del Fichero: "; cin >> nomFich; LeerPersona(p); insertarPersonaBIN(nomFich,p); break; case 'C': cout << "Nombre del Fichero: "; cin >> nomFich; listarAgendaTXT(nomFich); break; case 'D': cout << "Nombre del Fichero: "; cin >> nomFich; listarAgendaBIN(nomFich); break; case 'X': fin = confirmar_salida(); break; } if (!fin) { pausa(); } } while (!fin); pausa(); return 0; } // IMPLEMENTACIN DE PROCEDIMIENTOS Y FUNCIONES void pausa() { system("PAUSE"); } void borrar_pantalla() { system("CLS"); } char menu() { char op; cout << "AGENDA EN FICHERO" << endl; cout << "-----------------" << endl; cout << "Autor: <Apellidos> <Nombre>" << endl; cout << "A. Insertar Persona TXT" << endl; cout << "B. Insertar Persona BIN" << endl; cout << "C. Listar TXT" << endl; cout << "D. Listar BIN" << endl; cout << "X. Salir del Programa." << endl; cout << endl; .34 Ing. Carol Rojas Moreno cout << "Introduzca Opcin:"; cin >> op; op = toupper(op); while( ((op<'A') || (op>'D')) && (op!='X') ) { cout << "... OPcin Incorrecta ..." << endl; cout << endl; cout << "Introduzca Opcin:"; cin >> op; op = toupper(op); } return op; } void LeerPersona(TPersona &p) { cout << "Nombre : " ; cin >> p.nombre; cout << "Apellidos1: " ; cin >> p.apellido1; cout << "Apellidos2: " ; cin >> p.apellido2; cout << "Telfono : "; cin >> p.telefono; } void EscribirPersona(TPersona p) { cout << "Nombre : " << p.nombre << endl; cout << "Apellidos : " << p.apellido1 << " " << p.apellido2 << endl; cout << "Telfono : " << p.telefono << endl; } bool confirmar_salida() { char car; cout << "Est seguro de salir (S/N)?"; cin >> car; car = toupper(car); return (car=='S'); } // Algoritmos de Manejo de Ficheros de Texto void insertarPersonaTXT(TCadena nombreFichero, TPersona p) { ofstream out; out.open(nombreFichero,ios::app); // Abro el fichero para aadir if (out.bad()) { // El fichero no existe ... lo creo out.open(nombreFichero); } EscribePersonaFicheroTXT(out,p); out.close(); } Ing. Carol Rojas Moreno .35 void listarAgendaTXT(TCadena nombreFichero) { ifstream in; TPersona persona; in.open(nombreFichero); if (in.bad()) { cout << "Error al abrir el fichero: " << nombreFichero << endl; } else { LeePersonaFicheroTXT(in,persona); while (!in.eof()) { EscribirPersona(persona); LeePersonaFicheroTXT(in,persona); pausa(); } in.close(); } } void LeePersonaFicheroTXT(ifstream &fichero, TPersona &p) { fichero >> p.nombre; fichero >> p.apellido1; fichero >> p.apellido2; fichero >> p.telefono; } void EscribePersonaFicheroTXT(ofstream &fichero, TPersona p) { fichero << p.nombre << SP; fichero << p.apellido1 << SP; fichero << p.apellido2 << SP; fichero << p.telefono << endl; }
// Algoritmos de Manejo de Ficheros Binarios void insertarPersonaBIN(TCadena nombreFichero, TPersona p) { ofstream out; out.open(nombreFichero, ios::binary | ios::app); // Abro el fichero para aadir if (out.bad()) { // El fichero no existe ... lo creo out.open(nombreFichero); } EscribePersonaFicheroBIN(out,p); out.close(); } .3* Ing. Carol Rojas Moreno void listarAgendaBIN(TCadena nombreFichero) { ifstream in; TPersona persona; in.open(nombreFichero, ios::binary); if (in.bad()) { cout << "Error al abrir el fichero: " << nombreFichero << endl; } else { LeePersonaFicheroBIN(in,persona); while (!in.eof()) { EscribirPersona(persona); LeePersonaFicheroBIN(in,persona); pausa(); } in.close(); } } void LeePersonaFicheroBIN(ifstream &fichero, TPersona &p) { fichero.read((char *)(&p),sizeof(TPersona)); } void EscribePersonaFicheroBIN(ofstream &fichero, TPersona p) { fichero.write((char *)(&p),sizeof(TPersona)); } 4+ A&0L.6(8 S40"420.%,48 En estos archivos, la informacin slo puede leerse y escribirse empezando desde el principio del archivo. -os archivos secuenciales tienen algunas caracter.sticas2 ". -a escritura de nuevos datos siempre se hace al final del archivo. +. Para leer una zona concreta del archivo hay que avanzar siempre, si la zona est antes de la zona actual de lectura, ser necesario lretrocederl el archivo. &. -os ficheros slo se pueden abrir para lectura o para escritura, nunca de los dos modos a la vez. En realidad : no distingue si los archivos que se usan son secuenciales o no, es el tratamiento que hagamos de ellos lo que los clasifica como de uno u otro tipo. Existen archivos que se comportan siempre como secuenciales, por e9emplo los ficheros de entrada y salida estndar2 stdin, stdout, stderr y stdaux. 6n caso especial es stdaux, que suele ser el puerto serie. /ambin es un archivo secuencial, con respecto al modo en que se leen y escriben los datos. (in embargo se un fichero de entrada y salida. O&542%& 9.0L4&(8 840"420.%,48 $ veces es necesario ordenar el contenido de un fichero secuencial, ya sea de longitud de registro variable o constante. > A,-(&./*( 54 *4G0,% 2%/"&%, En cuanto a los ficheros secuenciales, el mtodo ms usado es el de mezcla natural. Es vlido para ficheros de tamaGo de registro variable. Ing. Carol Rojas Moreno .3+ Es un buen mtodo para ordenar bara9as de naipes, por e9emplo2 cada pasada se compone de dos fases. En la primera se separa el fichero original en dos auxiliares, los elementos se dirigen a uno u otro fichero separando los tramos de registros que ya estn ordenados. En la segunda fase los dos ficheros auxiliares se mezclan de nuevo de modo que de cada dos tramos se obtiene siempre uno ordenado. El proceso se repite hasta que slo se obtenga un tramo. B+ A&0L.6(8 54 A0048( A,4%/(&.( (on ms verstiles, permiten acceder a cualquier parte del fichero en cualquier momento, como si fueran arrays en memoria. -as operaciones de lectura y?o escritura pueden hacerse en cualquier punto del archivo. En general se suelen establecer ciertas normas para la creacin, aunque no todas son obligatorias2 ". $brir el archivo en un modo que permita leer y escribir. Esto no es imprescindible, es posible usar archivos de acceso aleatorio slo de lectura o de escritura. +. $brirlo en modo binario, ya que algunos o todos los campos de la estructura pueden no ser caracteres. &. 6sar funciones como fread y f@rite, que permiten leer y escribir registros de longitud constante desde y hacia un fichero. '. 6sar la funcin fseeZ para situar el puntero de lectura?escritura en el lugar apropiado de tu archivo. O&542%& 9.0L4&(8 54 %0048( %,4%/(&.( En el caso de ficheros de acceso aleatorio con tamaGo de registro variable, se tratan como si fueran secuenciales. > A,-(&./*( !".0N8(&/ Es un algoritmo que implica un m.nimo de lecturas y escrituras en el fichero, y preferentemente, que stas operaciones estn los ms prximas posible entre si. %esulta muy costoso, en trminos de tiempo de e9ecucin, hacer muchas lecturas y escrituras en disco, y ms si los puntos donde se realizan estn muy separados entre ellos. .3, Ing. Carol Rojas Moreno