Ir ao conteúdo
  • Cadastre-se

Exercícios em pascal


Posts recomendados

Olá pessoal boa noite preciso de uma ajuda com esses 2 exercícios em pascal por favor me ajudem. 

 

Implementação de dois programas em Pascal:

a. Faça um programa que leia um número inteiro positivo N e crie uma sub-rotina que receba como parâmetro esse valor N e retorne ao programa principal o valor de S obtido pelo seguinte cálculo:

 =1+1/1!⁄+1/2!⁄+1/3!⁄++1/!

 
b. Faça um programa que leia 10 números inteiros e positivos e implemente um procedimento que dado um número lido informe se ele é um número perfeito ou não. Sabe-se que um número é perfeito quando é igual à soma de seus divisores (exceto ele mesmo). Exemplo: os divisores de 6 são 1, 2 e 3, e 1+2+3 = 6. Logo, 6 é um número perfeito. Para cada um dos valores lidos, o procedimento implementado deve ser executado para informar se o número é ou não perfeito.
Link para o comentário
Compartilhar em outros sites

Gente, boa tarde!

 

Preciso desenvolver dois programas em Pascal, porém só sei desenvolver em C. Alguém pode me ajudar?

 

1- Programa que leia um número inteiro positivo N e crie uma sub-rotina que receba como parâmetro esse valor N e retorne ao programa principal o valor de S obtido pelo seguinte cálculo: S = 1 + 1/ 1!  + 1 /2!  + 1/ 3!  + ⋯ + 1 / N!

 

2- Programa que leia 10 números inteiros e positivos e implemente um procedimento que dado um número lido informe se ele é um número perfeito ou não. Sabe-se que um número é perfeito quando é igual à soma de seus divisores (exceto ele mesmo).
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá renatocrb e renatocrb.

 

Tentem fazer algo e postem aqui o que já conseguiram...

 

Então, para o 1), creio que a primeira coisa seria cria uma Function que calcule e retorne o valor fatorial de um número inteiro. Essa seria a base do programa. Seria até interessante apenas fazer um programa que faça isso, depois inseriria a rotina principal que faz o cálculo.

 

Para o 2), vocês poderiam criar uma Function que retorna os divisores do número e a partir dai efetuar os cálculos... etc

 

No aguardo

Link para o comentário
Compartilhar em outros sites

Olá renatocrb e renatocrb.

 

Tentem fazer algo e postem aqui o que já conseguiram...

 

Então, para o 1), creio que a primeira coisa seria cria uma Function que calcule e retorne o valor fatorial de um número inteiro. Essa seria a base do programa. Seria até interessante apenas fazer um programa que faça isso, depois inseriria a rotina principal que faz o cálculo.

 

Para o 2), vocês poderiam criar uma Function que retorna os divisores do número e a partir dai efetuar os cálculos... etc

 

No aguardo

Veja onde que está errado.

 

Questão A

Program A ;varn,x,p:integer;s:real;Procedure calculo;varf,u:integer;p:real;beginf:=1;for u:=1 to x dobeginf:=f*uend;p:=1+1/f;s:=p+s;end;BeginWriteln('Informe o número');readln(n);for x:=1 to n dobegincalculo;end;writeln('O Resultado será ',s);Writeln('Pressione qualquer tecla para finalizar');readkey;End.

Questão B:

Program B ;varx,numero:integer;Procedure calculo;vary,np,nc:integer;begin np:=0; nc:=numero-1; for y:=1 to nc do begin If (numero mod y=0) thennp:=y+np;end;if (numero=np) thenwriteln('O numero ',numero,' é perfeito')elsewriteln('O numero ',numero,' não é perfeito');end;BeginWriteln('Esse programa irá mostrar se os numeros informados são perfeitos ou não.');Writeln('Insira apenas números inteiros e positivos');Writeln('Aperte qualquer tecla pra começar');readkey;Writeln('Informe os números'); for x:=1 to 10 do begin readln (numero); if numero<0 then writeln('Número inválido. Informe apenas inteiros positivos') else calculo; end; Writeln('Pressione qualquer tecla para finalizar'); readkey;End.

No aguardo!

Exercícios em Pascal.doc

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

1)

- Você precisa transformar a procedure em function; (a ÚNICA diferença é que a function retorna sempre um valor nela mesma, procedure não)

- O valor utilizado pela função deve ser passado por parâmetro, e não usando variável global.

- O trecho que calcula o fatorial pode ficar separado, ou seja, cria uma outra função para fazer esse cálculo. Daí, a function do cálculo, chama a function do fatorial.

Obs.1: A função do fatorial tem que ser criada antes (acima) da função do calculo, pois o Pascal vai aprendendo de "de cima para baixo";

Obs.2: No Pascal é possível criar uma sub-rotina, da sub-rotina, a função do fatorial pode ficar dentro da função do calculo (é fácil entender, é da mesma forma que você usou um var dentro da função, você também pode criar um function também, ou seja, essa função seria enxergada apenas por essa função - da mesma forma que as variáveis são enxergadas apenas nela também...)

 

2)

- acho que você deveria ler os 10 números de uma vez e depois efetuar as contas. Sugiro usar array.

- creio que aqui você também deva passar o valor para cálculo pela procedure, e não usando variável global. (ao passar o valor do array, passe a posição, e não o array todo);

- creio que ao ler um valor inválido (numero<0), você deve ler um novo número, e não apenas ignorá-lo. (você poderia usar um repeat, validando o valor)

 

***

 

Por ai vai

 

No aguardo.

 

Link para o comentário
Compartilhar em outros sites

Bom dia. 

Fiz o primeiro conforme o Simon Vegas falou. Ele retorna zero mesmo?

Program A ;uses crt;var n,x,p:integer;s:real;function calculo ( p:real):real;var f,u:integer;Beginf:=1;for u:= 1 to x dobeginf:=f*uend;p:=1+1/f;s:=p+s;end;beginwriteln('Informe o numero');readln(n);for x:= 1 to n dobeginwriteln('O Resultado sera',s);writeln('Precione qualquer tecla para finalizar');readkey;  end;End.
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá andreza.gomes,

 

Seu mesmo código, só que endentado, para facilitar a leitura :

PROGRAM A;uses  CRT;var   n,x,p:integer;  s:real;function calculo (p:real):real;  var     f,u:integer;  begin  f:=1;  for u:= 1 to x do    begin    f:=f*u    end;  p:=1+1/f;  s:=p+s;  end;BEGINwriteln('Informe o numero');readln(n);for x:= 1 to n do  begin  writeln('O Resultado sera',s);  writeln('Precione qualquer tecla para finalizar');  readkey;  end;END.

Você criou a function e nenhum momento está utilizando ela.

 

Deve funcionar assim: você chama o procedimento, passando o parâmetro que ele precisa, e utiliza o valor retornado por ela, ou seja, a function funciona como uma variável, que retorna um valor nela mesma. Outra coisa, você declarou que a function retorna um real, mas onde está retornando esse valor?

 

Então, a conta é "S = 1 + 1/fatorial(1)  + 1 /fatorial(2)  + 1/fatorial(3)  + ⋯ + 1 /fatorial(N)", correto? para organizar, cria uma function que calcula o fatorial... Cria outra function que faz essa conta, e que vai utilizar a function fatorial para calcular o fatorial...

 

Fiz um exemplo de cálculo de fatorial e com um programa utilizando ela. Tentem entender como funciona uma function e criem um programa que faz o cálculo de S.
 

PROGRAM exemplo;uses  CRT;function fatorial(n:integer):integer;  var     i,             //para controlar o for    fat :integer;  //usado no cálculo e resultado do fatorial  begin  fat:=N; //inicializa a variável (primeiro valor)  for i:=N-1 downto 1 do // *1    fat:=fat*i; //ele mesmo vezes o próximo valor  fatorial:=fat; //retorna o valor na function  end;//*1 = vai de "próximo" até o "1" [ex.: N=4.  N*(3*2*1)]//claro que não precisa multiplicar por 1, mas deixei apenas para ficar didático  var  num: integer;  BEGINClrScr;writeln('Digite o valor de N');readln(num);writeln('Fatorial de ',num,'=',fatorial(num)); //*2ReadKey;//*2 veja, está chamado fatorial, passando o valor que ele precisa no num. A própria function retorna o valor, ou seja, fatorial funciona também como uma variável.END.

...

 

O princípio da soma S é a mesma coisa... será um laço de repetição que vai somando cada pedaço da conta...

No aguardo.

 
Link para o comentário
Compartilhar em outros sites

Fiz novamente, acho que agora consegui. Porém tentei colocar algum comando para o usuário ter a opção de sair e não encontrei.
 

program numerointeiro;uses crt;    function fatorial ( numero: integer ):integer;      var f: integer;          begin         f := numero;         while (numero>1) do                      begin                       numero:=numero-1;             f := f * numero;                         end;                    fatorial := f;       end;              function soma (numero: integer): real;      var s: real;      var denominador: integer;            begin          s:=1;            for denominador:= 1 to numero do          begin            s:=s+(1/fatorial(denominador));          end;            soma:=s;          end; var    resultado:real;   numero: integer;               begin   ClrScr;     writeln ('Por favor informe o um número inteiro positivo:');  readln(numero);                     while numero <=0 do                begin        writeln(' O número digitado não é um inteiro positivo:');       writeln ('Por favor informe o um número inteiro positivo:');       readln(numero);             end;            resultado:=soma(numero);       writeln( 'O somatório dos fatoriais é:');      writeln (resultado);               //exit;            End.
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá. Comecei a responder ontem... mas durante a composição, o meu PC travou e não tá ligando mais... rs

 

Vou tentar resumir:

 

Creio que o código está certo, faço apenas alguns comentários:

 

1) Evite esses espaços entre as linhas, deixa o código muito "sujo";

 

2) Por que usou while, em vez de for no fatorial?

Não está errado, apenas sugiro uma reflexão (supondo que "deveria" ser for). Então, existem basicamente 3 estruturas de repetição: while, for e repeat. Tudo que dá para fazer em um, dá para fazer em outro (resumindo: só precisaria existir um, correto?). A questão é que um é mais adequado/prático para cada contexto... Daí, precisa analisar qual seria o mais propício e/ou qual justificativa para usar um outro. (cada um tem suas qualidades e limitações, e que é justamente o que estou colocando em discussão). Sugiro que também converse com seu orientador sobre isso...

 

3) Sobre o "sair", qual contexto se refere? uma desistência?

Se for, poderia usar por exemplo o "0"... daí, se o valor informado for esse, não continua... para tratar, usa um if...

O comando exit e halt também pode ser usados... mas tem que ver se não dá uma quebra na lógica, ou seja, talvez seja mais correto fazer o programa "pula o que não quer", e não simplesmente fechar...

 

 

Qualquer coisa é só postar;

 

No aguardo.

Link para o comentário
Compartilhar em outros sites

  • 2 meses depois...

Gente boa tarde!

 

Estou tentando fazer alguns exercícios em pascal, mas não compila. Alguém me ajuda?

 

1)     Um comerciante deseja fazer o levantamento do lucro das mercadorias que ele comercializa. Para isto, mandou digitar uma linha para cada mercadoria com nome, preço de compra e preço de venda das mesmas. Fazer um programa em Pascal que determine e escreva quantas mercadorias proporcionam:

 

10%<- lucro<10%

lucro<-20%

lucroo >20%

 

 

 

Determine e escreva o valor total de compra e de venda de todas as mercadorias, assim como o lucro total. Observação: Você deve adotar um flag

program LucroMercadorias;uses crt;const Max = 100; { numero maximo de mercadorias }type RgProduto = record                   Nome     : string;                   PrcCompra: real;                   PrcVenda : real;                 end;var n, i, LucroA, LucroB, LucroC: integer;      TtCompra, TtVenda, TtLucro: real;                Lucro, PCemLucro: real;                       Continuar: Char;                         Produto: array[1..Max] of RgProduto;begin  { Digitar os dados do produto: Nome, Preco de compra e venda. }  n := 0;  repeat    n := n + 1;    clrscr;    writeln('Produto no. ', n:2);    writeln('-------------');    write('Informe o nome do produto: ');    readln(Produto[n].Nome);    write('Informe o preco de compra: ');    readln(Produto[n].PrcCompra);    write('Informe o preco de venda.: ');    readln(Produto[n].PrcVenda);    writeln;    repeat      write('Continuar (s/n).: ');      readln(Continuar);    until Continuar in ['S', 's', 'N', 'n'];  until (n = Max) or (Continuar in ['N', 'n']);  { inicializa as variaveis antes do inicio do processamento }  LucroA := 0;    TtCompra := 0;  LucroB := 0;    TtVenda  := 0;  LucroC := 0;    TtLucro  := 0;  for i := 1 to n do  begin    Lucro := Produto[i].PrcVenda - Produto[i].PrcCompra;    PCemLucro := Lucro / Produto[i].PrcCompra * 100;    if PCemLucro < 10       then inc(LucroA)    else if PCemLucro <= 20            then inc(LucroB)         else inc(LucroC);    TtCompra := TtCompra + Produto[i].PrcCompra;    TtVenda  := TtVenda  + Produto[i].PrcVenda;    TtLucro  := TtLucro  + Lucro;  end;  { exibe (ou imprime) os resultados }  clrscr;  writeln('.....Lucro....    Qtd.');  writeln('----------------------');  writeln('       Ate 10%    ', LucroA:3);  writeln('de 10% ate 20%    ', LucroB:3);  writeln('  acima de 20%    ', LucroC:3);  writeln;  writeln('Total dos precos de compra....: ', TtCompra:8:2);  writeln('Total dos precos de venda.....: ', TtVenda :8:2);  writeln('Total do lucro das mercadorias: ', TtLucro :8:2);  writeln;  write('Pressione [Enter] para prosseguir.');  readln;end.
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

OK! Vou criá-la.

Simon, bom dia!

 

Não estou conseguindo criar novos tópicos. Você tem o link?

 

Desde já agradeço.

 

Vamos conversar por mensagens privadas. Eu enviei uma mensagem ("Enviar Mensagem") para você , por favor, responda a mensagem. Qualquer coisa envia uma mensagem para mim pelo meu perfil.

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