Gyakorlati alapok II.

Számváltás adatbázisból

 

Az az igazság, hogy ez a fejezet kilóg a Honlaptérképben fentről lefelé haladó, következetes gyakorlási sorozatból...

www.informatika-programozas.hu - Ez a programozási feladat nehéz lesz!

 

...hiszen fájlkezelés (vele kötelező kivételkezelés) található benne, amelyekkel azonban csak később fogunk találkozni. Tehát a fejezet eredményes tanulmányozásához először el kell olvasnunk és meg kell értenünk a következő fogalmakat:

Bevezetésként egy szabványos, gyakran előforduló fájlművelettel kezdjük, amely futtatható Java-kód már ismertetésre került az egyik fejezetben:

www.informatika-programozas.hu - Letöltés

adatbazis.txt (64 KB)

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

 

 

 

 

 

 

 

 

import java.io.*;

public class Main {
public static void main(String[] args) {
    FileReader reader = null;
    try {
        reader = new FileReader("D:\\adatbazis.txt");
        BufferedReader br = new BufferedReader(reader);
        String line = br.readLine();

        while(line != null) {
            System.out.println(line);
            line = br.readLine();
        }

    } catch (FileNotFoundException fnfe) {
        System.out.println("A fájl nem található!");
        fnfe.printStackTrace();
    } catch (IOException ioe) {
        ioe.printStackTrace();
    } finally {
        try {
            if (reader != null) {
                reader.close();
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
            }
        }
    }
}

 

Végeredmény:

1 = I
2 = II
3 = III
4 = IV
5 = V
6 = VI
7 = VII
8 = VIII
9 = IX
10 = X

stb.

 

Korrekt fájlmegnyitás esetén a teljes fájltartalmat az adatTomb nevű tárolótömbbe pakoljuk, amely onnan szabadon elérhetővé válik:

 

try {
    reader = new FileReader("D:\\adatbazis.txt");
    BufferedReader br = new BufferedReader(reader);
    do{
        line = br.readLine();
        adatTomb[szamlalo] = line;
        szamlalo++;
    }while(line != null);

 

Ezután szét kell választanunk az adatTomb elemeit, hiszen a bennük tárolt információ ömlesztve tárolja az arab-római számpárokat, például 8 = VIII. Ezt a split() függvény segítségével tehetjük meg, az elválasztást az = jel mentén hajtjuk végre (adatTomb[i].split("=")), amely során azonban a trim() függvényt is be kell vetnünk, hogy leválasszuk a számokról az üres szóköz (whitespace) karaktereket:

 

for(int i = 0; i < adatTomb.length; i++){
    if(adatTomb[i] != null){
        String[] temp = adatTomb[i].split("=");
        arabSzamTomb[i] = temp[0].trim();
        romaiSzamTomb[i] = temp[1].trim();
    }
}
 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

A leválasztás után a 2 tömb között az egyetlen logikai kapcsolat az lesz, hogy az összetartozó számpárok indexe azonos, például arabSzamTomb[1] és romaiSzamTomb[1], azaz 2 = II. Objektumorientált szemlélet szempontjából ez nem valami elegáns megoldás, de jelenlegi céljainknak most megfelelő.

 

Az azonos indexelés miatt a keresés könnyű: kizárólag az indexegyezések a fontosak, például:

 

for(int i = 0; i < adatTomb.length; i++){
    if(romaiSzamTomb[i] != null && romaiSzamTomb[i].equals(keresettString)){
        System.out.println(arabSzamTomb[i]);
        talalat = true;
}

 

Ha rossz adatbevitel történt vagy a keresett elem nem található, akkor erről egyszerű üzenet formájában értesítjük a felhasználót:

 

if(talalat == false){
    System.out.println("A keresett elem nem található!");
}

 

Nézzük meg a futtatható Java-kódot!

 

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

 

 

 

 

 

 

 

 

import java.io.*;

import java.util.Scanner;

public class Main{
public static void main(String[] args) {
String[] adatTomb = new String[4000];
String[] arabSzamTomb = new String[4000];
String[] romaiSzamTomb = new String[4000];
Scanner scanner = new Scanner (System.in);
FileReader reader = null;
int szamlalo = 0;
String line = null;
boolean talalat = false;

System.out.println ("Kérem, hogy adja meg a keresett arab vagy római számot!");
String keresettString = scanner.nextLine();

try {
    reader = new FileReader("D:\\adatbazis.txt");
    BufferedReader br = new BufferedReader(reader);
    do{
        line = br.readLine();
        adatTomb[szamlalo] = line;
        szamlalo++;
    }while(line != null);

    for(int i = 0; i < adatTomb.length; i++){
    if(adatTomb[i] != null){
        String[] temp = adatTomb[i].split("=");
        arabSzamTomb[i] = temp[0].trim();
        romaiSzamTomb[i] = temp[1].trim();
    }
}

for(int i = 0; i < adatTomb.length; i++){

if(romaiSzamTomb[i] != null && romaiSzamTomb[i].equals(keresettString)){
    System.out.println(arabSzamTomb[i]);
    talalat = true;
}
else if(arabSzamTomb[i] != null && arabSzamTomb[i].equals(keresettString)){
    System.out.println(romaiSzamTomb[i]);
    talalat = true;
    }
}

if(talalat == false){
    System.out.println("A keresett elem nem található!");
}

} catch (FileNotFoundException fnfe) {
    System.out.println("A fájl nem található!");
    fnfe.printStackTrace();
} catch (IOException ioe) {
    ioe.printStackTrace();
} finally {
try {
    if (reader != null) {
    reader.close();
    }
} catch (IOException ioe) {
    ioe.printStackTrace();
        }
    }
    }
}

 

Végeredmény:

Kérem, hogy adja meg a keresett arab vagy római számot!
CCXXXIV
234

 

Most pedig nézzük meg a fenti probléma objektumorientált-közeli megvalósítását!

 

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

 

 

 

 

 

 

 

 

import java.io.*;
import java.util.Scanner;

public class Main {
public static ArabRomai[] szamok = new ArabRomai[4000];

public static void init() throws IOException {
    Scanner scanner = new Scanner(System.in);
    FileReader reader = null;
    int szamlalo = 0;
    String line = null;
    reader = new FileReader("D:\\adatbazis.txt");
    BufferedReader br = new BufferedReader(reader);

    do {
        line = br.readLine();
            if (line == null) {break;}
            String[] tmp = line.split("=");
            szamok[szamlalo] = new ArabRomai(Integer.parseInt(tmp[0].trim()), tmp[1].trim());
            szamlalo++;
        } while (line != null);
    br.close();
}

public static int getArabByRomai(String romai) {
    for (int i = 0; i < szamok.length; i++) {
    if (szamok[i] != null && szamok[i].getRomaiSzam().equals(romai)) {
        return szamok[i].getArabSzam();
        }
    }
    System.out.println("Nem található a szám: " + romai);
    return -1;
}

public static String getRomaiByArab(int arab) {
    for (int i = 0; i < szamok.length; i++) {
    if (szamok[i] != null && szamok[i].getArabSzam() == arab) {
        return szamok[i].getRomaiSzam();
        }
    }
    System.out.println("Nem található a szám: " + arab);
    return "Nem található a szám.";
}

public static void main(String[] args) {
    try {
        Main.init();
        System.out.println( Main.getArabByRomai("X"));
        System.out.println( Main.getRomaiByArab(127));
        System.out.println( Main.getArabByRomai("MIMI"));
        } catch (IOException e) {
        e.printStackTrace();
        }
    }
}

 

Végeredmény:

10

CXXVII

Nem található a szám: MIMI

-1