Daniel Filipe Posted October 23, 2016 at 08:36 PM Report #599854 Posted October 23, 2016 at 08:36 PM 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).
HappyHippyHippo Posted October 24, 2016 at 07:39 AM Report #599859 Posted October 24, 2016 at 07:39 AM define !valores anormais" assim como apresenta um caso exemplo onde esse valores anormais se podem reproduzir IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Daniel Filipe Posted October 24, 2016 at 11:49 AM Author Report #599865 Posted October 24, 2016 at 11:49 AM 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.
apocsantos Posted October 24, 2016 at 03:24 PM Report #599869 Posted October 24, 2016 at 03:24 PM 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"
Flinger Posted October 24, 2016 at 08:47 PM Report #599876 Posted October 24, 2016 at 08:47 PM (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 October 24, 2016 at 09:08 PM by Flinger
Solution Daniel Filipe Posted October 25, 2016 at 04:41 PM Author Solution Report #599900 Posted October 25, 2016 at 04:41 PM 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; }
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now