Error con un número

Iniciado por reylor, 14 Enero 2019, 09:47 AM

0 Miembros y 1 Visitante están viendo este tema.

reylor

La cosa es que mi programa funciona correctamente, hasta que saca un numero y el contador se vuelve loco. El código es un bingo, el cual crea dos cartones y va creando bolas y gana el primer cartón que descarte mas números, y lo que pasa, es que, todo funciona bien, hasta que sale el numero 88, cuando sale ese número, los contadores se vuelven locos y no he conseguido encontrar el error tonto que tendré, si alguien me puediese ayudar..!. Les dejo el código abajo, con la parte donde yo creo que esta el error separado por /*****, gracias.
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>

void ImprimoPrincipio();
int GeneradorNumero();
void ImprimirCarton1(int[]);
void ImprimirCarton2(int[]);

int main(void){
    int y=0, z, a, sacadas[100], bolas=0, final=0, contador1=0, contador2=0;
    int numerosCarton1 [100], numerosCarton2[100], numerosBolas[100];
    int vectorCarton1[20], vectorCarton2[20];
    srand(time(NULL));
    ImprimoPrincipio();
    for(int i=0;i<100;i++){             //Genero numeros de Carton1 (100)
        numerosCarton1[y]=i+1;
        y++;
    }
    y=0;
    for(int j=0;j<100;j++){             //Genero numeros de Carton2 (100)
        numerosCarton2[y]=j+1;
        y++;
    }
    y=0;
    for(int u=0;u<100;u++){             //Genero numeros de bolas (100)
        numerosBolas[y]=u+1;
        y++;
    }
    for(int i=0;i<20;i++){                  //Creo vectorCarton1 (20)
        do{
            z=GeneradorNumero();
        }while(numerosCarton1[z]==0);
        vectorCarton1[i]=numerosCarton1[z];
        numerosCarton1[z]=0;
    }
    for(int j=0;j<20;j++){                      //Creo vectorCarton2 (20)
        do{
            z=GeneradorNumero();
        }while(numerosCarton2[z]==0);
        vectorCarton2[j]=numerosCarton2[z];
        numerosCarton2[z]=0;
    }
    printf("\nCarton1:\n");
    ImprimirCarton1(vectorCarton1);
    printf("\nCarton2:\n");
    ImprimirCarton2(vectorCarton2);
    getchar();
    do{
        system("cls");
        ImprimoPrincipio();
        do{
            z=GeneradorNumero();
        }while(numerosBolas[z]==0);
        a=numerosBolas[z];
        numerosBolas[z]=0;
        sacadas[bolas]=a;
        printf("Bolas: ");
        for(int i=0;i<=bolas;i++){
            printf("%d ", sacadas[i]);
        }
        bolas++;
        //**************************************************
        for(int j=0;j<20;j++){
            if(vectorCarton1[j]==a&&a!=88){
                vectorCarton1[j]=0x58;
                contador1++;
                printf("\nContador1=%d\n",contador1);
            }
            if(vectorCarton1[j]==a&&a==88){
                vectorCarton1[j]=0x58;
                contador1++;
                printf("\nContador1=%d\n",contador1);
            }
        }
        for(int u=0;u<20;u++){
            if(vectorCarton2[u]==a&&a!=88){
                vectorCarton2[u]=0x58;
                contador2++;
                printf("\nContador2=%d\n",contador2);
            }
            if(vectorCarton2[u]==a&&a==88){
                vectorCarton2[u]=0x58;
                contador2++;
                printf("\nContador2=%d\n",contador2);
            }
        }
        //******************************************************
        printf("\nCarton1:\n");
        ImprimirCarton1(vectorCarton1);
        printf("\nCarton2:\n");
        ImprimirCarton2(vectorCarton2);
        if(contador1==20){
            printf("Gana el Jugador 1\n");
            final=1;
        }
        if(contador2==20){
            printf("Gana el Jugador 2\n");
            final=1;
        }
        getchar();
    }while(final==0);
    return 0;
}

void ImprimoPrincipio(void){
    printf("----------------------------\n");
    printf("Juego del bingo simplificado\n");
    printf("----------------------------\n");
}

int GeneradorNumero(void){
    int num;
    num=rand()%100;
    return num;
}

void ImprimirCarton1(int vectorCarton1[]){
    int v;
    for(int j=0;j<20;j++){
        if(vectorCarton1[j]==0x58){
            printf("%c", vectorCarton1[j]);
            printf("  ");
            if(j==4||j==9||j==14||j==19){
                printf("\n");
            }
        }else{
            printf("%d",vectorCarton1[j]);
            v=vectorCarton1[j]/10;
            if(v<1){
                printf("  ");
            }else{
                printf(" ");
            }
            if(j==4||j==9||j==14||j==19){
                printf("\n");
            }
        }
    }
}

void ImprimirCarton2(int vectorCarton2[]){
    int v;
    for(int j=0;j<20;j++){
        if(vectorCarton2[j]==0x58){
            printf("%c", vectorCarton2[j]);
            printf("  ");
            if(j==4||j==9||j==14||j==19){
                printf("\n");
            }
        }else{
            printf("%d",vectorCarton2[j]);
            v=vectorCarton2[j]/10;
            if(v<1){
                printf("  ");
            }else{
                printf(" ");
            }
            if(j==4||j==9||j==14||j==19){
                printf("\n");
            }
        }
    }
}


MAFUS

#1
Tienes código redundante y cosas que se pueden simplificar pero explícame esto. Porque por una cosa u otra el programa hace lo mismo exactamente.

if(vectorCarton1[j]==a&&a!=88){
   vectorCarton1[j]=0x58;
   contador1++;
   printf("\nContador1=%d\n",contador1);
}
if(vectorCarton1[j]==a&&a==88){
   vectorCarton1[j]=0x58;
   contador1++;
   printf("\nContador1=%d\n",contador1);
}

reylor

Porque he intentado solucionar el problema con la bola 88, poniendo esos dos ifs, porque pensaba que así, cuando la bola fuera distinta a 88, se metiera en un if, y si es igual se meta en otro, porque he visto que lo que realmente hace el programa es que cuando detecta la bola 88, empieza a sumar en los contadores sin ningún control.

CalgaryCorpus

Cuando marcas lo ya visitado con el numero 0x58 estas usando el numero 88 para marcar.
Esto podria marcar varias posiciones antes que pueda aparecer el 88.
Cuando este aparece finalmente, tu logica hara que la condicion sea cierta para todas las posiciones que has marcado, y haras entonces que el contador crezca tanto como marcas haya.

Solucion?  Usa un valor mayor que 100 para marcar.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

reylor

No lo he entendido bien, ¿a que te refieres exactamente?, por cierto, muchas gracias por la ayuda.

CalgaryCorpus

Reemplaza cada 0x58 por un numero mayor que 100, por ejemplo 101.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

reylor

vale, ahora si, muchas gracias!