Pls What am I doing wrong.
I am using am array to make a data structure were I save the data that cames from the user.
That Part is working,
But when I try to show the data intruduced I get strange results, as if the data hasn' t been saved correctly.
First file:
Code:
#include <stdio.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "biblioteca.h"
#include "records.h"
int add_rec(){
char ch;
struct records aux;
/* Lê os elementos e cria o registo antes do o introduzir na base de dados */
printf("(Obrigatório) Titulo : ");
gets(aux.titulo);
printf("Sub Titulo : ");
gets(aux.subtitulo);
printf("Autor : ");
gets(aux.autoria);
printf("(Obrigatório) Local de Edição : ");
gets(aux.local_edicao);
printf("Editora : ");
gets(aux.editora);
//Alterar
printf("Ano de edição : ");
scanf("%d",&(aux.ano_edicao));
/* Código para limpar o buffer antes de ler o caracter */
while ((ch = getchar()) != '\n' && ch != EOF) {}
printf("Cota : ");
gets(aux.cota);
printf("(Obrigatório) Preço : ");
scanf("%f",&(aux.preco));
aux.status = '*';
if (add_record(&aux) == 0){
printf("Registo inserido\n");
return 0;
} else {
printf("Erro a inserir registo\n");
return -1;
}
}
void menu(){
char option, ch;
option = '0';
while (option != 'X'){
printf("\n");
printf("--------------\n");
printf("Menu Principal\n");
printf("--------------\n");
printf("\n\n");
printf("A - Adicionar Registo\n");
printf("B - Editar Registo\n");
printf("C - Remover Registo\n");
printf("P - Pesquisas\n");
printf("L - Listagens\n");
printf("I - Importar Registos\n");
printf("E - Exportar Registos\n");
printf("Z - !!!Reinicializar a Base Bibligráfica!!!\n");
printf("\n\n");
printf("X - Sair\n");
printf("\n\n");
printf("Opção : ");
scanf("%c",&option);
/* Código para limpar o buffer antes de ler o caracter */
while ((ch = getchar()) != '\n' && ch != EOF) {}
switch(option){
case 'A':
add_rec(); /* Criar verificação da introdução dos dados */
/* Código para limpar o buffer antes de ler o caracter */
while ((ch = getchar()) != '\n' && ch != EOF) {}
break;
case 'B':
break;
case 'C':
break;
case 'P':
menu_pesquisas();
break;
case 'L':
menu_listagens();
break;
case 'I':
break;
case 'E':
break;
case 'Z':
break;
case 'X':
return;
break;
default:
printf("-----------------\n");
printf("Opção inexistente\n");
printf("-----------------\n\n\n");
}
}
} /* Function menu - end */
void menu_pesquisas(){
char option, ch;
option = '0';
while (option != 'X'){
printf("\n");
printf("--------------\n");
printf("Menu Pesquisas\n");
printf("--------------\n");
printf("\n\n");
printf("1 - Pesquisar: por Título\n");
printf("2 - Pesquisar: por Autoria\n");
printf("3 - Pesquisar: por Listagens\n");
printf("\n\n");
printf("X - Sair\n");
printf("\n\n");
printf("Opção : ");
scanf("%c",&option);
/* Código para limpar o buffer antes de ler o caracter */
while ((ch = getchar()) != '\n' && ch != EOF) {}
switch(option){
case '1':
break;
case '2':
break;
case '3':
break;
case 'X':
return;
break;
default:
printf("-----------------\n");
printf("Opção inexistente\n");
printf("-----------------\n\n\n");
}
}
}
void menu_listagens(){
char option, ch;
option = '0';
while (option != 'X'){
printf("\n");
printf("--------------\n");
printf("Menu Listagens\n");
printf("--------------\n");
printf("\n\n");
printf("1 - Listagem: Sequencial\n");
printf("2 - Listagem: Ordenada por Título\n");
printf("3 - Listagem: Ordenada por Autoria\n");
printf("\n\n");
printf("X - Sair\n");
printf("\n\n");
printf("Opção : ");
scanf("%c",&option);
/* Código para limpar o buffer antes de ler o caracter */
while ((ch = getchar()) != '\n' && ch != EOF) {}
switch(option){
case '1':
mostra_registo();
break;
case '2':
break;
case '3':
break;
case 'X':
return;
break;
default:
printf("-----------------\n");
printf("Opção inexistente\n");
printf("-----------------\n\n\n");
}
}
}
int main(){
setlocale(LC_ALL, "");
menu();
return 0;
}
Second File
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "records.h"
/* Tenho que criar uma variável que é um array de tamanho desconhecido, sempre que ler uma registo
* terei que alocar memória para o guardar no registo */
struct records *rec;
int elementos = 0; /* Numero de elementos no registo */
int add_record(struct records *elem){
struct records *temp;
temp = realloc(rec, sizeof(struct records *));
/* Verifica se houve boa alocação de memória */
if (temp == NULL){
strcpy(erro,"Erro na alocação de memória\n"); /* Especifica o erro */
return -1; /* Indica erro */
}
elementos += 1;
rec = temp;
temp = temp + elementos;
/* Falta verificar se o registo é duplicado */
/* cópia de cada um dos elementos */
strcpy(temp->titulo , elem->titulo);
strcpy(temp->subtitulo , elem->subtitulo);
strcpy(temp->autoria , elem->autoria);
strcpy(temp->local_edicao , elem->local_edicao);
strcpy(temp->editora , elem->editora);
strcpy(temp->cota , elem->cota);
temp->status = '*';
temp->ano_edicao = elem->ano_edicao;
temp->preco = elem->preco;
printf("%s",temp->titulo);
if (strlen(temp->subtitulo) > 0)
printf(" : %s",temp->subtitulo);
if (strlen(temp->autoria) > 0)
printf(" / %s",temp->autoria);
printf(". ");
printf("%s",temp->local_edicao);
if (strlen(temp->editora) > 0)
printf(" : %s",temp->editora);
printf(", %d",temp->ano_edicao);
printf(". ");
if (strlen(temp->cota) > 0)
printf("Cota: %s",temp->cota);
printf(" - Preco: %.2f",temp->preco);
printf(".\n");
return 0; /* Sem erros */
}
void mostra_registo(){
struct records *temp;
//Fails to show things right why????
int i;
temp = rec;
for (i = 1; i < elementos + 1; i++){
temp++;
printf("%s",temp->titulo);
if (strlen(temp->subtitulo) > 0)
printf(" : %s",temp->subtitulo);
if (strlen(temp->autoria) > 0)
printf(" / %s",temp->autoria);
printf(". ");
printf("%s",temp->local_edicao);
if (strlen(temp->editora) > 0)
printf(" : %s",temp->editora);
printf(", %d",temp->ano_edicao);
printf(". ");
if (strlen(temp->cota) > 0)
printf("Cota: %s",temp->cota);
printf(" - Preço: %.2f",temp->preco);
printf(".\n");
}
}
Last needed file
Code:
/* Estrutura de dados */
struct records{
/* As variáveis de texto tem tamanho fixo, reduzindo a complexidade do programa */
char titulo[120];
char subtitulo[120];
char autoria[80];
char local_edicao[30];
char editora[30];
int ano_edicao;
char cota[30];
float preco;
char status;
};
/* Variável onde se guardam os erros */
char erro[100];
/* Funções */
int add_record(struct records *elem);
void mostra_registo();