thoga31

Pernambuco (brazilian programming exercise)

Mar 7th, 2014
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 5.26 KB | None | 0 0
  1. (*
  2. O estado de Pernambuco resolveu abrir um processo seletivo para PM, este processo é composto das seguintes etapas:
  3. A = Prova teórica - Média acima de 8
  4. B = Corrida - Candidatos do sexo masculino, correr 100km em 30 minutos e do sexo feminino correr 50km em 2 minutos.
  5. C = Natação - Candidato do sexo masculino, nadar 10 km em 5 minutos e feminino nadar 10km em 10 minutos.
  6. D = Barra = masculino 1 barra em 60 minutos, feminino 1 barra em 120 minutos.
  7.  
  8. Obs: O candidato só passa para a próxima etapa se for aprovado na etapa anterior.
  9.  
  10. Fazer um programa que leia o nome de um candidato e informe se ele foi aprovado ou em que etapa ele foi reprovado.
  11. *)
  12.  
  13. program pernambuco;
  14. uses crt;
  15.  
  16. type TLimite = set of byte;
  17.      TProvaTeorica = record
  18.         aprovado : boolean;
  19.         media : byte;
  20.      end;
  21.      TProvaPratica = record
  22.         aprovado : boolean;
  23.         nome : string;
  24.         distancia : smallint;
  25.         tempo : smallint;
  26.      end;
  27.      TCandidato = record
  28.         nome : string;
  29.         sexo : char;
  30.         teoria : TProvaTeorica;
  31.         pratica : array of TProvaPratica;
  32.      end;
  33.  
  34. const MASCULINO = 'M';
  35.       FEMININO = 'F';
  36.       GENEROS = [MASCULINO, FEMININO];
  37.       QTD_PRATICAS = 3;
  38.       VAL_CORRIDA_M : TProvaPratica = (aprovado : true;
  39.                                        nome : 'corrida masculino';
  40.                                        distancia : 100;
  41.                                        tempo : 30);
  42.       VAL_CORRIDA_F : TProvaPratica = (aprovado : true;
  43.                                        nome : 'corrida feminino';
  44.                                        distancia : 50;
  45.                                        tempo : 2);
  46.       VAL_NATACAO_M : TProvaPratica = (aprovado : true;
  47.                                        nome : 'natacao masculino';
  48.                                        distancia : 10;
  49.                                        tempo : 5);
  50.       VAL_NATACAO_F : TProvaPratica = (aprovado : true;
  51.                                        nome : 'natacao feminino';
  52.                                        distancia : 10;
  53.                                        tempo : 10);
  54.       VAL_BARRA_M : TProvaPratica = (aprovado : true;
  55.                                      nome : 'barra masculino';
  56.                                      distancia : 1;
  57.                                      tempo : 60);
  58.       VAL_BARRA_F : TProvaPratica = (aprovado : true;
  59.                                      nome : 'barra feminino';
  60.                                      distancia : 1;
  61.                                      tempo : 120);
  62.  
  63. procedure ProvaTeorica(const NOME_PROVA : string; const LIMITE : TLimite; const MINIMO : byte; var cand : TCandidato);
  64. begin
  65.     WriteLn(UpCase(NOME_PROVA), ':');
  66.     repeat
  67.         Write('Media? (0-20) ');
  68.         ReadLn(cand.teoria.media);
  69.     until cand.teoria.media in LIMITE;
  70.     cand.teoria.aprovado := cand.teoria.media >= MINIMO;
  71. end;
  72.  
  73. procedure ProvaPratica(const NOME_PROVA, DIST_UNIDADE, TEMPO_UNIDADE : string; const IND : byte; const DIST_M, DIST_F, TEMPO_M, TEMPO_F : smallint; var cand : TCandidato);
  74. begin
  75.     cand.pratica[IND].nome := NOME_PROVA;
  76.     WriteLn(UpCase(NOME_PROVA), ':');
  77.     repeat
  78.         Write('Distancia percorrida? (em ', DIST_UNIDADE, ') ');
  79.         ReadLn(cand.pratica[IND].distancia);
  80.     until cand.pratica[IND].distancia >= 0;
  81.     repeat
  82.         Write('Tempo decorrido? (em ', TEMPO_UNIDADE, ') ');
  83.         ReadLn(cand.pratica[IND].tempo);
  84.     until cand.pratica[IND].tempo >= 0;
  85.     cand.pratica[IND].aprovado := ((cand.sexo = MASCULINO) and (cand.pratica[IND].distancia >= DIST_M) and (cand.pratica[IND].tempo >= TEMPO_M)) or ((cand.sexo = FEMININO) and (cand.pratica[IND].distancia >= DIST_F) and (cand.pratica[IND].tempo >= TEMPO_F));
  86. end;
  87.  
  88.  
  89. procedure ValidarCandidato(cand : TCandidato);
  90. var i : byte;
  91. begin
  92.     Write('Juizo final: ');
  93.     if not cand.teoria.aprovado then begin
  94.         WriteLn('REPROVADO na prova teorica.');
  95.         exit;
  96.     end;
  97.     for i := Low(cand.pratica) to High(cand.pratica) do
  98.         if not cand.pratica[i].aprovado then begin
  99.             WriteLn('REPROVADO na prova pratica "', cand.pratica[i].nome, '".');
  100.             exit;
  101.         end;
  102.     WriteLn('APROVADO!');
  103. end;
  104.  
  105.  
  106. procedure NovoCandidato;
  107. var candidato : TCandidato;
  108. begin
  109.     Write('Nome: ');
  110.     ReadLn(candidato.nome);
  111.     repeat
  112.         Write('Sexo (M/F): ');
  113.         candidato.sexo := UpCase(ReadKey);
  114.     until candidato.sexo in GENEROS;
  115.     ProvaTeorica('A - prova teorica', [0..20], 8, candidato);
  116.     SetLength(candidato.pratica, QTD_PRATICAS);
  117.     ProvaPratica('B - corrida', 'km', 'min', 0, VAL_CORRIDA_M.distancia, VAL_CORRIDA_F.distancia, VAL_CORRIDA_M.tempo, VAL_CORRIDA_F.tempo, candidato);
  118.     ProvaPratica('C - natacao', 'km', 'min', 1, VAL_NATACAO_M.distancia, VAL_NATACAO_F.distancia, VAL_NATACAO_M.tempo, VAL_NATACAO_F.tempo, candidato);
  119.     ProvaPratica('D - barra', 'barras', 'min', 2, VAL_BARRA_M.distancia, VAL_BARRA_F.distancia, VAL_BARRA_M.tempo, VAL_BARRA_F.tempo, candidato);
  120.     ValidarCandidato(candidato);
  121. end;
  122.  
  123. var sair : char = 'N';
  124. begin
  125.     repeat
  126.         NovoCandidato;
  127.         repeat
  128.             Write('Sair? (S/N) ');
  129.             sair := UpCase(ReadKey);
  130.         until sair in ['N', 'S'];
  131.     until sair = 'S';
  132. end.
Advertisement
Add Comment
Please, Sign In to add comment