Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: annetuista luvuista pienimmän tulostaminen

JoPeRa [06.11.2014 14:14:55]

#

Kyseessä on ohjelma, joka ottaa vastaan syötettyjä pistemääriä kunnes lopuksi syötetään nolla. Ohjelma tulostaa pisteiden keskiarvon ja pienimmän syötetyn pistemäärän. Alla on tekemäni versio, mutta ajattelin vain kysäistä saako tuota mahdollisesti tehtyä jotenkin yksinkertaisemmin:

import java.util.Scanner;

public class Pistemäärät {

    static Scanner lukija = new Scanner(System.in);

    public static void main(String args[]) {
        int pistemäärä;
        int pieninPistemäärä = 0;
        double keskiarvo;
        int laskuri = 0;
        double toistokerrat = -1;

        System.out.println("Lasken antamiesi pistemäärien summan ja niiden keskiarvon. 0 lopettaa ohjelman.");

        do {
            System.out.print("Anna pistemäärä: ");
            pistemäärä = lukija.nextInt();
            while (pistemäärä < 0) {
                System.out.print("Pistemäärä ei voi olla pienempi kuin 0. Anna pistemäärä uudestaan: ");
                pistemäärä = lukija.nextInt();
            }
            if (pieninPistemäärä == 0) {
                pieninPistemäärä = pistemäärä;
            }

            if (pistemäärä < pieninPistemäärä & pistemäärä != 0) {
                pieninPistemäärä = pistemäärä;
            }

            laskuri += pistemäärä;
            toistokerrat++;
        }while(pistemäärä != 0);

        keskiarvo = laskuri / toistokerrat;

        System.out.printf("\nPistemäärien summa on " + laskuri + " ja keskiarvo on %.2f.\n", keskiarvo);
        System.out.println("Pienin annettu pistemäärä oli " + pieninPistemäärä);
    }
}

Lisäys:

Vastaan itselleni: sain koodia yksinkertaisemmaksi kun pistin pistemäärälle ylärajan, jolloin tuli seuraavat muutokset:

int pieninPistemäärä = 100;
while (pistemäärä < 0 || pistemäärä > 100) {
               System.out.print("Pisteiden tulee olla väliltä 1-100. Anna pistemäärä uudestaan: ");
               pistemäärä = lukija.nextInt();
           }
           if ((pistemäärä <= pieninPistemäärä) && pistemäärä != 0) {
               pieninPistemäärä = pistemäärä;
           }

Grez [06.11.2014 17:48:38]

#

En näe mitään tarvetta pistää keinotekoista ylärajaa, kun int tietotyypillä on muutenkin yläraja. Itse tekisin näin

import java.util.Scanner;

public class Pistemäärät {

    static Scanner lukija = new Scanner(System.in);

    public static void main(String args[]) {
        int pienin = Integer.MAX_VALUE;
        int summa = 0;
        int määrä = 0;

        System.out.println("Lasken antamiesi pistemäärien summan ja niiden keskiarvon. 0 lopettaa ohjelman.");

        while (true) {
            System.out.print("Anna pistemäärä: ");
            int pistemäärä = lukija.nextInt();
			if (pistemäärä == 0) { break; }
			if (pistemäärä < 0) {
				System.out.print("Pistemäärä ei voi olla pienempi kuin 0. ");
            } else {
				if (pistemäärä < pienin) { pienin = pistemäärä; }
				summa += pistemäärä;
				määrä++;
            }
        }
		if (määrä == 0) { system.out.println("Ei lukuja"); }
		else {
			System.out.printf("\nPistemäärien summa on " + summa + " ja keskiarvo on %.2f.\n", summa/määrä);
			System.out.println("Pienin annettu pistemäärä oli " + pienin);
		}
    }
}

Eipähän tuo nyt merkittävästi yksinkertaisempi ole. Yhden turhan toiston poistin. Toisaalta lisäsin sinne tarkistuksen ettei tule jako nollalla poikkeusta, jos ei syötetä yhtään lukua.

JoPeRa [07.11.2014 08:30:39]

#

Kiitoksia vastauksesta! Tuo int:n yläraja olikin hyvä tietää, mietin että onko sillä sellaista ja miten sitä käytetään mutta se kävikin näköjään aika helposti...

Vastaus

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

Tietoa sivustosta