Neno Posted June 6, 2012 at 12:46 AM Report Share #460785 Posted June 6, 2012 at 12:46 AM Boa noite Estou a fazer o meu trabalho para a cadeira de programação, que envolve a gestao de um restaurante e dos seus ingridientes. Os arrays de ingredientes esta gravado num ficheiro txt, mas as operações sao feitas em memoria. Numa das função que queria fazer, pegava na estrutura que contem os ingredientes ja em memoria, copiava-a para uma outra estrutura auxiliar, de modo a poder mostra os ingredientes por ordem de menor quantidade em stock. Mas por alguma razao a funcao impremi-me lixo sem parar... void main() { int total; T_I ing[max]; T_I *p=&ing[0]; total=le_info(p); mostra_menos_qtd(p, total); getchar(); } int le_info(T_I *p) { int total=0, i; FILE *f; f=fopen("stock.txt", "rt"); if(f==NULL) printf("ERRO LEITURA"); else { fscanf(f, "Numero de ingredientes: %d", &total); for(i=0; i<total; i++) { fscanf(f, " %d ", &(p+i)->num); fscanf(f, "%f ", &(p+i)->qtd); fscanf(f, "%f ", &(p+i)->lim); fscanf(f, "%f ", &(p+i)->media); fscanf(f, "%s", &(p+i)->nome); } } fclose(f); return total; } void mostra_menos_qtd(T_I *p,int total) { T_I aux[max]; T_I *q=&aux[0]; int i, j, menor=1000; while(menor!=0) { for(i=0; i<total; i++) { (p+i)->qtd=(q+i)->qtd; if((q+i)->qtd<menor) (q+i)->qtd=menor; } for(j=0; j<total; j++) { if((q+j)->qtd==menor) { printf("%d:", (q+j)->num); printf("%s ", (q+j)->nome); printf("%.1f ", (q+j)->qtd); printf("%.1f ", (q+j)->lim); printf("%.1f\n", (q+j)->media); (q+j)->qtd=0; } } printf("%d\n", menor); } } Eu sei que os dados entao na estrutura porque ja a utilizei noutras funções.. Conseguem ajudar-me? Desde já obrigado Neno Link to comment Share on other sites More sharing options...
bsccara Posted June 6, 2012 at 02:53 AM Report Share #460789 Posted June 6, 2012 at 02:53 AM A linha '(p+i)->qtd=(q+i)->qtd;' está mal; estás a meter valores não inicializados do array temporário no array passado à função. Deve ser ao contrário. A linha '(q+i)->qtd=menor;' também está ao contrário. Mesmo corrigindo isso a função não faz o que pensas; dentro do primeiro ciclo 'for' vais apanhar os elementos com qtd == 0 e a variável 'menor' vai para 0. Já agora usa o operador de incremento nos ponteiros (q++) em vez de andares sempre a fazer aritmética de ponteiros ('q+j'). Link to comment Share on other sites More sharing options...
pikax Posted June 6, 2012 at 09:31 AM Report Share #460808 Posted June 6, 2012 at 09:31 AM Numa das função que queria fazer, pegava na estrutura que contem os ingredientes ja em memoria, copiava-a para uma outra estrutura auxiliar, de modo a poder mostra os ingredientes por ordem de menor quantidade em stock. Mas por alguma razao a funcao impremi-me lixo sem parar... tens que ordenar o array entao http://wiki.portugal-a-programar.pt/dev_geral:c:c_qsort nao seria melhor um memcpy - para copiar para a array temporaria, depois ordenava-se o array e imprimia-se o array todo? Tens o while que ao meu ver so ira causar problemas, se o array estiver vazio vai bater mal. Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender. A beleza de um código está em decompor problemas complexos em pequenos blocos simples. "learn how to do it manually first, then use the wizzy tool to save time." "Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast." Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 6, 2012 at 10:01 AM Report Share #460817 Posted June 6, 2012 at 10:01 AM (edited) ora bem ... temos aqui muita coisa onde pegar ... 1º - de tudo : boa sorte 😄 2º - T_I ing[max]; T_I *p=&ing[0]; pereces um pouco confuso na matéria chamada : dualidade ponteiro-array a variável ing já é por si uma referência de memória podendo ser usada como ponteiro, tornando a variável p completamente desnecessária 3º - f=fopen("stock.txt", "rt"); se bem que não é erro nenhum, a adição do caracter 't' é desnecessária por não tem efeito nenhum. um ficheiro é normalmente aberto em modo de texto 4º - f=fopen("stock.txt", "rt"); if(f==NULL) printf("ERRO LEITURA"); else { } fclose(f); estás a tentar fechar o ficheiro mesmo quando falha a abertura não vês nenhum erro porque a função simplesmente falha e actualiza a variável errno com o erro originado deverás passar esta chamada para dentro do else 5º fscanf(f, " %d ", &(p+i)->num); mas que salgalhada .. agora pergunto-me se tens a certeza que isto funciona correctamente tens um array de T_I's, isto dita que os elementos em memória estão separados entre si de sizeof(T_I) se olharmos para o exemplo seguinte size_t tam = sizeof(T_I); // imaginemos que será 4bytes (um int) T_I lista[3]; // se &(lista[0]) tiver o valor 0x2000 T_I *p = &(lista[0]); // terá 0x2000 // no entanto a posição seguinte de memória // &(lista[1]) terá 0x2004 = &(lista[0]) + sizeof(T_I) // o que é diferente de p+1; // que é 0x2001 sei que parece complicado mas prontos ... é a vida de um programador de uma linguagem de médio-baixo nível 6º - acho que depois disto, todo o restante código de ordenação está um pouco ... mal 7º - tenta implementar um algoritmo de ordenação, mesmo o mais simples como o bubble sort 8º - separa o código de apresentação do array do restante código. cria uma função e coloca esse código lá, depois é só chamar a função sempre que necessário isso torna o código muito mais simples de alterar e principalmente de ler Depois disso, acho que vou-te deixar olhar melhor para o código Edited June 6, 2012 at 10:02 AM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Neno Posted June 11, 2012 at 12:26 AM Author Report Share #461866 Posted June 11, 2012 at 12:26 AM Mas HappyHippyHippo, a função le_info esta a ler a informação bem do ficheiro. Eu sei disso porque já tenho outras funções feitas onde aproveito o array de estruturas de tipo T_I que crio na main, e preencho utilizando a função le_info, para mostrar informação. Consigo mostrar todos os ingredientes ou apenas um pelo seu nome (em baixo mostro o codigo) mas ainda não consegui fazer esta.. Isto é o codigo que tenho até agora: #include<stdio.h> #include <stdlib.h> #include<string.h> #include<time.h> #define max 100 typedef struct tempo{ int h,m; }T_TP; typedef struct ingrediente{ char nome[max]; int num; float qtd; float lim; float media; } T_I; int le_info(); void mostra_t(T_I *p,int total); void mostra_nome(T_I *p,int total); void mostra_menos_qtd(T_I *p,int total); void main() { int total; T_I ing[max]; T_I *p=&ing[0]; //printf("aqui"); total=le_info(p); //mostra_t(p, total); //mostra_nome(p, total); mostra_menos_qtd(p, total); getchar(); } T_TP hora_actual() { time_t a; struct tm* b; T_TP actual; time(&a); b = localtime(&a); actual.h = b->tm_hour; actual.m = b->tm_min; return actual; } int menu() { int op; T_TP actual=hora_actual(); printf("%2.2d:%2.2d\n", actual.h, actual.m); printf("\n1"); } int le_info(T_I *p) { int total=0, i; FILE *f; f=fopen("stock.txt", "rt"); if(f==NULL) printf("ERRO LEITURA"); else { fscanf(f, "Numero de ingredientes: %d", &total); for(i=0; i<total; i++) { fscanf(f, " %d ", &(p+i)->num); fscanf(f, "%f ", &(p+i)->qtd); fscanf(f, "%f ", &(p+i)->lim); fscanf(f, "%f ", &(p+i)->media); fscanf(f, "%s", &(p+i)->nome); } fclose(f); } return total; } void mostra_t(T_I *p, int total) { int i; printf("N. QUANTIDADE\tLIMITE\t MEDIA\tNOME\n"); for(i=0; i<total; i++) { printf("%d: ", (p+i)->num); printf(" %.1fg-100g\t", (p+i)->qtd); printf("%.1fg-100g", (p+i)->lim); printf(" %.1fg\t", (p+i)->media); printf(" %s\n", (p+i)->nome); } } void mostra_nome(T_I *p,int total) { char nome[max]; int aux, i; printf("Introduza o nome do ingrediente que pretende consultar: "); scanf("%s", nome); system("cls"); for(i=0; i<total; i++) { aux=strcmp(nome, (p+i)->nome); if(aux==0) { printf("N. QUANTIDADE\tLIMITE\t MEDIA\tNOME\n"); printf("%d: ", (p+i)->num); printf(" %.1f-100\t", (p+i)->qtd); printf("%.1f-100", (p+i)->lim); printf(" %.1f\t", (p+i)->media); printf(" %s\n", (p+i)->nome); } } if(aux!=0) printf("Ingrediente nao disponivel em stock!"); getchar(); } void mostra_menos_qtd(T_I *p,int total) { T_I aux[max]; T_I *q=&aux[0]; int i, j, menor=1000; while(menor!=0) { for(i=0; i<total; i++) { (q+i)->qtd=(p+i)->qtd; if((q+i)->qtd<=menor || menor!=0) menor=(q+i)->qtd; } for(j=0; j<total; j++) { if((q+j)->qtd==menor) { printf("%d:", (q+j)->num); printf("%s ", (q+j)->nome); printf("%.1f ", (q+j)->qtd); printf("%.1f ", (q+j)->lim); printf("%.1f\n", q->media); (q+j)->qtd=0; getchar(); } } printf("%d\n", menor); } } Ia agora tratar do menu de opções para por tudo a funcionar. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now