toString, compute, print ()...

0

Witam,

Musze zrobic program :) - czy ktos moze mi pomoc dostosowac to co napisalem do tresci zadania? Z gory dziekuje.

Zadanie:
W I kolumnie wypisuje element ciągu Fibonacciego an . W II kolumnie wypisuje ”true” gdy an jest parzyste, ”false” gdy nieparzyste. Prosze użyć niejawnie metody toString dla typu Boolean. W III kolumnie wypisuje a_(n+1) / an. Proszę wypisać pierwsze 50 elementów ciągu (linii). Proszę najpierw obliczyć elementy ciągu i zapisać je w tablicy - własna metoda compute, a następnie wypisać odpowiednie informacje na ekran - własna metoda print. Proszę użyć pola length dla tablicy. Proszę skorzystać tylko raz z funkcji System.out.println().
Uwagi:
Użyć typu long zamiast int.
Iloraz dwóch liczb całkowitych (typu long lub int) jest liczbą całkowitą.
Wykorzystać przeciążenie operatora ”+” dla String.

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
	
public class Fibonacci 
{
	
	
	public static void main(String[] args) throws IOException 
	{
		int a = 0;
		float b = (float) 1.;
		long t[] = new long[50];
		t[0]=1;
		
		PrintWriter file = new PrintWriter(new FileWriter("Fibonacci.txt"));
		
		while(t[a]<t.length) 
		{
			System.out.println(t[a] + "\t" + (t[a]%2==0) + "\t" + b); 
			file.println(t[a] + "\t" + (t[a]%2==0) + "\t" + b); 
				
			//Fibonacci
			t[a] = t[1] + t[a]; 
			t[1] = t[a] - t[1];
			//a_(n+1)/a_n
			b = t[a+1]/t[a];
		}
		
		file.close();
	}
}
0

proszę:

public class Fibonacci {
	String napis="0 true\n";
	
	void print(String arg){
		System.out.println(arg);
	}
	void compute(){
		long buf1=0;
		long buf2=1;
		long wynik;
		Boolean flaga;
		try{
		for(int i=0;i<50;i++){
			
			wynik=buf1+buf2;
			//System.out.println(buf1+" + "+buf2+" = "+wynik);
			buf1=buf2;
			buf2=wynik;
			if(wynik%2==0){
				flaga=true;
			}else{
				flaga=false;
			}
			napis+=wynik+" "+flaga+"\n";
		}
		}catch(Exception x){
			x.printStackTrace();
		}
	}
	public static void main(String[] args) {
		Fibonacci f1=new Fibonacci();
		f1.compute();
		f1.print(f1.napis);
	}
}
0

Witam ponownie,

Dzieki za zainteresowanie Shimmi !! :)

Troche zmienilem kod - w sumie to niepotrzebnie uzylismy flag gdyz mniej wiecej to samo daje po prostu podzielenie modulo i przyrownie do zera.

Teraz mam problem jak wynik zapisac do tablicy ? Bo tylko tak moge uzyskac wartosci ktore sa mi potrzebne w trzeciej kolumnie czyli wyrazy ciagu a_(n+1)/a_n (czyli za pomoca tablic chyba bylo by to 'tablica[a+1]/tablica[a]') ??

public class Fibonacci 
{
	String napis="1\tfalse\t1\n";
        
    void print(String arg)
    {
    	System.out.println(arg);
    }
    
    void compute()
    {
        long a = 0;
        long b = 1;
        long wynik;
               
        for(int i=0;i<8;i++)		
        {
        	wynik = a + b;
            //System.out.println(a+" + "+b+" = "+wynik);
            a = b ;
            b = wynik;
            napis += wynik + "\t" + (wynik%2==0)+ "\t" + c + "\n"; 
            //System.out.println(wynik + "\t" + (wynik%2==0)+ "\t" + c + "\n");
        }
    }
    
    public static void main(String[] args) 
    {
        Fibonacci f1=new Fibonacci();
        f1.compute();
        f1.print(f1.napis);
    }
}
0

Zrobilem cos takiego (kod ponizej). Niestety wyskakuje blad :(

To co wykomentowalem dziala -> *System.out.println(wynik[i]/wynik[i]+ "\n"); *wynik[1]/wynik[0] + "\t" + wynik[2]/wynik[1] +"\t" + wynik[3]/wynik[2] + "\n");

-> czyli dzieli kolejna wartosc w tablicy przez poprzednia.

Natomiast juz to wyrazenie:
wynik[i]/wynik[i-1] (lub tez probowalem wynik[i+1]/wynik[i])
powoduje blad :(

Jak to poprawic ? :>

public class Fibonacci 
{
	String napis="1\tfalse\t1\n";
        
    void print(String arg)
    {
    	System.out.println(arg);
    }
    
    void compute()
    {
        double a = 0;
        double b = 1;
        double wynik[] = new double[10];
               
        for(int i=0;i<wynik.length;i++)		
        {
        	wynik[i] = a + b;
            //System.out.println(a+" + "+b+" = "+wynik);
            a = b ;
            b = wynik[i];
            napis += wynik[i] + "\t" + (wynik[i]%2==0)+ "\t" + wynik[i]/wynik[i-1]+ "\n"; 
            //System.out.println(wynik[i]/wynik[i]+ "\n"); //wynik[1]/wynik[0] + "\t" + wynik[2]/wynik[1] +"\t" + wynik[3]/wynik[2] + "\n");
        }
    }
    
    public static void main(String[] args) 
    {
    	Fibonacci f1=new Fibonacci();
        f1.compute();
        f1.print(f1.napis);
    }
}
0

błąd jest w wyrażeniu

wynik[i]/wynik[i-1]

dla i=0
nie wiem co masz zamiar wtedy wyświetlać, zatem nie wiem co ci poradzić
pozdrawiam

0

Witam

bogdans napisał(a)

błąd jest w wyrażeniu

wynik[i]/wynik[i-1]

dla i=0

nie wiem co masz zamiar wtedy wyświetlać, zatem nie wiem co ci poradzić
pozdrawiam

Chodzi mi o podzielenie nastepnego elementu w tablicy przez poprzedni -
powinno sie to wykonac przez:
wynik[i+1] / wynik [i].
Niestety wyskakuje blad:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8
at Fibonacci.compute(Fibonacci.java:32)
at Fibonacci.main(Fibonacci.java:40)

Wiec problem jest z 'wynik[i+1]' :(

Jezeli dobrze rozumiem to wyrazenie wynik[i+1] powinno wypisac kolejne elementy w tablicy oprocz poczatkowego (zerowego?) czyli (jezeli petla jest od 0) 1 element, 2 element itd.
Natomiast wyraznie wynik[i] powinno wypisac 0 element, 1 element itd. - to jest wporzadku.

Zastanawia mnie tez wynik komendy:
System.out.println(wynik[i+1] + " " +wynik[i]+ " " + wynik[i-1]+ "\n");

jezeli petla for jest od 0 to wyskakuje blad:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at Fibonacci.compute(Fibonacci.java:32)
at Fibonacci.main(Fibonacci.java:40)

jezeli petla for jest od 1 to wynik pokazuje dobry (oprocz pierwszej kolumny):

0.0 1.0 0.0

0.0 2.0 1.0

0.0 3.0 2.0

0.0 5.0 3.0

0.0 8.0 5.0

0.0 13.0 8.0

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8
at Fibonacci.compute(Fibonacci.java:32)
at Fibonacci.main(Fibonacci.java:40)

0

W nawiazaniu do poprzedniego mojego postu:

W sumie to samo co przez

'wynik[i+1]/wynik[i]'

moge osiagnac przez

'wynik[i]/wynik[i-1]'

ale tylko wtedy gdy petla jest od 1, dlaczego nie od 0?:>

0

Chociaz nie!
Nie moge zastapic 'wynik[i+1]/wynik[i]' przez 'wynik[i]/wynik[i-1]'
gdyz pierwsza wartosc w III kolumnie to "Infinity" czyli dzielenie przez 0:

1.0 false Infinity
2.0 true 2.0
3.0 false 1.5
5.0 false 1.6666666666666667
8.0 true 1.6
13.0 false 1.625
21.0 false 1.6153846153846154
34.0 true 1.619047619047619

a powinien juz tam byc wynik dzielenia 2.0/1.0 czyli 2.0
i to chce osiagniac:> ->

1.0 false 2.0
2.0 true 1.5
3.0 false 1.6666666666666667
5.0 false 1.6
8.0 true 1.625
13.0 false 1.6153846153846154
21.0 false 1.619047619047619
34.0 true ..

0

Przeczytaj dokładniej moją odpowiedź, co chcesz dostać gdy wykonujesz dzielenie wynik[0]/wynik[-1] ?

0
bogdans napisał(a)

Przeczytaj dokładniej moją odpowiedź, co chcesz dostać gdy wykonujesz dzielenie wynik[0]/wynik[-1] ?

nic...
chce wykonac wynik[1]/wynik[0] pozniej wynik[2]/wynik[1] itd... czyli (wynik[i+1]/wynik[i]).

0

To jest fragment twojego kodu

        for(int i=0;i<wynik.length;i++)               
        {
            ...........
            napis += wynik[i] + "\t" + (wynik[i]%2==0)+ "\t" + wynik[i]/wynik[i-1]+ "\n"; 

Dla i=0 dzielisz wynik[0]/wynik[-1]

0

wporzadku ale pozniej pisze ze poprawilem :) -> mianowicie na

 for(i=0 ;i<wynik.length;i++)		
        {
        ...
            napis += wynik[i] + "\t" + (wynik[i]%2==0)+ "\t" + (wynik[i+1]/wynik[i])+ "\n";
0

Dziekuje za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1