Jump to content
jorge618

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

Recommended Posts

jorge618

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

Share this post


Link to post
Share on other sites
jorge618

A única diferença que eu encontrei foi a falta de ponteiro no char cidade_user, mas pondo o ponteiro o erro persiste.

Share this post


Link to post
Share on other sites
Xendro

qual ponteiro ?

a variavel e um array de chars, não um apontador.

viste a funcao "stricmp" ? que retorno tem e que retorno estas a testar ?

Share this post


Link to post
Share on other sites
jorge618

 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

Share this post


Link to post
Share on other sites
Xendro

stricmp é a funcao de C usada na tua funcao "media_idade"

se tiveses verificado o retorno ( enviei-te um link) verias que esta devolve "0" quando ambas as strings são iguais.

da forma que fazes a comparação estas a usar todos os que são diferentes da cidade escolhida para para fazer a media sobre esses!

Share this post


Link to post
Share on other sites
jorge618
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 ?

Share this post


Link to post
Share on other sites
Xendro
/* 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*/

 

Share this post


Link to post
Share on other sites
jorge618

Nunca tive logica amigo :s

copiando o seu código depois de inserir uma cidade o programa não faz rigorosamente nada.

Se eu meter o segundo if dentro do ciclo for aparece sempre cidade não encontrada.

Share this post


Link to post
Share on other sites
HappyHippyHippo

ninguem disse para meter o segundo if dentro do ciclo

se a mensagem aparece é porque a cidade teallmente não foi encontrada na lista de pessoas


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
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.