Upgrading Internet Technology skills of Information and

advertisement
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
Download