Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Leonel Martins

Como repetir um programa em pascal dependendo da resposta.

Recommended Posts

Boas, eu criei um programa simples para descobrir se um número é par ou impar e, no final eu criei uma variável que guarda a resposta do usuário à pergunta: "deseja tentar novamente? S-(sim) N-(não)", e a condição para fechar o programa em caso de a resposta ser "n". No entanto, em caso de resposta afirmativa, o programa aceita qualquer caractere como "s", ou seja, se eu digitar por exemplo "3", ele recomeça o programa.

 

Alguém sabe como repetir o programa apenas se a resposta "s" for dada?

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • 47 minutos atrás, Simon Viegas disse:

    Olá.

     

    Você poderia criar um laço de repetição para ficar lendo a resposta até que ele informa o "s" ou "n"...

     

    Como assim? poderia explicar melhor (sou novato em pascal)

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Na parte de ler o a resposta, você deixa dentro de um laço de repetição (while ou repeat), ou seja, enquanto o que for digitado não for o que você quer, o programa deverá ler novamente a resposta. Algo como:

    repita
      escreva('Deseja tentar novamente? S-(sim) N-(não): ');
      leia(resp)
    até ((resp='s') ou (resp='n'));  //a repitação termina quando a expressão for verdadeira

    Caso o usuário digite 's' ou 'n' a expressão será "verdadeira", e a repetição terminará. Caso informe outra letra diferente, a expressão vai dar "falsa" e vai ler novamente. Ou seja, a "resp" sempre vai ficar com "s" ou com "n", que é o que você deseja.

     

     

    Em Pascal seria algo assim:

    repeat
      write  ('Deseja tentar novamente? S-(sim) N-(não): ');
      readln(resp);
    until (resp='s') or (resp='n');



    Por favor, após, poste o seu código aqui para analisarmos.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 5 horas atrás, Simon Viegas disse:

    Na parte de ler o a resposta, você deixa dentro de um laço de repetição (while ou repeat), ou seja, enquanto o que for digitado não for o que você quer, o programa deverá ler novamente a resposta. Algo como:

    
    repita
      escreva('Deseja tentar novamente? S-(sim) N-(não): ');
      leia(resp)
    até ((resp='s') ou (resp='n'));  //a repitação termina quando a expressão for verdadeira

    Caso o usuário digite 's' ou 'n' a expressão será "verdadeira", e a repetição terminará. Caso informe outra letra diferente, a expressão vai dar "falsa" e vai ler novamente. Ou seja, a "resp" sempre vai ficar com "s" ou com "n", que é o que você deseja.

     

     

    Em Pascal seria algo assim:

    
    repeat
      write  ('Deseja tentar novamente? S-(sim) N-(não): ');
      readln(resp);
    until (resp='s') or (resp='n');



    Por favor, após, poste o seu código aqui para analisarmos.

    Vou tentar isso. De momento o meu código está assim: 

     

    Program AIB_p1 ;
    //Autor: Leonel Martins....
    var x: integer;
    var y: string; 
     Begin
      repeat
                    writeln('Para começar, intruduza um valor:') ;
                    readln(x);
                       writeln;
                        if ((x mod 2)=0) then 
                        writeln ('O número ', x ,' é par!')
                            else
                        writeln ('O número ', x , ' é impar!') ; 
                        writeln;
                        
                       
                    delay (300);
                    writeln ('Deseja tentar um novo valor? Pressione S-(sim) ou N-(não), seguido de Enter'); 
                        readln (y); 
                        
                until y = ('n') ;
                        
                    writeln;
                    writeln ('Para fechar o prompt, pressionar qualquer tecla');
                    writeln ('Autor: Leonel Martins - 2016');
                readkey;
     End.

     

    Editado por Simon Viegas
    Inserir tag CODE no código

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Olá.

     

    Alguns pontos:

    1) Identação de código

    Sempre mantenha o seu código bem identado. A dica é evitar o uso de TAB (tabulação). Prefira somente usar espaços por enquanto.

    Abaixo um exemplo do seu código identado:

    Program AIB_p1;
    //Autor: Leonel Martins....
    uses
      CRT; //biblioteca necessário para alguns compiladores (como o Free Pascal) reconhecer o Delay, ReadKey etc
    var
       x: integer;
       y: string;
    BEGIN
    repeat
      writeln('Para começar, intruduza um valor:') ;
      readln(x);
      writeln;
      if ((x mod 2)=0) then 
        writeln('O número ',x,' é par!')
      else
        writeln('O número ',x,' é impar!') ; 
      writeln;
      Delay(300);
      writeln('Deseja tentar um novo valor? Pressione S-(sim) ou N-(não), seguido de Enter'); 
      readln(y); 
    until y=('n');
    writeln;
    writeln ('Para fechar o prompt, pressionar qualquer tecla');
    writeln ('Autor: Leonel Martins - 2016');
    ReadKey;
    END.

     

    2) Nomenclatura de variáveis

    Use nomes mais sugestivos, por exemplo: no lugar do x, usar numero. No lugar do y, usar resp ou resposta ou continuar.

     

    ***

     

    No aguardo.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  •  

    Em 26/09/2016 às 12:46, Simon Viegas disse:

    Na parte de ler o a resposta, você deixa dentro de um laço de repetição (while ou repeat), ou seja, enquanto o que for digitado não for o que você quer, o programa deverá ler novamente a resposta. Algo como:

    
    repita
      escreva('Deseja tentar novamente? S-(sim) N-(não): ');
      leia(resp)
    até ((resp='s') ou (resp='n'));  //a repitação termina quando a expressão for verdadeira

    Caso o usuário digite 's' ou 'n' a expressão será "verdadeira", e a repetição terminará. Caso informe outra letra diferente, a expressão vai dar "falsa" e vai ler novamente. Ou seja, a "resp" sempre vai ficar com "s" ou com "n", que é o que você deseja.

     

     

    Em Pascal seria algo assim:

    
    repeat
      write  ('Deseja tentar novamente? S-(sim) N-(não): ');
      readln(resp);
    until (resp='s') or (resp='n');



    Por favor, após, poste o seu código aqui para analisarmos.

     

     

     Tentei este exemplo e funcionou certinho, obrigado, apesar de não ser um problema grave, era um problema que me incomodava, até porque o programa era uma espécie de "ficha de trabalho" de uma disciplina do meu curso.

    Editado por Leonel Martins

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • O meu código acabou ficando assim: 

     

    Program AIB_p1 ;
    //Autor: Leonel Martins....
    var x: integer;
    var y: string; 
     Begin
      repeat
        textbackground (lightgray);
        	clrscr;
        		textcolor (lightred);
        		writeln (' ----------------------------------------------------------------');
        		textcolor (black);
        		writeln (' Bem Vindo ao programa que o vai ajudar a descubrir se um número');
        		writeln (' é par ou impar de forma rápida e simples                       ');
    				textcolor (lightred);         
        		writeln (' ----------------------------------------------------------------');
        		writeln;
        		textcolor (blue);
        		delay (400);
    				writeln('Para começar, intruduza um valor:') ;
    				readln(x);
    				   writeln;
    					if ((x mod 2)=0) then 
    					writeln ('O número ', x ,' é par!')
    						else
    					writeln ('O número ', x , ' é impar!') ; 
    					writeln;
    					
    				   
    			delay (300);
    				repeat 
    						writeln ('Deseja tentar um novo valor? Pressione S-(sim) ou N-(não), seguido de Enter'); 
    					readln (y); 
    				until (y = 's') or (y = 'n');
    						
    	until y = ('n') ;
    					
    				writeln;
    				writeln ('Para fechar o prompt, pressionar qualquer tecla');
    				writeln ('Autor: Leonel Martins - 2016');
    		    readkey;
     End.

     

    Editado por Leonel Martins
    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Olá @Leonel Martins, o código ficou muito bom! :)
     

    Alguns comentários:

     

    1) Identação de código

    Deixe seu código sem bem identado. Uma boa dica é só usar espaços, e não usar tabulação (TAB).

    Abaixo reindentei, veja a diferença:
     

    Program AIB_p1;
    //Autor: Leonel Martins....
    uses
      CRT; //biblioteca necessário para alguns compiladores reconhecerem o ReadKey, TextColor, as constantes de cores (Black, Blue etc), ClrScr etc
    var //só precisa declarar o var uma vez
      x: integer;
      y: string;
    
    BEGIN
    repeat
      TextBackGround(LightGray);
      ClrScr;
      TextColor(LightRed);
      writeln(' ----------------------------------------------------------------');
      TextColor(Black);
      writeln(' Bem Vindo ao programa que o vai ajudar a descubrir se um número');
      writeln(' é par ou impar de forma rápida e simples                       ');
      TextColor(Lightred);         
      writeln(' ----------------------------------------------------------------');
      writeln;
      TextColor(Blue);
      Delay(400);
      writeln('Para começar, intruduza um valor:') ;
      readln(x);
      writeln;
      if x mod 2=0 then //<-- como só tem um comando, o () externos são facultativos
        writeln('O número ',x,' é par!')
      else
        writeln('O número ',x,' é impar!');
      writeln;
      Delay(300);
      repeat 
        writeln('Deseja tentar um novo valor? Pressione S-(sim) ou N-(não), seguido de Enter'); 
        readln(y); 
      until (y='s') or (y='n');
    until y='n'; //<-- como só tem um comando, os () externos são facultativos
    writeln;
    writeln('Para fechar o prompt, pressionar qualquer tecla');
    writeln('Autor: Leonel Martins - 2016');
    ReadKey;
    END.

    ...eu inserir alguns comentários para demonstrar outros conceitos...

    2) Leitura sem pressionar ENTER

    É possível ler a resposta do usuário sem precisar que pressione o ENTER, ex.:

      repeat 
        writeln('Deseja tentar um novo valor? Pressione S-(sim) ou N-(não), seguido de Enter'); 
        y:=ReadKey; //ler tecla pressionada
        writeln(y); //exibe a tecla pressionada (com o ReadKey, a tecla não aparece)
      until (y='s') or (y='n');

     

    3) Diferença entre minúsculo e MAIÚSCULO

    Talvez você não tenha percebido, mas o programa só vai aceitar a resposta se for um "s" ou "n" minúsculo... pois o a comparação é Case-sensitive ("sensível ao caso"). Para aceitar um "S" ou "N", poderia inserir essas alternativas na condição:

    Ex.:

    until (y='s') or (y='S') or (y='n') or (y='N');

    ou poderia usar o UpCase(), que tem a função de "retornar o correspondente em maiúsculo da valor repassado". Tem várias forma de usar... você poderia já transformar o valor do ReadKey após a leitura... ex.:

    y:=UpCase(ReadKey);

    Poria converter o y depois:

    y:=ReadKey;
    y:=UpCase(y);

    Poderia fazer na comparação lá no until...

    until (UpCase(y)='S') or (UpCase(y)='N');

     

    4) Nomenclatura de variáveis

    É aconselhável utilizar nomes mais sugestivos... "x" e "y" não remetem as suas respectivas funções. Poderia usar "numero" e "resp" (ou resposta) por exemplo...

     

    ***

     

    Por ai vai. O interessante é que esses pequenos conceitos podem ser reutilizados em outros algoritmos, da mesma forma que você "aproveitou" sobre a parte cores...

     

    PS: dentre esses pontos, para mim o mais importe está na parte da identação, ela é a base de tudo!!! Mantenha seu código identado e verás como tudo ficará mais simples...

     

    Editado por Simon Viegas

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Agradeço todas as dicas, principalmente esta última das "Leitura sem pressionar ENTER" e "UpCase()". Não tinha qualquer conhecimento sobre isso, até porque, tal como disse, estou a começar e tive apenas 1 aula de introdução a pascal, tudo o resto aprendi sozinho.

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

    Direitos autorais

    Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

    ×