Ir ao conteúdo
  • Cadastre-se

Pascal/Delphi Entender funções de variáveis em um programa


Posts recomendados

Bom dia!

Esse é meu primeiro post aqui, por que tentei de todas as maneiras entender como um programa foi pensando e não consegui. Então pensei em vir até aqui para tirar essa dúvida de uma vez por todas.

Vou mostrar pra vocês o algoritmo do programa que eu tenho que fazer, ele feito na estrutura de repetição PARA e na REPEAT

Minhas dúvidas são: Nesse programa, qual é a função da variável '' j '' e da variável '' fat '' ? Achei que '' fat '' era fatorial, mas logo depois tem um programa que não pede nada de fatorial e ela é utilizada de novo.

E eu não entendi como o programa foi feito com REPEAT , por alguns motivos:

A váriavel  '' j '' e '' fat '' , novamente. 

e por que há a repetição do termo REPEAT e UNTIL, seria como um begin e end?

 

Muito obrigado, rapaziada ! 

 

Programa na Estrutura PARA (Pascal) :

PROGRAM EX2;
USES CRT;
VAR n, i, j: INTEGER;
    e, fat: real;
BEGIN
CLRSCR;
WRITELN('Digite o valor de N');
READLN(n);
e := 1;
FOR i := 1 TO n DO
	BEGIN
	fat := 1;
	FOR j := 1 TO i DO
	    BEGIN
	    fat := fat * j;
	    END;
	e := e + 1/fat;
	END;
WRITELN('Valor de E = ',e:5:2);
READLN;
END.

 

Programa na Estrutura REPITA:

PROGRAM EX2;
USES CRT;
VAR n, i, j: INTEGER;
    e, fat:REAL;
BEGIN
CLRSCR;
WRITELN('Digite o valor de N');
READLN(n);
e := 1;
i := 1;
REPEAT
  j := 1;
  fat := 1;
  REPEAT
    fat := fat * j;
    j := j + 1;
  UNTIL j > i;
  i := i + 1;
  e := e + 1/fat;
UNTIL i > n;
WRITELN('Valor de E = ',e:5:2);
READLN;
END.

 

 

 

 

 

Algoritmo duvida.jpeg

EX2_PARA.jpeg

EX2_REPITA.jpeg

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

  • Membro VIP

@Gabriel de A.Campos, seja bem vindo ao Fórum do Clube do Hardware.

 

Sobre:

16 horas atrás, Gabriel de A.Campos disse:

Minhas dúvidas são: Nesse programa, qual é a função da variável '' j '' e da variável '' fat '' ?

 

O j foi utilizado pura e simplesmente porque o i já está sendo utilizado no mesmo contexto. Uma mesma variável não pode ter 2 valores ao mesmo tempo. Só isso. Se utilizasse i no segundo for, iria "bagunçar" o controle do primeiro for.

 

Poderia ser qualquer nomenclatura. Usar i, j, k etc seria apenas uma "padrão". Um "costume da comunidade"...

 

Veja a fórmula:

image.png

 

Segue em texto:

E = 1 + 1/1!  + 1/2! + 1/3! + ... + 1/N!

 

Para um valor N inteiro e positivo, teríamos N+1 termos na soma. Exemplo: se N = 5, teríamos 6 termos... Daí, para CADA* UM desses termos, teríamos que calcular um fatorial. Logo, temos um laço de repetição ("cálculo de fatorial") dentro de outro laço de repetição ("cada um dos termos da soma").

 

Vou tentar explicar pelo próprio código:
 

{$CODEPAGE UTF8} //uma forma de tentar conseguir imprimir palavras acentuadas
program EX2;
uses
  CRT;
var
  n, i, j: integer;
  e, fat: real;

begin
ClrScr;
writeln('Digite o valor de N');
readln(n);
e := 1; //"e" inicializa com o primeiro termo da soma (obs.: que seria 1/0!)

//CÁLCULO DA SOMA
for i := 1 to n do //para cada um dos próximos termos (do segundo termo em diante)
  begin
  //Cálcula o fatorial do termos atual
  //
  //
  fat := 1; //primeiro termo da fatorial
  for j := 1 to i do //para cada um dos termos da fatorial (j vai de 1 até i)
    begin
    fat := fat * j; //resultado atual * o próximo termo
    end;
  //
  //
  //
  e := e + 1/fat; //calcula o valor do próximo termo (1/fat), e já soma ao "e"
  end;
writeln('Valor de E = ', e:1:10); //no final "e" será igual a soma final
readln;
end.

 

Adendo: esses comentários no código não seriam necessários. O código está relativamente objetivo.

 

 

Sobre:

17 horas atrás, Gabriel de A.Campos disse:

Achei que '' fat '' era fatorial, mas logo depois tem um programa que não pede nada de fatorial e ela é utilizada de novo.

 

Que programa? O outro programa está relacionado a o quê? Como sabe que não pede "nada de fatorial"?

 

Então, seria necessário entender para qual problema o código se refere... seria um questão de entender o contexto... Mas pelo conteúdo do código, fica implícito que o segundo código é "exatamente" igual ao primeiro, apenas trocou o uso de "for" por "repeat", ou seja: uma "forma diferente" (recursos) de resolver o mesmo problema.

 

Perceba tudo que se faz com um faço de repetição, dá para fazer com um outro... apenas um fica mais "fácil" ou "prático" que com o outro... nesse caso, com o for pareceu melhor... mas meio que tanto faz.

 

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

Cara, primeiramente eu queria agradecer, você me ajudou muito, tirou praticamente todas minhas dúvidas. Mas agoras surgiram novas, que não consegui entender muito bem ainda:

22 horas atrás, Simon Viegas disse:

for j := 1 to i do //para cada um dos termos da fatorial (j vai de 1 até i)

Por que aqui eu não posso colocar o '' j '' indo até '' n '' ?  seria por que o '' n '' já está sendo usado anteriormente?

 

Agora, na estrutura REPITA

Em 07/10/2020 às 19:29, Gabriel de A.Campos disse:

REPEAT
  j := 1;
  fat := 1;
  REPEAT
    fat := fat * j;
    j := j + 1;
  UNTIL j > i;

Esse '' UNTIL j > i '' logo na primeira vez ira dar um valor verdadeiro ( 2 > 1) , já que o '' i '' foi declarado = 1 anteriormente, isso é feito para que ele não se repita novamente e acabe ocasionando em um resultado incorreto, não é? 

 

 

Agora, na estrutura toda: 

Em 07/10/2020 às 19:29, Gabriel de A.Campos disse:

REPEAT
  j := 1;
  fat := 1;
  REPEAT fat := fat * j;
    j := j + 1;
  UNTIL j > i;
  i := i + 1;
  e := e + 1/fat;
UNTIL i > n;

 

Por exemplo, quando a estrutura terminar a primeira repetição irá dar '' UNTIL 2 > 5'' , e com isso irá ser feito novamente.

Nessa segunda vez o laço não voltaria até a parte: 

Em 07/10/2020 às 19:29, Gabriel de A.Campos disse:

j := 1;
fat := 1;

E com isso redefinindo os valores dessas variáveis? 

Coloquei ''  j:=1 e fat:= 1'' fora do laço e o resultado continuou correto, porém quando eu coloco 1 dentro do laço e outro fora, o resultado fica incorreto. Gostaria também de saber o por que disso.

Muito obrigado, e desculpa por tantas perguntas. Estou tendo dificuldado sobre Estrutura de repetição, e como estou estudando sozinho, não tem outra maneira de eu tirar minha dúvidas.

 

OBS: Sobre o outro programa, usa fatorial sim, eu falei besteira

 

Obrigado

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

1#

Sobre:

15 horas atrás, Gabriel de A.Campos disse:
21 horas atrás, Simon Viegas disse:

for j := 1 to i do //para cada um dos termos da fatorial (j vai de 1 até i)

data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

Por que aqui eu não posso colocar o '' j '' indo até '' n '' ?  seria por que o '' n '' já está sendo usado anteriormente?

Não, não vai até n porque não é para calcular o fatorial de n, mas sim de i.

 

Vide:

20 horas atrás, Simon Viegas disse:

  fat := 1;
  for j := 1 to i do
    begin
    fat := fat * j;
    end;

 

Esse trecho está "calculando o fatorial do número atual", lembra?

  • Como se calcula o fatorial de um número X? Seria multiplicar os números inteiros do 1 até o X. Ex.: X=5, seria 1*2*3*4*5 = 120;
  • Qual é o número atual lá no contexto do algoritmo (código)? Seria o i, logo, quer se calcular o fatorial de i, que seria de 1 até o i;

Para cada inteiro entre 1 e N (que seria o inteiro informado pelo usuário), será calculado o seu fatorial. Esse "cada inteiro" estará em i.

 

 

 

2#

Sobre:

15 horas atrás, Gabriel de A.Campos disse:

Agora, na estrutura REPITA

Em 07/10/2020 às 19:29, Gabriel de A.Campos disse:

REPEAT

j := 1;

fat := 1;

REPEAT

fat := fat * j;

j := j + 1;

UNTIL j > i;

Esse '' UNTIL j > i '' logo na primeira vez ira dar um valor verdadeiro ( 2 > 1) , já que o '' i '' foi declarado = 1 anteriormente, isso é feito para que ele não se repita novamente e acabe ocasionando em um resultado incorreto, não é? 

 

Não, a estrutura repeat foi implementa pura e simplesmente para ter o "mesmo" comportamento da estrutura que tinha antes com um for. Esta verificação (j>i) seria apenas para parar de repetir na hora que tem que parar de repetir. Se i vale 1, vai repetir até que o j não seja maior que 1, ou seja: vai fazer 1 vez. Quando i valer 2, vai repetir 2 vezes. Com i valendo 3, vai repetir 3 vezes. Apenas entender que "os algoritmos são iguais", só mudou de um laço com for, para um laço com repeat.

 

Veja: tudo que se faz usando ou for, ou repeat, ou while, pode ser substituído por um outro, ou seja: o código estava com for, daí "quiseram" fazer o "mesmo algoritmo" substituindo por repeat. Foi necessário efetuar os ajustes necessários de acordo com esta estrutura nova.

 

 

 

3#

Sobre:

15 horas atrás, Gabriel de A.Campos disse:

Por exemplo, quando a estrutura terminar a primeira repetição irá dar '' UNTIL 2 > 5'' , e com isso irá ser feito novamente.

Nessa segunda vez o laço não voltaria até a parte: 

Em 07/10/2020 às 19:29, Gabriel de A.Campos disse:

j := 1;

fat := 1;

E com isso redefinindo os valores dessas variáveis? 

 

Isso. Vai redefinir... 

 

REPEAT
  j := 1;
  fat := 1;
  REPEAT fat := fat * j;
    j := j + 1;
  UNTIL j > i;
  i := i + 1;
  e := e + 1/fat;
UNTIL i > n;

 

O que esse repeat mais externo faz? Ele está "percorrendo cada um dos inteiros contidos entre 1 a N". Exatamente a mesma coisa que estaria sendo feito com o for.

 

Esse j faz parte da estrutura do repeat mais interno (que faria parte do for mais inteiro no outro), onde j deve ir 1 até i (que já foi explicado no 1#).

 

 

 

4#

16 horas atrás, Gabriel de A.Campos disse:

Coloquei ''  j:=1 e fat:= 1'' fora do laço e o resultado continuou correto, porém quando eu coloco 1 dentro do laço e outro fora, o resultado fica incorreto. Gostaria também de saber o por que disso.

Aí só você demonstrando qual alteração fez e também dando evidência que realmente funcionou.

 

 

 

5#

Sobre:

16 horas atrás, Gabriel de A.Campos disse:

Muito obrigado, e desculpa por tantas perguntas. Estou tendo dificuldado sobre Estrutura de repetição, e como estou estudando sozinho, não tem outra maneira de eu tirar minha dúvidas.

Ué? O fórum serve para isso...  Seria como pedir desculpa por ortopedista porque estaria com a perna quebrada :D.

 

 

 

6#

16 horas atrás, Gabriel de A.Campos disse:

OBS: Sobre o outro programa, usa fatorial sim, eu falei besteira

 

Só um adendo: então, não seria só uma questão de usar ou não fatorial. Vai além disso: seria simplesmente o "mesmo algoritmo"! Entende?

 

Uma coisa que eu sempre tento levantar aqui no fórum, é que devemos nos preocupar sempre* em ANTES em entender o problema/contexto das coisas... é comum tentarmos partir para uma solução, mas muitas vezes pulando a parte de ver o que é para ser solucionado. (Depois de entendido isso parece até óbvio né?, mas é mais comum no dia-a-dia do que parece. Apenas não se percebem... Tento sempre que possível levantar esse tema.)  

 

Por exemplo:

 

21 horas atrás, Simon Viegas disse:

Que programa? O outro programa está relacionado a o quê? Como sabe que não pede "nada de fatorial"?

 

Foram perguntas retóricas... já estava meio que implícito, após analisar, que são 2 código para resolver o mesmo exercício... veja mais uma evidência:

 

image.png

e

image.png

 

 

Ou seja: "versão A" e "versão B" do mesmo exercício... logo, se o "EX2" é com fatorial, seria necessariamente pressuposto que ambos deveriam ter fatorial lá no meio. Antes mesmo de tentar entender o código, entender que eles fazem parte de um mesmo contexto já resolveria praticamente essa questão... saca?

 

Daí, verificar se o segundo código está realmente seguindo o que está no primeiro, seria ouuuuutra questão... Seria algo como "Ah! o código com for funciona, mas com repeat não deu certo". Percebe a diferença?

 

No aguardo.

 

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

Cara, você tirou simplesmente TODAS as minhas dúvidas, consegui entender a estrutura e o código totalmente. MUITO obrigado mesmo!

1 hora atrás, Simon Viegas disse:

Percebe a diferença?

Sim, entendi perfeitamente.

 

É muito bom saber que tem um lugar no qual eu possa realmente tirar minhas dúvidas sobre esse assunto.

Novamente, obrigado!

  • Curtir 2
  • Obrigado 1
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...