Jump to content

[Resolvido] Como apontar em qual prova o candidato não passou pesquisando o nome


Recommended Posts

Posted

Olá galera.

Quero saber como posso fazer para que ao pesquisar o nome do candidato inscrito e caso ele não tenha passado em alguma prova, na pesquisa avise em qual prova ele não passou, se possível só usando IF's. Perguntei ao professor se ia usar Record ou algo do tipo e ele disse que é só para usar IF por enquanto.

O código tá básico, ele não é assim, quero facilitar.

No caso ai só coloquei duas provas só para teste, caso o indivíduo reprove na primeira ele fique no sistema e ao pesquisar pelo nome ele escreva em qual prova ele ficou reprovado.

🙂


Program Pzim ;
Var
Sexo:Char;
Nome,p:String;
p1,p2,r:Integer;


Begin
nome:='';
For r:=1 to 2 do begin
Writeln('Nome: ');
readln(nome);
Writeln('Sexo: ');
readln(sexo);
Writeln('Correu: ');
readln(p1);
If ((Sexo='h') and (p1>=100) OR (Sexo='m') and (p1>=50)) Then
Writeln('Nadou: ');
readln(p2);
If ((Sexo='h') and (p2>=100) OR (Sexo='m') and (p2>=50)) Then
If (p=nome) Then
end;






Writeln('Pesquisar por nome: ');
readln (p);
nome:=p;
p:=nome;
Writeln(p);

end.

[/Code]
Posted

Explica lá como é que se pesquisa sem ter uma qualquer estrutura de dados?

Ou melhor, pede ao teu professor para explicar, porque em 22 anos disto, nunca consegui fazer essa proeza.

  • Vote 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

Dá para pesquisar pelo nome, não...

Dá para pedir ao utilizador que insira um conjunto de dados de forma repetida (no caso do teu exemplo, duas vezes), sem guardar esses dados em lado nenhum...

Pesquisar é procurar uma determinada informação numa estrutura com vários registos.

E no teu código, não tens em lado nenhum a possibilidade de guardar vários registos!

Repara, para pesquisar, não tem de ser Record. O tipo de dados depende dos dados que precisas guardar. Podia ser simplesmente um array (no teu caso específico, não servia de muito).

Mas tem de haver algo que agrege a informação numa estrutura pesquisável, que é o que não tens.

Mas se o professor acha que para fazer pesquisa não é preciso record, bastam if's, estão a coisa está bonita...

Até porque o record não é substituto dos if's, pelo que a afirmação é logo à partida muito estranha!

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

Ele vai corrigir o exercício hoje certamente, quando ele fazer eu copio e trago pra cá 😄 ...

Para a coisa ficar mais clara vou digitar o exercício que ele pediu para iluminar a cabeça (:

Lembrando que os dados da pergunta não importa, é só uma ideia, o importante é que funcione o programa.

O estado de Pernambuco resolveu abrir um processo seletivo para PM, este processo é composto das seguintes etapas:

A = Prova teórica - Média acima de 8

B = Corrida - Candidatos do sexo masculino, correr 100km em 30 minutos e do sexo feminino correr 50km em 2 minutos.

C = Natação - Candidato do sexo masculino, nadar 10 km em 5 minutos e feminino nadar 10km em 10 minutos.

D = Barra = masculino 1 barra em 60 minutos, feminino 1 barra em 120 minutos.

Obs: O candidato só passa para a próxima etapa se for aprovado na etapa anterior.

Fazer um programa que leia o nome de um candidato e informe se ele foi aprovado ou em que etapa ele foi reprovado.

Edited by allancarlos123
Posted

Bem, isso realmente trás luz à questão...

1º Tadinhas das moças! Correr 50km em 2 minutos nem o Francis Obikwelu.

2º O enunciado não fala nada em pesquisar... Sendo assim, o teu prof está perdoado! 😛

Tu é que tens de explicar-te melhor.

Sendo assim:

Começas por ler o nome.

Depois lês a nota da prova teórica. Se inferior a 8, avisas e termina o ciclo, se superior passa à questão seguinte.

Lês a distância da corrida. Se abaixo de 100 (H) ou 50 (M), avisa e termina. Se acima, passa à próxima...

E por aí fora...

Este exercício baseia-se em IF's encadeados, e desde já te dou um conselho:

Muita atenção à indentação do código.

Se o indentares bem, será fácil fazer isto.

Se o indentares mal, ou não indentares, vais-te perder no emaranhado de código, tal como fizeste no teu exemplo, em que os if's de uma questão executam apenas um comando da próxima...

Para teres uma ideia, olha aí o teu código indentado correctamente.

O que vês de errado?

Program Pzim ;
Var
  Sexo:Char;
  Nome,p:String;
  p1,p2,r:Integer;

Begin
  nome:='';
  For r:=1 to 2 do 
     begin
        Writeln('Nome: ');
        readln(nome);
        Writeln('Sexo: ');
        readln(sexo);
        Writeln('Correu: ');
        readln(p1);
        If ((Sexo='h') and (p1>=100) OR (Sexo='m') and (p1>=50)) 
           Then Writeln('Nadou: ');
        readln(p2);
        If ((Sexo='h') and (p2>=100) OR (Sexo='m') and (p2>=50)) 
           Then If (p=nome) 
                   Then
     end;

  Writeln('Pesquisar por nome: ');
  readln (p);
  nome:=p;
  p:=nome;
  Writeln(p);
end.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

Com certeza ficou bem melhor e bem explicativo !

😄 Vou fazer, depois voltarei.

@Edit

Achei que era pra pesquisar quando ele fala ...

Fazer um programa que "leia o nome de um candidato e informe se ele foi aprovado ou em que etapa ele foi reprovado."

Edited by allancarlos123
Posted

Fazer um programa que "leia o nome de um candidato e informe se ele foi aprovado ou em que etapa ele foi reprovado."

Isto não indica que é preciso pesquisar. Aliás, nada no enunciado te diz que deves guardar a informação.

Eu estou a detectar um grande problema da tua parte em montar as estruturas. Uma boa técnica para não falhar com os begin e end é simples: quando escreves um begin, escreves logo o seu end correspondente. Assim diminuis imenso as probabilidades de perderes um, dois ou mais end's.

Outra coisa que tens urgentemente de fazer é indentar o código. Cada estrutura deverá ter o seu conteúdo espaçado à frente. Compara estes dois códigos e diz-me qual se lê melhor:

for i:=1 to 10 do begin
if i mod 2 = 0 then begin
for j := 1 to 2 do begin
write('ola ');
end;
end
else begin
if i mod 5 = 0 then begin
write('vodka');
end
else begin
write('pfff');
end;
end;
end;

for i:=1 to 10 do begin
  if i mod 2 = 0 then begin
     for j := 1 to 2 do begin
        write('ola ');
     end;
  end
  else begin
     if i mod 5 = 0 then begin
        write('vodka');
     end
     else begin
        write('pfff');
     end;
  end;
end;

Podes achar que estás a indentar o código, mas não o estás a fazer bem. Uma pessoa perde-se facilmente a ler as tuas estruturas porque não segues as regras mais básicas da indentação.

Entretanto, decidi resolver este exercício para desanuviar um pouco, e tu não vais poder utilizar a minha solução uma vez que eu utilizei coisas que nunca deste na escola. No entanto, fica aqui um exemplo de um programa minimamente estruturado:

program pernambuco;
uses crt;

type TLimite = set of byte;
    TProvaTeorica = record
       aprovado : boolean;
       media : byte;
    end;
    TProvaPratica = record
       aprovado : boolean;
       nome : string;
       distancia : smallint;
       tempo : smallint;
    end;
    TCandidato = record
       nome : string;
       sexo : char;
       teoria : TProvaTeorica;
       pratica : array of TProvaPratica;
    end;

const MASCULINO = 'M';
     FEMININO = 'F';
     GENEROS = [MASCULINO, FEMININO];
     QTD_PRATICAS = 3;
     VAL_CORRIDA_M : TProvaPratica = (aprovado : true;
                                      nome : 'corrida masculino';
                                      distancia : 100;
                                      tempo : 30);
     VAL_CORRIDA_F : TProvaPratica = (aprovado : true;
                                      nome : 'corrida feminino';
                                      distancia : 50;
                                      tempo : 2);
     VAL_NATACAO_M : TProvaPratica = (aprovado : true;
                                      nome : 'natacao masculino';
                                      distancia : 10;
                                      tempo : 5);
     VAL_NATACAO_F : TProvaPratica = (aprovado : true;
                                      nome : 'natacao feminino';
                                      distancia : 10;
                                      tempo : 10);
     VAL_BARRA_M : TProvaPratica = (aprovado : true;
                                    nome : 'barra masculino';
                                    distancia : 1;
                                    tempo : 60);
     VAL_BARRA_F : TProvaPratica = (aprovado : true;
                                    nome : 'barra feminino';
                                    distancia : 1;
                                    tempo : 120);

procedure ProvaTeorica(const NOME_PROVA : string; const LIMITE : TLimite; const MINIMO : byte; var cand : TCandidato);
begin
   WriteLn(UpCase(NOME_PROVA), ':');
   repeat
       Write('Media? (0-20) ');
       ReadLn(cand.teoria.media);
   until cand.teoria.media in LIMITE;
   cand.teoria.aprovado := cand.teoria.media >= MINIMO;
end;

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);
begin
   cand.pratica[iND].nome := NOME_PROVA;
   WriteLn(UpCase(NOME_PROVA), ':');
   repeat
       Write('Distancia percorrida? (em ', DIST_UNIDADE, ') ');
       ReadLn(cand.pratica[iND].distancia);
   until cand.pratica[iND].distancia >= 0;
   repeat
       Write('Tempo decorrido? (em ', TEMPO_UNIDADE, ') ');
       ReadLn(cand.pratica[iND].tempo);
   until cand.pratica[iND].tempo >= 0;
   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));
end;


procedure ValidarCandidato(cand : TCandidato);
var i : byte;
begin
   Write('Juizo final: ');
   if not cand.teoria.aprovado then begin
       WriteLn('REPROVADO na prova teorica.');
       exit;
   end;
   for i := Low(cand.pratica) to High(cand.pratica) do
       if not cand.pratica[i].aprovado then begin
           WriteLn('REPROVADO na prova pratica "', cand.pratica[i].nome, '".');
           exit;
       end;
   WriteLn('APROVADO!');
end;


procedure NovoCandidato;
var candidato : TCandidato;
begin
   Write('Nome: ');
   ReadLn(candidato.nome);
   repeat
       Write('Sexo (M/F): ');
       candidato.sexo := UpCase(ReadKey);
   until candidato.sexo in GENEROS;
   ProvaTeorica('A - prova teorica', [0..20], 8, candidato);
   SetLength(candidato.pratica, QTD_PRATICAS);
   ProvaPratica('B - corrida', 'km', 'min', 0, VAL_CORRIDA_M.distancia, VAL_CORRIDA_F.distancia, VAL_CORRIDA_M.tempo, VAL_CORRIDA_F.tempo, candidato);
   ProvaPratica('C - natacao', 'km', 'min', 1, VAL_NATACAO_M.distancia, VAL_NATACAO_F.distancia, VAL_NATACAO_M.tempo, VAL_NATACAO_F.tempo, candidato);
   ProvaPratica('D - barra', 'barras', 'min', 2, VAL_BARRA_M.distancia, VAL_BARRA_F.distancia, VAL_BARRA_M.tempo, VAL_BARRA_F.tempo, candidato);
   ValidarCandidato(candidato);
end;

var sair : char = 'N';
begin
   repeat
       NovoCandidato;
       repeat
           Write('Sair? (S/N) ');
           sair := UpCase(ReadKey);
       until sair in ['N', 'S'];
   until sair = 'S';
end.

Knowledge is free!

Posted (edited)

O Thoga, e agora continua a desanuviar...

Faz isto em OOP. 😉😛

Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

Allan: Sugiro que nem olhes muito para o código do Thoga, pelo menos antes de fazeres o teu.

É que, como ele diz, aquilo já não é bem código iniciado, e está sujeito a confundir-te mais um bocado.

Nota sim na parte da organização. Um programa bem indentado ajuda-te imenso a evitar erros.

Por exemplo, se puseres cada END debaixo do seu BEGIN correspondente (ao mesmo nível), e todo o código que estiver no meio ficar 2 ou 3 caracteres à frente, basta-te um relance para veres onde pertence cada END, e por esse motivo, será fácil veres, por exemplo, que código é executado num IF ou num FOR. Basicamente, se meteres um BEGIN num IF, tudo o que aparecer lá dentro até encontrares um END ao mesmo nível desse BEGIN, será executado.

Como tu tinhas, com 3 ou 4 END's seguidos e ao mesmo nível, torna-se bem mais complicado perceber a qual BEGIN pertence qual...

Indentar é algo que é fácil de fazer, e facilita todo o resto do processo de programação... Além de ficar o código mais bonito e legível!

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

O Thoga, e agora continua a desanuviar...

Faz isto em OOP. 😉😛

Agora fica para outro dia 😄

@allancarlos123, o meu código tem coisas que decerto não falaste:

  • Arrays dinâmicos
  • Records
  • Records constantes (é incrível como muitas pessoas, mesmo que programam em Pascal há anos, desconheçam como se faz isto)
  • Sets
  • Entre outras...

Portanto, cuidado, e não te baseies demasiado nele. Nem sei se vais entender metade, e não estou a dizer isto por achar que tens menos capacidades, digo isto porque és iniciado, e as técnicas eu eu utilizei baseiam-se em anos de experiência com o Pascal, tendo pelo meio uns "toques" que aprendi de outras linguagens 😉

Apenas decidi mostrar como resolvi para veres que este problema em específico pode dar pano para mangas e que convém estruturares bem o código desde o início, além de te concentrares no que estás a fazer (por exemplo, para não falhar as estruturas de controlo).

Edited by thoga31
  • Vote 1

Knowledge is free!

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • 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.