From e1e279d7603a4e350235e7f98f09e0ca7110d075 Mon Sep 17 00:00:00 2001 From: Parodper Date: Tue, 27 Feb 2024 23:01:49 +0100 Subject: [PATCH 01/10] =?UTF-8?q?Exercicios=2029=20e=2031=20do=20Bolet?= =?UTF-8?q?=C3=ADn=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Boletin_3/Ejercicio_29.c | 64 ++++++++++++++++++++++++++++++++++++ src/Boletin_3/Ejercicio_30.c | 38 +++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 src/Boletin_3/Ejercicio_29.c create mode 100644 src/Boletin_3/Ejercicio_30.c diff --git a/src/Boletin_3/Ejercicio_29.c b/src/Boletin_3/Ejercicio_29.c new file mode 100644 index 0000000..0575e0a --- /dev/null +++ b/src/Boletin_3/Ejercicio_29.c @@ -0,0 +1,64 @@ +// SPDX-FileCopyrightText: 2024 Pablo R. +// +// SPDX-License-Identifier: GPL-3.0-only + +// Enunciado: Plantee e implemente una función recursiva en Lenguaje C para determinar si un número natural es capicúa. Además, implemente otra función apropiada para probar su funcionamiento, activando esta última desde el programa principal. + +//Para usar bool +#include +//Para usar pow +#include +//Para usar scanf y printf +#include + +//Precondición: num es positivo +bool determinarSiCapicua(int num) { + int a, b; + //Variables auxiliares + int reducido, posFinal; + + if(num < 10) { + //Caso base de la recursión: Solo queda un dígito + return true; + } else { + //Extraer el primer y último dígito + // posFinal ayudará a saber en que posición está «a» + for(a = num, posFinal = 0; + a >= 10 || a <= -10; + posFinal++, a /= 10); + b = num % 10; + + //Comprobar si son iguales. Si sí, recursión; si no, se devuelve falso y esto sube por la pila de llamadas + if(a == b) { + //Quitamos a y b de num + reducido = num / 10; + reducido -= a * (int)pow(10, posFinal); + + return determinarSiCapicua(reducido); + } else { + return false; + } + } +} + +void probarSiCapicua() { + int num; + + printf("Introduzca el número natural: "); + scanf("%d", &num); + if(num < 0) { + num = -num; + } + + if(determinarSiCapicua(num)) { + printf("%d es capicua\n", num); + } else { + printf("%d no es capicua\n", num); + } +} + +int main() { + probarSiCapicua(); + + return 0; +} diff --git a/src/Boletin_3/Ejercicio_30.c b/src/Boletin_3/Ejercicio_30.c new file mode 100644 index 0000000..490f6c2 --- /dev/null +++ b/src/Boletin_3/Ejercicio_30.c @@ -0,0 +1,38 @@ +// SPDX-FileCopyrightText: 2024 Pablo R. +// +// SPDX-License-Identifier: GPL-3.0-only + +// Enunciado: Plantee e implemente una función recursiva que devuelva la suma de las cifras de un número entero > 0. Por ejemplo si el número es 721 devuelve 10. Además de la función, implemente la función apropiada para probar su funcionamiento, activándola desde el programa principal. + +#include + +int sumaCifras(int num) { + //Caso base de la recursión: num es menor que 10 + if(num < 10) { + return num; + } else { + //Recursión: Se elimina la última cifra + return sumaCifras(num / 10) + (num % 10); + } +} + +void probarSuma() { + int num; + + while(1) { + printf("Introduzca el número: "); + scanf("%d", &num); + if(num <= 0) { + printf("%d tiene que ser mayor que 0\n", num); + } else { + break; + } + } + + printf("Suma: %d\n", sumaCifras(num)); +} + +int main() { + probarSuma(); + return 0; +} From 1ad56d9c789ef57cb3f1e4ef7bc0e62cb5c06385 Mon Sep 17 00:00:00 2001 From: Parodper Date: Tue, 27 Feb 2024 23:08:17 +0100 Subject: [PATCH 02/10] =?UTF-8?q?Versi=C3=B3n=20inicial=20do=20exercicio?= =?UTF-8?q?=2031=20do=20Bolet=C3=ADn=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Boletin_3/Ejercicio_31.c | 112 +++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 src/Boletin_3/Ejercicio_31.c diff --git a/src/Boletin_3/Ejercicio_31.c b/src/Boletin_3/Ejercicio_31.c new file mode 100644 index 0000000..22a7d5e --- /dev/null +++ b/src/Boletin_3/Ejercicio_31.c @@ -0,0 +1,112 @@ +// SPDX-FileCopyrightText: 2024 Pablo R. +// +// SPDX-License-Identifier: GPL-3.0-only + +// Enunciado: Plantee e implemente una función recursiva en Lenguaje C para resolver el problema de las torres de Hanoi. Además de la función, implemente la función apropiada para probar su funcionamiento, activando este último desde el programa principal. + +#include +#include + +//Para agilizar, se va a implementar una simple pila +typedef struct { + unsigned int libre; + unsigned int base; + unsigned int *pila; +} Pila; + +//Función auxiliar para inicializar una pila +void crearPila(Pila *p, int tamano) { + p->libre = 0; + p->base = 0; + p->pila = malloc(tamano * sizeof(unsigned int)); +} + +//Función auxiliar para mover un disco de una torre a otra +// Precondición: torreOrigen no está vacía y torreDestino no está llena +// Precondición: El disco de origen es más pequeño que el de destino +void mover(Pila *torreOrigen, Pila *torreDestino) { + int valor; + + valor = torreOrigen->pila[torreOrigen->libre - 1]; + torreDestino->pila[torreDestino->libre] = valor; + + torreOrigen->libre--; + torreDestino->libre++; +} + +void torresHanoi(Pila *origen, Pila *auxiliar, Pila *destino) { + //Caso base: La torre origen solo tiene un elemento + if(origen->libre == origen->base + 1) { + //Se mueve este elemento al destino y se acaba + mover(origen, destino); + } else { + //Se mueven todos los discos, excepto el más grande, + // a la torre auxiliar + origen->base++; + torresHanoi(origen, destino, auxiliar); + origen->base--; + //Mover la ficha que queda a la torre destino + mover(origen, destino); + //Mover las fichas restantes de auxiliar a destino + torresHanoi(auxiliar, origen, destino); + } +} + +//Función auxiliar para mostrar las torres +void imprimirTorre(const char *nombre, Pila *torre, int longitud) { + printf("%s: ", nombre); + for(int i = 0; i < longitud; i++) { + printf("%d ", torre->pila[i]); + } + printf("\n"); +} + +void ejecutar(int numDiscos) { + Pila origen, destino, auxiliar; + + //Crear las 3 torres. Las torres se definen como pilas de + // enteros, siendo pila[0] la parte inferior de la torre. + crearPila(&origen, numDiscos); + crearPila(&destino, numDiscos); + crearPila(&auxiliar, numDiscos); + + //La torre de origen está ordenada + for(int i = 0; i < numDiscos; i++) { + origen.pila[i] = numDiscos - i; + } + origen.libre = 4; + + imprimirTorre("Origen", &origen, numDiscos); + imprimirTorre("Auxiliar", &auxiliar, numDiscos); + imprimirTorre("Destino", &destino, numDiscos); + + //Se pasan los valores iniciales + torresHanoi(&origen, &auxiliar, &destino); + + imprimirTorre("Origen", &origen, numDiscos); + imprimirTorre("Auxiliar", &auxiliar, numDiscos); + imprimirTorre("Destino", &destino, numDiscos); + + //Se elimina la memoria + free(origen.pila); + free(destino.pila); + free(auxiliar.pila); +} + +int main() { + int numDiscos; + + while(1) { + printf("Introduzca el numero de discos: "); + scanf("%d", &numDiscos); + if(numDiscos <= 0) { + printf("Debe haber 1 o más discos\n"); + } else { + break; + } + } + + ejecutar(numDiscos); + + return 0; +} From cd01279786f03ca9afe0e3f401ca4d026d934114 Mon Sep 17 00:00:00 2001 From: Parodper Date: Thu, 29 Feb 2024 15:38:35 +0100 Subject: [PATCH 03/10] =?UTF-8?q?Feito=20o=20exercicio=2033=20do=20bolet?= =?UTF-8?q?=C3=ADn=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Boletin_3/Ejercicio_33.c | 41 ++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/Boletin_3/Ejercicio_33.c diff --git a/src/Boletin_3/Ejercicio_33.c b/src/Boletin_3/Ejercicio_33.c new file mode 100644 index 0000000..257d92d --- /dev/null +++ b/src/Boletin_3/Ejercicio_33.c @@ -0,0 +1,41 @@ +// SPDX-FileCopyrightText: 2024 Pablo R. +// +// SPDX-License-Identifier: GPL-3.0-only + +// Enunciado: Plantee e implemente una función recursiva en Lenguaje C que calcule la suma de los términos de la sucesión de Fibonacci hasta el término indicado por el usuario a través del teclado. Además de la función, implemente la función apropiada para probar su funcionamiento, activando está último desde el programa principal. + +#include + +int sumaFib(int limite, int a, int b) { + int siguiente; + + siguiente = a + b; + printf("%d %d = %d %d\n", a, b, siguiente, limite); + //Caso base de la recursión: se llegó al límite + if(siguiente == limite) { + return siguiente; + } else { + return sumaFib(limite, b, siguiente) + siguiente; + } +} + +void probarSuma() { + int num; + + while(1) { + printf("Introduzca el número: "); + scanf("%d", &num); + if(num <= 0) { + printf("%d tiene que ser mayor que 0\n", num); + } else { + break; + } + } + + printf("Suma: %d\n", sumaFib(num, 1, 1) + 2); //El 2 representa la suma de los 1 iniciales +} + +int main() { + probarSuma(); + return 0; +} From 3d733cd51cbc860ff423d9126b32c8fa6759dedd Mon Sep 17 00:00:00 2001 From: Parodper Date: Thu, 29 Feb 2024 15:38:42 +0100 Subject: [PATCH 04/10] =?UTF-8?q?Feito=20o=20exercicio=2034=20do=20bolet?= =?UTF-8?q?=C3=ADn=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Boletin_3/Ejercicio_34.c | 178 +++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 src/Boletin_3/Ejercicio_34.c diff --git a/src/Boletin_3/Ejercicio_34.c b/src/Boletin_3/Ejercicio_34.c new file mode 100644 index 0000000..8792e1a --- /dev/null +++ b/src/Boletin_3/Ejercicio_34.c @@ -0,0 +1,178 @@ +// SPDX-FileCopyrightText: 2024 Pablo R. +// +// SPDX-License-Identifier: GPL-3.0-only + +/* Enunciado: Plantee e implemente, mediante funciones y procedimientos, un programa en Lenguaje C gestionado por menú en el que se presenten opciones para realizar las siguientes operaciones sobre números enteros: + +- Calcular el número de cifras de un entero +- Sumar las cifras de un entero +- Indicar la cifra i-ésima menos significativa de un entero +- Calcular la imagen especular de un entero +- Comprobar si un entero es primo +- Calcula el MCD (mínimo común divisor) de dos números enteros +- Presentar la tabla de sumar, restar, multiplicar y dividir (hasta 10) de un número entero*/ + +#include +#include +#include + +enum Operaciones { + SALIR, + CONTAR_CIFRAS, + SUMAR_CIFRAS, + CIFRA_SIGNIFICATIVA, + IMAGEN, + PRIMO, + MCD, + TABLA +}; + +int numCifras(int num) { + int n; + //Bucle for, en cada paso dividimos num entre 10 y sumamos 1 + for(n = 1; num /= 10; n++); + return n; + //Otra opción sería hacer + // #include + // return (int)log10(num) + 1; +} + +int sumaCifras(int num) { + //Caso base de la recursión: num es menor que 10 + if(num < 10) { + return num; + } else { + //Recursión: Se elimina la última cifra + return sumaCifras(num / 10) + (num % 10); + } +} + +int cifraSignificativa(int num, int i) { + //Se coje la i-ésima cifra, empezando por el final. + for(; i > 1; i--) { + num /= 10; + } + + return num % 10; +} + +int imagen(int num) { + int x; + for(x = 0; num > 0; num /= 10) { + x = x*10 + (num % 10); + } + return x; +} + +bool primo(int n) { + //Este algoritmo usa el método de Eratóstenes, + // eliminando números hasta la raíz cuadrada de n + //Indica si el i-ésimo número no es primo + bool *no_primos; + + no_primos = calloc(n, sizeof(bool)); + + //Recorremos los números enteros hasta la raiz de n + for(int i = 2; i*i <= n; i++) { + if(no_primos[i]) { + //Si ya se comprobó, saltar + continue; + } else { + if(n % i == 0) { + //No es primo + return false; + } else { + //Si es primo. Marcamos todos sus múltiplos + for(int j = i + 1; j*j <= n; j++) { + no_primos[i] = n % j == 0; + } + } + } + } + + free(no_primos); + + return true; +} + +int mcd(int a, int b) { + //Algoritmo de Euclides recursivo + int tmp; + + if(b == 0) { + //Caso base + return a; + } else { + if(a > b) { + tmp = a % b; + } else { + tmp = b % a; + } + return mcd(b, tmp); + } +} + +void tabla(int num) { + printf(" SUMA RESTA MULT DIV\n"); + for(int i = 1; i <= 10; i++) { + printf("%2d %4d %5d %4d %4d\n", i, num + i, num - i, num * i, num / i); + } +} + +void menu() { + int op, num, i; + + do { + printf("0 - Salir\n"); + printf("1 - Calcular el número de cifras de un entero\n"); + printf("2 - Sumar las cifras de un entero\n"); + printf("3 - Indicar la cifra i-ésima menos significativa de un entero\n"); + printf("4 - Calcular la imagen especular de un entero\n"); + printf("5 - Comprobar si un entero es primo\n"); + printf("6 - Calcula el MCD (mínimo común divisor) de dos números enteros\n"); + printf("7 - Presentar la tabla de sumar, restar, multiplicar y dividir (hasta 10) de un número entero\n"); + printf("Introduzca el nº de operación: "); + scanf("%d", &op); + if(op == SALIR) { + continue; + } + printf("Introduza el número: "); + scanf("%d", &num); + if(op == CIFRA_SIGNIFICATIVA || op == MCD) { + printf("Introduzca el segundo número: "); + scanf("%d", &i); + } + printf("\n"); + switch(op) { + case CONTAR_CIFRAS: + printf("%d cifras\n", numCifras(num)); + break; + case SUMAR_CIFRAS: + printf("Total: %d\n", sumaCifras(num)); + break; + case CIFRA_SIGNIFICATIVA: + printf("Cifra: %d\n", cifraSignificativa(num, i)); + break; + case IMAGEN: + printf("%d -> %d\n", num, imagen(num)); + break; + case PRIMO: + printf("%d %s primo\n", num, primo(num) ? "es" : "no es"); + break; + case MCD: + printf("mcd(%d, %d) = %d\n", num, i, mcd(num, i)); + break; + case TABLA: + tabla(num); + break; + default: + printf("Opción incorrecta"); + }; + printf("\n"); + } while(op); +} + +int main() { + menu(); + return 0; +} From f8370cc5be6739966d5d40932bcfcf1f31587df2 Mon Sep 17 00:00:00 2001 From: Parodper Date: Fri, 8 Mar 2024 13:14:42 +0100 Subject: [PATCH 05/10] =?UTF-8?q?Exercicio=2035=20do=20Bolet=C3=ADn=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Boletin_3/CMakeLists.txt | 22 +- src/Boletin_3/Ejercicio_35.c | 380 +++++++++++++++++++++++++++++++++++ 2 files changed, 395 insertions(+), 7 deletions(-) create mode 100644 src/Boletin_3/Ejercicio_35.c diff --git a/src/Boletin_3/CMakeLists.txt b/src/Boletin_3/CMakeLists.txt index d141657..9d07fc9 100644 --- a/src/Boletin_3/CMakeLists.txt +++ b/src/Boletin_3/CMakeLists.txt @@ -2,10 +2,11 @@ # # SPDX-License-Identifier: CC0-1.0 -cmake_minimum_required(VERSION 3.26) +cmake_minimum_required(VERSION 3.25) project(Boletin_3 C) set(CMAKE_C_STANDARD 99) +set(CMAKE_BUILD_TYPE Debug) add_executable(Bol3-Ej01 Ejercicio_01.c) add_executable(Bol3-Ej02 Ejercicio_02.c) @@ -35,11 +36,18 @@ add_executable(Bol3-Ej25 Ejercicio_25.c) add_executable(Bol3-Ej26 Ejercicio_26.c) add_executable(Bol3-Ej27 Ejercicio_27.c) add_executable(Bol3-Ej28 Ejercicio_28.c) -#add_executable(Bol3-Ej29 Ejercicio_29.c) -#add_executable(Bol3-Ej30 Ejercicio_30.c) +add_executable(Bol3-Ej29 Ejercicio_29.c) +add_executable(Bol3-Ej30 Ejercicio_30.c) #add_executable(Bol3-Ej31 Ejercicio_31.c) add_executable(Bol3-Ej32 Ejercicio_32.c) -#add_executable(Bol3-Ej33 Ejercicio_33.c) -#add_executable(Bol3-Ej34 Ejercicio_34.c) -#add_executable(Bol3-Ej35 Ejercicio_35.c) -#add_executable(Bol3-Ej36 Ejercicio_36.c) +add_executable(Bol3-Ej33 Ejercicio_33.c) +add_executable(Bol3-Ej34 Ejercicio_34.c) +add_executable(Bol3-Ej35 Ejercicio_35.c) +add_executable(Bol3-Ej36 Ejercicio_36.c) + +#Necesario para math.h +target_link_libraries(Bol3-Ej04 m) +target_link_libraries(Bol3-Ej13 m) +target_link_libraries(Bol3-Ej25 m) +target_link_libraries(Bol3-Ej29 m) +target_link_libraries(Bol3-Ej35 m) diff --git a/src/Boletin_3/Ejercicio_35.c b/src/Boletin_3/Ejercicio_35.c new file mode 100644 index 0000000..a4f17be --- /dev/null +++ b/src/Boletin_3/Ejercicio_35.c @@ -0,0 +1,380 @@ +// SPDX-FileCopyrightText: 2024 Pablo R. +// +// SPDX-License-Identifier: GPL-3.0-only + +/* Enunciado: Plantee e implemente, mediante funciones y procedimientos, un programa en Lenguaje C gestionado por menú en el que se presenten opciones para realizar las siguientes operaciones sobre números enteros: + * + * - Salir del programa + * - Tres opciones de entre las siguientes: + * - Conocer el número de vocales sin acentuar existentes en un texto que el usuario escribe mientras no aparezca el carácter *. + * - Calcular la potencia de un número b elevado a e, sin utilizar los operadores de exponenciación. + * - Mostrar por pantalla el factorial del menor de dos números enteros positivos que introduzca por teclado el usuario. + * - Visualizar una tabla con los cuadrados y los cubos de los números contenidos en un intervalo de enteros indicado por el usuario. + * - Dibujar un cuadrado, aproximadamente centrado, en pantalla con el carácter y longitud del lado que indique el usuario. + * - Mostrar el área y el perímetro del rectángulo de menor área. El usuario debe indicar las longitudes de los lados de los dos rectángulos. + * - Visualizar una tabla de los números, los cuadrados y las raíces cuadradas de aquellos números contenidos en un intervalo de enteros indicado por el usuario. + * - Calcular el máximo, el mínimo y la media de una serie de números enteros que el usuario introduce por teclado. Finaliza la serie cuando el número introducido es múltiplo de 10. + * - Mostrar por pantalla los divisores de un número entero que indique el usuario. + * - Dibujar un triángulo equilátero, aproximadamente centrado, en pantalla con el carácter y longitud del lado que indique el usuario. + */ + +#include +#include +#include +#include +#include +#include + + +enum Operaciones { + SALIR, + VOCALES, + POTENCIA, + FACTORIAL, + CUBOS, + CUADRADO, + RECTANGULO, + TABLA, + MAXIMO, + DIVISORES, + EQUILATERO +}; + +void vocales() { + char c; + int n = 0; + + printf("Introduzca el texto. Introduzca «*» y pulse intro para terminar: "); + do { + c = getc(stdin); + switch(c) { + case 'a': + case 'e': + case 'i': + case 'o': + case 'u': + case 'A': + case 'E': + case 'I': + case 'O': + case 'U': + n++; + break; + } + } while(c != EOF && c != '*'); + + printf("%d vocales\n", n); +} + +int potencia(int base, int exponente) { + int n; + + //Para no usar las funciones de exponenciación, se hace un simple bucle + for(n = 1; exponente > 0; exponente--) { + n *= base; + } + + return n; +} + +int factorial(int n) { + if(n <= 1) { + return 1; + } else { + return n * factorial(n - 1); + } +} + +void cuadradosYCubos(int de, int hasta) { + printf("%5s Cuadrado Cubo\n", ""); + for(int i = de; i <= hasta; i++) { + printf("%5d %8d %8d\n", i, i*i, i*i*i); + } +} + +void dibujarCuadrado(int lado, char caracter) { + int i; + //Primera línea + for(i = 0; i < lado; i++) { + putchar(caracter); + } + putchar('\n'); + //Siguientes líneas + for(i = 1; i < lado - 1; i++) { + putchar(caracter); + for(int j = 1; j < lado - 1; j++) { + putchar(' '); + } + putchar(caracter); + putchar('\n'); + } + //Línea final + for(i = 0; i < lado; i++) { + putchar(caracter); + } +} + +void areaRectangulo(int largoA, int cortoA, int largoB, int cortoB) { + int areaA, areaB, perimetroA, perimetroB; + + areaA = largoA * cortoA; + perimetroA = (largoA + cortoA)*2; + + areaB = largoB * cortoB; + perimetroB = (largoB + cortoB)*2; + + if(areaA < areaB) { + printf("Rectángulo %d %d: Área %d Perímetro %d\n", largoA, cortoA, areaA, perimetroA); + } else { + printf("Rectángulo %d %d: Área %d Perímetro %d\n", largoB, cortoB, areaB, perimetroB); + } +} + +void raices(int de, int hasta) { + printf("%5s Cuadrado Raiz cuadrada\n", ""); + for(int i = de; i <= hasta; i++) { + printf("%5d %8d %e\n", i, i*i, sqrt(i)); + } +} + +void maximo() { + long *numeros, tmp, max, i; + char *entrada, *continuar, *entradaTmp; + size_t tamEntrada = sizeof(char); + + long maximo, minimo; + float media; + + + //Inicializar la cadena que contendrá la entrada + entrada = malloc(sizeof(char)); + printf("Introduzca los números separados por espacios. Termine con un salto de línea: "); + getline(&entrada, &tamEntrada, stdin); + entradaTmp = entrada; + continuar = entrada; + + //Inicializar el vector de números + numeros = calloc(tamEntrada / 2 + 1, sizeof(int)); + //Si el número es múltiplo de 10, se para + for (i = 0; (tmp = strtol(continuar, &entradaTmp, 10)) % 10 != 0; i++ ) { + //Si continuar es igual a entradaTmp no se han introducido + // números. Si entradaTmp es igual a '\0' es que se ha + // leido toda la entrada. + if(continuar == entradaTmp || *entradaTmp == '\0') { + break; + } else { + //En cada vuelta, strtol coje un número de continuar, y + // apunta al siguiente en la variable entradaTmp + continuar = entradaTmp; + } + numeros[i] = tmp; + } + + //Calcular la media, máximo y mínimo + max = i; + maximo = LONG_MIN; + minimo = LONG_MAX; + for(i = 0, tmp = 0; i < max; i++) { + tmp += numeros[i]; + if(numeros[i] > maximo) { + maximo = numeros[i]; + } + if(numeros[i] < minimo) { + minimo = numeros[i]; + } + } + media = (float)tmp / max; + + printf("Máximo: %ld\nMínimo: %ld\nMedia: %f\n", maximo, minimo, media); + + free(numeros); + free(entrada); +} + +void divisores(int num) { + printf("Divisores de %d: ", num); + for(int i = 2; i < num; i++) { + if(num % i == 0) { + printf("%d ", i); + } + } + printf("\n"); +} + +void triangulo(int lado, char caracter) { + int i; + + int espacioAntes, espacioEntre; + + if(lado % 2 == 0) { + espacioAntes = (lado - 2) / 2; + espacioEntre = 2; + } else { + espacioAntes = lado / 2; + espacioEntre = 1; + } + + //Punta del triángulo + //Si lado es par, 2 asteriscos + //Si impar, 1 asterisco + for(i = 0; i < espacioAntes; i++) { + putchar(' '); + } + putchar(caracter); + if(lado % 2 == 0) { + putchar(caracter); + } + putchar('\n'); + + //Dibujar los lados + // El espacio anterior se reduce un caracter de cada vez + // El espacio interior se reduce de 2 en 2 + for(espacioAntes-- ; espacioAntes > 0; espacioAntes--, espacioEntre += 2) { + //Dibujar espacios antes + for(i = 0; i < espacioAntes; i++) { + putchar(' '); + } + putchar(caracter); + //Dibujar espacios entre + for(i = 0; i < espacioEntre; i++) { + putchar(' '); + } + putchar(caracter); + putchar('\n'); + } + + //Dibujar el lado inferior + for(i = 0; i < lado; i++) { + putchar(caracter); + } + putchar('\n'); +} + + +//Función auxiliar con gets que lee un número por pantalla +//Equivalente a scanf("%d") +int leerNumero() { + size_t n; + char *str; + + str = calloc(10, sizeof(char)); + getline(&str, &n, stdin); + + return strtol(str, NULL, 10); +} + +void menu() { + int op, tmpA, tmpB, tmpC, tmpD; + size_t len; + char *c; + + c = calloc(10, sizeof(char)); + + do { +printf(" 0 - Salir del programa\n"); +printf(" 1 - Conocer el número de vocales sin acentuar existentes en un texto que el usuario escribe mientras no aparezca el carácter *\n"); +printf(" 2 - Calcular la potencia de un número b elevado a e, sin utilizar los operadores de exponenciación\n"); +printf(" 3 - Mostrar por pantalla el factorial del menor de dos números enteros positivos que introduzca por teclado el usuario\n"); +printf(" 4 - Visualizar una tabla con los cuadrados y los cubos de los números contenidos en un intervalo de enteros indicado por el usuario\n"); +printf(" 5 - Dibujar un cuadrado, aproximadamente centrado, en pantalla con el carácter y longitud del lado que indique el usuario\n"); +printf(" 6 - Mostrar el área y el perímetro del rectángulo de menor área. El usuario debe indicar las longitudes de los lados de los dos rectángulos\n"); +printf(" 7 - Visualizar una tabla de los números, los cuadrados y las raíces cuadradas de aquellos números contenidos en un intervalo de enteros indicado por el usuario\n"); +printf(" 8 - Calcular el máximo, el mínimo y la media de una serie de números enteros que el usuario introduce por teclado. Finaliza la serie cuando el número introducido es múltiplo de 10\n"); +printf(" 9 - Mostrar por pantalla los divisores de un número entero que indique el usuario\n"); +printf("10 - Dibujar un triángulo equilátero, aproximadamente centrado, en pantalla con el carácter y longitud del lado que indique el usuario\n"); + printf("Introduzca el nº de operación: "); + op = leerNumero(); + if(op == SALIR) { + continue; + } + printf("\n"); + switch(op) { + case VOCALES: + vocales(); + break; + + case POTENCIA: + printf("Base: "); + tmpA = leerNumero(); + printf("Exponente: "); + tmpB = leerNumero(); + printf("Resultado %d ** %d: %d", tmpA, tmpB, potencia(tmpA, tmpB)); + break; + + case FACTORIAL: + printf("Primer número: "); + tmpA = leerNumero(); + printf("Segundo número: "); + tmpB = leerNumero(); + if(tmpA > tmpB) { + printf("Factorial de %d: %d\n", tmpB, factorial(tmpB)); + } else { + printf("Factorial de %d: %d\n", tmpA, factorial(tmpA)); + } + break; + + case CUBOS: + printf("De: "); + tmpA = leerNumero(); + printf("Hasta: "); + tmpB = leerNumero(); + cuadradosYCubos(tmpA, tmpB); + break; + + case CUADRADO: + printf("Caracter: "); + getline(&c, &len, stdin); + printf("Tamaño: "); + tmpA = leerNumero(); + dibujarCuadrado(tmpA, c[0]); + break; + + case RECTANGULO: + printf("Longitudes de los lados largo y ancho del primer rectángulo, separados por espacios: "); + getline(&c, &len, stdin); + sscanf("%d %d", c, &tmpA, &tmpB); + printf("Longitudes de los lados largo y ancho del segundo rectángulo, separados por espacios: "); + getline(&c, &len, stdin); + sscanf("%d %d", c, &tmpC, &tmpD); + areaRectangulo(tmpA, tmpB, tmpC, tmpD); + break; + + case TABLA: + printf("De: "); + tmpA = leerNumero(); + printf("Hasta: "); + tmpB = leerNumero(); + raices(tmpA, tmpB); + break; + + case MAXIMO: + maximo(); + break; + + case DIVISORES: + printf("Introduca el número: "); + tmpA = leerNumero(); + divisores(tmpA); + break; + + case EQUILATERO: + printf("Caracter: "); + getline(&c, &len, stdin); + printf("Tamaño: "); + tmpA = leerNumero(); + triangulo(tmpA, c[0]); + break; + + default: + printf("Opción incorrecta"); + }; + printf("\n"); + } while(op); + + free(c); +} + +int main() { + menu(); + return 0; +} From 3b6c700cfdb49e3e74a808b6104d6c94e1dad59c Mon Sep 17 00:00:00 2001 From: Parodper Date: Fri, 8 Mar 2024 15:25:36 +0100 Subject: [PATCH 06/10] Arraxos no getline --- src/Boletin_3/Ejercicio_35.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Boletin_3/Ejercicio_35.c b/src/Boletin_3/Ejercicio_35.c index a4f17be..b7ce67e 100644 --- a/src/Boletin_3/Ejercicio_35.c +++ b/src/Boletin_3/Ejercicio_35.c @@ -254,13 +254,16 @@ void triangulo(int lado, char caracter) { //Función auxiliar con gets que lee un número por pantalla //Equivalente a scanf("%d") int leerNumero() { - size_t n; + size_t len = 10*sizeof(char); char *str; + int n; str = calloc(10, sizeof(char)); - getline(&str, &n, stdin); + getline(&str, &len, stdin); - return strtol(str, NULL, 10); + n = strtol(str, NULL, 10); + free(str); + return n; } void menu() { From 40834f1aa1ab0961e8d7563acd1dc3fd67b0071e Mon Sep 17 00:00:00 2001 From: Parodper Date: Fri, 8 Mar 2024 15:26:12 +0100 Subject: [PATCH 07/10] =?UTF-8?q?Exercicio=2036=20do=20Bolet=C3=ADn=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Boletin_3/Ejercicio_36.c | 197 +++++++++++++++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 src/Boletin_3/Ejercicio_36.c diff --git a/src/Boletin_3/Ejercicio_36.c b/src/Boletin_3/Ejercicio_36.c new file mode 100644 index 0000000..dcb05d5 --- /dev/null +++ b/src/Boletin_3/Ejercicio_36.c @@ -0,0 +1,197 @@ +// SPDX-FileCopyrightText: 2024 Pablo R. +// +// SPDX-License-Identifier: GPL-3.0-only + +/* Enunciado: Implemente un programa en Lenguaje C para trabajar con números complejos. Las opciones que debe tener son: +1. Introducir dos números complejos en forma binómica por teclado +2. Introducir dos números complejos en forma módulo-argumental por teclado +3. Sumar dos números complejos +4. Restar dos números complejos +5. Multiplicar dos números complejos +0. Salir +*/ + +#include +#include +#include +#include + +enum Operaciones { + SALIR, + BINOMICA, + MODULO, + SUMAR, + RESTAR, + MULTIPLICAR +}; + +typedef struct { + double real; + double imaginario; +} Binomica; + +typedef struct { + double modulo; + double argumento; +} ModuloArg; + + +typedef struct { + bool binomico; + union { + Binomica b; + ModuloArg m; + }; +} Numero; + +void binomicaAModulo(Binomica *origen, ModuloArg *destino) { + destino->modulo = sqrt(origen->real*origen->real + origen->imaginario*origen->imaginario); + destino->argumento = atan(origen->imaginario); +} + +void moduloABinomica(ModuloArg *origen, Binomica *destino) { + destino->imaginario = tan(origen->argumento); + destino->real = sqrt(origen->modulo*origen->modulo - destino->imaginario*destino->imaginario); +} + +void escribirNumero(Numero *n, const char *nombre) { + printf("%s ", nombre); + + if(n->binomico) { + printf("(binomico): z = %e + i*%e", n->b.real, n->b.imaginario); + } else { + printf("(módulo-argumental): |%e|_%e ", n->m.modulo, n->m.argumento); + } + + printf("\n"); +} + +void sumaBinomico(Binomica *x, Binomica *y, Binomica *z) { + z->real = x->real + y->real; + z->imaginario = x->imaginario + y->imaginario; +} + +void restaBinomico(Binomica *x, Binomica *y, Binomica *z) { + z->real = x->real - y->real; + z->imaginario = x->imaginario - y->imaginario; +} + +void multBinomico(Binomica *x, Binomica *y, Binomica *z) { + z->real = x->real*y->real - x->imaginario*y->imaginario; + z->imaginario = x->imaginario*y->real + x->real*y->imaginario; +} + +void menu() { + int op; + double tmpA, tmpB; + Numero x, y, z; + Binomica tempA, tempB; + ModuloArg tempC; + + do { + printf(" 1. Introducir dos números complejos en forma binómica por teclado\n"); + printf(" 2. Introducir dos números complejos en forma módulo-argumental por teclado\n"); + printf(" 3. Sumar dos números complejos\n"); + printf(" 4. Restar dos números complejos\n"); + printf(" 5. Multiplicar dos números complejos\n"); + printf(" 0. Salir\n"); + printf("Escoja una opción: "); + scanf("%d", &op); + if(op == SALIR) { + continue; + } + printf("\n"); + switch(op) { + case BINOMICA: + printf("Introduzca los números, con la parte real e imaginaria separados por espacios.\n"); + printf("X: "); + scanf("%lf %lf", &tmpA, &tmpB); + x.binomico = true; + x.b.real = tmpA; + x.b.imaginario = tmpB; + printf("Y: "); + scanf("%lf %lf", &tmpA, &tmpB); + y.binomico = true; + y.b.real = tmpA; + y.b.imaginario = tmpB; + break; + + case MODULO: + printf("Introduzca los números, con el módulo y argumento separados por espacios.\n"); + printf("X: "); + scanf("%lf %lf", &tmpA, &tmpB); + x.binomico = false; + x.m.modulo = tmpA; + x.m.argumento = tmpB; + printf("Y: "); + scanf("%lf %lf", &tmpA, &tmpB); + y.binomico = false; + y.m.modulo = tmpA; + y.m.argumento = tmpB; + break; + + case SUMAR: + if(x.binomico && y.binomico) { + sumaBinomico(&x.b, &y.b, &(z.b)); + } else { + moduloABinomica(&x.m, &tempA); + moduloABinomica(&y.m, &tempB); + sumaBinomico(&tempA, &tempB, &(z.b)); + } + z.binomico = true; + escribirNumero(&z, "Z"); + + z.binomico = false; + binomicaAModulo(&z.b, &tempC); + z.m = tempC; + escribirNumero(&z, "Z"); + break; + + case RESTAR: + if(x.binomico && y.binomico) { + restaBinomico(&x.b, &y.b, &(z.b)); + } else { + moduloABinomica(&x.m, &tempA); + moduloABinomica(&y.m, &tempB); + restaBinomico(&tempA, &tempB, &(z.b)); + } + z.binomico = true; + escribirNumero(&z, "Z"); + + z.binomico = false; + binomicaAModulo(&z.b, &tempC); + z.m = tempC; + escribirNumero(&z, "Z"); + break; + + case MULTIPLICAR: + if(x.binomico && y.binomico) { + multBinomico(&x.b, &y.b, &(z.b)); + } else { + moduloABinomica(&x.m, &tempA); + moduloABinomica(&y.m, &tempB); + multBinomico(&tempA, &tempB, &(z.b)); + } + z.binomico = true; + escribirNumero(&z, "Z"); + + z.binomico = false; + binomicaAModulo(&z.b, &tempC); + z.m = tempC; + escribirNumero(&z, "Z"); + break; + + default: + printf("Opción incorrecta"); + }; + printf("\n"); + printf("Números cargados:\n"); + escribirNumero(&x, "X"); + escribirNumero(&y, "Y"); + } while(op); +} + +int main() { + menu(); + return 0; +} From 6c71890872bede40415b2e0dff8cc1945ee860da Mon Sep 17 00:00:00 2001 From: Parodper Date: Fri, 8 Mar 2024 15:46:58 +0100 Subject: [PATCH 08/10] =?UTF-8?q?Outra=20versi=C3=B3n=20do=20Exercicio=203?= =?UTF-8?q?1=20do=20Bolet=C3=ADn=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Boletin_3/Ejercicio_31.c | 87 +++++------------------------------- 1 file changed, 11 insertions(+), 76 deletions(-) diff --git a/src/Boletin_3/Ejercicio_31.c b/src/Boletin_3/Ejercicio_31.c index 22a7d5e..e48b11a 100644 --- a/src/Boletin_3/Ejercicio_31.c +++ b/src/Boletin_3/Ejercicio_31.c @@ -7,90 +7,25 @@ #include #include -//Para agilizar, se va a implementar una simple pila -typedef struct { - unsigned int libre; - unsigned int base; - unsigned int *pila; -} Pila; - -//Función auxiliar para inicializar una pila -void crearPila(Pila *p, int tamano) { - p->libre = 0; - p->base = 0; - p->pila = malloc(tamano * sizeof(unsigned int)); -} //Función auxiliar para mover un disco de una torre a otra -// Precondición: torreOrigen no está vacía y torreDestino no está llena -// Precondición: El disco de origen es más pequeño que el de destino -void mover(Pila *torreOrigen, Pila *torreDestino) { - int valor; - - valor = torreOrigen->pila[torreOrigen->libre - 1]; - torreDestino->pila[torreDestino->libre] = valor; - - torreOrigen->libre--; - torreDestino->libre++; -} - -void torresHanoi(Pila *origen, Pila *auxiliar, Pila *destino) { - //Caso base: La torre origen solo tiene un elemento - if(origen->libre == origen->base + 1) { - //Se mueve este elemento al destino y se acaba - mover(origen, destino); - } else { - //Se mueven todos los discos, excepto el más grande, - // a la torre auxiliar - origen->base++; - torresHanoi(origen, destino, auxiliar); - origen->base--; - //Mover la ficha que queda a la torre destino - mover(origen, destino); - //Mover las fichas restantes de auxiliar a destino - torresHanoi(auxiliar, origen, destino); - } +void mover(int n, char *origen, char *destino) { + printf("Mover %d de %s a %s\n", n, origen, destino); } -//Función auxiliar para mostrar las torres -void imprimirTorre(const char *nombre, Pila *torre, int longitud) { - printf("%s: ", nombre); - for(int i = 0; i < longitud; i++) { - printf("%d ", torre->pila[i]); +void torresHanoi(int disco, char *origen, char *auxiliar, char *destino){ + if(disco == 1){ + mover(disco, origen, destino); + } else{ + torresHanoi(disco - 1,origen,destino,auxiliar); + mover(disco, origen, destino); + torresHanoi(disco - 1,auxiliar,origen,destino); } - printf("\n"); } void ejecutar(int numDiscos) { - Pila origen, destino, auxiliar; - - //Crear las 3 torres. Las torres se definen como pilas de - // enteros, siendo pila[0] la parte inferior de la torre. - crearPila(&origen, numDiscos); - crearPila(&destino, numDiscos); - crearPila(&auxiliar, numDiscos); - - //La torre de origen está ordenada - for(int i = 0; i < numDiscos; i++) { - origen.pila[i] = numDiscos - i; - } - origen.libre = 4; - - imprimirTorre("Origen", &origen, numDiscos); - imprimirTorre("Auxiliar", &auxiliar, numDiscos); - imprimirTorre("Destino", &destino, numDiscos); - - //Se pasan los valores iniciales - torresHanoi(&origen, &auxiliar, &destino); - - imprimirTorre("Origen", &origen, numDiscos); - imprimirTorre("Auxiliar", &auxiliar, numDiscos); - imprimirTorre("Destino", &destino, numDiscos); - - //Se elimina la memoria - free(origen.pila); - free(destino.pila); - free(auxiliar.pila); + //Ejecutar el algorimo + torresHanoi(numDiscos, "Origen", "Auxiliar", "Destino"); } int main() { From a43d19af0f18c6827f058f274ea3af12c3a82105 Mon Sep 17 00:00:00 2001 From: Parodper Date: Fri, 8 Mar 2024 15:52:39 +0100 Subject: [PATCH 09/10] =?UTF-8?q?Engadidos=20exercicios=20=C3=A1=20p=C3=A1?= =?UTF-8?q?xina?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/topics/Pro-1-Boletin-3.md | 28 +++------------------------- src/Boletin_3/CMakeLists.txt | 3 ++- 2 files changed, 5 insertions(+), 26 deletions(-) diff --git a/docs/topics/Pro-1-Boletin-3.md b/docs/topics/Pro-1-Boletin-3.md index 0e67d54..58d9651 100644 --- a/docs/topics/Pro-1-Boletin-3.md +++ b/docs/topics/Pro-1-Boletin-3.md @@ -10,12 +10,6 @@ SPDX-License-Identifier: CC-BY-NC-4.0 Funciones, recursividad y retorno de datos. - - -¡Se necesita tu ayuda! - -Faltan soluciones para los ejercicios del 29 al 31 y del 33 al 36. [Colabora](https://github.com/TeenBiscuits/Pro2324) - ### Ejercicio 1 @@ -282,14 +276,6 @@ probar su funcionamiento. - - -¡Se necesita tu ayuda! - -Faltan soluciones para los ejercicios del 29 al 31. [Colabora](https://github.com/TeenBiscuits/Pro2324) - - - ---> ### Ejercicio 32 @@ -323,14 +310,6 @@ Además de la función, implemente otra función apropiada para probar su funcio - - -¡Se necesita tu ayuda! - -Faltan soluciones para los ejercicios del 33 al 36. [Colabora](https://github.com/TeenBiscuits/Pro2324) - - - \ No newline at end of file diff --git a/src/Boletin_3/CMakeLists.txt b/src/Boletin_3/CMakeLists.txt index 9d07fc9..1a31ab0 100644 --- a/src/Boletin_3/CMakeLists.txt +++ b/src/Boletin_3/CMakeLists.txt @@ -38,7 +38,7 @@ add_executable(Bol3-Ej27 Ejercicio_27.c) add_executable(Bol3-Ej28 Ejercicio_28.c) add_executable(Bol3-Ej29 Ejercicio_29.c) add_executable(Bol3-Ej30 Ejercicio_30.c) -#add_executable(Bol3-Ej31 Ejercicio_31.c) +add_executable(Bol3-Ej31 Ejercicio_31.c) add_executable(Bol3-Ej32 Ejercicio_32.c) add_executable(Bol3-Ej33 Ejercicio_33.c) add_executable(Bol3-Ej34 Ejercicio_34.c) @@ -51,3 +51,4 @@ target_link_libraries(Bol3-Ej13 m) target_link_libraries(Bol3-Ej25 m) target_link_libraries(Bol3-Ej29 m) target_link_libraries(Bol3-Ej35 m) +target_link_libraries(Bol3-Ej36 m) From 16152d39f1feb8476137a3f4c59b632793498190 Mon Sep 17 00:00:00 2001 From: Parodper Date: Fri, 8 Mar 2024 15:59:03 +0100 Subject: [PATCH 10/10] =?UTF-8?q?Copiado=20c=C3=B3digo=20a=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/code/Boletin_3/Ejercicio_29.c | 64 +++++ docs/code/Boletin_3/Ejercicio_30.c | 38 +++ docs/code/Boletin_3/Ejercicio_31.c | 47 ++++ docs/code/Boletin_3/Ejercicio_33.c | 41 +++ docs/code/Boletin_3/Ejercicio_34.c | 178 ++++++++++++++ docs/code/Boletin_3/Ejercicio_35.c | 383 +++++++++++++++++++++++++++++ docs/code/Boletin_3/Ejercicio_36.c | 197 +++++++++++++++ 7 files changed, 948 insertions(+) create mode 100644 docs/code/Boletin_3/Ejercicio_29.c create mode 100644 docs/code/Boletin_3/Ejercicio_30.c create mode 100644 docs/code/Boletin_3/Ejercicio_31.c create mode 100644 docs/code/Boletin_3/Ejercicio_33.c create mode 100644 docs/code/Boletin_3/Ejercicio_34.c create mode 100644 docs/code/Boletin_3/Ejercicio_35.c create mode 100644 docs/code/Boletin_3/Ejercicio_36.c diff --git a/docs/code/Boletin_3/Ejercicio_29.c b/docs/code/Boletin_3/Ejercicio_29.c new file mode 100644 index 0000000..0575e0a --- /dev/null +++ b/docs/code/Boletin_3/Ejercicio_29.c @@ -0,0 +1,64 @@ +// SPDX-FileCopyrightText: 2024 Pablo R. +// +// SPDX-License-Identifier: GPL-3.0-only + +// Enunciado: Plantee e implemente una función recursiva en Lenguaje C para determinar si un número natural es capicúa. Además, implemente otra función apropiada para probar su funcionamiento, activando esta última desde el programa principal. + +//Para usar bool +#include +//Para usar pow +#include +//Para usar scanf y printf +#include + +//Precondición: num es positivo +bool determinarSiCapicua(int num) { + int a, b; + //Variables auxiliares + int reducido, posFinal; + + if(num < 10) { + //Caso base de la recursión: Solo queda un dígito + return true; + } else { + //Extraer el primer y último dígito + // posFinal ayudará a saber en que posición está «a» + for(a = num, posFinal = 0; + a >= 10 || a <= -10; + posFinal++, a /= 10); + b = num % 10; + + //Comprobar si son iguales. Si sí, recursión; si no, se devuelve falso y esto sube por la pila de llamadas + if(a == b) { + //Quitamos a y b de num + reducido = num / 10; + reducido -= a * (int)pow(10, posFinal); + + return determinarSiCapicua(reducido); + } else { + return false; + } + } +} + +void probarSiCapicua() { + int num; + + printf("Introduzca el número natural: "); + scanf("%d", &num); + if(num < 0) { + num = -num; + } + + if(determinarSiCapicua(num)) { + printf("%d es capicua\n", num); + } else { + printf("%d no es capicua\n", num); + } +} + +int main() { + probarSiCapicua(); + + return 0; +} diff --git a/docs/code/Boletin_3/Ejercicio_30.c b/docs/code/Boletin_3/Ejercicio_30.c new file mode 100644 index 0000000..490f6c2 --- /dev/null +++ b/docs/code/Boletin_3/Ejercicio_30.c @@ -0,0 +1,38 @@ +// SPDX-FileCopyrightText: 2024 Pablo R. +// +// SPDX-License-Identifier: GPL-3.0-only + +// Enunciado: Plantee e implemente una función recursiva que devuelva la suma de las cifras de un número entero > 0. Por ejemplo si el número es 721 devuelve 10. Además de la función, implemente la función apropiada para probar su funcionamiento, activándola desde el programa principal. + +#include + +int sumaCifras(int num) { + //Caso base de la recursión: num es menor que 10 + if(num < 10) { + return num; + } else { + //Recursión: Se elimina la última cifra + return sumaCifras(num / 10) + (num % 10); + } +} + +void probarSuma() { + int num; + + while(1) { + printf("Introduzca el número: "); + scanf("%d", &num); + if(num <= 0) { + printf("%d tiene que ser mayor que 0\n", num); + } else { + break; + } + } + + printf("Suma: %d\n", sumaCifras(num)); +} + +int main() { + probarSuma(); + return 0; +} diff --git a/docs/code/Boletin_3/Ejercicio_31.c b/docs/code/Boletin_3/Ejercicio_31.c new file mode 100644 index 0000000..e48b11a --- /dev/null +++ b/docs/code/Boletin_3/Ejercicio_31.c @@ -0,0 +1,47 @@ +// SPDX-FileCopyrightText: 2024 Pablo R. +// +// SPDX-License-Identifier: GPL-3.0-only + +// Enunciado: Plantee e implemente una función recursiva en Lenguaje C para resolver el problema de las torres de Hanoi. Además de la función, implemente la función apropiada para probar su funcionamiento, activando este último desde el programa principal. + +#include +#include + + +//Función auxiliar para mover un disco de una torre a otra +void mover(int n, char *origen, char *destino) { + printf("Mover %d de %s a %s\n", n, origen, destino); +} + +void torresHanoi(int disco, char *origen, char *auxiliar, char *destino){ + if(disco == 1){ + mover(disco, origen, destino); + } else{ + torresHanoi(disco - 1,origen,destino,auxiliar); + mover(disco, origen, destino); + torresHanoi(disco - 1,auxiliar,origen,destino); + } +} + +void ejecutar(int numDiscos) { + //Ejecutar el algorimo + torresHanoi(numDiscos, "Origen", "Auxiliar", "Destino"); +} + +int main() { + int numDiscos; + + while(1) { + printf("Introduzca el numero de discos: "); + scanf("%d", &numDiscos); + if(numDiscos <= 0) { + printf("Debe haber 1 o más discos\n"); + } else { + break; + } + } + + ejecutar(numDiscos); + + return 0; +} diff --git a/docs/code/Boletin_3/Ejercicio_33.c b/docs/code/Boletin_3/Ejercicio_33.c new file mode 100644 index 0000000..257d92d --- /dev/null +++ b/docs/code/Boletin_3/Ejercicio_33.c @@ -0,0 +1,41 @@ +// SPDX-FileCopyrightText: 2024 Pablo R. +// +// SPDX-License-Identifier: GPL-3.0-only + +// Enunciado: Plantee e implemente una función recursiva en Lenguaje C que calcule la suma de los términos de la sucesión de Fibonacci hasta el término indicado por el usuario a través del teclado. Además de la función, implemente la función apropiada para probar su funcionamiento, activando está último desde el programa principal. + +#include + +int sumaFib(int limite, int a, int b) { + int siguiente; + + siguiente = a + b; + printf("%d %d = %d %d\n", a, b, siguiente, limite); + //Caso base de la recursión: se llegó al límite + if(siguiente == limite) { + return siguiente; + } else { + return sumaFib(limite, b, siguiente) + siguiente; + } +} + +void probarSuma() { + int num; + + while(1) { + printf("Introduzca el número: "); + scanf("%d", &num); + if(num <= 0) { + printf("%d tiene que ser mayor que 0\n", num); + } else { + break; + } + } + + printf("Suma: %d\n", sumaFib(num, 1, 1) + 2); //El 2 representa la suma de los 1 iniciales +} + +int main() { + probarSuma(); + return 0; +} diff --git a/docs/code/Boletin_3/Ejercicio_34.c b/docs/code/Boletin_3/Ejercicio_34.c new file mode 100644 index 0000000..8792e1a --- /dev/null +++ b/docs/code/Boletin_3/Ejercicio_34.c @@ -0,0 +1,178 @@ +// SPDX-FileCopyrightText: 2024 Pablo R. +// +// SPDX-License-Identifier: GPL-3.0-only + +/* Enunciado: Plantee e implemente, mediante funciones y procedimientos, un programa en Lenguaje C gestionado por menú en el que se presenten opciones para realizar las siguientes operaciones sobre números enteros: + +- Calcular el número de cifras de un entero +- Sumar las cifras de un entero +- Indicar la cifra i-ésima menos significativa de un entero +- Calcular la imagen especular de un entero +- Comprobar si un entero es primo +- Calcula el MCD (mínimo común divisor) de dos números enteros +- Presentar la tabla de sumar, restar, multiplicar y dividir (hasta 10) de un número entero*/ + +#include +#include +#include + +enum Operaciones { + SALIR, + CONTAR_CIFRAS, + SUMAR_CIFRAS, + CIFRA_SIGNIFICATIVA, + IMAGEN, + PRIMO, + MCD, + TABLA +}; + +int numCifras(int num) { + int n; + //Bucle for, en cada paso dividimos num entre 10 y sumamos 1 + for(n = 1; num /= 10; n++); + return n; + //Otra opción sería hacer + // #include + // return (int)log10(num) + 1; +} + +int sumaCifras(int num) { + //Caso base de la recursión: num es menor que 10 + if(num < 10) { + return num; + } else { + //Recursión: Se elimina la última cifra + return sumaCifras(num / 10) + (num % 10); + } +} + +int cifraSignificativa(int num, int i) { + //Se coje la i-ésima cifra, empezando por el final. + for(; i > 1; i--) { + num /= 10; + } + + return num % 10; +} + +int imagen(int num) { + int x; + for(x = 0; num > 0; num /= 10) { + x = x*10 + (num % 10); + } + return x; +} + +bool primo(int n) { + //Este algoritmo usa el método de Eratóstenes, + // eliminando números hasta la raíz cuadrada de n + //Indica si el i-ésimo número no es primo + bool *no_primos; + + no_primos = calloc(n, sizeof(bool)); + + //Recorremos los números enteros hasta la raiz de n + for(int i = 2; i*i <= n; i++) { + if(no_primos[i]) { + //Si ya se comprobó, saltar + continue; + } else { + if(n % i == 0) { + //No es primo + return false; + } else { + //Si es primo. Marcamos todos sus múltiplos + for(int j = i + 1; j*j <= n; j++) { + no_primos[i] = n % j == 0; + } + } + } + } + + free(no_primos); + + return true; +} + +int mcd(int a, int b) { + //Algoritmo de Euclides recursivo + int tmp; + + if(b == 0) { + //Caso base + return a; + } else { + if(a > b) { + tmp = a % b; + } else { + tmp = b % a; + } + return mcd(b, tmp); + } +} + +void tabla(int num) { + printf(" SUMA RESTA MULT DIV\n"); + for(int i = 1; i <= 10; i++) { + printf("%2d %4d %5d %4d %4d\n", i, num + i, num - i, num * i, num / i); + } +} + +void menu() { + int op, num, i; + + do { + printf("0 - Salir\n"); + printf("1 - Calcular el número de cifras de un entero\n"); + printf("2 - Sumar las cifras de un entero\n"); + printf("3 - Indicar la cifra i-ésima menos significativa de un entero\n"); + printf("4 - Calcular la imagen especular de un entero\n"); + printf("5 - Comprobar si un entero es primo\n"); + printf("6 - Calcula el MCD (mínimo común divisor) de dos números enteros\n"); + printf("7 - Presentar la tabla de sumar, restar, multiplicar y dividir (hasta 10) de un número entero\n"); + printf("Introduzca el nº de operación: "); + scanf("%d", &op); + if(op == SALIR) { + continue; + } + printf("Introduza el número: "); + scanf("%d", &num); + if(op == CIFRA_SIGNIFICATIVA || op == MCD) { + printf("Introduzca el segundo número: "); + scanf("%d", &i); + } + printf("\n"); + switch(op) { + case CONTAR_CIFRAS: + printf("%d cifras\n", numCifras(num)); + break; + case SUMAR_CIFRAS: + printf("Total: %d\n", sumaCifras(num)); + break; + case CIFRA_SIGNIFICATIVA: + printf("Cifra: %d\n", cifraSignificativa(num, i)); + break; + case IMAGEN: + printf("%d -> %d\n", num, imagen(num)); + break; + case PRIMO: + printf("%d %s primo\n", num, primo(num) ? "es" : "no es"); + break; + case MCD: + printf("mcd(%d, %d) = %d\n", num, i, mcd(num, i)); + break; + case TABLA: + tabla(num); + break; + default: + printf("Opción incorrecta"); + }; + printf("\n"); + } while(op); +} + +int main() { + menu(); + return 0; +} diff --git a/docs/code/Boletin_3/Ejercicio_35.c b/docs/code/Boletin_3/Ejercicio_35.c new file mode 100644 index 0000000..b7ce67e --- /dev/null +++ b/docs/code/Boletin_3/Ejercicio_35.c @@ -0,0 +1,383 @@ +// SPDX-FileCopyrightText: 2024 Pablo R. +// +// SPDX-License-Identifier: GPL-3.0-only + +/* Enunciado: Plantee e implemente, mediante funciones y procedimientos, un programa en Lenguaje C gestionado por menú en el que se presenten opciones para realizar las siguientes operaciones sobre números enteros: + * + * - Salir del programa + * - Tres opciones de entre las siguientes: + * - Conocer el número de vocales sin acentuar existentes en un texto que el usuario escribe mientras no aparezca el carácter *. + * - Calcular la potencia de un número b elevado a e, sin utilizar los operadores de exponenciación. + * - Mostrar por pantalla el factorial del menor de dos números enteros positivos que introduzca por teclado el usuario. + * - Visualizar una tabla con los cuadrados y los cubos de los números contenidos en un intervalo de enteros indicado por el usuario. + * - Dibujar un cuadrado, aproximadamente centrado, en pantalla con el carácter y longitud del lado que indique el usuario. + * - Mostrar el área y el perímetro del rectángulo de menor área. El usuario debe indicar las longitudes de los lados de los dos rectángulos. + * - Visualizar una tabla de los números, los cuadrados y las raíces cuadradas de aquellos números contenidos en un intervalo de enteros indicado por el usuario. + * - Calcular el máximo, el mínimo y la media de una serie de números enteros que el usuario introduce por teclado. Finaliza la serie cuando el número introducido es múltiplo de 10. + * - Mostrar por pantalla los divisores de un número entero que indique el usuario. + * - Dibujar un triángulo equilátero, aproximadamente centrado, en pantalla con el carácter y longitud del lado que indique el usuario. + */ + +#include +#include +#include +#include +#include +#include + + +enum Operaciones { + SALIR, + VOCALES, + POTENCIA, + FACTORIAL, + CUBOS, + CUADRADO, + RECTANGULO, + TABLA, + MAXIMO, + DIVISORES, + EQUILATERO +}; + +void vocales() { + char c; + int n = 0; + + printf("Introduzca el texto. Introduzca «*» y pulse intro para terminar: "); + do { + c = getc(stdin); + switch(c) { + case 'a': + case 'e': + case 'i': + case 'o': + case 'u': + case 'A': + case 'E': + case 'I': + case 'O': + case 'U': + n++; + break; + } + } while(c != EOF && c != '*'); + + printf("%d vocales\n", n); +} + +int potencia(int base, int exponente) { + int n; + + //Para no usar las funciones de exponenciación, se hace un simple bucle + for(n = 1; exponente > 0; exponente--) { + n *= base; + } + + return n; +} + +int factorial(int n) { + if(n <= 1) { + return 1; + } else { + return n * factorial(n - 1); + } +} + +void cuadradosYCubos(int de, int hasta) { + printf("%5s Cuadrado Cubo\n", ""); + for(int i = de; i <= hasta; i++) { + printf("%5d %8d %8d\n", i, i*i, i*i*i); + } +} + +void dibujarCuadrado(int lado, char caracter) { + int i; + //Primera línea + for(i = 0; i < lado; i++) { + putchar(caracter); + } + putchar('\n'); + //Siguientes líneas + for(i = 1; i < lado - 1; i++) { + putchar(caracter); + for(int j = 1; j < lado - 1; j++) { + putchar(' '); + } + putchar(caracter); + putchar('\n'); + } + //Línea final + for(i = 0; i < lado; i++) { + putchar(caracter); + } +} + +void areaRectangulo(int largoA, int cortoA, int largoB, int cortoB) { + int areaA, areaB, perimetroA, perimetroB; + + areaA = largoA * cortoA; + perimetroA = (largoA + cortoA)*2; + + areaB = largoB * cortoB; + perimetroB = (largoB + cortoB)*2; + + if(areaA < areaB) { + printf("Rectángulo %d %d: Área %d Perímetro %d\n", largoA, cortoA, areaA, perimetroA); + } else { + printf("Rectángulo %d %d: Área %d Perímetro %d\n", largoB, cortoB, areaB, perimetroB); + } +} + +void raices(int de, int hasta) { + printf("%5s Cuadrado Raiz cuadrada\n", ""); + for(int i = de; i <= hasta; i++) { + printf("%5d %8d %e\n", i, i*i, sqrt(i)); + } +} + +void maximo() { + long *numeros, tmp, max, i; + char *entrada, *continuar, *entradaTmp; + size_t tamEntrada = sizeof(char); + + long maximo, minimo; + float media; + + + //Inicializar la cadena que contendrá la entrada + entrada = malloc(sizeof(char)); + printf("Introduzca los números separados por espacios. Termine con un salto de línea: "); + getline(&entrada, &tamEntrada, stdin); + entradaTmp = entrada; + continuar = entrada; + + //Inicializar el vector de números + numeros = calloc(tamEntrada / 2 + 1, sizeof(int)); + //Si el número es múltiplo de 10, se para + for (i = 0; (tmp = strtol(continuar, &entradaTmp, 10)) % 10 != 0; i++ ) { + //Si continuar es igual a entradaTmp no se han introducido + // números. Si entradaTmp es igual a '\0' es que se ha + // leido toda la entrada. + if(continuar == entradaTmp || *entradaTmp == '\0') { + break; + } else { + //En cada vuelta, strtol coje un número de continuar, y + // apunta al siguiente en la variable entradaTmp + continuar = entradaTmp; + } + numeros[i] = tmp; + } + + //Calcular la media, máximo y mínimo + max = i; + maximo = LONG_MIN; + minimo = LONG_MAX; + for(i = 0, tmp = 0; i < max; i++) { + tmp += numeros[i]; + if(numeros[i] > maximo) { + maximo = numeros[i]; + } + if(numeros[i] < minimo) { + minimo = numeros[i]; + } + } + media = (float)tmp / max; + + printf("Máximo: %ld\nMínimo: %ld\nMedia: %f\n", maximo, minimo, media); + + free(numeros); + free(entrada); +} + +void divisores(int num) { + printf("Divisores de %d: ", num); + for(int i = 2; i < num; i++) { + if(num % i == 0) { + printf("%d ", i); + } + } + printf("\n"); +} + +void triangulo(int lado, char caracter) { + int i; + + int espacioAntes, espacioEntre; + + if(lado % 2 == 0) { + espacioAntes = (lado - 2) / 2; + espacioEntre = 2; + } else { + espacioAntes = lado / 2; + espacioEntre = 1; + } + + //Punta del triángulo + //Si lado es par, 2 asteriscos + //Si impar, 1 asterisco + for(i = 0; i < espacioAntes; i++) { + putchar(' '); + } + putchar(caracter); + if(lado % 2 == 0) { + putchar(caracter); + } + putchar('\n'); + + //Dibujar los lados + // El espacio anterior se reduce un caracter de cada vez + // El espacio interior se reduce de 2 en 2 + for(espacioAntes-- ; espacioAntes > 0; espacioAntes--, espacioEntre += 2) { + //Dibujar espacios antes + for(i = 0; i < espacioAntes; i++) { + putchar(' '); + } + putchar(caracter); + //Dibujar espacios entre + for(i = 0; i < espacioEntre; i++) { + putchar(' '); + } + putchar(caracter); + putchar('\n'); + } + + //Dibujar el lado inferior + for(i = 0; i < lado; i++) { + putchar(caracter); + } + putchar('\n'); +} + + +//Función auxiliar con gets que lee un número por pantalla +//Equivalente a scanf("%d") +int leerNumero() { + size_t len = 10*sizeof(char); + char *str; + int n; + + str = calloc(10, sizeof(char)); + getline(&str, &len, stdin); + + n = strtol(str, NULL, 10); + free(str); + return n; +} + +void menu() { + int op, tmpA, tmpB, tmpC, tmpD; + size_t len; + char *c; + + c = calloc(10, sizeof(char)); + + do { +printf(" 0 - Salir del programa\n"); +printf(" 1 - Conocer el número de vocales sin acentuar existentes en un texto que el usuario escribe mientras no aparezca el carácter *\n"); +printf(" 2 - Calcular la potencia de un número b elevado a e, sin utilizar los operadores de exponenciación\n"); +printf(" 3 - Mostrar por pantalla el factorial del menor de dos números enteros positivos que introduzca por teclado el usuario\n"); +printf(" 4 - Visualizar una tabla con los cuadrados y los cubos de los números contenidos en un intervalo de enteros indicado por el usuario\n"); +printf(" 5 - Dibujar un cuadrado, aproximadamente centrado, en pantalla con el carácter y longitud del lado que indique el usuario\n"); +printf(" 6 - Mostrar el área y el perímetro del rectángulo de menor área. El usuario debe indicar las longitudes de los lados de los dos rectángulos\n"); +printf(" 7 - Visualizar una tabla de los números, los cuadrados y las raíces cuadradas de aquellos números contenidos en un intervalo de enteros indicado por el usuario\n"); +printf(" 8 - Calcular el máximo, el mínimo y la media de una serie de números enteros que el usuario introduce por teclado. Finaliza la serie cuando el número introducido es múltiplo de 10\n"); +printf(" 9 - Mostrar por pantalla los divisores de un número entero que indique el usuario\n"); +printf("10 - Dibujar un triángulo equilátero, aproximadamente centrado, en pantalla con el carácter y longitud del lado que indique el usuario\n"); + printf("Introduzca el nº de operación: "); + op = leerNumero(); + if(op == SALIR) { + continue; + } + printf("\n"); + switch(op) { + case VOCALES: + vocales(); + break; + + case POTENCIA: + printf("Base: "); + tmpA = leerNumero(); + printf("Exponente: "); + tmpB = leerNumero(); + printf("Resultado %d ** %d: %d", tmpA, tmpB, potencia(tmpA, tmpB)); + break; + + case FACTORIAL: + printf("Primer número: "); + tmpA = leerNumero(); + printf("Segundo número: "); + tmpB = leerNumero(); + if(tmpA > tmpB) { + printf("Factorial de %d: %d\n", tmpB, factorial(tmpB)); + } else { + printf("Factorial de %d: %d\n", tmpA, factorial(tmpA)); + } + break; + + case CUBOS: + printf("De: "); + tmpA = leerNumero(); + printf("Hasta: "); + tmpB = leerNumero(); + cuadradosYCubos(tmpA, tmpB); + break; + + case CUADRADO: + printf("Caracter: "); + getline(&c, &len, stdin); + printf("Tamaño: "); + tmpA = leerNumero(); + dibujarCuadrado(tmpA, c[0]); + break; + + case RECTANGULO: + printf("Longitudes de los lados largo y ancho del primer rectángulo, separados por espacios: "); + getline(&c, &len, stdin); + sscanf("%d %d", c, &tmpA, &tmpB); + printf("Longitudes de los lados largo y ancho del segundo rectángulo, separados por espacios: "); + getline(&c, &len, stdin); + sscanf("%d %d", c, &tmpC, &tmpD); + areaRectangulo(tmpA, tmpB, tmpC, tmpD); + break; + + case TABLA: + printf("De: "); + tmpA = leerNumero(); + printf("Hasta: "); + tmpB = leerNumero(); + raices(tmpA, tmpB); + break; + + case MAXIMO: + maximo(); + break; + + case DIVISORES: + printf("Introduca el número: "); + tmpA = leerNumero(); + divisores(tmpA); + break; + + case EQUILATERO: + printf("Caracter: "); + getline(&c, &len, stdin); + printf("Tamaño: "); + tmpA = leerNumero(); + triangulo(tmpA, c[0]); + break; + + default: + printf("Opción incorrecta"); + }; + printf("\n"); + } while(op); + + free(c); +} + +int main() { + menu(); + return 0; +} diff --git a/docs/code/Boletin_3/Ejercicio_36.c b/docs/code/Boletin_3/Ejercicio_36.c new file mode 100644 index 0000000..dcb05d5 --- /dev/null +++ b/docs/code/Boletin_3/Ejercicio_36.c @@ -0,0 +1,197 @@ +// SPDX-FileCopyrightText: 2024 Pablo R. +// +// SPDX-License-Identifier: GPL-3.0-only + +/* Enunciado: Implemente un programa en Lenguaje C para trabajar con números complejos. Las opciones que debe tener son: +1. Introducir dos números complejos en forma binómica por teclado +2. Introducir dos números complejos en forma módulo-argumental por teclado +3. Sumar dos números complejos +4. Restar dos números complejos +5. Multiplicar dos números complejos +0. Salir +*/ + +#include +#include +#include +#include + +enum Operaciones { + SALIR, + BINOMICA, + MODULO, + SUMAR, + RESTAR, + MULTIPLICAR +}; + +typedef struct { + double real; + double imaginario; +} Binomica; + +typedef struct { + double modulo; + double argumento; +} ModuloArg; + + +typedef struct { + bool binomico; + union { + Binomica b; + ModuloArg m; + }; +} Numero; + +void binomicaAModulo(Binomica *origen, ModuloArg *destino) { + destino->modulo = sqrt(origen->real*origen->real + origen->imaginario*origen->imaginario); + destino->argumento = atan(origen->imaginario); +} + +void moduloABinomica(ModuloArg *origen, Binomica *destino) { + destino->imaginario = tan(origen->argumento); + destino->real = sqrt(origen->modulo*origen->modulo - destino->imaginario*destino->imaginario); +} + +void escribirNumero(Numero *n, const char *nombre) { + printf("%s ", nombre); + + if(n->binomico) { + printf("(binomico): z = %e + i*%e", n->b.real, n->b.imaginario); + } else { + printf("(módulo-argumental): |%e|_%e ", n->m.modulo, n->m.argumento); + } + + printf("\n"); +} + +void sumaBinomico(Binomica *x, Binomica *y, Binomica *z) { + z->real = x->real + y->real; + z->imaginario = x->imaginario + y->imaginario; +} + +void restaBinomico(Binomica *x, Binomica *y, Binomica *z) { + z->real = x->real - y->real; + z->imaginario = x->imaginario - y->imaginario; +} + +void multBinomico(Binomica *x, Binomica *y, Binomica *z) { + z->real = x->real*y->real - x->imaginario*y->imaginario; + z->imaginario = x->imaginario*y->real + x->real*y->imaginario; +} + +void menu() { + int op; + double tmpA, tmpB; + Numero x, y, z; + Binomica tempA, tempB; + ModuloArg tempC; + + do { + printf(" 1. Introducir dos números complejos en forma binómica por teclado\n"); + printf(" 2. Introducir dos números complejos en forma módulo-argumental por teclado\n"); + printf(" 3. Sumar dos números complejos\n"); + printf(" 4. Restar dos números complejos\n"); + printf(" 5. Multiplicar dos números complejos\n"); + printf(" 0. Salir\n"); + printf("Escoja una opción: "); + scanf("%d", &op); + if(op == SALIR) { + continue; + } + printf("\n"); + switch(op) { + case BINOMICA: + printf("Introduzca los números, con la parte real e imaginaria separados por espacios.\n"); + printf("X: "); + scanf("%lf %lf", &tmpA, &tmpB); + x.binomico = true; + x.b.real = tmpA; + x.b.imaginario = tmpB; + printf("Y: "); + scanf("%lf %lf", &tmpA, &tmpB); + y.binomico = true; + y.b.real = tmpA; + y.b.imaginario = tmpB; + break; + + case MODULO: + printf("Introduzca los números, con el módulo y argumento separados por espacios.\n"); + printf("X: "); + scanf("%lf %lf", &tmpA, &tmpB); + x.binomico = false; + x.m.modulo = tmpA; + x.m.argumento = tmpB; + printf("Y: "); + scanf("%lf %lf", &tmpA, &tmpB); + y.binomico = false; + y.m.modulo = tmpA; + y.m.argumento = tmpB; + break; + + case SUMAR: + if(x.binomico && y.binomico) { + sumaBinomico(&x.b, &y.b, &(z.b)); + } else { + moduloABinomica(&x.m, &tempA); + moduloABinomica(&y.m, &tempB); + sumaBinomico(&tempA, &tempB, &(z.b)); + } + z.binomico = true; + escribirNumero(&z, "Z"); + + z.binomico = false; + binomicaAModulo(&z.b, &tempC); + z.m = tempC; + escribirNumero(&z, "Z"); + break; + + case RESTAR: + if(x.binomico && y.binomico) { + restaBinomico(&x.b, &y.b, &(z.b)); + } else { + moduloABinomica(&x.m, &tempA); + moduloABinomica(&y.m, &tempB); + restaBinomico(&tempA, &tempB, &(z.b)); + } + z.binomico = true; + escribirNumero(&z, "Z"); + + z.binomico = false; + binomicaAModulo(&z.b, &tempC); + z.m = tempC; + escribirNumero(&z, "Z"); + break; + + case MULTIPLICAR: + if(x.binomico && y.binomico) { + multBinomico(&x.b, &y.b, &(z.b)); + } else { + moduloABinomica(&x.m, &tempA); + moduloABinomica(&y.m, &tempB); + multBinomico(&tempA, &tempB, &(z.b)); + } + z.binomico = true; + escribirNumero(&z, "Z"); + + z.binomico = false; + binomicaAModulo(&z.b, &tempC); + z.m = tempC; + escribirNumero(&z, "Z"); + break; + + default: + printf("Opción incorrecta"); + }; + printf("\n"); + printf("Números cargados:\n"); + escribirNumero(&x, "X"); + escribirNumero(&y, "Y"); + } while(op); +} + +int main() { + menu(); + return 0; +}