TransWikia.com

Ayuda con array tridimensional

Stack Overflow en español Asked on August 26, 2021

RENGLONES vale 3, COLUMNAS 5 y cuantosCartones depende la cantidad de cartones que el usuario quiera jugar. Necesito hacer que no se repitan los números dentro de cada cartón, pero como son 3 cartones diferentes si se pueden repetir en los globales. Es decir:

introducir la descripción de la imagen aquí

¿Alguien sabe como hacer eso? El orden de la imagen es indiferente yo hice esto pero solo me funciona para 1 cartón, así que ni idea.

void cargar_carton_aleatorio(int m[][RENGLONES][COLUMNA],int cuantosCartones) {  
    int numero,comprobar;

    for (int cuan = 0;cuan < cuantosCartones;cuan++) {
        for (int r = 0; r < RENGLONES;r++) {
            for (int c = 0;c < COLUMNA;c++) {
                do {
                    numero = rand() % 16;
                    comprobar = verificar_repetidos(m,cuantosCartones,numero);

                } while(comprobar != -1);

                m[cuan][r][c] = numero;
            }
        }
    }   
}


int verificar_repetidos(int m[][RENGLONES][COLUMNA],int cuantosCartones,int numeroBuscado) {
    int pos = -1;

    for (int cuan = 0;cuan < cuantosCartones;cuan++){
        for (int r = 0;r < RENGLONES;r++){
            for (int c = 0;c < COLUMNA;c++){
                if (m[cuan][r][c] == numeroBuscado){
                    pos = m[cuan][r][c];

                }
            }
        }
    }
    
    return pos;
}

//CODIGO 2 para ver como hacerlo para que el usuario ingrese los números, lo mismo de antes, solo me funciona para 1. y cuando quiero rellenar los otros cartones me toma siempre los numeros como repetidos cuando no tendría que ser así.

  void cargar_carton_manual(int m[][RENGLONES][COLUMNA],int cuantosCartones) {

int numero,comprobar;

for (int cuan = 0; cuan<cuantosCartones; cuan++){
    for (int r=0;r<RENGLONES;r++){
        for (int c=0;c<COLUMNA;c++){
            printf("Ingrese numero para: Carton %d pos [%d][%d]: ",cuan,r,c);
            scanf("%d",&numero);
            
            while(verificar_repetidos(m,cuantosCartones,numero) != -1){
            printf("Ingrese numero para: Carton %d pos [%d][%d]: ",cuan,r,c);
            scanf("%d",&numero);
                
            }
        
            m[cuan][r][c] = numero;
        }
    }
}
        mostrarCarton(m,cuantosCartones);       

}

int verificar_repetidos(int m[RENGLONES][COLUMNA],int cuantosCartones,int numeroBuscado) {

    int pos = -1;

        for (int r=0;r<RENGLONES;r++){
            for (int c=0;c<COLUMNA;c++){
                if (m[r][c] == numeroBuscado){
                    pos = m[r][c];
                    //printf("Numero repetidot");
            }
        }
    }
return pos;

}

One Answer

El problema es que tu función que verifica repetidos utiliza todos los cartones, ese es el motivo por el cual solo funciona con 1... Porque como usas números del 1 al 16 en cartones de 15 números únicos es garantizado que exista en el segundo carton un numero que siempre esté repetido y tu código se queda dando vueltas buscando algo que nunca va a encontrar (un número que no esté en el primer cartón), la manera de corregirlo es cambiar tu función verificar_repetidos para que solo use un cartón.

Aquí agrego tú código con el ajuste y también utilizando tu mismo código hice una función extra para poder ver como la matriz se va llenando y comprobare que funcione.

Suerte en tu programación!

#include <stdio.h>;
#include <math.h>;
#define CARTONES 5
#define RENGLONES 3
#define COLUMNA 5

void imprimirMatriz(int m[][RENGLONES][COLUMNA],int cuantosCartones){
    for (int cuan = 0; cuan<cuantosCartones; cuan++){
        printf("Carton #%dn",cuan+1);
        for (int r = 0; r < RENGLONES; r++){
            printf("[");
            for (int c=0; c < COLUMNA; c++){
                printf("%dt",m[cuan][r][c]);
                if(c!=COLUMNA-1){
                    printf(",");
                }
            }
            printf("]n");
        }
    }
}


int verificar_repetidos(int m[RENGLONES][COLUMNA],int cuantosCartones,int numeroBuscado){
    int pos = -1;
    for (int r=0;r<RENGLONES;r++){
        for (int c=0;c<COLUMNA;c++){
            if (m[r][c] == numeroBuscado){
                pos = m[r][c];
                printf("Numero repetido %dn", pos);
            }
        }
    }
    return pos;
}


void cargar_carton_aleatorio(int m[][RENGLONES][COLUMNA],int cuantosCartones){
    
    int numero,comprobar;
    for (int cuan = 0; cuan<cuantosCartones; cuan++){
        for (int r = 0; r < RENGLONES; r++){
            for (int c=0; c < COLUMNA; c++){
                do{
                numero = rand() % 16;
                comprobar = verificar_repetidos(m[cuan],cuantosCartones,numero);
               }while(comprobar != -1);
               m[cuan][r][c] = numero;
               imprimirMatriz(m,cuantosCartones);
            }
        }
    }
}


int main()
{
    int input[CARTONES][RENGLONES][COLUMNA];
    cargar_carton_aleatorio(input, CARTONES);

    return 0;
}

Correct answer by FranAcuna on August 26, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP