Sayısal Türler

Preview:

DESCRIPTION

Sayısal Türler. Tamsayılar (byte, short, int, long) Tam sayılardır exact Yaklaşık olarak ~10 19 rakamında sınırlıdır Kayan noktalı (float, double) kesirli Genelde yaklaşma (0.33333) Yaklaşık olarak ~10 308 rakamında sınırlıdır. Veri Türlerinin Listesi. - PowerPoint PPT Presentation

Citation preview

Sayısal Türler

• Tamsayılar (byte, short, int, long)– Tam sayılardır– exact– Yaklaşık olarak ~1019 rakamında sınırlıdır

• Kayan noktalı (float, double)– kesirli– Genelde yaklaşma (0.33333)– Yaklaşık olarak ~10308 rakamında sınırlıdır

Veri Türlerinin ListesiTemel Türler Default Value

boolean falsechar '\u0000' (null)byte (byte) 0short (short) 0int 0long 0Lfloat 0fdouble 0dvoid N/A

Note: “Void “ C/C++ dillerindeki gibi temel bir tür değildir. Java ‘da void türüne doğru bir tür değişimi yapılamaz.

Veri Türlerinin Değer Sınırları

Tür Boyut En az Varsayılan

boolean false

En fazla

1 false* true*

char '\u0000' (null)16

byte (byte) 08 -128 127

short (short) 016 -32,768 32,767

int 032 -2,147,483,648 2,147,483,647

long 0L64 -9,223,372,036,854,775,808 9,223,372,036,854,775,807

float 0.0F32 Yaklaşık olarak ±3.4E+38 ve 7 haneli

double 0.0D64 Yaklaşık olarak ±1.7E+308 ve 15 haneli

void

* En az ve en fazla gibi durumlar geçerli değildir.

Doğru Doğru !!derlenirderlenir

Tür Dönüşümü (Casting)Bir önceki derste tür dönüşümü ile ilgili temel birkaç şey gördük. Bazen açık tür dönüşümü gerekebilir bazen de gerekmez.

int x = 10;float f1 = x;

float f2 = 11.234f;int y = f2;

Derlenebilmesi için hangisinde tür dönüşümüne ihtiyaç vardır? Neden?

HATAHATAAçık tür dönüşümü gereklidirAçık tür dönüşümü gereklidir

Tür Dönüşümü (Devam)

Tür dönüşümünün ne zaman gerekli olduğunu anlayabilmek için aşağıdaki örneğe bakalım.

Aşğıdaki gibi iki ayrı türden iki adet değişkenimiz olsun:

int x;

char c;

Asıl soru, Bu veri türlerinin bellekte kapladığı alan ne kadardır?

RecallDaha önce Java ‘daki veri türlerinin bellekte kapladığı alanları gördük. Her tamsayı (int) türünde tanımlanmış bir değişken için bellekten 4 baytlık yer ayrılır. Bize ayrılan yeri bir kutu gibi düşünebilirsiniz.

java intjava int

Besin değerleriServis miktarı 1 int

Her serviste ikram edilen

Kalori değeri 0

% günlük miktar

Toplam bayt sayısı 4 100%

tahıl kutusu

And recall...

java charjava char

Besin değerleriServis miktarı 1 char

Her serviste ikram edilen

Kalori değeri 0

% günlük miktar

Toplam bayt sayısı 2 50%

Karakter türünde tanımlanmış bir değişken için 2 bayt alan tahsis edilir . Tamsayı (int) türüne göre daha az bir alandır. Dolayısıyla bunu daha küçük bir kutu olarak düşünebiliriz.

Ton balığı konservesi

Öyleyse...Bir karakter yani char veri türü 2 bayt, ve bir tamsayı yani int türü 4 bayt yer kaplar. Dolayısıyla aşağıdaki kodu incelersek:

int x; char c;Aşağıdaki şekle bakarsak:

x

c

DeğişkenDeğişken Belleğin resmiBelleğin resmi

Her bir blok 1 bayt

temsil eder

0000 0000

0000 0000 0000 0000 0000 0000

0100 0001

0101 0110

Gerçeklik kontrolü

java charjava char

java intjava int

Konserve kutusu tahıl kutusunun içine sığabilir mi? Evet, küçük olduğu için sığar.

Peki, tahıl kutusu konserve kutusunun içine sığabilir mi? Düzgün bir şekilde mümkün değil, çünkü tahıl kutusu daha büyüktür.

Aynı mantıkla...

char türündeki bir değer int türündeki bir alana sığar mı?

int türündeki bir değer char türündeki bir alana sığar mı?

x

c

DeğişkenDeğişken Belleğin ResmiBelleğin Resmi

Gerçeklik kontrolü

java charjava char

java intjava int

Peki tahıl kutusunun yarısını konserve kutusuna yerleştirmek istersek mümkün mü? İşte bu olur !

Örneğin, eğer tahıl kutusunun yarısının boş olduğunu biliyorsak o boş kısmı atabiliriz.

Açık tür dönüşümü: Kasıtlı olarak yapılan duyarlılık kaybı

x

c

DeğişkenDeğişken Belleğin resmi Belleğin resmi

int x = 45;char c = ‘A’;c = (char) x; // tür dönüşümü gereklidir

Tür dönüşümü

gerekli!

Kendinizi sınayın

Eğer aşağıdakileri uygularsak ne olur:

int someInt = 2000; long longNumber; longNumber = (long) someInt;

Bu tür değişimi kurallara uygun mudur?Öyleyse gerek var mıdır?

Boşlukları doldurun.

Diğer bir örnek

float f;int i, j;i = 9;j = 2;f = i / j;

f = (float) i / j;

Sonuç 4 olur, çünkü yapılan tamsayı

bölmesi sonucu kesirli kısım budanır!

f = (float) i / (float) j;

Eğer beklenen değer bu değilse,3 türlü çözüm vardır

f = i / (float)j;

Diğer bir örnek

İşaret biti Veri için 31 bit ayrılır

Dikkat etmemiz gereken diğer bir husus tür dönüşümü yapılırken Java ‘nın tür dönüşümü yapılan değerin işaretini korumasıdır. int türü için ayrılan 4 bayt ‘lık alanı düşünelim. En yüksek anlamlı bit işaret biti olarak kullanılır. 0 ise pozitif, 1 ise negatif anlamına gelir.

intint

Tür dönüşümü ve işaret

İşaret bitini korur

intint

baytbayt

Tür dönüşümü sadece bir veri türünü diğerine dönüştürürken bir kısmını budamaktan ibaret değildir. Orjinal işaret neyse o korunur.

Diğer bir örnekElimizde çok eskiden kalma, tarih bilgisinin tamsayı (int yani 4 bayt) şeklinde ifade edildiği bir veri olduğunu kabul edelim, şu şekilde:

19291031

1929 10(ekim)

31

Bu çok kabaca, fakat eskiden kalma veri kaynakları bu formatta verilere sahiptir.

Açık tür dönüşümü gerekli

public class CutData { public static void main(String[] args) {

int iDate = 20001225; // eskiden böyleydibyte byDay = (byte) (iDate % 100);

System.out.println (“Gün " + byDay);

iDate = iDate / 100;

byte byMonth = (byte) (iDate % 100);

System.out.println (“Ay " + byMonth);

iDate = iDate / 100;

short sYear = (short) iDate;

System.out.print (“Yıl = " + sYear); }} // Veriyi parçalara ayırdık

public class PackDate {

public static void main(String[] args) {

byte month = 12;byte day = 25;short year = 2000;

int date = year * 10000 + month * 100 + day;

System.out.println ("The date = " + date); } } // PackDate

Ters yönde çalışırsak yani byte veya short türündeki bir veriyi int türündeki bir alana aktarmak istersek tür dönüşümü gerekli değildir çünkü herhangi bir duyarlılık veya veri kaybı olmaz.

• Verilenler: int start = 10;

float temp = 5.5f;

temp = (int) temp * start;

• temp değişkenin değeri şimdi ne oldu?

Tür dönüşümü: Bilginizi sınayın

• Verilenler: char c = ‘A’;

int x;

c = x;

• Kurallara uygun mudur? Hızlı tekrar

Bilginizi sınayın• İşte problem:

int iVar = 10;float fVar = 23.26f;

// derleme zamanı hatası veririVar = iVar * fVar

• Hangi çözüm en iyi çalışır?

iVar = (int) iVar * fVar

iVar = (int) (iVar * fVar)

iVar = iVar * (int) fVar

1

2

3

iVar = (int) ((float) iVar * fVar)

4

232

Aynı derleme hatası

232

230

Hızlı tekrar

Kısayol operatörleri• counter = counter + 1; VEYA counter++;• counter = counter - 1; VEYA counter--;• counter = counter + 2; VEYA counter+=2;• counter = counter * 5; VEYA counter*=5;

Son iki örnekte : İlk önce artırma ve çarpma işlemleri yapılır daha sonra atama işlemi yapılır.

Hızlı tekrarBu ifadeleri anlayın fakat kullanmamaya çalışın

The Short End of ShorthandAkıllı ifadeleri kısayol operatörlerle birlikte kullanırken dikkatli olun.

Örneğin, “_” gibi bir değişken tanımlayabiliriz. Alt çizgi karakteri geçerli bir değişken ismidir.

int _ = 1;int _ = 1;Aşağıdaki gibi Morse kodu oluşturacak şekilde değişik karakterlerin kombinasyonundan oluşan bir değişken ismi de oluşturabiliriz:

_ -= --_ - _--;_ -= --_ - _--;Evet, yukarıdaki ifade geçerlidir, ancak tamamen anlamsız ve okunamaz bir ifadedir.

Dokümantasyon ve Açıklamalar

• Üç çeşit yöntem vardır:// satır sonuna kadar olan her şeyi açıklama olarak kabul eder

/* ve */ işaretleri arasında kalan tüm ifadeler satır sonu gözetmeksizin açıklama olrak kabul edilir.

/*** Bu sentaks biçimi Javadoc açıklamaları için kullanılır,

* HTML biçimlendirme özelliklerini sunar.

*/

• BİLM 217 için, Javadoc açıklamalarını kullanın

Hızlı Tekrar

Javadoc örneği üzerinde çalışalım

Javadoc: Basit bir örnekimport java.util.*;/** * HelloComments.java * * * Created: Wed Jan 12 18:17:29 2000 * * @author David Dagon * @version 98 beta */public class HelloComments { /** * Basit <b> bir </b> değişken. */ public int x = 10;

Javadoc açıklamaları

değişiklik yapılan öğenin üzerinde yer

almalıdır.Sınıf açıklamaları yapılacağı zaman

açıklamaları import ifadelerinin altına koymak gerekir.

HTML terimleri!

Short, one-liner,followed by period

Basit bir örnek (devam)

Sadece değişken isimlerini belirtin.

/** * This comment is reproduced twice, because * of the comma delimited declaration of ints. * The solution would be to use separate lines * for each declaration. */ public int y = 4, z = 11;

/** * Bu sınıf çalıştırılırsa Main metodu programın * başlangıç noktasıdır. * @param args Komut satırından girilen parametreler */ public static void main(String[] args) {

} } // HelloComments

@author @param@return @exception @deprecated // jdk 1.1 @since // jdk 1.1@serial // jdk 1.2

@see <class name> @see <full-class name> @see <full-class

name#method.name>@version

• HTML etiketleri ekleyebilirsiniz fakat <H1> gibi yapısal etiketler kullanmaktan kaçının.

• Javadoc comments should immediately preceed the declaration of the class, field or method. İlk cümle özet olmalıdır. Javadoc ‘a özel etiketler kullanın, örneğin --@ . Eğer @ etiketi kullanılırsa diğer bir

@ etiketine kadar parse işlemi devam eder.

Javadoc (devam)

Kendi javadoc açıklamalarınıza geri dönerseniz bu notlara geri

dönersiniz.

Sorular?

Sabitler

• Java:– public final static <tür> <IDer> = <değer>;

– public final static int MIN_PASSING = 60;– public final static float PI = 3.14159f;

• Neden bu sentaks kullanıldığı konusunda detaylı bilgi ileride...

Hızlı tekrar

Printing to Screen• Java:

– System.out.println(<argüman>);– System.out.println( ); // boş satır ekler– System.out.println(5); // ekrana 5 yazar

System.out.println(“Merhaba Dünya”); // ekrana Merhaba Dünya yazar

– “println” vs. “print” :• println komutu ekrana mesajı bastıktan sonra

imlecin bir alt satırın başına geçmesini sağlar• print komutu ise ekrana mesajı bastıktan sonra

imlecin kaldığı yerden devam etmesini sağlar

Quick Review

Metod Çılgınlığı

Dikkat

Java ‘daki metodları konuşmaya başlamadan önce yüksek seviyeli programlama dillerine bir göz atmamız gerekir.

Slaytlardaki sentaks konusunda endişelenmeyin. Büyük resimde kod detayları önemli değildir önemli olan neyin önemli olduğudur.

Programlama Modelleri

Prosedürel Programlama (Procedural Programming)

‘Imperative’ assignment used to create state, and procedures manipulate state. E.g., C, Assembly, Pascal int y; int x = 3; y = manipulateData(x);

Fonksiyonel Programlama (Functional Programming)

Functions (procedures that do not depend on outside data) are used to provided data. E.g., Lisp.

(defun check-member (input-item input-list) (cond ((null input-list) nil) ((equal input-item (first input-list)) T) (T (check-member input-item (rest input-list)))))

Nesneye yönelik programlama

Bütün veriler objelerin içinde tutulur; bütün etkileşim objeler arasında olur. Even numbers are objects that know how to add themselves. E.g., SmallTalk:

| array |array := Array new: 5.rect := 0@0 corner: 8@9.1 to: array size do: [ :item | rect origin: item@item. array at: item put: rect copy ].

Java ‘nın yeri neresidir?

Nesneye yöneliktir ancak %100 değildir çünkü, temel veri tiplerine sahiptir ve de az da olsa prosedürel programlamaya izin verir.

Programlama Modelleri

Başka modeller de mevcuttur ancak, bu üçü Java ‘nın nereden geldiğini açıklamaya yeter

Java Java MetodlarıMetodlarıJava ‘da hem prosedürler hem de fonksiyonlar için method adı verilen bir yapı mevcuttur:

• aşağıda prosedür geriye değer döndürmediği için metod adından önce “void” ifadesi kullanılmıştır.

public void printHelloWorld( ) {

System.out.println(“Hello World!”);

} // printHelloWorld

• Not: Bütün metodlar, parametre almasa dahi metod isminden sonra ( ) kullanmak zorundadır.

Açıklamayı not edin

hem prosedürler hem de fonksiyonlar için tek bir yapı:

• fonksiyon tanımlaması yapıldığı zaman geri dönüş değerinin türü belirtilmesi gerekir.

public float average (float num1, float num2, float num3) { float answer; answer = (num1 + num2 + num3)/ 3; return (answer); } // of average

Java MetJava Metodlarıodları

Metod Yazımı : Büyük BakışMetod Yazımı : Büyük BakışJava kuralı:

--Her metod bir nesneye aittir ya da bir sınıfa. --Bir metod çağrıldığı zaman hangi sınıfa ya da nesneye ait olduğu kesin belli olmalıdır. --Bir uygulamayı çalılştırabilmek için programın aynı adında bir sınıf ve bu sınıfın içinde de main metodu bulunmalıdır.

Sınıf metodu olduğunu

belirtir, üye metodu değil

Herkese açık

Geri dönüş değeri yok

Metod adı

Komut satırı parametreleri için

public static void main (String[ ] argv)

class A{

public static void main(...}

class B{

public static void main(...}

class C{

public static void main(...}

Öyleyse, her sınıf kendi main

metoduna sahip olabilir. Bunlardan

hangisinin çalışacağına siz

karar vereceksiniz.Debug testi yapmak

için gerekli olan main metodlarını yazmayı öğrendiğimiz zaman

yukarıda bahsettiğimiz konu kritik bir hal alacak.

Metod İmzaları“Metod imzası, metod adı, parametre sayısı ve türleridnen oluşur. Herhangi bir sınıf aynı imzaya sahip iki metod tanımlayamaz, yoksa derleme zamanı hatası oluşur.

Aynı isme sahip metodlar farklı varyasyonlarda parametrelere sahip

olurlarsa Method overloading meydana gelir.

public int getCube(int num){return num*num*num;

}

public int getCube(float num){return (int)(num*num*num);

}

public int getCube(double num){return (int) (num*num*num);

}

Metodlarda yapılan genel hatalar

public float average (float num1, float num2, float num3); { float answer; answer = (num1 + num2 + num3)/ 3; return (answer); } // average

‘;’ Noktalı virgül hakkında -- Eğer yukarıdaki gibi bir kullanım söz konusu olursa metod abstract metod gibi görünebilir. -- Çözümlenmesi zor bir hata mesajı ile karşılaşılabilir.-- Çok kolay yapılan hatalardan biridir.

Metotlar nereye?

Tıpkı main metodunda olduğu gibi oluşturulan bütün metodlar bir sınıfa ya da bu sınıfın bir üyesine ait olmalıdır. Daha sonra nasıl sınıf ve nesne oluşturulur göreceğiz...

Şimdilik, metodların bir sınıfa ait olması gerektiğini bilmeniz yeter.

Nesneye Yönelik Programlama Hakkında

Nesneye yönelik programlama ile ilgili önemli noktaları görmüş olduk :

Veri ve metodlar birlikte bir sınıfa aittir.

Şu anda sadece, değişkenlerin ve metodların sınıflara ait olduğunu bilmeniz yeterli.

Daha sonra, bu özelliği kullanarak durumları (değişken), davranışlarla (behaviour) nasıl sarmalanır göreceğiz...

Öyleyse, bugün neler öğrendiğimizi hatırlayalım. Nesneye yönelik programlamanın temel taşlarını öğrenmeye başladınız.

Sorular?

Koşullu ifadeler

Karar ifadeleri• Java:

if (koşul) tek bir ifade;else tek bir ifade;

• Ya da:

if (koşul){ bir ya da daha fazla ifade;}else{ bir ya da dah fazla ifade;}

Örnekler• Java: Aşağıdaki örnekte ne yapılmıştır?

int testGrade = 65;

boolean passing = true;

if (testGrade < 60)

passing = false;

System.out.println(testGrade + ”notu geçer demek” + passing + ”olur”);

Boole ve İlişkisel operatörler• Boole: Java:

VE &&

VEYA ||

DEĞİL !

• İlişkisel: eşittir ==

eşit değildir !=

küçüktür <

küçük ya da eşittir <=

büyüktür >

büyük ya da eşittir >=

• Not:Atama =

Örnek

if (enrolled && passing) {// etc.

}

Java, şartlardan sadece bir tanesinin değerlendirilmesi gibi bir imkan da sunar.

if (enrolled(studentNum) || getPassing(studentNum)) {

// etc. }

Eğer ilk şart doğruysa,

ikinci şarta bakılmaksızın

toplam koşul doğru kabul

edilir ve değerlendirme

sona erer.

Biraz da kodpublic static void main(String args[]) {

int quiz1 = 42;

int quiz2 = 99;

if(isPassing(quiz1) && isPassing(quiz2))

System.out.println(“Passed both quizzes”);

}

public static boolean isPassing(int testGrade) {

boolean passing = true;

if (testGrade < 60)

passing = false;

System.out.println(“Is “ + testGrade +

“ passing? “ + passing);

return passing;

}

Sonuç?

Is 42 passing? false

Is 42 passing? false

Is 99 passing? true

ab

SwitchSwitch koşul ifadesi koşul ifadesi

Tek koşul için if yapısını kullanın.

İki koşul varsa if/else yapısını kullanın.

İkiden daha fazla koşul varsa switch yapısını kullanın. Switch yapısının alternatifi if-elseif-elseif-else yapılarıdır.

Not:

• Eğer aynı değişkenin değişik değerleri arasından seçim yapılcaksa kullanmak elverişlidir.• Ancak, farklı değişkenlerin değerlerinde seçim yapılacaksa kullanılmamalıdır.

Switch

switch (<değişken>){case <değer1>://yapılmasını istediğiniz herhangi bir şeybreak; // isteğe bağlıcase <değer2>://yapılmasını istediğiniz herhangi bir şeybreak; // isteğe bağlıdefault: //yapılmasını istediğiniz herhangi bir şeybreak; // isteğe bağlı

}

Switch (devam)

Switch yapısının en sonundaki default durumuna dikkat edin. (Seçimlidir)(Seçimlidir)

switch (iNumber) { case 1:

System.out.println (“Bir”);break;

case 2:System.out.println (“İki”);break;

case 3:System.out.println (“Üç”);break;

default: System.out.println(“Not 1, 2, veya 3”); break; // Gerekli mi???

} // switch

Pratikte her zaman default ifadesini kullanmanız gerekir.

Default olmadan da

çalışırdı ancak basit

bir programlama

olurdu.

Kaç gün?

if(month == 4 || month == 6 ||

month == 9 || month == 11)

numdays = 30;

else if(month == 2)

{

numdays = 28;

if(leap)

numdays = 29;

}

else

numdays = 31;

Switchswitch (month)

{

case 4:

case 6:

case 9:

case 11:

numdays = 30;

break;

case 2:

numdays = 28;

if(leap)

numdays = 29;

break;

default: /* iyi bir fikir mi? */

numdays = 31;

}

• Switch yapısı sadece aşağıdaki veri türleriyle birlikte kullanılır.

int, char, short & byte

• Case değerleri mutlaka aynı türden olmak zorundadır.

• Case değerleri mutlaka sabit değerler olmalıdır.

Switch yapısı ile ilgili bazı notlarSwitch yapısı ile ilgili bazı notlar

Switch yapısıSwitch yapısı

switch (grade) { case ‘A’: case ‘a’: countOfAGrades++; break; case ‘B’: case ‘b’: countOfBGrades++; break; case ‘C’: case ‘c’: countOfCGrades++; break; case ‘D’: case ‘d’: countOfDGrades++; break; case ‘F’: case ‘f’: countOfFGrades++; break; default: System.out.println(“Invalid grade”); break;}

(yukarıda kullanılan değişkenlerin dahan önceden oluşturulmuş olduğunu ve bir değere sahip olduklarını kabul ediyoruz.)

if (grade==‘A’ || grade==‘a’)countOfAGrades++;

else if (grade==‘B’ || grade==‘b’)countOfBGrades++;

else if (grade==‘C’ || grade==‘c’)countOfCGrades++;

else if (grade==‘D’ || grade==‘d’) countOfDGrades++;

else if (grade==‘F’ || grade==‘f’) countOfFGrades++;

elseSystem.out.println (“Invalid grade”);

aynı

Daha ileriye gitmeden önce...

• Program kodunuz ne yapılmak istendiğini açık ve net bir şekilde ifade ediyor olmalı.

• Bununla ilgili 2 tür izleyici var– Makine– Diğer programcılar

IfTarz 1

if(<boole ifade>)

{

// doğruysa bu işlemleri yap

}

else

{

// yanlışsa bu işlemleri yap

}

IfTarz 2

if(<boole ifade>) {

// doğruysa bu işlemleri yap

} // açıklama

else {

// yanlışsa bu işlemleri yap

} // açıklama

Koşula bağlı atamaKoşula bağlı atama

boolean b; int count;

b = checkCompletion();count = (b) ? 3 : 1;

Boole değer olmalı

Eğer doğruysa . . .

. . . Eğer yanlışsa

<boole> ? <doğruysa yapılacak>: <yanlışsa yapılacak>

Not: Bu sentaks hızlı veya daha okunaklı falan değildir. Sadece C hacker ‘ları ile ilgili bir konu.

Koşullu ifadeler özet

• Kontrol yapıları

–İki tür koşullu yapı vardır:• if { ... } else { ... }

– Boole değere göre dallanmalar var

• switch (...) { case ...; break; default: ... }– Sabit değere göre dallanma var– break deyimini unutmayın

Sorular?

Recommended