Cuaderno de Algoritmos

43
ALGORITMOS Y PROGRAMAS Cuaderno de Ejercicios Clases Estructuras algorítmicas de control Arreglos unidimensionales Arreglos genéricos Arreglos bidimensionales

Transcript of Cuaderno de Algoritmos

ALGORITMOS Y

PROGRAMAS Cuaderno de Ejercicios

• Clases

• Estructuras algorítmicas de control

• Arreglos unidimensionales

• Arreglos genéricos

• Arreglos bidimensionales

Algoritmos y Programas Página 2

Introducción En este cuaderno de ejercicios se presentan varios problemas donde se aplican los conceptos vistos en clase. Es muy importante resolver cada uno de los problemas para asegurar que los conceptos se entendieron y, por lo tanto, pudieron aplicarse en la solución de un problema. Antes de resolver cada problema, ten en cuenta que:

1- Para encontrar la solución a un problema, primero debes entenderlo. Sigue los siguientes pasos. Dada la descripción del problema planea (lee la información, identifica los elementos más importantes: entradas, resultados, operaciones, etc.) cómo vas a realizar tu trabajo. Luego diseña la solución (puede ser un diseño con las clases representadas en UML y el algoritmo en pseudo código). Una vez que tengas una idea clara de todo el problema y de la solución del mismo (expresada por medio de clases y algoritmos) impleméntala utilizando el lenguaje Java. Por último, prueba tu solución. Asegúrate que los resultados son los esperados según la descripción del problema. Si encuentras errores debes corregirlos hasta que tu programa quede libre de ellos.

2- Es necesario leer cuidadosamente el enunciado de cada problema.

Identifica qué parte de la descripción está haciendo referencia a un dato que puedes generalizar y qué parte está relacionada con la solución del problema concreto que se te presenta. Cuando tengas esto claro, representa lo primero como una clase que podrá ser usada posteriormente . Es decir, trata que sea general. En cambio, la segunda parte debe ser representada por una clase que se ajusta al problema actual. El método main podrás incluirlo en esta cla se o hacer una exclusivamente para él.

3- A medida que los problemas que analices se tornen más complejos, puede

resultar necesario crear más de una clase general, mientras que siempre tendrás una clase con un método main .

4- En tus clases vas a incluir dos tipos de miembros: atributos (son las

características de lo que está siendo representado por medio de la clase) y métodos (son las operaciones válidas a aplicarse sobre los miembros de la clase).

5- Los atributos siempre se declaran privados . Cuando se use herencia se

podrán declarar protegidos, si el problema lo justifica.

6- En cada clase incluye los métodos equals() , hashCode(), compareTo() y toString(), y los métodos get() y set() necesarios.

Algoritmos y Programas Página 3

7- En el apéndice 1 se presentan los diagramas de flujo de las estructuras algorítmicas de control y de algunos de los algoritmos correspondientes a operaciones básicas en arreglos (búsqueda).

8- En el apéndice 2 se presentan una serie de ejercicios para ser resueltos

algorítmicamente y cuya solución debe ser expresada por medio de diagramas de flujo.

9- En el apéndice 3 se presentan algunos métodos de la clase String y en el

apéndice 4 de la clase Math .

Algoritmos y Programas Página 4

Problemas a resolver

1. Ejercicio : Un rectángulo se caracteriza por tener cuatro lados, de los cuales hay dos pares de lados iguales. Asimismo, se sabe que las operaciones que permiten calcular el área y el perímetro del rectángulo son muy útiles. De acuerdo a esta información y, teniendo en cuenta lo mencionado en la Introducción, se te pide:

a) Realizar el diagrama de la clase Rectángulo , usando el lenguaje UML.

b) Escribir la clase Rectángulo usando el lenguaje Java.

2. Ejercicio : Un círculo se caracteriza por el valor de su radio. Asimismo, se sabe que las operaciones que permiten calcular el área y la circunferencia del círculo son muy útiles. De acuerdo a esta información y, teniendo en cuenta lo mencionado en la Introducción, se te pide:

a) Realizar el diagrama de la clase Círculo, usando el lenguaje UML.

b) Escribir la clase Círculo usando el lenguaje Java.

3. Ejercicio : Considera que se necesita calcular el espacio ocupado por 3 mesas rectangulares que se colocarán en una sala. Se sabe que la primer mesa mide 2 x1.8 metros., la segunda 1 x 1.5 metros y la tercera 3 x 2 metros. Crea la clase MundoMesas y usando la clase del ejercicio 1 calcula el espacio ocupado por las tres mesas.

4. Ejercicio : Considera que se tiene 1 oficina rectangular (el usuario debera darte las medidas) que está cubierta por 3 tapetes circulares. Crea la clase MundoOficina y usando las clases de los ejercicios 1 y 2 calcula el área de la oficina que NO esta cubierta por tapetes.

5. Ejercicio: Modifica el ejercicio 4 de manera que ahora tengas n oficinas rectangulares (que pueden ser de diferente tamaño) y en cada una de ellas k tapetes circulares. ¿Cuál es el área total descubierta considerando todas las oficinas?

6. Ejercicio : Se requiere representar de manera simplificada el concepto Persona por medio de una clase de Java. Para resolver el problema tienes que pensar cuales son las características del concepto que estás representando con la clase (toda persona tiene un nombre, el CURP, un domicilio, etc.). De esta forma puedes determinar los atributos de la clase. Luego piensa cuales son las operaciones que pueden aplicarse sobre los atributos y que pueden requerirse de manera frecuente. Una persona puede cambiar de domicilio, de teléfono, de estado civil, se puede necesitar su CURP, su nombre, etc.

7. Ejercicio: Realiza una clase MundoPersona para probar la funcionalidad de la clase Persona del ejercicio anterior.

8. Ejercicio : La fábrica “La Alfombra Voladora” se dedica a la fabricación de alfombras. Todas sus alfombras tienen forma rectangular o circular . La materia prima que utiliza son paños de una tela especial que recibe de oriente. Cada paño tiene un tamaño de m x n metros.

Algoritmos y Programas Página 5

a) Define la clase Fábrica utilizando un diagrama UML. Incluye los miembros (atributos y métodos) que creas conveniente.

b) Escribe el método calculaTotalAlfombrasRect(int m, int n, double l1, double l2): int de la clase Fábrica . El método recibe el tamaño del paño (mxn) y el tamaño de la alfombra rectangular que se desea fabricar (l1 x l2) y, calcula y regresa el total de alfombras de l1 x l2 que se pueden fabricar con dicho paño.

c) Escribe el método calculaTotalAlfombrasCirc(int m, int n, double radio): int de la clase Fábrica . El método recibe el tamaño del paño (mxn) y el tamaño de la alfombra circular que se desea fabricar (radio) y, calcula y regresa el total de alfombras que se pueden fabricar con dicho paño

d) Escribe la clase MundoAlfombras que contenga un método main y permita probar tu solución.

9. Ejercicio : Un cilindro se caracteriza por el valor de su radio y de su altura. Asimismo, se sabe que las operaciones que permiten calcular el área y el volumen del cilindro son muy útiles. El área de un cilindro es igual a la suma de las áreas de los dos círculos más el área del rectángulo, formado por la longitud de la circunferencia y la altura del cilindro. El volumen se obtiene multiplicando la superficie de la base del círculo por la altura del cilindro. De acuerdo a esta información y, teniendo en cuenta lo mencionado en la Introducción, se te pide:

a) Realizar el diagrama de la clase Cilindro , usando el lenguaje UML.

b) Escribir la clase Cilindro usando el lenguaje Java.

10. Ejercicio : Escribe la clase CientíficoMatemático según el siguiente diagrama.

CientíficoMatemático

-nombre: String -áreaEspecialidad: String // Puedes agregar otros atributos +constructores +toString() +setNombre(String): void +getNombre(): String +set ÁreaEspecialidad (String): void +get ÁreaEspecialidad (): String /* Agrega los métodos que creas conveniente. Considera lo enunciado en la Introducción. */

11. Ejercicio : En la clase CientíficoMatemático agrega el método estáOrdenCreciente(int número1, int número2): boolean que regresa true si los números dados están en orden creciente.

12. Ejercicio : En la clase CientíficoMatemático agrega el método ordenaCreciente(int número1, int número2): String que regresa una cadena formada con los dos números dados, ubicados de tal manera que estén ordenados

Algoritmos y Programas Página 6

de forma creciente y separados por un guión. Es decir, si la entrada es 26 y 23, el método deberá regresar 23–26.

13. Ejercicio : En la clase CientíficoMatemático agrega el método esImpar(int número): boolean que regresa true si el número recibido como parámetro es impar y false en caso contrario.

14. Ejercicio : En la clase MundoCentroInvestigación crea un objeto del tipo CientíficoMatemático y prueba los métodos desarrollados en los ejercicios anteriores. ¿Es necesario tener un (objeto de la clase) CientíficoMatemático para poder probar los métodos de los ejercicios anteriores? ¿Lo podrías hacer diferente? ¿Cómo?

15. Ejercicio : En la clase CientíficoMatemático agrega el método calculaFunción1(double x): double que calcula y regresa el resultado de la función que se muestra a continuación.

16. Ejercicio : En la clase CientíficoMatemático agrega el método calculaFunción2(int x): double que calcula y regresa el resultado de la función que se muestra más abajo.

=+

=

=

=

==

34%5

24%

14%6

04%

)(

3

2

xsix

xsix

xsix

xsix

xfy

17. Ejercicio : En la clase CientíficoMatemático agrega el método calculaFunción3(int num, int v): double que calcula y regresa el resultado de la función que se muestra más abajo.

≤<+

≤<−

≤+

==

xdevaloresdemáslospara

xsix

xsix

xsix

xfy

0

64336

331110

11363

)(

2

Algoritmos y Programas Página 7

=

=

=

==

num de valor otrocualquier para0

3num /100

2num 100

1num *100

)(

siv

si

siv

vfy

v

18. Ejercicio : Retoma la clase MundoCentroInvestigación y modifícala para probar los métodos desarrollados en los ejercicios anteriores.

19. Ejercicio : Un número complejo consta de una parte real y una parte imaginaria teniendo la forma a + bi, donde a y b son números reales. Así, en el número complejo 1.5 + 3.4i, 1.5 es la parte real, y 3.4 es la parte imaginaria; en el número complejo 2.3 - 4.8i, 2.3 es la parte real, y -4.8 es la parte imaginaria. Considerando además, la funcionalidad básica de una clase en Java, escribe la clase Complejo (en UML y en Java).

20. Ejercicio : Una calculadora científica puede realizar operaciones con números complejos. Define la clase CalculadoraCompleja de tal manera que pueda sumar, restar, multiplicar y dividir números complejos.

Recuerda que para los números complejos a + bi y c + di, las operaciones se definen de la siguiente manera:

Suma: (a + bi) + (c + di) = (a + c) + (b + d)i

Resta: (a + bi) - (c + di) = (a - c) + (b - d)i

Multiplicación: (a + bi) * (c + di) = (ac - bd) + (ad + bc)i

División: (a + bi) / (c +di) = ( (ac + bd) + (bc – ad)i ) / (c2 + d2)

con c2+d2 diferente de 0

21. Ejercicio : Prueba los resultados del ejercicio anterior con una clase MundoCalculadoraComplejos . Deberás presentar al usuario un menú de operaciones a realizar con números complejos, leer la opción del usuario, la cual será expresada a través del símbolo correspondiente a la operación (‘+’, ‘-‘, ‘*’, ‘/’), posteriormente deberás leer dos números complejos, mandar llamar a la operación indicada y mostrar el resultado, sin olvidar la validación pertinente en el caso de la división.

El programa debe permitir al usuario ejecutar tantas operaciones como desee, hasta que indique la opción de salida (‘s’).

Realiza los algoritmos necesarios, diagramas de flujo y diagramas de clase UML antes de realizar el código.

Algoritmos y Programas Página 8

22. Ejercicio : Una venta se caracteriza (de manera muy simplificada) por el monto y el nombre del vendedor que la realizó. En la clase, además de los atributos, se debe incluir el método calculaComisión(): double, el cual calcula y regresa la comisión que le corresponde al vendedor por realizar dicha venta. Si la venta es menor a $1,000, se le otorga el 3% de comisión. Si la venta es de $1,000 o más, el vendedor recibe el 5% de comisión. De acuerdo a esta información se te pide:

a) Realizar el diagrama de la clase Venta , usando el lenguaje UML.

b) Escribir la clase Venta usando el lenguaje Java.

23. Ejercicio : Escribe la clase MundoNegocio en la cual se crean dos objetos del tipo ventas. Usa dichos objetos para probar tu solución del problema anterior, considerando una venta de $850 y otra de $2350.

24. Ejercicio : En la clase CientíficoMatemático agrega el método generaSerieAscendente(int n): String que genera y regresa los primeros n números naturales en forma de cadena, siendo n >1. Es decir, deberá generar una cadena de la forma 1 2 3 4 5 ... n.

25. Ejercicio : En la clase CientíficoMatemático agrega el método generaSerieDescendente(int n): String que genera y regresa los primeros n números naturales en forma de cadena, siendo n >1. Los elementos de la serie deben estar en orden descendente. Es decir, deberá generar una cadena de la forma n n-1 ... 3 2 1.

26. Ejercicio : En la clase CientíficoMatemático agrega el método encuentraPares(int n): String que encuentra y regresa los primeros n números pares en forma de cadena, siendo n >1. Es decir, deberá generar una cadena de la forma 2 4 6 8...

27. Ejercicio : Retoma la clase MundoCentroInvestigación y modifícala para probar los métodos desarrollados en los ejercicios anteriores. Asegúrate de que los datos dados sean los esperados por los métodos, y que los resultados obtenidos estén correctos.

28. Ejercicio : Realiza una clase llamada Calculadora . Programa los métodos estáticos que corresponda para que se calcule la multiplicación y la potencia sin usar operadores ni funciones matemáticas predefinidas (biblioteca Math) en Java.

29. Ejercicio : En la clase Calculadora agrega el método calculaUllman(int número): String que genera y regresa los elementos correspondientes a la conjetura de Ullman (en honor al matemático S. Ullman). Con el dato recibido (número > 1) como parámetro genera los elementos según se indica a continuación:

• Empieza con el número dado.

• Si es par, divídelo entre 2; si es impar multiplícalo por 3 y agrégale 1.

• Obtén enteros sucesivamente repitiendo el proceso, hasta llegar al 1.

Siempre se llega al número 1, independientemente del entero inicial. Por ejemplo, si el entero inicial fuera 26, la secuencia será:

Algoritmos y Programas Página 9

26 13 40 20 10 5 16 8 4 2 1

30. Ejercicio : En la clase Calculadora agrega el método generaCubosNicómano(int n): String que genera y regresa –en forma de cadena- los primeros n cubos de Nicómaco. Para ello, considera la siguiente propiedad descubierta por Nicómaco de Gerasa: “Con el primer número impar, se obtiene el primer cubo. Sumando los dos siguientes impares se obtiene el segundo cubo. Sumando los tres siguientes, se obtiene el tercer cubo, etc.”

Es decir: 1 = 13,

3 + 5 = 23 = 8,

7 + 9 + 11 = 33 = 27,

13 + 15 + 17 + 19 = 43 = 64.

31. Ejercicio : Retoma la clase Calculadora . Agrégale el método calculaFactorial(int n): int que calcula y regresa el factorial de n (con n ≥ 0).

32. Ejercicio : Retoma la clase Calculadora . Agrégale el método calculaMáximoComúnDivisor(int m, int n): int que calcula y regresa el Máximo Común Divisor de dos números enteros, aplicando el algoritmo de Euclides que establece: si m>=n, MCD(m,n) = MCD(n, m % n). Si n=0, MCD(m,n) = m.

33. Ejercicio : Retoma la clase Calculadora . Agrégale el método generaSerieFibonacci(int n): String que calcula y regresa –en forma de cadena- los primeros n números de la serie de Fibonacci. Recuerda que los dos primeros números de la serie son 0 y 1. A partir del tercero se calcula como la suma de los dos números que le preceden.

Ejemplo: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, . . .

34. Ejercicio : Retoma la clase Calculadora . Agrégale el método calculaSerie1(int n): int que calcula y regresa el resultado de la siguiente sumatoria (con n ≥ 0).

35. Ejercicio : Retoma la clase Calculadora . Agrégale el método calculaSerie2(int n, int número): int que calcula y regresa el resultado de la serie que aparece más abajo. El método recibe el número de términos, n (con n ≥ 0) y el dato número y regresa el resultado generado.

...53753

+++++ númeronúmeronúmeronúmeronúmero

∑=

n

i

ii1

Algoritmos y Programas Página 10

36. Ejercicio : Retoma la clase Calculadora . Agrégale el método calculaSerie3(int n): int que calcula y regresa el resultado de la siguiente sumatoria (con n ≥ 0).

∑=

−n

i i

in

0 !

)!(

Que ya desarrollada para n=5, quedaría:

!5

1

!4

!1

!3

!2

!2

!3

!1

!4

1

!5 +++++

Se requiere que optimices operaciones por lo que sólo debes llamar 1 vez a la función de factorial, que ya tienes programada en la clase.

37. Ejercicio : Retoma la clase Calculadora . Agrégale el método esDivisiblePor11(int n): boolean que determina si el número n es divisible por 11, de acuerdo a lo que se explica más abajo. El método regresa true si el número dado es divisible por 11 y false en caso contrario.

Un número es divisible por 11 si la diferencia entre la suma de sus dígitos en posición impar y la suma de sus dígitos en posición par, es divisible entre 11 o viceversa. Por ejemplo: 47 679 291 es divisible entre 11, puesto que,

(4+6+9+9) - (7+7+2+1) = 28 -17=11 resulta divisible entre 11.

(7+7+2+1) - (4+6+9+9) = 17 -28=-11 resulta divisible entre 11.

número 4 7 6 7 9 2 9 1

posición 0 1 2 3 4 5 6 7

posiciones par: 4, 6 , 9 , 9

posiciones impar: 7, 7, 2 , 1

38. Ejercicio : Se requiere una aplicación en Java para poder obtener los valores de las funciones trigonométricas: seno, coseno, tangente y cotangente, utilizando las siguientes formulas:

......!9!7!5!3

)(9753

−+−+−= xxxxxxsen

......!8!6!4!2

1)cos(8642

−+−+−= xxxxx

)cos(

)()tan(

x

xsenx =

Algoritmos y Programas Página 11

)(

)cos()cot(

xsen

xx =

Crea una clase llamada CalculadoraTrigonométrica para poder trabajar con las funciones trigonométricas. Si es necesario utiliza las funciones potencia y factorial programadas anteriormente en la clase Calculadora . La variable x está en radianes. Realiza los algoritmos necesarios, diagramas de flujo y diagramas de clase UML antes de realizar el código.

39. Ejercicio : Elabora un programa (una clase MundoTrigonometria con método main) que pida al usuario un número y que le presente un menú de operaciones a realizar con ellos, lea la opción del usuario y realice la operación indicada.

El programa debe permitir al usuario ejecutar tantas operaciones como desee, hasta que indique la opción de salida (‘s’).

40. Ejercicio : Se necesita una aplicación en Java para dar de alta cuentas bancarias. Cada cuenta bancaria tiene un número de cuenta, el nombre del cliente y el saldo. Las cuentas deben activarse con el nombre del cliente y se les asigna automáticamente el número de cuenta, el depósito inicial es opcional. A cada cuenta se le deben poder realizar depósitos y retiros, verificando que estos procedan, en caso contrario mandar un mensaje adecuado. A cada cuenta se le puede preguntar su saldo en cada momento así como toda la información propia de la cuenta.

Las cuentas deben poder compararse entre ellas, el criterio de comparación será el número de cuenta.

Después de analizar cuidadosamente el problema:

a) Realiza un diagrama UML de la clase CuentaBancaria , identifica los atributos y los métodos necesarios para que tenga la funcionalidad mínima requerida.

b) Realiza los algoritmos y diagramas de flujo necesarios.

c) Crea una clase MundoBanco para probar tu clase CuentaBancaria , dando de alta 2 cuentas: una para José Pérez con $3’000.00 y otra para Juana García.

d) Para la cuenta de Juana García registra un depósito de $4’000.00.

e) Para la cuenta de José Pérez registra un retiro de $10’000.00.

f) Para la cuenta de José Pérez registra un depósito de $1’000.00.

41. Ejercicio : Una agencia de renta de automóviles desea llevar el control de los autos que renta, para cada auto se tiene una clave única (asignada por el sistema), la marca del auto, el año, número de kilómetros, nombre y el número de la licencia del cliente al que se le renta el automóvil.

a) Crea la clase Auto en Java con los atributos mencionados anteriormente. Además de la funcionalidad mínima requerida la clase debe incluir

Algoritmos y Programas Página 12

diferentes métodos para poder realizar una renta del auto y/o una devolución:

• La renta del auto incluye tomar los datos del cliente que lo renta: nombre y número de licencia, pedir el número de días para el cálculo de la renta. Se cobra por adelantado. Si año es anterior a 2005 la renta diaria es de $200.00 y para automóviles de años posteriores la renta es de $300.00. Si el automóvil tiene menos de 20,000 km. Se le cobra un sobreprecio de $ 20.00 al día.

• La devolución del auto incluye borrar los datos del cliente del auto y aumentar el número de kilómetros recorridos del mismo.

Realiza los algoritmos necesarios, diagramas de flujo y diagramas de clase UML antes de realizar el código.

b) Se debe generar una clase MundoAgencia donde se haga la instancia de 5 autos que son con los que está empezando a operar.

c) Después realiza la renta de 2 autos, pidiendo al usuario que auto quiere rentar (1 a 5), calcula el cobro respectivo a los clientes y haga el registro de la devolución de uno de ellos. Realiza los algoritmos necesarios, diagramas de flujo y diagramas antes de realizar el código.

ARREGLOS

42. Ejercicio : Define la clase ManejadorArreglos que contenga métodos estáticos capaces de:

a) Correr los elementos de un arreglo de enteros k lugares a la derecha.

b) Correr los elementos de un arreglo de enteros k lugares a la izquierda.

c) Sumar los elementos de un arreglo de enteros.

d) Obtener el promedio de los elementos de un arreglo de enteros.

e) Obtener el índice donde se encuentra el elemento mayor de un arreglo de enteros.

f) Obtener el índice donde se encuentra el elemento menor de un arreglo de enteros.

g) Determinar cuántos elementos de un arreglo de enteros son mayores a un cierto parámetro.

h) Determinar cuántos elementos de un arreglo de enteros son menores a un cierto parámetro.

43. Ejercicio : Se tiene el número de habitantes de cada uno de los estados de un país. En una oficina gubernamental se quiere procesar esa información para poder tomar algunas decisiones. Usa un arreglo de enteros para almacenar la población de cada estado y un arreglo (paralelo) de Strings para almacenar los nombres de los estados. Dicha oficina está a cargo del Lic. Martín Cuenta. A partir de la información que se tiene se quiere obtener: (a) El estado con mayor población, (b) El promedio de habitantes por estado a nivel nacional, (c) Total de estados que tienen una población menor al promedio. Define la clase OficinaGobierno . Decide

Algoritmos y Programas Página 13

qué atributos y métodos incluir en ella. Puedes emplear métodos que hayas programado en la clase ManejadorArreglos .

44. Ejercicio : La compañía “Empaques S.A. de C.V.” que se encuentra localizada en Av. Constitución 34 en la Cd. de Querétaro quiere saber cuál es el promedio de unidades vendidas del año pasado, cuál fue el mes en el que se vendieron más unidades, cuál fue el mes en el que se vendieron menos unidades, cuántos meses están por arriba del promedio y el total de unidades vendidas en el año. Para lo cual el Sr. Pérez, que es el director de la empresa, te proporciona las unidades vendidas de cada mes del año pasado.

a) Elabora una clase Compañía que tenga como atributos nombre, dirección, ciudad, director y ventas. Esta clase debe tener la funcionalidad mínima requerida de toda clase.

b) Crea una clase llamada MundoCompañía para pedirle al Sr. Pérez las ventas de los 12 meses del año anterior y que mande llamar a compañía para que realice los cálculos necesarios de los datos que el director requiere y los imprima en pantalla.

45. Ejercicio : En la guardería “La Casita Feliz”, especializada en niños menores de 4 años y preocupada por cuestiones ambientales, quieren conocer algunos datos sobre el consumo diario de pañales. Luego de muchos años de experiencia, las nanas de la guardería saben que a los niños de meses les cambian 6 veces los pañales durante el tiempo que permanecen a su cuidado. Por su parte, a los niños que ya cumplieron el año, pero que aún no tienen 2 le cambian los pañales 4 veces al día. Los que tienen 2 años o más, sin llegar a los 3 ocupan 3 pañales y a los de 3 años o más sólo los cambian 2 veces al día. Para este problema sólo se necesita conocer la edad, en años cumplidos de los niños y crear con estos datos un arreglo de enteros. Actualmente “La Casita Feliz” recibe a 20 niños. Identifica atributos y métodos requeridos para: (a) Calcular total diario de pañales, (b) Calcular promedio diario de pañales y (c) Determinar en qué categoría de niños (de acuerdo a la edad) se consumen más pañales. Define la clase Guardería . Decide qué atributos y métodos incluir en ella.

46. Ejercicio : Cerca del ITAM hay una institución que se especializa en dar clases de natación y que requiere que le ayuden a estimar algunos costos para mejorar sus instalaciones. La institución se caracteriza por su nombre, domicilio, total de albercas y datos de las albercas (todas son de forma rectangular). Luego de las Olimpíadas el club ha recibido muchas solicitudes de inscripción de potenciales ganadores de medallas de oro. Para ofrecer un mejor servicio el club decidió techar todas sus albercas, pero de manera individual para independizar el sistema de calefacción de cada una de ellas. Se te pide que con la ayuda de la clase Rectángulo (problema 1) calcules e imprimas la cantidad de dinero requerido si el costo por m2 de techo es de $1000. Decide qué atributos y métodos incluir para representar esta institución y resolver su problema.

47. Ejercicio: Retoma la clase ManejadorArreglos y agrega métodos que permitan:

a) Ordenar los elementos de un arreglo de enteros.

b) Buscar un elemento en el arreglo de enteros y obtener el índice donde se encuentre o el negativo del índice donde debería estar.

Algoritmos y Programas Página 14

48. Ejercicio : Convierte los métodos de tu clase ManejadorArreglos a métodos genéricos <T> para que puedas trabajar con ellos independientemente del tipo del arreglo que tengas. ¿Qué métodos vale la pena convertir? ¿De qué depende?

49. Ejercicio : Define la clase ListaIndexadaDesordenada<T> y la clase ListaIndexadaOrdenada<T> de acuerdo a lo visto en clase. Asegúrate que todos sus métodos funcionan correctamente. Agrega los métodos necesarios para:

a) Insertar un elemento en una lista.

b) Eliminar un elemento de la lista.

Realiza las validaciones pertinentes según sea el caso.

50. Ejercicio : Durante un Seminario de Ética Profesional llevado a cabo en el ITAM, el pasado mes de febrero, se registraron los nombres de todos los asistentes. Escribe una clase que permita almacenar la información del seminario, incluyendo la correspondiente a los participantes (haciendo uso de una ListaIndexadaOrdenada). En la clase Seminario se debe contar con métodos que permitan: (a) Generar un reporte de todos los asistentes, ordenado alfabéticamente de menor a mayor, (b) Dado el nombre de una persona decir si dicha persona asistió o no al seminario, (c) Agregar un nombre (suponiendo que hubo alguna omisión al momento de capturar inicialmente los datos) y (d) Eliminar un nombre (suponiendo que se capturó dicho nombre por error).

51. Ejercicio : Define la clase Alumno . Un alumno se caracteriza por su nombre, domicilio, CURP, nombre de carrera, total de materias aprobadas hasta el momento y las calificaciones obtenidas en cada una de ellas. Si consideras conveniente agregar otros atributos puedes hacerlo. Además, debe contar con métodos para cambiar de domicilio, de carrera, obtener el promedio, etc.

52. Ejercicio : Una escuela necesita de tu ayuda para manejar la información de un grupo de sus alumnos. De la escuela se conoce: el nombre, la dirección, el total de alumnos y los datos de cada uno de los alumnos. Además, en la escuela se realizan las siguientes actividades: (a) Dar de alta un alumno (asegúrate que no haya sido dado de alta previamente), (b) Dar de baja un alumno (asegúrate que exista), (c) Desplegar los datos de un alumno (el usuario da la clave y, si dicho alumno está en la escuela se muestran sus datos, en caso contrario se informa al usuario que no fue encontrado) y (d) Desplegar los datos del alumno que tenga el mayor promedio de la escuela (supón que sólo hay un alumno que cumpla con esta condición). Analiza cuidadosamente el problema. Identifica las clases involucradas en el problema, y de cada una de ellas los atributos y los métodos.

53. Ejercicio : Se tienen los datos de un grupo de personas que participan en el coro del ITAM. El director del coro necesita que le hagas un programa que pueda ayudarle a manejar esa información. Define la clase Coro que tiene como atributos los datos del director, el total de personas que forman el coro y los datos de cada una de ellas. El total máximo de personas que participan en el coro son 30. Puedes usar la clase Persona definida en el ejercicio 4 para almacenar los datos del director y de cada uno de los miembros. Además debes incluir métodos que puedan (a) Cambiar al director del coro, (b) Agregar una persona al coro, (c) Dado el nombre de uno de sus miembros, obtener todos sus datos, (d) Dar de baja a un miembro del coro y (e) Cambiar el domicilio de uno de sus miembros o del director.

Algoritmos y Programas Página 15

En cada caso asegúrate de que las operaciones puedan llevarse a cabo con éxito. En caso contrario informa al usuario.

54. Ejercicio : Define la clase Fiesta , según las especificaciones que se dan más abajo. Observa que el atributo nombresInvitados es una lista de cadenas que almacenará los nombres de todos los invitados. Incluye los métodos necesarios para que puedas:

Fiesta -fecha: String -lugar: String -nombresInvitados: ListaGenericaOrdenada<String> +Fiesta() +Fiesta(String, String) +alta(String):boolean +toString(): String …

a) Formar la lista de invitados de manera ordenada (alfabéticamente de la “A” a la “Z”). Todos los nombres deben guardarse en mayúsculas, independientemente de cómo los dé el usuario.

b) Quitar a uno de los invitados de la lista. El usuario da como dato el nombre de un invitado. El método debe regresar un mensaje adecuado indicando si se eliminó o no.

c) Agregar un invitado a la lista de invitados, sin alterar el orden que ya tienen. El usuario da como dato el nombre del nuevo invitado. El método debe regresar un mensaje adecuado indicando si se agregó o no (no se aceptan dos invitados con el mismo nombre).

d) Obtener el primero de la lista.

e) Obtener el último de la lista.

f) Obtener, en forma de cadena, la lista completa de invitados.

Por último, define la clase FiestaCumpleaños que utilice la clase Fiesta y pruebe que la misma se comporta como se espera.

55. Ejercicio: Define la clase AgenciaAutomotriz considerando que se caracteriza por un nombre, una dirección, la cantidad de marcas que vende (en el caso de que varias marcas pertenezcan al mismo corporativo), los nombres de todas las marcas (ordenados alfabéticamente de la “A” a la “Z”), la cantidad de autos que tiene para vender y los datos de cada uno de los autos. Para almacenar los nombres de las marcas usa un ListaIndexadaOrdenada<String>; y para almacenar los autos una ListaIndexadaOrdenada<Auto> (si no tienes la clase Auto, defínela incluyendo los atributos y métodos que creas conveniente). Se quiere que la clase AgenciaAutomotriz pueda agregar una nueva marca a las que ya vende, dejar de vender alguna de las que vende, recibir nuevos autos para su venta, vender alguno de los autos que tiene para la venta, dar a conocer todas sus características al usuario o sólo alguna de ellas, dar los datos del auto más caro, dada una marca (si la agencia la vende) obtener cuántos autos tiene de dicha

Algoritmos y Programas Página 16

marca. Debes definir los métodos que mejor representen el comportamiento deseado de la clase.

Por último, define la clase VendeAutos que utilice la clase AgenciaAutomotriz y pruebe que la misma se comporta como se espera.

56. Ejercicio : Define la clase TiendaMascotas de tal manera que quede caracterizada por su nombre, dirección, y los datos de todos los animales. Para representar a los animales debes usar la clase Animal (si no la tienes definida debes hacerlo, incluyendo los atributos y métodos que consideres importantes). Para almacenar los datos de los animales usa una lista. La clase TiendaMascotas debe tener el siguiente comportamiento: agregar nuevos animales para la venta, vender un animal, cambiar la dirección de la tienda, dar a conocer todos sus datos, obtener e imprimir cuántos animales de cierto tipo (por ejemplo perros, gatos, patos, etc.) hay para vender en la tienda.

Por último, define la clase VendeMascotas que utilice la clase TiendaMascotas y pruebe que la misma se comporta como se espera.

MATRICES (arreglos bidimensionales)

57. Ejercicio : Define la clase ManejadorMatrices . Incluye métodos estáticos para:

a) Sumar dos matrices.

b) Restar dos matrices.

c) Multiplicar dos matrices.

d) Obtener la transpuesta de una matriz.

e) Sumar los elementos de una fila (el usuario proporciona la fila que interesa).

f) Sumar los elementos de una columna (el usuario proporciona la columna que interesa).

g) Sumar los elementos de la diagonal principal (i=j).

h) Sumar los elementos de la diagonal secundaria (i+j=n).

i) Dado un valor que identifica un renglón, regresar la columna donde se encuentra el valor más pequeño/grande de dicho renglón.

j) Dado un valor que identifica una columna, regresar el renglón donde se encuentra el valor más pequeño/grande de dicha columna.

58. Ejercicio : En la clase ManejadorMatrices agrega el método generaCuadradoMágico(int n): Matriz, el cual forma y regresa como resultado un cuadrado mágico: “un cuadrado mágico es una matriz cuadrada de dimensión n (n entero, positivo e impar), donde los elementos que llenan a la matriz son los valores de 1 a n2, de tal manera que la suma de los elementos de cada una de las filas, de cada una de las columnas y de las diagonales principales son iguales”.

El algoritmo para crear un cuadrado mágico es el siguiente:

Algoritmos y Programas Página 17

a) El número 1 se coloca en la casilla central de la primera fila.

b) El siguiente número se coloca en la casilla correspondiente a la fila anterior y columna posterior. La fila anterior a la primera es la última y la columna posterior a la última es la primera.

c) Si el número es un sucesor de un múltiplo de n, no aplica la regla b) sino que, se coloca en la casilla de la fila posterior y en la misma columna.

Observa el siguiente ejemplo: Sea n = 3

0 1 2 0 8 1 6 1 3 5 7 2 4 9 2

Donde la suma de cada renglón, columna y diagonal principal es: 15

59. Ejercicio : En la clase ManejadorMatrices agrega el método compruebaCuadradoMágico(int[][]): boolean que determina si una matriz es o no un cuadrado mágico. Prueba tu solución generando un cuadrado con el método del ejercicio anterior y luego verifica que el mismo cumple con las condiciones de ser un “cuadrado mágico”.

60. Ejercicio : En un observatorio astronómico se miden y registran las cantidades de luz en ciertos puntos del espacio. En cada una de las observaciones se registra: la fecha, la cantidad de luz detectada y las coordenadas del punto donde se hizo el registro. Supón, que se representa el cielo (el espacio de él observado…) como un arreglo bidimensional, donde los renglones corresponden al eje x y las columnas al eje y de los puntos donde se hicieron las observaciones. Es decir, en cada casilla del arreglo se guarda un elemento del tipo PuntoLuz. Agrega un método en la clase ManejadorMatrices para que a partir de ahora un científico pueda determinar cuáles de esos puntos de luz corresponden a estrellas. Para ello se sabe que:

• Una estrella no se encuentra en las orillas del espacio (primero o último renglón o columna), y

• (a[i][ j] + a[i – 1][ j] + a[i + 1][ j] + a[i][ j - 1] + a[i][ j + 1]) > 30 hay una estrella en i,j

61. Ejercicio : Define una clase que represente a los productos que produce una cierta industria. De cada producto se tiene clave, descripción y cantidad de unidades producidas por mes. Por otra parte, se sabe que la industria quiere guardar las producciones mensuales de productos a lo largo de los últimos 5 años (supón que en un cierto mes se produce un solo tipo de producto). Si en un mes no hubo producción, habrá null en la casilla correspondiente. Define la clase ProduccionEmpresa que tendrá entre sus atributos una matriz. Debes incluir los métodos necesarios para:

Algoritmos y Programas Página 18

a) Calcular y regresar el total de unidades producidas en un mes (el usuario da como dato el mes que le interese).

b) Calcular y regresar el total de unidades producidas en un año (el usuario da como dato el año que le interese.

c) Año con mayor producción. Supón que uno solo cumple con esta característica.

d) Mes con la menor producción en el año 3.

e) En cuántos meses de un año dado, se produjo un cierto producto (el usuario da como dato la clave del producto y el año que le interese).

La matriz usada para guardar productos podría representarse como se muestra más abajo.

Año1 Año 2 Año 3 Año 4 Año 5 Mes 1 Mes 2 … Mes 11 Mes 12

p1: Producto -clave: String -descripción : String -totalUnidadesProducidas: int + constructores() +toString(): String …

62. Ejercicio : Un Hotel lleva el control de sus reservaciones, cada mes se registra cuántas reservaciones hace cada vendedor de cada tipo de habitación.

El Hotel se llama “Paraíso” y se encuentra en Acapulco, está estrenando sus instalaciones, sólo lleva operando 4 meses y cuenta con tres empleados en el área de reservaciones José, María y Lupita. Existen 3 tipos de habitaciones: las sencillas con un costo de $750.00 por noche, la dobles con un costo de $1200.00 por noche y las suites con un costo de $2500.00 por noche. Las habitaciones sencillas y dobles llevan incluido el desayuno.

Considera las siguientes matrices de reservaciones:

p2: Producto -clave: String -descripción : String -totalUnidadesProducidas: int + constructores() +toString(): String …

Algoritmos y Programas Página 19

Habitaciones sencillas:

1 2 3 4 José 10 9 8 8 María 4 6 2 10 Lupita 15 2 11 8

Habitaciones dobles:

1 2 3 4 José 12 8 3 5 María 6 8 12 7 Lupita 15 12 1 4

Habitaciones suites:

1 2 3 4 José 2 2 1 0 María 3 1 2 0 Lupita 1 0 2 1

Analiza cuidadosamente el problema. ¿De qué tipo y dimensiones son las matrices? ¿Conviene tener un arreglo de cadenas para guardar los nombres de los empleados?

a) Realiza un programa en Java que te indique:

• El total de reservaciones realizadas estos 4 meses.

• Qué tipo de habitación es la más solicitada.

• Cuánto representarán en pesos las reservaciones realizadas por José.

• Cuántos desayunos se deben programar para el tercer mes.

• Quién tiene más reservaciones de suites en el primer mes.

63. Ejercicio : Una constructora lleva el registro de las obras que tiene en este momento y quiere que realices un programa en Java para poder obtener información de los datos que tiene y así poder llevar un mejor control de los gastos.

Después de pláticas con el dueño de la constructora recabas la siguiente información:

• De cada obra se tiene la dirección, el nombre del dueño, el número de licencia asignado (un valor único para cada obra), el número de obreros que asignaron a dicha obra (máximo 20) y los m2 planeados de construcción.

• De cada balance se tiene el número de licencia, el monto pagado en el mes por el dueño de la obra y el monto de los gastos asociados a la obra durante el mes.

Algoritmos y Programas Página 20

• La constructora se llama “MiCasitaFeliz”, construye casas tipo habitación y tiene la capacidad de atender 3 obras simultáneamente. Por otro lado la constructora lleva un registro del balance de cada obra en cada mes. Por el momento solo lleva trabajando tres meses este año.

a) Define las clases necesarias, realiza tus diagramas de clase UML y define la funcionalidad mínima requerida en cada una de ellas. Programa cada clase en Java.

• Para la clase Obra considera que si tienen el mismo número de licencia son iguales y que una obra es mayor a otra por el número de metros construidos.

• Para la clase Balance considera que un balance es igual a otro si tiene el mismo número de licencia y que un balance es mayor a otro si el saldo es mayor (pagos – gastos), el saldo no debe ser un atributo ya que en cualquier momento lo puedes calcular, sin embargo vas a necesitar un método que calcule y regrese al saldo del balance de esa obra de ese mes.

• Para la clase Constructora considera que tiene entre otros atributos un arreglo de obras y una matriz con los balances de cada obra de cada mes de un año. Considera que una constructora es igual a otra si tienen el mismo nombre y que una constructora es mayor a otra por el número de obras que tiene a su cargo. El número máximo de obras que puede atender una constructora simultáneamente es de 10.

b) En la clase Constructora crea una función llamada altaObra para dar de alta a una obra verificando que no se repitan y que pueda ser llamado así: miConstructora.altaObra("Insurgentes456", "LuisGarcía", 15, 320), como argumentos necesita la dirección, el nombre del dueño, el número de obreros asignados y los m2 de construcción y que regrese verdadero o falso de acuerdo a si procede o no la alta.

c) En la clase Constructora crea una función altaBalance para dar de alta el balance de cada obra en cada mes, el cual pueda ser llamado: miConstructora.altaBalance (1, 1111, 1000, 6500) indicando mes, licencia de la obra, pagos realizados por el dueño de la obra y gastos asociados a esa obra ese mes. El método debe verificar a qué obra pertenece dicho balance.

d) Crea tu clase MundoConstructora que incluya un método estático llamado llenaDatos() que debes mandar llamar para que lea del archivo DatosConstructora.txt que contiene los datos de la constructora con el siguiente formato:

MicasitaFeliz 3 nombre de la constructora y número de obras

Calle23 JuanPérez 10 180 datos de la obra 1

Insurgentes45 LuisGarcía 5 320 datos de la obra 2

Ocotito45 AnaDíaz 9 120 datos de la obra 3

(dirección, dueño, num. obreros y m2)

Algoritmos y Programas Página 21

1, 1, 1000, 6500 datos del balance1,1

2, 1111,1000, 5000 datos del balance1,2

3,1111, 1300, 4500 datos del balance2,1

2, 1151, 7000, 18000 datos del balance2,2

3, 1151, 9300, 15000 datos del balance2,3

1, 1110, 900, 7500 datos del balance3,1

2, 1110, 700, 8000 datos del balance3,2

3, 1110, 930, 7000 datos del balance3,3

(mes, # licencia, pagos dueño y gastos)

e) Aumenta la funcionalidad de tus clases para que a través de la clase MundoConstructora contestes las siguientes preguntas:

• Cuántos empleados en total tiene la constructora y cuántos tiene en promedio por cada obra.

• Calcular el saldo de la constructora, como la suma de los saldos de cada obra, que a su vez son la suma de los saldos de cada mes. Para los saldos de cada obra en cada mes considera :

saldoObrai = monto pagado Obrai – gastos asociados Obrai – nomina Obrai

Donde la nómina es equivalente al número de empleados por $425.50 pesos al mes.

Cada obra debe saber cuánto paga de nómina.

• Indica si la constructora está bien (saldo positivo) o está en números rojos (saldo negativo).

• Calcular el saldo de una obra dado el nombre de un dueño y el mes requerido.

NOTA: en los problemas puedes usar interfaces gráficas (GUI´s) para lograr una mejor interacción con el usuario.

Algoritmos y Programas Página 22

Apéndice 1 – Diagramas de flujo En la tabla1 se presentan los componentes de un diagrama de flujo y en la tabla 2 se resumen las reglas más importantes para la creación de los diagramas, ambos tomados del libro Fundamentos de Programación. Piensa en C. de O. Cairó, Ed. Pearson-Prentice Hall (2006). Para mayor información se sugiere consultar dicho libro.

Símbolo

Explicación

Indica inicio o fin del diagrama de flujo. En todo diagrama de flujo sólo debe haber un inicio y un fin del mismo. Se diferencian el inicio del fin, etiquetando el óvalo con la palabra respectiva (“Inicio” o “Fin”).

Indica entrada (lectura) de datos al proceso.

Indica proceso. En el rectángulo se escriben las operaciones aritméticas, lógicas y de asignación que queremos que se realicen.

Las líneas con flechas indican flujo de información. Es decir, nos sirven para indicar el orden en el cual deben efectuarse los pasos y de donde hacia donde fluye la información.

Indica conexión dentro de una misma página. Es decir, si por su tamaño debemos continuar con el diagrama de flujo en otra parte de la página se usa un círculo con alguna letra o número (que deberá seguir una secuencia) el cual se repetirá al comenzar a escribir las demás operaciones del algoritmo.

Indica conexión a una página diferente. Es decir, si por su tamaño debemos continuar con el diagrama de flujo en otra página, entonces se usa este conector con una letra o un número (que deberá seguir una secuencia), el cual se repetirá en la nueva página.

Indica salida de resultados. Normalmente se relaciona con la impresión de resultados. Sin embargo, también puede representar desplegar en pantalla los resultados. Se puede imprimir/desplegar: 1) El contenido de una variable especificando el nombre de la misma; 2) Un mensaje, en cuyo caso habrá que encerrar a éste entre comillas.

Algoritmos y Programas Página 23

Tabla 1. Componentes de un diagrama de flujo

1. Todo diagrama de flujo tiene un único inicio y un único fin. 2. Todas las líneas utilizadas en un diagrama de flujo deben ser

rectas, verticales u horizontales y deben estar conectadas (iniciar y terminar) a algún símbolo o línea.

3. No puede llegar más de una línea a un símbolo. 4. El diagrama de flujo debe ser construido de arriba hacia abajo

y de izquierda a derecha.

Tabla 2. Reglas para la escritura de un diagrama de flujo

Algoritmos y Programas Página 24

Estructuras algorítmicas de control

1 - Estructuras selectivas

1.1 Selección simple

1.2 Selección doble

condición

instrucción(es)

falso

verdadero

condición

instrucción (es) instrucción (es)

verdadero falso

Algoritmos y Programas Página 25

1.3 Selección múltiple 2 - Estructuras repetitivas 2.1 Ciclo mientras (while)

condición

instrucción(es)

falso

verdadero

instrucción(es) instrucción(es)

instrucción(es)

selector valor 1

valor 2

por omisión

Algoritmos y Programas Página 26

2.2 Ciclo hacer-mientras (do-while)

instrucción (es)

condición verdadero

falso

2.3 Ciclo hacer n veces (for) creciente

varControl ← valorInicial

varControl < valorFinal

instrucción (es)

varControl <- varControl + increm

verdadero

falso

Algoritmos y Programas Página 27

Búsqueda en arreglos Búsqueda secuencial en arreglo desordenado – versió n explícita

encontró <- falso

(índice < tamaño) y (encontró = falso)

índice <- 0

colección[índice] = datoBuscado

encontró <- verdadero

índice <- índice + 1

verdadero falso

verdadero

falso

encontró = verdadero

posiciónDato <- índice posiciónDato <- -1

regresa posiciónDato

Algoritmos y Programas Página 28

Búsqueda secuencial en arreglo ordenado crecienteme nte– versión implícita

(indice < tamaño) y (colección[índice] < datoBuscado)

índice <- 0

Sí índice <- índice + 1

falso

(índice = tamaño) o (colección[dato] > datoBuscado)

índice <- (índice + 1) * (-1)

falso

verdadero

regresa índice

Algoritmos y Programas Página 29

Ordenación de arreglos

Método de Selección Directa

(Arreglo desordenado)

(Arreglo ordenado)

i = 0

i < n - 1

menor = arre[i]

posic = i

j = i + 1

j < n

arre[j] < menor

menor = arre[j]

posic = j

j = j + 1

v

f

ver

v

arre[posic] = arre[i]

arre[i] = menor

i = i + 1

falso

falso

Algoritmos y Programas Página 30

Apéndice 2 – Solución algorítmica de problemas - Ejercicios

1) Sean los datos: x, a1, a2, a3, a4. Elabore un diagrama de flujo para calcular:

a1x3 + a2x

2 + a3x + a4 Sin usar la operación de potencia.

f) ¿Cuántas operaciones de multiplicación y cuántas de suma utilizó? g) ¿Puede reducir ambas cantidades? En caso afirmativo, hágalo.

2) El precio de un boleto de viaje redondo en tren se calcula tomando en cuenta el

número de kilómetros que se van a recorrer, siendo el precio $60.00 por km. Este precio puede tener un descuento del 30% si el viaje de regreso se hace después de 7 días del viaje de ida, o si el recorrido supera los 800 km. Elabore un diagrama de flujo para calcular cuánto se debe pagar por un boleto de tren dando como datos el total de km recorridos y el número de días entre el viaje de ida y el viaje de vuelta. Pruebe su diagrama con los siguientes grupos de datos: a) 850 km y 10 días. b) 356 km y 8 días

3) Elabore un diagrama de flujo para resolver ax2 + bx + c = 0 en el caso de raíces reales. Los datos son: a, b, c. Puede usar las operaciones que necesite. Asegúrese que el resultado sea válido.

Análisis del problema: Si a ≠ 0 se presentan tres casos:

� Primero con dos soluciones dadas con la fórmula que da la solución de la ecuación de segundo grado cuando el discriminante es positivo.

� Segundo con una solución dada por la fórmula cuando el discriminante es cero.

� Tercero con dos soluciones complejas, dadas por la fórmula cuando el discriminante es negativo.

Si a = 0 se presentan a su vez tres casos:

� Primero es cuando b ≠ 0, cuya solución es b

c− .

� Segundo es cuando b = 0 y c = 0, que es evidente una identidad. � Tercero cuando b = 0 y c ≠ 0 que no puede tener solución.

Algoritmos y Programas Página 31

4) Una tienda desea obtener una serie de reportes diarios a partir de las ventas

realizadas en un día. Elabore un diagrama de flujo que:

h) solicite el monto de cada venta sin IVA, i) para cada venta, calcule e imprima el IVA y el total con IVA, j) al terminar el día, imprima un reporte con los totales de:

• ventas sin IVA, • IVA, • ventas con IVA, • promedio de las ventas con IVA.

Se desconoce el número de ventas que se realizan en un día, por lo que el final de los datos se indica con un –1. Suponga que el IVA es del 15%.

5) Elabore un diagrama de flujo para leer n enteros, calcular e imprimir su suma y su promedio.

6) Una tabla de estadísticas muestra la producción de barriles de petróleo de 5 países petroleros (México, Venezuela, Arabia Saudita, Libia y Argelia), durante el primer semestre de 2001. La tabla tiene el siguiente formato:

bm, bv, bas, bl, ba: No de barriles/país en enero. bm, bv, bas, bl, ba: No de barriles/país en febrero. . . . bm, bv, bas, bl, ba: No. de barriles/país en junio.

Elabore un diagrama de flujo que calcule la producción total de barriles en el semestre y la de cada uno de los países involucrados.

7) Dados los datos: n, a1, a2,..., an con n > 0, Elabore un diagrama de flujo para encontrar el máximo de los ai.

8) Una empresa que cuenta con k empleados desea realizar algunos cálculos para la

nueva nómina. Los datos con que cuenta son los sueldos de los k empleados: k, s1, s2, s3, ..., sk.

Elabore un diagrama de flujo para leer los datos y contestar a las siguientes preguntas:

a. ¿Cuál es el aumento correspondiente a cada empleado según el siguiente

criterio?

17% si el sueldo es inferior a $5,000 10% si el sueldo está entre $5,000 y $15,000

Algoritmos y Programas Página 32

5% si el sueldo es superior a $15,000

b. ¿Cuál es el nuevo sueldo para cada empleado? c. ¿Cuál es el total de la nueva nómina? d. ¿Cuál es el incremento en la nómina? e. ¿Cuál es el máximo sueldo nuevo? f. ¿Cuál es el mínimo sueldo nuevo?

Resuelva los incisos progresivamente.

9) Una carrera profesional consta de 40 materias, repartidas en 8 semestres a razón

de 5 materias por semestre. Como datos se dan las 40 calificaciones correspondientes a un alumno, en grupos de 5 según el semestre:

c1, c2,..., c5 <- primer semestre c6, c7,..., c10 <- segundo semestre . . . . . c36, c37,..., c40 <- octavo semestre Elabore un diagrama de flujo para leer los datos y contestar a las siguientes preguntas:

a. ¿Cuál es el promedio del alumno por semestre? Indique tanto el promedio como el semestre.

b. ¿Cuál es el promedio que obtuvo en la carrera?

10) Dados los datos:

a1, b1, a2, b2,...., a32, b32 con n: entero, ≥ 1

ai: reales bi: enteros i = 1, 2, ..., 32

donde ai representa el ingreso del estado i de la República Mexicana y bi representa el número de habitantes que hay en ese mismo estado; Elabore un solo diagrama de flujo para:

a. Calcular el ingreso per cápita de cada estado:

32...,,2,1== iparab

aIPC

i

ii

b. Calcular el ingreso per cápita total de la República Mexicana:

=

== n

ii

n

ii

b

aIPCT

1

1

Algoritmos y Programas Página 33

11) Dados los valores: n, P1, P2,..., Pn con n ≥ 2, donde los Pt (t = 1,...,n) representan

los índices de precios al consumidor de varios años. Elabore un diagrama de flujo para calcular y escribir:

a. La tasa de inflación entre años consecutivos:

n2,3...,=t , 1-1

=t

tt P

PTI

b. La tasa media inflacionaria:

1

n

2=t

−=∑

n

TITM

t

12) Sean los datos: n, a1, a2,..., an

donde:

n n es un entero positivo, no necesariamente múltiplo de tres, que indica el número de elementos que el usuario va a ingresar, a continuación. ai números que el usuario ingresa.

Haga un diagrama de flujo para calcular la siguiente suma:

...3753753

7654321 +++++++ aaaaaaa

13) Dados los datos:

n, x, a0, a1, a2, ..., an con: n: entero, ≥ 0

x: real ai: reales

Elabore un diagrama de flujo que, sin utilizar la operación de potencia y minimizando el número de multiplicaciones, (y observando los signos), calcule: a0 – a1*x + a2* x

2 – a3 * x3 + . . . ± an * x

n

14) Un agricultor sembró en sus parcelas 4 tipos diferentes de jitomates. Cada tipo de jitomate puede ser sembrado en más de una parcela. Los datos referentes a la cosecha se dan a continuación: precioJit1, precioJit2, precioJit3, precioJit4 tipoJit1, numcajas1 tipoJit2, numcajas2

Algoritmos y Programas Página 34

tipoJit3, numcajas3 . . . -1, -1 Donde: precioJitj precio de la caja de jitomate tipo j tipoJiti tipo de jitomate (1, 2, 3 ó 4) sembrado en la parcela i numcajasi número de cajas cosechadas en la parcela i -1, -1 bandera de fin de datos No se sabe cuántas parcelas sembró el agricultor. Cada pareja de datos representa una parcela. Realice un diagrama de flujo para contestar lo siguiente: a) ¿Cuál es el número total de cajas cosechadas de cada uno de los 4 tipos

de jitomate? b) ¿En cuántas parcelas se sembró el jitomate tipo 2? c) ¿Qué tipo de jitomate dejó más dinero por su venta, suponiendo que todas

las cajas cosechadas se vendieron?

15) Las elecciones presidenciales están próximas a realizarse en México. Como es el segundo turno, solamente hay tres partidos diferentes (1, 2 y 3). Uno de los partidos desea realizar una encuesta a n personas para saber la estrategia a seguir.

A cada persona entrevistada se le pregunta:

si va a votar, en caso de que vote, por qué partido votará.

Elabore un diagrama de flujo para procesar esta encuesta. Los datos son: n resp1 (partido1) resp2 (partido2) . . . respn (partidon) Donde: n es el número de personas a entrevistar resp indica si la persona votará o no (0 = no votara, 1 = si votara) partido indica la clave del partido por el que votará (1=PAN, 2=PRD,

3=PRI) Nota: el dato partido solamente se lee si la persona entrevistada ha contestado que sí votará.

Algoritmos y Programas Página 35

Se desea contestar las siguientes preguntas:

a. ¿Cuál es el porcentaje de abstenciones? b. ¿Cuál es el porcentaje de votos a favor de cada partido en base al total de

personas que van a votar? c. ¿Cuál es el partido favorito?

16) Se cuenta con la siguiente información de ventas de un camión repartidor de gas

estacionario durante el mes de enero:

precio surtido1,1 , surtido1,2 , … , -1 surtido2,1 , surtido2,2 , … , -1 … surtido31,1 , surtido31,2 , … , -1 donde: precio es el precio de un litro de gas surtidoi,j es el número de litros de gas surtidos por el camión en su parada j del día i Realiza un diagrama de flujo que permita calcular: a) ¿Cuál fue el monto total (en pesos) de las ventas realizadas por el camión durante el mes de enero? b) ¿Cuál fue el día en el que surtió más litros de gas el camión? c) ¿Cuántos días no trabajo el camión? (líneas que sólo contienen –1) d) ¿Cuál fue el promedio de litros surtidos en cada día de trabajo?

17. El siguiente diagrama de flujo tiene un fin específico:

a) Interprételo, es decir, diga qué hace en forma breve y concisa. Pruébelo primero

con n = 10 y posteriormente con n = 456. b) Marque en el diagrama las estructuras algorítmicas usadas, indicando cuáles son.

Algoritmos y Programas Página 36

inicio

x 0

n > 0

k n mod 10 verdadero

x x * 10 + k

n n div 10

x

fin

falso

Nota: x, n y k son enteros

n

18. Considere los siguientes diagramas de flujo y para cada uno: indique sobre él las estructuras de control utilizadas, cuántas instrucciones contiene cada una de ellas y dibuja el mapa de memoria.

Algoritmos y Programas Página 37

a) Datos: 1 3 1 1 0

P

verdadero

n < 1 verdadero

falso

n = 1 verdadero

f ← 1 “f = 1”

falso

i ← 2

i ≤ n

f ← f * i

verdadero

i ← i + 1

falso

“n = “, n, “f = “, f

falso

F

v

v ≠ 0

n

v

Algoritmos y Programas Página 38

b) Datos: 2 5 3 0

P

n < 1

verdadero

n < 0

verdadero

falso i = n - 1

verdadero

s ← a + d * i

s

falso

i ← 0

i < n

verdadero

i ← i + 1

falso

falso

F

s, “ – “

n > 0 verdadero falso

n

a, d

n

Algoritmos y Programas Página 39

c) Datos: 1 3 1 2 0

P

v ≠ 0

verdadero

n < 2 verdadero

falso

n = 2 verdadero

a ← 0 d ← 1

0 1

falso

i ← 2

i ≤ n

m ← d a← d

d ← a + m

verdadero

i ← i + 1

falso

d

falso

F

v

n

v

Algoritmos y Programas Página 40

d) Dato: 5

P

n > 0

verdadero

i ≤ n

verdadero

falso

verdadero

p1 ← n – 2 * i p2 ← i

p1, p2, i

falso p2 + i ≤ n y

p1 ≥ p2

p1 ← p1 -1 p2← p2 + 1

i ← i + 1

“Error”

falso

F

i ← 0

n

Algoritmos y Programas Página 41

Apéndice 3 – Métodos de la clase String A continuación se presentan algunos de los métodos que provee Java para el manejo de datos tipo cadenas de caract eres (String).

/* Ejemplo de declaraciones de cadenas. Se usa la palabra reservada String (es el nombre de una clase de Java). */ String nombreCompleto, cad1, cad2; /* Declaración de variables auxiliares que se usarán para ejemplificar el empleo de los métodos provistos por Java para las cadenas de caracteres. */ char letra; int n; boolean band; // Concatenar o unir cadenas cad1 = cad1.concat(nombreCompleto); cad1 = cad1 + "algo más \n"; //Cálculo de la longitud de una cadena. Si está vacía regresa 0. n = cad1.length(); /* Regresa el caracter de la posición i. * En Java, el primer carácter ocupa la posición 0. */ letra = cad1.charAt(i); // Determina si el parámetro está al inicio de la cadena. band = cad1.startsWith("gato"); // Determina si el parámetro está al final de la cadena. band = cad1.endsWith(cad2); /* Obtiene la subcadena formada desde la posición i hasta la j-1. Si j es mayor que la longitud marca error. */ cad2 = cad1.substring(i, j); cad2 = cad1.substring(0, 3); //Caracteres de las posiciones 0, 1 y 2 // Determina si dos cadenas son iguales. band = cad1.equals(nombreCompleto); // Determina si dos cadenas son iguales sin importar las mayúsculas.

Algoritmos y Programas Página 42

band = cad1.equalsIgnoreCase("gato"); /* Si el parámetro está en la cadena regresa la posición de la primer ocurrencia. Si no lo encuentra regresa -1. */ n = cad1.indexOf("algo"); /* Si el parámetro está en la cadena regresa el índice de la última ocurrencia. Si no lo encuentra regresa -1. */ n = cad1.lastIndexOf("tos"); // Convierte un entero a una cadena. cad2 = Integer.toString(9); /* Regresa el número entero de la cadena -si ésta tuviera algún valor entero. Si no hay marca error. */ n = Integer.valueOf("90"); // Se asigna el contenido de una cadena a otra. cad2 = cad1; /* Compara las 2 cadenas: si cad1 < cad2 da negativo, si son iguales da 0 y sino positivo. */ n = cad1.compareTo(cad2); // Regresa la cadena con minúsculas -si tenía mayúsculas. cad2 = cad2.toLowerCase(); // Regresa la cadena con mayúsculas -si tenía minúsculas. cad1 = cad1.toUpperCase(); cad1= "Suerte en el examen"; // Reemplaza el primer caracter-parámetro por el segundo caracter-parámetro. cad1 = cad1.replace(" ", "");

Algoritmos y Programas Página 43

Apéndice 4 – Métodos de la clase Math A continuación se presentan algunos de los métodos que provee Java en la clase Math y que nos ayudan a escribir e xpresiones matemáticas complejas.

double valor; valor = Math.PI; // Valor de la constante PI valor = 90; System.out.println("\nEl seno es " + Math.sin(valor)); // Calcula seno de “valor” valor = Math.max(19, 8); // Regresa el máximo de los 2 valores dados. valor = Math.min(19, 8); // Regresa el mínimo de los 2 valores dados. valor = Math.pow(19,3); // Regresa el resultado de hacer 19 al cubo. valor = Math.round(9.3); // Redondea el número dado. valor = Math.sqrt(9); // Regresa la raíz cuadrada del valor dado. valor = Math. abs(-15.3); // Regresa el valor absoluto del valor dado.