Ir ao conteúdo
  • Cadastre-se
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
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
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.

 

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

 

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.

Compartilhar este post


Link para o post
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

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

 

Compartilhar este post


Link para o post
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

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

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





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

×