1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[C] Dudiva for

Discussão em 'Programação' iniciada por 'Si0n., 21 de Junho de 2008. (Respostas: 27; Visualizações: 1168)

  1. 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
     
  2. Mr_Miguel

    Mr_Miguel Power Member

    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: 21 de Junho de 2008
  3. 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.
     


  4. 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;
            }
         }            
     
  5. 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
     
  6. Mr_Miguel

    Mr_Miguel Power Member

    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';"
     
  7. 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...
     
  8. 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 :)
     
  9. 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: 22 de Junho de 2008
  10. 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?
     
  11. Zaonpt

    Zaonpt Power Member

    if(cond){
    ...
    } else if(cond2){
    ....
    } else { bla bla}


    o bla bla só é executado se cond e cond2 forem falsas
     
  12. é isso mesmo que tenho andado a procura thx :), é pena que o for esteja a dar problemas de novo xD
     
    Última edição: 22 de Junho de 2008
  13. 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: 22 de Junho de 2008
  14. 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: 22 de Junho de 2008
  15. esperimenta colocar printf 's nas zonas criticas para saber o valor das variaveis...pode ser uma má indicacao...
     
  16. 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;
            }
         }                                  
            
                
         
        
    }
     
  17. 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: 24 de Junho de 2008
  18. strcopy?

    tenho usado essa maneira em mais duas ou tres funcoes e ate agora tao a 100%


    qual a diferenca de ' ' pra " " , muda alguma coisa?
     
  19. 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...
     
  20. o " " dá erro ao compilar . vou testar o strcpy entao
     

Partilhar esta Página