Jump to content

Pergunta Exame, opinião sobre implementação.


alphasil

Recommended Posts

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 by alphasil
gmc11

 

Link to comment
Share on other sites

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

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 by alphasil
gmc11

 

Link to comment
Share on other sites

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

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

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.