[C] Duda con bucle

Iniciado por n-utz, 1 Septiembre 2016, 22:39 PM

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

n-utz

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!

ivancea96

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".

AlbertoBSD

Te propongo lo siguiente:

bool entrar = true;
do {
while( ... && entrar) {
...
entrar = false;
}
while(... && entrar){
..
}
}while(entrar);
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

n-utz

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.

AlbertoBSD

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!

Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

n-utz

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.

AlbertoBSD

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
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

JonaLamper

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.
Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.

dato000

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.