alphasil Posted July 10, 2012 at 02:14 PM Report Share #468181 Posted July 10, 2012 at 02:14 PM (edited) Oi Tenho uma pergunta de exame que me diz para implementar uma função writeBooks(........, float val) que vai gravar num ficheiro "livros.txt" o isbn, o titulo e o preço dos livros armazenados no array livros cujo preço é superior a val, passado como parâmetro na função. Dão-me isso: #define MAX 1400 typedef struct liv { char isbn[20], titulos[100]; char autores[10][100]; double preco; }LIVRO; int main() { LIVRO livros[MAX]; } O que fiz foi: int writeBooks(LIVRO livros[], float *p) //passo a estrutura livros { float x; //variavel que vai receber valor passado FILE *f; f=fopen("livros.txt", "wb"); if(!f) { printf("Erro na abertura do ficheiro."); exit(1); } if(x>livros->preco) { fprintf(f, "%s %s %s %f", livros->isbn, livros->titulos, livros->preco); } else { printf("Nada a gravar no ficheiro..."); } fclose(f); return 0; } Estou pronto para levar nas orelhas.... 🙂😛 Edited July 10, 2012 at 02:15 PM by alphasil gmc11 Link to comment Share on other sites More sharing options...
pmg Posted July 10, 2012 at 02:26 PM Report Share #468186 Posted July 10, 2012 at 02:26 PM int writeBooks(LIVRO livros[], float *p) //passo a estrutura livros { float x; //variavel que vai receber valor passado FILE *f; f=fopen("livros.txt", "wb"); if(!f) { printf("Erro na abertura do ficheiro."); exit(1); } if(x>livros->preco) /* ... */ Pera aí ... onde é que foi atribuido um valor à variável x? Além disso, na tua função só estás a ver um LIVRO e não o array completo. Tens que rever esta parte. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
alphasil Posted July 10, 2012 at 02:39 PM Author Report Share #468191 Posted July 10, 2012 at 02:39 PM (edited) Oi, obrigado, pois, tens razão, quem sabe sabe, cometo sempre erros básicos 😕 :confused: O meu main está assim: int main() { LIVRO livros[MAX]; float valor=20; //chamo a função writeBooks(livros, valor) } Assim não chamo a estrutura toda?? Para x ter valor posso pôr float x=p assim já assume valor Edited July 10, 2012 at 02:40 PM by alphasil gmc11 Link to comment Share on other sites More sharing options...
pmg Posted July 10, 2012 at 02:45 PM Report Share #468194 Posted July 10, 2012 at 02:45 PM (edited) Ao meteres o nome dum array numa chamada a uma função, o compilador converte esse array num ponteiro para o seu primeiro elemento (definir uma função com sintaxe de arrays ou sintaxe de ponteiros é igual: o que a função espera receber é um ponteiro). Vê o FAQ do comp.lang.c, especialmente a secção 6. Mas não era a isso que eu me referia: na tua função writeBooks original, só acedes ao primeiro livro, com 'livros->preco', 'livros->isbn', etc. Nunca comparas o preco com o preco do segundo (ou terceiro, ...) livro. PS (edit): podes meter float x = *p; ou usar o '*p' directamente. Melhor ainda seria passar o valor (em vez dum ponteiro) e usar o valor. Edited July 10, 2012 at 02:46 PM by pmg What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
alphasil Posted July 10, 2012 at 02:59 PM Author Report Share #468196 Posted July 10, 2012 at 02:59 PM Obrigado, já percebi aquela parte do ponteiro, realmente pode-se simplificar. A parte do comparar é que não estou a perceber, se estou numa estrutura e e essa mesma tem registo só vai comparar o primeiro? Obrigado gmc11 Link to comment Share on other sites More sharing options...
pmg Posted July 10, 2012 at 03:14 PM Report Share #468200 Posted July 10, 2012 at 03:14 PM (edited) Supoe que o teu main era assim int main(void) { LIVRO livros[MAX]; strcpy(livros[0].isbn, "isbn zero"); strcpy(livros[0].titulos, "titulos zero"); strcpy(livros[0].autores[0], "autor zero zero"); strcpy(livros[0].autores[1], "autor zero um"); strcpy(livros[0].autores[2], "autor zero dois"); livros[0].preco = 0; strcpy(livros[1].isbn, "isbn um"); strcpy(livros[1].titulos, "titulos um"); strcpy(livros[1].autores[0], "autor um zero"); strcpy(livros[1].autores[1], "autor um um"); strcpy(livros[1].autores[2], "autor um dois"); livros[1].preco = 1; writeBooks(livros, 0.3); return 0; } Com este exemplo, o primeiro livro não era impresso (o preco é 0 e pedimos 0.3 na chamada à função) e imprimia o else ("Nada a gravar no ficheiro...") ... o segundo livro também nao era impresso nem o else, já que a função retorna logo a seguir à primeira comparação. Volto a insistir: lê o FAQ do comp.lang.c. Edited July 10, 2012 at 03:16 PM by pmg What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! 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