Ler ficheiro e calcular a media

1. Ler ficheiro e calcular a media

jorge
jorge618

(usa Outra)

Enviado em 31/12/2016 - 18:32h

void media_idade(bd*bdv) {
int i, n = 0, soma = 0;
float media = 0;
char cidade_user[MAX_CIDADE];
bdv->npessoas = 10000;
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);
}


#include "struct_cidadao.h"
typedef struct {
pessoa *vp;
int npessoas;
}bd;


#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;


Quando executa a função o resultado é sempre o mesmo e se inserir uma cidade que o ficheiro não contem não me aparece a mensagem de erro (mas isso eu não fiz)

Alguem me consegue ajudar ?

Obrigado desde já
Cumps jorge618


  


2. Re: Ler ficheiro e calcular a media

Paulo
paulo1205

(usa Ubuntu)

Enviado em 02/01/2017 - 00:50h

jorge618 escreveu:

void media_idade(bd*bdv) {
int j, n = 0, soma = 0;
float media = 0;
char cidade_user[MAX_CIDADE];
bdv->npessoas = 10000;
printf("Introduza a cidade:\n");
scanf("%s", &cidade_user);
for (j = 0; j<bdv->npessoas; j++)
{
if (stricmp(cidade_user, bdv->vp[j].localidade)) // compara a cidade introduzida pelo utilizador com as do ficheiro
{
n++;
soma = bdv->vp[j].idade+soma;
}
}
media = soma / n;


As variáveis soma e n são do tipo int. Quando você opera uma divisão que tem tanto o dividendo como o divisor inteiros, o compilador calcula um quociente também inteiro. Desse modo, por exemplo, se soma valer 3 e n for igual a 2, o resultado da divisão será 1 (int), não 1.5f., e esse resultado inteiro será apenas convertido para float no momento de realizar a atribuição de valor à variável media

	printf("A media de idades da cidade %s e %.2f \n", cidade_user, media);
}


#include "struct_cidadao.h"
typedef struct {
pessoa *vp;
int npessoas;
}bd;


#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;


Quando executa a função o resultado é sempre o mesmo e se inserir uma cidade que o ficheiro não contem não me aparece a mensagem de erro (mas isso eu não fiz)


Se você não fez, eis uma boa razão para não aparecer o resultado!

Mas me parece que quando a função não encontrar a cidade digitada, n terá valor zero ao final da varredura. Como você não protegeu o cálculo da média com uma verificação do valor do divisor, deveria acontecer um erro de divisão por zero.

Eu não sei exatamente o que você precisa fazer, mas eis como eu corrigiria o cálculo da média:

  - Verificaria o valor de n, para ver ser ele é zero:
    - se for zero, a cidade não foi encontrada;
    - caso contrário, a cidade foi encontrada n vezes, e é possível calcular uma média fracionária convertendo um dos operandos da divisão (ou ambos) para float (por exemplo, fazendo algo como “media=(float)soma/(float)n”).






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts