Yazilar:

 Sponsor Reklam 


24.12.2008 (04:47)

 For Döngüsü, Break ve Continue Kullanımı 
For döngüsü için çeşitli kullanım seçenekleri bulunmaktadır. Önemli olan amaca yönelik ve etkin kullanmaktadır. Algoritmik açıdan, gelişigüzel kullanmak programın karmaşıklığını artırmaya sebep olacaktır. For içinde yoğun işlemler mevcut ise ve gereksiz dönmeler söz konusu ise, her gereksiz dönülen adımda bu yoğun işlemler programın yavaş çalışmasına yol açtığı gibi bilgisayarın kaynaklarının da fazlaca kullanılmasına neden olacaktır.

Basit gibi de görünse proje olarak yapılan iş büyüdükçe toplam karmaşıklık ve yavaşlama artacaktır.

For döngüsü örnekleri şunlardır:

# Örnek 1
int n = 100;
for (int i = 0; i < n; i++) {
  System.out.println(100-i);
}

# Örnek 2
int n = 100;
int i = 0;
for (; i < n;) {
  System.out.println(100-i);
  i = i + 1;
}

# Örnek 3
int n = 100;
int i = 0;
for (; ; ;) {
  if (i < 100) {
    System.out.println(100 - i);
    i++;
  } else {
    break;
  }
}

# Örnek 4
int n = 100;
int i = -10;
for (; i < n; i++) {
  if (i < 0) {
    continue;
  } else {
    System.out.println(100 - i);
  }
}

Bütün bu örnekler 100'den başlayarak 1'e kadar ekrana yazdırma yapar:
100
99
98
97
.
.
.
3
2
1

for deyiminde ilk değer ataması, koşul ve iterasyon noktalı virgül (;) ile ayrılmıştır. Bunlara bağlı olarak döngünün içi çalışır. Eğer bazıları kullanılmazsa atama veya kontrol işlemi başka bir yerde muhakkak yapılmalıdır. Hiçbiri kullanılmazsa bu sonsuz döngüye yol açar. Yine doğru yapılmayan iterasyon veya kontrol de sonsuz döngüye yol açabilir.

Örnek 1 anlaşılması ve kullanılması açısından ideal bir for döngüsüdür. Örnek 2'de iterasyonda kullanılan değişkenin tanımlanması ve ilk değer ataması for'un dışında yapılmıştır. Örnek 3'te ise tanımlama ve değer atama dışarıda yapılmıştır ve iterasyonda değer artımı döngü içinde yapılmaktadır. Sınıra ulaşılıp ulaşılmadığı da yine döngü içinde kontrol edilmekte ve ulaşınca break ile döngü sonlanmaktadır. For içinde break kullanımı mantığa uygun olsa da programlama açısından istenmeyen bir durumdur. İlle kullanılacaksa while döngüsü tercih edilmelidir. Örnek 4'te continue kullanımını görüyoruz. i değerinin sıfırdan küçük değerler için continue çalışmakta yani döngü o adımı o noktada bırakıp bir sonraki adıma pas geçmektedir. continue kullanmaktan yine kaçınılabilir. Getireceği kolaylık bir döngüde bazı adımlar pas geçilmek istenirse bu işimizi görecektir fakat döngüyü ayırarak bunu yapsak fazladan zaman kaybımız olmayacak, dahası pas geçeceğimiz adımları da dönmemiş olacağız. Kod anlaşılırlığı açısından da daha uygun olacaktır.
Imza: admin

22.12.2008 (03:43)

 Switch, Case, Default ve Break Kullanımı 
Daha önce if ve else kullanımından bahsetmiştik. Buradaki if-else-if yapılarının kolay kullanılması için switch-case kullanılmaktadır.

Aşağıdaki örnekte defalarca else if kullanımından kaçılarak switch case tercih edilmiştir.

String day;
int dayNumber=0;
switch (dayNumber) {
  case 0:
    day = "Sunday";
    break;
  case 1:
    day = "Monday";
    break;
  case 2:
    day = "Tuesday";
    break;
  case 3:
    day = "Wednesday";
    break;
  case 4:
    day = "Thursday";
    break;
  case 5:
    day = "Friday";
    break;
  case 6:
    day = "Saturday";
    break;
  default:
    day = "This is not a day number";
}
System.out.print("Day: " + day);

Ekran çıktımız şöyle olacaktır:

Day: Sunday

Switch'in içinde yer alan case ifadesi eşleşebilecek sayıyı göstermektedir. Başka bir ifade olan default ise bir eşleşme olmadığında kendisinin altında yer alan eylemi yapacaktır.

Örnekte yer alan break'ler ilgili case ifadesinden sonra eylemlerin yapılıp bir alttaki case ya da default ifadesine düşmeyi önlemektedir. Bazı durumlarda eşleşme olduktan sonra alttaki tüm eylemlerin yapılmasını isteyebiliriz. Böyle durumlarda break kullanmamalıyız. Bununla ilgili hafta sonuna kaç gün kaldığını söyleyen şu örneği inceleyebiliriz:

int gunNumarasi=0;
int kalanGunSayisi=0;
switch (gunNumarasi) {
  case 0:  // Pazar
    kalanGunSayisi++;
  case 1:  // Pazartesi
    kalanGunSayisi++;
  case 2:  // Salı
    kalanGunSayisi++;
  case 3:  // Çarşamba
    kalanGunSayisi++;
  case 4:  // Perşembe
    kalanGunSayisi++;
  case 5:  // Cuma
    kalanGunSayisi++;
  case 6:  // Cumartesi
}
System.out.println("Hafta sonuna kalan gün sayısı: " + kalanGunsayisi);

Hafta sonuna veya Cumartesi'ye kadar kalan gün sayısını veren bu örneğin gün numarası sıfır için yani Pazar günü için ekran çıktısı şöyle olacaktır:

Hafta sonuna kalan gün sayısı: 6

Görüldüğü gibi case 0 ile eşleşen ifade, break olmaması nedeni ile altında yer alan diğer case'lerin eylemlerini de yapmaktadır.
Imza: admin

20.12.2008 (23:41)

 If ve Else Kullanımı 
If deyimi (expression), kontrol işlemlerimiz için kullanılmaktadır. Yapılan kontrolün true (doğru) veya false (yanlış) olmasına bağlı olarak dallanmalar söz konusu olabilmektedir.

Karşılaştırmada kullanılabilen bazı operatörler şunlardır:

< Küçüktür
> Büyüktür
== Eşittir
!= Eşit değildir
! Değili

Minimumu (en küçüğü) bulma örneğinde if'in kullanımı görülmektedir:

if (a < b) {
  min = a;
} else {
  min = b;
}

Bu ifade basit bir if ifadesidir. a ve b sayılarından küçük olanını min değişkenine bu kontrol ile yapabilmekteyiz.

Eğer kontrol içinde tek satırlık işlemlerimiz var ise blok kullanmayabiliriz. Aynı örneği şu şekilde yazabiliriz:

if (a < b)
  min = a;
else
  min = b;
veya
if (a < b)  min = a;
else  min = b;

Maksimumu (en büyüğü) bulmak için de a, b ve c sayıları kullanılarak yapılan kontrollere ve içi içe yer alan if'e bakalım:

if (a > b) {
  if (a > c) max = a;
  else max = c;
} else {
  if (b > c) max = b;
  else max = c;
}


Else-If ifadesi ise şu şekildedir:

if (gun == 0) day = "PAZARTESİ";
else if (gun == 1) day = "SALI";
else if (gun == 2) day = "ÇARŞAMBA";
else if (gun == 3) day = "PERŞEMBE";
else if (gun == 4) day = "CUMA";
else if (gun == 5) day = "CUMARTESİ";
else day = "PAZAR";


Bir boolean ifadenin değilini alan ünlem operatörü ! ise doğrudan boolean değişkenlerle kullanılabilir:

boolean isActive = true; // boolean ifade
boolean isVisible = false; // boolean ifade

if (isActive) {
  if (!isVisible) {
    System.out.print("Here will be seen.");
  }
}

Bu örnekte de yer alan yazı ekrana bastırılacaktır. Çünkü isActive değişkeni true iken false olan isVisible değişkeni ! operatörü ile true yapılmaktadır.

Daha önce de Java'da Boolean Mantıksal Operatörler yazısında ? operatörü ile If-Then-Else operatörüne değinmiştik. Kullanımla ilgili, yazıda yer alan örneğe bakılabilir.
Imza: admin

17.12.2008 (07:38)

 Dosya ve Klasör Üzerine İşlemler 
Dosya ve klasör işlemlerinden listeleme işlemini daha önce bu yazıda görmüştük. Listeleme (list() metodu ile listeleme) dışında dosya mı (isFile()) dizin mi (isDirectory()) olduğunu belirten metotlar bulunmaktadır.

Bunlar dışında dizin (directory) oluşturmak için mkdir() metodu, yeniden adlandırma işlemi için renameTo(File) metodu yer almaktadır. Salt okunabilir kılma işlemi de yine setReadOnly(), son düzenlenme tarihini okuma (lastModified()) veya değiştirme (setLastModified(long)) metotları ile yapılabilmektedir.

Ayrıca isHidden() metodu ile gizli bir dosya/klasör olup olmadığını öğrenebilmekteyiz. Silme işlemimizi de delete() metodumuzla yapabilmekteyiz.

Java, metotları ile çeşitli dosya ve klasör işlemleri yapabilmemizi onları düzenleyebilmemizi sağlamaktadır.
Imza: admin

15.12.2008 (23:20)

 Dizindeki Dosyaların ve Klasörlerin Listelenmesi 
Bir klasörün dizinine ulaşmak ve o dizinde yer alan dosyaları listelemek için File sınıfının list() metodunu kullanabiliriz. Örnek kodda bakılırsa C:// dizininde(directory) yer alan dosyalar listelenmektedir.

package kodcu.net;

import java.io.File;

public class Main {
 
  public static String PATH = "C://";
 
  public static void main(String[] args) {
    // dosya nesnemizi olusturalim
    File dir = new File(PATH);
    // icindekilerin listesini olusturalim
    String[] children = dir.list();
    if (children == null) {
      System.out.println("Directory mevcut degil");
    } else {
      int length = children.length;
      for (int i = 0; i < length; i++) {
        System.out.println(children[i]);
      }
    }
  }
     
}

Ekran, C: dizinine bağlı olarak şuna benzer çıkacaktır:

AUTOEXEC.BAT
boot.ini
Bootfont.bin
Config.Msi
CONFIG.SYS
Documents and Settings
IO.SYS
kodcu.net.txt
MSDOS.SYS
MSOCache
msvcp70.dll
msvcr70.dll
NTDETECT.COM
ntldr
pagefile.sys
Program Files
RECYCLER
System Volume Information
temp
WINDOWS

Görüldüğü gibi dizinde yer alan hem dosyalar hem klasörler listelenmektedir.
Imza: admin

05.12.2008 (01:45)

 Nesneyi Dosyaya Yazmak ve Okumak 
Dosyalara yazdırma işlemlerinde kimi zaman nesneleri de dosyaya yazdırıp dosyadan okumak isteyebiliriz. Bu nesnenin her bir özelliğinin (attribute) ayrı ayrı dosya da tutulmasından ve okurken ayrıştırıp çekilmesinden iyidir. Bu işlem C dilinde de structure'ın dosyaya yazılıp okunması gibidir.

Örnek kodda dikdörtgen isimli bir sınıf kullanılacak ve bu sınıftan dikdörtgen nesnesi üretilip doyaya yazılacaktır.

Rectangle.java:
package kodcu.net;

import java.io.Serializable;

public class Rectangle implements Serializable {
 
  private int width;
  private int height;
 
  // Constructor
  public Rectangle() {
    width = 0;
    height = 0;
  }
 
  // Constructor
  public Rectangle(int width, int height) {
    this.width = width;
    this.height = height;
  }
 
  // Dikdortgenin genisligini verir
  public int getWidth() {
    return width;
  }
 
  // Dikdortgenin yuksekligini verir
  public int getHeight() {
    return height;
  }
 
  // Dikdortgenin alanini verir
  public int getArea() {
    return (width * height);
  }
 
}

Dosya okuma ve yazma işlemini yapan Main.java:
package kodcu.net;

import java.io.ObjectOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.FileInputStream;

public class Main {
 
  static final String FILE_PATH = "C://object.dat";
 
  public static void main(String[] args) throws IOException {
    Rectangle rectangle = new Rectangle(10, 15);
    // nesneyi yaz
    writeObject(rectangle);
    // nesneyi oku
    readObject();
  }
 
  public static void writeObject(Rectangle rectangle) throws IOException {
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILE_PATH));
    oos.writeObject(rectangle);
    oos.close();
  }
 
  public static void readObject() throws IOException {
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_PATH));
    try {
      Rectangle rectangle = (Rectangle) ois.readObject();
      ois.close();
      System.out.println("Dikdortgenin Alani: " + rectangle.getArea());
    }
    catch (ClassNotFoundException ex) { }
  }
 
}

Main.java'yı çalıştırdıktan sonra C:\ dizininde object.dat isimli bir DAT dosyası oluşacak. Okuma yazma işlemi sonrasında ekranda dikdörtgenin alanı yazılacak.

Dikdortgenin Alani: 150

Rectangle sınıfında dikkat edilecek olursa Serializable sınıfı implement edilmiştir. Bunu yapmamızın sebebi nesnenin yazdırılması aşamasında içindeki bilgilerin kabolmaması gerektiğindendir.
Imza: admin

02.12.2008 (04:25)

 Dosyadan Satır Okuyup Dosyaya Satır Yazdırmak 
Daha önce dosyadan karakter karakter okuma yapmayı burada ve dosyaya yazmayı şurada görümüştük. Her karakter için IO kesmeleri (input/output interrupt) göndermek yerine satırı bir seferde okumak ve yazmak, işlemi daha hızlı yapabilmemizi sağlar.

Şu örnek ile satır satır okumayı ve yazmayı gerçekleyelim:

package kodcu.net;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Main {

  public static void main(String[] args) {

    try {
      File file = new File("C://kodcu.txt");
      File file2 = new File("C://kodcu2.txt");
      FileInputStream fis = new FileInputStream(file);
      FileOutputStream fos = new FileOutputStream(file2);
      BufferedReader br = new BufferedReader(new InputStreamReader(fis));
      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
      String satir;
      while ((satir = br.readLine()) != null) {
        // okudugumuz satiri buffered writer'a yazalim
        bw.write(satir);
        // yeni satir olusturalim
        bw.newLine();
      }
      // buffered writer'daki bilgileri cikti akisina gonderelim
      // ve buffered writer'i temizleyelim
      bw.flush ();
      bw.close ();
      br.close ();
      fis.close();
      fos.close();
    }
    catch (FileNotFoundException fnfe) {
      // Dosya bulunamadi
    }
    catch (IOException ioe) {
      // okuma/yazma hatasi
    }
  }

}

kodcu.txt dosyasından readLine() metodu ile okunan her satır, kodcu2.txt dosyasına yazılmaktadır. write() metodu satırı yazarken yeni satıra geçme işlemi newLine() metodu ile yapılmaktadır. Buradaki önemli nokta okunan dosyanın en sonunda yeni satır (new line) yapılıp yapılmamış olmasıdır. Eğer yapılmışsa kopyalama birebir aynıdır fakat yapılmamışsa okuma işlemi dosya sonu karakteri (EOF - end of file) nedeni ile tamamlanacak ama yazdırmada dosya sonu karakterinden önce yeni satır karakteri eklenecektir. Yani yazdırılan dosyada fazladan bir yeni satırımız oluşacaktır.
Imza: admin

01.12.2008 (01:53)

 Dosyaya Karakter Yazdırmak 
Bir dosyadan karakter okuma şurada bahsedilmişti. Şimdi de okunan karakterleri başka dosyaya yazalım.

Main.java:
package kodcu.net;

import java.io.*;

public class Main {

  public static void main(String[] args) {

    try {
      File file = new File("C://kodcu.txt");
      File file2 = new File("C://kodcu2.txt");
      FileInputStream fis = new FileInputStream(file);
      FileOutputStream fos = new FileOutputStream(file2);
      int c;
      while ((c = fis.read()) != -1) {
        fos.write(c);
      } 
      fis.close();
      fos.close(); 
    }
    catch (FileNotFoundException fnfe) { }
    catch (IOException ioe) { }
  }

}

Bu kod ile bir dosyadan başka bir dosyaya karakter karakter kopyalama işlemi yapmış olduk. Bu kopyalama işleminde dosyada yer alan yeni satırlar da (new line characters) diğer dosyaya yazılmıştır.
Imza: admin

27.11.2008 (03:17)

 Dosyadan Karakter Okumak 
Java'da dosya işlemlerinde File sınıfı ve akışlar (streams) kullanılır.

Diskin C bölümünde yer alan kodcu.txt'den karakter karakter okuma yapalım.

Dosya: C://kodcu.txt
deneme 1
deneme 2
deneme3
satır 1
satır 2
satır3

Şu kod ile okuma yapalım:
package kodcu.net;

import java.io.*;

public class Main {

  public static void main(String[] args) {

    try {
      File file = new File("C://kodcu.txt");
      FileInputStream fis = new FileInputStream(file);
      int c;
      // dosya sonuna kadar yani -1'e kadar yazdiralim
      while ((c = fis.read()) != -1) {
        System.out.print((char)c);
      }
      fis.close();
    }
    catch (FileNotFoundException fnfe) { }
    catch (IOException ioe) { }
  }

}

Elde ettiğimiz çıktı:
deneme 1
deneme 2
deneme3
sat?r 1
sat?r 2
sat?r3

Görüldüğü gibi Türkçe karakterlerde sorun çıktı. Türkçe karakterler yerine soru işareti (? - question mark) geldi. Sıkça karşılaşılabilen bu problemi önlemek için kodu şu şekilde değiştirelim:

package kodcu.net;

import java.io.*;

public class Main {

  public static void main(String[] args) {

    try {
      File file = new File("C://kodcu.txt");
      FileInputStream fis = new FileInputStream(file);
      InputStreamReader isr = new InputStreamReader(fis, "ISO-8859-9");
      int c;
      // dosya sonuna kadar yani -1'e kadar yazdiralim
      while ((c = isr.read()) != -1) {
        System.out.print((char)c);
      }
      isr.close();
      fis.close();
    }
    catch (FileNotFoundException fnfe) { }
    catch (IOException ioe) { }
  }

}

Yeni çıktımız şu şekilde:
deneme 1
deneme 2
deneme3
satır 1
satır 2
satır3

Java'da dosyadan karakter okuma işlemi için read() fonksiyonunu ve Türkçe karakter kodlaması (character encoding) için ISO-8859-9'u kullandık. read() fonksiyonunun dönüş tipinin int (integer) olduğuna ve karakter olarak kullanabilmemiz için char (character) ile cast yapıldığına dikkat ediniz. Dosya sonuna gelindiği ise -1 değerinin okunması ile anlaşılmaktadır.

Dosya giriş akışı (file input stream) oluştururken belirtilen dosya yolunda (file path) dosyanın yer almamasına karşılık FileNotFoundException istisnası yakalanmalıdır. Ayrıca read() adımında da okumaya yönelik bir istisna için de IOException istisnası yakalanmalıdır.
Imza: admin

24.11.2008 (07:05)

 Konsola Karakter ve Karakter Dizisi Yazmak 
Genel olarak konsola birşeyler yazacaksak System sınıfının out'unun metodlarını kullanırız. Devamına yazdıracaksak print() metodunu, alt satıra (new line) geçerek yazdıracaksak println() metodunu kullanırız.

Bunların dışında PrintWriter sınıfı da kullanılabilir.

package kodcu.net;

import java.io.PrintWriter;

public class Main {

  public static void main(String[] args) {
    System.out.print("aa");
    System.out.println("bb");
    PrintWriter pw = new PrintWriter(System.out, true);
    // true: çıktı akışını temizler
    pw.println("ccc");
  }

}

Programın çıktısı şu şekildedir:
aabb
ccc

Imza: admin

 1  ··  4   5   6  ··  10 








Yazilar kaynak gosterilmeden kopyalanamaz © www.kodcu.net // Twitter