Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java yhteenlasku

Sivun loppuun

JimProfit [26.01.2009 17:53:19]

#

Miten saa javalla tulostettua/laskettua summan useista arvoista, mikä jättää pois suurimman ja pienimmän arvon summasta.

esim. 1+2+2+2+3 = 6

eli arvoista on jätetty laskematta 1 ja 3.

tkok [26.01.2009 18:00:29]

#

Pidä kirjaa pienimmästä ja suurimmasta, ja aina jos seuraava summattava on suurempi kuin pienin ja pienempi kuin suurin se lisätään, mutta jos se on pienempi kuin pienin tai suurempi kuin suurin lisäät kyseisessä muistipaikassa olleen luvun summaan ja kirjoitat tilalle korvaavan luvun. Sitten sama seuraavalle summattavalle jne. Lopuksi saat summan, jossa ei ole suurinta eikä pienin.
Suurimman ja pienimmän voit alustaa ensimmäisellä ja toisella summattavalla (joista tietysti suurempi suureen ja pienempi pieneen).

jlaire [26.01.2009 18:34:45]

#

Pienimmän ja suurimman voi myös vähentää summasta vasta lopussa.

pienin = suurin = summa = taulu[0];

for (i = 1; i < taulu.length; i++) {
    if (taulu[i] < pienin) pienin = taulu[i];
    if (suurin < taulu[i]) suurin = taulu[i];
    summa += taulu[i];
}

summa -= pienin + suurin;

(Olettaen, että taulussa on vähintään kaksi jäsentä.)

JimProfit [26.01.2009 18:51:38]

#

Ok, ihan hyvää lisätietoa. Miten sen käytännössä toteuttais järkevästi allaolevaan koodiin; siitä puuttuu se osa mikä poistaa suurimman ja pienimmän arvon.

Scanner reader = new Scanner(System.in);

        int points = 0;
        int amount = 0;
        int sum = 0;
        do {

            if (points <= 20) {
                amount++;
            }

            System.out.println("Enter the points from judge #" + amount + ":");

            points = reader.nextInt();

            if (points <= 20) {
                sum += points;
            }

            if (points >= 20) {
                System.out.println("Value of input is incorrect");
            }
        } while (amount != 5);
        System.out.println("total score is: " +sum);
    }
}

Mod. lisäsi kooditagit ja poisti pitkät pätkät tyhjiä rivejä.

Metabolix [26.01.2009 19:05:13]

#

alkuun:

boolean ensimmainen_kierros = true;
int pienin, suurin;

silmukkaan:

if (ensimmainen_kierros) {
  pienin = suurin = points;
  ensimmainen_kierros = false;
} else {
  if (points < pienin) {
    pienin = points;
  } else if (points > suurin) {
    suurin = points;
  }
}

loppuun:

sum -= pienin + suurin;

JimProfit [26.01.2009 20:12:14]

#

ok, kiitos, nyt toimii.

Tommittaja [27.01.2009 14:58:37]

#

minua nyt häiritsee tämä, kun en saa itse toimimaan.. sanoo aina että se summa on 0;

import java.util.Scanner;

public class MinMaxPois {
	public static Scanner Lue = new Scanner(System.in);
	public static void main(String[] args) {
		int i = 0;
		while (i == 0) {
		int summa=0, luku;
			luku = Lue.nextInt();
			summa += luku;
			int pienin = 0;
			int suurin = 0;
			if (luku > suurin)
				suurin = luku;
			else if (luku < pienin)
				pienin = luku;
			else if (luku == 0) {
				System.out.println("Lukujen MinMaxPois Summa on: "+(summa -= (pienin + suurin)));
				break;
			}
		}
	}
}

kun saisin sen toimimaan, jos nuo muuttujat toimisivat tuon loopin ulkopuolella, mutta ei..

Päärynämies [27.01.2009 15:08:24]

#

Tommittaja kirjoitti:

kun saisin sen toimimaan, jos nuo muuttujat toimisivat tuon loopin ulkopuolella, mutta ei..

Määrittele ne siellä missä tahdot niiden toimivan?

Metabolix [27.01.2009 15:08:38]

#

Jos laittaisit ne muuttujat loopin ulkopuolelle, ne "toimisivat" sielläkin. Nythän ne alustetaan uudestaan nolliksi joka kierroksen alussa.

Tommittaja [27.01.2009 15:12:19]

#

jaa yritin, mutta jostakin syystä poistin ne sieltä.. no kokeilen

Edit: nyt toimii niin, että se ei miinusta sitä pienintä pois... :P
nyt toimii jotenkin ihan oudosti...

Metabolix [27.01.2009 15:52:06]

#

Tommittaja kirjoitti:

Edit: nyt toimii niin, että se ei miinusta sitä pienintä pois... :P

Alustat sen alussa nollaksi, joten mikään positiivinen luku ei ole sitä pienempi ja siihen jää nolla. Sitä varten esimerkissäni oli muuttuja ensimmainen_kierros.

Janzo [27.01.2009 17:33:26]

#

Jaa tämmönen kotitehtävä ollu tällä kertaa :-)

Tommittaja [27.01.2009 18:40:34]

#

import java.util.Scanner;

public class MinMaxPois {
	public static Scanner Lue = new Scanner(System.in);
	public static void main(String[] args) {
		int summa=0, pienin=100000, suurin=0, i=0, lopullinen=0, luku=0;
		String sana;
		while (i == 0) {
			sana = Lue.nextLine();
			try {
				luku = Integer.parseInt(sana);
				summa += luku;
			}
			catch (NumberFormatException e) {
			}
			if (luku > suurin)
				suurin = luku;
			else if (luku < pienin)
				pienin = luku;
			else if (sana.equals("q") || sana.equals("Q")) {
				break;
			}
		} lopullinen = suurin + pienin;
		System.out.println("Lukujen MinMaxPois Summa on: "+(summa -= lopullinen));
	}
}

mikä tässä on vikana, kun se poistaa sen luvun välillä...
Edit: onko sellaista metodia, kuin Math.Infinity()?


Edit: SADAS VIESTINI!!!

Jackal von ÖRF [27.01.2009 19:39:03]

#

Sellainen on kuin Integer.MAX_VALUE, joka on int:n suurin mahdollinen arvo.

Tommittaja [27.01.2009 19:40:32]

#

noo.. riittäähän sekin, koska en tuossa ohjelmassa oikein voi syöttää arvoa, joka on suurempi kuin maksimi :D mutta ei Infinity:ä?

Jackal von ÖRF [27.01.2009 19:45:56]

#

Javan kokonaisluvuilla ei ole äärettömyttä, mutta liukuluvuilla on. Esim. Double.POSITIVE_INFINITY ja Double.NEGATIVE_INFINITY.

Päärynämies [27.01.2009 19:50:33]

#

http://java.sun.com/javase/6/docs/api/

Ja tuoltahan on helppo vilkuilla, että minkäslaista sisältöä mistäkin luokasta löytyy. Kannattaa opetella käyttämään.

Tommittaja [27.01.2009 19:54:08]

#

yritin kattoa, mutta etsin vain tuota int, enkä doublea, olen jopa ladannut nuo java docsit koneelle.. Voitteko muuten auttaa tuon ongelman kanssa?

Päärynämies [27.01.2009 20:13:07]

#

Koitappa nyt meittiä uudelleen hieman tuota rakennetta. Aloita mietintä vaikka siitä, että kokeilet mitä tapahtuu kun syötät ensimmäisenä syötteenä kirjaimen q ja miksi ohjelma käyttäytyy niin kuin käyttäytyy.

Tommittaja [27.01.2009 20:15:30]

#

kokeillaan sitten...

Metabolix [27.01.2009 20:48:27]

#

Kokeile myös sitä aiemmin ehdottamaani tapaa, että laitat muuttujat paperille taulukkoon ja leikit itse tietokonetta. Sillä tavalla sinunkin pitäisi löytää koodisi virhe muutamassa minuutissa.

Jackal von ÖRF [27.01.2009 20:58:39]

#

Toinen tapa ratkaista tuo tehtävä on kerätä ensin kaikki luvut listaan tai taulukkoon, jonka jälkeen ne järjestetään suuruusjärjestykseen. Sitten lasketaan summa kaikista paitsi listan ensimmäisestä ja viimeisestä luvusta.

Tommittaja [28.01.2009 08:56:49]

#

Kunhan vähän vielä harjoittelen noita talukoita, en ole niitä käyttänyt missään ohjelmassani, vaikka ovatkin aika tärkeitä..

PS: Taisi olla hieman väärässä tuo viimeisen viestin kirjoittanut henkilö tuossa aiheessa "poistakaa tämä osio". Sanoi, että tänne ei tule muuta keskustelua kuin tuosta osion poistamisesta.. :D

JimProfit [28.01.2009 15:22:29]

#

Terve

siinä on toi mun lopullinen ratkasu. näyttäis toimivan, sano jos löydät jotain.

tämä on mäkihyppytuomareiden laskuri; jättää pois suurimman ja pienimmän pistemäärän. asteikolla 0-20

 public static void main(String[] args) {

        Scanner reader = new Scanner(System.in);

        int points = 0;
        int amount = 0;
        int sum = 0;
        boolean ensinmainen_kierros = true;
        int pienin = 0, suurin = 0;


        do {
            if (points <= 20) {
                amount++;

            }

            System.out.println("Enter the points from judge #" + amount + ":");

            points = reader.nextInt();

            if (points <= 20) {
                sum += points;


                if (ensinmainen_kierros) {
                    pienin = suurin = points;
                    ensinmainen_kierros = false;
                } else {
                    if (points < pienin) {
                        pienin = points;
                    } else if (points > suurin) {
                        suurin = points;
                    }

                }
            }

            if (points >= 20) {
                System.out.println("Value of input is incorrect");
            }

        } while (amount != 5);


        sum -= pienin + suurin;

        System.out.println("total score is: " + sum);
    }
}

Mod. lisäsi taas kooditagit

Tommittaja [28.01.2009 15:28:47]

#

kannattaa laittaa tuon pienimmän alkuarvoksi Integer.MAX_VALUE, koska jos se on 0 ja pienin syöte on 1, niin eihän se muutu koska syötteen pitää olla pienempi kuin 0 jotta se muuttuu..

Päärynämies [28.01.2009 16:10:30]

#

Tommittaja kirjoitti:

kannattaa laittaa tuon pienimmän alkuarvoksi Integer.MAX_VALUE, koska jos se on 0 ja pienin syöte on 1, niin eihän se muutu koska syötteen pitää olla pienempi kuin 0 jotta se muuttuu..

Minusta kyllä tuossa toimii nuo ihan oikein, ainakin mitä päässä kävin koodia läpi. Jos itsekin käyt sitä läpi, niin huomaat, että ensimmäisellä kierroksella noille pienimmälle ja suurimmalle annetaan arvoksi ensimmäisenä syötetty pistemäärä. Tuon ratkaisutavan taisi Metabolix esittää jo ketjun viidennessä viestissä.

Tommittaja [28.01.2009 18:10:15]

#

jaa joo enpäs huomannut.. :D


Sivun alkuun

Vastaus

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

Tietoa sivustosta