Ir ao conteúdo

C exercício em linguagem c


Ir à solução Resolvido por helda correia,

Posts recomendados

Postado

boa tarde pessoal! tenho que fazer um exercício em c porém estou tendo problemas. seja o exercicio:

Um dos jogos de azar mais populares é o jogo de dados conhecido como craps. As regras deste jogo s ̃ao simples: 

Um jogador lança dois dados. Cada dado tem seis faces. Essas faces contêm 1, 2, 3, 4, 5 e 6 pontos. Depois que os dados param, a soma dos pontos nas duas faces voltadas para cima é calculada. Se a soma for 7 ou 11 na primeira jogada, o jogador vence. Se a soma for 2, 3 ou 12 na primeira jogada (chamada craps), o jogador perde. Se a soma for 4, 5, 6, 8, 9 ou 10 na primeira jogada, ent ̃ao a soma se torna o ponto do jogador. Para vencer, o jogador precisa continuar lançando os dados até que faça o seu ponto. O jogador perde lançando um 7 antes de fazer o ponto. Implemente um programa em C para simular uma partida de craps. segue o programa que eu fiz: 

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

int main()
{
    int s; // para jogar os dados
    int resp; // continue o jogo
    int SOMA;      // soma dos dados
    int face_dado;  // dado 1
    int face_dado2;  // dado 2
    int ponto; // ponto do jogador
    long semente;

   time(&semente);
   srand((unsigned) semente);
   face_dado = 1 + rand()%6;
   face_dado2 = 1 + rand()%6;

   printf("\n%d %d\n", face_dado, face_dado2);

   system("PAUSE");
   return 0;
}


(

 if (resp == s ) ;

        printf("jogo comeca");
        system("PAUSE");
        return 0;
    }

    switch( SOMA)
  {
     case 7
:     printf(face_dado + face_dado2 == 7 );
     printf("voce ganha");
     break;

     case 11
:     printf( face_dado + face_dado2 == 11);
     printf("voce ganha");
     break;

     case 2
:     printf(face_dado + face_dado2 == 2);
     printf("voce perde");
     break ;

     case 3
:    printf(face_dado + face_dado2 == 3);
     printf("voce perde");
     break;

     case 12
:     printf(face_dado + face_dado2 == 12 );
     printf("voce perde");
     break;

     case 4
:     printf( face_dado + face_dado2 == 4);
     printf("ponto");
     break;

     case 5
     printf(face_dado + face_dado2 == 5);
     printf("ponto");
     break;

     case 6
:     printf(face_dado + face_dado2 == 6);
     printf("ponto");
     break;

     case 8
:     printf(face_dado + face_dado2 == 8);
     printf("ponto");
     break;

     case 9
:     printf(face_dado + face_dado2 == 9);
     printf("ponto");
     break;

     case 10
 :    printf(face_dado + face_dado2 == 10);
     printf("ponto");
     break;

  }

    // segunda rodada
 {

    if(face_dado + face_dado2 == 7);
    printf("voce perde");

    system("PAUSE");
    return 0;
 }
   system("PAUSE");
   return 0;
}


ele esta dando os seguintes erros: |29|error: expected identifier or '(' before 'if'|, |38|error: expected identifier or '(' before 'switch'|, |100|error: expected identifier or '(' before '{' token|, |108|error: expected declaration specifiers or '...' before string constant|, |109|error: expected identifier or '(' before 'return'| e eu nao sei o que fazer para arrumar. alguém poderia me ajudar e ver se eu to escrevendo o programa certo? obrigadaa.

  • Curtir 1
  • Membro VIP
Postado

Olá .. você precisa mais é saber os conceitos da programação c e não necessariamente sobre o programa. Vou citar apenas isso...(dentre outros errinhos)

7 minutos atrás, Isadora Moretti disse:

 if (resp == s ) ;

você fechou a condição if com ";" O compilador não sabe o que fazer. Algo como:

"Se você não entendeu isso, então..."

  • Curtir 1
  • Solução
Postado
8 minutos atrás, if. disse:

Olá .. você precisa mais é saber os conceitos da programação c e não necessariamente sobre o programa. Vou citar apenas isso...(dentre outros errinhos)

você fechou a condição if com ";" O compilador não sabe o que fazer. Algo como:

"Se você não entendeu isso, então..."

eu consertei mas o erro na linha 29 continua... 

  • Curtir 1
  • Membro VIP
Postado

ok... tem mais erros que não posso lhe enumerar. Aguarde alguém + te orientar ou se preferir considere estudar os princípios da sintaxe da programação c.

  • Curtir 2
Postado

é que depende muito o q você ja aprendeu, ou viu sobre a linguagem, tem estruturas bem mais robustas pra se fazer esse programa, você vai sequencialmente colocar qnts rodadas ai sem saber se antes disso termina? e se nao terminar?

tem outras estruturas de laço pra isso, mas depende muito do q ja aprendeu, nao posso mostrar uma estrutura q você nao aprendeu

 

mas tem uma mistura de ( e { ai no seu codigo

Postado

  

16 horas atrás, Isadora Moretti disse:

 

 

então foi o q eu quis dizer, imagina q sejam jogadas varias e varias rodadas até q chegue em algum ganhador, você não tem como saber antes de começar que ja vai chegar em algum final em 2 rodadas....pode chegar na primeira ou na centésima, é preciso um laço que verifique alguma condição, mas dependendo do q ja sabe isso nao foi ensinado e realmente so resta na repeticao do código jogar 2 rodadas e avaliar repetidamente o resultado 

mas de qq forma quando iniciar o programa, precisa rolar os dados, avaliar todas as condições, se chegar em algum resultado terminar ou continuar, ai volta a rolar os dados, volta a avaliar todas as condições, e assim vai, como disse q vai tentar apenas 2 rodadas terminaria ai.....

tente codificar aos poucos, faça a primeira rodada, quando ela estiver perfeita, fica muito mais fácil você "copiar" para a segunda rodada então.....

 

veja q seu switch esta isolado, esta avaliando uma variável q olhando eu não vi nem onde atribui um valor

 

ja q esta começando, vá pensando cada ação q é preciso, e codifique....com o tempo você vai ver q tem ações q são repetidas e cabe virar uma função...q as repetições podem ser controladas com um laco controlado como disse la no começo....

 

Postado

Usando loop e função, o resultado fica um tanto simples, como o @nickosoft disse, não tem como prever em qual jogada o resultado aparecerá. Uma possível abordagem poderia ser essa:

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

int lancarDado();

int main() {
    int status = 0;     // [ -1 ] Derrota | [ 0 ] Continuar | [ 1 ] Vitoria
    int jogada = 0;     // Soma dos dados
    int ponto = 0;      // Objetivo de vitoria (a partir da segunda jogada)
    
    srandom(time(NULL));

    // Primeira rodada
    jogada = lancarDado() + lancarDado();

    if (jogada == 7 || jogada == 11) {
        status = 1;
    } else if (jogada == 2 || jogada == 3 || jogada == 12) {
        status = -1;
    } else {
        status = 0;
        ponto = jogada;

        // Rodadas subsequentes
        while (status == 0) {
            jogada = lancarDado() + lancarDado();

            if (jogada == ponto) {
                status = 1;
            } else if (jogada == 7) {
                status = -1;
            }
        }
    }

    if (status == -1) {
        printf(">> voce perdeu. \n");
    } else {
        printf(">> voce venceu. \n");
    }

    return EXIT_SUCCESS;
}

/**
 * Realiza a jogada de um dado.
 *
 * @return Um inteiro aleatorio entre 1 (inclusive) e 6 (inclusive).
 */
int lancarDado() {
    return (int) random() % 6 + 1;
}

Leia o código com calma, e atente-se principalmente ao loop dentro else.

  • Curtir 1
Postado

o problema é apenas q é iniciante, e provável não esta nesse nível, já da pra ver pelo código inicial....onde as partes estão apenas jogadas ali....

 

me lembrei ate da primeira faculdade, trocávamos cola pela rede, tinha gente q colocava o código no compilador lindo sem nenhum erro, o professor pedia pra compilar o sujeito olhava pro professor com aquela cara, de o q é isso? kkkkkkk não tinha nem como disfarçar....

Postado

Todos são ou já foram iniciantes alguma vez, afinal, temos que começar de algum lugar. Às vezes lendo um código para um determinado problema ajuda a aprender alguma técnica que pode ser útil mais para frente. Hoje pode ser apenas uma cola, mas amanhã pode se deparar com um problema, cuja a resposta de hoje ajuda na solução. Isso se a pessoa, copia e estuda, agora se copia, cola e só entrega, aí não tem jeito...

  • Curtir 1
Postado

@AdrianoSiqueira eu consegui fazer porém ele abre numa tela preta falando pra apertar qualquer chave pra continuar, eu aperto mas ele volta pra página do código, ou seja, não consigo fazer rodar pra jogar e dessa vez ele não aponta nenhum erro. você sabe me dizer o que está acontecendo?

Postado
48 minutos atrás, Isadora Moretti disse:

eu consegui fazer porém ele abre numa tela preta falando pra apertar qualquer chave pra continuar

 

Então talvez não tenha conseguido fazer 🤔

Poste o código como está agora.

Postado

@arfneto

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

int main()

{

{


    int lancarDado(); // dado1, dado2,
    int status = 0; // [-1] derrota || [0] continuar || [1] vitoria
    int jogada = 0; // soma do dados
    int ponto = 0; // objetivo de vitoria ( a partir da segund rodada)
    long semente;

    time(&semente);
    srand((unsigned)semente);
    lancarDado = 1 + rand()%6;
    lancarDado = 1 + rand()%6;

    system("PAUSE");
    return 0;

}

  // primeira rodada

     jogada = lancarDado() + lancarDado();

    if(jogada == 7 || jogada == 11)
 {
     status = 1;

 } else if(jogada == 2 || jogada == 3 || jogada == 12){
    status = -1;
 } else {
    status = 0;
    ponto = jogada;
 }


    // rodadas subsequentes
{

     while (status == 0)
        jogada = lancarDado() + lancarDado();

     if(jogada = ponto){

       status = 1;
   } else if (jogada == 7)
    {
        status = -1;
    }
}

    if(status == -1)
    {
        printf (">> voce perdeu.\n");
    }
    else
    {
        printf (">> voce venceu.\n");
    }

   system ("PAUSE");
   return 0;
}

ele diz que eu nao declarei as variáveis ponto, status e jogada e isso aqui |22|error: lvalue required as left operand of assignment| na linha 22 e 23 

  • Curtir 1
Postado

@Isadora Moretti Boa Noite

 

Esse exame não tem referência na rede do fórum, você será a primeira.

 

Porém o livro intitulado por; Como programar em C (P&H Deitel) tem uma seção que recordo ser dedicada aos assuntos e encerra exemplificando esse programa.

 

Vale conferir.

Postado

Escreva seu programa em torno dos dados. Sempre em torno dos dados. E entenda que cada linha deve ter uma intenção. 

Assim como as linguagens como Português as linguagens de programação tem uma gramática e uma sintaxe rigorosa e você precisa se acostumar com um mínimo delas antes de escrever um programa assim.

Veja por exemplo, de seu programa:
 


int main()
{

    {


        int lancarDado(); // dado1, dado2,
        int status = 0; // [-1] derrota || [0] continuar || [1] vitoria
        int jogada = 0; // soma do dados
        int ponto = 0; // objetivo de vitoria ( a partir da segund rodada)
        long semente;

        time(&semente);
        srand((unsigned)semente);
        lancarDado = 1 + rand() % 6;
        lancarDado = 1 + rand() % 6;

        system("PAUSE");
        return 0;

    }

 

E compare com o programa que escreveu antes desse, porque imagino que esse não seja o primeiro.

 

Não disse que sistema ou compilador ou IDE usa, mas esses ambientes hoje em dia até mostram onde começa e termina cada bloco de parenteses ou de chaves.

 

Exemplo
 

image.png.ae9c3691cdbba921dc3cb8e84fe4c4a5.png


Esse trecho é em outra linguagem, javascript, mas não importa: está bem no tópico: note que o editor até muda a cor das chaves para você saber qual termina onde e ficar mais fácil de ver se tem algo errado. Claro que seria igual para C mas estou com pressa e só quero mostrar um argumento. A chave amarela fecha com a amarela , a rosa com a rosa, a azul com a azul. É igual para os parenteses e você pode até escolher as cores. Meigo.

 

Se seu  editor faz essas coisas use. Se não tem considere mudar de ambiente...
 

De volta ao seu programa

 

Se pretendia declarar lancarDado() como função não devia colocar DENTRO do bloco de main().
 

Outro exemplo
 

O editor usado abaixo tem esses botões marcados + e - que permitem fechar um bloco de chaves. Veja o par dentro de main() em seu programa: é a função, que devia estar lá fora. A tal sintaxe...
 

image.png.deca77ff77c8aff5c53bf8dbec67f2e7.png

 

A parte que está lá {  ... } é a função... Pois é: está bem errado.

 

Colocando no lugar certo vai agradar ao compilador, mas também continua errado: 

 

Dentro de sua função:
 


        time(&semente);
        srand((unsigned)semente);
        lancarDado = 1 + rand() % 6;
        lancarDado = 1 + rand() % 6;

        system("PAUSE");

 

Como eu disse, não escreva uma única linha sem razão. Que acha que vai conseguir rodando duas vezes exatamente a mesma coisa? aquela linha lancarDado = duplicada?

pode fazer aquilo por toda a eternidade e ao final, estilo HighLander, só resta um: o último resultado. Mais ainda: em C você não atribui o resultado ao nome da função: você retorna em comandos return.

 

E essa chamada de srand() está totalmente perdida aí. Você roda isso uma única vez no início do programa se precisa garantir um reinício de sequencia para os valores gerados. Não pode ficar na linha anterior.

 

Recomendo muito ter um livro ou dois. E ler esses livros. E ler programas prontos. Pequenos programas como os muitos que tem aqui no forum.

 

E essa chamada a system() não tem sentido: se funcionar, vai apenas parar seu programa. Evite isso a todo custo. Em empresas e muitas escolas é proibido. Imagine que alguém consiga colocar um programa chamado PAUSE.EXE no lugar do "PAUSE" que você está imaginando. Provavelmente não será para boa coisa. E adivinhe de quem será a culpa do prejuízo?

 

Provavelmente quase todo o sistema que você usa. incluindo aí a função system() o comando pause, o compilador e tal, tudo isso foi escrito em C então deve ter um jeito de parar um programa em C mais simples que chamar uma função para rodar um comando.

 

E se ele parar o que você espera? Não mostrou nada na tela. Que espera que aconteça? Vou antecipar a surpresa: Nada iria acontecer.

 

Esse trecho em main()
 

 if (jogada == 7 || jogada == 11)
    {
        status = 1;
    }
    else if (jogada == 2 || jogada == 3 || jogada == 12) {
        status = -1;
    }
    else {
        status = 0;
        ponto = jogada;
    }

 

Está ruim demais para ler. Só vai te atrapalhar. Se está aprendendo use chaves em todas as condições. Compare
 

Citação

    if (jogada == 7 || jogada == 11)
    {
        status = 1;
    }
    else
    {
        if (jogada == 2 || jogada == 3 || jogada == 12)
        {
            status = -1;
        }
        else
        {
            status = 0;
            ponto = jogada;
        }
    }

 

 

Isso aqui abaixo não funciona, mas está de acordo com a sintaxe ao menos:


 

int     lancarDado()
{
    int resultado = 1 + rand() % 6;
    return resultado;
};  // lancarDado()

 

Que pretende com essas chaves no meio do programa?

    // rodadas subsequentes
    {
        while (status == 0)
            jogada = lancarDado() + lancarDado();

        if (jogada = ponto) {

            status = 1;
        }
        else if (jogada == 7)
        {
            status = -1;
        }
    }

 

Atenção para o comando ( jogada = ponto) isso em geral está errado. Se quer comparar o operando é ==.

 

Será que o comando while() deveria estar fora das chaves? ...

 

E se for quem vai mudar status para zero para sair do loop? ninguém. Não vai sair nunca mais... Não seria status == 1 a condição?

 

Esse código abaixo não serve para nada, mas tem a sintaxe correta. Pode ajudar você a ver como construir o seu programa. É apenas o seu programa corrigido a olho, só para consertar a sintaxe

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

int lancarDado()
{
    int res = 1 + rand() % 6;
    return res;
}

int main()
{
    int status = 0; // [-1] derrota || [0] continuar || [1] vitoria
    int jogada = 0; // soma do dados
    int ponto = 0; // objetivo de vitoria ( a partir da segund rodada)
   
    srand(20200914);

    // primeira rodada
    jogada = lancarDado() + lancarDado();

    if (jogada == 7 || jogada == 11)
    {
        status = 1;
    }
    else
    {
        if (jogada == 2 || jogada == 3 || jogada == 12)
        {
            status = -1;
        }
        else
        {
            status = 0;
            ponto = jogada;
        }
    };

    // rodadas subsequentes
    while (status == 0)
    {
        jogada = lancarDado() + lancarDado();
        if (jogada == ponto)
        {
            status = 1;
        }
        else
        {
            if (jogada == 7)
            {
                status = -1;
            }
        }
    };  // while()

    if (status == -1)
    {
        printf(">> voce perdeu.\n");
    }
    else
    {
        printf(">> voce venceu.\n");
    }
    system("PAUSE");
    return 0;
}

 

 

 

 

 

image.png

adicionado 1 minuto depois
4 horas atrás, Isadora Moretti disse:

mas nao entendi muito bem as variáveis que ele usa 

 

Você pode postar um trecho disso, citando a fonte, e perguntar sobre o que não entendeu. Num forum como esse não é crime. De repente alguém sabe explicar.

  • Curtir 1
Postado

@arfneto Eu postei esse código no tópico #8, mas parece que a autora do tópico tentou reescrever o código e acabou fazendo confusão com as chaves.

 

O código que eu postei funciona de forma autônoma, sem interação com o usuário. Possui 3 variáveis, uma armazena a soma das faces dos dados, outra indica se o jogo foi ganho, perdido ou se deve continuar, e a terceira é o valor de objetivo da vitória, caso o jogo não tenha se resolvido na primeira jogada.

 

11 horas atrás, arfneto disse:

Isso aqui abaixo não funciona, mas está de acordo com a sintaxe ao menos:


 


int     lancarDado()
{
    int resultado = 1 + rand() % 6;
    return resultado;
};  // lancarDado()

Não entendi essa parte, por que não funciona?

  • Curtir 2
Postado
51 minutos atrás, AdrianoSiqueira disse:

Não entendi essa parte, por que não funciona?

 

:) Não foi uma boa expressão minha. É só para que ela não imagine que isso é uma solução. Na verdade é algo desconexo: Apenas alterei as linhas para compilar para ela ver a sintaxe. 

A rotina em si com todas as suas 4 linhas e uma variável desnecessária funciona

 

Para esse jogo não é muito esperta já que NUNCA se joga um dado por vez então deveria retornar o par. Ou mesmo a soma se não vai mostrar os valores em separado
 

Normalmente se usaria um vetor com as combinações indo direto como índice de uma matriz com algo para mostrar na tela, tipo um desenho com o dado ou o simples número

adicionado 1 minuto depois
57 minutos atrás, AdrianoSiqueira disse:

parece que a autora do tópico tentou reescrever o código e acabou fazendo confusão com as chaves

 

uma confusão mais generalizada, como está acima, certo? 🤔

Postado
2 horas atrás, helda correia disse:

@arfneto voce sabe como eu posso apagar minhas postagens ou se tem alguem que pode apagar por mim?

 

Os moderadores podem apagar. O autor eu acho que não nesse modelo do forum. Mas pode pedir a um dos moderadores na lista

Postado
16 minutos atrás, helda correia disse:

e como eu peço? porque não consigo mandar mensagem...

 

você não pode clicar no envelope no início e digitar uma mensagem para um deles? o que acontece?

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...