Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: Rajatun lukusarjan summa

eluaD [18.01.2019 11:46:20]

#

Tehtävä: Rajatun lukusarjan summa
Käyttäjä määrää summan laskemisen aloituskohdan. Voit olettaa, että käyttäjä antaa ensin pienemmän luvun ja sitten suuremman luvun.

Esimerkkitulostuksia:

Esimerkkitulostus
Ensimmäinen: 3
Viimeinen: 5
Summa on 12

Edellisessä laskettiin 3 + 4 + 5 = 12

Esimerkkitulostus
Ensimmäinen: 2
Viimeinen: 8
Summa on 35

Ja nyt laskettiin 2 + 3 + 4 + 5 + 6 + 7 + 8 = 35

Elikkäs tälläinen tehtävä MOOC:in ohjelmointikurssilla 2019, ei oikeen millään aukea tehtävä. 2 päivän pohdiskelun jälkeen sain tehtävän läpäistyä omalla laskukaavalla, joka ei todellakaan ole koodi jota tehtävässä on tarkoitus syöttää. Tässä oma koodini jolla meni läpi:

import java.util.Scanner;

public class RajatunLukusarjanSumma {

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

        int summa = 0;
        int i = 0;
        int tulos = 0;
        int jatkumo = -1;

        System.out.println("Syötä luku: ");
        int ekaluku = Integer.valueOf(lukija.nextLine());
        System.out.println("Syötä vikaluku: ");
        int vikaluku = Integer.valueOf(lukija.nextLine());

        while (true) {
            summa += ekaluku;
            i++;
            jatkumo++;
            if (i == (vikaluku - ekaluku) + 1)
                break;}

        if (i == 1) {
            tulos = ekaluku * i;}
        else if (i == 2) {
            tulos = ekaluku * i + 1;}
        else if (i == 3) {
            tulos = ekaluku * i + 3;}
        else if (i == 4) {
            tulos = ekaluku * i + 6;}
        else if (i == 5) {
            tulos = ekaluku * i + 10;}
        else if (i == 6) {
            tulos = ekaluku * i + 15;}
        else if (i == 7) {
            tulos = ekaluku * i + 21;}
        else if (i == 8) {
            tulos = ekaluku * i + 28;}
        else if (i == 9) {
            tulos = ekaluku * i + 37;}
        else if (i == 10) {
            tulos = ekaluku * i + 47;}
        else if (i == 11) {
            tulos = ekaluku * i + 58;}

        System.out.println("Summa on " + tulos);

            }
}

Eli jos joku tietää mikä on oikea tyyli selvittää tämä pulma?

Metabolix [18.01.2019 12:00:30]

#

Oletko kuullut for-silmukasta? Sillä voi käydä läpi luvut väliltä ekaluku–vikaluku ja laskea nämä luvut yksitellen mukaan summaan. Tietysti sama onnistuu myös while-silmukalla, mutta for-silmukkaa yleensä pidetään selvempänä lukuvälien käsittelyyn.

Mieti vaikka ensin, miten kävisit läpi silmukalla luvut 0–10 ja tulostaisit ne. Vaihda sitten 0–10:n tilalle ekaluku–vikaluku. Vaihda sitten tulostamisen tilalle luvun lisääminen summamuuttujaan ja tulosta summa silmukan jälkeen.

Lisäksi on tietysti olemassa suora kaava summan laskemiseen ilman silmukkaa, ja tämä löytyy hakusanoilla ”aritmeettisen lukujonon summa” tai koodistasikin löytyvien lukujen (1, 3, 6, 10) mukaan hakemalla. Tämä on tavallaan tehtävän paras ratkaisu, mutta ohjelmointiharjoituksena on varmaan ajateltu, että tehtävä ratkaistaan silmukalla.

Nykyistä koodiasi katsoessa herää väistämättä kysymys, mistä prosessista tuo kaikki koodi on voinut syntyä. Ohjelmoinnissa kannattaa ensin suunnitella ratkaisun järkevät osat ja sitten vasta kirjoittaa se looginen koodi, ei päinvastoin. Jos ratkaisu osoittautuu vääräksi, yleensä fiksumpaa on joko suunnitella se uudestaan tai etsiä siitä virhe. Ei suinkaan kannata vain vääntää perään lisää koodia, joka tuurilla paikkaa aiemman virheet.

Esimerkiksi tässä tehtävässä on selvästi sanottu, että saat kaksi lukua ja pitää laskea välissä olevien lukujen summa. Loogisesti voi silloin ajatella, että koodin pitää käydä läpi luvut ja laskea niiden summa. Selvästi 11 if-lausetta ei kuulu tähän ratkaisuun. Jos kaikesta huolimatta if-lauseita alkaa koodiin tulla, pitää jatkamisen sijasta pysähtyä miettimään, mikä edellisissä vaiheissa on mennyt pieleen.

eluaD [18.01.2019 13:01:41]

#

@Metabolix

Kiitos! tein tehtävän uudestaan käyttäen for-silmukkaa.

Ihme ettei kurssilla ollut mainittu aiemmin mitään for-silmukasta, tai en ainakaan ole huomannut.

Googlaamalla for-silmukka -
Tässä uusi koodi, jolla meni läpi. Tällä kertaa koodissa on jotain järkeä :D

import java.util.Scanner;

public class RajatunLukusarjanSumma {

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

        int summa = 0;
        System.out.println("Syötä ekaluku: ");
        int ekaluku = Integer.valueOf(lukija.nextLine());
        System.out.println("Syötä vikaluku: ");
        int vikaluku = Integer.valueOf(lukija.nextLine());

        while (ekaluku <= vikaluku) {
            break;}

        for (int i = ekaluku; i <= vikaluku; i++) {
            summa = summa + i;
        System.out.println("Summa on " + summa);

            }
    }
}

_Pete_ [18.01.2019 13:39:46]

#

 while (ekaluku <= vikaluku) {
            break;}

on turha eikä tee mitään.

Sörsseli [19.01.2019 19:20:17]

#

Tässä sama pelkällä while-silmukalla. Koulussa olen käyttänyt Lue-luokkaa.

int luku1;
int luku2;
int summa=0;

        System.out.println("Anna ensimmäinen luku: ");
        luku1=Lue.kluku();
        System.out.println("Anna toinen luku: ");
        luku2=Lue.kluku();

        while (luku1<=luku2)
        {
            summa=summa+luku1;
            luku1++;
        }

        System.out.println(summa);

        }
}

Vastaus

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

Tietoa sivustosta