Jump to content
shotaz

Problema em C

Recommended Posts

shotaz

Boas pessoal estou aqui com um problema ao qual não sei resolver, e queria umas sugestões.

Vou mostrar-vos o programa todo.

#include<stdio.h>
#include<string.h>
#define n_records 10000

////////////////////////////////////////////
//////////DECLARAÇAO DAS ESTRUTURAS/////////
////////////////////////////////////////////

typedef struct {
char id_cliente[10];
char municipio [30];
int Zona;
int consumo;
int mes;
int dia;
} CLIENTES;

typedef struct {
int hi;
int mi;
} HORAI;

typedef struct {
int hf;
int mf;
} HORAF;

/////////////////////////////////////////////
///////////////////FUNCOES///////////////////
/////////////////////////////////////////////

int lerficheiro(char *filename, char *file, CLIENTES *vectorclientes, HORAI *vectorhorai, HORAF *vectorhoraf){
int mes, dia, horai, minutoi, horaf, minutof, consumo;
int i,j;
char idcliente[10];
FILE *ficheiro;
FILE *file_txt;
ficheiro = fopen(file, "r");
file_txt = fopen(filename,"r");
if (ficheiro == NULL)
	puts("Impossivel abrir o ficheiro");
else
{	
	puts("Ficheiro Aberto com sucesso");
	for(j=0;j<n_records;j++)
	{
		if(!feof(ficheiro))
		{
			fscanf(ficheiro, "%s", &idcliente[10]);
			vectorclientes[j].id_cliente[10] = idcliente[10];
		}
	}
}
if(file_txt==NULL)
		puts("Impossivel abrir o ficheiro");
else
	{
		puts("Ficheiro Aberto com sucesso");
	for(i=0;i<n_records;i++)
	{
		if(!feof(file_txt))
		{
				fscanf(file_txt,"%d %d %d:%d %d:%d %d", &mes, &dia, &horai, &minutoi, &horaf, &minutof, &consumo);
				vectorclientes[i].mes = mes;
				vectorclientes[i].dia = dia;
				vectorhorai[i].hi = horai;
				vectorhorai[i].mi = minutoi;
				vectorhoraf[i].hf = horaf;
				vectorhoraf[i].mf = minutof;
				vectorclientes[i].consumo = consumo;
				printf("%s %d %d %d:%d %d:%d %d \n",vectorclientes[i].id_cliente, vectorclientes[i].mes, vectorclientes[i].dia, vectorhorai[i].hi, vectorhorai[i].mi,vectorhoraf[i].hf,vectorhoraf[i].mf ,vectorclientes[i].consumo);
		}
	}
}
return 0;
}


int LerConsumoClienteMes(CLIENTES *vectorclientes, HORAI *vectorhorai, HORAF *vectorhoraf){
FILE *file_txt;
lerficheiro("producao.txt", "cli_mun.txt", vectorclientes, vectorhorai, vectorhoraf);
int mes, i, j, x;
char id[10];
printf("Introduza o numero de cliente e o mes\n");
scanf("%s %d", &id[10], &mes);
for(i=1;i<=n_records;i++){
	if(vectorclientes[j].id_cliente[10]==id[10]){
		fopen(id[10], "a+");
		for(j=0;j<=12;j++){
			if(mes < 0 || mes > 12)
				printf("Mes invalido!\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
			else{
				if(vectorclientes[j].mes==mes){
					printf("/n A guardar informacao no ficheiro...\n");
					for(x=0;x<=n_records;x++){
						fprintf(file_txt,"%d",vectorclientes[x].mes);
						fprintf(file_txt,"%d",vectorclientes[x].dia);
						fprintf(file_txt,"%d",vectorhorai[x].hi);
						fprintf(file_txt,":");
						fprintf(file_txt,"%d",vectorhorai[x].mi);
						fprintf(file_txt,"%d",vectorhoraf[x].hf);
						fprintf(file_txt,":");
						fprintf(file_txt,"%d",vectorhoraf[x].mf);
						fprintf(file_txt,"%d",vectorclientes[x].consumo);
					}
					//Fecho do ficheiro
					fclose(file_txt);
					printf("Escrita no ficheiro concluida com sucesso!\n");
				}
			}
		}
	}
		else
			puts("cliente invalido!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
			break;
}
return 0;
}

/////////////////////////////////////////////
////////////DECLARACAO DOS METODOS///////////
/////////////////////////////////////////////

void MenuConfigurarPais();
void MenuHistograma();
void MenuProducaoMes();
void MenuFacturacao();
void MenuListarConsumos();
void ecra();
void menu();

/////////////////////////////////////////////
//////////////////METODOS///////////////////
///////////////////////////////////////////

void MenuConfigurarPais(){
    char op;
    do{
	puts("\t\t _____________________________________");
	puts("\t\t|                                     |");
	puts("\t\t|          Configurar Pais            |");
	puts("\t\t|_____________________________________|\n\n");
	printf("1 - þ Adicionar/Remover zonas\n");
	printf("2 - þ Adicionar/remover/transferir município de uma determinada zona\n");
	printf("3 - þ Adicionar/remover/transferir cliente de um determinado município\n");
	printf("0 - þ voltar\n");
	fflush(stdin);	//limpar o bufer da entrada standart
	op=getchar();
	switch(op){
		case '1': break;
		case '2': break;
		case '3': break;
		case '0': break;
		default:puts("\t\t\tEscolha errada\n");
	}
}
while( op != '0');
}

void MenuHistograma(){
    char op;
    do{
	puts("\t\t _____________________________________");
	puts("\t\t|                                     |");
	puts("\t\t|              Histogramas            |");
	puts("\t\t|_____________________________________|\n\n");
	//printf("%d,%d",'A', 'Z');
	printf("1 - þ De um cliente\n");
	printf("2 - þ De um municipio\n");
	printf("3 - þ De um zona\n");
	printf("4 - þ Do pais\n");
	printf("0 - þ voltar\n");
	fflush(stdin);	//limpar o bufer da entrada standart
	op=getchar();
	switch(op){
	case '1': break;
	case '2': break;
	case '3': break;
	case '4': 	break;
	case '0': menu(); break;
	default:puts("\t\t\tEscolha errada\n");
	}
}
while( op != '0');
}

void MenuProducaoMes(){
    char op;
    do{
	puts("\t\t _____________________________________");
	puts("\t\t|                                     |");
	puts("\t\t|         Avaliacao da producao       |");
	puts("\t\t|_____________________________________|\n\n");
	//printf("%d,%d",'A', 'Z');
	printf("1 - þ Producao total por mes\n");
	printf("2 - þ grafico diferencial entre consumo e producao\n");
	printf("0 - þ voltar\n");
	fflush(stdin);	//limpar o bufer da entrada standart
	op=getchar();
	switch(op) {
		case '1': break;
		case '2': break;
		case '0': break;
		default:puts("\t\t\tEscolha errada\n");
	}
}
while( op != '0');
}

void MenuFacturacao(){
    char op;
    do{
	puts("\t\t _____________________________________");
	puts("\t\t|                                     |");
	puts("\t\t|              Facturacao             |");
	puts("\t\t|_____________________________________|\n\n");
	//printf("%d,%d",'A', 'Z');
	printf("1 - þ De um cliente\n");
	printf("2 - þ De um municipio\n");
	printf("3 - þ De um zona\n");
	printf("4 - þ Do pais\n");
	printf("0 - þ voltar\n");
	fflush(stdin);	//limpar o bufer da entrada standart
	op=getchar();
	switch(op) {
		case '1': break;
		case '2': break;
		case '3': break;
		case '4': break;
		case '0': break;
		default:puts("\t\t\tEscolha errada\n");
	}
}
while( op != '0');
}

void MenuListarConsumos(){
    char op;
    do{
	puts("\t\t _____________________________________");
	puts("\t\t|                                     |");
	puts("\t\t|           Listar consumos           |");
	puts("\t\t|_____________________________________|\n\n");
	//printf("%d,%d",'A', 'Z');
	printf("1 - þ De um cliente\n");
	printf("2 - þ De um municipio\n");
	printf("3 - þ De um zona\n");
	printf("4 - þ Do pais\n");
	printf("0 - þ voltar\n");
	fflush(stdin);	//limpar o bufer da entrada standart
	op=getchar();
	switch(op) {
		case '1': printf("Nao definido!\n"); break;
		case '2': printf("Nao definido!\n"); break;
		case '3': printf("Nao definido!\n"); break;
		case '4':printf("Nao definido!\n"); break;
		case '0': break;
		default:puts("\t\t\tEscolha errada\n");
	}
}
while( op != '1' || op != '2' || op != '3' || op != '4');
}

void ecra(){
puts("\t\t _____________________________________");
puts("\t\t|                                     |");
puts("\t\t|   Leituras e Consumos Electricos    |");
    puts("\t\t|_____________________________________|\n\n");
//printf("%d,%d",'A', 'Z');
printf("1 - þ Ler consumo de um cliente num determinado mes\n");
printf("2 - þ Listar consumos\n");
printf("3 - þ Facturacao\n");
printf("4 - þ Avaliacao da Producao\n");
printf("5 - þ Histogramas\n");
printf("6 - þ Gerar ficheiros de consumo\n");
printf("7 - þ Configurar pais\n");
printf("8 - þ Facturacao variavel\n");
printf("0 - þ sair\n");
}

void menu(CLIENTES *vectorclientes, HORAI *vectorhorai, HORAF *vectorhoraf){
char op; /*para a digitalizaçao da opçao*/
do{
ecra();
printf("\n\nEscolha----->");
fflush(stdin);
op=getchar();/*apanhar a opcao*/
	switch(op){
	case '1': LerConsumoClienteMes(vectorclientes, vectorhorai, vectorhoraf); break;
	case '2': MenuListarConsumos(); break;
	case '3': MenuFacturacao(); break;
	case '4': MenuProducaoMes(); break;
	case '5': printf("Nao definido!\n"); break;
	case '6': printf("Nao definido!\n"); break;
	case '0': puts("ate logo\n"); break;
	default:puts("\7\7escolha uma opcao correcta\n");/*caso o utilizador intruduza uma opcao invalida, um caso que nao esteja definido*/
	}	
}
while(op != '0');
}

void main(){
static CLIENTES vectorclientes[n_records];
static HORAI vectorhorai[n_records];
static HORAF vectorhoraf[n_records];
menu(vectorclientes, vectorhorai, vectorhoraf);
}

Share this post


Link to post
Share on other sites
Diutsu

i==n_records

a condição do for só dá true se i tiver o mesmo valor de n_records


XX SINFO - Semana Informática

Share this post


Link to post
Share on other sites
zorius

Dava jeito mais informação sobre o que faz a função ou para que serve!

Cheira-me que o ciclo for não está declarado como querias, talvez  for(i=1;i<=n_records;i++) deva funcionar

Share this post


Link to post
Share on other sites
shotaz

Mudei a condição do for e resolveu, mas na função ler ficheiro, não tou a conseguir meter a info do ficheiro na struct vectorclientes.id_cliente aparecem-me 0s.

O objectivo desta fase do programa é:

Encher a struct com informação de ficheiros, que consegui só não tenho o idcliente.

Pedir um idcliente e um mes ao utilizador e verificar se são válidos, comparando com a informação da struct.

Segundo essas informações criar um ficheiro com o idcliente introduzido, e meter a info do consumo do mes introduzido nesse ficheiro.

Não sei se me fiz entender.

Share this post


Link to post
Share on other sites
Diutsu

Mudei a condição do for e resolveu, mas na função ler ficheiro, não tou a conseguir meter a info do ficheiro na struct vectorclientes.id_cliente aparecem-me 0s.

Olha para o teu código, mais precisamente para o ciclo for (onde fazes a atribuição) e para a operação de atribuição do vectorclientes[].id_cliente.


XX SINFO - Semana Informática

Share this post


Link to post
Share on other sites
shotaz

peço imensa desculpa por este erro estupido -.-', mas seguindo em frente quando chego a parte de introduzir o idcliente e o mes se tiver mal ele diz cliente invalido mas se existir emvez de o programa continuar crasha

Share this post


Link to post
Share on other sites
bubulindo

Só para aconselhar que quando usas um #define deves usar as letras em CAPS para poderes distinguir aquele valor duma variável.

Da maneira que escreveste o n_records, eu provavelmente julgaria que era um int...


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
shotaz

pelos vistos estou com um problema no meu fopen(id, "a+"); o programa crasha quando ai chega, nao vejo o porquê.

Share this post


Link to post
Share on other sites
shotaz

Não, é suposto eu criá-lo e passar info lá para dentro, mas o "a+", devia tratar disso.

Mas ao excutar o programa recebo um warning do primeiro parâmetro do fopen o "id".

warning: passing arg 1 of `fopen' makes pointer from integer without a cast

Eu acho que o problema vem daí, nunca percebi muito bem esse warning.

Share this post


Link to post
Share on other sites
shotaz

Obrigado não sabia, mas surge-me um problema fiz as conversões das variáveis de int pa string e agora a variavel vectorclientes.id_cliente não fica com os valores inteiros do ficheiro. fiz update ao código do 1º post.

E aparentemente continuo com o mesmo problema.

Share this post


Link to post
Share on other sites
bubulindo

E aparentemente continuo com o mesmo problema.

Ainda mais incrível é nem sequer teres dito qual era o problema. Apenas colocaste código e pronto... A gente que se desenrasque. :)

Explicares qual é exactamente o problema que estás a ter certamente chamará mais a atenção de quem te quer ajudar mas não está com paciência para ver as linhas todas de código sem sequer teres descrito o que é que o código devia fazer. :S 


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
shotaz

Não era certamente isso que eu queria dizer, mas continuo com o problema do meu fopen na função LerConsumoClienteMes, que o primeiro parametro era um inteiro e eu mudei-o para string e aparentemente dava bem.

Mas com isto em strings a minha estrutura clientes deixou de ler o idcliente do ficheiro e por isso ja nao posso comparar ao que o utilizador inserir.

Assim preciso qualquer coisa do tipo conversor de strings pa inteiros.

Share this post


Link to post
Share on other sites
bubulindo

procura por atoi().

Mas podes sempre fazer uma função dessas. É bom para olear os neurónios. LOL


include <ai se te avio>

Mãe () {

}

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.