suzy Posted March 5, 2008 Report Share Posted March 5, 2008 ja estou ha 2 horas nisto " data-emoticon="true" height="20" src="https://cdn.portugal-a-programar.org/public/emoticons/wallbash.gif" srcset="https://cdn.portugal-a-programar.org/public/emoticons/wallbash@2x.gif 2x" title=" " width="20">, sei mais o menos o algoritmo para ver se o a decula e unica, mas ja fiz umas funcoezitas para inserir e listar, e aqui nao estou a conseguir colocar o codigo para a cedula ser unica. queria que o utilizador ao introduzir a cedula se houvesse uma igual avisasse, ja tentei modificar o inserer, o listar etc, etc.. etc e nao consigo 😞 alguem me pode dar ideias de como ser a melhor forma:( é que o vector de arrays de medico tem de ser local a funcao main. ja tentei colocar um ponteiro, na funcao inicializar, mas como a funcao inserir chama esse funcao, nao posso colocar inicializar(medicos) , porque o nome do vector nao e reconhecido aqui, pois so e reconhecido na funcao main como faço?? #include <stdio.h> #include <string.h> #define TAM 50 #define MAX 2 typedef struct horario{ char manha[TAM]; char tarde[TAM]; char dia[TAM]; }hor; typedef struct medico{ int cedula; char nome[TAM]; int idade; char especialidade[TAM]; hor vet[7]; }medicina; /***************************************************************************/ medicina inicializa(){//retorna uma estruruta medicina novo; int i; printf("Cedula Profissional\n"); scanf("%d",&novo.cedula); printf("Nome : "); scanf("%s",&novo.nome); printf("idade : "); scanf("%d",&novo.idade); printf(" Especialidade\n"); scanf("%s",&novo.especialidade); for(i=0;i<1;i++){//sete dias printf(" Horario %d Dia da Semana \n",i+1); printf(" de Manha"); scanf("%s",novo.vet[i].manha); printf(" de tarde\n"); scanf("%s",novo.vet[i].tarde); printf(" dia da semana\n"); scanf("%s",novo.vet[i].dia); } return novo; }; /************************************************************************/ int insere(medicina *ptr, int total)//ponteiro para o inicio do vector, e total dos livros que tem { if(total==MAX) { printf("Nao existe espaco livre\n"); return total; } else { *(ptr+total) = inicializa(); // e a mesma coisa que b[total], e um estrutra logo pode receber a funcao incializa return total+1; } }; /***************************************************************************/ /**************************************************************************/ void escreve (medicina a){//vou passar uma estrutura como paramentro int i; printf(" Nome: %s\n",a.nome); printf(" idade %d\n",a.idade); for(i=0;i<7;i++){//sete dias printf(" %d Dia da Semana \n",i+1); printf("Na %s",a.vet[i].dia); printf(" Manha ->",a.vet[i].manha); printf(" Tarde ->",a.vet[i].tarde); } }; /***********************************************************/ void lista_todos(medicina *ptr, int total) { int i,j; for(i=0; i<total; i++){ printf(" Nome: %s\n",ptr[i].nome); printf(" idade %d\n",ptr[i].idade); for(j=0;j<1;j++){//sete dias printf(" %d Dia da Semana \n",i+1); printf(" de manha%s\n",ptr[i].vet[j].manha); printf(" de tarde %s\n",ptr[i].vet[j].tarde); printf(" no dia %s\n",ptr[i].vet[j].dia); } } }; /************************************************************************/ int menu(void) { int i; printf("1-Adicionar um livro\n"); printf(" 2 - listar medicos\n"); printf("\nEscolha uma opcao: "); do scanf("%d", &i); while(i<1 || i>2); return i; } main() { medicina medicos[2]; int i, total = 0; do{ i = menu(); switch (i){ case 1: total = insere(medicos, total); break; case 2: lista_todos(medicos,total); break; } }while(i!=2); fflush(stdin); getchar(); } desculpem, nao sei como se coloca a cores ? Link to comment Share on other sites More sharing options...
pedrotuga Posted March 5, 2008 Report Share Posted March 5, 2008 O tipo de dados 'medicina' e a função inicializa() não estão definidos em lado nenhum. Isto deve dar-te logo um erro aquando da chamada dessa função. Link to comment Share on other sites More sharing options...
suzy Posted March 5, 2008 Author Report Share Posted March 5, 2008 ? mas isto funciona 😞, o meu problema e que quero colocar a cedula unica 😁 ;)obrigada Link to comment Share on other sites More sharing options...
TheDark Posted March 5, 2008 Report Share Posted March 5, 2008 O tipo de dados 'medicina' e a função inicializa() não estão definidos em lado nenhum. Isto deve dar-te logo um erro aquando da chamada dessa função. typedef struct medico{ int cedula; char nome[TAM]; int idade; char especialidade[TAM]; hor vet[7]; }medicina; /***************************************************************************/ medicina inicializa(){//retorna uma estruruta Estão ali. Também te confundiste com os typedefs? 😞😄 *(ptr+total) = inicializa(); Em vez disto devias criar uma variável temporária para receber o resultado da função inicializa. Depois percorres todos os elementos que estão em ptr e comparas os campos cedula com o da variável temporária. Se no fim de comparares todos não existir nenhum igual é que adicionas ao fim do ptr. Desaparecido. Link to comment Share on other sites More sharing options...
suzy Posted March 5, 2008 Author Report Share Posted March 5, 2008 mas a funcao inicializa va inicializar uma estrutura, a funcao que vai retornar o valor de medicos e a funcao insere. :fartnew2: nao sei como fazer:S Link to comment Share on other sites More sharing options...
TheDark Posted March 5, 2008 Report Share Posted March 5, 2008 O que está a acontecer no código que mostraste é que os dados estão a ser pedidos e inseridos numa estrutura medicina dentro da função inicializa. Depois a estrutura é retornada por cópia. A função insere está a retornar um inteiro, não uma estrutura. Desaparecido. Link to comment Share on other sites More sharing options...
suzy Posted March 6, 2008 Author Report Share Posted March 6, 2008 ? nao esta a resultar 😞 :( 😞 int insere(medicina *ptr, int total){ { int cedula,i; medicina temp; if(total==MAX) { printf("Nao existe espaco livre\n"); return total; } else { for(i=0;i<total;i++){ if(temp.cedula!=ptr[i].cedula){ *(ptr+total) = inicializa(); } } return total+1; }; obrigada 😄 Link to comment Share on other sites More sharing options...
TheDark Posted March 6, 2008 Report Share Posted March 6, 2008 Estás a fazer o raciocínio ao contrário. No teu algoritmo, estás a dizer: "Para todos os médicos, se a cédula do novo médico não for igual à do médico que está a ser testado, copia o novo médico para o que está a ser testado." quando deveria ser algo assim: "Para todos os médicos, se a cédula do novo médico for igual à do médico que está a ser testado, sair da função. Se ao chegar ao fim do ciclo nenhuma cédula for igual, então copiar o médico para o fim do array." Ou seja, dentro do for testas se a cédula é igual. Se for, sais da função. Se não for, continuas o for. Quando o for chegar ao fim, se não tiver saído da função, adicionas o temp. Desaparecido. Link to comment Share on other sites More sharing options...
suzy Posted March 6, 2008 Author Report Share Posted March 6, 2008 obrigada pela dica ,mas da me erro:S int insere(medicina *ptr, int total)//ponteiro para o inicio do vector, e total dos livros que tem { int cedula,i; medicina temp; if(total==MAX) { printf("Nao existe espaco livre\n"); return total; } else { for(i=0;i<total;i++){ if(temp.cedula==ptr[i].cedula){ return 0; }else{ *(ptr+total)=inicializa(); } return total+1; } } }; alias adicionar o temp nao da nesta situacao, de qualqer forma obrigada Link to comment Share on other sites More sharing options...
TheDark Posted March 6, 2008 Report Share Posted March 6, 2008 Não podes meter o else, senão sempre que encontra uma cédula diferente da que estás a inserir entra no else. Tens que colocar o que está dentro do else fora e depois do for. E esquecer o else. Desaparecido. Link to comment Share on other sites More sharing options...
suzy Posted March 6, 2008 Author Report Share Posted March 6, 2008 ? desculpa la, mas isto ta dificil ? assim, queres tu dizer? int insere(medicina *ptr, int total)//ponteiro para o inicio do vector, e total dos livros que tem { int cedula,i; medicina temp; if(total==MAX) { printf("Nao existe espaco livre\n"); return total; } else { for(i=0;i<total;i++){ if(temp.cedula==ptr.cedula){ return 0; } } *(ptr+total)=inicializa(); return total+1; } } }; obrigada Link to comment Share on other sites More sharing options...
Baderous Posted March 6, 2008 Report Share Posted March 6, 2008 if(temp.cedula==ptr->cedula){ return 0; } Atenção que ptr é um apontador, logo tens de usar o operador '->' . Link to comment Share on other sites More sharing options...
suzy Posted March 6, 2008 Author Report Share Posted March 6, 2008 pois ptr[i ].cedula mas nao funciona. 😄 Link to comment Share on other sites More sharing options...
suzy Posted March 6, 2008 Author Report Share Posted March 6, 2008 desculpem e ptr->cedula Link to comment Share on other sites More sharing options...
TheDark Posted March 6, 2008 Report Share Posted March 6, 2008 Acho que queres mesmo ptr[i].cedula. E não estás a colocar dados no temp antes de fazer o for com comparação. E quando fazes return dentro do for, convém devolveres total em vez de 0. Desaparecido. Link to comment Share on other sites More sharing options...
suzy Posted March 6, 2008 Author Report Share Posted March 6, 2008 fiz assim como disseste e nao da:S ? Link to comment Share on other sites More sharing options...
TheDark Posted March 6, 2008 Report Share Posted March 6, 2008 Aqui funciona... mostra lá o código que tens. Desaparecido. Link to comment Share on other sites More sharing options...
suzy Posted March 7, 2008 Author Report Share Posted March 7, 2008 ? sei que sou chata, sorry ? tou com dificuldades nisto, ate aprece simples ? fiz assim int insere(medicina *ptr, int total)//ponteiro para o inicio do vector, e total dos livros que tem { int cedula,i; medicina temp; if(total==MAX) { printf("Nao existe espaco livre\n"); return total; } else { temp=inicializa(); for(i=0;i<total;i++){ if(temp.cedula==ptr[i].cedula){ return total; } } *(ptr+total)=inicializa(); return total+1; } } } obrigada Link to comment Share on other sites More sharing options...
TheDark Posted March 7, 2008 Report Share Posted March 7, 2008 Que eu veja, para teres o código igual ao que aqui funciona, só tens que trocar *(ptr+total)=inicializa(); para *(ptr+total)=temp; senão tens que introduzir os dados duas vezes. Desaparecido. Link to comment Share on other sites More sharing options...
suzy Posted March 7, 2008 Author Report Share Posted March 7, 2008 😛😉😛👍 muito obrigada "The Dark" 😄 :D ja da 😉 ;) ? 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