Ir ao conteúdo
  • Cadastre-se

C Erro em exercício de algoritmo de uma entrevista.


ningumx

Posts recomendados

Alguém sabe o erro deste código?

O enunciado do exercício:

Uma certa empresa fez uma pesquisa para saber se as pessoas gostaram ou não de
um novo produto lançado no mercado. Para isso, forneceu-se o sexo do entrevistado
e a sua resposta (sim ou não). O algoritmo deve solicitar a quantidade N de pessoas
a serem analisadas. O algoritmo deve calcular e escrever a seguinte saída:
 O número de pessoas que responderam sim;
 O número de pessoas que responderam não;
 A percentagem de pessoas do sexo feminino que responderam sim;
 A percentagem de pessoas do sexo masculino que responderam não;

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

int main() {
    float n;
    printf("Digite a quantidade de pessoas: ");
    scanf("%f",&n);
    
    float i, sexo, resp;
    for(i = 0 ; i < n ; i++){
        printf("Digite:\n- 1 para sexo feminino\n- 2 para sexo masculino\nDigite:\n- 1 para sim\n- 2 para não\n");
        scanf("%f%f",&sexo,&resp);
    }
    
    float resps = 0, respn = 0, fem = 0, masc = 0, femsim = 0, mascnao = 0; 
    
    if(resp == 1)
     resps++;
    else 
     if(resp == 2)
      respn++;
     else
      if(sexo == 1)
       fem++;
      else
       if(sexo == 2)
        masc++;
       else
        if(sexo == 1 && resp == 1)
         femsim++;
        else
         if(sexo == 2 && resp == 2)
          mascnao++;
        
    printf("O número de pessoas que responderam sim e: %f.\n",resps);
    printf("O número de pessoas que responderam não e: %f.\n",respn);
    printf("A percentagem de pessoas do sexo feminino que responderam sim e: %f.\n", ((femsim*100)/fem));
    printf("A percentagem de pessoas do sexo masculino que responderam não e: %f.\n",((mascnao*100)/masc));
 
    return 0;
}

 

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

@ningumx    seu código está desorganizado ,  pede duas coisa ao mesmo tempo e  logo em seguida descarto tudo e pega novos dados ,  e as comparações deveriam estar dentro do loop FOR  ,  e precisa inicializar as variáveis ,  e seu código ficou assim  :

#define _WIN32_WINNT 0x600
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int prototipo(int , int , int* );
int main()
{
  HANDLE _h = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute( _h , 15 + (12 << 4 ) );
  float n       = 0;
  float resps   = 0;
  float respn   = 0;
  float fem     = 0;
  float masc    = 0;
  float femsim  = 0;
  float mascnao = 0;
  float i       = 0;
  float sexo    = 0;
  float resp    = 0;
  printf("Digite a quantidade de pessoas: ");
  scanf("%f",&n);
  for(i = 0 ; i < n ; i++)
  {
    printf("Digite:\n\
           \r - 1 para sexo feminino\n\
           \r - 2 para sexo masculino\n\
           \rDigite:\n\
           \r - 1 para sim\n\
           \r - 2 para não\n");/// sim e não o Que ? ? ?
    scanf("%f%f",&sexo,&resp);
    /// } essa chaves aqui ?
    if(resp == 1)
      resps++;
    else
      if(resp == 2) /// comparacoes dentro do loop
        respn++;    /// atualiza variaveis
    if(sexo == 1)
      fem++;
    else
      if(sexo == 2)
        masc++;
    if(sexo == 1 && resp == 1)
      femsim++;
    else
      if(sexo == 2 && resp == 2)
        mascnao++;
  } /// fim do loop For fica mesmo é aqui
  printf("O nUmero de pessoas que responderam sim e: %f.\n\
        \rO nUmero de pessoas que responderam não e: %f.\n\
        \rA percentagem de pessoas do sexo feminino  que responderam sim e: %f.\n\
        \rA percentagem de pessoas do sexo masculino que responderam não e: %f.\n",
         resps,respn,((femsim*100)/fem),((mascnao*100)/masc));
  SetConsoleTextAttribute( _h , 15 + (12 << 4 ) );
  printf("\n\n\n");
  return 0;
}
int prototipo(int a , int b , int* c )
{
  return 0;
}

 

Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...

Boa noite!

 

Refatorarei essa solução, é somente isso mesmo, embelezei o máximo que pude!

 

Veja que lindinho:

erro_em_exercicio_de_algoritmo_de_uma_entrevista.c

/* erro em exercício de algoritmo de uma entrevista. */

#include <stdio.h>
#include <limits.h>

int main ()
{
 printf ("%s%d%s","Digite a quantidade de pessoas [max.",INT_MAX,"]: ");
 int n= -1; /* valor negativo sendo uma não quantidade */
 scanf ("%d",&n);
 if (n<=0) return 1;
 int outros= 0;
 int femnao= 0 , mascnao= 0; 
 int femsim= 0 , mascsim= 0;
 char sexo , resp;
 for (int i= 0 ; i<n ; i++)
   {
    int r= scanf (" %c %c",&sexo,&resp);
    if (r==EOF) break;
    if (sexo=='f')
      {
       if (resp=='1') femsim++;
       if (resp=='2') femnao++;
      }
    else  
    if (sexo=='m')
      {   
       if (resp=='1') mascsim++;
       if (resp=='2') mascnao++;
      }
    else
       outros++;
   }
 putchar ('\n');
 int resps= mascsim+ femsim;
 int respn= mascnao+ femnao;
 int fem  = femsim + femnao;
 int masc = mascsim+ mascnao;
 printf ("O número de pessoas que responderam sim e: %d.\n"
         "O número de pessoas que responderam não e: %d.\n"
         "A percentagem de pessoas do sexo feminino que responderam sim e: %f.\n"
         "A percentagem de pessoas do sexo masculino que responderam não e: %f.\n" ,
         resps ,
         respn ,
         (femsim*100.0)/ (fem>0?fem:1) ,
         (mascnao*100.0)/ (masc>0?masc:1));
 putchar ('\n');
}

c'11 - gcc'11.4

 

Uma belezinha assim, inicialmente, já me satisfaz!

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

Rodando o programa como postado

 

Digite a quantidade de pessoas [max.2147483647]: 4
M s
M S
F f
f n

O n·mero de pessoas que responderam sim e: 0.
O n·mero de pessoas que responderam nÒo e: 0.
A percentagem de pessoas do sexo feminino que responderam sim e: 0.000000.
A percentagem de pessoas do sexo masculino que responderam nÒo e: 0.000000.

 

  • como usou acentos e não se preocupou com a configuração de locale e coisas assim alguns acentos e caracteres da lingua portuguesa podem não ser impressos.
  • como testou o retorno de scanf --- apenas em um ponto e não em todos --- comparando com EOF ao invés de usar o número de especificadores, seu programa falha se teclar algo diferente de 1 e 0, que foi a interpretação que usou para SIm e Não.
  • Seis casas decimais para uma porcentagem de pesquisa de 4 opções talvez seja exagerado. E um sinal % seria bem-vindo

 Talvez pudesse ainda considerar que:

  • o que está bom pode melhorar
  • informar ao usuário que ele pode digitar até 2,14 bilhões de questões talvez seja um exagero.
  • Incluir limits.h somente para poder usar INT_MAX talvez seja menos efetivo do que usar um limite mais perto de uns 10 elementos, ao invés de INT_MAX, que pode ser considerado exagerado para um programa interativo. Afinal alguém vai ficar lá digitando. E se passar de uma tela fica ruim pra conferir os valores.
  • algum tipo de instrução ao usuário sobre o que se espera que ele digite até esse limite seria uma cortesia interessante, e aceitar minúsculas e maiúsculas seria também cortês. E trocar "S/N" por "1/0" não parece somar nada ao código ou à experiência de uso dele. Talvez devesse se ater ao enunciado.
  • contar as respostas, algo como "1 de 2147483647" ajudaria a lembrar ao usuário quanto falta para terminar, ou a se posicionar se estiver copiando as respostas de uma lista numerada.
  • desconsiderar respostas inválidas pode ser efetivo, para manter as porcentagens auditáveis e evitar a fúria de um usuário ao errar na 10a de 11 respostas.
  • outros não é usado para nada, podia assim não existir.
  • o programa usa 4 acumuladores e depois soma ao final para conseguir o total por sexo. Só que o enunciado pede apenas o total por sexo e o total positivo para feminino e o total negativo para masculino. Assim ao acumular femnao e mascnao o programa faz uma soma final sem necessidade. Ao invés de
	if (sexo == 'f')
        {
            if (resp == '1') femsim++;
            if (resp == '2') femnao++;
        }
        else if (sexo == 'm')
        {
            if (resp == '1') mascsim++;
            if (resp == '2') mascnao++;
        }
        else
            outros++;

 

Prefira por exemplo

 

        if ((resp == 's') || (resp == 'S'))
        {
            if ((sexo == 'f') || (sexo == 'F'))
                ++i, ++sim, ++fem_sim;
            else if ((sexo == 'm') || (sexo == 'M'))
                ++i, ++sim;
        }
        else
        {
            if ((resp == 'n') || (resp == 'N'))
            {
                if ((sexo == 'm') || (sexo == 'M'))
                    ++i, ++não, ++masc_nao;
                else if ((sexo == 'f') || (sexo == 'F'))
                    ++i, ++não;
            }
        }


Que

  • só avança se a resposta for válida.
  • aceita SNsnMFmf.
  • conta as respostas
  • não cancela se o cara digitar errado.
    int  outros = 0;
    int  femnao = 0, mascnao = 0;
    int  femsim = 0, mascsim = 0;


Todos esses valores são quantidades (não-negativos) e estariam melhor representados como unsigned.

 

Sobre

 

    putchar('\n');
    int resps = mascsim + femsim;
    int respn = mascnao + femnao;
    int fem   = femsim + femnao;
    int masc  = mascsim + mascnao;
    printf(
        "O número de pessoas que responderam sim e: %d.\n"
        "O número de pessoas que responderam não e: %d.\n"
        "A percentagem de pessoas do sexo feminino que "
        "responderam sim e: %f.\n"
        "A percentagem de pessoas do sexo masculino que "
        "responderam não e: %f.\n",
        resps, respn,
        (femsim * 100.0) / (fem > 0 ? fem : 1),
        (mascnao * 100.0) / (masc > 0 ? masc : 1));
    putchar('\n');


É difícil entender duas chamadas a putchar apenas para gravar '\n' na saída. Porque não estão esses '\n' na mesma chamada a printf? São só dois símbolos.

 

Prefira
 

    printf(
        "\n\
    %d pessoas responderam sim.\n\
    %d pessoas responderam não.\n\
    %6.2f%% das pessoas do sexo feminino responderam sim.\n\
    %6.2f%% das pessoas do sexo masculino responderam não\n\n",
        sim, não, (fem_sim * 100.0) / (sim > 0 ? sim : 1),
        (masc_nao * 100.0) / (não > 0 ? não : 1));


Que mostra algo como

 

    2 pessoas responderam sim.
    2 pessoas responderam não.
     50.00% das pessoas do sexo feminino responderam sim.
     50.00% das pessoas do sexo masculino responderam não

 

Que é a mesma coisa mas é mais fácil de ler e de alinhar, e não tem as duas chamadas a putchar, simplesmente porque os dois '\n' estão na (única) chamada a printf.

 

E parece mais fácil de ler na saída e no código.

 

  •  Entenda que não tem controle sobre onde vão usar seu programa, então se vai usar acentos e caracteres de algum idioma particular deve chamar locale e configurar a página de código de acordo. Veja no início desse post que a saída não ficou assim ok em algum computador.

Sobre esse trecho
 

    int n = -1; /* valor negativo sendo uma não quantidade */
    scanf("%d", &n);
    if (n <= 0) return 1;
    // ...
    for (int i = 0; i < n; i++)
    {
        int r = scanf(" %c %c", &sexo, &resp);
        if (r == EOF) break;

 

Considere

 

  • É sabido então que scanf retorna um int. Usou n = -1 inicialmente para poder encerrar o programa se scanf não ler nada, por exemplo porque o usuário teclou uma letra por engano. Só que na chamada seguinte declarou e usou r para receber o retorno de scanf. Por uma questão de consistência, no mínimo, deveria fazer a mesma coisa nos 2 pontos: ou trata o retorno de scanf ou coloca um valor sentinela numa das variáveis de scanf.
  • entenda que ao usar o especificador " %c %c" scanf pode retornar -1, 0, 1 ou 2, já que é um scanner e pode ler apenas uma letra, e aí seu programa já era. Teste sempre o retorno de scanf comparando com o total de especificadores, 2 nesse caso. Use:     
           if (r != 2) break;

 

  • considere uma mensagem de erro.
  • Considere também usar continue ao invés de break e simplesmente ignorar essa entrada. Imagine você mesmo digitando 10 de 12 números e aí erra na hora de digitar a resposta. Não seria melhor ignorar, ou avisar o usuário? Esse é um comportamento de programa que enfurece o usuário, ou mesmo o autor do programa tentando testar...
  • Entenda que "%c %c"  também aceita as duas letras juntas, como SM ou m0 no seu caso
  • Isso está correto
      printf(
        "%s%d%s", "Digite a quantidade de pessoas [max.",
        INT_MAX, "]: ");

 

mas é 'difícil de ler e alinhar, e mais lerdo: está passando 3 parâmetros, incluídas duas constantes, para printf. Se escreve por uma nota ou em um trabalho ou entrevista prefira o simples e mais legível
 

    printf(
        "Digite a quantidade de pessoas [max = %d]: ", MAX_RESP);

 

porque é muito mais rápido, e simples de alterar sem ter que ficar procurando campos.´É assim em java, Python, C# e C++ por exemplo. Deve ter uma razão.

 

EXEMPLO

 

Considerando o que eu disse e alterando um pouco o seu programa, uma possível implementação seria:

 

(saída de uma execução)

 

Digite a quantidade de pessoas [max = 12]: 4
Vai ler 4 respostas
    SsNn MnFf
    Use uma linha para cada resposta, com 'S' ou 's' para gostei,
    'N' ou 'n' para não gostei, e 'M' 'm' 'F' 'f' para o sexo


[1 de 4]: s Y
[1 de 4]: Y s
[1 de 4]: s m
[2 de 4]: s F
[3 de 4]: N m
[4 de 4]: n F

    2 pessoas responderam sim.
    2 pessoas responderam não.
     50.00% das pessoas do sexo feminino responderam sim.
     50.00% das pessoas do sexo masculino responderam não


Note que

  • pode usar maiúsculas ou minúsculas para as respostas
  • apenas respostas válidas são consideras
  • prompts de instrução são mostrados ao usuário
  • a formatação é mais simples.

O código do exemplo, completo

 

#define MAX_RESP 12
#define DEF_RESP 4
#include <stdio.h>
int main(void)
{
    unsigned n   = 0;
    unsigned res = 0;
    printf(
        "Digite a quantidade de pessoas [max = %u]: ", MAX_RESP);
    res = scanf("%ud", &n);
    if (res != 1) return -1;
    if (n > MAX_RESP) n = DEF_RESP;
    printf("Vai ler %d respostas\n", n);
    char sexo = 0;
    char resp = 0;
    unsigned  masc_nao = 0;
    unsigned  fem_sim  = 0;
    unsigned  sim      = 0;
    unsigned  não      = 0;
    printf(
        "\
    SsNn MnFf\n\
    Use uma linha para cada resposta, com 'S' ou 's' para gostei,\n\
    'N' ou 'n' para não gostei, e 'M' 'm' 'F' 'f' para o sexo\n\n\n");

    for (unsigned i = 1; i <= n;) // incrementa apenas se for valida
    {
        printf("[%u de %u]: ", i, n);
        res = scanf(" %c %c", &resp, &sexo);
        if (res != 2)
            continue;
        if ((resp == 's') || (resp == 'S'))
        {
            if ((sexo == 'f') || (sexo == 'F'))
                ++i, ++sim, ++fem_sim;
            else if ((sexo == 'm') || (sexo == 'M'))
                ++i, ++sim;
        }
        else
        {
            if ((resp == 'n') || (resp == 'N'))
            {
                if ((sexo == 'm') || (sexo == 'M'))
                    ++i, ++não, ++masc_nao;
                else if ((sexo == 'f') || (sexo == 'F'))
                    ++i, ++não;
            }
        }
    }
    printf(
        "\n\
    %d pessoas responderam sim.\n\
    %d pessoas responderam não.\n\
    %6.2f%% das pessoas do sexo feminino responderam sim.\n\
    %6.2f%% das pessoas do sexo masculino responderam não\n\n",
        sim, não, (fem_sim * 100.0) / (sim > 0 ? sim : 1),
        (masc_nao * 100.0) / (não > 0 ? não : 1));
}


 

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

Não siga esta recomendação:

7 horas atrás, arfneto disse:
  • Ao invés de
	if (sexo == 'f')
        {
            if (resp == '1') femsim++;
            if (resp == '2') femnao++;
        }
        else if (sexo == 'm')
        {
            if (resp == '1') mascsim++;
            if (resp == '2') mascnao++;
        }
        else
            outros++;

 

Prefira por exemplo

 

        if ((resp == 's') || (resp == 'S'))
        {
            if ((sexo == 'f') || (sexo == 'F'))
                ++i, ++sim, ++fem_sim;
            else if ((sexo == 'm') || (sexo == 'M'))
                ++i, ++sim;
        }
        else
        {
            if ((resp == 'n') || (resp == 'N'))
            {
                if ((sexo == 'm') || (sexo == 'M'))
                    ++i, ++não, ++masc_nao;
                else if ((sexo == 'f') || (sexo == 'F'))
                    ++i, ++não;
            }
        }

 

Nem um e nem o outro: prefira sempre o seu, PORQUE ELE é SEU.

Seja honesto consigo mesmo, corrija o que achar errado, somente isso.

Em 14/06/2022 às 10:58, ningumx disse:
if(resp == 1)
     resps++;
    else 
     if(resp == 2)
      respn++;
     else
      if(sexo == 1)
       fem++;
      else
       if(sexo == 2)
        masc++;
       else
        if(sexo == 1 && resp == 1)
         femsim++;
        else
         if(sexo == 2 && resp == 2)
          mascnao++;
      

 

Para mim, isso foi o mais IMPORTANTE!

 

 

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

  • Moderador

@Ansi C @arfneto Senhores, vocês estão discutindo sobre um tópico de 2 anos atrás.  Peço a gentileza de apenas se concentrar na discussão saudável sobre o código,  independente de quem tá certo ou errado.

 

Não permitimos nenhum tipo de discussão não saudável, que não agregue a  pauta do assunto.

Tópico encerrado.

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

  • DiF fechou este tópico
Visitante
Este tópico está impedido de receber novas respostas.

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!