Gyakorlati alapok
Kerekítés - gombolyítás
Egy internetes érdeklődő pénzalapú számkerekítések algoritmusának megírására kért segítséget. A kiindulási pontok -amelyek, amint az később kiderült, vizsgafeladatok-, a következők voltak:
-
tömb méretének előzetes bekérése (tomb[elemszam]),
-
elemekkel való feltöltése,
-
elemeinek egy másik tömbbe (tomb2[elemszam]) való átmásolása és a kerekítési szabályok szerinti módosítása,
-
illetve a kerekítési metódust külön függvénybe kellett illeszteni.
A fenti megoldás 4. pontos implementációját nem itt, hanem a Gyakorlati alapok II. (main() + külön eljárás / függvény) című fejezetcsomagban tanulmányozhatjuk ( Kerekítés - gombolyítás külön függvényeskedéssel című fejezet). Ebben a fejezetben még mindent -híven a jelen fejezetcsomag alapelveihez-, a main() főprogram alatt dolgozunk ki.
A kerekítésnek a HUF jelenlegi (2018-as) kerekítési szabályai szerint kellett működnie:
-
ha az összeg utolsó számjegye kisebb 2.5-nél, 10-re lefelé kerekítünk,
-
ha az összeg utolsó számjegye nagyobb 2.5-nél, de kisebb 5-nél, 5-re felfelé kerekítünk,
-
ha az összeg utolsó számjegye nagyobb 5-nél, de kisebb 7.5-nél, 5-re lefelé kerekítünk,
-
ha az összeg utolsó számjegye nagyobb 7.5-nél, 10-re felfelé kerekítünk.
Az alapalgoritmust természetesen többféleképpen is meg tudjuk oldani. Én első körben a problémát "kézi" módszerrel oldottam meg: ekkor a számjegy mindenkori utolsó digitjének vizsgálatára és sok if-else elágazásra van szükségem:

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Kérem a tömb elemszámát: \n");
int elemszam = scanner.nextInt();
int[] tomb = new int[elemszam];
System.out.println("Kérem a tömb elemeit:");
for (int i = 0; i < tomb.length; i++) {
System.out.print((i + 1) + ". elem:
");
tomb[i] = scanner.nextInt();
}
scanner.close();
System.out.println();
int [] tomb2 = new int[elemszam];
for(int i = 0; i < tomb2.length; i++) {
char c = ' ';
String s = Integer.toString(tomb[i]);
if(tomb[i] % 10 >= 1) {
c = s.charAt(s.length()
- 1);
}
else if(tomb[i] % 10 < 1) {
c = s.charAt(0);
}
String szamString =
Character.toString(c);
double szam = Double.parseDouble(szamString);
if (tomb[i] % 5 == 0) {
tomb2[i] =
tomb[i];
System.out.println((i + 1) + ". elem (" + tomb[i] + ")
nem kerekítve: " +
tomb2[i]);
continue;
}
else if(szam < 2.5) {
tomb2[i] =
tomb[i] - (int)szam;
System.out.println((i + 1) + ". elem (" + tomb[i] + ")
lefelé kerekítve: " + tomb2[i]);
continue;
}
else if(szam > 2.5 && szam < 5) {
tomb2[i] = (tomb[i]
- (int)szam) + 5;
System.out.println((i + 1) + ". elem (" + tomb[i] + ")
felfelé kerekítve: " +
tomb2[i]);
continue;
}
else if(szam > 5 && szam < 7.5) {
tomb2[i] = (tomb[i]
- (int)szam) + 5;
System.out.println((i + 1) + ". elem (" + tomb[i] + ")
lefelé kerekítve: " +
tomb2[i]);
continue;
}
else {
tomb2[i] = (tomb[i] - (int)szam) +
10;
System.out.println((i + 1) + ". elem
(" + tomb[i] + ")
felfelé kerekítve: " + tomb2[i]);
}
}
}
}
Végeredmény:
Kérem a tömb elemszámát:
10
Kérem a tömb elemeit:
1. elem: 10
2. elem: 21
3. elem: 32
4. elem: 43
5. elem: 54
6. elem: 65
7. elem: 76
8. elem: 87
9. elem: 98
10. elem: 109
1. elem (10) nem kerekítve: 10
2. elem (21) lefelé kerekítve: 20
3. elem (32) lefelé kerekítve: 30
4. elem (43) felfelé kerekítve: 45
5. elem (54) felfelé kerekítve: 55
6. elem (65) nem kerekítve: 65
7. elem (76) lefelé kerekítve: 75
8. elem (87) lefelé kerekítve: 85
9. elem (98) felfelé kerekítve: 100
10. elem (109) felfelé kerekítve: 110
Az internetes érdeklődő azonban később jelezte, hogy ez neki nem jó, mert a feladatban szerepel a matematikai osztályban található round() függvény kötelező használata is. Ismerve ezen függvény működését, a feladat első pillanatra lehetetlennek tűnik, de kis matematikai molyolással és kasztolással (típuskényszerítéssel) mégis kivitelezhető:
Math.round(((float)szam) / 5) * 5;
A keletkezett, futtatható Java-kód a következő:

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Kérem a tömb elemszámát: \n");
int elemszam = scanner.nextInt();
int[] tomb = new int[elemszam];
System.out.println("Kérem a tömb elemeit:");
for (int i = 0; i < tomb.length; i++) {
System.out.print((i + 1) + ". elem:
");
tomb[i] = scanner.nextInt();
}
scanner.close();
System.out.println();
int [] tomb2 = new int[elemszam];
for(int i = 0; i < tomb2.length; i++) {
char c = ' ';
String s = Integer.toString(tomb[i]);
if(tomb[i] % 10 >= 1) {
c = s.charAt(s.length()
- 1);
}
else if(tomb[i] % 10 < 1) {
c = s.charAt(0);
}
String szamString =
Character.toString(c);
int szam = Integer.parseInt(szamString);
if (tomb[i] % 5 == 0) {
tomb2[i] =
tomb[i];
System.out.println((i + 1) + ". elem (" + tomb[i] + ")
nem kerekítve: " +
tomb2[i]);
continue;
}
else {
tomb2[i] = (tomb[i]
- szam) + Math.round(((float)szam) / 5) * 5;
System.out.println((i + 1) + ". elem (" + tomb[i] + ") kerekítve: " +
tomb2[i]);
}
}
}
}
Végeredmény:
Kérem a tömb elemszámát:
10
Kérem a tömb elemeit:
1. elem: 10
2. elem: 21
3. elem: 32
4. elem: 43
5. elem: 54
6. elem: 65
7. elem: 76
8. elem: 87
9. elem: 98
10. elem: 109
1. elem (10) nem kerekítve: 10
2. elem (21) kerekítve: 20
3. elem (32) kerekítve: 30
4. elem (43) kerekítve: 45
5. elem (54) kerekítve: 55
6. elem (65) nem kerekítve: 65
7. elem (76) kerekítve: 75
8. elem (87) kerekítve: 85
9. elem (98) kerekítve: 100
10. elem (109) kerekítve: 110
A fenti kódok külön függvényes megoldásait a Kerekítés - gombolyítás külön függvényeskedéssel című fejezetben tanulmányozhatók.

