Ir ao conteúdo

Duvida em Pascal


victorangra

Posts recomendados

Postado

Estou estudando para a minha prova de programação e me deparei com essa questão de uma prova antiga:

4a Questão: Considere as declarações a seguir e implemente os subprogramas.


Const
Max = 10;
Type
T_Dominio = 1..Max;
T_Vetor = array[T_Dominio] of real;
... {subprogramas}
Var
V: T_Vetor;
M: real;
Begin
ler_vetor(V);
escrever_vetor(V);
M:= media(V);
digitaliza(V, M);
escrever_vetor(V);
End.
Program Digitalizador(Input{teclado}, Output {Vídeo});

Onde os subprogramas:

ler_vetor: faz a leitura do teclado de todos os números do vetor recebido como parâmetro;

escrever_vetor: escreve todos os números do vetor, recebido como parâmetro, no vídeo.

media: calcula a média dos números contidos dentro do vetor recebido como parâmetro; e

digitaliza: modifica o conteúdo de cada uma das células do vetor recebido como

parâmetro. O novo conteúdo de cada célula será 0 (zero) se for menor que a

média (recebida como parâmetro) e 1 (um), caso contrário.

Eu fiz assim:


const
max=10;
type
t_dominio= 1..max;
t_vetor= array[t_dominio] of real;
procedure ler_vetor(var v: t_vetor);
var
i: integer;
begin
for i:= 1 to max do
begin
writeln(output, 'Digite o valor de v');
readln(input, v[i]);
end;
end;
procedure escrever_vetor (v: t_vetor);
var
i: integer;
begin
for i:= 1 to max do
write(output, v[i]:2:2, ' ')
end;
function media(v:t_vetor):real;
var
i: integer;
d: real;
begin
writeln('d e ', d); {nesse ponto que deu um erro que eu não consigo entender, d está valendo 8}
for i:= 1 to max do
d:= d+v[i];
media:= d/max;
end;
procedure digitaliza (var v: t_vetor; m: real);
var
i: integer;
begin
for i:= 1 to max do
if v[i]<m then
v[i]:= 0
else
v[i]:= 1
end;
var
v: t_vetor;
m: real;
begin
ler_vetor(v);
escrever_vetor(v);
m:=media(v);
writeln(output, 'A media é ', m);
digitaliza(v,m);
escrever_vetor(v);
readln()
end.
program Digitalizador(input{teclado}, output {video});

Não entendi o que está havendo de errado, eu poderia simplesmente fazer d valer 0 para o programa ficar correto, mas eu queria saber o motivo dele estar valendo 8 (para testar o programa eu usei a sequencia de números: 10, 5, 6, 9, 3, 2, 7, 8, 8, 9)

  • Membro VIP
Postado
Eu fiz assim:


const
max=10;
type
t_dominio= 1..max;
t_vetor= array[t_dominio] of real;
procedure ler_vetor(var v: t_vetor);
var
i: integer;
begin
for i:= 1 to max do
begin
writeln(output, 'Digite o valor de v');
readln(input, v[i]);
end;
end;
procedure escrever_vetor (v: t_vetor);
var
i: integer;
begin
for i:= 1 to max do
write(output, v[i]:2:2, ' ')
end;
function media(v:t_vetor):real;
var
i: integer;
d: real;
begin
writeln('d e ', d); {nesse ponto que deu um erro que eu não consigo entender, d está valendo 8}
for i:= 1 to max do
d:= d+v[i];
media:= d/max;
end;
procedure digitaliza (var v: t_vetor; m: real);
var
i: integer;
begin
for i:= 1 to max do
if v[i]<m then
v[i]:= 0
else
v[i]:= 1
end;
var
v: t_vetor;
m: real;
begin
ler_vetor(v);
escrever_vetor(v);
m:=media(v);
writeln(output, 'A media é ', m);
digitaliza(v,m);
escrever_vetor(v);
readln()
end.
program Digitalizador(input{teclado}, output {video});

Não entendi o que está havendo de errado, eu poderia simplesmente fazer d valer 0 para o programa ficar correto, mas eu queria saber o motivo dele estar valendo 8 (para testar o programa eu usei a sequencia de números: 10, 5, 6, 9, 3, 2, 7, 8, 8, 9)

Olá victorangra...

Por algum motivo (que desconheço) a variável local d está inicializando com o mesmo valor da variável local v na posição 8 (v[8]). (a variável v local aponta para variável v global). Fiz um teste:

function media(v:t_vetor):real;
var
i: integer;
d,a,b : real; //adicionei a e b
begin
writeln('d e ', d,' ',a,' ',b ); {nesse ponto que deu um erro que eu não consigo entender, d está valendo 8}
for i:= 1 to max do
d:=d+v[i];
media:=d/max;
end;

Resultado: d=v[8], a=v[7] e b=v[6].

Como disse anteriormente, não sei por que está pegando esses respectivos valores (relacionados ao array global v*), mas posso te adianto que tem algo relacionado a "não inicialização das variáveis". Simplesmente inicialize a variável com um valor antes de usá-la. Ex.:

d:=0;

Vou tentar explicar da forma que eu entendo... Então, ao declarar uma variável, o programa "simplesmente" reserva um espaço na memória ram e estrutura essas posições de memória para poder receber os dados de acordo com o tipo que foi definido na declaração do algoritmo. O que acontece é que a memória já possui um valor qualquer naquelas posições (lixo de outra execução). Se algo não mudar esse valor, então vai ficar ela mesmo. :D. Agora, entender porque está se inicializando (tendo um valor inicial) equivalente a sequência da variável v eu não faço a menor ideia.

* = A variável "v" global (que está perto do begin principal) NÃO É a mesma variável local "v" que está em cada uma dos procedimentos. Essas últimas são locais e independentes das outras, por exemplo, cada uma dessas variáveis poderiam ter nomes diferentes... Veja, que se fossem a mesma variável, não era necessário declarar novamente e também se as variáveis, dos procedimentos, não fossem locais, daria "erro de duplicidade de nomes".

Obs.: Ao usar uma variável global, como "m" e "v", o BEGIN principal automaticamente inicializa as variáveis com o valor "0". Já as variáveis locais, isso não acontece (não sei porque), e fica com o valor que tiver na memória. (nesse contexto, esta ficando com o mesmo valor que está em "v" - vá entender?). É por essas e outras que alguns professores sempre incentivam/sugerem/recomendam que mesmo com as variáveis globais, se inicializem as variáveis.

Obs 2: Em algumas linguagens, como Java, a depender do contexto, o programador é obrigado a inicializar as variáveis, pois os compiladores exigem.

No aguardo.

Abraços.

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

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!