Problema 1:depois de listar o novo elemento a sua idade é de 2016, sendo suposto fazer a diferença entre 2016(ano atual) com o ano introduzido na data pedida ao utilizador
void Inserir_Pessoas(bd *bdv)
{
int i = 0;
char ano[5],dt[20];
ano[0] = dt[6];
ano[1] = dt[7];
ano[2] = dt[8];
ano[3] = dt[9];
int anoAtual = devolveAno();
char nnome[MAX_NOME], nlocalidade[MAX_CIDADE], ndata[MAX_DATA]; //Variaveis para guardar os Novos Dados pedidos aos utilizador
printf("\nIntroduza os dados do novo cidadao\n");
printf("\nNome: ");
scanf(" %[^\n]s", nnome);
printf("\nData de nascimento:(formato dd-mm-aaaa): ");
scanf(" %s", ndata);
printf("\nCidade: ");
scanf(" %[^\n]s", nlocalidade);
//Acrescenta na estrutura uma nova pessoa
bdv->vp[bdv->npessoas].codigo = bdv->npessoas + 1;
strcpy(bdv->vp[bdv->npessoas].datanasc, ndata);
strcpy(bdv->vp[bdv->npessoas].nome, nnome);
strcpy(bdv->vp[bdv->npessoas].localidade, nlocalidade);
strcpy(ano, "");
bdv->vp[bdv->npessoas].idade = anoAtual - atoi(ano);
bdv->npessoas++;
printf("\nAdicionado com SUCESSO!\n");
system("pause");
}
void listar_tudo(bd * bdv) {
int i;
for (i = 0; i <bdv->npessoas; i++)
{
printf("%d, %s, %d %s %s\n", bdv->vp[i].codigo, bdv->vp[i].nome, bdv->vp[i].idade, bdv->vp[i].datanasc, bdv->vp[i].localidade);
}
};
void completa_struct(bd * bdv) {
int cod = 0;
char dt[20];
char linha[max_linha];
char loc[MAX];
int res = 0;
int i = 0;
char ano[5];
int idadePessoa = 0;
int anoAtual = devolveAno();
FILE *g = fopen("cod_dataN_cidade.txt", "r");
if (g == NULL)
{
printf("\nImpossivel abrir o ficheiro");
system("pause");
return;
}
//enquanto não chegar ao fim do ficheiro, ler
while (!feof(g))
{
strcpy(ano, "");
fgets(linha, max_linha, g);
res = sscanf(linha, "%d %s %[^\n]s", &cod, &dt, &loc);
i = procurar_cidadao(*bdv, cod);
strcpy(bdv->vp[i].datanasc, dt);
strcpy(bdv->vp[i].localidade, loc);
ano[0] = dt[6];
ano[1] = dt[7];
ano[2] = dt[8];
ano[3] = dt[9];
bdv->vp[i].idade = anoAtual - atoi(ano);
}
fclose(g);
printf("\t\t\t\t\t\tFicheiros carregado com sucesso!\n\n");
};
int devolveAno() {
int ano = 0;
time_t now;
if (time(&now) != (time_t)(-1))
{
struct tm *mytime = localtime(&now);
if (mytime)
{
char year[5];
if (strftime(year, sizeof year, "%Y", mytime))
{
ano = atoi(&year);
return ano;
}
}
}
return 0;
};
void preenche(bd * bdv) {
FILE *f = fopen("cod_nome.txt", "r");
if (f == NULL)
{
printf("\nImpossivel abrir o ficheiro");
system("pause");
return;
}
int numlinhas = 0, res = 0;
char linha[max_linha];
//enquanto não chegar ao fim do ficheiro, ler
while (!feof(f))
{
numlinhas++;
fgets(linha, max_linha, f);
}
fclose(f);
bdv->vp = (pessoa *)malloc(numlinhas * sizeof(pessoa));
f = fopen("cod_nome.txt", "r");
if (f == NULL)
{
printf("\nImpossivel abrir o ficheiro");
system("pause");
return;
}
float cod = 0;
char nomes[200] = "";//////
numlinhas = 0, res = 0;
//enquanto não chegar ao fim do ficheiro, ler
while (!feof(f))
{
fgets(linha, max_linha, f);
res = sscanf(linha, "%f %[^\n]s", &cod, &nomes);
bdv->vp[numlinhas].codigo = cod;
strcpy(bdv->vp[numlinhas].nome, nomes);
numlinhas++;
}
bdv->npessoas = numlinhas - 1;
fclose(f);
};
#define MAX_NOME 200
#define MAX_CIDADE 100
#define MAX_DATA 11
typedef struct {
int codigo;
char nome[MAX_NOME];
char localidade[MAX_NOME];
char datanasc[11];
int idade;
}pessoa;
typedef struct {
pessoa *vp;
int npessoas;
}bd;
Problema 2: Media de idades é sempre a mesma
void media_idade(bd*bdv) {
int i, n = 0, soma = 0;
float media = 0;
char cidade_user[MAX_CIDADE];
printf("Introduza a cidade:\n");
scanf("%s", &cidade_user);
for (i = 0; i<bdv->npessoas; i++)
{
if (stricmp(cidade_user, bdv->vp[i].localidade)) // compara a cidade introduzida pelo utilizador com as do ficheiro
{
n++;
soma = bdv->vp[i].idade+soma;
}
}
media = soma / n;
printf("A media de idades da cidade %s e %.2f \n", cidade_user, media);
}
↧