Está en la página 1de 162
RN aN (Ora Tale Bae TS ee Veuve Le Luis Rodriguez Baena WET ony area Vela) Contenido Priloge .. x 1. Algoritmes y programas .... 1 1.1. Resolucién de problemas por computadoras t 1.1.1. Fase de resolucién det problema 1 L.L.1.1, Andlisis del problema 2 1.1.1.2. Disefio del algoritmo.. 3 1.1.1.3. Verificacién de algocitmos 4 4 4 3 5 5 7 7 8 2. La resoluci6n de problemas con computaderas y las berramientas de programacién 2.1, Herramientas de programacién 2.2. Diagrama de flujo. 2.3, Diagrama Nassi-Schneiderman .. 24, 2.5. Bjercicios resueltos 3, Estructura general de wn programa 3.1, Escritura de algoritmos ... 39 39 vi Contenide 3.2. Contadores, acumuladores ¢ interruptores.. 3.2.1. Contadores 3.2.2. Acumuladores 3.2.3, Interruptores . 3.3, Estilo recomendado para la escritura de algoritmos.. 3.4, Bjercicios resueltos . 4. Introduccién a la programacién estructarada 4.1. Programacién estructurad 4.2. Teorema de Bohm y Jacopini 43, Estructuras de control 43.1. Estructuras secuenciales .. 4.3.2. Estructuras selectivas 4.3.3. Estrueturas repetitivas 43.4. Estructuras anidadas 44, Bjercicios resueltos 5. Subprogramas (subalgoritmos), procedimientos y funciones. 5.1, Programacién modular . 5.2. Funciones $.2.1. Declaracién de funciones 5.3. Procedimientos 5.3.1, Declaracién de procedimientos .. 5.4, Estructura general de un algoritmo.. 5.5, Paso de pardmetros.. . 5.6, Variables locales y globales 5.7. Recursividad .. 4.7.1, Algoritmos recursivos... 5.7.2, Algoritmos eon retroceso 5.8, Ejetcicios resuelts.... 6, Estructuras de datos (arrays y registros) 6.1, Datos estructurados .. 6.22. Amys bidimensionales . 62.3, Recorrido de los elementos del array 6.2.4. Arrays como parametros . 6.3. Registros 63.1, Arrays de registos y arrays paratelos 6.4, Bjercicios resueltos 110 ith 112 113 113 4 14 Contenido vil 7. Las cadenas de caracteres IST 7.1. Cadenas..., 157 7.2. Bjercicios resueltos .. 158 8, Archivos (ficheros}. Archivos secuenciales 167 8.1. Conceptos generales sobre archivos .. 167 8.1.1, Jerarquizacién 168 8.1.2. Clasificacién de los archivos segiin su funciér 168 |. Operaciones bisicas 168 |. Otras operaciones usuales.. 169 . Soportes... 169 8.2. Organizacion secuencial.. 169 8.2.1, Archivos de texto 170 8.2.2. Mantenimiento de archivos secuenciales 170 8.3. Ejercicios resneltos 171 9. Archivos directos 195, 9.1, Organizacién directa 195 |. Funciones de conversién de clave ... 196 . Tratamiento de sivénimos 197 9.1.3. Mantenimiento de archivos directos 197 9.2. Organizacién secuencial indexada 198 9,3, Modos de acceso .. 199 9.3.1. Ficheros indexados 200 9.4, Bjercicios resueltos . 200 10. Ordenaci6n, biisqueda e intercalacién ........ 10.1. Bisqueda 10.1.1. Biisqueda secuencial 10.1.2, Bisqueds binaria . 10.1.3. Basqueda por transformacién de claves 10.1.3.1. Funciones de conversién de clave. 235 235 236 236 10.1.3.2. Resolucién de colisiones, 238 10.2. Ordenacién 240 10.2.1, Ordenacis 240 10.2.1.1. Seleccién 240 10.2.1.2. Burbuja_ 241 10.2.1.3. Insereién direeta.. 241 10.2.1.4. Insereién binaria 242 10.2.1.8, Shell 242 10.2.1.6. Ordenaciéi ripida .. 242 vin Contenido 10.3. Intercalacién 10.4. Ejercicios resueltos 245 II. Basqueda, ordenaci6n y fasién externas (archivos) 253 11.4.1.2. Particién en secuencias de longitud 1 Partici6n en secuencias de tongitud N . Particién en secuencias de longitud N con clasificacién interna de dichas secuencias 255 Particién segin el método de seleccién por sustt 288 por el método de seleccién natural 255 2. Ordenacién pot mezela natural 256 11.4.3. Ordenacién por mezcia directa 236 11.5. Bjercicios resueltos 255 12, ¥structuras dindmicas Hneales de datos (listss enlazadas, pitas, colas) 211 12.1, Esiructuras dinimicas .. 211 12.2. Listas. 278 123. Pilas 282 12.3.1, Aplicacion 283 12.4. Colas 283, 12.4.1. Doble cola 284 12.4.2. Aplicaciones de las colas 284 12.5. Bjercicios resueltos 284 13, Estructuras de datos ne lineales (irboles y grafos) . 331 331 . 331 132.1. Teminologia 332 13.2.2. Arboles binarios .. 333 13.2.2.1. Conversion de un arbol general en binario 333 13.2.2.2, Implementacién 334 13.2.2.3, Recortidos de un érbol binario 336 13.2.2.4, Arbol binario de bisqueda 337 13.3, Grafos 337 13.3.1. Terminologia. 338 13.3.1. Representacién de los grafos 338, 13.4. Ejercicios resueltos .. 340 Contenido IX 14. Tablas de decisi6n.. 14.1, Definicién y estructura 359 359 14,2. Tipos de tablas de decision 361 143. Tipos de reglas de decisio 362 14.4. Esoritura de una tabla de decisién. 363, 14.5. Transformaci6n de una tabla en diagrama de flujo 14.6. Ejercicios resueltos .. Apéndice A. Especificaciones del lenguaje algoritmico UPSAM. 371 37L 371 371 372 372 372 373 374 374 374 Funciones de cadena de biblioteca .. 375 Funciones de conversion de nimero a 375 Funciones de informacién 375 Estructura de un programa 375 375 375 376 376 376 376 377 377 377 377 377 378 378 379 Inclusion de archives 0 médulos Procedimientos.. Archivos directos (cclativos) Archivos indexados AS. Variables dindmicas.. ‘A.6. Palabras reservadas, operadores, caracteres especiales, funciones y Procedimientos extindar.. Apéndice B. Bibliografia 383 Indice .. 389 Algoritmos y programas 1.1. Resolucién de problemas por computadoras: La principel razén para que las personas aprendan lenguajes de programacién es utilizar la computado- ra como una herramicnta para la resolucién de problemas. Dos fases pueden ser identificadas en el proceso de resolucién de problemas ayudados por computadora: + Fase de revolucién del problema, + Fase de implementaci6n (realizaciGn) en un ienguaje de programacién, 1.1.1. Fase de resolucién del problema Esta fase incluye, a su vez, el andlisis del problema asi como el discfio y posterior verificacién del algoritmo. 2 Fundamentos de Programacién. Libro de Problemas ‘Fase de resolucién del problema ‘Fase de trabajo en ta computador Anéiisls del problema Coditicaciondel algeria Veriticacién del Ejecuctindel aljartmo Programa, Veriticactén det Programa, Programa de trabajo LLL Andlisis del problema El primer paso para encontrar la solucin a un problema es ¢l andlisis del mismo, Se debe examinar cuidadosamente el problema a fin de obtener una idea clara sobre lo que se solicita y determinar- los datos necesarios para conseguirlo. ‘Analisis del problema: Algorkmosy programas 3 111.2. Disefio del algoritmo La palabra algoritmio deriva del nombre del famoso matensitico y astrénomo arabe Al-KhOwarizmi Giglo TX) que escribié un conocido tratado sobre fa manipulacién de niimeros y ecuaciones titulado Kitab al-jabr w’almugabala, Un algoritmo puede ser definido como Ia secuencia ordenada de pasos, sin ambigiiedades, que conducen a Ja solucién de un problema dado y expresado en lenguaje natural, por ejemplo el castellano. Todo algoritmo debe ser: + Preciso. Indicando ef onden de realizacién de cada uno de los pasos. + Definido. Si se sigue el algoritmo varias veces proporcionéndole los mismos datos, se deben obtener siempre los mismos resultados, * Finito. Al seguir el algoritmo, éste debe terminar en algin momento, es decir tener un nimero finito de pasos. Pata disediar un algoritmo se debe comenzar por identificat Jas tareas mds importantes para resol- ver el problema y disponerlas en ¢! orden en el que han de ser ejecutadas. Los pasos en. esta primera Gescripcién de actividades deberdn ser refinados, ailadiendo mas detalles a los mismos ¢ incluso, aigu- nos de ellos, pueden requerir un refinamiento adicional antes de que podamos obtener un algoritmo claro, preciso y completo. Este métado de disefio de los algoritmos en etapas, yendo de los conceptos ‘generates a los de detalle a través de refinamientos sucesivos, se conoce como método descendent (top- down). En un algoritmo se deben de considerar tres partes: + Entrada, Informacién dada al algoritmo. + Proceso. Operaciones o caleulos nevesarios para encontrar Ja solucién del problema, + Salida. Respuestas dadas por el algaritmo o resultados finales de los oélculos. Como ejemplo imagine que desea desarrollar un algoritmo que calcule la superficie de un rectin- gulo proporciondndole su base y altura. Lo primero que debers hacer es plantearse y contestar a las siguientes preguntas: Especificaciones de entrada Qué datos son de entrada? {Cuantos datos se introducirin? {Culntos son datos de entrada vélidos? Especificaciones de salida {Cufles son los datos de satida? {Cudntos datos de salida se producirin? Qué precisién tendrdn los resulindos? 4Se debe imprimir una eabecera? 4 Fundamentos de Programacion. Libro de Problerias El algoritmo en et primer disefio se podri representar con Jos signientes pasos: Paso 1. Entrada desde periférico de entrada, pot ejemplo teclado, de base y altura. Paso 2, Caleulo de la superficie, multiplicando la base por la altura. Paso3. Salida por pantalla de base, altura y superficie. El lenguaje algoritmico debe ser independiente de cualquier lenguaje de programacién particular, pero Giciluente traducible a cada uno de ellos, Aleanzar estos objetivos conduciré al empleo de méto- os nortnalizados para Ia representaciOn de algoritmos, tales como los diagrama de flujo, diagrama Nassi-Schneiderman o pscudocédigo, comentados mas adelante. 1.1.1.3. Verificacién de algoritmos ‘Una vez que se ba terminado de escribir un algoritmo es necesario comprobar que realiza las tareas para las que sc ha disefiade y produce et resultado correcto y esperado. El modo mis normal de comprobar un algoritmo es mediante su ¢jecucién nyanual, usando datos Significativos que abarquen todo el posible rango de valores y anotando en una hoja de papel las modi- ficaciones que se producen en las diferentes fases hasta la obtencién de los resultados. Este proveso se ‘conoce como prucha del algoritmo. 1.1.2. Fase de implementacion Una vez que el algoritmo est disefiado, representado grificamente mediante una herramienta de pro- ‘gramacion (diagrama de flujo, diagrama N-S o pseudocédigo) y verificado se debe pasar a la fase de codificacién, traduccién del algoritino a un determinado lenguaje de programacién, que deberé ser ‘completada con ta ejecucién y comprobacién del programa en ef ordenador. 12. Datos ‘Dato es Ia expresién general que describe los objetos con los cuales opera cl algoritmo. Los datos podrin ser de los siguientes tipos: * entero. Subconjunto finito de los nimeros enteros, cuyo rango o tamafio dependera del len- ‘guaje en el que posteriormente cadifiquemos el algoritmo y de la computadora utilizada. + real. Subconjunto de los nmeros reales limitado no sélo en cuanto al tamafio, sino también en cuanto a la precision. + L6gi.c0. Conjunto formado por los valores Verdiad y Falso. * cardcter. Conjunto finito y ordenado de los caracteres que Ia computadora reconoce. + Cadena. Los datos (objetos) de este tipo contendrin una seric finita de caracteres, que podrin ser directamente traidos 0 enviados widesde consola. entero, real, cardcter, cadena y 16gico son tipos predefinidos en la mayoria de los lenguajes de progeamacién. En los algoritmos para indicar que un dato es de uno de estos tipos se ‘Algoritmos y programes — & declarara asi, utilizando directamente el identificador o nombre de! tipo. Ademés el usuario podri de- finic sus propios tipos de datos. Lo usual ¢s que se definan nuevos tipos de datos agrupando valores de otros tipos definidos previa- mente 0 de tipos estindar. Por este motivo se dice que estin estructurados. Si todos los valores agrupa- dos fiueran del mismo tipo a éste se le denominaria tipo base. Al establecer un tipo para un dato hay que considerar las operaciones que vamos a realizar con él y los instrumentos disponibles. Al establecer el tipo se determina la forma de representacién en memoria. Los datos pueden venir expresados como constantes, variables, expresiones o funciones. 12.1. Constantes Son datos cuyo vator no cambia durante todo el desarrollo del algoritmo, Las eonstantes podrin ser literaies © con nombres, Las constantes simbélicas o con nombre se identifican por su nombre y el valor asignado. Una constante literal es un valor de cualquier tipo que se utiliza como tal. Tendremos pues constantes: * Numéricas enteras. Eu el rango de los enteros. Compuestas por ef signo (+,-) seguido de una serie de digitos (0.9). ‘* Numérieas reales. Compuestas por el signo (+) seguido de una serie de digitos (0.9) y un Punto decimal (.) © compuestas por el signo (+,-), una serie de digitos (0..9) y un punto decimal ‘que constituyen la mantisa, ia letra T antes del exponente, el signo (+) y otra serie de digitos 0.9). *# Légicas. Sélo existen dos constantes Iégicas, verdad y falso = Carécter. Cualquier caracter del juego de caracteres utilizado colocado entre comillas simples © apéstrofes. Los caracteres que reconocen las computadoras son digitos, caracteres alfabéticos, tanto mayésculas como mintisculas, y caracteres especiales. + Cadena. Serie de caracteres vilidos encerrados entre comillas simples. 122. Variables Una variable es un objeto cuyo valor puede cambiar durante el desarrollo del algoritmo. Se identifica Por su nombre y por su fipo, que podré ser cualquiera, y es el que determina el conjunte de valores que podrii tomar la variable. En los algoritmos se deben declarar las variables. Cuando se traduce cl algorit- ‘mo aun lenguaje de programacién y se ejecuta el programa resultante, Ya declaracién de cada una de tas variables originaré que se reserve un determinado espacio en memoria etiquetado con el correspondien- te identificador. 1.2.3. Expresiones Una expresién es una combinacién de operadores y operandos. Los operandos podrin ser consiantes, & —_Fundamentos de Programacién.tibro de Probiemas variables u otras expresiones y los operadores de cadena, atitméticos, relacionales o légicos. Las expre- siones se clasifican, segiin el resultado que produeen, en: ‘+ Numéricas, Los operands que intervienen en ellas son numérigos, el resultado es también de ‘tipo numérico y se Gonstrayen mediante los operadores aritmeticos. Se pueden considerar andlo- gas a las formulas mateméticas. Debido a que son los que se encuentran ett Ia mayor parte de los lenguajes de programacién, los algoritmos utilizarin los siguientes operadores aritméticos: menos unario (-), multiplicacién: (*), division real(/), exponenciacién (*), adicién (+, resta (-), médufo' de la divisién entera (od) y cociente de la division entera (iv). Tenga en cuenta que la divisién real siempre dard ‘un resultado real y que los operadores mod y div sélo operan con enteros y el resultado es entero, * Alfanuméricas. Los operandos son de tipo alfanumérico y producen resultados tambitn de di- ccho tipo. Se construyen mediante el operador de concatenacién, representado por el operador ampersand (&) 9 con el mismo simbolo utilizado en las expresiones aritméticas para la suma. * Booleanas. Su resultado podri ser verdad 0 falso. Se construyen mediante los operadores relacionales y ligicos. Los operadores de relacion son: igual (=), distinlo (>), menor que (<), mayor que (>), mayor o igual (>=), mnenor o igual (<=). Actitan sobre operandos del mismo tipo yy siempre devuelven un resultado de tipo logien. Los operadores logicos basicos son: negacién Iogica (no), multiplicacién ligica (y), suma légica (0). Actiian sobre operandos de tipo logico y devuelven resultados del mismo tipo, determinados por las tablas de verdad correspondientes a cada uno de ellos. a b no a ayd aob verdad verdad {also verdad verdad verdad falso faiso also verdad faiso verdad verdad also verdad falso. also. verdad falso. falso El orden de prioridad general adoptado, no comtin a todos los lenguajes, es el siguiente: * Exponenciacién 0, + Operadores unarios *,adv, mod,y — Operadores multiplicativos Ane Operadores aditivos S.>,4>5, <= Operadores de relacién La evaluacién de operadores con la misma prioridad se realizar siempre de izquierda a derecha. Si una expresién. contiene subexpresiones encerradas entre paréntesis, dichas subexpresiones se eva- Tuardin primero. Algortmmos y programas 7 12.4, — Funciones En los lenguajes de programacién existen ciertas funciones predefinidas o internas que aceptan unos argumentos y producen un valor denominado resultado. Como funciones numéricas, se usaréin: Funcion _ Descripcién Tipo de argumento_Resul abs(x) valor absoluto de x entero 0 real igual que et argumento arctan(x) _arcotangente de x entero o real real ‘608(x) cosenode x entero o real real ‘cuadrado(x) cuadrado de x entero o real igual que el argumento ents) entero de x real entero exp(x) eelevado ax entero 0 real! real Inge) logaritrne neperioans de x entero 0 real real logt0(x) —_—_logaritrma base 10 de x entero 0 real real raiz2(x) _—_eélz cuadrada de x entero dex real redondeo(x) redondea x al entero mas proximo real entero sen(x) seno de x entero 0 real real truno(x) parte entera de x ‘real santero Las funciones se utilizarin eseribiendo su nombre, seguido de los argumentos adecuados encerra- dos entre paréntesis, en una expresién. 1.2.5, Regias para la construccidn de identificadores ‘dentificadores son los nombres que se dan a las constantes simbblicas, variables, funciones, procedi- mientos, u otros objetos que manipula el algoritmo. La regla para construir un identificador establece que: © debe resultar significativo, sugiriendo Jo que representa, * no podra coincidir con palabras reservadas, propias del lenguaje algoritmico, Como se vera. mis adelante, la representaciOn de algoritmos mediante pseudocédigo va a requerir la utilizacién de palabras reservadas. * se admitira un méximo de 32 caracteres. * comenzard siempre por un cardcter alfabético y los siguientes podrin ser letras, digitos o el 8 —_Fundamenttos de Programacidn. Libro de Problems simbolo de subrayado. * podré ser utilizade indistintamente escrito en mayésculas o en mimisculas. 1.3. Ejercicios resueltos. Desarrolle los algoritmos que resuelvan tos siguientes problemas: Li. [ral cine. Anélisis del problema DATOS DE SALIDA: ‘Ver la pelicula DATOS DE ENTRADA: — Nombre de la pelicula, direccién de la sala, hora de proyeccién DATOS AUXILIARES: Entrada, nimero de asiento Para solucionar el problema, se debe seleccionar una pelicula de la cartelera del periédico, ir ala sala y ‘comprar la entrada para, finalmente, poder ver la pelicula. Disefo del algorismo inicio //seleccionar 1a pelicula tomar el periédico mientras no llegemos a la cartelera pasar la hoja mientras no se acabe la cartelera leer pelicula si nos gusta, recordaria elegir una de las pelfculas seleccionadas leer 1a direccién de la sala y 1a hora de proyeccién comprar 1a entrada trasladaree a la sala si no hay entradas, ir a fin si hay cola ponerse el ultimo mientras no llequemos a la taquilla avanzar sino hay entradas, ir a fin comprar la entrada diver la pelicula leer el mimero de asiento de la entrada Algotitmos y programas = S busear el asiento sentarse ver la pelicula fin 4.2, Comprar una entrada para ir a Tas toros, Andlisis del problema DATOS DE SALIDA: La entrada DATOS DE ENTRADA: Tipo de entrada (sot, sombra, tendido, andanada,...) DATOS AUXILIARES: —_Disponibilidad de fa entrata ‘Hay que ir a la taquilla y elegir Ia entrada deseada. Si hay entradas se compra (ext taquilla o a los reventas). Si no la bay, se puede seleccionar otro tipo de entrada o desistir, repitiendo esta accién hasta que se ha conseguido la entrada o el posible conrprador ha desistido. Diseito del algoritmo inicio ix a la tequilla sino hay entradas en taquilla si nos interesa comprarla en la reventa ix a comprar la entrada ai no ir a fin {comprar 1a entrada seleccionar sol o sombra seleccionar barrera, tendido, andanada o palco seleccionar niimero de asiento solicitar la entrada si la tienen disponible adquirir la entrada ei no si queremos otro tipo de entrada ir a comprar 1a entrada fin 4.3. Poner la mesa para la comida. Andlisis del problema DATOS DE SALIDA: —_—_La mesa puesta 10 Fundamerttos de Programacién, Libro de Problemas DATOS DE ENTRADA: La vajilla, los vasos, los cubiertos, la servilletas, el ntimero de comensalés DATOS AUXILIARES: —_Niimero de platos, vasos, cubiertos o servilletas que levamos puestos Para poner Ia mesa, después de poner el mantel, se toman las servilletas hasta que su némero coincide con el de comensales y se colocan. La operacién se repetird con los vasos, platos y cubiertos. Diseito del algoritmo inicio poner el mantel repetir tomar una servilleta . . hasta qué el nimero de servilletas es igual sl de comensales répatir . ~ tomar ur vaso . hasta que él nmiimero de vasos es’ igual a1 de comensales vepetir tomar un juego de platos hasta que el niimero de juegos es igual al de comensales vepetir tomar un juego de cubiertos hasta que el némero de juescs es igual al de comensales fin 14. Hacer una taza de té. Andlisis del problema DATOS DE SALIDA: taza de té DATOS DE ENTRADA: _ bolsa de té, agua DATOS AUXILIARES: Pitido de la tetera, aspects de la infusin Después de echar agua en la tetera, se pone al fuego y se espera a que el agua hierva (hasta que suena cl pitido de la tetera). Introducimos el té y se deja un tiempo hasta que est4 hecho. Disefo del algoritmo inigia tomar 1a tetera Henarla de agua encender ¢1, fuego, poner la tetera en el fuego mientras no hierva el agua esperar tomar la bolsa de té introducirla en la tetera nientras no esté hecho el té esperar echar el té en la taza fin 1.5. Fregar los platos de la comida. Aniiisis del problema DATOS DE SALIDA: plates limpios DATOS DE ENTRADA: _ platos sucios DATOS AUXILIARES: — niimero de piatos que quedan Disefio del algoritmo abrir el “grifo tomar el estropaje echarle jabén mientras queden platos lavar el plato aclararlo dejarlo en el. escurridor,.. nientras queden plates en-el escurridor secar plato fin 1.6. Reparar-un pincharo de-una hicicleta.. Andlisis del problema DATOS DE SALIDA: —_la meda reparada Algotitrmos y programas " DATOS DE ENTRADA: _ 1a rueda pinchada, los parches, el pegamento DATOS AUXILIARES: _ las burbujas que salen donde esti el pinchazo Después de destnontar la rueda y'la cubierta ¢ inflar la cAmara, se introduce Ia chmara por secciones en 42 Fandamentos de Programaciéin, Libro de Problemas, un cubo de agua. Las burbujas de aire indicarin donde esta el pinchazo. Une vez descubierto el pincha- 20 se aplica el pegamento y ponemos el parche. Finalmente se montan la cémara, ta cubierta y ta rucda. Diseito del algoritmo inicio desmontar la rueda desmontar la cubierta sacar la cdmara inflar la camara meter una seccién de la cdmara en un cubo de agua mientras no salgan burbujas meter una seccién de 1a cémara en un cubo de agua marcar el pinchazo echar pegamento mientras no esté seco esperar poner el parche mientras no esté fijo apretar montar 1a cémara montar la cubierta montar Ja rueda fin 17, Pagar una multa de tréfico. Andlisis del problema DATOS DE SALIDA: _ el recibo de haber pagado la mutta DATOS DE ENTRADA: datos de la nmulta, DATOS AUXILIARES: _impreso de ingreso en el banco, dinero Debe elegir cémo desea pagar la multa, si en metilico en la Delegacién de Trifico 0 por medio de una ‘transferencia bancaria. Si elige el primer caso, tiene que ir a la Delegacién Provincial de Tréfico, desplazarse a la ventanilla de pago de nwltas, pagarla en efective y recoger el resguardo. ‘Si desea pagarla por transferencia bancaria, hay que ir al banco, rellenar ¢l impreso apropiado, dirigirse a la ventanilla, entregar el impreso y recoger el resguardo. Diseho del algoritmo inicio si pagamos en efectivo Algotmos y programas 13 ir a la Delegacién de Tréfico ix a la ventanilla de pago de multas si hay cola ponerse el dltime mientras no lleguemos a la ventanilla esperar entregar la multa entregar el dinero recoger el recibo //pagamos por trasferencia bancaria ix al banco rellenar el impreso si hay cola ponerse el Gltimo mientras no lleguemos a la ventanilla esperar entregar el impreso recoger el resguardo fin 48 Hacer una lMamada telefonica, Considerar los casos: a) llamada manual con operador; b) Hamada automdtica ; ¢) Hamada a cobro revertido. Andlisis del problema Pars decidir e! tipo de llamada que se efectuara, primero sc debe considerar si se dispone de efectivo 0 10 para realizar la llamada a cobro revertido. Si hay efectivo se debe ver si el lugar a donde vamos a llamar esté conectado a la red automitica o no. Para una Hamada con operadora hay que llamar a ta centralita y solicitar Ia Nlamada, esperando hasta que se establezca Ia comunicacién. Para una Tlamada automtica se leen los prefijos del pais y provincia si fuera necesario, y se realiza Ia Hamada, esperando hasta que cojan el teléfono, Para lamar a.cobro revertido se debe Hamar a centralita, solicitar la Hamada y esperar a que el abonado del teléfono al que se llama désu autorizaciGn, con lo que se establecerd ta comunicacién. Como datos de entrada tendriamos las variables que nos van a condicionar el tipo de tlamada, el 1wimero de teléfono y, en caso de llamada automiética, los preffjos si los hubiera. Como dato auxiliar se podria comsiderar en los casos a y ¢ el contacto con Ia centralita. Disesio del algoritmo inicio si tenemos dinero 14 Fundamentos de Programacién. Litro deProblemas si podence hacer una llamada automAtica Leer el prefijo de pafa y localidad marcar ¢l mimere si oo //Vamada manual llamar a la centralita solicitar la comunicacién mientras no contesten esperar establecer comunicacién j/zealizar una llamada a cobro revertide llamar a la centralita solicitar la llamada esperar hasta tener la sutorizacién establecer comunicacién fin 19. Cambiar ef cristal roto de la ventana. Aniilisis del problema DATOS DE SALID: Ja ventana con el cristal nuevo DATOS DE ENTRADA; el cristal nuevo DATOS AUXILIARE! el nimero de clavos de cada una de las molduras Disedto del algoritneo repetir cuatro veces quitar un clavo mientras el mimero de claves quitados no sea igual al total de clavos quitar un clavo savar 1a moldure sacar el cristel rote poner el cristal nuevo vepetir cuatro veces poner la noldura poner un clavo mientras el mimero de claves puestos no sea igual al total de claves poner un clavo poner el cristal nueve fin Algoritmosy programas 15, 110. Realizar una llamada telefénica deside un teléfono piiblico, Andilisis del problema DATOS DE SALIDA: Ja comunieacién por teléfono DATOS DE ENTRADA: . ef mimero de teléfono, el dinero DATOS AUXILIARES: _— distintas sefiales de la llamada (comunicando, etc.) Se debe ir a la cabina y esperar si hay cola, Entrar ¢ introducir el dinero. Se marea el nlimero y se espera la sefial, si estA-comunicando o no contestan se repite la operacién hasta que descuelgan el teléfono o decide irse. Disefo del algoritmo 16 Fundamentos de Progremacién, Libro de Problemas. 4.11, Averiguar si una palabra es un palindromo. Un palindrome es wna palabra que 3 ee igual de izquierda a derecka que de derecha a izquierda, como por ejemplo, ‘radar Anéiisis del problema DATOS DE SALIDA: —_el mensaje que nos dice si es 0 no un palindromo DATOS DE ENTRADA: DATOS AUXILIARES: cada caricter de Ia palabra, palabra al revés Para comprobar si una palabra es un palindromo, se puede i formando una palabra con los caracteres invertidos con respecto a la original y comprobar si fa palabra al revés es igual a 1a original. Para obtener esa palabra al revés, se Jenin en sentido inverso los caracteres de la palabra inicial y se irén juntando sncesivamente hasta llegar al primer cardecter. Disefto del algoritmo Aigoritmoay programas 17 1.12, Escribir un algoritmo para determinar el méximo comtin divisor de dos mimeros enteros por ef algoritmo de Euclides. Anilisis del problema DATOS DE SALIDA: maximo comin divisor (med) DATOS DE ENTRADA: — dos niimeros enteros (ay b) DATOS AUXILIARES: resto. Para hallar el maximo comin divisor de dos mimeros se debe dividir uno entre otro. Si la division es exacta, es decir si el resto es 0, ef maximo comin divisor es el divisor. Sino, se deben dividir otra vez tos miimeros, pero en este caso el dividendo seri el antigua divisor y el divisor el resto de la divisién anterior, El proceso se repetir hasta que la divisién sea exacta, Para diseiar el algoritmo se debe crear un bucte que se repita mientras que la divisién no sea exacta, Dentro del bucle se asignarin nuevos valores al dividendo y al divisor. Diseito del algoritmo leer (a,bb mientras a mod b <> 0 resto © a mod b aecb b © reato ned © b escribir (med) fin 4.13, Disefiar un algoritmo que lea e imprima una serie de mimeros distintos de cero, El algoriimo debe terminar con un valor cero que no se debe imprimir. Finalmente se desea obtener la cantidad de valores leidos distintos de 0. Andlisis det problema DATOS DE ENTRADA: _ los distintos nimeros (21m) DATOS DE SALIDA: —_los mismos nfimeros menos el 0, Ia cantidad de niimeros (contadox) Se deben leer nimeros dentro de un bucle que terminaré cuando el iltimo mimero leide sea cero, Cada vez que se ejecute dicho bucle y antes que se lea el siguiente mimero se imprime éste y se incrementa el contador en una unidad. Una vez se haya salido det bucte se debe escribir In cantidad de nimeros leidos, es decir, el contador. 18 —_Fundamentos de Programaci6n. Libra de Problemas, Disetio del algoritmo 114, Diseiar un algoritmo que imprima y sume la serie de mimeros 3,6,9,12).0499. Anélisis del problema Se trata de idear un método con el que oblengamos dicha serie, qué no es mas que incrementar una variable de tres en tres. Para ello se haré un bucle que se acabe cuando el nimero sea mayor que 99 (0 ‘cuando se realice 33 veces). Dentro de ese bucte se increments la variable, se imprime y se acurmula su. ‘valor en otra variable Hamada cuma, que seré el dato de salida, ‘No tendremios por tanto ninguna variable de entrada, y af dos de salida, la que nos va sacando los aiimeros de tres en tres (nti) y summa, Aigaritmos y programas 19. Disefio del algoviema inicio suma — 9 num 3 mientras nim <= 99 hacer escribir (nim) suma © suma + num nim = mim = 3 escribir [suma} fin 115. Escribir un algoritmo que lea cuatro nimeros y, a continuacién, escriba el mayor de los cuatro. Anilisis del problema DATOS DE SALIDA: mayor (cl mayor de los cuatro nimeros) DATOS DE ENTRADA: a, b, ¢, d (los ntimeros que leemos por teclado) Hay que comparar los cuatro mimeros, pero no hay necesidad de compararlos todos con todos. Por ejemplo, si a es mayor que b y a ¢s mayor que ¢, es evidente que ni b ni ¢ son los mayores, por lo que si @ es mayor que d el nimero mayor serd a y en caso contrario lo sera 4. Diseio del algoritmo 20 ‘Fandamentos de Programecién. Libro de Problemas: 4.16, Disetar un algorino para calcular la velocidad (en metros/segundo) de fos corredores de una carrera de 1500 metros, La entrada serdn parejas de mimeros (minutos, segundos) que darin el tiempo de cada corredor. Por cada corredor se imprimird el tiempo en minutos y segundos, ast coma la velocidad media. El bucle se ejecutaré hasta que demos una entrada de 0,0 que:serd la marca de fin de entrada de datos. Andtisis del problema DATOSDESALIDA: ——v- (velocidad media) DATOS DE ENTRADA: — mm,ss_(minutos y segundos) DATOS AUXILIARES: distancia (distancia recorrida, que en el ejemplo es de 1500 metros) y tiempo (los minutos y los segundos que ha tardado en recorrerla} Se debe efectuar un bucle que se ejecute hasta que mm sea 0 y ss sea 0. Dentro del bucle se calcula el tiempo en segundos con la formula tiempo = ss + mm * 60. La velocidad se hallari con le formula velocidad = distancia /tiempo. Disefio del algoritmo inicio distancia © 1500 leer (mm, 38) mientras mm - 0 y ss = 0 hacer tiempo « as + mm * 60 v © distancia / tiempo eseribir (am, 33,0) leer (mn, ss) fin 117, Disefar un algoriemo para determinar si wn mimero n es primo, (un mimero primo séio es divisible por el misma y por la unidad). Andlisis del problema DATOS DE SALIDA: —_El mensaje que nos indica’si es 0 no primo DATOS DE ENTRADA: 1 DATOS AUXILIARES: divisor (esel nimero porel que vamos a dividir n. para averiguar si es primo) Una forma de averiguar si un mimero es primo es pot tanteo, Para ello se divide sucesivamente el riimero por los mimeros comprendidos entre 2 y n. Si antes de Hegar ar. encuentra un divisor exacto, Algortmas y programe. 21 el mimero no sera primo. Si el primer divisor es nel niiinero sera primo. Por Jo tanto sé hani wn bucle en el que una variable (divisor) ird incrementindose en una unidad entre 2 y n. El bucle se ejecutard hasta que se encuentra un divisor, es decir hasta que n mod divisor = 0. Sial salir del bucle divisor =n, el nimero serd primo. Disetio del algoritmo 4.18. Escribir un algoritmo que caleule ia superficie de un iridnguto en fincién de la base y la altura. Andilisis del problema DATOS DE SALIDA: 3 (superficie) DATOS DE ENTRADA: b (base), a (altura) Para calcular la superficie se aplica la formula S$ = base * altura /2. 2 Fundamentos de Programacion. Libro de Problemas Diseiio del algoritmo inicio leer (bab se btasa escribir (s) fin La resolucién de problemas con computadoras y las herramientas de programacion 2.1. Herramientas de programacién Un algoritmo puede ser escrito en castellano narrativo, pero esta descripcién suele ser demasiado pro- lija y, ademnds, ambigua. Para representar un algoritmo se debe utilizar algin método que permita inde- pendizar dicho algoritmo de los tenguajes de programacién y, al mismo tiempo, conseguir que sea facilmente codificable. Los métodos mas usuales para la representacién de algoritmos son: A. Diagrama de flujo B. Diagrama N-S (Nassi-Schneiderman) €. Pseudocédigo 23 24 Fundamentos de Programacién. Libro de Problernes 2.2. Diagrama de flujo Lod diagramas de flujo se utilizan tanto para la representacién grafica de las operaciones ejecutadas sobre-fos datos a través de todas las partes de un sistema de procesamiento de informacién, diagrama de flujo del sistema, como para la representacién de la secuencia de pasos necesarios para describir un procedimiento particular, diagrama de flujo de detalle. En la actualidad se siguen usando los diagramas de flujo del sistema, pero ha decaido el uso de los diagramas de flujo de detalle al aparecer otros métodos de disefio estructurado mis eficaces para la representacién y actualizacién de los algoritmos. Los diagramas de flujo de detatie son, no obstante, uno de nuestros objetivos prioritarios y, a partir de ahora, los denominaremos simplemente diagramas de flujo. Eldiagrama de flujo utiliza uno simbolos normalizados, con los pasos del algoritmo escritos en el simbolo adecuado y los simbolos unidos por flechas, denominadas lineas de flujo, que indican el orden en que los pasos deben ser cjecutados. Los sfmbolos principales son: 2 imbolo Funelon Inicio y fin del algoritmo: * Proceso Entrada / Salida Decisién Comentario "eu Resulta necesario indicar dentro de los sfmbotos la operacién especifica concebida por el progra- mador, Como ejemplo veamnos un diagrama de flujo bisico, que representa la secuencia de pasos nece- saria para que un programa lea una temperatura en grados Centigrados y calcule y escriba su valor grados Kelvin. ‘La resolucién de problemas con computadaras y tae horramientas de programecién 25 2.3. Diagrama Nassi-Schneiderman Los diagramas Nassi-Schneiderman, denominados asi por sus inventores, o también N-S, o de Chapin son una herramienta de programacién que favorece la programacién estructurada y reine caracteristi- cas grificas propias de. diagramas de flujo y lingiiisticas propias de los pseudocédigos. Constan de una serie de cajas contiguas que se leerén siempre de arriba-ahajo y se documentarin de la forma adecuada, En los diagramas NS las tres estructuras bésicas de Ia programacién estructurada, secuenciales, selectivas y repetitivas, encuentran su representacién propia. La programacién estucturada seré tratada en capitulos posteriores. Simbolo Tipo de estructure santeicia L | sentencia:2"| Secuencial sentencla — Repetitiva de 0 n veces S| Repetitiva de 1 an veces Selectiva El algoritmo que tee una temperatura en grados Celsius y calcula y eseribe su valor en grados Kelvin se puede representar mediante el siguiente diagrama N-S: cH Repetitiva n veces 2 (7 2.4. Pseudocédigo El pseudocédigo es un lenguajc de especificacién de algoritmos que liza palabras reservadas y exige In indentacién, o sea sangria en el margen izquierdo, de algunas lineas. En nuestros pseudocddigos usaremos determinadas palabras en espafiol como palabras reservadas, El pseudocddigo se concibié para superar las dos principales desventajas del diagrama de flujo: 26 —_Fundamentos de Programacién. Libro de Problemas. lento de crear y dificil de modificar sin un nuevo fedibujo, Fs una hertamienta muy buena para el seguimiento de la légica de un algoritmo y para transformat con facilidad los algoritmos a programas, escritos en un lenguaje de programacién especifico, En este libro se escribirdn casi todos los algoritmos en pseudacédigo. El pseudocddigo.comenzaré siempre con la palabra inicio y terminaré con la palabra fin, Cuando se coloque un comentario de una sola linea se eseribiré precedido de //, Si el comentario es multilinea, lo pondremos entre {}. Para introducir un valor o serie de valores desde el dispositive estindar y almacenatlos en una 0 varias variables utilizaremos leer(). Con almacenaremos en una vatiable el resultado de evaluar una expresién, Hay que tener en cuenta que una tinica constante, variable 0 funcién, constitu- yen una expresién, Para imprimir en el dispositive esténdar de salida una o varias expresiones emplearemos escribir() Las distintas estructuras se representaran de la siguiente forma: Decisién simple: si entonces «acciones?> fin_si Decision doble: si entonces si_no finest Decisién miltiple: segin_sea hacer : [si_no // Bl coxchete indica opeionalidad } fin_segin mientras hacer fin mientras repetir hasta.que desde q hasta [dneremento | decremento ] hacer fin desde La resolucién de problemas con computadoras y fas herramiantas de programecién 27 inicio, fin, leer, escribir y las palabras que aparecen en negrita en las distintas estruc- turas se consideran palabras reservadas y uo deberén utilizarse en su lugar otras similares. El ejemplo ya citado que transforma grados Celsius en Kelvin, escrito en pseudocédigo quedaria de la siguiente forma: inicio Jer (celsius) kelvin © celsius + 273.15 escribir (kelvin) fin 2.5. Ejercicios resueltos 21. ¢Cudl de los siguientes datos son validos para procesar por una computadora? a) 3.14159 6) 2.23462 i) 12.5.3 6) 0.0014 ff 12E+6 BD AEF ) 12345.0 g) LIE-3 4) SA4 LE @) 1508-04 h) -15E-0.4 ty ALEOA Serlan validos los datos a, b,c, d,e, f, gy j, Los datos he ino serian validos pues el exponente no puede fener forma decimal. El k, no serfa correcto pues mezcla caracteres alfabéticos y digitos, y no se puede considerar una identifieador de una variable ya que empieza por un digito. El dato | aunque mezela digitos y caracteres alfabéticos, podria ser un identificador, si admitiéramos el caricter punto como cardeter vilido para una variable (PASCAL 0 BASIC lo consideran), 22. ;Cudl de los siguientes identificadores son vatidos? @) Renta) Dos Pulgadas i) 44202 4) Alquiler) C3PO 2D 13Nombre ©) Constante g) Bienvenidos 4) Nombre_Apellidos Toms ij elemento. 1) Nombredpeltides Se consideran correctos los identificadores a, b, ¢, f, b, k y 1. Bl d no se considera correcto pues incluye ¢l apéstrofo que no ¢s un-cardcter valido en un identificador. Lo mismo ocurre con el ¢ y el espacio en blanco, y el g con el cardicter #. Eli y el j no serian validos al no comenzar por un cardeter alfabético, 23, Escribir un algoritmo que lea un valor entero, lo doble, se multiplique por 25 y visualice el resultado, 2 Fundamentos de Programaci6n. Libro de Problemas, Aniilisis de problema DATOS DE SALIDA: resultade (es el resultado de realizar tas operaciones) DATOS DE ENTRADA: nine (el mimero que leemos por teclado} Leemos el mimero por teclado y fo multipticamos por 2, metiendo el contenido en la propia variable de entrada. A continuacién lo multiplicamos por 25 y asignamos el resultado a la variable de salida resultado. También padriamos asignar a la variable de salida directamente 1a expresién numero*2*25. Diseito del algoritmo: algoritmo ejercicio_2_3 entero : mimerc, resultado Anicio leer (aimero] minero + nimero + 2 resultado + mimero * 25 escribir (resultado) fin 24, Disetar un algoritmo que lea cuatro variables y caleue e imprima ste producto, su suma y su media aritmética. Anilisis del problema DATOS DE SALIDA: — producto, suma y media DATOS DE ENTRADA: _ a,b,c,4 Después de leer los cuatro datos, asignamos 2 la variable praducto le multiplicacién de las cuatro variables de entrada. A la variable suma le asignamos su suma y a la variable media asignamos el resultado de sumar las cuatro variables y dividirlas entre cuatro. Como el operador suma tiene menos prioridad que el operador divisin, la ser necesario encorrar Ia suma entre paréntesis. También podria mos haber dividido directamente Ia variable suma emtro cuatro, La variables a,b,c, 4, producto’y sume padrin ser enteras, pero no asi la variable miediia, ya que-la division produce: siempre sesultados de tipo real, Disetio det algoritmo algoritmo ejercicic_2_4 entero: ,b,¢,d, producto, sums La raeolucién de problemas con computadoras y las herramientas de programaciin 29 veal: media inicio leer (a,b,c, d} producto + atbto*d sumaratbreed media {at b+cr a) 4 escribir (producto, suma, media) fin 25. Diseiar un programa que lea el peso de un hombre en libras y nos devuelva su peso en kilogra- ‘mos y granios (Nota: una libra equivale a 0.453592 kilogramas) Andlisis del problema DATOS DE SALIDA: kg, gr DATOS DE ENTRADA: peso. DATOS AUXILIARES: Libra (los kilogramos que equivaten a una libra} El dato auxiliar Libra to vamos a considerar como una constante, pues no variaré a To largo det programa. Primero leemos et peso. Para hallar st edjuivatencia en kilogramos multiplicamos éste por Ja constante libra. Para hallar el peso en gramos multipticamos los kilogramos entre mil. Como es posible que el dato de entrada no sea exacto, consideraremos todas las variables como reales. Disetio-det algoritmo algoritmo ejércicic 2.5 constante libra = 0.453592 real: peso, kg,ar inicio leer (pesct kg © peso * libra gr < kg * i000 eecribir (‘Peso en kilogrames: ‘,kg} escribir (/Pesc en yramos: ',gr} fin 2.6 Si A~6, B=2y C=3, encontrar los valores de las siguientes expresiones: a) A-B+C GAB mad C OY APB div C A+B mod C AdVB+C DA div B div C 30 Fundamentosde Programacién. Libro de Problemas. Los resultados serian: a) (62):3=7 b) (6"2) div 3 = 4 ©) G div 243 =6 4) (62) mod 3 = 0 2) 6+(2 mod 3) = 8 4) div 2) div 3=1 2.7, ¢Qué se obtiene en las variables A y B después de la ejecucién de las siguientes instrucciones? Aes Beate AeAt! Bed-5 Las variables ixian tomando los siguientes valores: Acs , A=5,Bindeterminado BeA+6 , A=5,B=5+6=11 AeAtl , A=St Bea-5 , A=6B Los valores finales setian: A= 6 yB= 1. 28 {Qué se obtiene en las variables A, By C después de ejecutar las siguientes instrucciones? Ac3 BH 20 CeAtB BeAtB AcB Las variables tomarian sucesivamente los valores: Ac3 ,A=3, By C indetenminados Be 20 ,A=3,B 20, C indeterminado 3 CeAtB ,A=3,B420,C=3+2 BeA+B .A=3,B=9+20=233,C ACB :A=23,B=23,C=23 La resoluci6n de problemas oon computaderas y'las herramientas-de programaciin 1 Los valores de las variables serian: A = 23, B=23 y C= 23: 29. {Que valor toman las variables A y B tras la ejecucién de las siguientes asignaciones? 4<10 Bes AcsB Bea El resultado seria el siguiente: A 10 ,A=10,B indeterminads BeS ,A=10,B=5 ACB ,A=5,B=5 BeA ,A-5,B=5 con lo‘que A’y B tomarian el valor 5, 2.10, Esoribir las'sighientes. expresionesen forma de exprésiones algoritmicas mM N sen x + cosy ayi4 OMS BIG oane N MN erp BF ac 4)? a ) P-@ ot a aMsNa a “b)Mo+ NY (B-OF oc) (gen(X} + cos(x)) / tan(xX} d+ Mm) / (PB - 9) eQ(M+N/ P) / 1Q-R Sf 5). f) ((-B} + radz2{BE2-4*A*0)) /(2*a) 2.11. Se tienen wes variables A, B y C. Escribir las instrucctones necesarias para intercambiar entre si sus valores det modo siguiente: B toma el valor de A \etama ef valor de B A toma el valor de C 32, Fundamentosde Progeamacién, Libro de Problemas, eae \ a se debe utilizar una variable auxiliar que Hamaremos. AUX: AUK.~ A Are c+ 8 B= aux 2.12, Dedicir los resultados que se obtienen del siguiente algoritmo: algoritmo ejercicio_2_12 entero: X, Y, Z iniete x= 15 ¥ = 30 zey-x escribir (X,Y) : 2 escribir (2) fin Para anulizar los resultados de un algoritmo, lo mejor es utilizar una tabla de seguimiento, En ta.tabla de seguimiento aparecen varias columnas, cada una con el nombre de una de las variables que aparecen en el algoritmo, pudiéndose inchur ademas una con Ja salida del algoritmo, Més abajo se va realizando i seguimienio del algoritmo rellenando la columna de cada variable con el valor que ésta va tomando. 2.13, Encontvar el valor de la variable VALOR después de la ejecuclén de las siguientes operaciones a) VALOR ~4.0*5 by ¥-30 y-20 VALOR ~X*¥-¥ . “Q) VALOR ~5 Xn3 ns VALOR ~ VALOR *X ‘Los resultados serian: a) VALOR = 20.0 La tesolucién de problemas con compuitatiorss.y tas herramientas.de.progremeciin 33 ‘b}) VALOR =70, c) VALOR = 15 Nétese que en los casos a) yb), valor tendrd un contenido de tipo real, ya que alguno de los operandos son de tipo real, 2.14. Determinar fos valores de A, B, Cy D'después de ta ejecucién de las siguientes instrucciones: algoritme ejercicio 214 var entero: A, B,C, D inielo aed Bes CHALE DeA-B Rec+2s8 BC+ B CH aAte peep Ae De + ef.c =D entonees ce aA-D i : Bi_no i (6 + BD, 4 | fin ed il ue . bey » : : } Realiznremos una tabla de seguimiento: 13 123 } con lo que A = 123,B=9, C= 117 yD=6 215, Escribir un algoritma que calcule y escriba el ewadrado de 821. Anilisis del problema DATOS DE SALIDA: cuadr {almacenari el cuadrado de 821) DATOSDEENTRADA: el propio numero 821 34 — Fundementos de Programacion. Libro deProblemas. Lo Unico que haré este algoritmo seré asignar a la variable cuadr el cuadrado de 821, es decir, 821 * 821 Disefta det algoritmo algoritmo ejexcicio_2_15 entero: cuadr inicio cuadr + 821 * 821 esoribir (cuadr) fin 2.16. Realtzar un algoritmo que calcute la suma de los enteros entre 1 y 10, es decir 1+2+3+..+10 Andlisis del problema DATOS DE SALIDA: _suma.- (contiene fa suma requerida) DATOS AUXILIARES: tim (send una variable que vaya tomando valores entre 1 y 10 y se acunnu- lard en suma) Hay que ejecutar un bucle que se realice 10 veces, En él se iri incrementando en 1 la variable nnn, y se acumulara su valor en la variable suma. Una vez salgamos del bucle se visualizart ol valor de la variable susna, Diseito del algoritmo TABLA DE VARIABLES: entero + suma,ném La resolucién de problemas con computedoras y fas herramiantas de programeciin 35. Andtisis del problema Hay que implementar un bucle que se ejecute once veces y dentro de él ir incrementando una variable que tome valores entre Oy 10 y. que se amara zim. También dentro de és visualizara el resultado de la operaciéa 2. * nin. Disefto del algoritme TABLA DE VARIABLES: entero: nim 2u?. “Realizar un algoritmo que calcule y visualice las potencias de 2 entre 0 y 10. 36 Fundamentosde Programacién. Libro de Problemes 2.18, Leer un cardeter y deducir st esté situado antes o después de la ann en orden alfabético. Andilists del problema Como dato de salida esta e! mensaje qiie'nos dice ta situaci6n del cardcter con respecio'a la «my. Como entrada el propio carfcter que introducimos por teclado, No s¢ necesita ninguna variable auxitiar: Se debe ieer el earicter y compararlo con Ia «a» para ver si es mayor, menor o igual que ésta. Recuerde que para el ordenador también un cardcter puede ser mayor © menor que otro, y fo, hace comperando el cédigo de los dos elementos de la comparacién. Diseito del algoritmo La resolucién de problemas con computadoras y les herramiontas de progremacién = 37. 2.19. Leer dos caracteres y deducir si estén en orden alfabético, Andlisis del problema DATOS DE SALIDA: —_El mensaje que nos indica si estin en orden alfabético DATOS DE ENTRADA: Ay 5 (los caracteres que introducimos por teclado Se deben leer los dos caracteres y compararlos. Si A es mayor que 5, no se habriin introducide en orden. En caso contrario estarin en orden o serin iguales. Diseito del algoritmo algoritme ejercicio 219 | caréeter: a, b. inicio leer (2,b) ai a = y <=, Disefto del algoritwo algoritmo Ejercicio_220 cardcter: ¢ inieto leer (2) 38° Fundementos de Programacién. Libro de Problemas “1') y ic <= "M") entonces eribir (‘Estd entre la I y la Mu} sino escribir (‘no se encuentra en ese rango’) fin si fin Estructura general de un programa 3.1. Escritura de algoritmos En la escritura de algoritmos se hard necesario el uso de alguna herramienta de programacién. La ms adecunda es el pseudocddigo, y debe quedar todo lo més claro posible, de modo que se facilite al maximo su posterior codificacién en un lenguaje de programacién, Al escribir un algoritmo deberemos considerar las siguientes partes: * La cabecera + El cuerpo del algoritmo, La cabecera contiene el nombre del algoritmo completo precedido por la palabra algoritmo. El cuerpo del algoritmno contiene a su vez otras dos secciones: el bloque de declaraciones y ef ‘bloque de instrucciones. En el bloque de declaraciones se definen o declaran las constantes con nombre, los tipos de datos definidos por el usuario y también las variables. Se recomienda seguir este orden, Para deciarar las constantes con nombre el formato serd const nombre de.constantel> = La declaracién de tipos suele realizarse en base a los tipos estindar o a otros definidos previamen- te, aunque también hay que considerar el método directo de enumeracién de los valores constituyentes. Todo esto se comentaré con més detalle en capitulos posteriores, 39 40 Fundamentos de Programacién. Libro de Problemas (Al declarar las variables tendremos que listar sus nombres y especificar sus tipos, Jo que haremos de fa siguiente forma: var El bloque de instrucciones contiene las acciones a ejecutar para la ebtencién de los resultados. Las instrucciones 0 acciones basicas a colocar en este bloque se podrian clasificar de! siguiente modo: « de inicio/fin, La primera instrucciém de este bloque serd siempre 1a de inicio y Ia tltima la de fin, + de asigaaci6a, Esta instruceién permite almacenar en una variable el resultado de evaluar wna expresién, perdiéndose cualquier otto valor previo que la variable pudiera tener. Su formato es: cnombre_de_wariable» + Una expresién puede estar formada por una nica constante, variable o funcién. La variable que recibe ef valor final de la expresién puede intervenir en la misma, con lo que se da origen a contadores y acumuladores, + de lectura. Toma uno 0 varios valores desde un dispositivo de entrada y los almacena en memo- ria en las variables que aparecen listadas en la propia instruccién. Cuando e} dispositivo sea el dispositivo estindar de entrada, escribiremos: leer () «+ de escritura. Envia datos a un dispositive. Cuando los datos los enviemos al dispositive esténdar el formato para la instruccién sera: escribir() + de bifureacién. Estas instrucciones no realizan trabajo efectivo slguno, pero permiten controlar el que se ejecuten o no otras instrucciones, asf como alterar el orden en el que las acciones son ejecutadas. Las bifurcaciones en el flujo de un programa se tealizanin de modo condicional, esto es en funcién del resultado de la evaluacién de una condicién. El desarrollo lineal de un programa se interrumpe con este tipo de instrucciones y, segin el punto a donde se bifurca, podremos clasificarias en bifurcaciones hacia adelante o hacia atrés. ‘Las representaremos mediante estructuras selectivas 0 repetitivas. Ademis, resulta recomendable que los algoritmos lleven comentarios. 3.2. Contadores, acumuladores a interruptores Entre las variables que utilizan los algoritmos merecen una especial nencidn contadores, acumulado- res ¢ interruptores. 3.2.1, Contadores Un contador es una variable cuyo valor se inerementa o dectementa en una cantidad constante cada vez ‘que se produce un determinado suceso o accion, Los contadores se utilizan en Tas estructuras repelitivas Estructura ganeral de un programa = 44 con Ja finalidad de contar sucesos o acciones internas del bucle. Con Jos contadores deberemos realizar una operacién de inicializacién y, posteriormente, las sucesivas de incremento o decremento del contador. La inicializaci6n consiste en asignarle al contador un valor. Se situaré antes y fuera del bucle. snombre_del_contader> — En cuanto a los incrementos o dectementos del contador, puesto que la operacién de asignacién admite que la variable que recibe el valor final de una expresi6n intervenga en la misma, se realizarin a través de este tipo de instrucciones de asignacién, de la siguiente form: « + podré ser positivo o negative. Esta instruecion se colocard en ell inte- rior del bucte. 3.22, Acumuledores ‘Son variables cuyo valor se inetementa o decrementa en una cantidad variable, Necesitan operaciones de: + Inicializacién + + Acumulacién | + ‘Hay que tenet en cuenta que la siguiente también seria una operacién de acumulacién: © cnombre_acumulador> * «valor» 3.2.3, Interruptores Un interruptor, bandera switch es una variable que puede tomar los valores verdad y £a1s0 alo largo de la ejecucién de un programa, comunicando asi informacién de una parte a otra del mismo, Pueden ser utilizados para el control de buctes. 3.3. Estilo recomendado para la escritura de algoritmos ‘Como se dijo anteriormente, Ia herramicnta de escritura de algoritmos més adecuada es el pseudocddigo. Con el empleo del pseudocédigo los algoritmos deberin presentar el siguiente aspecto: algoritmo const = valorl var : [, , ..... 42 FundamentosdeProgremacién. Libra de Problemas /ilos Gatos han de ser declarades antes de poder ser utilizados initolo caceisnZ> - /iSe utilizard siempre le sangria en las estructuras selectivas y //repetivivas. eaccinlt> fin 3.4. Ejercicios resueltos 3.1. Se desea calcular independientemente fa suma de los mimeros pares en impares comprendidos entre 1 y 200. Anilisis del problema El algoritmo no necesitaria ninguna variable de entrada, ya que no se Je proporciona ningin valor. Come dato de salida se.tendrén dos variables (sumapar y sumaimpar) que contendrian los dos valores pedidos. Se necesitard también una variable auxiliar (contador) que ira tomando valores entre 1 y 200. Después de inicializar el contador y los ucumtiuladores, comienza un bucle que se ejecuta 200 veces, En ese bucle se controla si el contador es par o impar, comprobanido si es divisible por dos con el operador mod; ¢ inerementando uno u otro acumulador, Disefio del algoritmo algoritme 0j_31 var entero: contador, sumapar, sumaimpar indeio contador + 0 sumapar — 0 sumainpar — 0 repetir contader. + contador + 4 ei contador mod 2 = 0 entonces sunapar ~ gumapar + contador ed_no sumsimpar — sumaimpar + contador fined Estructura:generel de un programa = 43 hasta_que contador = 200 escribir (sumapar,sumaimpar} fin 3.2, Leer una serie de mimeros enteros positives distintos de 0 (el titimo mimero de la serie debe ser ef -99) obtener el niimero mayor. Andlisis del problema DATOS DE SALIDA: maxx (el mimero mayor de la serie) DATOS DE ENTRADA: — mii (cada uno de.20s mimeros que introducimos) Después de leer un mimero ¢ inicializar méxx a ese mimero, se ejecutara un bucle mientras el iltimo nimero leido sea distinto de -99. Dentro del-bucle se debe controlar que el nimero sea distinto de 0. Si el mameto es 0 se vuelve a leer hasta que la condicidn sea faisa, Tambien hay que comprobar si el iltimo nimero leido sea mayor que el miiximo, en cuyo caso el muevo méximo serd el propio numero, Diseko del algoritmo TABLA DE VARIABLES: entero; méx,ntim 44 =~ Fundamentosde Programacién, Libro de Problemas: > 3.3 Calcular y visualizar la suma y el producto de los mimeros pares comprendidos entre 20 y 400, ambos inclusive, Andlisis del problema DATOS DE SALIDA: —suma, producto DATOS AUXILIARES: contador Para solucionar el algoritmo, se deben inicializat los acumuladores suma y producto a0 y la varia- le contador a 20 {puesto que se desea empezar desde 20) e implementar un bucle que se ejecute hhasta que la variable contador valga 200, Dentro del bucle se irin incrementando los acumuladores suma y producto con las siguientes expresiones: suma - suma+contader y producto + producto*contador. Una vez tealizadas las operaciones se debe incremaentar el contador. Como se desea utilizar sélo los niimeros pares, se usard una expresion como contador — contador+2. Estructura general de un programa 5 Diseo del algoritmo ‘TABLA DE VARIABLES: entero: contador, suma, producto 34, Leer 500 mitmeros enteros y obtener cudntos son positives Andlisis del problema DATOS DE SALIDA: * _positivos (contiene la cantidad'de nimeros positivos introducides) DATOS DE ENTRADA: niin (los niimeros que introducimos) ‘DATOS AUKILIARES: conta (se encatga de contar la cantidad de nimefos introducidos) Schade hacer un bucle que se ejecute 500 veces, controlado por la variable cont 4. Dentro del bucle se lee el mimero y comprobaremos si es mayor que 0, en cuyo caso se incrementa el contador de positivos (@ositivos), 46 —_Fundementos de Programacién. Libro de Problems Disetio del algoritmo ‘TABLA DE VARIABLES: entero : positives, mim, conta 3.5. Se trata de escribir ef algoritmo que permita emitie la factura correspondiente 'a una -compra-de un articulo determinado del que se adquieren una o;varias unidades. ELIVA a aplicar’es del 12% y si el precio bruto (precio de venta + IVA) es mayor de 50,000 pesetas, se aplicard un descuento del 5%, Anilisis del problema DATOSDESALIDA: brute (él precio brute de la compra, con o sin descuento) DATOS DE ENTRADA: precic (precio sin IVA), unidades DATOS AUXILIARES: —_neto (precio sin IVA), iva (12% del neto) Después de leer el precio del articulo y las unidades compradas, se calcula el precio neto (precio * Estructura general dé un programa 47. unidades). Se calcula también el TVA(neto * 0,12)yelbruto(neto + iva), Si el bruto es mayor que 50.000 pesetas, se le descuenta un 5% (bruto — bruto * 0.95). Al multiplicar el neto por un valor real (0.12) para obtener el IVA, y calcular el bruto a partir del IVA, ambos deben ser datos reales. Disefto del algoritmo algoritm ¢3_3_5 var entero : precio,neto, unidades real : iva,bruto inicio leer (precio,unidades) neto + precio * unidades iva © neto * 0.12 brute + neto + iva ei brute < 50000 entonces bruto © bruto ¥ 0.95 fined escribir (bruto} fin 3.6. Calcular la suma de los cuadrados de tos 100 primeros mimeros naturales, Anélisis del problema DATOS DE SALIDA: suma (acumula los cuadeados del mimero). DATOS AUXILIARES:, .. conta (contador que controla las iteraciones del bucle), Pora realizar este programa es necesario un bucle que se repita 100 veces y que se controlaré por Ja variable conta. Dentro de dicho bucle se incrementaré el contador y se acumularé el cuadrado del contador en a variable suma. Diseito del algoritmo ‘TABLA DE VARIABLES: entero : sum, conta 48 Fundamentes de Programacién. Libro de Problemas 3.7, Sumar los niimeros pares del 2 al 100 e imprimir su valor. Andlisis del problema DATOS DE SALIDA: sua (contiene Ja suma de los nimeros pares) DATOS AUXILIARES: conta (contador que va sacando los niimeros pares) Se trata de hacer un bucle en el que un contador (conta) vaya incrementande su-valor de dos en dos y, mediante el acumulador suma, y acumulando los sucesivos valores de dicho costador, El contador se debera inicializar a 2 para que se saquen nimeros pares. El bucle se repetiré hasta que conta sea mayor que 100. Diseio del algoritmo TABLA DE VARIABLES: entero : conta, suma Estructura generalde un programa 49 3.8, Sumar 10 nimeros introducidos por teclado: Andtisis del problema DATOS DE SALIDA: suma (suma de los mimeros) DATOS DE ENTRADA: idm (los mimeros que introducimos por teclado) DATOS AUXILIARES: conta (contador que controla la cantidad de mriuneros introducidos) Después de inicializar conta y.suma a0, se debe implementar un bucle que se-¢jecule 10 veces. En dicho bucle se incrementaré el contador conta en una unidad, se introducind. por teclado. nim ¥ se acumulard su valor en.suma. El bucle se ejecutard mientras que conta sea mencr o igual que 10. Disefo del algoritno ‘TABLA DE VARIABLES entero : suma, nim, conta 50 Fundamentos de Programacién.Libro de Problemas 3.9. Caleular la media de 50 mimeras introducidos por teclado y visuaizar sie resultado. Andtisis del problema DATOS DE SALIDA: media (contiene Ja media de los cincuenta nimeros) DATOS DE ENTRADA: niin (cada uno de los cincuenta nimeros introducidos por teclado) DATOS AUXILIARES; conta (contador que controla la cantidad de mimeros introducidos), «uma (acumula el valor de los mimeros) Después de inicializar conta y euma, se realiza un bucle que se repetiré 50 veces. En dicho bile se lee un nimero (cir), se acumula su valor en suma y se increments ei contador conta. El bucle se repetiré hasta que conta sea igual a 50, Una vez fuera del buele se caleula fa media (sume / 50) y se eseribe el resultado. Disetio del algoritmo TABLA DE VARIABLES entero: niim,conta,suma Estructure generalde.un programa = real : media 3.10, Visuatizar los mittiplos de ¢ comprendidos entre 4 y N, donde N es un mimero introducido por teclado, Aniilisis del problema DATOS DE SALIDA: mii tipo (cada uno de los miltiplos de 4) DATOS DE ENTRADA: — N (nimero qué indica hasta que niviltiplo vamos a visualizar) DATOS AUXILIARES: conta (contador que servini para calcular los mailtiplos de 4) Para obtener los nuéltiplos de cuatro se pueden utilizar varios métodos, Un mnétodo consiste en sacar nimeros corelatives entre 4 y Ny para cada uno comprobar si es miiltiplo de 4 mediante el operador nod. Otro método seria utilizar un contador que arrancando en 4 se fuera incrementado de 4 en 4. Aqui simplemente se ird multipticando la constante 4 por el contador, que tomara valores a partir de 1. Para realizar el algoritmo, después de inicializar conta al y miltiglo a4 y leer el mimero de ‘miltiplos que se desean visualizar, se debe ejecutar un bucle mientras que mi1t ipo sea menor que H. Dentro del bucle hay que visualizar mi1t ilo, inerementar el contador en 1 y calcular el nuevo mittiplo (4 * conta). 52 Fundamentos de Programacién. Libro de Problernas Diseiio del algoritmo TABLA DE VARIABLES entero ; miltiplo,N,conta 311, Realicar un diagrama que permita realizar un contador ¢ imprimir los 100 primeros mimeros enteros. Anéilisis del problema DATOS DE SALIDA: —_Los nimeros enteros entre 1 y 100 DATOS AUXILIARES: conta’. (controla el némero de veces que se ejecuita el bucle) Se debe ejecutar un bucle 100 veces. Dentro del bucle se incrementa en'l el coritador y sé ‘visualiza éste. El bucle se ejecutari mientras conta’ sea stietior que 100, Previamenté a la realizacién del bucle, conta .se inicializara a 0. Estructura general de un programa 53 Diseito del algoritmo ‘TABLA DE VARIABLES entero: conta 3.12. Dados 10 mimeros enteros que introduciremos por teclado, visualizar la suma de los mimeros pares de la lista, cudntos mimeros pares existen y cudl es la media aritmética de tos nimeros impares, Diseno del algoritmo DATOS DE SALIDA: spar (suma de pares), npar (cantidad de mimetos pares), media (me- dia de némeros impares) DATOS DE ENTRADA: num (cada uno de los nimeros introducidos por teclado) DATOS AUXILIARES: conta (contador que controla la cantidad de niimeros introducidos), simpar (suma de los néinetos impares), rimpar (cantidad de nimeros ‘mpares) Se ha de realizar un bucle 10 veces. En ese bucle se introduce un niimero y se comprucha si ¢s par mediante el operador mod, Si es par se incrementa el contador de pares y se acumula su valor en ef acumulador de pares. En caso contrario se realizan las mismas acciones con el contador y el acumula- dor de impares. Dentro del bucle también se ha de incrementar el contador conta en una unidad, El bucle se realizaré hasta que conta sea igual a 10. Ya fuera del bucle se calcula la media de impares (simpar / nimpar) y se eseribe spar, mpar ymedia. . Ba Fundamemtos de Programacién. Libro de Prablemas Diseto del algoritmo ‘TABLA DE VARIABLES: entero + conta, mim, spar, npar, simpar.nimpar real : nedia 3.13. Caleular a nota media por alumno de una clase de.a alumnos. Cada alumno, podré tener un ntimero n de notas distinto structure.general de un programa 55 Anilisis del problema DATOS DE SALIDA: media (media de cada alumno que también utilizaremos para acumulat las notas) DATOS DE ENTRADA: a (mimero de alumnos}, n (nimero de notas de cada alumno), nota (nota de cada alumno en cada una de las asignaturas) DATOS AUXILIARES: conta (contador de alumnos), contan (contador de notas) Para realizar este algoritmo se han de realizar dos bucles anidados, El primero se repetira tantas veces como alumnos, El bucle intemo se ejecutard por cada alumno tantas veces como notas tenga éste. Brel bucle de los akumnos sc Ice el mimero de notas ¢ inicializar las variables media y contan #0. Aqui comenzard el bucle de las notas en el que leeremos una nota, se acumula en la variable | nedia y seinerementa et contador de notas. Este bucle se ejeouaré asta que el contador de notas sea igual a n (mimero de notas) Finalizado el bucle intemo, peto todavia en. el bucle de los alumnos, se calcula la media (me- dia / n), se escribe y se incrementa el contador de alumnos. El programa se ejecutara hasta que contaa sea igual a a, Diseho del algoritmo TABLA DE VARIABLES entero: a,n,contaa,contan veal : media,nota Fundamentosde Programacién. Libro de Problemas. Introduccion a la programacion estructurada 41. Programacién estructurada La programacién estructurada es un conjunto de téenicas para desarrollar algoritmos faciles de escribir, verificar, leer y modificar. La programacion estructurada utiliza: + disefio descendente. Consiste en disefiar los algoritmos en etapas, yendo de los conceptos gene- rales a los de detalle. El disefio descendente se veri completado y ampliado con el modules, + recursos abstractos. En cada descomposicién de una accién compleja se supone que todas las partes resultantes estin ya resueltas, posponiendo su realizacién para et siguiente refinamiento. + estructuras bisicas. Los algoritmos deberin ser escritos utiiizando Unicamente tes tipos de estructnras basics. 4.2. Teorema de Bohm y Jacopini Para que la programacién sea estructurada, los programas han de ser propios. Un programa se define como propio si cumple las siguientes carncteristicas * tiene un solo punto de entrada y uno de salida. * toda accidn del algoritmo es accesible, es decir, existe al menos un camino que va desde el inicio hasta e] fin del algoritmo, se puede seguir y pasa a través de dicha accién. + no posee lazos o bucles infinitos, El teorema de Bohm y Jacopini dice que: aun programa propio puede ser escrito utilizando 87 58 Fundamentos de Programaci6n. Libro de Prablemas tinicamente tres tipos de estructuras: ‘secuencial, selectiva y repetitivan. De este teorema se deduce que se han de disefiar los algoritmos empleando exclusivamente dichas estructuras, Ta cuales, como tienen tm tinico punto de entrada y un nico punto de salida, harén que nuestros programas sean propios. 43. — Estructuras de control A las estructuras secuencial, selectiva y repetitiva se las denomina estructuras de control debido a que controlan el modo de ejecuci6n del programa. 43.1. Estructuras secuenciales Se caracterizan porque una aceién se ejeciita detrds de otra. Fl flujo del programa coincide con é! orden fisico en el que se han ido poniendo las iristrucciones. Diagrama de flujo Diagrama N-S- Pseudocddigo accién 1 accién 1 accién 2 in 43.2, Estructuras selectivas Se ejecutan unas acciones u otras segiin se cumpla o no una determinada condicién; pueden ser simples, dobles 0 miittiples. Introductién a ta programacién sstruciureds = 59 simples Se evahia la condicién y si ésta da como resultado verdad se ejecuta una determinada accién 0 grupo de aeciones; en caso contratio se saltan dicho grupo de acciones. Diagrama de flujo Diagrama N-S Pseudocédigo si entoncea | 1 eenacien, eccién [= | es : i accién dobles Cuando ef resultado de evaluar la condicién es verdad se ejecutara una determinada accién © grupo de acciones y si el resultado es fatso otra accién o grupa de acciones diferentes _ Diagrama de flujo Diagrama N-S Pseudoccdigo KD = esta | [ren] on 2 want foams] ee midtiple Se ejecutarén unas acciones 1 otras segiin el resultado que se obtenga al evaluar una expresién. Se considera que dicho resultado ha de ser de un tipo ordinal, es decir de un tipo de datos en el que cada uno de los elementos que constituyen e] tipo, excepto el primero y el altimo, tiene un tinico predecesor yun tinico sucesor. Cada grupo de acciones se encontrard ligado con: un valor, varios valores separados por comas, un rango, exptesado como valor_inicial..valor_final o una mezcla de valores y rangos, Se ejecutarin tinicamente las acciones del primer grupo que, entre los valores a los que estéligado, ‘vente con el obtenido al evaluar la expresién. Cuando el valor albtenido af evaluar la expresién no esté presente en ninguna lista de valores se ejecutarian las acciones establecidas en la cliusula e4_n0, si existiese dicha cliusula, 60 Fundamentos de Progremacién. Librode Problemas Diagrama de flujo Diagrama N-S Pseudocddigo segiinsea hacer : <> a and ae] med [peed [si_no ) fin segin 4.3.3, Estructuras repetitivas Las acciones del cuerpo del bucle se repiten mientras o hasta que se cummpla una determinada condi- cién, Fs frecuente el uso de contadores o banderas para controlar un bucle. También se utilizan con esta finalidad Jos centinelas, ‘Un centinela es un valor anémalo dado a una variable que permite detectar cudndo se desea termi- nar de repetir las acciones que constituyen el cuerpo del bucle. Por ejemplo, se puede disefiar un bucte que pida el nombre y la now de una serie de alurmos y establecer que termine cuando se le introduzea un ‘** como nombre. Podemos considerar tres tipos basicos de estructumas repetitivas: mientras, hasta, desde. mnientras Lo que caracteriza este tipo de estructura es que las acciones del cuerpo det bucle se realizan cuando la. condicién es cierta, Ademés, se pregunta por la condicién al principio, de donde se deduce que dichas acciones se padrin ejecutar de 0 a N veces. Diagrama de flujo___Diagrama N-S. Pseudocddigo mientras < idn_ldgica» hacer poe] thet eres tdrice mon accion fin_mientras hasta Las acciones del interior del bucle se ¢jecutan una vez y contimian repitiéndose mientras que la condi- cién sea falsa. Se interroga por la condicién al final del bucle. Introduccién a ia programacién estructureda 61 grama de flujo DiagramaN.S __ Pseudocddigo aoson repetiz ewpresionl6gk@ | hasta_que desde Se utiliza cuando se conoce, con anterioridad a que empiece a ejecutarse el bucle, ¢} nimero de veces ‘que se va a iterar. Laestructura desde comienza con un valor inicial de la variable indice y las acciones especifi- cadas se ejecutan a menos que el valor inicial sea mayor que el valor final. La variable indice se incrementa en 1, 0 en el valor que especifiquemos, y si este nuevo valor no excede al final se ejecutan de rmevo las acciones, Si establecemos que la variable indice se decremente en cada iteracién el valor inicial deberd ser superior al final. Consideramos siempre la variable indice de tipo entero. Es posible susttuir una estructura Geede por otra de tipo mientras controlada por un contador. Disgrama de flujo Diagrama N-S Pseudocddigo desde v < vi hasta vi 9 desde v= vi hasta \e[incremanto | decremento incr ! \ hacer | Laoaen sn caccionse> Ll fin_desde 43.4, Estructuras anidadas Tanto las estructuras selectivas como las repetitivas pueden ser anidadas, e introducidas unas en el interior de otras. La estructura selectiva multiple es un caso especial de varias estructuras selectivas dobles anida- das on la tama si_no. al entonces «accionest> si_no ai entonces ez Fundamentos de Programacién. Libro de Problemas: si_no ai entonces si_no fini fin_ei fin si Cuando se inserta un bucle dentro de otro Ia estructura intera ha de estar totalmente inchuida dentro de la externa, Es posible anidar cualquier tipo de estructura repetitiva. Si se anidan dos estruc- turas desde, para cada valor de la variable indice del ciclo extemo se debe ¢jecutar totalmente el bucle interno. desde v1 < vil hasta vfl hacer @esde v2 + vi2 hasta vf2 hacer cacciones> fin desde fin_deade Las acciones que coritponen el ctierpo del bucle mds intemo se ejecutaxén el siguiente némero de voces: (wel - vi + 1) * (wE2 - viz + 1) 44. Ejerci resueltos 41, Dados tres nimeros, deductr cud! es el central Anélisis del problema DATOS DE SALIDA: © Central (el nimero central) DATOS DEENTRADA: A,By C_ (los miimeros que vamos a comparat) Se trata de ir comparando los tres niimeros entre sf, utilizando selecciones de una sola comparacién anidadas entre si, ya que asi se shorran comparaciones (sélo wtilizamos 5), Si se utilizan comparacio- nes con operadores légicos del tipo A<3 and BC, se necesitarian seis estructuras selectivas por lo que se estarian haciendo dos comparaciones por seleccién. Diseiio del algoritmo (con comparaciones dobles) algoritmo Ejercicic 4_1 var Introduccién a la programacién estructurada 63 entero : a,b, c, central inicio leer (2, b, ¢) si (a b entonces ai b > ¢ entonces central ~ b ei a > ¢ entonces ai_no central - ¢ sino central - a fined si_no si a > ¢ entonces central ~ a at_no sic > b entonces central = b ei_no central — 8 64 Fundamentos de Programacion. Libro de Problernias finet fin_et fined escribir (central) fin 42, Caleular la raiz euadrada de un mimero y escribir su resultado. Aniiisis del problema ‘Como dato de salida se tendré la ratz y como entrada el mimero. Lo dinico que hay que hacer es asignar araiz la raiz cuadrada del mimero, siempre que éste no sea negativo, va que en ese caso no tendria ‘una solucién seal. Se utilizari Ja foncién raizcua si se considera implementada; en caso contrario, deberd ntilizarse ta exponenciacién. Disetio det algoritmo algoritmo ejercicio_4_2 var entero : 2 veal : rafz inicio leer n) ain < 0 entonces escribir (‘no hay solucién real’) ‘sino rate — on * (1/24 escribir (raiz} final fin 43. Escribir los diferentes métodos para deducir si una variable o expresién mumérica es par. La forma de deduceién se hace generalmente comprobando de alguna forma que el niimero o expresion ‘numérica es divisible por dos. La forma mis comin setia utilizando el operador mod, el resto de la division entera, La variable a comprobar, var, ser par si se cumple la condicién var mod 2 = 0 yy enicaso de no disponer del operador mod y sabiendo que el resto es resto = dividendo - divisor * ent (dividendo / divisor) se trata de ver si var es par si se cumple la expresi6n siguiente var - 2 * ent(var / 2) = 0 tra variante podria ser comprobar si Ja division real de var entre 2 es igual a la divisién entera de var entre 2 Introduecién a la progremacion estructurada 65 var / 2.= var div 2 6, siguiende el mismo método si var / 2 = entivar / 2) En algunos casos, estos ejemplos pueden llevar a ettor segiin sea ia precision que la computadora obtenga en el céleulo de la expresién. 44. Determinar el precio de un billete de ida y vuelta en ferrocarril, conocienda ta distancia a recorrer y sabiendo que si el nimmero de dias de estancia es superior a siete y la distancia superior @ 800 Kilémetros el billete tiene una reduccién del 30%. El precio por kilémetro es de 25 pesetas. Andilisis del problema DATOS DE SALIDA: —_Precio del billete DATOS DE ENTRADA: — distancia a recorrer, dias de estancia Se lee la distancia y el némero de dias y se halla el precio del billete de ida y vuelta (pzecio = distancia * 2 * 2.5), Se comprueba si la distancia es superior a 800 Km. y los dias de estancia a7 y si es cierto se aplica una reducciém del 30%. Disefto det algoritmo algoritmo ejercicio 44 var entero : distancia,diss real : precio inicio leer {distancia, dias) precio < distancia * 2 * 2.5 si dias > 7 y distancia > 800 entonces precio + precio * 0.3 fin ei escribir (precio) fin 45. Diseflar un algoritmo en el que a partir de una fecha tniroducida por teclaio con el formato DIA, MES, ANO, se obtenga la fecha del dia siguiente. Anddisis del problema DATOS DE SALIDA: dds, mms, aas (dia, mes y afio del dia siguiente) DATOS DE ENTRADA: — dq, mm, aa (dia mes y afto del dia actual) 6 © Fundementos de Programacién. LibrodeProblemas En principio lo vinico que habrfa que hacer es sumar una unidad al dia. Si el dia actual es menor que 28 (mimero de dias del mes que menos dias tiene) no sucede nada, pero se debe comprobar si a} sumar un dia ha habido cambio de mes o de afio, para fo que se comprueba {os dias que tiene el mes, teniendo también en cuenta los afios bisiestos. También se debe comprobar si es el ultimo dia del afio en cuyo caso se inerementa también el ailo, Se suponé que fa fecha introducida es correcta, Diseho del algoritmo aigoritme ojerciciot_s ver entero : dd, zm, aa, dds, mms, aag inicio leer (dd, nm, aa) @de ~ da +1 mms mm aas ~ aa ai 4a >= 28 entonces segén_sea mm hacer /fsi el mes tiene treinte dias 4,6,9,11 :4 dds > 30 entonces aés 1 me - mm + 1 fin_st ffsd el mes es febrero 2+ ad (dds > 29) 0 jaa mod 4 <> 6) entoncea ads = 1 ns — 3 fin_et d/ai el mes tiene 21 dlas y no es diciembre 1,3,5,7/3,10 ; gf dds > 31 entonces dds - 1 ms — mm + 1 fin ei ei_no ‘/si el mes es diciembre ai dds > 31 entonces dds <1 mms — 1 aas o aa tL f4n_ed fin_segin fin ot escribir (dés,mms. aes) fin 46. Se desea realizar una estadistica de los pesos de fos alumnos de un colegid we acuerdo a la siguiente tabla: : Intraduccién ala programaciin estructurada = 67 Alumnos de menos de 40 kg. Alumnos entre 40 y 50 kg. Alumnos de més de 50 y menos de 60 keg. Alumnos de més 0 igual a 60 ky. La entrada de los pesos de los alumnos se terminard cuando se introduzca el valor centinela - 99. Al final se desea obtener cuintos alumnos hay en cada uno de los baremos. Andlisis del problema DATOS DESALIDA: —contal, conte2, conta3, contad (coniadores de cada uno de os baremos) DATOS DE ENTRADA: — peso (peso de cada uno de los alumnos) Se construye wn bucle que se ejecute hasta que él peso introducido sea igual a -99. Dentro del bucle se compmieba con una serie de estructuras si. anidadas a qué lugar de la tabla corresponde el peso, incrementindose Jos contadores comespondientes. Cuando se haya salido del bucle se escribirin los contadores. ‘Notese que ha de leer el peso una -vez antes de entrar en el bucle y otra vez como iitima instruccién de éste, pues de Jo contrario se incluird el centinela (-99) en Ja estadistica la diltima vez que se ejecute el bucle, Diseto del algoritmo TABLA DE VARIABLES: entero : contal, conta2, conta3, contad real : peso CF anal =o ai? eens = ‘exist =o Teen} Tens pans Tao 68 —_Furdamentos de Programacién. Libros Problemas 4.7, Realizar un algoritmo que averigiie si dados dos mimeros introducidos por teclado, uno es divisor del otro. Andlisis det problema DATOS DE SALIDA: El mensaje give nos dice si es o no divisor DATOS DE ENTRADA: nimi, mim2 (los mimeros que introducimos por teclado) DATOS AUXILIARES: divisor (variable ldgica que seri cierta si el segundo mimero es divisor del primero) En este problema se utiliza el operador mod para comprobar si nvim2 es divisor de ntir1 Si el resto de dividir Los dos niimeros ¢s 0 se establece la variable divisox como cierta, y en caso contrario como falsa, Preguntando por el valor del divisor se obtiene un mensaje que nos indicaré si ntim2 es 0 no divisor de niimn2 Disetio del algoritmo TABLA DE VARIABLES: entero légico mim, netm2 divisor fesdineor) | trove antsary 4.8, Analizar los distintos métodos de realizar la suma de T niimeros introducidos por teclado. Para realizar Ja. suma de T némeros serd imprescindible realizar un bucle que se ejeciste T veces y que incluya una operacién de lectura y un acummulador. Al conocer de antemano el mimero de veces que sé ejecuta el bucle (T), lo mas adecuado seré utilizar un bucle de tipo desde: desde i + 1 hasta 7 hacer Introduccidn a fa:programacién estructurada 69 leer (némero} suma © suma + nimero fin_desde El mismo bucle se puede realizar con una estructura mientras 0 repetir, en cuyo caso dentro del bucle se incluiré también un contador. Con una estructura mientras: conta + 0 mientras conta < T hacer leer (nimero) suma + summa + ntimero conta © conta + 1 fin_mientras Con una estructura repeti: conta + 0 repetir leer (némero} suma © suma + numerg conta + conta + 1 hasta_que conta - 7 49% Se desea un algoritmo que realice la operacién de suma o resta de dos niimeros leidos del teclado en funcién de la respuesta S 0 R (suma 0 resta) que se dé a un mensaje de peticiin de datos. Andlisis del problema DATOS DE SALIDA: resultado (resultado de la operacién suma o resta de los dos mimeros) DATOS DE ENTRADA: a, b (los mimeros a operat), operacién (tipo de la operacién a efec~ ‘tuar) Después de leer los némeros a y b, un mensaje ha de solicitar que pulsemos uma tecla $-0 una tecla R pora realizar una u otra operacién, Aqui se incluye un bucle que se repita hasta que la entrada sea So para evitar errores de entrada, En funcidn de la respuesta se caleula el resultado que sera + b,en caso que la respuesta sea S,0 a ~ ben caso que la respuesta sea R. 70 Fundamontos de Programacién. Libro de Problemes Disefio de! algoritmo algoritmo ejercicio_4_9 vax. entero: a,b,resultado carécter operacién intelo : leer (a,b) we, . escribir(‘Pulse S para sumar, R para restar’) repetir leer (operaciéa! hhaete_que (operacién = ‘S’) 0 (operacién = ai operacién = ‘S’ entonces resultado - a +> si_no resultado — a - b fin et eribir(resultads} BY fin 4.10. Escribir un algoritmo que tea un miimero y deduzca si esté entre 10 y 100, ambos inclusive. Antitlisis del problema DATOS DE SALIDA: El mensaje que indica si el mimero esta entre esos limites” DATOS DE ENTRADA: —ntim (el ntimero que se desea comprobar) Mediante una comparacién miihiple se comprucba si el nimero esta entre esos limites, ei Cuy6 caso aparecerd un mensaje. Diseiio det algoritmo ‘TABLA DE VARIABLES entero : nin a feethepce toy 1005, Fh 411, Se dispone de tas calificaciones de’'los alumnios de vin curso de informitica correspondientes a Introduceién a la programacién estructurada = 71 Jas asignaturas de BASIC, FORTRAN y PASCAL. Diseitar un algoritmo que calcule la media de cada akimno, Anilisis del problema DATOS DE SALIDA: media (una por alumno) DATOS DE ENTRADA: nota (tres por alumno} y n (nimero de alumnos) DATOS AUXILIARES: i, j (variables que controlan los bucles) ‘Hay que leer el nomero de alumnos para conocer las iteraciones que debe ejecutarse el bucle (si se ufilizara un bucle repetir o mientrag se deberia establecer alguna otra condicién de salida), Dentro del bucle principal se anida otro bucle que se repite tres veces por alumna (cada alumno tiene tres notas) en el que leemos la nota y 1a acumulamos en Ja variable media. Al finalizar el bucle interno se halla y se escribe la media. Diseto det algoritmo algoritme sjercicic_4_11 var entero : n,i,j real : media, nota inieio leer (ni //admero de alumnos desde i = 1 hasta n hacer media ~ 0 desde j = 1 hasta 2 hacer leer (nota) media — media + nota fin_desde media ~ media/3 escribir (media) fin_desde fin 412. Escribir ef ordinograma y ef pseudocddigo que calcule fa suma de tas 50 primeras niimeros enteros, Andlisis del problema DATOS DE SALIDA: suma (suma de los primeros 50 nimeros enteros) DATOS AUXILIARES: conta (contador que ind sacando los niimeros enteros) Se trata de hacer un bucle en el que se incremente un contador y que se acumule el valor de éste en un. 72 Fundamentos de Programacién, Libro dé Problernas acumulador (summa). El bucle se ejecutaré hasta que el contador sea igual a 50, Disetio del algoritmo ‘TABLA DE VARIABLES: entero ; suma,conta Ontinograma Pseudocédigo algeritme ejercicio_4_12 entero : suma,conta inicio ouna < 0 conta + 9 repetir conta + conta + 1 sum << sume + conta hhasta_que conta = 50 esortbir (suma} fin Imroduccién a la programacién estrucurada = 73 413. Calcular y escribir ios cuadrados de una serie de ntimeros distintos de 0 leldos desde el teclado Anélisis del problema DATOS DB SALIDA: cuadrade DATOS DE ENTRADA: niin ‘Dado que se desconoce la cantidad de nimeros leidos, se debe utilizar un bucle repetir omientras. Se construye un bucte hasta que el mimero sea 0, Dentro del bucle se lee nvm y se calcula su cuadrado, Para no incluir ef ultimo mimero -el cero-, se ha de leer antes de entrar al bucle y otra vez al final de éste, Diseho del algoritmo algoritmo ejercicic_4_13 var entero = mim, cuadrado inicio leer (nim) mientraa nim <> 0 hacer cuadrado + min * nim eeerdbir(cuadrads) Leer (rim) fin_mientras fin 4.14. Un capital C esta situado a un tipo de interés R Se doblaré el capital al término de dos whos? Anéiisis det problema DATOS DE SALIDA: _ EI mensaje que nos dive si el capital se dobla ono DATOS DE ENTRADA: C (capital), R (interés) DATOS AUXILIARES: CF (capital af final del periodo) Después de introducir el capital y el interés por teclado, se caleuta el capital que se producied en dos afios por la formula del interés compuesto: CF = c(1+r}? Si CF es igual a c*2 aparecerd el mensaje diciendo que el capital se doblard, ‘74 Fundamentos de Programacién. Libro daProblemas. Disefto del algoritmo algoritmo Bjercicio ¢_14 var entero : C veal : R,CF inicio Leer ic,2) cr = c¥(1+R/100)72 ai C*2 <= CF entonces escribir (/El capital se doblaré o superaré ei doble’! sino esoribir(/El capital no se doblard"} fin at fin 4.15, Leer una serie de mimeros desde el terminal y caloular su media, La marca de fin de fectura serd el mimero -999, Analisis del problema DATOS DE SALIDA: media (media de los mimeros) DATOS DE ENTRADA: — ntim (cada uno de los mimeros) DATOS AUXILIARES: — conta (cuenta los nfimeros introducidos excepto el -999), suma (suma Jos mimeros excepto el -999) ‘Se debe construit un bucle que se repita hasta que el mimero fntroducido sea -999, Como ya se vio mas arriba (gjercicio 4,13.) se debe leer antes de comenzar el mimero y al final del bucle. Dentro del bucle se ‘incrementaré un contador, nevesario para poder cafcular la media, y un acumulador guardaré la suma parcial de Jos nimeros introducidos. Una vez fuera del bucle se calcula ¢ imprime la media. Diseito del algoritmo algoritmo ejercicic_4_15 ver entero + conta, suma, nim real : media inieio conta + suma — 0 Leer (nim) mientras nim <> -999 hacer conta — conta + 1 Introduceién a la programacién estructurada = 75 sum < suma + ném Leer (rim) fin_ mientras media — suma / conta escribir (media) fin 4.16, Se considera la serie defimida por: 4,90. a,-1, a3, #244, , (para n >=3) Se desea obtener el valor y el Fango del primer término que sea mayor o igual give 1000, Anélisis del problema DATOS DE SALIDA: —__ i (sango del primer término de la serie mayor o igual que 1000), it imo (valor de dicho témino) DATOS AUXILIARES: — penti1t:imo (pemultimo valor de la serie), valor (valor actus) Se calcula el término por tantco, es decir a partir del tercer término, se ejecuta un bucle que se realice mientras que el valor del térmnino sea menor que 1000, Para cllo se inicializa 1 a2, utimoa ly pentiltimo a0, Dentro del bucte se calcula el valor @ * Gitimo + 2 * penditimo), Antes de finalizar el bucle se deben actualizar los valores de pemiltimo (peniltino — Gitimo)y ditime (6ltino — valox). También se ha de inerementar el contador i en una unidad. Al finalizar ef bucle, primer valor mayor 0 igual a 1000 seré Gltimg, y el término i. Disefio del algoritmo algoritmo ejercicio_416 entero : i,valor,ditims, pemilt imo inicio in2 Gitimo = 1 pentltime - 0 mientras Gltimo < 1000 hacer valor — 3 * Gltimo + 2 * pentltino in det peniiltimc — Gitino Wtime - valor fin_mientras eribir (iltimo, i) fio 76 —_Fundamentos de Programacién. Libro de Problemas 417, Escribir un algoritmo que permita caleular X*, donde: X puede ser cualquier rimero real distinto de 0 n puede ser cualquier entero positivo, negativo o nulo Nota: suponemas que no esté implementado el operador de exponenciacién, Aniilisis del problema DATOS DE SALIDA: —_potencia (resultado de elevar X a la n) DATOS DE ENTRADA: _ X (base de la exponenciacién), n (exponents) DATOS AUXILIARES; conta (contador que controla el mimero de veces que se multiplica X por simismo), solucidn (serd falso si no hay solucién) Después de introducir X yn, se comprueba un, Sies 0, potencia valdra 1. Si es positive se ha de multiplicar Xn. veoes, y ello se hard mediante un buele en el que se vayan guardando en la variable producto las sucesivas multiplicaciones, En el-bucle un contador iré controlando Ias veces que se ejeouta el bucle, que finalizara cuando sea igual-a.n. Sin es negativo, primero se comprueba que X sea distinto de cero, pues en ese caso no tendr& solucion, En caso contrario se procederd de la misma forma que si es positivo, pero la potencia sera 1 /potencia. Disefio det algoritmo algoritmo ejercicio 417 var entero : n,conta real : X,potencia légico : solucién inicio leer (X, a4 solucién + verdad ein = 0 entonces potencia + 1 sino sin > 0 entonces potencia + 1 conta = 0 repetir potencia — potencia * x conta — conta + 1 basta.que conta = 0 ai_no ai X = 0 entonces eserdbir('No hay solucién’) solucién — falso ed_no potencia — 1 Introducciéa ala programacién estructurade = 77 conta = 0 repetir potencia ~ potencia * X conta + conta -1 hhasta_que conta =n potencia + 1 / potencia fin st fined fined ei solucién entonces escribir (potencia) fin_si fin 4.18. Se desea leer desde teclado una serie de mimeros hasta que aparezca alguno menor que 1000, Andlisis del problema En este algoritmo, s6lo hay un dato de entrada, que sera cada uno. de los mimeros que leemos, y no tenemos ningin dato de salida. No hay més que ejecutar un bucle hasta que el numero lefdo sea menor de 1000, Diseho del algoritmo algoritms: ejetcicic 418 var real : nim intalo repetir Leer (rim) hastacque mim-< 1000 //sé1lo se admiten los menores’ de 1000 fin 4.19. Se desea obtener los cuadrados de todos los nimeros leidos desde un archivo hasta que se encuentre el miamero 0. Andtisis del problema Este ejercicio es muy similar al anterior aunque se introduce 1a nocién de archivo que seré vista en profundidad més adelante. Por el momento no vainos a tenet en cuenta las operaciones de abrir y cerrar 1 archivo, asi como la marca de fin de archivo o ta definicién de su estructura, Para leer nlimeros desde el archivo lo tinico que vamos a hacer e3 una operacién de lectura indicando que se lee desde un archivo: 78 Fundementos de Programacion. Libro de Problemas. leer (nombre del archive, lists de variables} Diseio del algoritmo algoritme ejercicio 41s var real ; nim inicio repetir Leer (archivo, nin} ai min <> 0 entonces eseribirimin * 2) fin_si haste_que nin fin 4.20, Algoritmo que reciba una fecha por teclado - dd, mm, aaaa -, asi como el dia de la semana que fue el primero de enero de dicho atio, y muestre por pantalla el dia de la semana que corres- onde a la fecha que le hemos dado. En su resolucién deben considerarse los atios bisiestos. Anélisis del problema Se comenzaré realizando una depuracién en cuanto a la introduccién de datos. Una vez aceptada una ffecha como corecta, se inicializard a 0 la variable dtot.al y se acumulan en ella los dias correspon- dientes a cada uno de los meses transcurridos, desde enero hasta el mes anterior al que indica la fecha, ambos inclusive. Por tiltimo le afiadiremos los dias del mes actual. Si hacemos grupos de 7 con dt otal, se obtendré un cierto mimero de semanas y un resto. Para averiguar el dia de la semana en que cae la fecha especificada, bastard con avatizar, a partir del dia de Ja semana que fue el primero de enero de dicho aifo, el nimero de dias que indica el resto Se ba de tener en cuenta que, considerando que la semana comienza en lunes, avanzar desde el domingo consiste en volver a situarse en el lunes. Diseito det algoritmo algoritmo ejercicio_4_20 entero : dd, mm, aasa, contm, Stotel, dl cordcter + dia Légico correcta, bisiesto inicto repetiz bisiesto = falso Introduccion a la programacién estructurada correcta + verdad escribir(’Deme fecha (dd mm asa) *) deeridd, mn, aaaa) ei (aaea mod 4 = 0) y (aaaa mod 100 <> 0) 0 we(aaaa mod 400 = 0] entonces bisiesto + verdad fined correcta + false finest 4,7, 9, lds si dd > 30 entonces correcta + falso fin_el 2: si bisieste entonces si dd > 29 entonces correcta + faleo fin_si si_no ei dd > 28 entonces correcta + falso finei fin ei et_no correcta © falso fin sein hasta_que correcta atotal - 0 desde contm — 1 hasta mn - 1 hacer segin_sea contm hacer 1,3, 5, 6, 8 10, 12: dtotal © dtotal + 31 4,7, 9, lit dtotal < dtotal + 30 2 si bisiesto entonces dcotal © dtotal + 29 et_no drotal + dtotal + 28 fin_ai fin_secun fin_desde Stotal © dtotal + aa repetir escribir(‘Dene dfa de ia semana que fue el 1 de ENERO (/m/x/j/vis/d) *) leer (dia) ‘80 Fundamentos de Programacién. Libro deProbtemas segin.cea dia hacer MeeeLte aoo hasta_que (dl >= 0) y [di <= 6] dcotal © dtotal + dt eegin_sea dtctal mod 7 hacer “ scribir(‘Lunes'+ ‘ seribir(‘Martes’) © peortbie(iércotes") . escribir ( Jueves") = escribir Viernes’) “ seribix {'sdhado') oO: seribir (‘Domingo’) fin_segan fin Subprogramas (subalgoritmos), procedimientos y funciones 5.1. Programacién modular Fl disefio descendente resuelve un problema efectuando descomposiciones en otros problemas mis sencillos a. través de distintos niveles de refinamiento. La programacién modular consiste en resolver de forma independiente los subproblemas resultantes de una descomposiciGn. La programacién modular completa y amplfa el diseilo descendente como método de resolucién de problemas y permite proteger la estructura de la informacién asociada a un subproblema, Cuando se trabaja de este modo, existird un algoritmo principal o conductor que transferird el contro! a los distintos médulos 0 subalgoritmos, los cuales, cuando terminen su tarea, devolverin el conttoi al aigoritmo que los llamé. Los médulos 0 subalgoritmos deberan ser pequeiios, seguirén todas las reglas de la programacién estructurada y podrn ser representados con las herramientas de progra- macién habituales. El empleo de esta técnica facilita notoriamente el disefio de los programas; por ejemplo: _ + Como los médulos son independientes, varios programadores podrén trabajar simulténeamente en la confeccién de un algoritmo, repartiéndose las distintas partes del mismo. + Se podri modificar un médulo sin afectar a los dennis + Las tareas, subalgoritinos, sélo se escribirdn una vez, aunque se necesiten en distintas ocasiones a1 82 —_Fundamentos de Programacién. Libro de Problemas, a lo largo del algoritmo. Existen dos tipos de subalgoritmos: finciones y procedimientos, 5.2. Funciones Una fimcién toma uno o més valores, denominados argumentos o parimetros actuales y, segun el valor de éstos, devuelve un resultado en el nombre de la funcién, Para invocar a una funcién se utiliza su nombre seguido por los pardmetros actuales o reales entre paréntesis en. una expresién. Es decir que s¢ ppodré colocar Ia Tamada a una funcién en cualquier instruccién donde se pueda usar una expresisn. Por ejemplo escribir {raiz2(i6) }. O, sila funcién se denomina £ y sus pardmetros son 21, p2 y p3 eseribir(f(p1,p2.93) 1. Cada lenguaje de programacién tiene sus propias funciones incorporadas, que se denominan inter- nas o intrinseeas, Se considerarén como internas tinicamente las mds basicas y comunes a casi todos los enguajes y se iran comentando a lo largo del libro en los capitulos adecuados, es decir cuando para explicar el tema se necesite una referencia a alguna de elias. Si las funciones estandar no permiten realizar el tipo de célculo deseado ser necesario recurrir a Jas funciones extemas, que definiremos mediante una declaracién de funcién. 5.2.1. Declaracién de funciones ‘Las funciones, como subalgoritmos que son, tienen una constitucién similar a los algoritmos. Por consiguiente, una fimcién constaré de: + cabecera, con la definicién de la funcién + cuerpo de in funcién ‘Dentro del cuerpo de la funcién estaré el bloque de declaraciones y el bloque de instrucciones. Este debe incluir una instruccién mediante la que Ja funcién tomaré un valor para devolverlo al algoritino Mamador. Para que las acciones descritas en una funcién sean ejecutadas se necesita que ésta sea invocada, y se le proporcionen los argumentos necesarios para realizar esas acciones. En la definicién de La funcién deberan figurar una serie de parimetros, denominados parametros formales, para que, cuando se Iame a Ia funcién se pueda establecer una correspondencia uno a uno y de izquierda a derecha entre los parémetros actuales y los formales. En el cuerpo de la funcién se utilizarén los parimetros formales cuando se quiera trabajar con informacién procedente del programa llamadar. El pseudocddigo corres- pondiente a una funcién seria funeién |jiste_de_pardmetros_formales) { declaraciones locales 1] inicio Aevolver () fin_funcién ‘Subprogramas (subalgoritmos), procadimientos y funciones 83 La lista_de_pardmetros_foxmales estard formada por una o mis sublistas de pardmetros de la siguiente forma: (818) B/3}:.. Las Tlaves quieren decir que se elija sto una entre las distintas opciones que aparecen separadas por una barra. En las funciones habitalmente seni &. Todo esto se detallard mis adelante. Los corche- tes indican no obligatoriedad. El tipo de dato debe ser estndar o haber sido definido de antemano. Podemos separat distintos tipos de parametros utilizando el punto y coma (;) entre cada declaracién. 5.3. Procedimientos Un procedimiento es un subalgoritmo que realiza una tarea especifica y que puede ser definido con 0, 1 oN pardmetros. Tanto la entrada de informaci6n al procedimiento como fa devolucién de resultados desde el procedimiento al programa llamador se realizardn a través de los pardmmetros. Bl nombre de un procedimiento no est asociado a ninguno de los resultados que obtiene. La invocacién a un procedimiento se realiza con una instruccién llamar_a 0 bien directamente con el nombre de] procedimiento. Es decir: [1lamax_a] [(lista_se_pardmetros_actuales} ] Como se puede apreciar con respecto a la lista de panimetros no existe obligatoriedad, 5.3.1, Declaracién de procedimientos La declaracién de un provedimiento es similar a la de una fimcién, ins pequefias diferencias son debidas a que cl nombre del procedimiento no se encuentra asociado a ningin resultado, La declaracién de un procedimiento expresada en pseudocddigo seria: procedimlento | (lista de pardmetros_formales +) [ declaraciones locales ] inicio f1n_procedimiento La lista_de_pardmetros, Zormaes estard formada por una 0 més sublistas de parimetros de la siguiente forma: {B|8|B/8}:cnombre_de_parémetzo_formal>.. ¥ seguitia la mismas reglas que la declaracién de pardmetros en las funciones. En el algoritmo principal las declaraciones de procedimientos y funciones, se situardn al final, al objeto de agilizar la escritura de algoritmos. 84 FundementosdeProgramacién. Libro deProblemas 5.4. Estructura general de un algoritmo algoritmo conet -vatort tipo : «nambre_del_tipo> J/ $e veré en capitulos posteriores var :[, ,. J/los dacos ban de ser declarados antes de poder ser utilizados inicio lamar_acnombre_de_procedimiento»( (lista_de_pardmetros_actuales)] // la lamada a la funcién ha de realizarse en una expresién joribir( (lista_de_parduetros_actuales}} f/se utilizaré siempre le sangria en las estructuras //selectivas y repetitivas. kacoibait> tio procedimiento { (lista_de_pardmetros_formales) | I declaraciones locales | inicio £in_procedimiento funelén [ (1ista_de_parémetros_formales} | // el devuelto por la funcién es un tipo esténdar [ declaraciones locales | inieto devolver () fin_funcién 5.5. Paso de parametros Cuando un programa llama a un procedimiento 0 funcién se establece una correspondencia entre los pardmetros actuales y los formales. Existen dos formas para establecer la comrespondencia de pardmetros: + Posiclonal. Emparejando los parametros reales y formales segtin su posicién én las listas. Esto ‘Subprogramas (subalgoritmos), procedimientos y funciones 85 requiere que ambas listas tengan el mismo mimero de parimetros y que los que se van a empa- rejar coincidan en el tipo. En la definicién del subprograma deberd reflejarse siempre de qué tipo es cada uno de los parimetros formales. (B :. , El tipo de dato debe ser estindar o haber sido definido de antemano, Si los pardmetros formales se separan por comas es necesario, aunque no suficiente, que tengan el mismo tipo. Si su tipo fuera distinto habria que poner: (EB : ; B : ) + Correspondencia por el nombre expiicito. Fin las Namadas se indica explicitamente la corres pondencia entre los parimetros reales y formales. Dado que la mayor parte de los lenguajes usan exclusivamente Ia correspondencia posicional, éste seri el método que se seguiré en la mayoria de los algoritmos. Al hablar de los provedimientos se decia que devuelven resultados al programa principal a través 4e los parimetros, pero que también pueden recibir informacién, desde el programa principal, a través de ellos, Esto nos lleva a una clasificacién de los parimetros en: Pardmetros de entrada Permiten tinicamente 1a transmisién de informacién desde el pro- grama Iamador al subprograma. Pardmetros de salida Sélo devueiyen resultados. Pardmetros de entrada/salida Actin en los dos sentidos, tanto mandando valores al subprograma, devolviendo resultados desde el subprograma al programa llamador. En os algoritmos, se debe especificar en la definicién del subprograma como se desca que se comporte cada uno de los pardmnetros; para ello se empleard la siguiente terminologia: + E equivaldria a pardmetro de entrada + S querré decir pardmetzo de salida + BIS parimetro de entrada/salida En a lista de parimetros siguiente (B : ; S ) es parimetro de entrada y va a proporcionar datos all subprograma, es parimetro de salida y devotverd resulta- dos al programa llamador. Aunque ambos son del mismo tipo, 1 para n <= 1, Fibonacci, = 1. 90 Fundamentos de Programacién. Libro de Problernas Por lo tanto se deben sumar ios clementos mediante un bucle que debe ejecutarse desde 2 hasta 2. Cada iteraciOn debe guardar el titimo y el pentitimo témino, para to que se utilizan dos variables itimo y pemilt imo, a las que iin cambiando sus valores, El subalgoritmo aceptardé una como entrada una variable emtera y devolverd un valor también entero, por lo que deberemos utilizar una funeiéa Diseio del algoritmo entero funciéa Fibonacci (e entero : n> var entero : i, ultimo, pentiltimo, suma inicio euna = 1 ltime © 1 pendltimo + 1 desde i + 2 hasta n hacer pentiltimo © Wltimo wtime © suma guna © Ultimo + peniltime fin_deede devolver {suma) fin_funcién 5.3. Implementar una fianciin que permita devolver un valor entero, letdo desde teclade, compren- dido entre das limites que introduciremos como pardmetro. Andlisis de problema Esta funcién puede ser dtih para validar una entrada de datos de'tipo entero y_s¢ podré incluir en otros algoritmos. Consistird simplemente en un bucle zepetiir que ejecutari Ia lectura de un dato hasta que esté entre los valores que se han pasado como parémetros de entrada. Disetio del algoritmo entero funcién Validarimtero(B entero : inferior, superior! var entero +n inieto repetir Leer (1) hasta_que = >= inferior y a <= superior devolver (n} fin_funcién ‘Subprogramas (subalgoritmesi, procedimientos y funciones 91 ‘Los parimetros inferior y superior deberin pasarse en dicho orden; es decir, primero el menor y Iuego el mayor, aunque con.una pequefia modificacién podrian pasarse en cualquier orden, Para cllo deberia incluirse una condicién antes de comenzar-el bucle que, de set necesario, haria una lamada al procedimiento Intercambic, ya desarrollado: i inferior > sugerior entonces Intercambio (inferior, superior} fini 5.4, Disefiar una fiencién que permita obtener el valor absoluto de un ntimero, Andlisis del problema El valor absoluto de un nimero positivo, seria el mismo mimero; de un niimero negativo seria el mismo niimeto sin el signo y de 0 es 0. Por lo tanto, esta fimciGn, tinicamente deberia multiplicar por -1 el nimero pasado como parimetro de entrada en el caso que éste fuera menor que 0, Disefio det algoritmo entero funcién 4bs(E entero : n) inicio sin < @ entonces devolver(n * ~1) si_no devolver (n} fin_et fin_funcién Esta funcién sélo es valida para mimeros enteros. Para que valiera con algin otro tipo de dato numérico, deberiamos utilizar un tipo de dato abstracto, 43. Realizar un procedimiento que obtenga la divisién entera y el resto de Ia misma utilizando limicamente los operadores suma y resta. Anilisis del problema Ladivisién se puede considerar como una sucesién de restas. E] algoritmo trata de contar cudntas veces se puede restar el divisor al dividendo y dicho contador seria el cociente. Cuando ya no se pueda restar ‘fs sin que salga un néimero positivo, se tendré el resto. 82 —_Fundaméntos de Programacién. Libro de Problemas, Por Jo tanto se tienen dos parémetros de entrada, Gividendo y divicor, y dos de salida, cociente y resto. cociente seri un contador que se incrementari en 1 cada vez que se pueda restar el divisor al dividendo. El bucle a utilizar sera de tipo mientras, ya que puede darse cl caso que no se ejecute ninguna vez, en cuyo caso él cociente serd 0 y el resto sera el dividendo. Disefto del algoritmo procedimlento Divisiénintera{ B entero : dividendo, divisor + 8 entero ; cociente, resto) inicio cociente + 0 mientras dividends -> divisor hacer dividends + dividendo - divisor cociente — cociente.+ 1 fin mientras resto © dividendo f£in_procedimieato 5.6. DiseRar un procedimtento que permita convertir coordenadas polares (radio, dngulo) en cartesianas (x,y) x = radio * cos(dngulo) y = radio* sen(angulo) Andlisis del problema La resolucién requiere aplicar la formula indicada mds arriba. Habré que tener en cuenta el tipo de porimetros, radio y angulo serdn de entrada y x e y de salida. Diseito del algoritmo procedimiento Polares( B real : Angulo, radio ; 8 real 1 x, y) inicio x + radio * cos{angulo) ¥ © radio * sen(angulo} fin_procedimiento 5.7. Diseite una funcién que permita obtener el factorial de un mimero entero positivo. ‘Subprogramas (subalgoritmos), procedimientos y funciones 93, Andilisis del problema El factorial de n se pmuede definir para cualquier entero positive como Factorial, =n * n-1*n-2*. en por definicién, Factorial, = 1 Por lo tanto para implementar un funcién Factorial, se deberd realizar un bucle que se ejecute entre 2 y 1, acumulando en su cuerpo las sucesivas multiplicaciones. Diseto del algoritmo entero func4én Factorial{ B entero : n) var entero : i, £ inieto feu desde i - 2 hasta n hacer fetta fin_desde devolver (f) fin_funcién 5.8. Disefiar una fincion que permita obtener el méximo comin divisor de dos nitmeros mediante el algoritmo de Euclides, Anilisis del problema Para obtener el méximo comim divisor de dos nimeros enteros positivos @ y 6 segin el algoritmo de Euelides, se debe ejecutar un bucle que divida a entre b, Si el resto es 0, b serd el divisor; en caso contrario, a tomard el valor de y b el del resto de la divisién anterior. El bucle finalizar4 cuando el resto sea 0, es decir, cuando a sea divisible entre . Disetto del algoritmo entero funcién Mca ( entero :2,b} var entero : resto inicio mientras a mod b <> 9 hacer resto © a mod b acd b + resto fin mientras 94 Fundamentas de Programacién. Libro de Problemas, devolver (b} fin_funeién 5.9 Realizar una funcién que permita saber si una fecha es vitida. Andilisis del problema Esta fimeién es muy normal en cualquier apticacién informética. Se trata de ver si una fecha, introdu- cida como mes, dia y afio es una fecha correcta; es decir, el dia ha de estar comprendido entre 1 y 31, el mes entte 1 y 12, y, si esto es correcto, ver si el niimero de dias para un mes concreto es valido, El tipo de la fimeién ser un valor Igico, verdadero si la fecha es correcta 0 falso si es errénea. Como ayuda, se utilizaré una funcién Es3i si esto, a la que se pasard el valor entero correspondiente aun aho determinado y devolverd un valor légico verdadero si el ailo el bisiesto y falso en caso contra- rio. Un aio seri bisiesto si es divisible por 4, excepto los que son divisibles por 100 pero no por 400, es decir, menos aquellos con los que comienza el siglo. Un disefio modular de la funcién podria ser.por tanto: ane) -| t a ice “tt [so] Disetio del algoritmo légico funcién Fechavélida(R entero : 4a,n,aa) inicio FechaVélida + verdad ai (mm < 1) © mm > 12) entonces devolver (falso) i_no si dé < 1 entonces devolver (falso} si_no segin_sea mm hacer 4,6,9,11 : si dd > 30 entonces devolver (falso} fina 2: gf Bebisiesto(aa) y (Gd > 29) entonces devoiver [falso] ‘Subprogramas (subalgoritmas}, procedimientos y tunciones 95 et_no ei no Esbisiesta(sa) y.(dd > 28) entonces devolver (fa1s0) fined fined si_mo ei dd > 31 entonces devolver (falso} fin_si fin_segin fin ad fin_st fin_funcién légice funcién EsBisiestoi= entero : 2a} inicio . devolver((22 mod 4 = 0) y (aa mod 100 <> 0} © jaa mod 40¢ = 0)) fin_funcién 5.10, lmplementar una funcién que permita hatlar el valor de X°, siendo X un nimero real ¢ y un entero, . Anélisis det problema Se trata de una funcién similar a la del factorial, pues se trata de acumular multiplicaciones, pues cbemos multiplicar X por s{ mismo y veces. $i y es negativo, es igual a su inversa Disefio det algoriemo real funcién Potencia( B entero : x,y) var entero : inicio pol desde i — 1 hasta abs(y) hacer devolver (p) si_no devolver (1/p} fin st fin_funcién SM. Realizar tres funciones que permitan hallar ef valor dea mediante las series mateméticas siguientes: 96 Fundementoe de Propramatin, Libro dePablemas espe yan =f- 4: 1 hm oO w=4 3.35577 Laprecisién del calculo dependerd del niemero de elementos de la serie, n, que seré um parmetro que se pase a la fuuncién. Andéiisis del problema En cualquiera de los tres casos se debe implemenrar un bucle que se ejecute n veces y en el que se ird acumulando la suma de los términos de la serie. En el caso (a), los términos pares suman y los impares restan, por lo que. seri preciso hacer una distincién, El mumerador siempre es 1, y el denominador son los # primeros niimeros impares. En cl caso (6), el numerador es 24 y el denominador serd el cuadrado de la variable del bucle. El resultado final sera la raiz cuadrada de la serie. En el caso (c) lo que se debe acumular son los productos; el mumerador serin los mimeros pares y el denominador los impares. Disefto del aigoritmo @ real funcién Fi( entero : n) var real : serie entero : i, denom légice : par inicio genom = 1 serie — 0 par ~ faleo desde i ~ 1 hasta n hacer ei par entonces serie — serie ~ 1 / denom ai_no eerie ~ serie +1 / denom fin et par + no par denom — denon + 2 fin_deede Gevolver (serie * 4) fin_funedén ‘Subprograr [oubalgoritmos), proved fantos y funciones (b) real funcién Pi(z entero ; n} real : serie entero : i inicio serie — 0 desde i ~ 1 hasta n hacer serie ~ serie + 24 / in fin desde Aevolver(raiz2 (ceric) / 2) fin_funcdén ® veal funcién Pi(e entero : n) var real ; serie entero: i Aniedo serie ~ 2 desde i — 1 hasta n hacer si i mod 2 = 0 entonces serie - serie * is (i+ 1) tno . serie + serie. * (i + 1) / 4 finei fin desde devolver (serie) fin_funoién 5.12, Realizar un subprograma que calcule la suma de los divisores de n distintos de n. Anilisis del problema 97 Para obtener los divisores del nimero entero n, séra preciso hacer un bucle en el que un contador se ird dccrementando desde n-1 hasta 1. Por cada iteracion, se comprobari si el contador es divisor den. Como el primer divisor que podemos encontrar sei n./2, el valor inicial del contador podrd ser aiv 2 El tipo de subprograma deberé ser una funcién, a la que pasarfamos como parametro de entrada cl mimero 0, Diseio del algoritmo entero funcién SumaDivisor(B entero : n) 38 Fundamentos de Programacién. Libro de Problemas var entero : suma,i inicio puma — 0 desde i — n div 2 hasta 1 incremento -1 hacer ein mod i = 0 entonces suma - suma + i fin_ei fin desde devolver (sua) fin_funcion 5.13. Dos mimeros son amigos, si cada uno de ellos es igual a ia suma de los divisores del otro. Por ejemplo, 220 y 284 son amigos, ya que: Suma de divisores de 284 : 1+2+4+71+142 = 220 Suma de divisores de 220: 1+2+4+5+10+11+20+22+4d+55+110 = 284 Diseie un algoritmo que muestre todas las parejas de nimeros amigos menores o iguales que m, siendo m un nimero introducido por teclado, Andlisis del problema Este algoritmo se puede descomponer en tres partes diferenciadas. Por una parte un progruna prinei- pal que debe ir sacando todas las parejas de mimeros mayores o iguales a un néimero m que previamente habremos introducido por teclado. Desde ahi se lamara a una funcién légica Somamigos que dird si la pareja de niimeros son amigos. Para hacer esto, se calcula la suma de tos divisores, para lo que Mamaremos ala fancién SumaDivisor, desarrollada mis arriba, Por lo tanto un diseio modular del programa podria ser como sigue: PROGRAMA PRINCIPAL El programa principal leerd el nimero m, e implementard dos bucles anidados para sacar las, parejas menores o iguales que m. Para elfo, un primer bucle realizaré la iteraciones de i entre 1 y m, mientras que el bucle intemo iri tomando valores entre i#-1 ym, Dentro del bucle habré una llamada ‘Subprogremas (subalgormos), procedimientos y funciones 99 ala fmeién Sondimigos, y si ésta devuelve un valor verdadero eseribiremos Ia pareja, La funcion Sondmigos se encarga de comprabat si una pareja de némeros son amigos. Recibe dos parametros de entrada, y guarda en dos variables la suma de sus divisores mediante la funeién SumaDivisor. Si ambas sumas son iguales, devolverd un valor verdadero; en caso contrario, falso, Disefio del algoritmo algoritmo ejercicis_s_13 entero: i,j,m inicio Leer (mt? desde i — 1° hasta” m-1 hacer desde j ~ i+ hasta m hacer si SonAmigos(i,j) entonces escribir (i, 4) fin_ei fin_desde fin desde fin) “ : légico funciém SonAmigos( entero : 2,m) inicio devolves ( (SuiaDivisor inj = m) y (Sumabivicortm) =n) fin “tunctén : . 5.14, El ntimero de combinaciones dem elementos tomados den en nes: (7) aor=m Diseitar una funcién que permita caleuta el mi ‘era combinatorio | ™ n Andlisis det problema La funcién se reduce a una simple asignacién, siempre que se tenga resuelio el problema de hallar el factorial, cuya fumcién ya se ha disefiado mas arriba, Por lo tanto se limitard a codificar la expresi6n del niimeto combinatorio. Disetio del algoritmo entero funcién Combinatorio(# entero : m,n) inicio devolver (Factorial (m) div Factorial (n) * Factorial{m - n)) fin_funcién 100 —_Fundementos de Programacién. Librode Problemas 5.15. Implemente tres funciones que permitan averiguar tos valores de e*, cos(x) y sen(x) @ partir de las series siguientes: mi tog e * ers 3 2 yt xo ott im 2! 4! 6! aut eo gt sen(x) = Se en +l ar st 7 El miimero de términos de 1a serie sera el suficiente para que la diferencia absoluta entre dos valores sucesivos sea menor 10°. Andlisis del problema En ambos casos se trata de hacer un bucle que se ejecute hasta que el valor absoluto de Ia diferencia, entre el iltimo y el penultimo término sea menor que 0.001. Dentro del bucle habré un acumulador que sume cada uno de los términos. Pare el caso dee, en cada término el numerador seré x elevado al nimero de orden del término, mientras que el denominador serd el fuctorial del mimero de orden del vérmino. El contador del bucle por lo tanto iré tomando valores entre 1 yn, Para cos(s), el sumerador ini elevando x a las potencias pares, mientras que el denominador seri el factorial de los nimeros pares. Por Jo tanto el contador del bucle iri sacando los némeros pares. Ademéa, en él los términos de orden par restan, mientras que los de orden impar suman, Por iltimo, para sen(x), la diferencia esiriba en que la potencia y el factorial serian de los mime- ros impares, por lo que el contador del bucle sacaré los niimero impares, En los tres casos, como se ha dicho més arriba, tendremos que utilizar une variable suma que acumulard el valor de la serie, un contador, con les caracteristicas que se han indicado y dos variables reales para guardar el iiltimo y el peniiltimo término, para ver si la diferencia entre ambos es menor que 0.001. Disefto del algoritmo ee veal funcién exporente( & entero : x} var entero : i real : guma, itimo, término iniele ‘Subprogramas (subalgoritmos}, procedimientos y funciones suma ~ 1+ x ist térinino 3 repetix tied Witime — término eérmino ~ x°i / Factorial(i) suna ~ suma + término hasta que abs(término - iltimo) < 0.001 devolver (suns) fHp_ftuncién costs) real funcién cos( B entero : x ) var entero : i real : soma, iltimo, témino légico :par inicio suma 1 término = 1 iso par — verdad repetiz inis2 dltime — céxmino término ~ x*i / Factorial(i) a4 par entonces suma ~ suma - término at_no Suma - suma + término finet par — m0 par hasta que aba(término - Gltimo) < 0,001 devolver {sua} fin_funcién sen(x) real funeién sen( — entero : x) var enters : i real : suma, Gltimo, término légice : par inicio uma — x 101 102 Fundamentos da Programacién. Libro de Problemes. término — x in. per + verdad repetir doin? Wiltino — términe témnino — x*i / Pactorial{i} ai par entonces suma + suma - término ai_no sum < suma + términe fin_sit per + no par hasta_que aba(término - Ultimo) < 9.001 devolver (suna} fin_tuncién 5.16. Implementar wna fiuncién ReGondes (a,b), que devuelva el mimero real a redondeado a b decimaies. Andlisis det problema Para redondear un niimero real aa 6 decimales -siendo un nilmero entero positivo-, hay que recurrir ala fimeién estindar ent que elimina los decimales de un niimero real. Si se quiere dejar una serie de decimales, hay que obtener el entero de la multiplicacién del ninmero @ por 10° y dividit el resultado por 10%, De esta forma, el resultado, siendo a=3.546 y 5=2, seria: ene (3.546*100) /100 = emt (354.6) /100 = 354/100 = 3.54 Con esto se consigue truncar, no redondear, Para redondear, de forma que hasta 0.5 redondee por defecto y a partir de ahi por exceso, se debe sumar « la multiplicacién 0.5: ent (3.546*10040.5)/100 = ent (254.6+0.5)/100 = ent (355.14/100 = 255/100 = 3.55 Para realizar esta funcién, inicamente se ha de aplicar la expresién anterior. Disefio del algoritmo entero funcién Redondec{ B real : a + & entero inieio devolver(entia * 10% + 9.5) / 10b) fin funcién ‘Subprogramas isubalgoritmes), procedimientos y funciones 103 4.17, Algoritmo que transforma un niimero introducido por teclado en notacién decimal a roma na. El mimero seré entero y positive y no excederd de 3000. Anéiisis del problema Para pasar un nimero desde notacién decimal a romana se transformara individualmente cada uno de sus digitos, El procedimiento para transformar un digito es siempre el mismo Digito. Escribir dela3 dead vecespl 4 ppl seguido de p2 = de5a8 p2seguido por, de 0a 3 veces, pl... 9 ply acontinuacién p3 Tenga en cuenta que, en las distintas llamadas que se realizan al provedimiento, se pasarin diferen- tes parfanetros: Parametro 1 (pt) Unidades [2 vw “K Decenas | "x" tL ‘ Centenas | c+ 'D! oo Miles an mo ve Diseho del algoritmo . Algoritmo Ejercicios Ah 0 y) entero : n, r, digite inielo repetir escribir('Deme niimero *) leer(n) hastd_que: (n >=.9) y(n <= 3990) ron : 2 digito ~ x atv 1900 = 5 mod 1000 calecifraromidigite, (m', 0 1.8 1) digito — 1 div 100 x= r mod i00 calecifrarom(digito, 'C', 'D', 'M} digito ~ r atv 10 104 Fundamentos de Programacién. Libro de Froblemias cor med 10 calecifrarom(digite, ‘x’, 'L', 'C'] @igite - © ealecifrarom(digito, 'I', ‘vt, 'K't fin procedimiento calccifrarom (@ entero: digito ; # caracter: pl, p2, p3) var entero: j inicio ai digito = 9 entences escribir( pl, p3} sino ai digito > 4 entoncel eseribir{p2) desde 5 — 1 hasta digito - 5 hacer eseribir{ pl) fin_desde ei_no ei digito = 4 entonces escribir( pi, p2) desde j ~ 1 hasta dicito hacer esoribix (pl) fin_desde fini fined fined fin procedimiento 5.18, Escribir una funcién, INTEGRAL, que devuelva el drea del recinto formado por el eje de'las X, las rectas x=a y x=b y el arco de curva correspondiente a una fimciin continua, recibida come parimetro, con valores positives en el intervalo considerado. Andlisis de problema La funcign integral dividiré el intervalo [a,b] on n subintervalos y considerard n recténgulos con esas bases y cuyas alturas sean el valor de Ia funcién recibida como pardmetro, f(x), en el punto medio de los subintervalos. La suma de las areas de todos estos rectingulos constituiré el valor devuelto por integral. // tipo reai funcién(E real : x) ¢ func real funcién integral (B func: £ 7 B real : a, b; B entero: n) var real: baserecténgulo, aiture,x,s entero : i Subprogramas (subalgorimos), procedimiontos y funciones 105 indole baserecténgulo + (ba) fn x a + baserect4ngulo/2 oo desde i + 1 bas altuza © £(0) 8 + 5 + baserectdngulo * altura x = x + baserecténgulo fin desde devolveris} fin funcién n hacer 5.19. Escribir una fimcién vecursiva que calcule él factorial de un niméro entero positivo, Anilisis del problema Fl factorial de un mimero entero positive nse puede definir como: nl =f nit para cualquier nimero mayor que.uno, ya que 1! = 1 y Of Itamada recursiva ser cuando n sea menor o igual que 1. ). Por lo tanto la condicién de salida de la Disco del algoritmo entero funcién fact(z entero : nj} inicio ain = 0 entonces devolver (1) si_no devolver(n * fact (n-1}) fin_at fin_funoién $.20, Escriba una funcién recursiva que calcule la potencia de un niimero entero positivo. Andilisis del problema Una definicién recursiva de 2 para dos nimeros enteros positivos es la siguiente: wont (* es 1. Bsa seré Ia condicién de salida de las Hamada recursivas). 106 Fundamentos de Programacién.Libro.de Problemas Diseito det algoritmo entero funcién pol (B entero : x,y) inicio ei y = 0 entonces evolver (1) ino Gevolver (x * pot (x,y-1) fin ei fin_funeién 5.21, Escribir una functon recursiva que calcule el término n de ta serie de Fibonacci. Anélisis del problema La serie de Fibonacci es la siguiente, 1123.5 813 21 34. es decir, eada mimeto es la suma de los dos anteriores, con excepcién de los dos primeros, que siempre son 1, Por lo tanto también podemos hacer una definicién recursiva para averiguar cl término n-de la serie, puesto que Pip, = Fib,, + Fib,, para cualquier n inayor que 2. Diseito del algoritmo entero funoién Fib(E entero : ni) inielo sin = 0 on = 1 entonces devolver (1) si_no devolver (Fip(n-1) + Fib(n-2) fine £in_funcién 5.22, Eseribir un procedimiento recursive qué eseriba un mimero en base 10 convertido'a otra base entre 2 y 9. Anilisis del problema Para convertir un niimero decimal a otra base se debe dividir el namero entre la base, y repetir el Subprogramas (subaigoritmos), procedimientos yfunciones 107 proceso, haciendo que el dividendo sea el cociemte de la siguiente divisign hasta que éste sea menor que la base. En ese momento, se recogen todos los restos y el iltimo cociente en orden inverso a como han salido. Este ejemplo es una muestra de cOmo puede ser itl la recursividad cuando se trata de un proceso que debe recoger los resultados en orden inverso a como han salido. Para simplificar el ejercicio se ba limitado Ia base a 9, de forma que se evite tener que convertir los testos en letras. Disefo del algoritmo procedimiento convierte(E entero : a,b] iniedo sin >= b entonces convierte(n div b, b} fine escribir (a mod b) fin_funcién 5.23. Diseiiar un algoritmo que resuelva el problema de las ocho reinas, Andtisis del problema Ei problema consiste en colocar las $ damas dentro del tablero de ajedrez sin qué se coman unas a otras, en general, se tratard de poner 1 damas en un tableto de nx 1 En vez de colocar las damas en un array* de 1 n elementos, se utiliza un vector de 1 elementos. Cada elemento del vector representa la fila donde esté la reina. El contenido representa li-cohumna, Fi vector Dansa se inicializa a 0. Para buscar la siguiente solucién se comienza situando en Damas {11 un 1 (la primera dama esté en la primera fila, columna 1). La siguiente dama estard en la fila 2 yempezamos a buscar en la posici6n 1. No ser4 una posicién valida si Damas (1] = Dames (2] (estén en la misma columna); Damas[1]+1 = Damas [2] +2 (estin en una diagonal) y Damas (1] - 1 = Damas (2] -2 (esté on la otra diagonal). Si esto ocurre, incrementamos la columna de la nueva dama y se volverd a comprobar. Disefio det algoritmo algoritmo Ejericio _24 const n= @ tipos array de entero(i,.n] ; ListaDamas ° El cancepto de array se verd en el capitulo siguiente. 108 Fundamentos de Programacién. Libro deProblemas ListaDamas : D entero : i légico + solucién Anieio J/ Inicialiaar el array desde i — 1 hasta n hacer ali] - 0 fin_desde Engayar (d,1,solucién) sino sclucién entonces erdbir (‘No hey solucién’) ai_no 4/ s@ deja al lector hacer la presentacién del resultado fin_si fin légico funcién Posiciénvélida(s ListaDanas ¢ ; E entero : i) var entero: j légico : valida inicio vélida — verdad desde j — 1 hasta i - i hacer “7 Mo se ataca en la columa valida ~ vdlida y (4[i] <> a(j]) // no se ataca en una diagonal valida ~ vdlida y [lil +i <> @tjl +3) // mo se ataca en la otra diagonal valida « vélida y [d[i] - i <> @tg] - 3) fin_desde devolver (vélida) fin_funcién procedimiento Ensayar( B/S Listatemas ; d ; B entero : i; légico + Solucién) inicto sii =n +i entonces solucién + verdad st_no solucién — faleo repetir ali) ~ ati) + 1 si PosiciénVélida(d,i) entonces Bnsayar (a, i+1, solucién} hasta_que solucién 9 (ali) =n) ei no solucién entonces ali) - 0 fin ot fin_ai fin_procediniento Estructuras de datos (arrays y registros) 6.1. Datos estructurados Una estructura de datos es una coleccién de datos que se caracterizan por su organizacién y las opera ciones que se definen en ella, Los datos de tipo estandar pueden ser organizados en diferentes estructu- ras de datos: estaticas y dindmicas, Las estructuras de datos estiticas son aquellas en las que el espacio ocupado en memoria se define ‘en tiempo de compilacién y no puede ser modificado durante la ejecucién del programa; por el contra- rio, en las estructuras de datos dindmicas el espacio ocupado en memoria puede ser modificado en tiempo de ejecucién, Estructuras de datos estiticas son los arrays y los registros y las estructuras diné~ Inicas son listas, arboles y grafos (estas estructuras no son soportadas en todos los lenguajes). La elecci6n de Ja estructura de datos idénea dependerd de la naturaleza del problema a resolver y, en menor medida, del lenguaje. Las estructuras de datos tienen en comin que un identificador, nombre, puede representar a miiltiples datos individvales. 6.2. Arrays* Un array es una coleccién de datos del mismo tipo, que se almacenan en posiciones consecutivas de memoria y reciben un nombre comin, Para referirse a un determinado elemento de un array se deberd * En Latinoamérica, el termino inglés array, se suele traducir cast slempre por ta palabra arceglo. 109 110 Fundamentos de Pragramacion. Libro de Problemas utilizar un indice, que especifique su posicién relativa en el array, Los arrays podrin ser * Unidimensionales. también Ilamados Vectores » Bidimensionales, denominados Tablas 0 Matrices + Multidimensionales, con tres 0 mas dimensiones [serene 11 [| semen tr] elemento? 1). elemento | elemento 31]... | elemento S| elemento m.n| elemento m.4 ‘Array unidimer Array bidimensional [oisrrane FIP __ ara TA Geren fran fetemento'31.1| [elemento nt [elemento 31.11 _[etemento Sn C1 Cd XASAAN [| Yj jelemento m, 1,1] lelemento m.n,4 Array tridimensional Puesto que fa memoria de la computadora es lineal, sea el array dei tipo que sea, debert estar Jinealizado para su disposicién en el almacenamiento. 6.2.1, Arrays unidimensionales Todo dato que se vaya a utilizar en un algoritino ha de haber sido previamente declarado, Los arrays no son una exeepcién y lo primero que se debe hacer es crear el tipo, para luego poder declarar datos de dicho tipo. Al ser un tipo estructurado, la declaracién se hari en funcién de otro tipo estindar 0 previamente definido, al que se denominaré tipo base, por ser todos los elementos constituyentes de la estructura del mismo tipo. tipo arrey[..| és : var ‘ El mtimero de elementos del vector vendra dado por la formula Estructuras de datos {arrays y registros) 111 - + 1 Todos los elementos del vector podrén seleccionarse arbitrariamente y, serdn igualmente accesi- bles. Se les referenciard empleando un indice que sefiale su posicién relativa dentro del vector, Si fueravect: al elemento enésimo del array se le referenciaria porvect: [n}, siendo mun valor situado entte ef limite inferior y el limite superior. Los elementos podrin ser proce- sados como cualquier otta variable que fuera de dicho tipo base. 6.2.2. Arrays bidimensionales También se les denomina matrices 0 fablas. Un attay bidimensional es un vector de vectores, Es por tanto un conjunto de elementos del mismo tipo en el que el orden de los componentes es significativo y en el que se necesitan especificar dos subindives para poder identificar a cada elemento del array. 12 ow MW VP 75 | 23 | we foe 2 [aa | 6a Su declaracién se haria de la siguiente forma: tipo array [JInf,.igup,linf..1sup] Ga tipo_base: nombre del_tipo var : que aplicado a 1a matriz dibujada més arriba seria: tipo array(1..F, 1..C) de real ; matriz éfF y © habran sido declaradas previamente como constantes var matriz: m La referencia a un determinado elemento de la matriz, tequiere el empleo de un primer subindice que indique 1a fila y ua segundo subindice que marque la columns, Los elementos, mfi,j}, podrén ser procesados como cualquier otra variable de tipo real. El mimero de elementos de la matriz. vendra dado por la founula Wol)a *-a4n 112 Fundamentos de Programacion. Libro de Problemas 6.2.3, Recorrido de todos los elementos del array El recorrido de los elementos de un array se xealizard utilizando estructuras repetitivas, con las que manejaremos los subindices del array. Si se trata de un vector, bastaré con una estructura repetitiva Para el recorrido de una matriz o tabla se necesitaran dos estructuras repetitivas anidadas, una que controle las filas y otra las columnas. Ademds, en las matrices se consideran dos posibilidades: Recorrido por filas Supuestas las siguientes declaraciones const F = © = tipo array(1..?, 1..¢] de real : matriz var matriz: m ¥¥ que todos los elementos de la matriz contienen informacién vilida, escribir et pseudocédigo para que se visualice primero el contenido de los elementos de la primera fila, a continuacién el contenido de los de la segunda, etc, desde i ~ 1 hasta F hacer desde j — 1 hasta C hacer escribir (m(i,j]) fin_desde fin desde Recorrido por columnas ‘Tal y como aparece a continuacién, se mostraré primero el contenido de los elementos de la primera colurmna, luego el de los elementos de la segunda columna, ete, desde j — 1 hasta © hacer desde i ~ i hasta F hacer escribir (mli,j]) fin deade fin_deade Para recorrer los elementos de una matriz de n dimensiones, utilizaremos n estructuras repetitivas anidadas. Estructuras de datos (arrays y registros) «= 113, 6.2.4, Arrays como pardmetros "Los arrays podran scr pasados como parémetros, tanto a procedimientos como a funciones. Para ello se debe declarar algiin parémetro formal del mismo tipo que el array que constituye el panimetro actual. Por ejemplo: goritme pasodearrays: array[1..F, 1..C] de real: arr entero funcién recibearray(@ arr: mi | /los parémetros actuales y los formales no necesitan /icoincidir en el nombre) fin tuncién 63. Registros Un registro es un dato estructurado, formado por elementos Iégicamente relacionados, que pueden ser del mismo 0 de distinto tipo, a los que se denomina campos. Los campos de un registro podrn ser de un tipo estindar o de otro tipo registro previamente definido, |__Ejemplo de un dato de este tipo podeia ser el que permitiera almacenar la situacién de un punto en el plano, compuesta por dos nimeros reales. De igual forma, si lo que se desea es describir a una persone, se podria utilizar un dato de tipo registro para almacenar, agrupada, la informacién més relevante, | Un tipo registro se declarard de Ia siguiente forma: tipo. registro: [,} {.,.] : [,] (...] fin Para declarar una variable de tipo registro: n4 Fundamentas de Programacién. Libro de Problemas: var : Para acceder a un determinado campo de un registro se utilizard, como suelen emplear la mayoria de los lenguajes el nombre de la variable de tipo registro unido por un punto al nombre del campo. . Si fos campos del registro fuerun a su vez otros registros habré que indicar cnombre_de_variable>.- Los datos de tipo registro se pueden pasar como parimetros tanto a procedimientos como a funcio- nes. 6.3.1. Arrays de ragistros y arrays paralalos ‘Los elementos de un array pueden ser de cualquier tipo, por tanto es posible la construccién de arrays de registros. tra forma de trabajar en arrays con informacién de distinto tipo y légicamente relacionada es el uso de arrays paralelos, que, al tener el mismo mimero de elementos, se podriin procesar simulti- neamente, Array de reglatros 1 Arrays paralelos Nombre ded Nomores Edades "Anat 28 att] "ana Nombresit] 28 Edadesit] ‘Carlos: 36 ale] “Carles’ | Nombresi2] 96 Edadest2) ‘Juan ‘34 aol “wut Nombresinl 3 Etdadostn Para acceder al campo nombre del 2° elemento del array A se escribiria a[2].nombre. Por ejemplo, escribir (a[2] .nonbre) presentaria en consola ta cadena Cav los. 6.4. Ejercicios resueltos 6.1. Determinar los valores de los vectores N y M después de la ejecucién de las insirucciones siguientes: var array [1..3] de entero : ¥, 5 deMiy ek 2. M[2) - 2 Estructuras de datos (arrays y registros) «= 115. 2. MLB] © 3 4, NL] © MIL] + Mla) 5. N[2] © Mit) - MIS] 6. .NI3] = MI2] + 13] 7. N[L] ® MIB] - ¥{1I 8. Mi2] © 2 * NI1] + NZ) 3. Mu] ~ way = wea] area | meray | was] | Ney | NT2T ooON OM dB oOW a 6.2, Leer un vector V desde un terminal de entrada. Andlisis del problema DATOSDEENTRADA: __y (¢l array que vamos a rellenar) DATOS AUXILIARES; _n (nuimero de elementos del array), 4 (contador que controla el niimero de Jecturas y que proporciona ademids él indice de los.elementos del array) La lectura de un array es una operacién repetitiva, por lo que se debe utilizar alguna estructura iterativa, Sies posible, lo mejor es una estructura para, ya que se conoce de antemano el niimero de iteraciones ‘que se han de realizar, Disefio det algoritmo algoritmo ejercicic_6_2 const /fel mimero méximo de elementos de un array lo tomamos como 116 Fundamentos de Programacién. Libro de Problemas {/ una constante maxArray =... var array [1..MixArray] de entero : v entero : i, n inicio leex(n) desde i ~ 1 haat leer (vil) fin_desde fin n hacer 63. Escribir un algoritmo que permita calcular el cuadrado de los 100 primeros mimeros enteros y @ continuacién escribir una tabla que contenga dichos cuadrados. Andlisis del problema DATOS DE SALIDA: —_cuadr (el vector qué guarda los cuadrados de los 100 primeros enteros) DATOS AUXILIARES: _ (variable del bucle) Si desea hacer la operacién en dos fases, una de calculo y otra de escritura, se ha de utilizar un array. Primero se hace un bucle en el que se vayan sacando los nimeros del 1 al 100, se calcula su cuadrado y se asigna el resultado a un elemento del array. Un segundo bucle, que se repetira también 100 veces nos servira para escribir todos los elementos del array, Diseo del algoritmo algoritmo ejercicio 6.3 var array [1..100] de entero : cuadr entero: i inicio f/rellenar el. array con los cuadrados desde i ~ i hasta 100 hacer cuadr[i] ~ i * i fin_desde /jescritura del array desde i — \ hasta 100 hacer escribir (cuadr|i]) fin deade fin 6.4, Se tienen N temperaturas almacenadas en un array. Se desea calcular su media y obtener el iieero de temperaturas mayores o iguales que fa media. Estructuras do datos (arrays y registros) «= 117 Andélisis del problema DATOSDESALIDA: media (la media de tas N temperaturas), mayores (contador que guar- daré. ol niimero de temperaturas mayores que la media) DATOS DE ENTRADA: Ni (niimero de temperaturas), temp (array de n elementos donde se guar- dan las temperaturas) DATOS AUXILIARES: i (variable de tos bucles que indica también el indice de los elementos del array). EJ algoritmo debe tener dos bucles. En el primero se leen por teclado todos los elementos del array. ‘Mediante una funcién, se halla la media del array. Una yez leidos los elementos y hallada la media, se recorre otra vez ¢] array para determinar cudntos elementos son superiores a la media, Cada vez que se encuentra un dato que cumpla esa condicion se incrementa el contador mayores en una unidad. Diseito del algoritmo algoritmo ejercicio 64 const, MAxArray = tipos arxay(1..MéxArray] de real : vector var Vector + temp veal : mediatemp entero : tayores, n, i inicio leer (n} desde i + 1 basta n hacer leer {temp li) fin_desde mediaterp + media(tenp,n) rayores « ¢ desde i + 1 hasta n hacer ai temp[i] >= mediatemp entonces mayores « mayores + 1 fin_ei fin_desde escribir (mediacemp, mayores) fin entero funcién media(E Vector: v; E entero n } var real : m entero : i inicto neo 118 —_Fundamentos de Programacion. Libro de Problemas desde i + 1 hasta n hacer me m+ temp[4] fin desde devolver (n/n) fin_funcién 6.5. Caleular la suma de todos los elementos de un vector de dimensién 100, asi como su media aritmética. Andlisis del problema DATOS DE SALIDA: uma (suma de los elementos del vector), media (media de los elemen- tos) ‘ DATOS DE ENTRADA: vector (el array que contiene los elementos a sumar) DATOS AUXILIARES: i (variable del bucle) Mediante un bucle desde s¢ leen y suman los clementos del vector. Una vez hecho esto se calcula la media (suma / 100) y se esctiben la media y la suma. Diseto det algoritmo algoritme ejercicio 65 array[1..100] de entero : vector veal : nedia entero : suma, i inicio media — 0 sume = 0 desde i + 1 hasta 100 hacer leer (vector[i]} suma © suma + vector [il fin_ desde media — suma / 100 eseribir(media, suma) fin 6.6. Calcular el mimero de elementos negatives, cero y positivos de un vector dado de 60 elementos. Anilisis det problema DATOS DE SALIDA: _ pos (contador de elementos positivos), cero (contador de cetos), neq Estructuras de datoe (arrays y registros) 119 (contador de elementos negativos) DATOS DE ENTRADA: Lista (vector a analizar) DATOS AUXILIARES: i (variable del bucle) Suponiendo que se tiene leido el array desde algin dispositivo de entrada, se ha de recorrer el array con 1m bucle deade y dentro de él comprobar si cada elemento Lista [1] es igual, mayor o menor que 0, con lo que se incrementard el contador correspondiente, Diseho del algoritmo Algoritmo ejercicio¢_6 var array [1..60] de entero : lista entero : pos, neg, cero, i inicio pos + 0 neg + 0 cero < 6 {/lectura del arzay desde i + 2 hasta 60 hacer ai listali] > 0 entonces pos © pos +1 si_no ai lista[i] < 0 entonces neg + neg + 1 et_no cero + cero + 1 fined fin at fin_deade escribir (pos,neg, cexo} fin 67. Rellenar una matriz identidad de 4 por 4 elementos, Andlisis del problema DATOS DE SALIDA: mat riz (matriz identidad de 4 filas y cuatro columnas) DATOS AUXILIARES: i ({ndice de las filas), j (indice de las columnas) Una matriz identidad es aquella en la que Ja diagonal principal esté lena de unos y el resto de los clementos son 0. Como siempre que se quiere trabajar con matrices de dos dimensiones, se han de utilizar dos bucles anidados, que en este caso serin de 1 hasta 4, Para rellenar la matriz identidad, se ha 120 —_Fundamentos de Progremacién. Libro de Problemas de comprobar que los indices de los bucles -iy j. Si son igualesmatriz [i,j] send igual a 1,en caso contrario se asigna 0 al elemento i,5. Disefio del algoritmo algoritmo ejercicic_6_7 var array (1..4,1..4] de enteros : matriz entero : i, 3 indoto desde i - 1 hasta 4 hacer desde j © 1 hasta 4 hacer si i = j entonces mateizli,j) = 1 si_no matrizli,j] + 0 fin si fin_deade fin_desde fin 68 Disefiar un algoritmo que calcule el mayor valor de una lisia L de N elementos. Andlisis del problema DATOS DE SALIDA: —_N (atimero de elementos de Ia lista), mé2x (¢1 elemento mayor de la lista) DATOS DE ENTRADA: _ L (lista a analizat) DATOS AUXILIARES: i (indice de Iu lista) En primer lugar se ha de leer la dimensi6n de Ja lista (10) y rellenarla (en el ejercicio se rellena simple- mente con la instrucciém LeerLista(l, N)). Para hallar el clemento mayor de un array, se debe inicializar la variable mx con el primer elemento de la lista (1, (1]) y hacer un bucle desde 2 hasta 37 en el que se comparard cada elemento L.[ i} conméx. Sit[i] esmayor que m4x, L[i] seré el nuevo maximo, Disefio del algoritmo algoritme ejercici const //Be considera que el array tiene un méximo de 100 elementos MéxArray = 100 tipo array [1..MAxArray] de enteros : lista Estrucwiras de datos (arrays y ragistroe) §— 121 var lista entero Anteio leer (Ni LeerLista(L, N) mix © LEL) desde i « 2 hasta N hacer ed Li] > m&x entonces mix = L(i] fini fin desde eseribir (mAx) fin L max, Ni 69. Dada una lista L de N elementos diselar un algoritmo que caleule de forma independiente Ja suma de los nimeros pares y la suma de las nimeros impares. Anilisis del problema DATOSDESALIDA: spar (suma de nfimeros pares), simpar (sua de los nimeros impares) DATOS DE ENTRADA: _ 1 (lista a analizar) DATOS AUXILIARES: i (variable del bucle) ‘Una vez leido el array se han de analizar cada uno de sus elementos comprobando si L[i] es par o impar mediante el operador resto (es par si L[i] mod 2 = 0). Si esta condicién se cumple se acumula el valor de L [i] en spar, en caso contrario se acumularé en simpaz. -Disetio del algoritmo -algoritmo ejercicio 69 const MéxArray =... var array [1..MéxArray] de entero : L entero: N,i,spar,simpar Antedo /f lectura de N elementos del array L ) ; | | mer eo } simpar © 0 122 Fundamentosds Programacién. Libro de Problemas desde i ~ 1 hasta n hacer ei L{i] mod 2 = 0 entonces spar — spar + 1fil ai_no ‘simpar ~ simpar + 1(1] fin si fin desde eseribir (spar, simpar} fin 6.10, Escribir el pseudocddigo que permita escribir el contenida de una tabla de dos dimensiones (5 x4). Anilisis del problema DATOS DE SALIDA: —tabLa (ld tabla a escribir) DATOS AUXILIARE! 4,3 (indices de las fila y columna de cada elemento del array) Si se supone la tabla ya creada, para eseribirla se han de recorrer todos sus elementos: Para recorrer un array de dos dimensiones, hay que implementar 2 buctes anidados, uno para recorrer la filas y otro para tecorrer Jas cohunnas. Dentro del bucle intemo, lo tinico que hay que hacer es eseribir el elemento ij del array. - Disetio del algoritmo algoritme ejercicio_6_10 var array [1..5,1..4] a entero : tabla entero : i, 3 escribir (tablali,j}) fin_desde fin desde fin 6.11. Se desea diseflar un algoritmo que permita obtener el mayor valor abmacenado en una tabla VENTAS de dos dimensiones (4 filas y 5 columnas). Estructuras de datos (arrays y registros) 123 Andlisis del problema DATOS DE SALIDA: max (el elemento mayor de la tabla) DATOS DE ENTRADA: VENTS (la tabla a analizar) DATOS AUXILIARES: i, (indices de la fila y columna de cada elemento), fméx, cmax (ila y columna del elemento mayor de fa lista) En este ejercicio se empleard otro método para hallar el méximo. En vez de hacer la bisqueda tomando como referencia el contenido del elemento mayar, se usa como referencia la posicién (fila y columta) que ocupa dicho elemento, Después de leer la tabla, se inicializan los valores de Eméai y cma: (fila y columna que ocupa et elemento mayor) a I. Se debe recorrer el array con dos bucles anidados. En el bucle intéro se compara VENTAS (1, 3], con VENTAS [ Emdxt, cméxx]. Si es mayor, findx y cmax pasarén a tener el valor que en esos momentos contengan iy 3. Al final del bucle en fmdx y max estard guardada Ia posicién del elemento mayor por lo que asignamos a la variable max el contenido de VENTAS {mdx, cméx) y 1o escribimos Diseiio del algoritmo algoritmo ejercicio_6_it var array [1..4,1..5] de entero : VENTAS entero : i,j, fmdx, cm&x,méx infedo ‘/lectura del array VENTAS end — 1 comix «1 desde i — 1 hasta 4 hacer desde j <1 hasta 5 hacer ed VENTAS[i,j] > VENTAS|fméx,cmax] entoncea fm =0 y miimero < $0, panerlo en LISTAL si mimero >=50 y ntimero <100, ponerlo en LISTA2 si mtimero >=100 y mimero <=150, ponerlo en LISTA3 124 Fundamentos de Programacién. Libro de Problemas Anélisis del problema DATOS DE SALIDA: LISTAL, LISTA2, LISTA3 DATOS DE ENTRADA: _LIS'TA (lista que contiene los mimeros iniciales) DATOS AUXILIARES: __ i (indice de las lista original), contal, conta2, conta3 (indices de cada una de las listas de salida) Se han de utilizar cuatro arrays que tendrén todos Ia dimensién del array original LISTA (10 elemen- tos). Una vez leido el array LISTA, se debe recorrer para comprobar cada uno de sus elementos © introducirlo en la lista correspondiente incrementando también su indice. ‘Una vez llenas las tres listas de salida, se escriben mediante tes bucles que irdn cada uno desde 1 hasta el diltimo valor del indice correspondiente. Como fa operaci6n de escrinura va a ser igual para las tres listas se implementard un procedimiento que se encargue de la operacién de lectura. En dicho ‘procedimiento se pasa fa lista y el nimero de elementos de la misma (conta, conta2, conta3). Al utilizar un procedimiento con un tipo de datos estructurado, es necesario crear un tipo de datos definido por el usuario (vector). Disetto del algoritmo Algoritmo ejercicio 612 tipo array [1..10] de entero ; vector var vector : LISTA,LISTA1,LISTA2/LISTA3 eatero ; i,contal,conta?,conta3 inicio contal + @ conta2 + 0 contad « 0 //leemos el array LISTA desde i s- 1 hasta 10 hacer si LISTAi] > 0 entonces si LISTALi} < 50 entonces contal © contal + 1 LISTAL [contal] + LISTA(i] e4_no ei LISTA[i] < 100 entonc sontaz — contaz + 2 LISTAZ[conta2] ~ LISTAL] ai_no ei LISTA{i] <= 150 entences contas ““conted + 1 DISTA3 [conta3] © LISTALS) fined fined fined Estructuras de datos (errays y registros} «= 125, fin_oi fin_deade Escribirvector(LISTA1,contal) EacribirVector (LISTA2, conta2) EscribirVector (LISTA3,conta3) fin procedimiento Escribirvector(B vector: v ;E entero : n} var entero: i intoto desde i + 2 hasta n hacer escribir (v{i]] fin_desde fin_procedimiento 6.23, Rellenar un vector a de N elementos con enteros consecutives de forma que para cada elemento Aoi Andlisis det problema DATOS DE ENTRAD, A (el array a rellenar), N (mimero de elementos del array) DATOS AUXILIARES: i (indice del array) Se debe ejecutar un bucle deade N veces. Dentro del bucle hay que hacer la asignacién ATi] + i. Disefio del algoritmo algoritmo Ejercicic 613 const Naarray var entero: i array (1..MéxArray] de entero: A inicio desde i < 1 hasta véxarray hacer AU] © a fin_desde fin 6.14, Escribir un programa para introducir una serie de nimeros desde el teclado, Utilizar un valor centinela -1ES para terminar la serie. El programa caleularié e imprimird et mimero de valores Jeidos, la suma y Ia media de la tabla. Ademds, generaré una tabla de dos dimensiones en el 126 Fundamentos de Programacién. Librode Problemas que la primera columna seré el propio nimero y la segunda indlcard cudnto se desvia de la media, Anidlisis del problema DATOS DESALIDA: conta (mimero de valotes leidos), suma (suma de todos los valores), media (media de dichos valores),desviacién (tabla con las desviaciones de cada elemento can respecto a la media). DATOS DE ENTRADA: vector (el vector que leemos), nim (cada uno de los nimeros que lee- mos) DATOS AUXILIARES: i (Indice del vector) Se debe dimensionar el array aun nimero fo suficientemente grande como para que quepan los valores a procesar. Como ese mimero no esti determinado, se dimensiona al nimero maximo de valores previs- to (representado por MxLista). El bucle wtilizado para procesar el vector no puede ser un bucle desde, sino que se debe utilizar uno repet ir oun mientras. Dentro de este bucle de lectura, se lee el elemento, se acumula su valor en suma y se incrementa el indice i. La variable leida sera mim, y una vez verificado que es distinta de -1ES, se asigna el valor vector fi}. El nimero de valores procesados (conta) serd igual al iltimo valor de i. Se halla la media (suma / conta)y-se escribe conta, media y suma, Para hallar Ia desviacign de cada uno de los elementos se hari otro bucle (ahora sirve un bucle desde) en el que el indice vaya tomando valores entre | y conta. Dentro del bucle se caleuta la desviacién de elemento y eseribimos ambos. Diseio del algoritmo algoritmo ejercicio 614 const MéxArray =... var array(1..Méxarray] de real : vector erray(1..MéxArray,1..2] de real : desviacién entero = i,j,conta real : niim,suma,media,desviacién Anicio ico suma + 0 eer (nim) mientras nim <> -185 hacer ieaed vector [i] © ntim suma t suma + vector [i] Leer (miim} Estructuras de datos (arrays y registros) «127 fin mientras conta + i media « suma /conta escribir (conta, suna,media} desde i < 1 hasta conta hacer desviaciénli, 1] © vectorlii desviaciéali, 2) + vector[i] - media fin_desde fin 6.15, Dado un vector X compuesio por N elementos, se desea disetar un algoritmo que cateule la desviactén estindar D. Andlisis del problema DATOS DE SALIDA: DesviacidnBst (funcién que calcula la desviacién estandar) DATOS DE ENTRADA: _ x (el vector), N (auimero de elementos) DATOS AUXTLIARES: i (indice del array), med:ia (media de los elementos) Se desarrolla una fumcién que permita calcular Ja desviacién estindar de N elementos.de una lista de niimeros reales. La funcién va a recibir como parimetros de entrada el vector X ~al que damos un tipo de datos vector que debe estar definido previamente—y e! mimero de elementos. Una fimcién se encar gard de hallar la media. Dentro de esta funcién, es necesario saber la suma de los elementos, para lo que utilizaremos otra funcién SumaReal. Una vez calculada la media, mediante un bucle se halla la suma de los cuadrados de cada elemento menos 1a media, necesaria para poder hallar la desviacién. Por ‘iltimo se calcula la desviacién estandar por la formula dada anteriormente, Se Diseiio det algoritmo eal funcién Desviacidnist(R vector : x ; E entero: ni var veal + media, suma entero : i inicio media + MediaReal (X.a) suma — 0 128 Fundamentos de Programacidn. Libro de Problems: desde i « 1 haata n hacer uma + suma + cuadrado(x{i] - media) fin_deade devolver (ratz2(suma) / (n-1h} f4n_funcién real funcién MediaReal| # vector : v; entero : nj Anielo Gevolver (Sumazeal{ vin) / n) f4n_funcién veal funcién SunaReal( = vector : v ; B entero : n) var veal : suma entero; i inicio sum + 0 desde i + 1 hasta n hacer suma © suma + v(i] fin_desde SomaReal © suma fin_funcién 6.16, Leer una matriz de 3 x 3. Andlisis del problema DATOSDEENTRADA: — mat riz (la tabla o matriz de 3 x 3) DATOS AUXILIARES: i, 7 (indices de las fila y columna de cada elemento del array) Para leer una matriz es necesario utilizar dos bucles anidados, Dentro dél bucle interior se incluye una ‘operacién de lectura con cada elemento de la matriz. Diseio del algoritmo algoritme ejercicio_6_16 var array [1..3,1..3] enteres : matriz entero : i, jj inicio desde i « 1 basta 3 hacer desde 5 — 1 hasta 3 ha eer (matriz[i,j]> fin desde fin_desde Estructuras de datos (arrays y ragistros} 129 fin 6.17. Esertbir el algoritmo que permita sumar el nimero de elementos positives y el de negativos de wma tabla T de n filas y m columnas. Andlisis del problema DATOSDESALIDA: Pos (suma de los elementos positivos), neg (suma de los elementos ne- gativos) DATOS DE ENTRADA: _T (tabla a procesar), n (niimero de filas), m (niimero de columnas) DATOS AUXILIARES: i,j ({ndices de los elementos de la tabla) Después de leer Ia tabla, se recorre mediante dos bucles anidados, En el buele intemo se ha de compro- bar si'P 4, 3) es positivo o negativo, Si es mayor que 0 se acumula el valor de TE, j] en pos, Sies ‘menor gue 0, se hace la misma operacién en neg. En otto caso, (1, 3) seria igual a 0; por lo que no se ha de hacer nada, Disefio del algoritmo algoritmo ejercicio_6_17 const, MaxPila MAxCol var array [1,.M4xFila,1..M4xCol] de entero: entero : T intedo leer (n,m) /f lectura de la tabla pos + 0 neg © 0 @esde i < 1 hasta n hacer desde j + 1 hasta m hacer ei THi,j] > 0 entonces pos + pos + Tli,j) sino ai TLi,j] < 0 entonces neg + neg + TI, i) fin ai fin_ai fin desde fin_deade escribir (pos, neg) fin 130 Fundamentos de Programacién. Libro de Problomas: 6.18 Supongamos que existen N ciudades en la red ferroviaria de un pais, y que sus nombres estén ‘almacenados en un vector lamado CIUDAD. Disefiar un algoriimo en el que se lea el nombre de cada una de las ciudades y los nombres con los que esté enlazada. Anilisis det problema DATOS DE SALIDA: Listado de ciudades DATOS DE ENTRADA: CIUDAD (vector donde se guardan los nombres de las ciudades), ENLACE (array donde representamis los enlaces de unas ciudades con ottas), N (mimero de ciudades) DATOS AUXILIARES: _ i,j (indices de los arrays) En primer lugar, hay que ver las cindades que estén enlazadas entre si; para ello se utiliza una tabla de Nx N elementos que representan las ciudades. Por ejemplo, la indicacién de que la ciudad 3 esta enlazada con la 5 (CTUDAD[3,5]) se realiza mediante una marca, por ejemplo un 1. Si no estan enlazadas en dicho elemento se pone un 0. La tabla de ciudades, serd un array triangular: sélo se ha de lenar medio array, ya que si la ciudad 1 esta enlazada con la ciudad 2, la ciudad 2 lo estard con la 1. Por do tanto el bucle interno ind desde (+7 hasta » Para sacar los nontbres de las ciudades se necesita disponer de otro array en el que el elemento 1 ccontenga el nombre de Ia ciudad 1, el 2 el de la 2 y ast hasta el mimero de ciudades, es decir, hasta N. Después de lenar el array de enlaces y el de ciudades (para hacer el listado que pide el problema) es necesario recorrer toda Ia tabla de enlaces mediante 2 bucles anidados. En el bucle externo se debe escribir el nombre de Ia ciudad a la que se sacan los enlaces; es decir si se esta en la ciudad i, se debe escribir CTUDAD |i}. En el bucle interno se debe comprobar el contenido de ENLACE [4, 3]. Si éste 8 distinto de 0, se eseribe la ciudad con la que estd enlazada {CIUDAD (5). Diseiio del algoritmo algoritmo ejercicia 618 const nee var array(i..n] de cadena : cisdad array(1..n,1..n] de entero : 1 entero : i, j inicio // lectura del array de civdades y de enlaces desde i ~ 1 hasta n hacer Leer (ciudadli]) desde j ~ irl hasta n hacer Leer (enlacefi, j]) fin_desde fin_desde (1 listade de las ciudades con cus enlaces Estructuras de datos (arrays y registios) 137 desde i < 1 hasta n hacer eribir (ciudad [1)} desde j - 1 hasta n hacer ef enlace[i,j] = 1 entonces escribir (ciudad[5]) fin_ei fin_deede fin desde fin_desde 619. Determinar si una mattiz de tres filas y tres columnas es un cuadrado magico. Se considera wn cuadrado magico aquel en ef cual las flas, columnas, y las diagonales principal y secundaria suman lo mismo, Andlisis del problema DATOS DE SALIDA: Mensaje queindica si es un cuadrado migico DATOS DE ENTRADA: — cuad (la matriz que vamos a comprobar) DATOS AUXILIARES: 4,3 (indices de los arrays), magico (variable Logica que valdr verdadero si la matriz es un cuadrado migico),sura (sumador que acumula Ta suma de los elementos de la primera fila), diagonal y diagonal? (suma de Jos valores de la diagonal principal y secundaria respectivamente) Después de sumar Ja primera fila mediante una funcién SumaFila, se utiliz un bucle desde, que comprueba las siguientes filas Ilamando a su vez a la funcién SumaP ila, Para no tener que recorrer todo el array, ¢] bucle extemo serd un bucle que se repita mientras que el indice sea menor o igual que 30 la variable még: co sea cierta (previamente se inicializa la variable m&gico a faleo). Dentro de ese bucle se ha de pasar a la funcién la fila que se desea sumar (i), y se comprueba si el valor que retoma Ta funcién es igual al valor de Ja suma de la primera fila (sum2), De forma similar se procede con la suma de las columnas en la que utilizaremos la funcién SumaCol. Para las diagonales se utiliza un bucle desde en el que se acurmulan todos los valores de cued {i, i en la variable diagonal y los valores de cusd[i,4-i] en diagonal2. Si después de esto el valor de todas Jas sumas de filas, columnas y diagnonales son iguales, m&gico sera verdadero, y apatecerti el mensaje diciendo que la matriz es un cuadrado magico, Disefio del algoritmo algoritmo ejercivio_6_19 tipos erray(1..3,1..3] de entero : tabla tabla : cuad entero : suma,diagonall,diagonal2,i 182 Fundementas de Programaci6n. Libro de Problemas logico : magico inicio négico ~ V J? Lectura de la matriz leer (cued) //hallamos la sume de la primera fila suna ~ SumaPila(cued,3,11 /fnallames la suma de las restantes filas ind mientras i <3 y mégico hacer teded mégico — suma = SumaFila(cuad,3, i} fin mientras Jinallanés Ya sume de ae columnas too mientras i < 3 y mégico hacer ieied magico ~ suma = SumaCol{cuad,3,i) fin_mlentra (fnallamos la suma de lag diagonaies i mégico entonces //si Ja variable mégico es clerta aiagonall — 0 Giagonal2 ~ 0 desde i ~ 1 basta -3 haver diagonall + diagonall + cuad[i,il @iagonal2° = diagonal? + cuad{i,4-il fin desde fined ces ndgico + mégico y (diagonall = suna} y (diagonal? =, sum gi m4gico entonces . ° esordbir(/La matriz és un ‘cuadrada ‘mégico’) finet ’ fin ’ entero funcién SumaPila( Btabla :t i; E entero :.n,i) var . entero ; j, sum inicio suta ~ 0 desde i — 1 basta 7 hacer suma ~ sua + [i,i] fin desde devolver (suma) ns f4n_funcién entero funcién SumaCol{ B tabla : t ; EB entero n, 3} var entero ; i, suna inicio suma ~ 0 Estructuras de datos (arrays y registros) 133 desde i — i hasta n hacer suma = suma + t [i,j] fin desde devolver (sume) fin_funcién 6.20, Visualizar la matriz traspuesta de una matriz M de 6 x 7 elementos. Aniiisis det problema DATOS DE SALIDA: —_—_MT (matriz traspnesta de M) DATOS DE ENTRADA: _¥ (matriz original) DATOS AUXILIARES: _ i,5 (indice de las matrices) Una matriz traspuesta (27) a otra es aquella que tiene intercambiadas las filas y las columnas. Si una matriz M tiene 6 filas y.7 columnas, MT tendré 7 filas y 6 columnas. Mientras se lee la matriz M, se puede obtener MT, ya que a cualquier clemento M[ i, j1], le comesponderd ¥T [4 , : Jen Ia matriz MT. ‘Una vez leida, se escibe mediante otros dos bucles desde anidados. Diseito del algoritmo algoritmo ejercicio_s_20 var array(1..6,1..7] de entero : M array[1..7,1..6] de entero : MT entero: i,j inicio desde i — 1 hasta ¢ hacer desde j ~ 1 hasta 7 hacer eer (M[i,4}) MP(G,4) — MIS,3) fin desde £4n_desde desde i — 1 hasta 7 hacer desde j ~ 1 basta 6 hacer escribir (“r{i,j)) fin desde fin_Geade fin 621, Diseltar una funcién con la que dadas dos matrices pasadas como parimetros, compruebar si son idénticas, 134 Fundamontosde Programacién. Libra deProblemas Andiisis del algoritmo DATOS DE SALIDA: DATOS DE ENTRADA: DATOS AUXILIARES: Mensaje ‘A,B (las dos matrices) MV (dimensiones de 1a matriz 2), 0, (dimensiones de la matriz 8) 4,4 (indices de las matrices), idénticas (variable ligica que valdré verdadero si las dos matrices son iguales) Para comprobar si dos matrices A y B son idénticas, lo primero que se ha de hacer es comprobar si sus dimensiones son iguales. Si esto es cierto se pasa a recorrer ambas matrices mediante dos bucles anida- dos, Como es posible que no sean idénticas, a veces no seré necesario recorrer toda la matriz, sino sélo hasta que se encuentre un elemento diferente. Por esta razén no se utilizan bucles deade sino bucles mientras que se ejecutarén mientras i o j sean menores que los Ifmites y sean idénticas las matrices (idéntica sea verdadero), Dentro del bucle interno se compruebasi (i, 3] esdistintoaBLi, 3], ‘en cuyo caso se pone la variable iGént ica. a falso (antes de comenzar los bucles se ha puesto a cierto Ja variable), Si después de recorrer las tablas, icéntica es verdadero, la funcién devolveré un valor liégico verdadero. Diseho del algoritmo ‘/ suponemos creado el tipo vector entero funcién Metrizidéntica(® vector :A,B ; B entero :M,N,0,P } var entero : i,j légico +: idéntica inicio idéntica + M=OyN-=P si idéntica entonces te 0 mientras i < My idéntica hacer jo Leiaed mientras j < N y idéitica hacer jedel idéntica = Ali,3] = BL.d] fin_mientras fin_mientras fin of devolver jidéntical fin_funcién 6.22, Un procedimiento que obtenga la matric suma de dos matrices, Estructuras de datos (arrays y registros) © 135 Andlisis del problema DATOS DE SALIDA: S (matriz suma) DATOS DE ENTRADA: A, 5 (matrices a sumar), 1, (dimensiones de la matriz A), 0, P (dimen- siones de la matriz 3) DATOS AUXILIARES: i,j ({ndices de las matrices) Para realizar la suma de dos matrices, es necesario que ambas tengan las mismas dimensiones, por lo, gue lo primero que se ha de hacer con ios parimetros ¥, 1, Oy P es comprobiat que Mes igual a0 y Nes igual a P, Se leen las matrices A y 3 desde algin dispositivo de entrada y se realiza la suma, Si esto no courte, el parémetro de salida error devolverd un valor verdadero, En Ia suma de matrices, cada elemento S{i,j] es igual a ATi, j]+BIi, jly se debe, por lo lunto, recorrer las matrices A y B con dos bucles anidados para hallar la matriz suma, Diseno del algoritmo procedimiento watrizSuma( B tabla : A,B; B entero + M,N,O,P ; S tabla : Suma ; 8 légico : erroz) var entero : i, j inloto ei «<> 0 0 N <> P entonces error = V si_no error © F desde i ~ 1 hasta m hacer desde j < 1 hasta 0 hacer Sumali,j] = ali,d] + Bld) fin_desde fin_deade fin_et fin_procedimiento 623, Exeribir el algoritmo de um subprograma que obtenga la matriz producto de dos matrices pasa~ das como parémetros. Andlisis del problema DATOS DE SALIDA: Prod (matriz producto), error (da verdadero si hay un error en las di- mensiones) DATOS DE ENTRADA: A, B (matrices a multiplicar), M, 3 (dimensiones de la matriz A), 0, P (dimensiones de la matriz B) 136 Fundamentos de Programacién. Libro de Problemas: DATOS AUXILIARES: i, 5, k (Indices de las matrices) Se recorren la matrices con dos bucles desde anidados siempre que X sea igual a 0. La matriz produc+ to tendré una dimensién de Mx P. Cada elemento de la matriz producto Prod (i, 5] send: A{i,L]*BIL, j)+A(i,2)*Bl2,j]+...+A[L.N]*BIN, 5] por lo que dentro del bucle intemo se necesita otro bucle desde para que vaya sacando mimeros comrelativos entre 1 y ¥. El subprograma que sc ha de utilizar sera un procedimiento, ya que aunque devueive un dato (la matriz producto), éste es estructurado, por lo que no puede relacionarse con el valor que devuelve una fincién. A dicho procedimiento se pasan como pardmetros de entrada las dos matrices y sus dimensio- nes; como patémetro de salida la matriz producto Prod y error, que seri un valor légico verdadero si las matrices no se pueden multiplicar. Diseito del algoritmo procedimiento Matriz?roducto(Z tabla : A,B; EB entero : M,N,O,P ; 8 tabla : Prod ; 8 légico error) var entero = i,jk inicio ai N <> © entonces error © V at_no error + F desde i + 1 hasta M hacer desde j + 1 hasta > hacer Prod(i,j] © © desde k — i hasta N hacer Prodli,j] + Prod[i,j)+Ali,k]*B[k, j] fin desde fin_desde fin_deade fin_ai £in_procedimiento 6.24. Se tiene una matriz bidimensional de m x n elementos que se lee desde el dispositive de entra- da, Se desea calcular la suma de sus elementos mediante una funcién, Andlisis del problema DATOS DE SALIDA: —_cuma (suma de los elementos de la matriz)

También podría gustarte