Jump to content

Não lista a idade correta, média de idades é sempre a mesma


jorge618

Recommended Posts

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

 

b.png

 

 

a.png

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

 

 

c.png

 

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);
}
Edited by jorge618
Link to comment
Share on other sites

 testei assim

char *cidade_user[MAX_CIDADE];

mas o resultado é o mesmo.

Vi.o retorno é o mesmo, ou seja, se eu introduzir uma cidade retorna essa cidade,tal coma na imagem que postei em baixo do problema 2.

 

Se eu excluir o dividir por n na media, ou seja fazer o somatório das idades de uma cidade, o resultado parece-me correto.

https://gyazo.com/ca723d491c8d5360565849d28cb6af27

Edited by jorge618
Link to comment
Share on other sites

void media_idade(bd*bdv) {
	int i=0,a, n = 0, soma = 0;
	float media = 0;
	char cidade_user[MAX_CIDADE];
	printf("Introduza a cidade:\n");
	scanf("%s", &cidade_user);
	a = stricmp(cidade_user,bdv->vp->localidade);
	for (i;i<bdv->npessoas; i++)
	{
		if (a == 0) 
		{
			n++;
			soma = bdv->vp[i].idade + soma;

		}
		else
		{
			printf("Cidade nao encontrada\n");
			return 0;
		}
	}
	getch();
	return 0;
	media = soma/ n;
	printf("A media de idades da cidade %s e %.2f \n", cidade_user, media);
}

Agora aparece sempre cidade não encontrada.

O return 0 esta bem onde está ou tem que estar dentro do if ==0 ?

Link to comment
Share on other sites

/* Isso vai muito mau a nivel de logica */

    for (i;i<bdv->npessoas; i++)
    {
        a = stricmp(cidade_user,bdv->vp[i].localidade) ;
        if (a == 0) 
        {
            n++;
            soma = bdv->vp[i].idade + soma;
        }        
    }

    if ( n == 0 ) 
    {
            printf("Cidade nao encontrada\n");
            return 0;
    }


/* vp e nao vp*/
Link to comment
Share on other sites

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.