gdf-1

61
Bevezetés, az első félév anyagának összefoglalása Programozási technológia Programozási technológia A Java programozási nyelv Objektum-orientált technológia és adatszerkezetek Dr. Fauszt Tibor

Upload: feherl2

Post on 13-Dec-2014

119 views

Category:

Documents


1 download

DESCRIPTION

gdf-1

TRANSCRIPT

Page 1: gdf-1

Bevezetés, az első félév anyagának összefoglalása

Programozási technológiaProgramozási technológia

A Java programozási nyelvObjektum-orientált technológia és adatszerkezetek

Dr. Fauszt Tibor

Page 2: gdf-1

Átismételjük:

• A szoftverfejlesztési folyamatot és eszközeit.

• Az értelmező program és a fordítóprogram közti különbséget.

• A Java Virtuális gép funkcióját, a bájtkód szerepét.

• A különböző funkciójú Java programok néhány tulajdonságát (konzolos, GUI, Applet, JSP)

• A vezérlési szerkezeteket és adattípusokat

Page 3: gdf-1

Szoftver ma

5,260,000,000

Page 4: gdf-1

Szoftver alkalmazások

• Nagyvállalati rendszerek

• Adatbázisok

• Internet, e-mail, stb.

• Katonaság

• Beágyazott rendszerek

• Tudományos kutatások

• Office programcsomagok, vállalati, egyéni kisalkalmazások

• Grafika, fotó, videó

• Média

• Játékok

• Stb.

Page 5: gdf-1

Szoftver fejlesztés

• Hangsúly a hatékonyságon Gyors algoritmusok Kis program méret Limitált

memóriahasználat

• Titkos kód

• Nem felhasználóbarát

• Hangsúly A programozók

hatékonyságán Csapatmunka A kód

újrafelhasználható-sága

Karbantarthatóság Hordozhatóság

• Jól dokumentált

• Felhasználóbarát

1950-1960: Manapság:

Page 6: gdf-1

Programozási nyelvek

1940 1950 1960 1970 1980 1990 2000

Gépi kód

Assembly

FortranBasic

Pascal

Scheme

C C++

JavaLISP

Smalltalk Smalltalk-80

C#

Logo

Python

Page 7: gdf-1

Java nyelv kialakulása

• Sun Microsystems 1990, projekt indul.Cél: részesedést szerezni az „okos” processzorokkal vezérelt, programozható készülékek területéből.

• Ehhez architektúra független technológia kellett, amely megvalósítja a kész programok hálózati letöltését és megbízható futtatását.

• Kezdetben C++ de alkalmatlannak találták a feladat megvalósításához.

Page 8: gdf-1

C++, vagy más?

• C++ nyelv alapja, de egyszerűsítve, továbbfejlesztve.

• Nyelv atyja: James Gosling, egy irodája előtt álló tölgyfáról Oak-nak nevezte el, de a név már foglalt volt.

• Imported from Java.

Page 9: gdf-1

A kezdetek

• Az internet a programozható eszközökhöz hasonló körülményeket teremt, hasonló körülményeket támaszt.

• 1995. május 23. a Javavilághódító útja elindul, minta böngészőkben futtathatókisalkalmazások (appletek)fejlesztőeszköze.

Page 10: gdf-1

Java program típusok

Konzol alkalmazások

GUI alkalmazások

AppletekJSP lapok

Servletek

Mobil alkalmazások

Page 11: gdf-1

Java alapfogalmak

• JVM (Java Virtual Machine) Java virtuális gép, értelmezi és futtatja a Java programot.

• JRE (Java Runtime Environment) Jáva futtatási környezet. Különböző számítógépes platformokra készül, a Java nyelven írt programok futtatásához szükséges. Tartalmazza a JVM-et és bővítményeket a böngészőkhöz.

• JDK (Java Development Kit) Java programok fejlesztéséhez szükséges eszköz. (készítés, fordítás, debuggolás, dokumentáció JVM is.)

• Java API (Application Programming Interface) alkalmazásprogramozási felület. Java osztálygyűjtemények.

Page 12: gdf-1

Java platformok

• A legtöbb platform a hardvert és az operációs rendszert jelenti.

• A Java platform teljes egészében szoftverplatform, és különböző hardver alapú platformokra épül.

• Java platform 2 része: Java virtuális gép (Java Virtual Machine) Java alkalmazás-programozási felület

(Java Application Programming Interface)

• Az alap platform (J2SE)

• Mobil eszközök programozása (J2ME)

• Webszolgáltatások, üzleti alkalmazások (J2EE)

Page 13: gdf-1

Szoftverfejlesztő eszközök

• Editor A forrásprogram megírására

(txt)

• Compiler A forrásprogram tárgykódú

lefordítására (nem gépi kód, csak specifikus instrukciók egy meghatározott CPU számára)

• Linker Végrehajtható programot

generál egy, v. több tárgykódból. Pl. exe.

• Debugger A program hibafeltárására

szolgáló eszköz, amellyel lépésről lépésre végrehajtható és elemezhető a program

Page 14: gdf-1

Fordító nyelvek:Szerkesztés-Fordítás-Összeépítés-Futtatás

Editor Forrás kód

Compiler Tárgy-kód

Linker Végre-hajtható programEditor Forrás

kódCompiler Tárgy-

kód

Editor Forrás kód

Compiler Tárgy-kód

Page 15: gdf-1

Értelmező típusú nyelvek:Szerkesztés-Futtatás

Szerkesztés Forrás kód

Értelmező

Page 16: gdf-1

Fordító vs. Értelmező

•Compiler: Szintaktikai hibák

ellenőrzése már szerkesztés közben

Gépi kódú utasításokat generál

Platform függő Szigorúbb

típusmegkötés A program futása

gyorsabb

• Interpreter: Szintaktikai hibák

ellenőrzése futás közben

Értelmezi, majd végrehajtja a program utasításait

Platform független Dinamikus típusosság

A program futtatása lassabb

Page 17: gdf-1

A Java hibrid megközelítése:Fordító + Értelmező

• A Java fordító lefordítja a Java forráskódot tárgykóddá, amelyet a Java virtuális gép (JVM) értelmezni tud

• Ezt az instrukciókat tartalmazó tárgykódú állományt hívjuk bájtkódnak amely minden platformon futtatható amelyen telepítve van a Java virtuális gép.

• A CPU specifikus Java virtuális gép fogja értelmezni és végrehajtani a bájtkódot.

Page 18: gdf-1

Java megoldása Compiler + Értelmező

Szerkesztő

Hello.java

Fordító

Hello.class

Hello,World!

Értelmező

PlatformokWintel = Windows+Intel

Lintel = Linux+IntelRISC+UNIX (Sun + Solaris)Macintosh Apple + MacOS

JVM

Page 19: gdf-1

Miért bájtkód?

• Platform-független

• Az értelmező gyorsabb és kisebb lehet így, mintha a forráskódot kellene értelmeznie és végrehajtania

• A forráskódot elrejthetjük a felhasználók elől

• Az értelmező kiszűrheti az ártalmas kódot, biztonsági ellenőrzést végezhet

Page 20: gdf-1

JDK — Java Development Kit

• javac Java fordító

• java Java értelmező

• appletviewer Appletek tesztelése

böngésző nélkül

• javadoc HTML dokumentáció

generálására a forráskód megjegyzéseiből

• jar Osztályok csomagolása .jar

fájlokba

Parancsvezérelt eszközök, nem GUI

Page 21: gdf-1

Programkészítés lépései

• JDK letöltése és telepítése. Ez tartalmazza a JRE-t is. Fordító (java forrásból java bájtkód) Ingyenes

• Egyszerű szerkesztő, pl. Notepad++ forráskód megírása.

• Forráskód mentése .java kiterjesztéssel, az osztállyal azonos néven.

• Fordítás: /bin könyvtárban található javac.exe fordítóval. A fordítás során a forráskóddal azonos

nevű .class kiterjesztésű állományok jönnek létre.

• Futtatás: /bin könyvtárban található java.exe programmal futtatjuk a .class állományokat.

javac HelloWorldApp.java

HelloWorldApp.java

java HelloWorldApp.class

Page 22: gdf-1

JDK (folytatás)

• Ingyenes, letölthető az Oracle honlapjáról

• Az összes dokumentáció megtalálható on-line.

• Számos további Java erőforrás található és letölthető

Page 23: gdf-1

Java IDE

• Grafikus felhasználói felület a fejlesztéshez

• Integrálja a szerkesztőt, a fordítót, a futtató környezetet, az applet megjelenítőt, a debuggert, a dokumentumkészítőt, egyéb eszközöket: Szintaktikai és szemantikai ellenőrzés, a navigálás

elősegítése a forráskódban, konzol, stb. Projektek kezelése, fejlesztőcsomagok telepítése.

• Általában a JDK- települ először és a fejlesztőeszköz erre épül.

Page 24: gdf-1

NetBeans IDE

• Web-mobil alkalmazások, fejlesztéséhez kiváló, ingyenes fejlesztőeszköz.

Forrásszerkesztő

ablak

Konzol

Projekt ablak

Navigátor ablak

Page 25: gdf-1

Konzolos alkalmazások

C:\> path=%PATH%; c:\Program Files\Java\jdk1.6.0_23\bin\C:\> javac Hello.javaC:\> java HelloAdd meg a Vezetékneved: NagyAdd meg a Keresztneved: KatalinSzia, Nagy KatalinNyomj meg egy gombot a folytatáshoz...

• Simple text dialog:Üzenet input, üzenet input ... eredmény

Page 26: gdf-1

Hello.java

import java.util.Scanner;

public class Hello{ public static void main(String[ ] args) { Scanner kboard = new Scanner(System.in); System.out.print("Add meg a vezetékneved: "); String vezetekNev = kboard.nextLine( ); System.out.print("Add meg a keresztneved: "); String keresztNev = kboard.nextLine( ); System.out.println("Hello, " + vezetekNev+ " " + keresztNev); System.out.println("Üdvözöllek a Javaban!"); }}

Adatbevitel

Page 27: gdf-1

Parancssori argumentumok

C:\> java Hello Nagy Katalin

Hello, Nagy Katalin

public class Greetings{ public static void main(String[ ] args) { String vezetekNev = args[ 0 ]; String keresztNev = args[ 1 ]; System.out.println("Hello, "+vezetekNev + " "+keresztNev); }}

A parancssori argumentumok átkerülnek a programba

Page 28: gdf-1

GUI Alkalmazások

Menük

Nyomógombok

Esemény-vezéreltpanelek

Csúszkák

Page 29: gdf-1

HelloGui.java

import java.awt.*;import javax.swing.*;

public class HelloGui extends JFrame{ < ... kód >

public static void main(String[ ] args) { HelloGui window = new HelloGui( ); window.setBounds(300, 300, 200, 100); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.setVisible(true); }}

GUI osztálygyűjtemények

Page 30: gdf-1

HelloApplet.java

import java.awt.*;import javax.swing.*;

public class HelloApplet extends JApplet{ public void init( ) { ... } public void start( ) { ... }}

Más szerkezet. Nincs main metódus: az init metódust hívja a JDK appletviewer vagy a böngésző

Page 31: gdf-1

HelloAndroid.java

public class HelloAndroid extends Activity {    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);    }}

Más osztály

Page 32: gdf-1

Algoritmusok...

• Formálisan nehéz definiálni

• Algoritmuson olyan meghatározott számú lépésekből álló módszert, utasítás(sorozato)t, részletes útmutatást, receptet értünk, amely valamely felmerült probléma megoldására alkalmas.

• Például eljárást, algoritmust, receptet lehet adni egy bútor összeszerelésére, valamilyen étel, mondjuk paprikás krumpli

elkészítésének módjára, A legkisebb közös többszörös kiszámítására.

Page 33: gdf-1

Eszközök az algoritmus leírására

• Pszeudokód Mesterséges formális nyelv amely változókból

és néhány állandó jelentésű szóból áll. Nem programozási nyelv, bár nagyon hasonlít

• Folyamatábra A folyamat grafikus ábrázolása

Page 34: gdf-1

Példa: számoljuk ki 12 + 22 + ... + n2

• Pszeudokód

Be: n

összeg = 0i = 1Ciklus amíg i n sq = i * i összeg = összeg + sq i = i + 1Ciklus vége

Ki: összeg

Page 35: gdf-1

Példa

• Folyamatábra

n

összeg=0i = 1

i n ?

sq = i * iösszeg=összeg + sqi = i + 1

összeg

Nem

Igen

Input / output

Lépés végrehajtása

Döntés

Page 36: gdf-1

Az első „igazi Bug”

Grace Hooper“(molylepke)

A relék között”

Mark II Aiken. Relé Calculator (Harvard University, 1945)

Page 37: gdf-1

Változók

• Az algoritmusok változókkal dolgoznak

• A változók névvel rendelkező tárolók

• A változókat elképzelhetjük úgy is, mint egy palatáblát, amelyre a felírt értéket letörölhetjük és újat írhatunk rá

összeg = összeg+ sq

összeg

Page 38: gdf-1

Az algoritmus néhány tulajdonsága

• Végesség: meghatározott lépésszám után fejeződjön be, vagy adjon eredményt.

• Tömörség: egy algoritmus ciklusokat, vagy rekurziót használhat, ugyanazon lépések többszörös végrehajtására.

• Általánosság: ne csak egy alkalomra legyen használható, hanem akkor is jó eredményt adjon, ha hasonló esetekre alkalmazzuk.

• Elvontság: egy algoritmus nem függ egy sajátos programozási nyelvtől vagy platformtól.

Page 39: gdf-1

Be: n

összeg = 0i = 1Ciklus amíg i n sq = i * i összeg = összeg + sq i = i + 1Ciklus vége

Ki: összeg

Tulajdonságok (folytatás)

Compact: ugyanaz a kódhossz függetlenül n értékétől, köszönhetően a ciklusoknak. Az algoritmus ugyanazokat a lépéseket ismétli különböző lépésszámban, a változók különböző értékeire

(A “futási idő” természetesen függ n értékétől)

Általános: minden n-re

Page 40: gdf-1

Tulajdonságok folyt.

function addSquares(n : integer) : integer; var i, sum : integer; begin sum := 0; for i := 1 to n do begin sum := sum + i * i end; addSquares := sum; end;

Elvont:PascalC/C++Java

public class MyMath{ public static int addSquares(int n) { int sum = 0; for (int i = 1; i <= n; i++) sum += i * i; return sum; }}

int addSquares(int n){ int i, sum = 0; for (i = 1; i <= n; i++) sum += i * i; return sum;}

"

Page 41: gdf-1

A Java primitív (elemi) adattípusai

• primitív típusok:

8 egyszerű típus számok, szövegek tárolására.

A többi típus objektum típus, amelyekre referenciák mutatnak

Név Leírás Értéktartomány Példák

byte Egész -128 – 127 (8bit)s 100, -52

short Egész -32.767 – 32.768 (16 bit)s

int Egész 32 bit s 42, -3, 0,

6394

long Egész 64 bit s

float Lebegőpontos 32 bit

double valós számok (10308) 64 bit 3.1,-0.25,

9.4e3

char karakterek 'a', 'X', '?', '\

n'

boolean logikai értékek true, false

Page 42: gdf-1

Aritmetikai operátorok

• operátor: Műveleteket hajtanak végre.

+ összeadás - kivonás * szorzás / osztás % egészosztás maradéka

• A program futása közben ezek a kifejezések kiértékelődnek.

• A műveleteknek precedenciájuk (végrehajtási prioritásuk) van.

• A kifejezések kiértékelése balról jobbra halad azonos precedencia esetén.

• A precedencia zárójelek alkalmazásával módosítható.

Page 43: gdf-1

Változók használata

• Értékek tárolására és kifejezésekben való használatra:

int x;x = 3;System.out.println("x értéke " + x); // x értéke 3

System.out.println(5 * x - 1); // 5 * 3 - 1

• A változók értéke felülírható:

int x;x = 3;System.out.println(x + " most"); // 3 most

x = 4 + 7;System.out.println("most x :" + x); // most x: 11

x 3x 11

Page 44: gdf-1

Tömbök

• array: olyan objektum, amely sok azonos típusú változó tárolására szolgál. elem: Egy érték a tömbben. index: Egy egészszám, amely biztosítja a hozzáférést az értékhez.

index 0 1 2 3 4 5 6 7 8 9

value 12 49 -2 26 5 17 -6 84 72 3

Page 45: gdf-1

Tömb deklarálása

típus[] név = new típus[hossz];

Például:

int[] szamok = new int[10];

index 0 1 2 3 4 5 6 7 8 9

value 0 0 0 0 0 0 0 0 0 0

Page 46: gdf-1

Elemek hozzáférésenév[index] // hozzáférés

név[index] = érték; // módosítás

Példa:

szamok[0] = 27;szamok[3] = -6;

index 0 1 2 3 4 5 6 7 8 9

érték 27 0 0 -6 0 0 0 0 0 0

Page 47: gdf-1

Különböző típusú tömbök

double[] eredmenyek = new double[5];eredmenyek[2] = 3.4;eredmenyek[4] = -0.5;

boolean[] tesztek = new boolean[6];tesztek[3] = true;

index 0 1 2 3 4

érték 0.0 0.0 3.4 0.0 -0.5

index 0 1 2 3 4 5

érték false false false true false false

Page 48: gdf-1

Indexhatár túllépés

• Legális indexek: 0 és a tömb mérete – 1 között kell lennie. Ezen a határon kívüli index értékkel a tömb indexelése

ArrayIndexOutOfBoundsException kivételdobáshoz vezet.

• Példa:int[] data = new int[10];System.out.println(data[0]); // rendbenSystem.out.println(data[9]); // rendbenSystem.out.println(data[-1]); // kivételSystem.out.println(data[10]); // kivétel

index 0 1 2 3 4 5 6 7 8 9

value 0 0 0 0 0 0 0 0 0 0

Page 49: gdf-1

Indexelésint[] szamok = new int[8];szamok[1] = 3;szamok[4] = 99;szamok[6] = 2;

int x = szamok[1];szamok[x] = 42;szamok[szamok[6]] = 11;

// használjuk szamok[6] értéket indexelésre

szamok

index 0 1 2 3 4 5 6 7

value 0 4 11 42 99 0 2 0

Page 50: gdf-1

Tömbre vonatkozó korlátozások

• Egy létező tömb méretét nem változtathatjuk meg:

int[] a = new int[4];a.length = 10; // error

• Nem lehet összehasonlítani két tömböt a == vagy equals utasítással:

int[] a1 = {42, -7, 1, 15};int[] a2 = {42, -7, 1, 15};if (a1 == a2) { ... } // hiba!if (a1.equals(a2)) { ... } // hiba!

• Egy tömb nem tudja kiírni saját elemeit:

int[] a1 = {42, -7, 1, 15};System.out.println(a1); // [I@98f8c4]

Page 51: gdf-1

The Arrays class

• A java.util csomag Arrays osztálya sok hasznos statikus medódust tartalmaz a tömbök kezelésére:

• Szintaxis: Arrays.metódusNév(paraméterek)

Metódus neve Leírás

binarySearch(tömb, érték) Egy rendezett tömbben megkeresi a megadott értéket és az érték indexével tér vissza ha megtalálta, ill. negatív értékkel, ha nem

copyOf(tömb, hossz) Egy tömb másolatával tér vissza

equals(tömb1, tömb2) Igaz értékkel tér vissza ha a tömb elemei rendről rendre megegyeznek

fill(tömb, érték) Minden elemet egy megadott értékre állít be

sort(tömb) Rendezi a tömb elemeit

toString(tömb) A tömb egyes elemeit szövegként adja vissza "[10, 30, -25, 17]"

Page 52: gdf-1

Miből építkezhetünk?

• Szekvenciából: azaz az utasítások egymásutáni végrehajtásából. (pl. értékadás, eredménykiírás, számolás, függvényhívás)

• Elágazásokból: azaz a program egy bizonyos pontján más szekvenciális ág végrehajtásából.

• Ciklusokból: azaz ugyanazon szekvencia többszöri végrehajtásából.

Page 53: gdf-1

Feltételes elágazás (if)

•Szekvencia (egymás utáni végrehajtás)

•Elágazás (alternatíva)

if (fizetes == 100000) { fizetes=110000; System.out.println("A fizetést megnöveltem"); } else { System.out.println("A fizetést nem növeltem meg"); }

Ha igaz a feltétel

Ha hamis a feltétel(elhagyható)

Page 54: gdf-1

Többágú szelekció (switch)

switch (x)

{

case 1: System.out.println("A hét első napja, hétfő"); break;

case 2: System.out.println("Kedd");break;

case 3: System.out.println("Szerda");break;

case 4: System.out.println("Csütörtök");break;

case 5: System.out.println("Péntek, mindjárt hétvége!"); break;

case 6:

case 7: System.out.println("Hurrá, hétvége");break;

default: System.out.println("Nincs ilyen nap!!");

}

break – kilépünk, különben az összes utasítást a következő break-ig végrehajtja

i – sorszámozott típus (char, short, int)

Page 55: gdf-1

Számláló ciklus

for (int i=2; i<=20; i=i+2)

{

System.out.println(i);

if (i==10) break;

}

Page 56: gdf-1

Ciklusok break

cimke:for (int i=0; i < 5 ; i++){         for (int j = 1; j < 5; j++)        {                System.out.println ("i: " + i + ", j: " + j);

                if (j==2) break; if (i == 3) break cimke;        }}

Page 57: gdf-1

Ciklusok folytatás (continue)

String szoveg = "egy kupac kopasz kukac";

int kszama = 0;

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

{

if (szoveg.charAt(i) != 'k') continue;

kszama++;

}

System.out.println(kszama+" k betű van a szövegben");

Page 58: gdf-1

Ciklusok címkézett folytatás

kulso:for (int i=0; i < 5 ; i++){ for (int j = 1; j < 5; j++) { System.out.println("i: " + i + ", j: " + j); if (i==2) continue; if(j == 3) continue kulso; }}

!

Page 59: gdf-1

For ciklus folyt.

int[] szamok = {1,2,3,24,51,62,17,28,9,10};

for (int elem : szamok)

{

System.out.println("Szám: " + elem);

}

Page 60: gdf-1

Elöltesztelő ciklus (while)

String[] Nevek =

{"Joó Xénia","Nivák Rózsa","Kovács Andrea"};

int i;

String s;

i=0;

while (Nevek[i].startsWith("Nivák")==false)

{

i++;

}

System.out.println(Nevek[i]);

Page 61: gdf-1

Hátultesztelő ciklus (do - while)

Scanner kbd = new Scanner(System.in);

int a;

do {

a=kbd.nextInt();

} while (a!=1);