Ir ao conteúdo
  • Cadastre-se
nilton_sr

RESOLVIDO programa em C

Recommended Posts

Bom dia pessoal!!!

 

Estou fazendo um programa onde ele deve ler os dados de um arquivo, contendo NOME, ALTURA, PESO e IDADE:

 

exemplo:

 

Maria Bonita 1.70 49.0 20

 

e tenha a seguinte saída baseado nos seguintes critérios:

 

ALTURA: de 1.70 a 1.85 m

PESO: de 48.0 a 60.0 Kg

IDADE: de 17 a 21 anos

 

 

Saída esperada na tela

 

 

Maria Bonita 1.60 49.0 20

 

 

Altura fora dos padrões

Peso dentro dos padrões

Idade dentro dos padrões

Candidata reprovada

 

 

 

Criei este código só que  esta reprovando todas as candidatas, segue abaixo o código se alguem puder me apontar onde estou errando:

#include <conio.h>#include <stdio.h>#include <string.h>int main(){char nome[40];float altura,peso;int idade, i=0;FILE *arq = fopen("Modelos.dat","r");if (arq == NULL){printf("\nArquivo não encontrado");return 1;}printf("\nVeja os resultados das modelos aprovadas.");while(fgets(nome,40,arq)!=NULL){fscanf(arq, "%.2f %.2f %i ",&altura,&peso,&idade);printf("\nModelo: %s",nome);if(altura>=1.70 && altura<=1.85)printf("\nEstatura dentro dos padroes.");elseprintf("\nEstatura fora dos padroes.");if(peso>=48.0 && peso<=60.0)printf("\nPeso dentro dos padroes.");elseprintf("\nPeso fora dos padroes.");if(idade>=17 && idade<=21)printf("\nIdade dentro dos padroes.");elseprintf("\nIdade fora dos padroes.");if(altura>=1.70 && altura<=1,85 && peso>=48.0 && peso<=60.0 && idade>=17 && idade<=21)printf("\nModelo aprovada!!!.");elseprintf("\nModelo reprovada.");}fclose(arq);getch();return 1;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

Tennte organizar esses if..else.

 

Crie uma variável boolean(em C vamos tratar como 0 e 1) para mostrar somente o resultado final(aprovada/reprovada).

int aprovada = 1;

Dentro desses else, coloque ele como falso:

if(altura>=1.70 && altura<=1.85)  printf("\nEstatura dentro dos padroes.");else{  printf("\nEstatura fora dos padroes.");  aprovada = 0;}

Faça isso nos outros if..else

 

No final, só altere esse if:

if(aprovada)printf("\nModelo aprovada!!!.");elseprintf("\nModelo reprovada.");}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde meu caro, fiz como voce me pediu, assim como mostra o codigo abaixo. Mas ainda todas as candidatas estão tendo suas saídas fora dos padrões e sucessivamente sendo reprovada:

#include <conio.h>#include <stdio.h>#include <string.h>int main(){    char nome[40];    float altura,peso;    int idade, aprovada = 1;    FILE *arq = fopen("Modelos.dat","r");    if (arq == NULL)    {            printf("\nArquivo nao encontrado");            return 1;    }    printf("\nVeja os resultados das modelos aprovadas.");        while(fgets(nome,40,arq)!=NULL)    {          fscanf(arq, "%.2f %.2f %i ",&altura,&peso,&idade);          printf("\nModelo: %s",nome);                    if(altura>=1.70 && altura<=1.85)             printf("\nEstatura dentro dos padroes.");          else           {          printf("\nEstatura fora dos padroes.");            aprovada = 0;          }                    if(peso>=48.0 && peso<=60.0)             printf("\nPeso dentro dos padroes."); else {  printf("\nPeso fora dos padroes.");  aprovada = 0; }                              if(idade>=17 && idade<=21)             printf("\nIdade dentro dos padroes.");          else          {            printf("\nIdade fora dos padroes.");            aprovada = 0;          }                     if(aprovada)             printf("\nModelo aprovada!!!.");          else             printf("\nModelo reprovada!!!");    }    fclose(arq);getch();return 1;}

veja foto do resultado ao executar.

 

https://www.dropbox.com/s/x1n32crehg6e31p/Captura%20de%20tela%202014-05-06%2015.26.39.png

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obs: scanf não se usa %.2f

O certo seria: %f

Use %.2f somente no printf

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu caro o erro continua acontecendo, todas estão sendo reprovadas e fora dos padrões. Mesmo eu tirando aquela observação que você me disse.

 

Nilton

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

Crie um printf antes do resultado pra ver se as variáveis estão com o valor fornecido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia meu caro

 

Sou leigo ainda na linguagem C, estou aprendendo, e me embananei com sua resposta, onde no meu código devo colocar este printf. Me perdoe por estar enchendo o saco. Mas preciso muito que este programa de certo..

 

Nilton

 

OBS: Entendi o que voce quis dizer, fiz aqui e é verdade ele nao esta conseguindo pegar os valores dentro o arquivo, como posso fazer que ele pegue os valores, e faça a comparação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tenho muita experiência com arquivos em C, mas verifique se o arquivo está abrindo. Exemplo:

FILE *arquivo;if((arquivo = fopen("teste","w")) == NULL)  {    printf("Erro ao abrir arquivo!!!\n");    exit(1);  }

fonte: http://homepages.dcc.ufmg.br/~joaoreis/Site%20de%20tutoriais/c_int/arquivos.htm

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, você está lendo tudo (nome, altura, peso, idade) para o nome da modelo... manda a estrutura do seu arquivo .dat que tento te ajudar melhor.. agora.. partiu almoço ahahah

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ixi.

Acho que o problema são os espaços entre o nome e sobrenome.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nilton,

 

O problema é mesmo o que eu te disse...

A altura, o peso e a idade estão salvos no arquivo como string.

Você está lendo tudo e colocando na variável nome, já que você está lendo 40 posições fixas.

Recomendo, ao gravar seu arquivo .dat, escrever o nome com os 40 caracteres, ou escrever um final de string, para saber quando terminou o nome, ou ainda, antes de escrever o nome, gravar um inteiro com o numero de caracteres que o nome tem, para fazer a leitura apenas do nome.

Depois, para gravar os outros dados, salve-os como float, int ou como for necessário, para não ter problemas com a leitura do arquivo depois.

 

Espero ter ajudado

Qualquer problema ou erro(inclusive meu), pode comentar, tá meio corrido aqui, mas vou dar uma olhada quando puder.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro Thiago ajudou sim entendi o que você quis me dizer. 

 

Consegui fazer o que voce me disse agora esta mostrando quem esta fora dos padrões e dentro como CANDIDATA APROVADA, mudei de 40 para 16 no nome, SEGUE UM PRINT COMO EXEMPLO

 

https://www.dropbox.com/s/v5ia7rnjdp2exom/Captura%20de%20tela%202014-05-07%2015.30.44.png

 

SEGUE CÓDIGOpra voce dar uma olhada:

#include <conio.h>#include <stdio.h>#include <string.h>int main(){    char nome[16];    float altura,peso;    int idade;    int aprovada = 1;    FILE *arq;    arq = fopen("Modelos.dat","r");    if (arq == NULL)    {            printf("\nArquivo nao encontrado");            return 1;    }    printf("\nResultados de acordo com os padroes se estão aprovadas ou nao.\n\n");    while(fgets(nome,16,arq)!=NULL)    {          fscanf(arq, "%f %f %i ",&altura,&peso,&idade);          printf("\nCandidata: %s\n",nome);          if(altura>=1.70 && altura<=1.85)             printf("\nEstatura dentro dos padroes.");          else          {          printf("\nEstatura fora dos padroes.");            aprovada = 0;          }          if(peso>=48.0 && peso<=60.0)             printf("\nPeso dentro dos padroes."); else {  printf("\nPeso fora dos padroes.");  aprovada = 0; }          if(idade>=17 && idade<=21)             printf("\nIdade dentro dos padroes.");          else          {            printf("\nIdade fora dos padroes.");            aprovada = 0;          }          if(aprovada == 0)// AQUI EU COLOQUEI APROVADA  == 0 ACHO QUE O ERRO ESTA AQUI!!!             printf("\nCandidata aprovada!!!.\n\n");          else             printf("\nCandidata reprovada!!!\n\n");    }fclose(arq);getch();return 0;} 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz uma alteração no código caro thiago ou Math.PI, agora ele esta mostrando quem esta com os 3 critérios no padrão como aprovada e 3 critérios fora do padrão como reprovada. Só que se 2 esta no padrão e um não ele esta aprovando e eu queria que reprovasse. Segue código modificado abaixo se puderem ver uma solução estarei grato.

#include <conio.h>#include <stdio.h>#include <string.h>int main(){    char nome[16];    float altura,peso;    int idade;    int aprovada = 1;    FILE *arq;    arq = fopen("Modelos.dat","r");    if (arq == NULL)    {            printf("\nArquivo nao encontrado");            return 1;    }    printf("\nClassificacao das Modelos.\n\n");    while(fgets(nome,16,arq)!=NULL)    {          fscanf(arq, "%f %f %i ",&altura,&peso,&idade);          printf("\nCandidata: %s\n",nome);          if(altura>=1.70 && altura<=1.85) {  printf("\nEstatura dentro dos padroes.");  aprovada = 1;       }          else          {          printf("\nEstatura fora dos padroes.");            aprovada = 0;          }          if(peso>=48.0 && peso<=60.0) {             printf("\nPeso dentro dos padroes.");             aprovada = 1;          } else {  printf("\nPeso fora dos padroes.");  aprovada = 0; }          if(idade>=17 && idade<=21) {             printf("\nIdade dentro dos padroes.");             aprovada = 1;          }          else          {            printf("\nIdade fora dos padroes.");            aprovada = 0;          }          if(aprovada == 1 )             printf("\nCandidata aprovada!!!.\n\n");          else             printf("\nCandidata reprovada!!!\n\n");    }fclose(arq);getch();return 0;} 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, o problema da aprovação é que... se no último item ela for aprovada, você vai setar o "aprovado" para 1... E ai é como se ignorasse os outros pontos...

Você pode resolver isso utilizando uma variavel para cada ponto... por exemplo

aprovado_altura

aprovado_peso

aprovado_idade

e no final verificar se os tres pontos foram aprovados...

ou então fazer uma soma.. um contador...

aprovado começa com zero.. cada topico q for aprovada, acrescenta 1... se no final o aprovado for 3, então ela passou nos 3 testes...

 

outra recomendação, falando numa boa,

recomendo estudar um pouco de lógica matematica... é tão importante quanto, se não mais, do que aprender programação =)

 

até mais

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×