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.
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).
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ä taulu
ssa on vähintään kaksi jäsentä.)
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ä.
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;
ok, kiitos, nyt toimii.
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..
Tommittaja kirjoitti:
kun saisin sen toimimaan, jos nuo muuttujat toimisivat tuon loopin ulkopuolella, mutta ei..
Määrittele ne siellä missä tahdot niiden toimivan?
Jos laittaisit ne muuttujat loopin ulkopuolelle, ne "toimisivat" sielläkin. Nythän ne alustetaan uudestaan nolliksi joka kierroksen alussa.
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...
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.
Jaa tämmönen kotitehtävä ollu tällä kertaa :-)
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!!!
Sellainen on kuin Integer.MAX_VALUE, joka on int:n suurin mahdollinen arvo.
noo.. riittäähän sekin, koska en tuossa ohjelmassa oikein voi syöttää arvoa, joka on suurempi kuin maksimi :D mutta ei Infinity:ä?
Javan kokonaisluvuilla ei ole äärettömyttä, mutta liukuluvuilla on. Esim. Double.POSITIVE_INFINITY ja Double.NEGATIVE_INFINITY.
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.
yritin kattoa, mutta etsin vain tuota int, enkä doublea, olen jopa ladannut nuo java docsit koneelle.. Voitteko muuten auttaa tuon ongelman kanssa?
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.
kokeillaan sitten...
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.
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.
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
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
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..
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ä.
jaa joo enpäs huomannut.. :D
Aihe on jo aika vanha, joten et voi enää vastata siihen.