Mostrando entradas con la etiqueta matrices. Mostrar todas las entradas
Mostrando entradas con la etiqueta matrices. Mostrar todas las entradas

sábado, 7 de marzo de 2026

10 Ejercicios de Algoritmia en Python: Pilas, Colas, Recursividad y Matrices

Bienvenidos a una nueva entrega en larebelion.com. Si ya dominas la sintaxis básica y la Orientación a Objetos, es hora de enfrentarse al verdadero reto de la Ingeniería Informática: la Algoritmia.

En este post hemos recopilado 10 ejercicios de exámenes enfocados en estructuras de datos lineales (Pilas y Colas), matrices y recursividad avanzada. Dominar esto es la clave para superar asignaturas como Estructuras de Datos y Algoritmos.




31. Pilas (Stacks): Paréntesis Balanceados (UPM)

Enunciado: Implementa una función que use una Pila (Stack) para verificar si una cadena de texto tiene los paréntesis (), corchetes [] y llaves {} correctamente balanceados.

def esta_balanceado(cadena):
    pila = []
    pares = {')': '(', ']': '[', '}': '{'}
    for char in cadena:
        if char in pares.values():
            pila.append(char)
        elif char in pares.keys():
            if not pila or pila.pop() != pares[char]:
                return False
    return len(pila) == 0

32. Colas (Queues): Simulación de Impresora (UPC)

Enunciado: Usando collections.deque, simula una cola de impresión donde se añaden documentos y se imprimen (procesan) en orden FIFO (First In, First Out).

from collections import deque

class ColaImpresion:
    def __init__(self): self.cola = deque()

    def agregar_trabajo(self, documento):
        self.cola.append(documento)

    def imprimir(self):
        if self.cola:
            return self.cola.popleft()
        return "Sin trabajos"

33. Matrices: Suma de la Diagonal Principal (UGR)

Enunciado: Dada una matriz cuadrada (lista de listas), calcula la suma de los elementos de su diagonal principal.

def suma_diagonal(matriz):
    # Usando comprensión de listas para mayor elegancia
    return sum(matriz[i][i] for i in range(len(matriz)))

34. Matrices: Multiplicación de Matrices (UC3M)

Enunciado: Escribe un algoritmo de complejidad $O(n^3)$ que multiplique dos matrices A y B, devolviendo la matriz resultante.

def multiplicar_matrices(A, B):
    filas_A, cols_A = len(A), len(A[0])
    cols_B = len(B[0])
    C = [[0 for _ in range(cols_B)] for _ in range(filas_A)]
    for i in range(filas_A):
        for j in range(cols_B):
            for k in range(cols_A):
                C[i][j] += A[i][k] * B[k][j]
    return C

35. Recursividad: Torres de Hanoi (UCM)

Enunciado: Implementa el clásico problema de las Torres de Hanoi recursivamente, imprimiendo los movimientos necesarios para trasladar n discos.

def hanoi(n, origen, destino, auxiliar):
    if n == 1:
        print(f"Mover disco 1 de {origen} a {destino}")
        return
    hanoi(n-1, origen, auxiliar, destino)
    print(f"Mover disco {n} de {origen} a {destino}")
    hanoi(n-1, auxiliar, destino, origen)

36. Recursividad: Algoritmo de Euclides (USAL)

Enunciado: Calcula el Máximo Común Divisor (MCD) de dos números enteros utilizando la versión recursiva del algoritmo de Euclides.

def mcd_euclides(a, b):
    # Caso base: si el resto es 0, el MCD es 'a'
    if b == 0:
        return a
    # Llamada recursiva con b y el resto de a/b
    return mcd_euclides(b, a % b)

37. Recursividad: Suma de Dígitos (UNED)

Enunciado: Escribe una función recursiva que reciba un número entero positivo y devuelva la suma de todos sus dígitos.

def suma_digitos(n):
    if n == 0:
        return 0
    return (n % 10) + suma_digitos(n // 10)

38. Algoritmos de Ordenación: Bubble Sort (UV)

Enunciado: Implementa el algoritmo de Ordenación de Burbuja (Bubble Sort). Aunque es de complejidad $O(n^2)$, es un clásico que siempre cae en exámenes de primero.

def bubble_sort(lista):
    n = len(lista)
    for i in range(n):
        for j in range(0, n-i-1):
            if lista[j] > lista[j+1]:
                # Intercambio de variables
                lista[j], lista[j+1] = lista[j+1], lista[j]
    return lista

39. Algoritmos de Ordenación: Selection Sort (UAM)

Enunciado: Implementa la Ordenación por Selección (Selection Sort), buscando el elemento mínimo en cada iteración y colocándolo al principio.

def selection_sort(lista):
    for i in range(len(lista)):
        min_idx = i
        for j in range(i+1, len(lista)):
            if lista[j] < lista[min_idx]:
                min_idx = j
        lista[i], lista[min_idx] = lista[min_idx], lista[i]
    return lista

40. Algoritmos de Ordenación: Insertion Sort (US)

Enunciado: Implementa la Ordenación por Inserción (Insertion Sort), el algoritmo que simula cómo ordenaríamos una baraja de cartas en la mano.

def insertion_sort(lista):
    for i in range(1, len(lista)):
        clave = lista[i]
        j = i - 1
        while j >= 0 and clave < lista[j]:
            lista[j + 1] = lista[j]
            j -= 1
        lista[j + 1] = clave
    return lista

miércoles, 8 de abril de 2020

Matrices dinámicas en C

A continuación un ejercicio, similar a otros que he publicado, pero ésta vez con Matrices de dimensiones dinámicas.




#include <stdio.h>
#include <stdlib.h>


int ** IntroduceMatriz (int *, int *);
void SumaFilas (int **, int, int);
void MultiplicaColumnas (int **, int, int);
void RotaMatrizDerecha (int **, int, int);
void MostrarMatriz (int **, int, int);

int main () 
{
    int **matriz, f ,c;
    int i;

    matriz = IntroduceMatriz(&f, &c);
    MostrarMatriz(matriz,f,c);
    SumaFilas(matriz,f,c);
    MultiplicaColumnas(matriz,f,c);
    RotaMatrizDerecha(matriz,f,c);
    MostrarMatriz(matriz,f,c);
    for (i=0; i<f ; i++) {
        free(matriz[i]);
    }
    free(matriz);
    return EXIT_SUCCESS;
}

int ** IntroduceMatriz (int *f, int *c)
{
    int **matriz;
    int i, j;

    printf ("Indique numero de filas: \n");
    scanf ("%d",f);
    fflush (stdin);  // Limpiar el buffer de entrada
    printf ("Indique numero de columnas: \n");
    scanf ("%d",c);
    fflush (stdin);

    matriz = (int **) calloc (*f,sizeof(int*));

    for (i=0 ; i<*f ; i++) {
            matriz[i] = (int*) calloc (*c,sizeof(int));
    }

    for (i=0 ; i<*f ; i++) {
        for (j=0 ; j<*c ; j++) {
            printf ("\nIntroduzca posición %d - %d: ",i,j);
            scanf("%d",&matriz[i][j]);
            fflush(stdin);
        }
    }
    return matriz;
}

void MostrarMatriz (int **matriz, int f, int c)
{
    int i,j;
    for (i=0 ; i<f ; i++) {
        for (j=0 ; j<c ; j++) {
            printf ("%d ",matriz[i][j]);
        } printf ("\n");
    }
}

void SumaFilas (int **matriz, int f, int c)
{
    int i,j,suma;
    for (i=0 ; i<f ; i++) {
        suma = 0;
        for (j=0 ; j<c ; j++) {
            suma += matriz[i][j];
        } printf ("La fila %d suma: %d \n",f,suma);
    }
}

void MultiplicaColumnas (int **matriz, int f, int c)
{
    int i,j, multiplica;
    for (j=0 ; j<c ; j++) {
        multiplica = 1;
        for (i=0 ; i<f ; i++) {
            multiplica *= matriz[i][j];
        } printf ("La columna %d da: %d \n",j,multiplica);
    }
}

void RotaMatrizDerecha (int **matriz, int f, int c)
{
    int i,j;
    int **matrizt;

 
    matrizt = (int**) calloc (f,sizeof(int*));
    for (i=0; i<f ; i++) {
        matrizt[i] = (int*) calloc (c,sizeof(int));
    }

    for (i=0 ; i<f ; i++) {
        for (j=0 ; j<c ; j++) {
            if (j == c-1) {
                matrizt[i][0] = matriz[i][j]; 
            } else {
                matrizt[i][j+1] = matriz[i][j];
            }     
        } 
    }

    for (i=0 ; i<f ; i++) {
        for (j=0 ; j<c ; j++) {
            matriz[i][j] = matrizt[i][j];
        } 
    }

}

lunes, 3 de junio de 2019

Ejemplo completo de Matrices en C

A continuación, os pongo el ejemplo que se me ha ocurrido más completo sobre gestión de Matrices en C que reúne los ejemplos que he ido poniendo anteriormente.




#include <stdio.h>;
#include <stdlib.h>;


void Ingresa_Matriz (int m[3][3], int f, int c);
void Utiliza_Matriz (int m[3][3], int f, int c);
void Visualiza_Matriz (int m[3][3], int f, int c);
void Rota_Matriz_D (int m[3][3], int f, int c);
void Rota_Matriz_I (int m[3][3], int f, int c);
void Multiplica_Matriz (int m[3][3], int f, int c, int cf, int *m0, int *m1, int *m2);

int main () {
    char ingresa;
    int m[3][3], cf = 0, direccion = 0, f = 0, c = 0;
    int m0, m1, m2;
    printf ("Deseas ingresar Matriz o utiliza la maqueta &lt;I/M&gt;: ");
    scanf ("%c",&amp;ingresa);
    if (ingresa == 'i') {
        Ingresa_Matriz(m, f, c);
    } else {
        Utiliza_Matriz(m, f, c);
    }
    Visualiza_Matriz(m, f, c);
    printf ("\nDeseas rotar la matriz a la derecha &lt;1&gt; o a la izquierda &lt;0&gt;: ");
    scanf ("%d",&amp;direccion);
    if (direccion == 1) {
        Rota_Matriz_D (m, f, c);
    } else {
        Rota_Matriz_I (m, f, c);
    }
    Visualiza_Matriz(m, f, c);
    printf ("\n¿Quieres multiplicar las filas (1) o las columnas (0)?: ");
    scanf ("%d",&amp;cf);
    Multiplica_Matriz(m, f, c, cf, &amp;m0, &amp;m1, &amp;m2);
    if (cf == 1) {
        printf ("\nMultiplicacion Fila 0: %d",m0);
        printf ("\nMultiplicacion Fila 1: %d",m1);
        printf ("\nMultiplicacion Fila 2: %d",m2);
    } else {
        printf ("\nMultiplicacion Columna 0: %d",m0);
        printf ("\nMultiplicacion Columna 1: %d",m1);
        printf ("\nMultiplicacion Columna 2: %d",m2);
    }
    return 0;
}

void Ingresa_Matriz (int m[3][3], int f, int c) {
    for (f=0;f&lt;3;++f) {
        for (c=0;c&lt;3;++c) {
            printf ("\nIntroduce posicion [%d][%d]: ",f,c);
            scanf ("%d",&amp;m[f][c]);
        }
    }
}

void Utiliza_Matriz (int m[3][3], int f, int c) {
    for (f=0;f&lt;3;++f) {
        for (c=0;c&lt;3;++c) {
            m[f][c]=rand()%50+1;
        }
    }
}

void Visualiza_Matriz (int m[3][3], int f, int c) {
    for (f=0;f&lt;3;++f) {
        for (c=0;c&lt;3;++c) {
            printf ("[%d] ",m[f][c]);
        } printf ("\n");
    }
}
void Rota_Matriz_D (int m[3][3], int f, int c) {
    int tmp[3][3];
    for (f=0;f&lt;3;++f) {
        for (c=0;c&lt;3;++c) {
                if (c == 2) {
                    tmp[f][0]=m[f][c];
                } else {
                    tmp[f][c+1]=m[f][c];
                }
            }
        }
    for (f=0;f&lt;3;++f) {
        for (c=0;c&lt;3;++c) {
            m[f][c]=tmp[f][c];
        }
    }
}

void Rota_Matriz_I (int m[3][3], int f, int c) {
    int tmp[3][3];
    for (f=0;f&lt;3;++f) {
        for (c=0;c&lt;3;++c) {
            if (c == 0) {
                tmp[f][2]=m[f][c];
            } else {
                tmp[f][c-1]=m[f][c];
            }
        }
    }
    
    for (f=0;f&lt;3;++f) {
        for (c=0;c&lt;3;++c) {
            m[f][c]=tmp[f][c];
        }
    }
}

void Multiplica_Matriz (int m[3][3], int f, int c, int cf, int *m0, int *m1, int *m2) {
    // 1 Multiplica filas
    // 0 Multiplica columnas
    int c0[3], c1[3], c2[3];
    
    if (cf == 0) {
        printf ("\nMultiplicando columnas...\n\n");
        for (f=0;f&lt;3;++f) {
            for (c=0;c&lt;3;++c) {
                if (c == 0)
                    c0[f]=m[f][c];
                if (c == 1)
                    c1[f]=m[f][c];
                if (c == 2)
                    c2[f]=m[f][c];
            }
        }
    } else {
        printf ("\nMultiplicando filas...\n\n");
        for (f=0;f&lt;3;++f) {
            for (c=0;c&lt;3;++c) {
                if (f == 0)
                    c0[c]=m[f][c];
                if (f == 1)
                    c1[c]=m[f][c];
                if (f == 2)
                    c2[c]=m[f][c];
            }
        }
    }
    *m0=c0[0]*c0[1]*c0[2];
    *m1=c1[0]*c1[1]*c1[2];
    *m2=c2[0]*c2[1]*c2[2];
}

miércoles, 15 de mayo de 2019

Ejercicio completo en C. Revisión. Matrices y Cálculo

Buen ejemplo de práctica en C.




/*
 
 El ejercicio va a consistir en:
 1. Multiplicar las columnas de una Matriz 3x3
 2. Dado un número cualquiera, deberemos calcular los digitos que tiene y sumarlos
 */

#include <stdio.h>;
#include <stdlib.h>


void Muestra_Matriz (int [3][3], int f, int c);
void Multiplica_Columnas(int m[3][3], int f, int c, int *m0, int *m1, int *m2);
void Calcula_Digitos (int numero, int **digitos, int *longitud);
void Muestra_Digitos (int *digitos, int longitud);
void Calcula_Suma (int *digitos, int longitud, int *suma);

int main () {
    int f=0, c=0, numero;
    int m0, m1, m2;
    int *digitos;
    int longitud;
    int suma;
    
    int m[3][3]={10,20,30,40,50,60,70,80,90};
    
    Muestra_Matriz (m,f,c);
    Multiplica_Columnas (m,f,c, &amp;m0, &amp;m1, &amp;m2);
    
    printf ("El resultado de la columna [1] es: %d \n",m0);
    printf ("El resultado de la columna [2] es: %d \n",m1);
    printf ("El resultado de la columna [3] es: %d \n",m2);

    printf ("Introduce un número :");
    scanf ("%d",&amp;numero);
    
    Calcula_Digitos (numero, &amp;digitos, &amp;longitud);
    printf ("El numero tiene  %d números", longitud);
    Muestra_Digitos(digitos, longitud);
    Calcula_Suma (digitos,longitud,&amp;suma);
    printf ("La suma es: %d",suma);
    return 0;
}

void Calcula_Suma (int *digitos, int longitud, int *suma) {
    int i;
    int tmp=0;
    
    for (i=0; i &lt; longitud; ++i) {
        tmp += digitos[i];
    }
    
    *suma=tmp;
}

void Muestra_Digitos (int *digitos, int longitud) {
    int i;
    printf ("\n");
    for (i=longitud-1; i&gt;=0; --i) {
        printf ("%d",digitos[i]);
    }
    printf ("--\n");
        
}

void Calcula_Digitos (int numero, int **digitos, int *longitud) {
    int n, l;
    int *tmp = NULL;
    
    for (n = numero, l=0; n &gt; 0 ; n = n/10)
    {
        l += 1;
    }
    *longitud = l;

    tmp=calloc(*longitud, sizeof(int));
    
    for (n = numero, l = 0; l &lt; *longitud; n /= 10, ++l) {
        tmp[l]= n % 10;
    }

    *digitos = tmp;
}

void Muestra_Matriz (int m[3][3], int f, int c) {
    for (f=0;f&lt;3;f++) {
        for (c=0;c&lt;3;c++) {
            printf ("[%d]",m[f][c]);
        } printf ("\n");
    }
    
}

void Multiplica_Columnas (int m[3][3], int f, int c, int *m0, int *m1, int *m2) {
    int c0[3];
    int c1[3];
    int c2[3];
    
    for (f=0;f&lt;3;f++) {
        for (c=0;c&lt;3;c++) {
            if (c == 0)
                c0[f]=m[f][c];
            if (c == 1)
                c1[f]=m[f][c];
            if (c == 2)
                c2[f]=m[f][c];
        }
    }
    *m0=c0[0]*c0[1]*c0[2];
    *m1=c1[0]*c1[1]*c1[2];
    *m2=c2[0]*c2[1]*c2[2];
}

viernes, 1 de marzo de 2019

Ejercicios resueltos en C. Preguntas de examen

A continuación, voy a poner dos preguntas de examen resuelto en C.




Ejercicio 1: Escribe un programa en C, que multiplique las columnas de una Matriz 3x3.



#include <stdio.h>

int *m0,*m1,*m2;

int Multiplica_Columnas_Matriz (int m[3][3], int f, int c);
int main () {
    int m[3][3]={10,20,30,40,50,60,70,80,90}; 
    int f, c;
    
    Multiplica_Columnas_Matriz (m,f,c);
    printf ("\n\nMultiplicacion es: %d\n",m0);
    printf ("Multiplicacion es: %d\n",m1);
    printf ("Multiplicacion es: %d\n",m2);
    return 0;
}

int Multiplica_Columnas_Matriz (int m[3][3], int f, int c) {
    int c0[3];
    int c1[3];
    int c2[3];
        
    printf ("[INFO] Matriz original: \n\n");
    for (f=0; f<3; f++) {
        for (c=0;c<3;c++) {
            printf ("%i ",m[f][c]);
        } printf ("\n");
    }
    
    for (f=0; f<3; f++) {
        for (c=0;c<3;c++) {
            if (c == 0)
                c0[f]=m[f][c];
            if (c == 1)
                c1[f]=m[f][c];
            if (c == 2)
                c2[f]=m[f][c];
        }
    }
    
    m0=c0[0]*c0[1]*c0[2];
    m1=c1[0]*c1[1]*c1[2];
    m2=c2[0]*c2[1]*c2[2];
    
}


Ejercicio 2: Escribe un programa en C, en el que al introducir un número, indique la suma de sus dígitos así como indicar los dígitos.
Ejemplo: Si el número es 123, los dígitos serás 1, 2 y 3 y la suma será = 6.




#include <stdio.h>
#include <stdlib.h>
 
int v[10];  

int sumaDigitos(int Num){
    
    int Suma=0, Resto=0, contador=0;
 
    while(Num!=0){
        Resto=(Num%10);
        Suma=(Suma+Resto);
        Num=(Num/10);
        v[0+contador]=Resto;
        contador++;
    }
 
    return (Suma);
 
}
 
int main(){
    
    int Num,i,dim;
    printf("Ingresa un Numero : ");
    scanf("%d",&Num);
    
    printf("------\n");
    printf("La suma de los digitos del numero [%d] es : %d\n",Num,sumaDigitos(Num));
    while (Num !=0) {
        Num=(Num/10);
        dim++;
    }
    for (i=0;i<dim-1;i++) {
        printf ("Digito %i es: %i \n",i+1,v[i]);
    }
    return 0;
}
// Telegram BOT