Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: n-utz en 1 Septiembre 2016, 22:39 PM

Título: [C] Duda con bucle
Publicado por: n-utz en 1 Septiembre 2016, 22:39 PM
Buenas, tengo una duda sencilla, la cosa es que dentro de un while tengo dos bucles.

Primer bucle si se cumple, cambia el "flag" del while por lo que debería terminar allí y no ejecutarse el segundo bucle. La cosa es que al cumplirse el primer bucle y cambia correctamente el flag, primero ejecuta el segundo bucle y luego termina el WHILE.

Ahora mi pregunta, ¿existe alguna manera de que se lea la condicion del WHILE dentro de este sin que sea con un IF?. Es más que nada una duda para ampliar conocimientos, y no meter IF's donde no sea necesario. Porque me parece ridículo tener un WHILE y salir de este mediante una condición.

Gracias!
Título: Re: [C] Duda con bucle
Publicado por: ivancea96 en 1 Septiembre 2016, 22:59 PM
Un if es lo más rápido. No hay nada "especial".

Código (cpp) [Seleccionar]
while (...){
    while(...){...}
   if(...) break;
   while(...){...}
}


Hablas de ese if, no? Si es así, no hay ninguna forma más "rápida".
Título: Re: [C] Duda con bucle
Publicado por: AlbertoBSD en 1 Septiembre 2016, 23:10 PM
Te propongo lo siguiente:

bool entrar = true;
do {
while( ... && entrar) {
...
entrar = false;
}
while(... && entrar){
..
}
}while(entrar);
Título: Re: [C] Duda con bucle
Publicado por: n-utz en 1 Septiembre 2016, 23:13 PM
Si exactamente eso, bueno veo que esa parte no podre modificarla, entonces expongo otra duda.

Mando una variable local de main, llamesmola vof en falso, a una funcion booleana que la cambia a verdadero. Todo esto surge dentro del WHILE, y que justamente es el flag de este.

Ahora al devolver la variable vof a main, deberia aplicarla al famoso, "if(vof)break;", pero me obvia la variable, como si seguiria en falso. Ya intente poniendola en global, algun consejo? Adjunto codigo.

while(!termina(ganador)){
printf("\nJuega jugador X\t");
fflush(stdout);
scanf("%c", &mov);
getchar();
movimientox(mov);
termina(ganador);
if(ganador)break;

printf("\nJuega jugador O\t");
fflush(stdout);
scanf("%c", &mov2);
getchar();
movimiento0(mov2);
termina(ganador);
}


bool termina(bool ganador){  //FUNCION
    int x, y;

    for(x=0;x<3;x++){
    y=0;
    if(tateti[x][y]==tateti[x][y+1] && tateti[x][y]==tateti[x][y+2]){
        if(tateti[x][y]=='X')printf("GANO EL JUGADOR X, FELICITACIONES!");
        if(tateti[x][y]=='O')printf("GANO EL JUGADOR O, FELICITACIONES!");
        ganador=true;
        }}

for(y=0;y<3;y++){
    x=0;
    if(tateti[x][y]==tateti[x+1][y] && tateti[x][y]==tateti[x+2][y]){
        if(tateti[x][y]=='X')printf("GANO EL JUGADOR X, FELICITACIONES!");
        if(tateti[x][y]=='O')printf("GANO EL JUGADOR O, FELICITACIONES!");
        ganador=true;
    }}

    return (ganador);

    }



Se que no es recomendable imprimir o leer en una funcion, pero es un programa sencillo y no quise explayarlo mucho mas.
Título: Re: [C] Duda con bucle
Publicado por: AlbertoBSD en 1 Septiembre 2016, 23:17 PM
ganador = termina(ganador);

La variable cuando la pasas a la funcion, se pasa una copia del valor, y no la variable como tal. Entonces cuando el la funcion llamada se modifica el valor, en realidad estas modificando el valor de la copia, no el original.

La unica forma de hacer que se modifique el valor real es mandando un apuntador a la misma.

Saludos!

Título: Re: [C] Duda con bucle
Publicado por: n-utz en 1 Septiembre 2016, 23:20 PM
Cierto, me faltaba esa parte, pero seria lo mismo que poner asi if(termina(ganador)), no lo hago porque de esa manera entra nuevamente a la funcion, por lo que imprime nuevamente el printf.

El problema de porque imprimi dentro de la funcion es para diferenciar rapidamente el ganador. De ultima deberia cambiar eso.
Título: Re: [C] Duda con bucle
Publicado por: AlbertoBSD en 2 Septiembre 2016, 14:40 PM
Hola si te sirve de algo hice una funcion para evaluar un tablero de tateti en base a tu post de hace dias.

Mira: http://foro.elhacker.net/programacion_cc/optimizar_evaluacion_de_juego_de_tateti-t456912.0.html

Saludos
Título: Re: [C] Duda con bucle
Publicado por: JonaLamper en 2 Septiembre 2016, 18:03 PM
No soy experto en C++, pero los que sí lo son me tienen dicho que no quieren ver break ni por asomo. Probablemente es mejor usar if como te dijo Alberto.
Título: Re: [C] Duda con bucle
Publicado por: dato000 en 2 Septiembre 2016, 21:28 PM
Cita de: JonaLamper en  2 Septiembre 2016, 18:03 PM
No soy experto en C++, pero los que sí lo son me tienen dicho que no quieren ver break ni por asomo. Probablemente es mejor usar if como te dijo Alberto.

Eso es solo un tecnisismo, realmene un break es simplemente una opción para romper un ciclo y condición y seguir adelante con un procedimiento, no deberia representar mayor problema si se usa adecuadamente. En cualquier while casi que es vital su uso.