Vector of struct with comparison

Asked

Viewed 23 times

-1

The program returns wrong information and I can’t identify what’s wrong. The vector only generates incorrect outputs, I made all kinds of changes in the last if but did not work.

#include <stdio.h>
#include <locale.h>
#define tam 3
typedef struct  
{
char nome[50];
int idade;
}pessoa [tam];

int main (){
setlocale (LC_ALL, ""); 

pessoa humana;
int velho=0, novo=200, i; 

for (i=0;i<tam;i++){
    printf("Entre com o nome: ");
    fflush(stdin);
    fgets(humana[i].nome, 50, stdin);
    
     printf("Entre com a idade:");
     scanf("%d", &humana[i].idade);
}
  
  for (int i= 0; i<tam; i++){
    if (humana[i].idade > velho) 
    velho = i; 
    else if (humana[i].idade < novo)
    novo = i;
}
 
   
printf ("\nO mais velho é %s com %d anos", humana[velho].nome, humana[velho].idade);
printf ("\nO mais novo é %s com %d anos", humana[novo].nome, humana[novo].idade);
return 0; 
}

1 answer

0

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <locale.h>
#define tam 3
typedef     struct
{
    char nome[50];
    int  idade   ;
}   pessoa       ;
int main() 
{
    setlocale(LC_ALL, "");
    pessoa humana[ tam ];                 /// é o vetor que tem posições , e não a struct
    int velho = 0,ID_velho,ID_novo, 
        tm=0, novo = 200, i;
    for (i = 0; i < tam; i++)
    {
        printf("Entre com o nome: ");
        fgets(humana[i].nome, 50, stdin);  /// pega todos os caracteres digitados ate no maximo 
                                           /// a qtd "50" menos 1 que é 49 , pois ele reserva 
                                           /// uma posição para o finalizador de string '\0' , 
                                           /// e se digitar menos de 49 ele pega também o newline
        fflush(stdin);                     /// em alguns compiladores funciona sem esses 
        setbuf(stdin, NULL);               /// mas no visual studio precisa
        tm = strlen(humana[i].nome);
        printf("tam = %d\n", tm);
        for (int w = 0; w < tm+1; w++)
        {
            printf("%d ", w);
            if(humana[i].nome[w] != '\n' && humana[i].nome[w] != '\0' )
            printf("%c\n", humana[i].nome[w]);
            if (humana[i].nome[w] == '\n')
            {
                printf("eh barra ene !\n");
            } 
            else
            {
                if (humana[i].nome[w] == '\0')
                {
                    printf("eh barra zero !\n");
                }
            }
        }
        humana[i].nome[strlen(humana[i].nome) - 1 ] = '\0';/// remover o newLine que foi 
        printf("Entre com a idade:");      /// pego pelo fgets por colocar o '\0' que sinaliza o
        scanf("%d", &humana[i].idade);     /// final da stringsenao ao escrever essas string's ele 
                                           /// vai pular uma linha automaticamente                      
        fflush(stdin);                     /// em alguns compiladores funciona sem esses 
        setbuf(stdin, NULL);               /// mas no visual studio precisa
        if (i == 0)                        
        {
            ID_velho = humana[i].idade;    /// inicializa essas variáveis
            ID_novo  = humana[i].idade;    /// com o primeiro valor inserido pelo usuario
        }
    }
    for (int i = 0; i < tam; i++)          /// percorrer todos os elementos do vetor
    {
        if (humana[i].idade > ID_velho)    /// se a idade desse for maior que a do anterior
        {
            velho = i;                     /// Marca a posição dessa idade maior
            ID_velho = humana[i].idade;    /// armazena na variaveL ID_velho o valor dessa maior idade
        }                                  /// encontrada ate aqUi
        if (humana[i].idade < ID_novo)     /// se a idade desse for menor que a do anterior
        {
            novo = i;                      /// Marca a posição dessa idade menor
            ID_novo = humana[i].idade;     /// armazena na variaveL ID_novo o valor dessa menor idade
        }                                  /// encontrada ate aqUi
    }                                      /// se forem iguais , não precisa fazer nada
                                           /// e deixa do jeito que está
    printf("\nO mais velho é  %s  com  %d  anos .  \n\
            \rO mais novo  é  %s  com  %d  anos .\n\n", 
            humana[velho].nome, humana[velho].idade   ,
            humana[novo ].nome, humana[novo].idade   );
    return 0;
} 

Browser other questions tagged

You are not signed in. Login or sign up in order to post.