0% encontró este documento útil (0 votos)
16 vistas44 páginas

Examen Parcial Fundamentos Programación 2023-2

El resumen genera un menú de opciones para calcular tiempos y distancias de movimiento rectilíneo uniforme y posición de partículas. Valida las entradas y muestra mensajes de error personalizados. Calcula tiempos de encuentro, alcance y posiciones/velocidades de partículas según ecuaciones dadas.

Cargado por

lbocanegram
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
16 vistas44 páginas

Examen Parcial Fundamentos Programación 2023-2

El resumen genera un menú de opciones para calcular tiempos y distancias de movimiento rectilíneo uniforme y posición de partículas. Valida las entradas y muestra mensajes de error personalizados. Calcula tiempos de encuentro, alcance y posiciones/velocidades de partículas según ecuaciones dadas.

Cargado por

lbocanegram
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

PONTIFICIA

ESTUDIOS
UNIVERSIDAD
GENERALES
CATÓLICA
CIENCIAS
DEL PERÚ

FUNDAMENTOS DE PROGRAMACIÓN
PROPUESTA DE SOLUCIÓN DEL EXAMEN PARCIAL
SEMESTRE ACADÉMICO 2023-2

Horarios: Todos
Duración: 180 minutos
Revisado por los profesores del curso.

ADVERTENCIAS
Todo dispositivo electrónico (teléfono, tableta, computadora u otro) de propiedad del estudiante, deberá permanecer apagado durante la
evaluación.
Debe colocar todo aquello que no sean útiles de uso autorizado durante la evaluación en la parte delantera del aula, por ejemplo, mochila,
maletín, cartera o similar, y procure que contenga todas sus propiedades. La apropiada identificación de las pertenencias es su responsabi-
lidad.
Es su responsabilidad tomar las precauciones necesarias para no requerir la utilización de servicios higiénicos: durante la evaluación, no
podrá acceder a ellos, de tener alguna emergencia comunicárselo a su Jefe de Laboratorio.
Los estudiantes no podrán retirarse del aula antes del término del examen. Las tareas respectivas en PAIDEIA se habilitarán durante los
últimos 20 minutos del horario del examen.
En caso de no cumplir las advertencias, indicaciones o incurrir en alguna falta al reglamento, su examen será anulado y conllevará al inicio
de un procedimiento disciplinario.

INDICACIONES
La duración del examen es de 180 minutos.
Durante el examen el Jefe de Laboratorio le solicitará verificar su identidad, para lo cual el estudiante debe mostrarle su DNI, TI u otro
documento de identidad con fotografía.
Debe utilizar variables y constantes descriptivas, comentarios que expliquen el funcionamiento de la solución y mensajes descriptivos.
El orden, la limpieza, la eficiencia de su implementación, las reglas gramaticales y la ortografía serán considerados en la calificación.
No se pueden usar apuntes de clase, libros, tablas o calculadora de propiedad del estudiante.
De acuerdo a la programación del examen para cada horario, se recomienda llegar a su aula de evaluación 10 minutos antes del inicio del
examen, a partir de esa hora se permitirá el ingreso al aula.
Para el examen parcial, se creará en la plataforma PAIDEIA en el curso 2023-2 FUNDAMENTOS DE PROGRAMACIÓN (1INF01) la
sección ”Examen Parcial”. En esta sección se encontrarán las 3 tareas (Pregunta 1, Pregunta 2 y Pregunta 3) para colocar en cada una de
ellas el archivo que desarrolle.
Las tareas de las 3 preguntas (en la cual colocará los archivos desarrollados) se habilitarán durante los últimos 20 minutos del
horario del examen. Antes de subir la pregunta 1 a PAIDEIA debe asegurarse que se ha grabado correctamente en PseInt usando el perfil
PUCP, es responsabilidad del esudiante verificar que el archivo contenga lo que desarrolló. No se aceptará ningún pedido de corrección
debido a que la pregunta no tiene contenido.
En cada tarea se debe colocar el archivo que corresponda a la pregunta, en caso el archivo que coloque no sea la solución a la
pregunta, la pregunta no se corregirá y se le asignará la nota 0. Es su responsabilidad guardar los archivos en el lugar adecuado de la
computadora.
En cada pregunta el archivo debe tener el nombre que se indica en el enunciado. Si en alguna pregunta, el archivo no tiene el
nombre correcto, se disminuirán 2 puntos en la calificación obtenida en la pregunta. El nombre debe ser exactamente igual al que
se indica en cada enunciado, de existir alguna diferencia por más mínima que sea, se realizará el descuento indicado.
Solo debe conectarse a Internet para usar PAIDEIA al momento de colocar en las tareas correspondientes los archivos desarrolla-
dos. El uso de cualquier aplicación adicional: correo, Whatsapp, u otra; o el acceso a Internet fuera de PAIDEIA ocasionará que
su examen sea anulado.
Debe cumplir con las indicaciones de seguridad definidas por EEGGCC para el correcto desenvolvimiento de las evaluaciones.

1INF01 Fundamentos de Programación 1 Prop.Solución Ex.Parcial(2023-2) Página 1 de 44


Pregunta 1A (7 puntos) [propuesta por Iván Caldas]
El Movimiento Rectilíneo Uniforme (M.R.U.) se define como el movimiento en el cual un objeto se desplaza en
línea recta, en una sola dirección, recorriendo distancias iguales en el mismo intervalo de tiempo, manteniendo en
todo su movimiento una velocidad constante y sin aceleración.

Figura 1: MRU-Tiempo de encuentro

En la figura 1 el tiempo de encuentro en M.R.U. es el tiempo que demoran en encontrarse dos objetos que se
mueven en diferente dirección con una rapidez constante.

Figura 2: MRU-Tiempo de alcance

En la figura 2 el tiempo de alcance en M.R.U. es el tiempo que le toma a un objeto alcanzar la misma posición de
un objeto que se encontraba delante de este.
Donde: te : Tiempo de encuentro, ta : Tiempo de alcance, d: Distancia de separación, VA : Velocidad del vehículo A
y VB : Velocidad del vehículo B.
También es posible expresar el movimiento de una partícula en el plano cartesiano a través de una ecuación, como
se muestra en (1):

x(t) = coef icienteGrado3 ∗ t3 + coef icienteGrado2 ∗ t2 + coef icienteGrado1 ∗ t + coef icienteGrado0 (1)

Esta ecuación muestra la posición de una partícula en función del tiempo. Para hallar la velocidad de esta partícula
se deriva la posición con respecto del tiempo, lo que nos da la siguiente ecuación (2):

v(t) = 3 ∗ coef icienteGrado3 ∗ t2 + 2 ∗ coef icienteGrado2 ∗ t + coef icienteGrado1 (2)

Para encontrar los tiempos en los que la velocidad es nula se debe resolver la ecuación de segundo grado previa-
mente presentada.
Recuerde que para encontrar las raices de una ecuación ax2 +bx+c = 0, debe validar si el discriminante b2 −4∗a∗c
es mayor o igual a 0. De ser así las raíces de la función se calculan usando la fórmula (3):

−b ± b2 − 4 ∗ a ∗ c
x= (3)
2∗a
Se le pide elaborar un algoritmo expresado en pseudocódigo que, dado un menú de opciones, permita: calcular
e imprimir el tiempo de encuentro o el tiempo de alcance y las distancias respectivas de cada vehículo, según
corresponda; calcular la posición de una partícula y los tiempos cuando la partícula tiene velocidad 0 m/s. A
continuación, las especificaciones del menú de opciones:

Opción 1: permitirá calcular el tiempo de encuentro en horas y las distancias en kilómetros. Para lo cual
el usuario ingresará la distancia en metros (m) o kilómetros (k), la velocidad del vehículo A en m/s y la
velocidad del vehículo B en cm/m. Debe validar que la distancia y las velocidades sean positivas.

1INF01 Fundamentos de Programación 2 Prop.Solución Ex.Parcial(2023-2) Página 2 de 44


Opción 2: permitirá calcular el tiempo de alcance en horas y las distancias en kilómetros. Para lo cual
el usuario ingresará la distancia en metros (m) o kilómetros (k), la velocidad del vehículo A en m/s y la
velocidad del vehículo B en cm/m. Debe validar que la distancia y las velocidades sean positivas.
Opción 3: permitirá calcular la posición de una partícula en metros y los tiempos en los cuales la partícula
tiene velocidad 0 m/s. Para lo cual el usuario ingresará los coeficientes de la ecuación (1) y el tiempo para
calcular la posición de la partícula. Debe validar que el tiempo ingresado sea positivo.

Recuerde que: 1 km = 1000 metros, 1 metro = 100 centímetos, 1 hora = 60 minutos y 1 minuto = 60 segundos.
Para esta pregunta debe manejar los siguientes mensajes personalizados:

Si la opción del menú no corresponde a una de las señaladas, debe mostrar el siguiente mensaje Opción
inválida y el algoritmo termina.
Si la unidad de distancia no es k o m, debe mostrar el siguiente mensaje Unidad de medida inválida
y el algoritmo termina.
Si la distancia no es positiva, debe mostrar el siguiente mensaje Distancia inválida y el algoritmo
termina.
Si alguna velocidad no es positiva, debe mostrar el siguiente mensaje Alguna velocidad es incorrecta
y el algoritmo termina.
Si el tiempo no es positivo, debe mostrar el siguiente mensaje Tiempo inválido y el algoritmo termina.
Si el cálculo del discriminante no es mayor o igual a 0, debe mostrar el siguiente mensaje No se puede
calcular el tiempo de la partícula cuando no tiene velocidad debido a que
el discriminante de la ecuación es negativo.

A continuación se presentan algunos ejemplos de ejecución del algoritmo: utilice los mensajes que se muestran
dentro del desarrollo del pseudocódigo.
Casos de prueba:

Menú de opciones:
(1) MRU: Tiempo de encuentro
(2) MRU: Tiempo de alcance
(3) Movimiento de una partícula
Ingrese la opción a escoger:
> 4
Opción inválida

Menú de opciones:
(1) MRU: Tiempo de encuentro
(2) MRU: Tiempo de alcance
(3) Movimiento de una partícula
Ingrese la opción a escoger:
> 1
Ingrese la unidad de medida de la distancia (k:kilómetros,m:metros):
> g
Unidad de medida inválida

Menú de opciones:
(1) MRU: Tiempo de encuentro
(2) MRU: Tiempo de alcance
(3) Movimiento de una partícula
Ingrese la opción a escoger:
> 1
Ingrese la unidad de medida de la distancia (k:kilómetros,m:metros):
> k
Ingrese la distancia:
> -7
Distancia inválida

1INF01 Fundamentos de Programación 3 Prop.Solución Ex.Parcial(2023-2) Página 3 de 44


Menú de opciones:
(1) MRU: Tiempo de encuentro
(2) MRU: Tiempo de alcance
(3) Movimiento de una partícula
Ingrese la opción a escoger:
> 1
Ingrese la unidad de medida de la distancia (k:kilómetros,m:metros):
> k
Ingrese la distancia:
> 2024
Ingrese la velocidad vehículo A en m/s:
> -7
Ingrese la velocidad del vehículo B en cm/m:
> 6
Alguna velocidad es incorrecta

Menú de opciones:
(1) MRU: Tiempo de encuentro
(2) MRU: Tiempo de alcance
(3) Movimiento de una partícula
Ingrese la opción a escoger:
> 1
Ingrese la unidad de medida de la distancia (k:kilómetros,m:metros):
> k
Ingrese la distancia:
> 2024
Ingrese la velocidad vehículo A en m/s:
> 5
Ingrese la velocidad del vehículo B en cm/m:
> 5.6
El tiempo de encuentro es: 112.4234587321 horas
La distancia del punto A es: 2023.6222571787 km
La distancia del punto B es: 0.3777428213 km

Menú de opciones:
(1) MRU: Tiempo de encuentro
(2) MRU: Tiempo de alcance
(3) Movimiento de una partícula
Ingrese la opción a escoger:
> 2
Ingrese la unidad de medida de la distancia (k:kilómetros,m:metros):
> m
Ingrese la distancia:
> 157
Ingrese la velocidad vehículo A en m/s:
> 25.78
Ingrese la velocidad del vehículo B en cm/min:
> 100078.67
El tiempo de alcance es: 0.0047923131 horas
La distancia del punto A es: 0.4447649902 km
La distancia del punto B es: 0.2877649902 km

Menú de opciones:
(1) MRU: Tiempo de encuentro
(2) MRU: Tiempo de alcance
(3) Movimiento de una partícula
Ingrese la opción a escoger:
> 3
Ingrese los coeficientes de la ecuación de 3er grado:
> 5
> -2
> 10
> 3
Ingrese el tiempo para calcular la posición en segundos:
> 3.2
Posición de la partícula: 178.36 metros
No se puede calcular el tiempo de la partícula cuando no tiene velocidad debido a
que el discriminante de la ecuación es negativo

Menú de opciones:
(1) MRU: Tiempo de encuentro

1INF01 Fundamentos de Programación 4 Prop.Solución Ex.Parcial(2023-2) Página 4 de 44


(2) MRU: Tiempo de alcance
(3) Movimiento de una partícula
Ingrese la opción a escoger:
> 3
Ingrese los coeficientes de la ecuación de 3er grado:
> 1
> -4
> 1.1
> 1.25
Ingrese el tiempo para calcular la posición en segundos:
> 3.6
Posición de la partícula: 0.026 metros
La partícula tiene velocidad 0 m/s en: 2.5212353121 segundos y 0.1454313546 segundos

Programa 1: Propuesta de solución


1 Algoritmo MRUV
2 Escribir ’Menú de opciones: ’
3 Escribir ’(1) MRU: Tiempo de encuentro’
4 Escribir ’(2) MRU: Tiempo de alcance’
5 Escribir ’(3) Movimiento de una partícula"
6 Escribir ’Ingrese la opción a escoger: ’
7 Leer opc
8 Si opc=1 O opc=2 Entonces
9 Escribir "Ingrese la unidad de medida de la distancia (k:kilómetros,m:metros): "
10 Leer unidadDistancia
11 si unidadDistancia=’k’ O unidadDistancia=’m’ Entonces
12 Escribir "Ingrese la distancia: "
13 Leer distancia
14 Si distancia>0 Entonces
15 si unidadDistancia=’m’ Entonces
16 distancia<−distancia/1000
17 FinSi
18 escribir "Ingrese la velocidad vehículo A en m/s: "
19 Leer velVehiculoA
20 escribir "Ingrese la velocidad del vehículo B en cm/m: "
21 Leer velVehiculoB
22 Si velVehiculoA>0 y velVehiculoB>0 Entonces
23 TRANSF_MS_KMH<−3.6
24 TRANSF_CMM_KMH<−0.0006
25 velVehiculoA<−velVehiculoA*TRANSF_MS_KMH
26 velVehiculoB<−velVehiculoB*TRANSF_CMM_KMH
27 si opc=1 Entonces
28 tiempo<−distancia/(velVehiculoA+velVehiculoB)
29 escribir "El tiempo de encuentro es: ", tiempo, " horas"
30 SiNo
31 tiempo<−distancia/(velVehiculoA−velVehiculoB)
32 escribir "El tiempo de alcance es: ", tiempo, "horas"
33 FinSi
34 distanciaA<−velVehiculoA*tiempo
35 distanciaB<−velVehiculoB*tiempo
36 Escribir "La distancia del punto A es: ", distanciaA, " km"
37 Escribir "La distancia del punto B es: ", distanciaB, " km"
38 SiNo
39 escribir "Alguna velocidad es incorrecta"
40 FinSi
41 SiNo
42 escribir "Distancia inválida"
43 FinSi
44 SiNo
45 escribir "Unidad de medida inválida"
46 FinSi
47 SiNo
48 si opc=3 Entonces
49 escribir "Ingrese los coeficientes de la ecuación de 3er grado: "
50 Leer coef3,coef2,coef1,coef0
51 escribir "Ingrese el tiempo para calcular la posición en segundos: "
52 Leer tiempo

1INF01 Fundamentos de Programación 5 Prop.Solución Ex.Parcial(2023-2) Página 5 de 44


53 Si tiempo>0 Entonces
54 posicion<−coef3*tiempo^3+coef2*tiempo^2+coef1*tiempo+coef0
55 escribir "Posición de la partícula: ", posicion " metros"
56 coefA<−coef3*3
57 coefB<−coef2*2
58 coefC<−coef1
59 discriminante<−coefB^2−4*coefA*coefC
60 si discriminante>=0 Entonces
61 tiempo1<−(−coefB+rc(discriminante))/(2*coefA)
62 tiempo2<−(−coefB−rc(discriminante))/(2*coefA)
63 escribir "La partícula tiene velocidad 0 m/s en: ", tiempo1 , " segundos y ", tiempo2, " segundos"
64 sino
65 escribir "No se puede calcular el tiempo de la partícula cuando no tiene velocidad debido a que el discriminante de la
ecuación es negativo"
66 FinSi
67 SiNo
68 escribir "Tiempo inválido"
69 FinSi
70 sino
71 Escribir "Opción inválida"
72 FinSi
73 Fin Si
74 FinAlgoritmo

Pregunta 1B (7 puntos) [propuesta por César Aguilera]


La Oficina de Bienestar Ciencias (BC) esta muy preocupada por el desempeño de los alumnos en el curso de
1INF01 Fundamentos de Programación entonces ha implementado un control de Índice de Masa Corporal (IMC)
de sus estudiantes, para conocer su medida de obesidad actual.
Para obtener el Índice de Masa Corporal hace uso de una calculadora de IMC esta calculadora proporciona el IMC
(índice de masa corporal) y la correspondiente categoría de nivel de peso según el IMC. Se puede utilizar para
adultos de 20 años o más. También para niños y adolescentes, de 2 a 19 años.
Los datos de un alumno se pueden proporcionar en sistema inglés o sistema métrico, estos datos que se deben de
proporcionar son la edad, la estatura y el peso. Para el sistema inglés la estatura se brinda en pies(ft) y pulgadas(in)
(ejemplo: 4 pies y 1 pulgada, 5 pies y 0 pulgadas) y el peso en libras. En el sistema métrico se utiliza para la
estatura centímetros (cm) y para el peso kilogramos (kg).
Para adultos de 20 años o más, el IMC se interpreta usando categorías de estado de peso estándar. Estas categorías
son iguales para hombres y mujeres de todos los tipos de cuerpo y edades (ver Figura 3).

Figura 3: Las categorías de estado de peso estándar para adultos. Imagen tomada del URL: https:
//www.cdc.gov/healthyweight/spanish/assessing/bmi/adult_bmi/index.html/
calcula-el-IMC/

El cálculo se basa en las siguientes fórmulas:

En el sistema métrico, la fórmula para el IMC es el peso en kilogramos dividido por la estatura en metros
cuadrados. Debido a que la estatura por lo general se mide en centímetros, debe transformar la estatura en

1INF01 Fundamentos de Programación 6 Prop.Solución Ex.Parcial(2023-2) Página 6 de 44


metros.

IM C = peso(kg)/estatura(m)2

En el sistema inglés, la fórmula para el IMC se obtiene al dividir el peso en libras (lb) por la estatura total
en pulgadas (in) cuadradas y multiplicar por un factor de conversión de 703.

IM C = (peso(lb)/estatura(in)2 ) ∗ 703

El IMC se interpreta de manera diferente para niños y adolescentes, aunque se calcula utilizando la misma fórmula
que el IMC para adultos. El IMC de niños y adolescentes debe ser específico para la edad y el sexo porque la
cantidad de grasa corporal cambia con la edad y la cantidad de grasa corporal difiere entre niñas y niños. Aunque
para este caso asumimos que no hay diferencia en el sexo de los alumnos y esta dirigido para alumnos de 17 años
a más.
Las tablas de crecimiento del IMC por edad de los CDC (Centers Control Disease) tienen en cuenta estas di-
ferencias y muestran visualmente el IMC como una clasificación porcentual en percentiles. Estos percentiles se
determinaron utilizando datos representativos de la población estadounidense de 2 a 19 años de edad que se reco-
pilaron en varias encuestas de 1963-65 a 1988-94.
La obesidad entre los jóvenes de 2 a 19 años se define como un IMC igual o superior al percentil 95 de los niños de
la misma edad y sexo en esta población de referencia de 1963 a 1994. Por ejemplo, un niño de 10 años de estatura
promedio (56 pulgadas) que pesa 102 libras tendría un IMC de 22,9 kg / m2. Esto colocaría al niño en el percentil
95 de IMC (ver Figura 4), lo que significa que su IMC es mayor que el del 95 por ciento de los niños de edad
similar en esta población de referencia, y se consideraría que tiene obesidad.

Figura 4: El percentil de IMC para niños y adolescentes. Imagen tomada del URL: https://www.cdc.
gov/healthyweight/spanish/bmi/result.html?&method=english&gender=m&age_y=
17&age_m=0&hft=4&hin=6&twp=102/

En nuestro caso, como no podemos utilizar las tablas de crecimiento directamente vamos a realizar una aproxima-
ción calculando el percentil de adolescentes de la siguiente manera:

Primero hay que ordenar el conjunto datos de forma ascendente. Valores de IMC en el rango de 18 a 35.

La posición Xn se obtiene de extraer la parte entera de IMC e identificar que posición ocupa ese valor en el
conjunto de datos ordenados.

Una vez ordenados el conjunto de datos, se resta 0.5 a la posición que ocupa el dato del que queremos
calcular el percentil. Después dividimos entre el número total de datos y multiplicamos por 100.

P = ((Xn − 0.5)/N ) ∗ 100

Siendo P el percentil, Xn la posición del valor en la secuencia de datos y N el número total de datos

1INF01 Fundamentos de Programación 7 Prop.Solución Ex.Parcial(2023-2) Página 7 de 44


Por ejemplo, si tenemos un conjunto de 47 datos con diferentes valores que van desde 51 hasta 99. Si queremos
saber el percentil al que pertenece el valor 63, primero ordenamos de menor a mayor e identificamos la posición
que ocupa el valor 63. Supongamos la posición es 12.
Aplicamos la fórmula:
P = ( (12 – 0.5) / 47) x 100 = 24.46
Y obtenemos que el 63 está en el percentil 24.46, es decir, que el 24.46 por ciento de los datos tienen un valor de
63 o menos. Esto se indica como P24.46 = 63.

Recordar que:

1 pie (ft) equivale a 12 pulgadas (in).

1 metro (m) equivale a 100 centímetros (cm).

Se pide diseñar un algoritmo expresado en pseudocódigo que permita calcular el valor de IMC de un alumno, los
datos a ingresar son:

El sistema de medición, [1] sistema inglés y [2] sistema métrico. Cualquier otro valor debe mostrar un
mensaje ”Error en el tipo de sistema de medición”.

Además, ingresar la edad, estatura y el peso. Tener en consideración el sistema de medición y verificar que
los valores deben ser mayores a cero y para la edad considerar el valor mínimo indicado. En caso algún valor
no cumpla debe mostrar el mensaje ”Alguno de los valores es incorrecto”.

Para realizar los cálculos debe tener en cuenta lo siguiente:

Para obtener el IMC utilice las fórmulas proporcionadas según sea el caso.

Para el cálculo del percentil para adolescentes (17-19 años) se han considerados los valores de IMC en el
rango de 18 a 35, para calcular el numero entero de datos no tome en cuenta los valores extremos del rango.

Si el percentil es menor a 5 se considera “ bajo peso ”. Si el valor es entre 5 y 85 el “ peso es normal ” y si


es superior puede ser “ sobrepeso u obesidad ”.

A continuación se presentan algunos ejemplos de ejecución del algoritmo: utilice los mensajes que se muestran
dentro del desarrollo del pseudocódigo.
Casos de prueba:

Ingresar el tipo de sistema: [1] inglés o [2] métrico


> 3
Error en el tipo de sistema de medición.

Ingresar el tipo de sistema: [1] inglés o [2] métrico


> 1
Ingresar la edad, la estatura total en pies (ft) y con pulgadas (in)
> 11
> 4
> 1
Ingresar el peso en libras
> 100
Alguno de los valores es incorrecto.

Ingresar el tipo de sistema: [1] inglés o [2] métrico


> 1

1INF01 Fundamentos de Programación 8 Prop.Solución Ex.Parcial(2023-2) Página 8 de 44


Ingresar la edad, la estatura total en pies (ft) y con pulgadas (in)
> 17
> 5
> 0
Ingresar el peso en libras
> 140
El IMC es: 27.3388888889
Su IMC indica que el percentil es: 53.125.
entonces es peso normal.

Ingresar el tipo de sistema: [1] inglés o [2] métrico


> 1
Ingresar la edad, la estatura total en pies (ft) y con pulgadas (in)
> 22
> 6
> 1
Ingresar el peso en libras
> 180
El IMC es: 23.7455432539
esto es peso normal.

Ingresar el tipo de sistema: [1] inglés o [2] métrico


> 2
Ingresar la edad y estatura en cm
> 10
> 171
Ingresar el peso en kg
> 60
Alguno de los valores es incorrecto.

Ingresar el tipo de sistema:[1] inglés o [2] métrico


> 2
Ingresar la edad y estatura en cm
> 23
> 170
Ingresar el peso en kg
> 77
El IMC es: 26.6435986159
esto es sobrepeso.

Programa 2: Propuesta de solución


1 Algoritmo IMC
2 CTE <− 703
3 indmc <− 0
4 Escribir "Ingresar el tipo de sistema: [1] inglés o [2] métrico"
5 Leer sistema
6 Si (sistema=1 o sistema=2) Entonces
7 Si sistema=1 Entonces
8 //ingles libras y pulgadas
9 Escribir "Ingresar la edad, la estatura total en pies (ft) y con pulgadas (in)"
10 Leer edad, estaturaft, estaturain
11 //1 pie = 12 pulgadas
12 Escribir "Ingresar el peso en libras"
13 Leer pesolb
14 validarSI <− edad >= 17 y estaturaft > 0 y estaturain>= 0 y pesolb > 0
15 Si validarSI Entonces
16 estaturain <− estaturaft*12 + estaturain
17 indmc <− (pesolb/estaturain^2)*CTE
18 Escribir ’El IMC es: ’, indmc
19 SiNo
20 Escribir "Alguno de los valores es incorrecto."

1INF01 Fundamentos de Programación 9 Prop.Solución Ex.Parcial(2023-2) Página 9 de 44


21 FinSi
22 SiNo
23 //métrico kg y metros
24 Escribir "Ingresar la edad y estatura en cm"
25 Leer edad, estaturacm
26 Escribir "Ingresar el peso en kg"
27 Leer pesokg
28 validarSM <− edad >= 17 y estaturacm > 0 y pesokg > 0
29 Si validarSM Entonces
30 estaturamt <− estaturacm/100
31 indmc <− pesokg/(estaturamt)^2
32 Escribir "El IMC es: ", indmc
33 Sino
34 Escribir "Alguno de los valores es incorrecto."
35 FinSi
36 FinSi
37 Si (indmc <> 0) Entonces
38 Si (edad >=20) Entonces
39 Si (indmc<18.5) Entonces
40 Escribir "esto es bajo peso"
41 SiNo
42 Si (indmc<=24.9) Entonces
43 Escribir "esto es peso normal"
44 SiNo
45 Si (indmc<=29.9) Entonces
46 Escribir "esto es sobrepeso"
47 SiNo
48 Escribir "esto es obesidad"
49 FinSi
50 FinSi
51 FinSi
52 SiNo
53 //es adolescente de 17 − 19 años
54 //rango IMC de 18 − 35
55 N <− 35−19 //16 valores desde 19 hasta 35
56 posicion <− (trunc(indmc) − 18)
57 //escribir ’posicion: ’, posicion
58 percentil <− ((posicion − 0.5)/N)*100
59 Escribir "Su IMC indica que el percentil es: ", percentil
60 Si (percentil < 5) Entonces
61 Escribir "entonces bajo peso"
62 SiNo
63 Si (percentil <= 85) Entonces
64 Escribir "entonces es peso normal"
65 SiNo
66 Escribir "entonces es sobrepeso u obesidad"
67 FinSi
68 FinSi
69 FinSi
70
71 FinSi
72 SiNo
73 Escribir "Error en el tipo de sistema de medición"
74 FinSi
75 FinAlgoritmo

Pregunta 1C (7 puntos) [propuesta por David Allasi]


Una superficie esférica es la superficie engendrada por una circunferencia que gira sobre su diámetro. Una esfera
es la región del espacio que se encuentra en el interior de una superficie esférica.
Dentro de la esfera se pueden formar las siguientes figuras geométricas:

Huso esférico. El huso esférico es la parte de la superficie de una esfera comprendida entre dos planos que
se cortan en el diámetro de aquella. (ver figura 5)

1INF01 Fundamentos de Programación 10 Prop.Solución Ex.Parcial(2023-2) Página 10 de 44


Figura 5: Huso esférico - Imagen tomada de la URL https://www.sangakoo.com/es/temas/
esferas-y-sus-figuras-geometricas

4∗π∗radio2
El área del huso esférico es A = 360 ∗ angulo, siendo angulo el ángulo comprendido entre los dos
planos en grados sexagesimales.

Cuña esférica. La cuña esférica es la parte de una esfera comprendida entre dos planos que se cortan en el
diámetro de aquella. (ver figura 6)

Figura 6: Cuña esférica - Imagen tomada de la URL https://www.sangakoo.com/es/temas/


esferas-y-sus-figuras-geometricas

4 π∗radio3
El volumen de una cuña esférica es V = 3 ∗ 360 ∗ angulo, siendo angulo el ángulo comprendido entre
los dos planos en grados sexagesimales.

Casquete esférico. Un casquete esférico es cada una de las partes de la esfera determinada por un plano
secante. (ver figura 7)

Figura 7: Casquete esférico - Imagen tomada de la URL https://www.sangakoo.com/es/temas/


esferas-y-sus-figuras-geometricas

El área del casquete es A = 2 ∗ π ∗ R ∗ h

Zona esférica. Una zona esférica es la parte de la esfera comprendida entre dos planos secantes paralelos.
(ver figura 8)

1INF01 Fundamentos de Programación 11 Prop.Solución Ex.Parcial(2023-2) Página 11 de 44


Figura 8: Zona esférica - Imagen tomada de la URL https://www.sangakoo.com/es/temas/
esferas-y-sus-figuras-geometricas

1
El volumen de la zona esférica es V = 6 ∗ π ∗ h ∗ (h2 + 3 ∗ R2 + 3 ∗ r2 )

Se le pide elaborar un algoritmo expresado en pseudocódigo que permita procesar figuras geométricas en la esfera.
Para ello debe ingresar el tipo de figura geométrica en la esfera que desea procesar, H para Huso esférico, C para
Cuña esférica, E para Casquete esférico y Z para Zona esférica, siempre todo en mayúscula. Debe validar que el
tipo de figura geométrica ingresada sea correcta y dependiendo del tipo de figura geométrica debe calcular el área
o volumen que corresponda. Utilice la constante PI de PSeInt.
Para esta pregunta debe considerar lo siguiente:

Si ingresa la opción de Huso esférico, debe solicitar que ingrese el radio y el valor del ángulo comprendido
entre los dos planos, en grados sexagesimales, y calcule el área del huso esférico.

Si ingresa la opción de Cuña esférica, debe solicitar que ingrese el radio y el valor del ángulo comprendido
entre los dos planos, en grados sexagesimales, y calcule el volumen de la cuña esférica.

Si ingresa la opción de Casquete esférico, debe solicitar que ingrese el radio y la altura y calcule el área del
casquete esférico.

Si ingresa la opción de Zona esférica, debe solicitar que ingrese el radio mayor, radio menor y la altura y
calcule el volumen de la zona esférica

Además, para esta pregunta debe manejar los siguientes mensajes personalizados:

Si el tipo de figura geométrica ingresada no corresponde a una de las señaladas, debe mostrar el siguiente
mensaje El tipo de figura geométrica ingresada no es correcta y el algoritmo ter-
mina.

Si el tipo de figura geométrica ingresada corresponde a una de las señaladas pero está en minúsculas, debe
mostrar el siguiente mensaje La opción ingresada está en minúsculas y el algoritmo termi-
na.

Si el radio (mayor o menor) ingresado es menor o igual que 0, debe mostrar el siguiente mensaje El radio
debe ser mayor que 0 y el algoritmo termina.

Si el ángulo ingresado es menor o igual que 0, debe mostrar el siguiente mensaje El ángulo debe ser
mayor que 0 y el algoritmo termina.

Si la altura ingresada es menor o igual que 0, debe mostrar el siguiente mensaje La altura debe ser
mayor que 0 y el algoritmo termina.

En esta pregunta debe usar selectivas anidadas. No debe usar iterativas.


A continuación se presentan algunos ejemplos de ejecución del algoritmo: utilice los mensajes que se muestran
dentro del desarrollo del pseudocódigo.
Casos de prueba:

1INF01 Fundamentos de Programación 12 Prop.Solución Ex.Parcial(2023-2) Página 12 de 44


Ingrese el tipo de figura geométrica en la esfera:
> Y
El tipo de figura geométrica ingresada no es correcta.

Ingrese el tipo de figura geométrica en la esfera:


> z
La opción ingresada está en minúsculas.

Ingrese el tipo de figura geométrica en la esfera:


> H
Ingrese el radio y el ángulo:
> -3
> 120
El radio debe ser mayor que 0

Ingrese el tipo de figura geométrica en la esfera:


> H
Ingrese el radio y el ángulo:
> 5
> 0
El ángulo debe ser mayor que 0

Ingrese el tipo de figura geométrica en la esfera:


> H
Ingrese el radio y el ángulo:
> 5
> 120
El área del Huso esférico es: 104.7197551197

Ingrese el tipo de figura geométrica en la esfera:


> C
Ingrese el radio y el ángulo:
> 25
> 64
El volumen de la Cuña esférica es: 11635.5283466289

Ingrese el tipo de figura geométrica en la esfera:


> E
Ingrese el radio mayor (R) y la altura:
> 30
> 0
La altura debe ser mayor que 0

Ingrese el tipo de figura geométrica en la esfera:


> E
Ingrese el radio mayor (R) y la altura:
> 30
> 25.3
El área del casquete esférico es: 4768.9376481493

Ingrese el tipo de figura geométrica en la esfera:


> Z
Ingrese el radio y la altura:
> 24
> 35.2
Ingrese el radio menor:
> 0
El radio debe ser mayor que 0.

1INF01 Fundamentos de Programación 13 Prop.Solución Ex.Parcial(2023-2) Página 13 de 44


Ingrese el tipo de figura geométrica en la esfera:
> Z
Ingrese el radio y la altura:
> 24
> 35.2
Ingrese el radio menor:
> 12.5
El volúmen de la zona esférica es: 63323.9353898934

Programa 3: Propuesta de solución


1 Algoritmo Pregunta1C
2 Escribir "Ingrese el tipo de figura geométrica en la esfera: "
3 Leer tipoFigura
4 //Validamos que los tipos de figura sean mayúsculas
5 Si (tipoFigura=’H’ o tipoFigura=’C’ o tipoFigura=’E’ o tipoFigura=’Z’) Entonces
6 //Las figuras H y C tiene cálculos parecidos, por ello para evitar redundancia
7 //se trabajan juntos
8 Si (tipoFigura=’H’ o tipoFigura=’C’) Entonces
9 Escribir "Ingrese el radio y el ángulo: "
10 Leer radio, angulo
11 Si (radio>0) Entonces
12 Si (angulo>0) Entonces
13 Si (tipoFigura=’H’) Entonces
14 area <− ((4 * PI * radio^2)/360)*angulo
15 Escribir "El área del Huso esférico es: ", area
16 SiNo
17 volumen <− (4/3)*((PI * radio^3)/360)*angulo
18 Escribir "El volumen de la Cuña esférica es: ", volumen
19 FinSi
20 SiNo
21 Escribir "El ángulo debe ser mayor que 0"
22 FinSi
23 SiNo
24 Escribir "El radio debe ser mayor que 0"
25 FinSi
26 SiNo
27 //Las figuras E y Z tiene cálculos parecidos, por ello para evitar redundancia
28 //se trabajan juntos
29 //Se realiza selectiva doble porque hay dos mensajes distintos para el
30 //casquete esférico y zona esférica
31 Si (tipoFigura=’E’) Entonces
32 Escribir "Ingrese el radio mayor (R) y la altura: "
33 SiNo
34 Escribir "Ingrese el radio y la altura: "
35 FinSi
36 Leer radio, altura
37 Si (radio>0) Entonces
38 Si (altura>0) Entonces
39 Si (tipoFigura=’E’) Entonces
40 area <− 2 * PI * radio * altura
41 Escribir "El área del casquete esférico es: ", area
42 SiNo
43 Escribir "Ingrese el radio menor (r): "
44 Leer radioMenor
45 Si (radioMenor>0) Entonces
46 volumen <− (1/6) * PI * altura * (altura^2 + 3*radio^2 + 3*radioMenor^2)
47 Escribir "El volumen de la zona esférica es: ", volumen
48 SiNo
49 Escribir "El radio debe ser mayor que 0"
50 FinSi
51 FinSi
52 SiNo
53 Escribir "La altura debe ser mayor que 0"
54 FinSi

1INF01 Fundamentos de Programación 14 Prop.Solución Ex.Parcial(2023-2) Página 14 de 44


55 SiNo
56 Escribir "El radio debe ser mayor que 0"
57 FinSi
58 FinSi
59 SiNo
60 Si (tipoFigura=’h’ o tipoFigura=’c’ o tipoFigura=’e’ o tipoFigura=’z’) Entonces
61 Escribir "La opción ingresada está en minúsculas"
62 sino
63 Escribir "El tipo de figura geométrica ingresada no es correcta"
64 FinSi
65 FinSi
66 FinAlgoritmo

Pregunta 1D (7 puntos) [propuesta por David Allasi]


Una superficie esférica es la superficie engendrada por una circunferencia que gira sobre su diámetro. Una esfera
es la región del espacio que se encuentra en el interior de una superficie esférica.
Dentro de la esfera se pueden formar las siguientes figuras geométricas:

Huso esférico. El huso esférico es la parte de la superficie de una esfera comprendida entre dos planos que
se cortan en el diámetro de aquella. (ver figura 9)

Figura 9: Huso esférico - Imagen tomada de la URL https://www.sangakoo.com/es/temas/


esferas-y-sus-figuras-geometricas

4∗π∗radio2
El área del huso esférico es A = 360 ∗ angulo, siendo angulo el ángulo comprendido entre los dos
planos, en grados sexagesimales.

Cuña esférica. La cuña esférica es la parte de una esfera comprendida entre dos planos que se cortan en el
diámetro de aquella. (ver figura 10)

Figura 10: Cuña esférica - Imagen tomada de la URL https://www.sangakoo.com/es/temas/


esferas-y-sus-figuras-geometricas

4 π∗radio3
El volumen de una cuña esférica es V = 3 ∗ 360 ∗ angulo, siendo angulo el ángulo comprendido entre
los dos planos, en grados sexagesimales.

Casquete esférico. Un casquete esférico es cada una de las partes de la esfera determinada por un plano
secante. (ver figura 11)

1INF01 Fundamentos de Programación 15 Prop.Solución Ex.Parcial(2023-2) Página 15 de 44


Figura 11: Casquete esférico - Imagen tomada de la URL https://www.sangakoo.com/es/temas/
esferas-y-sus-figuras-geometricas

1
El volumen del casquete es V = 3 ∗ π ∗ h2 ∗ (3 ∗ R − h)

Zona esférica. Una zona esférica es la parte de la esfera comprendida entre dos planos secantes paralelos.
(ver figura 12)

Figura 12: Zona esférica - Imagen tomada de la URL https://www.sangakoo.com/es/temas/


esferas-y-sus-figuras-geometricas

1
El volumen de la zona esférica es V = 6 ∗ π ∗ h ∗ (h2 + 3 ∗ R2 + 3 ∗ r2 )

Se le pide elaborar un algoritmo expresado en pseudocódigo que permita procesar figuras geométricas en la esfera.
Para ello debe ingresar el tipo de figura geométrica en la esfera que desea procesar, H para Huso esférico, C para
Cuña esférica, E para Casquete esférico y Z para Zona esférica, siempre todo en mayúscula. Debe validar que el
tipo de figura geométrica ingresada sea correcta y dependiendo del tipo de figura geométrica debe calcular el área
o volumen. Utilice la constante PI de PSeInt.
Para esta pregunta debe considerar lo siguiente:

Si ingresa la opción de Huso esférico, debe solicitar que ingrese el radio y el valor del ángulo comprendido
entre los dos planos, en grados sexagesimales y calcule el área del huso esférico.

Si ingresa la opción de Cuña esférica, debe solicitar que ingrese el radio y el valor del ángulo comprendido
entre los dos planos, en grados sexagesimales y calcule el volumen de la cuña esférica.

Si ingresa la opción de Casquete esférico, debe solicitar que ingrese el radio mayor y la altura y calcule el
volumen del casquete esférico.

Si ingresa la opción de Zona esférica, debe solicitar que ingrese el radio mayor, radio menor y la altura y
calcule el volumen de la zona esférica.

Además, para esta pregunta debe manejar los siguientes mensajes personalizados:

Si el tipo de figura geométrica ingresada no corresponde a una de las señaladas, debe mostrar el siguiente
mensaje El tipo de figura geométrica ingresada no es correcta y el algoritmo ter-
mina.

1INF01 Fundamentos de Programación 16 Prop.Solución Ex.Parcial(2023-2) Página 16 de 44


Si el tipo de figura geométrica ingresada corresponde a una de las señaladas pero está en minúsculas, debe
mostrar el siguiente mensaje La opción ingresada está en minúsculas y el algoritmo termi-
na.

Si el radio (mayor o menor) ingresado es menor o igual que 0, debe mostrar el siguiente mensaje El radio
debe ser mayor que 0 y el algoritmo termina.

Si el ángulo ingresado es menor o igual que 0, debe mostrar el siguiente mensaje El ángulo debe ser
mayor que 0 y el algoritmo termina.

Si la altura ingresada es menor o igual que 0, debe mostrar el siguiente mensaje La altura debe ser
mayor que 0 y el algoritmo termina.

En esta pregunta debe usar selectivas anidadas. No debe usar iterativas.


A continuación se presentan algunos ejemplos de ejecución del algoritmo: utilice los mensajes que se muestran
dentro del desarrollo del pseudocódigo.
Casos de prueba:

Ingrese el tipo de figura geométrica en la esfera:


> Y
El tipo de figura geométrica ingresada no es correcta.

Ingrese el tipo de figura geométrica en la esfera:


> z
La opción ingresada está en minúsculas.

Ingrese el tipo de figura geométrica en la esfera:


> H
Ingrese el radio y el ángulo:
> -3
> 120
El radio debe ser mayor que 0

Ingrese el tipo de figura geométrica en la esfera:


> H
Ingrese el radio y el ángulo:
> 5
> 0
El ángulo debe ser mayor que 0

Ingrese el tipo de figura geométrica en la esfera:


> H
Ingrese el radio y el ángulo:
> 5
> 120
El área del Huso esférico es: 104.7197551197

Ingrese el tipo de figura geométrica en la esfera:


> C
Ingrese el radio y el ángulo:
> 25
> 64
El volumen de la Cuña esférica es: 11635.5283466289

1INF01 Fundamentos de Programación 17 Prop.Solución Ex.Parcial(2023-2) Página 17 de 44


Ingrese el tipo de figura geométrica en la esfera:
> E
Ingrese el radio mayor y la altura:
> 30
> 0
La altura debe ser mayor que 0

Ingrese el tipo de figura geométrica en la esfera:


> E
Ingrese el radio mayor y la altura:
> 30
> 25.3
El volumen del casquete esférico es: 43368.4540312893

Ingrese el tipo de figura geométrica en la esfera:


> Z
Ingrese el radio mayor y la altura:
> 24
> 35.2
Ingrese el radio menor:
> 0
El radio debe ser mayor que 0.

Ingrese el tipo de figura geométrica en la esfera:


> Z
Ingrese el radio mayor y la altura:
> 24
> 35.2
Ingrese el radio menor:
> 12.5
El volumen de la zona esférica es: 63323.9353898934

Programa 4: Propuesta de solución


1 Algoritmo Pregunta1D
2 Escribir "Ingrese el tipo de figura geométrica en la esfera: "
3 Leer tipoFigura
4 //Validamos que los tipos de figura sean mayúsculas
5 Si (tipoFigura=’H’ o tipoFigura=’C’ o tipoFigura=’E’ o tipoFigura=’Z’) Entonces
6 //Las figuras H y C tiene cálculos parecidos, por ello para evitar redundancia
7 //se trabajan juntos
8 Si (tipoFigura=’H’ o tipoFigura=’C’) Entonces
9 Escribir "Ingrese el radio y el ángulo: "
10 Leer radio, angulo
11 Si (radio>0) Entonces
12 Si (angulo>0) Entonces
13 Si (tipoFigura=’H’) Entonces
14 area <− ((4 * PI * radio^2)/360)*angulo
15 Escribir "El área del Huso esférico es: ", area
16 SiNo
17 volumen <− (4/3)*((PI * radio^3)/360)*angulo
18 Escribir "El volumen de la Cuña esférica es: ", volumen
19 FinSi
20 SiNo
21 Escribir "El ángulo debe ser mayor que 0"
22 FinSi
23 SiNo
24 Escribir "El radio debe ser mayor que 0"
25 FinSi
26 SiNo
27 //Las figuras E y Z tiene cálculos parecidos, por ello para evitar redundancia

1INF01 Fundamentos de Programación 18 Prop.Solución Ex.Parcial(2023-2) Página 18 de 44


28 //se trabajan juntos
29 Escribir "Ingrese el radio mayor (R) y la altura: "
30 Leer radio, altura
31 Si (radio>0) Entonces
32 Si (altura>0) Entonces
33 Si (tipoFigura=’E’) Entonces
34 volumen <− (1/3) * PI * altura^2 * (3*radio − altura)
35 Escribir "El volumen del casquete esférico es: ", volumen
36 SiNo
37 Escribir "Ingrese el radio menor (r): "
38 Leer radioMenor
39 Si (radioMenor>0) Entonces
40 volumen <− (1/6) * PI * altura * (altura^2 + 3*radio^2 + 3*radioMenor^2)
41 Escribir "El volumen de la zona esférica es: ", volumen
42 SiNo
43 Escribir "El radio debe ser mayor que 0"
44 FinSi
45 FinSi
46 SiNo
47 Escribir "La altura debe ser mayor que 0"
48 FinSi
49 SiNo
50 Escribir "El radio debe ser mayor que 0"
51 FinSi
52 FinSi
53 SiNo
54 Si (tipoFigura=’h’ o tipoFigura=’c’ o tipoFigura=’e’ o tipoFigura=’z’) Entonces
55 Escribir "La opción ingresada está en minúsculas"
56 sino
57 Escribir "El tipo de figura geométrica ingresada no es correcta"
58 FinSi
59 FinSi
60 FinAlgoritmo

Pregunta 2A (7 puntos) [propuesta por Jennifer Zárate]


Una tasa de interés en un préstamo bancario es el costo que un prestatario (una persona, empresa u organización)
debe pagar al banco por el dinero prestado. Se puede describir como una medida del costo del dinero y se expresa
generalmente como un porcentaje anual sobre el monto prestado. Es una de las principales formas en que los
bancos, generan ingresos a través de sus servicios de préstamos.
Es importante que los prestatarios entiendan completamente las tasas de interés antes de solicitar un préstamo, ya
que estas tasas pueden tener un impacto significativo en el costo total del préstamo. Además, es necesario comparar
las tasas de interés y las condiciones de diferentes bancos para obtener la mejor alternativa.
Los préstamos bancarios se realizan en función a una tasa de interés y un plazo para determinar el monto que se
debe pagar como cuota mensual. La fórmula para calcular el monto de una cuota (también conocida como pago
periódico o amortización) en función de un monto principal, un plazo y una tasa de interés se basa en la fórmula de
amortización de un préstamo o de un financiamiento. La fórmula más utilizada para este cálculo se conoce como
la fórmula de cuota fija, que es la que se usa en préstamos hipotecarios, préstamos personales y otros tipos de
financiamiento a plazo fijo, y es la siguiente:

P r(1+r)n
C= (1+r)n −1

Donde:

C: es el monto de la cuota

P: es el monto principal del préstamo

r es la tasa de interés

1INF01 Fundamentos de Programación 19 Prop.Solución Ex.Parcial(2023-2) Página 19 de 44


n es el número de cuotas en el que se realiza el préstamo

Tomar en cuenta que la tasa de interés y el plazo deben estar en la misma base de tiempo (por ejemplo, si la tasa
es anual y el plazo es mensual, se debe convertir la tasa a una tasa mensual). A continuación, se detalla la tasa de
interés (mensual) que varía de acuerdo al monto del préstamo y del plazo:

Figura 13: Tasas de interés mensual

Se le pide que elabore un programa en lenguaje C utilizando programación modular que dado el monto de préstamo
y la cantidad de cuotas en las que se solicita el préstamo, permita obtener la tasa de interés mensual y a partir de
ella calcular y mostrar el monto de la cuota, así como el monto total final incluido el interés y el monto total que
se pagará únicamente de intereses. Deberá validar los valores ingresados inicialmente y en caso ingrese valores
incorrectos deberá imprimir un mensaje de error.
Los subprogramas o módulos que deberá utilizar, adicionales al principal, son los siguientes:

Un subprograma o módulo que permita validar que el monto sea positivo y que la cantidad de cuotas sea 12,
24 o 36.

Un subprograma o módulo que, dado el monto, el plazo y la tasa de interés calcule el monto de la cuota
mensual del préstamo.

Un subprograma o módulo que, dada la cantidad de cuotas, el monto del préstamo y el monto de la cuo-
ta mensual obtenga el monto total final incluido el interés y el monto total que se pagará únicamente de
intereses.

Ninguno de estos subprogramas o módulos deben realizar ninguna impresión.

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

En esta pregunta debe usar selectivas anidadas, programación modular y definir constantes. No debe usar
iterativas.
Debe usar los mensajes que se muestran en los casos de prueba para el desarrollo del programa.
Casos de Prueba:

Ingrese el monto de préstamo: 2500


Ingrese el número de cuotas en las que solicita el préstamo: 20
Ingresó algún valor incorrecto

Ingrese el monto de préstamo: -3000


Ingrese el número de cuotas en las que solicita el préstamo: 24
Ingresó algún valor incorrecto

Ingrese el monto de préstamo: 4000


Ingrese el número de cuotas en las que solicita el préstamo: 12
El monto de la cuota a pagar en 12 meses es: 363.302115 soles
El monto final que se pagará incluyendo intereses es: 4359.625386 soles
El monto del interés pagado es 359.625386 soles

1INF01 Fundamentos de Programación 20 Prop.Solución Ex.Parcial(2023-2) Página 20 de 44


Ingrese el monto de préstamo: 8500
Ingrese el número de cuotas en las que solicita el préstamo: 36
El monto de la cuota a pagar en 36 meses es: 297.158908 soles
El monto final que se pagará incluyendo intereses es: 10697.720688 soles
El monto del interés pagado es 2197.720688 soles

Ingrese el monto de préstamo: 2500


Ingrese el número de cuotas en las que solicita el préstamo: 24
El monto de la cuota a pagar en 24 meses es: 124.086694 soles
El monto final que se pagará incluyendo intereses es: 2978.080650 soles
El monto del interés pagado es 478.080650 soles

Programa 5: Propuesta de solución


1 #include <stdio.h>
2 #include <math.h>
3
4 #define MONTO_RANGO1 5000
5 #define MONTO_RANGO2 10000
6 #define PLAZO_12 12
7 #define PLAZO_24 24
8 #define PLAZO_36 36
9 #define TASA_INTERES_1 0.0135
10 #define TASA_INTERES_2 0.0145
11 #define TASA_INTERES_3 0.0155
12 #define TASA_INTERES_4 0.011
13 #define TASA_INTERES_5 0.012
14 #define TASA_INTERES_6 0.013
15
16 int ValidarMontoYPlazo(double monto, int plazo);
17 double CalcularMontoCuotaPrestamo(double monto,int plazo,double tasaInteres);
18 void ObtenerValoresPrestamo(int plazo, double monto, double montoCuota,double *montoFinalAPagar,double *montoInteres);
19
20 int main(){
21 double monto,tasaInteres,montoCuota,montoFinalAPagar,montoInteres;
22 int plazo;
23
24 printf("Ingrese el monto de préstamo: ");
25 scanf(" %lf",&monto);
26 printf("Ingrese el número de cuotas en las que solicita el préstamo: ");
27 scanf(" %d",&plazo);
28
29 /*luego de leer los datos de entrada, se deben validar si son correctos, caso contrario enviar un mensaje de error*/
30 if (ValidarMontoYPlazo(monto,plazo)){
31 /*se obtendrá la tasa de interés de acuerdo al monto y plazo ingresado*/
32 if (monto<MONTO_RANGO1){
33 if (plazo==PLAZO_12){
34 tasaInteres = TASA_INTERES_1;
35 }
36 else if (plazo==PLAZO_24){
37 tasaInteres = TASA_INTERES_2;
38 }
39 else if (plazo==PLAZO_36){
40 tasaInteres = TASA_INTERES_3;
41 }
42 }
43 else if (monto<MONTO_RANGO2){
44 if (plazo==PLAZO_12){
45 tasaInteres = TASA_INTERES_4;
46 }
47 else if (plazo==PLAZO_24){
48 tasaInteres = TASA_INTERES_5;
49 }
50 else if (plazo==PLAZO_36){

1INF01 Fundamentos de Programación 21 Prop.Solución Ex.Parcial(2023-2) Página 21 de 44


51 tasaInteres = TASA_INTERES_6;
52 }
53 }
54 /*Luego de obtener la tasa de interés se realizarán los cálculos para los montos solicitados*/
55 montoCuota = CalcularMontoCuotaPrestamo(monto,plazo,tasaInteres);
56 ObtenerValoresPrestamo(plazo,monto,montoCuota,&montoFinalAPagar,&montoInteres);
57
58 printf("El monto de la cuota a pagar en %d meses es: %lf soles\n",plazo,montoCuota);
59 printf("El monto final que se pagará incluyendo intereses es: %lf soles\n",montoFinalAPagar);
60 printf("El monto del interés pagado es %lf soles\n",montoInteres);
61 }
62 else{
63 printf("Ingresó algún valor incorrecto\n");
64 }
65 return 0;
66 }
67
68 int ValidarMontoYPlazo(double monto, int plazo){
69 return (monto>0 && (plazo==PLAZO_12 || plazo==PLAZO_24 || plazo==PLAZO_36));
70 }
71
72 double CalcularMontoCuotaPrestamo(double monto,int plazo,double tasaInteres){
73 double numerador, denominador;
74
75 numerador = monto*tasaInteres*pow((1+tasaInteres),plazo);
76 denominador = pow((1+tasaInteres),plazo) − 1;
77 return numerador/denominador;
78 }
79
80 void ObtenerValoresPrestamo(int plazo, double monto, double montoCuota,double *montoFinalAPagar,double *montoInteres){
81 *montoFinalAPagar = montoCuota*plazo;
82 *montoInteres = *montoFinalAPagar − monto;
83 }

Pregunta 2B (7 puntos) [propuesta por Rosa Latorraca]


La latitud es la distancia angular entre la línea ecuatorial (el ecuador) y un punto determinado de la Tierra, medida
a lo largo del meridiano en el que se encuentra dicho punto. Según el hemisferio en el que se sitúe el punto, puede
ser latitud norte o sur.
La latitud proporciona la localización de un lugar, en dirección Norte o Sur desde el ecuador y se expresa en
medidas angulares que varían desde los 0° del Ecuador hasta los 90° N del polo Norte o los 90° S del Polo Sur.
Esto sugiere que si trazamos una recta que vaya desde un punto cualquiera de la Tierra hasta el centro de la misma,
el ángulo que forma esa recta con el plano ecuatorial expresa la latitud de dicho punto. La orientación Norte o Sur
depende de si el punto marcado está más cerca del Polo Norte que del Polo Sur (latitud norte) o si está más cerca
del Polo Sur que del Polo Norte (latitud Sur).
La latitud se mide en grados sexagesimales (representados por el símbolo grados ° inmediatamente arriba y a la
derecha del número, mientras que las subdivisiones o fracciones de los grados se representan con ’que significa
minuto sexagesimal y ” que significa segundo sexagesimal), entre 0° y 90°; y puede representarse de dos formas:

Indicando a qué hemisferio pertenece la coordenada, escribiendo N o S después del símbolo de grado y
separado de este por un espacio.
Añadiendo valores positivos, es decir, con un signo más (+) o sin ningún signo antes del número —en el
norte—, y negativos, con un signo menos (–) antes del número —en el sur—.

Por ejemplo, diez grados en latitud norte podría representarse 10° N o 10°; y diez grados sur podría ser 10° S o
-10°.
Se denomina zona latitudinal a cada una de las zonas de la Tierra que dependen de su latitud y en las que los
paralelos notables o principales dividen a la superficie terrestre. Dichas zonas son cinco: dos zonas templadas
(norte y sur), dos zonas polares (ártica y antártica) y una zona intertropical, a ambos lados del ecuador terrestre.

1INF01 Fundamentos de Programación 22 Prop.Solución Ex.Parcial(2023-2) Página 22 de 44


En la figura 14 se muestran las zonas latitudinales:

Figura 14: Zonas latitudinales. Imagen tomada de la URL https://es.wikipedia.org/wiki/Latitud

Se pide que desarrolle un programa en lenguaje C utilizando el paradigma de programación modular que solicite:
la opción a ingresar (el caracter S o el caracter D). Asuma que el usuario siempre ingresará el caracter S o D. Si el
usuario ingresó la opción S, se deberá solicitar el grado sexagesimal, minuto sexagesimal, segundo sexagesimal y
el sentido de la latitud. Si el usuario ingresó la opción D, se deberá solicitar el grado decimal. En la primera opción
se deberá validar los datos: el grado debe estar entre 0 al 90, minuto del 0 al 59, segundo del 0 al 59 y el sentido
solo el caracter S y N; en el caso de la opción D, asuma que el usuario ingresará el grado decimal entre -90 y 90.
Si los datos son válidos, se debe indicar a qué zona latitudinal corresponde y en el caso de la opción D, se deberá
mostrar también la latitud en el formato sexagesimal.
Los módulos que implemente, adicionales al principal, deberán tener las siguientes características:

Un módulo para la validación de los siguientes datos: el grado sexagesimal, minuto sexagesimal, segundo
sexagesimal y el sentido de la latitud . Este módulo debe devolver un valor.

Un módulo que convierta a grado decimal. Este módulo recibirá el grado sexagesimal, minuto sexagesimal
y segundo sexagesimal y realizará la conversión a grado decimal. Este módulo debe devolver un valor.

Un módulo que convierta del grado decimal al grado sexagesimal. Este módulo recibirá el grado decimal,
calculará y retornará el grado sexagesimal, minuto sexagesimal y segundo sexagesimal.

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

Recordar que:

1 grado sexagesimal equivale a 60 minutos sexagesimales.

1 minuto sexagesimal equivale a 60 segundos sexagesimales.

En esta pregunta debe usar selectivas anidadas, programación modular y definir constantes. No debe usar
iterativas.

1INF01 Fundamentos de Programación 23 Prop.Solución Ex.Parcial(2023-2) Página 23 de 44


Debe usar los mensajes que se muestran en los casos de prueba para el desarrollo del programa.

Ingrese la opción (S o D): S


Ingrese la latitud en formato sexagesimal: 98 20 15
Ingrese el sentido de la latitud: S
Datos inválidos.

Ingrese la opción (S o D): S


Ingrese la latitud en formato sexagesimal: 89 20 15
Ingrese el sentido de la latitud: G
Datos inválidos.

Ingrese la opción (S o D): S


Ingrese la latitud en formato sexagesimal: 69 25 45
Ingrese el sentido de la latitud: S
Zona polar Antártica

Ingrese la opción (S o D): D


Ingrese la latitud en formato decimal: -35.84
La latitud en formato sexagesimal es: 35° 50’24’’ S
Zona templada Sur

Ingrese la opción (S o D): D


Ingrese la latitud en formato decimal: 50.71
La latitud en formato sexagesimal es: 50° 42’ 36’’ N
Zona templada Norte

Ingrese la opción (S o D): S


Ingrese la latitud en formato sexagesimal: 15 20 50
Ingrese el sentido de la latitud: N
Zona intertropical

Ingrese la opción (S o D): S


Ingrese la latitud en formato sexagesimal: 70 50 3
Ingrese el sentido de la latitud: N
Zona polar ártica

Programa 6: Propuesta de solución


1 #include <stdio.h>
2 #include <math.h>
3
4 #define TROPICO 23.5
5 #define CIRCULO_POLAR 66.5
6 #define HORAS_SEGUNDOS 3600
7 #define MINUTOS_O_SEGUNDOS 60
8
9 int validarDatos(int gradosSex, int minutos, int segundos, char sentidoLatitud);
10 double convertirAGradosDecimales(int gradosSex,int minutos,int segundos);
11 void convertirAFormatoSexagesimal(double gradosDecimal,int *gradosSex,int *minutos,int *segundos);
12
13 int main(){
14 int gradosSex, minutos, segundos,validoGradosSexagesimal,validoSentido;
15 int debeImprimir=1; /*Flag para que imprima sólo en casos válidos*/
16 char opcion, sentidoLatitud;
17 double gradosDecimal;
18
19 printf("Ingrese la opción (S o D): ");

1INF01 Fundamentos de Programación 24 Prop.Solución Ex.Parcial(2023-2) Página 24 de 44


20 scanf(" %c",&opcion);
21 if(opcion==’S’){
22 printf("Ingrese la latitud en formato sexagesimal: ");
23 scanf(" %d %d %d",&gradosSex,&minutos,&segundos);
24 printf("Ingrese el sentido de la latitud: ");
25 scanf("\n %c",&sentidoLatitud);
26 if(validarDatos(gradosSex, minutos,segundos,sentidoLatitud)){
27 gradosDecimal=convertirAGradosDecimales(gradosSex,minutos,segundos);
28 }
29 else
30 debeImprimir=0;
31 }
32 else{/*Opción D*/
33 printf("Ingrese la latitud en formato decimal: ");
34 scanf(" %lf",&gradosDecimal);
35 if(gradosDecimal<0){
36 gradosDecimal=fabs(gradosDecimal);
37 sentidoLatitud=’S’;
38 }
39 else
40 sentidoLatitud=’N’;
41 convertirAFormatoSexagesimal(gradosDecimal,&gradosSex,&minutos,&segundos);
42 printf("La latitud en formato sexagesimal es: %d %d’ %d’’ %c\n",gradosSex,minutos,segundos,sentidoLatitud);
43 }
44 if(debeImprimir){
45 if(gradosDecimal<=TROPICO)
46 printf("Zona intertropical\n");
47 else{
48 if(sentidoLatitud==’S’){
49 if(gradosDecimal<=CIRCULO_POLAR)
50 printf("Zona templada Sur\n");
51 else
52 printf("Zona polar Antártica\n");
53 }
54 else{
55 if(gradosDecimal<=CIRCULO_POLAR)
56 printf("Zona templada Norte\n");
57 else
58 printf("Zona polar Ártica\n");
59 }
60 }
61 }
62 else
63 printf("Datos inválidos.\n");
64
65 return 0;
66 }
67
68 int validarDatos(int gradosSex, int minutos, int segundos, char sentidoLatitud){
69 int validoGradosSexagesimal, validoSentido;
70 validoGradosSexagesimal=(gradosSex>=0 && gradosSex<=89 && minutos>=0 && minutos<=59 && segundos>=0 &&
minutos<=59) ||
71 (gradosSex==90 && minutos==0 && segundos==0);
72 validoSentido=sentidoLatitud==’S’||sentidoLatitud==’N’;
73 return validoGradosSexagesimal && validoSentido;
74 }
75
76 double convertirAGradosDecimales(int gradosSex,int minutos,int segundos){
77 return (double)(gradosSex*HORAS_SEGUNDOS+minutos*MINUTOS_O_SEGUNDOS+segundos)/HORAS_SEGUNDOS;
78 }
79
80 void convertirAFormatoSexagesimal(double gradosDecimal,int *gradosSex,int *minutos,int *segundos){
81 (*gradosSex)=(int)gradosDecimal;
82 (*minutos)=(gradosDecimal−(*gradosSex))*MINUTOS_O_SEGUNDOS;
83 (*segundos)=((gradosDecimal−(*gradosSex))*MINUTOS_O_SEGUNDOS−(*minutos))*MINUTOS_O_SEGUNDOS;
84 }

1INF01 Fundamentos de Programación 25 Prop.Solución Ex.Parcial(2023-2) Página 25 de 44


Pregunta 2C (7 puntos) [propuesta por Sergio Ponce]
El Organismo Supervisor de la Inversión en Energía y Minería (Osinergmin) explicó cómo se debe hacer el cálculo
del consumo eléctrico para conocer el monto aproximado que se debe pagar a fin de mes.
Primero, se debe listar todos los artefactos eléctricos (incluídas las luces) que tiene en su hogar. Segundo, debe
convertir la potencia del artefacto eléctrico de Watts (W) a Kilowatts (Kw).
Para realizar la conversión de Watts a Kilowatts, es necesario dividir la potencia de su artefacto entre 1000.
Una vez convertidas las potencias de Watts a Kilowatts, la potencia de cada artefacto se multiplica por la cantidad
de horas usadas al día en promedio, luego para obtener el consumo mensual del artefacto se multiplica el resultado
anterior por 30 días, finalmente el resultado se vuelve a multiplicar por el costo establecido por Osinergmin para
cada Kw/h (Kilowatt por hora); es decir, S/. 0,55.
Se le pide que elabore un programa en lenguaje C que solicite al usuario indicar si utiliza alguno de los artefactos
que se muestran a continuación:

Y luego calcule el monto aproximado que deberá pagar a fin de mes; además, deberá solicitar al usuario el presu-
puesto que dispone para realizar el pago y determinar si le alcanza o no.
Para ello debe tener en cuenta lo siguiente:

Para indicar si usa un artefacto debe ingresar 1, si no usa el artefacto debe ingresar 0. Cualquier otro valor
será inválido. Si por lo menos uno de los datos no es válido, deberá mostrar el siguiente mensaje “Alguno de
los valores ingresados no es válido” y el programa debe terminar.

Si el usuario no utiliza ninguno de los artefactos de la lista debe mostrar el siguiente mensaje “No utiliza
ningún artefacto” y el programa debe terminar.

Para cada artefacto que utilice deberá solicitar al usuario el promedio de horas que usa el artefacto en un día
(asuma que el usuario ingresa un valor mayor que cero).

Para el caso de las luces, además del promedio de horas, deberá consultar lo siguiente:

• La cantidad de luces que tiene en casa (asuma que el usuario ingresa un valor mayor que cero).
• El tipo de luces que utiliza; para ello considere que todas las luces del usuario son o I: luces incandes-
centes o L: luces Led (asuma que el usuario siempre ingresa uno de los valores I o L).

Si el usuario utiliza por lo menos un artefacto entonces se le debe solicitar el presupuesto que dispone para
realizar el pago a fin de mes (asuma que el usuario ingresa un valor mayor que cero).

Considere que un mes tiene 30 días.

Además de implementar el programa principal, deberá utilizar programación modular para implementar lo siguien-
te:

Un subprograma o módulo que reciba como parámetros los datos ingresados por el usuario previamente y
retorne si son correctos.

Un subprograma o módulo que reciba como parámetros el promedio de horas que usa un artefacto en un día
y el consumo por hora en Watts y retorne el consumo del artefacto en Kilowatts en un día.

1INF01 Fundamentos de Programación 26 Prop.Solución Ex.Parcial(2023-2) Página 26 de 44


Un subprograma o módulo que reciba como parámetros el consumo total en Kilowatts por día de todos los
artefactos que el usuario usa y el presupuesto con el que cuenta para pagar el servicio de electricidad y que
calcule y retorne el costo por mes y si el presupuesto del usuario alcanza para pagarlo o no.

Ninguno de estos subprogramas o módulos deben realizar ninguna impresión.

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

En esta pregunta debe usar selectivas anidadas, programación modular y definir constantes. No debe usar
iterativas.
Debe usar los mensajes que se muestran en los casos de prueba para el desarrollo del programa.
Casos de prueba:

¿Usa televisor? (0: No | 1: Sí): -1


¿Usa equipo de sonido? (0: No | 1: Sí): 1
¿Usa luces? (0: No | 1: Sí): 0
Alguno de los valores ingresados no es válido

¿Usa televisor? (0: No | 1: Sí): 0


¿Usa equipo de sonido? (0: No | 1: Sí): 0
¿Usa luces? (0: No | 1: Sí): 0
No utiliza ningún artefacto

¿Usa televisor? (0: No | 1: Sí): 1


¿Usa equipo de sonido? (0: No | 1: Sí): 0
¿Usa luces? (0: No | 1: Sí): 0
Ingrese el promedio de horas que su televisor está encendido durante un día: 5
Ingrese el presupuesto mensual en soles para el pago de la electricidad: 20

El monto que debe pagar a fin de mes es: 9.900000 soles


El presupuesto alcanzará para realizar el pago.

¿Usa televisor? (0: No | 1: Sí): 1


¿Usa equipo de sonido? (0: No | 1: Sí): 1
¿Usa luces? (0: No | 1: Sí): 1
Ingrese el promedio de horas que su televisor está encendido durante un día: 8
Ingrese el promedio de horas que su equipo de sonido está encendido durante un día: 10
Ingrese la cantidad de luces tiene en su casa: 5
Ingrese el promedio de horas que sus luces están encendidas durante un día: 5
Ingrese el tipo de luces que usa (I)ncandescentes o (L)ed: L
Ingrese el presupuesto mensual en soles para el pago de la electricidad: 80

El monto que debe pagar a fin de mes es: 32.752500 soles


El presupuesto alcanzará para realizar el pago.

¿Usa televisor? (0: No | 1: Sí): 0


¿Usa equipo de sonido? (0: No | 1: Sí): 1
¿Usa luces? (0: No | 1: Sí): 0
Ingrese el promedio de horas que su equipo de sonido está encendido durante un día: 10
Ingrese el presupuesto mensual en soles para el pago de la electricidad: 10

El monto que debe pagar a fin de mes es: 13.200000 soles


Le faltan 3.200000 soles

Programa 7: Propuesta de solución


1 #include <stdio.h>

1INF01 Fundamentos de Programación 27 Prop.Solución Ex.Parcial(2023-2) Página 27 de 44


2 #define DIAS_MES 30
3 #define COSTO_HORA 0.55
4 #define WATTS_TV_HORA 120
5 #define WATTS_EQUIPO_HORA 80
6 #define WATTS_LUCES_LED_HORA 9
7 #define WATTS_LUCES_INCAN_HORA 60
8
9 int validarDatos(int usaTelevisor, int usaEquipo, int usaLuces);
10 double calcularConsumoPromedioPorDia(double horasPorDia, double wattsPorHora);
11 void calcularCostoPorMes(double consumoTotalKiloWattsDia, double presupuesto, double *costoTotalMes, int *alcanzaPresupuesto);
12 int main() {
13 int diasXMes, alcanzaPresupuesto, datosValidos, usaTelevisor, usaLavadora, usaEquipo, usaLuces, cantLuces;
14 double costoTotalMes,presupuesto, wattsPorHora, horasPorDia, consumoTotalKiloWattsDia=0, consumoTelevisor=0,
consumoEquipo=0, consumoLuces;
15 char tipoLuces;
16 /*Pedimos datos al usuario*/
17 printf("¿Usa televisor? (0: No | 1: Sí): ");
18 scanf(" %d",&usaTelevisor);
19 printf("¿Usa equipo de sonido? (0: No | 1: Sí): ");
20 scanf(" %d",&usaEquipo);
21 printf("¿Usa luces? (0: No | 1: Sí): ");
22 scanf(" %d",&usaLuces);
23 datosValidos=validarDatos(usaTelevisor,usaEquipo,usaLuces);
24 if (datosValidos) {
25 if (!usaTelevisor && !usaEquipo && !usaLuces) {/*Si no usa ningun artefacto, entonces no debe hacer ningun cálculo*/
26 printf("No utiliza ningún artefacto");
27 } else {
28 if (usaTelevisor) {
29 printf("Ingrese el promedio de horas que su televisor está encendido durante un día: ");
30 scanf(" %lf",&horasPorDia);
31 wattsPorHora=WATTS_TV_HORA;
32 consumoTelevisor=calcularConsumoPromedioPorDia(horasPorDia,wattsPorHora);
33 }
34 if (usaEquipo) {
35 printf("Ingrese el promedio de horas que su equipo de sonido está encendido durante un día: ");
36 scanf(" %lf",&horasPorDia);
37 wattsPorHora=WATTS_EQUIPO_HORA;
38 consumoEquipo=calcularConsumoPromedioPorDia(horasPorDia,wattsPorHora);
39 }
40 if (usaLuces) {
41 printf("Ingrese la cantidad de luces tiene en su casa: ");
42 scanf(" %d",&cantLuces);
43 printf("Ingrese el promedio de horas que sus luces están encendidas durante un día: ");
44 scanf(" %lf",&horasPorDia);
45 printf("Ingrese el tipo de luces que usa (I)ncandescentes o (L)ed: ");
46 scanf(" %c",&tipoLuces);
47 if (tipoLuces==’I’) {
48 wattsPorHora=WATTS_LUCES_INCAN_HORA;
49 } else {
50 wattsPorHora=WATTS_LUCES_LED_HORA;
51 }
52 /*actualizamos horas por día con la cantidad de luces que se tienen en casa*/
53 horasPorDia=horasPorDia*cantLuces;
54 consumoLuces=calcularConsumoPromedioPorDia(horasPorDia,wattsPorHora);
55 }
56 consumoTotalKiloWattsDia=consumoTelevisor+consumoEquipo+consumoLuces;
57 printf("Ingrese el presupuesto mensual en soles para el pago de la electricidad: ");
58 scanf(" %lf",&presupuesto);
59 calcularCostoPorMes(consumoTotalKiloWattsDia,presupuesto, &costoTotalMes, &alcanzaPresupuesto);
60 printf("\nEl monto que debe pagar a fin de mes es: %lf soles\n", costoTotalMes);
61 if (alcanzaPresupuesto) {
62 printf("El presupuesto alcanzará para realizar el pago.");
63 } else {
64 printf("Le faltan %lf soles", costoTotalMes−presupuesto);
65 }
66 }
67 } else {

1INF01 Fundamentos de Programación 28 Prop.Solución Ex.Parcial(2023-2) Página 28 de 44


68 printf("Alguno de los valores ingresados no es válido");
69 }
70 return 0;
71 }
72 int validarDatos(int usaTelevisor, int usaEquipo, int usaLuces) {
73 return (usaTelevisor==1 || usaTelevisor==0) && (usaEquipo==1 || usaEquipo==0) && (usaLuces==1 || usaLuces==0);
74 }
75 double calcularConsumoPromedioPorDia(double horasPorDia, double wattsPorHora) {
76 double kiloWattsPorHora=wattsPorHora/1000; /*pasamos de watts a KWatts*/
77 return kiloWattsPorHora*horasPorDia;
78 }
79 void calcularCostoPorMes(double consumoTotalKiloWattsDia, double presupuesto, double *costoTotalMes, int *alcanzaPresupuesto) {
80 /*Realizamos las dos operaciones solicitadas en el subprograma*/
81 *costoTotalMes=consumoTotalKiloWattsDia*DIAS_MES*COSTO_HORA;
82 *alcanzaPresupuesto=(presupuesto>=(*costoTotalMes));
83 }

Pregunta 2D (7 puntos) [propuesta por Sergio Ponce]


Cada entidad financiera tiene su propia forma de realizar una calificación crediticia antes de otorgar un préstamo
hipotecario, las entidades se basan en distintas variables que le son solicitadas a la persona que desea solicitar el
préstamo.
Por otro lado, el impuesto de Alcabala es el impuesto que se aplica ante la compra o transferencia de un bien in-
mueble como, por ejemplo, una casa o un departamento. El pago es responsabilidad del comprador de la propiedad.
Sin embargo, no es necesario pagar impuesto de Alcabala cuando es un proceso de primera venta; por ejemplo,
cuando le haces la compra directamente a una constructora, no tienes que pagar Impuesto de Alcabala.
Se le pide que elabore un programa en lenguaje C que solicite al usuario su edad, el sueldo, el tipo de trabajo y
si la vivienda es de segundo uso y determine si se le puede otorgar un préstamo hipotecario aplicando la siguiente
fórmula:

puntajeF inal = (2 ∗ puntajeEdad) + (4 ∗ puntajeSueldo) + (3 ∗ puntajeT ipoT rabajo)

Considerar que:

puntajeF inal es el puntaje final asignado a la persona que solicita el préstamos hipotecario.

puntajeEdad es el puntaje obtenido según la edad.

puntajeSueldo es el puntaje obtenido según el sueldo.

puntajeT ipoT rabajo es el puntaje obtenido según el tiempo de trabajo.

Para que se le otorgue el préstamo hipotecario al usuario el valor de puntajeF inal debe ser mayor o igual
que 10.

Además, si el usuario califica para un préstamo hipotecario e indica que la vivienda que desea comprar es de
segundo uso, deberá calcular el impuesto de Alcabala que tendrá que pagar, para ello también deberá solicitar el
precio de la vivienda y aplicar la siguiente fórmula:

alcabala = (montoV ivienda − 10 ∗ U IT ) ∗ 0.03

Considerar que:

Una U IT es la Unidad Impositiva Tributaria y equivale a S/. 4300.

Puede asumir que el usuario ingresó un precio de vivienda válido.

1INF01 Fundamentos de Programación 29 Prop.Solución Ex.Parcial(2023-2) Página 29 de 44


Para el desarrollo de la pregunta debe tener en cuenta que:

para solicitar un préstamo hipotecario debe haber cumplido por lo menos 18 años y ser menor de 80 años.
Su sueldo debe ser por lo menos 4000 soles.
El tipo de trabajo solo puede ser Dependiente (D) o Independiente (I).
Para indicar si la vivienda que desea comprar es de segundo uso debe ingresar 1; si no es de segundo uso,
debe ingresar 0.
Si se ingresaron datos que no corresponden a los indicados, deberá enviar un mensaje “Alguno de los valores
ingresados no es válido” y el programa debe terminar.

Para el cálculo del puntaje final, debe tener en cuenta la información de las siguientes tablas 1, 2 y 3:

Edad Puntaje por edad


18<= edad <25 1
25<= edad <45 2
45<= edad <80 1.5

Tabla 1: Valor del puntaje por rango de edad

Sueldo Puntaje por sueldo


4000<= sueldo <7000 0.5
7000<= sueldo <15000 1
15000<= sueldo 1.5

Tabla 2: Valor del puntaje por rango de sueldo

Tipo de trabajo Puntaje por tipo de trabajo


Dependiente 1.5
Independiente 1

Tabla 3: Valor del puntaje por tipo de trabajo

Finalmente, además de implementar el programa principal, deberá utilizar programación modular para implemen-
tar lo siguiente:

Un subprograma o módulo que reciba como parámetros los datos ingresados por el usuario previamente y
retorne si son correctos.
Un subprograma o módulo que reciba como parámetro el precio de la vivienda y devuelva el valor del
Impuesto de Alcabala.
Un subprograma o módulo que reciba como parámetros el puntaje obtenido por la edad, el puntaje obtenido
por el sueldo y el puntaje obtenido por el tipo de trabajo y que calcule y retorne el puntaje final y si el usuario
califica para un préstamo hipotecario.
Ninguno de estos subprogramas o módulos deben realizar ninguna impresión.
No deberá implementar otros módulos diferentes a los indicados previamente.

En esta pregunta debe usar selectivas anidadas, programación modular y definir constantes. No debe usar
iterativas.
Debe usar los mensajes que se muestran en los casos de prueba para el desarrollo del programa.
Casos de prueba:

1INF01 Fundamentos de Programación 30 Prop.Solución Ex.Parcial(2023-2) Página 30 de 44


Ingrese su edad: 100
Ingrese su remuneración mensual en soles: 4500
Tipo de trabajo (D)ependiente o (I)ndependiente: D
¿La vivienda es de segundo uso? (0: No | 1: Sí): 0

Alguno de los valores ingresados no es válido

Ingrese su edad: 30
Ingrese su remuneración mensual en soles: 6500
Tipo de trabajo (D)ependiente o (I)ndependiente: x
¿La vivienda es de segundo uso? (0: No | 1: Sí): 0

Alguno de los valores ingresados no es válido

Ingrese su edad: 25
Ingrese su remuneración mensual en soles: 7500
Tipo de trabajo (D)ependiente o (I)ndependiente: D
¿La vivienda es de segundo uso? (0: No | 1: Sí): 1

Su puntaje fue de 12.500000, por lo que sí califica para el préstamo


Ingrese el precio en soles de la vivienda para calcular el Impuesto de Alcabala: 350000
El Impuesto de Alcabala que debe pagar es: 9210.000000 soles

Ingrese su edad: 48
Ingrese su remuneración mensual en soles: 15000
Tipo de trabajo (D)ependiente o (I)ndependiente: D
¿La vivienda es de segundo uso? (0: No | 1: Sí): 0

Su puntaje fue de 13.500000, por lo que sí califica para el préstamo

Ingrese su edad: 50
Ingrese su remuneración mensual en soles: 6000
Tipo de trabajo (D)ependiente o (I)ndependiente: D
¿La vivienda es de segundo uso? (0: No | 1: Sí): 1

Su puntaje fue de 9.500000, por lo que NO califica para el préstamo

Programa 8: Propuesta de solución


1 #include <stdio.h>
2 #define UIT 4300
3 #define TASA_TRIBUTO 0.03
4 #define PUNTAJE_EDAD_1 1
5 #define PUNTAJE_EDAD_2 2
6 #define PUNTAJE_EDAD_3 1.5
7 #define PUNTAJE_INGRESO_1 0.5
8 #define PUNTAJE_INGRESO_2 1
9 #define PUNTAJE_INGRESO_3 1.5
10 #define PUNTAJE_DEPENDIENTE 1.5
11 #define PUNTAJE_INDEPENDIENTE 1
12
13 int validarDatos(int edad, double ingresoMensual,char tipoTrabajo,int segundoUso);
14 void calcularPuntajeYResultado(double puntajeEdad, double puntajeIngreso, double puntajeTipoTrabajo,double *puntajeFinal,int *
califica);
15 int calcularAlcabala(double montoVivienda);
16 int main() {
17 double ingresoMensual, montoVivienda, montoAlcabala=0,puntajeEdad, puntajeIngreso, puntajeTipoTrabajo, puntajeFinal;
18 int datosValidos, tieneDeudas, segundoUso,edad,califica;
19 char tipoTrabajo;
20

1INF01 Fundamentos de Programación 31 Prop.Solución Ex.Parcial(2023-2) Página 31 de 44


21 printf("Ingrese su edad: ");
22 scanf(" %d",&edad);
23 printf("Ingrese su remuneración mensual en soles: ");
24 scanf(" %lf", &ingresoMensual);
25 printf("Tipo de trabajo (D)ependiente o (I)ndependiente: ");
26 scanf(" %c", &tipoTrabajo);
27 printf("¿La vivienda es de segundo uso? (0: No | 1: Sí): ");
28 scanf(" %d", &segundoUso);
29 datosValidos=validarDatos(edad,ingresoMensual,tipoTrabajo,segundoUso);
30 if (datosValidos) {
31 if (edad<25) { /*obtenemos puntaje por edad*/
32 puntajeEdad=PUNTAJE_EDAD_1;
33 } else if (edad<45) {
34 puntajeEdad=PUNTAJE_EDAD_2;
35 } else {
36 puntajeEdad=PUNTAJE_EDAD_3;
37 }
38 if (ingresoMensual<7000) { /*obtenemos puntaje por ingreso*/
39 puntajeIngreso=PUNTAJE_INGRESO_1;
40 } else if (ingresoMensual<15000) {
41 puntajeIngreso=PUNTAJE_INGRESO_2;
42 } else {
43 puntajeIngreso=PUNTAJE_INGRESO_3;
44 }
45 if (tipoTrabajo==’D’) { /*obtenemos puntaje por tipo de trabajo*/
46 puntajeTipoTrabajo=PUNTAJE_DEPENDIENTE;
47 } else {
48 puntajeTipoTrabajo=PUNTAJE_INDEPENDIENTE;
49 }
50 calcularPuntajeYResultado(puntajeEdad,puntajeIngreso,puntajeTipoTrabajo,&puntajeFinal,&califica);
51 if (califica) { /*Impresion de resultados*/
52 printf("\nSu puntaje fue de %lf, por lo que sí califica para el préstamo\n",puntajeFinal);
53 if (segundoUso) { /*si es de segundo uso, debemos calcular el alcabala*/
54 printf("Ingrese el precio en soles de la vivienda para calcular el Impuesto de Alcabala: ");
55 scanf(" %lf",&montoVivienda);
56 montoAlcabala=calcularAlcabala(montoVivienda);
57 printf("El Impuesto de Alcabala que debe pagar es: %lf soles",montoAlcabala);
58 }
59 } else {
60 printf("\nSu puntaje fue de %lf, por lo que NO califica para el préstamo",puntajeFinal);
61 }
62 } else {
63 printf("\nAlguno de los valores ingresados no es válido");
64 }
65 return 0;
66 }
67 int validarDatos(int edad, double ingresoMensual,char tipoTrabajo,int segundoUso) {
68 return (edad>=18 && edad<80) && (ingresoMensual>=4000) && (tipoTrabajo==’D’ || tipoTrabajo==’I’) && (segundoUso==0 ||
segundoUso==1);
69 }
70 int calcularAlcabala(double montoVivienda) {
71 return (montoVivienda−10*UIT)*TASA_TRIBUTO;
72 }
73 void calcularPuntajeYResultado(double puntajeEdad, double puntajeIngreso, double puntajeTipoTrabajo,double *puntajeFinal,int *
califica) {
74 /*Calculamos el puntaje final*/
75 *puntajeFinal=2*puntajeEdad+4*puntajeIngreso+3*puntajeTipoTrabajo;
76 /*Determinamos si la persona califica o no*/
77 if (*puntajeFinal<10) {
78 *califica=0;
79 } else {
80 *califica=1;
81 }
82 }

Pregunta 3A (6 puntos) [propuesta por Alejandro Bello]

1INF01 Fundamentos de Programación 32 Prop.Solución Ex.Parcial(2023-2) Página 32 de 44


La tienda ”Mi pequeña Ardilla” desea calcular el monto total a pagar por las diversas compras realizadas por
sus clientes. Un cliente puede realizar más de una compra y de acuerdo al monto de la compra se le asigna una
categoría de descuento (Oro, Plata o Bronce).

a) Para la categoría ”Oro”, se aplica un descuento del 10 % si el monto de compras es mayor a S./ 500 (soles).
b) Para la categoría ”Plata”, se aplica un descuento del 7 % si el monto de compras es mayor a S./ 300 (soles)
c) Para la categoría ”Bronce”, se aplica un descuento del 5 % si el monto de compras es mayor a S./ 100 (soles).

Adicionalmente se aplica otro descuento en base al monto anterior de la compra y al medio de pago (contado o
tarjeta de crédito). Si el monto de la compra anterior (incluyendo el descuento si corresponde) es mayor o igual a
S/.700, se le realiza un descuento adicional de 0.5 % si paga con tarjeta de crédito o de 0.8 % si paga al contrado.
Este descuento se aplica al monto inicial de la compra menos el descuento por categoría.
Por ejemplo, si un cliente realiza 2 compras al contado:

la primera por S/.1000, entonces le corresponde un descuento de S/.100 por la categoría Oro,
la segunda compra por S/.200, le corresponde el descuento por categoría bronce de S/.10; además como
la compra anterior incluyendo el descuento fue de S/.900 (1000-100) que es mayor a S/.700, entonces le
corresponde un descuento de 0.8 % sobre 190 (200-10), que es S/.1.52 .
El total de compras sería: S/.1200, el total de descuentos: S/.111.52 y el pago total sería de S/.1088.48

Se le pide, elaborar un programa en lenguaje C, con sólo dos módulos (incluído el principal), que solicite al usuario:
la cantidad de compras a realizar y la forma de pago (Contado: C o Tarjeta de crédito: T). Si la cantidad de compras
es mayor a 1 y la forma de pago corresponde a lo indicado (C o T) , debe solicitar el monto de cada compra, validar
que el monto sea positivo y calcular el descuento respectivo (por la categoría y cuando aplique, por el monto de
la compra anterior). Al terminar de ingresar las compras, debe mostrar: el monto total de las compras, el monto
total del descuento, el pago total a realizar y el monto de la menor compra que realizó. Si el monto de cada compra
no es positivo debe emitir el mensaje ” El monto debe ser positivo” y continuar solicitando el siguiente monto, de
producirse este caso, al finalizar debe mostrar la cantidad de compras en las cuales se ingresó mal el monto de la
compra.
El módulo que implemente, adicional al principal, deberá tener las siguientes características:

Debe recibir la cantidad de compras y la forma de pago.


Debe devolver el resultado de la validacion de los datos recibidos.

En la solución debe usar una sola iterativa y las selectivas simples, dobles o anidadas que requiera para resolver
lo solicitado. Si implementa más de una iterativa su solución se considerará inválida y se asignará 0 a toda la
pregunta.
No deberá implementar otros módulos diferentes a los indicados previamente.

En esta pregunta debe usar selectivas, programación modular e iterativas.

Debe usar los mensajes que se muestran en los casos de prueba para el desarrollo del programa.

Casos de prueba:

Ingrese la cantidad de compras: -2


Ingrese la forma de pago (C:contado, T: tarjeta de crédito): C
Datos inválidos

1INF01 Fundamentos de Programación 33 Prop.Solución Ex.Parcial(2023-2) Página 33 de 44


Ingrese la cantidad de compras: 5
Ingrese la forma de pago (C:contado, T: tarjeta de crédito): f
Datos inválidos

Ingrese la cantidad de compras: 3


Ingrese la forma de pago (C:contado, T: tarjeta de crédito): C
Ingrese el monto de la compra 1: 1289.3
Ingrese el monto de la compra 2: 678
Ingrese el monto de la compra 3: 123
Total de compras S/.: 2090.300000
Total de descuento S/.: 207.761600
Pago total S/.: 1882.538400
La menor compra que realizó fue por S/. 123.000000

Ingrese la cantidad de compras: 5


Ingrese la forma de pago (C:contado, T: tarjeta de crédito): T
Ingrese el monto de la compra 1: 356
Ingrese el monto de la compra 2: 500
Ingrese el monto de la compra 3: 25.56
Ingrese el monto de la compra 4: -56
El monto debe ser positivo
Ingrese el monto de la compra 5: -12
El monto debe ser positivo
Total de compras S/.: 881.560000
Total de descuento S/.: 74.920000
Pago total S/.: 806.640000
La menor compra que realizó fue por S/. 25.560000
En 2 compras se ingresó mal el monto

Ingrese la cantidad de compras: 4


Ingrese la forma de pago (C:contado, T: tarjeta de crédito): C
Ingrese el monto de la compra 1: 123.56
Ingrese el monto de la compra 2: 356.8
Ingrese el monto de la compra 3: 1239.3
Ingrese el monto de la compra 4: 320
Total de compras S/.: 2039.660000
Total de descuento S/.: 179.864800
Pago total S/.: 1859.795200
La menor compra que realizó fue por S/. 123.560000

Ingrese la cantidad de compras: 2


Ingrese la forma de pago (C:contado, T: tarjeta de crédito): C
Ingrese el monto de la compra 1: -10
El monto debe ser positivo
Ingrese el monto de la compra 2: -5.6
El monto debe ser positivo
En todas las compras se ingresó mal el monto, no se pueden realizar los cálculos
solicitados

Programa 9: Propuesta de solución


1 #include <stdio.h>
2
3 #define MONTO_ORO 500
4 #define MONTO_PLATA 300
5 #define MONTO_BRONCE 100
6 #define DESC_ORO 0.1
7 #define DESC_PLATA 0.07
8 #define DESC_BRONCE 0.05
9 #define MONT_ANT 700

1INF01 Fundamentos de Programación 34 Prop.Solución Ex.Parcial(2023-2) Página 34 de 44


10 #define DESC_ANT_TC 0.005
11 #define DESC_ANT_C 0.008
12
13 int validarDatos(int ,char );
14
15 int main(){
16 int cantCompras,cantComprasErr=0,i=1;
17 char formaPago;
18 double monto,totCompras=0,totDescuento=0,montoAnt,montoMenor,descuento;
19 printf("Ingrese la cantidad de compras: ");
20 scanf(" %d", &cantCompras);
21 printf("Ingrese la forma de pago (C:contado, T: tarjeta de crédito): ");
22 scanf("\n %c",&formaPago);
23 //validar datos de entrada
24 if (validarDatos(cantCompras,formaPago)){
25 while(i<=cantCompras){
26 printf("Ingrese el monto de la compra %d: ",i);
27 scanf(" %lf",&monto);
28 if (monto>0){
29 descuento=0;
30 totCompras+=monto;
31 //identificar el menor monto
32 if (i==1 || monto<montoMenor)
33 montoMenor=monto;
34 //calcular descuento por categor
35 if (monto>=MONTO_ORO)
36 descuento=monto*DESC_ORO;
37 else
38 if (monto>=MONTO_PLATA)
39 descuento=monto*DESC_PLATA;
40 else
41 if (monto>=MONTO_BRONCE)
42 descuento=monto*DESC_BRONCE;
43 //calcular descuento por el monto anterior
44 if (i>1)
45 if (montoAnt>=MONT_ANT)
46 if (formaPago==’C’)
47 descuento+=(monto−descuento)*DESC_ANT_C;
48 else
49 descuento+=(monto−descuento)*DESC_ANT_TC;
50 //almacenar el monto anterior para el siguiente ciclo
51 montoAnt=monto−descuento;
52 totDescuento+=descuento;
53 }
54 else{
55 printf("El monto debe ser positivo\n");
56 cantComprasErr++;
57 }
58 i++;
59 }
60 //mostrar resultados solicitados
61 if (cantComprasErr<cantCompras){
62 printf("Total de compras S/.: %lf\n",totCompras);
63 printf("Total de descuento S/.: %lf\n",totDescuento);
64 printf("Pago total S/.: %lf\n",totCompras−totDescuento);
65 printf("La menor compra que realizó fue por S/. %lf\n",montoMenor);
66 if (cantComprasErr>0)
67 printf("En %d compras se ingresó mal el monto\n",cantComprasErr);
68 }
69 else
70 printf("En todas las compras se ingresó mal el monto, no se pueden realizar los cálculos solicitados\n");
71 }
72 else
73 printf("Datos inválidos\n");
74 return 0;
75 }
76

1INF01 Fundamentos de Programación 35 Prop.Solución Ex.Parcial(2023-2) Página 35 de 44


77 int validarDatos(int cantCompras,char formaPago){
78 return cantCompras>1 && (formaPago==’T’ || formaPago==’C’);
79 }

Pregunta 3B (6 puntos) [propuesta por Rosa Latorraca]


En matemáticas, rosa polar es el nombre que recibe cualquier miembro de una familia de curvas de ecuación
r(θ) = cos(kθ) por asemejarse a una flor de pétalos como se muestra en la figura 15.

Figura 15: Rosa polar. Imagen tomada de la URL https://es.wikipedia.org/wiki/Rosa_polar

El valor del parámetro k se determina de la siguiente manera:

Figura 16: Rosa polar con k entero positivo

Si k es un número entero positivo, estas ecuaciones producirán k pétalos si k es impar; o 2k pétalos si k es


par, como se muestra en la figura 16.
Si k es racional y positivo, entonces la curva es cerrada y de longitud finita. Un número es racional cuando
se puede ser expresado por una fracción de dos números enteros, es decir tiene decimales.

Se pide que desarrolle un programa en lenguaje C utilizando el paradigma de programación modular que solicite:
la cantidad de rosas polares a evaluar y la opción a ingresar para identificar si se calcula la mayor cantidad de
pétalos o la menor cantidad de pétalos (el caracter M para el mayor o el caracter N para el menor) para las rosas
polares ingresadas. Si los datos son válidos, se debe pedir los valores de k de acuerdo a la cantidad de rosas polares
y se debe mostrar la cantidad de k inválidos (es decir, valores de k menores o iguales a 0), k racionales y k enteros.
Si el usuario ingresa la opción M entonces se deberá mostrar la mayor cantidad de pétalos en el caso de que exista.
Si el usuario ingresa la opción N entonces se deberá mostrar la menor cantidad de pétalos en el caso de que exista.

1INF01 Fundamentos de Programación 36 Prop.Solución Ex.Parcial(2023-2) Página 36 de 44


El módulo que implemente, adicional al principal, deberá validar los siguientes datos: la cantidad de rosas polares,
debe ser positiva y menor o igual a 10; y la opción, el caracter M o el caracter N y deberá devolver el resultado de
la validacion de los datos recibidos.
No debera implementar otros módulos diferentes a los indicados previamente.
En esta pregunta debe usar selectivas anidadas, programacion modular e iterativas.
Debe usar los mensajes que se muestran en los casos de prueba para el desarrollo del programa.
Casos de prueba:

Ingrese la cantidad de iteraciones: -5


Ingrese una opción para la impresión de la cantidad de pétalos: M
Datos inválidos.

Ingrese la cantidad de iteraciones: 5


Ingrese una opción para la impresión de la cantidad de pétalos: m
Datos inválidos.

Ingrese la cantidad de iteraciones: 3


Ingrese una opción para la impresión de la cantidad de pétalos: M
Ingrese el valor de k: -3
Debe ingresar un valor k positivo
Ingrese el valor de k: 6.7
Ingrese el valor de k: 4.99
Se ingresaron 1 k inválidos
Se ingresaron 2 k racionales
Se ingresaron 0 k enteros

Ingrese la cantidad de iteraciones: 5


Ingrese una opción para la impresión de la cantidad de pétalos: N
Ingrese el valor de k: 6.7
Ingrese el valor de k: -2
Debe ingresar un valor k positivo
Ingrese el valor de k: -8.6
Debe ingresar un valor k positivo
Ingrese el valor de k: 3.9
Ingrese el valor de k: -2.45
Debe ingresar un valor k positivo
Se ingresaron 3 k inválidos
Se ingresaron 2 k racionales
Se ingresaron 0 k enteros

Ingrese la cantidad de iteraciones: 3


Ingrese una opción para la impresión de la cantidad de pétalos: M
Ingrese el valor de k: -3
Debe ingresar un valor k positivo
Ingrese el valor de k: 6.7
Ingrese el valor de k: 4.99
Se ingresaron 1 k inválidos
Se ingresaron 2 k racionales
Se ingresaron 0 k enteros

Ingrese la cantidad de iteraciones: 3


Ingrese una opción para la impresión de la cantidad de pétalos: M
Ingrese el valor de k: 3
Ingrese el valor de k: 1
Ingrese el valor de k: 2
Se ingresaron 0 k inválidos

1INF01 Fundamentos de Programación 37 Prop.Solución Ex.Parcial(2023-2) Página 37 de 44


Se ingresaron 0 k racionales
Se ingresaron 3 k enteros
La mayor cantidad de pétalos de la rosa polar es: 4

Ingrese la cantidad de iteraciones: 7


Ingrese una opción para la impresión de la cantidad de pétalos: N
Ingrese el valor de k: 3
Ingrese el valor de k: -5
Debe ingresar un valor k positivo
Ingrese el valor de k: 4.5
Ingrese el valor de k: 4
Ingrese el valor de k: 0.7
Ingrese el valor de k: 2
Ingrese el valor de k: -9.5
Debe ingresar un valor k positivo
Se ingresaron 2 k inválidos
Se ingresaron 2 k racionales
Se ingresaron 3 k enteros
La menor cantidad de pétalos de la rosa polar es: 3

Programa 10: Propuesta de solución


1 #include <stdio.h>
2
3 int validarDatos(int cantIteraciones, char opcion);
4
5 int main(){
6
7 int cantIteraciones,i,kEntero,num,mayorCantPetalos,menorCantPetalos;
8 int cantEnteros=0,cantRacionales=0,cantInvalidos=0,cantPetalos;
9 double k;
10 char opcionImpresion;
11
12 printf("Ingrese la cantidad de iteraciones: ");
13 scanf(" %d",&cantIteraciones);
14 printf("Ingrese una opción para la impresión de la cantidad de pétalos: ");
15 scanf("\n %c",&opcionImpresion);
16
17 if(validarDatos(cantIteraciones,opcionImpresion)){
18 i=1;
19 while(i<=cantIteraciones){
20 printf("Ingrese el valor de k: ");
21 scanf(" %lf",&k);
22 if(k<=0){
23 printf("Debe ingresar un valor k positivo\n");
24 cantInvalidos++;
25 }
26 else{
27 kEntero=(int)k;/*Se castea para sacar la parte entera de k*/
28 if(kEntero<k)
29 cantRacionales++;
30 else{
31 cantEnteros++;
32 if(kEntero %2==0)
33 cantPetalos=kEntero*2;
34 else
35 cantPetalos=kEntero;
36 /*Si es la primera vez, entonces se le asigna la cantidad de pétalos sino se verifica al mayor
*/
37 if(cantEnteros==1||mayorCantPetalos<cantPetalos){
38 mayorCantPetalos=cantPetalos;
39 }
40 /*Si es la primera vez, entonces se le asigna la cantidad de pétalos sino se verifica al menor
*/
41 if(cantEnteros==1||menorCantPetalos>cantPetalos)

1INF01 Fundamentos de Programación 38 Prop.Solución Ex.Parcial(2023-2) Página 38 de 44


42 menorCantPetalos=cantPetalos;
43 }
44 }
45 i++;
46 }
47 printf("Se ingresaron %d k inválidos\n",cantInvalidos);
48 printf("Se ingresaron %d k racionales\n",cantRacionales);
49 printf("Se ingresaron %d k enteros\n",cantEnteros);
50
51 if(cantEnteros>0 && opcionImpresion==’M’)
52 printf("La mayor cantidad de pétalos de la rosa polar es: %d\n",mayorCantPetalos);
53 if(cantEnteros>0 && opcionImpresion==’N’)
54 printf("La menor cantidad de pétalos de la rosa polar es: %d\n",menorCantPetalos);
55 }
56 else
57 printf("Datos inválidos.");
58
59 return 0;
60 }
61
62 int validarDatos(int cantIteraciones, char opcion){
63 return cantIteraciones>0 && cantIteraciones<=10 && (opcion==’M’||opcion==’N’);
64 }

Pregunta 3C (6 puntos) [propuesta por Silvia Vargas]


Los números naturales son los números enteros mayores a 0, estos números están compuestos por uno o más
dígitos. En la base decimal estos dígitos son: 0, 1, 2 ,3, 4, 5, 6, 7, 8 y 9.
Con los dígitos de los números se pueden realizar diversas operaciones como la suma, resta, división, multiplica-
ción, potenciación, entre otras.
Por ejemplo:

Para el número 12345 se desea extraer cada digito y realizar la siguiente operación:

51 + 45 + 34 + 23 + 12 = 1119 (4)

Note que se han extraído los dígitos del número empezando desde la derecha hacia la izquierda. Como
puede apreciar cada dígito se ha elevado al dígito siguiente, para el último dígito (5) se ha tomado el dígito
siguiente como el primer dígito (1) del número (iniciando la lectura del número de izquierda a derecha) y
estas potencias se suman obteniendo el número 1119.
Con el mismo número 12345, se realiza la siguiente operación:

1 1 1 1 1
5 4 + 4 3 + 3 2 + 2 1 + 1 5 = 7.814801 (5)

Note que se han extraído los dígitos del número empezando desde la derecha hacia la izquierda. Como puede
apreciar cada dígito se ha elevado a la inversa del digito anterior, para el primer dígito (1) se ha tomado el
dígito anterior (5) como el último dígito del número (iniciando la lectura del número de derecha a izquierda)
y estas potencias se suman obteniendo el número 7.814801 .

Se le pide, elaborar un programa en lenguaje C, con sólo dos módulos (incluído el principal), que solicite al
usuario: un número natural (mayor a cero), como mínimo de 2 dígitos y como máximo de 9 digitos, la cantidad de
dígitos del número y la secuencia de proceso de los dígitos (las letras S o s para realizar el proceso indicado en la
ecuación (4), las letras A o a para realizar el proceso indicado en la ecuación (5)). Si el número es positivo, tiene la
cantidad de dígitos correspondiente y la secuencia de proceso es alguna de las indicadas, debe mostrar el resultado
de la operación que corresponde. Si los datos ingresados no cumplen con las condiciones indicadas debe mostrar
el mensaje ”Datos de entrada inválidos”.
El módulo que implemente, adicional al principal, deberá tener las siguientes características:

1INF01 Fundamentos de Programación 39 Prop.Solución Ex.Parcial(2023-2) Página 39 de 44


Debe recibir el número, la cantidad de dígitos y la secuencia del proceso.

Debe devolver el resultado de la validacion de los datos recibidos.

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


En esta pregunta debe usar selectivas anidadas, programación modular e iterativas.
Debe usar los mensajes que se muestran en los casos de prueba para el desarrollo del programa.
Casos de prueba:

Ingrese un número y su cantidad de dígitos: 12345 8


Ingrese la secuencia del proceso de los dígitos (A,a: anterior; S,s: siguiente): A
Datos de entrada inválidos

Ingrese un número y su cantidad de dígitos: -1234 4


Ingrese la secuencia del proceso de los dígitos (A,a: anterior; S,s: siguiente): S
Datos de entrada inválidos

Ingrese un número y su cantidad de dígitos: 7 1


Ingrese la secuencia del proceso de los dígitos (A,a: anterior; S,s: siguiente): A
Datos de entrada inválidos

Ingrese un número y su cantidad de dígitos: 1234567890 10


Ingrese la secuencia del proceso de los dígitos (A,a: anterior; S,s: siguiente): S
Datos de entrada inválidos

Ingrese un número y su cantidad de dígitos: 78653 5


Ingrese la secuencia del proceso de los dígitos (A,a: anterior; S,s: siguiente): F
Datos de entrada inválidos

Ingrese un número y su cantidad de dígitos: 12 2


Ingrese la secuencia del proceso de los dígitos (A,a: anterior; S,s: siguiente): A
Resultado de operación de dígitos: 3.000000

Ingrese un número y su cantidad de dígitos: 12 2


Ingrese la secuencia del proceso de los dígitos (A,a: anterior; S,s: siguiente): s
Resultado de operación de dígitos: 3.000000

Ingrese un número y su cantidad de dígitos: 12 2


Ingrese la secuencia del proceso de los dígitos (A,a: anterior; S,s: siguiente): s
Resultado de operación de dígitos: 3.000000

Ingrese un número y su cantidad de dígitos: 7832 4


Ingrese la secuencia del proceso de los dígitos (A,a: anterior; S,s: siguiente): A
Resultado de operación de dígitos: 6.398775

Ingrese un número y su cantidad de dígitos: 113261 6


Ingrese la secuencia del proceso de los dígitos (A,a: anterior; S,s: siguiente): S
Resultado de operación de dígitos: 82.000000

1INF01 Fundamentos de Programación 40 Prop.Solución Ex.Parcial(2023-2) Página 40 de 44


Programa 11: Propuesta de solución
1 #include <stdio.h>
2 #include <math.h>
3
4 int validarDatos(int ,int ,char );
5
6 int main(){
7 int num,cantDig,i,primDig,ultDig,digAnterior,digSiguiente,digActual;
8 char secuencia;
9 double resultado,sumReal;
10 printf("Ingrese un número y su cantidad de dígitos: ");
11 scanf(" %d %d",&num,&cantDig);
12 printf("Ingrese la secuencia del proceso de los dígitos (A,a: anterior; S,s: siguiente): ");
13 scanf("\n %c",&secuencia);
14 //validar datos de entrada
15 if (validarDatos(num,cantDig,secuencia)){
16 i=1;
17 sumReal=0;
18 //extraer el primer y último dígito del número
19 primDig=num %10;
20 ultDig=num/(int)pow(10,cantDig−1);
21 while(i<=cantDig){
22 if (secuencia==’S’ || secuencia==’s’) //buscar el dígito siguiente
23 if (i==1)
24 digSiguiente=ultDig;
25 else
26 digSiguiente=digActual;
27 else //buscar el dígito anterior
28 if (i==cantDig)
29 digAnterior=primDig;
30 else
31 digAnterior=(num/10) %10;
32 digActual=num %10;
33 num/=10;
34 //acumular la operación de acuerdo a la secuencia
35 if (secuencia==’S’ || secuencia==’s’)
36 sumReal+=pow(digActual,digSiguiente);
37 else
38 sumReal+=pow(digActual,1/(double)digAnterior);
39 i++;
40 }
41 //mostrar el resultado
42 printf("Resultado de operación de dígitos: %lf\n",sumReal);
43 }
44 else
45 printf("Datos de entrada inválidos\n");
46 return 0;
47 }
48
49 int validarDatos(int num,int cantDig,char secuencia){
50 int valNum,valSec,valCantDig;
51 valNum=num>=(int)pow(10,cantDig−1) && num<=(int)pow(10,cantDig)−1;
52 valSec=secuencia==’A’ || secuencia==’a’ || secuencia==’S’ || secuencia==’s’;
53 valCantDig=cantDig>1 && cantDig<=9;
54 return valNum && valSec && valCantDig;
55 }

Pregunta 3D (6 puntos) [propuesta por Silvia Vargas]


Los números naturales son los números enteros mayores a 0, estos números están compuestos por uno o más
dígitos. En la base decimal estos dígitos son: 0, 1, 2 ,3, 4, 5, 6, 7, 8 y 9.
Con los dígitos de los números se pueden realizar diversas operaciones como la suma, resta, división, multiplica-
ción, potenciación, entre otras.
Por ejemplo:

1INF01 Fundamentos de Programación 41 Prop.Solución Ex.Parcial(2023-2) Página 41 de 44


Del número 87865326 se desea extraer números formados con 2 digitos y luego sumarlos:

26 + 53 + 86 + 87 = 252

Como puede apreciar se ha tomado del número dos dígitos continuos (iniciando la lectura del número de
derecha a izquierda) y con ellos se ha formado un nuevo número, se ha realizado lo mismo hasta terminar
con los dígitos del número y luego se han sumado obteniendo el número 252.

Del número 1112223, se desea extraer números formados con 3 digitos y luego multiplicarlos:

223 ∗ 112 ∗ 1 = 24976

Como puede apreciar se ha tomado del número tres dígitos (iniciando la lectura del número de derecha a
izquierda) y se ha formado sucesivamente los números 223 y 112, como luego queda solo un dígito se forma
el número 1. Luego estos tres números se multiplican obteniendo el número 7.814801 .

Se le pide, elaborar un programa en lenguaje C, con sólo dos módulos (incluído el principal), que solicite al
usuario: un número natural (mayor a cero), como mínimo de 2 dígitos y como máximo de 8 digitos, la cantidad de
dígitos del número, la cantidad de dígitos para dividir el número y la operación a realizar con los nuevos números
formados (el signo + para la suma o el signo * para la multiplicación). Si los datos ingresados son válidos: el
número es positivo y tiene la cantidad de dígitos correspondiente, la cantidad de dígitos para dividir el número
es positiva y menor o igual a la mitad de los dígitos del número y el signo ingresado corresponde a lo indicado;
debe mostrar el resultado de la operación que corresponde Si los datos ingresados no cumplen con las condiciones
indicadas debe mostrar el mensaje ”Datos de entrada inválidos”.
El módulo que implemente, adicional al principal, deberá tener las siguientes características:

Debe recibir el número,la cantidad de dígitos del número, la cantidad de dígitos para dividir el número y la
operación.

Debe devolver el resultado de la validacion de los datos recibidos.

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


En esta pregunta debe usar selectivas anidadas, programación modular e iterativas.
Debe usar los mensajes que se muestran en los casos de prueba para el desarrollo del programa.
Casos de prueba:

Ingrese un número y su cantidad de dígitos: -678 3


Ingrese la cantidad de dígitos que se usará para dividir el número: 1
Ingrese la operación a realizar: +
Datos de entrada inválidos

Ingrese un número y su cantidad de dígitos: 12 9


Ingrese la cantidad de dígitos que se usará para dividir el número: 1
Ingrese la operación a realizar: *
Datos de entrada inválidos

Ingrese un número y su cantidad de dígitos: 675 3


Ingrese la cantidad de dígitos que se usará para dividir el número: 2
Ingrese la operación a realizar: +
Datos de entrada inválidos

1INF01 Fundamentos de Programación 42 Prop.Solución Ex.Parcial(2023-2) Página 42 de 44


Ingrese un número y su cantidad de dígitos: 7868 4
Ingrese la cantidad de dígitos que se usará para dividir el número: 2
Ingrese la operación a realizar: /
Datos de entrada inválidos

Ingrese un número y su cantidad de dígitos: 78535 5


Ingrese la cantidad de dígitos que se usará para dividir el número: 1
Ingrese la operación a realizar: +
El resultado de la operación de dígitos es 28

Ingrese un número y su cantidad de dígitos: 3421897 7


Ingrese la cantidad de dígitos que se usará para dividir el número: 3
Ingrese la operación a realizar: *
El resultado de la operación de dígitos es 1132911

Ingrese un número y su cantidad de dígitos: 879076 6


Ingrese la cantidad de dígitos que se usará para dividir el número: 3
Ingrese la operación a realizar: +
El resultado de la operación de dígitos es 955

Ingrese un número y su cantidad de dígitos: 98234 5


Ingrese la cantidad de dígitos que se usará para dividir el número: 1
Ingrese la operación a realizar: *
El resultado de la operación de dígitos es 1728

Programa 12: Propuesta de solución


1 #include <stdio.h>
2 #include <math.h>
3
4 int validarDatos(int ,int ,int ,char );
5
6 int main(){
7 int num,numDiv,cantDig,resultado,i=1,nuevoNum,cantDigNuevoNum,dig;
8 char operacion;
9 printf("Ingrese un número y su cantidad de dígitos: ");
10 scanf(" %d %d",&num,&cantDig);
11 printf("Ingrese la cantidad de dígitos que se usará para dividir el número: ");
12 scanf(" %d",&numDiv);
13 printf("Ingrese la operación a realizar: ");
14 scanf("\n %c",&operacion);
15 //validar datos de entrada
16 if (validarDatos(num,cantDig,numDiv, operacion)){
17 i=1;
18 nuevoNum=0;
19 cantDigNuevoNum=0;
20 //inicializar el resultado de acuerdo a la operación
21 if (operacion==’+’)
22 resultado=0;
23 else
24 resultado=1;
25 while(i<=cantDig){
26 dig=num %10;
27 num/=10;
28 //formar el nuevo número con numDiv dígitos
29 if (cantDigNuevoNum<numDiv){
30 nuevoNum=dig*(int)pow(10,cantDigNuevoNum)+nuevoNum;
31 cantDigNuevoNum++;
32 }
33 //acumular la operación cuando el nuevo número tiene la cantidad de dígitos

1INF01 Fundamentos de Programación 43 Prop.Solución Ex.Parcial(2023-2) Página 43 de 44


34 //completa o se llega al final del número
35 if (cantDigNuevoNum==numDiv || i==cantDig) {
36 if (operacion==’+’)
37 resultado+=nuevoNum;
38 else
39 resultado*=nuevoNum;
40 nuevoNum=0;
41 cantDigNuevoNum=0;
42 }
43 i++;
44 }
45 //mostrar el resultado
46 printf("El resultado de la operación de dígitos es %d\n",resultado);
47 }
48 else
49 printf("Datos de entrada inválidos\n");
50 return 0;
51 }
52
53 int validarDatos(int num,int cantDig,int numDiv,char operacion){
54 int valNum,valSigno,valDiv,valCantDig;
55 valNum=num>=(int)pow(10,cantDig−1) && num<=(int)pow(10,cantDig)−1;
56 valSigno=operacion==’+’ || operacion==’*’;
57 valDiv=numDiv>=1 && numDiv<=cantDig/2;
58 valCantDig=cantDig>1 && cantDig<=8;
59 return valNum && valSigno && valDiv && valCantDig;
60 }

San Miguel, octubre del 2023

1INF01 Fundamentos de Programación 44 Prop.Solución Ex.Parcial(2023-2) Página 44 de 44

También podría gustarte