Ir ao conteúdo
  • Cadastre-se

Função que retorna o maior valor


pablo_spfc

Posts recomendados

Ola pessoal, sou novo aqui no forum e estou com uma duvida. Sou iniciante em pascal e estou com dois problemas para resolver:

1- Ler uma matriz de uma dimensão com 10 elementos e identificar o maior valor. obs: usar função para retornar o maior valor.

Do jeito que eu fiz, ele não diz o maior valor, mas sim o ultimo valor do vetor:


Program Pzim ;
var
v:array[1..10] of integer;
ma,me:integer;
i,re:integer;
function maior(ve,m:integer):integer;
begin
if ve>m then
maior:=ve;

end;

Begin
ma:=0; // maior inicia-se com 0;
for i:=1 to 10 do
begin
v[i]:=random(10); // alimenta o vetor
writeln(v[i]); // escreve o vetor

end;
for i:=1 to 10 do
begin
re:=maior(v[i],ma); // chama a função
end;






writeln('O maior numero é ',re); // escreve o maior numero









End.

2- Fazer uma pesquisa sequencial dentro de um vetor de uma dimensão com 10 elementos. Obs: Usar uma função para retornar dizendo se achou ou não.

Do jeito que eu fiz funciona, mas a palavra "Achou" se repete tantas vezes que o numero é encontrado:


Program Questao2 ;
var
v:array[1..10] of integer;
i,n:integer;
r:string;
function Achou(ve,nu:integer):string;
begin
if ve=nu then
writeln('Achou');

end;
Begin
writeln('dIGITE um numero');
read(n); // ler o numero a ser pesquisado
for i:=1 to 10 do
begin
v[i]:=random(10); // alimenta o vetor
writeln(v[i]); // escreve os elementos
end;
for i:=1 to 10 do
begin
r:=achou(v[i],n); // chama a função

end;
write(r); // escreve se achou

End.

Agradeço desde já :)

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Ola pessoal, sou novo aqui no forum e estou com uma duvida. Sou iniciante em pascal e estou com dois problemas para resolver:

1- Ler uma matriz de uma dimensão com 10 elementos e identificar o maior valor. obs: usar função para retornar o maior valor.

Do jeito que eu fiz, ele não diz o maior valor, mas sim o ultimo valor do vetor:


Program Pzim ;
var
v:array[1..10] of integer;
ma,me:integer;
i,re:integer;
function maior(ve,m:integer):integer;
begin
if ve>m then
maior:=ve;

end;

Begin
ma:=0; // maior inicia-se com 0;
for i:=1 to 10 do
begin
v[i]:=random(10); // alimenta o vetor
writeln(v[i]); // escreve o vetor

end;
for i:=1 to 10 do
begin
re:=maior(v[i],ma); // chama a função
end;






writeln('O maior numero é ',re); // escreve o maior numero









End.


2- Fazer uma pesquisa sequencial dentro de um vetor de uma dimensão com 10 elementos. Obs: Usar uma função para retornar dizendo se achou ou não.

Do jeito que eu fiz funciona, mas a palavra "Achou" se repete tantas vezes que o numero é encontrado:


Program Questao2 ;
var
v:array[1..10] of integer;
i,n:integer;
r:string;
function Achou(ve,nu:integer):string;
begin
if ve=nu then
writeln('Achou');

end;
Begin
writeln('dIGITE um numero');
read(n); // ler o numero a ser pesquisado
for i:=1 to 10 do
begin
v[i]:=random(10); // alimenta o vetor
writeln(v[i]); // escreve os elementos
end;
for i:=1 to 10 do
begin
r:=achou(v[i],n); // chama a função

end;
write(r); // escreve se achou

End.

Agradeço desde já :)

Olá,

1)

[...] Do jeito que eu fiz, ele não diz o maior valor, mas sim o ultimo valor do vetor:

O problema está na passagem dos parâmetros.

re:=maior(v[i],ma);  // chama a função

Observe que você está enviando ma (maior), e está jogando a resposta em re (resposta). Mas veja que SEMPRE ma vai ser igual a "0"

ma:=0;   // maior inicia-se com 0;

já que em nenhum outro momento esse valor está sendo atualizado, ou seja, todo número que entrar na função maior
function maior(ve,m:integer):integer;
begin
if ve>m then
maior:=ve;
end;

vai retornar ve como sendo o maior!!! (sempre o novo vai ser maior, logo o maior será o último).

Seu código com alguns comentários:

Program Pzim ;
var
v :array[1..10] of integer;
ma,
[COLOR="Red"] (*
me :integer;
//não está sendo usado
*)[/COLOR]
i,
re :integer;

function maior(ve,m:integer):integer;
begin
if ve>m then
maior:=ve;
end;

BEGIN
[COLOR="Red"] (*
ma:=0; // maior inicia-se com 0;
//determine esse valor mais próximo de quando for usado.
*)[/COLOR]
[COLOR="Red"] {*** gerando números aleatórios ***}[/COLOR]
for i:=1 to 10 do
begin
v[i]:=random(10); // alimenta o vetor
writeln(v[i]); // escreve o vetor
end;

[COLOR="Red"] {*** obtendo o maior valor***}[/COLOR]
ma:=0; // maior inicia-se com 0;
[COLOR="Red"] (*
//porque "ma" começa com "0"? (não estou dizendo que está errado)
*)[/COLOR]
for i:=1 to 10 do
begin
re:=maior(v[i],ma); // chama a função
end;

writeln('O maior numero é ',re); // escreve o maior numero

[COLOR="Red"] readln; {dá um pause antes de fechar o programa}[/COLOR]
END.

2)

2- Fazer uma pesquisa sequencial dentro de um vetor de uma dimensão com 10 elementos. Obs: Usar uma função para retornar dizendo se achou ou não.

Do jeito que eu fiz funciona, mas a palavra "Achou" se repete tantas vezes que o numero é encontrado:

Tem duas coisas que você pode fazer.

  1. Usar uma flag¹ para indicar que já foi encontrado
  2. e/ou fazer toda a pesquisa dentro da função, ou seja, passa o vetor e o que você quer encontrar. (se não souber passar um vetor como parâmetro é só perguntar)

1=Entenda flag (bandeira) como sendo uma marcação para indicar algo.

Ex.: a "bandeira branca" indica a "paz", então subentende-se que acabou a guerra. (se bandeira = branca então fim da guerra)

Resumindo:

Em vez de exibir o resultado

  if ve=nu then
writeln('Achou');
end;

use uma variável (servindo como flag) marcando-a como "encontrada".

Ex.:

function Achou(ve,nu:integer):string;
var
flag :boolean;
begin
if ve=nu then
flag:=true; //marca como achado
else
flag:=false; //marca como não achado
Achou:=flag;
end;

Esse código é só para você ter uma ideia. É claro que vai ter que fazer alguns ajustes...

Eu acho que o ideal era pergar o vetor todo, verificar se achou ou não e retornar "true" ou "false" para o programa principal, daí exibiria a resposta correspondente. (true="achou" e false="não achou")

OBS.: Toda FUNCTION tem que retornar algo, no seu caso está retornando o quê?

function Achou(ve,nu:integer):string;
begin
if ve=nu then
writeln('Achou');
end;

Ou você retorna algo ou muda para procedure

procedure Achou(ve,nu:integer);
begin
if ve=nu then
writeln('Achou');
end;

Essa função poderia ficar assim:


begin
if ve=nu then
Achou:='Achou';
end;
function Achou(ve,nu:integer):string;

Não sei se fui muito claro com minhas idéias... qualquer coisa é só postar...

Abraços

Link para o comentário
Compartilhar em outros sites

sobre a questão 2: Eu concertei a função ficando assim:


function Achou(ve,nu:integer):string;
begin
if ve=nu then
achou:='Achou';

Mas o problema é que a palavra "Achou" está está se repetindo tantas vezes que um numero é encontrado. Por exemplo e digito o numero 2, e no vetor tem o numero 2 repetido tres vezes. O resultado fica AchouAchouAchou.

Já na questão 1, mudei, mas continua com o mesmo resultado.


Program Pzim ;
var
v:array[1..10] of integer;
i,ma,re:integer;
function maior(ve,m:integer):integer;
begin
if ve>m then
m:=ve; // o maior passa a ser o valor do vetor, ou seja atualiza.
maior:=m; // retorna o maior

end;
Begin
for i:=1 to 10 do
begin
v[i]:=random(10); // alimenta o vetor
writeln(v[i]); // escreve o vetor
end;
ma:=0; // inicia-se com 0 pois por enquanto ele é o maior valor
for i:=1 to 10 do
begin
re:=maior(v[i],ma); // chama a função


end;


writeln('O maior numero é ',re); // escreve o maior numero









End.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

sobre a questão 2: Eu concertei a função ficando assim:


function Achou(ve,nu:integer):string;
begin
if ve=nu then
achou:='Achou';

Mas o problema é que a palavra "Achou" está está se repetindo tantas vezes que um numero é encontrado. Por exemplo e digito o numero 2, e no vetor tem o numero 2 repetido tres vezes. O resultado fica AchouAchouAchou.

Já na questão 1, mudei, mas continua com o mesmo resultado.


Program Pzim ;
var
v:array[1..10] of integer;
i,ma,re:integer;
function maior(ve,m:integer):integer;
begin
if ve>m then
m:=ve; // o maior passa a ser o valor do vetor, ou seja atualiza.
maior:=m; // retorna o maior

end;
Begin
for i:=1 to 10 do
begin
v[i]:=random(10); // alimenta o vetor
writeln(v[i]); // escreve o vetor
end;
ma:=0; // inicia-se com 0 pois por enquanto ele é o maior valor
for i:=1 to 10 do
begin
re:=maior(v[i],ma); // chama a função


end;


writeln('O maior numero é ',re); // escreve o maior numero









End.

Olá,

1) Observe o codigo antigo (postado por mim) e o seu (postado agora):

VELHO

Program Pzim ;
var
v :array[1..10] of integer;
i,
ma,
re :integer;

function maior(ve,m:integer):integer;
begin
if ve>m then
[COLOR="Red"] m:=ve; // o maior passa a ser o valor do vetor, ou seja atualiza.
maior:=m; // retorna o maior[/COLOR]
end;

BEGIN
for i:=1 to 10 do
begin
v[i]:=random(10); // alimenta o vetor
writeln(v[i]); // escreve o vetor
end;

ma:=0; // inicia-se com 0 pois por enquanto ele é o maior valor
for i:=1 to 10 do
begin
re:=maior(v[i],ma); // chama a função
end;
writeln('O maior numero é ',re); // escreve o maior numero
End.

NOVO

Program Pzim ;
var
v :array[1..10] of integer;
ma,
i,
re :integer;

function maior(ve,m:integer):integer;
begin
[COLOR="Red"] if ve>m then
maior:=ve;[/COLOR]
end;

BEGIN
for i:=1 to 10 do
begin
v[i]:=random(10); // alimenta o vetor
writeln(v[i]); // escreve o vetor
end;

ma:=0; // maior inicia-se com 0;
for i:=1 to 10 do
begin
re:=maior(v[i],ma); // chama a função
end;

writeln('O maior numero é ',re); // escreve o maior numero
readln; {dá um pause antes de fechar o programa}
END.

Você não fez nenhuma mudança... (os trechos em vermelhos dão o mesmo resultado!!!

Releia o meu post anterior e tente fazer as mudanças. (não desista, basta ser mais atencioso)

;)

2) Montei a base, basta implementar a function Achou.

Program Questao2 ;
(* Comentários gerais após o final do código *)

type
t_vet = array[1..10] of integer; {para poder passar o vetor como parâmetro}

function Achou(vet:t_vet; num:integer):string;
[COLOR="Red"] begin
(*

Aqui você coloca o código para fazer a pesquisa no vetor e retornar 'achou' ou
'nao achou'!!!

*)
Achou:='em construcao!';
end;[/COLOR]

[COLOR="Blue"](* 1 *)[/COLOR]
var
vet :t_vet; //vetor com os números
num :integer; //numero a ser pesquisado
resp :string; //resposta do pesquisa
i :byte; //usado no for

BEGIN

{gera 1o numeros aleatórios}
for i:=1 to 10 do
begin
vet[i]:=random(10); // alimenta o vetor
writeln(vet[i]); // escreve os elementos
end;

{ler o número a ser pesquisado}
writeln('DIGITE um numero a ser pesquisado');
readln(num); // ler o numero a ser pesquisado

{faz a pesquisa no vetor}
resp:=achou(vet,num); // chama a função e joga a resposta em resp

write('RESULTADO: ',resp); // escreve a resposta

readln; {dá um pause antes de fechar}
END.

[COLOR="Blue"](* COMENTÁRIO 1 - Sobre a declaração do VAR

Eu, Simon Viegas, recomendo usar as declaraçãos das variáveis globais logo
acima do "BEGIN principal" p evitar que use uma variável global acidentalmente
nos procedimentos.

Eu só recomendo.

Se quiser pode botar em cima!!!
*)[/COLOR]

ATENÇÃO. Veja essas declaração abaixo..

function Achou(vet:t_vet; num:integer):string;

var
vet :t_vet; //vetor com os números
num :integer; //numero a ser pesquisado

Eu coloquei de PROPÓSITO o nome das variáveis da function e das variáveis globais com o mesmo nome para demonstrar que o Pascal aceita. Tenha em mente que elas são diferentes, ou seja, são variáveis independentes (se não fossem daria algo como: "Error: Duplicate identifier").

Assim o vet e num da funçao são variáveis locais (só podem ser vistas nos próprios procedimentos e vet e num do "var" são variáveis globais (que podem ser vistas por todo o programa)!!!. Umas das utilidaddes dos parâmetros nos procedimentos é justamente você receber dados do mundo externos sem se preocupar com os nomes deles, e sim com os tipos.... Qualquer chamada desse procedimento, passando um "t_vet" e um integer vai rodar!!! Ex.:

achou(vet,4);

ou

var
vet2 :t_vet;
.
.
achou(vet2,random(10));

OBS²: O Pascal tem outra peculiaridade. As variáveis globais (assim como qualquer declaração) só são "vistos" a partir do ponto que foi declarado para baixo, assim, como coloquei o var logo acima do begin principal, eles só vão ser enxergados lá. Não não vistas pelos procedimentos.

Para uma boa prática, por favor, mantenha seus códigos identados!!! Você verá como identar ajudar a programar.

Ou prática interessante também é sempre utilizar o "Visualizar Mensagem" antes de enviar.

Abraços

Link para o comentário
Compartilhar em outros sites

Ola Simon, resolvi o problema.

Na 1ª questao eu coloquei um var antes dos parametros(por referencia) e deu certo. O código ficou assim:


Program Pzim ;
var
v:array[1..10]of integer;
i,ma,re:integer;
function maior(VAR ve, m:integer):integer;
begin
if ve>m then // o maior passa a ser o valor do vetor, ou seja atualiza.
m:=ve;
maior:=m; // retorna o maior
end;
Begin

for i:=1 to 10 do
begin
v[i]:=random(10); // alimenta o vetor
writeln(v[i]);
// chama a função // escreve o vetor
end;
ma:=0; // inicia-se com 0 pois por enquanto ele é o maior valor
for i:=1 to 10 do
begin
re:=maior(v[i],ma); // chama a função

end;


writeln('O maior numero é ',re); // escreve o maior numero









End.

Na quetao 2, eu implementei o código na funcion. A palavra "Achou não repetiu mais. Ficou assim:


Program Questao2 ;
type
v=array[1..10] of integer;
var
vet:v;
i,n:integer;
r:string;
function Achou(ve:v; nu:integer):string;
var
l:integer;
begin
for l:=1 to 10 do
if (ve[l]=nu) then
achou:='Achou';

end;
Begin
writeln('dIGITE um numero a ser pesquisado');
read(n);
for i:=1 to 10 do
begin
vet[i]:=random(10);
writeln(vet[i]);
end;

r:=achou(vet,n);


write(r);

End.

Obrigado pelas dicas Simon, desculpe por demorar a responder.

abraço...

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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