2020. február 15., szombat

Hálózati operációsrendszerek fogalmai elmélete

Hálózati oprendszer:

 Erőforrás-megosztás, Kommunikációs közeg,Adatok biztonsága

Hálózati kiszolgáló vagy szerver ami olyan számítógép, amely valamilyen erőforrást vagy szolgáltatást nyújt (megoszt) a clienseknek felhasználóknak usereknek, csomópontoknak és munkaállomásokról (ügyfél- vagy kliens-számítógép: a szerver által nyújtott szolgáltatásokat igénylő vagy használó számítógép.
•    Az egyenrangú („peer-to-peer") modellben a hálózat valamennyi számítógépe képes szolgáltatásokat nyújtani (erőforrásokat felajánlani) a többi számítógép számára és ugyanakkor használni (igényelni) más csomópontok által kínált szolgáltatásokat. Erre a modellre tehát az jellemző, hogy nincs kitüntetett számítógép: mindenki lehet szerver és munkaállomás - akár azonos időben is!
•    A hierarchikus (ügyfél-kiszolgáló, „server-client") modellben ezzel szemben minden esetben van egy (vagy több) kitüntetett szerepű számítógép (a szerver), „aki" a hálózati szolgáltatásokat kizárólagosan birtokolja - a hálózat többi számítógépe (a munkaállomások) csak a szerver által felajánlott szolgáltatásokat használhatja. (Ez persze azt is jelenti, hogy amennyiben két munkaállomás kommunikálni (pl. adatot cserélni,) szeretne egymással, ezt is csak a szerveren keresztül tehetik meg!) Ebben a modellben további kategorizálásra ad lehetőséget, ha
o    Azt is megvizsgáljuk, hogy a szerver (a hálózat kiszolgálásán és felügyeletén túl) milyen feladatok elvégzésére képes: dedikált szerver esetében semmilyen egyéb tevékenységet nem folytat (azaz felhasználói értelembe vett „munkát" nem végezhetünk rajta), a nem dedikált szerver a hálózat vezérlésén túl teljes értékű munkaállomásként is működik („kettő az egyben").
o    Azt is megvizsgáljuk, hogy a munkaállomás mennyire alkalmas önálló (hálózati kapcsolat nélküli) munkavégzésre: azokat a munkaállomásokat, amelyek csak a szerver erőforrásai birtokában tudnak valamilyen feladatot ellátni (megkülönböztetendő a hálózatba kapcsolt önálló számítógépektől) terminálnak nevezzük (ebben a megközelítésben a kiszolgálót is szokás „host"-ként emlegetni).
A két modell között (természetesen) számos eltérés van, azonban mégsem állíthatjuk azt, hogy az egyik vagy a másik jobb lenne. A használhatóságukat minden esetben az igények és a rendelkezésre álló források határozzák meg: az egyenrangú hálózat kiépítése olcsóbb, kihasználhatósága hatékonyabb (nem kell egy plusz - általában (a munkaállomásokhoz képest) nagyobb hardverigénnyel rendelkező (és adott esetben effektív munkavégzésre nem is használható) számítógépet beszerezni), a hierarchikus hálózat felügyelete egyszerűbb (egyetlen számítógépen (a szerveren) kell csak a beállításokat elvégezni), nagyobb a rendszer biztonsága (centralizált mentés, központi vírus- és betörésvédelem), rugalmasabb munkavégzést tesz lehetővé (felhasználók nagyobb szabadsággal használhatják a hálózat bármely munkaállomását.

Szolgáltatások

Hálózati szolgáltatások 

A hálózati operációs rendszerek többletszolgáltatásai (a hagyományos operációs rendszerekhez képest) a több felhasználói igény kiszolgálása köré szerveződnek. A legfontosabbak ezek közül:
•    Erőforrások megosztása: hozzáférés biztosítása a számítógép valamely lokális (saját: fizikailag az adott számítógéphez csatlakozó) erőforrásához (és a helyi hálózatok esetében ez szinte bármilyen típusú erőforrás lehet: hardveres (memória, háttértár, nyomtató) vagy szoftveres (program vagy adat)) a hálózat más számítógépei számára. A megosztott erőforrások használata a felhasználó felé transzparens módon valósul meg - azaz a felhasználó nem érzékel különbséget aközött, hogy saját számítógépével vagy a hálózaton található erőforrással dolgozik. A helyi hálózatokban leggyakrabban megosztott hardveres erőforrások tehát a háttértárak (merevlemez, illetve az itt tárolható állományok és könyvtárak) és a nyomtatók.
•    Jogosultságok kezelése: a megosztások kezelésével egyidejűleg felmerül egy olyan probléma, amely egy-felhasználós környezetben nem jelentkezik: nevezetesen a hozzáférés kérdése. Egyrészt, a közös tárolásnak csak akkor van értelme, ha a kiszolgáló által biztosított háttértárat minden, a hálózatba bekapcsolt számítógépről elérhetjük - másrészt viszont jogos elvárás az is, hogy bizonyos anyagokat ugyanolyan bizalmasan (másoktól védetten) kezelhessünk, mintha a saját számítógépünkön tárolnánk. Egyszerre legyen tehát nyilvános és privát...
Jogosultságoknak nevezzük a hálózat azonosított felhasználói és az egyes erőforrásokkal végezhető tevékenységek körét.
•    Hozzáférés: a hálózati megosztások közös jellemzője, hogy azonosításukra olyan módszert kell alkalmazni, amelyet a hálózat valamennyi számítógépe képes értelmezni: legegyszerűbben a megosztott erőforrások egyedi névvel rendelkeznek. A névadás szabályai esetenként változhatnak, azonban pont az egységesség miatt létezik egy szabvány, az UNC, amivel szinte minden rendszerben azonos módon hivatkozhatunk megosztott erőforrásra. Az UNC szintaxisa a következő: \\szerver\erőforrás, ahol a „szerver" annak a számítógépnek a hálózati azonosítója, ahol közvetlenül (fizikailag) létezik a megosztott erőforrás („aki megosztja"), az „erőforrás" a megosztott objektum hálózati megnevezése (aminek nem kell megegyezni a szerveren használt (tényleges) elnevezéssel!).

•    Felhasználói információk kezelése: a hálózati operációs rendszerben alapvetés, hogy egy olyan rendszerről van szó, amelyet több felhasználó használ. Ez pedig számos kérdést vet fel:
o    meg kell tudni különböztetni az egyes felhasználókat egymástól,     de célszerű a hálózat jogosult felhasználóit megkülönböztetni azoktól, akik nem használhatják az adott hálózat szolgáltatásait,
o    biztosítani kell az időben azonos hozzáférés lehetőségét,     de egyszerre legfeljebb csak egy bizonyos számú felhasználó kérését kiszolgálva (sem a számítógép műveletvégző képessége, sem az adatátviteli csatorna szélessége nem végtelen...),
o    célszerű külön választani az egyes felhasználók által elérhető erőforrásokat,   de úgy, hogy közben lehetőséget kell adni a felhasználóknak arra, hogy igény szerint akár kicserélhessék adataikat egymással, stb.

A gyakorlatban a felhasználók megkülönböztetésére valamilyen szöveges azonosítót szokás használni, ez az adott felhasználó adott hálózatra érvényes felhasználói neve („user name"). A felhasználói fiókok biztonságának fokozása érdekében a hálózati rendszerek (szinte minden esetben) az azonosításhoz egy ellenőrző kódot is megkövetelnek (jelszó, „password"). Ez a jelszó (elvileg) csak a felhasználó által ismert, és ily módon garantálja, hogy az adott felhasználói név alatt ténylegesen csak bizonyos személy használhassa a hálózat erőforrásait. (Megjegyzés: az olyan rendszerekben, ahol az egyértelmű azonosítás fontos követelmény, a felhasználói név és jelszó (ismeret alapú azonosítás) helyett gyakran alkalmaznak ún. birtoklás alapú azonosítási rendszereket (ilyenek pl. a bankkártyák), illetve ma már léteznek tulajdonság alapú azonosítási rendszerek (biometriai azonosítók, pl. ujjlenyomat) is.)
Azt a folyamatot, amely során a felhasználó azonosító adatait megadja illetve azt a hálózati kiszolgáló ellenőrzi, azonosításnak („authentication"), a sikeres ellenőrzést követően a hálózati kapcsolat kiépítését és a megfelelő hálózati szolgáltatások helyreállítását pedig bejelentkezésnek („log in") nevezzük. Természetesen a hálózati munkavégzés befejezésekor a hálózati kapcsolatot illik (ne fogjunk feleslegesen erőforrásokat mások elől!) és célszerű (biztonsági okokból) lebontani, ez a kijelentkezés („log out") folyamat.


2020. február 11., kedd

Gyakorlati feladat otthonra virtuálboxban

Munkahelyén azt a feladatot kapta, hogy helyezzen üzembe egy új szervert, majd telepítse fel és konfigurálja a cég által megvásárolt hálózati operációs rendszert az alábbiak szerint. A szerver éles használatát megelőzően tesztelje le a szolgáltatások hibátlan működését egy kliens számítógépen!

Microsoft Windows 2016 Server telepítése:

Hozzon létre egy 40 GB-os elsődleges partíciót, majd tegye aktívvá. Formázza meg a partíciót NTFS rendszerűvé!
♦Telepítse fel a Windows 2016 Server hálózati operációs rendszert a számítógépre!
♦A telepítést a következő telepítési információk megadásával végezze:
számátógépnév: vizsla14
rendszergazda jelszó: admin14
♦Konfigurálja a TCP IP beállításokat az alábbiak szerint:
IPcím 192.168.56.1
Alhálózati maszk:255.255.255.0
Átjáró: 192.168.56.1
DNS kiszolgáló (elsődleges): 192.168.56.1
❖ Telepítse fel az alábbi hardvereszközök programjait és végezze el a konfigurálásukat:
monitorvezérlő kártya (VGA)
alaplapi chipkészlet
hangkártya (sound card)

Címtárszolgáltatás (Active Directory) telepítése, felhasználókezelés:

Telepítse fel az AD-t egy új gyökértartomány, első tartományvezérlőjeként, új erdőben wmk.local.hu tartomány névvel! A címtár visszaállítási jelszava legyen AbC123.
Hozzon létre egy felhasználok nevű szervezeti egységet a tartomány gyökerében, és azon belül az alábbi csoportokat:
tanárok (globális csoport)
diakok (univerzális csoport)
egyeb_dolgozok (globális csoport)

Hozzon létre 2 felhasználót a tanárok csoportban! (tanar0l, tanar02)
a tanárok jelszavai: (tanarlB, tanar2B)
a tanárok a jelszavukat meg tudják változtatni
Atanárok hétköznapokon 7-18 óráig, szombaton és vasárnap pedig egyáltalán nem jelentkezhetnek be
A tanárok ne telepíthessenek frissítéseket (Windows Update) és ne érhessék el a billentyűzet beállításait
Engedélyezze  a távoli asztali kapcsolatot.
Telepítse a DHCP kiszolgálót.
Telepítsen webkiszolgálót.
Windows Szerver telepítése(DHCP, Tatományvezérlés, DNS, Active Directory)(Group policy, Megosztások, DFS, Web-szerver, FTP-szerver)

B1 feladat

Munkahelyén azt a feladatot kapta, hogy helyezzen üzembe új szervert egy meglévő számítógép hardveres bővítésével, majd telepítse fel a cég által megvásárolt hálózati operációs rendszert, internetes szolgáltatásokkal az alábbiak szerint.
Határozza meg a meglévő konfigurációt, majd tegyen javaslatot a bővítésre és hajtsa végre a bővítést:
Cserélje ki a meglévő merevlemezt a javasoltra!
Cserélje ki a CD-meghajtót DVD-meghajtóra!
Bővítse a memóriát a javasoltra!
Helyezze üzembe a szervert és perifériáit:
Csatlakoztassa a számítógéphez a perifériákat (monitor, billentyűzet, egér, nyomtató, hangfalak)!
Csatlakoztassa a számítógépet UPS-n keresztül az elektromos hálózatra!
A megfelelő kábel kiválasztásával csatlakoztassa a szervert a cég számítógépes hálózatára!
Kapcsolja be a gépet, majd végezze el a BIOS SETUP-ban az alábbi beállításokat:
Dátum/idő ellenőrzése, szükség esetén beállítása
Boot sorrend beállítása:
Elsődleges: DVD-meghajtó
Másodlagos: HDD-meghajtó
Állítson jelszavas védelmet (jelszó: NSZFI2009)!
Mentse el a beállításokat!

Microsoft Windows 2016 Server telepítése:
Hozzon létre egy 10 GB méretű elsődleges partíciót, és tegye aktívvá! Formázza meg a létrehozott partíciót FAT32 típusúra!
Telepítse fel a Windows 2016 Server operációs rendszert a gépére! Telepítéskor konvertálja a partíciót NTFS fájlrendszerűvé!
A telepítést a következő telepítési információk megadásával végezze (’x’ a számítógép számát jelöli, a vizsgáztató adja meg):
Név: NSZFI
Szervezet: HW-SW
Számítógépnév: HW-SW-x
Rendszergazda jelszó: NSZFI2009
Munkacsoport neve: HW-SW
Konfigurálja be a TCP/IP protokollt az alábbiak szerint:
IP-cím: 192.168.1.2
Alhálózati maszk: 2055.255.255.0
Átjáró: 192.168.1.1
DNS kiszolgáló: 192.168.1.1
Telepítse fel az alábbi hardvereszközök meghajtó programjait és végezze el a konfigurálásukat:
monitorvezérlő kártya
alaplapi csipkészlet
hangkártya
Active Directory telepítése, felhasználó-kezelés
Telepítse fel az Active Directory-t egy új gyökértartomány, első tartomány-vezérlőjeként, új erdőben, nszfi-x.hu tartomány névvel!
Hozza létre a „Mérnökök” nevű szervezeti egységet a tartomány gyökerében és azon belül az alábbi csoportokat:
globális csoport: Informatikusok
univerzális csoport: Nyomtatás
A Nyomtatás csoport tagjai a következők legyenek:
Informatikusok
Tartományi rendszergazdák
Tartomány minden felhasználója
Hozzon létre az Informatikusok globális csoportba tartozó 2 felhasználót „Hálózatos” és „Hardveres” felhasználói névvel a következők figyelembevételével:
Minden felhasználónak legyen saját munkakönyvtára a MUNKA mappán belül! Ez hálózaton keresztül a Z: meghajtó betűjel alatt elérhető legyen!
A Hardveres felhasználó csak hétköznap 8-18 óra között tudjon bejelentkezni!
A minimális jelszóhossz 8 karakter, a hibás kísérletezések száma 4 legyen!
Hozzon létre INFO nevű mappát és állítson be olvasási megosztási jogot a tartományi felhasználóknak!
Telepítse fel a csatlakoztatott nyomtatót! Végezze el a telepített nyomtató megosztását és állítsa be a Nyomtatás csoportnak a nyomtatási jogot!
Internetes szolgáltatások
Telepítse fel a Microsoft Internet Information Server WWW és FTP szerver szolgáltatását!
Hozza létre a Web szerver gyökérkönyvtárában az alábbi könyvtárszerkezetet:
Hálózat
Hardver
Munka
Készítsen minden könyvtárba egy egyszerű weblapot, és ezek a szerver nyitólapjáról is legyenek elérhetők!
Oldja meg, hogy a Munka könyvtárban lévő lapot csak a tartomány felhasználói érhessék el!
Az előző feladatban létrehozott INFO nevű mappát vegye fel virtuális könyvtárként ~public néven és oldja meg, hogy hitelesítés nélkül mindenki elérje! Ebben a könyvtárban is helyezzen el egy egyszerű weblapot!
Oldja meg, hogy az INFO nevű mappába, FTP szolgáltatáson keresztül az Informatikusok csoportnak feltöltési joga is legyen!

2020. február 10., hétfő

Java mintaprogramok

 ----------------------------
Kérjen be egy számot, majd írja ki eddig a számig az összes prímszámot!
----------------------------
import extra.*;
public class Gyak1_6{
  public static void main(String[]args){
    int a, hatar;
    boolean prim;
    hatar=Console.readInt("Meddig: ");
    for(a=2;a<=hatar;a++){
      prim=true;
      for(int i=2; i<=Math.sqrt(a)&prim; i++)
        if(a%i==0) prim=false;
      if(prim) System.out.print(a+"  ");
    }
  }
}

----------------------------
Írjuk ki a tökéletes számokat (osztóinak összege – kivéve magát a számot – megegyezik 
a számmal, pl. 6) N-ig a képernyőre!
------------------------------
 import extra.*;
public class Gyak1_7{
  public static void main(String[]args){
    int n=Console.readInt("N: ");
    for(int i=1;i<=n;i++){
      int osszeg=0;
      for(int j=1;j<=i/2;j++)
        if(i%j==0) osszeg+=j;
      if(osszeg==i)    
        System.out.println(i+" ");
    }
  }
}

----------------------------
 
Gömb felszíne és térfogata! 
 ----------------
 
 import extra.*;

public class Gyak1_1{
  public static void main(String [] args){
    double r, f, v;
    r = Console.readDouble("A gomb sugara: ");
    f = 4 * r * r * Math.PI;
    v = 4 * Math.pow(r,3) * Math.PI / 3;
    //vagy: v = 4 * r *r * r * Math.PI / 3;
    System.out.println("A gomb felszine: " + f);
    System.out.println("A gomb terfogata: " + v);
  }
}

----------------------------
Adott pénzösszeget kap, írja ki, hogy milyen címletekben lehet minimális 
számú pénzzel kifizetni úgy, hogy 5000, 1000, 500, 100-as cimletek vannak!
----------------------- 
 import extra.*;

public class Gyak1_2{
  public static void main(String[] args){
    int cimlet1=5000, cimlet2=1000, cimlet3=500, cimlet4=100;
    int db1, db2, db3, db4;
    int osszeg=Console.readInt("A penzosszeg: ");
    db1=osszeg/cimlet1;
    osszeg%=cimlet1;
    db2=osszeg/cimlet2;
    osszeg%=cimlet2;
    db3=osszeg/cimlet3;
    osszeg%=cimlet3;
    db4=osszeg/cimlet4;
    System.out.println(cimlet1+": "+db1+" db");
    System.out.println(cimlet2+": "+db2+" db");
    System.out.println(cimlet3+": "+db3+" db");
    System.out.println(cimlet4+": "+db4+" db");
  }
}

----------------------------
 Kap két számot hasonlítsa össze,írja ki melyik a nagyobb vagy kisebb vagy egyenlő!
 
 ----------------------
import extra.*;

public class Gyak1_3 {
  public static void main(String[] args) {
    long fizFonok = Console.readLong("Fonokenek fizetese: ");
    long fizSajat = Console.readLong("On fizetese: ");
    if (fizFonok > fizSajat)
      System.out.println("A fonok fizetese nagyobb, ez nem meglepo!");
    else if (fizFonok < fizSajat)
      System.out.println("Tobbet keresek, mint a fonok!");
    else
      System.out.println("Ugyanannyit keresek, mint a fonok!");
  }
}

----------------------------
Ezen a  héten mennyi kalóriát fogyasztottunk az egyes napokon. 
összesen és átlagosan!
 
----------------------------
 import extra.*;

public class Gyak1_4 {
  public static void main(String[] args) {
    int osszes=0;
    double atlag;
    for(int i=1;i<=7;i++)
      osszes+=Console.readInt(i+". napi kaloriafogyasztas: ");
    atlag=osszes/7.;
    System.out.println("Heti kaloriafogyasztas: "+osszes);
    System.out.println("Napi atlag: "+atlag);
  }
}

----------------------------
Olvasson be osztályzatokat 0 végjelig, majd számolja meg, hány 5-ös volt közöttük, és az átlagot!
-----------------------------
import extra.*;

public class Gyak1_5 {
  public static void main(String[] args) {
    int jegy,sum=0,n=0,jeles=0;
    double atlag;
    jegy=Console.readInt("Jegy: ");
    while(jegy!=0){
      sum+=jegy;
      n++;
      if(jegy==5) jeles++;
      jegy=Console.readInt("Jegy: ");
    }
    atlag=1.0*sum/n;
    System.out.println("Jelesek szama: "+jeles);
    System.out.println("A jegyek atlaga: "+atlag);
  }
}

----------------------
Készítsen egy KaveAutomata osztályt, melynek adatai: kávémárka, ár (Ft/dl), a tartályban lévő mennyiség, 
a tartály kapacitása. A konstruktor paramétereken keresztül inicializálja a fajtát, az árat és a kapacitást, 
a tartály legyen tele. Készítse el az alábbi metódusokat:
- beállító és lekérdező metódusok az árra.
- vesz: paraméterként adhatjuk meg, hogy hány dl-t veszünk, visszatérési érték a fizetendő összeg. 
  Ha nincs a venni kívánt mennyiség a tartályban, akkor -1 legyen a visszatérési érték.
- feltölt: tele tölti a tartályt, visszatérési értéke a betöltött mennyiség.
- toString: az összes adat kiírására.
A vezérlő KaveProgram osztályban hozzon létre egy KaveAutomata osztályú objektumot, majd szimulálja a működését.
----------------------------

import extra.*;

class KaveAutomata{
  private String marka;
  private double ar;
  private double mennyiseg;
  private double kapacitas;
  
  public KaveAutomata(String marka, double ar, double kapacitas){
    this.marka = marka;
    this.ar = ar;
    this.kapacitas = kapacitas;
    mennyiseg = kapacitas;
  }

/* vagy
  public KaveAutomata(String aMarka, double aAr, double aKapacitas){
    marka = aMarka;
    ar = aAr;
    kapacitas = aKapacitas;
    mennyiseg = kapacitas;
  }
*/  

  public double getAr(){
    return ar;
  }

  public void setAr(double ar){
    this.ar = ar;
  }

//a feledatspecifikációban nem szereplő plussz metódus  
  public double getMennyiseg(){
    return mennyiseg;
  }
  
  public double vesz(double menny){
    if (menny<=mennyiseg){
      mennyiseg-=menny;
      return menny*ar;
    }
    else{
      return -1;
    }
  }
  
  public double feltolt(){
    double kell=kapacitas-mennyiseg;
    mennyiseg=kapacitas;
    return kell;
  }
  
  public String toString(){
    return "\nMarka: "+marka+"\nAr: "+ar+"\nKapacitas: "+kapacitas+
      " Mennyiseg: "+mennyiseg;
  }

}

public class KaveProgram{
  private KaveAutomata automata;
  
  public KaveProgram(){
    automata = new KaveAutomata("Omnia",100,50);
  }
  
  public void vezerel(){
    double fiz;
    do{
      fiz = automata.vesz(Console.readDouble("Hany decit: "));
      if (fiz!=-1){
        System.out.println(fiz+" Ft-ot kell fizetnie");
      }else{
        System.out.println("Nincs annyi");
      }
      System.out.println(automata);
    }while(automata.getMennyiseg()>1);
    System.out.println("Feltoltes "+automata.feltolt()+" dl");
  }


  public static void main(String[] args) {
    KaveProgram kaveProgram  = new KaveProgram();
    kaveProgram.vezerel();
  }
}
    
---------------------------------------------------
Forma 1 autóversenypályát akarjuk szimulálni. Készítsen egy Auto osztályt, melynek adatai: 
rendszám, x pozíció, y pozíció, szög. A konstruktor paramétereken keresztül inicializálja 
a rendszámot, x pozíciót, y pozíciót, a szöget állítsa 0-ra. Készítse el az alábbi metódusokat:
- beállító és lekérdező metódusok a rendszámra.
- megy: az autó az aktuális irányában a paraméterként megadott távolságot tegye meg.
- fordul: a paraméterként megadott szöggel forduljon el.
- toString: a rendszám és a pozíció kiírására.
A vezérlő Terepasztal osztályban hozzon létre két Auto osztályú objektumot, majd szimulálja azok működését.  
---------------------------------------------------
    
class Auto{
  
  private String rendszam;
  private int x, y, iranyszog;
  
  public Auto(String rendszam, int x, int y){
    this.rendszam = rendszam;
    this.x = x;
    this.y = y;
    iranyszog = 0;
  }
  
  public void setRendszam(String aRendszam){
    rendszam = aRendszam;
  }
  
  public String getRendszam(){
    return rendszam;
  }
  
  public void megy(int tav){
    x += tav * Math.cos(Math.toRadians(iranyszog));
    y += tav * Math.sin(Math.toRadians(iranyszog));
  }
  
  public void fordul(int szog){
    iranyszog += szog;
  }
  
  public String toString(){
    return rendszam+" pozicioja: ("+x+", "+y+")";
  }
  
}

public class Terepasztal{
  private Auto auto1, auto2;
  
  public Terepasztal(){
    auto1 = new Auto("ABC123",10,20);
    auto2 = new Auto("XYZ123",0,0);
  }
  
  public void vezerel(){
    System.out.println(auto1+"\n"+auto2+"\n");
    auto1.megy(10);
    System.out.println(auto1+"\n"+auto2+"\n");
    auto1.fordul(30);
    System.out.println(auto1+"\n"+auto2+"\n");
    auto1.megy(20);
    System.out.println(auto1+"\n"+auto2+"\n");
    auto2.fordul(150);
    System.out.println(auto1+"\n"+auto2+"\n");
    auto2.megy(20);
    System.out.println(auto1+"\n"+auto2+"\n");
  }
  
  public static void main(String [] args){
    Terepasztal terepasztal = new Terepasztal();
    terepasztal.vezerel();
  }
}




2020. február 6., csütörtök

Jáva programozás órai feladat

NB-es labdarúgó-bajnokság mérkőzéseinek adatait tartalmazó fájl alapján válaszolunk a kérdésekre. A program sok metódusa igényli a java.io és a java.util osztályok alosztályait, amelyek alapértelmezésben nincsenek implementálva, ezért a program elején importálni kell azokat, tömbök használatával kell megvalósítani a feladatokat.
      
1. feladat:
    Olvassuk be a meccs.txt fájlban található adatokat! Tárolásukra két tömböt fogunk használni, mivel az adatok egy része egész számokat, másik része szöveget tartalmaz. Alkalmazzuk a "tömb a tömbben" módszert, mivel adategységenként (az inputfájl egy-egy sora) 5 szám- és 2 szövegadat tárolásáról kell gondoskodnunk. A tömböket statikus osztályváltozókként definiáljuk, mivel a későbbiekben egy saját metódussal - MaxMin()- fogunk hivatkozni rájuk.

   A megoldás a mérkőzések számának beolvasásával kezdődik, majd soronként feldolgozzuk az inputfájlt. Ez a StringTokenizer osztály metódusainak segítségével (a sort a szóközök mentén feldarabolva) könnyen megvalósítható. Figyeljük meg, hogy a tömbök indexelése 0-tól kezdődik!

    A nextToken() metódus stringet ad vissza, ezért a számoknál a konvertáláshoz igénybe kell venni az Integer osztály parseInt() metódusát.

2. feladat:
    Egy forduló sorszámát bekérve írjuk ki a képernyőre az adott forduló mérkőzéseinek adatait a megadott formában.

    A billentyűzet inputhoz jól használható a Scanner osztály. A kiírás formátumának beállítása aprólékos munkát igényel, de szerencsére a System.out.println() metódus támogatja a szám- ill. szövegváltozók vegyes használatát.

3. feladat:
    Azokat a csapatokat (és a forduló sorszámát) kell kiíratni a képernyőre, amelyek megfordították a mérkőzés állását, tehát a félidőben még vesztésre állva a mérkőzést a végén megnyerték.

    Az összetett feltételvizsgálat oka az, hogy mind a hazai-, mind a vendégcsapat szempontjából meg kell vizsgálnunk a mérkőzések félidei- és végeredményét.

4. feladat:
    Egy csapat nevét kell bekérni a felhasználótól, majd (ez esetben egy csn változóban) eltárolva felhasználni a következő feladatok megoldásához.


5. feladat:
    Az adott csapat által lőtt és kapott gólokat kell összesítve megjeleníteni, tehát a lekérdezés szűrőfeltétele a csapat neve. Ne feledjük, hogy egy csapat hazaiként és vendégként is szerepelhet egy mérkőzésen, és csak a mérkőzések végeredményét kell összesíteni!

    Figyeljük meg a string matches() metódusát! Nagyon jól használható összehasonlításokhoz.

6. feladat:
    Feladatunk az adott csapatról meghatározni, hogy otthon melyik fordulóban kapott ki először, és ki volt a legyőzője. Azt is jelezni kell, ha veretlen maradt.

    A mérkőzések adatait tartalmazó tömbök feldolgozását végző while ciklus csak addig fut, amíg nem talál egy otthoni vereséget az adott csapatnál. Ezt a kikapott nevű logikai változó használatával érjük el.

7. feladat:
    Statisztikát kell készítenünk a bajnokságban előforduló végeredményekről, amelyet egy fájlban kell eltárolnunk. Fontos feltétel, hogy a fordított eredményeket egyezőknek kell tekinteni és a nagyobb számot mindig előre kell írni.
    A feladat megoldásához érdemes írni egy saját metódust, amely a végeredmények gólszámából egy olyan számot állít elő, amelynek tízes helyiértékét a nagyobb-, egyes helyiértékét pedig a kisebb gólszámok adják. Így a végeredményeket egységesítve  sokkal könnyebb a feldolgozásuk.


    A végeredmények számának tárolására a T1 tömb egy üres oszlopa szolgál. A tömb az összes végeredmény-fajtát tartalmazza, tehát külön adatstruktúrát nem szükséges létrehozni hozzájuk. Az algoritmus lényege az, hogy az egyes végeredményeket  - függetlenül attól, hogy milyen sorrendűek (pl. 2-1 vagy 1-2) - az első eredmény-előfordulás helyén tárolva számláljuk meg. A kimeneti fájl létrehozásához kiválóan alkalmas az egyszerűen használható PrintWriter osztály.

    Figyeljük meg a második - beágyazott - for ciklus felépítését, amely az eredmények eltárolását végzi! Mindig csak addig fut - a tömb elejétől kezdve a vizsgálatot -, amíg nem talál egy olyan végeredményt, mint amilyet el akar tárolni. A kiíratásnál arra kell figyelni, hogy a teljes tömböt fel kell dolgozni, mivel egy eredmény akár a tömb utolsó sorában is szerepelhet! A gólszámok sorrendhelyes megjelenítéséhez a Math osztály max() és min() függvényei hathatós segítséget nyújtanak.
    Összességében a feladatról elmondható, hogy - bár egyszerű fájlkezelő műveleteket igényel, de - néhány részfeladata magabiztos algoritmizáló képességet feltételez, és az adatok tárolásához a tömb adatstruktúra alapos ismerete feltétlenül szükséges.


 
 Meccs.txt tartalma:
112
14 1 2 0 2 Dozsa Honved
5 4 0 1 0 Erosek Dozsa
4 0 2 0 2 Vasas Hevesek
8 1 1 0 0 Vasas Nyulak
8 3 2 3 1 Lelkesek Bogarak
13 0 1 0 1 Fineszesek Csikosak
2 1 0 0 0 Pechesek Csikosak
1 4 0 2 0 Csikosak Kedvesek
9 2 0 0 0 Nyulak Lelkesek
6 0 2 0 0 Honved Nyulak
8 1 2 1 0 Gyoztesek Jelmezesek
8 1 2 1 2 Honved Pechesek
4 1 2 0 2 Kedvesek Nyulak
5 0 1 0 1 Nyulak Pechesek
12 0 2 0 0 Erosek Nyulak
4 3 1 1 1 Dozsa Jelmezesek
7 1 3 0 0 Kedvesek Honved
11 1 0 0 0 Pechesek Lelkesek
10 2 4 0 2 Gyoztesek Csikosak
11 0 1 0 1 Csikosak Hevesek
13 1 1 1 1 Pechesek Dozsa
8 1 2 1 1 Darabosak Fineszesek
3 3 0 3 0 Erosek Lelkesek
3 1 1 1 0 Jelmezesek Nyulak
5 3 4 0 3 Kedvesek Jelmezesek
9 1 0 0 0 Fineszesek Dozsa
8 2 3 0 2 Dozsa Csikosak
10 1 0 0 0 Darabosak Nyulak
14 1 2 0 0 Darabosak Mereszek
6 1 0 0 0 Darabosak Hevesek
13 2 1 1 0 Mereszek Lelkesek
6 0 0 0 0 Mereszek Bogarak
11 0 1 0 0 Jelmezesek Mereszek
11 0 0 0 0 Bogarak Erosek
2 2 0 1 0 Nyulak Bogarak
14 3 1 3 0 Erosek Pechesek
12 0 1 0 0 Dozsa Kedvesek
2 0 2 0 2 Kedvesek Fineszesek
6 2 1 2 1 Erosek Jelmezesek
7 2 0 0 0 Csikosak Darabosak
13 0 0 0 0 Jelmezesek Vasas
10 0 0 0 0 Dozsa Bogarak
1 2 0 2 0 Gyoztesek Honved
6 2 1 1 1 Vasas Fineszesek
13 1 3 0 1 Kedvesek Erosek
7 2 1 0 1 Bogarak Vasas
5 1 3 1 2 Fineszesek Mereszek
2 3 3 3 3 Mereszek Gyoztesek
5 1 0 0 0 Csikosak Vasas
1 2 3 1 3 Hevesek Pechesek
11 1 3 1 0 Honved Vasas
7 1 0 0 0 Hevesek Dozsa
9 1 0 0 0 Csikosak Erosek
8 2 2 1 2 Mereszek Kedvesek
9 4 3 0 0 Kedvesek Vasas
12 2 2 1 1 Csikosak Jelmezesek
3 2 2 0 1 Bogarak Kedvesek
3 4 1 3 0 Csikosak Honved
10 1 0 0 0 Lelkesek Kedvesek
3 3 0 0 0 Gyoztesek Vasas
6 1 5 1 3 Lelkesek Csikosak
9 2 0 1 0 Jelmezesek Honved
7 1 2 1 1 Jelmezesek Pechesek
14 2 3 1 0 Gyoztesek Kedvesek
10 1 0 0 0 Hevesek Jelmezesek
14 1 0 1 0 Csikosak Bogarak
5 4 2 3 0 Gyoztesek Darabosak
14 3 2 2 2 Hevesek Nyulak
13 2 0 1 0 Bogarak Hevesek
9 4 1 1 0 Pechesek Mereszek
1 0 1 0 1 Darabosak Lelkesek
3 0 1 0 0 Dozsa Darabosak
7 1 2 1 0 Fineszesek Lelkesek
2 2 2 0 2 Lelkesek Dozsa
4 1 0 1 0 Honved Fineszesek
4 0 1 0 1 Mereszek Csikosak
1 1 0 1 0 Fineszesek Nyulak
12 3 1 0 0 Darabosak Pechesek
12 0 0 0 0 Lelkesek Honved
10 1 1 1 1 Erosek Fineszesek
2 0 0 0 0 Vasas Erosek
9 2 0 1 0 Hevesek Gyoztesek
14 2 1 1 1 Fineszesek Jelmezesek
12 0 1 0 1 Vasas Mereszek
7 1 0 0 0 Nyulak Mereszek
13 1 0 0 0 Honved Darabosak
2 2 2 2 2 Jelmezesek Darabosak
6 2 2 0 2 Dozsa Gyoztesek
6 3 0 1 0 Pechesek Kedvesek
14 0 1 0 0 Lelkesek Vasas
11 1 0 0 0 Nyulak Dozsa
11 3 1 2 0 Fineszesek Gyoztesek
1 0 2 0 1 Dozsa Vasas
1 2 0 0 0 Bogarak Jelmezesek
9 3 1 3 1 Bogarak Darabosak
7 2 1 1 1 Gyoztesek Erosek
10 0 0 0 0 Mereszek Honved
12 2 1 2 1 Gyoztesek Bogarak
4 1 2 1 2 Darabosak Erosek
4 2 0 0 0 Lelkesek Gyoztesek
3 1 4 1 4 Fineszesek Pechesek
5 2 0 2 0 Bogarak Honved
13 2 0 2 0 Nyulak Gyoztesek
5 2 0 1 0 Hevesek Lelkesek
3 2 2 1 2 Hevesek Mereszek
2 2 1 1 0 Honved Hevesek
11 1 1 0 1 Kedvesek Darabosak
1 2 1 0 0 Erosek Mereszek
10 2 0 0 0 Vasas Pechesek
4 2 2 0 2 Pechesek Bogarak
8 3 1 3 1 Erosek Hevesek
12 2 0 0 0 Hevesek Fineszesek 
-----------txt vége 

Megolás

package foci;
/**
 *Megoldások
 */
import java.io.*;
import java.util.*;

public class Foci {

    static int[][] T1; // mérkőzések számadatai
    static String[][] T2; // mérkőzések szöveges adatai

    public static int MaxMin(int z) {
        return Math.max(T1[z][1], T1[z][2]) * 10 + Math.min(T1[z][1], T1[z][2]);
    }

    public static void main(String[] args) throws IOException {

        // 1. feladat
        int i = 0;
        int msz = 0; // mérkőzések száma
        BufferedReader br = new BufferedReader(new FileReader("meccs.txt"));
        msz = Integer.parseInt(br.readLine());
        T1 = new int [msz][6];
        T2 = new String [msz][2];
        String sor;
        while ((sor = br.readLine()) != null) {
            StringTokenizer st = new StringTokenizer(sor," ");
            for (int j = 0; j<5; j++) {
                T1[i][j] = Integer.parseInt(st.nextToken());
            }
            T1[i][5] = 0; //statisztikához
            T2[i][0] = st.nextToken(); // hazai csapat neve
            T2[i][1] = st.nextToken(); // vendégcsapat neve
            i++;
        }
        br.close();

        System.out.println("2. feladat:");
        Scanner sc = new Scanner(System.in);
        System.out.println("Kérem a forduló számát!");
        int fsz = sc.nextInt();
        for (int j = 0; j < msz; j++)
            if (T1[j][0] == fsz)
                System.out.println(T2[j][0]+"-"+T2[j][1]+": "+T1[j][1]+"-"+T1[j][2]
                        +" ("+T1[j][3]+"-"+T1[j][4]+")" );
        System.out.println("");
       
        System.out.println("3. feladat:");
        for (int j = 0; j < msz; j++)
            if ((T1[j][3] < T1[j][4]) && (T1[j][1] > T1[j][2]))
                System.out.println(T1[j][0]+" "+T2[j][0]);
            else if ((T1[j][4] < T1[j][3]) && (T1[j][2] > T1[j][1]))
                System.out.println(T1[j][0]+" "+T2[j][1]);
        System.out.println("");

        System.out.println("4. feladat:");
        sc = new Scanner(System.in);
        System.out.println("Kérem egy csapat nevét!");
        String csn = sc.next();
        System.out.println("");

        System.out.println("5. feladat:");
        int lőtt = 0;
        int kapott = 0;
        for (int j = 0;j < msz; j++)
            if  (csn.matches(T2[j][0])) {
                lőtt += T1[j][1];
                kapott += T1[j][2];
            } else if (csn.matches(T2[j][1])) {
                lőtt += T1[j][2];
                kapott += T1[j][1];               
            }
        System.out.println("lőtt: "+lőtt+", kapott: "+kapott);
        System.out.println("");

        System.out.println("6. feladat:");
        boolean kikapott = false;
        int j = 0;
        while ((! kikapott) && (j < msz)) {
            if (csn.matches(T2[j][0]) && (T1[j][1] < T1[j][2]))
                kikapott = true;
            j++;
        }
        if (! kikapott)
            System.out.println("A csapat otthon veretlen maradt.");
        else
            System.out.println(T1[j-1][0]+" "+T2[j-1][1]);
        System.out.println("");

        // 7. feladat
        PrintWriter pw = new PrintWriter("stat.txt");
        for (i = 0; i < msz; i++)
            for (int k = 0; k <= i; k++)
                if (MaxMin(i) == MaxMin(k)) {
                    T1[k][5]++;
                    break;
                }
        // kiíratás
        for (i = 0; i < msz; i++)
            if (T1[i][5] != 0)
                pw.println(Math.max(T1[i][1], T1[i][2]) + "-" + Math.min(T1[i][1], T1[i][2])
                         + ": " + T1[i][5] + " darab");
        pw.close(); // állomány zárása
    }
}

Java programozas órai feladat


Egy osztály hiányzásai állnak rendelkezésére a naplo.txt fájlban. Tömböt kell használni a megoldáshoz.
 A hiányzások naponként csoportosítva szerepelnek, minden napot a # karakter kezd, majd egy-egy szóközzel elválasztva a hónap és a nap sorszáma következik. Az aznapi hiányzások tanulónként külön sorokban vannak, a tanuló napi hiányzásait egy hét karakterből álló karaktersorozat írja le. A karaktersorozat minden karaktere egy-egy órát ad meg. Értéke az O betű, ha a tanuló jelen volt az adott órán, az X utal az igazolt, az I az igazolatlan távollétre, végül N betű jelzi, ha a tanulónak akkor nem volt órája. Például: # 01 15 Kiss Alfonz OXXXXXN # 01 16 Alma Hedvig OOOOOIO Kiss Alfonz XXXXXXX A fenti példa a január 15-16-i hiányzásokat tartalmazza.

Kiss Alfonznak január 15-én hat órája lett volna, de csak az első órán volt jelen, utána igazoltan hiányzott.
Alma Hedvignek január 16-án hét órája lett volna, de a 6. óráról igazolatlanul távol maradt.
Az állomány legfeljebb 600 sort tartalmaz, az osztályba pedig legfeljebb 50 tanuló jár. Feltételezheti, hogy az osztályban nincs két azonos nevű tanuló, továbbá hogy minden tanulónak egy vezeték és egy utóneve van. Felhasználhatja, hogy a jelenlétre vonatkozó bejegyzés mindig 7 karakterből áll.
Készítsen programot, amely az állomány adatait felhasználva az alábbi kérdésekre válaszol!

A program forráskódját hianyzasok néven mentse! (A program megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell ellenőriznie, és feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.) A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre a feladat sorszámát (például: 3. feladat:)!

Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár! Az eredmények kiírásánál utaljon a kiírt adat jelentésére! A mintától eltérő, valamint az ékezetmentes kiírás is elfogadott.


1.Olvassa be és tárolja el a naplo.txt fájl tartalmát!

2.Határozza meg és írassa ki, hogy hány sor van a fájlban, ami hiányzást rögzít! (A fenti példában 3 ilyen bejegyzés van.)

3.Számolja meg és írassa ki, hogy összesen hány óra igazolt és hány óra igazolatlan hiányzás volt a félév során! Néhány tanár azt feltételezi, hogy a tanulók bizonyos órákról gyakrabban hiányoznak. A következő három feladatban ennek vizsgálatát kell előkészítenie.

4.Készítsen függvényt hetnapja néven, amely a paraméterként megadott dátumhoz (hónap, nap) megadja, hogy az a hét melyik napjára esik (hétfő, kedd...). Tudjuk, hogy az adott év nem volt szökőév, továbbá azt is, hogy január elseje hétfőre esett. Használhatja az alábbi algoritmust is, ahol a tömbök indexelése 0-val kezdődik, de ettől eltérő megoldású függvényt is készíthet.

Függvény hetnapja(honap:egesz, nap:egesz): szöveg napnev[]:= ("vasarnap", "hetfo", "kedd", "szerda", "csutortok", "pentek", "szombat") napszam[]:= (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 335) napsorszam:= (napszam[honap-1]+nap) MOD 7 hetnapja:= napnev[napsorszam] Függvény vége

5.Kérjen be egy dátumot (hónap, nap), és a hetnapja függvény felhasználásával írassa ki, hogy az a hét melyik napjára esett!

6.Kérje be a hét egy tanítási napjának nevét és egy aznapi tanítási óra óraszámát (például: kedd 3)! Írassa ki a képernyőre, hogy a félév során az adott tanítási órára összesen hány hiányzás jutott!

7.Írassa ki a képernyőre a legtöbb órát hiányzó tanuló nevét! Ha több ilyen tanuló is van, akkor valamennyi neve jelenjen meg szóközzel elválasztva!

Naplo.txt tartalma
# 01 15
Kiss Alfonz OXXXXXX
# 01 16
Alma Hedvig OOOOOIO
Kiss Alfonz XXXXXXX
# 01 17
Alma Hedvig OOIOOOO
 Kiss Alfonz XXXXXXX
Maracuja Kolos OOIOOOO
# 01 23
Alma Hedvig XXXXXXX
Kajszi Berta XXXXXXX
Licsi Orsolya XXXXXXX
Szeder Botond XXXXXXX
# 01 24
Alma Hedvig XXXXXXX
Kajszi Berta OXXXXXX
Licsi Orsolya XXXXXXX
# 01 25
Alma Hedvig XXXXXXX
Kajszi Berta XXXXXXX
Licsi Orsolya XXXXXXX
# 01 30
Meggy Albin XXXXXXX
# 01 31
Kivi Adrienn XXXXXXX
Som Klaudia XXXXXXX
# 02 01
Som Klaudia XXXXXXX
# 02 02
Kiss Alfonz XXXXXXX
# 02 05
Jujuba Ibolya IIXXXXX
# 02 06
Naspolya Frigyes XXXXXXX
# 02 09
Kiss Alfonz XXXXXXN
Kajszi Berta XXXXXXN
Licsi Orsolya XXXXXXN
# 02 12
Kajszi Berta XXOOOON
Licsi Orsolya XXXXXXX
# 02 13
Kajszi Berta XXXXXXX
Kuruba Vendel XXXXXXX
Eper Lehel OOOOOXX
Licsi Orsolya XXXXXXX
# 02 22
Eper Lehel XXXXXXX
# 02 23
Eper Lehel XXXXXXN
# 02 26
Eper Lehel XXXXXXX
# 02 27
Eper Lehel XXXXXXX
# 02 28
Eper Lehel XXXXXXX
Jujuba Ibolya XOIOOOO
Kivi Adrienn OOIIOOO
Lime Korinna XXXXXXX
# 03 01
Jujuba Ibolya XXXXXXX
Lime Korinna XXXXXXX
Naspolya Frigyes XXXXXXX
Ribizli Matild XXXXXXX
# 03 02
Kiss Alfonz XXXXXXN
Jujuba Ibolya XXXXXXN
Kajszi Berta OOOXXXN
Lime Korinna OOOXXXN
# 03 05
Jujuba Ibolya XXXXXXX
# 03 06
Jujuba Ibolya XXXXXXX
# 03 07
Alma Hedvig OOIOOOO
Som Klaudia XXXXXXX
Szilva Bence XXXXXXX
# 03 19
Szeder Botond XXXXXXX
# 03 21
Egres Ulrik XXXXXXX
Kajszi Berta XXXXXXX
# 03 22
Egres Ulrik XXXXXXX
# 03 23
Egres Ulrik XXXXXXN
Kiss Alfonz OXXXXXN
# 03 26
Jujuba Ibolya IXXXXXX
Maracuja Kolos XXXXXXX
# 03 27
Jujuba Ibolya XXXXXXX
Maracuja Kolos XXXXXXX
Som Klaudia XXXXXXX
# 03 28
Jujuba Ibolya XXXXXXX
Kuruba Vendel XXXXXXX
Maracuja Kolos OOIOOOO
# 03 29
Jujuba Ibolya XXXXXXX
Som Klaudia XXXXXXX
# 03 30
Kiss Alfonz XXXXXXN
Jujuba Ibolya XXXXXXN
Kuruba Vendel XXXXXXN
# 04 02
Kivi Adrienn XXXXXXX
# 04 04
Kivi Adrienn XXXXXXX
Kuruba Vendel OOOXXXX
Naspolya Frigyes OOOXXXX
Lime Korinna OOIOOOO
Ribizli Matild XXXXXXX
# 04 19
Kivi Adrienn XXXXXXX
# 04 20
Berkenye Anna XXXXXXN
Kivi Adrienn XXXXXXN
# 04 23
Kivi Adrienn XXXXXXX
# 04 24
Kivi Adrienn XXXXXXX
# 04 25
Kajszi Berta XXXXXXX
Kivi Adrienn XXXXXXX
# 04 26
Kajszi Berta XXXXXXX
Kivi Adrienn XXXXXXX
Kuruba Vendel XXXXXOO
# 04 27
Kajszi Berta XXXXXXN
Kivi Adrienn XXXXXXN
Kuruba Vendel XXXXXXN
# 05 07
Birs Judit XXXXXXX
# 05 08
Datolya Vilmos XXXXXXX
# 05 09
Berkenye Anna XXXXXXX
Egres Ulrik XXXXXXX
Kumkvat Hunor OOIOOOO
Kuruba Vendel OOXOOOO
Nektarin Csepke XXXXXXX
Ribizli Matild XXXXXXX
Szilva Bence OOIOOOO
# 05 10
Birs Judit XXXXXXX
Egres Ulrik XXXXXXX
# 05 11
Alma Hedvig OOOXXXN
Egres Ulrik OOOXXXN
# 05 14
Citrom Lajos XXXXXXX
# 05 15
Citrom Lajos XXXXXXX
Egres Ulrik XXXXXXX
Kuruba Vendel XXXXXXX
# 05 16
Berkenye Anna XXXXXXX
Citrom Lajos XXXXXXX
Datolya Vilmos OOXOOOO
Egres Ulrik OOXOOOO
Dinnye Emese XXXXXXX
Lime Korinna XXXXXXX
# 05 17
Citrom Lajos XXXXXXX
# 05 18
Citrom Lajos XXXXXXN
# 05 22
Cseresznye Leila XXXXXXX
# 05 23
Berkenye Anna XXXXXXX
Kumkvat Hunor OOIOOOO
Kuruba Vendel OOIOOOO
Pomelo Ede XXXXXXX
Szilva Bence XXXXXXX
# 05 24
Kuruba Vendel XXXXXXX
# 05 25
Datolya Vilmos XXXXXXN
Kuruba Vendel XXXXXXN
# 06 01
Nektarin Csepke XXXXXXX
# 06 04
Datolya Vilmos OOOXXOO
# 06 05
Alma Hedvig XXXXXXX
# 06 06
Berkenye Anna OOIOOOO
Papaja Inez XXXXXXX
Egres Ulrik XXXXXXX
# 06 07
Papaja Inez XXXXXXX
# 06 08
Papaja Inez XXOXXXN
# 06 11
Papaja Inez XXXXXXX
# 06 13
Birs Judit OOIOOOO
Papaja Inez XXXXXXX
Datolya Vilmos XXXXXXX
# 06 14
Papaja Inez OOXXXXX
# 06 15
Kumkvat Hunor XXOXXXN
------------------txt vége
TÖBBFÉLE MEGOLDÁS LÉTEZIK

Adattárolás tömb létrehozása feltöltése.
Adattároló osztály:
/**
 HIANYZAS ROGZITESE
 */
package hianyzas_szabo_hianyzasok;

public class Hianyzo
{
  private String nev;
  private int honap;
  private int nap;
  private String hianyzas;
  
  public Hianyzo(String[] tomb, String datum)
  {
    nev = tomb[0] + " " + tomb[1];
    String[] tmp = datum.split(" ");
    honap = Integer.parseInt(tmp[1]);
    nap = Integer.parseInt(tmp[2]);
    hianyzas = tomb[2];
  }

  public String getNev()
  {
    return nev;
  }

  public int getHonap()
  {
    return honap;
  }

  public int getNap()
  {
    return nap;
  }

  public String getHianyzas()
  {
    return hianyzas;
  }

  @Override
  public String toString()
  {
    return "Hianyzo{" + "nev=" + nev + ", honap="
      + honap + ", nap=" + nap + ", hianyzas="
      + hianyzas + '}';
  }
}

Hiányzás!

/**
 *
 *
 */
package hianyzas;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.Scanner;

public class anyzasok_v2
{

  public static void main(String[] args)
  {
    ArrayList<Hianyzo> hianyzasok = new ArrayList<>();
    
    try
    {
      RandomAccessFile raf = new RandomAccessFile("naplo.txt", "r");
      String sor;
      String datum = "";
      for( sor = raf.readLine();sor != null; sor = raf.readLine() )
      {
        if( sor.charAt(0) == '#' )
        {
          datum = sor;
        }
        else
        {
          hianyzasok.add(new Hianyzo(sor.split(" "), datum));
        }
      }
      raf.close();
    }
    catch( IOException e )
    {
      System.out.println("HIBA");
    }
    
//    for( int i = 0; i < hianyzasok.length; i++ )
//    {
//      System.out.println(hianyzasok[i].toString());
//    }
    
    System.out.println("2. feladat");
    System.out.println("A naploban " + hianyzasok.size()
      + " bejegyzes van.");
    
    System.out.println("3. feladat");
    int igazolt = 0;
    int igazolatlan = 0;
    for( Hianyzo hianyzo : hianyzasok)
    {
      for( int j = 0; j < 7; j++ )
      {
        if( hianyzo.getHianyzas().charAt(j) == 'X' )
        {
          igazolt++;
        }
        else if( hianyzo.getHianyzas().charAt(j) == 'I')
        {
          igazolatlan++;
        }
      }
    }
    System.out.println("Az igazolt hianyzasok szama "
      + igazolt + ", az igazolatlanoke " + igazolatlan + " ora.");
    
    System.out.println("5. feladat");
    Scanner sc = new Scanner(System.in);
    System.out.print("A honap sorszama=");
    int honap = sc.nextInt();
    System.out.print("A nap sorszama=");
    int nap = sc.nextInt();
    System.out.println("Az adott napon " + hetnapja(honap, nap) + " volt.");
    
    System.out.println("6. feladat");
    sc = new Scanner(System.in);
    System.out.print("A nap neve=");
    String napnev = sc.nextLine();
    System.out.print("Az ora sorszama=");
    int sorszam = sc.nextInt();
    
    int hianyzasDb = 0;
    for( Hianyzo hianyzo : hianyzasok)
    {
      if( hetnapja(hianyzo.getHonap(), hianyzo.getNap()).equals(napnev) )
      {
        if( hianyzo.getHianyzas().charAt(sorszam - 1) == 'X'
          || hianyzo.getHianyzas().charAt(sorszam - 1) == 'I' )
        {
          hianyzasDb++;
        }
      }
    }
    System.out.println("Ekkor osszesen " + hianyzasDb
      + " ora hianyzas tortent.");
    
    System.out.println("7. feladat");
    
    // kivalogatom az egyedi neveket
    ArrayList<String> nevek = new ArrayList<>();
    for( Hianyzo hianyzo : hianyzasok)
    {
      if( !nevek.contains(hianyzo.getNev()) )
      {
        nevek.add(hianyzo.getNev());
      }
    }
    
    // nevenkent osszeszamolom a hianyzasokat
    int[] diakHianyzas = new int[nevek.size()];
    
    for( Hianyzo hianyzo : hianyzasok)
    {
      for( int i = 0; i < hianyzo.getHianyzas().length(); i++ )
      {
        if( hianyzo.getHianyzas().charAt(i) == 'X'
          || hianyzo.getHianyzas().charAt(i) == 'I' )
        {
          // a nevek listajaban a nev helye alapjan novelem
          // a hianyzasok darabszamat tartalmazo tomb
          // azonos helyen levo elemet
          diakHianyzas[nevek.indexOf(hianyzo.getNev())]++;
        }
      }
    }
    
    int max = 0;
    for( int i : diakHianyzas)
    {
      if( i > max )
      {
        max = i;
      }
    }
    
    System.out.print("A legtobbet hianyzo tanulok: ");
    for( int i = 0; i < diakHianyzas.length; i++ )
    {
      if( diakHianyzas[i] == max )
      {
        System.out.print(nevek.get(i) + " ");
      }
    }
    System.out.println();
  }
  
  // 4. feladat
  public static String hetnapja(int honap, int nap)
  {
    String[] napev = {"vasarnap","hetfo","kedd","szerda"
      ,"csutortok","pentek","szombat"};
    int[] napszam = {0,31,59,90,120,151,181,212,243,273,304,335};
    int napsorszam = (napszam[honap-1] + nap) % 7;
    return napev[napsorszam];
  }
}