2018. szeptember 19., szerda

Objektum,Osztály,Metódus

A Java készítői rengeteg dolgot megírtak helyettünk, amelyeket kezdő programozóként sokszor úgy használunk, hogy nem is tudatosul. Ezek végzik a munka nagyját, ők azok, akik a változókat kezelik, és a programunk különböző részei között a kapcsolatot tartják. Mielőtt azonban megismernénk őket, említés szintjén tisztázzunk pár rövid mondatban két fogalmat.

Objektumok: Az objektum az adott feladat szempontjából fontos, a valódi világ valamilyen elemének a rá jellemző tulajdonságai és viselkedései által modellezett eleme. Ilyen lehet egy modellezett kutya, a saját tulajdonságaival (név, fajta, szín, magasság, stb), valamit a rá jellemző viselkedések (evés, ivás, ugatás)

Osztály: Megírt kódok, amelyek az objektumok tervrajzai, benne a tulajdonságokkal és a viselkedésekkel. Az objektumokat ezekből hozzuk létre.

Metódusok
Anélkül, hogy a metódusok készítéséről beszélnék, nézzük meg, mik ezek.

A metódusokat tekinthetjük egyfajta üzeneteknek, melyek valamilyen feladat megoldását kérik valakitől. Az üzenet 3 részből állhat.

Címzett objektum vagy osztály
A címzett metódusának neve
Esetleges paraméterek
Az üzenet címzettjét abban az esetben kötelező megadni, ha a címzett nem önmaga. A programozásunk elején, amíg nem készítünk saját objektumokat, javarészt így fogjuk használni a metódusokat, hogy megadjuk a címzettet.

Minden esetben kötelező megadni, hogy melyik metódust szeretnénk használni. A metódusok neve adott osztályon belül rendszerint egyedi. Valójában a metódus neve, a bemenő adatok típusai és száma együttesen kell hogy egyedi legyen. Az ezzel kapcsolatos úgynevezett túlterhelésről később szót ejtek. Különböző kódokban lehetnek azonos nevű metódusok, ilyenkor a metódus meghívását ki kell egészítenünk az objektum vagy osztály nevével,  hogy melyikét szeretnénk használni.

Mivel az üzenetek (metódusok) valamilyen feladat végrehajtását kérik, ezért a feladattal kapcsolatos adatokat is oda lehet adni annak a metódusnak, amelyik azt elvégzi. Természetesen lehet olyan metódus is, ami nem használ bemenő adatokat.

Lássunk pár példát olyan metódusokra, melyeknél a címzettet is meg kell adni. Ezeknél a példáknál a címzett minden esetben egy osztály:

1
2
3
4
Math.min(23,b);
Math.sqrt(18);
Integer.parseInt("123");
System.out.println("Ez egy rovid mondat.");
két bemenő adat, egy szám és egy számot tartalmazó változó közül a kisebb értéket adja eredményül
megadja 18 négyzetgyökét
egész számmá alakítja a “123” szöveget
kiír egy szöveget a képernyőre
A Java programnyelv metódusait alapvetően két csoportba sorolhatjuk:

metódusok, melyek valamilyen értéket állítanak elő
metódusok, melyek valamilyen tevékenységet hajtanak végre
Az első csoport nagyjából olyan, mint egy táblázatkezelő program függvényei. Ezek a metódusok valamilyen bemenő adatok segítségével számítást végeznek, és adott típusú (szám, szöveg, karakter, stb) eredményt állítanak elő. Ez az eredmény a metódus visszatérési értéke. A bemenő adatok, melyeket innentől nevezzünk paramétereknek, valamilyen változók vagy literálok (a típusnak megfelelő formában megadott értékek), de az sem törvényszerű, hogy legyen bemeneti érték. Vannak metódusok, amelyek bemeneti egy előre meghatározott keretek közötti értéket adnak eredményül. A bemenő adatok száma is sokfajta lehet, de ebből egyelőre legyen elég ennyi.

A második csoportba tartozó metódusok valamilyen tevékenységet hajtanak végre, ide tartozik például a képernyőre való kiíratás.

Ez a tananyag elsődlegesen a gyárilag előre megírt metódusokról szól, a saját magad által megírt metódusok egy másik lecke része lesz. A gyári metódusokat tehát formailag a következőképp lehet használni:

Osztalynev.metodus();
Osztalynev.metodus( parameter );
Osztalynev.metodus( parameter1, parameter2, … );
Ahogy láthatod először hivatkozni kell arra az osztályra, amelyiknek a metódusát használni szeretnéd, aztán a speciális . operátor használatával hivatkozok az osztály adott nevű metódusára. Ez az a két dolog, ami minden esetben kötelező. A harmadik dolog, hogy odaadd a metódusnak azokat az adatokat melyeket neki használnia kell. Vagy azért, hogy egy eredményt állítson elő (1. típus), vagy hogy annak segítségével hajtsa végre a kért tevékenységet.

Minek kell az osztálynév, ha a metódusoknak neve van? Azért, mert létezhet több azonos nevű metódus, (sőt sokszor ez a helyzet), ezért meg kell mondani, hogy ez a metódus melyik osztályba tartozik.

A tanulás elején a Math osztályt szoktuk kiemelni egyszerűbb programok írásakor. Központi metódus természetesen sokkal több van, de a tanulmányaink elején ezekre jó eséllyel szükség lesz:

Math osztály
A Math osztály matematikai témakörrel kapcsolatos metódusokat tartalmaz. A metódusok többsége sokféle számot is elfogad, beleértve egész és valós értékeket is, azok összes altípusával együtt. Sőt, több ezeket keverve is működik. A teljesség igénye nélkül álljanak akkor itt a legfontosabbak:

Math.min(a,b); // a két változó közül a kisebb értéket adja eredményül
Math.random(); // kisorsol egy lebegőpontos számot a [0;1[ intervallumból
Math.round(a); // matematikai szabály szerint kerekíti a változó értékét
Math.abs(a); // az adott változó értékének abszolút értékét adja vissza
Math.sqrt(a); // az adott változó négyzetgyökét adja vissza
Math.pow(a,b); // az a számot a b-edik hatványra emeli
Math.PI; // Pi értékét adja vissza
Math.E; // E értékét adja vissza
Az utolsó kettő kakukktojás, ezek nem metódusok, hanem “beégetett” változók.

Változók deklarálása

A változó neve a programunkon belül minden esetben a benne tárolt értéket jelenti. Ahol a változó nevét a programba illesztjük, ott az abban tárolt értéket fogja felhasználni. A változó típussal, névvel és értékkel rendelkezik. A típus azt határozza meg, hogy milyen jellegű értéket tárolhatunk az adott változóban. A primitív változók alapvetően négyféle típusúak lehetnek, egy-egy konkrét példával:

public class Auto
{
  public static void main( String[] args )
  {
    int fokozat;
    double sebesseg;
    char szinkod;
    boolean metal;

    System.out.println("Ez egy virtualis auto.");

    fokozat = 4;
    sebesseg = 48.6;
    szinkod = 'R';
    metal = true;

    System.out.println( "Az auto sebessegfokozata: "+fokozat );
    System.out.println( "Az auto pillanatnyi sebessege: "+sebesseg );
    System.out.println( "Az auto szinkodja: "+szinkod );
    System.out.println( "Az auto metalszinu: "+metal );
  }
}

Érdekességek Java programozásban

Példa buborékrendezésre

int[] n = new int[]{-32,43,53,54,32,0,65,63,98,43,23};
boolean rendezett = false;
while (!rendezett){
    rendezett = true;
    for (int j=1; j<n.length; j++){
        if (n[j-1]>n[j]){
            int v = n[j-1];
            n[j-1] = n[j];
            n[j] = v;
            rendezett = false;
        }
    }
}
System.out.println(Arrays.toString(n));

Tételek
Összegzés
Program.java
class Program
{
public static void main(String[] args)
{
int[] tomb = {3, 8, 2, 4, 5, 1, 6};

int osszeg = 0;
for(int i=0; i<7; i++)
osszeg = osszeg + tomb[i];

System.out.println(osszeg);
}
}
Megszámolás
Program.java
class Program
{
public static void main(String[] args)
{
int[] tomb = {3, 8, 2, 4, 5, 1, 6};
int n = 7;
int szamlalo = 0;
for(int i=0; i<n; i++)
if(tomb[i] > 5)
szamlalo++;

System.out.println(szamlalo);
}
}
Eldöntés tétel
Program.java
class Program
{
public static void main(String[] args)
{
int[] tomb = {3, 8, 2, 4, 5, 1, 6};
int n = 7; // A tömb elemeinek száma
int ker = 2; //Amiről el szeretnénk dönteni, hogy van-e ilyen

int i = 0;
while(i<n && tomb[i] != ker)
i++;

if(i<n)
System.out.println("Van ilyen szám.");
else
System.out.println("Nincs ilyen szám.");
}
}
Kiválasztás tétel
Program.java
class Program
{
public static void main(String[] args)
{
int[] tomb = {3, 8, 2, 4, 5, 1, 6};
int n = 7; // A tömb elemeinek száma
int ker = 2; //Amiről szeretnénk tudni, hogy hányadik helyen van

int i = 0;
while(tomb[i] != ker)
i++;

System.out.printf("%d\n", i + 1);
}
}
Keresés tétel
Program.java
class Program
{
public static void main(String[] args)
{
int[] tomb = {3, 8, 2, 4, 5, 1, 6};
int n = 7; // A tömb elemeinek száma
int ker = 2; //Amit keresünk

int i = 0;
while(i<n && tomb[i] != ker)
i++;

if(i<n) {
                        //Ha a kérdés az, hogy hányadik akkor i + 1 a vége
                        //ha a kérdés az, hogy mi az indexe, akkor csak i
System.out.printf("Van ilyen a következő helyen: %d\n", i + 1);

}else {
System.out.println("Nincs ilyen elem");
                }
}
}
Kiválogatás tétel
Program.java
class Program
{
public static void main(String[] args)
{
int[] a = {3, 8, 2, 4, 5, 1, 6};
int n = 7; // A tömb elemeinek száma
int[] b = new int[n];
int j=0;
for(int i=0; i<n;i++)
if(a[i] > 5)
b[j++] = a[i];

int m = j; //A "b" tömb elemeinek száma

//Első tömb kiíratva:
for(int i=0; i<n;i++)
System.out.print(a[i] + " ");
System.out.println();

//Második tömb kiíratva:
for(int i=0; i<m;i++)
System.out.print(b[i] + " ");
System.out.println();

}
}
Szétválogatás tétel
Program.java
class Program
{
public static void main(String[] args)
{
int[] a = {3, 8, 2, 4, 5, 1, 6};
int n = 7; // A tömb elemeinek száma
int[] b = new int[n];
int[] c = new int[n];

int j=0;
int k=0;
for(int i=0; i<n;i++)
if(a[i] > 5)
b[j++] = a[i];
else
c[k++] = a[i];

int m = j; //A "b" tömb elemeinek száma
int l = k; //A "c" tömb elemeinek száma

//Első tömb kiíratva:
for(int i=0; i<n;i++)
System.out.print(a[i] + " ");
System.out.println();

//Második tömb kiíratva:
for(int i=0; i<m;i++)
System.out.print(b[i] + " ");
System.out.println();

//Harmadik tömb kiíratva:
for(int i=0; i<l;i++)
System.out.print(c[i] + " ");
System.out.println();

}
}
Metszet tétel
Program.java
class Program
{
public static void main(String[] args)
{
int[] a = {3, 8, 2, 4, 5, 1, 6};
int n = 7; // Az első tömb elemeinek száma
int[] b = {4, 7, 9, 8, 2};
int m = 5; //A második tömb elemeinek száma
int[] c = new int[n+m]; //A harmadik tömb

int j;
int k = 0;
for(int i=0; i<n;i++)
{
j = 0;
while(j<m && b[j] != a[i])
j++;
if(j<m)
{
c[k] = a[i];
k++;
}
}

int l = k; //A "c" tömb elemeinek száma

//Első tömb kiíratva:
for(int i=0; i<n;i++)
System.out.print(a[i] + " ");
System.out.println();

//Második tömb kiíratva:
for(int i=0; i<m;i++)
System.out.print(b[i] + " ");
System.out.println();

//Harmadik tömb kiíratva:
for(int i=0; i<l;i++)
System.out.print(c[i] + " ");
System.out.println();

}
}
Unió tétel
Program.java
/* Unió tétel */
class Program7
{
public static void main(String[] args)
{
int[] a = {3, 8, 2, 4, 5, 1, 6};
int n = 7; // Az első tömb elemeinek száma
int[] b = {4, 7, 9, 8, 2};
int m = 5; //A második tömb elemeinek száma
int[] c = new int[n+m]; //A harmadik tömb

for(int i=0; i<n; i++)
c[i] = a[i];

int k = n-1;

for(int j=0; j<m;j++)
{
int i = 0;
while(i<n && a[i] != b[j])
i++;
if(i>=n)
{
k++;
c[k] = b[j];
}
}

int l = k + 1; //A "c" tömb elemeinek száma

//Első tömb kiíratva:
for(int i=0; i<n;i++)
System.out.print(a[i] + " ");
System.out.println();

//Második tömb kiíratva:
for(int i=0; i<m;i++)
System.out.print(b[i] + " ");
System.out.println();

//Harmadik tömb kiíratva:
for(int i=0; i<l;i++)
System.out.print(c[i] + " ");
System.out.println();

}
}
Maximum kiválasztás tétele
Program.java
class Program
{
public static void main(String[] args)
{
int[] tomb = {3, 8, 2, 4, 5, 1, 6};
int n = 7; // A tömb elemeinek száma

int max = 0;

for(int i=0; i<n;i++)
if(tomb[i] > max)
max = tomb[i];

System.out.println("Legnagyobb: " + max);

}
}
Minimumkiválasztás tétele
Program.java
class Program
{
public static void main(String[] args)
{
int[] tomb = {3, 8, 2, 4, 5, 1, 6};
int n = 7; // A tömb elemeinek száma

int min = tomb[0];

for(int i=0; i<n;i++)
if(tomb[i] < min)
min = tomb[i];

System.out.println("Legkisebb: " + min);

}
}
Rendezések
Buborék rendezés
Program.java
/* Buborék rendezés */
class Program
{
public static void main(String args[])
{
int[] tomb = {3, 8, 2, 4, 5, 1, 6};
int n = 7; // A tömb elemeinek száma

for(int i= n-1; i>0; i--)
for(int j=0; j<i; j++)
if(tomb[j] > tomb[j+1])
{
int tmp = tomb[j];
tomb[j] = tomb[j+1];
tomb[j+1] = tmp;
}

for(int i=0; i<n; i++)
System.out.print(tomb[i] + " ");
System.out.println();
}
}
Vagy:

Program.java
/* Buborék rendezés */
class Program
{
public static void main(String args[])
{
int[] tomb = {3, 8, 2, 4, 5, 1, 6};
int n = 7; // A tömb elemeinek száma

for(int i= n-2; i>0; i--)
for(int j=0; j<=i; j++)
if(tomb[j] > tomb[j+1])
{
int tmp = tomb[j];
tomb[j] = tomb[j+1];
tomb[j+1] = tmp;
}

for(int i=0; i<n; i++)
System.out.print(tomb[i] + " ");
System.out.println();
}
}
Utóbbi különbsége: mettől-meddig megyünk a ciklusban.

Beszúrásos rendezés
Rekurzív megvalósítás:

Program01.java
package rendezesbeszurassal;

public class RendezesBeszurassal {

    static void rendezesBeszurassalR(int[] t, int n) {     
        if(n>0) { // eredeti: n>1
            rendezesBeszurassal(t, n-1);
            int x = t[n-1]; // eredeti: t[n]
            int j = n-2; // eredeti: n-1
            while(j>= 0 && t[j]>x) {
                t[j+1] = t[j];
                j = j-1;
            }
            t[j+1] = x;
        }
    }
    static void kiir(int[] t) {
        for (int i = 0; i < t.length; i++) {
            System.out.print(t[i]+" ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int[] t = {35, 24, 83, 12, 7, 23};
        rendezesBeszurassalR(t, t.length);
        kiir(t);
    }

}
Normál megvalósítás:

    static void rendezesBeszurassal(int[] t) {
        for (int i = 0; i < t.length; i++) {  //eredeti: i=1
            int x = t[i];
            int j = i - 1;
            while(j>=0 && t[j]>x) {
                t[j+1] = t[j];
                j = j - 1;
            }
            t[j+1] = x;
        }
    }
A megjegyzések azokra a tömbökre utalnak, ahol a kezdőérték 1.

Gyorsrendezés
Program.java
class Program
{
static void gyors(int[] tomb, int bal, int jobb)
{
if(bal < jobb)
{
int also = bal, felso = jobb + 1, kulcs = tomb[bal];
for( ; ; )
{
while(++also < felso && tomb[also] < kulcs)
;
while(tomb[--felso] > kulcs)
;
if(also >= felso)
break;
csere(tomb, also, felso);
}
csere(tomb, felso, bal);
gyors(tomb, bal, felso -1);
gyors(tomb, felso+1, jobb);
}
}

static void csere(int[] tomb, int i, int j)
{
int seged = tomb[i];
tomb[i] = tomb[j];
tomb[j] = seged;
}

public static void main(String args[])
{
int[] tomb = {8, 5, 2, 9, 4, 3, 1, 6};
int meret = 8;

gyors(tomb, 0, 7);

for(int i=0; i<meret; i++)
System.out.print(tomb[i] + " ");
System.out.println();
}
}
Program01.java
import java.util.ArrayList;
import java.util.Arrays;


public class Program01 {
    static ArrayList<Integer> quicksort(ArrayList<Integer> list) {
        if (list.size() <= 1) {
            return list;
        }
        ArrayList<Integer> less = new ArrayList<>();
        ArrayList<Integer> equal = new ArrayList<>();
        ArrayList<Integer> greater = new ArrayList<>();
        int pivot = list.get(list.size()-1);
        for (Integer x : list) {
            if (x < pivot) less.add(x);
            if (x == pivot) equal.add(x);
            if (x > pivot) greater.add(x);
        }     
        ArrayList<Integer> sumList = new ArrayList<Integer>();
        sumList.addAll(quicksort(less));
        sumList.addAll(equal);
        sumList.addAll(quicksort(greater));     
        return sumList;
    }

    static void kiirLista(ArrayList<Integer> list) {
        for(Integer x : list) {
            System.out.print(x + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        Integer[] t = {8, 2, 7, 9, 5, 4, 3};
        ArrayList<Integer> list = new ArrayList<>(Arrays.asList(t));
        list = quicksort(list);
        kiirLista(list);
    }
}
Program01.java
import java.util.ArrayList;
import java.util.Arrays;

public class Program01 {

    static void quicksort(ArrayList<Integer> list, int lo, int hi) {
        if(lo < hi) {
            int p = partition(list, lo, hi);
            quicksort(list, lo, p-1);
            quicksort(list, p+1, hi);
        }
    }
    static int partition(ArrayList<Integer> list, int lo, int hi) {
        int pivot = list.get(hi);
        int i = lo -1;
        for (int j = lo; j < hi; j++) {
            if(list.get(j)<= pivot) {
                i++;
                swap(list, i, j);
            }
        }
        swap(list, i+1, hi);
        return i + 1;
    }
    static void swap(ArrayList<Integer> list, int i, int j) {
        int tmp = list.get(i);
        list.set(i, list.get(j));
        list.set(j, tmp);
    }
    static void kiir(ArrayList<Integer> list) {
        for(Integer x : list) {
            System.out.print(x + " ");
        }
        System.out.println();
    }
    public static void main(String[] args) {
        Integer[] t = {8, 2, 7, 3, 4, 9};
        ArrayList<Integer> list = new ArrayList<>(Arrays.asList(t));
        quicksort(list, 0, list.size()-1);
        kiir(list);
    }

}
Shell rendezés
Program.java
class Program
{
public static void main(String args[])
{
int[] tomb = {8, 5, 2, 9, 4, 3, 1, 6};
int[] leptomb = {5, 3, 1};

int meret = 8;

for(int k = 0; k< 3; k++)
{
int lepeskoz = leptomb[k];
for(int j = lepeskoz; j < meret; j++)
{
int i = j - lepeskoz;
int kulcs = tomb[j];
while(i>=0 && tomb[i] > kulcs)
{
tomb[i + lepeskoz] = tomb[i];
i = i - lepeskoz;
}
tomb[i + lepeskoz] = kulcs;
}
}

for(int i=0; i<meret; i++)
System.out.print(tomb[i] + " ");
System.out.println();
}
}
Összefuttatás
Összefuttatás, összefésülés
Program01.java
class Program01{
public static void main(String[] args) {
int[] a = { 1, 3, 5, 7, 9};
int[] b = {2, 4, 6, 8 };

int[] c = new int[a.length+b.length];

int n = a.length;
int m = b.length;

int i = 0;
int j = 0;
int k = -1;
while(i<n && j<m) {
k++;
if(a[i]<b[j]) {
c[k] = a[i];
i++;
}else if(a[i] == b[j]) {
c[k] = a[i];
i++;
j++;
}else if(a[i] > b[j]) {
c[k] = b[j];
j++;
}
}
while(i<n) {
k++;
c[k] = a[i];
i++;
}
while(j<m) {
k++;
c[k] = b[j];
j++;
}

kiir(c, k);

}
public static void kiir(int[] tomb, int meret) {
for (int i = 0; i < meret + 1; i++) {
System.out.println(tomb[i]);
}
}
Keresés rendezett tömbben
Logaritmikus keresés
Program01.java
public class Program01 {
public static void main(String[] args) {

int[] t={3, 4, 6, 8, 18, 50, 52, 61, 68, 70};

int n = t.length;

int e = 0;
int u = n-1;
int k;
int ker = 52;
do {
k = (e+u) / 2;
if(ker<t[k]) u = k-1;
if(ker>t[k]) e = k+1;
}while(e<=u && t[k]!=ker);
boolean van = e<=u;
int index = 0;

if(van) {
index = k;
}
System.out.printf("%s %d\n", van, index);

}
}

Rendezések

    helyfoglalási igény
    lépésszám
    egyszerű cserés rendezés
    minimumkiválasztásos rendezés
    buborékos rendezés
    javított buborékos rendezés
    gyors rendezés

Másik példa
 BuborékosRendezés
A program buborékos rendezés alkalmazásával rendezze a tömbelemeket!
Az alapelv: szomszédos elemeket hasonlítsunk össze, és ha nem megfelelő a sorrendjük, akkor cseréljük fel őket. Egy ciklus alatt a legnagyobb elem biztosan a helyére (a tömb végére) kerül, és ezen kívül a tömbelemek a helyük felé mozognak (a kisebbek balra, a nagyobbak jobbra).
Forráskód

public class BuborékosRendezés {

  final static int N=20;
  static int[] tömb = new int[N+1];

  static void tömbFeltölt() {
    for(int i=1; i<=N; i++)
      tömb[i]=(int)(Math.random()*90+10);
  }

  static void tömbLista(String üzenet) {
    System.out.println(üzenet);
    for(int i=1; i<N; i++)
      System.out.print(tömb[i]+", ");
    System.out.println(tömb[N]);
  }

  static void tömbRendez() { // buborékos rendezés
    int csere;
    for(int i=N; i>=2; i--) {                           //1
      for(int j=1; j<=i-1; j++)                         //2
        if(tömb[j]>tömb[j+1]) {                         //3
          csere=tömb[j];                                //4
          tömb[j]=tömb[j+1];
          tömb[j+1]=csere;
        }
    }
  }

  public static void main(String[] args) {
    tömbFeltölt();
    tömbLista("A tömb elemei a rendezés előtt:");
    tömbRendez();
    tömbLista("A tömb elemei a rendezés után:");
  }
}

A program lehetséges futása

A tömb elemei a rendezés előtt:
84, 87, 71, 47, 89, 96, 27, 60, 98, 65, 74, 59, 67, 64, 12, 35, 58, 90, 51, 35
A tömb elemei a rendezés után:
12, 27, 35, 35, 47, 51, 58, 59, 60, 64, 65, 67, 71, 74, 84, 87, 89, 90, 96, 98

Elemzés
A külső ciklus (//1) a tömb utolsó elemétől egyesével visszafelé halad a 2. elemig. A belső ciklus (//2) a külső ciklus aktuális i-edik elemétől balra lévő i-1 db elemen dolgozik. Ha két szomszédos tömbelem (j-edik és j+1-edik) sorrendje nem megfelelő (//3), akkor fel kell azokat cserélni (//4).
Az algoritmus nem veszi észre (mert nem figyeli, hogy volt-e csere a belső ciklusban), ha időközben befejeződik a rendezés. Ha volt csere, akkor csak a csere helyétől balra lévő elemekkel kellene foglalkozni, de az algoritmus erre sem figyel. Futtassa a BuborékosRendezésDemo programot, hogy lépésenként kiírva tudja követni, hogyan működik az algoritmus.

    összetett programozási tételek
        metszet
        egyesítés (unió)
        összefuttatás

Keresések

    lineáris keresés
    logaritmikus keresés

MásodikLegnagyobbTömbelem
A program egy véletlenszerű értékekkel feltöltött és csökkenő sorrendbe rendezett tömböt feldolgozva írja ki a tömb második legnagyobb elemét (ha van) a konzolra!

Java osztályok használata

    rt.jar

10.1. Csomagolóosztályok

    java.lang.Character
    java.lang.Boolean
    java.lang.Byte
    java.lang.Short
    java.lang.Integer
    java.lang.Long
    java.lang.Float
    java.lang.Double

10.2. A String és StringBuffer osztályok

    java.lang.String
    java.lang.StringBuffer
    unikód karakterek sorozata
    indexelhető
    null referencia

10.2.2. Feladat - Köszön2
A program addig kérje be a felhasználó vezeték- és keresztnevét, amíg meg nem adja, majd köszönjön!
Forráskód

public class Köszön2 {
  public static void main(String[] args) {
    String vezetékNév=null, keresztNév=null;            //1
    while((vezetékNév=extra.Console.
        readLine("Vezetékneve: ")).equals(""))          //2
      System.out.println("Hiányzó vezetéknév. Újra!");  //3
    while((keresztNév=extra.Console.
        readLine("Keresztneve: ")).equals(""))          //3
      System.out.println("Hiányzó keresztnév. Újra!");
    System.out.println("Üdvözlöm "+vezetékNév+" "+
      keresztNév+"!");                                  //4
  }
}

A program lehetséges futása

Vezetékneve:
Hiányzó vezetéknév. Újra!
Vezetékneve: Domján
Keresztneve: Erika
Üdvözlöm Domján Erika!

Elemzés
A program mindkét változót null kezdőértékkel hozza létre (//1). Az objektumok összehasonlítására, egyezőségük vizsgálatára nem alkalmasak a primitív adattípusoknál használható relációs jelek. Az objektumok egyenlőségét az equals() metódussal lehet eldönteni. A ciklusban történő beolvasás addig fut, amíg egy üres String-től különböző szöveget meg nem ad a felhasználó (//2 és //3). A kiíró utasítás állítja elő a nevet (//4), azt külön változó nem tárolja.
10.3. A java.util.Random osztály

    véletlen egész szám, valós szám, logikai érték

10.4. A java.util.Date és java.text.DateFormat osztályok

    UTC
Tömbök

    tömbelem
    tömbindex
    elemszám
    dimenzió
        egydimenziós
        többdimenziós

8.1. Egydimenziós tömbök

    műveletek
        létrehozás
        feltöltés
            inicializáló blokk
            egyesével forráskódból
            egyesével konzolról bekérve
            véletlenszerűen
        listázás

8.1.6. Feladat - Ötöslottó1
A program írjon ki a konzolra egy ötöslottón megjátszható számkombinációt! Az öt véletlenszám egymástól különbözik, és mindegyik 1 és 90 közé esik. A megoldáshoz a program logikai tömböt használjon!
Forráskód

public class ÖtösLottó1 {
  public static void main(String[] args) {
    boolean[] logikaiTömb=new boolean[91];              //1
    for(int i=1; i<=90; i++)                            //2
      logikaiTömb[i]=false;                             //3

    int jóSzámDb=0, tipp;                               //4
    while(jóSzámDb<=5) {                                //5
      tipp=(int)(Math.random()*90+1);                   //6
      if(!logikaiTömb[tipp]) {                          //7
        logikaiTömb[tipp]=true;                         //8
        jóSzámDb++;                                     //9
      }
    }

    System.out.print("Ötöslottón megjátszható számok: ");
    for(int i=1; i<=90; i++)                           //10
      if(logikaiTömb[i])                               //11
        System.out.print(i+" ");                       //12
  }
}

A program lehetséges futása

Ötöslottón megjátszható számok: 18 28 44 75 77

Elemzés
A program 91 elemű logikai tömböt hoz létre (//1), nem használja annak nulladik elemét, így 1-től 90-ig indexelhető. Ha valamelyik eleme (i) igaz, akkor ez jelentse azt, hogy azt az elemét (i-ediket) meg kell játszani. Kezdetben a logikaiTömb minden eleme hamis (//2 és //3).
Két segédváltozóra is szükség van (//4). A jóSzámDb jelöli az egymástól különböző lottószámokat. Kezdetben 0, pedig az első véletlenszerűen előállított tipp biztosan jó lesz (nem fordulhat elő, hogy egy korábban előállított számmal megegyezik), de a későbbi összehasonlítások (pl.: az 1. szám megegyezik-e a 3.-kal?). Az elöltesztelős ciklus (//5) feltétele is beszédes (jóSzámDb<=5). A ciklusmag először előállít egy lottószámot (//6). Ezután, ha ilyen még nem volt (//7), akkor meg kell jegyezni (//8) és növelni kell a jóSzámDb változó értékét (//9). Ha olyan a tipp, ami már volt, akkor nincs teendő, tehát nem nő a jóSzámDb változó értéke, így a ciklus belépési feltétele (jóSzámDb<=5) továbbra is teljesül.
A logikaiTömb végül biztosan tartalmaz 5 db true értéket. Ezek indexét kell kiírni (//10, //11, //12), hogy megkapjuk az ötöslottó szelvényen megjátszható véletlenszámokat. Számlálós ciklust nem lehet használni az öt egymástól különböző lottószám előállítására, mert akár többször is előfordulhat, hogy egy tipp megegyezik egy korábban előállított véletlen lottószámmal. Ez a módszer memóriahasználat szempontjából pazarló. 5 egymástól különböző véletlenszám előállításához 90+1 elemű tömböt használ. A módszer "mellékhatása", hogy a lottószámok - mivel a tömböt (//10) a kisebb indexektől a nagyobb indexek felé haladva írja ki - rendezett sorozatot alkotnak.
8.2. Programozási tételek, 2. rész

    elemi programozási tételek
        sorozatszámítás
        eldöntés
        kiválasztás
        (lineáris) keresés
        megszámlálás
        maximumkiválasztás
    összetett programozási tételek
        másolás
        kiválogatás
        szétválogatás
Metódusok írása

    metódus
        eljárás
        függvény
        készítésének okai

7.1. Metódusok paraméterei és visszatérési értékük

    metódushívás
    paraméter
        formális
        aktuális
    paraméterátadás
        érték szerinti
    metódusok sorrendje
    rekurzív függvény

7.1.3. Feladat - Időtartam1
A program másodpercben megadott időtartamot fejezzen ki óra:perc:másodperc formában! Ellenőrizni nem kell! A megvalósítást egy külön eljárás végezze!
Forráskód

public class Időtartam1 {

  static void időtartam(int mp) {        //nincs ellenőrzés
    int másodperc=mp;                                   //1
    int óra=másodperc/3600;
    másodperc%=3600;                                    //2
    int perc=másodperc/60;
    másodperc%=60;
    System.out.println(mp+" másodperc = "+              //3
      óra+":"+perc+":"+másodperc);
  }

  public static void main(String[] args) {
    System.out.println("Időtartam: "+
      "másodperc -> óra:perc:másodperc");
    időtartam(11502);                                   //4
  }
}

A program futása

Időtartam: másodperc -> óra:perc:másodperc
11502 másodperc = 3:11:42

Elemzés
Az időtartam() eljárás a 11502 aktuális paramétert kapja (//4), amely az mp formális paraméterbe kerül. A számoláshoz szükséges néhány lokális változó (másodperc, óra, perc), amelyek az eljárás blokkjában jönnek létre és csak addig élnek (láthatóak, foglalnak memóriaterületet), amíg az eljárás fut. Az eredmény kiírásakor (//3) szükség van az eredeti mp értékre - és azt a számolás során az eljárás módosítja (például //2) -, így első teendő az mp értékének mentése a másodperc változóba (//1). A számolás menete egyértelmű. Ellenőrzés nincs, feltételezzük, hogy az időtartam() eljárás paramétere mindig pozitív.

 Iterációk

    ciklus
    ciklusváltozó
    ciklusmag
    egymásba ágyazott ciklusok
    feltétel
        de Morgan-azonosságok

6.1. Számláló ciklus

    Mikor használjuk?
    inicializálás
    belépési feltétel
    ciklusmag
    léptetés

6.2. Elöltesztelő ciklus

    Mikor használjuk?
    belépési feltétel
    ciklusmag

6.3. Hátultesztelő ciklus

    Mikor használjuk?
    ciklusmag
    bennmaradási feltétel

6.4. Programozási tételek, 1. rész

    elemi programozási tételek
        sorozatszámítás
        eldöntés
        kiválasztás
        (lineáris) keresés
        megszámlálás
        maximumkiválasztás

6.4.6. Feladat - NéhánySzámÖsszege1
A program adjon össze néhány számot! Előre nem tudjuk, hogy a felhasználó hány számot szeretne összeadni! A (sorozatos) bevitel végét jelölje a 0 (nulla) végjel!
Forráskód

public class NéhánySzámÖsszege1 {
  public static void main(String[] args) {
    System.out.println("Beolvasott néhány szám összege "+
      "(végjel: 0)");
    final int VÉGJEL=0;                                 //1
    int db=0, összeg=0, szám;                           //2
    while((szám=extra.
        Console.readInt((db+1)+". szám: "))!=VÉGJEL) {  //3
      összeg+=szám;
      db++;
    }  
    System.out.println("A megadott "+db+
      " szám összege "+összeg+".");
  }
}

A program lehetséges futása (1)

Beolvasott néhány szám összege (végjel: 0)
1. szám: 12
2. szám: 75
3. szám: -8
4. szám: 5
5. szám: 0
A megadott 4 szám összege 84.

A program lehetséges futása (2)

Beolvasott néhány szám összege (végjel: 0)
1. szám: 0
A megadott 0 szám összege 0.

Elemzés
A VÉGJEL konstans (//1). A feladatot csak feltételes ciklussal lehet megoldani. A beolvasott szám feldolgozásakor növeljük vele az - előzőleg nullázott (//2) - összeg nevű gyűjtőt. A db változó nem szükséges csupán a sorszámozott bekérést (//3) biztosítja, ahogyan az (1) lehetséges futásnál látható. A végjelet nem szabad feldolgozni. A programnak akkor is jól kell működnie, ha a felhasználó egyetlen számot sem akar összegezni: (2) lehetséges futás.

 Szelekciók
5.1. Egyágú szelekció
5.2. Többágú szelekció

    feltételes kiértékelés
    szelekciók egymásba ágyazása

5.2.1. Feladat - Pozitív2
A program egy bekért egész szám előjelétől függően írja ki, hogy a szám pozitív vagy sem!
Forráskód

public class Pozitív2 {
  public static void main(String[] args) {
    System.out.println("Pozitív-e a megadott szám?");
    int szám = extra.Console.readInt("Szám: ");
    if(szám>0)
      System.out.println("A szám pozitív.");
    else                                                //1
      System.out.println("A szám nem pozitív.");
  }
}

A program lehetséges futása

Pozitív-e a megadott szám?
Szám: -95
A szám nem pozitív.

Elemzés
A programot futtatva bármilyen számot is ad meg a felhasználó, mindenképpen tenni kell valamit. Mindig a megfelelő szöveget kell kiírni a konzolra.
Az if feltételes utasítás a beolvasást követi. Ekkor már tudunk dönteni arról, hogy pozitív-e a megadott szám. A logikai feltételt (szám>0) zárójelbe kell írni. Az utasítás végén nincs pontosvessző! A feltétel teljesülésekor most egyetlen végrehajtandó utasítás (//1) van.
Az else kulcsszó valósítja meg a Java nyelvben a feltételes utasítás hamis ágát. Az else kulcsszó után írt utasítás (vagy blokk) (//2) akkor hajtódik végre, ha a feltétel nem teljesül, azaz hamis.
A feltételes utasítás igaz és hamis ága közül pontosan az egyik hajtódhat végre!

Kifejezések, értékadás

4.1. Kifejezések alkotóelemei

  • operandus
  • operátor
    • egyenrangú multiplikatív
    • additív
    • implicit típuskonverzió

4.1.2. Feladat - HőmérsékletFC

A program legyen képes Fahrenheit fokban megadott hőmérsékletet átváltani Celsius fokra! Tárolja a beolvasott hőmérsékletet egy valós típusú f nevű változó! Ekkor az átváltás képlete: (f-32)*5/9.

Forráskód

public class HőmérsékletFC { 
  public static void main(String[] args) { 
    System.out.println("Fahrenheit -> Celsius"); 
    double f=extra.Console.readDouble("Fahrenheit fok: "); 
    double c=(f-32)*5/9;                                //1 
    System.out.println("Celsius fok: "+c); 
  } 
}

A program lehetséges futása

Fahrenheit -> Celsius
Fahrenheit fok: 99.8
Celsius fok: 37.666666666666664

Elemzés

A program a valós c változó kiszámításakor (//1) először a zárójelben lévő kifejezést számítja ki, majd balról jobbra halad tovább: c=(f-32), c=(f-32)*5, végül c=(f-32)*5/9. A futás eredményénél érzékelhető (a törtrész "végén" lévő 4) a double adattípus pontossága.

4.2. Operátorok

  • operátor
    • unáris
    • bináris
      • multiplikatív
      • additív
  • explicit típuskényszerítés
  • asszociativitás
  • értékadási kompatibilitás

4.3. Léptető operátorok

  • unáris léptető operátor
    • prefix
    • postfix

4.4. A Math osztály fontosabb metódusai

  • túlterhelt metódusok
  • szignatúra

4.5. Véletlenszámok előállítása

  • Math.random()
  • [A; B] zárt intervallumból generálunk egy egész véletlenszámot
Alapfogalmak
3.1. Első Java programunk

    osztály
    blokk
    main metódus
    konzol
    forráskód formázása

3.2. A Java programok alkotóelemei

    unikód karakter
    fehér szóköz
    megjegyzés
    azonosító
    kulcsszó
    literál
    szeparátor
    operátor

3.3. Változó, adattípus

    változó
    adattípus
    primitív numerikus adattípusok
    karakter típus
    logikai típus
Grafikus felhasználói felület felépítése

    GUI elemei
        látható komponensek
        nem látható elemek
    AWT
        java.awt csomag
    Swing
        javax.swing csomag

16.1. Áttekintés

    AWT és Swing osztályhierarchia

16.2. Nem látható elemek

    java.awt.Point
    java.awt.Dimension
    java.awt.Rectangle
    java.awt.Toolkit

16.3. Első lépések a GUI felé

    java.swing.JFrame
    java.awt.Font
    javax.swing.JLabel
    javax.swing.JButton
    javax.swing.JPanel
    javax.swing.SwingConstants

16.4. Elrendezésmenedzserek

    java.awt.FlowLayout
    java.awt.GridLayout
    java.awt.BorderLayout
    javax.swing.BoxLayout
    javax.swing.OverlayLayout


Swing-komponensek

    MVC-modell
    háromrétegű architektúra: modell, view, controller

18.1. Címke - JLabel
18.2. Nyomógomb - JButton
18.3. Jelölőnégyzet - JCheckBox
18.4. Rádiógomb - JRadioButton
18.4.1. Feladat - Rádiógomb1
A program kínálja fel egy számla kiegyenlítéskor megadható fizetési módokat: készpénz, átutalás, csekk! Alapértelmezett a készpénzes fizetési mód! A felhasználó által kiválasztott fizetési mód egy címkében jelenjen meg! A megvalósításhoz rádiógombokat használjon!
Forráskód

import java.awt.*;
import java.awt.event.*;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

public class Rádiógomb1 extends JFrame
    implements ActionListener {
  private JLabel lbFizetésiMód=new JLabel();
  private JRadioButton rbKészpénz=
    new JRadioButton("készpénz", true);                 //1
  private JRadioButton rbÁtutalás=
    new JRadioButton("átutalás");                       //2
  private JRadioButton rbCsekk=new JRadioButton("csekk");
  private ButtonGroup bg=new ButtonGroup();             //3

  public Rádiógomb1() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setTitle("Fizetési mód");
    setSize(250, 120);
    setLocationRelativeTo(this);
    setLayout(new FlowLayout());                        //4
    JPanel pn1=new JPanel(new GridLayout(2, 1));        //5
    pn1.add(new JLabel("Fizetési mód: "));              //6
    pn1.add(lbFizetésiMód);                             //7
    add(pn1);
    JPanel pn2=new JPanel(new GridLayout(3, 1));        //8
    pn2.add(rbKészpénz); bg.add(rbKészpénz);            //9
    pn2.add(rbÁtutalás); bg.add(rbÁtutalás);
    pn2.add(rbCsekk);    bg.add(rbCsekk);
    add(pn2);
    rbKészpénz.addActionListener(this);                //10
    rbÁtutalás.addActionListener(this);
    rbCsekk.addActionListener(this);
    rbKészpénz.doClick();                              //11
    setVisible(true);
  }

  public void actionPerformed(ActionEvent e) {
    String fizetésiMód=
      ((JRadioButton)e.getSource()).getText();         //12
    lbFizetésiMód.setText(fizetésiMód);                //13
  }

  public static void main(String[] args) {
    new Rádiógomb1();
  }
}

Fájlkezelés

    bejegyzés
    fájltartalom feldolgozása
        folyam
        közvetlen elérés
    java.io csomag

19.1. A File osztály

    java.io.File
    bejegyzés
        állomány
        mappa
    fizikai név
    logikai név

19.2. Szűrés, kiválasztás

    java.io.FilenameFilter
    javax.swing.JFileChooser

19.3. Műveletek bejegyzésekkel
19.4. Szövegfájlok

    java.io.FileReader
    java.io.FileWriter

19.4.1. Feladat - SzövegFájl1
A program az üres szöveget végjelnek tekintve olvasson be a konzolról szövegeket és mentse a files/szöveg.txt szövegfájlba!
Forráskód

import java.io.File;
import java.io.FileWriter;                              //1
import java.io.IOException;

public class SzövegFájl1 {
  public static void main(String[] args) {
    File szövegFájl=new File("./files/szöveg.txt");
    try {
      FileWriter fw=new FileWriter(szövegFájl);         //2
      int sorDb=0;
      String sor;
      while(!(sor=extra.Console.readLine(
           ++sorDb+". sor: ")).equals(""))              //3
        fw.write(sor+"\r\n");                           //4
      fw.close();                                       //5
    }
    catch(IOException e) {
      System.out.println("I/O hiba: "+e.getMessage());
    }
  }
}

A program lehetséges futása

1. sor: alma
2. sor: barack
3. sor: dinnye
4. sor:

Elemzés
A program importálja a fájlba író karakterfolyamot megvalósító FileWriter osztályt (//1). Az fw objektum kiviteli karakterfolyamként jön létre (//2), amely az esetleg már létező fájlt felülírja. A kétparaméteres konstruktorát használva (FileWriter(szövegFájl, true)) használható lenne már létező állomány bővítésére is. A ciklus üres String végjelig (Enter-ig) olvassa a sor-t a konzolról (//3) és írja a folyamba (//4). A sor végét meg kell adni: "\r\n". Végül bezáródik a folyam (//5).
19.5. Folyamok

    folyam
    bemeneti folyamok
        java.io.ByteArrayInputStream
        java.io.FileInputStream
        java.io.DataInputStream
        java.io.ObjectInputStream
        java.io.Reader
    kimeneti folyamok
        java.io.ByteArrayOutputStream
        java.io.FileOutputStream
        java.io.DataOutputStream
        java.io.ObjectOutputStream
        java.io.Writer
    adatfeldolgozási irány
    adatmozgatási egység
    Serializable interfész

19.6. Beállítófájlok

    java.util.Properties
------------------------------
/*
 * Készítsünk programot, amely véletlen számokat generál.
 */
package veletlen;

import java.util.Random;

public class Veletlen {

        public static void main(String[] args) {
        Random rnd = new Random();
       
        System.out.println("Véletlen számok generálása.");
       
        //Egy véletlen szám.
        System.out.println("Paraméter nélkül: "+rnd.nextInt());
        //0..30 közötti véletlen szám.
        System.out.println("0..30 közötti véletlen szám: "+rnd.nextInt(31));
        //20..60 közötti véletlen szám.
        System.out.println("20..60 közötti véletlen szám:"+
                (rnd.nextInt(41)+20));
    }
   
}
-------------
/*
 * Kockadobás szimulációja, metódusok és tömbök felhasználásával.
 */
package tombok;
import java.util.Random;


public class Tombok {

    /    public static void main(String[] args) {
        // Tömb feltöltése
        int [] tomb = new int[30];
        int [] tombDobas = new int[6];
        tombFeltolt(tomb, 1, 6);
       
        // Tömb kiíratása
        tombKiir(tomb);
       
        //Kockadobás statisztikája
        dobasStat(tomb, tombDobas);
        System.out.println("\nDobások statisztikája:");
        System.out.println("\n1 - 2 - 3 - 4 - 5 - 6");
        tombKiir(tombDobas);
    }
   
    //Adott tömböt véletlen értékekkel feltöltő metódus
    public static void tombFeltolt(int[] t, int kezd, int veg){
        Random rnd = new Random();
        for(int i = 0; i < t.length; i++)
            t[i] = rnd.nextInt(veg-kezd+1)+kezd;
    }
   
    //Adott tömb kiírása a képernyőre.
    public static void tombKiir(int[] t){
        for(int i = 0; i < t.length; i++){
            if((i % 10 == 0) && (i != 0))
                System.out.println();
            System.out.print(t[i]+",  ");
        }
    }
   
    public static void dobasStat(int [] t, int [] dStat){
        //A dStat elemeit nem kell nullázni, mert nullarendű kezdőértéket kapnak.
       
        for(int i = 0; i < t.length; i++){
            switch(t[i]){
                case 1: {dStat[0]++; break;}
                case 2: {dStat[1]++; break;}
                case 3: {dStat[2]++; break;}
                case 4: {dStat[3]++; break;}
                case 5: {dStat[4]++; break;}
                case 6: {dStat[5]++; break;}
            }
        }
    }
   
}
------------------
http://www.szerencsiszakkepzo.sulinet.hu/jegyzet/info/Tetelek_db_szum_atlag.pdf
-----------------
/*
 * Töltsünk fel egy tömböt véletlenszerűen, az adott index kétszeres értékével.
 */
package veletlentomb;
import java.util.Arrays;
import java.util.Random;


public class VeletlenTomb {

      public static void main(String[] args) {
        Random rnd = new Random();
       
        int[] t = new int[30];
       
        System.out.println("Tömb indexeinek kiíratása:");
        for(int i = 0; i < t.length; i++)
            System.out.printf("%3d,",i);
        System.out.println("\n");
       
        Arrays.fill(t, -1);
       
        System.out.println("Inicializálás után a tömb elemeinek kiíratása:");
        //foreach ciklussal
        for(int e: t)
            System.out.printf("%3d,",e);
        //a soremelés miatt
        System.out.println("\n");
       
        int szamlalo = 30;
        int vi = -1;  //véletlen index
       
        do{
            do{
                vi = rnd.nextInt(30);
            }while(t[vi] != -1);
            t[vi] = 2 *vi;
            szamlalo--;
        }while(szamlalo > 0);
               
        System.out.println("Tömb elemeinek kiíratása - index kétszerese -");
        //foreach ciklussal
        for(int e: t){
            System.out.printf("%3d,",e);
        }
        //soremelés miatt
        System.out.println("");
    }
   
}
-------------------
/*
 * Prímszámok meghatározása.
 */

package primek;


public class Primek {

       public static void main(String[] args) {
        //2000-től 20001-ig keressük meg a prímszámokat!
        int primekszama = 0;
        for (int n = 2000; n <= 20001; n++) {
            int i = 2;
            double sq = Math.sqrt(n);
            while ((n%i != 0) && (i <= sq)) {
                i++;
            }
            if (i > sq) {
                primekszama++;
                if (primekszama % 15 != 0){
                    System.out.print(n+", ");
                }
                else {
                    System.out.println();
                    System.out.print(n+", ");
                }
            }
        }
        System.out.println("");
        System.out.println("Primek száma 2000 és 20000 között: "
                    +primekszama+" darab.");
    }
   
}
----------------
/*
 * Stringeket tartalmazó tömb.
 * Kérjünk be 5 karakterláncot és listázzuk ki.
 */
package stringtomb;
import java.util.Scanner;

public class StringTomb {

    public static void main(String[] args) {
        // TODO code application logic here
        Scanner be = new Scanner(System.in);
        String [] st = new String[5];
       
        // tömb feltöltése
        for(int i = 0; i < st.length; i++){
            System.out.print((i+1)+". gyümölcs: ");
            st[i] = be.nextLine();
        }
       
        // szöveg kiírása egymás alá
        System.out.println("\nA megadott gyümölcsök listája fordított sorrendben");
        for(int i = st.length-1; i >= 0; i--)
            System.out.println(st[i]);
    }
   
}
---------------------
/*
 * Készíts Java programot. Kérje be egy telek oldalait a felhasználótól
 * méterben. Írja ki a telek területét négyszögölben (1 n-öl = 3.6 m2).
 * Ha a telek 100 négyszögölnél kisebb, akkor írja ki, hogy túl kicsi!
 * Felhasználóbarát program!
 */
package telek;
import java.util.Scanner;


public class Telek {

       public static void main(String[] args) {
        Scanner be = new Scanner(System.in);
        double a, b, nOl, t;


        System.out.println("Telek oldalainak megadása:");
        System.out.print("a = ");
        a = be.nextDouble();
        System.out.print("b = ");
        b = be.nextDouble();


        t = a* b;        //négyzetméterben
        nOl = t / 3.6;   //négyzetölben
        System.out.println("Terület négyzetölben: "+nOl);
       

    if(nOl < 100)
            System.out.println("Túl kicsi.");
    }
   
}


2018. szeptember 16., vasárnap

Támadási típusok


A számítógépes hálózatok elleni támadások sokfélék lehetnek. Az alábbiakban a leggyakrabban előforduló támadási típusokat tekintjük át.

Szolgálatmegtagadás típusú támadások (Denial of Service, DoS)
A szolgálatmegtagadás típusú támadások lényege, hogy egy rosszindulatú személy olyasmit tesz a hálózattal vagy a kiszolgálóval, ami zavarja a rendszer működését, lehetetlenné teszi a munkavégzést. (Pl. elárasztjuk a gépet pingekkel, ekkor nem marad ideje más, hasznos tevékenységre.) Egy ilyen támadásból nem sok haszna lehet egy kalóznak, betörni nem tud a rendszerbe, csak épp működésképtelenné teheti azt. Több ilyen módszer létezik, ezek közül említünk néhányat.

SYN árasztás (SYN flood)
A kiszolgáló és az ügyfél közötti kapcsolat felépítése normális esetben úgy zajlik, hogy az ügyfél elküld egy SYN csomagot, amelyre a kiszolgáló egy SYN-ACK csomaggal válaszol, majd az ügyfél visszaküld egy ACK csomagot, és megnyílik a kapcsolat. A SYN árasztás lényege, hogy a támadó rengeteg hamis SYN csomagot küld el egy gépnek, tehát a csomagok látszólag egy olyan gépről érkeznek, amely nem érhető el. Ez – hasonlóan a ping elárasztáshoz – annyira leterheli a megtámadott gépet, hogy annak nem marad ideje a valódi SYN csomagok kezelésére.

Kétfajta védekezési mód van az ilyen támadás ellen: a SYN cookie, illetve az RST cookie. Mindekttő lényege, hogy mielőtt nekiállna a gép elkészíteni a SYN csomaghoz tartozó kapcsolat-rekordot, további adatot kér az ügyféltől, hogy meggyőződjön annak létezéséről. (SYN – kapcsolatsorszámot, RST – hibás SYN-ACK csomagot küld vissza, és a válaszból kiderül, mi a helyzet; az RST nem terjedt el, mert nem Windows-os.)

Land támadások
Hamis forráscímet vagy portszámot tartalmazó SYN csomagot küld a támadó (csak egyet), ezzel “kiakaszthatja” a célgépet.

Smurf támadások
Hasonló a ping elárasztáshoz, de itt a ping csomag broadcast üzenetként kerül elküldésre, és fejlécében a megtámadott gép címe van feltüntetve, mint feladó. A csomagot akár több száz gép is megkaphatja, amelyek válaszukat mind a megtámadott gépre küldik. Ez tehát többszörös támadás, mert közben a válaszadó gépeket is leterheljük.

Védekezni ellene úgy lehet, ha a hálózatunkat úgy állítjuk be (mindenki figyel a sajátjára), hogy routereink ne engedélyezzék az irányított broadcast üzenetek elküldését.

IP hamisítás (IP spoofing)
Lényege, hogy az elküldött SYN csomagban nem a csomag tényleges forrása van feltüntetve feladóként. A célgép válaszol egy SYN-ACK-kal, és vár a válaszra, ami nem jön. Egy idő után elévül a félig megnyitott kapcsolat, de ha ezalatt újabb ilyen csomagot küldünk, akkor megint csak olyan ciklusba keveredik a gép, amiből nem tud kijönni. Különbség a Land támadásoktól, hogy ott a TCP/IP megvalósításának hibáját használja ki a támadó, itt meg simán a kapcsolatnyitási eljárást.

Védekezni csak közvetve lehet: rövid elévülési idők használatával, illetve passzívan (mindenki a sajátját) úgy, hogy routereinket úgy állítjuk be, hogy ne engedjenek ki hamis forráscímű csomagokat.

(IP-Spoofing: ez is “IP hamisítás”, de olyan, amikor a támadó olyan forrást szimulál, amelyben megbízik a célgép, és ezáltal a szimulált gépnek megfelelő jogosultságot kap a betolakodó.)

Teardrop
Elég súlyos támadás, de már tettek ellene az operációs rendszerekben. Lényege, hogy hamis fejlécekkel rendelkező TCP vagy UDP csomagokat küld a támadó a célgépnek, amelyekben az IP-fejléc “Azonosítás”, “Zászlók” és “Darabeltolás” mezőit valótlan adatokkal tölti fel. A célgép ezen adatok alapján próbálja meg összerakni a teljes csomagot, és lelassul, akár le is fagyhat.

Ping of Death
Gyors és halálos, de már idejemúlt. Túlságosan nagy (>64 kilobyte) ICMP csomagot (Internet Message Control Protocol, a PING is ezt használja) küldenek a célgépnek, amitől az azonnal lefagy(ott).

Puffertúlcsordulás
Ha túl sok adatot küldünk, és puffertúlcsordulást idézünk elő (az alkalmazás hibáját kihasználva), akkor a puffer után közvetlenül elhelyezkedő memóriaterületre kerülnek a fölös adatok. Az eredeti adatok innen nyilván elvesznek. A kiszolgálón levő adatok tehát megsérülhetnek, vagy akár le is állhat a kiszolgáló. A legveszélyesebb az, amikor a puffer utáni terület az utasításveremhez tartozik, ekkor ugyanis elő lehet készíteni a túlcsorduló adatokat úgy, hogy azok új, értelmes utasításokat tartalmazzanak. Ezek az utasítások ugyanolyan jogosultságok mellett kerülnek végrehajtásra, mint az éppen futó program, és így teljes körű hozzáférést kaphat a betolakodó a számítógépbe. (Ezt ki lehet egészíteni egy olyan támadással, amikor a CGI-t használjuk ki; a CGI programok olyan webkiszolgáló által futtatott programok, amelyek képesek parancsokat is végrehajttatni a kiszolgálóval. Ha vakon elfogadja a weblapon megadott bemenetet, akkor simán betörhet bárki a rendszerbe (pl. a rendszer jelszavainak kilistázását kiadja parancsként).)

Trójai falovak
Látszólag hasznos programok, amelyek a háttérben azonban bűnös és gonosz dolgokat művelnek…(pl. terminálbeléptető program, letölthető frissítések, stb.) Ugyanolyan jogosultságokkal rendelkezik a program, mint az azt (tudattalanul) futtató felhasználó, szóval nagyon nagy károkat okozhat a rendszerben.

Ezen kívül persze lehet fizikailag is betolakodni egy rendszerbe (simán bemegy valaki az irodába), illetve átveréssel is megszerezhetnek személyes információkat (jelszavakat, stb.), pl. másnak adják ki magukat telefonon, ilyesmi.

Lehallgatott átvitel
Az egyik legkényesebb téma a hálózati biztonságban azonban az átvitel lehallgatása. Egyrészt: az azonosítási folyamat nyitva áll a lehallgatásra, amit megtehet bárki, például egy hálózatfigyelő program használatával. (Ezeket egyébként hasznos célokra találták ki; Mitniket is ennek segítségével kapták el.) Másrészt pedig (érdekes módon) sok hálózati szolgáltatás az azonosítás és a jelszó elküldésekor nem használ semmiféle titkosítást, hanem nyers szöveg formájában röpködnek a bizalmas adatok a neten.

URL: http://www.webgobe.com/ikomm/5ttipus.html

Windows Server 2016

A Windows Server 2016 egy szerver operációs rendszer által kifejlesztett Microsoft részeként Windows NT operációsrendszer-család, a fejlett egyidejűleg a Windows 10 . Az első korai előnézeti verzió (Műszaki előnézet) 2014. október 1-jén elérhetővé vált a System Center első technikai előnézetével együtt . [6] A Windows Server 2016-at 2016. szeptember 26-án adták ki a Microsoft Ignite konferencián [1], és 2016. október 12-én általánosan elérhetővé váltak. [2] Két utódja van: a Windows Server 2019 és a Windows Server féléves csatornája , amely kizárja agrafikus felhasználói felület és sok régebbi komponens.


tartalom
1 Jellemzők
1.1 Hálózati funkciók
1.2 Hyper-V
1.3 Nano szerver
2 Fejlesztés
2.1 Előnézeti kiadások
2.2 Nyilvános kiadás
3 Verziótörténet
3.1 Műszaki előnézet
3.2 Műszaki előnézet 2
3.3 Műszaki előnézet 3
3.4 Műszaki előnézet 4
3.5 Műszaki előnézet 5
3.6 A gyártás felszabadítása
4 Verzió 1709
5 Lásd még
6 Referenciák
7 Külső linkek
Jellemzők
A Windows Server 2016 számos új funkcióval rendelkezik, többek között

Active Directory Federation Services : Az AD FS konfigurálható a nem AD könyvtárakban tárolt felhasználók hitelesítésére, például az X.500-kompatibilis Lightweight Directory Access Protocol (LDAP) könyvtárak és az SQL adatbázisok hitelesítésére. [7]
Windows Defender : A Windows Server Antimalware alapértelmezés szerint telepítve van és engedélyezett a GUI nélkül, amely telepíthető Windows-szolgáltatás. [8]
Távoli asztali szolgáltatások : az OpenGL 4.4 és OpenCL 1.1 támogatása, a teljesítmény és a stabilitás javítása; MultiPoint Services szerepkör (lásd: Windows MultiPoint Server ) [9]
Tárolási szolgáltatások: központi tároló QoS házirendek; Tárolási replikák (tároló-agnosztikus, blokkszintű, térfogat-alapú, szinkron és aszinkron replikáció SMB3 segítségével szerverek között a katasztrófa-helyreállításhoz ). [10] A tárolási replikáció blokkokat replikál a fájlok helyett; fájlok használhatók. Nem többmester, nem egy-sok-sok, és nem átmeneti. Időről időre reprodukálja a pillanatképeket, és a replikációs irány megváltoztatható.
Failover fürtözés : Cluster operációs rendszer gördülő frissítése, Storage Replikák [11]
Web Application Proxy : Preauthentication for HTTP Alapvető alkalmazás közzététel, az alkalmazások helyettesítő domén közzététele, HTTP a HTTPS átirányításra, Az ügyfél IP-címének továbbítása az alkalmazások támogatására [12]
IIS 10 : HTTP / 2 támogatás
Windows PowerShell 5.1 [13]
Windows Server konténerek [14]
Hálózati funkciók
DHCP : Mivel a Network Access Protection elavult a Windows Server 2012 R2 rendszerben, a Windows Server 2016-ban a DHCP-szerepkör már nem támogatja az NAP [15]
DNS :
DNS-ügyfél: Szolgáltatáskötés - több hálózati csatolóval rendelkező számítógépek támogatása [16]
DNS-kiszolgáló : DNS-irányelvek, új DDS-rekordtípusok (TLSA, SPF és ismeretlen rekordok), új PowerShell cmdletek és paraméterek [17]
A Windows Server Gateway most támogatja a Generic Routing Encapsulation (GRE) alagutakat [18]
IP-cím kezelés (IPAM): támogatás a / 31, / 32 és / 128 alhálózathoz; fájl alapú, domain-összekapcsolt DNS-kiszolgálók felfedezése; új DNS funkciók; a DNS, a DHCP és az IP-cím (DDI) menedzsment jobb integrációja [19]
Hálózati vezérlő: Új kiszolgálói szerepkör a virtuális és fizikai hálózati eszközök és szolgáltatások konfigurálásához, kezeléséhez, felügyeletéhez és hibaelhárításához az adatközpontban [20]
Hyper-V hálózati virtualizáció : Programozható Hyper-V kapcsoló (a Microsoft szoftveres hálózati megoldásának új építőköve ); VXLAN kapszulázási támogatás; A Microsoft Software Load Balancer interoperabilitása; jobb IEEE Ethernet szabvány szerinti megfelelés. [21]
Hyper-V
Rolling Hyper-V klaszterfrissítés: A Windows Server 2008 R2-től 2012-ig terjedő klaszterek frissítésétől eltérően a Windows Server 2016 fürtcsomópontok hozzáadhatók a Windows Server 2012 R2 rendszerű csomópontokkal rendelkező Hyper-V fürthöz. A fürt továbbra is működik a Windows Server 2012 R2 szolgáltatási szintjén, amíg a klaszter összes csomópontja frissítésre nem került és a fürt funkcionális szintje frissítve lett. [22]
A szolgáltatás tárolási minősége (QoS) központilag felügyeli a végpontok közötti tárolási teljesítményt, és szabályokat hoz létre a Hyper-V és Scale-Out fájlszerverek használatával
Új, hatékonyabb bináris virtuális gép konfigurációs formátum (.VMCX kiterjesztés a virtuális gép konfigurációs adataihoz és a .VMRS kiterjesztés a futásidejű állapotadatokhoz)
Termelési ellenőrző pontok
Hyper-V Manager: Alternatív hitelesítő adatok támogatása, down-level menedzsment, WS-Management protokoll
Integrációs szolgáltatások Windows-felhasználók számára a Windows Update szolgáltatással
Forró hozzáadás és eltávolítás hálózati adapterekhez (2. generációs virtuális gépekhez) és memória (az 1. generációhoz és a 2. generációs virtuális gépekhez)
Linux biztonságos indítás
Csatlakoztatott készenléti kompatibilitás
A Hyper-V tárolási rugalmassági jellemzője a VM tárolóhoz való kapcsolódás átmeneti veszteségének kimutatására szolgál. A VM-eket a kapcsolat újbóli létrehozásáig szüneteltetik. [23]
RDMA kompatibilis virtuális kapcsoló [24]
Nano Server
A Microsoft bejelentette az új telepítési opciót, a Nano Server-et, amely a Windows Server minimális méretű fej nélküli verzióját kínálja. Nem tartalmazza a grafikus felhasználói felületet, a WoW64 (32 bites szoftverek támogatását) és a Windows Installer programot . Nem támogatja a konzol bejelentkezését , akár helyi, akár távoli asztali kapcsolat segítségével . Az összes menedzselés távoli módon történik a Windows Management Instrumentation (WMI), a Windows PowerShell és a távoli kiszolgálókezelő eszközök (webes GUI és parancssori eszközök gyűjteménye) segítségével. [25]Az 5. technikai előnézetben azonban a Microsoft újból felvette a Nano Server helyi szintű felügyeletét a PowerShell segítségével. A Microsoft mérnöke Jeffrey Snover szerint a Nano Server 93% -kal alacsonyabb VHD méretű, 92% -kal kevesebb kritikus biztonsági tanácsadást és 80% -kal kevesebb újbóli indítást tesz lehetővé, mint a Windows Server. [26] [27]

A Nano Server csak a Microsoft Software Assurance ügyfelek számára elérhető [2] és olyan cloud computing platformokra, mint a Microsoft Azure és az Amazon Web Services .

A Windows Server 1709-es verziójának új szolgáltatás-kiadásával kezdődően a Nano Server csak egy konténerszállítóban telepíthető . [28]

Fejlesztés
A Microsoft átszervezte a Satya Nadella-t , és összekapcsolta a Szerver és a Rendszerközpont csapatait. Korábban a kiszolgálócsapat jobban összehangolta a Windows ügyfélcsapatát. Az Azure csapat szorosan együttműködik a szervercsapattal. [29]

2017 márciusában a Microsoft bemutatta az ARMv8-A architektúrán futó 2016 kiszolgáló belső verzióját . Azt jelentették, hogy a Microsoft dolgozik Qualcomm Centriq és Cavium ThunderX2 chips. A Verge James Vincent szerint ez a döntés veszélyezteti az Intel domináns szerepét a kiszolgáló CPU piacán. [30] [31] [32] Később azonban vizsgálatot a Microsoft felfedte, hogy ez a verzió a Windows Server kizárólag belső használatra, és csak hatásait előfizetőket Microsoft Azure szolgáltatás. [33]

Előnézeti kiadások
Fő cikk: Windows Insider
A Windows Server 2016 nevű nyilvános verziója (amelyet még mindig vNext néven ismert ) "Windows Server műszaki előnézetként" megjelölve 2014. október 1-jén jelent meg; a technikai előnézeti buildek a vállalati felhasználók felé irányulnak. Az első technikai előnézet először 2015. április 15-én ér véget, de [34] a Microsoft később kiadott egy eszközt a lejárati dátum meghosszabbítására, amely 2015 májusában az operációs rendszer második technikai előnézete végéig tart. [35] A második bétaverzió "Műszaki előnézet 2" megjelent, 2015. május 4-én. A harmadik technikai előnézeti verzió 2015. augusztus 19-én jelent meg. A "Technical Preview 4" megjelent, 2015. november 19-én. kiadták 2016. április 27-én.

A Windows Server 2016 Insider Preview Build 16237 kiadása 2017. július 13-án jelent meg a Windows Insider-nél. [36] [37]

Nyilvános kiadás
A Windows Server 2016-ben hivatalosan is megjelent a Microsoft Ignite konferencia szeptember 26-án, 2016. Ellentétben elődje, a Windows Server 2016 licenc száma CPU magok helyett több CPU foglalatok -a változás, ami hasonlóan fogadták el BizTalk Server 2013 és SQL Server 2014 . [38] A Windows Server 2016 által elfogadott új licencszerkezet szintén eltávolodott a Windows Server 2012 / 2012R2 CPU socket licencelési modelljétől, mivel most egy engedélyben szereplő magok száma korlátozott. A Windows Server 2016 Standard és Datacenter alapú licencek mindegyik fizikai processzornak legalább 8 fő licencet és legalább 16 fő licencet tartalmaznak minden kiszolgáló számára. A Core licenszeket két standard csomagban értékesítik, a két virtuális operációs környezet futtatására vonatkozó ismerős jogokkal. Ha a kiszolgáló több mint 16 alaplicencet fut át ​​egy 2 processzor-kiszolgálóhoz, a Windows Server 2016-ra további licencekre van szükség. [39]

Verziótörténet
Műszaki előnézet
A Windows Server 2016 technikai előnézete, amely 2014. október 1-jén jelent meg, az operációs rendszer első bétaverziója nyilvánosan elérhetővé vált. Verziószáma 6.4.9841 volt. [6]

Műszaki előnézet 2
A Windows Server 2016 technikai előnézete 2015 május 4-én áll rendelkezésre. A verziószám 10.0.10074 volt. (A Windows 10-es verziójában a 6-tól 10-ig terjedő verziószám legjelentősebb része hasonló ugrás). Ennek a verziónak a legfontosabb elemei a következők: [40]

Nano Server telepítési opció [41] [42]
Hyper-V: forró felvenni és eltávolítani a memóriát és a hálózati kártyát; rugalmas virtuális gépek, még akkor is, ha a klaszter szövetük meghibásodik [43]
A Hyper-V és a Storage klaszterek gördülő frissítései [41] [43]
Hálózatépítés: konvergens NIC a bérlő és az RDMA forgalom között; PacketDirect 40G- on [43]
Tárolás: virtuális gép tárolási út rugalmasság; Tárolási területek Közvetlenül összevonásra Tárolási területek több szerveren; Tárolás Replica [43]
Biztonság: Host Guardian szolgáltatás, amely segíti a bizalmi és elszigetelési határ fenntartását a felhő infrastruktúra és a vendég OS rétegei között; Csak elégséges adminisztráció, korlátozva a felhasználókat csak meghatározott feladatok végrehajtására [43]
Menedzsment: PowerShell kívánt állapot konfiguráció; PowerShell csomagkezelő; Windows Management Framework 5.0 április Preview és DSC Resource Kit [43]
Egyéb: feltételes hozzáférés-szabályozás az AD FS-ben; az alkalmazás-hitelesítési támogatás az OpenID Connect és az OAuth számára; Teljes OpenGL támogatás RDS-vel a VDI számára; Szerveroldali támogatás a HTTP / 2 számára , beleértve a fejléc tömörítését, a kapcsolat multiplexelését és a kiszolgáló push [43]
Telepítési lehetőségek: A Minimal Server Interface alapértelmezettnek minősül, és átnevezte a Server installation (Kiszolgáló telepítése) opciót: "Server with local admin tools". [44]
Műszaki előnézet 3
A Windows Server 2016 harmadik technikai előnézete 2015. augusztus 19-én érhető el. A verziószám 10.0.10514 volt. Ennek a verziónak a legfontosabb elemei a következők:

Windows Server konténerek [45]
Active Directory Federation Services (AD FS): a Lightweight Directory Access Protocol (LDAP) könyvtárakban tárolt felhasználók hitelesítése [45]
Telepítési lehetőségek: A kiszolgáló telepítési opcióját átnevezték "Szerver az asztali tapasztalattal", alapértelmezés szerint a shell és a Desktop Experience telepítve. Az Asztalon szerzett tapasztalatok kiszolgálóra történő továbbításához szükséges szerkezeti változtatások miatt már nem lehetséges a kiszolgáló asztali tapasztalatokból kiszolgálóra történő konvertálása, illetve a Server Core szerverre történő konvertálása a Desktop Experience segítségével. [44]
Technikai előnézet 4
Az operációs rendszer negyedik technikai előnézete 2015. november 19-én, egy évvel és egy hónappal az eredeti technikai előnézet után érhető el. Verziószáma 10.0.10586 volt. Kiemeli a következőket:

A Nano Server támogatja a DNS-kiszolgáló és IIS-kiszolgáló szerepköröket, valamint az MPIO, VMM, SCOM, DSC push módot, a DCB-t, a Windows Server telepítőt és a Windows Update WMI szolgáltatóját. A helyreállítási konzol támogatja a hálózati konfiguráció szerkesztését és javítását. Most már elérhető a Windows PowerShell modul, amely egyszerűsíti az épület Nano Server képeket. [46]
A Hyper-V Containers mindegyik tartályt egy könnyű virtuális gépbe foglalja. [46]
Műszaki előnézet 5
A Windows Server 2016 utolsó technikai előnézete 2016. április 27-én érhető el. A verziószám 10.0.14300 volt. Kiemeli a következőket: [47]

Többnyire általános finomítások. Nagyobb pontosság a fizikai és a virtuális gépekben
A konténer-támogatás növeli a teljesítmény javítását, egyszerűsíti a hálózatkezelést és támogatja a Windows-konténereket a Windows 10 rendszeren
Nano Server: egy frissített modul a Nano Server képek felépítésére, beleértve a fizikai gazdagép és a virtuális virtuális gépek funkcióinak szétválasztását, valamint a különböző Windows Server kiadások támogatását. A helyreállítási konzol javítása, beleértve a bejövő és kimenő tűzfalszabályok elválasztását, valamint a WinRM konfigurációjának javításának képességét
Hálózatépítés: az új vagy meglévő virtuális eszközök forgalma mostantól tükröződik és átirányítható. Az elosztott tűzfal és a hálózati biztonsági csoportok révén ez lehetővé teszi a dinamikusan szegmentált és biztonságos munkamennyiségeket az Azure-hoz hasonló módon . Az egész szoftvert definiált hálózati (SDN) verem telepíthető és kezelhető a System Center Virtual Machine Manager segítségével. A Docker használható a Windows Server konténerhálózatának kezelésére, és az SDN-házirendeket nem csak virtuális gépekhez, hanem konténerekhez is társítja
Távoli asztali szolgáltatások: a magas rendelkezésre állású RDS telepítés az RDC kapcsolatbővítő Azure SQL adatbázisát nagy rendelkezésre állású módban tudja kihasználni
Menedzsment: a PowerShell.exe helyszíni futtatása a Nano Server-en (már nem távoli), az új helyi felhasználók és csoportok cmdletjei a GUI cseréjekor, a PowerShell hibakeresési támogatása és a Nano Server támogatása a biztonsági naplózáshoz és átíráshoz, valamint a JEA (Just Elég adminisztráció)
Árnyékolt virtuális gépek:
Az új "titkosítás támogatja" mód, amely több védelmet nyújt, mint egy közönséges virtuális gépnél, de kevesebb, mint az "Árnyékolt" mód, miközben támogatja a vTPM-et, a lemezes titkosítást, a Live Migration forgalmi titkosítást és más funkciókat, beleértve a közvetlen szövetkezelési kényelmet, gépkonzol csatlakozások és a Powershell Direct
Teljes támogatás a meglévő, nem árnyékolt, 2. generációs virtuális gépek árnyékolt virtuális gépekké történő konvertálásához, beleértve az automatizált lemezkódolást
Az árnyékolt virtuális gépek kompatibilisek a Hyper-V Replicával.