• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

suzy

[Resolvido] fazer com que a cedula do medico seja unica

20 mensagens neste tópico

:wallbash: ja estou ha 2 horas nisto  :wallbash:, 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  :-[

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:hmm: mas isto funciona  :(, o meu problema e que quero colocar a cedula unica  :cheesygrin:

;)obrigada

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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? :( :D

*(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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:-[ 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 :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

 

if(temp.cedula==ptr->cedula){
            return 0;
    }

Atenção que ptr é um apontador, logo tens de usar o operador '->' .

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:-[ sei que sou chata, sorry  :-[ tou com dificuldades nisto, ate aprece simples  :hmm:

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora