Jump to content

Problema com registos[parte 2]


badwolf
 Share

Recommended Posts

Pois bem, após ter aquele problema que foi resolvido com o limpar do buffer, fiquei com um ainda maior, sempre que insiro um registo novo, ele não o grava, ou seja quando o tento visualizar aparecem dados completamente diferentes do que foi inserido. se alguém entender o que se passa peço que me ajude, porque eu acho que estou a fazer tudo certo, caso encontrem o erro peço que me expliquem para não voltar a fazer o mesmo 🙂

obrigado desde já

#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
void inserir();
void menu ();
void LimpaBuffer();
void mostra_ficha();
void menu_lista();
void mostra_tudo();

//estrutura de dados
typedef struct zoo {
int numero_animal;
char nome[50];
char origem[50];
char local_cativeiro[50];
char data_entrada[10];
char tipo_alimentacao[50];
char especie[50];
int idade;
}Zoo;
//funçao para as strings funcionarem em condições
void LimpaBuffer(void){
 int valorLido = getchar();
 while((valorLido != '\n')&&(valorLido != EOF)){
 valorLido=getchar();}

 }
//fim da função LimpaBuffer
//função para mostrar a ficha do animal
void mostra_ficha(int num, char name, char ori , char local ,char data, char alimentacao ,char esp, int idd){
 printf("\nNumero do animal - &d",&num);
 printf("\nNome - %c",&name);
 printf("\nOrigem - %c",&ori);
 printf("\nLocal Cativeiro - %c",&local);
 printf("\nData de entrada - %c",&data);
 printf("\nAlimentacao - %c",&alimentacao);
 printf("\nEspecie - %c",&esp);
 printf("\nIdade - %d",&idd);

 }
//fim da função para mostrar ficha
//função para apresentar o menu no ecrã e escolher a opção pretendida
void menu(){

 int menuescolha;

printf("Menu\n");
printf("1 - Inserir Animal\n");
printf("2 - Pesquisar ficha do animal\n");
printf("3 - Listar animal ou animais\n");
printf("4 - Sair\n");

scanf("%d",&menuescolha);
switch (menuescolha){
case 1:
	 system("CLS");
	 inserir();

break;
case 2:
	 system("CLS");
 exit(EXIT_SUCCESS);
break;
case 3:
	 system("CLS");
	 menu_lista();
break;
case 4:
 exit(EXIT_SUCCESS);
break;

 }
}
//fim menu
//submenu da opção listar animal ou animais
void menu_lista(){
 int escolha;
 printf("Listar animal ou animais\n");
printf("1 - Listar 1 animal selecionado\n");
printf("2 - Listar todos animais\n");
printf("3 - Voltar ao menu\n");
 scanf("%d",&escolha);

 switch (escolha){
case 1:
 system("CLS");
	 exit(EXIT_SUCCESS);		
break;
case 2:
	 system("CLS");
 mostra_tudo();
break;
case 3:
	 system("CLS");
	 menu();
break;
}

 }
//fim do menu_lista
//função para inserir dados na estrutura (manualmente)
void inserir(){
 Zoo novo[100];
 int num,idd,registo,voltar;
 char name,ori,local,data,alimentacao,esp;


 printf("INSERIR NOVO ANIMAL\n");

 printf("Por favor insira o numero do registo(1 a 100)\n\n");
 //caso o registo não seja auto-increment
 LimpaBuffer();
 scanf("%d",&registo);
 //preenchimento da ficha em variaveis locais
 printf("Numero\n");
 scanf("%d",&num);
 LimpaBuffer();
 printf("Nome\n");
 scanf("%c",&name);
 LimpaBuffer();
 printf("Origem\n");
 scanf("%c",&ori);
 LimpaBuffer();
 printf("Local de cativeiro\n");	
 scanf("%c",&local);
 LimpaBuffer();
 printf("Data de entrada(dd|mm|aaaa)\n");
 scanf("%c",&data);
 LimpaBuffer();
 printf("Tipo alimentacao\n");
 scanf("%c",&alimentacao);
 LimpaBuffer();
 printf("Especie\n");
 scanf("%c",&esp);
 LimpaBuffer();
 printf("Idade\n");
 scanf("%d",&idd);
 LimpaBuffer();
 //transporte das variaveis locais para o registo
 novo[registo].numero_animal= num;
 novo[registo].nome =name ;
 novo[registo].origem =ori;
 novo[registo].local_cativeiro = local ;
 novo[registo].data_entrada = data;
 novo[registo].tipo_alimentacao = alimentacao;
 novo[registo].especie = esp;
 novo[registo].idade =idd;
 //voltar ao inicio do programa
printf("\n 1- Voltar ao menu");
printf("\n 2- Sair do programa\n");
scanf("%d",&voltar);
switch (voltar){
case 1 :
	 system("CLS");
	 menu();
break;
case 2 :
exit(EXIT_SUCCESS);	
break;
}

}
//fim da função inserir
//função para mostrar todos os registos
void mostra_tudo(){
 Zoo mostrar[100];
 int i=0,voltar;

// for (i=1;i<=100;i++){
 mostra_ficha(mostrar[i].numero_animal,mostrar[i].nome,mostrar[i].origem,mostrar[i].local_cativeiro,mostrar[i].data_entrada,mostrar[i].tipo_alimentacao,mostrar[i].especie,mostrar[i].idade);
// }
printf("\n 1- Voltar ao menu");
printf("\n 2- Sair do programa\n");
scanf("%d",&voltar);
switch (voltar){
case 1 :
	 system("CLS");
	 menu();
break;
case 2 :
exit(EXIT_SUCCESS);	
break;
}
}
//fim da função mostra_tudo
//função principal do programa
int main(int argc, char *argv[]){
menu();
system("PAUSE");
return EXIT_SUCCESS;
}
//fim da função principal
Link to comment
Share on other sites

isso e' C++ e nao C.

Tens varios problemas, porque que nas funcoes tens:

Zoo mostrar[100];

Estas a criar sempre o array, e' normal que te apareca caracteres estranho, ja que o Zoo mostrar[100]; fica cheio de lixo quando e' criado

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

isso e' C++ e nao C.

Tens varios problemas, porque que nas funcoes tens:

Zoo mostrar[100];

Estas a criar sempre o array, e' normal que te apareca caracteres estranho, ja que o Zoo mostrar[100]; fica cheio de lixo quando e' criado

sendo assim então como é que resolveria isto? já agora se isto está em c++ é porque eu confundo sempre o código :/

Link to comment
Share on other sites

uma forma facil sem muita alteracao de codigo e' meter a variavel como global.

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

uma forma facil sem muita alteracao de codigo e' meter a variavel como global.

Se o Hyppo lê isto vais levar tatau 😄

void inserir(){
	 Zoo novo[100];
...
}

void mostra_tudo(){
        Zoo mostrar[100];
...
}

Básicamente a tua função Insere e a função mostra estão a trabalhar com variáveis diferentes. Cada uma cria o seu próprio array. A insere vai inserir as struct num array, e a mostra vai tentar mostrar noutro. Ora como este segundo não tem nada inserido mostra lixo.

Uma forma de o corrigir é como o Pikax disse, passando o array para variável global. Embora funcione, esta não é uma boa prática, sendo por vezes sancionada pelos professores.

Outra forma é passar o array como argumento às tuas funções de inserção e listagem:

int main()
{
  Zoo lista[100];
  insere(lista);
  mostra_tudo(lista);
  return 0;
}

Claro que como tens os menús pelo meio, a coisa fica mais difícil, ja que tens de passar o array aos menus, para que estes o possam passar às funções. Razão pela qual a Interface com o utilizador não deve estar misturada com o resto do código (normalmente já exige um grau de conhecimento bem maior).

Link to comment
Share on other sites

Se o Hyppo lê isto vais levar tatau 😄

AHAH eu so' disse que era a solucao mais facil e sem muita alteracao de codigo 😄 eu tambem nao apoio o uso de variaveis globais.

EDIT: a tua versao tem falhas porque nao sabes quantos elementos o array tem realmente preenchidos.

ele tem que criar um variavel com o tamanho do array que esta' ocupado

Edited by pikax

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

fiz isso mas nada se alterou, continua a dar o mesmo problema

Põe aí o novo código.

EDIT: a tua versao tem falhas porque nao sabes quantos elementos o array tem realmente preenchidos

P. ex, memset do array, e a primeira com o cod_animal a 0 é a primeira vazia... Há sempre maneira 😛

Link to comment
Share on other sites

nao podem existir animais com o codigo a zero? 😛

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

aqui simplesmente pus a variavel novo[100] como global e usei-a quer na função inserir quer na mostrar, "pikax" apesar de eu não saber quantos elementos tenho inseridos, o que quero neste momento é mostrar o primeiro ou seja a posição 0 do array o que está defenido quando estou a fazer a listagem, vou tentar agora a maneira do "flinger"

edit: o código do animal é relativo, pois não influencia em nada o programa, é escolhido pelo utilizador

#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
void inserir();
void menu ();
void LimpaBuffer();
void mostra_ficha();
void menu_lista();
void mostra_tudo();

//estrutura de dados
typedef struct zoo {
int numero_animal;
char nome;
char origem;
char local_cativeiro;
char data_entrada;
char tipo_alimentacao;
char especie;
int idade;
}Zoo;
Zoo novo[100];
//funçao para as strings funcionarem em condições
void LimpaBuffer(void){
 int valorLido = getchar();
 while((valorLido != '\n')&&(valorLido != EOF)){
 valorLido=getchar();}

 }
//fim da função LimpaBuffer
//função para mostrar a ficha do animal
void mostra_ficha(int num, char name, char ori , char local ,char data, char alimentacao ,char esp, int idd){
 printf("\nNumero do animal - &d",&num);
 printf("\nNome - %c",&name);
 printf("\nOrigem - %c",&ori);
 printf("\nLocal Cativeiro - %c",&local);
 printf("\nData de entrada - %c",&data);
 printf("\nAlimentacao - %c",&alimentacao);
 printf("\nEspecie - %c",&esp);
 printf("\nIdade - %d",&idd);

 }
//fim da função para mostrar ficha
//função para apresentar o menu no ecrã e escolher a opção pretendida
void menu(){

 int menuescolha;

printf("Menu\n");
printf("1 - Inserir Animal\n");
printf("2 - Pesquisar ficha do animal\n");
printf("3 - Listar animal ou animais\n");
printf("4 - Sair\n");

scanf("%d",&menuescolha);
switch (menuescolha){
case 1:
	 system("CLS");
	 inserir();

break;
case 2:
	 system("CLS");
 exit(EXIT_SUCCESS);
break;
case 3:
	 system("CLS");
	 menu_lista();
break;
case 4:
 exit(EXIT_SUCCESS);
break;

 }
}
//fim menu
//submenu da opção listar animal ou animais
void menu_lista(){
 int escolha;
 printf("Listar animal ou animais\n");
printf("1 - Listar 1 animal selecionado\n");
printf("2 - Listar todos animais\n");
printf("3 - Voltar ao menu\n");
 scanf("%d",&escolha);

 switch (escolha){
case 1:
 system("CLS");
	 exit(EXIT_SUCCESS);		
break;
case 2:
	 system("CLS");
 mostra_tudo();
break;
case 3:
	 system("CLS");
	 menu();
break;
}

 }
//fim do menu_lista
//função para inserir dados na estrutura (manualmente)
void inserir(){

 int num,idd,registo,voltar;
 char name,ori,local,data,alimentacao,esp;


 printf("INSERIR NOVO ANIMAL\n");

 printf("Por favor insira o numero do registo(1 a 100)\n\n");
 //caso o registo não seja auto-increment
 LimpaBuffer();
 scanf("%d",&registo);
 //preenchimento da ficha em variaveis locais
 printf("Numero\n");
 scanf("%d",&num);
 LimpaBuffer();
 printf("Nome\n");
 scanf("%c",&name);
 LimpaBuffer();
 printf("Origem\n");
 scanf("%c",&ori);
 LimpaBuffer();
 printf("Local de cativeiro\n");	
 scanf("%c",&local);
 LimpaBuffer();
 printf("Data de entrada(dd|mm|aaaa)\n");
 scanf("%c",&data);
 LimpaBuffer();
 printf("Tipo alimentacao\n");
 scanf("%c",&alimentacao);
 LimpaBuffer();
 printf("Especie\n");
 scanf("%c",&esp);
 LimpaBuffer();
 printf("Idade\n");
 scanf("%d",&idd);
 LimpaBuffer();
 //transporte das variaveis locais para o registo
 novo[registo].numero_animal= num;
 novo[registo].nome =name ;
 novo[registo].origem =ori;
 novo[registo].local_cativeiro = local ;
 novo[registo].data_entrada = data;
 novo[registo].tipo_alimentacao = alimentacao;
 novo[registo].especie = esp;
 novo[registo].idade =idd;
 //voltar ao inicio do programa
printf("\n 1- Voltar ao menu");
printf("\n 2- Sair do programa\n");
scanf("%d",&voltar);
switch (voltar){
case 1 :
	 system("CLS");
	 menu();
break;
case 2 :
exit(EXIT_SUCCESS);	
break;
}

}
//fim da função inserir
//função para mostrar todos os registos
void mostra_tudo(){

 int i=0,voltar;

// for (i=1;i<=100;i++){
 mostra_ficha(novo[i].numero_animal,novo[i].nome,novo[i].origem,novo[i].local_cativeiro,novo[i].data_entrada,novo[i].tipo_alimentacao,novo[i].especie,novo[i].idade);
// }
printf("\n 1- Voltar ao menu");
printf("\n 2- Sair do programa\n");
scanf("%d",&voltar);
switch (voltar){
case 1 :
	 system("CLS");
	 menu();
break;
case 2 :
exit(EXIT_SUCCESS);	
break;
}
}
//fim da função mostra_tudo
//função principal do programa
int main(int argc, char *argv[]){
menu();
system("PAUSE");
return EXIT_SUCCESS;
}
//fim da função principal
Edited by badwolf
Link to comment
Share on other sites

o teu erro esta aqui!

printf("\nNumero do animal - &d",&num);
	 printf("\nNome - %c",&name);
	 printf("\nOrigem - %c",&ori);
	 printf("\nLocal Cativeiro - %c",&local);
	 printf("\nData de entrada - %c",&data);
	 printf("\nAlimentacao - %c",&alimentacao);
	 printf("\nEspecie - %c",&esp);
	 printf("\nIdade - %d",&idd);

estas a imprimir o endereco das variaveis, nao o seu falor, tira os & antes das variaveis

Edited by pikax

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

oid mostra_ficha(int num, char name, char ori , char local ,char data, char alimentacao ,char esp, int idd){
	 printf("\nNumero do animal - &d",&num);
	 printf("\nNome - %c",&name);
	 printf("\nOrigem - %c",&ori);
	 printf("\nLocal Cativeiro - %c",&local);
	 printf("\nData de entrada - %c",&data);
	 printf("\nAlimentacao - %c",&alimentacao);
	 printf("\nEspecie - %c",&esp);
	 printf("\nIdade - %d",&idd);

	  }

Estás a fazer os prints todos mal. Primeiro ao colocares o & à frente da variável o que vais imprimir é o endereço dela e não o valor que ela tem. Segundo o %c serve para imprimir um caracter e não uma string (%s). Na primeira linha tens um &d e não %d.

O mesmo se aplica ao scanf (embora aqui já devas ter o & antes da variável).

Para termina, estás a declarar as variáveis na insere como char. Isto só tem 1 caracter, tens de declarar como um array de caracteres(string).

Edited by Flinger
Link to comment
Share on other sites

Ainda na insere:

novo[registo].local_cativeiro = local ;

Com strings não podes fazer esta atribuição. Tens de usar a função strcpy :

strcpy(novo[registo].local_cativeiro,local);

Isto para todos os campos que são strings.

Ainda: tira os & dos scanfs em que o campo destino são strings.

Edited by Flinger
Link to comment
Share on other sites

Quando for assim, posta a mensagem de erro. Provavelmente ele não conhece a strcpy. Tens de colocar o include:

#include <string.h>

EDIT: Afinal já lá estava. Posta o código da insere e a mensagem de erro.

Edited by Flinger
Link to comment
Share on other sites

Eu não sei C++, mas usa directamente as strings dessa linguagem. Não precisas da "confusão" que o C acarreta

std::string nome;
nome = "Whatever";
nome = nome + "Apelido";

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

Eu não sei C++, mas usa directamente as strings dessa linguagem. Não precisas da "confusão" que o C acarreta

std::string nome;
nome = "Whatever";
nome = nome + "Apelido";

Nem reparei que ele lá tinha

#include <cstdlib>

#include <iostream>

Como está na Secção de C e o código é c puro...

Link to comment
Share on other sites

Nem reparei que ele lá tinha

#include <cstdlib>

#include <iostream>

Como está na Secção de C e o código é c puro...

isso e' C++ e nao C.

Isto pode ser considerado programar-'a-la'-C 😄

Eu não sei C++, mas usa directamente as strings dessa linguagem. Não precisas da "confusão" que o C acarreta

std::string nome;
nome = "Whatever";
nome = nome + "Apelido";

Era bastante mais facil, e tambem usar vector's em vez de arrays

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

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
 Share

×
×
  • 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.