The European Union’s “Making the Labour Market more Inclusive III” programme For “North Cyprus” Upgrading Internet Technology skills of Information and Communication Technologies (ICT) Professionals Module 2:Server Side Internet Programming Modül 2: Sunucu Tarafı Internet Programlaması Laboratuar Notları A project implemented by CyberSoft Bilişim Teknolojileri Ltd. This project is funded by European Union. The contents of this reports are the sole responsibility of Cybersoft Bilişim Teknolojileri Ltd. and can in no way be taken to reflect the views of the European Union. İçerik Bölüm 4: Dizi Kavramı ve Dizi Nesnelerinin Kullanımı..........................................................................2 Çalışma 1: Aynı Olan Sayıları Eleme …………….................……………………………………….6 Çalışma 2: Sales2 Programındaki Hataları Bulma …………...………………………………………9 Çalışma 3: Havayolu Rezevasyon Sistemi...…………………………………………………………12 Diziler 1 Diziler (Arrays), yazılım geliştirme süreçlerinde, geliştiricilerin işlemlerini daha kolay ve verileri daha yönetebilir bir forma sokmak için sıkça kullandığı çok önemli ve temel bir programlama kavramıdır. Dizilerin tasarlanış amaçları gayet basittir. Diziler basitçe, aynı tipe sahip bir dizi elemanı, tek bir noktada gruplayarak bu verilere daha kolay bir şekilde ulaşılmasını sağlayarak, yazılım geliştirme sürecini daha basit ve yönetilebilir bir hale sokar. Java‟da bu tip işlemler için çok gelişmiş bir dizi (array) mekanizması sunar. Daha önce C/C++ kullanmış yazılımcılar, Java‟daki dizileri incelerken dikkat etmesi gerekiyor. Çünkü Java‟da diziler, C/C++ dillerindeki dizilerden çok farklı bir yapı üzerine inşa edilmiştir. Java’da diziler nesnedir. Bu yüzden Java‟daki diziler diğer dillerde kullanılan dizilerden farklıdır ve çok güçlüdür. Dizileri Oluşturmak int[] dizi; int baskaDizi[]; Yukarıdaki kodda, int tipinde 2 farklı tek boyutlu dizi referansı oluşturduk. Dizi oluşturulmasında kullanılan „[ ]„ operatörü tip belirtecinden sonra ya da değişken tanımlamasından sonra kullanılabilir.Dizi referanslarına atama, dizi için bir nesne oluşturularak, kod içinde herhangi bir yerde yapılabilir. int[] dizi = new int[10]; // 10 elemanlık bir int dizisi int baskaDizi[]; baskaDizi = new int[5]; // 5 elemanlık başka bir dizi int tipinde olduğu gibi Java‟da primitive tiplerden nesne tiplerine kadar her veri tipinde dizi oluşturabilirsiniz. int[] intDizisi; byte[] byteDizisi; String[] stringDizisi; Object[] objectDizisi; Dizilere Değer Atamak Java‟da dizilere 2 türlü değer atayabiliyoruz. Birinci yöntem, dizi referansı oluşturduğumuz satırda dizi elemanlarına açıkça atama yapabiliriz. Bu yöntemde dikkat edilmesi gereken nokta, nesne referansı oluşturduğumuz satırda bu atamayı yapmamız şart. Nesne referansı oluşturduktan sonra bu atamayı kodun başka yerinde yapmak derleme hatasına neden olur. String[] stringDizisi = {"Java", "C++", "Python", "Haskell"}; // geçerli String[] baskaDizi; baskaDizi = {"Php", "Perl", "Ruby"}; // Error : Derleme Hatası Dizilere değer atamada kullanılan başka bir yöntem, dizi referansına bir dizi nesnesi oluşturup atama yapmaktır. Dizi boyutunu belirledikten sonra, dizi elemanlarını kodun herhangi bir yerinde atayabiliyoruz. int[] intDizisi; intDizisi = new int[10] // 10 luk bir int dizisi oluştur 2 intDizisi[0] = 1; intDizisi[1] = 2; //.. intDizisi[9] = 10; //dizinin son elemanı Dizi elemanlarına dizi operatörü olan „[ ]„ operatörü ile ulaşabiliyoruz. Yukarıdaki kodda görüldüğü gibi 10 luk bir dizi oluşturduk ve dizi elemanlarına „[ ]„ operatörünü kullanarak kolayca ulaşabiliyor sanki normal bir değişken gibi atama yapabiliyoruz. Hatırlayın, Java‟da dizi elemanları 0 dan başlar. Bu yüzden ilk elemana intDizisi[0], son elemana intDizisi[9] şeklinde atama yapıyoruz. Dizi Uzunluğu Java‟da diziler birer nesne olduğu için, sınıfların sağladığı tüm esnekliği ve gücü diziler ile de kullanabiliyoruz. Örneğin Java, dizi boyutunu (uzunluğunu) döndüren length adında bir özellik (property) sunar. Bu özelliği kullanarak, herhangi bir dizi boyutunu kolayca bulabiliriz. dizi.length şeklinde, dizi adındaki dizinin uzunluğunu bulabiliriz. Şimdi oluşturduğumuz 10 luk bir int dizisine 30dan büyük 10 çift sayıyı atayalım. int[] dizi; dizi = new int[10]; int altSinir = 30; for(int i = 0; i < dizi.length; altSinir++) { if(altSinir % 2 == 0) { dizi[i] = altSinir; i++; } } // dizi içeriğini ekrana bastıralım for(int i=0;i<dizi.length;i++) { System.out.printf("%d ", dizi[i]); } // Program Çıktısı 30 32 34 36 38 40 42 44 46 48 Dizi boyutu ile ilgili söylenmesi gereken bir diğer nokta, dizinin uzunluğu dışında bir işlem yapmaya çalışırsanız Java, IndexOutOfBoundsException ını fırlatır. Yani, 10 luk bir dizi oluşturduğunuzda dizinin son elemanına dizi[9] ifadesi ile ulaşabilirsiniz. Bunun üzerindeki herhangi bir ifadede Java, IndexOutOfBoundsException fırlatır ve işlem yapmanıza izin vermez. int[] dizi = new dizi[10]; dizi[0] = 5; //geçerli dizi[9] = 45; // geçerli dizi[10] = 56; // hata dizi boyutu 10 olarak tanımlandı Javada Çok Boyutlu Diziler 3 Java dizilerinde bahsetmem gereken bir diğer nokta, Java‟da diziler istenilen boyutda tanımlanabilir. İki, Üç boyutlu ( Two Dimensional, Three Dimensional Arrays) ve daha fazla boyutda dizi tanımlamak tamamen programcılara bırakılmıştır. Çok boyutlu diziler basitçe, dizilerin dizileri (arrays of arrays) olarak düşünülebilir. Ancak, uygulama kodunun basitliği ve kodu okuyan kişilerin kodda dönen olayları daha iyi anlayabilmesi için 2 boyutdan daha yüksek boyutda dizilerin kullanılması pek önerilmez. Nadiren 3 boyutlu diziler kullanılmaktadır. C/C++ gibi dillerde de çok boyutlu diziler ( Multi Dimensional Arrays) oluşturulurken, dizilerin dizileri mantığı kullanılır. Örneğin 2 boyutlu diziler belirli bir satır ve sütundan oluşan bir matris gibi düşünülebilir. Burada ilk dizi satır sayısını, diğer dizi ise sütun sayısını temsil eder. C/C++ da, sütun sayısı sabitdir. Her satır için aynı boyutda dizi (sütun) kullanılarak 2 boyutlu diziler oluşturulur. Ancak Java‟da bu böyle değildir. Java’da her satır için farklı sütun sayısında (dizi boyutu) dizi oluşturulabilir. C/C++ programlama ile uğraşmış geliştiriciler, bu noktaya da dikkat etmesi gerekir. String[][] dizi = { {"Ali", "Ayşe"}, {"Bey", "Hanım"} }; System.out.println(dizi[0][0] + " " + dizi[1][0]); System.out.println(dizi[0][1] + " " + dizi[1][1]); // Program Çıktısı Ali Bey Ayşe Hanım Üstteki örnekte, çift boyutlu bir String dizisi oluşturduk. Çok boyutlu dizi oluştururken, yapılması gerekenlerden biri, oluşturacağımız dizi boyutu kadar dizi operatörünü ( [] ) tip ya da değişken deklarasyonunun başına eklemek. Örnekte biz 2 boyutlu bir dizi oluşturduğumuz için bu tanımlamayı, String[][] dizi şeklinde ifade ettik. Çok boyutlu diziler, bazen kafa karıştırıcı olsa da asıl mantığı çok basittir. Bir dizi oluşturulur, o dizinin elemanları da başka bir dizidir. Bu şekilde, istenildiği kadar derinlikte dizi oluşturulur.Örneğe bakacak olursak, dizi elemanlarına ulaşmak bu mantık çerçevesinde oldukça basittir. dizi[0] ifadesi ile, dizi içerisindeki 1.elemana ulaşıyoruz, o elemanında başka bir dizi olduğunu bildiğimiz için o dizinin ilk elemanına da dizi[0][0] şeklinde, ikinci elemana da aynı şekilde dizi[0][1] şeklinde ulaşabiliyoruz. Örnekteki dizinin “Hanım” elemanına ulaşmak için yapmamız gerekenler sırasıyla şunlar. “Hanım” elemanı dizi ismindeki dizinin 2. elemanına ait bir eleman. Bu 2. eleman da kendi içinde bir dizi olduğu için, “Hanım” elemanı bu dizinin de 2. elemanıdır. Bu yüzden bu elemana bu mantık çerçevesinde dizi[1][1] şeklinde basitçe ulaşabiliyoruz. Çok Boyutlu Dizi Uzunlukları Daha önce bahsettiğim gibi, Java dizileri length adında bir özellik sayesinde dizi uzunluğunu kolay bir şekilde belirlenebiliyor. Çok boyutlu dizilerin de bu konseptte herhangi bir espirisi yoktur. Örnekteki dizi adındaki dizinin uzunluğunu aşağıdaki gibi bulabiliriz. Çıktı dizinin eleman sayısını beklendiği gibi verecektir. System.out.println(dizi.length); //Çıktı 2 dizi adındaki dizinin elemanları da bir dizi olduğu için, dizi[0] şeklinde bir ifade dizi içerisindeki ilk diziyi verecektir. Yine aynı şekilde bu dizilerin uzunluklarına da aşağıdaki şekilde ulaşabiliyoruz. dizi[0].length dizi[1].length 4 Şimdi de çok boyutlu dizilere başlarken yaptığımız tanımlamanın içini dolduralım. Java, diğer dillerde olduğu gibi herhangi bir dizinin, elemanı dizi olan elemanlarının uzunluğunu, sabit bir uzunlukta olmasını zorunlu koşmaz. Örneğin C dilinde 2 boyutlu bir dizi oluşturmak için array[10][5] şeklinde bir tanımlama yaparız. Bu ifade ile, array ismindeki dizinin 10 elemanı da dizi olan bir dizi tanımlarız. Dizi elemanlarının herbiri sabit olarak 5 uzunluğunda başka bir dizidir. Biz bu 10 adet 5 elemanlık dizinin boyutlarını farklı boyutlarda tanımlayamıyoruz. Ancak Java, buna izin verir. // Elemanları dizi olan bir dizi referansı oluştur // Çok boyutlu dizi yani String[][] dizi; //bu dizinin elemanları dizi olan 2 elemanı olsun dizi = new String[2][]; //dizinin ilk elemanı 2 elemanlı bir dizi olsun dizi[0] = new String[2]; //ilk eleman olan dizinin ilk elemanı "Bir" olsun dizi[0][0] = "Bir"; //diğer elemanı da "İki" olsun dizi[0][1] = "İki"; //dizi ismindeki dizinin ikinci elemanı uzunluğu tanımla dizi[1] = new String[3]; //ikinci elemanın ilk elemanı "Üç" olsun dizi[1][0] = "Üç"; dizi[1][1] = "Dört"; dizi[1][2] = "Beş"; 3 olan bir dizi olarak System.out.println(dizi[1][2]); System.out.println(dizi[0][1]); //Çıktı Beş İki Çok boyutlu dizilerdeki bu özellik Java‟nın sunduğu bir özelliktir. Çok esnek ve güçlü bir özellik olan bu yöntem ile, ihtiyacımız olan uzunlukta dizileri, tanımladığımız dizilere atıp kullanabiliyoruz. 5 Çalışma 1: Aynı Olan Sayıları Eleme Aşağıda verilen program şablonu hatasız çalışan bir Java programıdır. Ancak programdaki bir veya birden fazla anahtar satırları açıklama satırlarıyla değiştirilmiştir. Problem tanımını okuyun ve örnek sonucu inceleyin; daha sonra da şablon kod üzerinde çalışın. Problem çözme ipuçları‟nı kullanarak /* */ gösterilen açıklama satırlarını Java koduyla değiştirin. Programınızı derleyin ve çalıştırın. Bulduğunuz sonucu örnek sonuçla karşılaştırın. 1.1 Aynı Olan Sayıları Eleme Çalışmasının Amacı Bu çalışmada şu konular incelenecektir: Dizilerin tanımlanması ve ilk değerlerinin atanması Dizilerdeki değerlerle girilen input değerinin kıyaslanması Dizi boyutunun aşılmasını engelleme Program çalışırken dizi boyutunun ayarlanması 1.2 Aynı Olan Sayıları Eleme Çalışmasının Problem Tanımı Tek-boyutlu dizi kullanarak aşağıdaki programı yazınız: Değeri 10 ile 100 arasında değişen 5 sayıyı input alabileceki bir uygulama yazınız. Her okuduğunuz yeni sayının daha önce input olarak alınıp alınmadığını kontrol ediniz. 5 sayının da biribirinden farklı olması gereklidir. Programı yazarken kullanılabilecek en küçük diziyi kullanmaya özen gösteriniz. Kullanıcı her yeni değer girdiğinde yenilenmiş dizi listesini ekrana yazdırınız. 1.3 Aynı Olan Sayıları Eleme Çalışmasının Örnek Program Çıktısı 6 1.4 Aynı Olan Sayıları Eleme Çalışmasının Program Şablonu // Lab 4: Unique.java // 5 farklı sayı okuyan program. import java.util.Scanner; public class Unique { // kullanıcıdan 5 farklı sayı alınız public void getNumbers() { Scanner input = new Scanner( System.in ); /* 5 elemanlı bir dizi yaratınız*/ int count = 0; // okunan farklı sayı miktarı int entered = 0; // girilen sayı miktarı while( entered < numbers.length ) { System.out.print( "Enter number: " ); /* Kullanıcıdan input değerlerini alacak kodu yazınız */ // girilen input değerlerinin daha önce girilip girilmediğinin test edilmesi /* girilen input değerlerinin daha önce girilip girilmediğinin test eden if koşulunu yazınız */ { // daha önce girilen değerleri belirler boolean containsNumber = false; // girilen sayı değerini değerini (entered) artırır entered++; /* Kullanıcının girdiği değerle dizideki değereri karşılaştırınız. Eğer farklı ise diziye ekleyiniz. */ if ( !containsNumber ) { /* Diziye yeni sayıyı ekleyip count değişkeninin değerini } // if sonu else System.out.printf( "%d daha önce girildi\n", number ); } // if sonu else System.out.println( "Girilen değer 10 ile 100 arasında olmalıdır" ); // dizinin içeriğini ekrana yazdırma /* dizinin içeriğini ekrana yazdıracak kodu yazınız*/ } // while sonu } // getNumbers metod sonu } // class Unique sonu Şekil 1.1 Unique.java 7 // Lab 4: UniqueTest.java // Test application for class Unique public class UniqueTest { public static void main( String args[] ) { Unique application = new Unique(); application.getNumbers(); } // end main } // end class UniqueTest Şekil 1.2 UniqueTest.java 1.5 Aynı Olan Sayıları Eleme Çalışması için Problem Çözme İpuçları 1. 5 elemanlı bir dizi tanımlayınız. 2. Girilen değerin 10 ile 100 arasında olup olmadığını kontrol ediniz. Eğer değilse, yanlış input girdiğine dair mesajı ekrana yazdırınz. 3. Girilen değerin daha önceden dizide olup olmadığını kontrol ediniz. Eğer varsa kulanıcıya yanlış input girdiğine dair mesajı ekrana yazdırınız. Eğer yoksa, diziye ekleyiniz ve o ana kadar dizide olan değerleri ekrana yazdırınız. 4. Programı 10 ile 500 değerleri arasında 30 değer alabilecek şekilde değiştiriniz. 5. Programı 10 ile 500 değerleri arasında kullanıcının istediği kadar değeri alabilecek şekilde değiştiriniz. 8 Çalışma 2. Sales2 Programındaki Hataları Bulma Bu çalışmadaki program kodu hatalar içermektedir. Programın çalışabilmesi için bütün derleme hatalarını düzeltiniz. Program derlendiğinde, programı çalıştırınız ve sonuçları örnek ekran çıktısıyla karşılaştırınız. Daha sonra mantıksal hata varsa düzeltiniz. Program doğru şekilde çalıştığında sonuçlar aşağıdaki örnek program çıktısı gibi olmalıdır. 2.1 Sales2 Çalışmasının Örnek Program Çıktısı 2.2 Hatalı Program Kodu // Debugging Problem Chapter 7: Sales2.java // Program totals sales for salespeople and products. import java.util.Scanner; public class Sales2 { public void calculateSales() { Scanner input = new Scanner( System.in ); // sales array holds data on number of each product sold // by each salesman double sales = new double[ 5 ][ 4 ]; System.out.print( "Enter sales person number (-1 to end): " ); int person = input.nextInt() while ( person != -1 ) { System.out.print( "Enter product number: " ); 9 int product = input.next(); System.out.print( "Enter sales amount: " ); double amount = input.nextDouble(); // error-check the input if ( person < 1 && person > 5 && product >= 1 && product < 6 && amount >= 0 ) sales[ product - 1 ][ person - 1 ] += amount; else System.out.println( "Invalid input!" ); System.out.print( "Enter sales person number (-1 to end): " ); person = input.nextInt(); } // end while // total for each salesperson double salesPersonTotal[][] = new double[ 4 ]; // display the table for ( int column = 0; column < 4; column++ ) salesPersonTotal[ column ][ row ] = 0; System.out.printf( "%7s%14s%14s%14s%14s%10s\n", "Product", "Salesperson 1", "Salesperson 2", "Salesperson 3", "Salesperson 4", "Total" ); // for each column of each row, print the appropriate // value representing a person's sales of a product for ( int row = 0; row < 5; row++ ) { double productTotal = 0.0; System.out.printf( "%7d", ( row + 1 ) ); for ( int column = 0; column < 4; column++ ) { System.out.printf( "%14.2f", sales[ column ][ row ] ); productTotal += sales[ column ][ row ]; salesPersonTotal[ column ] += sales[ column ][ row ]; } // end for System.out.printf( "%10.2f\n", productTotal ); } // end for System.out.printf( "%7s", "Total" ); for ( int column = 0; column < 4; column++ ) System.out.printf( "%14.2f", salesPersonTotal[ column ] ); System.out.println(); } // end method calculateSales } // end class Sales2 Şekil 2.1 Sales2.java 10 // Debugging Problem Chapter 7: Sales2Test.java // Test application for class Sales2 public class Sales2Test { public static void main( String args[] ) { Sales2 application = new Sales2(); application.calculateSales(); } // end main } // end class Sales2Test Şekil 2.2 Sales2Test.java 11 Çalışma 3. Havayolu Rezevasyon Sistemi Bir havayolu şirketnin rezervasyon sistemi için 10 koltuk kapasitesi olan bir uçağı için bir uygulama yazınız. Uygulamanız kullanıcıya şu alternatifleri sunmalıdır: “Birinci Sınıf için 1‟e basınız.” “Ekonomi Sınıfı için 2‟ye basınız.” Eğer kullanıcı 1‟e basarsa, uygulamanız Birinci Sınıf bölümünden (1-5) arasında bir koltuk numarası vermelidir. Eğer kullanıcı 2‟e basarsa, uygulamanız Economi Sınıfı bölümünden (6-10) arasında bir koltuk numarası vermelidir. Daha sonra, ekrana müşterinin koltuk numarasını ve uçuş sınıf tipini (First or Economy) yazdırmalıdır. Oturma düzenini belirlemek için boolean tipinde tek boyutlu bir dizi tanımlayınız. İlk başta bütün koltukların boş olduğunu tanımlamak için bütün dizi elemanlarına false değerini atayınız. Daha sonra her rezerve edilen koltuğu dolu olarak işaretlemek için rezerve edilen koltuk numarasını dizide true olarak değiştiriniz. Daha önce reserve edilen koltuk tekrardan rezerve edilemez. Ekonomi bölümü dolunca, uygulama kullanıcıya “Birinci sınıf bölümünden yer ister misiniz?” diye sormalıdır. Eğer isterse, Birinci sınıf bölümünden uygun koltuk rezerve edilmelidir. Eğer istemezse de “Sonraki uçak 3 saat sonra kalkacaktır” mesajını ekrana yazdırmalıdır. Program Çıktısı şu şekilde olmalıdır: 12