Ir ao conteúdo
  • Cadastre-se

Julia_Lucia

Membro Júnior
  • Posts

    13
  • Cadastrado em

  • Última visita

posts postados por Julia_Lucia

  1. Olá, estou com dificuldade para resolver o seguinte problema:

    Um supermercado possui vários relatórios antigos em formato de texto (.txt) e precisa modificá-los de uma forma eficiente. Cada arquivo de relatório contém uma lista de produtos, onde cada linha representa um produto. Cada produto têm 3 atributos, nome (sem espaços), código, e preço unitário, separados por espaço. Cada relatório terá o formato como do exemplo abaixo:

    cafe 11 6.42

    leite 43 3.2

    feijao -1 6.7 o

    leo 234 6.0

    peixe 1 38383749.2

     

    Entretanto muitos produtos de cada relatório estão corrompidos, código igual a -1 ou valores absurdos (valor acima de 9999.0). Você foi contratado para solucionar esse problema, para isso você deve construir um programa que execute os seguintes passos:

    • Inicializar um vetor que representa uma lista de produtos;

    • Ler um relatório chamado “relatorio_corrompido.txt”

    • Imprimir os produtos válidos;

    • Salvar a lista de produtos válidos no arquivo “relatorio_processado.txt”.

     

    Apresente um programa em C que solucione o problema do supermercado segundo as regras abaixo:

    1) Criar uma estrutura para representar os produtos do supermercado, esta estrutura deve conter: Nome – string, Código – int, e Preço unitário – float

    2) Criar uma função para imprimir uma lista de produtos. Produtos inválidos não devem ser impressos.

    3) Criar uma função que lê os produtos de um arquivo txt e coloca em um vetor de produtos. A função deve receber como entrada um vetor de produtos e uma string que representa o nome do arquivo.

    4) Criar uma função que escreve para um arquivo txt os produtos válidos e não corrompidos presentes na lista do mercado. A função deve receber como entrada um vetor de produtos e uma string que representa o nome do arquivo.

    5) Realizar os passos para solucionar o problema do mercado usando a estrutura “produto” e chamando as funções criadas nos tópicos 1 a 4 na função main:

       a. Inicializar um vetor que possui uma lista de produtos;

       b. Ler um relatório chamado “relatorio_corrompido.txt” e armazenar em um vetor de produtos;

       c. Imprimir os produtos válidos;

       d. Salvar a lista de produtos validos e não corrompidos no arquivo “relatorio_processado.txt”.

     

    Restrições do seu programa:

    • O tamanho máximo do nome de um produto é 128 caracteres considerando o caractere ‘\0’. Ou seja 127 + ‘\0’.

    • A capacidade máxima do supermercado é de 32768 produtos;

    • Os vetores devem ser passados para as funções por referência.

     

    Desenvolvi isso aqui:

    #include <stdio.h>
    
    #define MAX_PRODUTOS 2064
    #define PRODUTO_INVALIDO -1
    
    typedef struct
    {
        char nome[128];
        int codigo;
        float preco;
    }produto;
    
    
    void imprime_produto(produto pr)
    {
        printf("%s ", pr.nome);
        printf("%d ", pr.codigo);
        printf("Preço unitário: %.2f\n", pr.preco);
    }
    
    void leitura_produtos(char *relatorio_corrompido, produto*produtos)
    {
        FILE *ac = fopen(relatorio_corrompido, "r");
    
        if (ac != NULL)
        {
            int elements = 0;
            for(int i = 0 ; i < MAX_PRODUTOS ; i++, elements++)
            {
                produto pr;
                int retorno = fscanf(ac, "%s %d %f", pr.nome, &pr.codigo, &pr.preco);
                produtos[i] = pr;
                if (feof(ac) || retorno != 5)
                {
                    break;
                }
            }
            for(int i = elements; i < MAX_PRODUTOS; i++)
            {
                produtos[i].codigo = PRODUTO_INVALIDO;
            }
            fclose(ac);
            }
            else
            {
                printf("Arquivo %s nao foi aberto\n", relatorio_corrompido);
                exit(-1);
            }
        }
    
    void imprime_produtos(produto *produtos)
        {
            for(int i = 0; i < MAX_PRODUTOS; i++)
            {
                if (produtos[i].codigo != PRODUTO_INVALIDO && produtos[i].preco <= 9999.0)
                {
                imprime_produto(produtos[i]);
                }
            }
        }
    
    void escreve_produtos(char *relatorio_processado, produto *produtos)
        {
            FILE *ap = fopen(relatorio_processado, "w");
    
            if (ap !=NULL)
            {
                for(int i = 0 ; i < MAX_PRODUTOS; i++)
                {
                    produto a = produtos[i];
    
                    if (a.codigo != PRODUTO_INVALIDO && a.preco <= 9999.0)
                    {
                        fprintf(ap, "%s %d %.2f", a.nome, a.codigo, a.preco);
                    }
                }
                fclose(ap);
            }
            else
            {
                printf("Arquivo %s nao foi aberto\n", relatorio_processado);
                exit(-1);
            }
        }
    
    
    int main(){
        char nome_entrada[] = "relatorio_corrompido.txt";
        char nome_saida[] = "relatorio_processado.txt";
    
        produto produtos[MAX_PRODUTOS];
        leitura_produtos(nome_entrada, produtos);
        imprime_produtos(produtos);
        escreve_produtos(nome_saida, produtos);
    return 0;
    }

    Alguém sabe o que estou errando?

  2. @Lucca Rodrigues Estava errando uma coisa muito boba. Quando fui digitar a ideia que você passou usei aspas simples no r e por isso não estava funcionando. Agora está tudo certo. Muito obrigada!!!

    O código final ficou assim:

    #include <stdio.h>
    #include <locale.h>
    
    int main (){
    
        setlocale(LC_ALL, "Portuguese");
    
        int versos = 0, estrofes = 0;
        char texto[100], nome[501];
    
        printf ("Digite o diretório do arquivo texto: ");
        gets(nome);
    
        FILE * fp = fopen (nome, "r");
        if(fp == NULL)
        {
            printf("Erro ao abrir o arquivo!");
            return 0;
        }
    
        printf("\nPoema:\n\n");
        while(!feof(fp))
        {
            fgets(texto, 100, fp);
            printf("%s", texto);
            if (strlen(texto) < 99 && strlen(texto) > 1)
            {
                versos++;
            }
            else if (strlen(texto) == 1)
            {
                estrofes++;
            }
        }
        if (versos == 0)
        {
            printf("\nArquivo vazio");
        }
        else
        printf("\n\nO arquivo com o poema acima tem %d versos e %d estrofes.\n", versos, estrofes+1);
    
        fclose(fp);
        return 0;
    }

     

    • Curtir 1
  3. Boa noite pessoal, estou desenvolvendo um programa para o seguinte problema:

     

    "Faça um programa que leia um arquivo de texto contendo um poema e exiba na tela quantos versos e quantas estrofes tem o poema, sendo cada verso uma linha com palavras e cada estrofe um bloco de versos separado do bloco anterior por uma linha em branco. O nome do arquivo deverá ser informado pelo usuário e o arquivo não deverá ser alterado.

     

    Exemplo: O arquivo com o poema a seguir tem 4 versos e 2 estrofes:

    Batatinha quando nasce

    Espalha a rama pelo chão

     

    Menininha quando dorme

    Poe a mão no coração

     

    Dica: Uma linha em branco não é um verso.

     

    Atenção: O programa deverá obrigatoriamente manipular arquivos texto."

     

    A parte de contar os versos e estrofes eu consegui fazer, mas não tem jeito de dar certo pra renomear o arquivo como o exercício pede.

     

    O que desenvolvi até o momento é o seguinte:

     

    #include <stdio.h>
    #include <locale.h>
    
    
    int main (){
    
        setlocale(LC_ALL, "Portuguese");
    
        FILE * fp;
        int versos = 0, estrofes = 0;
        char texto[100];
        fp = fopen("poema.txt", "r");
        if(fp == NULL)
        {
            printf("Erro ao abrir o arquivo!");
            return 0;
        }
    
        printf("Poema:\n");
        while(!feof(fp))
        {
            fgets(texto, 100, fp);
            printf("%s", texto);
            if (strlen(texto) < 99 && strlen(texto) > 1)
            {
                versos++;
            }
            else if (strlen(texto) == 1)
            {
                estrofes++;
            }
        }
        if (versos == 0)
        {
            printf("\nArquivo vazio");
        }
        else
        printf("\n\nO arquivo com o poema acima tem %d versos e %d estrofes.\n", versos, estrofes+1);
    
        fclose(fp);
        return 0;
    }

     

    Sendo que o arquivo.txt está salvo na mesma pasta que o programa e já está com o poema gravado nele.

     

    Alguém pode me ajudar??? 

    • Curtir 1
  4. 1 hora atrás, Lucca Rodrigues disse:

    @Julia_Lucia Não são 5 notas? Por que então os vetores de float surf1, surf2 e surf3 tem espaço para 4 notas somente? A constante MAX deveria ser 5.

    E por que o vetor das médias tem espaço para 2 médias somente? Acho que você não entendeu muito bem como funcionam vetores:

    O primeiro elemento do vetor tem índice 0, o segundo, índice 1, e assim por diante, digamos algo como:

    
    int notas[5];

    Logo, o comprimento desse vetor é 5, começando pelo índice 0 e indo até 4.

     

    O argumento é o vetor de 5 notas, nada mais.

    Você já sabe que o comprimento é 5, então você não precisa que o comprimento seja argumento da função.

    Daí, bastam 2 loops: 1 para obter a maior e a menor nota, outro para efetuar a soma das médias.

     

    O argumento desta outra função é um vetor com as 3 médias, então nada de colocar o tamanho do vetor como argumento de novo.

    Você não precisa dessas variáveis m1, m2 e m3, em vez disso, faça algo como:

    
    float medias[3];
    
    medias[0] = media(surf1);
    printf("Média do surfista 1: %.2f\n", medias[0]);
    medias[1] = media(surf2);
    printf("Média do surfista 2: %.2f\n", medias[1]);
    medias[2] = media(surf3);
    printf("Média do surfista 3: %.2f\n", medias[2]);
    
    vencedor(medias);

     

    Têm algumas coisas desnecessárias nesse seu programa, como mais da metade das bibliotecas (que não estão em uso), e também aquela função srand() dentro da main(), ela não tem uso nesse programa.

     

    Para fazer a função vencedor(), você pode usar essa árvore de possibilidades:

    image.png.bb20e6273d2c81b210a5d312c48c7968.png

    Onde 'a' corresponde à medias[0], 'b' corresponde à medias[1] e 'c' corresponde à medias[3].

    Por fim, sua função vencedor() deve ser do tipo void(), já que ela não tem retorno.

     

    Teste isso:

    
    #include <stdio.h>
    #include <locale.h>
    
    #define MAX 5
    
    // Calcula a média
    float media (float notas[MAX])
    {
        int maior = 0, menor = 10, i;
        float media = 0;
    
        // Obter maior e menor nota
        for(i = 0; i < MAX; i++)
        {
            if (menor > notas[i])
            {
                /* Se a variável menor for maior
                que a nota em questão, novo valor
                é atribuído */
                menor = notas[i];
            }
            /* Note que são 2 condições separadas,
            uma não depende da outra, então
            nada de if e else */
            if (maior < notas[i])
            {
                /* Se a variável maior for menor
                que a nota em questão, novo valor
                é atribuído */
                maior = notas[i];
            }
        }
        // Obter a soma
        for(i = 0; i < MAX; i++)
        {
            if(notas[i] != menor && notas[i] != maior){
                /* Se a nota for diferente da menor
                e da maior nota, efetuar a soma */
                media += notas[i];
            }
        }
    
        media /= 3;
        return media;
    }
    
    // Calcula o vencedor e imprime na tela o ranking
    void vencedor (float medias[3])
    {
        // Árvore de possibilidades
        if (medias[0] > medias[1]){
            if(medias[1] > medias[2]){
                printf("\n1º lugar = surfista 1 com média %.2f", medias[0]);
                printf("\n2º lugar = surfista 2 com média %.2f", medias[1]);
                printf("\n3º lugar = surfista 3 com média %.2f\n", medias[2]);
            } else if(medias[0] > medias[2]){
                printf("\n1º lugar = surfista 1 com média %.2f", medias[0]);
                printf("\n2º lugar = surfista 2 com média %.2f", medias[2]);
                printf("\n3º lugar = surfista 3 com média %.2f\n", medias[1]);
            } else{
                printf("\n1º lugar = surfista 1 com média %.2f", medias[2]);
                printf("\n2º lugar = surfista 2 com média %.2f", medias[0]);
                printf("\n3º lugar = surfista 3 com média %.2f\n", medias[1]);
            }
        } else if (medias[1] > medias[2]){
            if(medias[2] > medias[0]){
                printf("\n1º lugar = surfista 1 com média %.2f", medias[1]);
                printf("\n2º lugar = surfista 2 com média %.2f", medias[2]);
                printf("\n3º lugar = surfista 3 com média %.2f\n", medias[0]);
            } else{
                printf("\n1º lugar = surfista 1 com média %.2f", medias[1]);
                printf("\n2º lugar = surfista 2 com média %.2f", medias[0]);
                printf("\n3º lugar = surfista 3 com média %.2f\n", medias[2]);
            }
        } else{
            printf("\n1º lugar = surfista 1 com média %.2f", medias[2]);
            printf("\n2º lugar = surfista 2 com média %.2f", medias[1]);
            printf("\n3º lugar = surfista 3 com média %.2f\n", medias[0]);
        }
    }
    
    int main(){
    
        setlocale(LC_ALL, "Portuguese");
    
        int i;
        float surf1[MAX], surf2[MAX], surf3[MAX], medias[3];
    
        // Lê as notas
        for(i = 0; i < MAX; i++)
        {
            printf("Digite a %dº nota do surfista 1: ", i+1);
            scanf("%f" , &surf1[i]);
        }
    
        printf("\n");
    
        for(i = 0; i < MAX; i++)
        {
            printf("Digite a %dº nota do surfista 2: ", i+1);
            scanf("%f" , &surf2[i]);
        }
    
        printf("\n");
    
        for(i = 0; i < MAX; i++)
        {
            printf("Digite a %dº nota do surfista 3: ", i+1);
            scanf("%f" , &surf3[i]);
        }
    
        // Envia as notas para a função e armazena as médias em um vetor
        medias[0] = media(surf1);
        printf("Média do surfista 1: %.2f\n", medias[0]);
        medias[1] = media(surf2);
        printf("Média do surfista 2: %.2f\n", medias[1]);
        medias[2] = media(surf3);
        printf("Média do surfista 3: %.2f\n", medias[2]);
    
        vencedor(medias);
    
        return 0;
    }

    Muito obrigada!!!!

    Dê fato, tenho dificuldade de entender vetores 😕

    Fiz ainda algumas modificações no código:

    #include <stdio.h>
    #include <locale.h>
    
    #define MAX 5
    
    // Calcula a média
    float media (float notas[MAX])
    {
        int maior = 0, menor = 10, i;
        float media = 0;
    
        // Obter maior e menor nota
        for(i = 0; i < MAX; i++)
        {
            media = media + notas [i];
            if (menor > notas[i])
            {
                /* Se a variável menor for maior
                que a nota em questão, novo valor
                é atribuído */
                menor = notas[i];
            }
            /* Note que são 2 condições separadas,
            uma não depende da outra, então
            nada de if e else */
            if (maior < notas[i])
            {
                /* Se a variável maior for menor
                que a nota em questão, novo valor
                é atribuído */
                maior = notas[i];
            }
        }
        //calcula a media
        media = (media - menor - maior) / 3;
        return media;
    }
    
    // Calcula o vencedor e imprime na tela o ranking
    void vencedor (float medias[3])
    {
        // Árvore de possibilidades
        if (medias[0] > medias[1]){
            if(medias[1] > medias[2]){
                printf("\n1º lugar = surfista 1 com média %.2f", medias[0]);
                printf("\n2º lugar = surfista 2 com média %.2f", medias[1]);
                printf("\n3º lugar = surfista 3 com média %.2f\n", medias[2]);
            } else if(medias[0] > medias[2]){
                printf("\n1º lugar = surfista 1 com média %.2f", medias[0]);
                printf("\n2º lugar = surfista 3 com média %.2f", medias[2]);
                printf("\n3º lugar = surfista 2 com média %.2f\n", medias[1]);
            } else{
                printf("\n1º lugar = surfista 3 com média %.2f", medias[2]);
                printf("\n2º lugar = surfista 1 com média %.2f", medias[0]);
                printf("\n3º lugar = surfista 2 com média %.2f\n", medias[1]);
            }
        } else if (medias[1] > medias[2]){
            if(medias[2] > medias[0]){
                printf("\n1º lugar = surfista 2 com média %.2f", medias[1]);
                printf("\n2º lugar = surfista 3 com média %.2f", medias[2]);
                printf("\n3º lugar = surfista 1 com média %.2f\n", medias[0]);
            } else{
                printf("\n1º lugar = surfista 2 com média %.2f", medias[1]);
                printf("\n2º lugar = surfista 1 com média %.2f", medias[0]);
                printf("\n3º lugar = surfista 3 com média %.2f\n", medias[2]);
            }
        } else{
            printf("\n1º lugar = surfista 3 com média %.2f", medias[2]);
            printf("\n2º lugar = surfista 2 com média %.2f", medias[1]);
            printf("\n3º lugar = surfista 1 com média %.2f\n", medias[0]);
        }
    }
    
    int main(){
    
        setlocale(LC_ALL, "Portuguese");
    
        int i;
        float surf1[MAX], surf2[MAX], surf3[MAX], medias[3];
    
        // Lê as notas
        for(i = 0; i < MAX; i++)
        {
            printf("Digite a %dº nota do surfista 1: ", i+1);
            scanf("%f" , &surf1[i]);
        }
    
        printf("\n");
    
        for(i = 0; i < MAX; i++)
        {
            printf("Digite a %dº nota do surfista 2: ", i+1);
            scanf("%f" , &surf2[i]);
        }
    
        printf("\n");
    
        for(i = 0; i < MAX; i++)
        {
            printf("Digite a %dº nota do surfista 3: ", i+1);
            scanf("%f" , &surf3[i]);
        }
    
        // Envia as notas para a função e armazena as médias em um vetor
        medias[0] = media(surf1);
        printf("Média do surfista 1: %.2f\n", medias[0]);
        medias[1] = media(surf2);
        printf("Média do surfista 2: %.2f\n", medias[1]);
        medias[2] = media(surf3);
        printf("Média do surfista 3: %.2f\n", medias[2]);
    
        vencedor(medias);
    
        return 0;
    }

    Eu reparei que quando as notas de um surfista eram todas iguais, o programa não funcionava corretamente, então modifiquei o cálculo da média. Além disso, alguns dos printfs estavam com o resultado trocado, por exemplo, a média do surfista 1 aparecia como a média do surfista 2 e coisas do tipo.

    Sem sua ajuda eu não teria conseguido! Obrigada mesmo!!!

    • Curtir 3
  5. Olá pessoal, estou com dificuldade para finalizar um programa. O enunciado do programa é o seguinte:

    "Em um campeonato de surf extremamente difícil, cada bateria é disputada por 3 surfistas sendo que cada um deles pode pegar apenas 1 onda. Essa onda é avaliada por 5 jurados e cada um dá uma nota entre 0 e 10. Você, que não surfa mas programa, foi contratado para calcular o resultado final da bateria. O programa que você vai escrever para fazer esse cálculo deve ter duas funções principais (pode ter outras também):

     

    1. Uma função que recebe o vetor de 5 notas de um surfista, calcula e retorna a sua média. Pelas regras do campeonato a maior e a menor notas são descartadas, sendo utilizadas para o cálculo da média somente as 3 notas intermediárias.

    2. Uma função que recebe um vetor com as 3 médias dos surfistas calculadas no passo anterior, computa e exibe na tela o ranking final. O resultado deve apresentar, quem ficou em primeiro, segundo e terceiro e as médias de cada surfista.

     

    Dicas: Você pode ignorar casos de empate na hora de fazer o ranking final."

     

    O código que eu consegui desenvolver é o seguinte:

    #include <stdio.h>
    #include <locale.h>
    #include <string.h>
    #include <stdlib.h>
    #include <time.h>
    #define MAX 4
    
    //calcula a media
    float media (float notas[MAX], int tam)
    {
        int maior = 0, menor = 10, i;
        float media = 0;
    
         for(i=0 ; i>=tam ; i++)
        {
            printf("%.2f\n", notas[i]);
    
            for(i=0 ; i>=tam ; i++)
            {
                media = media + notas[i];
                if (notas[i] < menor)
                {
                    menor = notas[i];
                }
                else
                {
                    maior = notas[i];
                }
            }
        }
        //printf("%f %f\n", menor, maior);
         media = (media - menor - maior)/3;
        return media;
    }
    
    //calcula o vencedor e imprime na tela o ranking
    int vencedor (float medias[2], int tam)
    {
        int i;
        if (medias[0] > medias[1] && medias[0] > medias[2] && medias[1] > medias[2])
        {
            printf("\n1º lugar = surfista 1 com média %.2f", medias[0]);
            printf("\n2º lugar = surfista 2 com média %.2f", medias[1]);
            printf("\n3º lugar = surfista 3 com média %.2f\n", medias[2]);
        }
        else if (medias[0] > medias[1] && medias[0] > medias[2] && medias[2] > medias[1])
        {
            printf("\n1º lugar = surfista 1 com média %.2f", medias[0]);
            printf("\n2º lugar = surfista 3 com média %.2f", medias[2]);
            printf("\n3º lugar = surfista 2 com média %.2f\n", medias[1]);
        }
        else if (medias[1] > medias[0] && medias[1] > medias[2] && medias[0] > medias[2])
        {
            printf("\n1º lugar = surfista 2 com média %.2f", medias[1]);
            printf("\n2º lugar = surfista 1 com média %.2f", medias[0]);
            printf("\n3º lugar = surfista 3 com média %.2f\n", medias[3]);
        }
        else if (medias[1] > medias[0] && medias[1] > medias[2] && medias[2] > medias[0])
        {
            printf("\n1º lugar = surfista 2 com média %.2f", medias[1]);
            printf("\n2º lugar = surfista 3 com média %.2f", medias[3]);
            printf("\n3º lugar = surfista 1 com média %.2f", medias[0]);
        }
        else if (medias[2] > medias[0] && medias[2] > medias[1] && medias[0] > medias[1])
        {
            printf("\n1º lugar = surfista 3 com média %.2f", medias[2]);
            printf("\n2º lugar = surfista 1 com média %.2f", medias[0]);
            printf("\n3º lugar = surfista 2 com média %.2f\n", medias[1]);
        }
        else if (medias[2] > medias[0] && medias[2] > medias[1] && medias[1] > medias[0])
        {
            printf("\n1º lugar = surfista 3 com média %.2f", medias[2]);
            printf("\n2º lugar = surfista 2 com média %.2f", medias[1]);
            printf("\n3º lugar = surfista 1 com média %.2f\n", medias[0]);
        }
        else
        {
            printf("\nOcorreu algum erro");
        }
    
    
    }
    
    int main(){
    
    srand ( time ( NULL ) );
    setlocale(LC_ALL, "Portuguese");
    
    int i;
    float surf1[MAX], surf2[MAX], surf3[MAX], m1, m2, m3, medias[2];
    
    //lê as notas
        for(i=0 ; i<=MAX ; i++)
            {
                printf("Digite a %dº nota de surfista 1: ", i+1);
                scanf("%f" , &surf1[i]);
            }
    
        printf("\n");
    
        for(i=0 ; i<=MAX ; i++)
            {
                printf("Digite a %dº nota de surfista 2: ", i+1);
                scanf("%f" , &surf2[i]);
            }
    
        printf("\n");
    
        for(i=0 ; i<=MAX ; i++)
            {
                printf("Digite a %dº nota de surfista 3: ", i+1);
                scanf("%f" , &surf3[i]);
            }
    
        //envia as notas para a função e armazena a média em uma variável
        m1 = media(surf1, MAX);
        printf("Média do surfista 1: %.2f\n", m1);
        m2 = media(surf2, MAX);
        printf("Média do surfista 2: %.2f\n", m2);
        m3 = media(surf3, MAX);
        printf("Média do surfista 3: %.2f\n", m3);
    
        vencedor(medias, 2);
    
    return 0;
    }

     

    O cálculo da média aparentemente está todo errado, mas não sei como consertar. Alguém pode me ajudar?

    agradeço desde já :DD

    • Curtir 1
  6. Olá pessoal, estou com dificuldade para finalizar um programa. O enunciado do meu problema é o seguinte:

     

    "Implementar um jogo de Pedra, Papel e Tesoura (jan-ken-pon). O usuário deve jogar uma das opções, 1 para pedra, 2 para papel ou 3 para tesoura. O computador deve jogar também (um número aleatório entre 1 e 3). Devem ser implementadas pelo menos 3 funções (além da main):

     

    • Lê jogada (sem parâmetros, retorna um inteiro) - informa ao usuário quais são as opções de jogada que ele pode fazer, lê a opção selecionada pelo usuário e verifica se ele informou uma jogada válida (1, 2 ou 3). Ao final retorna o número da jogada feita pelo usuário.

    • Imprime jogada (recebe uma jogada inteira, não retorna nada) - de acordo com a entrada informada imprime na tela pedra, papel ou tesoura.

    • Calcula resultado (recebe dois parâmetros, a jogada do usuário e a do computador, retorna o resultado inteiro) - de acordo com as jogadas a função deve imprimir: “Papel cobre pedra” ou “Tesoura corta papel” ou “Pedra amassa tesoura”. Ao final, a função "calcula resultado" retorna, 1 em caso de empate, 2 para vitória do usuário ou 3 para vitória do computador.

     

    A função principal (main) deve chamar as outras funções para fazer o jogo funcionar. Primeiro deve-se ler a opção do usuário e gerar uma opção para o computador. Depois imprimir as duas jogadas. Por fim calcular o resultado e dizer quem venceu ou se houve empate. Em caso de empate, iniciar uma nova rodada.

     

    Atenção: O programa deverá obrigatoriamente usar funções."

     

    O que desenvolvi até agora foi:

    #include <stdio.h>
    #include <locale.h>
    #include <string.h>
    #include <stdlib.h>
    #include <time.h>
    
    //Lê a jogada do usuário
    int usuario()
    {
        int num;
        do
        {
            printf("Digite o número da sua jogada: ");
            scanf("%d" , &num);
    
            if (num < 1 || num > 3)
            {
                printf("\nNúmero inválido.\n\n");
            }
        } while (num < 1 || num > 3);
    
        return num;
    }
    
    //Interpreta o que o usuário jogos e imprime na tela.
    char jogada(int j)
    {
        if (j == 1)
        {
            printf("\nVocê jogou pedra\n");
        }
        else
        {
            if (j == 2)
            {
                printf("\nVocê jogou papel\n");
            }
            else
            {
                if (j == 3)
                {
                    printf("\nVocê jogou tesoura\n");
                }
            }
        }
    }
    
    //O computador escolhe aleatóriamente um número entre 1 e 3 e imprime na tela a interpretação do número.
    int computador()
    {
    
        int numero;
        numero = rand() %3 + 1;
        if (numero == 1)
        {
            printf("O computador jogou pedra\n");
        }
        else
        {
            if (numero == 2)
            {
                printf("O computador jogou papel\n");
            }
            else
            {
                if (numero == 3)
                {
                    printf("O computador jogou tesoura\n");
                }
        return numero;
            }
        }
    }
    
    //Calculando o resultado.
    int resultado (int a, int b)
    {
        int empate = 0;
    
        if (a == 1 && b == 2)
        {
            printf("\nPapel cobre pedra!\n");
            printf("\n3 - O COMPUTADOR GANHOU!");
        }
        else
        {
            if (a == 1 && b == 3)
            {
                printf("\nPedra amassa tesoura!\n");
                printf("\n2 - VOCÊ GANHOU!");
            }
            else
            {
                if (a == 2 && b == 1)
                {
                    printf("\nPapel cobre pedra!\n");
                    printf("\n2 - VOCÊ GANHOU!");
                }
                else
                {
                    if (a == 2 && b == 3)
                    {
                        printf("\nTesoura corta papel!\n");
                        printf("\n3 - O COMPUTADOR GANHOU!");
                    }
                    else
                    {
                        if (a == 3 && b == 1)
                        {
                            printf("\nPedra amassa tesoura!\n");
                            printf("\n3 - O COMPUTADOR GANHOU!");
                        }
                        else
                        {
                            if (a == 3 && b == 2)
                            {
                                printf("\nTesoura corta papel!\n");
                                printf("\n2 - VOCÊ GANHOU!");
                            }
                            else
                            {
                                    printf("\n1 - EMPATE! JOGUE NOVAMENTE!!!\n\n");
                                    empate = 1;
                            }
                        }
                    }
                }
            }
        }
        return empate;
    }
    
    
    
    int main(){
    
    srand ( time ( NULL ) );
    setlocale(LC_ALL, "Portuguese");
    
    int jogada_usuario, jogada_computador, empate;
    
        printf("TABELA DE JOGADAS\n\n1 - PEDRA \n2 - PAPEL\n3 - TESOURA\n\n");
    
        do
        {
        jogada_usuario = usuario();
        jogada (jogada_usuario);
        jogada_computador = computador();
        empate = resultado(jogada_usuario , jogada_computador);
        } while (empate == 1);
    
        return 0;
    }

     

    Em alguns casos o programa funciona corretamente, mas na maioria da algum tipo de erro sobre a mensagem que aparece na tela ou sobre o sistema que eu criei em casos de empate.

    Agradeço desde já! :D

    • Curtir 1
  7.  Como sugeriu @mauro_b , vou deixar o programa final para ajudar outros estudantes.

    #include <stdio.h>
    #include <locale.h>
    #include <string.h>
    #include <stdlib.h>
    #include <time.h>
    
    //funçao que gera aleatoriamente D ou E
    char funcao1()
    {
        int num;
        char direcao;
    
        num = rand() %2;
        if (num == 0)
        {
            direcao = 'D';
        }
        else
        {
            direcao = 'E';
        }
        return direcao;
    }
    
    int main(){
        srand(time(NULL));
        setlocale(LC_ALL, "Portuguese");
    
        int direita = 0, esquerda = 0, limite = 0;
        char direcao, memoria;
    
        //Iniciando a variável memoria
        direcao = funcao1();
        memoria = direcao;
        printf("%c", direcao);
    
        if (direcao == 'D')
        {
            direita++;
        }
        else
        {
            if (direcao == 'E')
            {
              esquerda++;
            }
    
        }
    
        limite++;
    
        //Repetição até que ocorra 4 curvas para o mesmo lado
        while (direita < 4 && esquerda < 4 && limite < 10000)
        {
            limite++;
            direcao = funcao1();
            printf("%c", direcao);
    
            if (memoria == direcao)
            {
                if (direcao == 'D')
                {
                    direita++;
                }
                else
                {
                    if (direcao == 'E')
                    {
                        esquerda++;
                    }
    
                }
            }
            else
            {
                if (direcao == 'D')
                {
                    esquerda = 0;
                    direita++;
                }
                else
                {
                    if (direcao == 'E')
                    {
                        direita = 0;
                        esquerda++;
                    }
                }
            }
            memoria = direcao;
        }
    
        //Imprimir o numero de voltas
        if (limite == 10000)
        {
            printf("O carro não completou uma volta em 10000 curvas");
        }
        else
        {
           printf("\n\nO carro andou uma volta completa e fez %d curvas\n", limite);
        }
    
     return 0;
    }

     

    • Amei 2
  8. 59 minutos atrás, vangodp disse:

    coloque a seguinte linha no inicio do main:
     

    
    int main(){
    	srand ( time ( NULL ) );
    	...

    Precisa fazer a inclusão da biblioteca time.h para usar a função time.

    Fiz isso e ainda não funcionou... A biblioteca time.h já estava inclusa no programa. Tem mais alguma ideia?

    • Curtir 1
  9. Oi gente, estou desenvolvendo um programa de loteria, que precisa utilizar funções no desenvolvimento. O programa sorteia aleatoriamente números entre os números 1 e 30 e depois compara com os números digitados pelo usuário. Até o momento consegui fazer isso, porém os números que são sorteados saem sempre iguais e eu não sei como mudar isso.

    #include <stdio.h>
    #include <locale.h>
    #include <string.h>
    #include <stdlib.h>
    #include <time.h>
    
    int sorteio()
    {
        int numero;
        srand(time(NULL));
        numero = rand() %30 + 1;
        return numero;
    }
    
    int digitar()
    {
        int num;
        do
        {
        printf("Digite um número:");
        scanf("%d", &num);
        if (num <1 || num > 30)
        {
            printf("Número inválido\n");
        }
        }while (num <1 || num > 30);
        return num;
    }
    
    int main(){
    setlocale(LC_ALL, "Portuguese");
        int num1, num2, num3, sort1, sort2, sort3, total = 0;
    
        num1 = digitar();
        num2 = digitar();
        num3 = digitar();
    
    
        sort1 = sorteio();
        sort2 = sorteio();
        sort3 = sorteio();
    
        if (num1 == sort1 || num1 == sort2 || num1 == sort3)
        {
            total++;
        }
    
        if (num2 == sort1 || num2 == sort2 || num2 == sort3)
        {
            total++;
        }
    
        if (num3 == sort1 || num3 == sort2 || num3 == sort3)
        {
            total++;
        }
    
        printf("\nOs números sorteados foram: %d, %d, %d\n", sort1, sort2, sort3);
        
        if (total = 0)
        {
            printf("\nVocê não acertou nenhum numero");
        }
    
        if (total = 1)
        {
            printf("\nParabéns, você acertou 1 número e ganhou um prêmio de consolação!");
        }
    
        if (total = 2)
        {
            printf("\nParabéns, você acertou 2 números e ganhou um prêmio de consolação!");
        }
    
        if (total = 3)
        {
            printf("\nParabéns, você ganhou acertou 3 números e ganhou o super prêmio!!!");
        }
    
    return 0;
    }

    Alguém sabe me dizer como faço para que os números sorteados sejam diferentes?

    • Obrigado 2
  10. Então, até o momento consegui desenvolver isso:

    #include <stdio.h>
    #include <locale.h>
    #include <string.h>
    #include <stdlib.h>
    #include <time.h>
    
    //funçao que gera aleatoriamente D ou E
    char funcao1()
    {
        int num;
        char direcao;
    
        srand(time(NULL));
    
        num = rand() %0;
        if (num == 0)
        {
            direcao = 'D';
        }
        else
        {
            direcao = 'E';
        }
        printf("%c", direcao);
        return direcao;
    }
    
    int main(){
    setlocale(LC_ALL, "Portuguese");
    
        int direita = 0, esquerda = 0, limite = 0;
        char direcao = funcao1 ();
        char memoria;
    
        //Iniciando a variável memoria
        funcao1();
        memoria = direcao;
    
        if (direcao == 'D')
        {
            direita++;
        }
        else
        {
            esquerda++;
        }
    
        //Repetição até que ocorra 4 curvas para o mesmo lado
        while (direita < 4 || esquerda < 4 || limite < 1000)
        {
            funcao1();
            if (memoria == direcao)
            {
                if (direcao == 'D')
                {
                    direita++;
                }
                else
                {
                    esquerda++;
                }
                memoria = direcao;
            }
            else
            {
                if (direcao == 'D')
                {
                    esquerda = 0;
                    direita++;
                }
                else
                {
                    direita = 0;
                    esquerda++;
                }
            }
            limite++;
        }
    
        //Imprimir o numero de voltas
        printf("\nO carro andou uma volta completa\n");
        printf("\nO carro fez %d curvas\n", limite);
    
     return 0;
    }

    Porém não está funcionando... Alguém sabe o que esta errado?

    • Curtir 1
  11. Olá pessoal, estou em uma cadeira de introdução a programação em C e me encontro com a seguinte atividade para fazer utilizando funções:

    "Sua empresa decide lançar um novo sistema de localização inovador para carros chamado GPS (Girando Para Sempre). Esse sistema avisa ao motorista se ele está andando em círculos, ou seja, se ele fez tantas curvas que acabou voltando à direção original. Escreva um programa com uma função que gera aleatoriamente uma direção (char ‘D’ para direita e char ‘E’ para esquerda), e que vai dobrando o carro 90 graus a cada vez. O carro para quando fizer uma volta completa (tanto faz para que lado). No final, imprima a quantidade de curvas que o carro fez.

     

    Dicas:

    A função chamada apenas retorna uma direção (‘D’ ou ‘E’) aleatoriamente.

    Tome cuidado, um carro que dobra para a direita e logo após para esquerda retorna à sua direção original, porém não completou uma volta.

     

    Atenção: O programa deverá obrigatoriamente usar funções."

     

    Eu não consigo entender qual é a lógica que deveria usar para resolver esse problema, nem como "sortear" aleatoriamente a letra D ou E. Estou realente perdida neste exercício a dias...

    Se alguém puder me ajudar ficarei muito grata! :D

    • Obrigado 1

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!