Ir ao conteúdo
  • Cadastre-se

Pascal Fatorial


Posts recomendados

Olá pessoal, preciso de ajuda com esse código pois estou com dificuldades...

Escreva um programa que lê um valor N inteiro e positivo e que calcula e escreve o valor de E.

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


program listaB1Q2;
uses crt;
var
e,n:real;
begin
writeln('Digite um valor positivo');
readln(N);
while N < 0 do
begin
writeln('Digite um valor positivo');
readln(N);
end;
readkey;
end.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
Olá pessoal, preciso de ajuda com esse código pois estou com dificuldades...

Escreva um programa que lê um valor N inteiro e positivo e que calcula e escreve o valor de E.

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

Código:


program listaB1Q2;
uses crt;
var
e,n:real;
begin
writeln('Digite um valor positivo');
readln(N);
while N < 0 do
begin
writeln('Digite um valor positivo');
readln(N);
end;
readkey;
end.

Está com dificuldades em que?

Mas vamos lá, o que você precisa fazer é achar uma forma de calcular esse 1!, 2!, 3! etc.

Primeiramente o mais óbvio: o que é essa "!"?

Descobrindo isso, basta criar um algoritmo que calcule os valores para cada caso (de 1! a N!), ao final de cada cálculo, divida 1 por esse valor e some ao total em "E".

PS: "N" é um valor inteiro, logo pode usar integer em vez de real.

No aguardo.

Abraços

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

A minha duvida era como eu iria calcular o valor de E.

Eu consegui desenvolver o código...ele esta certo ou errado?


program listaB1Q2;
uses crt;
var
e,fat1,fat2,fat3:real;
N,v1,v2,v3:integer;
begin
writeln('Digite um valor positivo');
readln(N);
while N < 0 do
begin
writeln('Digite um valor positivo');
readln(N);
end;
for v1:= 1 downto 1 do
fat1:= 1+1 div v1;

for v2:= 2 downto 1 do
fat2:= fat1 + 1 div v2;

for v3:= 3 downto 1 do
fat3:=fat1+fat2+1 div 3;

e:=fat1+fat2+fat3+1;
writeln('O valor de E = ',e/N:2:2);

readkey;
end.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
A minha duvida era como eu iria calcular o valor de E.

Eu consegui desenvolver o código...ele esta certo ou errado?


uses crt;
var
e,fat1,fat2,fat3:real;
N,v1,v2,v3:integer;
begin
writeln('Digite um valor positivo');
readln(N);
while N < 0 do
begin
writeln('Digite um valor positivo');
readln(N);
end;
for v1:= 1 downto 1 do
fat1:= 1+1 div v1;

for v2:= 2 downto 1 do
fat2:= fat1 + 1 div v2;

for v3:= 3 downto 1 do
fat3:=fat1+fat2+1 div 3;

e:=fat1+fat2+fat3+1;
writeln('O valor de E = ',e/N:2:2);

readkey;
end.
program listaB1Q2;

Olá Rosberguedes

Antes de somar, você precisa saber calcular os "X!"... Ja sabe o que é esse "!" significa?? Somar é uma etapa posterior.

São duas etapas distintas:

1) Calcular os resultados de 1! a N!;

2) Somar o inverso (1/X) de cada um desses resultados para achar o valor de E (seguindo a fórmula).

O que ocorre é que no programa você pode fazer a soma a medida que vai achando uma resposta. (Não precisa calcular tudo de uma vez e depois dividir 1 por cada resultado e ir somando)

Então, primeiramente você precisa saber calcular esses 1! a N!.

Tente fazer da seguinte forma:

1) Faça um programa que leia um valor "N" e calcule o N! e exiba o resultado na tela;

2) Faça um programa que leia um valor "N" e calcule os valores de 1!,2!,3!.. a N! e exiba o resultado de cada conta na tela.

3) Faça um programa que leia um valor "N" e calcule os valores de 1!,2!,3!.. a N!, some os resultado e exiba o resultado da soma.

Poste aqui casa um dos programas.

...

O seu programa será simplesmente o 3) com a diferença que em vez de somar os resultados diretamente, você deverá somar 1/(resultado).

No aguardo

Abraços

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

EU CONSEGUIR RESOLVER A QUESTÃO COM AJUDA DE UM AMIGO !VALEU PELA AJUDA!


program Q2L1;
uses crt;
var
e:real;
n,fat,i,x:integer;
begin
e:=1;n:=1;
writeln('Informe o denominador');
readln(x);
if(x>0) then
while (n<=x) do
begin
fat:=1;
for i:= n downto 1 do
fat := fat*n;
e:=e+(1 div fat);
N := N + 1;
end
else
writeln('Valor nao permitido');
writeln('O Valor gerado pela expressao é ',e:2:2);
readln;
end.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
Rosberguedes disse:

EU CONSEGUIR RESOLVER A QUESTÃO COM AJUDA DE UM AMIGO !VALEU PELA AJUDA!


program Q2L1;
uses crt;
var
e:real;
n,fat,i,x:integer;
begin
e:=1;n:=1;
writeln('Informe o denominador');
readln(x);
if(x>0) then
while (n<=x) do
begin
fat:=1;
for i:= n downto 1 do
fat := fat*n;
e:=e+(1 div fat);
N := N + 1;
end
else
writeln('Valor nao permitido');
writeln('O Valor gerado pela expressao é ',e:2:2);
readln;
end.


 

Olá Rosberguedes

1) Identação

Antes, corrigindo a identação (pequeno errinho):

Obs.: Não muda a "sintaxe" nem a "lógica", é uma questão visual.

Obs2.: De certo modo, a identação faz parte do critério de correção.

 
program Q2L1;
uses crt;
var
  e:real;
  n,fat,i,x:integer;
BEGIN
e:=1;n:=1;
writeln('Informe o denominador');
readln(x);
if(x>0) then
  while (n<=x) do
    begin
    fat:=1;
    for i:= n downto 1 do
      fat:=fat*n;
    e:=e+(1 div fat);
    N:=N + 1;
    end
else
  writeln('Valor nao permitido');
writeln('O Valor gerado pela expressao é ',e:2:2);
readln;
END.

Vejam que o e:=e+(1 div fat); e N := N + 1; estavam fora do lugar, dando a impressão que estão dentro do for, mas eles não estão!!! Tem também o else, mas ai dependo do padrão. No meu, ele fica na mesma lida do if...

2) Algoritmo

A resposta aqui não está batendo...

Sugestão:

Faça um teste de mesa... Faça alguns cálculos na calculadora e outros pelo programa. As respostas tem que dar sempre igual respectivamente.

Ex. te tabela:

tabelaso.jpg

***

A minha sugestão da postagem anterior está de pé ainda!

No aguardo

Abraços

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

  • 3 anos depois...

Boa noite, o meu ficou diferente, pois pelo do Rosberguedes não estava funcionando. Portanto, ficou assim:

 

Program Fatorial;
var
E,soma:real;
n,fat,i,x:integer;
opcao:char;
begin
while (opcao <> 'n') do      
 begin
  clrscr;
  E:=0;
  x:=1;
  write('  Digite um número inteiro e positivo: ');readln(n);
  while (n<0) do
    begin
       writeln;
       writeln(n,' não é positivo!');
       writeln;
       write('    Digite um número inteiro e positivo: ');readln(n);
       clrscr;
    end; 
  if(n>0) then
      while (x<=n) do
         begin
            fat:=1;
            soma:=0;
            for i:=1 to n do
                begin
                  fat := fat*i;  //1*1, 1*2, 2*3, 6*4, 24*5...
                  E:=1/(fat);    //     o 6 é 1*2*3 e 24 é 1*2*3*4...
                  soma:=E+soma;
                end;
            x := x + 1;
         end;
  E:=1+soma;    
  writeln;
  writeln('    O valor gerado pela expressao é ',E:0:4);
  writeln;
  writeln('    Deseja digitar outro número para N! no denominador? sim <s> e não <n> ');
  write('    Resposta: ');readln(opcao);
  writeln;
  writeln('  digite qualquer tecla para continuar...');
  readkey;
 end;
readkey;
end.

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @eiji7,

 

Alguns ponto que acho que precisam ser verificados:

 

1) Você não deve usar o E para auxiliar no cálculo da divisão. O E serve para a resposta final e pronto!. Use outra variável! Mesmo sendo do mesmo tipo, e teoricamente não impactando no resultado, é bom não misturar as coisas... poderia ser result, calc etc...

 

2) Primeiro você tem que calcular o fatorial de N, e aí só depois obter o resultado da divisão de 1/N! e ir somando...você misturou uma coisa com outra e acho que o resultado não está dando correto!!!

obs.: por sinal, você pode dividir direto na soma... algo como:  soma:=soma+1/fat; (ou se  quiser separado, lembrar do que foi dito acima e não usar o E)

 

3) No final de programa tem readkey de mais... basta um.

 

4) A variável soma não foi inicializada. Se N for igual a 0, qual o valor de soma em E:=1+soma; ?
obs.: teoricamente o Pascal zera as variáveis, mas conceitualmente a variável deveria ser inicializada manualmente.

 

5) No programa você diz "Digite um número inteiro e positivo:", mas está aceitando o 0! Entretanto o 0 não é positivo!!! Precisa corrigir o texto!

 

No aguardo.

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

@Simon Viegas , sim, agora eu vi, pois quando eu jogo o valor 30 tá dando erro falando que tem divisão por zero, quando que deveria ser 2,7182. Mudei, e agora só está dando E = 2, estou vendo o porque agora...

 

Program fatorial_no_denomidador;
var
E,soma:real;
n,fat,i,x:integer;
opcao:char;
begin
while (opcao <> 'n') do      
 begin
  clrscr;
  E:=1;
  x:=1;
  write('  Digite um número inteiro e positivo (>0): ');readln(n);
  while (n<=0) do
    begin
      writeln;
      writeln(' ',n,' não é positivo!');
      writeln;
      write('    Digite um número inteiro e positivo: ');readln(n);
      clrscr;
    end; 
  if(n>0) 
      then
        begin
           soma:=0;
         while (x<=n) do
            begin
               fat:=1;
               for i:=1 to x do
                  begin
                    fat := fat*i;  //1*1, 1*2, 2*3, 6*4, 24*5... 
                  end;
               soma:= soma + (1 div fat);                    
               x := x + 1;
            end;
         E:= E + soma;
      end;      
  writeln;
  writeln('    O valor gerado pela expressao é ',E:0:4);
  writeln;
  writeln('    Deseja digitar outro número para N! no denominador? sim <s> e não <n> ');
  write('    Resposta: ');readln(opcao);
  writeln;
  writeln('  digite qualquer tecla para continuar...');
  readkey;
 end;
readkey;
end.

 

 

@Simon Viegas , eu coloquei uma condição (se fat<>0), pois quando n era maior que 30 tava dando erro falando ser 'divisão por zero' e agora deu certo. Só não sei o porque tava dando erro, sendo que 30! é diferente de zero, ou seja, 1//30! o resultado é aproximadamente igual a 0, mas não é divisão por zero...e se puder explicar, agradeço

O do porque só aparecia o número 2 já entendi, pois div é divisão inteira e / (barra) é divisão real...

 

Program fatorial_E;
var
E,soma:real;
n,fat,i,x:integer;
opcao:char;
begin
while (opcao <> 'n') do      
 begin
  clrscr;
  E:=1;
  x:=1;
  write('  Digite um número inteiro e positivo: ');readln(n);
  while (n<=0) do
    begin
      writeln;
      writeln('n,' não é positivo!');
      writeln;
      write('    Digite um número inteiro e positivo: ');readln(n);
      clrscr;
    end; 
  if(n>0) 
      then
       begin
            soma:=0;
            while (x<=n) do
                  begin
                       fat:=1;
                       for i:=1 to x do
                                begin
                                    fat := fat*i;  //1*1, 1*2, 2*3, 6*4, 24*5...
                                end;
                       if (fat<>0)
                          then
                              begin     
                                    soma:=soma+(1/fat);
                               end
                          else break;
                       x := x + 1;
                  end;
       end;              
  E:=E+soma;    
  writeln;
  writeln('    O valor gerado pela expressao é ',E:0:6);
  writeln;
  writeln('    Deseja digitar outro número para N! no denominador? sim <s> e não <n> ');
  write('    Resposta: ');readln(opcao);
  writeln;
  writeln('  digite qualquer tecla para continuar...');
  readkey;
 end;
readkey;
end.

 

 

Creio que já entendi o porque a variavel fat estava dando 0, pois a variavel fat estava declarada como integer, quando passei a fat para o real (fat:real;) não precisou mais da condição. Uma vez que 30! é um valor muito grande acaba ultrapassando a faixa dos limites do tipo integer e retornando um zero, porém ao declarar como tipo real (até o 100! deu certo) a faixa dos limites é maior que a do integer, logo não precisando da condição...

 

Program fatorial_E;
var
E,soma,fat:real; 
n,i,x:integer;
opcao:char;
begin
while (opcao <> 'n') do      
 begin
  clrscr;
  E:=1;
  x:=1;
  write('  Digite um número inteiro e positivo(>0): ');readln(n);
  while (n<=0) do
    begin
      writeln;
      writeln('          ',n,' não é positivo!');
      writeln;
      write('    Digite um número inteiro e positivo: ');readln(n);
      clrscr;
    end; 
  if(n>0) 
      then
       begin
           soma:=0;
           while (x<=n) do
                 begin
                       fat:=1;
                       for i:=1 to x do
                             begin
                                 fat := fat*i;  //1*1, 1*2, 2*3, 6*4, 24*5...
                             end;    
                       soma:=(1/(fat))+soma;
                       x := x + 1;
                 end;
       end;              
  E:=E+soma;    
  writeln;
  writeln('    O valor gerado pela expressao é ',E:0:9);
  writeln;
  writeln('    Deseja digitar outro número para N! no denominador? sim <s> e não <n> ');
  write('    Resposta: ');readln(opcao);
  writeln;
  writeln('  digite qualquer tecla para continuar...');
  readkey;
 end;
readkey;
end.

 

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

  • Membro VIP

Olá,

 

Em 04/07/2016 às 13:30, Simon Viegas disse:

3) No final de programa tem readkey de mais... basta um.

Essa questão ainda existe. No caso eu precisando dar 2 ENTER para continuar.

 

 

 

Novos pontos que considero notáveis:

 

1) Pequeno ajuste...

16 horas atrás, Anderson Eiji disse:

write('  Digite um número inteiro e positivo(>0): ');readln(n);

Acho que seria melhor dar um espaço após o "positivo".

Algo como:

write('  Digite um número inteiro e positivo (>0): '); readln(n);

 

2) Em relação ao trecho abaixo:

14 horas atrás, Anderson Eiji disse:

if (n>0)

  then

    begin

      soma:=0;

      while (x<=n) do

Esse if passou a ser desnecessário... já que o while "garante" que o n vai ser maior que 0.

 

2) Em relação ao trecho abaixo:

14 horas atrás, Anderson Eiji disse:

soma:=(1/(fat))+soma;

Por uma questão estética, acho que poderia inverter a ordem dos fatores... ficando algo como:

soma:=soma+(1/fat);

Não sei, mas acho que faz mais sentido nessa ordem...

 

 

3) Em relação ao trecho abaixo:

15 horas atrás, Anderson Eiji disse:

   for i:=1 to x do

     begin

       fat:=fat*i;  //1*1, 1*2, 2*3, 6*4, 24*5...

     end;    

 

Nesse caso, o begin/end é desnecessário... já que tem apenas umas instrução no for.

 

 

 

4) Código teste

Tomei a liberdade e adicionei alguns linhas para efetuar testes, caso queira testar...

 

    while (x<=n) do
      begin
      fat:=1;
      for i:=1 to x do
        fat := fat*i;  //1*1, 1*2, 2*3, 6*4, 24*5...
      writeln('Fat: ',x:3,' = ',fat:36:0,' - 1/fat = ',1/fat:0:30); //TESTE - exibe dados em tela para conferência
      if x mod 20 = 0 then readkey; //pause a cada 20 linhas
      soma:=soma+(1/fat);
      x:=x+1;
      end;

É só substituir o trecho correspondente...


PS: esse ":X:Y" depois das variáveis numéricas servem para "formatar o número". O X=casas reservadas a esquerda; e o Y=casas decimais a serem exibidas. Caso queira testar, vá modificando esses valores e vai verificado o que vai mudando.
 

**

 

No aguardo.

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

Visitante
Este tópico está impedido de receber 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!