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:

  1. tömb méretének előzetes bekérése (tomb[elemszam]),

  2. elemekkel való feltöltése,

  3. elemeinek egy másik tömbbe (tomb2[elemszam]) való átmásolása és a kerekítési szabályok szerinti módosítása,

  4. 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:

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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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ő:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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.