Skip to content
This repository has been archived by the owner on Dec 12, 2024. It is now read-only.

Commit

Permalink
Merge pull request #106 from Parodper/main
Browse files Browse the repository at this point in the history
Engadir exercicios 29-31 e 33-36
  • Loading branch information
TeenBiscuits authored Mar 11, 2024
2 parents 6c3df7d + 16152d3 commit 709a878
Show file tree
Hide file tree
Showing 16 changed files with 1,916 additions and 33 deletions.
64 changes: 64 additions & 0 deletions docs/code/Boletin_3/Ejercicio_29.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
// SPDX-FileCopyrightText: 2024 Pablo R. <[email protected]>
//
// 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 <stdbool.h>
//Para usar pow
#include <math.h>
//Para usar scanf y printf
#include <stdio.h>

//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;
}
38 changes: 38 additions & 0 deletions docs/code/Boletin_3/Ejercicio_30.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// SPDX-FileCopyrightText: 2024 Pablo R. <[email protected]>
//
// 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 <stdio.h>

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;
}
47 changes: 47 additions & 0 deletions docs/code/Boletin_3/Ejercicio_31.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// SPDX-FileCopyrightText: 2024 Pablo R. <[email protected]>
//
// 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 <stdio.h>
#include <stdlib.h>


//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;
}
41 changes: 41 additions & 0 deletions docs/code/Boletin_3/Ejercicio_33.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// SPDX-FileCopyrightText: 2024 Pablo R. <[email protected]>
//
// 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 <stdio.h>

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;
}
178 changes: 178 additions & 0 deletions docs/code/Boletin_3/Ejercicio_34.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
// SPDX-FileCopyrightText: 2024 Pablo R. <[email protected]>
//
// 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 <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

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 <math.h>
// 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;
}
Loading

0 comments on commit 709a878

Please sign in to comment.