[C] Dudiva for

'Si0n.

Membro
Boas a todos

Estava a fazer um programa quando me deparei com um problema que nunca me tinha ocorrido antes

Eu tenho um duplo for a correr um vector(jogo[3][3]), e queria que assim que a condição fosse verdadeira o ciclo acaba-se, mas nao tou a conseguir..(ja tentei o break, mas nao da).

Se me pudessem ajudar agradecia :)

Código:
else 
     {
         for(a=0;a<3;a++)
         {
            for(b=0;b<3;b++)
            {                 
             if (jogo[a][b]=='-')
                 jogo[a][b]='X';break;
            }
        }
     }
Cumps.
Thx
 
Boas a todos

Estava a fazer um programa quando me deparei com um problema que nunca me tinha ocorrido antes

Eu tenho um duplo for a correr um vector(jogo[3][3]), e queria que assim que a condição fosse verdadeira o ciclo acaba-se, mas nao tou a conseguir..(ja tentei o break, mas nao da).

Se me pudessem ajudar agradecia :)

Código:
else 
     {
         for(a=0;a<3;a++)
         {
            for(b=0;b<3;b++)
            {                 
             if (jogo[a][b]=='-')
                 jogo[a][b]='X';break;
            }
        }
     }
Cumps.
Thx

Ao fazeres "break", apenas sais do ciclo de dentro, continuando o de fora a executar. Se quiseres sair do ciclo de fora, terás que usar uma variável booleana. Algo do género:

Código:
for (...)
{
   int tem_que_sair_deste_ciclo = 0; //0 = false
   for (...)
   {
       if (condicao verdadeira)
       {
            tem_que_sair_deste_ciclo = 1; //1 = true
            break;
       }
    }
    if (tem_que_sair_deste_ciclo) break;
}
Espero ter ajudado.
 
Última edição:
O problema aí é que esse break apenas termina o segundo ciclo. O primeiro continua a correr normalmente. A forma mais simples de corrigir isso é colocares essea ciclos numa função e usar um return.
 
Ao fazeres "break", apenas sais do ciclo de dentro, continuando o de fora a executar. Se quiseres sair do ciclo de fora, terás que usar uma variável booleana. Algo do género:

Código:
for (...)
{
int tem_que_sair_deste_ciclo = 0; //0 = false
for (...)
{
if (condicao verdadeira)
{
tem_que_sair_deste_ciclo = 1; //1 = true
break;
}
}
if (tem_que_sair_deste_ciclo) break;
}
Espero ter ajudado.



experimentei assim e ele nao atribui devidamente, exprimentei um printf, e ele corre a primeira ves de todas, se a condição ai for falsa ele nao faz nenhuma atribuição :s

Código:
else 
     {
         for(a=0;a<3;a++)
         {
            for(b=0;b<3;b++)
            {                 
             if (jogo[a][b]=='-')
                 jogo[a][b]='X';saidaciclo=1;break;
            }
            if(saidaciclo==1)
            break;
        }
     }
 
Penso que resolvi, nao sei se faz relamente diferença, mas em vez de fazer tudo numa unica linha , usei as chavetas e pus em varias linhas e parece que resoltou :s
 
Hehe, era isso mesmo que eu te ia responder agora. Entretanto, recebi uma notificação e fiz refresh no browser.

As chavetas fazem diferença de facto. Sem as chavetas, só a instrução que está imediatamente a seguir ao if é que faz parte desse if. No teu caso, essa instrução é "jogo[a] = 'X';"
 
parece que ja descobriste como resolver isso...o que vou dizer aqui é apenas uma outra hipotese...nao é boa programacao, mas em certos casos pode ser muito util... estou a falar do goto...pode ser usado na forma
...
goto teste:
...
...
teste:
o que faz é saltar do goto teste: para teste:
isto pode tornar o codigo dificil de entender ...mas tambem pode ajudar a resolver problemas sem o recurso a mais variaveis...e mais codigo...
 
Tenho outra duvida, um bocado diferente desta mas ..

É possivel mais que uma estrutura IF que partilhem o mesmo ELSE? (ou seja ter dois if's, e se ambos forem falsos ele usa o else)

Cumps e thx pela ajuda no anterior

PS:ryudo obrigado pela sugestão acho que é capaz de ser util em algumas coisas que tou a tentar organizar :)
 
podia ser algo do tipo:
(presumo que sabes que || é ou e && é e)
Código:
if (!teste1 || !teste2){


}else{


}
(nao sei usar isso do codigo)
 
Última edição pelo moderador:
podia ser algo do tipo:
(presumo que sabes que || é ou e && é e)
if (!teste1 || !teste2){


}else{


}
(nao sei usar isso do codigo)

isso sei mas o meu problema e que eu tenho varios IF (todos eles com || e &&) e queria que esses ifs partilha-sem o mesmo else, e nao apenas o IF antes do else .
Porque assim ele vai executar duas vezes código quando um dos If's anterioes e o else .

PS: acho que existe um comando que é else if, isso nao resolve?
 
o else if é apenas o mesmo que dizer " caso contrario se " logo penso que nao resolve nada...
a melhor hipotese é compactares o teu codigo...tipo fazendo relacoes entre as condicoes... algo do tipo

if ( (!teste || !teste2) && !teste3)){}else{}
ou entao crias variaveis "boleanas" ...

do tipo

Código:
if(!teste1)
{var=1;//true
}
if(!teste2)
{var2=1;//true
}

if(!teste3)
{var3=1;//true
}
if(var && var2 && var3){

}


acho que , e pelo que percebi (se percebi) , sera algo deste genero que vais ter que fazer...
 
Última edição pelo moderador:
Obrigado pelo ajuda, mas o if else resolveu mesmo, porque as condicoes ja tavam compactadas ao maximo e tambem tinham as variaveis booleanas :)

agora so me falta saber porque que exitem certas alturas quando ele corre os IF chega chega ao ELSE e nao entra, nem faz nada lol, como sao dois for um dentro do outro, quando o segundo é corrido e completado o primeiro nao se mexe e para por ali :|
 
Última edição:
esperimenta colocar printf 's nas zonas criticas para saber o valor das variaveis...pode ser uma má indicacao...

tou a fazer isso tenho printfs a entrada da funcao dentro de cada id a entrada do else e dentro dos for, ele entra na funcao e ingora tudo ate sair, nem else nem nada

Peço mesmo desculpa por tar a xatear mas isto e um trabalho fim de ano pra quarta e isto ja me anda encravado a dois dias :s

esta ai a funcao
basicamente e as jogadas que o computador faz, ele corre os For's vai jogando na primeira casa que estiver live (jogo[x][x]='-') ate alguma das ipoteses dos ifs se verificar

Código:
char jogadacomputador(char jogo[3][3])
{   
      int a,b;
      printf("entrou para verificar\n");
      // Variáveis de controlo, saidadociclo pára o for, controloderepeticao nao deixa nenum if ser efectuado se alguem ja o tenha sido antes
      int saidaciclo=0,controloderepeticao=0;
     if (jogo[0][0]!= '-' && jogo[0][2]!= '-' && controloderepeticao==0|| jogo[1][1]!='-' && jogo[2][1] != '-' && controloderepeticao==0 )  //para o pc jogar em k ser casa com player 1 E sem X
     {
       if( jogo[0][1] == '-')
        {
          jogo[0][1]='X';
          printf("Entrada de Nivel 1\n");
          controloderepeticao=1;
        }
     }
     else if(jogo[0][2]!= '-'  && jogo[2][2]!= '-' && controloderepeticao==0 || jogo[1][0]!='-' && jogo[1][1] != '-' && controloderepeticao==0 )
     {
        if( jogo[1][2] == '-')
        {             
         jogo[1][2]= 'X';
         printf("Entrada de Nivel 2\n");
         controloderepeticao=1;
         }
     }
     else if (jogo[2][0]!= '-' && jogo[2][2]!='-' && controloderepeticao==0 || jogo[0][1]!='-' && jogo[1][1] != '-' && controloderepeticao==0)
     {
         if( jogo[2][1] == '-')
         {             
          jogo[2][1]= 'X';
          printf("Entrada de Nivel 3\n");
          controloderepeticao=1;
          }
     }                   
     else 
     { printf("Entrada no ELSE efectuada..\n");
         for(a=0;a<3;a++)
         {
            for(b=0;b<3;b++)
            {    printf("Entrada for 1 efectuada..\n");             
             if (jogo[a][b]=='-')
             {
                 jogo[a][b]='X';
                 printf("Entrada de Nivel FORADO\n");
                 saidaciclo=1;
                 break;
                 }
            }
            if(saidaciclo==1)
            break;
        }
     }                                  
        
            
     
    
}
 
na boa
olha altera as ' ' por " "
e tambem faz strcpy para dizeres que uma variavel é igual a um caracter...

e outra coisa...

char jogadacomputador(char jogo[3][3])
tens a certeza que isto nao vai buscar so o valor [3][3] para usar na funcao?
 
Última edição pelo moderador:
na boa
olha altera as ' ' por " "
e tambem faz strcpy para dizeres que uma variavel é igual a um caracter...

strcopy?

e outra coisa...

char jogadacomputador(char jogo[3][3])
tens a certeza que isto nao vai buscar so o valor [3][3] para usar na funcao?
tenho usado essa maneira em mais duas ou tres funcoes e ate agora tao a 100%


qual a diferenca de ' ' pra " " , muda alguma coisa?
 
strcpy em string.h
usas assim
strcpy(destino,origem);
no teu caso sera substituir a origem por "palavra ou letra"

muda...a uns tempos num projecto assim nao dava e com " " ja dava...foi estranho... por isso é que falei agora...
 
Back
Topo