This repository has been archived by the owner on Dec 12, 2024. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 15
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #106 from Parodper/main
Engadir exercicios 29-31 e 33-36
- Loading branch information
Showing
16 changed files
with
1,916 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
Oops, something went wrong.