You are on page 1of 13

PONTIFICIA UNIVERSIDAD CATÓLICA DEL PERÚ

ESTUDIOS GENERALES CIENCIAS

FUNDAMENTOS DE PROGRAMACIÓN
Problemas para la sesión 8

Todos los horarios

1. Producto de Wallis (Adaptado de 2019-0–E2–P3)


El cálculo del número π siempre ha sido una tarea desafiante. Para este fin se han utilizado distintas
series como la de Gregory, Newton, Sharp, Euler, entre otras. En 1655, Jhon Wallis descubrió una pro-
ductoria (conocida como el producto de Wallis) que aproxima el valor de π2 .

El producto de Wallis establece que:



Y 2n 2n 2 2 4 4 6 6 8 8 π
( · ) = · · · · · · · ··· =
2n − 1 2n + 1 1 3 3 5 5 7 7 9 2
n=1

Utilizando el producto de Wallis se puede calcular fácilmente el valor de π. A medida que se incrementa
el número de términos de la productoria, se obtienen valores de π con menor error de aproximación. Se
le pide que elabore un algoritmo expresado en pseudocódigo y un programa en lenguaje C que solicite la
cantidad de términos con la que desea calcular el producto de Wallis, determine el valor aproximado de π
e indique el error absoluto si es que se sabe que el valor de π con 10 dı́gitos decimales es 3.1415926535. En
caso el usuario ingrese una cantidad de términos menor o igual a cero, deberá emitir el siguiente mensaje
de error La cantidad de términos debe ser mayor que cero.

Recuerde que:

El error absoluto se define como la diferencia entre el


valor real y el valor aproximado o calculado, en valor
absoluto.

e = |valor real − valor calculado|

Casos de prueba para verificación de solución

Use los siguiente casos para verificar si su solución está correcta.

# términos π calculado error absoluto


1 ≈ 2.6666666667 ≈ 0.4749259868
10 ≈ 3.0677038066 ≈ 0.0738888469
100 ≈ 3.1337874906 ≈ 0.0078051629
1000 ≈ 3.1408077460 ≈ 0.0007849075
10000 ≈ 3.1415141187 ≈ 0.0000785348
100000 ≈ 3.1415847997 ≈ 0.0000078538
500000 ≈ 3.1415910828 ≈ 0.0000015707
900000 ≈ 3.1415917809 ≈ 0.0000008726
2000000 ≈ 3.1415922609 ≈ 0.0000003926
30000000 ≈ 3.1415926278 ≈ 0.0000000257

1NF01 Fundamentos de Programación Problemas sesión 8 Página 1 de 13


Variación al problema para realizar control por centinela

Se le pide que diseñe un pseudocódigo y elabore un programa en lenguaje C que solicite el máximo
error absoluto permitido y teniendo en consideración este valor calcule el valor de π correspondiente,
indique la cantidad de términos que fueron necesarios añadir a la productoria e imprima el error
absoluto obtenido si es que se sabe que el valor de π con 10 dı́gitos decimales es 3.1415926535.
En caso el usuario ingrese un error absoluto menor o igual a cero, el programa deberá emitir el
siguiente mensaje de error El error absoluto debe ser mayor a cero.

Casos de prueba para verificación de solución

Use los siguiente casos para verificar si su solución está correcta.

error absoluto máximo π calculado error absoluto calculado # términos


0.001 ≈ 3.1405929424 ≈ 0.0009997111 785
0.00005 ≈ 3.1415426557 ≈ 0.0000499978 15708
0.0000001 ≈ 3.1415925535 ≈ 0.0000001000 7844403

Curiosidad matemática
El valor de π con una aproximación de 1000 dı́gitos decimales es:
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628
03482534211706798214808651328230664709384460955058223172535940812848111745028410270193
85211055596446229489549303819644288109756659334461284756482337867831652712019091456485
66923460348610454326648213393607260249141273724587006606315588174881520920962829254091
71536436789259036001133053054882046652138414695194151160943305727036575959195309218611
73819326117931051185480744623799627495673518857527248912279381830119491298336733624406
56643086021394946395224737190702179860943702770539217176293176752384674818467669405132
00056812714526356082778577134275778960917363717872146844090122495343014654958537105079
22796892589235420199561121290219608640344181598136297747713099605187072113499999983729
78049951059731732816096318595024459455346908302642522308253344685035261931188171010003
13783875288658753320838142061717766914730359825349042875546873115956286388235378759375
19577818577805321712268066130019278766111959092164201989

2. Transformación a base 10
El sistema hexadecimal HEX es el sistema de numeración posicional que tiene como base el 16. Su
uso actual está muy vinculado a la informática ya que las operaciones del CPU suelen usar el byte como
unidad básica de memoria pues un byte, representa 28 valores (0 − 255), y esto puede representarse como
28 = 24 ∗ 24 = 16 ∗ 16 = 162 = 1 ∗ 162 + 0 ∗ 161 + 0 ∗ 160 , que equivale al número 100 en base 16 (10016 ),
es decir, tres dı́gitos hexadecimales en lugar de los ocho dı́gitos que hubiéramos usado en base 2. En
principio, dado que el sistema usual de numeración es de base decimal y, por ello, solo se dispone de diez
dı́gitos, se adoptó la convención de usar las seis primeras letras del alfabeto latino para suplir los dı́gitos
que faltan. El conjunto de sı́mbolos es el siguiente: S = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F .
Se debe notar que A = 10, B = 11, C = 12, D = 13, E = 14 y F = 15. Asimismo, existe el sistema de
numeración octal y utiliza los dı́gitos del 0 al 7. En informática a veces la numeración octal es utilizada
en lugar de la hexadecimal, debido a la ventaja de que no es requerido utilizar sı́mbolos diferentes a los
dı́gitos. Como en cualquier sistema de numeración posicional, el valor numérico de cada dı́gito es alterado
dependiendo de su posición en la cadena de dı́gitos, quedando multiplicado por una cierta potencia de la
base del sistema.
Por ejemplo:

A0E316 = 10 ∗ 163 + 0 ∗ 162 + 14 ∗ 161 + 3 ∗ 160 = 4118710

1NF01 Fundamentos de Programación Problemas sesión 8 Página 2 de 13


101102 = 1 ∗ 24 + 0 ∗ 23 + 1 ∗ 22 + 1 ∗ 21 + 0 ∗ 20 = 2210

1203718 = 1 ∗ 85 + 2 ∗ 84 + 0 ∗ 83 + 3 ∗ 82 + 7 ∗ 81 + 1 ∗ 80 = 4120910

Recordar que:

Recuerde que el carácter ‘A’ es representado por el código ASCII 65, y tiene valor numérico 10.
Por otro lado, el carácter ‘0’ es representado por el código ASCII 48, y tiene valor numérico 0. Los
códigos ASCII son valores sucesivos por lo que ‘1’ tiene código ASCII 49 y ‘B’ tiene código ASCII
66. Recomendación: si se tiene el carácter ‘A’ y se desea obtener el valor numérico 10, bastarı́a con
restarle 55 al código ASCII correspondiente al carácter ‘A’.

Se le pide elaborar un programa en lenguaje C utilizando el paradigma de programación mo-


dular, desarrollando como mı́nimo 4 módulos incluyendo el principal, que permita transformar
un número que se encuentra en cualquier base a la base 10. Para esto deberá leer la base en donde se
encuentra el número ası́ como la cantidad de dı́gitos del número a leer. Luego deberá leer cada dı́gito
(si el dı́gito se ingresa en minúscula debe cambiarlo a mayúscula) del número empezando por el dı́gito
menos significativo. A continuación se presentan algunos ejemplos de ejecución:

Ingrese base: 16
Ingrese cantidad de dı́gitos: 4
Ingrese el dı́gito 1: 3
Ingrese el dı́gito 2: E
Ingrese el dı́gito 3: 0
Ingrese el dı́gito 4: A
El número en base 10 es 41187

Ingrese base: 16
Ingrese cantidad de dı́gitos: 4
Ingrese el dı́gito 1: 3
Ingrese el dı́gito 2: e
Ingrese el dı́gito 3: 0
Ingrese el dı́gito 4: a
El número en base 10 es 41187

Ingrese base: 2
Ingrese cantidad de dı́gitos: 5
Ingrese el dı́gito 1: 0
Ingrese el dı́gito 2: 1
Ingrese el dı́gito 3: 1
Ingrese el dı́gito 4: 0
Ingrese el dı́gito 5: 1
El número en base 10 es 22

Ingrese base: 8
Ingrese cantidad de dı́gitos: 6
Ingrese el dı́gito 1: 1
Ingrese el dı́gito 2: 7
Ingrese el dı́gito 3: 3
Ingrese el dı́gito 4: 0
Ingrese el dı́gito 5: 2
Ingrese el dı́gito 6: 1
El número en base 10 es 41209

1NF01 Fundamentos de Programación Problemas sesión 8 Página 3 de 13


Ingrese base: 8
Ingrese cantidad de dı́gitos: 4
Ingrese el dı́gito 1: 2
Ingrese el dı́gito 2: -
Los dı́gitos deben estar en el rango [A..Z], [a..z], [0..9]

Ingrese base: 16
Ingrese cantidad de dı́gitos: 6
Ingrese el dı́gito 1: A
Ingrese el dı́gito 2: 0
Ingrese el dı́gito 3: Z
Ha ingresado un dı́gito inválido para la base seleccionada

3. Fechas mágicas (2018-2–E3–P2)


Una fecha mágica es una fecha donde el dı́a multiplicado por el mes es igual a los dos últimos dı́gitos
del año. Por ejemplo 10 de Junio de 1960 es una fecha mágica ya que junio es el sexto mes y 6 veces 10
es 60, que es igual a los dos últimos dı́gitos de 1960.
Se le pide que elabore un algoritmo en pseudocódigo que permita encontrar y mostrar todas las fechas
mágicas en un rango de años determinado. Debe tener en cuenta que enero, marzo, mayo, julio, agosto,
octubre y diciembre tienen 31 dı́as. Abril, junio, setiembre y noviembre tienen 30 dı́as. Asimismo, la
cantidad de dı́as del mes de febrero dependerá de si el año es bisiesto o no. En un año bisiesto el mes de
febrero tiene 29 dı́as, mientras en un año no bisiesto tiene 28. Todo año divisible entre 400 es bisiesto.
También son bisiestos los años divisibles entre 4 pero no entre 100 (por ejemplo, 1900, NO es un año
bisiesto. El año 2020 si es bisiesto).

Ingrese a~
no de inicio: 1960
Ingrese a~
no fin: 1963

Resultado:
20-03-1960
15-04-1960
12-05-1960
10-06-1960
06-10-1960
05-12-1960
21-03-1963
09-07-1963
07-09-1963

4. Números capicúas (Adaptado de 2020-0–E1–P3)


Existen diferentes tipos de palabras y alguna de ellas son las siguientes:
Una palabra es catalogada como “palı́ndroma” cuando tiene más de una letra y leı́da de izquierda
a derecha y de derecha a izquierda son iguales, por ejemplo: reconocer.
Una palabra es catalogada como “i-palı́ndroma” cuando quitando el primer carácter de la palabra
esta se convierte en palı́ndroma, por ejemplo: casa, si quitamos la c quedarı́a asa, siendo esta
palı́ndroma.
Una palabra es catalogada como “d-palı́ndroma” cuando quitando el último carácter de la palabra
esta se convierte en palı́ndroma, por ejemplo: amad, si quitamos la d quedarı́a ama, siendo esta
palı́ndroma.

1NF01 Fundamentos de Programación Problemas sesión 8 Página 4 de 13


Una palabra es catalogada “distinguida” si es palı́ndroma o i-palı́ndroma o d-palı́ndroma.

En los números, existen los números capicúas, los cuales se comportan como las palabras ”palı́ndro-
mas”, es decir, el número leı́do de izquierda a derecha y de derecha a izquierda son iguales, por ejemplo:
12321
Para este ejercicio, vamos a realizar una similitud entre las palabras palı́ndromas, i-palindromas,
d-palindromas y distinguidas, trasladando el mismo concepto hacia los números capicúas, i-capicúas, d-
capicúas y distinguidos, por lo que tendrı́amos:

Un número es catalogado como “capicúa” cuando leı́do de izquierda a derecha y de derecha a


izquierda son iguales, por ejemplo: 12321.
Un número es catalogado como “i-capicúa” cuando quitando el primer dı́gito este se convierte en
capicúa, por ejemplo: 1232, si quitamos el dı́gito 1 quedarı́a el número 232, siendo este capicúa.
Un número es catalogado como “d-capicúa” cuando quitando el último dı́gito este se convierte en
capicúa, por ejemplo: 1212, si quitamos el dı́gito 2 quedarı́a el número 121, siendo este capicúa.
Un número es catalogado “distinguido” si es capicúa, i-capicúa o d-capicúa.

Se pide elaborar un programa en lenguaje C que permita validar si un número es ”distinguido”,


para ello solo se considerarán números de 4 o 5 cifras. Debe considerar el paradigma de programación
modular desarrollando los siguientes módulos:

Un módulo principal que lea la cantidad de cifras de un número, el número y evalúe si el número
es distinguido. Debe realizar las validaciones que considere necesarias.
Un módulo evaluarDatos que reciba como parámetro la cantidad de cifras y un número y devuelva
si el número posee la cantidad de cifras ingresadas.
Un módulo evaluarCapicuas que reciba como parámetro la cantidad de cifras, un número y
devuelva, a través de parámetros que modifican su valor, si el número es capicúa, i-capicúa y d-
capicúa.
Un módulo evaluarSiEsCapicua que reciba como parámetro la cantidad de cifras, un número y
devuelva si el número es capicúa

A continuación, se presentan ejemplos de ejecución del programa :

Ingrese la cantidad de cifras de un número: 4


Ingrese el número a evaluar: 1212
El número es Distinguido porque es:
i-Capicúa
d-Capicúa

Ingrese la cantidad de cifras de un número: 5


Ingrese el número a evaluar: 12121
El número es Distinguido porque es:
Capicúa

Ingrese la cantidad de cifras de un número: 3


La cantidad de cifras ingresada no es correcta.

Ingrese la cantidad de cifras de un número: 4


Ingrese el número a evaluar: 12121
El número ingresado no concuerda con la cantidad de cifras ingresada.

1NF01 Fundamentos de Programación Problemas sesión 8 Página 5 de 13


5. Serie de Euler (Adaptado de 2020-1–E1–P3)
En el siglo XVIII muchos matemáticos buscaban, sin demasiado éxito, el valor de la expresión. Ver
Figura 1

Figura 1: Expresión matemática

La primera aportación relevante fue hecha por Jacobo Bernoulli en 1689 cuando demostró la conver-
gencia de dicha serie. Más tarde, en 1728–1729, D. Bernoulli calculó su valor con una precisión de una
centésima. Stirling aumentó la precisión hasta los ocho primeros decimales al año siguiente.
Cuatro años después, Euler calculó el valor con dieciocho cifras decimales y se dio cuenta de que
π2
coincidı́an con la expresión de . En años posteriores, Euler no sólo demostró que, efectivamente, ese
6
1 1 1
era el valor de dicha suma, sino que calculó 1 + k + k + k + ... para k par.
2 3 4
Sólo en contadas ocasiones es factible calcular de manera explı́cita la suma de una serie. La mayorı́a
de las veces serán necesarios medios indirectos. La dificultad radica en el cálculo explı́cito del valor de las
sumas parciales. Si sabemos cuánto valen, el problema de estudiar la convergencia de la serie se reduce a
un problema de cálculo de lı́mites, cosa normalmente mucho más sencilla.
Se desea elaborar un programa en lenguaje C que permita verificar que la serie cumpla la tendencia
hacia el número indicado cuando la sumatoria tiende al infinito, para ello debe utilizar la siguiente serie
(ver Figura 2 ):

Figura 2: Expresión matemática

En el programa que implemente deberá:

Solicitar la cantidad de términos de la serie.

Solicitar el valor de n.

Validar que la cantidad de términos leı́da sea mayor que cero y que el valor de n leı́do sea mayor
que 1, en caso contrario deberá mostrar un mensaje al usuario.

En caso de que la cantidad de términos ingresado sea mayor que cero y que el valor de n leı́do sea
mayor que 1, deberá invocar a una función para que realice la aproximación de la serie solicitada.
La función se llamará calcular serie.

La función calcular serie recibirá como parámetro la cantidad de términos y el valor de n. Deberá
calcular la sumatoria de la serie dada anteriormente. La función deberá retornar la sumatoria
calculada.

Deberá calcular el valor real de la serie en el programa principal.

Deberá imprimir el valor devuelto por la función y el valor real en el programa principal.

En caso el valor absoluto de la diferencia del valor calculado por la función y el valor real sea
menor que 0.00001 deberá mostrar un mensaje indicando que la serie cumple la tendencia, en caso
contrario deberá mostrar un mensaje indicando que la serie no cumple con la tendencia definida.

A continuación, se presentan ejemplos de ejecución del programa :

1NF01 Fundamentos de Programación Problemas sesión 8 Página 6 de 13


Ingrese la cantidad de términos: 0
Ingrese el valor de n: 5
Los datos de entrada son incorrectos

Ingrese la cantidad de términos: 100


Ingrese el valor de n: 0
Los datos de entrada son incorrectos

Ingrese la cantidad de términos: 100


Ingrese el valor de n: 1
Los datos de entrada son incorrectos

Ingrese la cantidad de términos: 100


Ingrese el valor de n: 5

El valor real es:0.250000


El valor aproximado es: 0.249377
No se cumple la tendencia de la serie.

Ingrese la cantidad de términos: 1000


Ingrese el valor de n: 5

El valor real es: 0.250000


El valor aproximado es: 0.249938
No se cumple la tendencia de la serie.

Ingrese la cantidad de términos: 10000


Ingrese el valor de n: 5

El valor real es: 0.250000


El valor aproximado es: 0.249994
Se cumple la tendencia de la serie.

6. Método Montecarlo (Adaptado de 2020-1–E1–P3)


El método de Montecarlo fue creado por Stanislaw Ulam en el año 1946, extrayendo la idea
mientras jugaba una partida de solitario. El se preguntaba, ¿cuál serı́a la probabilidad de terminar la
partida de solitario, una vez que se habı́an repartido todas las cartas?, en lugar de calcularlo manualmente
se dio cuenta que era mucho más fácil calcular esa probabilidad luego de jugar muchas partidas de solitario
y anotar en cuales de ellas conseguı́a terminar el juego.
Es un procedimiento que hace uso de probabilidad, cálculo y estadı́stica para proporcionar soluciones
aproximadas a una gran variedad de problemas matemáticos posibilitando la realización de experimentos
con muestreos de números pseudoaleatorios en un computador. Para encontrar la solución a un problema
matemático usando este método, es necesario usar una gran cantidad de números pseudoaleatorios. Un
número pseudo-aleatorio es un número generado en el computador a través de un algoritmo que parece
producir números al azar, pero que en realidad no lo hace.
El método se llamó ası́ en referencia al famoso casino de Mónaco, el Casino de Montecarlo por ser
éste “la capital del juego de azar”. La ruleta puede considerarse como un generador simple de números
aleatorios.
Se desea elaborar un programa en lenguaje C que permita aproximar el área de la circunferencia
que se muestra en la Figura 3, pero usando el método de Montecarlo, por lo que no podrá usar la fórmula
del área de la circunferencia.

1NF01 Fundamentos de Programación Problemas sesión 8 Página 7 de 13


Figura 3: Expresión matemática

Se sabe que cada lado del cuadrado tiene longitud de 4 unidades y sus vértices se encuentran son
A(-2,2), B(2,-2), C(2,2) y D(-2,2). Además, se sabe que la fórmula de la circunferencia (coloreado con
rojo) que se encuentra dentro del cuadrado es x2 + y 2 = 1.
Para calcular el área por el método de Montearlo deberá generar de forma aleatoria varios puntos que
se encuentren dentro del cuadrado. El área aproximada de la circunferencia estará dada por la cantidad
de puntos generados de forma pseudoaleatoria que se encuentran dentro de la circunferencia dividido
entre el total de puntos generados y este resultado se multiplica por el área del cuadrado.
En el programa que implemente deberá:

Solicitar la cantidad de puntos pseudoaleatorios a generar.

Validar que la cantidad leı́da sea mayor que cero, en caso contrario deberá mostrar un mensaje al
usuario.

En caso de que el número ingresado sea mayor que cero, deberá invocar a una función para que
realice la aproximación del área solicitada. La función se llamará metodo montecarlo.

La función metodo montecarlo recibirá como parámetro la cantidad de puntos pseudoaleatorios a


generar. Deberá generar cada punto y contará cuantos de ellos se encuentran dentro de la circun-
ferencia usando para ello la ecuación dada anteriormente. La función deberá retornar el cociente
de la división real entre la cantidad de puntos que se encuentran dentro de la circunferencia y la
cantidad total de puntos generados y este resultado multiplicarlo por el área del cuadrado.

En caso de que la función retorne un valor mayor que cero, deberá imprimir el resultado en el
programa principal (función main).

Para generar un número pseudoaleatorio de tipo double entre [-2,2] en lenguaje C incluya el archivo
de cabecera stdlib.h y use la siguiente expresión:

2 ∗ ((double)rand()/RAN D M AX) (1)

Recordar que:

Recuerde que, dado que se están usando números pseudoaleatorios, es altamente probable que
el área aproximada que le resulte a usted, no sea exactamente igual a los casos presentados a
continuación. Pero deberá ser un número muy aproximado a los valores mostrados.

A continuación, se presentan ejemplos de ejecución del programa :

Ingrese la cantidad de puntos a generar: 100

El área aproximada es: 3.040000

1NF01 Fundamentos de Programación Problemas sesión 8 Página 8 de 13


Ingrese la cantidad de puntos a generar: 1000

El área aproximada es: 3.120000

Ingrese la cantidad de puntos a generar: 1000000

El área aproximada es: 3.124496

Ingrese la cantidad de puntos a generar: -100

La cantidad de puntos a generar debe ser mayor que cero.

7. Encriptación de Datos (Adaptado de 2021-2–E1–P2)


La información personal es cualquier dato relacionado a una persona, ya sea que se refiera a la vida
privada o pública. En el entorno en lı́nea, donde una vasta cantidad de información es compartida y
transferida alrededor del mundo de forma inmediata, se hace cada vez más difı́cil para las personas
mantener un control sobre su información personal. Aquı́ es donde la protección de datos entra en juego.
La protección de datos se refiere a las prácticas, salvaguardas y principios fundamentales puestos en
ejercicio para proteger tu información personal y asegurar que te mantengas en control de ella. En pocas
palabras, uno debe tener la posibilidad de decidir si se desea o no compartir ciertos datos, quién puede
tener acceso a ellos, por cuanto tiempo, por qué razones, tener la posibilidad de modificarlos y mucho
más.
Los gobiernos tienen un interés de seguridad en garantizar la protección de datos personales. En
2015, un grupo de delincuentes robaron una cantidad de 21,5 millones de registros de la Oficina de
Administración de Personal de EE. UU. que contenı́an información personal sumamente sensible de los
empleados federales y de los miembros de su familia. Este tipo de ataques suceden cada vez con mayor
frecuencia en todo el mundo, por lo tanto, los paı́ses deben tomar medidas para proteger la información
de las personas de forma eficiente.
Es por ello que la encriptación de datos es tan importante al momento de querer almacenar datos
en una base de datos. Juan, alumno de ingenierı́a sabe esto y es por ello que quiere implementar un
programa en C que le permita generar de manera segura un identificador encriptado para cada uno de
los participantes en su estudio.
A continuación se describen las partes del identificador no encriptado:

Nombre: dos primeros dı́gitos de más a la izquierda que representan una letra entre la A y la Z
(código ASCII mayúsculas).

Apellido paterno: tercer y cuarto dı́gito contando desde la izquierda que representan una letra entre
la A y la Z (código ASCII mayúsculas).

Apellido materno: quinto y sexto dı́gito contando desde la izquierda que representan una letra entre
la A y la Z (código ASCII mayúsculas).

Documento nacional de identidad: los ocho digitos de más a la derecha.

Según lo definido por Juan, existen tres tipos de encriptación:

A: formada por Documento nacional de identidad, seguido por apellido materno, seguido por ape-
llido paterno y finalmente el nombre.

B: formada por apellido materno, seguido por apellido paterno, seguido del nombre y finalmente
el Documento nacional de identidad.

1NF01 Fundamentos de Programación Problemas sesión 8 Página 9 de 13


C: formada por el nombre, seguido del Documento nacional de identidad, seguido del apellido
materno, y finalmente el apellido paterno.

Se le pide elaborar un programa en lenguaje C, que dado el identificador de un participante y


un modo de encriptación, permita mostrar las iniciales del nombre, apellidos paterno y materno además
del documento nacional de identidad y calcular y mostrar el identificador encriptado siempre y cuando
los datos ingresados sean válidos.
Para esto debe considerar que el identificador es un número de 14 dı́gitos para el desarrollo de esta
pregunta, no puede usar estructuras iterativas y debe tomar en cuenta que el tipo de dato int tiene un
valor máximo de 2147483647. Recuerde que solo existen tres modos de encriptación A, B, C (ingresados en
mayúsculas), en caso el usuario ingrese un modo inválido debe mostrar el mensaje ”Modo inválido”. Por
otro lado, si el identificador no tiene los 14 dı́gitos requeridos deberá mostrar el mensaje ”El identificador
no cumple con los requerimientos” . Considere también que si alguna de las iniciales no es válida, deberá
mostrar el mensaje ”Iniciales inválidas”.
Para resolver este problema, deberá implementar tres módulos sin incluir el módulo principal, según
el siguiente detalle:

Un módulo para validar que el identificador y el modo de encriptación sean válidos.


Un módulo para validar que las iniciales del nombre y los dos apellidos sean válidas.
Un módulo que reciba como parámetros el identificador original, y calcule y devuelva el codigo
ASCII del nombre, el codigo ASCII del apellido paterno, el codigo ASCII del apellido materno y el
número del documento nacional de identidad.

Tomar en cuenta:

No deberá implementar otros módulos diferentes a los indicados previamente.


No deberá usar sentencias iterativas en esta pregunta.

A continuación se presentan algunos ejemplos de ejecución:

Ingrese el identificador del participante: 76807742745364


Identificador leido:76807742745364
Ingrese el modo de encriptación: A
Inicial nombre:L
Inicial apellido paterno:P
Inicial apellido materno:M
DNI:42745364
Usando el modo de encriptación A
El identificador encriptado es:42745364778076

Ingrese el identificador del participante: 82748775647382


Identificador leido:82748775647382
Ingrese el modo de encriptación: C
Inicial nombre:R
Inicial apellido paterno:J
Inicial apellido materno:W
DNI:75647382
Usando el modo de encriptación C
El identificador encriptado es:82756473828774

Ingrese el identificador del participante: 76807742745364


Identificador leido:76807742745364
Ingrese el modo de encriptación: B

1NF01 Fundamentos de Programación Problemas sesión 8 Página 10 de 13


Inicial nombre:L
Inicial apellido paterno:P
Inicial apellido materno:M
DNI:42745364
Usando el modo de encriptación B
El identificador encriptado es:77807642745364

Ingrese el identificador del participante: 98656675453243


Identificador leido:98656675453243
Ingrese el modo de encriptación: A

Inicial nombre:b
Inicial apellido paterno:A
Inicial apellido materno:B
DNI:75453243
Usando el modo de encriptación A
Iniciales inválidas

Ingrese el identificador del participante: 65666787654565


Identificador leido:65666787654565
Ingrese el modo de encriptación: P
Modo inválido

Ingrese el identificador del participante: 76489


Identificador leido:76489
Ingrese el modo de encriptación: C
El identificador no cumple con los requerimientos

Ingrese el identificador del participante: 43257


Identificador leido:43257
Ingrese el modo de encriptación: V

8. Método de Resta por Complemento a Nueve (Adaptado de 2021-


2–E1–P3)
La resta es una operación aritmética que puede ser calculada con el método del complemento a nueve,
método que se caracteriza en realizar dicha operación con tan solo la suma de dos números. Este método
tiene la ventaja que la suma es una operación más sencilla de calcular que la resta, en especial para las
computadoras, por lo que se convierte en una forma muy eficiente de realizar la operación.
Ahora bien, dados dos números enteros positivos, donde al número mayor lo denominaremos Minuendo
mientras que al número menor lo denominaremos Sustraendo, como los mostrados en la siguiente figura:

Figura 4: Ejemplo de una Resta mostrando Minuendo, Sustraendo y el resultado.

El método del complemento a nueve consiste en los siguientes pasos:

1NF01 Fundamentos de Programación Problemas sesión 8 Página 11 de 13


Tomar el Sustraendo de la operación y cambiar cada dı́gito del Sustraendo por el resultado del
complemento a nueve del dı́gito. Para el ejemplo 5,932 deberá ser reemplazado por 4,067. Se puede
observar que cada dı́gito del Sustraendo es reemplazado por la diferencia entre 9 y dicho dı́gito.

Como el método requiere que tanto el Minuendo como el Sustraendo tengan la misma cantidad de
dı́gitos se debe completar al número obtenido en el paso anterior con nueves por la izquierda hasta
completar la cantidad de dı́gitos del Minuendo. Para el ejemplo 4,067 se convertirá en 9,994,067,
dado que el Minuendo del ejemplo (4,687,945) tiene siete dı́gitos. De esta manera hemos conseguido
el complemento a nueve del Sustraendo.

El siguiente paso consiste en sumar al Minuendo el complemento a nueve del Sustraendo obtenido
en el paso anterior. En el ejemplo al sumar 4,687,945 y 9,994,067 se obtiene 14,682,012.

El método termina omitiendo el primer dı́gito de la izquierda (que siempre será 1) y sumándole
uno a la cantidad obtenida. Por lo que en el ejemplo al número 14,682,012 primero se le omite el
primer dı́gito de la izquierda obteniendo 4,682,012 para después sumarle uno al número obteniendo
4,682,013 número que es el resultado de la resta del Minuendo y Sustraendo dados como ejemplo.

Se pide desarrollar un programa en lenguaje C que permita leer el Minuendo y Sustraendo


de una resta. Deberá validar que ambos números son enteros mayores iguales a cero. En caso alguno de
dichos números no lo fuera deberá entregar el mensaje “El Minuendo y Sustraendo deben ser enteros
mayores iguales a cero.” Además, deberá validar que el Minuendo es mayor o igual al Sustraendo. Si no
lo fuera deberá entregar el mensaje “El Minuendo debe ser mayor o igual al Sustraendo.”
El programa deberá hacer uso de dos módulos además del módulo principal. El primer módulo deberá
entregar dado un número como parámetro la cantidad de dı́gitos que tiene dicho número, mientras que el
segundo módulo deberá calcular y entregar el complemento a nueve del Sustraendo, recibiendo también
como parámetros la cantidad de dı́gitos del Minuendo y del Sustraendo.
Por último, el módulo principal deberá calcular el resultado de la resta siguiendo el método del
complemento a nueve, e imprimir los resultados obtenidos.
Tomar en cuenta:

No deberá implementar otros módulos diferentes a los indicados previamente.

Recordar que:

El número de dı́gitos de un número X es igual a la parte entera del log10( X ) + 1.

A continuación se presentan algunos ejemplos de ejecución:

Ingrese el Minuendo y Sustraendo de la operación: 453444224 -5467


El Minuendo y Sustraendo deben ser enteros mayores iguales a cero.

Ingrese el Minuendo y Sustraendo de la operación: -675354 -56765


El Minuendo y Sustraendo deben ser enteros mayores iguales a cero.

Ingrese el Minuendo y Sustraendo de la operación: 4835 934735


El Minuendo debe ser mayor o igual al Sustraendo.

Ingrese el Minuendo y Sustraendo de la operación: 4687945 5932

El complemento del Sustraendo es 9994067.


La suma del Minuendo y el complemento a nueve del Sustraendo es 14682012.
La resta del Minuendo menos el Sustraendo usando el complemento a nueve es 4682013.

1NF01 Fundamentos de Programación Problemas sesión 8 Página 12 de 13


Ingrese el Minuendo y Sustraendo de la operación: 942053495 0

El complemento del Sustraendo es 999999999.


La suma del Minuendo y el complemento a nueve del Sustraendo es 1942053494.
La resta del Minuendo menos el Sustraendo usando el complemento a nueve es 942053495.

Preparado por Andrés Melgar y Layla Hirsh, actualizado por Iván Caldas
Pando, 30 de setiembre de 2023

1NF01 Fundamentos de Programación Problemas sesión 8 Página 13 de 13

You might also like