Gyakorlati alapok
Ömlesztett számok minimuma és maximuma
Minimum-, és maximumszámítás már több helyen előfordult honlapomon, például az Elemi programozási tételek egy 10 elemű tömbön című fejezetben, illetve az alapalgoritmust rendezések is tartalmazhatják (Minimumkiválasztásos rendezés).
Ebben a fejezetben funkcionálisan szétválasztva implementáljuk az adatbekérést, a minimum-, és a maximumkiválasztást, valamint az algoritmusok közötti választási lehetőséget felajánljuk a felhasználónak.
A maximumkiválasztás során megkeressük a tömb legnagyobb elemét. Fontos szempont, hogy int maximum értéke kezdetben legyen 0. Értéke akkor lesz felülírva, ha tömb i-dik eleme (itt tomblista.get(i)) nagyobb nála, ezáltal a for ciklus végére garantáltan a maximumérték kerül bele.
A minimumkiválasztás kódrészében alapértelmezésben a relációs jel irányát (if(tomblista.get(i) < minimum)) és az int minimum kezdőértékét kell átállítanunk; az utóbbinak nagyobbnak kell lennie, mint a lehetséges legnagyobb elem, másként rossz végeredményt kaphatunk. Ez int numerikus adattípus esetén +2,147,483,647, ezért kezdőértéke ez lesz. Belátom, nem valami elegáns megoldás és nyilvánvalóan vannak erre más megoldási módok is, de ez most itt elég. Az algoritmus azonban ezek után is pontatlan lesz, de vajon miért?
A probléma a bekeres() függvényben generálódik, amikor lezárásképpen mindig 0 értéket várunk ("Adjon meg egy számot vagy kérje a végeredményt 0-val!\n"), ezáltal a minimumba mindig 0 fog kerülni. A megoldás a 2. legkisebb szám megtalálása (int masodikLegkisebb). Kezdőértékének a minimumhoz hasonlóan szintúgy szupernagy(i)nak kell lennie. Ennek algoritmusa bónuszként szintén publikálásra került az Elemi programozási tételek egy 10 elemű tömbön című fejezetben. A minimum() függvény visszatérési értéke tehát valójában nem az int minimum, hanem az int masodikLegkisebb lesz.
Bár a main()-ben viszonylag ellenőrzött az adatbevitel (rossz adatbegépelésre a program kiírja, hogy nincsenek kiértékelhető eredmények és leáll), de számbevitelnél még nincs ellenőrzés, ezért kivétel (exception), ezáltal programleállás keletkezhet be. Teljes bemeneti adatellenőrzéssel ebben a fejezetcsomagban először a 4 alapművelet című fejezetben fogunk foglalkozni. Ám a modularitás miatt az ott publikált bekéréses és számellenőrző függvényt egy az egyben ideillesztve, szinte azonnal működőképessé tehető.
import java.util.Scanner;
import java.util.ArrayList;
public class Main {
static ArrayList<Integer> bekeres(){
Scanner in = new Scanner(System.in);
int szam = 1;
ArrayList<Integer> tomblista = new ArrayList<Integer>();
while (szam != 0){
szam = 0;
System.out.print("Adjon meg egy
számot vagy kérje végeredményt 0-val!\n");
String szamString = in.nextLine();
szam = Integer.parseInt(szamString);
tomblista.add(szam);
}
return tomblista;
}
static int minimum(ArrayList<Integer> tomblista){
int minimum = 2147483647;
int masodikLegkisebb = 2147483647;
for (int i = 0; i < tomblista.size(); i++) {
if(tomblista.get(i) < minimum){
masodikLegkisebb = minimum;
minimum = tomblista.get(i);
}
}
return masodikLegkisebb;
}
static int maximum(ArrayList<Integer> tomblista){
int maximum = 0;
for (int i = 0; i < tomblista.size(); i++) {
if(tomblista.get(i) > maximum){
maximum = tomblista.get(i);
}
}
return maximum;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int eredmeny = 0;
boolean voltMuvelet = false;
ArrayList<Integer> tomblista = new ArrayList<Integer>();
String[] menu = new String[] {"max - Maximum", "min - Minimum", "0 -
Kilépés"};
while(true) {
System.out.println("\nKérem válasszon az alábbi lehetőségekből: ");
for(int i=0; i<menu.length; i++) {
System.out.println(menu[i]);
}
String valasztas = in.nextLine();
if("max".equals(valasztas)) {
tomblista = bekeres();
eredmeny = maximum(tomblista);
voltMuvelet = true;
}
if("min".equals(valasztas)) {
tomblista = bekeres();
eredmeny = minimum(tomblista);
voltMuvelet = true;
}
if("0".equals(valasztas)) {
System.out.println("Viszlát!");
System.exit(0);
}
if(voltMuvelet == false){
System.out.println("\nNincsenek kiértékelhető eredmények. Viszlát!");
System.exit(0);
}
else{
System.out. println("Az eredmény: " + eredmeny);
}
}
}
}
Végeredmény:
Kérem válasszon az alábbi lehetőségekből:
max - Maximum
min - Minimum
0 - Kilépés
max
Adjon meg egy számot vagy kérje végeredményt 0-val!
1
Adjon meg egy számot vagy kérje végeredményt 0-val!
2
Adjon meg egy számot vagy kérje végeredményt 0-val!
3
Adjon meg egy számot vagy kérje végeredményt 0-val!
4
Adjon meg egy számot vagy kérje végeredményt 0-val!
5
Adjon meg egy számot vagy kérje végeredményt 0-val!
6
Adjon meg egy számot vagy kérje végeredményt 0-val!
0
Az eredmény: 6
Kérem válasszon az alábbi lehetőségekből:
max - Maximum
min - Minimum
0 - Kilépés
min
Adjon meg egy számot vagy kérje végeredményt 0-val!
6
Adjon meg egy számot vagy kérje végeredményt 0-val!
5
Adjon meg egy számot vagy kérje végeredményt 0-val!
4
Adjon meg egy számot vagy kérje végeredményt 0-val!
3
Adjon meg egy számot vagy kérje végeredményt 0-val!
2
Adjon meg egy számot vagy kérje végeredményt 0-val!
1
Adjon meg egy számot vagy kérje végeredményt 0-val!
0
Az eredmény: 1
Kérem válasszon az alábbi lehetőségekből:
max - Maximum
min - Minimum
0 - Kilépés
0
Viszlát!