Compare commits

..

3 Commits

Author SHA1 Message Date
1d49383921 Add calculos_varios exercise 2024-05-05 19:17:13 +02:00
c1d0b18cb9 Update .gitignore 2024-05-05 19:16:44 +02:00
6cd4ebc24a Add ecuacion_segundo_grado exercise 2024-05-05 14:23:27 +02:00
6 changed files with 627 additions and 18 deletions

1
.gitignore vendored
View File

@ -8,6 +8,7 @@
# Visual Studio Code # Visual Studio Code
# #
.vscode/* .vscode/*
*/.vscode/*
.vscode/settings.json .vscode/settings.json
.vscode/tasks.json .vscode/tasks.json
.vscode/launch.json .vscode/launch.json

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. 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). 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: 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,12 +780,9 @@ Si la expresión dentro de la raíz es negativa quiere decir que la ecuación no
``` ```
function squareRoot(x: real): real; 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.
[Solución en lenguaje C]() [Solución en lenguaje C](./soluciones_c/solucion4/ecuacion_segundo_grado.c)
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]()
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). 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. - 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.
@ -793,11 +790,9 @@ function squareRoot(x: real): real;
- Dados dos números enteros intercambiad los valores de ambas variables siempre que ambas sean diferentes de cero. - 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. - 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](./soluciones_c/solucion5/calculos_varios.c) (He añadido algunos extras para jugar)
[Solución en lenguaje C]()
### 12.10 Soluciones en lenguaje algorítmico ### 12.10 Soluciones en lenguaje algorítmico
@ -925,31 +920,404 @@ algorithm main
writeReal(potencia(base, exponente)); writeReal(potencia(base, exponente));
end algorithm end algorithm
``` ```
4. Solución 4. Solución
```alg ```alg
function squareRoot(x: real): real
var
estimacion, epsilon: real;
end var
``` estimacion:= x / 2.0;
epsilon:= 0.0001;
4b. Solución while (((estimacion * estimacion - x) > epsilon) or (x - estimacion * estimacion) > epsilon) do
estimacion:= (estimacion + x / estimacion) / 2.0;
end while
```alg return estimacion;
end function
action calcularRaices(in A: real, in B: real, in C: real, out raiz1: real, out raiz2: real)
var
discriminante: real;
end var
discriminante:= B * B - 4 * A * C;
if discriminante >= 0 then
var
raiz_discriminante: real;
end var
raiz_discriminante:= squareRoot(discriminante);
raiz1:= (-B + raiz_discriminante) / (2 * A);
raiz2:= (-B - raiz_discriminante) / (2 * A);
else
raiz1:= 0;
raiz2:= 0;
end if
end action
algorithm main
var
coeficiente_A, coeficiente_B, coeficiente_C, raiz1, raiz2: real;
end var
writeString("Introduce los coeficientes de la ecuación de segundo grado.");
writeString("A: ");
coeficiente_A:= readReal();
writeString("B: ");
coeficiente_B:= readReal();
writeString("C: ");
coeficiente_C:= readReal();
calcularRaices(coeficiente_A, coeficiente_B, coeficiente_C, raiz1, raiz2);
writeString("Las raíces son: ");
writeReal(raiz1);
writeString(" y ");
writeReal(raiz2);
end algorithm
``` ```
5. Solución 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 ```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,71 @@
/*
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:
```
x1 = (-B + sqrt(B2 - 4 * A * C)) / (2 * A)
```
Si la expresión dentro de la raíz es negativa quiere decir
que la ecuación no tiene raíces.
Podéis suponer que la función raíz cuadrada está ya definida y su cabecera es:
```
function squareRoot(x: real): real;
```
Declarad las variables necesarias para llamar a la acción anterior
e indicad cómo se llamaría.
*/
#include <stdio.h>
// Función para calcular la raíz cuadrada utilizando el método de Newton
float squareRoot(float x) {
float estimacion = x / 2.0; // Estimación inicial
float epsilon = 0.0001; // Precisión deseada
while ((estimacion * estimacion - x) > epsilon || (x - estimacion * estimacion) > epsilon) {
estimacion = (estimacion + x / estimacion) / 2.0;
}
return estimacion;
}
// Función para calcular las raíces de una ecuación de segundo grado
void calcularRaices(float A, float B, float C, float *raiz1, float *raiz2) {
float discriminante = B * B - 4 * A * C;
if (discriminante >= 0) {
float raiz_discriminante = squareRoot(discriminante);
*raiz1 = (-B + raiz_discriminante) / (2 * A);
*raiz2 = (-B - raiz_discriminante) / (2 * A);
} else {
*raiz1 = 0;
*raiz2 = 0;
}
}
int main() {
float coeficiente_A, coeficiente_B, coeficiente_C, raiz1, raiz2;
printf("Introduce los coeficientes de la ecuacion de segundo grado.\nA: ");
scanf("%f", &coeficiente_A);
printf("B: ");
scanf("%f", &coeficiente_B);
printf("C: ");
scanf("%f", &coeficiente_C);
calcularRaices(coeficiente_A, coeficiente_B, coeficiente_C, &raiz1, &raiz2);
printf("\nLas raices son: %.2f y %.2f\n\n", raiz1, raiz2);
return 0;
}

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;
}