No repetir numeros en array[5][5]

Dudas e ideas sobre los distintos e infinitos (:-)) algoritmos existentes.
Responder
Mensaje
Autor
Avatar de Usuario
Claire
Mensajes: 3
Registrado: 26/07/2007 8:52 pm

No repetir numeros en array[5][5]

#1 Mensaje por Claire » 26/07/2007 9:00 pm

Ocupo ayuda para hacer una matriz de 5x5 con numeros aleatorios pero que no se repitan. Se como hacer esto con vectores, pero con matrices se me complica todo.
Esto es lo que tengo por ahora aunque imprime solo como 3 numeros y en lo demas imprime ceros

Código: Seleccionar todo

#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
int revisarepetido(int num[5][5],int n)
{
int i,sale=0,j;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
if(num[i][j]==n)
sale=1;
return sale;
}
 void mostrar(int num[5][5])
 {
 int i,j,b=5;
 for (i=0;i<b;i++) {
for (j=0;j<b;j++) {
printf(" %5d ",num[i][j]);
}
printf("\n");
}
}
void main()
{
int num[5][5]={0},b=5,i,j,numero;
clrscr();
randomize();
for (i=0;i<b;i++){
for (j=0;j<b;j++){
numero=1+rand()%30;
if((revisarepetido(num,numero)==0))
num[i++][j++]=numero;
}
}
mostrar(num);
getch();
}

Si alguien sabe que es lo que tengo malo o tiene una mejor idea se lo agradeceria con el alma. :cry:
Última edición por mollok el 06/01/2019 5:09 am, editado 1 vez en total.
Razón: Los códigos deben ir entre etiquetas 'code', botón </>

mamntc02
Mensajes: 403
Registrado: 30/04/2007 8:35 am

#2 Mensaje por mamntc02 » 27/07/2007 12:52 am

Buenas,
  • main devuelve int, nunca void
  • En lugar de randomize(), usa srand() para inicializar la generación de numeros aleatorios. srand() es una función standard a cualquier compilador de C, mientras q randomize creo q no lo es.
Respecto el error: éste lo tienes en la manera q asignas el valor aleatorio a la matriz. Fíjate q para cada iteración de i ó j, sumas 1. Pero además también lo haces cuando asignas el valor a la matriz. Por tanto, es normal q te salgan tantos 0. P.ej, en la primera iteración (i = j =0), al hacer la asingación tienes (i=j=1), y luego al hacer la siguiente interación del 'for' tienes (i = 1, j = 2), por lo q ya te vas a la última columna de la 2a fila. No sé si me he explicado.

En resumen:

Código: Seleccionar todo

int main()
{
	int num[5][5]={0},b=5,i,j,numero;
	srand(time(NULL));
	for (i=0;i<b;i++){
		for (j=0;j<b;){
			numero=1+rand()%30;
			if((revisarepetido(num,numero)==0))
				num[i][j++]=numero;
		}
	}
	mostrar(num);
	return 0;
} 
Augmento las filas por la iteración, pero las columnas sólo las augmento si el elemento es diferente, sino, nos quedamos en la misma posición.

Saludos.

Avatar de Usuario
Claire
Mensajes: 3
Registrado: 26/07/2007 8:52 pm

#3 Mensaje por Claire » 28/07/2007 1:22 pm

Muchas Gracias!!!! Me salvaste la vida

Avatar de Usuario
rir3760
Mensajes: 7553
Registrado: 01/10/2004 11:00 pm
Ubicación: Mexico

#4 Mensaje por rir3760 » 30/07/2007 5:11 pm

Si se trata de almacenar valores elegidos aleatoriamente en el rango 0 a 29 en una "matriz" de cinco por cinco una posible opcion es almacenar los numeros en un array y elegirlos al azar. Si bien esto requiere del uso de dos arrays tiene la ventaja de que se evita la verificacion de numeros repetidos.

Un ejemplo sencillo de esto en C estandar es:

Código: Seleccionar todo

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

#define NUM_FILAS  5 
#define NUM_COLS   5

#define NUM_ELEM 30

int main(void)
{
   int matriz[NUM_FILAS][NUM_COLS];
   int numero[NUM_ELEM];
   int i, j, r, tope;
   
   /* Generacion de los numeros a elegir aleatoriamente */
   for (i = 0; i < NUM_ELEM; i++)
      numero[i] = i;
   
   /* Seleccion aleatorio de los numeros */
   tope = NUM_ELEM;
   for (i = 0; i < NUM_FILAS; i++)
      for (j = 0; j < NUM_COLS; j++){
         r = rand() % tope;
         matriz[i][j] = numero[r];
         numero[r] = numero[--tope];
      }
   
   /* Impresion de la matriz */
   for (i = 0; i < NUM_FILAS; i++){
      for (j = 0; j < NUM_COLS; j++)
         printf(" %3d", matriz[i][j]);
      
      putchar('\n');
   }
   
   return EXIT_SUCCESS;
}

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

darkar--
Mensajes: 1
Registrado: 25/11/2017 2:23 pm

Re: Gracias primo mamntc02

#5 Mensaje por darkar-- » 25/11/2017 2:30 pm

Estaba casi una hora perdido en si era necesario activar la funcion srand(time(0)); dentro de mi codigo, ya que me generaba un vector con elementos aleatorios, pero este vector se repetia, y me di cuenta que era porque lo ponia dentro del bloque de instrucciones del for, cuando deberia ser antes como lo pusiste tu, gracias papu +10 y a favoritos

LuisBeas
Mensajes: 13
Registrado: 03/01/2009 6:53 am
Ubicación: Lima

Re: No repetir numeros en array[5][5]

#6 Mensaje por LuisBeas » 02/03/2018 5:15 pm

Con punteros:

Código: Seleccionar todo

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

#define LADO 5

int revisarRepetido(int **matriz, int n)
{
    int  **fila, **ultimaFila, *finDeFila, *elemento;

    for (fila = matriz ,ultimaFila = matriz + LADO; fila != ultimaFila; fila++)
    {
        for (elemento = *fila, finDeFila = elemento + LADO; elemento != finDeFila ; elemento++)
        {
            if( *elemento == n) return 1;
        }
    }

    return 0;
}

void mostrar(int **matriz)
{
    int  **fila, **ultimaFila, *finDeFila, *elemento;

    for (fila = matriz ,ultimaFila = matriz + LADO; fila != ultimaFila; fila++)
    {
        for (elemento = *fila, finDeFila = elemento + LADO; elemento != finDeFila ; elemento++)
        {
            printf(" %5d ",*elemento);
        }
        printf("\n");
    }
}

int main()
{
    int i, **matriz, **fila, **ultimaFila, *finDeFila, *elemento;

    matriz = (int **)malloc((LADO+1)*sizeof(int *));
    for ( i=0; i<LADO; i++) matriz[i] = (int *)malloc((LADO+1)*sizeof(int));

    srand(time(NULL));

    for (fila = matriz ,ultimaFila = matriz + LADO; fila != ultimaFila; fila++)
    {
        for (elemento = *fila, finDeFila = elemento + LADO; elemento != finDeFila ; elemento++)
        {
            do
            {
                *elemento = 1 + rand()%30;
            }
            while( revisarRepetido(matriz,*elemento) == 0 );
        }
    }
    mostrar(matriz);
    getchar();
    return 0;
}

Barbos03
Mensajes: 1
Registrado: 06/01/2019 3:33 am

Re:

#7 Mensaje por Barbos03 » 06/01/2019 3:38 am

mamntc02 escribió:
27/07/2007 12:52 am
Buenas,
  • main devuelve int, nunca void
  • En lugar de randomize(), usa srand() para inicializar la generación de numeros aleatorios. srand() es una función standard a cualquier compilador de C, mientras q randomize creo q no lo es.
Respecto el error: éste lo tienes en la manera q asignas el valor aleatorio a la matriz. Fíjate q para cada iteración de i ó j, sumas 1. Pero además también lo haces cuando asignas el valor a la matriz. Por tanto, es normal q te salgan tantos 0. P.ej, en la primera iteración (i = j =0), al hacer la asingación tienes (i=j=1), y luego al hacer la siguiente interación del 'for' tienes (i = 1, j = 2), por lo q ya te vas a la última columna de la 2a fila. No sé si me he explicado.

En resumen:

Código: Seleccionar todo

int main()
{
	int num[5][5]={0},b=5,i,j,numero;
	srand(time(NULL));
	for (i=0;i<b;i++){
		for (j=0;j<b;){
			numero=1+rand()%30;
			if((revisarepetido(num,numero)==0))
				num[i][j++]=numero;
		}
	}
	mostrar(num);
	return 0;
} 
Augmento las filas por la iteración, pero las columnas sólo las augmento si el elemento es diferente, sino, nos quedamos en la misma posición.

Saludos.
Muy complicado
Última edición por mollok el 06/01/2019 5:12 am, editado 1 vez en total.
Razón: Quitado un enlace publicitario.

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado