Jump to content

Como colocar o campo pesquisa caso a linha de cima seja interrompida


allancarlos123
 Share

Recommended Posts

Se algum candidato não completou alguma prova, todas as linhas restantes não aparecem. Só aparecem caso ele tenha completado a tarefa.

Quero que o programa mostre o campo para pesquisar o candidato caso ele tenha completado ou não as provas.


Program Pzim ;
var
nome,sexo,p:string;
n,prova,corrida,natacao,barra,n5:Integer ;

Begin
nome:='';
Writeln('Nome: ');
readln(nome);
Writeln('Sexo: ');
readln(sexo);
Writeln('Digite a media da prova: ');
readln(prova);
If (prova>=7) And (Prova<=10) Then Begin
Writeln('Quantos Km correu: ');
readln(corrida);
If (Sexo='m') and (corrida>=100) Or (Sexo='f') and (corrida>=50) Then Begin
Writeln('Quantos Km nadou: ');
readln(natacao);
If (Sexo='m') and (natacao>=100) Or (Sexo='f') and (natacao>=50) Then Begin
Writeln('Quantas barras: ');
readln(barra);
If (Sexo='m') and (barra>=1) Or (Sexo='f') and (barra>=1) Then Begin
End;

Writeln('Pesquisar: ');
readln (p);
If (p<>nome) Then Begin
Writeln('Nome nao localizado');
End;

If (p=nome) and (sexo='m') or (prova<=6) or (corrida<100) or (natacao<100) or (barra<1) Then
If (p=nome) and (sexo='f') or (prova<=6) or (corrida<50) or (natacao<50) or (barra<1) Then

Begin
Writeln('Reprovado na nota')
End;
End;
End;
End;
End.
[/Code]
Link to comment
Share on other sites

Não falámos já sobre indentação?

Se indentasses o código correctamente, verias que todas as linhas, desde o primeiro if até ao comboio de ends, pertencem ao primeiro IF. Logo, se falhar aí, tudo o resto falha.

"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.

Link to comment
Share on other sites

E eu já dei conselhos acerca de como encadear estruturas sem enganos logo à primeira... Agora, onde é que esses conselhos pararam, isso eu já não sei...

@allancarlos123, sê sincero numa coisa: entendes como funcionam estruturas encadeadas? Isto é, If's dentro de If's, For's dentro de Repeat's e coisas assim. Sabes quando deves abrir a estrutura com Begin e fechá-la? Ou abres todas as estruturas e metes os End's que faltam todos no final?

Knowledge is free!

Link to comment
Share on other sites

Uma dica acerca das estruturas.

Antes sequer de pensares em encadeá-las, convém perceberes as estruturas simples.

Quando tu defines uma estrutura, o compilador não é bruxo, não tem uma bola de cristal nem é primo da Maya para adivinhar que parte do código é afecta à estrutura. Imagina que estamos a analisar se uma variável x é positiva, e nesse caso vamos fazer algumas operações:

1:  if x>0 then
2:     // indentar o código!
3:     writeln('positivo!');
4:     foo := bar * 2;
5:  writeln('seguinte');  // já não queremos que seja executado se x>0!

Ora, como é que, neste caso, o compilador sabe que são as linhas 3 e 4 aquelas que devem ser executadas quando x>0 e que a 5 deve ser executada sempre?

Para isto existe o bloco begin-end - este define o início da estrutura bem como o final. Portanto, devemos fazer isto:

if x>0 then
begin  // início da estrutura para o caso de x>0!
  writeln('positivo!');
  foo := bar * 2;
end;  // fim da estrutura
writeln('seguinte');  // já não queremos que seja executado se x>0!

Portanto, só o que está entre begin e end é executado se x>0.

Caso não coloques nenhum begin ou end, o que se passa é o seguinte:

1:  if x>0 then
2:     writeln('positivo!');
3:
4:  foo := bar * 2;
5:  writeln('seguinte');

Como não definimos um início e um fim da estrutura if, então apenas a linha 2 está afecta à estrutura! A linha 3 já é de domínio geral, e é executada independentemente do valor de x.

Posto isto, mas afinal é preciso pesquisar o nome, ou não é preciso? É preciso obter todos os dados, ou deve-se interromper a sua introdução logo assim que uma condição falhe? É que tu tens aí uma salada russa de todas as hipóteses existentes.

Edited by thoga31

Knowledge is free!

Link to comment
Share on other sites

Por acaso existem linguagens de programação onde é mesmo só a indentação que conta 😛

Estas linguagens ensinam logo de raíz a indentar com decência. Sem uma indentação bem definida e constante, o Python, por exemplo, recusa-se a executar os nossos códigos 😄

Exemplo:

def foo():
  return 4

def bar(n=2):
    return n*2  # erro de indentação!

if __name__ == "__main_":
  print("=" if foo == bar else "!=")

Knowledge is free!

Link to comment
Share on other sites

É a coisa mais linda de Python... 🙂

Quase me apetece dizer que Python devia ser a primeira linguagem de toda a gente, só para obrigar o pessoal a indentar...

Allan: Não tens de pedir desculpa.

Mas quando falamos aqui inúmeras vezes de indentação (não é só para ti), há um forte motivo. Acredita, metade (ou mais) das dúvidas que vêm aqui ter, não vinham se o código fosse bem indentado.

Não é só uma questão de estética, é mesmo mais fácil detectar erros, e muitas vezes, eu, o Thoga, e outros que aqui vão dando apoio, o que fazem é pegar no código, indentá-lo, e depois ver onde está o problema, simplesmente porque é impossível perceber alguma coisa numa salganhada com 4 ou 5 ends seguidos, sem se saber a onde pertence qual.

Por exemplo neste caso concreto, reproduzo em baixo o teu código, sem tirar nem por, mas indentado:

Program Pzim;
var
  nome, sexo, p: string;
  n, prova, corrida, natacao, barra, n5: Integer;

Begin
  nome:='';
  Writeln('Nome: ');
  readln(nome);
  Writeln('Sexo: ');
  readln(sexo);
  Writeln('Digite a media da prova: ');
  readln(prova);
  If (prova>=7) And (Prova<=10) 
     Then Begin
             Writeln('Quantos Km correu: ');
             readln(corrida);
             If (Sexo='m') and (corrida>=100) Or (Sexo='f') and (corrida>=50) 
                Then Begin
                        Writeln('Quantos Km nadou: ');
                        readln(natacao);
                        If (Sexo='m') and (natacao>=100) Or (Sexo='f') and (natacao>=50) 
                           Then Begin
                                   Writeln('Quantas barras: ');
                                   readln(barra);
                                   If (Sexo='m') and (barra>=1) Or (Sexo='f') and (barra>=1) 
                                      Then Begin
                                           End;

                                   Writeln('Pesquisar: ');
                                   readln (p);
                                   If (p<>nome) 
                                      Then Begin
                                              Writeln('Nome nao localizado');
                                           End;

                                   If (p=nome) and (sexo='m') or (prova<=6) or (corrida<100) or (natacao<100) or (barra<1) 
                                      Then If (p=nome) and (sexo='f') or (prova<=6) or (corrida<50) or (natacao<50) or (barra<1) 
                                              Then Begin 
                                                      Writeln('Reprovado na nota')
                                                   End;
                                End;
                     End;
          End;
End.

Agora repara... Depois do primeiro IF, no Then correspondente abres um bloco de código, que é o que vai ser executado se essa condição for verdadeira...

Onde é que para esse bloco? No penúltimo End, que é o que fica exactamente por baixo do Begin.

E o que tens a seguir a esse End? O fim do programa...

É por isso que, se ele falhar a primeira prova, o programa termina logo. Todo o código está a ser executado caso a primeira condição seja verdadeira.

Tens até ali um Begin e um End colados um ao outro... O que signiica que, se for um homem e a barra foi maior ou igual a 1, ou for uma mulher e a barra for maior ou igual a 1, não faz nada... (Curiosamente, tal condição até podia ser simplesmente se a barra for maior ou igual a 1, já que, presumo, a variável sexo só possa ser m ou f.)

É mais ou menos como aqueles fulanos que se fartam de ameaçar, mas nunca fazem nada...

"Ai, se o governo continua assim, nas eleições eu... eu... eu..."

"Sim, tu fazes o quê?"

"Eu... Eu... Eu... Eu..."

Outra coisa, é aqueles dois últimos IFs... Nunca será executado, ou se for, a condição é completamente aleatória...

Dizes tu lá:

Se p for = ao nome, e for homem, ou a prova for menor ou igual a 6, ou a corrida for menor que 100, ou a natação for menor que 100, ou a barra for menor que 1...

Se alguma coisa destas acontecer, então se o p for igual ao nome e for mulher (não era homem?), ou a prova for menor ou igual a 6 (já lá estava) ou a correida menor que 50, ou a barra for menor que 1...

Estás a ver a confusão que isto pode causar?

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.

Link to comment
Share on other sites

Por acaso não sabia deste tipo de linguagens!

Eu nunca usei, mas sabia desse detalhe da linguagem.

Qualquer dia, se tiver um tempito, ainda me aventuro!

"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.

Link to comment
Share on other sites

Tentei esse código aqui, deu certo.

Porém se ele tá mostrando todas as linhas a baixo de reprovação.

Se ele ficou reprovado na prova teórica ele mostra todas as reprovações a baixo, se ele ficar reprovado na corrida, ele mostra todas as linhas de reprovação a baixo de corrida.

Quero que ele amostre uma única linha.


Program Pzim;
var
  nome, sexo, p: string;
  n, prova, corrida, natacao, barra, n5: Integer;

Begin
  nome:='';
  Writeln('Nome: ');
  readln(nome);
  Writeln('Sexo: ');
  readln(sexo);
  Writeln('Digite a media da prova: ');
  readln(prova);
  If (prova>=7) And (Prova<=10) 
     Then Begin
             Writeln('Quantos Km correu: ');
             readln(corrida);
          End;
             If (Sexo='m') and (corrida>=100) Or (Sexo='f') and (corrida>=50) 
                Then Begin
                        Writeln('Quantos Km nadou: ');
                        readln(natacao);
                     End;
                        If (Sexo='m') and (natacao>=100) Or (Sexo='f') and (natacao>=50) 
                           Then Begin
                                        Writeln('Quantas barras: ');
                                        readln(barra);
                                    End;
                                   If (Sexo='m') and (barra>=1) Or (Sexo='f') and (barra>=1) 
                                      Then Begin
                                               End;
                                               Begin                          
                                                   Writeln('Pesquisar: ');
                                                   readln (p);
                                               End;

                                       If (p<>nome) 
                                       Then Begin
                                                    Writeln('Nome nao localizado');
                                                End;    
                                       If (p=nome) and (prova<=6)
                                       Then Begin 
                                                     Writeln('Reprovado na prova teorica');
                                                     Writeln;
                                                End;

                                       If (p=nome) and (corrida<100) 
                                       Then Begin 
                                                    Writeln('Reprovado na corrida');
                                                    Writeln;
                                                End;
                                       If (p=nome) and (natacao<100)
                                       Then Begin 
                                                    Writeln('Reprovado na natacao');
                                                   Writeln;
                                                End;
                                       If (p=nome) and (barra<1) 
                                       Then Begin 
                                                     Writeln('Reprovado na barra');
                                                     Writeln; 
                                                End;         
End.

O código ficou desorganizado quando colei aqui.

Mas no pascalzim está correto

Estou saindo pra almoçar agora por isso que não arrumei.

Link to comment
Share on other sites

Usa o editor simples (primeiro botão da caixa de texto) para escrever as respostas. Assim, o código não fica desformatado.

Continua com sérios problemas nos blocos begin-end.

Olha um exemplo:

If (Sexo='m') and (barra>=1) Or (Sexo='f') and (barra>=1)
Then Begin
End;        // o que é isto ?!?
Begin
  Writeln('Pesquisar: ');
  readln (p);
End;

Knowledge is free!

Link to comment
Share on other sites

Quando eu tiro ele o campo pesquisar dá erro,

Quando entenderes que a cada Begin há um End e que eles não estão num sítio qualquer, verás progressos e vais entender porque é que dá erro.

Quando dá erro, a solução não passa por despejar uns Ends ali algures para o compilador se "calar". O código compila? Sim. Mas isso não significa que o programa vá fazer o que tu queres. Isso depende do código e da forma como o seu fluxo é controlado.

Indenta aí bem o código e vê bem qual o encadeamento das estruturas. Eu não consigo ajudar muito mais enquanto não entenderes como funciona o Begin e o End numa estrutura.

Edited by thoga31

Knowledge is free!

Link to comment
Share on other sites

Desse jeito?

obs: continua com o erro.

Program Pzim;
var
  nome, sexo, p: string;
  n, prova, corrida, natacao, barra, n5: Integer;
Begin
nome:='';
Begin
  nome:='';
  Writeln('Nome: ');
  readln(nome);
  Writeln('Sexo: ');
  readln(sexo);
  Writeln('Digite a media da prova: ');
  readln(prova);
  If (prova>=7) And (Prova<=10) 
     Then Begin
             Writeln('Quantos Km correu: ');
             readln(corrida);
          End;
             If (Sexo='m') and (corrida>=100) Or (Sexo='f') and (corrida>=50) 
                Then Begin
                        Writeln('Quantos Km nadou: ');
                        readln(natacao);
                     End;
                        If (Sexo='m') and (natacao>=100) Or (Sexo='f') and (natacao>=50) 
                           Then Begin
                                   Writeln('Quantas barras: ');
                                   readln(barra);
                                End;
                                   If (Sexo='m') and (barra>=1) Or (Sexo='f') and (barra>=1) Then
End;                                            
                                       Begin                          
                                          Writeln('Pesquisar: ');
                                          readln (p);
                                       End;

                                       If (p=nome) and (prova<=6)
                                       Then Begin 
                                               Writeln('Reprovado na prova teorica');
                                               Writeln;
                                            End;

                                       If (p=nome) and (corrida<100) 
                                       Then Begin 
                                               Writeln('Reprovado na corrida');
                                               Writeln;
                                            End;
                                       If (p=nome) and (natacao<100)
                                       Then Begin 
                                               Writeln('Reprovado na natacao');
                                               Writeln;
                                            End;
                                       If (p=nome) and (barra<1) 
                                       Then Begin 
                                               Writeln('Reprovado na barra');
                                               Writeln; 
                                            End;                                 




End.
Link to comment
Share on other sites

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
 Share

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