Jump to content
MickeyHere

Criar arquivo binário e montar gráficos a partir dele

Recommended Posts

MickeyHere

Olá! Preciso fazer um programa que crie e depois leia um arquivo binário. O arquivo é um compilado de um questionário em que várias pessoas foram entrevistadas e perguntadas: sexo, idade e se é fumante.

O arquivo binário de registros (denominado “resposta.bin”) deve conter as respostas de todas as pessoas entrevistadas. Cada registro deve armazenar a resposta de uma pessoa entrevistada através dos campos: sexo (M/F), idade (inteiro), fumante (S/N). Por fim, o programa deve responder:

1. Qual é o percentual de fumantes em relação ao número total de pessoas entrevistadas?

2. Qual é o percentual de homens não fumantes abaixo de 40 anos em relação ao número total de homens entrevistados?

3. Qual é o percentual de mulheres fumantes acima de 40 anos em relação ao número total de mulheres entrevistadas? 

Eu não estou conseguindo progredir em nada com o projeto. Podem me ajudar?

 

Share this post


Link to post
Share on other sites
MickeyHere

Eu não sei como escrever tal código. Não sei como escrever o arquivo binário (este já deve ser previamente criado), já que devo extrair as informações e guardar no registro para cada pessoa.

Share this post


Link to post
Share on other sites
MickeyHere
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct dados{
	char sexo;
	int idade; //tem que ser inteiro
	char fumante;
};


int main(){
dados pessoa[100]; // definir tamanho do DADOS PESSOA
FILE *arq;
char saida;
int i, contagem, cont_m, cont_f, cont_fumante, cont_nfumante;
//VER O PROBLEMA DA LEITURA DAS VARIAVEIS CHAR
arq = fopen("resposta.bin","wb"); //CRIA O ARQUIVO E APENAS ESCREVE

printf("Deseja inserir uma resposta: S(sim)/N(nao)");
scanf("%c" ,&saida);
fflush(stdin); 
i=1;
  while (saida != 'N'){ 	//Preenchendo 
  	printf("Sexo M-masculino/F-feminino: ");	
    scanf("%s", &pessoa[i].sexo);
    fflush(stdin); 
  	printf("Fumante ? S-sim/N-nao: ");
  	scanf("%s", &pessoa[i].fumante);
  	fflush(stdin); 
  	printf("Idade (ex :05- cinco): ");
    scanf("%d",&pessoa[i].idade);  	  	
	printf("Deseja inserir uma resposta: S(sim)/N(nao)");
	scanf("%s", &saida);
	fflush(stdin); 
	i++;
}
contagem =i;
if( fwrite(&pessoa, sizeof(struct dados), i, arq) ==i){
printf("Dados cadastrados");
}

if((arq = fopen("resposta.bin","rb")) ==NULL){
	printf("Erro ao abri arquivo. O programa será fechado. \n");
	system("pause");
	exit(1);
 } 

if (fread(&pessoa, sizeof(struct dados), i, arq)==1){

return 0;
}}

Bem, este código está a funcionar da seguinte maneira: nele eu escrevo todas as informações no arquivo, sendo que eu devo ter o arquivo pronto antes de executar o código, mas fiz isso a fim de tentar preencher usando o algoritmo. 

A questão é, como irei usar estes dados cadastrados a fim que responder às perguntas?

Share this post


Link to post
Share on other sites
HappyHippyHippo

nesse código tens uma instrução de escrita de um registo no ficheiro, achas que consegues ler o ficheiro e preencher o array pessoa com os dados deste ?


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

Share this post


Link to post
Share on other sites
MickeyHere

Bem, resolvi começar o trabalho do zero junto da minha dupla, pois estava impossível de decifrar o código que ele me passou (risos).

Dito isso, separei os problemas por partes. E aqui vai a primeira: eu gostaria de saber como faço para o programa ler o arquivo.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct dados{
	char sexo;
	int idade;
	char fuma;
};
void leArquivo (dados *vet);
int main(){
	dados *vetor;
	FILE *arq;
	printf(leArquivo(*vetor));
	return 0;
}
	

void leArquivo (dados *vet){
	//dados d;
	int i = 0;
	FILE *arquivo;	
	arquivo = fopen("resposta.bin","rb");
	for (i=0;i<3;i++)
		fscanf(arquivo,"%s\n",vet[i]);
	for (i=0;i<1;i+3)
		printf(arquivo,"%s\n",vet[i]);
		printf(arquivo,"%d\n",vet[i+2]);
		printf(arquivo,"%s\n",vet[i+3]);
	fclose(arquivo);
}

 

Share this post


Link to post
Share on other sites
MickeyHere
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define max 3
struct pessoa{
	int idade;
	char sexo,fuma;
};
int main(){
	pessoa p[max];
	int menu,i,j,homens,mulheres,fumam,ma,me,c;
	float porcentagem;
	FILE *resposta;
	
	resposta = fopen("resposta.bin","rb");
	
	if(resposta == NULL){
		resposta = fopen("resposta.bin","wb");
		i = 0;
	}else{
		j = 0;
		do{
			fscanf(resposta,"%c\n",&p[j].sexo);
			if (p[j].sexo == 'M'){
				homens++;
			}else{
				mulheres++;
			}
			fscanf(resposta,"%c\n",&p[j].fuma);
			if (p[j].fuma == 'S'){
				fumam++;
			}
			fscanf(resposta,"%d\n",&p[j].idade);
			if (p[j].idade > 40){
				ma++;
			}else{
				me++;
			}
			fscanf(resposta,"%d\n",&i);
			j++;
		}while(!feof(resposta));
		fclose(resposta);
	}
	do{
		system("CLS");
		printf("[1] - Adicionar novo dado                     -\n");
		printf("[2] - Mostrar relacao fumantes                -\n");
		printf("[3] - Mostrar relacao fumantes entre homens   -\n");
		printf("[4] - Mostrar relacao fumantes entre mulheres -\n");
		printf("[0] - Sair                                    -\n");
		printf("Por favor, escolha uma opcao: ");
		scanf("%d",&menu);
		if(menu == 1){
			system ("CLS");
			printf("Informe o sexo da pessoa [M/F]: \n");
			scanf("%c",&p[i].sexo);
			if (p[i].sexo == 'M'){
				homens++;
			}else{
				mulheres++;
			}
			fflush(stdin);
			printf("Informe se a pessoa fuma ou nao [S/N]: \n");	
			scanf("%c",&p[i].fuma);
			if (p[i].fuma == 'S'){
				fumam++;
			}
			fflush(stdin);
			printf("Informe a idade da pessoa: \n");
			scanf("%d",&p[i].idade);
			if (p[i].idade > 40){
				ma++;
			}else{
				me++;
			}
			fflush(stdin);
			resposta = fopen("resposta.bin","wb");
			fprintf(resposta,"%c\n",p[i].sexo);
			fprintf(resposta,"%c\n",p[i].fuma);
			fprintf(resposta,"%d\n",p[i].idade);
			i++;
			fprintf(resposta,"%d",i);
			fclose(resposta);
			system("CLS");
			system("PAUSE");
		}else{
		if(menu == 2){
			system("CLS");
			porcentagem = fumam/(homens+mulheres);
			printf("%0.2f\n",porcentagem);
			system("PAUSE");
		}else{
		if(menu == 3){
			system("CLS");
			for(i=0;i<max;i++){
				if((p[i].sexo = 'M') && (p[i].idade < 40)){
					c++;
				}
			}
			porcentagem = c/homens;
			printf("%0.2f\n",porcentagem);
			system("PAUSE");		
		}else{
		if(menu == 4){
			system("CLS");
			for(i=0;i<max;i++){
				if((p[i].sexo = 'F') && (p[i].idade > 40)){
					c++;
				}
			}
			porcentagem = c/mulheres;
			printf("%0.2f\n",porcentagem);
			system("PAUSE");		
		}	
		}	
		}
		}
	}while (menu != 0);
	return 0;
}

Agora parece estar tudo OK, mas sinto que existem erros lógicos. Alguém pode ajudar-me? As variáveis não estão sendo preenchidas corretamente, nem o arquivo resposta.bin na pasta do programa. Além disso, nesta parte:

if(menu == 1){
printf("Informe o sexo da pessoa [M/F]: \n");
			scanf("%c",&p[i].sexo);
			if (p[i].sexo == 'M'){
				homens++;
			}else{
				mulheres++;
			}

O programa não lê a variável. Ele simplesmente pula para o passo seguinte. O que está a acontecer?

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.