Veri Yapıları – 2007 Java Programlama Diline Giri...
Transcript of Veri Yapıları – 2007 Java Programlama Diline Giri...
2
Java
• Java, ilk olarak Sun Microsystems tarafından geliştirilen nesne yönelimli programlama dilidir.
• 1995 yılında piyasaya sürülmüştür. James Gosling, Haziran 1991’de “Oak” adıyla geliştirmiştir.
• Platform bağımsızlığı (programı bir kere yaz, derle ve her platformda çalıştır), tasarım amaçlarındandır. Birçok donanım, işletim sistemi ve platformda çalışabilmektedir.
3
Önemli Java Gerçekleştirimleri
Generic yapılar, Autoboxing/Unboxing
Gelişmiş for döngüsü, Varargs (Değişken sayıda argüman)
J2SETiger
J2SE 5.0(2004)
J2SE (Java 2 Platform, Standard Edition)J2EE (Java 2 Platform, Enterprise Edition) J2ME (Java 2 Platform, Micro Edition).
J2SE
Java 2
J2SE 1.2(1998)
İlk sürümJava 1.0JDK 1.1 (1995)
AçıklamaAdSürüm
J2SE 6 (2006 sonu) : MustangJ2SE 7 (Ağustos 2006-2008) : Dolphin
4
JVM ve Bytecode
• JVM (Java Virtual Machine) veya Java Sanal Makinesi: Java’nın özgün sanal makine modelini gerçekleştiren bilgisayar programları ve yapılarından oluşan bir bütündür.
• “Java Bytecode” adı verilen, bilgisayar ara dilini kabul eder. Bir programın bytecode’u, Java dili derleyicileri tarafından üretilir.
5
İlk Java Programı
Prog1 adlı java programı :
ekrana merhaba yazdırmaktadır.
class Prog1
{
public static void main(String args[])
{
System.out.println("Merhaba");
}
}
6
Java Uygulaması
Java programlarında // Satırın geri kalan kısmının açıklama satırı olduğunu gösterir.
Geleneksel /* Açıklama */ işaretleri de özellikle çok satıra yayılan açıklamalarda kullanılır.
Deyimler “;” ile sonlandırılmalıdır.
Her java programı en az bir sınıf tanımı içermelidir.
7
Java Programının Çalıştırılması
class Prog1
{
public static void main(String args[]) {
System.out.println("Merhaba");
}
}
Kaynak Kod Prog1.java
> javac Prog1.java
.. .. .. ..
.. 80 1a ..
.. .. .. ..
Byte KodProg1.class
DERLEMEjavac derleyicisi
.. .. .. ..
.. 80 1a ..
.. .. .. ..
Byte KodProg1.class ÇALIŞTIRMA
java yorumlayıcısı
> java Prog1> Merhaba
JVM tarafından yorumlanabilir.
JVM’i (Java Virtual Machine) açmak üzere Java komutu kullanıldığında işletilen bilgisayar programına Java uygulaması (application) denilir.
8
Entegre Geliştirme Ortamları
• Programların IDE (Integrated DevelopmentEnvironment) kullanılarak yazılması, işletilmesi, test edilmesi ve hatalardan arındırılması kolay olduğu için, bu şekilde uygulama yazılması işlemine RAD (Rapid Application Development) adı verilmektedir.
• Eclipse (http://www.eclipse.org/)• NetBeans (http://www.netbeans.org/products/platform/)• JDeveloper (from Oracle)• IntelliJ (JetBrains)• JCreator (http://www.jcreator.com/) …
9
Veri Tipleri
• Java’da iki tür veri tipi vardır:– Temel– Referans
• İki tür veri tipi arasındaki fark atama işlemi sırasında ortaya çıkar.
• Temel tipteki bir değişkenin diğer bir değişkene atamasısırasında veri kopyalanır.
• Referans değişkeninin diğer bir değişkene atamasısırasında ise, her iki değişken de aynı veriyi gösterir. Referanslar, C/C++ işaretçilerine (pointer) benzerler.
• Diziler ve Nesnelerin tümü referans veri tipindedir.
10
Java’da Temel Veri Tipleri
Type Size in bits Values
boolean 1 true or false
byte 8 -128 to +127
char 16 Unicode
short 16 integer
int 32 integer
long 64 integer
float 32 float
double 64 double
12
Java’nın 8 Temel Veri TipiType Size in bits Values Standard boolean 8 true or false
char 16 ’\u0000’ to ’\uFFFF’ (ISO Unicode character set)
byte 8 –128 to +127
short 16 –32,768 to +32,767
int 32 –2,147,483,648 to +2,147,483,647
long 64 –9,223,372,036,854,775,808 to
+9,223,372,036,854,775,807
float 32 –3.40292347E+38 to
+3.40292347E+38 (IEEE 754 floating point)
double 64 –1.79769313486231570E+308 to
+1.79769313486231570E+308 (IEEE 754 floating point)
Fig. 25.1 The Java primitive data types.
• java.lang.Byte• java.lang.Short• java.lang.Integer• java.lang.Long
• java.lang.Float• java.lang.Double
• java.lang.Character• java.lang.Boolean
Sarmalayıcı (Wrapper) Sınıflar
13
ASCII ve UNICODE Karakter Setleri
• ASCII, 8 bit kodlama düzenindedir ve en yaygın karakter setidir. 256 karakterle sınırlıdır.
• Unicode, 16 bitlik kodlama düzenindedir ve 65536 karakterlik sahası vardır.
• Java programlama dili Unicode’u kullanır.
14
Değişkenler - I
Tip değişken ismi
int sayi1; // int veri tipidir.
/* sayi1 değişkeninin tamsayı tipinde olduğunu
belirtir */
........
sayi1=5;
float sayi=5.7f;
15
Değişkenler - II
• Değişkenler, tanımlandıkları gibi değer alırlar:int a = -5; double b = 10.3;
• Aynı satırda birden çok değişken tanımı yapılabilir.• C++ programlama Dilinde olduğu gibi değişkenler,
herhangi bir yerde tanımlanabilir. Metodun en üstünde tanımlanma zorunluluğu yoktur.
• Değişkenlerin, gerekli olduğu yerde tanımlanmasıuygundur.
• Java Dilinde değişkenlerin kullanılmadan önce değerleri olması gerekir.
• Değişkenler sadece tanımlandıkları blokta kullanılabilirler.
16
Veri Tipi Dönüştürme (Casting)
• Daha geniş bir tipi, daha dar bir veri tipine dönüştürürken “casting” yapmak gerekir.
double sayi1=5;
// float sayi2 = sayi1; // Yanlış
float sayi2 = (float)sayi1; // Doğru
double sayi3 = sayi2; /* Geniş tip olduğundan problem yok */
17
Yazdırma Komutu
• System.out.print ve System.out.println
System.out.print(“Merhaba”); System.out.println(“Java Dili”);
� Merhaba Java Dili
System.out.println(“\nOrtalama="+57);
System.out.println(5);
int sayi = 5;
System.out.println("Sayi\tKaresi");
System.out.println(sayi+"\t"+(sayi*sayi));
• Sayi Karesi
• 5 25
• System.out.printf (J2SE 5.0’ın yeni özelliklerindendir)String str = "Java"; double versiyon = 5.0;
System.out.printf("Merhaba %s %f ", str, versiyon);
18
OPERATÖRLER - I
Hesaplamalarda kullanılan operatörler :
Aritmetik : +, -, *, /, % (Mod, kalan), ++, --
Mantıksal : &&, ||, !, &, |, .....
İlişkisel :
== (eşittir)
!= (eşit değildir)
>, <, >=, <=
19
OPERATÖRLER - II
Atama Operatörü : değişken = deyim;
int x = 5;
double sayi = -3.5;
int a, b, c;
a=b=c=100; // Atama zinciri
Bileşik Atamalar : +=, -=, *=, /=, .....
x-=10; // x = x - 10 ile eşdeğer
20
Operatörler ve Öncelik SırasıGruplama Operatorler
Postfix [] . (params) exp++ exp-- Unary ++exp --exp +exp -exp ~ ! Creation, cast new (type)exp Multiplicative * / % Additive + - Shift << >> >>> Relational < > <= >= instanceof Equality == != Bitwise AND & Bitwise EXOR ^ Bitwise OR |
Logical AND && Logical OR || Conditional ?: Assignment = *= /= %= += -= >>= <<= >>>=
&= ^= |=
21
YAPISAL PROGRAMLAMA
Yapısal Programlamada üç tür denetim yeterlidir:
• Sıra (Sequence)
• Seçim (Selection)
• Tekrar (Repetition)
Sıralı işletim ?
22
PROGRAM DENETİM YAPILARI
• SEÇİM YAPILARI– if– if/else– switch
• TEKRAR YAPILARI (Döngüler)– while– do/while– for
23
SEÇİM YAPILARI : IF
if (koşul) ifade
if(notu>=60) System.out.println("Geçti");
Koşul : boolean veri tipindedir. true veya false olabilir.
int notu=65, sayac=0;
if(notu>=60) // İfade bloğu
{ System.out.println("Gecti"); sayac++; };
24
SEÇİM YAPILARI : IF/ELSE
if (koşul) ifade;
else ifade;
if(notu>=60)
System.out.println("Gecti");
else
System.out.println("Kaldı");
25
CONDITIONAL OPERATOR (?:)
System.out.println(notu>=60? "Geçti":"Kaldı");
Eşdeğer ifade :
if (notu>=60)System.out.println("Geçti");
elseSystem.out.println("Kaldı");
26
IF-ELSE-IF MERDİVENİ(CASCADING IF)
if(koşul) ifade
else if (koşul) ifade
else if (koşul) ifade
...............
else ifade;
if (notu>=90)
str = “A”;
else if (notu>=80)
str = “B”;
else if (notu>=70)
str = “C”;
else if (notu>=60)
str = “D”;
else str = “E”;
System.out.println(str);
27
SEÇİM YAPILARI : SWITCHÇoklu Seçim
switch (deyim) {case sabit1:ifade1;break;
case sabit2:ifade2; break;
....default : ifade;break;
}
int sayi = 4;
switch(sayi) {
case 0 :
System.out.println(" Sayı 0");
break;
case 1 :
System.out.println(" Sayı 1");
break;
case 2 :
System.out.println(" Sayı 2");
break;
default : System.out.println("X");
break;
28
DÖNGÜLER : FOR
sayac : kontrol değişkeni olmak üzere,
for(int sayac=0; sayac<10; ++sayac)
ifade
for(başlangıç; devam koşulu; kontrol değişkeni değişimi)
ifade
for(int sayac=0; sayac<10; ++sayac) {
ifadeler
}
29
DÖNGÜLER : WHILE ve DO-WHILE
while(koşul) ifade
do {
ifadeler
} while (koşul);
int sayac=1, toplam=0;
while(sayac<10) { toplam+=sayac; sayac++; };
30
DÖNGÜDEN ÇIKMAK : BREAK
for(int x=1; x<10; ++x)
{
toplam+=x;
if (x==5) break;
}
System.out.println("1 ile 5 arasındaki sayıların toplamı = "+toplam);
break sadece en içteki döngüden çıkar.
31
DÖNGÜDE ERKEN TEKRAR : CONTINUE
1 ile 100 arasındaki tek sayıları yazan program :
for(int i=0; i<100; ++i)
{
if ( (i%2)!=1) continue;
System.out.println(i);
}
32
Mantıksal Operatörler
• VE : Conditional AND &&• VEYA : Conditional OR ||if ( (yas>50) && (boy>170) ) …;
Conditional ve/veya, kısa devre hesaplaması yapabilir.
• VE : Boolean Logical AND &• VEYA : Boolean Logical OR |if ( (yas>50) && (boy>170) ) …;
Boolean mantıksal ve/veya, tüm operand’ları hesaplar.
33
DİZİLER - I
Dizi (array), aynı tipteki değişkenler topluluğudur.
int[] arr = new int[10];
int[] dizi = {5,7,12,2,9,8,14,21,-6,5};
double[] sayilar; sayilar = new double[5];
5 7 12 2 9 8 14 21 -6 5
-3.4 12.5 27.0 1.1 25.33
0 1 2 3 4 5 6 7 8 9
34
Diziler - II
Diziler, temel veri tipi listesi veya referans listesi içerebilirler.
Diziler, köşeli parantezlerle ifade edilirler : []
Köşeli parantezler veri tipinden sonraya yerleştirildiğinde, tüm değişkenleri dizi olarak tanımlar:
int[] sayilar, numaralar;
Köşeli parantezlerin değişkenden sonraya yerleştirilmesi sadece o değişkeni dizi yapar:
int sayilar[], sayac;
35
Diziler - III
Diğer referans tipleri (nesneler) gibi diziler de, ya bazıverileri gösteriyordur veya hiçbir yere işaret etmiyordur.
Hiçbir yeri göstermiyorsa, int sayilar[] = null; şeklinde olduğu gibi tanımlanmalıdır.
Bellekten 15 tamsayılık yer ayırmak için : sayilar = new int[15]; şeklinde kullanılabilir.
“new” operatöründen sonraki veri tipi, tanımlı değişkenin veri tipi ile aynı olmalıdır.
Java dizinin her elemanına default olarak 0 değerini atar.
36
DİZİ KULLANIM ÖRNEKLERİ
dizi[2]++;
dizi[3]=dizi[1]+dizi[2];
System.out.println(dizi[5]);
Dizi elemanlarının toplamını bulduran programıyazınız : dizi.length kullanınız!
37
İKİ BOYUTLU DİZİLER (MATRİSLER)
• M x N • M satır, N sütun
• Oluşturulması : int[][] tablo = new int[4][3];• Kullanımı : tablo[0][2]
5389
61173
83321
9152
tablo
M=4
N=3
3
2
1
0
210
38
ÇOK BOYUTLU DİZİLER
• Tip []…[] isim = new tip[büyüklük1]...[büyüklükN]
• Tip isim[]…[] = new tip[büyüklük1]...[büyüklükN]
Örnek :
float cbDizi[][][][]; // 4 boyutlu dizi
cbDizi = new float[3][4][2][6];
39
STRING’LER ve KARAKTER DİZİLERİ
• Karakter dizisi : Karakterlerden oluşan dizidir.
char harfDizi[] = { ‘T', 'e', ‘s', ‘t' };for(int i=0; i<harfDizi.length;++i)System.out.println(harfDizi[i]);
• String : Karakter dizisinden farklıdır. Çok sayıda metot içerir. Java’nın String sınıfı kullanılır.
String str = "Merhaba"; System.out.println(str);
str = new String(harfDizi); System.out.println(str);
40
Dizilerden Oluşan Diziler
int[][] list = new int[10][];
list[0] = new int[5];
list[1] = new int[10];
list[1][6] = 23;
list[0][6] = 23; /* Hata! Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6 at Ornek3.main(Ornek3.java:34) */
41
BÖL ve ÇÖZ (Divide and Conquer)
• Yazılım Mühendisliği deneyimleri, büyük programlar geliştirmenin en iyi yolunun küçük program parçaları(modül) yazıp onları birleştirmek olduğunu göstermiştir.
• Böl ve Çöz olarak bilinen bu yöntem aynı zamanda, hatalardan arındırmayı, programı gelişen şartlara göre büyütmeyi, değişiklikler yapmayı kolaylaştırmak ve anlaşılırlığı artırmak gibi birçok avantajı da beraberinde getirmektedir.
• Java’da temel modüller, sınıf (class) ve metotlardır (method). Metotlar yazılım içinde yeniden kullanılarak kodu ve yazılım geliştirme süresini kısaltmaktadır.
42
METOTLAR (METHOD)
• Bir işlemin yapılması için bir veya daha fazla ifade kullanmak gerekir. Verilen bir matrisi ekrana yazdırmak gibi. İlgili kodu “yazdir()” adını verdiğimiz bir metot içine yazarak istediğimiz zaman, ismi ile çağırabiliriz.
• Java, matematik hesaplamalarını, string, karakter, girdi/çıktı işlemlerini ve diğerlerini yapmak için hazır sınıflar ve metotlar içermektedir. Ayrıca değişik alanlarda hazırlanmış veya kendimizin daha önceden hazırladığımetotları da kullanmak mümkündür.
• Hazır veya kullanıcı tanımlı paketleri,import java.util.Random;import java.util.*;biçimlerinde görüldüğü gibi “import” kullanılarak yüklenirler.
43
Java Paketleri
• Hazır Java paketleri içerisinde, birçok sınıf mevcuttur.
• Java.lang paketi, Java’da çok kullanılan sınıfları içerir. Bu paketteki java.lang.Math sınıfı içerisinde bulunan bazı sahalar ve metotlar sonraki slaytlarda gösterilmiştir. (Sadece “lang” paketine özgüolarak, kullanıcının getirme “import” zorunluluğu yoktur)
Java.swing.event …Java.lang
Java.swingjava.io
Java.utiljava.awt.event
Java.textjava.awt
Java.netjava.applet
44
Field Summary
static double E
static double PI
Method Summary
static double abs(double a) Returns the absolute value of a double value.
static float abs(float a) Returns the absolute value of a float value.
static int abs(int a) Returns the absolute value of an int value.
static long abs(long a) Returns the absolute value of a long value.
static double acos(double a)
Returns the arc cosine of a value; the returned angle is in the range 0.0
through pi.
static double asin(double a)
Returns the arc sine of a value; the returned angle is in the range -pi/2
through pi/2.
static double atan(double a)
Returns the arc tangent of a value; the returned angle is in the range -
pi/2 through pi/2.
static double atan2(double y, double x)
Returns the angle theta from the conversion of rectangular coordinates
(x, y) to polar coordinates (r, theta).
static double ceil(double a)
Returns the smallest (closest to negative infinity) double value that is
greater than or equal to the argument and is equal to a mathematical integer.
static double cos(double a)
Returns the trigonometric cosine of an angle.
static double exp(double a)
Returns Euler's number e raised to the power of a double value.
static double floor(double a)
Returns the largest (closest to positive infinity) double value that is
less than or equal to the argument and is equal to a mathematical integer.
45
Hazır java.lang.Math sınıfının bazı metotları
static double log(double a)
Returns the natural logarithm (base e) of a double value.
static double log10(double a)
Returns the base 10 logarithm of a double value.
static double max(double a, double b)
Returns the greater of two double values.
static double min(double a, double b)
Returns the smaller of two double values.
static double pow(double a, double b)
Returns the value of the first argument raised to the power of the
second argument.
static long round(double a) Returns the closest long to the argument.
static double sin(double a) Returns the trigonometric sine of an angle.
static double sqrt(double a) Returns the correctly rounded positive square root of a
double value.
static double tan(double a) Returns the trigonometric tangent of an angle.
static double toDegrees(double angrad)
Converts an angle measured in radians to an approximately equivalent
angle measured in degrees.
static double toRadians(double angdeg)
Converts an angle measured in degrees to an approximately
equivalent angle measured in radians.
http://java.sun.com/javase/6/docs/api/java/lang/Math.html
46
METOTLARIN GENEL BİÇİMİ
erişim dönüş_tipi isim(parametre listesi)
{
metodun gövdesi
}
Erişim : public, private gibi
Dönüş_tipi : metodun döndürdüğü veri tipi. Değer döndürmüyorsa void.
Parametre listesi : “,” lerle ayrılmış tip ve parametre ismi.
47
Değer Döndürmeyen Metotlarvoid metotları
public void yazdir() {
System.out.println("Merhaba");
}
Çağrılması :
yazdir();
48
Değer Döndüren Metotlar
public int topla(int a, int b) {return (a+b);
}
Çağrılması :int y=topla(5,6);
Metodun iki de parametresi var.
49
Parametre, Argüman, Return
Argüman : Metoda aktarılan değer
Parametre : Argümanı kabul eden değişken
Return : Metottan çıkmak veya geri dönmek
50
Değişkenlerin Kapsama Alanı
{…int x = 5; if(sayi>5){
int y = 12;…
}// y tanımlı değil// x tanımlı}
for(int i=0; i<5; ++i)System.out.println(i);
i=10; // Hatalı!
y değişkeninin tanımlı olduğu bölge
51
Metotlar – Örnek 1int dizi[] = { 5,6,7,8 }; veya benzer şekilde verilen bir tamsayı dizisinin elemanlarının toplamını bulan metodu içeren java programını yazınız.
class DiziTopla
{public static void main(String args[])
{int dizi[] = { 5,6,7,8 };System.out.println(topla(dizi));
}public static int topla(int dizi[])
{int toplam = 0;for(int i=0; i<dizi.length; ++i)
toplam+=dizi[i];return toplam;
}}
52
Metotlar – Örnek 2class Ornek2{
public static void main(String args[]){
String str = "test";nyazdir(str,10);
}
public static void nyazdir(String str, int n){
for(int i=0; i<n; ++i)System.out.println(str);
}}
53
Metotlar – Örnek 3Faktöriyel
class Ornek3{
public static String f(int n){
int carpim = 1;if (n<0) return "Invalid Input For Function";elsefor(int i=1; i<=n;++i)
carpim*=i;return ""+carpim;
}
public static void main(String args[]){
int sayi = 5;System.out.println(f(sayi));
}}
Sayı döndüren faktöriyel fonksiyonunu yazınız.