Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Pulse

Viagem

Recommended Posts

Um grupo de professores deseja fazer uma festa no feriado. Foi solicitado aos docentes que informassem os seguintes dados: - A escolha do lugar entre as opções ‘p’ (praia) ou ‘h’ (hotel fazenda); - A escolha do tipo de comida entre as opções ‘c’ (churrasco) ou ‘f’ (feijoada) ou ‘m’ (massa); - A escolha do dia preferido entre as opções ‘s’ (sábado) ou ‘d’ (domingo). Sua tarefa é fazer um programa que leia as opções de uma quantidade indeterminada de professores que votaram e imprimir na tela as opções campeãs (lugar, tipo de comida e dia preferido). O programa deve perguntar se deseja continuar a cada ciclo de repetição.

#include <stdio.h>

int main ()
{
    char local, comida, dia;
    int p=0, h=0, c=0, f=0, m=0, s=0, d=0, continua;

    do
    {
        printf("Local");
        scanf("%s", &local);

        switch (local)
        {
            case 'p':
                    p++;
                    break;
            case 'h':
                    h++;
                    break;
            default:
                    printf("Opcao invalida");
                    break;
        }

        printf("Comida");
        scanf("%s", &comida);

        switch (comida)
        {
            case 'c':
                    c++;
                    break;
            case 'f':
                    f++;
                    break;
            case 'm':
                    m++;
                    break;
            default:
                    printf("Opcao invalida");
                    break;
        }

        printf("Dia");
        scanf("%s", &dia);

        switch (dia)
        {
            case 's':
                    s++;
                    break;
            case 'd':
                    d++;
                    break;
            default:
                    printf("Opcao invalida");
                    break;
        }

        printf("Deseja continuar? \n 1 - Sim \n 2- Nao");
        scanf("%d", &continua);

    }while(continua==1);

printf("%d", p);
printf("%d", h);

    if (p>h)
    {
        printf("Local: Praia");
    }
    else if (h>p)
    {
        printf("Local: Hotel Fazenda");
    }
    else
    {
        printf("Empate");
    }

    if ((c>f) && (c>m))
    {
        printf("Comida: Churrasco");
    }
    else if ((f>m) && (f>c))
    {
        printf("Comida: feijoada");
    }
    else if ((m>c) && (m>f))
    {
        printf("Comida: massa");
    }
    else if ((c==m) && (c!=f) && (m!=f))
    {
        printf("Comida: Empate churrasco e massa");
    }
    else if ((c==f) && (c!=m) && (m!=f))
    {
        printf("Comida: Empate churrasco e feijoada");
    }
    else if ((f==m) && (c!=f) && (m!=c))
    {
        printf("Comida: Empate feijoada e massa");
    }
    else
    {
        printf("Comida empate: feijoada, massa e churrasco");
    }

    if (s>d)
    {
        printf("Dia: Sabado");
    }
    else if (d>s)
    {
        printf("Dia: Domingo");
    }
    else
    {
        printf("Empate de dias");
    }
}

O programa funcionou, o único problema é que a variável h não muda de valor, fica sempre com 0. Além disso, achei que o código ficou muito grande. Há alguma maneira alternativa e mais prática de resolução?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Os códigos não consideram a situação de empate na votação.
Repare que nos dois eu coloquei %*c no scanf, pois o \n fica na entrada e é lido quando a chamada ao próximo scanf é executada (isso tem o efeito de pular a entrada de dados. O %*c lê esse \n sem armazenar em variável).

Você pode fazer dessa forma:
http://dpaste.com/2GCBMBZ

Uma forma um pouco mais avançada é assim:
http://dpaste.com/2YZT6MV

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, Isis. Muito obrigado!

Só não entendi muito bem a parte:

 

Repare que nos dois eu coloquei %*c no scanf, pois o \n fica na entrada e é lido quando a chamada ao próximo scanf é executada (isso tem o efeito de pular a entrada de dados. O %*c lê esse \n sem armazenar em variável).

 

Poderia explicar novamente?

 

O que significa a função "tolower"?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Pulse e _Isis_, sei que este post já está praticamente resolvido, e que o meu codigo tá um pouco confuso, mas se puderem dar uma olha.

 

Obs.: Eu ignorei alguns pequenos detalhes na exibição dos Resultados para poupar tempo ! ! !

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

int main()

{
    int sim_nao;
    char resultado;
    int h=0,p=0,f=0,m=0,s=0,d=0;

   do
{
    printf(" Vote (h) Hotel\n Vote (p) Praia\n Vote (f) Feijoada\n Vote (m) Macarrão\n Vote (s) Sabado\n Vote (d) Domingo\n");
    scanf("%c", &resultado);
    __fpurge(stdin);


    switch(resultado)
    {
        case 'h': h++;
        break;
        case 'p': p++;
        break;
        case 'f': f++;
        break;
        case 'm': m++;
        break;
        case 's': s++;
        break;
        case 'd': d++;
        break;
        default: printf("Opção Invalida!!!\n");
    }

    printf("Voçê quer votar novamente?\n");

    printf("Sim (1)\nNão (2)\n");
    scanf("%d", &sim_nao);
    __fpurge(stdin);

  } while(sim_nao==1);

printf(" Hotel %d \n Praia %d \n Feijoada %d \n Macarrão %d \n Sabado %d \n Domingo %d \n", h,p,f,m,s,d);

if(h==p)
{
    printf(" \nEmpate entre Hotel e a Praia!\n");
}else
if(h>p)
{
    printf(" \nHotel Ganhou\n");
}else
printf(" \nPraia Ganhou\n");

if(f==m)
{
    printf(" \nEmpate entre Feijoada e Macarrão\n!");
}else
if(f>m)
{
    printf(" \nFeijoada Ganhou\n");
}else
printf(" \nMacarrão Ganhou\n");
if(s==d)
{
    printf(" \nEmpate entre Sabado e a Domingo!\n");
}else
if(s>d)
{
    printf(" \nSabado Ganhou\n");
}else
printf(" \nDomingo Ganhou\n");

return 0;
}

Pulse, para você não sei se é o mais adequado, mas substitua __fpurge(stdin); por fflush(stdin);

Compartilhar este post


Link para o post
Compartilhar em outros sites
Pulse, para você não sei se é o mais adequado, mas substitua __fpurge(stdin); por fflush(stdin);

 

Não.

Não use fflush(stdin). Segundo o padrão da linguagem tem comportamento indefinido. Essa função serve apenas p/ streams de saída.

http://en.cppreference.com/w/c/io/fflush

http://stackoverflow.com/questions/2979209/using-fflushstdin

 

Existe inclusive um tópico marcado como destaque nesse fórum sobre esse e outros vícios de programação.

http://forum.imasters.com.br/topic/336835-tutorial-systempause-e-fflushstdin/

Tenham em mente que, no mundo ideal, a portabilidade de um código deve ser um dos requisitos não-funcionais. Mas não é bem assim que acontece na vida real: normalmente os códigos são escritos p/ um sistema e morrem com ele (quando não é necessário manter código replicado porque o software não é portável). Dá p/ usar facilidades implementadas por sistemas operacionais ou determinados compiladores, mas desde que o S.O. e o compilador estejam especificados em documentação técnica, porque, óbvio, só vai funcionar em plataformas iguais à do desenvolvedor.

 

Na minha, por exemplo, o fflush(stdin) não vai funcionar. Como às vezes as mensagens do compilador não são tão diretas (em outros casos elas dependem de opções passadas na linha de comando), muita gente quebra a cabeça pra descobrir porque o código não funciona pra ele, mas p/ uma outra pessoa executa sem problemas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi, Felipe!

Olhei o seu código e só queria comentar uma coisa: você, primeiramente, verifica as opções de empate. Sabemos que a maior probabilidade durante a execução do programa é que não ocorra empate, portanto, é mais viável que você coloque essa opção como uma exceção (else) porque vai facilitar quando o programa rodar. Um professor meu que nos alertou sobre isso, deixar sempre as opções com menos probabilidade de acontecer por último ou como exceção pois, diminui o número de aferições que o programa deve fazer e facilita a execução dele.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

 

Pulse muito obrigado pela seu comentario, realmente as opções com maior probabilidade de ocorrer primeiro devem, estar sempre no topo de uma estrutura como a que eu usei, já havia lido sobre isso, só não considerei neste codigo, mas é sempre bom lembrar!

 

_Isis_ realmente a função que passei para o Pulse eu já havia lido sobre os seus risco, aqui no forum, inclusive, mas como já explicitado antes é um vicio que os iniciantes e ate mesmo os mais bem encaminhados tem, em C.

 

E realmente o seu uso vai depender de uma serie de fatores, embora eu ainda não tenha tido nenhum problema usando essa função aqui, vou tentar prestar mais atenção com relação ao comportamento, daqui pra frente ! ! !

 

 

Obrigado e ate a proxima!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui "se ensina" a programar sem essas coisas porque dessa forma evita-se o "funciona na minha máquina" (Como analista de teste eu odeio essa desculpa. Sério). Além disso como são várias pessoas lendo os tópicos, teoricamente qualquer uma deveria ser capaz de copiar e colar o código sem editar tanto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.