Add calculos_varios exercise

This commit is contained in:
Manuel Vergara 2024-05-05 19:17:13 +02:00
parent c1d0b18cb9
commit 1d49383921
3 changed files with 498 additions and 13 deletions

View File

@ -765,11 +765,11 @@ La posibilidad de crear las librerías facilita la reutilización del código y
2. Diseñad una acción que, dados un real que representa el saldo de una cuenta corriente y otro real que representa un cargo o imposición, actualice el saldo de la cuenta.
[Solución en lenguaje C]()
[Solución en lenguaje C](./soluciones_c/solucion2/saldo_cuenta.c)
3. Diseñad una función que calcule n (real) elevado a la potencia m (entero).
[Solución en lenguaje C]()
[Solución en lenguaje C](./soluciones_c/solucion3/potencia.c)
4. Diseñad una acción que, dados tres números reales que representan los coeficientes de una ecuación de segundo grado, retorne sus raíces, en caso de que existan. En caso contrario, que inicialice las raíces a 0. Recordad que dada la ecuación A * x2 + B * x + C las raíces se calculan:
@ -780,22 +780,19 @@ Si la expresión dentro de la raíz es negativa quiere decir que la ecuación no
```
function squareRoot(x: real): real;
```
Declarad las variables necesarias para llamar a la acción del ejercicio anterior e indicad cómo se llamaría.
4b. Declarad las variables necesarias para llamar a la acción del ejercicio anterior e indicad cómo se llamaría.
[Solución en lenguaje C](./soluciones_c/solucion4/ecuacion_segundo_grado.c)
[Solución en lenguaje C]()
1. Para cada apartado siguiente, decidid si es mejor una acción o una función y definid su cabecera (solamente se pide la cabecera, no hay que diseñar ningún algoritmo).
5. Para cada apartado siguiente, decidid si es mejor una acción o una función y definid su cabecera (solamente se pide la cabecera, no hay que diseñar ningún algoritmo).
- Dadas las dimensiones de una pared (altura y anchura) y el precio de pintura por metro cuadrado, determinad el coste total de pintura necesario para pintar la pared.
- Dado el consumo total de agua acumulado desde el mes de enero hasta junio (ambos incluidos), leed por el canal estándar el consumo del resto de meses (desde julio a diciembre, ambos incluidos), y retornadlo acumulado al total del consumo de los 6 primeros meses.
- Dados dos números enteros intercambiad los valores de ambas variables siempre que ambas sean diferentes de cero.
- Dado un entero retornad la suma de sus divisores.
[Solución en lenguaje C]()
Declarad las variables necesarias para llamar a las acciones del ejercicio anterior e indicad cómo se llamarían.
5b. Declarad las variables necesarias para llamar a las acciones del ejercicio anterior e indicad cómo se llamarían.
[Solución en lenguaje C]()
[Solución en lenguaje C](./soluciones_c/solucion5/calculos_varios.c) (He añadido algunos extras para jugar)
### 12.10 Soluciones en lenguaje algorítmico
@ -994,14 +991,333 @@ end algorithm
5. Solución
```alg
En C:
```c
#include <stdio.h>
// Función para calcular el coste total de pintura necesario para pintar una pared
float calcularCostePintura(float altura, float anchura, float precio_pintura)
{
return altura * anchura * precio_pintura;
}
// Función para calcular el consumo total de agua acumulado
float calcularConsumoAgua(float *consumo_actual, int *meses_consumo_actual, int *ano_consumo_actual)
{
float consumo_mes;
int meses_a_introducir;
printf("¿Cuántos meses quieres introducir? ");
scanf("%d", &meses_a_introducir);
for (int i = 1; i <= meses_a_introducir; i++)
{
if (*meses_consumo_actual == 12)
{
*meses_consumo_actual = 1;
(*ano_consumo_actual)++;
}
else
{
(*meses_consumo_actual)++;
}
printf("Introduce el consumo de agua del mes %d: ", *meses_consumo_actual);
scanf("%f", &consumo_mes);
*consumo_actual += consumo_mes;
}
}
// Función para obtener el nombre del mes
char *calcularMesString(int mes)
{
char *meses[] = {"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"};
return meses[mes - 1];
}
// Acción para intercambiar los valores de dos números enteros
void intercambiarValores(int *a, int *b)
{
if (*a != 0 && *b != 0)
{
int temp = *a;
*a = *b;
*b = temp;
}
}
// Función para calcular la suma de los divisores de un número entero
int sumaDivisores(int n)
{
int suma = 0;
for (int i = 1; i <= n; i++)
{
if (n % i == 0)
{
suma += i;
}
}
return suma;
}
int main()
{
int opcion;
float consumo_actual = 60;
int meses_consumo_actual = 6;
int ano_consumo_actual = 2021;
do
{
printf("\n[+] Elige una opción:\n");
printf("1. Calcular el coste total de pintura necesario para pintar una pared\n");
printf("2. Calcular el consumo total de agua acumulado\n");
printf("3. Intercambiar los valores de dos números enteros\n");
printf("4. Calcular la suma de los divisores de un número entero\n");
printf("5. Salir\n\n");
printf("> ");
scanf("%d", &opcion);
switch (opcion)
{
case 1:
{
float altura, anchura, precio_pintura;
printf("\n[+] Introduce la altura de la pared: ");
scanf("%f", &altura);
printf("[+] Introduce la anchura de la pared: ");
scanf("%f", &anchura);
printf("[+] Introduce el precio de la pintura por metro cuadrado: ");
scanf("%f", &precio_pintura);
float coste_pintura = calcularCostePintura(altura, anchura, precio_pintura);
printf("\n[+] El coste total de pintura necesario para pintar la pared es de %.2f euros\n", coste_pintura);
break;
}
case 2:
{
calcularConsumoAgua(&consumo_actual, &meses_consumo_actual, &ano_consumo_actual);
char *nombre_mes = calcularMesString(meses_consumo_actual);
printf("\n[+] El consumo total de agua acumulado hasta %s del año %d es de %.2f litros\n", nombre_mes, ano_consumo_actual, consumo_actual);
break;
}
case 3:
{
int num1, num2;
printf("\n[+] Introduce el primer número entero: ");
scanf("%d", &num1);
printf("[+] Introduce el segundo número entero: ");
scanf("%d", &num2);
intercambiarValores(&num1, &num2);
printf("\n[+] Los valores intercambiados son: %d y %d\n", num1, num2);
break;
}
case 4:
{
int numero;
printf("[+] Introduce un número entero: ");
scanf("%d", &numero);
int suma_divisores = sumaDivisores(numero);
printf("\n[+] La suma de los divisores de %d es: %d\n", numero, suma_divisores);
break;
}
case 5:
printf("\n[!] Saliendo...\n");
break;
default:
printf("[!] Opción no válida\n");
break;
}
} while (opcion != 5);
return 0;
}
```
5b. Solución
En lenguaje algorítmico:
```alg
function calcularCostePintura(altura: real, anchura: real, precio_pintura: real): real
return altura * anchura * precio_pintura;
end function
action calcularConsumoAgua(inout consumo_actual: real, inout meses_consumo_actual: integer, inout ano_consumo_actual: integer)
var
consumo_mes: real;
meses_a_introducir: integer;
end var
writeString("¿Cuántos meses quieres introducir? ");
meses_a_introducir:= readInteger();
for i:= 1 to meses_a_introducir do
if meses_consumo_actual = 12 then
meses_consumo_actual:= 1;
ano_consumo_actual:= ano_consumo_actual + 1;
else
meses_consumo_actual:= meses_consumo_actual + 1;
end if
writeString("Introduce el consumo de agua del mes ");
writeString(meses_consumo_actual);
writeString(": ");
readReal(consumo_mes);
consumo_actual:= consumo_actual + consumo_mes;
end for
end action
function calcularMesString(mes: integer): string
var
meses: array[1..12] of string;
end var
meses[1]:= "Enero";
meses[2]:= "Febrero";
meses[3]:= "Marzo";
meses[4]:= "Abril";
meses[5]:= "Mayo";
meses[6]:= "Junio";
meses[7]:= "Julio";
meses[8]:= "Agosto";
meses[9]:= "Septiembre";
meses[10]:= "Octubre";
meses[11]:= "Noviembre";
meses[12]:= "Diciembre";
return meses[mes];
end function
action intercambiarValores(inout a: integer, inout b: integer)
var
temp: integer;
end var
if a ≠ 0 and b ≠ 0 then
temp:= a;
a:= b;
b:= temp;
end if
end action
function sumaDivisores(n: integer): integer
var
suma, i: integer;
end var
suma:= 0;
for i:= 1 to n do
if n mod i = 0 then
suma:= suma + i;
end if
end for
return suma;
end function
algorithm main
var
opcion: integer;
consumo_actual: real;
meses_consumo_actual, ano_consumo_actual: integer;
end var
consumo_actual:= 60;
meses_consumo_actual:= 6;
ano_consumo_actual:= 2021;
repeat
writeString("[+] Elige una opción:");
writeString("1. Calcular el coste total de pintura necesario para pintar una pared");
writeString("2. Calcular el consumo total de agua acumulado");
writeString("3. Intercambiar los valores de dos números enteros");
writeString("4. Calcular la suma de los divisores de un número entero");
writeString("5. Salir");
writeString("> ");
readInteger(opcion);
case opcion of
1:
var
altura, anchura, precio_pintura: real;
end var
writeString("[+] Introduce la altura de la pared: ");
readReal(altura);
writeString("[+] Introduce la anchura de la pared: ");
readReal(anchura);
writeString("[+] Introduce el precio de la pintura por metro cuadrado: ");
readReal(precio_pintura);
writeString("[+] El coste total de pintura necesario para pintar la pared es de ");
writeReal(calcularCostePintura(altura, anchura, precio_pintura));
writeString(" euros");
2:
calcularConsumoAgua(consumo_actual, meses_consumo_actual, ano_consumo_actual);
writeString("[+] El consumo total de agua acumulado hasta ");
writeString(calcularMesString(meses_consumo_actual));
writeString(" del año ");
writeInteger(ano_consumo_actual);
writeString(" es de ");
writeReal(consumo_actual);
writeString(" litros");
3:
var
num1, num2: integer;
end var
writeString("[+] Introduce el primer número entero: ");
readInteger(num1);
writeString("[+] Introduce el segundo número entero: ");
readInteger(num2);
intercambiarValores(num1, num2);
writeString("[+] Los valores intercambiados son: ");
writeInteger(num1);
writeString(" y ");
writeInteger(num2);
4:
var
numero: integer;
end var
writeString("[+] Introduce un número entero: ");
readInteger(numero);
writeString("[+] La suma de los divisores de ");
writeInteger(numero);
writeString(" es: ");
writeInteger(sumaDivisores(numero));
5:
writeString("[!] Saliendo...");
otherwise
writeString("[!] Opción no válida");
end case
until opcion = 5
end algorithm
```

View File

@ -0,0 +1,169 @@
/* Para cada apartado siguiente escoger si es mejor una acción o una función
y definir su cabecera.
- Dadas las dimensiones de una pared (altura y anchura)
y el precio de pintura por metro cuadrado,
determinar el coste total de pintura necesario para pintar la pared.
- Dado el consumo total de agua acumulado
desde el mes de enero hasta junio (ambos incluidos),
leer por el canal estándar el consumo del resto de meses
(desde julio a diciembre, ambos incluidos),
y retornar acumulado al total del consumo de los 6 primeros meses.
- Dados dos números enteros intercambiad los valores de ambas variables siempre
que ambas sean diferentes de cero.
- Dado un entero retornad la suma de sus divisores.
Declarar las variables necesarias para llamar a las acciones del ejercicio
anterior e indicar cómo se llamarían. */
#include <stdio.h>
// Función para calcular el coste total de pintura necesario para pintar una pared
float calcularCostePintura(float altura, float anchura, float precio_pintura)
{
return altura * anchura * precio_pintura;
}
// Función para calcular el consumo total de agua acumulado
float calcularConsumoAgua(float *consumo_actual, int *meses_consumo_actual, int *ano_consumo_actual)
{
float consumo_mes;
int meses_a_introducir;
printf("¿Cuántos meses quieres introducir? ");
scanf("%d", &meses_a_introducir);
for (int i = 1; i <= meses_a_introducir; i++)
{
if (*meses_consumo_actual == 12)
{
*meses_consumo_actual = 1;
(*ano_consumo_actual)++;
}
else
{
(*meses_consumo_actual)++;
}
printf("Introduce el consumo de agua del mes %d: ", *meses_consumo_actual);
scanf("%f", &consumo_mes);
*consumo_actual += consumo_mes;
}
}
// Función para obtener el nombre del mes
char *calcularMesString(int mes)
{
char *meses[] = {"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"};
return meses[mes - 1];
}
// Acción para intercambiar los valores de dos números enteros
void intercambiarValores(int *a, int *b)
{
int temp;
if (*a != 0 && *b != 0)
{
temp = *a;
*a = *b;
*b = temp;
}
}
// Función para calcular la suma de los divisores de un número entero
int sumaDivisores(int n)
{
int suma = 0;
int i;
for (i = 1; i <= n; i++)
{
if (n % i == 0)
{
suma += i;
}
}
return suma;
}
int main()
{
int opcion;
float consumo_actual = 60;
int meses_consumo_actual = 6;
int ano_consumo_actual = 2021;
do
{
printf("\n[+] Elige una opción:\n");
printf("1. Calcular el coste total de pintura necesario para pintar una pared\n");
printf("2. Calcular el consumo total de agua acumulado\n");
printf("3. Intercambiar los valores de dos números enteros\n");
printf("4. Calcular la suma de los divisores de un número entero\n");
printf("5. Salir\n\n");
printf("> ");
scanf("%d", &opcion);
switch (opcion)
{
case 1:
{
float altura, anchura, precio_pintura;
printf("\n[+] Introduce la altura de la pared: ");
scanf("%f", &altura);
printf("[+] Introduce la anchura de la pared: ");
scanf("%f", &anchura);
printf("[+] Introduce el precio de la pintura por metro cuadrado: ");
scanf("%f", &precio_pintura);
float coste_pintura = calcularCostePintura(altura, anchura, precio_pintura);
printf("\n[+] El coste total de pintura necesario para pintar la pared es de %.2f euros\n", coste_pintura);
break;
}
case 2:
{
calcularConsumoAgua(&consumo_actual, &meses_consumo_actual, &ano_consumo_actual);
char *nombre_mes = calcularMesString(meses_consumo_actual);
printf("\n[+] El consumo total de agua acumulado hasta %s del año %d es de %.2f litros\n", nombre_mes, ano_consumo_actual, consumo_actual);
break;
}
case 3:
{
int num1, num2;
printf("\n[+] Introduce el primer número entero: ");
scanf("%d", &num1);
printf("[+] Introduce el segundo número entero: ");
scanf("%d", &num2);
intercambiarValores(&num1, &num2);
printf("\n[+] Los valores intercambiados son: %d y %d\n", num1, num2);
break;
}
case 4:
{
int numero;
printf("[+] Introduce un número entero: ");
scanf("%d", &numero);
int suma_divisores = sumaDivisores(numero);
printf("\n[+] La suma de los divisores de %d es: %d\n", numero, suma_divisores);
break;
}
case 5:
printf("\n[!] Saliendo...\n");
break;
default:
printf("[!] Opción no válida\n");
break;
}
} while (opcion != 5);
return 0;
}