Código não está funcionando, mesmo com a lógica certa

1. Código não está funcionando, mesmo com a lógica certa

rui s n
sruy19

(usa Linux Mint)

Enviado em 28/12/2018 - 20:21h

Recebi da faculdade uma questão pra fazer:
Faça um algoritmo que leia o nome, altura, sexo (M – masculino, F - feminino) e cor
dos olhos (A – azuis, V – verdes, C – castanhos) para um conjunto de pessoas. O
algoritmo deve calcular e escrever:
• Percentual de homens que possuem olhos castanhos.
• Total de mulheres com altura inferior a 1,60m.
• Nome da pessoa mais alta.
• Total de mulheres.
OBS: O final do conjunto é representado por nome = ‘acabou’ que, evidentemente,
não deve ser considerado.

o Código compila, porém os resultados estão todos zerados:
Segue abaixo o Código

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

int main()
{

char nome[20],sexo[1],cor_o[1],nomealta[20];
float altura,manc=0,qtdman=0,percentc,qtdmulher=0,qtdmulher159=0,h_alta,p_alta=0;


printf("Informe nome\n");
scanf("%s",nome);

while(strcmp(nome,"acabou")!=0){

printf("informe a altura\n");
scanf("%f", &altura);
h_alta=altura
printf("[M] ou [F] para sexo\n ");
scanf("%s", sexo);
printf("Cor dos olhos\n");
printf(" [A] - Azuis ");
printf(" [V] - Verdes ");
printf(" [C] - Castanhos \n");
scanf("%s", cor_o);

if (strcmp(sexo,"M")==0){
qtdman=qtdman+1;
}
if (strcmp(cor_o,"C")==0 && strcmp(sexo,"M")==0){
manc=manc+1;
}
if (strcmp(sexo,"F")==0){
qtdmulher=qtdmulher+1;
}
if (strcmp(sexo,"F") && altura<1.6){
qtdmulher159=qtdmulher159+1;
}
if (p_alta<h_alta){
strcpy(nome,nomealta);
}
printf("Informe nome\n");
scanf("%s",nome);
}

percentc=manc*(100/qtdman);
printf("percentual de homens com olhos castanhos %.2f \n",percentc);
printf("Total de mulheres %.2f com menos de 1.6\n ",qtdmulher159);
printf("Nome: %s pessoa mais alta\n",nomealta);
printf("Total de mulheres %.2f\n",qtdmulher);

return 0;
}



  


2. Re: Código não está funcionando, mesmo com a lógica certa

Paulo
paulo1205

(usa Ubuntu)

Enviado em 29/12/2018 - 01:39h

Prezado sruy19,

Ao contrário do que você disse no título, a lógica não está certa (ou melhor: a tradução dela para C não está). E, apesar do que você falou no corpo da mensagem sobre compilar sem erros, também a compilação bem sucedida não significa que o programa faz sentido.

sruy19 escreveu:

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

int main()
{

char nome[20],sexo[1],cor_o[1],nomealta[20];


Arrays com um único elemento não são muito úteis. Em particular, eles não servem para guardar strings que não estejam vazias (uma vez que toda string tem de ter um byte terminador, e você só tem espaço para um byte).

Considere trocar um array com apenas um elemento do tipo char por uma variável comum do tipo char.

        float altura,manc=0,qtdman=0,percentc,qtdmulher=0,qtdmulher159=0,h_alta,p_alta=0;


printf("Informe nome\n");
scanf("%s",nome);

while(strcmp(nome,"acabou")!=0){

printf("informe a altura\n");
scanf("%f", &altura);
h_alta=altura


Aqui faltou um ponto-e-vírgula.

                printf("[M] ou [F] para sexo\n ");
scanf("%s", sexo);


Aqui você tenta ler dados para uma vetor que não tem espaço para acomodar tais dados. O que acaba acontecendo é que o valor é lido, mas o byte nulo que indica o fim do array acaba sendo guardado numa posição de memória fora do array (possivelmente ocupada por outra variável ou por alguma estrutura de controle do programa em tempo de execução). É imprevisível o que pode resultar dessa extrapolação.

Se você trocar, como eu sugeri acima, o array por uma variável comum, pode ler o sexo para essa variável com algo como “scanf(" %c", &sexo)” (note o espaço após as aspas e antes do “%c”).

                printf("Cor dos olhos\n");
printf(" [A] - Azuis ");
printf(" [V] - Verdes ");
printf(" [C] - Castanhos \n");
scanf("%s", cor_o);

if (strcmp(sexo,"M")==0){


Se você tiver trocado o array por variável comum, não precisará de strcmp(): pode fazer apenas o teste “sexo=='M'”.

Observe, contudo, que o caráter 'M' é diferente do caráter 'm'. Para que o teste tenha chance de funcionar, ou você obriga o usuário a usar apenas letras maiúsculas na hora de digitar o sexo e a cor dos olhos, ou muda o teste para considerar as duas opções, tanto maiúscula quanto minúscula.

                    qtdman=qtdman+1; 


Esse tipo de atribuição é incomum em C. Programadores em C fariam esse incremento de uma das seguintes maneiras:
qtdman++;  // mais comum 
++qtdman;  // mais eficiente (especialmente em C++) 


                }
if (strcmp(cor_o,"C")==0 && strcmp(sexo,"M")==0){


Perceba que você está testando a mesma coisa (se é homem) duas vezes. Seria melhor testar uma vez só, e fazer outros testes vinculados ao sexo dentro do bloco condicional referente ao teste já confirmado. Veja o exemplo abaixo.
if(sexo=='m' || sexo=='M'){
++qtdman;
if(cor_o=='c' || cor_o=='C')
++manc;
}


                    manc=manc+1;
}
if (strcmp(sexo,"F")==0){
qtdmulher=qtdmulher+1;
}
if (strcmp(sexo,"F") && altura<1.6){
qtdmulher159=qtdmulher159+1;
}
if (p_alta<h_alta){
strcpy(nome,nomealta);
}
printf("Informe nome\n");
scanf("%s",nome);
}

percentc=manc*(100/qtdman);
printf("percentual de homens com olhos castanhos %.2f \n",percentc);
printf("Total de mulheres %.2f com menos de 1.6\n ",qtdmulher159);
printf("Nome: %s pessoa mais alta\n",nomealta);
printf("Total de mulheres %.2f\n",qtdmulher);

return 0;
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts