Jump to content
Sign in to follow this  
jluis

Problema com o switch

Recommended Posts

jluis

boas...

eu ja programei em pascal em vb.net e agora para uma cadeira da universidade tenho de programar em c, ate aqui nada de mais, mas o problema é que agora no trabalho final (fazer um programa genero mastermind so com numeros) ao utilizar o switch o gcc passa-se...

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define max 10

void gotoxy(int x,int y)
{
printf("%c[%d;%df",0x1B,y,x);
}

void table(int num)
{
  int i;
  switch(num)
  {
  case 2:
    gotoxy(1,1);
    printf("__|__\n");
    printf("__|__\n");
    break;
  case 3:
    gotoxy(1,1);
    printf("__|__|__\n");
    printf("__|__|__\n");
    printf("__|__|__\n");
    break;
  case 4:
    gotoxy(1,1);
    printf("__|__|__|__\n");
    printf("__|__|__|__\n");
    printf("__|__|__|__\n");
    printf("__|__|__|__\n");
    break;
  case 5:
    gotoxy(1,1);
    printf("__|__|__|__|__\n");
    printf("__|__|__|__|__\n");
    printf("__|__|__|__|__\n");
    printf("__|__|__|__|__\n");
    printf("__|__|__|__|__\n");
    break;
  case 6:
    gotoxy(1,1);
    printf("__|__|__|__|__|__\n");
    printf("__|__|__|__|__|__\n");
    printf("__|__|__|__|__|__\n");
    printf("__|__|__|__|__|__\n");
    printf("__|__|__|__|__|__\n");
    printf("__|__|__|__|__|__\n");
    break;
  }
}

int gerar(int g[6][6], int x, int y)
{
int i,j;
long l;
l=time(NULL);
srand(l);
for (i=0;i<x;i++)
{
  for (j=0;j<y;j++)
  {
    g[i][j]=rand()%(max);
  }
}  
}

int ler(int jog[6][6], int x, int y)
{
int i,j,h,l,c,p;
l=1;
c=1;
p=y*3-1;
for (i=0;i<x;i++)
  {
  for (j=0;j<y;j++)
    {
      gotoxy(1,16);printf("intruduza um numero:\n");
      gotoxy(l,c);
      scanf("%d",&h);
      l=(l+3);
      jog[i][j]=h;
       if(l>=p)
       {
   l=1; 
   c=c+1;
       }
    
      }
  }
}
int comparar(int g[6][6], int jog [6][6],int pontos, int x, int y)
{
int i,j,h,num,z,c,l,p;
pontos = 0;
c=1;
l=2;
z=(x*x)/10+1;
p=y*3;
table(x);
for (i=0;i<x;i++)
  {
  for (j=0;j<y;j++)
    {
      if (g[i][j]==jog[i][j])
   {
     gotoxy(l,c);
     printf("*");
     l=(l+3);
     if(l>=p)
       {
         l=2; 
         c=c+1;
       }
     pontos=pontos+1;
   }
      else
   {
     gotoxy(l,c);
     printf("X");
     l=(l+3);
     if(l>=p)
       {
         l=2; 
         c=c+1;
       }
      pontos=pontos-1;
   } 
    }
  }
  gotoxy(1,8);printf("%d",pontos);
  if (pontos == z)
  {
    gotoxy(1,9);printf("parabens conseguio acertar mais de %d",z);
    getchar();
    
  }
  else
  {
    gotoxy(1,16);printf("volte a tentar");
    ler(jog,x,y);
  }
  return pontos;  
}

//inicio
main()
{
int x, y, a, num, pontos, g[6][6], jog[6][6];
char c;
num=0;
system("clear");
gotoxy(1,10);printf("1-Novo Jogo\n");
gotoxy(1,11);printf("2-Ver pontos\n");
gotoxy(1,12);printf("3-Ajuda\n");
gotoxy(1,13);printf("4-Sair\n");
gotoxy(1,14);scanf("%d",&a);
fflush(stdin);
switch(a)
{
  case 1: 
  {
     printf("Quais as Dimenções do tabuleiro?(de 2 a 6)");
     scanf("%d",&num);
     if (num==2 || num==3 || num==4 || num==5 || num==6)
     {
     pontos=0;  
     x=num;
     y=num; 
     table(num);
     gerar(g, x, y);
     ler(jog, x, y);
     table(num);
     comparar(g, jog, pontos, x, y);
     }
     else
     {
       printf("Dimenções não validas\n");
       getchar();
     }
   main();
  }
  break;
  case 2: 
  {
    fflush(stdin);  
    gotoxy(1,5);
    printf("Tem actualmente %d\n",pontos);
    c=getchar();
    if (c=='q')
    main();
  }
  case 3:
  {
     gotoxy(1,15);
     printf("ajuda ainda nao disponivel\n");
     c=getchar();
     if (c=='q')
     main();
  }
  case 4:
     break;
} 
}

capturaecraf.png

ele ao digitar a opcao 2 so deveria ir po case 2 e nao... faz o case 2 e 3...

alguem me pode ajudar nisto? é mesmo urgente

(o codigo c mostrado a cima tem como criador o aluno lei113023 da estgoh)

(a linha a cima é mesmo so caso o prof procure pelo meu prog)

Share this post


Link to post
Share on other sites
jpedro20

falta-te o break no case 2 e 3. Sem isso ele continua para os outros casos a seguir

Share this post


Link to post
Share on other sites
jluis

boas...

desde ja obrigado pela ajuda...

mas tipo se ponho ali um break ele nao mostra as outras, mas tbm nao volta ao "menu" acaba logo ali o prog...

ja agora a minha variavel pontos nao sei porque mas tbm nao passa o valor devido... passa valores mt estralhos alguem me pode dizer o porque disto tbm?

cumprs

Share this post


Link to post
Share on other sites
Xpirito

Boas

Não pude testar o teu código, porque não trabalha com o compilador do Visual express.

Inicia a variável 'pontos' e já terás o problema da variável pontos resolvido :)

Parece-me que o teu case precisa de um default. Podes usar o default para te retornar ao menu. Deverá funcionar dessa forma.

Gostava de ter experimentado este código. Está muito estranho a meu ver...


Para perguntas idiotas, respostas estúpidas!

Share this post


Link to post
Share on other sites
jluis

boas novamente..

xpirito eu estou a utilizar o fedora para isto... kate para escrever e gcc pa compliar...

quanto a soluçao que me deste testei mas infelizmente nao da rezultados...

    c=getchar();
    if (c=='q')
    main();

ja estou a utilizar isto para ver se ele para antes de paxar para o case 3 mas nada... ele nao para no getchar...  :wallbash:

abraços... e muito obrigado pela ajuda que me estao a prestar...

Share this post


Link to post
Share on other sites
anolsi

Ora vê se assim funciona como queres.

main(){
int x, y, a, num, pontos, g[6][6], jog[6][6];
char c;
while (1){
	num=0;
	system("clear");
	gotoxy(1,10);printf("1-Novo Jogo\n");
	gotoxy(1,11);printf("2-Ver pontos\n");
	gotoxy(1,12);printf("3-Ajuda\n");
	gotoxy(1,13);printf("4-Sair\n");
	gotoxy(1,14);scanf("%d",&a);
	fflush(stdin);
	switch(a){
	  case 1:
	    printf("Quais as Dimenções do tabuleiro?(de 2 a 6)");
	    scanf("%d",&num);
	    if (num==2 || num==3 || num==4 || num==5 || num==6){
			pontos=0;  
			x=num;
			y=num;
			table(num);
			gerar(g, x, y);
			ler(jog, x, y);
			table(num);
			comparar(g, jog, pontos, x, y);
	    } else {
			printf("Dimenções não validas\n");
			getchar();
	    }
		break;
	  case 2:
	    fflush(stdin);  
	    gotoxy(1,5);
	    printf("Tem actualmente %d\n",pontos);
	    c=getchar();
	    if (c!='q') exit(0);
		break;
	  case 3:
	     gotoxy(1,15);
	     printf("ajuda ainda nao disponivel\n");
	     c=getchar();
	     if (c!='q') exit(0);
	     break;
	  case 4:
	     exit(0);
	     break;
	 }
}
}


"Nós somos o que fazemos repetidamente, a excelência não é um feito, e sim, um hábito."
Não respondo a questões por PM que possam ser colocadas no fórum!

Share this post


Link to post
Share on other sites
jluis

boas novamente

bem vamos ver se nao sou eu que estou a ser otario...

(nao sei porque acho que sou que tou a complicar tudo)

tipo isto devia de funcionar algo axim

primeiro o jogador fazia novo jogo

escolhia por exemplo 3 (ia-lhe dar um tabuleiro de 3*3)

fazia as jogadas... no fim se tivesse 2 jogadas certas (3*3/10+1) saia senao continuava la

esta parte trabalha como desejado...

mas depois se fizer 2 ele so devia mostrar os pontos ficar a espera de uma tecla qualquer (tipo o readkey no pascal) e quando recebesse uma tecla voltava normalmente para o menu principal...

mas se eu utilizar o break ele sai logo do programa... mesmo dentro o while o que para mim é de achar mt estralho..

quando ao pontos ja ta rezolvido o problema... nao sei bem como é que ele ficou normal, mas ficou...xD

abraços...

Share this post


Link to post
Share on other sites
jpedro20

com o break ele não sai do ciclo While mas sim do switch. Aquilo que o anolsi apresentou está correcto e funciona. Se tu queres que o programa continue quando primes qualquer tecla então deves retirar o if (c!='q') exit(0); do case 2 e 3. Se o utilizador pressionar uma tecla sem ser o 'q' então sai do programa, neste caso.

Share this post


Link to post
Share on other sites
bubulindo

Experimentaste o código do anolsi?

Parece-me ser o que pretendes.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
jluis

boas...

acreditem ja me estou a passar com o gcc mais as me**as dele... tirando o if (c!='q') exit(0); ele faz o pretendido...

mas este programa é fantastico, rezolve-se um problema aparece outro... 😡

o c=getchar() segundo sei devia fazer com que o utilizador primeiro lhe dexe um char so depois de ele "segue" bem o meu gcc (problematico) nao gosta disso e nao para...

basicamente ele nao mostra nada...

mostra o printf do case 2 mas como antes do menu principal tem o system("clear") ele apaga logo... basicamente nem se ve... (espero nao tar a dar mais xutos na programaçao ja basta os que dei ate agora...)

bahhh porque que o c=getchar nao faz o cursor ficar a espera? alguem me sabe dizer?

abraços e mesmo mt obrigado pela ajuda

Share this post


Link to post
Share on other sites
Localhost

Estás a confundir a execução do programa (runtime) com a sua compilação, são coisas completamente diferentes. Em runtime o GCC não tem nada a ver com o assunto, tem apenas a ver com a compilação.

Quanto ao problema que apresentaste em último lugar, isso provavelmente tem a ver com limpar o buffer.

Experimenta utilizar esta linha de código antes da chamada à função getchar:

scanf ("%*c");

E vê se isso muda alguma coisa.


here since 2009

Share this post


Link to post
Share on other sites
jluis

boas...

localhost funciona isso... era mesmo isso que faltava...:)

obrigado a todos pela a ajuda...

em baixo ta o programa com as correcçoes feitas, pode ser que de geito depois para alguem...B)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define max 10

void gotoxy(int x,int y)
{
printf("%c[%d;%df",0x1B,y,x);
}

void table(int num)
{
  int i;
  switch(num)
  {
  case 2:
    gotoxy(1,1);
    printf("__|__\n");
    printf("__|__\n");
    break;
  case 3:
    gotoxy(1,1);
    printf("__|__|__\n");
    printf("__|__|__\n");
    printf("__|__|__\n");
    break;
  case 4:
    gotoxy(1,1);
    printf("__|__|__|__\n");
    printf("__|__|__|__\n");
    printf("__|__|__|__\n");
    printf("__|__|__|__\n");
    break;
  case 5:
    gotoxy(1,1);
    printf("__|__|__|__|__\n");
    printf("__|__|__|__|__\n");
    printf("__|__|__|__|__\n");
    printf("__|__|__|__|__\n");
    printf("__|__|__|__|__\n");
    break;
  case 6:
    gotoxy(1,1);
    printf("__|__|__|__|__|__\n");
    printf("__|__|__|__|__|__\n");
    printf("__|__|__|__|__|__\n");
    printf("__|__|__|__|__|__\n");
    printf("__|__|__|__|__|__\n");
    printf("__|__|__|__|__|__\n");
    break;
  }
}

int gerar(int g[6][6], int x, int y)
{
int i,j;
long l;
l=time(NULL);
srand(l);
for (i=0;i<x;i++)
{
  for (j=0;j<y;j++)
  {
    g[i][j]=rand()%(max);
  }
}  
}

int ler(int jog[6][6], int x, int y)
{
int i,j,h,l,c,p;
l=1;
c=1;
p=y*3-1;
for (i=0;i<x;i++)
  {
  for (j=0;j<y;j++)
    {
      gotoxy(1,16);printf("Introduza um numero entre 0 e 9:\n");
      gotoxy(l,c);
      scanf("%d",&h);
      l=(l+3);
      jog[i][j]=h;
       if(l>=p)
       {
l=1; 
c=c+1;
       }

      }
  }
}
int comparar(int g[6][6], int jog [6][6],int pontos, int x, int y)
{
int i,j,h,num,z,c,l,p;
char q;
pontos = 0;
c=1;
l=2;
z=(x*x)/10+1;
p=y*3;
table(x);
for (i=0;i<x;i++)
  {
  for (j=0;j<y;j++)
    {
      if (g[i][j]==jog[i][j])
{
  gotoxy(l,c);
  printf("*");
  l=(l+3);
  if(l>=p)
    {
      l=2; 
      c=c+1;
    }
  pontos=pontos+1;
}
      else
{
  gotoxy(l,c);
  printf("X");
  l=(l+3);
  if(l>=p)
    {
      l=2; 
      c=c+1;
    }
      pontos=pontos-1;
} 
    }
  }
  if (pontos == z)
  {
    gotoxy(1,9);printf("parabéns consegui-o acertar em mais de %d",z);
      scanf ("%*q");
      q=getchar();
  }
  else
  {
    gotoxy(1,9);printf("volte a tentar");	
    ler(jog,x,y);
  } 
}

//inicio
main()
{
int x, y, a, num, pontos, g[6][6], jog[6][6];
char c;
while (1){
num=0;
system("clear");
gotoxy(1,10);printf("1-Novo Jogo\n");
gotoxy(1,11);printf("2-Ver pontos\n");
gotoxy(1,12);printf("3-Ajuda\n");
gotoxy(1,13);printf("4-Sair\n");
gotoxy(1,14);scanf("%d",&a);
fflush(stdin);
switch(a)
{
  case 1: 
  {
  printf("Quais as Dimenções do tabuleiro?(de 2 a 6)");
  scanf("%d",&num);
  if (num==2 || num==3 || num==4 || num==5 || num==6)
  { 
  x=num;
  y=num;
  table(num);
  gerar(g, x, y);
  ler(jog, x, y);
  table(num);
  comparar(g, jog, pontos, x, y);
  }
  else
  {
    printf("Dimenções não validas\n");
    scanf ("%*c");
  }
main();
  }
  break;
  case 2: 
      pontos=pontos;
      fflush(stdin);  
      gotoxy(1,5);
      printf("Tem actualmente %d\n",pontos);
      scanf ("%*c");
      c=getchar();
      break;
    case 3:
      gotoxy(1,15);
      printf("ajuda ainda nao disponivel\n");
      scanf ("%*c");
      c=getchar();
      break;
     case 4:
      exit(0);
      break;
     default: main(); 
   }
}  
}   

mais uma vez muito obrigado a todos... mesmo muito obrigado..

abraço e boas noites

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.