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
  • Autor do tópico
  • 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
  • Autor do tópico
  • 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
  • Autor do tópico
  • 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
  • Autor do tópico
  • 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
  • Autor do tópico
  • 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

    ×