Título: Ejercicios de pseudocódigo Publicado por: Saberuneko en 17 Octubre 2010, 15:00 pm Bueno, pues me he animado a postear unos ejercicios sencillos de pseudocódigo. Si veis algún error en la resolución de los mismos, decídmelo, que así aprendo más. ^w^
Espero que os gusten y os sean útiles para practicar. ^w^ Algoritmo 1: Programa que visualice los n primeros números de la sucesión de Fibonacci. Datos: a,n,cont,suma ; nºentero Algoritmo: Código: INICIO Algoritmo 2: Algoritmo que visualice los 25 primeros números perfectos. Datos: n, cont, res, final Algoritmo: Código: INICIO Algoritmo 3: Introducir por teclado una secuencia de datos, cada una de ellas compuestas por un nombre y las calificaciones obtenidas por ese alumno en 6 asignaturas, la secuencia termina al introducir fin como nombre de alumno, el algoritmo deberá visualizar el nombre del alumno, seguido de su nota media, al introducir fin, se mostrará la nota media del grupo. (No se permite usar tablas en este ejercicio, pero simplificaría mucho el code) Datos: alumno ; alfanumerico nota, media, grupo: nº real cont, alumnos, nalumnos : nº entero Algoritmo: Código: INICIO Algoritmo 4: Visualizar los n primeros números primos (n se introduce por teclado, usar una variable booleana para comprobar si el numero es primo) Datos: cond, cont, n, a, primos Algoritmo: Código: INICIO Algoritmo 5: En una hurna hay 80 bolas numeradas del 1 al 80 se extrae una bola y el numero se introduce por teclado devolviendo de nuevo la bola a la hurna el proceso se repite hasta que aparezca 3 veces el numero 33. Hacer un programa que utilice cuantas veces ha salido cada una. (usar tablas) DATOS: numeros (80) bola, cont; nºentero. Algoritmo: Código: INICIO Algoritmo 6: Un almacén dispone de 8 departamentos numerados del 1 al 8 destinados a contener una serie de piezas. Las piezas están numeradas del 0 al 8 éstas llegan de una en una depositándose en el departamento del mismo número. Hacer un algoritmo que determine cuantas piezas hay en cada departamento después del suministro, el suministro termina al llegar la pieza numero 0, puede ocurrir que llegue una pieza no comprendida en el rango establecido con lo cual se debera visualizar el mensaje pieza número..... es incorrecta. Inicialmente no hay piezas en los departamentos. DATOS: deps (8*9) pieza, dep; nºentero Código: INICIO Algoritmo 7: Una distribuidora de piezas de motor dispone de 3 almacenes para almacenar 4 piezas distintas, el número de piezas por almacén se representan mediante una matriz de 4x3 denominada inventario, también dispone de un vector con los costes de cada pieza, diseñar un algoritmo que permita calcular: a) El valor que tiene cada almacén, teniendo en cuenta cada pieza b) El valor del que dispone cada almacén, teniendo en cuenta todas las piezas. c) El valor total de cada pieza en todos los almacenes d) El valor total general Suponer que la matriz inventario y el vector de costes ya están introducidos anteriormente Resolución 1 (Larga y menos eficiente, pero mucho más simple de interpretar) Código: INICIO Resolución 2 (Búsqueda de la máxima eficiencia y el menor tamaño posible) Código: INICIO Título: Ejercicios de pseudocódigo (Parte2) Publicado por: Saberuneko en 27 Octubre 2010, 09:31 am Tras unos cuantos algoritmos que cubren el uso de casi todas las funciones explicadas en la teoría. Paso a la explicación simple de algunos algoritmos estándar.
BUSQUEDA DE DATOS: Búsqueda Lineal: Se trata de determinar si un elemento x está en un vector, para ello buscaremos una posición pos donde se encuentre ese elemento. (Dado un vector a de n elementos se debe cumplir que a(pos)==x) La búsqueda lineal consiste en recorrer el vector a hasta que encuentre el elemento, o bien hasta que acabe el recorrido (si no está). Programa: Búsqueda_Lineal Datos: n: valor constante. a: vector de tamaño n, tipo T (debe tener el mismo tipo que x, para poder poner "x" como el dato que queremos buscar dentro del vector) x: variable de tipo T pos: número entero encontrado: variable booleana. Código: INICIO Búsqueda lineal con centinela: Este método es parecido al anterior, y se basa en dimensionar el vector a una dimensión más que las definidas en el tamaño del vector. Esta posición se va a utilizar para introducir el elemento a buscar. De esta forma, nos aseguraremos que siempre va a estar, con el objeto de simplificar las condiciones del proceso repetitivo. Programa: Busqueda_centinela Datos: n: valor constante a: vector de tamaño n+1 de tipo T x: variable de tipo T encontrado: variable booleana Código: INICIO Búsqueda Dicotómica: Si los elementos del vector están ordenados bien de forma creciente o decreciente, no es necesario examinar todos los elementos, ya que comparando el valor buscado x con el valor central, se puede eliminar la búsqueda en una de las dos mitades, con lo cual el algoritmo resulta mucho más rápido. Supondremos que tenemos el vector ordenado en sentido creciente. Si en cada paso del algoritmo comparamos el valor de x como el de la posición central (k), podemos obtener lo siguiente: Caso 1: Que a(k) == x -> Acaba la búsqueda y el elemento está en k. Caso 2: Que a(k) > x -> Eliminamos la parte del vector superior a k. Caso 3: Que a(k) < x -> Eliminamos la parte del vector inferior a k. Programa: Busqueda_Dicotomica Datos: izq, der: variables que delimitarán la dimensión del vector en la que estamos buscando. Servirán para ir recortando la búsqueda según el resultado de la comparación de a(k) con x. a: vector de n elementos de tipo T x: variable de tipo T Código: INICIO ORDENACIÓN DE DATOS: Generalmente se considera ordenar con reorganizar un conjunto dado de objetos. Por ejemplo, los elementos de un vector en una secuencia especificada. El objetivo es facilitar la búsqueda de los elementos del conjunto ordenado. En particular vamos a practicar la ordenación a los elementos de un vector n>0 elementos de un tipo ordenable, así, los elementos del vector son a(n), deberemos encontrar una permutación de los mismos tal que: a(b1) <= a(b2) ... <= a(bn) La primera condición a imponer a los métodos de ordenación de vectores es la utilización económica de la memoria disponible, esto implica que las permutaciones de elementos con vista a su ordenación, debe realizarse usando el espacio ocupado por el vector. Los métodos que trasladan los elementos de un vector a otro no tienen interés (ya que implicaría duplicar el espacio necesario para realizar la operación). Ordenación por inserción directa: Para realizar este algoritmo partimos de la siguiente situación hipotética. (NOTA: Nunca se dará esta situación, esto solo sirve para considerar el programa tanto desde el comienzo, como durante el proceso intermedio) La sección [1, i-1] está ordenada, pero no se asegura que los elementos estén en la posición final de ordenación, a esto se le llama ordenación no clasificada. Para extender la ordenación al elemento i deberemos insertar el mismo en la posición correspondiente de la sección a(1...i) Concluimos pues que necesitaremos: Código: PARA i = 2 HASTA n Código: FIN PARA Una posibilidad sería esta: (Nótese que usamos uno de los algoritmos de búsqueda tratados anteriormente para buscar la posición correcta del elemento a ordenar.) Código: INICIO Esta disposición es correcta (y si no lo es, corregidme, que os lo agradeceré), pero no es lo más eficiente, aquí he introducido el algoritmo de búsqueda tal cual, para que pudieseis ver facilmente un ejemplo de su utilidad. Ahora que ya tenemos el algoritmo planteado, vamos a hacerlo más eficiente. Para ello, intentaremos meter ambos bucles en uno. Para ello debemos tener en cuenta que la búsqueda y ordenación de los elementos se pueda hacer de forma simultánea y no en bucles separados. Para conseguir esto, ambos bucles deberían realizarse en el mismo sentido. Teniendo en cuenta que el desplazamiento en sentido inverso es más simple en el proceso de desplazamiento de datos, mientras que las búsqueda se hace de forma análoga en un sentido u otro, es preferible modificar el algoritmo de ésta. Código: pos = i - 1 Si se compara este bucle con el desplazamiento de elementos, se puede observar lo siguiente. 1.- La variable de control de ambos comienza y termina con el mismo valor y i - 1, el correspondiente al valor de inserción. 2.- En ambos casos, la variable se modifica en cada paso de la misma forma, decrementándola, por tanto, ambos ejecutan el mismo númeor de veces. Con los mismos valores de la variable de control. En consecuencia, las dos variables, y los dos algoritmos pueden combinarse en uno solo. Código: MIENTRAS NOT encontrado AND pos >= 1 Quedándonos como resultado el programa final: Programa: Ordenación_inserción_directa Datos: n: constante a: vector de tamaño n tipo T x: var de tipo T encontrado: var lógica (booleana) pos, i: nº enteros. Código: INICIO Ordenación por selección directa: Partimos del supuesto de que tenemos una sección (1 ... i-1) ordenada y clasificada (recordad que esto era para considerar ambos casos de algoritmo durante inicio y proceso). El objetivo en ese caso sería extender la ordenación al elemento i del vector. Para ello buscamos el mínimo de la sección (i ... n) Programa: Inserción_Directa Datos: n: cte a: vec de n elementos tipo T x: var tipo T i,j,pos: nºentero Algoritmo: Código: INICIO Ordenación por intercambio (o método de la burbuja): Al igual que antes, suponemos que está ordenada y clasificada la sección a(1 ... i-1) y queremos extender la ordenación al elemento i. La diferencia con el método anterior es que aquí no se busca el mínimo, sino que este se lleva hasta la posición i mediante intercambios de pares de elementos adyacentes del vector. Si los elementos se consideran burbujas en un depósito de agua, con pesos acordes a sus valores, en cada pasada sobre el vector, asciende una burbuja hasta su posición correspondiente. (También hay la posibilidad de que otras se acerquen a su posición final, por ello hay casos en los que esta ordenación acelera el proceso) Código: INICIO A que éste ha parecido sencillito? Pues es lo que parece. (Cuando lo saqué por primera vez pensé que tenía que haber algo mal porque era demasiado sencillo. Pero no, es correcto. ^^ Actualizaré este post según tenga más material a mano. Nyaa! =3 Título: Re: Ejercicios de pseudocódigo Publicado por: Saberuneko en 30 Octubre 2010, 12:49 pm Algoritmo 8: Visualizar una cabecera, realizar sucesivas veces la lectura de tres números que representan el número de lados, la longitud de un lado y la apotema de un polígono regular, visualizando el perímetro y el área correspondiente.
El perímetro se realizará llamando a un procedimiento que lo calcula y visualiza El área se calculará llamando a una función que la retorna para que el módulo principal la visualice El proceso se terminará al introducir 0 como nº de lados. Datos adicionales: Área = perímetro * apotema / 2 MODULO PRINCIPAL DATOS: n,x,ap,ar:nºreal Código: INICIO MODULO perímetro(num:real,lon:real) DATOS: per:real Código: INICIO MODULO área(num:real,lon:real,apo:real) : ar:real DATOS: res:real Código: INICIO ----------------------------------------------------------------------------------------- Algoritmo 9: Introducir los datos en dos vectores (tener en cuenta de que pueden ser de distinto tamaño) mediante las llamadas a un procedimiento que permite cargar los datos de un vector. Los datos se introducirán ordenados, uno en sentido creciente y otro en decreciente, el algoritmo deberá visualizar si los vectores son disjuntos o no lo son. Para ello, retornará 1 si son disjuntos y 0 si no lo son (variable lógica). Para facilitar el diseño de esta función, se llamará a un procedimiento que reordenará el segundo vector en sentido creciente (desde el módulo principal) NOTA: Suponer que el usuario introduce el primer vector en orden creciente, y el segundo en decreciente. DATOS GLOBALES: m,n: constantes MODULO PRINCIPAL DATOS: va, vb: vector - res: lógico Código: INICIO MODULO CARGARVECTOR (v:vector, fin:entero) DATOS: cont:entero Código: INICIO MODULO REORDENAR (v:vector) DATOS: mem, pos Código: INICIO MODULO DISJUNTOS (va:vector, vb:vector) DATOS: res:lógico cont1, cont2: entero Código: INICIO ----------------------------------------------------------------------------------------- Algoritmo 10 [Ejercicio Práctico]: Una marca de autos, dispone de 15 concesionarios para la venta de los mismos, en la oficina central se desea contabilizar las ventas realizadas por los concesionarios. Para ello, se creará una tabla de 15x10 (10 tipos de coche). Para contabilizar las ventas se introducirán los siguientes datos: nº de concesionario y modelo de coche. Para determinar la columna se realizará una búsqueda en el vector modelos que contiene dichos datos, cuya situación es la misma que en la tabla, la búsqueda se realizará mediante un procedimiento que retornará la posición, la jornada se finalizará cuando se introduzca un 0 como número de concesionario, una vez terminada la jornada laboral, se obtendrá un listado del número de ventas realizadas por concesionario, para ello, se llamará un procedimiento que habrá calculado dichas ventas, el vector será retornado por el procedimiento al programa principal para la realización del listado. La empresa va a conceder un plus de venta a cada concesionario que venda más de 20 vehículos de un modelo particular. Visualizar cuales, usando una función, si el concesionario vende más de vente, retornará "true", de lo contrario, retornará "false". Programa: Coches Datos Globales: cplus: cte {contiene el modelo del plus} MODULO PRINCIPAL DATOS: ventas: tabla (15x10) {contendrá las ventas de modelo por concesionario} modelos: vector (10) {contendrá los 10 modelos de coche, en el mismo orden que la tabla, servirá para localizar la columna adecuada en la tabla ventas} total_ventas: vector (15) {generado por el módulo "total", contendrá las ventas totales por concesionario} conce, mod, pos: variables {múltiples usos} Código: INICIO MODULO BUSCA_MODELO(pos,modelos,mod) DATOS: cont{contador} Código: INICIO MODULO TOTAL(ventas,total_ventas) Datos: conce, mod {contadores para los bucles PARA} Código: INICIO MODULO PLUS(v,pos) Datos cont {contador} (En el paso final uso pos como si fuera booleana, aunque en realidad sea una variable de tipo entero) (1=true, 0=false) Código: INICIO |