Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
É o seguinte, eu fiz um algoritmo bem básico só para testar esses tipos de passagens, eu sei o básico sobre cada uma. Foi feito pelo VisualG
var
C, N1, PAR, IMPAR : inteiro
procedimento parouimpar(X, Y, Z : inteiro)
var
inicio
se (X%2 = 0 ) entao
Y <- Y + 1
senao
Z <- Z + 1
FimSe
Limpatela
Escreval (" Foram totalizados ", Y , " numeros pares ")
Escreval (" Foram totalizados ", Z , " numeros impares ")
fimprocedimento
inicio
PAR <- 0
IMPAR <- 0
Para C <- 1 ate 10 faca
Escreva (" Digite um numero : ")
Leia (N1)
parouimpar (N1,PAR,IMPAR)
Fimpara
fimalgoritmo
Eu sei que quando coloca-se o " var " na frente do procedimento significa que a passagem vai ser por referencia, assim, os valores vão ser jogados nas váriaveis do programa principal. A minha duvida é : Porque quando eu removo o " var " e deixando as passagens apenas por valores o algoritmo não funciona direito, ou seja, ele não acumula os valores pares e impares nos parametros Y e Z? Quando eu coloco por referencia funciona tudo certinho, acumula os valores e joga tudo nas variaveis " PAR " e " IMPAR ", mas quando eu coloco coloco as passagens por valores não funciona, é como se os parametros " Y " e " Z " recebessem sempre o valor 0 quando o procedimento e rodado dentro do contador. Não sei se expliquei bem, agradeceria muito se alguem me ajudasse. E uma duvida simples, porem, eu gosto de saber perfeitamente o porque das coisas.
Passagem de parâmetro por valor ou referência funciona da seguinte maneira:
Por valor:
Quando você passa um parâmetro por valor, significa que apenas o valor dele vai ser passado para o método, ou seja, se você possui uma variável chamada "foo" e ela tem valor 4, quando você passar para um método, digamos, bar(var param) isso significa que você estará criando uma outra variável chamada "param" que terá o mesmo valor de foo. Em essência é dizer isso:
foo <- 4
param <- foo
Por referência:
No mesmo exemplo de antes, se você passar por referência, isso significa que você estará passando a própria instancia da variável para o método bar(var param), ou seja, você vai estar passando a referência que a variável foo tem na memória para a variável param, então qualquer alteração em "param" vai refletir inteiramente em "foo", desta forma o valor da variável "foo" vai ser alterado no final da execução do método.
foo <- 4
procedimento bar(param : real) var
inicio
param <- param + 1
fimprocedimento
bar(foo)
Resultará em foo = 5.
No seu algoritmo, você está usando um acumulador, ou seja, você precisa somar valores dentro destas variáveis a fim de completar a execução, quando você faz isso por referência, a própria variável se altera, mas quando você passa apenas o valor, ele sempre vai ser enviado como parâmetro igual, em outras palavras, você vai sempre mandar o mesmo valor para o método.