Soluciones lección 005
Página 1 de 1.
Soluciones lección 005
Ejercicio 19 - Análisis:
Comenzaré ahora con el Ejercicio 19 ya que puede ser uno de los que más problemas presente, a mi en particular me costó mucho cuando tuve que realizarlo en mis tiempos. Lo que haré aquí es analizar la letra y el problema en sí, que es lo que uno siempre debe hacer, y me extenderé bastante con ello, luego les propondré que lo programen sin mirar el código solución que dejaré.
Por lo general, dado un problema uno se siente tentado a sentarse frente a la computadora (ordenador) y comenzar a escribir código, pero la mayoría de las veces es necesario primero analizar el problema hasta comprenderlo bien y lograr transformar un problema de índole general en un problema de programación.
La letra del ejercicio es la siguiente:
Se nos dice que como entrada se nos darán dos números enteros que representan timepos de la forma hhmm (horas y minutos), o sea que tendremos como entrada números enteros de cuatro cifras.
Si uno quiere representar mediante este formato la hora 15:30 simplemente escribe el entero 1530. Hasta ahí no hay problema. De este modo nos ingresarán dos enteros de cuatro cifras representando tiempos donde las horas serán menores a 24 y los minutos menores a 60, por lo tanto el mayor tiempo que podrían ingresarnos es 23:59, o sea, 2359 ¿lógico verdad?
Se nos pide que, luego de tener los ingresos, hagamos la suma de los mismos y mostremos la salida d hhmm (días, horas y minutos). Por ejemplo, si nos ingresaran en ambas entradas los valores 2359 tendríamos que sumar 23:59 + 23:59, lo cual da 1 23:58, o sea, 1 día con 23 horas y 58 minutos.
La representación de este valor según la letra sería 1 2358.
Ahora bien ¿si a nosotros nos ingresan los enteros 2359 y 2359 como obtenemos el 1 2358?
Vean lo siguiente, dados dos valores, hhmm y h'h'm'm' que pueden ser distintos, para sumarlos, primero sumo los minutos, o sea
mm + m'm'
Si ese valor me da menor a 60 entonces ya tengo los minutos correspondientes al resultado. Por ejemplo, si hhmm es 1005 y h'h'm'm' es 1210, la suma mm + m'm' equivale a hacer 05 + 10 lo cual da 15. Ese valor es menor a 60 con lo cual corresponde a los minutos del resultado.
Salta a la vista que 10:05 + 12:10 va a dar 22:15, pero analicemos todo paso por paso.
Ya tenemos los minutos, ahora vayamos con las horas. Tengo que sumar
hh + h'h' lo que equivale a sumar 10 + 12 que es 22. Si hh + h'h' da menor a 24 ya tenemos las horas del resultado, como en este caso que dio 22.
Entonces el resultado total es 2215, que para la representación pedida sería 0 2215, donde ven que d vale 0 porque no se llegó a un día completo.
--------------
Veamos que pasa cuando la suma de los minutos es mayor que 60:
Supongan que se ingresa la entrada 1005 y 1259, o sea, el equivalente a 10:05 y 12:59. La suma de esto da 23:04 ¿están de acuerdo?
Veamos, al sumar mm + m'm' o sea, 05 + 59 obtenemos el resultado 64. Pero este valor es mayor que 60 por lo tanto no podemos ponerlo en el resultado porque no existen horas con 64 minutos ¿si?
Lo que hacemos entonces es restar 60 al resultado de mm + m'm', o sea, en este caso sería 64 - 60, lo cual da 4.
Ahora ya tenemos los minutos de nuestro resultado.
Sin embargo ¿qué pasó con los 60 minutos que restamos? Pues suman 1 hora completa, por lo tanto a la suma hh + h'h' debemos agregarle esa hora, con lo cual nuestra suma sería hh + h'h' + 1.
En este caso sería 10 + 12 + 1 lo cual da 23.
Ahora tenemos el resultado 2304.
¿Y si las horas se pasan de 24? Es la misma idea, supongan la entrada 1259 y 1259, al sumar los minutos (59 + 59) obtengo el valor 118, como es mayor que 60 debo restarle justamente 60, entonces hago 118 - 60 lo cual me da 58 obteniendo así los minutos correspondientes al resultado.
Ahora sumo las horas, 12 + 12, pero como tengo una hora más que corresponde a los 60 minutos restados, la suma es 12 + 12 + 1 que me da como resultado 25. Sin embargo no existen días de 25 horas, por lo tanto hago el mismo razonamiento y resto 25 - 24 (ahora no resto 60 porque un día tiene 24 horas) y obtengo las horas del resultado, en este caso 01.
Entonces tengo las horas y los minutos, o sea, 0158 ¿Y las 24 horas restadas? Pues como 24 horas equivalen a un día le asigno ese valor a d, o sea, 1. Por tanto, el resultado total es
1 0158, 1 día con 1 hora y 58 minutos.
------------------------
En resumen: Teniendo los valores hhmm y h'h'm'm' para sumarlos tengo que ver si al sumar los minutos me da más de 60, y si al sumar las horas me da más de 24 teniendo en cuenta si tengo que agregar 1 hora más en caso de que los minutos fueran más de 60.
-------------------------------------------------------------------------------------
Si han comprendido todo esto, que más bien ha sido mucha parla, vallamos al problema de programarlo:
En primera instancia recibiremos de la entrada estándar dos número de cuatro cifras, el hhmm y el h'h'm'm'. Nosotros debemos sumar estas cifras por separado, como ya dije. O sea, sumamos
mm + m'm' y hh + h'h'.
Esto nos trae el primer problema: Desglosar los números de cuatro cifras en números de dos cifras. En sí esto es fácil: Si tengo el número 2564 y quiero tener por un lado el 25 y por otro el 64 aplico DIV y MOD como expliqué antes:
Ahora, la cuestión es la siguiente: Puedo desglosar los números, pero al intentar sumar las partes, tengo que tomar casos. Por ejemplo, si la suma de minutos es menor a 60 simplemente sumo y ya, pero si da mayor o igual a 60 debo hacer una resta y además agregar una hora más a las horas. Pero en esta lección no dimos sentencias de selección, solo una breve introducción. Además no es la idea utilizarlas para estos ejercicios.
¿Entonces qué hago? Pues lo que se debe hacer es desarrollar una fórmula general que sirva para todos los casos, o sea, si los minutos suman más de 60 o no, si las horas suman más de 25 o no; poder utilizar esa fórmula indistintamente y que los resultados den correctos.
Analicemos lo siguiente: Supongan que al sumar los minutos tenemos un resultado menor a 60, por ejemplo 13.
Si hacemos 13 DIV 60 obtenemos 0 como resultado.
Si hacemos 13 MOD 60 obtenemos 13 como resultado.
En este caso 13 sería el valor de minutos para el resultado total porque es menor que 60, tal y como expliqué antes. Dado esto, no debemos sumar nada a las horas, o dicho de otra forma, le sumamos 0 a las horas.
Ahora imaginen que la suma de minutos dio más que 60, ejemplo 118 que es el valor más grande que podemos obtener.
Si hacemos 118 DIV 60 obtenemos 1 como resultado.
Si hacemos 118 MOD 60 obtenemos 48 como resultado.
En este caso, para obtener el valor de los minutos para el resultado total deberíamos hacer 118 - 60 lo cual da 48.
Además deberíamos sumarle 1 a las horas por los 60 minutos que perdimos en la resta.
*** Si prestan atención, en ambos casos, sea que la suma de minutos da mayor a 60 o no, si usamos DIV obtenemos el resultado que debemos sumar a las horas, y si usamos MOD obtenemos el valor para nuestro resultado final.
Por lo tanto, si el resultado de sumar hhmm con h'h'm'm' da d HHMM, deducimos que
MM= (mm + m'm') MOD 60
----------------------------------------
Para las horas pasa lo mismo. Si el resultado de sumar hh + h'h' es mayor a 24 o no, si hacemos ese valor MOD 24 obtenemos el resultado final y si hacemos ese valor DIV 24 obtenemos el valor que debe obtener d. Además hay que tener en cuanta si los minutos dieron mayores a 60 o no, pero esto se resolvía haciendo DIV de ese valor entre 60. Entonces
HH= (hh + h'h') MOD 24 + (mm + m'm') DIV 60
d= (hh + h'h') DIV 24
Entonces ya tengo las tres fórmulas que resuelven este problema para todos los casos.
Si han comprendido esto, les pido que realicen ahora este programa.
----------------------------------------------------------------------------------
Ejercicio 19 - Solución:
Veamos el código entonces:
¿Qué está sucediendo? Corríjanlo como tarea.
Este error fue encontrado por un lector de otra comunidad hace a bastante tiempo e incluso lo corrigió, por eso me parece buena idea que ustedes intenten mejorarlo a mano.
=========================================================================
Ejercicio 20
Ejercicio 21
Este ejercicio es sumamente sencillo. Se nos pide elevar un número de dos cifras al cuadrado y luego obtener el número medio de esa cifra.
Los números de dos cifras posibles van desde el 10 al 99.
En el ejemplo se muestra el 53, cuyo cuadrado da 2809. Nosotros debemos desglosar ese número para obtener el 80.
Una incógnita que se puede plantear en este ejercicio y que no está explicada en la letra, es si el cuadrado del número inicial no da un número de cuatro cifras.
Por ejemplo, podríamos tener el 11 como número inicial, al elevarlo al cuadrado daría 121. En ese caso lo más correcto sería tomar el 2 como siguiente número. Sin embargo esto no sirve por dos cosas:
**El número 2 no es un número de dos cifras por lo cual su cuadrado dará un número pequeño que como máximo tendrá dos cifras (si por ejemplo tuviéramos el 7), lo cual no haría posible utilizar el método presentado en la letra.
**No es posible crear una única fórmula que, dado un número de cuatro cifras obtenga su número medio, y a su vez, dado un número de tres cifras nos de su medio. Esto sería posible utilizando SELECCIÓN mediante instrucciones IF, pero no se ven en esta lección (solo una intro) por lo cual no las usaremos.
Dadas estas dos situaciones, al tener un número de dos cifras y elevarlo al cuadrado asumiremos siempre que su resultado es de cuatro cifras. Por ejemplo, para el 53 su cuadrado es 2809, eso no da problemas; pero para el 11 su cuadrado es 121, nosotros lo miraremos entonces como el 0121 por lo cual nos quedaremos con el 12 como resultado.
------------------------------
Teniendo un número de cuatro cifras cualquiera, ejemplo abcd donde a, b, c y d son sus cifras, para obtener su número medio hacemos lo siguiente:
abcd DIV 10= abc, entonces deberíamos hacer abc MOD 100 para obtener bc.
De este modo, como fórmula general, nos queda (abcd DIV 10) MOD 100 y listo, ya tenemos nuestro número medio.
-------------------------------
Solución
Ejercicio 22
Este programa tampoco supone un desafío, sin embargo puede que existan conceptos que algunos no conozcan.
Teniendo un número natural, por ejemplo el 5, el factorial de 5, que se anota como 5! se calcula así: 5*4*3*2*1.
Si en vez de 5 tuviéramos el 11, entonces
11!= 11*10*9*8*7*6*5*4*3*2*1.
Además también se define que 0!= 1 siempre.
De este modo, en la letra del ejercicio aparecen los números:
1! que es igual a 1.
2! que es igual a 2*1, o sea, 2.
3! que es igual a 3*2*1, o sea, 6.
4! que es igual a 4*3*2*1, o sea, 24.
-------------------------
En la letra del ejercicio nos dan la fórmula:
1 + [x/ 1!] + [(x2)/ 2!] + [(x3)/ 3!] + [(x4)/ 4!]
que dados los resultados de más arriba queda así
1 + (x/1) + ((x2)/2) + ((x3)/6) + ((x4)/24)
Nos dan una fórmula, solo debemos implementarla en pascal, cosa bien sencilla a estas alturas.
Solución
==========================================================================
EJERCICIO 23
NOTA: En este ejercicio se asume que todos saben que hallar la raíz cuadrada de un número es lo mismo que elevarlo con exponente 0,5.
================================================================
EJERCICIO 24
Este ejercicio no implica dificultades, el problema puede estar en comprender la letra. Básicamente se pide desglosar un número de tres cifras y aplicar la fórmula dada. De este modo, una solución sería esta:
Con esto quedan publicadas todas las soluciones de la Lección 5.
Comenzaré ahora con el Ejercicio 19 ya que puede ser uno de los que más problemas presente, a mi en particular me costó mucho cuando tuve que realizarlo en mis tiempos. Lo que haré aquí es analizar la letra y el problema en sí, que es lo que uno siempre debe hacer, y me extenderé bastante con ello, luego les propondré que lo programen sin mirar el código solución que dejaré.
Por lo general, dado un problema uno se siente tentado a sentarse frente a la computadora (ordenador) y comenzar a escribir código, pero la mayoría de las veces es necesario primero analizar el problema hasta comprenderlo bien y lograr transformar un problema de índole general en un problema de programación.
La letra del ejercicio es la siguiente:
Veamos entonces de qué se nos está hablando:Ejercicio 19 escribió:
En los datos de entrada se proporcionan dos tiempos como enteros de la forma hhmm
donde hh representa las horas (menos de 24) y mm los minutos (menos de 60).
Determine la suma de estos dos tiempos, y exhiba el resultado en la forma d hhmm,
donde d es días, ya sea cero o uno.
Ejemplo de entrada : 1345 2153.
Ejemplo de salida : 1 1138.
Se nos dice que como entrada se nos darán dos números enteros que representan timepos de la forma hhmm (horas y minutos), o sea que tendremos como entrada números enteros de cuatro cifras.
Si uno quiere representar mediante este formato la hora 15:30 simplemente escribe el entero 1530. Hasta ahí no hay problema. De este modo nos ingresarán dos enteros de cuatro cifras representando tiempos donde las horas serán menores a 24 y los minutos menores a 60, por lo tanto el mayor tiempo que podrían ingresarnos es 23:59, o sea, 2359 ¿lógico verdad?
Se nos pide que, luego de tener los ingresos, hagamos la suma de los mismos y mostremos la salida d hhmm (días, horas y minutos). Por ejemplo, si nos ingresaran en ambas entradas los valores 2359 tendríamos que sumar 23:59 + 23:59, lo cual da 1 23:58, o sea, 1 día con 23 horas y 58 minutos.
La representación de este valor según la letra sería 1 2358.
Ahora bien ¿si a nosotros nos ingresan los enteros 2359 y 2359 como obtenemos el 1 2358?
Vean lo siguiente, dados dos valores, hhmm y h'h'm'm' que pueden ser distintos, para sumarlos, primero sumo los minutos, o sea
mm + m'm'
Si ese valor me da menor a 60 entonces ya tengo los minutos correspondientes al resultado. Por ejemplo, si hhmm es 1005 y h'h'm'm' es 1210, la suma mm + m'm' equivale a hacer 05 + 10 lo cual da 15. Ese valor es menor a 60 con lo cual corresponde a los minutos del resultado.
Salta a la vista que 10:05 + 12:10 va a dar 22:15, pero analicemos todo paso por paso.
Ya tenemos los minutos, ahora vayamos con las horas. Tengo que sumar
hh + h'h' lo que equivale a sumar 10 + 12 que es 22. Si hh + h'h' da menor a 24 ya tenemos las horas del resultado, como en este caso que dio 22.
Entonces el resultado total es 2215, que para la representación pedida sería 0 2215, donde ven que d vale 0 porque no se llegó a un día completo.
--------------
Veamos que pasa cuando la suma de los minutos es mayor que 60:
Supongan que se ingresa la entrada 1005 y 1259, o sea, el equivalente a 10:05 y 12:59. La suma de esto da 23:04 ¿están de acuerdo?
Veamos, al sumar mm + m'm' o sea, 05 + 59 obtenemos el resultado 64. Pero este valor es mayor que 60 por lo tanto no podemos ponerlo en el resultado porque no existen horas con 64 minutos ¿si?
Lo que hacemos entonces es restar 60 al resultado de mm + m'm', o sea, en este caso sería 64 - 60, lo cual da 4.
Ahora ya tenemos los minutos de nuestro resultado.
Sin embargo ¿qué pasó con los 60 minutos que restamos? Pues suman 1 hora completa, por lo tanto a la suma hh + h'h' debemos agregarle esa hora, con lo cual nuestra suma sería hh + h'h' + 1.
En este caso sería 10 + 12 + 1 lo cual da 23.
Ahora tenemos el resultado 2304.
¿Y si las horas se pasan de 24? Es la misma idea, supongan la entrada 1259 y 1259, al sumar los minutos (59 + 59) obtengo el valor 118, como es mayor que 60 debo restarle justamente 60, entonces hago 118 - 60 lo cual me da 58 obteniendo así los minutos correspondientes al resultado.
Ahora sumo las horas, 12 + 12, pero como tengo una hora más que corresponde a los 60 minutos restados, la suma es 12 + 12 + 1 que me da como resultado 25. Sin embargo no existen días de 25 horas, por lo tanto hago el mismo razonamiento y resto 25 - 24 (ahora no resto 60 porque un día tiene 24 horas) y obtengo las horas del resultado, en este caso 01.
Entonces tengo las horas y los minutos, o sea, 0158 ¿Y las 24 horas restadas? Pues como 24 horas equivalen a un día le asigno ese valor a d, o sea, 1. Por tanto, el resultado total es
1 0158, 1 día con 1 hora y 58 minutos.
------------------------
En resumen: Teniendo los valores hhmm y h'h'm'm' para sumarlos tengo que ver si al sumar los minutos me da más de 60, y si al sumar las horas me da más de 24 teniendo en cuenta si tengo que agregar 1 hora más en caso de que los minutos fueran más de 60.
-------------------------------------------------------------------------------------
Si han comprendido todo esto, que más bien ha sido mucha parla, vallamos al problema de programarlo:
En primera instancia recibiremos de la entrada estándar dos número de cuatro cifras, el hhmm y el h'h'm'm'. Nosotros debemos sumar estas cifras por separado, como ya dije. O sea, sumamos
mm + m'm' y hh + h'h'.
Esto nos trae el primer problema: Desglosar los números de cuatro cifras en números de dos cifras. En sí esto es fácil: Si tengo el número 2564 y quiero tener por un lado el 25 y por otro el 64 aplico DIV y MOD como expliqué antes:
- Código:
2564 DIV 100 = 25
2564 MOD 100= 64
Ahora, la cuestión es la siguiente: Puedo desglosar los números, pero al intentar sumar las partes, tengo que tomar casos. Por ejemplo, si la suma de minutos es menor a 60 simplemente sumo y ya, pero si da mayor o igual a 60 debo hacer una resta y además agregar una hora más a las horas. Pero en esta lección no dimos sentencias de selección, solo una breve introducción. Además no es la idea utilizarlas para estos ejercicios.
¿Entonces qué hago? Pues lo que se debe hacer es desarrollar una fórmula general que sirva para todos los casos, o sea, si los minutos suman más de 60 o no, si las horas suman más de 25 o no; poder utilizar esa fórmula indistintamente y que los resultados den correctos.
Analicemos lo siguiente: Supongan que al sumar los minutos tenemos un resultado menor a 60, por ejemplo 13.
Si hacemos 13 DIV 60 obtenemos 0 como resultado.
Si hacemos 13 MOD 60 obtenemos 13 como resultado.
En este caso 13 sería el valor de minutos para el resultado total porque es menor que 60, tal y como expliqué antes. Dado esto, no debemos sumar nada a las horas, o dicho de otra forma, le sumamos 0 a las horas.
Ahora imaginen que la suma de minutos dio más que 60, ejemplo 118 que es el valor más grande que podemos obtener.
Si hacemos 118 DIV 60 obtenemos 1 como resultado.
Si hacemos 118 MOD 60 obtenemos 48 como resultado.
En este caso, para obtener el valor de los minutos para el resultado total deberíamos hacer 118 - 60 lo cual da 48.
Además deberíamos sumarle 1 a las horas por los 60 minutos que perdimos en la resta.
*** Si prestan atención, en ambos casos, sea que la suma de minutos da mayor a 60 o no, si usamos DIV obtenemos el resultado que debemos sumar a las horas, y si usamos MOD obtenemos el valor para nuestro resultado final.
Por lo tanto, si el resultado de sumar hhmm con h'h'm'm' da d HHMM, deducimos que
MM= (mm + m'm') MOD 60
----------------------------------------
Para las horas pasa lo mismo. Si el resultado de sumar hh + h'h' es mayor a 24 o no, si hacemos ese valor MOD 24 obtenemos el resultado final y si hacemos ese valor DIV 24 obtenemos el valor que debe obtener d. Además hay que tener en cuanta si los minutos dieron mayores a 60 o no, pero esto se resolvía haciendo DIV de ese valor entre 60. Entonces
HH= (hh + h'h') MOD 24 + (mm + m'm') DIV 60
d= (hh + h'h') DIV 24
Entonces ya tengo las tres fórmulas que resuelven este problema para todos los casos.
Si han comprendido esto, les pido que realicen ahora este programa.
----------------------------------------------------------------------------------
Ejercicio 19 - Solución:
Veamos el código entonces:
- Código:
PROGRAM Leccion5Ejercicio19;
VAR
tiempo1, tiempo2: INTEGER; //Los tiempos a ser leídos desde la entrada.
min1, min2, hs1, hs2, d, MM, HH: INTEGER;
(*Las variables min1 y min2 son para guardar los minutos de tiempo1 y
tiempo2 respectivamente. Las variables hs1 y hs2 son para guardar las
horas de tiempo1 y tiempo2 respectivamente. La variable d es justamente d.
Las varialbes MM y HH son para guardar las horas y los minutos del tiempo resutlante de la suma entre tiempo1 y tiempo2*)
BEGIN
Write('Ingrese los tiempos a sumar: '); //Mensaje para el usuario.
ReadLn(tiempo1,tiempo2); //Leemos ambos tiempos a la vez.
min1:= tiempo1 MOD 100; //Desgloso tiempo1 y obtengo sus minutos.
hs1:= tiempo1 DIV 100; //Desgloso tiempo1 y obtengo sus horas.
min2:= tiempo2 MOD 100;
hs2:= tiempo2 DIV 100;
(*Ahora calcularemos MM, HH y d según las fórmulas desarrolladas
en el análisis que les dí de este ejercicio*)
MM:= (min1 + min2) MOD 60;
HH:= (hs1 + hs2) MOD 24 + (min1 + min2) DIV 60;
d:= (hs1 + hs2) DIV 24;
(*Mostramos los resultados en pantalla según el formato pedido*)
WriteLn; //Dejo una línea en blanco.
Write(d,' ',HH,MM);
ReadLn; //Un READLN para detener el programa y poder ver lo mostrado.
END.
¿Qué está sucediendo? Corríjanlo como tarea.
Este error fue encontrado por un lector de otra comunidad hace a bastante tiempo e incluso lo corrigió, por eso me parece buena idea que ustedes intenten mejorarlo a mano.
=========================================================================
Ejercicio 20
Solución:Letra del Ejercicio 20 escribió:
El error relativo en una medición m es la razón de la diferencia absoluta entre
la medición y el valor verdadero v al valor verdadero. Suponga que los datos de entrada
se dan en una sola línea que incluye dos números reales que representan la medición m
y el valor verdadero v. Calcule el error relativo de la medición y exhíbase junto con la medición y el valor verdadero.
Incluya etiquetas descriptivas para los valores exhibidos.
Ejemplo de entrada : 51.0 51.3.
Ejemplo de salida : Medición = 5.1000000000e+01
Valor verdadero = 5.1300000000e+01 \\ Error relativo = 5.8479532164e-0003.
- Código:
PROGRAM Leccion5Ejercicio20;
VAR
medicion, valorVerdadero, errorRelativo: REAL;
BEGIN
Write('Ingrese la medición y el valor verdadero: ');
ReadLn(medicion,valorVerdadero); //Leemos los datos solicitados.
WriteLn; //Dejamos una línea en blanco.
(*El error relativo, según la letra del ejercicio, se calcula como
el valor absoluto de la resta entre la medición y el valor verdadero.
Dado un número, el valor absoluto se calcula mediente ABS. Eso fue dado
en la Lección 4*)
errorRelativo:= abs(medicion-valorVerdadero);
WriteLn('Medición = ',medicion);
Write('Valor verdadero = ',valorVerdadero,' \\ Error relativo = ',errorRelativo);
ReadLn;
(*NOTA: En la letra del ejercicio hay una errata al mostrar los datos de salida.*)
END.
Ejercicio 21
Análisis breveLetra escribió:No es posible utilizar una computadora para generar números aleatorios genuinos ya que es preciso
utilizar un algoritmo para generar los números, lo que implica que es posible predecir los números
generados. Lo que sí pueden hacer las computadoras es generar números seudoaleatorios (números que,
estadísticamente, parecen ser aleatorios). Una técnica antigua que no produce buenos resultados
se llama método del cuadrado medio. Funciona así : dado un número a, para generar el siguiente
número de la secuencia se extraen los dígitos que están en medio de a2. Por ejemplo, si a es 53,
entonces a2 es 2809, y el siguiente número seudoaleatorio será 80. Se ve que el siguiente número
seudoaleatorio a 80 es 40. Si se continúa este proceso se obtiene 60, 60, 60, ….
Escriba un programa en Pascal que lea un entero de dos dígitos y determine el siguiente número
seudoaleatorio que se generaría si se usara el método del cuadrado medio.
Suponga que la entrada consta de una sola línea que contiene al entero de dos dígitos.
Exhiba el número de dos dígitos original, el cuadrado de este entero, y el siguiente número,
todos con etiquetas apropiadas.
Ejemplo de entrada : 53.
Ejemplo de salida : Numero introducido = 53
Cuadrado del numero = 2809
Siguiente numero seudoaleatorio = 80.
Este ejercicio es sumamente sencillo. Se nos pide elevar un número de dos cifras al cuadrado y luego obtener el número medio de esa cifra.
Los números de dos cifras posibles van desde el 10 al 99.
En el ejemplo se muestra el 53, cuyo cuadrado da 2809. Nosotros debemos desglosar ese número para obtener el 80.
Una incógnita que se puede plantear en este ejercicio y que no está explicada en la letra, es si el cuadrado del número inicial no da un número de cuatro cifras.
Por ejemplo, podríamos tener el 11 como número inicial, al elevarlo al cuadrado daría 121. En ese caso lo más correcto sería tomar el 2 como siguiente número. Sin embargo esto no sirve por dos cosas:
**El número 2 no es un número de dos cifras por lo cual su cuadrado dará un número pequeño que como máximo tendrá dos cifras (si por ejemplo tuviéramos el 7), lo cual no haría posible utilizar el método presentado en la letra.
**No es posible crear una única fórmula que, dado un número de cuatro cifras obtenga su número medio, y a su vez, dado un número de tres cifras nos de su medio. Esto sería posible utilizando SELECCIÓN mediante instrucciones IF, pero no se ven en esta lección (solo una intro) por lo cual no las usaremos.
Dadas estas dos situaciones, al tener un número de dos cifras y elevarlo al cuadrado asumiremos siempre que su resultado es de cuatro cifras. Por ejemplo, para el 53 su cuadrado es 2809, eso no da problemas; pero para el 11 su cuadrado es 121, nosotros lo miraremos entonces como el 0121 por lo cual nos quedaremos con el 12 como resultado.
------------------------------
Teniendo un número de cuatro cifras cualquiera, ejemplo abcd donde a, b, c y d son sus cifras, para obtener su número medio hacemos lo siguiente:
abcd DIV 10= abc, entonces deberíamos hacer abc MOD 100 para obtener bc.
De este modo, como fórmula general, nos queda (abcd DIV 10) MOD 100 y listo, ya tenemos nuestro número medio.
-------------------------------
Solución
- Código:
PROGRAM Leccion5Ejercicio21;
VAR
a, cuadrado, cuadradoMedio: INTEGER;
(*He definido una variable para cada valor a guardar.
Este ejercicio puede hacerse con menos variables, pero lo
he hecho así para que les quede bien claro cada punto tratado.*)
BEGIN
Write('Ingrese un entero de dos dígitos: ');
ReadLn(a);
cuadrado:= sqr(a);
(*Utilicé la función SQR para calcualr el cuadrado de a.
Esto equivale a hacer a*a *)
cuadradoMedio:= (cuadrado DIV 10) MOD 100;
(*Calcule el cuadrado medio según la fórmula que detallé*)
WriteLn; //Dejo una línea en blanco.
WriteLn('Número introducido = ',a);
WriteLn('Cuadrado del número = ',cuadrado);
WriteLn('Siguiente número seudoaleatorio = ',cuadradoMedio);
ReadLn; //Solo para detener el programa. Luego debe ser borrada.
END.
Ejercicio 22
AclaracionesLetra escribió:La función exp de Pascal calcula un valor igual a la suma de la serie infinita
1 + [x/ 1!] + [(x^2)/ 2!] + [(x^3)/ 3!] + [(x^4)/ 4!]. Suponga que los datos de entrada consisten en un solo valor real para x entre 0.0 y 1.0.
Determine la suma de los primeros cinco términos de la serie infinita y el valor de exp(x)
mediante la función estándar.
Exhiba estos valores y el valor de x acompañados de etiquetas apropiadas.
Ejemplo de entrada : 0.5.
Ejemplo de salida : Valor introducido = 5.0000000000e-01
Suma de la serie = 1.648437619e+00
Exp (x) = 1.6487212707e+00.
Este programa tampoco supone un desafío, sin embargo puede que existan conceptos que algunos no conozcan.
Teniendo un número natural, por ejemplo el 5, el factorial de 5, que se anota como 5! se calcula así: 5*4*3*2*1.
Si en vez de 5 tuviéramos el 11, entonces
11!= 11*10*9*8*7*6*5*4*3*2*1.
Además también se define que 0!= 1 siempre.
De este modo, en la letra del ejercicio aparecen los números:
1! que es igual a 1.
2! que es igual a 2*1, o sea, 2.
3! que es igual a 3*2*1, o sea, 6.
4! que es igual a 4*3*2*1, o sea, 24.
-------------------------
En la letra del ejercicio nos dan la fórmula:
1 + [x/ 1!] + [(x2)/ 2!] + [(x3)/ 3!] + [(x4)/ 4!]
que dados los resultados de más arriba queda así
1 + (x/1) + ((x2)/2) + ((x3)/6) + ((x4)/24)
Nos dan una fórmula, solo debemos implementarla en pascal, cosa bien sencilla a estas alturas.
Solución
- Código:
PROGRAM Leccion5Ejercicio22;
VAR
x, expX: REAL; //x será el valor leído, expX será el cálculo que haremos.
BEGIN
Write('Ingresa un real: ');
ReadLn(x);
WriteLn;
expX:= 1 + (x/1) + (sqr(x)/2) + (sqr(x)*x/6) + (sqr(x)*sqr(x)/24);
(*Lean bien esta expresión*)
WriteLn('Valor introducido = ',x);
WriteLn('Suma de la sere = ',expX);
WriteLn('Exp(x) = ',exp(x));
ReadLn;
END.
==========================================================================
EJERCICIO 23
Solución del ejercicio 6 de la lección 4Letra escribió:Ejercicio 23
Con el resultado del ejercicio 6 de la lección 4, escribe un programa para determinar la raíz cuadrada de un número positivo a mediante el cálculo de a0.5.
La entrada consistirá en una sola línea conteniendo el número real a.
Exhíba a, a0.5, y sqrt(a) con etiquetas apropiadas.
Ejemplo de entrada : 12.7.
Ejemplo de salida : Valor introducido = 1.2700000000e+00
Raiz cuadrada calculada = 3.5637059362e+00
Raiz cuadrada de Pascal = 3.5637059362e+00.
Se nos pide simplemente aplicar esto al nuevo ejercicio, lo cual es bien sencillo, ya que en vez de leer el exponente, esta vez lo tenemos dado.Solución Ejercicio 6 escribió:
- Código:
PROGRAM Leccion4Ejercicio6;
VAR
a, b: real; //Una variable para la base y otra para el exponente.
potencia: real;
{Una variable para el resultado de la potencia.
La variable potencia no sería necesaria en absoluto
ya que podemos calcular ese valor directamente al mostrarlo
en pantalla. La he colocado para que se vea mejor el cálculo}
BEGIN
write('Ingrese la base y el exponente: ');
readln(a,b);
writeln; //Dejo una línea en blanco.
potencia:= exp(b*ln(a)); //Calculamos el valor de la potencia.
writeln('El resultado de ',a:1:2,'^',b:1:2,' es: ',potencia:1:2);
END.
NOTA: En este ejercicio se asume que todos saben que hallar la raíz cuadrada de un número es lo mismo que elevarlo con exponente 0,5.
- Código:
PROGRAM Leccion5Ejercicio23;
CONST
EXPONENTE= 0.5;
(*Como el valor del exponente es 0.5 siempre,
utilizo una constante para nombrarlo*)
VAR
a: REAL; //El número a hallar la raíz cuadrada.
raiz: REAL; //Una variable para el cálculo de la raíz.
(*NOTA: La variable raiz no es necesaria, la incluyo
para que el programa les resulte más claro*)
BEGIN
write('Ingrese un número: ');
readln(a);
raiz:= exp(EXPONENTE*LN(a));
(*Hacemos la potencia con la formula usada en el
Ejercicio 6 de la Lección 4*)
writeln; //Dejamos una línea en blanco.
writeln('Valor introducido: ',a);
writeln('Raiz cuadrada calculada: ',raiz);
writeln('Raiz cuadrada de Pascal: ',sqrt(a));
readln;
END.
- Código:
PROGRAM Leccion5Ejercicio23;
CONST
EXPONENTE= 0.5;
(*Como el valor del exponente es 0.5 siempre,
utilizo una constante para nombrarlo*)
VAR
a: REAL; //El número a hallar la raíz cuadrada.
BEGIN
write('Ingrese un número: ');
readln(a);
writeln; //Dejamos una línea en blanco.
writeln('Valor introducido: ',a);
writeln('Raiz cuadrada calculada: ',exp(EXPONENTE*ln(a)));
writeln('Raiz cuadrada de Pascal: ',sqrt(a));
readln;
END.
================================================================
EJERCICIO 24
Letra escribió:Escriba un programa que tenga como única entrada un número octal (base ocho) de tres dígitos.
Exhiba el número octal original y el número equivalente en base 10.
Por ejemplo, el número octal de tres dígitos 415 equivale al valor decimal
4 ×82 + 1 ×81 + 5 ×80, o sea, 269.
Recuerde que Pascal considerará el número introducido como número decimal.
Ejemplo de entrada : 217.
Ejemplo de salida : Octal 217 = Decimal 143.
Este ejercicio no implica dificultades, el problema puede estar en comprender la letra. Básicamente se pide desglosar un número de tres cifras y aplicar la fórmula dada. De este modo, una solución sería esta:
- Código:
PROGRAM Leccion5Ejercicio24;
CONST
base= 8; //La base usada para el cálculo según la letra.
VAR
entrada: INTEGER; //El número que leemos en la entrada.
a, b, c: INTEGER; //Cada uno de los dígitos del número leído.
decimal: INTEGER; //El número decimal calculado según la fórmula de la letra.
BEGIN
Write('Ingrese un número entero: ');
readln(entrada);
(*Ahora desglosamos el número en sus dígitos*);
a:= entrada MOD 10;
b:= (entrada DIV 10) MOD 10;
c:= entrada DIV 100;
(*Calculamos el valor decimal según la fórmula de la letra*)
decimal:= c*sqr(base) + b*base + a;
(*Mostramos los resultados en pantalla tal como se pide en la letra*)
writeln; //Dejo una línea en blanco.
writeln('Octal ',entrada,' = Decimal ',decimal);
readln;
END.
Con esto quedan publicadas todas las soluciones de la Lección 5.
Temas similares
» Soluciones lección 011
» Soluciones lección 014 a 017
» Soluciones lección 006
» Soluciones lección 007
» Soluciones lección 009
» Soluciones lección 014 a 017
» Soluciones lección 006
» Soluciones lección 007
» Soluciones lección 009
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.