Ir ao conteúdo
  • Cadastre-se

Como repetir um programa em pascal dependendo da resposta.


Posts recomendados

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?

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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.

Link para o comentário
Compartilhar em outros sites

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.

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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.

Link para o comentário
Compartilhar em outros sites

 

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.

Link para o comentário
Compartilhar em outros sites

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.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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

 

Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!