Program C calculating ages based on date of birth

Asked

Viewed 3,700 times

-2

I’m trying to solve this problem...

Write a program in C language that uses a structure of the type record (struct) to store the data of 20 people. The registration are: name; day of birth; month of birth; year of birth birth. No other field should be created in the record. The program shall calculate and show the ages of persons and the name of the older person. The age shall be calculated from the day fields, month and year of birth. For this, use as reference the date current.

So far, that’s my code:

#include <stdio.h>
#include <stdlib.h>
#define pessoas 2

int main()
{int  i, dias, meses, anos, calculo, diaatual=3, mesatual=9, anoatual=2020, maisvelha;

struct{
char nome [45];
int dia, mes, ano;
}data [pessoas];


printf("\nInsira os dados pessoais:");
printf("\n");

for (int i=0; i<pessoas; i++)
{
printf("\nNome da pessoa %d:\n", i+1);
scanf(" %[^\n]c",&data[i].nome);
setbuf(stdin, NULL);
printf("\nDia de nascimento da pessoa %d:\n", i+1);
scanf("%d",&data[i].dia);
printf("\nMês de nascimento da pessoa %d:\n", i+1);
scanf("%d", &data[i].mes);
printf("\nAno de nascimento da pessoa %d:\n", i+1);
scanf(" %d", &data[i].ano);}

calculo =   365*anoatual + 30*mesatual + diaatual - 365*data[i].ano - 30*data[i].mes - data[i].dia;

anos = calculo/365;
calculo = calculo%365;

meses = calculo/30;
calculo = calculo%30;

dias = calculo;

for (int i=0; i<pessoas; i++)
{
printf("\n%s tem %d anos, %d meses, e %d dias de idade\n", data[i].nome, anos, meses, dias);

if (maisvelha < anos){
printf("\n%s é a pessoa mais velha \n", data[i].nome);
}
}
return 0;

}

The program does not calculate the years correctly, and also does not indicate the oldest person... Help?

1 answer

0

You will only know who is the oldest person after calculating everyone’s age. So it makes no sense to try to print the respective message inside the for.

In the for you should keep the age of majority found until then (and the respective name), and always keep comparing with the current person being calculated. In fact, the calculation should also be within the loop, after all, if you have several people, each one must have its calculated age. Something like this:

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

#define QTD_PESSOAS 2 // dei um nome melhor para "pessoas"
#define TAM_NOME 45

struct {
    char nome[TAM_NOME];
    int dia, mes, ano;
} data [QTD_PESSOAS];

int main() {
    printf("\nInsira os dados pessoais:\n");
    // primeiro lê os nomes e datas de nascimento
    for (int i = 0; i < QTD_PESSOAS; i++) {
        printf("\nNome da pessoa %d: ", i + 1);
        scanf(" %[^\n]c", data[i].nome);
        printf("\nDia de nascimento da pessoa %d: ", i + 1);
        scanf("%d", &data[i].dia);
        printf("\nMês de nascimento da pessoa %d: ", i + 1);
        scanf("%d", &data[i].mes);
        printf("\nAno de nascimento da pessoa %d: ", i + 1);
        scanf("%d", &data[i].ano);
    }

    // calcula as idades de todos
    int diaatual = 3, mesatual = 9, anoatual = 2020;
    int idadeMaisVelha = -1;
    char nomeMaisVelha[TAM_NOME];
    for (int i = 0; i < QTD_PESSOAS; i++) {
        int totalIdade = 365 * anoatual + 30 * mesatual + diaatual - 365 * data[i].ano - 30 * data[i].mes - data[i].dia;
        if (totalIdade > idadeMaisVelha) { // achei alguém mais velho, atualiza a idade e nome do mais velho
            idadeMaisVelha = totalIdade;
            strcpy(nomeMaisVelha, data[i].nome);
        }

        int anos = totalIdade / 365;
        totalIdade = totalIdade % 365;

        int meses = totalIdade / 30;
        totalIdade = totalIdade % 30;

        int dias = totalIdade;
        printf("\n%s tem %d anos, %d meses, e %d dias de idade\n", data[i].nome, anos, meses, dias);
    }
    printf("\n%s é a pessoa mais velha \n", nomeMaisVelha);
    return 0;
}

See that idadeMaisVelha begins in -1, so any value that is calculated with certainty will be greater than it. Within the for, I check if the calculated age is greater than idadeMaisVelha (which will contain the highest age calculated so far). At the end of the loop she shall be the age of the oldest person (and nomeMaisVelha shall be named).

Browser other questions tagged

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