Beruflich Dokumente
Kultur Dokumente
2010
No nosso trabalho temos 6 opes. A primeira permite adicionar um novo utente fila de espera, tendo esse cliente um numero, uma prioridade e uma posio, isto indicado pelo utilizador. Esta opo o que faz simplesmente ordenar os nmeros de utente pelas prioridade (1,2,3). Na opo um, para alm da funo imprimir, que aparece sempre na interface de interaco com o utilizador, temos a funo inserir_utente, que faz como j explicado em cima, a insero de um utente na fila de espera passando por uma srie validaes como, por exemplo, o nmero estar entre 1 e 99. Dentro desta funo temos outra que a funo libertar_espaco, que o que faz , por exemplo, quando queremos meter um utente com prioridade 1 e j estiver na fila um com prioridade 2, ela desloca o utente com prioridade 2 para a direita e coloca l o utente com prioridade 1. A segunda opo permite retirar um cliente da fila de espera. Na opo 2 temos as funes search, menu_retirar e retirar_cliente. A primeira procura na fila de espera o cliente, a segunda apresenta as perguntas ao utilizador e segundo o retorno que vem da primeira diz se o numero existe ou no na fila de espera. Se existir a terceira funo faz
2
isso mesmo retira esse utente e desloca os outros para a esquerda. Essa funo tambm actualiza os contadores do nmero de utentes com prioridade 1, 2 ou 3. Na terceira opo temos a funo menu_alterar_p que executa tambm a libertar_espaco e a retirar cliente. Esta funo permite alterar a prioridade de um qualquer utente. A quarta opo mostra apenas todos os utentes que tm uma certa prioridade. Na quinta temos um Menu Ajuda que explica sucintamente o que cada opo executa e tem os autores do programa. Finalmente, a sexta opo serve para sair do programa. Neste ponto vamos explicar melhor o contedo de cada funo. Comecemos pela funo libertar_espao. Esta funo, inicialmente, v se a prioridade a inserir menor que a prioridade do ltimo utente da fila, se sim imprime a mensagem "Sem espaco neste hospital, se no faz um switch para as trs prioridades. Segundo isto, ela relaciona a posio com o numero de utentes com uma dada prioridade para conseguir aloc-los numa posio correcta. Tambm v que se a fila de espera estiver cheia manda aparecer a mensagem "Utente mandado para outro hospital. De seguida faz um ciclo for para actualizar os lugares, quando se retira um, ou seja, a frente desse desloca todos um lugar para a
esquerda. Por ltimo, actualiza os contadores do nmero de utentes com determinada prioridade. A funo retirar_cliente serve para retirar o cliente. Procura o numero q o utente introduziu e, depois, actualiza os contadores de numero de utentes com uma dada prioridade. De seguida mete o valor 0 no lugar do utente retirado. Assim, temos estas duas ltimas funes como as mais importantes. As outras, so funes de maior interaco com o utilizador utilizando ciclos simples, tal como a funo imprimir que responsvel pela apresentao da fila de espera e de prioridade e como a funo mostrar_prior que apenas faz um ciclo for em que compara a prioridade inserida pelo utilizador com a da fila e mostra as iguais.
Cdigo C
#include<stdio.h> #include<stdlib.h>
int mostrar_prior(); void menu_retirar(void); int search (int n_utente); int retirar_cliente(int n_utente); void libertar_espaco (int prioridade, int posicao, int n_utente); void preencher_utente_prioridade (char caracter); int inserir_utente (); void menu_alterar_p(void); void imprimir(void);
int fila_espera [20]; int fila_prior[20]; int n_utente_p_1 = 0; int n_utente_p_2 = 0; int n_utente_p_3 = 0; int sair;
main() { printf("\n printf("\n printf("\n printf("\n printf("\n printf("\n printf("\n printf("\n printf("\n printf("\n printf("\n printf("\n printf("\n printf("\n printf("\n printf("\n printf("\n printf("\n printf("\n printf("\n ----------------------------------------------------------"); | | | | | +++++++++++++++ ++++++++++++++ +++++++++++++++++++++++ + URGENCIA HOSPITALAR + +++++++++++++++++++++++ |"); |"); |"); |"); |"); |"); |"); |"); +++++++++++++ |");
|3- ALTERAR PRIORIDADE 4-MOSTRAR FILA |"); | ++++++++++++ | | | | | | | ++++++++++++ 5- AJUDA ++++++++++++ +++++++++ 6- SAIR +++++++++ POR PRIORIDADE ++++++++++ |"); |"); |"); |"); |"); |"); |"); |");
----------------------------------------------------------");
imprimir();
do{ printf ("\n\n\nEscolha uma das opcoes:\n"); scanf("%d",&opcao); if ( opcao!=1 && opcao!=2 && opcao!=3 && opcao!=4 && opcao!=5 && opcao!=6)
6
{ printf("\nEscolha uma opcao entre 1 e 6\n\n"); } }while( opcao!=1 && opcao!=2 && opcao!=3 && opcao!=4 && opcao!=5 && opcao!=6);
switch(opcao) { case 1:{ system("MODE con cols=80 lines=30"); system("cls"); imprimir(); inserir_utente(); imprimir(); system("pause"); system("cls"); main(); break; } case 2:{ system("MODE con cols=80 lines=30"); system("cls"); imprimir(); search(n_utente); menu_retirar(); retirar_cliente(n_utente); imprimir(); system("pause"); system("cls"); main();
7
break; } case 3:{ system("MODE con cols=80 lines=30"); system("cls"); imprimir(); menu_alterar_p(); imprimir(); system("pause"); system("cls"); main(); break; } case 4:{ system("MODE con cols=80 lines=30"); system("cls"); imprimir(); mostrar_prior(); system("pause"); system("cls"); main(); break; }
case 5:{ system("MODE con cols=80 lines=30"); system("cls"); printf("\n\n \n\n\n"); printf(" printf(" Fernando Oliveira e Joao Pereira \n\n"); Turma 1DI \n\n\n"); Este programa foi desenvolvidado por:
printf("A opcao 1 permite inserir um utente na fila de espera da urgencia\n\n"); printf("A opcao 2 permite retirar um qualquer utente que esteja na fila de espera\n\n"); printf("A opcao 3 permite alterar a prioridade de um qualquer utente\n\n"); printf("A opcao 4 permite visualizar a fila de espera de uma so prioridade\n\n"); printf("A opcao 5 abre o menu AJUDA\n\n"); printf("A opcao 6 sai do programa\n\n"); system("pause"); system("cls"); main(); break; }
case 6:{ system("MODE con cols=80 lines=15"); do{ printf("\nTem a certeza que deseja sair? (Prima 1 para sair e 2 para voltar ao menu )\n"); scanf("%d",&sair); printf("\n\n"); if (sair==1) { printf("O programa vai terminar. Volte sempre!\n\n"); system("pause"); exit(0); break; } else { system("pause"); main(); break; } system("cls"); } while (sair!=1 || sair!=2);
} } system("pause");
preencher_utente_prioridade(0); return;
10
} int inserir_utente () { int n_utente,prior,pos ; do{ printf("\nIntroduza o seu numero de cliente:\n"); scanf("%u", &n_utente); if ( n_utente<1 || n_utente>99 ) printf("Numero invalido insira um numero entre 1 e 99 !\n"); if ( search (n_utente) ) printf("\nEsse numero ja existe. Insira outro numero!\n"); }while ( n_utente<1 || n_utente>99 || search (n_utente)) ; do{ printf("\nIntroduza a prioridade de doena ( 1, 2, 3):\n"); scanf("%u", &prior); if ( prior!= 1 && prior!= 2 && prior!=3) printf("Numero invalido ! Digite um numero entre 1 e 3\n"); }while( prior != 1 && prior != 2 && prior != 3); do{ printf("Introduza a posiao :\n"); scanf("%u", &pos); if (pos > 20 || pos <1) printf("Posicao nao aceite. Tem que estar entre 1 e 20\n"); }while ( pos > 20 || pos <1);
11
int search (int n_utente) { int i; for(i=0;i<=19;i++) { if (fila_espera[i]==n_utente) return 1; } return 0 ; } void preencher_utente_prioridade (char caracter) { int i; for (i=0; i<=19; i++) fila_espera[i]=caracter; fila_prior[i]=caracter; return; }
void libertar_espaco (int prioridade, int posicao, int n_utente) { int n_utente_prior_sup, i; if(fila_prior[19]<prioridade && fila_prior[19]!=0) { printf("Sem espaco neste hospital\n\n"); } else { switch (prioridade) { case 1:{ if (posicao> n_utente_p_1 +1)
12
{ printf("Posicao invalida para essa prioridade! Utente realocado.\n\n"); posicao = n_utente_p_1 + 1; } n_utente_prior_sup=0; break; } case 2: {n_utente_prior_sup=n_utente_p_1; if (posicao> n_utente_p_2+1) { printf("Posicao invalida para essa prioridade! Utente realocado.\n\n"); posicao = n_utente_p_2 + 1; } break;} case 3: {n_utente_prior_sup=n_utente_p_1 + n_utente_p_2; if (posicao> n_utente_p_3 +1) { printf("Posicao invalida para essa prioridade! Utente realocado.\n\n"); posicao = n_utente_p_3 + 1; } break;} } n_utente_prior_sup = n_utente_prior_sup + posicao - 1;
13
for (i=18; i>=n_utente_prior_sup; i--) { fila_espera[i+1]=fila_espera[i]; fila_prior[i+1]=fila_prior[i]; } fila_espera[n_utente_prior_sup] = n_utente; fila_prior[n_utente_prior_sup] = prioridade;
switch (prioridade) { case 1:{ n_utente_p_1 ++; break; } case 2: { n_utente_p_2 ++; break;} case 3: { n_utente_p_3 ++; break;} } } return; }
14
void imprimir(void) { int i; printf("\n\n\n "); printf("| Fila de Espera |"); for(i=0;i<=19;i++) { printf("%2.2u|", fila_espera[i]); } printf("\n ----------------------------------------------------------------------------"); printf("\n "); printf("| Fila prioridade|"); for(i=0;i<=19;i++) { printf("%2.2u|", fila_prior[i]); } printf("\n ---------------------------------------------------------------------------\n"); printf(" | Posicao |");
15
switch(fila_prior[i]) { case 1: { n_utente_p_1--; break; } case 2: { n_utente_p_2--; break; } case 3: { n_utente_p_3--; break; } }
16
fila_espera[19] = 0; fila_prior[19] = 0;
return 0; } void menu_retirar(void) { int n_utente, prior, erro = 0; do { do { printf("\nIntroduza o seu numero de utente:\n"); scanf("%u", &n_utente); if ( n_utente<1 || n_utente>99 ) printf("Numero invalido insira um numero entre 1 e 99 !\n"); }while ( n_utente<1 || n_utente>99 );
17
if(retirar_cliente(n_utente)) { erro = 1; printf("Esse numero de utente no existe\n\n"); system("pause"); system("cls"); main(); } }while(erro); return;
} void menu_alterar_p(void) { int n_utente,prior,pos ; do{ printf("\nIntroduza o seu numero de cliente:\n"); scanf("%u", &n_utente); if ( n_utente<1 || n_utente>99 ) printf("Numero invalido insira um numero entre 1 e 99 !\n"); if ( !search (n_utente) ) printf("\nEsse numero no existe. Insira outro numero!\n\n"); }while ( n_utente<1 || n_utente>99 || !search (n_utente)) ; do{ printf("\nIntroduza a nova prioridade de doena ( 1, 2, 3):\n"); scanf("%u", &prior); if ( prior!= 1 && prior!= 2 && prior!=3) printf("Numero invalido ! Digite um numero entre 1 e 3\n"); }while( prior != 1 && prior != 2 && prior != 3);
18
do{ printf("Introduza a posiao :"); scanf("%u", &pos); if (pos > 20 || pos <1) printf("Posicao nao aceite. Tem que estar entre 1 e 20\n"); }while ( pos > 20 || pos <1);
int mostrar_prior() { int p, i ; do{ printf("\nIntroduza a prioridade \n\n"); scanf("%u",&p); if ( p!= 1 && p!= 2 && p!=3) printf(" Incorrecto ! Insira uma prioridade de 1 a 3!\n\n"); }while( p!= 1 && p!= 2 && p!=3);
return; }
19
Algoritmo
Funo libertar_espaco. Esta funo avalia se a fila esta cheia, avalia tambm a ordem das prioridades, ou seja, v se o cliente a entrar tem maior prioridade que os que l esto, actualiza contadores de utentes e desloca os existentes caso o que entra passe nas condies para entrar. Se (fila_prior[19]<prioridade && fila_prior[19]!=0) Escrever ("Sem espaco neste hospital) Seno Switch(prioridade) Case 1: Se (posicao> n_utente_p_1 +1) Escrever ("Posicao invalida para essa prioridade! Utente realocado.); n_utente_prior_sup=0; break; Case 2: n_utente_prior_sup=n_utente_p_1; Se (posicao> n_utente_p_2+1) Escrever ("Posicao invalida para essa prioridade! Utente realocado.); posicao = n_utente_p_2 + 1; break; Case 3: n_utente_prior_sup=n_utente_p_1 + n_utente_p_2; Se (posicao> n_utente_p_3 +1) Escrever ("Posicao invalida para essa prioridade! Utente realocado.); posicao = n_utente_p_3 + 1; break; n_utente_prior_sup = n_utente_prior_sup + posicao - 1; Se(fila_espera[19] != 0) Escrever("Utente mandado para outro hospital); i 0
20
i=i-1; fila_espera[n_utente_prior_sup] prioridade; switch(prioridade) Case 1: n_utente_p_1 ++; break; Case 2: n_utente_p_2 ++; break; Cae 3: n_utente_p_3 ++; break; return; n_utente; fila_prior[n_utente_prior_sup]
Escrever ("| Fila de Espera |"); i 0; Repetir at i<=19 Escrever ("%2.2u|", fila_espera[i]); i=i+1 Escrever("---------------------------------------------------------------------------"); Escrever ("| Fila de Prioridade |"); I 0; Repetir at i<=19 Escrever ("%2.2u|", fila_prior[i]); i=i+1 Escrever("---------------------------------------------------------------------------"); Escrever ("| Posio |"); I 1;
21
Funo Retirar_Cliente. Esta funo procura o cliente inserido, tira-o da fila, actualiza os contadores e depois actualiza as filas, deslocando os valores todos e preenche os em branco com zeros.
switch( fila_prior[i] ) { case 1: n_utente_p_1--; break; case 2: n_utente_p_2--; break; case 3: n_utente_p_3--; break; }
22
Funo menu_retirar. Esta funo pede os dados aos utentes para o retirar da fila. Confere a existncia do nmero inserido.
Repetir Enquanto Erro Fazer enquanto ( n_utente<1 OR n_utente>99 ) Escrever(Introduza o seu numero de utente:); Ler(n_utente) Se ( n_utente<1 OR n_utente>99 ) Escrever("Numero invalido insira um numero entre 1 e 99 !"); Se (retirar_cliente(n_utente)) erro = 1; Escrever("Esse numero de utente no existe"); system("pause"); system("cls"); main(); Return;
23
Funo menu_alterar_p.Esta funo pede os dados ao utente. Executa as funes retirar_cliente e libertar_espaco.
Fazer Enquanto ( n_utente<1 OR n_utente>99 OR search (n_utente)); Escrever(Introduza o seu numero de utente:); Ler(n_utente) Se ( n_utente<1 OR n_utente>99 ) Escrever(Numero invalido insira um numero entre 1 e 99 !); Se ( search (n_utente) ) Escrever(Esse numero no existe. Insira outro numero!);
Repetir Enquanto( prior 1 AND prior 2 AND prior 3); Escrever(Introduza a nova prioridade de doena ( 1, 2, 3):); Ler(prior); Se ( prior 1 AND prior 2 AND prior3) Escrever(Numero invalido ! Digite um numero entre 1 e 3); repetir Enquanto ( pos > 20 OR pos <1) Escrever(Introduza a posiao :"); Ler(pos) Se (pos > 20 OR pos <1) Escrever(Posicao nao aceite. Tem que estar entre 1 e 20); retirar_cliente(n_utente); libertar_espaco (prior, pos, n_utente); return;
24
Funo mostrar_prior. Esta funo imprime a fila com os utentes de uma dada prioridade escolhida pelo utilizador.
Repetir Enquanto ( p 1 AND p 2 AND p3) Escrever( Introduza a prioridade); Ler(p) Se ( p 1 AND p 2 AND p3) Escrever(" Incorrecto ! Insira uma prioridade de 1 a 3!); I 0 Repetir at i<=19 Se ( fila_prior[i]= p) Escrever(%2.2u |, fila_espera[i]); I++; Return;
25
Funo search. Esta funo procura um numero de utente igual se encontrar retorna 1 seno retorna 0.
Funo inserir_utente. Esta funo pede os dados ao utilizador para a insero do utente. Executa a funo libertar_espaco.
Fazer Enquanto ( n_utente<1 OR n_utente>99 OR search (n_utente)); Escrever(Introduza o seu numero de utente:); Ler(n_utente) Se ( n_utente<1 OR n_utente>99 ) Escrever(Numero invalido insira um numero entre 1 e 99 !); Se ( search (n_utente) ) Escrever(Esse numero no existe. Insira outro numero!);
Repetir Enquanto( prior 1 AND prior 2 AND prior 3); Escrever(Introduza a prioridade de doena ( 1, 2, 3):); Ler(prior); Se ( prior 1 AND prior 2 AND prior3) Escrever(Numero invalido ! Digite um numero entre 1 e 3); Repetir Enquanto ( pos > 20 OR pos <1) Escrever(Introduza a posiao :"); Ler(pos) Se (pos > 20 OR pos <1) Escrever(Posicao nao aceite. Tem que estar entre 1 e 20);
26
Algortimo UrgHosp. Este algoritmo tem 6 opes em que na primeira insere-se um utente numa fila de espera segundo um prioridade. Na opo 2 retira-se clientes, na opo 3 altera-se prioridade, na opo 4 mostra a fila de utentes como uma dada prioridade, na opo 5 tem o menu ajuda e na opo 6 fecha o programa.
Escrever(" Escrever(" Escrever(" Escrever(" Escrever(" Escrever(" Escrever(" Escrever(" Escrever(" Escrever(" Escrever(" Escrever(" Escrever(" Escrever(" Escrever(" Escrever(" Escrever(" Escrever(" Escrever(" Escrever("
----------------------------------------------------------"); | | | | | +++++++++++++++ ++++++++++++++ +++++++++++++++++++++++ + URGENCIA HOSPITALAR + +++++++++++++++++++++++ |"); |"); |"); |"); |"); |"); |"); |"); +++++++++++++ |");
|3- ALTERAR PRIORIDADE 4-MOSTRAR FILA |"); | ++++++++++++ | | | | | | | ++++++++++++ 5- AJUDA ++++++++++++ +++++++++ 6- SAIR +++++++++ POR PRIORIDADE ++++++++++ |"); |"); |"); |"); |"); |"); |"); |");
----------------------------------------------------------");
27
imprimir(); Repetir Enquanto ( opcao1 AND opcao2 AND opcao3 AND opcao4 AND opcao5 AND opcao6) Escrever(Escolha uma das opcoes:); Ler(opcao) Se ( opcao1 AND opcao2 AND opcao3 AND opcao4 AND opcao5 AND opcao6) Escrever(Escolha uma opcao entre 1 e 6);
Switch(opcao) Case 1: system("cls"); imprimir(); inserir_utente(); imprimir(); system("pause"); system("cls"); main(); break; Case 2: system("cls"); imprimir(); search(n_utente); menu_retirar(); retirar_cliente(n_utente); imprimir(); system("pause"); system("cls"); main(); break; Case 3: system("cls");
28
imprimir(); menu_alterar_p(); imprimir(); system("pause"); system("cls"); main(); break; Case 4: system("cls"); imprimir(); mostrar_prior(); system("pause"); system("cls"); main(); break; Case 5: system("cls"); Escrever( Este programa foi desenvolvidado por:");
Escrever(Fernando Oliveira e Joao Pereira "); Escrever(Turma 1DL ); Escrever(A opcao 1 permite inserir um utente na fila de espera da urgencia "); Escrever(A opcao 2 permite retirar um qualquer utente que esteja na fila de espera); Escrever(A opcao 3 permite alterar a prioridade de um qualquer utente); Escrever(A opcao 4 permite visualizar a fila de espera de uma so prioridade"); Escrever(A opcao 5 abre o menu AJUDA"); Escrever(A opcao 6 sai do programa"); system("pause"); system("cls");
29
main(); break; Case 6: Repetir Enquanto (sair1 OR sair2) Escrever(Tem a certeza que deseja sair? (Prima 1 para sair e 2 para voltar ao menu )); Ler(sair); Se (sair=1) Escrever(O programa vai terminar. Volte sempre!); system("pause"); exit(0); break; Senao system("pause"); main(); break; system("cls")
30
Testes Efectuados
Com esta fila de espera se escolhssemos a opo 1 e inserssemos um cliente 88 com prioridade 2 e na posio 2, ficaria:
31
O resultado o esperado, pois o utente para a sua prioridade, entrou para a posio 2. Agora se quisssemos retirar o cliente 14, escolheramos a opo 2 ficando a fila da seguinte maneira:
Visto isto, o resultado o esperado. Se agora quisssemos alterar a prioridade do utente 33 para 1 para a posio 2 faramos:
32
O resultado foi o esperado. Agora, se accionssemos a opo 4, para visualizarmos a fila com a prioridade 2, apareceria:
33
Analismos que o nosso programa, praticamente no tem limitaes. Tudo que pedido funciona e como mostrado nos testes acima est a funcionar claramente. Tivemos o cuidado de analisar todas as situaes referentes a prioridades menores s que estavam l quando estivesse fila cheia, e por isso, achamos que as limitaes so inexistentes. Achamos que o nosso trabalho est bem organizado e estruturado, sendo assim, de fcil anlise e compreenso. A nossa principal dificuldade foi na actualizao de lugares no caso de retirar lugares e inserir utentes, na medida em que exigia um raciocnio mais trabalhoso j que tnhamos que pensar nas diversas situaes que podiam acontecer. Assim, conclumos que todos os objectivos foram atingidos, pois conseguimos ter sucesso na concluso do trabalho, como demonstrado atreves dos testes efectuados e copiados acima.
34