Ir ao conteúdo
  • Cadastre-se

C erro label at end of compound statement


Ir à solução Resolvido por devair1010,

Posts recomendados

Eu to tentando fazer esse projeto ai faz umas horas e ta dando um erro que aponta pra constante DOIS e diz: label at end of compound statement. Aparece só no meu codigo acima, o codigo hello, world por exemplo não aparece esse erro, pesquisando achei uns comentarios gringos dizendo que é alarme falso, mas não consegui entende-los muito bem, se eu apagar a Constante DOIS o erro continua. 

 

 

/*
    Objetivo: Programar o clássico Pedra, Papel, Tesoura.
              Manipular arquivos de texto para salvar quantas vezes o jogador ganhou.
              Menu interativo

    Datas:inicio 01/01/2024 às 01:55hrs. | Fim 01/01/2024 às 09:22
          Do inicio ao fim programando, quebrando a cabeça e aprendendo...
          Volto depois para terminar de vez esse projeto.

    By Matheus Marcelino.
*/

//Arquivos-cabeçalhos:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <locale.h>
#include <conio.h>

/*
    valor da tecla 1 -> 49
    valor da tecla 2 -> 50
    valor da tecla 3 -> 51
    valor da tecla ESC -> 27
*/

#define UM 49
#define DOIS 50
#define TRES 51
#define ESC 27

//Função para imprimir um menu de opções:
void menu(){
     printf("\t\tPEDRA PAPEL TESOURA");
     printf("\n\t\t\tby Matheus Marcelino");
     printf("\n\t__________________________________________");
     printf("\n\n\t[1] - Jogar");
     printf("\n\t[2] - Conquistas");
     printf("\n\t[ESC] - Sair");
     printf("\n\t__________________________________________");
     printf("\n\n\tPressione a tecla referente a opção desejada.");

}
//Função para ler as opções do menu:
int lerOpc(int op){

do{
    //Variável:

      op = getch();

    //switch para ler as opções com getch;
      switch(op){
          case UM:
              return (op);
              break;
          case DOIS:
              return (op);
              break;


      }

}while(op != ESC);
  return 0;
}

int main(void){

    FILE *file; //Essencial para salvar dados.
    file = fopen("Dados.txt", "w");



    setlocale(LC_ALL, ""); //Função para exibir caracteres.

    //Variaveis e função do jogo:
    srand(time(NULL)); //semente da função rand.
    int maquina = rand() % 3; //responsável pela vez da máquina.
    int jogador = 0; //responsável pela vez do jogador.
    int ganhou = 0;//variavel vai contar qnts vezes ganhou na partida e dps salvar em um arquivo.txt
    int opcao = 0;
    int playAgain = 0;


   //Chamada de Funções:
   menu();
   opcao = lerOpc(opcao); //declarei uma variável para armazenar o valor retornado da função lerOpc.


   //Parte final do código, com os algoritmos para jogar o jogo ou para ver as conquistas:

    switch(opcao){
     case UM: //Ou seja, usuário escolheu a opção JOGAR:
do{
        system("cls"); //não usei clrscr() porque da erro no CodeBlocks: undefined reference to 'clrscr'
        printf("\t\tPEDRA PAPEL TESOURA");
        printf("\n\t\t\tby Matheus Marcelino");
        printf("\n\t__________________________________________");
        printf("\n\n\t[1] - Pedra");
        printf("\n\t[2] - Papel");
        printf("\n\t[3] - Tesoura");
        printf("\n\t__________________________________________");
        printf("\n\n\tVocê jogará com um computador.\n");
        jogador = getch(); //lê a vez do jogador.




        switch(maquina){ //switch para mostrar a decisão da máquina.
               case 0:

                   printf("\n\t computador: Pedra.");
                   break;
               case 1:

                   printf("\n\t computador: Papel.");
                   break;
               case 2:

                   printf("\n\t computador: Tesoura.");
                   break;
    }

        switch(jogador){ //Switch de decidir se jogador ganhou, perdeu ou empatou.
          case UM://jogador escolheu pedra
              if(maquina == 0){
                printf("\n\t Empate!");


                    }else if(maquina == 1){
                         printf("\n\t Derrota!");

                                 }else if(maquina == 2){
                                      printf("\n\t Vitória!");
                                              ++ganhou;
                                        }
              break;
          case DOIS://jogador escolheu papel
                if(maquina == 0){
                printf("\n\t Vitória!");
                ++ganhou;

                    }else if(maquina == 1){
                         printf("\n\t Empate!");

                                 }else if(maquina == 2){
                                      printf("\n\t Derrota!");

                                        }
              break;
          case TRES://jogador escolheu tesoura
               if(maquina == 0){
                printf("\n\t Derrota!");


                    }else if(maquina == 1){
                         printf("\n\t Vitória!");
                            ++ganhou;
                                 }else if(maquina == 2){
                                      printf("\n\t Empate!");

                                        }
            break;


      }

  file = fopen("Dados.txt", "r");
  if(file == NULL) return 1; //não abriu arquivo.

  maquina = rand() % 3;//para não repetir a vez da maquina varias vezes
  printf("\n\n\t Pressione 1 para Jogar Novamente.");
  printf("\n\t__________________________________________");
  playAgain = getch();
}while(playAgain == UM);
  break;

     case DOIS: //Ou seja, usuário escolheu a opção CONQUISTAS:
}

}
  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

  • Solução

@Matheus Marcelino Santos    olá ,  esse erro se refere ao switch / case , onde o "case" precisa ser acompanhado por mais alguma instrução que pode ser o "break;" que é necessário e geralmente usado .

case DOIS: /// Ou seja, usuário escolheu a opção CONQUISTAS:
  printf("eh DOIS\N");
  break;
Default:
  printf("opCAo invAlida . . . !\n");
  break;

 

    porém observei também que esses "defines"  

 

#define UM   49  /// 49 - 48 =   1
#define DOIS 50  /// 50 - 48 =   2
#define TRES 51  /// 51 - 48 =   3
#define ESC  27  /// 49 - 27 = -21
  
/// que poderia ser assim :  

#define UM   1
#define DOIS 2
#define TRES 3
#define ESC -21

 

e essa função "lerOpc" são desnecessários pois você pode usar números  mesmo  , retornado da função "menu" , assim :

 

/// FunCAo para imprimir o menu e retornar uma opCAo :

int menu  (                                                     )
{
    printf("\t\tPEDRA PAPEL TESOURA                            ");
    printf("\n\t\t\tby Matheus Marcelino                       ");
    printf("\n\t__________________________________________   \n");
    printf("\n\t[ 1 ] - Jogar                                  ");
    printf("\n\t[ 2 ] - Conquistas                             ");
    printf("\n\t[ESC] - Sair                                   ");
    printf("\n\t__________________________________________     ");
    printf("\n\n\tPressione a tecla referente a opção desejada.");
    return getch() - 48; /// retorna o nUmero 1 ou 2 ou ( -21 para o ESC )
}
/// pega a opCAo e retorna sem teclar ENTER

 

  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

Acho que sabe o que está errado agora, como @devair1010 te explicou.

 

Entenda que o comando switch tem uma cláusula default que você deve se acostumar a usar. E entenda também que na falta de um break o código continua rodando pelos comandos abaixo. Isso costuma "pegar" muitos iniciantes.

 

Veja esse programa

 

#include <stdio.h>
int menu(int opcao);

int main(void)
{
    for (int op = 1; op < 6; ++op)
    {
        printf("vai usar opcao %d no switch\n", op);
        menu(op);
    }
    return 0;
}


int menu(int opcao)
{
    switch (opcao)
    {
        case 1:
            printf("1\n");
            break;
        case 2:
            printf("2\n");
            break;
        case 3:
            printf("3\n");
        case 4:
            printf("4\n");
            break;
        default:
            printf("outra opcao: %d\n", opcao);
            break;
    }
    return 0;
};

 

E a saída

 

vai usar opcao 1 no switch
1
vai usar opcao 2 no switch
2
vai usar opcao 3 no switch
3
4
vai usar opcao 4 no switch
4
vai usar opcao 5 no switch
outra opcao: 5

 

E entenda as diferenças. Use o computador para essas coisas e aprenda a escrever simples programas de teste ANTES de escrever um programa inteiro

 

Sobre o código na pergunta

 

Seu programa não está ainda bom. Pode ser que consiga concluir desse modo, mas ele tem muitos dos problemas comuns que aparecem aqui no forum e em outros, acho que pela maneira como ensinam isso nesses tempos.

 

Eu tenho uma lista e então vou apenas repetir alguns dos itens

 

  • Não use acentos em nomes de variáveis ou comentários. Evite mesmo em strings  a menos que o enunciado exija. Não vai aprender nada e só vai ter problemas. Mais ainda evite usar Unicode e coisas como emojis. Nada acrescenta ao código e não sair em muitas telas, ou vai sair outra coisa. E se imprimir o programa pode não sair nada ou algum lixo.
  • Evite comentários como "main é a função principal" ou "declaração de variáveis" ou coisas óbvias desse tipo. Comente o porque está fazendo algo, escreva para você mesmo no futuro, tipo daqui a 2 dias quando pode não lembrar para que era aquele ponteiro, por exemplo.
  • Não use system() para nada. Não estará fazendo nada. Não estará aprendendo nada. Não há praticamente nada que possa fazer com system() que não possa fazer em C ou C++. system() foi escrita em C e o sistema quase todo também. E em geral é proibido em empresas e escolas afinal: é um risco grande de segurança. E se tem algo que você não possa inicialmente fazer em C ou C++ talvez não deva mesmo fazer.
  • main() deve ser a primeira função de seu programa. Se possível em um arquivo separado. Há muitas razões para isso, mas em especial vai gostar de começar a ler seus programas e os de outros a partir de main() E a partir do início do texto. Ao mesmo tempo. E ao usar protótipos fica trivial passar as declarações todas para um arquivo .h que é o mais prático afinal.
  • evite retornar void de funções: em geral é um desperdício. E muitas vezes um erro. Use argumentos nas funções, e retorne algo delas. É mais esperto e expressivo.
  • Não há razão para incluir conio.h. Essa é uma biblioteca dos anos 80 e nada acrescenta a um programa moderno. Mesmo nos anos '80 ela era usada em geral apenas para ler letrinhas do teclado sem mostrar na tela, limpar a tela e escrever letrinhas com cores --- getch(), kdhit(), clrscr() e textcolor(). A mesma coisa que estava disponível em C no Windows e no Unix (depois Linux/MacOS/Android) em poucas linhas mas ninguém lia o manual imagino. 
  •  Se seu programa tem um menu, entenda que o menu() deve mostrar as opções e ler e retornar a opção. Um void menu() é um desperdício.
  • Nunca escreva um programa interativo. Não vai aprender nada. Não vai ganhar nada. Escreva e teste todas as funções. DEPOIS de tudo testado coloque a parte interativa. isso inclui claro o eventual menu.
  • evite ler do teclado a menos que seja o objetivo do problema. Ler de arquivos é muito mais simples, seguro e fácil de reproduzir. Não há razão para ficar parado em frente a tela minutos inventando nomes de campos e coisas assim: o efeito é que vai acabar não testando direito porque é difícil controlar e repetir testes.
  • Um printf() de 6 linhas é muito, mas muito melhor que 6 printf() de 1 linha. E se só vai mostrar o texto puts() é ainda melhor e dezenas de vezes mais rápido que uma série de printf().

Eis uns exemplos de coisas que só vão te atrapalhar:

 

// Função para imprimir um menu de opções:
void menu()
{
//...
}

 

  • Não é mais simples retornar a opção?
  • Não dá pra imaginar, sem o comentário, que tal função represente um menu?
    printf("\t\tPEDRA PAPEL TESOURA");
    printf("\n\t\t\tby Matheus Marcelino");
    printf(
        "\n\t__________________________________________");
    printf("\n\n\t[1] - Jogar");
    printf("\n\t[2] - Conquistas");
    printf("\n\t[ESC] - Sair");
    printf(
        "\n\t__________________________________________");
    printf(
        "\n\n\tPressione a tecla referente a opção "
        "desejada.");

 

8 chamadas a printf sem nenhuma variável? Use puts() dezenas de vezes mais rápido. Ou prefira

    printf("\n\
        PEDRA PAPEL TESOURA\n\
            by Matheus Marcelino\n\
\n\
    __________________________________________\n\
\n\
    [1]   - Jogar\n\
    [2]   - Conquistas\n\
    [ESC] - Sair)\n\
\n\
    __________________________________________\n\
\n\
\n\
   Pressione a tecla referente a opção "
        "desejada.");

 

Muito mais fácil de ler e de alinhar e dezenas de vezes mais rápido...

 

    menu();
    opcao = lerOpc(
        opcao);  // declarei uma variável para armazenar o
                 // valor retornado da função lerOpc.

 

Não seria muito mais simples usar

 

	int opcao = menu();

 

e retornar a resposta, que é o que se espera de um menu?

 

E o comentário fez mesmo diferença?

 

Sobre isso:

 

    srand((unsigned) time(NULL));  // semente da função rand.

 

provavelmente não precisa disso, mas se quer mesmo usar srand() em um programa que está testando é mais produtivo usar uma mesma semente, que é só um número, tipo 20240104, porque assim durante todos os testes terá a mesma série e assim pode rever cada condição de sorteio....

 

 

 

  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

@arfnetoMn valeu pelas dicas, vou ver de por em prática. Na verdade vou ter que ler mais vezes pra "pegar" tudo. De fato os comentários são desnecessários, acho que não tinha um critério definido e fui fazendo comentario que nem loco haushaus, os acentos na variável é algo que eu não sabia mesmo, seu comentario foi muito top pra mim, obrigado mesmo.

Na verdade eu comecei a aprender C há 1 semana, e eu fiz esse projeto sem saber de fato.

Eu tinha a ideia, então fui programando com o básico do básico do básico que eu sabia e procurando na internet os comandos para fazer o que eu queria. Por ex: "como fazer pra esconder o mouse", "como fazer pra criar uma função", "como fazer pra criar um arquivo.txt". Ai eu estudava aquilo e tentava aplicar.

 

Sobre o projeto: não consegui fazer como queria, mas fiz, está no meu github. Não consegui fazer o codigo para salvar.

 

bem, acho que a partir de agora vou tentar fazer projetos com o que eu estudar (estudo em um curso do youtube), ou seja, com o que eu aprender nos videos e seguindo suas dicas. 

 

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

4 horas atrás, Matheus Marcelino Santos disse:

Não consegui fazer o codigo para salvar.

 

Talvez devesse continuar postando o código, de modo que alguém possa ajudar.

 

Qual foi a dificuldade em salvar? É muito simples manipular arquivos em C. Essa linguagem foi criada para acelerar o desenvolvimento de um sistema operacional --- Unix --- em que tudo é arquivo. Tudo, memória, dispositivos, processos... E assim não poderia ser difícil.

 

Escreva em torno dos dados. Programe em torno dos dados. O que vai salvar é apenas o score para o jogador.

 

E a partida tem resolução instantânea. Não entendi porque precisa de uma função "bot" 

 

O código no github continua com quase todos os problemas que te apontei. E difícil de ler e alterar. Entenda que é normal ter um switch dentro de outro.

 

Um menu de uma opção só? Para que? Faz diferença ocultar o cursor?

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Em 06/01/2024 às 13:46, Matheus Marcelino Santos disse:

De fato os comentários são desnecessários, acho que não tinha um critério definido e fui fazendo comentario que nem loco haushaus

Quem falou que seus comentários foram desnecessários / qual autoridade?

 

'ÔXI'!!! A expressão é tua, comente-na livremente (se tem tempo: seja verborrágico).

Não perda–tempo com regrinhas, recomendações de estilo e indentação esdrúxulas; se necessário, existem exemplos de expressões bem escritas na pasta da biblioteca padrão da linguagem de programação C. 

 

A propósito, alguns dos melhores guias para iniciantes tem comentários em TUDO; e somos autorizados por eles a sermos super didáticos até à nos mesmos. — Sugerem que, inicialmente, expressemos uma solução com algoritmo.

 

Existem 3 tipos principais de algoritmo: a descrição narrativa, o fluxograma e o pseudocódigo. 

E daí?

— Daí que, recomendam mais estudo no seu desenvolvimento lógico e expressão em algoritmo, em seguida, rebaixá-lo à linguagem C, usá-lo para documentar com comentários e aprender, porque a linguagem de programação é somente uma ferramente ( e C é uma das antigas);

 

— Então

Existem linguagens muito, …, muito mais idiomáticas que a linguagem C, e mesmo elas, não superam o algoritmo/lógica/comentário.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!