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

Introdução a c- jogo da vida, 1º duvida

Discussão em 'Programação' iniciada por Syfer, 21 de Dezembro de 2008. (Respostas: 9; Visualizações: 1462)

  1. Syfer

    Syfer Power Member

    Boas,

    Tenho que fazer o jogo da vida de conway, muitas duvidas deverao aparecer, mas por enquanto gostaria de saber que condição acrescento para no caso de nao se introduzir um numero, mas sim uma letra ou ou caracter dar um erro em printf,

    o codigo será qq assim:

    Código:
    do 
      {
        printf("\n Introduza o numero da linha onde quer colocar a celula: ");
          scanf("%i",&i);
            if (i>TAM || i<0)
              printf("\n Linha fora do tabuleiro!\n");  
      }
      while (i>TAM || i<0);

    e tentei assim sem sucesso:

    Código:
    do 
      {
        printf("\n Introduza o numero da linha onde quer colocar a celula: ");
          scanf("%i",&i);
            if (i>TAM || i<0)
              printf("\n Linha fora do tabuleiro!\n");
            [COLOR="Red"]else     
              printf("\n Instrucao invalida\n"); [/COLOR] 
      }
      while (i>TAM || i<0);
    esta a funcionar bem a menos que o utilizador escreva uma letra.



    Ja agora outra coisa, se tenho o tamanho de uma matriz definido com um define

    Código:
    #include <stdio.h>
    #include <stdlib.h>
    
    #define TAM 25
    
    int i, j, tabuleiro[TAM][TAM];
    a alguma maneira de o utilizador alterar esse valor para neste caso alterar o tamanho do tabuleiro?
     
    Última edição: 21 de Dezembro de 2008
  2. Baderous

    Baderous Banido

    Tens de testar o valor devolvido pelo scanf. O scanf devolve o número de variáveis lidas com sucesso, isto é, nesse caso, se ele ler uma letra, ao tentar atribuir essa letra a uma variável do tipo int, vai devolver o valor 0 porque são de tipos diferentes. Se tivesse lido um int, devolvia 1, indicando que leu com sucesso.
     
  3. Ra7or

    Ra7or Mestre BOINC

    No scanf() não deveria de ser "%d" ?? É que está, "%i".

    EDIT: Jà vi que dá das duas formas.;)
     
    Última edição: 21 de Dezembro de 2008
  4. Tens duas maneiras de fazer isso:
    - Pedir ao utilizador para inserir e depois fazes scanf para ler o valor
    - Receber como argumento quando inicias o programa. Para isso vais buscar o valor a argv.

    Se preferires a segunda, posso deixar-te depois um exemplo para perceberes o funcionamento ;)

    Em relação à tua primeira dúvida, parece-me que esse '&' atrás da variável não devia aí estar. Tenta tirar para ver se resolve.
     
  5. |[Kaos]|

    |[Kaos]| Power Member

    tem de ter o & sim, no scanf queres passar o endereco de memoria da variavel onde queres que o scanf ponha o valor que escreveste ...

    uma possivel maneira de fazeres isso é receberes primeiro num array e depois converter para inteiro ... deves estar com aqueles problemas de "loops infinitos" quando metes uma letra por exemplo
     
    Última edição: 22 de Dezembro de 2008
  6. Tens razão, no caso das strings é que não é preciso. My bad...
     
  7. |[Kaos]|

    |[Kaos]| Power Member

    uma possível maneira de receberes os dados (nao perfeita) pode ser:

    Código:
    do 
    	  {
    		printf("\n Introduza o numero da linha onde quer colocar a celula: ");
    		scanf("%s",cmd);
    
    		i = atoi(cmd); // converte comando para inteiro
    
    		if (( i < 0 || i > TAM ) && (cmd[0] - '0' < 10) )  { // verifica dimensoes e se o primeiro caracter e' um inteiro
    			printf("\n Linha fora do tabuleiro!\n");
    			continue;
    		}
    
    		if (cmd[0] - '0' > 9)  { // erro caso primeiro caracter nao seja um inteiro
    			printf("\n Comando invalido!\n");
    			i = -1;
    			continue;
    		}
    
    	  }
    	  while (( i < 0 || i > TAM ) && (cmd[0] - '0' > 9));
    
    so que desta maneira se meteres por exemplo "1a" a função atoi() converte para "1" , ignorando todos os caracteres que venham a seguir ao primeiro char (nao tenho a certeza btw). Mas dessa maneira se meteres uns caracteres já não da aqueles loops.

    Em relação ao #DEFINE , não podes alterar o valor deles, se quiseres fazer vectores dinâmicos, tens de ser tu a alocar a memória.
     
  8. Syfer

    Syfer Power Member

    pois ja me tinha falado no atoi, mas estou limitado à materia que dei e disso ainda nao falamos, teria que ser qualquer coisa como um simples else, mas nao consigo arranjar maneira de faze-lo funcionar.
     
  9. |[Kaos]|

    |[Kaos]| Power Member

    estive a pensar um pouco mais :P e outra maneira de fazeres isso agora sem o atoi

    Código:
    do 
    	  {
    		printf("\n Introduza o numero da linha onde quer colocar a celula: ");
    		fflush(stdin); // limpa o buffer para evitar loops
    
    		if ( scanf("%d",&i) != 1 ) { // verifica se introduziu um int
    			printf("Instrucao invalida\n"); 
    			i = -1;
    			continue;
    		}
    
    		if ( i < 0 || i > TAM ) { // verifica dimensoes do tabuleiro
    			printf("Linha fora do tabuleiro\n");
    		}
    
    	  } while ( i < 0 || i > TAM);
    o fflush(stdin) vai servir para limpar o buffer do teclado
     
  10. Syfer

    Syfer Power Member

    excelente, simples e a fazer o q se pretende

    obrigado[]
     

Partilhar esta Página