Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

StraightEdge

Fibonacci & EuroMilhões

Mensagens Recomendadas

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.

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por StraightEdge

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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. :/

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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. :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.