Ir ao conteúdo
  • Cadastre-se

Pascal/Delphi Menor, maior e suas posições.


Ir à solução Resolvido por kgin,

Posts recomendados

Boa noite! Estou com um problema e não sei onde está o erro no meu código, ele consiste em coletar 20 números com o usuário e mostrar o maior e menor número e suas respectivas posições. No entanto, não estou conseguindo fazer a impressão do menor número e gostaria de saber onde estou errando. Segue o código:

Program Maior_Menor_Vet;

Var vet:Array [1..20] of integer;
		i,maior,menor,localMai,localMen:integer;
Begin
	For i:=1 to 20 do
	Begin
		write('Digite um valor para o ', i ,'º vetor: ');
		readln(vet[i]); 
	end;
	
	For i:=1 to 20 do                   
	Begin 
		if (vet[i]>maior) then
		begin
			maior:=vet[i];
			localMai:=i;  
		end;	
		if (menor>vet[i]) then
		begin
			menor:=vet[i];
			localMen:=i;
		end;	
	end;
	
	writeln;
	writeln('O menor valor é: ', menor,'. Está localizado no ',localMen,'º vetor.');
	writeln('O maior valor é: ', maior,'. Está localizado no ',localMai,'º vetor.');
	readkey;
End.

 

Meu conhecimento no pascal é básico, estudo há apenas 4 meses.

Link para o comentário
Compartilhar em outros sites

  • Solução

@Nikollas G. Ohta Você precisa iniciar a variável menor com o  valor da variável maior, porque a variável já é iniciada com o menor valor que é 0 (a maioria dos compiladores de pascal faz isso, os outros não iniciam).

 

faça dois loops um para achar a maior variável e depois passe o valor da mesma para a variável menor, e depois faça o loop para achar o menor valor.

Link para o comentário
Compartilhar em outros sites

@kgin Fiz alguns testes e funcionou! Não sei se é a forma mais eficiente, mas segue o código:

Program Maior_Menor_Vet;

Var vet:Array [1..20] of integer;
		i,maior,menor,localMai,localMen:integer;
Begin
	For i:=1 to 20 do
	Begin
		write('Digite um valor para o ', i ,'º vetor: ');
		readln(vet[i]); 
	end;
	
	For i:=1 to 20 do                   
	Begin 
		if (vet[i]>maior) then
		begin
			maior:=vet[i];
			localMai:=i;  
		end;	 
		if (maior>vet[i]) then
		begin
			menor:=vet[i];
		end;	
	end;
	For i:=1 to 20 do
	Begin    
		if (menor>vet[i]) then
		begin
			menor:=vet[i];
			localMen:=i;
		end;			
	End;
	
	writeln;
	writeln('O menor valor é: ', menor,'. Está localizado no ',localMen,'º vetor.');
	writeln('O maior valor é: ', maior,'. Está localizado no ',localMai,'º vetor.');
	readkey;
End.

 

Se houver uma forma de encurtá-lo aumentando a eficiência, gostaria de saber, desde já, muito grato pela ajuda!

Link para o comentário
Compartilhar em outros sites

Eu estou meio enferrujado no Pascal, mas as linhas de 14 a 22 estão fazendo basicamente a mesma coisa.

 

O melhor seria fazer assim.

Program Maior_Menor_Vet;

const
    Q_ARRAY = 5;

Var vet:Array [1..Q_ARRAY] of integer;
        i,maior,menor,localMai,localMen:integer;
    { Você também pode iniciar as variaveis aqui dessa maneira
        maior:integer = 0; }
Begin
    { Inicia as variaveis, só por garantia ;) }
    maior := 0;
    menor := 0;
    localMen := 0;
    localMai := 0;
    
    For i:=1 to Q_ARRAY do
    Begin
        write('Digite um valor para o ', i ,'º vetor: ');
        readln(vet[i]); 
    end;
    
    { Checa o maior }
    For i:=1 to Q_ARRAY do                   
    Begin 
        { Se o valor no vet for maior que a variavel maior }
        if (vet[i]>maior) then
        begin
            { Salva a posição é o valor }
            maior:=vet[i];
            localMai:=i;  
        end;     
    end;
    
    { Inicia a variavel menor com o maior valor achado }
    menor := maior;
    
    { Checa o menor valor }
    For i:=1 to Q_ARRAY do
    Begin    
        { Se o valor no vet for menor que a variavel menor }
        if (vet[i] < menor) then
        begin
            { Salva a posição é o valor }
            menor:=vet[i];
            localMen:=i;
        end;            
    End;
    
    { Mostra o resultado }
    writeln;
    writeln('O menor valor é: ', menor,'. Está localizado no ',localMen,'º vetor.');
    writeln('O maior valor é: ', maior,'. Está localizado no ',localMai,'º vetor.');
    readkey;        { Pausa o programa }
End.

 

As coisas entre as chaves {} são comentários, se você estiver usando um compilador que não suporte a constante que eu declarei (Q_ARRAY) apague ela e substitua pelo valor.

 

Qual compilador você está usando?

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

@Nikollas G. Ohta, num mesmo laço de repetição, já verifica o maior e o maior...

 

O cerne aqui está na "inicialização das variáveis maior e menor".

 

Tem 2 formas:

- ou inicializar com o primeiro valor;

- ou inicializa o menor com um maior valor possível e o maior com um menor valor possível.

 

Segue um exemplo utilizando o primeiro modo:

 

program Maior_Menor_Vet;
{$CODEPAGE UTF8} //para permitir acentos nas string em alguns compiladores
uses
  CRT;
var
  vet: array [1..20] of integer;
       i, maior, menor,
       localMai, localMen: integer;
begin
Randomize; //usado para "embaralhar" a geração de números aletatórios (evitar repetições ao reexecutar o programa)

//preenche o vetor com os números
for i:=1 to 20 do
begin
  write('Digite um valor para o ', i:2 ,'º vetor: ');
  //readln(vet[i]);  //caso queira digitar manualmente, descomente essa linha e comente a linha de baixo
  vet[i] := Random(100); writeln(vet[i]); //recuso para preencher automaticamente o vetor
end;

//inicializa o maior e o menor com o primeiro valor
maior := vet[i];
menor := vet[i];

//para cada número (a partir do segundo, já que o primeiro já está atribuído)
for i:=2 to 20 do                   
begin 
  //se o valor atual maior que o maior
  if (vet[i] > maior) then
  begin
    maior := vet[i]; //pega o valor do maior
    localMai := i; //pega a posição do maior
  end;     
  
  //se o valor atual menor que o menor
  if (vet[i] < menor) then
  begin
    menor := vet[i]; //pega o valor do menor
    localMen := i; //pega a posição do menor
  end;    
end;

writeln;
writeln('O menor valor é: ', menor:2, '. Está localizado na posição ', localMen:2, ' do vetor.');
writeln('O maior valor é: ', maior:2, '. Está localizado na posição ', localMai:2, ' do vetor.');
ReadKey();
end.

 

Observação: esses comentários não são necessário (tirando o primeiro lá no topo, que é algo bem atípico)... pois a ideia é que o próprio código seja autoexplicativo, não necessitando de "explicações" (se está tentando explicar, é porque fez de modo meio confuso :D)... inserir eles para tentar enfatizar, mas não deveria ser necessário.

 

Adendo: ali no preenchimento do vetor, eu deixei os 2 comandos na mesma linha para ficar visualmente mais elegante, mas poderia ser um em baixo do outro... ali está "sorteando um número de 0 a 99", "atribuindo ao vetor na posição i", e "escrevendo o conteúdo do vetor na mesma posição" (para aparecer na tela o que foi gerado). Dessa forma "simulando" uma digitação do usuário... já que seria chaaaato ficar digitando um monte de números a cada teste do programa ;)

 

Segue teste no compilador Free Pascal:

image.png
 

 

 

Teste no PascalZim:

image.png

Link para o comentário
Compartilhar em outros sites

Outra forma de iniciar as variáveis (menor e maior) é no loop testando a posição, p.ex,

 

program MaiorMenor;
var
    n_maior: integer;
    i_maior: integer;
    n_menor: integer;
    i_menor: integer;
    num:     integer;
    i:       integer;
begin
    for i := 1 to 20 do begin
        write('Numero ', i, ': ');
        readln(num);
        if(i = 1) then begin
            n_maior := num;
            i_maior := i;
            n_menor := num;
            i_menor := i;
        end;
        if(num > n_maior) then begin
            n_maior := num;
            i_maior := i;
        end;
        if(num < n_menor) then begin
            n_menor := num;
            i_menor := i;
        end;
    end;
    writeln('Maior: ', n_maior,', Posicao: ', i_maior);
    writeln('Menor: ', n_menor,', Posicao: ', i_menor);
end.

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
Em 05/08/2021 às 15:09, Midori disse:
        if(num > n_maior) then begin
            n_maior := num;
            i_maior := i;
        end;
        if(num < n_menor) then begin
            n_menor := num;
            i_menor := i;
        end;

 

Se já estudou if/else, poderia ficar assim:

 

        if (i = 1) then begin
            n_maior := num;
            i_maior := i;
            n_menor := num;
            i_menor := i;
        end else          
        if (num > n_maior) then begin
            n_maior := num;
            i_maior := i;
        end else
        if (num < n_menor) then begin
            n_menor := num;
            i_menor := i;
        end;

 

Pela lógica, são condições mutuamente exclusivos, logo, se for um, não faria sentido verificar se será um outro (pois nunca será).

 

Daí, essa segunda forma seria mais técnica... com fins didáticos... já a primeira forma seria mais simples (no sentido do entendimento) e creio que também mais leve (no sentido da complexidade do código fonte). Vai depender do que está estudando.

 

Resumindo:

Na prova usaria a segunda, mas na "vida real" geralmente usaria a primeira. :D

 

Link para o comentário
Compartilhar em outros sites

@Simon Viegas Sim, a segunda é mais didática. Dessa forma gosto de indentar os blocos para dar mais destaque a cada um,

 

        if(i = 1) then begin
            n_maior := num;
            i_maior := i;
            n_menor := num;
            i_menor := i;
        end else
            if(num > n_maior) then begin
                n_maior := num;
                i_maior := i;
            end else if(num < n_menor) then begin
                n_menor := num;
                i_menor := i;
            end;

 

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

  • Membro VIP

Sim... fica mais destacado da forma que sugeriu. Se tivesse mais else, eu meio que deixa todos alinhados a partir do segundo, ou seja: só dando um dente a partir do segundo... pois já fica claro que seria uma sequência. Isso serviria para "economizar o espaçamento à direita... pois se for inserindo dentes, fica parecendo uma escada e vai precisando utilizar a barra de rolagem. :D

 

 

Outros exemplos de indentação:

 

Seguindo uma mesma base:

        if (i = 1) then begin
            n_maior := num;
            i_maior := i;
            n_menor := num;
            i_menor := i;
        end else
            if(num > n_maior) then begin
                n_maior := num;
                i_maior := i;
            end else
                if(num < n_menor) then begin
                    n_menor := num;
                    i_menor := i;
                end;

 

Aqui a escada vai se formando.. como citado, acho desnecessário.

 

 

Eu sou mais acostumado assim:

if (i = 1) then
  begin
  n_maior := num;
  i_maior := i;
  n_menor := num;
  i_menor := i;
  end
else
  if (num > n_maior) then
    begin
    n_maior := num;
    i_maior := i;
    end
  else
    if (num < n_menor) then
      begin
      n_menor := num;
      i_menor := i;
      end;


Basicamente o cerne em deixar o begin e end um dente para frente em relação ao if e o conteúdo deles no mesmo dente.

 

Costumo ver dessa forma também:

 

if (i = 1) then
begin
  n_maior := num;
  i_maior := i;
  n_menor := num;
  i_menor := i;
end else
  if (num > n_maior) then
  begin
    n_maior := num;
    i_maior := i;
  end else
    if (num < n_menor) then
    begin
      n_menor := num;
      i_menor := i;
    end;

 

No caso, com o begin e end no mesmo dente do if, mas o conteúdo um dente para frente... (O exemplo do @Midori me parece melhor.)

 

Adendo: sou também acostumado a dar espaço após o if, mas tanto faz. Vai do gosto mesmo. Eu costumo deixar junto mais quando é uma função.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...