Está en la página 1de 28

FPRO

EX1 2020-2
.MARCO TEÓRICO
ALGORITMIA

Pseudocódigo
El pseudocódigo es un lenguaje de especificación o descripción de algoritmos. Utiliza un conjunto de
palabras reservadas en lenguaje natural para representar cada paso que tendrá el algoritmo. Al desarrollar
el pseudocódigo, uno se concentra en la lógica del programa y en las estructuras de control que se
utilizarán. Posteriormente, se tendrá que traducir a un lenguaje de programación.

Operadores usados en un algoritmo:

Funciones usadas en un algoritmo:

Ejemplo:
El siguiente algoritmo, en pseudocódigo, tiene una estructura secuencial y permite ingresar por teclado el
radio de una esfera. Luego calcula y muestra el área y el volumen de la esfera usando las siguientes
fórmulas:
2 4 3
area=4 π r volumen= π r
3

1
Algoritmo calculosEsfera
Escribir "Ingrese el radio de la esfera: "
Leer radio
area <- 4*3.141592654*radio^2
volumen <- (4/3)*3.141592654*radio^3
Escribir "El area de la esfera es: ", area
Escribir "El volumen de la esfera es: ", volumen
FinAlgoritmo

Ejemplo:
El siguiente algoritmo (en diagrama de flujo) tiene una estructura secuencial y permite ingresar por teclado
la velocidad inicial en m/s con la que una piedra es lanzada al agua desde un puente, y el tiempo (en
segundos) que tarda en llegar al agua. Luego calcula y muestra la velocidad con la que la piedra llega al
agua y la altura del puente utilizando las siguientes fórmulas:
1 2
v f =¿+v 0 h=v 0 t+ g t
2
Consideramos que la gravedad es g=9.8 m/s 2

ESTRUCTURAS SELECTIVAS

Las estructuras selectivas permiten controlar las instrucciones de un programa que requieran que se cumpla
una condición para poder ejecutarse. Las selectivas son “excluyentes”, es decir, si se cumple una condición
se ejecutará un conjunto de instrucciones mientras que el resto no.
En este tipo de estructuras se usan los operadores de comparación:

Operadores de comparación Operadores Lógicos


ANSI C PSeInt Descripción ANSI C PSeInt Descripción
> > Mayor && Y Conjunción
>= >= Mayor o igual || O Disyunción
< < Menor ! NO Negación
<= <= Menor o igual
== = Igual
!= <> Diferente

2
I. Estructura de selección simple: SI
La estructura de selección “Si” es utilizada para realizar una de dos acciones distintas en base a una
condición.

Ejemplo: Cálculo de logaritmos


Existen diversas propiedades de los logaritmos, pero en esta sección centraremos la atención en el teorema
log a x
de cambio de base. Según este teorema log b x= . Esto significa que se puede basar el cálculo del
log a b
logaritmo en cualquier base con el logaritmo de otra base. Este teorema es muy importante pues algunos
lenguajes de programación solamente ofrecen la función logaritmo en una base determinada, típicamente el
logaritmo natural cuya base es el número e. Aplicando el teorema de cambio de base y fijando la base en el
número e, se tiene que
lnx
log b x=
lnb
Para poder realizar el cálculo del logaritmo de un número x en una base b debe cumplirse que b> 0∧ b ≠ 1
y x >0. ¿Cómo se expresa dicha condición en ANSI C?
La condición anteriormente descrita se puede expresar como b> 0∧¿ b !=1∧¿ x >0 . En el programa se
puede apreciar la validación antes de realizar el cálculo del logaritmo. Es bastante común que la expresión
que representa a la condición en una estructura selectiva simple (y en realidad en todas las estructuras de
control de flujo) contenga expresiones complejas que combinen tanto operadores relacionales como
operadores lógicos.

#include <stdio.h>
#include <math.h>
/* log(x) calcula ln(x)
log10(x) calcula logaritmo de x en base 10 */

int main(){
double base, numero, logaritmo;

printf("Ingrese el numero y la base: ");


scanf("%lf %lf", &numero, &base);
if (base > 0 && base != 1 && numero>0){
logaritmo = log(numero)/log(base);
printf("El logaritmo es %lf\n", logaritmo);
}
return 0;
}
Ejemplo:
Según el teorema de la desigualdad del triángulo “La suma de las longitudes de cualesquiera de los
lados de un triángulo es mayor que la longitud del tercer lado”.
Basándose en el teorema de la desigualdad del triángulo, para verificar si 3 lados a, b y c forman en realidad
un triángulo, deben cumplirse 3 condiciones: i ¿ a+b> c , ii ¿ b+c >a y iii ¿ c +a> b.
¿Cómo expresar estas 3 condiciones en ANSI C? Esta expresión se representará como una conjunción, es
decir utilizando el operador &&. Para una mejor lectura de la condición x + y > z agrupamos la suma usando
paréntesis ( x + y )> z .
El programa que verifica si 3 lados pueden formar un triángulo se puede apreciar en el programa

3
#include <stdio.h>

int main(){
int a, b, c;
printf("Ingrese los lados de un triangulo: ");
scanf("%d %d %d", &a, &b, &c);
if (a+b>c && a+c>b && b+c>a)
pritnf("Los lados forman un triangulo.\n");
return 0;
}
Ejemplo: Año bisiesto
¿Cómo se puede determinar si un año es bisiesto? Un año bisiesto si el número que lo representa es divisible
entre 4, salvo que sea año secular -último de cada siglo, terminado en 00-, en cuyo caso también ha de ser
divisible entre 400.
Si tenemos las siguientes preposiciones:
p: El número que representa al año es divisible entre 4
q: El número que representa al año es divisible entre 100
r: El número que representa al año es divisible entre 400
La expresión lógica que permite determinar si un año es bisiesto es p ∧(∼ q ∨r ). En el
programa se puede apreciar la implementación de esta expresión lógica en ANSI C.

#include <stdio.h>

int main(){
int anio, p, q, r;
printf("Ingrese al anio: ");
scanf("%d", &anio);
p = (anio % 4 == 0);
q = (anio % 100 == 0);
r = (anio % 400 == 0);
if (p && (!q || r))
printf("El anio es bisiesto\n");
return 0;
}
II. Estructura de selección doble: SI - SINO
La estructura de selección “SI - SINO” es utilizada para realizar unas acciones en el caso de que una
condición sea verdadera y otras acciones cuando la condición sea falsa.
Ejemplo:
Supongamos que tenemos que traducir la siguiente situación:
Debemos imprimir “Aprobado” si el alumno obtiene una nota mayor o igual a 11, pero debemos imprimir
“Jalado” si es que su nota no es mayor o igual a 11.
En pseudocódigo será:
Si (nota_alumno >= 11) Entonces
Escribir “Aprobado”
Sino
Escribir “Jalado”
Fin Si
En este caso, tenemos que:
 La condición “la nota del alumno es mayor o igual a 11” tiene dos posibilidades: es
verdadera o es falsa.
 Si la condición es verdadera:
Se ejecuta la acción de Escribir la palabra “Aprobado” y el programa continúa al siguiente
enunciado.
 Si la condición es falsa:
Se ejecuta la acción de Escribir la palabra “Jalado” y el programa continúa al siguiente enunciado

4
En Diagrama de flujo será:

En lenguaje C será:
if ( nota_alumno >= 11 )
printf( ”Aprobado\n" );
else
printf( ”Jalado\n" );

ESTRUCTURAS ITERATIVAS

Las estructuras iterativas sirven para repetir un conjunto de instrucciones mientras una determinada
condición se cumpla.
Estas estructuras pueden ser de 2 tipos:
1. Ciclo iterativo con entrada controlada.
2. Ciclo iterativo con salida controlada.

En el ciclo iterativo con entrada controlada, la evaluación de la condición del ciclo se realiza antes de la
ejecución del conjunto de instrucciones. Dependiendo de la condición, puede que el conjunto de
instrucciones no se ejecute.

Los ciclos que usaremos aquí serán los que tengan entrada controlada.

El ciclo iterativo con entrada controlada se puede implementar en el ANSI C mediante la instrucción while.
Siempre que se realiza un ciclo iterativo con entrada controlada debe de:
1. Inicializarse la(s) variable(s) de control de flujo.
2. Elaborar una condición para el control del flujo.
3. Actualizar la(s) variable(s) de control para asegurarse que en algún momento la condición de control
de flujo falle y se termine el bucle.

La inicialización de la(s) variable(s) de control de flujo se suele realizar antes de iniciar el ciclo y la
actualización se suele realizar en la última instrucción del ciclo.
inicialización de variable(s) de control;
while (condición de control de flujo) {
conjunto de instrucciones;
actualización de variable(s) de control
}

5
Estructuras iterativas más usadas:

1. Cálculo de la suma total de datos:


Suma = 0; /* inicializa el acumulador de la suma, es decir la variable que tendrá la suma final. */
while (hay datos) {
Leer o generar dato;
Suma = Suma + dato; /* actualiza la suma */

}

2. Cálculo del máximo valor de entre un conjunto de datos:


maxValor = mínimo valor posible;
while (hay datos) {
Leer o generar dato;
maxValor = dato*(dato > maxValor) + maxValor*(maxValor >= dato);

}

3. Cálculo del mínimo valor de entre un conjunto de datos:


minValor = máximo valor posible;
while (hay datos) {
Leer o generar dato;
minValor = dato*(dato < minValor) + minValor*(minValor <= dato);

}

4. Trabajo con las cifras de un número:


copia = numero;
while (copia > 0) {
cifra = copia % 10;
… /* trabajo con las cifras del número */
copia = copia / 10;
}

PROGRAMACIÓN MODULAR

Un subprograma es un conjunto de instrucciones que realizan un proceso y que se identifican con un


nombre asignado por el programador. Cada vez que se invoca dicho nombre en el programa se ejecutan
esas instrucciones.
En el lenguaje C existen dos tipos de subprogramas:
 Funciones, que son los subprogramas que retornan un valor.
 Procedimientos, que son los subprogramas que no retornan ningún valor.

Para modularizar programas en el lenguaje C se utilizan las funciones, debido a que no incluye a los
procedimientos como una forma separada de subprogramas. Es por ello que en el lenguaje C las
funciones pueden ser definidas sin valores de retorno para que puedan ser usadas como procedimientos.

6
FUNCIONES

I. En Pseudocódigo:
Una función se representa de la siguiente manera:

Funcion variableRetorno nombre_de_funcion (lista de parámetros)


Instrucciones
VariableRetorno <- …
FinFuncion

Ejemplo:
Funcion area <- calcArea(radio)
area <- 4*3.141592654*radio^2
FinFuncion

En la lista de parámetros podría haber parámetros de dos tipos:


 Parámetros por valor:
Son aquellos cuyo valor se da a la función (PSeInt hace una copia de la variable y trabaja con la
copia). En este caso su valor original no se altera fuera del ámbito de la función. Es decir, cuando
entra a la función vale 3 (por ejemplo) y cuando sale de la función sigue valiendo 3.
 Parámetros por referencia:
Son aquellos cuyo valor se da a la función (PSeInt trabaja con la variable original y, para esto, pasa
la dirección donde está ubicada la variable original). En este caso el valor original se puede alterar
fuera del ámbito de la función, ya que no se ha hecho una copia.

Ejemplo: La siguiente función calcula el volumen de una esfera y la pasa por referencia mediante la
variable volumen, mientras que el radio no se altera y es un parámetro por valor.
Funcion calcVol(radio, volumen Por Referencia)
volumen <- (4/3)*3.141592654*radio^3
FinFuncion

II. En Lenguaje C:
La representación de una función en el lenguaje C se puede apreciar en el programa:

Tipo_retorno nombre_de_funcion (lista de parámetros)


{
Declaración de variables;
Instrucciones;
}
 Tipo_retorno especifica el tipo de dato que devuelve la función (int, double, char, void).
 La lista de parámetros es una lista de nombres de variables y sus tipos asociados, separada por
comas. Los parámetros reciben los valores de los argumentos cuando se invoca a la función (son
los datos que se la da a la función para que realice la tarea encomendada).
Una función puede estar sin parámetros.

Para poder implementar las funciones en C se debe considerar lo siguiente:


1. Declaración de funciones:
Consiste en declarar prototipos (hacer un catálogo) de las funciones sin programarlas y que serán utilizadas
en el programa.

Se hace previo a la función main, y su formato es el siguiente:

Tipo_retorno nombre_de_funcion (lista de parámetros);

7
Ejemplo: El prototipo para una función que calcula el factorial de un número podría ser:
int calcularFactorial ( int numero );

2. Definición de funciones:
Corresponde a la implementación de una función luego de su declaración. Su sintaxis es:

Tipo_retorno nombre_de_funcion (lista de parámetros) {


Declaración de variables;
Instrucciones;
return <expresión>; /* opcional si el tipo_retorno es void */
}
Ejemplo: La implementación de la función que calcula el factorial de un número podría ser:

int calcularFactorial ( int numero) {


int i=1, fact = 1;
for( i=1; i <= numero; i++){
fact = fact * i;
}
return fact;
}
3. Accesos a una función:
Para que una función realice la tarea para la cual fue creada, se le debe de invocar desde un programa o
subprograma. En el programa mostrado se aprecia el ejemplo de invocación a la función calcularFactorial
desde la función main().
Ejemplo:
#include <stdio.h>
int calcularFactorial ( int numero); /* Este es el prototipo de la función calcularFactorial */
int main() {
int num, fact;
printf(“Ingrese un numero: “);
scanf(“%d”, &num);
fact = calcularFactorial(num); /* aquí se invoca a la función calcularFactorial */
printf(“ El factorial de %d es %d”, num, fact);
return 0;
}
/* Aquí se implementa la función calcularFactorial */
int calcularFactorial ( int numero) {
int i=1, fact = 1;
for( i=1; i <= numero; i++){
fact = fact * i;
}
return fact;
}
Ahora veamos otro ejemplo de acceso a una función.
Ejemplo:
#include <stdio.h>
/* Prototipo o declaración de la función */
void message( );
int main() {
message(); /* aquí se invoca a la función message */
printf(“Divide y venceras!\n“);
return 0;
}
/* Aquí se implementa la función message */
void message( ) {
printf(“Si el problema es complejo, recuerda…\n”);
}

8
Observación importante:
En estos ejemplos, se puede notar que: Si la función tiene como tipo de dato void, la invocación
consiste en colocar sólo el nombre de la función con sus parámetros (si los tuviera); mientras que si el
tipo de dato es int o char o double, entonces se debe invocar asignando su valor a una variable (en el
primer ejemplo, la variable era fact).

4. Argumentos de las funciones (llamadas por valor y por referencia):


Los parámetros (también llamados argumentos) de la función pueden ser de dos tipos:
 Parámetros por valor:
Son aquellos cuyo valor se da a la función (el lenguaje C hace una copia de la variable y trabaja con
la copia). En este caso su valor original no se altera fuera del ámbito de la función. Es decir, cuando
entra a la función vale 3 (por ejemplo) y cuando sale de la función sigue valiendo 3.
 Parámetros por referencia:
Son aquellos cuyo valor se da a la función (el lenguaje C trabaja con la variable original y, para esto,
pasa la dirección donde está ubicada la variable original). En este caso su valor original se puede
alterar fuera del ámbito de la función, ya que no se ha hecho una copia.
Ejemplo: Se muestra el programa para intercambiar los valores de dos números.

#include <stdio.h>
void intercambia(int *p, int *q); /* Prototipo o declaración de la función */

int main() {
int a, b;
a = 666;
b = 999;
printf(“a y b antes del intercambio: %d %d\n”, a, b);
intercambiar(&a, &b); /* aquí se invoca a la función intercambiar */
printf(“a y b luego del intercambio: %d %d\n”, a, b);
return 0;
}

/* Aquí se implementa la función intercambiar */


void intercambiar(int *p, int *q) {
int temp;
temp = *p; /* Se guarda en temp el valor apuntado por la dirección p */
*p = *q; /* Se guarda el valor apuntado por la dirección q en la variable apuntada p */
*q = temp; /* Se guarda el valor de temp en la variable apuntada q */
}

Observaciones importantes:
1. Un parámetro por referencia se usa cuando se necesita que la función devuelva varios valores
que resultan de los cálculos que hará.
2. Cuando se trabaja con un parámetro por referencia se debe tomar en cuenta que:
 Al momento de invocar a la función, el parámetro por referencia va acompañado con el
símbolo & delante de su nombre.
 Al momento de declarar e implementar la función, el parámetro por referencia va
acompañado de un *.
3. Cuando se va a calcular el parámetro por referencia, dentro de la función, siempre va precedido
con el carácter *.
4. Cuando se va a leer el parámetro por referencia, usando scanf, se debe colocar sólo el nombre
del parámetro por referencia SIN colocar & ni *.

9
Ejemplo:
Se desea calcular el número e usando una función. Para esto, se debe tener en cuenta que el valor de e se
logra mediante la siguiente serie:

∑ n1! =1+ 1!1 + 21! + 31! + 41! + 51! + 61! + …


n=0

Para implementar el cálculo de e, el usuario ingresará el número de iteraciones que deberán realizarse.
Solución:
#include <stdio.h>

double calcNumeroE (int iteraciones); /* Prototipo de la función */

int main() {
double valorNumeroE;
int numIteraciones;
printf(“Ingrese la cantidad de iteraciones: ”);
scanf(“%d”, &numIteraciones);

valorNumeroE = calcNumeroE ( numIteraciones ); /* aquí se invoca a la función */


printf(“El valor de e es = %.6lf\n” , valorNumeroE );
return 0;
}

/* Aquí se implementa la función */


double calcNumeroE (int iteraciones){
double suma, factorial, termino;
int i;
i = 0;
suma = 0;
factorial = 1;
termino = 1;
while (i < iteraciones){
if (i==0)
suma = suma + 1;
else{
factorial = factorial * i;
termino = (double) 1 / factorial;
suma = suma + termino;
}
i++;
}
return suma;
}

10
FUNCIONES MÁS USADAS

1. Leer datos:
void leerDatos(int *a, double *b) {
printf(“Ingrese a y b: ”);
scanf(“%d %lf”, a, b);
}

2. Cálculo del factorial de un número:


double calcFact(int num){
double fact;
int i;
fact = 1;
i= 1;
while (i <= num) {
prod = prod * i;
i++;
}
return fact;
}

3. Cálculo del inverso de un número:


int calcInverso(int num){
int inverso, copia, cifra;
inverso = 0;
copia = num; /* copia al numero original */
while (copia > 0){
cifra = copia % 10; /* extrae la ultima cifra del numero */
inverso = inverso*10 + cifra; /* guarda la cifra a la derecha del inverso */
copia = copia / 10; /* prepara al numero para la siguiente extracción */
}
return inverso;
}

4. Verifica si un número es primo:


int verifPrimo(int n){
int cantDivisores, i, primo;
cantDivisores = 0;
i = 1;
while (i <= n){
if (n % i == 0) /* Verifica si i es divisor de n */
cantDivisores++;
i++;
}
esPrimo = (cantDivisores == 2); /* verifica si solo tiene 2 divisores: 1 y n */
return esPrimo;
}

11
5. Cambio de base: de un número en base 10 a un número de base b (2<b<=9):
int cambioBase (int num, int base){
int nuevoNum, copia, cifra, potencia;
nuevoNum = 0;
copia = num;
potencia = 1; /* inicializa la potencia en 10^0 */
while (copia > 0){
cifra = copia % base;
/* almacena en nuevoNum el numero en la base deseada */
/* la cifra extraida la va colocando delante de la anterior */
nuevoNum = nuevoNum + cifra*potencia;
potencia = potencia * 10; /* actualiza la potencia a 10^n */
copia = copia / base;
}
return nuevoNum;
}

6. Cambio de base: de un número en base b (2<base<=9) a un número en base 10


int cambioBase10(int num, int base){
int nuevoNum, copia, cifra, potencia;
nuevoNum = 0;
copia = num;
potencia = 1;
while (copia > 0){
cifra = copia % 10; /* extrae la ultima cifra de un numero */
/* multiplica cifra por base^potencia */
nuevoNum = nuevoNum + cifra*potencia;
potencia = potencia*base;
copia = copia / 10;
}
return nuevoNum;
}

PROBLEMAS PARA RESOLVER EN CLASE

Pseudocódigo

1. (EX1 2019-0)
Se pueden clasificar a los triángulos de acuerdo a la magnitud de sus lados tal como se muestra a
continuación:
Tipos de triángulo según sus lados

(4)
area= √ a2 , a : lado
Equilátero Tiene los 3 lados iguales 3

(√ )
Isósceles Tiene dos lados iguales y el
b2 a 2 ,
tercero distinto area= b a 2− a : lados iguales , b : lado distinto
4 2

Escaleno Tiene los 3 lados distintos a+ b+c


p=
2
area=√ p( p−a)( p−b)¿ ¿
a , b , c : lados del triángulo

12
Se le pide escribir un algoritmo que permita ingresar la magnitud de los lados del triángulo. Si todos los
datos ingresados son válidos, debe determinar el tipo de triángulo según el criterio de clasificación y calcular
el área de acuerdo a la fórmula.

2. (EX1 2019-1)
Se pide implemente el pseudocódigo o diagrama de flujo que permita calcular el valor de la derivada o de la
integral de una ecuación: El usuario deberá ingresar el carácter D o I para especificar el tipo de operación a
realizar.
 En el caso de la integral: debe leer una función de la forma: k x n +b
donde el usuario ingresa los valores para k, x, n, b y una constante C y se muestre el valor de la
integral resultante. Por ejemplo, si el usuario ingresa I 0 3 0 4 1 se debe mostrar el valor 13.0 como
resultado.
Las reglas de integración inmediatas a considerar en su solución se muestran más adelante.

 En el caso de la derivada: debe leer una fusión de la forma: k x n +b


Donde el usuario ingresa los valores de k, x, n y b y se muestra el valor de la derivada resultante.
Por ejemplo, so el usuario ingresa d 8 2 1 4 se debe mostrar el valor 8 como resultado.
Las reglas de derivación a considerar se muestran más adelante.

Recuerde que debe mostrar mensajes adecuados para solicitar datos al usuario, considerando mayúsculas y
minúsculas, mostrar las salidas, posibles mensajes de error o advertencia.
Reglas de integración Reglas de Derivación
Descripción Función Integral Descripción Función Derivada
Integral b bx +C Derivada de una función lineal kx +b k
Integral n n+1 Derivada de una potencia n n−1
x , para n ≠ 1 x kx kn x
potencial +C
n+1
Integral 1 ln |x|+C Derivada de una raíz cuadrada √x 1
logarítmica x 2√ x

Un ejemplo de ejecución será:

Quiere calcular la integral (I) o la derivada (D)


>dD
Ingrese los valores de k, x, n, b
>84 2 1 4 3
El valor de la derivada es: 8
4

Quiere calcular la integral (I) o la derivada (D)


>i
Ingrese los valores de k, x, n, b
>2 4 4 4
Ingrese el valor de la constante
>9
No se conoce esta integral

13
3. (EX1 2019-2)
En física, se conoce como refracción al cambio de dirección y velocidad que experimenta una onda al pasar
de un medio a otro. Mientras que la reflexión se define como el cambio de dirección que experimenta una
onda que, al entrar en contacto con la superficie de separación entre dos medios cambiantes, regresa al
medio donde se originó. En la figura 1 se puede apreciar un ejemplo de refracción y reflexión de una onda
que pasa por el agua hacia el aire. En la parte izquierda se aprecia un rayo refractado y en la parte derecha
se aprecia un rayo reflejado.

Cada medio, como por ejemplo el agua y el aire, posee una medida denominada índice de refracción que
permite saber cuánto se reduce la velocidad de la onda dentro de dicho medio. En la figura 1 el índice de
refracción del aire está representados por la variable n2 y el índice de refracción del agua por la variable n1 .
En óptica, cuando un rayo de luz atraviesa un medio que posee un índice de refracción menor, se puede
producir lo que se denomina reflexión interna total. La reflexión interna total se da cuando el rayo de luz
no es capaz de atravesar la superficie entre ambos medios reflejándose completamente.
El ángulo crítico θc es el menor ángulo en el cual se produce la reflexión interna total. Esto quiere decir que
si el ángulo de incidencia de la luz ( θ1 en la figura 1) es mayor que el ángulo crítico ( θc en la figura 1),
ocurre la reflexión interna total. En la figura 1 se puede apreciar el ángulo crítico en la parte del medio. El

ángulo crítico se puede calcular de la siguiente manera: θc =arcoseno


( )
n2
n1
.

Para calcular el ángulo de la luz refractado, se puede utilizar la ley de Snell de la refracción. Esta ley fue
descubierta experimentalmente por Willebrod Snell en el año 1621 y dice que los ángulos de incidencia y
refracción vienen relacionados por n1 × sen ( θ1 ) =n2 × sen ( θ2 ).
Se pide elaborar un algoritmo expresado en pseudocódigo (sin utilizar módulos) que dado un índice de
refracción de un medio n1, un índice de refracción de un medio n2 y un ángulo de incidencia θ1 en grados
sexagesimales de una onda de luz que se encuentra en el medio 1, determine si ocurre reflexión interna
total o si ocurre refracción.
En esta pregunta deberá validar los datos de entrada y mostrar mensajes específicos ante las siguientes
situaciones:
 El índice de refracción de la luz en el vacío es 1 por lo que es el menor valor que puede tener este
índice.
En caso el usuario ingrese un valor menor a éste, se deberá emitir el siguiente mensaje “Los índices
de refracción deben ser números mayores o iguales a uno”.
 En caso el usuario ingrese un ángulo de incidencia menor o igual a cero, se deberá emitir el
siguiente mensaje: “El ángulo de incidencia debe ser mayor que cero”.
 En caso el usuario ingrese un ángulo de incidencia mayor o igual a 90 grados, se deberá emitir el
siguiente mensaje: “El ángulo de incidencia debe ser menor que 90”.

14
 Para que ocurra la reflexión interna total debe cumplirse que el índice de refracción del medio 1 sea
mayor que el índice de refracción del medio 2 ( n1 >n 2). En cado el usuario ingrese valores de índices
de refracción que no cumplan esta condición, se deberá emitir el siguiente mensaje: “El índice del
medio 1 debe ser mayor que el medio 2”.

Además, considerar lo siguiente:


 En caso ocurra refracción, deberá imprimir el ángulo refractado en grados sexagesimales.
 Si el ángulo incidente es igual al ángulo crítico deberá imprimir el mensaje: “ángulo crítico”. Para
esta comparación deberá usar solamente la parte entera del ángulo incidente y del ángulo crítico.

4. (EX1 2020-0)
En geometría analítica, las líneas rectas en un plano pueden ser expresadas mediante una ecuación del tipo
y=mx+b . En esta ecuación, m es denominada la pendiente de la recta y está relacionada con la
inclinación que toma la recta respecto a un par de ejes que definen el plano. La pendiente de la recta que
pasa por los puntos P( x 1 , y 1 ) y Q(x 2 , y 2 ) se puede calcular de la siguiente manera:
m=( y 2− y 1 )/( x 2−x 1)
Se sabe que 2 rectas son paralelas si sus pendientes son iguales y son perpendiculares si la multiplicación de
sus pendientes es igual a -1.
En el plano cartesiano, un rectángulo puede ser formado por 4 puntos que son A(x a , y a ), B( x b , y b ),
C ( x c , y c ) y D( x d , y d ). Podríamos considerar que se trata de un rectángulo si las rectas formadas por los
puntos AB y CD sin paralelas entre sí y las rectas formadas por los puntos BC y DA también son paralelas

15
entre sí. Además las rectas formadas por AB y BC deben ser perpendiculares, al igual que las rectas
formadas por los puntos AD y CD. Considerar que los casos a evaluar son aquellos rectángulos cuyos lados
no son paralelos a los ejes X o Y.
Se le pide elaborar un algoritmo expresado en pseudocódigo que, dados los puntos A, B, C y D, permita
evaluar si los puntos ingresados forman un rectángulo, considerando sólo las rectas paralelas y
perpendiculares que se pueden formar con ellos, de acuerdo a lo indicado en el enunciado. Además se
deben validar todas las condiciones descritas anteriormente.
A continuación se presentan algunos ejemplos de ejecución del algoritmo:

ESTRUCTURAS ITERATIVAS CON CONDICIÓN AL INICIO

5. (EX1-2019-1)
Sea b un número real positivo no nulo distinto de 1, y x otro número positivo no nulo. Se denomina
logaritmo del número x en la base b, al exponente L a que debe elevarse la base b para obtener dicho
número x. El logaritmo se expresa de la siguiente manera log b x y
L
log b x=L ↔ b =x . Por ejemplo,
log 5 625=4 ya que 54 =625 . El logaritmo es la operación inversa a la exponenciación.
En el logaritmo natural, se toma como base b al número e, cuyo valor es aproximadamente 2.718281828.
Como todos los logaritmos, el dominio de esta función viene dado por ¿ 0 ,+ ∞¿ y el rango por ¿−∞ ,+ ∞ ¿ .
Cuando x tiende a 0, el límite de esta función es −∞ .
Se pide que elabore un programa en ANSI C que permita calcular el valor del logaritmo natural de un
determinado número usando la siguiente serie:

16
( )
∞ 2 n+ 1
1 x−1
ln ( x )=2 ∑
n=0 2n+ 1 x +1
El programa deberá:
 Solicitar el valor de x.
 Solicitar la cantidad de términos n que usará en la serie.
 Si el valor de x es igual a 0, deberá imprimirse -inf que corresponde con −∞ .
 Si el valor de x es menor que 0, deberá imprimirse nan que es un acrónimo para Not a Number.
 Si el valor de x es mayor que cero, deberá imprimirse el valor del logaritmo natural usando la serie
antes mencionada sumando los n primeros términos.

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

Utilizando el producto de Wallis se puede calcular fácilmente el valor de π . A medida que se incrementa el
número de términos de la productoria, se obtienen valores de π con menor error de aproximación. Se le
pide que desarrolle un programa en ANSI C que permita imprimir el valor aproximado de π usando el
producto de Wallis con 200 términos y 20000 términos.
A continuación sigue un ejemplo de una posible salida de este programa para los primeros números:

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

18
Se le pide elaborar un programa en ANSI que permita transformar un número que se encuentra en
cualquier base a la base 10. Para esto deberá leer la base en donde se encuentra el número así como la
cantidad de dígito del número a leer. Luego deberá leer cada dígito del número empezando por el dígito
menos significativo.
A continuación, se presentan algunos ejemplos de ejecución:
Ejemplo 1:
Ingrese base: 16
Ingrese cantidad de dígitos: 4
Ingrese el dígito1: 3
Ingrese el dígito2: E
Ingrese el dígito3: 0
Ingrese el dígito4: A
El número en base 10 es 41187
Ejemplo 2:
Ingrese base: 16
Ingrese cantidad de dígitos: 4
Ingrese el dígito1: 3
Ingrese el dígito2: e
Ingrese el dígito3: 0
Ingrese el dígito4: a
El número en base 10 es 41187
Ejemplo 3:
Ingrese base: 2
Ingrese cantidad de dígitos: 5
Ingrese el dígito1: 0
Ingrese el dígito2: 1
Ingrese el dígito3: 1
Ingrese el dígito4: 0
Ingrese el dígito5: 1
El número en base 10 es 22
Ejemplo 4:
Ingrese base: 8
Ingrese cantidad de dígitos: 6
Ingrese el dígito1: 1
Ingrese el dígito2: 7
Ingrese el dígito3: 3
Ingrese el dígito4: 0
Ingrese el dígito5: 2
Ingrese el dígito6: 1
El número en base 10 es 41209
Ejemplo 5:
Ingrese base: 8

19
Ingrese cantidad de dígitos: 4
Ingrese el dígito1: 2
Ingrese el dígito2: -
Los dígitos deben estar en el rango [A..Z], [a..z], [0..9]
Ejemplo 6:
Ingrese base: 16
Ingrese cantidad de dígitos: 6
Ingrese el dígito1: A
Ingrese el dígito2: 0
Ingrese el dígito3: Z
Ha ingresado un dígito inválido para la base seleccionada

PROGRAMACIÓN MODULAR

8. Suma de números de máximo 3 cifras hasta la base 10


Los pasos para realizar la suma de dos números de varias cifras la conocemos todos desde el colegio. A
continuación, se presentan algunos ejemplos de sumas de varias cifras en diferentes bases.

Se le pide a usted que elabore un programa en ANSI C que, haciendo uso de la programación modular con
estructuras algorítmicas selectivas e iterativas, realice la suma de dos números de máximo 3 cifras en
cualquier base menor o igual que 10 y mayor que 1. El procedimiento a seguir es el mismo que usted aplica
para sumar dos números de varias cifras, sumando unidades con unidades, decenas con decenas, centenas
con centenas, etc., y llevando una cifra cuando se tenga que llevar. En todo el programa NO ESTÁ
PERMITIDO CONVERTIR A BASE 10 los números.

El programa debe considerar lo siguiente:

 Realice la lectura de la base de numeración, la base debe ser mayor que 1 y menor igual que 10.
Ingrese la base (1 < base <= 10)):
 Realice la lectura del primer número.
Ingrese el primer número:
 Realice la lectura del segundo número.
Ingrese el segundo número:
 Si la base no es correcta o los números no son válidos, es decir, la cantidad de su cifras no
corresponde a máximo 3 cifras, o sus cifras no corresponden al sistema de numeración permitidos
por la base, se muestra un mensaje dependiendo de qué número es el incorrecto y el programa
termina.
Lo siento, error en la base. O
Lo siento, el primer número no es válido. O
Lo siento, el segundo número no es válido. O
Lo siento, los números no son válidos.
 Si la base y los números son válidos, se realiza la suma y se muestra el resultado en pantalla.

20
Su solución deberá incluir las siguientes funciones, además de la función main:

 void leer datos(int *base, int *n1, int *n2) //Función que lee la base menor igual que 10 y mayor
que 1, y los números n1 y n2, ambos de la misma base.
 int es valido(int base, int n) //Función que valida si el número n es de máximo 3 cifras y está bien
escrito en la base dada por base.
 int suma(int base, int n1, int n2) //Función que suma dos números en la base dada por base.

9. Resta de números de máximo 3 cifras hasta la base 10


Los pasos para realizar la resta o sustracción de dos números de varias cifras la conocemos todos desde el
colegio. A continuación, se presentan algunos ejemplos de sumas de varias cifras en diferentes bases.

Se le pide a usted que elabore un programa en ANSI C que, haciendo uso de la programación modular con

21
estructuras algorítmicas selectivas e iterativas, realice la resta de dos números de máximo 3 cifras en
cualquier base menor o igual que 10 y mayor que 1. El procedimiento a seguir es el mismo que usted aplica
para restar dos números de varias cifras, restando unidades con unidades, decenas con decenas, centenas
con centenas, etc., y prestando una cifra cuando el minuendo es menor que el sustraendo. En todo el
programa NO ESTÁ PERMITIDO CONVERTIR A BASE 10 los números.

El programa debe considerar lo siguiente:

 Realice la lectura de la base de numeración, la base debe ser mayor que 1 y menor igual que 10.
Ingrese la base (1 < base <= 10)):
 Realice la lectura del primer número.
Ingrese el primer número:
 Realice la lectura del segundo número.
Ingrese el segundo número:
 Si la base ingresada no es válida, se muestra un mensaje y termina el programa. Si los números no
son válidos, es decir, la cantidad de su cifras excede a 3 o sus cifras no corresponden al sistema de
numeración permitidos por la base, se muestra un mensaje dependiendo de qué número es el
incorrecto y el programa termina. También debe validar que el primer número sea mayor que el
segundo número. Los posibles mensajes son:
Lo siento, la base es incorrecta. O
Lo siento, el primer número no es válido. O
Lo siento, el segundo número no es válido. O
Lo siento, los números no son válidos.
Lo siento, el primer número debe ser mayor que el segundo número.

 Si la base y los números son válidos, se realiza la resta y se muestra el resultado en pantalla.

Su solución deberá incluir las siguientes funciones, además de la función main:

 void leer datos(int *base, int *n1, int *n2) //Función que lee la base menor igual que 10 y mayor
que 1, y los números n1 y n2, ambos de la misma base.
 int es_de_3_digitos_y_esta_en_su_base_correcta (int base, int n) //Función que valida si el número
n es de máximo 3 cifras y está bien escrito en la base dada por base.
 int resta(int base, int n1, int n2) //Función que resta dos números en la base dada por base.

22
10. (EX1 2018-1)
Los triángulos se pueden clasificar de acuerdo a la magnitud de sus ángulos y de acuerdo a la magnitud de
sus lados tal como se muestra a continuación:

Considere un triángulo como el que se muestra en la figura. Se le pide escribir un algoritmo en lenguaje C
que permita ingresar la magnitud de los lados A y B del triángulo y el ángulo α que forman (en grados
sexagesimales). También se debe ingresar el criterio de clasificación que se utilizará (A: según los ángulos
o L: según los lados). Si todos los datos ingresados son válidos, debe calcular y mostrar la magnitud del
tercer lado del triángulo (lado C) y los dos ángulos restantes ( β y θ ). Así mismo debe determinar el tipo de
triángulo que es según el criterio de clasificación que se haya ingresado (A o L).

Utilice la librería matemática para poder utilizar las funciones sqrt, asin, acos, sin, cos, pow. No obstante,
recuerde que las funciones de esa librería devuelven un tipo particular de datos y que las funciones asin,
acos, sin, cos usan los parámetros en radianes.

Recuerde que:
π
1 ° grado sexagesimal= grados radianes
180
Considere que, si seno de x es igual a y, entonces arcoseno de y es igual a x.
Se le pide desarrollar los siguientes módulos:
 Módulo de lectura de datos, que se encargue de leer los lados A y B del triángulo y el ángulo α .
 Módulo que calcule el lado C del triángulo.
 Módulo que calcule los ángulos β y θ .
 Módulo para determinar el tipo de triángulo en base a sus ángulos.
 Módulo para determinar el tipo de triángulo en base a sus lados.
 Módulo main

23
Para la evaluación se considerará el uso correcto de comentarios, variables descriptivas,
mensajes al usuario y el mensaje de salidas solicitado. De elaborar el diseño en pseudocódigo
la solución propuesta no será considerada.

11. (EX1 2019-0)


La conjetura de Goldbach es un teorema que señala que todo número par mayor que 2 puede escribirse
como la suma de dos números primos. Por ejemplo, el número 8 puede escribirse como la suma de los
primos 3 y 5.
Se le solicita implementar un programa en el lenguaje C que determine si un número ingresado por teclado
cumple con la conjetura de Goldbach. Usted debe asumir que el usuario únicamente ingresará números
pares mayores a 2, es decir, no debe validar que el número ingresado cumpla esta condición, y deberá
únicamente validar si el número ingresado cumple con la conjetura o no.
Al evaluar si su número cumple la conjetura deberá, además, imprimir los números primos que permiten que
se cumpla dicha conjetura. En caso un número pueda ser representado por dos o más sumas diferentes de
primos, todas estas deberán ser impresas (cada una en una línea diferente).
Su solución deberá incluir una función que determine si un número es primo o no , la cual deberá ser
invocada repetidas veces dentro de una estructura iterativa que genere todas las posibles parejas de sumas
de primos a comparar con el valor ingresado por teclado. En caso de que un número par mayor a 2 no
cumpla con esta conjetura, su programa deberá imprimir un mensaje de alerta, caso contrario, deberá
imprimir el mensaje "Se cumple la conjetura de Goldbach".
A continuación, se muestra un ejemplo de ejecución:
Ingrese un número: 10
10 = 3 + 7
10 = 5 + 5
10 = 7 + 3
Se cumple la conjetura de Goldbach

12. (EX1 2018-2)

24
Siguiendo esta fórmula, es posible determinar que los primeros números catalanes son:
1,1,2,5,14,42,132,429...
Se le pide implementar un programa en ANSI C que al ingresar un número i, calcule e imprima todos los
números catalanes desde C0 hasta Ci
Su solución deberá incluir una función para el cálculo del factorial de un número, y una función para el
cálculo de un número catalán. Estas funciones deberán ser llamadas repetidas veces desde una estructura
iterativa con entrada controlada.
A continuación, se muestran dos ejemplos de ejecución:
Ingresar un número: 0
Los números catalanes correspondientes son: 1

Ingresar un número: 4
Los números catalanes correspondientes son: 1, 1, 2, 5, 14

13. Números deficientes, abundantes, perfectos y semiperfectos


Un número natural es deficiente cuando la suma de sus divisores propios es menor que él. Se denomina
divisor propio de un número natural n, a otro número también natural que es divisor de n, pero diferente de
n. Por ejemplo:

25
 10 es deficiente porque sus divisores propios, 1, 2 y 5 suman 8 que es menor que 10.

Un número natural es abundante cuando la suma de sus divisores propios es mayor que él. Por ejemplo:

 12 es abundante porque sus divisores propios, 1, 2, 3, 4 y 6 suman 16 que es mayor que 12.

Un número natural es perfecto, cuando la suma de sus divisores propios es igual a él. Por ejemplo:

 6 es perfecto porque sus divisores propios, 1, 2 y 3 suman 6 que es igual a 6.

Un número natural es semiperfecto, cuando la suma de algunos de sus divisores propios es igual a él. Para
números naturales menores que 30, una forma para determinar si el número es semiperfecto es restar a la
suma de divisores propios, uno de los divisores propios, si uno de esos resultados es igual al número,
entonces se puede decir que el número es semiperfecto. Por ejemplo:

 12 es semiperfecto porque algunos de sus divisores propios, 1, 2, 3 y 6 suman 12 que es igual a 12.

Los números perfectos son también semiperfectos.

Se le pide a usted que elabore un programa en ANSI C que, haciendo uso de la programación modular con
estructuras algorítmicas selectivas e iterativas, realice lo siguiente:

 Realice la lectura de un número n (0 < n < 30).


 Verifique que el número natural ingresado sea mayor que 0 y menor que 30. Si no está en el rango,
muestra el mensaje El valor ingresado no pertenece al rango 0<n<30 y el programa termina.
 Si el número ingresado pertenece al rango válido, imprima en pantalla si el número es deficiente,
abundante o perfecto, si el número es también semiperfecto deberá indicarlo.

Su solución deberá incluir las siguientes funciones, además de la función main:

 void leer_datos(int *n) //Función que, mediante el paso de parámetro por referencia, lee el valor de n
ingresado por teclado .
 int es_valido(int n) //Función que verifica si el valor de n es mayor que 0 y menor que 30.
 int sum_divisores_propios(int n) //Función que retorna la suma de los divisores propios de n.
 int es_deficiente(int n, int sum_div_propios) //Función que evalúa si n es deficiente, y recibe como
parámetros, el valor de n y el valor de la suma de divisores propios.
 int es_abundante(int n, int sum_div_propios) //Función que evalúa si n es abundante, y recibe como
parámetros, el valor de n y el valor de la suma de divisores propios.
 int es_perfecto(int n, int sum_div_propios) //Función que evalúa si n es perfecto, y recibe como
parámetros, el valor de n y el valor de la suma de divisores propios.
 int es_semi_perfecto(int n, int sum_div_propios) //Función que evalúa si n es semiperfecto, y recibe
como parámetros, el valor de n y el valor de la suma de divisores propios.

26
14. Números felices e infelices
Los números, cómo las personas, pueden ser felices o infelices. Para determinar si un número es feliz se
sigue el siguiente procedimiento: se suman los cuadrados de sus dígitos, y se repite el proceso cuantas
veces sea necesario; si en algún momento obtenemos un 1, hemos terminado y entonces se puede decir
que el número original es feliz :). En caso de que la cantidad de repeticiones del proceso sobrepase las 8
iteraciones, entonces se dice que el número original es infeliz :(. Por ejemplo:
7 es un número feliz, ya que:
 72 =49
2 2
 4 +9 =97
 92 +7 2=130
 12 +32 +02=10
 12 +02=1

Si n no es feliz, la suma de los cuadrados luego de 8 iteraciones no llegaría a 1. Por ejemplo, 4 es infeliz,
porque luego de 8 iteraciones no llega a 1:

4, 16, 37, 58, 89, 145, 42, 20, 4, ...


Algunos números felices de dos cifras son: 10, 13, 19, 23, ...
Cuando un número es feliz y a la vez es primo, se dice que es un primo feliz. Algunos primos felices de dos
cifras son: 13, 19, 23, ...
Se le pide a usted que elabore un programa en el lenguaje C que, haciendo uso de la programación modular
con estructuras algorítmicas selectivas e iterativas, determine si un número de dos cifras es feliz o infeliz; en
el caso de ser primo, determine si es un primo feliz o infeliz. Su programa debe considerar lo siguiente:

 Realice la lectura de un número n de dos cifras.


 Verifique que el número natural ingresado sea de dos cifras.
 Imprima en pantalla si el número n es feliz o infeliz. Adicional a ello, si es feliz y primo se imprimirá que
es un primo feliz, y si no es feliz y es primo, deberá imprimirse que es un primo infeliz.

Su solución deberá incluir las siguientes funciones, además de la función main:

 void leer_datos(int *n) //Función que lee el valor de n ingresado por teclado simulando el paso de
parámetro por referencia.

27
 int es_feliz(int n) //Función que evalúa si n es feliz o no.
 int sum_digits_al_cuadrado(int n) //Función que retorna la suma de los cuadrados de los dígitos de
n.
 int cant_digitos(int n); //Función que retorna la cantidad de dígitos de n, sabiendo que n a lo más
puede tener 3 dígitos.
 int es_primo(int n) //Función que evalúa si n es primo.

28

También podría gustarte