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:  
gilmar.vicente

Pascal Menu - utilizando funções e procedimentos

Recommended Posts

Olá galera, bom dia.

É minha primeira postagem no forum então me desculpem se eu postar algo no lugar errado.

Pois bem. Tenho um trabalho para ser entregue nos próximos dias mas tranquei de uma forma que não consigo resolver.

O trabalho é fazer um menu que contenha (adicionar,listar,maior,menor,média,troca valor e sair) utilizando funções e procedimentos que à pouco foi passado em aula,

Cada opção esta dando um tipo de erro e 'troca valor' não consigo nem iniciar.

segue em anexo o arquivo com o código:

program project1;
USES
    crt;
type
  vetor = array[1..10] of real;


 procedure menu (var opcao:integer);

begin
 writeln ('MENU');
 writeln ('1) ADICIONAR');
 writeln ('2) LISTAR');
 writeln ('3) MAIOR');
 writeln ('4) MENOR');
 writeln ('5) MEDIA');
 writeln ('6) TROCA VALOR');
 writeln ('7) SAIR');
 write ('Digite sua opcao: ');
 readln (opcao);
end;
 //adicionar
procedure adicionar(var i:vetor;var cont:integer );
begin
 if cont = 11 then
 begin
 writeln('VETOR CHEIO!!');
 cont:=cont-1;
 end
 else
begin
 cont:=0;
 write('Digite um valor: ');
 readln(i[cont]);
end;
clrscr;
end;

procedure listar(var i:vetor; cont:integer);
var
j : integer;
begin
for j := 1 to cont do
writeln(i[cont]);
end;

//menor
function menor (i:vetor; cont:integer):real;
var
j : integer;
menores : real;
begin
menores := 999999;
for j := 1 to cont do
begin
if menores > i[j] then
begin
menores := i[j];
end;
end;
menor:=menores;
clrscr;
end;

function maior(j:vetor;cont:integer) : real;
var i : integer;
    maiores : real;
begin
maiores := 0;
 for i := 1 to cont do
 begin
   if j[i] > maiores then
      maiores := j[i]
   end;
 maior:=maiores;
 clrscr;
end;




//programa principal
var
opcao: integer;
cont: integer;
x: vetor;

begin
repeat
   begin
   menu(opcao);
   case opcao of
     1: begin
   cont := cont + 1;
   adicionar(x,cont);
   end;
     2: listar(x,cont);
     3: writeln('O maior valor foi: ', maior(x, cont):2:3);
     4: writeln('O menor valor foi: ', menor(x, cont):2:3);
     5: writeln('SAIR');
  else
  writeln('Digite uma opcao valida: ');
   end;
   end;
until opcao = 5;
readkey;
END.

 

Desde já agradeço qualquer ajuda. 

Editado por Simon Viegas
Removido anexo e inserido código diretamente na postagem
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @gilmar.vicente. Seja bem vindo ao Fórum do Clube do Hardware.

 

5 horas atrás, gilmar.vicente disse:

Cada opção esta dando um tipo de erro

Então, a sugestão é tentar fazer por partes. A primeira opção seria "Adicionar". Só depois de pronta que tenta fazer outras partes.... para testar o Adicionar, implementa também o "Listar". Todo o restante do código depende do "Adicionar", logo, ele tem que ficar pronto primeiro.

 

 

Vamos lá:

 

Primeiramente é necessário definir como o "Adicionar" vai funcionar. No seu código você deixou a assinatura assim:

 

5 horas atrás, gilmar.vicente disse:

procedure adicionar(var i:vetor;var cont:integer );

O que seriam esses dois parâmetros? pelo que eu entendi a variável i seria o vetor onde vai ser adicionado os números e a variável cont seria o "contador de números já cadastrados", correto?

 

obs.: por quê "i" ?  recomendo algo mais sugestivo, como vet.

 

Então, o problema é que dentro do método, você está zerando o contador.

5 horas atrás, gilmar.vicente disse:

//adicionar
procedure adicionar(var i:vetor;var cont:integer );
  begin
  ...
    cont:=0; //aqui está zerando o contador
    write('Digite um valor: ');
    readln(i[cont]); //por consequência estará acessando a posição 0 do vetor (que nem existe)
  ...
  end;

 

 

Obs.2: segue outras sugestões:

- Na verificação se está cheio ou não, use "<=" em vez de só "=".

- Deixe o "atualizador" do cont (cont:=cont+1) dentro do método, ou seja, o próprio método pode controlar se vai atualizar ou não.

 

Daí, dá uma revisada no Listar e ver se está "adicionando" corretamente ou não... como dito, o restante do código só vai funcionar se o Adicionar estiver OK.

 

 

No aguardo.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiramente obrigado pelo retorno foi mais rápido do que eu esperava.

* Na mudança de verificação do vetor  (se cheio ou não) se colocar " < = " ele não deixa entrar na opção "1 de adicionar.".

*Contudo, parece que está adicionado só não está listando. Sei que está errado a linha "writeln(vet[cont])"; da procedure listar mas tentei de outras formas e não consegui.Aparece "0" ao invés do número digitado.

 

grato.

 

 

program project1.docx

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 02/01/2018 às 09:41, gilmar.vicente disse:

procedure listar(var i:vetor; cont:integer); var j : integer; begin for j := 1 to cont do writeln(i[cont]); end;

6 horas atrás, gilmar.vicente disse:

* Na mudança de verificação do vetor  (se cheio ou não) se colocar " < = " ele não deixa entrar na opção "1 de adicionar.".

Erro meu. Seria ">=", ou seja, teoricamente no máximo vai ser igual mesmo.. mas se por algum motivo qualquer esse valor fique maior que o máximo, também não continuará (se usar só igual, iria). É uma proteção a mais.

 

 

 

6 horas atrás, gilmar.vicente disse:

*Contudo, parece que está adicionado só não está listando. Sei que está errado a linha "writeln(vet[cont])"; da procedure listar mas tentei de outras formas e não consegui.Aparece "0" ao invés do número digitado.

 

Em 02/01/2018 às 09:41, gilmar.vicente disse:

procedure listar(var i:vetor; cont:integer);
var
j : integer;
begin
for j := 1 to cont do
writeln(i[cont]);
end;

Na hora de listar, o cont é contador de cadastros, daí, ele se refere a última posição do vetor. Para percorrer o vetor, você utiliza a auxiliar j que vai de 1 a cont, logo, deveria usar o j para posicionar o vetor.

writeln(i[j]);

 

 

Tenta corrigir esses pontos e posta o código completo, daí fica mais fácil para reanalisamos.

 

No aguardo.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz algumas mudanças e na hora de listar aparece as dez posições zeradas.

Na procedure Adicionar, a variável 'j' está como não inicializada. Que coisa mais acho que nem adicionando está.

program project1;
USES
    crt;
type
  vetor = array[1..10] of integer;


 procedure menu (var opcao:integer);

begin
 writeln ('MENU');
 writeln ('1) ADICIONAR');
 writeln ('2) LISTAR');
 writeln ('3) MAIOR');
 writeln ('4) MENOR');
 writeln ('5) MEDIA');
 writeln ('6) TROCA VALOR');
 writeln ('7) SAIR');
 write ('Digite sua opcao: ');
 readln (opcao);
end;
 //adicionar
procedure adicionar( var vet:vetor; var cont: integer);
var
j : integer;
begin
 begin
 if cont >= 10 then
 begin
 writeln('VETOR CHEIO!!');
 end
 else
begin
 write('Digite um valor: ');
 readln(vet[j]);
 cont := cont+1;
end;
clrscr;
end;
end;

procedure listar(VAR vet : vetor; var cont : integer);
var
j : integer;
begin
for j := 1 to cont do
writeln(vet[j]);
end;


//menor
function menor (i:vetor; cont:integer):real;
var
j : integer;
menores : real;
begin
menores := 999999;
for j := 1 to cont do
begin
if menores > i[j] then
begin
menores := i[j];
end;
end;
menor:=menores;
clrscr;
end;

function maior(j:vetor;cont:integer) : real;
var i : integer;
    maiores : real;
begin
maiores := 0;
 for i := 1 to cont do
 begin
   if j[i] > maiores then
      maiores := j[i]
   end;
 maior:=maiores;
 clrscr;
end;




//programa principal
var
opcao: integer;
cont,j: integer;
x: vetor;

begin
repeat
   begin
   menu(opcao);
   case opcao of
     1: begin
   adicionar(x,j);
     end;
     2: listar(x,j);
     3: writeln('O maior valor foi: ', maior(x, cont):2:3);
     4: writeln('O menor valor foi: ', menor(x, cont):2:3);
     7: writeln('SAIR');

  else
  writeln('Digite uma opcao valida: ');
   end;
   end;
until opcao = 7;
readkey;
END.

 

Grato.

Editado por Simon Viegas
Inserir código do anexo no corpo da postagem
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

 

1) POSICIONAMENTO DO VETOR

1 hora atrás, gilmar.vicente disse:

Na procedure Adicionar, a variável 'j' está como não inicializada.

Na verdade está utilizando a variável errada.. a coordenada do vetor está em cont (recebido por parâmetro), e não o j local (do procedimento). Por sinal, essa variável local j não deveria nem existir. Simplesmente apague!


 

 

2) ATUALIZAÇÃO DE POSIÇÃO PARA CADASTRO

1 hora atrás, gilmar.vicente disse:

    begin
    write('Digite um valor: ');
    readln(vet[j]);
    cont:=cont+1;
    end;

Você precisa atualizar a posição da coordenada antes de adicionar.  Teoricamente cont começa com 0, ai você atualiza antes de adicionar.

 

obs.: apesar de ser automática, é recomendado inicializar a variável cont logo após começar o programa (atribuir o valor 0 a ela).

 

 

 

3) NOMENCLATURAS DE VARIÁVEIS

Evite confusões... use sempre nomenclaturas de variáveis sugestivas, ex.:

 

Em vez de:

1 hora atrás, gilmar.vicente disse:

var
  opcao  : integer;
  cont,j : integer;
  x      : vetor;

 

var
  opcao  :integer;
  cont   :integer;
  valores:vetValores;

 

 

 

4) CORRELAÇÃO DE VARIÁVEIS

Para adicionar você passou por parâmetro a variável j, mas, como vistos nos outros procedimento, deve usar a cont. Essa variável j (global) não tem nada a ver com a história.

 

 

 

5) PASSAGEM DE PARÂMETROS

Na hora de listar, está usando passagem por referência sem necessidade (não precisa do var).

 

E para os diferentes procedimentos e funções, siga a mesma linha de raciocínio, ou seja, se começou chamado de vet e cont lá nas assinaturas, continue usando eles... não tem porque usar i ou j... Perceba inclusive que você usou a nomenclatura j tanto para auxiliar para percorrer o vetor em um lugar, e j como o vetor em si em outro... a ideia e padronizar o bagulho... seguir a mesma lógica em todo o código.

 

Obs.: i e j são comumente utilizado apenas como "auxiliar para percorrer vetores"... por padrão, deixe elas para esse fim. Não use para outra coisa.

Obs.2: claro que não é rígido, mas deve existir alguma justificativa/coerência na escolha, por exemplo.

 

 

***

 

No aguardo.

 

 

 

 

 

 

 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Grato pelas observações, foi difícil mas está funcionando:inserindo,listando,maior,menor e maior que 100.

Realmente tive extrema dificuldade neste conteúdo, agora gostaria de mudar a aparência trabalhar com goto(xy), gostaria de ao invés de digitar um numero para escolher a opção do menu, fosse com as setas p/cima e p/ baixo e teclando ENTER.

 

Ainda bem que temos opções de aprendizado fora da escola.

Obrigado por seu tempo e paciência.

teste.txt

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Editando..

adicionado 16 minutos depois

Olá.

 

Alguns pontos:

1) INDENTAÇÃO

O código SEMPRE deve está indentado. A medida que vai implementado, já vai deixando indentado. É de suma importância. Segue um exemplo:

program project1;
uses
  CRT;
type
  vetor = array[1..10] of integer;

procedure menu (var opcao:integer);
  begin
  writeln('MENU');
  writeln('1) ADICIONAR');
  writeln('2) LISTAR');
  writeln('3) MAIOR');
  writeln('4) MENOR');
  writeln('5) QTD MAIOR Q 100');
  writeln('6) SAIR');
  write  ('Digite sua opcao: ');
  readln(opcao);
  end;

//adicionar
procedure adicionar (var vet: vetor; var cont: integer);
  begin
  {begin} //está duplicado
  if cont >= 10 then
    {begin} //esse begin/end não é necessário!
    writeln('VETOR CHEIO!!'){;} //tira vírgula por causa do else
    {end}
  else
    begin
    cont := cont+1;
    write('Digite um valor: ');
    readln(vet[cont]);
    end;
  ClrScr;
  {end;} //referente ao begin duplicado
end;

procedure listar (vet: vetor; cont: integer);
  var
    j : integer;
  begin
  for j := 1 to cont do
    writeln(vet[j]);
  end;


//menor
function menor (vet:vetor; cont:integer):real;
  var
    j       : integer;
    menores : real;
  begin
  menores := 999999;
  for j := 1 to cont do
    {begin} //como observado no "maiorQ100", esse begin/end não é necessário!
    if vet[j] < menores then
      menores := vet[j];
    {end;}
  menor:=menores;
  ClrScr;
  end;

//maior
function maior(vet:vetor; cont:integer) : real;
  var
    j       : integer;
    maiores : real;
  begin
  maiores := 0;
  for j := 1 to cont do
    {begin} //como observado no "maiorQ100", esse begin/end não é necessário!
    if vet[j] > maiores then
      maiores := vet[j]; //<-- faltou ";"
    {end;}
  maior:=maiores;
  ClrScr;
end;

//maior q 100
function maiorQ100(vet:vetor; cont:integer):integer;
  var
    i,qtd : integer;
  begin
  qtd:=0;
  for i := 1 to cont do
    if(vet[i]>100) then
      qtd:=qtd+1;
  maiorQ100:=qtd;
  end;


//programa principal
var
  opcao: integer;
  cont: integer;
  valores: vetor;
begin
repeat
  {begin} //repeat não precisa de begin/end
  menu(opcao);
  case opcao of
    1: {begin} //por que usar begin/end aqui, e nos outros não?
       adicionar(valores,cont);
       {end;}
    2: listar(valores,cont);
    3: writeln('O maior valor foi: ', maior(valores, cont):2:3);
    4: writeln('O menor valor foi: ', menor(valores, cont):2:3);
    5: writeln('A qtd de numeros maiores que 100 sao: ', maiorQ100(valores, cont));
    6: writeln('SAIR');
    else
      writeln('Digite uma opcao valida: ');
    end; //fim case
  {end;} //referente ao begin do repeat
until opcao = 6;
ReadKey;
END.

Obs.: esse é o código original, apenas já aproveitei para citar alguns detalhes sobre os usos "desnecessários" de begin/end.

 

 

 

2) FUNÇÃO MENOR

Iniciei o programa, e pressionei 4. Olha o que deu.

O menor valor foi: 999999.000

Precisa corrigir isso.

 

 

 

3) MENU POR TECLAS

14 horas atrás, gilmar.vicente disse:

[...] agora gostaria de mudar a aparência trabalhar com goto(xy), gostaria de ao invés de digitar um numero para escolher a opção do menu, fosse com as setas p/cima e p/ baixo e teclando ENTER.

 

Dá para fazer sim. Inicialmente precisa definir como vai funcionar. Mas veja: GotoXY() pode ser apenas um dos recursos a serem utilizados. Essa procedure está relacionada apenas ao posicionamento do cursos na tela, ou seja, na estética do programa, mas deve existir toda uma lógica por trás.

 

No caso, tente já fazer a base, e caso necessário, posta onde está com dúvidas ou precisa de ajuda.

 

***

 

 

No aguardo.

Editado por Simon Viegas
Postei sem querere antes de terminar
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@gilmar.vicente     esse menu com   escolha por seta  ficaria assim :

procedure menu (var opcao:integer);
var
  l,a  : integer;
begin
  l:=2;    
  writeln ('         MENU');
  writeln ('     1) ADICIONAR');
  writeln ('     2) LISTAR');
  writeln ('     3) MAIOR');
  writeln ('     4) MENOR');
  writeln ('     5) MEDIA');
  writeln ('     6) TROCA VALOR');
  writeln ('     7) SAIR');
  write ('Escolha Uma opcao e Tecle Enter :');
  repeat
    GotoXY(1,l);
    write(' -->');
    a:=ord(readkey());
    if a=80 then
	  begin
	    gotoxy(1,l);
	    write('    ');
      l:=l+1;
      if l > 8 then l:=2;
	  end
	  else
	    if a=72 then
      begin
	    gotoxy(1,l);
	    write('    ');
        l:=l-1;
        if l < 2 then l:=8;
	  end;
  until a=13;
  opcao:=l-1;
end;

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Grato, sem palavras para agradecer.

Você tem mais alguma sugestão para acrescentar ao projeto que tire a ideia de DOS principalmente ou uma dica de estudo.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Utilisei o seu exemplo em um outro projeto  adaptando o código e me deparei com duas situações:

A primeira é que gostaria que o cursor já iniciasse na primeira opção.

A segunda é: como cadastrar a tecla <enter>.Eu até pensei o seguinte:

begin

if (opcao = 4) then  

opcao := '1';

end;

//se a opção do usuário for a quarta linha então chamará a procedure correspondente à [1 - inserir.]

Só que não funcionou.

Ou pelo menos não apliquei a lógica de uma forma correta.

 

Grato por qualquer ajuda.

  procedure menu;
Var
  hora,min,seg,sec : word;
   l,a,opcao : integer;
Begin
   textbackground(blue);
    clrscr;
  GetTime( hora,min,seg,sec);
  write(hora , ':' , min );
    gotoxy(2,2);
    writeln('       //menu//    ');
    writeln;
    writeln('         inserir    ');
    writeln;
    writeln('         consultar  ');
    writeln();
    writeln('         modificar ');
    writeln;
    writeln('         ordenar por...   ');
    writeln;
    writeln('         sair       ');
    writeln;
    writeln('----------------------------');
    Writeln('   Utilise as setas do teclado ');
    writeln('e tecle <ENTER> na opcao desejada');
    repeat
    GotoXY(1,l);
    write(' -->');
    a:=ord(readkey());
    if a=80 then
	  begin
	    gotoxy(1,l);
	    write('    ');
      l:=l+2;  //faz o cursor pular de 2 em 2 linhas p/ baixo
      if (l>4)and(l > 12) then l:=4;
	  end
	  else
	    if a=72 then
      begin
	    gotoxy(1,l);
	    write('    ');
        l:=l-2; //faz o cursor pular de 2 em 2 linhas p/ cima
        if l < 4 then l:=12;
	  end;
  until a=13;
  opcao:=l-2;



end; 

 

 

Editado por Simon Viegas
Inserir código do texto anexo na própria postagem
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@gilmar.vicente     para começar na primeira opção, precisa inicializar a variável  l  com valor da linha onde está a primeira opção, que como você colocou é a linha 4,  e para pegar a opção, precisa dividir por dois e diminuir hum pois tem a palavra menu no começo senão seria apenas o valor de l dividido por dois .    então seu código seria assim :

program project1;
USES
    crt;
type
  vetor = array[1..10] of real;

procedure menu(var opcao : integer);
Var
  hora,min,seg,sec : word;
  l,a : integer;
Begin
  l:=4;// inicializar l com valor da linha onde está a primeira opção
  textbackground(blue);
  clrscr;
  GetTime( hora,min,seg,sec);
  write('Time => ',hora , ':' , min );
  gotoxy(2,2);
  writeln('       //menu//    ');
  writeln;
  writeln('         inserir    ');
  writeln;
  writeln('         consultar  ');
  writeln();
  writeln('         modificar ');
  writeln;
  writeln('         ordenar por...   ');
  writeln;
  writeln('         sair       ');
  writeln;
  writeln('----------------------------');
  Writeln('   Utilise as setas do teclado ');
  writeln('e tecle <ENTER> na opcao desejada');
  repeat
    GotoXY(1,l);
    write(' -->');
    a:=ord(readkey());
    if a=80 then
	  begin
	    gotoxy(1,l);
	    write('    ');
      l:=l+2;  //faz o cursor pular de 2 em 2 linhas p/ baixo
      if l > 12 then l:=4;
	  end
	  else
	    if a=72 then
      begin
	    gotoxy(1,l);
	    write('    ');
        l:=l-2; //faz o cursor pular de 2 em 2 linhas p/ cima
        if l < 4 then l:=12;
	  end;
  until a=13;
  opcao:=(l div 2)-1;//como pula duas limhas precisa dividir por dois e menos
  // hum porque a primeira opção está na linha 4, se tivesse na linha hum 
  // era só opcao :=l
  // e como são só 5 opções modificar o repeat do programa principal para until 5
end; 
 //adicionar
procedure adicionar(var i:vetor;var cont:integer );
begin
  if cont = 11 then
  begin
  writeln('VETOR CHEIO!!');
  cont:=cont-1;
  end
  else
    begin
      cont:=0;
      write('Digite um valor: ');
      readln(i[cont]);
    end;
    clrscr;
end;

procedure listar(var i:vetor; cont:integer);
var
  j : integer;
begin
  for j := 1 to cont do
  begin
    writeln(i[cont]);
  end;
end;
//menor
function menor (i:vetor; cont:integer):real;
var
  j : integer;
  menores : real;
begin
  menores := 999999;
  for j := 1 to cont do
  begin
    if menores > i[j] then
    begin
      menores := i[j];
    end;
  end;
  menor:=menores;
  clrscr;
end;

function maior(j:vetor;cont:integer) : real;
var i : integer;
  maiores : real;
begin
  maiores := 0;
  for i := 1 to cont do
  begin
    if j[i] > maiores then
    maiores := j[i]
  end;
  maior:=maiores;
  clrscr;
end;




//programa principal
var
  opcao: integer;
  cont: integer;
  x: vetor;

begin
  repeat
    menu(opcao);
    case opcao of
      1: 
			begin
        cont := cont + 1;
        adicionar(x,cont);
      end;
      2: listar(x,cont);
      3: writeln('O maior valor foi: ', maior(x, cont):2:3);
      4: writeln('O menor valor foi: ', menor(x, cont):2:3);
      5: writeln('              SAIR       Tecle');
      else
        writeln('Digite uma opcao valida: ');
    end;
  until opcao = 5;
  readkey;

 

Editado por devair1010
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá a todos.


Para complementar, implementei algumas sugestões a partir do código acima. (obs.: não alterei a estrutura/funcionalidade, só adicionei constantes e outra interpretação para achar o valor da opção)

procedure menu(var opcao:integer);
  const
    SetaParaCima          = 72; //código ordinal da tecla
    SetaParaBaixo         = 80; //código ordinal da tecla
    ENTER                 = 13; //código ordinal da tecla
    PrimeiraLinha         = 4 ; //coordenada Y da primeira linha dos itens do menu
    QtdDeItensNoMenu      = 5 ; //total de itens no menu (inserir, consultar, modificar, ordenar por... e sair
    EspacamentoEntreItens = 2 ; //quantidade de espaços entre um item e outro no menu
    UltimaLinha           = PrimeiraLinha+(QtdDeItensNoMenu-1)*EspacamentoEntreItens; //coordenada da linha do último item do menu (último item da PA*)
    
    //obs.: PA = Progressão Aritimética  (Fórmula do termo geral --> an = a1 + (n – 1)r
  var
    hora, min, seg, dseg :word; //usado no GetTime
    l, tecla :integer;
  begin
  l:=PrimeiraLinha; //inicializa l com valor da linha onde está a primeira opção
  TextBackground(Blue); //cor do fundo azul
  ClrScr;
  GetTime(hora,min,seg,dseg); //recebe hora do computador
  write('Hora => ',hora,':',min);
  //write('Time => ',hora,':',min,':',seg);
  GotoXY(2,2);
  writeln('       //menu//        ');
  writeln;
  writeln('         inserir       ');
  writeln;
  writeln('         consultar     ');
  writeln;
  writeln('         modificar     ');
  writeln;
  writeln('         ordenar por...');
  writeln;
  writeln('         sair          ');
  writeln;
  writeln('----------------------------     ');
  Writeln('   Utilise as setas do teclado   ');
  writeln('e tecle <ENTER> na opcao desejada');
  repeat
    GotoXY(1,l);
    write('-->');
    tecla:=Ord(ReadKey); //ler a tecla digitada, converte para o ordinal equivalente
    if tecla=SetaParaBaixo then
      begin
        GotoXY(1,l); write('    '); //apaga a seta da posição atual
      l:=l+EspacamentoEntreItens; //faz o cursor pular de X em X linhas p/ baixo
      if l > UltimaLinha then
        l:=PrimeiraLinha; //caso ultrapasse a última linha, reposiciona para a primeira
      end
      else
        if tecla=SetaParaCima then
        begin
        GotoXY(1,l);
        write('    ');
        l:=l-EspacamentoEntreItens; //faz o cursor pular de X em X linhas p/ cima
        if l < PrimeiraLinha then l:=UltimaLinha;
        end;
  until tecla=ENTER;
  opcao:=((l-PrimeiraLinha) div EspacamentoEntreItens)+1;
  {
  Tomando como base a "Fórmula do Termo Geral": an = a1 + (n – 1)r
  
  Substituindo pelas variáveis do contexto, temos:
  l = PrimeiraLinha + (opcao-1)*EspacamentoEntreItens
  Daí, precisamos isolar a variável opcao:
  l-PrimeiraLinha = (opcao-1)*EspacamentoEntreItens //subtrai os 2 membros por PrimeiraLinha
  (l-PrimeiraLinha)/EspacamentoEntreItens = opcao-1 //divide os 2 membros por EspacamentoEntreItens
  (l-PrimeiraLinha)/EspacamentoEntreItens + 1 = opcao //adiciona os 2 membros por 1
  opcao = (l-PrimeiraLinha)/EspacamentoEntreItens + 1 //apenas troquei um membro pelo outro :D
  
  obs.: como é observável, a fórmula pede um "/" no lugar no div, mas como a / retorna um real, é
        necessário o div para "garantir" que seja um inteiro
  }
  end;

 

 

No aguardo.

 

 

  • 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

×