Jump to content
thinkabout

Consultório Médico

Recommended Posts

thinkabout

Boas Pessoal,

A função funciona mas não liga nenhuma a ordem :(.

Problema:

Considerando o exercício anterior, nem todos os pacientes necessitam de ser atendidos com a mesma urgência. Considere que existem três graus de urgência:

Grávidas (nível 1), idosos e crianças (nível 2) e restantes pacientes (nível 3).

Só serão atendidos pacientes do nível 2 se não existirem pacientes do nível 1 e só serão atendidos pacientes do nível 3 se não existirem pacientes dos níveis 1 e 2.

Pretende-se que modifique a função de inserção de um novo paciente de modo a ter em conta estes três níveis de prioridade. A fila de espera deve continuar a ser única e a função de atendimento não deve ser alterada (o próximo paciente a ser atendido é o que se encontra noinício da fila)

Função em questão.


pno RetiraPaciente(pno lista) // O cliente está a ser atendido
{
pno aux1=lista;
pno aux2=lista;
pno aux3=lista;

if (lista==NULL)
{
printf("A lista esta vazia");
}
else

if (aux3!=NULL && lista->graurgencia == 3 )
{
printf("\n\nProximo paciente tem urgencia nivel 3 e tem o nome %s\n",lista->nome);
aux3=lista->prox;
free(lista);
return aux3;
}
else
{
if (aux2!=NULL && lista->graurgencia == 2 )
{
printf("\n\nProximo paciente tem urgencia nivel 2 e tem o nome %s\n",lista->nome);
aux2=lista->prox;
free(lista);
return aux2;
}
else
{
if (aux1!=NULL && lista->graurgencia == 1 )
{
printf("\n\nProximo paciente tem urgencia nivel 1 e tem o nome %s\n",lista->nome);
aux1=lista->prox;
free(lista);
return aux1;
}
}
}
}
[/Code]

Código Completo

[Code=c]
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ST_TAM 50

typedef struct pessoa no, *pno;

// Estrutura para armazenar informacao sobre uma pessoa
struct pessoa{
char nome[sT_TAM]; // Nome da pessoa
int graurgencia;
pno prox; // Ponteiro para proximo no da lista
};



int menu()
{
int op;

printf("\n\n1 - Novo paciente");
printf("\n2 - Atendimento");
printf("\n3 - Visualizar fila de espera");
printf("\n4 - Desistencia");
printf("\n5 - Terminar");
do{
printf("\nEscolha uma opcao: ");
scanf("%d", &op);
}while(op<1 || op>5);
fflush(stdin);
return op;
}


pno NovoPaciente(pno lista)
{
pno aux;
pno novo;
aux=lista;

if (aux!=NULL) // Se aux diferente de NULL existe pelo menos uma pessoa
{
while (aux->prox!=NULL) aux=aux->prox; // Vou percorrendo as pessoas até chegar ao final da linha.
}

// Vou agora arranjar espaço para a nova pessoa. (neste caso no fim da fila se a mesma existir se não irei arranjar espaço no começo da fila.).
if ((novo=(pno)malloc(sizeof(no)))==NULL)
{
printf("Erro na alocacao de memoria");
}
else
{
novo->prox=NULL; // No espaço que arranjei vou meter o campo prox a NULL

if (aux==NULL) // Se não existir ninguem na lista ou seja aux seria NULL
{
lista=novo;
}

else // Serve para os pacientes depois do primeiro.
{
aux->prox=novo;
}

printf("Novo Paciente\nNome:");
fgets(novo->nome,ST_TAM,stdin);
printf("Grau de urgência\n:"); // Não posso usar o fgets porque o mesmo só suporta strings
scanf("%d", &novo->graurgencia);

}
return lista;
}

pno RetiraPaciente(pno lista) // O cliente está a ser atendido
{
pno aux1=lista;
pno aux2=lista;
pno aux3=lista;

if (lista==NULL)
{
printf("A lista esta vazia");
}
else

if (aux3!=NULL && lista->graurgencia == 3 )
{
printf("\n\nProximo paciente tem urgencia nivel 3 e tem o nome %s\n",lista->nome);
aux3=lista->prox;
free(lista);
return aux3;
}
else
{
if (aux2!=NULL && lista->graurgencia == 2 )
{
printf("\n\nProximo paciente tem urgencia nivel 2 e tem o nome %s\n",lista->nome);
aux2=lista->prox;
free(lista);
return aux2;
}
else
{
if (aux1!=NULL && lista->graurgencia == 1 )
{
printf("\n\nProximo paciente tem urgencia nivel 1 e tem o nome %s\n",lista->nome);
aux1=lista->prox;
free(lista);
return aux1;
}
}
}
}


void ListaPaciente(pno lista)
{
if (lista==NULL)
{
printf("A lista esta vazia");
} else
{
printf("Nome dos pacientes\n");
printf("=================================");
while (lista!=NULL)
{
printf("\n O paciente chama-se %s e o grau de urgencia e %d \n",lista->nome,lista->graurgencia);

lista=lista->prox;
}
printf("=================================\n");
}
}



pno DesistenciaPaciente(pno lista) // Podemos escolher o paciente que vai desistir.
{
pno q=NULL;
pno p=lista;

char nome[sT_TAM];

if (lista==NULL) // Não existe ninguem.
{
puts("Nao ha ninguem para desistir");
}
else
{
puts("Insere o nome da pessoa que se vai embora");
fgets(nome,ST_TAM,stdin);

while (p!=NULL && strcmp(nome,p->nome)!=0)
{
q=p;
p=p->prox;
}
if (p==NULL)
{
printf("Paciente nao foi encontrado");
}
else
if (p==lista) // Serve para o primeiro da lista
{
lista=p->prox;
printf("Achei o primeiro com o free, e vou eliminar o primeiro e meto o ponteiro a apontar para o segundo");
}
else
{
// Não verificado ainda este comment -> printf("O paciente %s, esta farto de estar a espera e vai embora", p->nome);
q->prox=p->prox;
}

free(p);
}


return lista;
}

//libertar memoria
pno Libertar(pno lista)
{
pno aux=lista;
pno next=NULL;
if (aux!=NULL)
{
next=aux->prox;
free(aux);
aux=next;
}
return NULL;
}


int main(int argc, char *argv[])
{
int i;
// Ponteiro de lista
pno lista = NULL;
// Ciclo principal do programa
do{
i=menu();
switch(i){
case 1: lista=NovoPaciente(lista);
break;
case 2: lista=RetiraPaciente(lista);
break;
case 3: ListaPaciente(lista);
break;
case 4: lista=DesistenciaPaciente(lista);
break;
}
}while(i!=5);
lista=Libertar(lista);
return 0;
}
[/Code]

Edited by thinkabout

Share this post


Link to post
Share on other sites
thinkabout

Estava a por os pés pelas as mãos e tenho é que alterar a função de inscrição e não de atendimento.

Vou trabalhar nisso.

Share this post


Link to post
Share on other sites
thinkabout

Mesmo assim, não estou a conseguir nada.

pno NovoPaciente(pno lista)
{
pno aux;
pno novo;
aux=lista;


if (aux!=NULL)  // Se aux diferente de NULL existe pelo menos uma pessoa
{ 
	while (aux->prox!=NULL && lista->graurgencia >= aux->graurgencia) aux=aux->prox;  // Vou percorrendo as pessoas até  ao nivel que quero.. 
}

// Vou agora arranjar espaço para a nova pessoa. (Tendo em conta o nível de prioridade).
if ((novo=(pno)malloc(sizeof(no)))==NULL) 
{
	printf("Erro na alocacao de memoria"); 
} 
else
{
	novo->prox=NULL; // No espaço que arranjei vou meter o campo prox a NULL

	if (aux==NULL) // Se não existir ninguem na lista ou seja aux seria NULL, seria o primeiro paciente.
	{
		lista=novo;
	} 

	else // Serve para os pacientes depois do primeiro.
	{
		aux->prox=novo;
	}

	printf("Novo Paciente\nNome:");
	fgets(novo->nome,ST_TAM,stdin);
	printf("Grau de urgência\n:"); // Não posso usar o fgets porque o mesmo só suporta strings
	scanf("%d", &novo->graurgencia);

}
return lista;
}

Share this post


Link to post
Share on other sites
HappyHippyHippo

como podes saber onde inserir na lista sem saber qual o grau de urgência ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
thinkabout

Não consigo fazer lógica disto:(, está difícil de entrar no esquema de memória dinâmica.

Para mim era aqui

if (aux!=NULL)  // Se aux diferente de NULL existe pelo menos uma pessoa
       { 
               while (aux->prox!=NULL && lista->graurgencia >= aux->graurgencia) aux=aux->prox;  // Vou percorrendo as pessoas até  ao nivel que quero.. 
       }

Mas mesmo que fosse depois não sei bem como partir o nó, meter esse no meio e depois refazer os ponteiros.

Já andei a tentar fazer outras aventuras mas sem cá em baixo no último else, mas todas sem sucesso.

Edited by thinkabout

Share this post


Link to post
Share on other sites
Trinkes

Para inserir um nó no meio da lista basta redireccionar os ponteiros prox:

tens o nó 1->2 e queres inserir o nó 3 no meio deles. Tens de primeiro apontar o prox do nó 3 para o nó 2, depois apontar o prox do nó 1 para o nó 3. Assim ficas com a seguinte lista: 1->3->2.

Entendeste a mecânica?

Share this post


Link to post
Share on other sites
thinkabout

Vou-me dedicar a pesca... Já tenho pesadelos com ponteiros / listas.

pno NovoPaciente(pno lista)
{
   pno aux;
   pno novo;



   if ((novo=(pno)malloc(sizeof(no)))==NULL) 
   {
       printf("Erro na alocacao de memoria"); 
   } 

   printf("Novo Paciente\nNome:");
   fgets(novo->nome,ST_TAM,stdin);
   printf("Grau de urgência\n:"); // Não posso usar o fgets porque o mesmo só suporta strings
   scanf("%d", &novo->grau);



if(lista==NULL || novo->grau < lista->grau)   //caso a lista esteja vazia ou o primeiro elemento seja de grau superior ao novo doente, coloca lá a nova inscrição
   {
       novo->prox=lista;
       lista=novo;
   }
       else
   {
       while(aux->prox != NULL && novo->grau > aux->prox->grau)
           aux=aux->prox;
       novo->prox=aux->prox;
       aux->prox=novo;
   }

   return lista;
}

Edited by thinkabout

Share this post


Link to post
Share on other sites
thinkabout

Já mudei os sinais de maior e menor e já trabalha, contudo não fiquei minimamente convencido, isto foi mais tentativa erro do que lógica, ou seja continuo a ver navios.

Tenho dificuldades em perceber como se parte os nós a meio e depois religam-se.

Edited by thinkabout

Share this post


Link to post
Share on other sites
thinkabout

Tenho visto muita documentação na net a ver se começo a entender isto, mas este tópico está mais difícil que os outros.

Share this post


Link to post
Share on other sites
Trinkes

Percebes, por exemplo esta imagem?

trabalho.jpg

acho que essa imagem representa muito bem as listas.

o que tu precisas de fazer para inserir um nó é mudar a seta que liga os nós(os ponteiros).

Share this post


Link to post
Share on other sites
waza

entras no elemento da fila que queres... depois copias esse elemento para uma variavel auxiliar temporaria..

em seguida preenches com os dados que queres (na posição actual) e metes a apontar (no que guarda o endereço da proxima ocurrencia para a auxiliar !

acho que é assim

nao te esqueças de alocar a auxiliar

Edited by waza

Share this post


Link to post
Share on other sites
thinkabout

Segue o meu pensamento.

if(lista==NULL || novo->grau > lista->grau)   //caso a lista esteja vazia ou o primeiro elemento seja de grau superior ao novo doente, coloca lá a nova inscrição
{
	novo->prox=lista; // O ponteiro do que chega (novo bloco de memória), aponta onde eu quero ligar
	lista=novo; // Desloco o ponteiro do bloco que foi ligado que era a cabeça da lista para a noav cabeça da lista.
}

else
{
	aux=lista; // Não posso mexer na cabeça da lista, logo tenho que arranjar um ponteiro auxilar.
	while(aux->prox != NULL && novo->grau < aux->prox->grau) // O aux->prox->grau é porque o ponteiro aponta para o novo bloco de memória e lá dentro aponta para o grau.
		aux=aux->prox; // Aqui aponto o ponteiro para a próxima posição de memória (andar como AUX para a frente)
	novo->prox=aux->prox; // O ponteiro do novo bloco passa para o bloco actual a onde ja está também o ponteiro AUX.
	aux->prox=novo; // Aqui ligo a posição que estou a verificar ao novo bloco de memória.
}
return lista;

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


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