Jump to content

[Resolvido] Não consigo deixar o programa repetir o cadastro


Recommended Posts

Posted

Olá, estou aqui mais uma vez para chatiar vcs 😛

Quero fazer com que o programa faça outro cadastro caso o usuário queira, e quero que ele feche caso o usuário escolha fechar também.

Já tentei de vários modos, mas só da erro de UNTIL não esperado.

Program Pzim ;

Uses 
CRT;

Var
Prova,Corrida,Natacao,Barra:Integer;
Nome,Sexo:Char;
Aprovado:Boolean;

Begin 
Aprovado:=TRUE;
//-------------------------NOME-------------------------------

Writeln('Qual o seu nome: ');
Readln(Nome);
clrscr;
//--------------------------SEXO------------------------------
Writeln('"M" para Masculino ou "F" para Feminino: ');
Readln(Sexo);
clrscr;
//---------------------MÉDIA DA PROVA--------------------------------
Writeln('Qual foi a sua media na prova: ');
Readln(Prova);
clrscr;
If (Prova>8) AND (Prova<=10) Then

//--------------------------CORRIDA------------------------------
Begin 
IF APROVADO Then 
Begin
Writeln('Quantos Km voce correu: ');
Readln(Corrida);
clrscr;
If (Sexo='m') AND (Corrida>=100) OR (Sexo='f') AND (Corrida>=50) Then

//-------------------------NATAÇÃO-------------------------------
Begin
IF APROVADO Then
Begin
Writeln('Quantos Km voce nadou: ');
Readln(Natacao);
clrscr;
If (Sexo='m') AND (Natacao>=10) OR (Sexo='f') AND (Natacao>=10) Then
//---------------------------BARRA-----------------------------
Begin
IF APROVADO Then
Begin
Writeln('Quantas barras vc fez: ');
Readln(Barra);
clrscr;
If (Sexo='m') AND (Barra>=1) OR (Sexo='m') AND (Barra>=1) Then 
Begin
IF APROVADO Then 
END;
Begin
textcolor(YELLOW);
Writeln('Voce foi aprovado em todas as etapas. Parabens!'); 
//----------------------FECHAR OU REINICIAR----------------------------------

end;
end;
end;
end;
end;
end;
end; 
End.
Posted

Vais fazer um favor e editar o teu post e colocar o código como deve ser. Usa o editor simples (primeiro botão do editor) e não o "todo bonito" que só dá asneira deste tipo. Para concluir, vais acrescentar, à frente de "code", na tag de início, "=pascal" de forma a ficar "code=pascal" para que seja feito o highlight. Não faço eu isto para que aprendas a colocar bem o código e veres que se deve ter cuidado a colocar as coisas, fizeste Copy-Paste de algum sítio e a formatação veio toda atrás, e agora o código está cheio de tags como "font" e "color".

Depois disso, eu verei o código, ok? 😉

Knowledge is free!

Posted (edited)

Não faz mal, não nascemos ensinados, portanto há que ensinar para se aprender 😉

Não sei onde obténs um erro com um until se não há nenhum no código. Mas se tivesses indentado bem o código, terias visto o erro que assinalei:

Program Pzim ;
Uses CRT;

Var Prova,Corrida,Natacao,Barra:Integer;
   Nome,Sexo:Char;
   Aprovado:Boolean;

Begin 
   Aprovado:=TRUE;
   //-------------------------NOME-------------------------------
   Writeln('Qual o seu nome: ');
   Readln(Nome);
   clrscr;

   //--------------------------SEXO------------------------------
   Writeln('"M" para Masculino ou "F" para Feminino: ');
   Readln(Sexo);
   clrscr;

   //---------------------MÉDIA DA PROVA--------------------------------
   Writeln('Qual foi a sua media na prova: ');
   Readln(Prova);
   clrscr;

   If (Prova>8) AND (Prova<=10) Then
   //--------------------------CORRIDA------------------------------
   Begin 
       IF APROVADO Then 
       Begin
           Writeln('Quantos Km voce correu: ');
           Readln(Corrida);
           clrscr;
           If (Sexo='m') AND (Corrida>=100) OR (Sexo='f') AND (Corrida>=50) Then
           //-------------------------NATAÇÃO-------------------------------
           Begin
               IF APROVADO Then
               Begin
                   Writeln('Quantos Km voce nadou: ');
                   Readln(Natacao);
                   clrscr;
                   If (Sexo='m') AND (Natacao>=10) OR (Sexo='f') AND (Natacao>=10) Then
                   //---------------------------BARRA-----------------------------
                   Begin
                       IF APROVADO Then
                       Begin
                           Writeln('Quantas barras vc fez: ');
                           Readln(Barra);
                           clrscr;
                           If (Sexo='m') AND (Barra>=1) OR (Sexo='m') AND (Barra>=1) Then 
                           Begin
                               IF APROVADO Then 
                               END;
                               Begin  // o que é isto???
                                   textcolor(YELLOW);
                                   Writeln('Voce foi aprovado em todas as etapas. Parabens!'); 
                               //----------------------FECHAR OU REINICIAR----------------------------------
                           end;
                       end;
                   end;
               end;
           end;
       end;
   end; 
End.

Não sei para que queres a variável APROVADO se ela nunca muda de valor. Não era suposto estares a controlar o seu valor?

Um conselho. não uses mega-comentários, são desnecessários.

Por último, usa procedimentos e/ou funções para modular o código. Isto tudo enfiado no bloco principal não é boa prática.

Edited by thoga31

Knowledge is free!

Posted

Esse APROVADO é para caso alguma linha não aceite a quantidade pedida ele pare por ali e não continue a mostrar as próximas perguntas.

E Until não está dessa vez porque eu apaguei, ai quando colei agora ele já estava sem...

Por tanto, o que eu posso fazer para ele repetir o código ou feche caso o usuário escolha...

Ex:

Deseja cadastrar outro candidato (s/n) ?

Posted

Esse APROVADO é para caso alguma linha não aceite a quantidade pedida ele pare por ali e não continue a mostrar as próximas perguntas.

Isto não está a acontecer. A variável APROVADO não está a fazer nada neste momento.

Por tanto, o que eu posso fazer para ele repetir o código ou feche caso o usuário escolha...

Ex:

Deseja cadastrar outro candidato (s/n) ?

Como tentaste fazer?

Já corrigiste o erro que te apontei?

P.S.: aqui fica um exemplo de modulação do código.

function GetAge(var age : byte; const VALIDATION : set of byte; const PROMPT : string = '') : boolean;
const LIMIT = [0..150];  // há velhos recordistas xD
begin
  repeat
     write(PROMPT);
     readln(age);
  until age in LIMIT;
  GetAge := age in VALIDATION;
end;

// ...

procedure GetCandidate(var candidate : TPerson);
var approved : boolen = true;
begin
  // etc...
  if approved then
     approved := GetAge(candidate.age, [18..35], 'Idade? ')
  else
     exit;

  if approved then
  // etc...
end;
  • Vote 1

Knowledge is free!

Posted (edited)

Não te esqueças de controlar a variável APROVADO, porque ela sozinha não adivinha o que queres.

Para haver repetição, podes fazer assim:

var opcao : string;

repeat
  // código aqui

  repeat
     write('Introduzir um novo candidato? (S/N) ');
     readln(opcao);
     opcao := UpCase(opcao);  // coloca em maiúscula
  until (opcao = 'S') or (opcao = 'N');  // controla o input, o utilizador não pode inserir mais nada se não "S" ou "N".
until opcao = 'N';  // se "N", então pára e não regista mais nada.
Edited by thoga31

Knowledge is free!

Posted (edited)

Rsrsrsrs realmente não precisava, agora que vi e corrigi...

Enquanto o repeat, ainda dá problema na UNTIL, segue a print...

Como posso mandar o código inteiro sem tornar uma mega-comentário?

Untitled-3.jpg?1393630054

Edited by allancarlos123
Posted

O código não se torna um megacomentário. Eu estou a falar dos comentários do programa que são exageradamente grandes, tipo isto:

//---------------------------nunca mais acaba--------------------------

Foi interessante ver que copiaste literalmente tudo o que escrevi, comentários incluídos...

Já corrigiste o erro que apontei antes nos Begin e End? É lá que está o teu problema.

Knowledge is free!

Posted

Corrigir sim, olha como ficou :/

Obs: Se tirar o repeat ele funciona, se coloca ele dá erro de Until

Program Pzim ;

Var
Prova,Corrida,Natacao,Barra:Integer;
Nome,Sexo:Char;
Aprovado:Boolean;
opcao:String;

Begin
Repeat
Aprovado:=TRUE; 

Writeln('Qual o seu nome: ');
Readln(Nome);
clrscr;

Writeln('"M" para Masculino ou "F" para Feminino: ');
Readln(Sexo);
clrscr;

Writeln('Qual foi a sua media na prova: ');
Readln(Prova);
clrscr;
If (Prova>8) AND (Prova<=10) Then

Begin   
Writeln('Quantos Km voce correu: ');
Readln(Corrida);
clrscr;
If (Sexo='m') AND (Corrida>=100) OR (Sexo='f') AND (Corrida>=50) Then


Begin
Writeln('Quantos Km voce nadou: ');
Readln(Natacao);
clrscr;
If (Sexo='m') AND (Natacao>=10) OR (Sexo='f') AND (Natacao>=10) Then

Begin
Writeln('Quantas barras vc fez: ');
Readln(Barra);
clrscr;
If (Sexo='m') AND (Barra>=1) OR (Sexo='f') AND (Barra>=1) Then 
Begin
textcolor(yellow);
Writeln('Voce foi aprovado em todas as etapas. Parabens!'); 

 repeat
     write('Introduzir outro candidato (s/n) ? ');
     readln(opcao);
     opcao := UpCase(opcao);
  until (opcao = 'S') or (opcao = 'N');
until opcao = 'N';


end;end;end;end;

End.
Posted (edited)

Tu é de mais Thoga :3 😄

Finalmente conseguir, ficou assim...

Program Pzim ;

Var
Prova,Corrida,Natacao,Barra:Integer;
Nome,Sexo:Char;
Aprovado:Boolean;
opcao:String;

Begin
repeat
Aprovado:=TRUE;

Writeln('Qual o seu nome: ');
Readln(Nome);
clrscr;
   Writeln('"M" para Masculino ou "F" para Feminino: ');
Readln(Sexo);
clrscr;
   Writeln('Qual foi a sua media na prova: ');
Readln(Prova);
clrscr;
If (Prova>8) AND (Prova<=10) Then
Begin  
Writeln('Quantos Km voce correu: ');
Readln(Corrida);
clrscr;
end;
If (Sexo='m') AND (Corrida>=100) OR (Sexo='f') AND (Corrida>=50) Then

Begin
Writeln('Quantos Km voce nadou: ');
Readln(Natacao);
clrscr;
end;
If (Sexo='m') AND (Natacao>=10) OR (Sexo='f') AND (Natacao>=10) Then
Begin
Writeln('Quantas barras vc fez: ');
Readln(Barra);
clrscr;
end;
If (Sexo='m') AND (Barra>=1) OR (Sexo='f') AND (Barra>=1) Then
Begin
Writeln('Voce foi aprovado em todas as etapas. Parabens!');
end;
  repeat
  write('Introduzir um novo candidato? (S/N) ');
  readln(opcao);
  opcao := UpCase(opcao);
  until (opcao = 'S') or (opcao = 'N');  
until opcao = 'N';  


End.
Edited by allancarlos123
Posted

A variável aprovado existe para quê? Ocupar memória? Nao é suposto haver uma validação sequencial dos dados? É que um dado inválido faz saltar a introdução de apenas mais um e não de todos os que se seguem.

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.