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

Olá.

 

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

 

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.

 

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

 

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

@Leonel Martins, caso deseje, poste o seu código para reavaliarmos e poder servi de base para outros usuário... e a depender poderíamos revisar e passar dicas para aprimorá-lo.

 

No aguardo.

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.

 

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

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

×