/* * Lausekielinen ohjelmointi II. * * Luetaan opiskelijoiden harjoituspisteet tekstitiedostosta, jossa tiedot * on erotettu toisistaan pilkulla ja lasketaan pisteiden summat. * * Jorma Laurikkala (jorma.laurikkala@tuni.fi). * * Viimeksi muutettu 18.11.2020. * */ // Otetaan käyttöön Scanner-luokka java.util-pakkauksesta. import java.util.Scanner; // Otetaan käyttöön tiedostonkäsittelyyn liittyviä palveluja. import java.io.*; public class PisteidenLukija { /* * Lasketaan tekstitiedoston rivien lukumäärä melko hitaalla menetelmällä. * tiedostonNimi: tiedot sisältävän tiedoston nimi. * Paluuarvo on rivien lukumäärä, jos tiedosto voitiin lukea. Muussa tapauksessa * palautetaan -1. */ public static int laskeRivit(String tiedostonNimi) { // Esitellään ulkona try-lohkosta, jotta voidaan käyttää catch-lohkossa. Scanner tiedostonLukija = null; try { // Luodaan tiedostoon liittyvä olio. File tiedosto = new File(tiedostonNimi); // Liitetään lukija tiedostoon. tiedostonLukija = new Scanner(tiedosto); // Lasketaan rivit. int rivejä = 0; while (tiedostonLukija.hasNextLine()) { String rivi = tiedostonLukija.nextLine(); rivejä++; } // Suljetaan tiedoston lukija. tiedostonLukija.close(); // Palautetaan rivien lukumäärä. return rivejä; } catch (Exception e) { // Suljetaan tiedoston lukija tarvittaessa ja palautetaan tieto virheestä. if (tiedostonLukija != null) { tiedostonLukija.close(); } return -1; } } /* * Lasketaan harjoituspisteiden summat tekstitiedostosta, jossa tiedot * on erotettu toisistaan pilkulla. Ensimmäinen tieto on opiskelijan nimi. * tiedostonNimi: tiedot sisältävän tiedoston nimi. * Metodin paluuarvo on n x 2 -kokoinen merkkijonojen taulukko, jossa kullakin * rivillä on nimi ja pisteiden summa. Paluuarvo on null, jos tapahtuu virhe. */ public static String[][] laskePisteet(String tiedostonNimi) { // Lasketaan aluksi rivien lukumäärä, jotta voidaan luoda tulostaulukko // ennen rivien lukemista tai palata heti ongelman vuoksi. int rivejä = laskeRivit(tiedostonNimi); // Palataan heti, jos rivien laskenta epäonnistui. if (rivejä < 0) { return null; } // Luodaan taulukko. String[][] tulokset = new String[rivejä][2]; // Esitellään ulkona try-lohkosta, jotta voidaan käyttää catch-lohkossa. Scanner tiedostonLukija = null; try { // Luodaan tiedostoon liittyvä olio. File tiedosto = new File(tiedostonNimi); // Liitetään lukija tiedostoon. tiedostonLukija = new Scanner(tiedosto); // Luetaan tiedostoa rivi kerrallaan, käsitellään rivi, lasketaan // pisteiden summa ja sijoitetaan tiedot taulukkoon. int i = 0; while (tiedostonLukija.hasNextLine()) { // Luetaan tiedoston rivi. String rivi = tiedostonLukija.nextLine(); // Pilkotaan rivi osiin. Split-metodin parametri suljetaan // hakasulkeisiin, koska metodille tulee välittää säännöllinen // ilmaus. String[] osat = rivi.split("[,]"); // Lasketaan pisteiden summa. Merkkijonona esitetty luku muunnetaan // kokonaisluvuksi. int summa = 0; for (int j = 1; j < osat.length; j++) { summa = summa + Integer.parseInt(osat[j]); } // Sijoitetaan tiedot tulostaulukkoon. tulokset[i][0] = osat[0]; // nimi tulokset[i][1] = Integer.toString(summa); // pistesumma // Siirrytään tulostaulukon seuraavalle riville. i++; } // Suljetaan tiedoston lukija. tiedostonLukija.close(); // Palautetaan viite tulostaulukkoon. return tulokset; } catch (Exception e) { // Suljetaan tiedoston lukija tarvittaessa ja palautetaan tieto virheestä. if (tiedostonLukija != null) { tiedostonLukija.close(); } return null; } } public static void main(String[] args) { // Tervehditään käyttäjää ja kerrotaan ohjelmasta. System.out.println("Moi! Lasken harjoituspisteiden summat."); // Luetaan syöte Scanner-luokalla. Scanner lukija = new Scanner(System.in); System.out.println("Anna tiedoston nimi:"); String tiedostonNimi = lukija.nextLine(); // Kutsutaan metodia ja liitetään viite palautuvaan taulukko-olioon. String[][] pisteet = laskePisteet(tiedostonNimi); // Tulostetaan taulukko. if (pisteet != null) { // Kaksiulotteisen taulukon kanssa käytettäessä for-each-rakenteen // silmukkamuuttuja liittyy taulukon riviin. for (String[] rivi : pisteet) { System.out.println(rivi[0] + " " + rivi[1]); } } // Kerrotaan virheestä. else { System.out.println("Lukeminen epäonnistui!"); } } }