Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Indeksin käsittely Javassa

niwillbe [10.10.2017 18:16:28]

#

Olen yrittänyt tehdä ArrayList -listaan liittyviä tehtäviä Java -ohjelmointikurssilla. Ongelmaksi on muodostunut listan indexien ja indexien arvojen yhteenliittäminen. Tilanne tulee esiin esimerkiksi etsittäessä pienimmän luvun indeksiä ennalta määräämättömän kokoisessa listassa, jossa lulijalta pyydetään syötettä. Sama tilanne on tunnetussa Fibonaccin lukujonotehtävässä, josta on useita sovelluksia. Tässä tehtävässä on siis tarkoitus pyytää lukijaa syöttämään tietyltä väliltä luku, jota vastaava Fibonaccin luku pitäisi saada tulostettua listasta. Olisiko olemassa vinkkejä tai esimerkkejä, joiden avulla voisi yrittää jotenkin johtaa ratkaisua indeksin ja arvojen väliseen yhdistämiseen? Itsellä nuo tehtävät eivät jostain syystä aukea tämän kysymyksen osalta...

Jaska [10.10.2017 20:21:08]

#

Ei Fibonaccin lukuja kannata laskea muodostamalla lista. En ole ihan varma mitä haet. Jos haluat n:nnen Fibonaccin luvun, niin saat sen selville matriisien avulla. Katso esimerkiksi Code Reviewistä.

Jos taas haluat tietää, onko tietty luku m n:s Fibonaccin luku, niin voit joko laskea taas matriisien avulla lukuja, kunnes löydät luvun tai huomaat, että luku ei kuulu Fibonaccin lukujonoon. Tai sitten voit ratkaista numeerisesti Binet'n kaavan avulla kyseisen indeksin ja katsoa onko ratkaisu positiivinen kokonaisluku.

Metabolix [10.10.2017 22:32:12]

#

Jaska, no tuo ei todellakaan ole helpompi ratkaisu, vaikka ehkä nopeampi onkin.

En ymmärrä kysyjän kysymystä, eli ilmeisesti koko tehtävä on mennyt jotenkin solmuun mielessä.

Jos tarkoituksena on tulostaa indeksin mukainen Fibonaccin luku, ratkaisu on erittäin helppo: Kysy indeksi. Laita listaan kaksi ensimmäistä lukua (yleensä 0 ja 1). Kun listan koko on pienempi kuin haluttu indeksi, lisää listan loppuun kahden viimeisen luvun summa. Palauta listasta oikean indeksin mukainen luku.

Pseudokoodia (ei Javaa, mutta helppo muuttaa Javaksi):

indeksi = kysy();
lista = {0, 1};
kun (lista.pituus <= indeksi):
    i = lista.pituus
    lista.lisää(lista[i-1] + lista[i-2])
tulosta lista[indeksi]

Jos kysymyksenä onkin, että halutaan vaikka lähin Fibonaccin luku, pitää vastaavalla tavalla muodostaa listaa, kunnes listasta löytyy kysyttyä lukua seuraava Fibonaccin luku, ja sitten voi tulostaa viimeisen tai toiseksi viimeisen luvun listasta sen mukaan, kumpi on lähempänä kysyttyä (tai mitä tehtävässä nyt halutaankaan).

niwillbe [10.10.2017 23:13:01]

#

Pahoittelut epäselvästä esityksestä, joka oli tehtävä kiireessä. Kyse on siis ArrayList -tehtävästä, joka vaaditaan tehtäväksi listaan. Listan koko on määritelty (ArrayList<Integer>, jonka koko on 40)). Lukijalta pyydetään syötettä, joka oletusarvoisesti sijoittuu välille 0 - 40. Syötteen perusteella listasta pitäisi tulostua Finobaccin luku lukijan syöttämän luvun (indeksin) mukaisesta paikasta.

import java.util.ArrayList;
import java.util.Scanner;

public class FibonaccinLukujono {

    public static void main(String[] args) {
        Scanner lukija = new Scanner(System.in);

        ArrayList<Integer> lista = new ArrayList<>();
        lista.add(0);
        lista.add(1);

        int a = 0;
        int b = 1;
        int c = 0;
        int i;

        for (i = 0; i < 40; i++) {
            c = a + b;
            a = b;
            b = c;
            lista.add(i);
            System.out.println(c);
        }

System.out.print("Monesko luku? ");
        int luku = Integer.parseInt(lukija.nextLine());
          // tässä välissä on joitakin muuttujia.
while (true) if (i == -1) {
            break;
        } // tässä siis ohjelma katkeaa jos käyttäjä syöttää luvun -1.

Tämän jälkeinen jatko on hieman epäselvä, ilmeisesti sitten mennyt solmuun mielessä...kyse on siis indeksin ja syötetyn luvun linkittämisestä, mistä taas oppimateriaaleissa ei ole esimerkkejä. Tuo pitäisi tietysti itse oivaltaa varsinkin kun 6 op :n ohjelmointikurssi on suoritettu muutama vuosi sitten (silloin tosin c# -kielellä)...

Grez [11.10.2017 08:58:33]

#

Jos käyttäjältä kysytään, että "monesko luku" niin vastauksen pitäisi olla välillä 1 - 40, koska laskeminen alkaa ihmisillä 1:stä.

while (true) {
    System.out.print("Monesko luku? ");
    int luku = Integer.parseInt(lukija.nextLine());
    if (i == -1) {
      break; // tässä siis ohjelma katkeaa jos käyttäjä syöttää luvun -1.
    } else if (i>=1 && i <= lista.size()) {
       System.out.print(lista.get(i-1));  //Tulostetaan listan i:s luku
    } else {
       System.out.print("Virheellinen valinta. Anna -1 jos haluat lopettaa");
    }
}

niwillbe kirjoitti:

Listan koko on määritelty (ArrayList<Integer>, jonka koko on 40)).

Laittamassasi koodissa noin ei ole, vaan teet määrittämättömän kokoisen listan, jonka kooksi tulee 42.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta