badwolf Posted June 19, 2012 at 01:54 PM Report #464029 Posted June 19, 2012 at 01:54 PM 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",®isto); //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
pikax Posted June 19, 2012 at 02:00 PM Report #464032 Posted June 19, 2012 at 02:00 PM 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."
badwolf Posted June 19, 2012 at 02:23 PM Author Report #464037 Posted June 19, 2012 at 02:23 PM 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 :/
pikax Posted June 19, 2012 at 02:27 PM Report #464039 Posted June 19, 2012 at 02:27 PM 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."
Flinger Posted June 19, 2012 at 02:37 PM Report #464045 Posted June 19, 2012 at 02:37 PM 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).
pikax Posted June 19, 2012 at 02:43 PM Report #464051 Posted June 19, 2012 at 02:43 PM (edited) 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 June 19, 2012 at 02:44 PM 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."
badwolf Posted June 19, 2012 at 02:44 PM Author Report #464052 Posted June 19, 2012 at 02:44 PM uma forma facil sem muita alteracao de codigo e' meter a variavel como global. fiz isso mas nada se alterou, continua a dar o mesmo problema
Flinger Posted June 19, 2012 at 02:47 PM Report #464056 Posted June 19, 2012 at 02:47 PM 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 😛
pikax Posted June 19, 2012 at 02:49 PM Report #464058 Posted June 19, 2012 at 02:49 PM 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."
badwolf Posted June 19, 2012 at 02:53 PM Author Report #464060 Posted June 19, 2012 at 02:53 PM (edited) 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",®isto); //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 June 19, 2012 at 02:55 PM by badwolf
pikax Posted June 19, 2012 at 02:59 PM Report #464064 Posted June 19, 2012 at 02:59 PM (edited) 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 June 19, 2012 at 02:59 PM 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."
Flinger Posted June 19, 2012 at 02:59 PM Report #464065 Posted June 19, 2012 at 02:59 PM (edited) 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 June 19, 2012 at 03:02 PM by Flinger
badwolf Posted June 19, 2012 at 03:14 PM Author Report #464074 Posted June 19, 2012 at 03:14 PM já retirei os & das variáveis e declarei as char como string, e realmente já deu outro resultado, problema é que agora após preencher uma ficha o programa desliga
Flinger Posted June 19, 2012 at 03:19 PM Report #464079 Posted June 19, 2012 at 03:19 PM (edited) 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 June 19, 2012 at 03:21 PM by Flinger
badwolf Posted June 19, 2012 at 03:31 PM Author Report #464090 Posted June 19, 2012 at 03:31 PM flinger fiz como disseste, mas desde que inseri a função strcpy que o programa simplesmente não corre, fica a dar erro
Flinger Posted June 19, 2012 at 03:34 PM Report #464094 Posted June 19, 2012 at 03:34 PM (edited) 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 June 19, 2012 at 03:35 PM by Flinger
pmg Posted June 19, 2012 at 03:36 PM Report #464096 Posted June 19, 2012 at 03:36 PM 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!
Flinger Posted June 19, 2012 at 03:38 PM Report #464099 Posted June 19, 2012 at 03:38 PM 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...
pikax Posted June 19, 2012 at 03:40 PM Report #464101 Posted June 19, 2012 at 03:40 PM 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."
pmg Posted June 19, 2012 at 03:41 PM Report #464102 Posted June 19, 2012 at 03:41 PM Nem reparei que ele lá tinha #include <cstdlib> Isso e o using namespace std; 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!
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