Ir ao conteúdo

Posts recomendados

Postado

Segue o código base para a questão 1 com lacunas indicando trechos de código faltantes.
#include <stdio.h>
#include <string.h>
______________________________           // ---------- Aqui falta a biblioteca necessária para idioma - 0.1 ponto

int main()
{
    char resposta[20];  
    int erros;          
    int acertos;         
    char letra;          
    int i, j;            
    int max;            
 
    __________________________    // --------- Aqui falta a definiçao de idioma - 0.1 ponto

    printf("************ Jogo da Forca ************\n");        
    printf("************** Jogador 1 **************\n\n");
    printf("Utilize apenas letras minúsculas.\n");
    printf("Máximo de 20 letras\n\n");

    letra = ' '; max = 1;             
    for (i = 1; i <= 20; i++) {   
        resposta = ' ';   
    }
    erros = 0; acertos = 0;

    printf("Digite a palavra secreta: ");
    scanf (" %s", resposta);
    max = strlen (resposta);
    system("clear||cls");  
        
    printf("************ Jogo da Forca ************\n");   
    printf("************** Jogador 2 **************\n\n");
    printf("Utilize apenas letras minúsculas.\n");
    printf("Limite de 6 erros. Palavra de até 20 letras\n\n");

    while _________________________________      // Aqui falta a condição de parada do laço - 0,3 ponto
    {
          printf("Digite uma letra: ");
          scanf (" %c", &letra);
          j = 0;
          for (i = 0; i <= max; i++)
          {
               if (resposta == letra)
               {
                   acertos++; j++;
                   printf ("\nAcertos: %d - Erros: %d\n",acertos, erros);
               }
          }
          if (j <= 0)      
                erros++;

\* ------------------- Aqui falta a parte responável pela verificação de vitoria ou derrota ----------------------*/



\* -------------------------------------- Final da Verificação ----------------------------------------------------------------*/

    }
    return (0);
}
 

adicionado 1 minuto depois

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

char palavra[20];
char forca[20];
char tentativa;
int chances = 5;
int letras, i, j=0, cont;

int start(void)
{

    printf("\nDigite uma palavra: ");
    fgets(palavra, 20, stdin);

    trimEnd(palavra);

    strcpy(forca, palavra);
    letras = strlen(forca);

    for (i=0; i<letras; i++)
    {

        forca=  '_';

    }
}

int jogo(void)
{

    while(chances > 0)
    {

        __fpurge(stdin);
        printf("\nChances: %d - palavras tem %d letras\n\n", chances, letras);

        for (i=0; i<letras; i++)
        {

            printf("\n%c ", forca);

        }

        printf("\n\nDigite uma letra: ");
        scanf("%c", &tentativa);


        cont = 0;

        for (i=0; i<letras; i++)
        {

            if (palavra == tentativa)
            {

                forca == tentativa;
                cont = cont + 1;
                j++;

            }

        }

        if (cont <= 0)
        {

            chances = chances - 1;

        }

        system("clear");

        if (j == letras)
        {

            break;
        }

    }
}

int resultado(void)
{

    if(chances == 0)
    {

        __fpurge(stdin);
        printf("\nChances: %d - palavra tem %d letras\n\n", chances, letras);
        puts(forca);
        printf("\nVocê perdeu. \nA palavra era: ");
        puts(palavra);


    }
    else
    {

        printf("\nParabens, voce acertou a palavra ", chances, letras);
        puts(palavra);

    }

}

void trimEnd(char *str) { //Tira o \n que o fgets lê junto com a variavel pra ir para a ultima linha
    char *end = str + strlen(str) - 1;
    while (end > str && isspace(*end)) end--;
    end++;
    *end = 0;
}

int main()
{

    start();
    system("clear");
    jogo();
    resultado();

    return(0);
}

  • Curtir 1
Postado

@Tiago Mendes Fernandes   Opa   ,  o quê significa o código fal ? ,   e para postar seu código é melhor usar o botão  <>  que está desenhado lá na barra de ferramentas da janela de postar

barap.jpg.dbd31b0e5ca57ebd982b8294b49f933e.jpg

         para que seu código não fique faltando nenhum caractere como os   [ i  ]  que sumiram do seu segundo código , e ele não está funcionando ,  e o código de cima , o primeiro , já foi postado algumas vezes por aqui ,  mas creio que o que você queira mesmo é alguma ajuda para fazer seu código funcionar bem , então diga-nos quais são suas dúvidas e se precisa de ajuda ou não , é apenas para que outros estudantes possam se beneficiar com seu trabalho nesse exercício .

  • Curtir 1
Postado

Você não pode mudar o programa e criar novas variáveis. apenas preencha onde estão os __ com algo que resolva o problema, usando o que já está lá

 

adicionado 7 minutos depois

isso está sendo discutido também aqui
 

 

É um jogo de forca afinal

 

Como você sai  do while? 


Duas opções: ou você acertou a palavra ou se enforcou. Isso já está sendo controlado no código. E como seriam duas condições em C?

( A || B ) ou mesmo (!A && !B) dependendo de seu gosto. As variáveis já estão lá.

 

Como define 

        /* ----- Aqui falta a parte responsavel pela verificação
                 de vitoria ou derrota 
                 
                 
           -------------------- */


o que por aqui dentro?
 

É a mesma coisa e essa é a óbvia primeira melhoria do programa, já que ele testa duas vezes exatamente a mesma coisa. Bem ingênuo o programa...

 

  • Curtir 1
Postado

@Tiago Mendes Fernandes Oi Tiago muito obrigado pela explicação. Tirou as minhas duvidas. Eu rodei o código do Code::blocks e não rodou, sera que é algum problema no próprio CODE::BLOCKS? 

adicionado 24 minutos depois

@devair1010 Eu gostaria de saber como resolver o código em anexo. A segunda parte eu queria alguma ideia de alguem mais experiente na area que possa me direcionar para melhorar o código, criando um bonequinho como utilizamos quando brincamos com papel e caneta. Mas no primeiro instante, eu queria saber como eu resolvo essa atividade. eu ja tentei de varias formas e não consegui.

  • Curtir 1
Postado
2 minutos atrás, Danilo Anderson disse:

Oi Tiago muito obrigado pela explicação. Tirou as minhas duvidas

 

 

@Tiago Mendes Fernandes @Danilo Anderson 
Vocês estão indo no caminho errado. Talvez não tenha lido o que eu escrevi neste e no outro tópico: Nesse tipo de exercício você não pode criar novas variáveis e ir escrevendo um novo programa. Tem que usar soluções com a lógica E AS VARIÁVEIS que estão lá. É como aqueles exercícios dos livros de introdução a idiomas.

 

Você não pode criar uma nova variável chances e colocar na no while... Seria muita esperança isso estar certo. Pra que teria então o lance de lacunas então e aquela frescura de __________________ e tal?

 

E qual o propósito de mudar char resposta[20]; para char forca[20]; e inicializar com '_' ao invés de espaço se não vai sequer mostrar na tela?

 

E eu praticamente escrevi o que está faltando há pouco. No loop e no trecho de código a ser inserido entre os comentários, que é praticamente o mesmo como eu também descrevi.

 

7 minutos atrás, Danilo Anderson disse:

Eu rodei o código do Code::blocks e não rodou, sera que é algum problema no próprio CODE::BLOCKS? 


Dificilmente. Code::blocks sequer inclui um compilador. E o compilador que está usando não deveria ter dificuldade com esse trecho de código. É um programa simples. O problema está no código mesmo.

 

Acompanhe. Porque não postou o erro específico?

 

image.png.a356db99137d1bf775c891c74f2e5af6.png

 

 

 

Uma coisa já está clara: por alguma razão o autor mudou até o nome da variável do enunciado, de 

char resposta[20];

// para

char forca[20];

Mas não corrigiu o erro no programa original, que eu havia até listado aqui
 

image.png.233ece7059f3b8c92f0918f96b33e4d4.png

 

Onde está o índice do char[20] para usar no loop? Que tal trocar por forca?

 

Ainda sobre esse programa:

 

  • start() chama trimEnd() que não está declarada. Que tal usar protótipos e deixar main() como a primeira função do programa, ficando mais de acordo com os bons costumes e facilitando a sua vida e de quem vai ler seu programa?
     
jogo() chama __fpurge() e não está declarado. Pra que isso? Não era preciso, mas se queria mesmo esvaziar o buffer do teclado poderia usar um loop. Ou apenas no windows o simples e recomendado em uma linha só, direto de windows.h:
    int c = FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
        for (i=0; i<letras; i++)
        {
            printf("\n%c ", forca);
        }

Aqui abaixo tem o mesmo erro do programa original, que eu também já listei aqui mesmo. forca é um char[20]. Cade o índice? Sim, era o ' i '

 

            if (palavra == tentativa)

Mais do mesmo erro: palavra é char[20], tentativa é um char. Não dá pra comparar

 

Ainda sobre trimEnd()

void trimEnd(char *str)
{ 
//Tira o \n que o fgets lê junto com a variavel pra ir para a ultima linha
    char *end = str + strlen(str) - 1;
    while (end > str && isspace(*end)) end--;
    end++;
    *end = 0;
}

 

Porque o nome em inglês?


Você está fazendo um loop pela str inteira para achar o '\n'.


Só que se leu com fgets() sabe que o '\n'  é o último caracter do vetor porque foi ele que marcou o fim pra gets() ou porque o arquivo terminou e fgets() fez a gentileza de colocar um newline no fim pra você.


Então escreva o simples

        str[ strlen(str) -1] = 0; // fgets() GARANTE que str termina com um '\n'

sem loop e sem função. É só isso. Só uma posição que quer mudar, Sempre a última. 

 

De volta ao exercício


 

Citação

 

Duas opções: ou você acertou a palavra ou se enforcou. Isso já está sendo controlado no código. E como seriam duas condições em C?

 

 

Afinal como eu sei que acertou a palavra, a vitória?

    acertos >= max

Afinal como eu sei se o usuário "se enforcou", a derrota

    erros < 6

Afinal até quando fica no loop

    while ((erros < 6) && (acertos<max))

claro.
 

Afinal como eu sei se teve vitória ou derrota

        if (erros >= 6)
            printf("Derrota com %d erros\n", erros);
        else
            if (acertos >= max)
                printf("Vitoria com %d erros\n", erros);

E assim podem concluir o código original, só com o que está lá e corrigindo os erros do original, os 2 que mostrei no início

 

  • Curtir 1
Postado
4 minutos atrás, Danilo Anderson disse:

Cara ele não rodou, fiz tudo que me explicou

 

Não, não fez.

 

E eu listei num primeiro momento os erros do programa original e onde tinha que mudar

E recentemente os erros nesse novo programa

E disse onde mudar o programa original para ele rodar. São só 4 pontos se bem me lembro: as 3 lacunas e a parte da decisão...

 

Não postou o seu código onde "fez tudo que eu expliquei"...

 

Compare com esse que tem ate os // __X__ //

 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <locale.h> // __1__ 
// ---------- Aqui falta a biblioteca necessária para idioma - 0.1 ponto
#include <locale.h> // __1__ 

int main()
{
    char resposta[20];
    int erros;
    int acertos;
    char letra;
    int i, j;
    int max;

    //__2__
    // --------- Aqui falta a definiçao de idioma - 0.1 ponto
    setlocale(LC_ALL, "C");
    printf("************ Jogo da Forca ************\n");
    printf("************** Jogador 1 **************\n\n");
    printf("Utilize apenas letras minúsculas.\n");
    printf("Máximo de 20 letras\n\n");

    letra = ' '; max = 1;
    for (i = 0; i < 20; i++)
    {
        resposta[i] = ' ';
    }
    erros = 0; acertos = 0;


    printf("Digite a palavra secreta: ");
    scanf(" %s", resposta);
    max = strlen(resposta);
    //system("clear||cls");

    printf("************ Jogo da Forca ************\n");
    printf("************** Jogador 2 **************\n\n");
    printf("Utilize apenas letras minúsculas.\n");
    printf("Limite de 6 erros. Palavra de até 20 letras\n\n");
// __ 3 __
// Aqui falta a condição de parada do laço - 0,3 ponto
    while ((erros < 6) && (acertos<max))
    {
        printf("Digite uma letra: ");
        scanf(" %c", &letra);
        j = 0;
        for (i = 0; i <= max; i++)
        {
            if (resposta[i] == letra)
            {
                acertos++; j++;
                printf("\nAcertos: %d - Erros: %d\n",
                    acertos, erros);
            };  // if()
        };  // for()
        if (j <= 0) erros++; // nao tinha essa letra

        /* ----- Aqui falta a parte responsavel pela verificação
                 de vitoria ou derrota 
           --------------------
         */
        if (erros >= 6)
            printf("Derrota com %d erros\n", erros);
        else
            if (acertos >= max)
                printf("Vitoria com %d erros\n", erros);
        /* --------------------------------------Final da Verificação
        ---------------------------------------------------------------- */
        */
    };  // while()
    return (0);
}

 

 

 

  • Curtir 2
  • Obrigado 1
  • Amei 1
Postado

@arfneto Cara, meu código no outro tópico estava basicamente assim, exceto por : 

Em 11/07/2020 às 17:55, arfneto disse:

if (erros >= 6) printf("Derrota com %d erros\n", erros); else if (acertos >= max) printf("Vitoria com %d erros\n", erros);

rsrs

Por isso eu estava confuso. Me desculpe a confusão, mas não havia visto esse outro tópico por ser novo aqui no forum e não ter entendido que havia postado um link na primeira TAB do outro tópico! 

Eu estava fazendo confusão devido a "fragilidade" do sistema postado e por está tentando achar uma solução para as letras que já foram digitas serem contadas como certas, coisa que entra na questão 2 da atividade, onde são propostas as melhorias para o programa!

  • Obrigado 1

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!