Jump to content
StraightEdge

Fibonacci & EuroMilhões

Recommended Posts

StraightEdge

Como é que eu posso criar um programa em Pascal em que o utilizador insere um termo (por exemplo, termo 6) e o programa calcula o número de Finobacci pertencente a esse termo?

Por exemplo, caso o termo seja 6, o número de Finobacci é 8 porque pelo que estive a ver, os dois primeiros números dessa sequência é o 0 e o 1. O resto é a soma dos dois últimos números, portanto:

Termo 2: 0+1=1

Termo 3: 1+1=2

Termo 4: 1+2=3

Termo 5: 2+3=5

Termo 6: 3+5=8

Já tentei usar um ciclo "For ... To ... Do" mas estou em dúvida como o aplicar.

Eis a minha tentativa (apesar de ter dado um número escandaloso):

Program Finobacci;
Var
  i, n1, n2, term: Integer;

Begin
    Write('Termo?');
    Readln(term);
    n1:=0;
    n2:=1;

For i:=1 To n Do
Begin
  n1:=n1+n2;
  n2:=n2+n1;
End;    

Writeln(n1+n2);

Readkey;
End.

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
thoga31

Primeiro, utiliza as tags CODE: [ code=pascal ][ /code ] (sem espaços). ;)

Pensa bem nesse ciclo que estás a fazer. Estás a fazer duas somas por cada iteração. Não era suposto só haver uma?


Knowledge is free!

Share this post


Link to post
Share on other sites
StraightEdge

Primeiro, utiliza as tags CODE: [ code=pascal ][ /code ] (sem espaços). ;)

Pensa bem nesse ciclo que estás a fazer. Estás a fazer duas somas por cada iteração. Não era suposto só haver uma?

Desculpa, sou novo aqui. Já vou editar. :)

Já pensei nisso, mas nesse caso ficaria n1 ou n2 sempre com o mesmo valor e tanto um como outro tem que seguir a consequência.

Share this post


Link to post
Share on other sites
thoga31

Desculpa, sou novo aqui. Já vou editar. :)

Eu já editei ;)

Já pensei nisso, mas nesse caso ficaria n1 ou n2 sempre com o mesmo valor e tanto um como outro tem que seguir a consequência.

Coloca em papel uma coisa destas:

n1 + n2 = n2
0  + 1  = 1
1  + 1  = 2
1  + 2  = 3
2  + 3  = 5
3  + 5  = 8

Faz contas, e vais ver que só tens de alterar as atribuições que fazes a n2 e a n1 ;)


Knowledge is free!

Share this post


Link to post
Share on other sites
Rui Carlos

Fibonacci :)

Já agora, os números de Fibonacci são definidos recursivamente. Já pensaste em fazer uma implementação recursiva? (Nota: a versão recursiva mais óbvia será muito menos eficiente do que os ciclos.)

Share this post


Link to post
Share on other sites
StraightEdge

Hey, era mais simples do que eu julgava. No que diz respeito a contas, a minha cabecinha só atrapalha :D

Obrigado a ambos!

Share this post


Link to post
Share on other sites
thoga31

Então a que código chegaste? Convinha mostrares para vermos e para ficar uma solução para o tópico.


Knowledge is free!

Share this post


Link to post
Share on other sites
StraightEdge

Program Finobacci;
Var
i, n1, n2, term, aux, fin: Integer;

Begin
	Writeln('Termo?');
	Readln(term);
	n1 := 0;  
	n2 := 1;

For i:=3 To term+1 Do  
Begin
fin:=n1+ n2;
aux:=n1;	
n1:=n2;		
n2:=n2+aux;  
End;

Writeln(fin);

Readkey;
End.

Praticamente, o segredo estava na variável i. Eu tinha metido 1 como valor inicial mas como os dois primeiros números já estavam definidos, o valor inicial seria 3.

Edited by StraightEdge

Share this post


Link to post
Share on other sites
thoga31

Credo, tanta variável...

Peguei no teu programa inicial, fiz-lhe as alterações apenas na atribuição a n1 e n2, e fiz uns writeln de teste. Como podes ver, não uso uma única variável auxiliar, e o resultado é o pretendido. ;)

Program Finobacci;
Var
  i, term: Integer;
  n1 : Integer = 0;
  n2 : Integer = 1;

Begin
Write('Termo?');
Readln(term);

For i:=1 To term-1 Do
Begin
  writeln('Termo ', i, ' = ', n2);
  n2:=n1+n2;
  n1:=n2-n1;
End;    

writeln('Final = ', n2);
End.


Knowledge is free!

Share this post


Link to post
Share on other sites
StraightEdge

Obrigado pela tua ajuda :)

Já agora, pelo que estive a ver, tens bastantes projetos publicados aqui no fórum. Não tens nada sobre o EuroMilhões em Pascal? Já andei a procura e não encontrei nada.

Isto porque estou a apresentar um projeto que simula o EuroMilhões. O programa em si está feito mas gostaria de enfeitar aquilo e talvez acrescentar mais algo. Se eu visse um projeto igual, até que podia tirar ideias.

Eis o meu:

Program EuroMilhoes;
Var
n1, n2, n3, n4, n5:Integer;
e1, e2:Integer;
numeros, estrelas:Integer;
i, i2:Integer;
sorteionr, sorteioest:Integer;

Begin
Writeln('Introduza os 5 números');
Readln(n1, n2, n3, n4, n5);
Writeln('Introduza as 2 estrelas');
Readln(e1, e2);

For i:=1 To 5 Do
Begin
Randomize;
Sorteionr:=(Random(50)+1);
If (sorteionr=n1) or (sorteionr=n2) or (sorteionr=n3) or (sorteionr=n4) or (sorteionr=n5) Then
Numeros:=numeros+1;
Writeln(i ,'º numero = ', sorteionr);
End;

Writeln(' ');

For i2:=1 To 2 Do
Begin
Randomize;
Sorteioest:=(Random(9)+1);
If (sorteionr=e1) or (sorteionr=e2) Then
Estrelas:=estrelas+1;
Writeln(i2 ,'º estrela = ', sorteioest);
End;

Writeln(' ');

If (numeros=5) and (estrelas=2) Then
Writeln('Parabéns. Acertou nos 5 números e nas 2 estrelas. Ganhou o 1º Prêmio!')

Else
If (numeros=5) and (estrelas=1) Then
Writeln('Acertou em 5 números e em 1 estrela. Ganhou o 2º Prêmio!')

Else
If (numeros=5) and (estrelas=0) Then
Writeln('Acertou em 5 números e em nenhuma estrela. Ganhou o 3º Prêmio!')

Else
If (numeros=4) and (estrelas=2) Then
Writeln('Acertou em 4 números e em 2 estrelas. Ganhou o 4º Prêmio!')

Else
If (numeros=4) and (estrelas=1) Then
Writeln('Acertou em 4 números e em 1 estrela. Ganhou o 5º Prêmio!')

Else
If (numeros=4) and (estrelas=0) Then
Writeln('Acertou em 4 números e em nenhuma estrela. Ganhou o 6º Prêmio!')

Else
If (numeros=3) and (estrelas=2) Then
Writeln('Acertou em 3 números e em 2 estrelas. Ganhou o 7º Prêmio!')

Else
If (numeros=2) and (estrelas=2) Then
Writeln('Acertou em 2 números e em 2 estrelas. Ganhou o 8º Prêmio!')

Else
If (numeros=3) and (estrelas=1) Then
Writeln('Acertou em 3 números e em 1 estrela. Ganhou o 9º Prêmio!')

Else
If (numeros=3) and (estrelas=0) Then
Writeln('Acertou em 3 números e em nenhuma estrela. Ganhou o 10º Prêmio!')

Else
If (numeros=1) and (estrelas=2) Then
Writeln('Acertou em 1 número e em 2 estrelas. Ganhou o 11º Prêmio!')

Else
If (numeros=2) and (estrelas=1) Then
Writeln('Acertou em 2 números e em 1 estrela. Ganhou o 12º Prêmio!')

Else
If (numeros=2) and (estrelas=0) Then
Writeln('Acertou em 2 números e em nenhuma estrela. Não ganhou qualquer prêmio!')

Else
If (numeros=1) and (estrelas=1) Then
Writeln('Acertou em 1 número e em 1 estrela. Não ganhou qualquer prêmio!')

Else
If (numeros=1) and (estrelas=0) Then
Writeln('Acertou em 1 número e em nenhuma estrela. Não ganhou qualquer prêmio!')

Else
If (numeros=0) and (estrelas=2) Then
Writeln('Acertou em nenhum número e em 2 estrelas. Não ganhou qualquer prêmio!')

Else
If (numeros=0) and (estrelas=1) Then
Writeln('Acertou em nenhum número e em 1 estrela. Não ganhou qualquer prêmio!')

Else
If (numeros=0) and (estrelas=0) Then
Writeln('Não acertou em nada. Não ganhou qualquer prêmio!'); 

Writeln('Pressione uma tecla para sair');
Readkey;
End.

Estou a prever tu a reclamares do excesso de variáveis. :P

Share this post


Link to post
Share on other sites
thoga31

Não vou dizer nada quanto ao excesso de variáveis. Vou é reclamar quanto à utilização despropositada de tantos if's e do não uso de Arrays.

Tens os últimos if's para quê? Se todos retornam o mesmo resultado, basta fazer um else dos restantes casos! Porque os últimos casos que não dão prémio ocorrem apenas quando as anteriores não ocorrem. Se é 1 número e 0 estrelas ou 0 números e 1 estrela não interessa: o que interessa é que não é um dos casos que dá prémios.


Knowledge is free!

Share this post


Link to post
Share on other sites
StraightEdge

Não vou dizer nada quanto ao excesso de variáveis. Vou é reclamar quanto à utilização despropositada de tantos if's e do não uso de Arrays.

Tens os últimos if's para quê? Se todos retornam o mesmo resultado, basta fazer um else dos restantes casos! Porque os últimos casos que não dão prémio ocorrem apenas quando as anteriores não ocorrem. Se é 1 número e 0 estrelas ou 0 números e 1 estrela não interessa: o que interessa é que não é um dos casos que dá prémios.

Não usei Arrays porque ainda não me ensinaram isso. :/

Share this post


Link to post
Share on other sites
StraightEdge

Estás a aprender Pascal na escola (ou universidade)?

Então aprende-os por ti. São muito simples e muito úteis. ;)

Na escola. É Pascal e SQL. (Nem sei se vou para a universidade, ainda)

Ainda só me ensinaram poucas coisas como podes ver. E é só até ao final do ano porque para o próximo ano é VB.

Essa página vai-me dar bastante jeito, visto que a minha professora inscreveu-me num concurso de programação.

Guardei-a nos favoritos, obrigado. :)

Share this post


Link to post
Share on other sites
thoga31

Na escola. É Pascal e SQL. (Nem sei se vou para a universidade, ainda)

Ainda só me ensinaram poucas coisas como podes ver. E é só até ao final do ano porque para o próximo ano é VB.

Aprende mais fora dos círculos da escola. No teu lugar, apostaria numa formação superior.

E prefiro não comentar o ensino de VB.NET...

Essa página vai-me dar bastante jeito, visto que a minha professora inscreveu-me num concurso de programação.

Guardei-a nos favoritos, obrigado. :)

Não é só uma página, é uma série delas :P


Knowledge is free!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.