[C con Clase] Duda imprimir matriz pero con los numeros tachados de la loteria

Davidson, Steven srd4121 en njit.edu
Lun Nov 5 04:08:11 CET 2012


Hola Miguel,

On Sun, Nov 4, 2012 at 2:25 PM, Miguel Angulo Martínez
<djfunk19 en hotmail.com> wrote:
> TEngo esto echo pero no se como imprimir la matriz con los numeros tachados
> del vector aleatorio que he seleccionado
>

Veamos el código fuente.

>
> #include <stdio.h>
> #include <conio.h>
> #include <stdlib.h>
> #include <math.h>
>
> main()
> {
>     randomize();
>     int matriz[7][7],aux=1, j,i;
>     int vector[6];
>
>     for(i=1; i<=7; i++)
>     {
>         for(j=1; j<=7; j++)

Esto va a producir errores al usar estas variables como índices a
'matriz'. Los índices de un array siempre empiezan por 0 (cero). Por
lo tanto, debería ser:

for( i=0; i<7; i++ )
  for( j=0; j<7; j++ )

>         {
>
>             matriz[i][j]=aux;
>             aux++;
>
>             printf("%5d",matriz[i][j]);
>
>         }
>         printf("\n");
>     }
>     getch();
>
>     for(i=1; i<=6; i++)

Nuevamente, estás usando 'i' tanto para controlar este bucle 'for'
como índice para el array, 'vector'. Por lo tanto, debería ser:

for( i=0; i<6; i++ )

>     {
>         vector[i]=rand()%49+1;

Como usas 'randomize()', creo que te conviene usar 'random()' en lugar
de 'rand()'. En tu caso, esto sería,

vector[i] = 1 + random(49);

>         if(i>1)

Personalmente, no me gusta este tipo de comprobaciones dentro de un
bucle. La razón es que conocemos de antemano lo que va a ocurrir, sin
siquiera compilar el programa. Sabemos que esta condición será falsa
la primera iteración y verdadera para las demás. Por lo tanto, no
tiene sentido dar trabajo innecesario a la máquina, cuando podemos
expresar nuestro programa de otra forma "más directa".

>         {
>             for(j=1;j<1;j++)

Esto no tiene mucho sentido, por lo que sospecho que es un error. Creo
que querías escribir esto:

for( j=0; j<i; j++ )

>             {
>                 if(vector[i]==vector[j])
>                 {
>                     i=i-1;

Esto es peligroso, porque ahora estás modificando el control del bucle
'for' externo a través de la variable, 'i'.

>                     break;

Al salirnos de este bucle, nos metemos en el bucle externo. Con i=i-1,
pasamos a ejecutar: i++ que es equivalente a i=i+1, por lo que
volvemos a un valor anterior de 'i'. Por lo tanto, volveremos a esta
comprobación con los mismos valores de esta iteración. Esto es,

i = 0
¿ 0 < 6 ? Sí
¿ 0 > 0 ? No

i = 1
¿ 1 < 6 ? Sí
¿ 1 > 0 ? Sí
  j = 0
  ¿ 0 < 1 ? Sí
    ¿ vector[1] = vector[0] ? (vamos a decir que sí)
    i = 0
    Salimos fuera

i = 1
¿ 1 < 6 ? Sí
¿ 1 > 0 ? Sí
  j = 0
  ¿ 0 < 1 ? Sí
    ¿ vector[1] = vector[0] ? (vamos a decir que sí)
    i = 0
    Salimos fuera

i = 1

y así sucesivamente.

El problema como digo es que el bucle 'for' cambia 'i', pero
internamente también cambias 'i'. Esto provoca un error lógico y no se
comporta como pretendes.

>                 }
>             }
>         }
>     }
>

Para hacer lo que quieres, tienes que comprobar cada elemento de
'matriz' antes de imprimirlo para ver si coincide con algún elemento
de 'vector'. Si no hay coincidencias, entonces imprimes tal elemento.
Por ejemplo,

1.  Para: f <- 1 hasta N
2.     Para: c <- 1 hasta N
3.        bEncontrado <- false
4.        Para: i <- 1 hasta M  y  mientras, bEncontrado = false
5.           Si matriz[f][c] = vector[i], entonces
6.               bEncontrado <- true
7.        Si bEncontrado = false, entonces
8.            Mostrar( matriz[f][c] )
9.  Terminar


Espero que esto te oriente.

Steven




Más información sobre la lista de distribución Cconclase