Jump to content

Variável com valores anormais (estruturas)


Go to solution Solved by Daniel Filipe,

Recommended Posts

Posted

Boa Noite,

Sou um novo estudante na linguagem C e também neste forum, o qual conheço há algum tempo no entanto esta é a minha primeira participação. Peço desculpa se estou a violar alguma regra.

Deixando a participação de lado, num exercício em aula sobre estruturas o qual achei bastante facil (exemplo em aula), decidi adicionar um pouco de complexidade ao exercício proposto e adicionei vetores/arrays(ainda não sei bem o que lhes chamar). No entanto deparei-me com um erro,o qual não concigo resolver.

Exercício: Pedir dados ao utilizador como, nome, data de nascimento, género, salário. Com estes dados, informe o utilizador da sua idade atual. 

Complexidade adicionada: Em vez de ser um utilizador apenas, tentei usar arrays/vetores para que pudesse calcular a idade de vários utilizadores. Usar a data do sistema em véz de  data inserida manualmente.

Código: 

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

int main(int argc, char *argv[]) {
    typedef struct Data {
        int dia;
        int mes;
        int ano;
    } DATA;

    typedef struct Pessoa {
        char nome[40];
        DATA dt_nasc;
        char genero;
        float salario;
    } PESSOA;

    int i;

    printf("Quantas pessoas deseja inserir?\n");
    scanf("%d",&i);
    printf("\n\n");
    PESSOA p1[i];

    int n;

    for (n=1; n<=i; n++) {
        printf("Pessoa n.%d\n\n",n);
        printf("Nome:");
        scanf(" %39[^\n]%*c",p1[n].nome);
        printf("\nData de Nascimento: (formato = dia-mes-ano): ");
        scanf("%d-%d-%d",&p1[n].dt_nasc.dia,&p1[n].dt_nasc.mes,&p1[n].dt_nasc.ano);
      //  printf("\nGenero: ");
       // scanf(" %c",&p1[n].genero);
       // printf("\nSalário: ");
      //  scanf("%f",&p1[n].salario);
    }
/*
    printf("\n\n| N. Pessoa\t|\tNome da Pessoa\t| Data Nascimento\t | Genero\t| Salário\t |");

    for (n=1; n<=i ; n++){
        printf("\n\t%d\t\t%s\t%d-%d-%d\t%c\t%.2f", n, p1[n].nome,p1[n].dt_nasc.dia,
               p1[n].dt_nasc.mes,p1[n].dt_nasc.ano,p1[n].genero, p1[n].salario);
    }
*/

    time_t t = time(NULL);
    struct tm tm = *localtime(&t);
    
    int mes_at = tm.tm_mon+1;
    printf("\nData:%d-%d-%d",tm.tm_mday,mes_at,tm.tm_year);

   for (n=1; n<=i; n++) {

        int idade;

        idade=tm.tm_year - p1[i].dt_nasc.ano;

        printf("\nIdade: %d", idade);


        if (p1[n].dt_nasc.mes < mes_at) {
            printf("\n\n\nPessoa n.:%d tem %d anos.\n\n\n",n,idade);
        } else if (p1[n].dt_nasc.mes == mes_at && p1[i].dt_nasc.dia < tm.tm_mday) {
            printf("\n\n\nPessoa n.:%d tem %d anos.\n\n\n",n,idade-1);
        } else if (p1[n].dt_nasc.mes == mes_at && p1[i].dt_nasc.dia == tm.tm_mday) {
            printf("\n\n\nPessoa n.:%d tem %d anos hoje. PARABÉNS!\n\n\n",n,idade);
        } else{
        printf("\n\n\nPessoa n.:%d tem %d anos.\n\n\n",n,idade-1);
        }
    }

    system("Pause");
    return 0;
}

Problema: a variável "idade" tem valores anormais. Fazendo com que o resultado final do código seja incorreto.

Peço então que alguém me aponte onde esta o erro que está a causar o problema

Obrigado pelo vosso tempo! 

Edit:

Peço desculpa, algum código está comentado, código esse que não é relevante para o problema (penço).

Posted
Em 24/10/2016 às 08:39, HappyHippyHippo disse:

define !valores anormais" assim como apresenta um caso exemplo onde esse valores anormais se podem reproduzir

Bom Dia,

exemplo input : 

nome: asd
data de nascimento: 22-11-93
género: m ("a váriavel é do tipo char onde  o suposto valor deve ser m, para masculino ou f, para feminino")
salário: 123

Output do exemplo:

nome: asd
data de nascimento : 22-11-93
género: m
salário: 123.00
data: 24-10-2016
Idade: 107
Pessoa nº:1 tem 106 anos.

O problema é no resultado da variável idade onde uma destas variáveis:

tm.tm_year e p1[ i ].dt_nasc.ano

esta a assumir valores errados mas só os assume (errados) durante o cálculo em idade, como mostrado no exemplo.

Posted

Boa tarde,

Creio que o problema possa estar aqui:

struct tm tm = *localtime(&t);

Ora vê

 

#include <stdio.h>
#include <time.h>

int main ()
{
   time_t rawtime;
   struct tm *info;
   char buffer[80];
   time( &rawtime );
   info = localtime( &rawtime );
   printf("Data e hora local em formato string: %s", asctime(info));
   return(0);
}

Cordiais cumprimentos,

Apocsantos

"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Posted (edited)

Embora o apoc tenha razão, e tu tens aí muita coisa errada, a explicação para a idade pode ser algo bem mais simples...

retirado daqui:

Quote

tm_year

The number of years since 1900.

Lê bem a página que aí coloquei e vais descobrir maneiras bem mais fáceis de calcular a idade.

O facto de começares o array a usar a posição 1 também não deve ajudar, já que vais estar a usar memória que não está reservada para as variáveis. Em C a primeira posição de um array é a 0.

Edited by Flinger
  • Solution
Posted

Obrigado por toda a ajuda prestada,

Aqui está o código final e funcional.

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

typedef struct Data {
        int dia;
        int mes;
        int ano;
    } DATA;

    typedef struct Pessoa {
        char nome[40];
        DATA dt_nasc;
    } PESSOA;

int main()
{
   int month;
        int day;
        int year;
    struct tm *current;
        time_t timenow;
        time(&timenow);
            current = localtime(&timenow);
            month = current->tm_mon+1;
            day = current->tm_mday;
            year = current->tm_year;
int np;
    printf("Quantas pessoas deseja processar?\n");
    scanf("%d",&np);

PESSOA p[np];

int i;

for (i=0; i<np ; i++){
    printf("\nPessoa n.: %d",i+1);
    printf("\nNome:");
    scanf(" %39[^\n]%*c",p[i].nome);
    printf("\nData de Nascimento:");
    scanf("%d-%d-%d",&p[i].dt_nasc.dia,&p[i].dt_nasc.mes,&p[i].dt_nasc.ano);
}
printf("\n\tN. Pessoa\t|\tNome\t|\tData de Nascimento\t|");
for (i=0; i<np ; i++){
    printf("\n\t%d\t \t\t%s\t \t%d-%d-%d\n\n", i+1,p[i].nome,p[i].dt_nasc.dia,
               p[i].dt_nasc.mes,p[i].dt_nasc.ano);
}

for (i=0; i<np ; i++){
    int idade;

        idade=year - p[i].dt_nasc.ano;

        if (p[i].dt_nasc.mes < month) || (p[i].dt_nasc.mes == month && p[i].dt_nasc.dia < day) {
            printf("\n\n\nPessoa n.:%d tem %d anos.\n\n\n",i+1,idade);
        } else if (p[i].dt_nasc.mes == month && p[i].dt_nasc.dia == day) {
            printf("\n\n\nPessoa n.:%d tem %d anos hoje. PARABÉNS!\n\n\n",i+1,idade);
        } else{
        printf("\n\n\nPessoa n.:%d tem %d anos.\n\n\n",i+1,idade-1);
        }
}
    system("Pause");
    return 0;
}

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.