Sayfalar

Dongü ve Diziler - 1


Donguler,yazdigimiz komutlarla istedigimiz bir islemi bilgisyarin yuzlerce,binlerce,ve hatta milyonlarca defa tekrarlamasidir.Biraz aciklamak istersek,eger bilgisayara bir gorevi yapmasi icin emir veriyorsak ve bilgisyar bu emri basarili bir sekilde yerine getiriyorsa neden ayni islemi dogru olarak bizim istedigimiz sayi kadar veya istedigimiz sartlar yerine gelene kadar tekrarlamasin ki?

PHP iserisinde her programlama dilinde oldugu gibi bu konu icin yazim mekanizmalari gelistirlmistir.Burada ogreneceginiz dongu yapilari size diger programlama dillerini ogrenirken de gorus olarak yardimci olacaktir.

Bu bolumde asagidaki konular icin detayli aciklamalar bulacaksiniz,

# "while" dongusu, (The while loop)
# "do while" dongusu ,
# "for" dongusu,
# Dizilerin yaratilmasi (Creating Arrays)
# Dizilerden deger okunmasi
# Dizilerin Indexlenmesi
# Dizilerin Siralanmasi
# Cok Boyutlu Diziler
# Dongu ve Diziler icin pratik ornekler

Donguler

Bir onceki konuda formlar uzerinde yapilan kontrol islemleri anlatilmisti.Bu form kontrollerinde istedigimiz sartlara gore form verilerinin islenip islenmemesi gerektigine,PHP yazdigimiz "if" komutlari ile karar veriyordu.(Eger halen okumadiysaniz IF serisi yazilarimizi bastan sona okuyarak bilgi alabilirsiniz)

Dongulerde durum biraz daha degisik cunku,PHP bizim yazdigimiz sartlar olusuncaya kadar ,dongu icerisinde verilen kod grubunu calistiracaktir.Dongunun yaptigi bu herbir isleme "iteration" yani "oteleme" adi verilir.Dongunun herbir donusu bizim icin bir "iteration" dir.

while donguleri

Ilk anlatacagimiz dongu yapimiz "while".Bunun sebebi yapi olarak en basit olan dongunun "while" olmasidir.

while (sartimiz dogruysa)

{

Bu parantezlerin icersindeki kod grubunu uygula

}

Parantezlerin icerisindeki kod grubu uygulandiktan sonra eger dongumuzun en basinda verdigimiz sart halen dogrulaniyorsa,dongumuz bir kez daha calisacaktir.Bu dongu taa ki bizim dongumuzun basinda verdigimiz sart "yanlis" degerini dondurene kadar devam edecektir.

while (ay dolunay)

{

Kurtlar Uluyacak

}

yukaridaki ornekte goruldugu gibi Ay'in durumu dolunay oldugu surece kurtlarimiz uluyacak yani dongumuz calisacak :))

Bir baska ornek verecek olursak ,uygulamamiz icerisinde kullanicinin kredi karti limitini asmasi durumunda "sepet"'inden bazi urunleri cikarmak istiyoruz.Asagida bununla ilgili bir kod parcasi gorulmektedir.

While ($AlisverisToplami > $KrediLimiti)

{

echo ("Kredi limitinizi astiginiz icin son aldiginiz urun sepetinizden cikarildi");

$AlisverisToplami = $AlisverisToplami - $SonAlisveris;

$SonAlisveris = $SonAldigiUrun;

}

Eger musteri kredi limitini asarsa ,son aldigi urunu iptal ediyoruz.Bunu, toplam faturasindan urunun fiyatini duserek yapiyoruz.Daha sonra $SonAlisveris degiskeni icerisinde saklanan degeri $SonAldigiUrun degiskeni ile degistirip her seferinde dongumuzde,eger kredi limiti asiliyorsa kullanicinin aldigi son urunleri birer birer spetinden cikartmis oluyoruz.

Burada dikkat edilmesi gereken nokta eger $KrediLimiti olarak verilen deger negatif olursa dongumuzun asla son bulmayacagidir.Her zaman eger dongulerle calisiyorsaniz aklinizda olmasi gereken nokta dongunun verilen degisik degerler karsisinda ne yapacagini hesaplamanizdir.(Sonsuz donguler ile ilgili aciklamayi yazinin ileryen kesimlerinde bulabilirsiniz)

Simdi yukarida acikladigimiz "while loops" yani "while donguleri" icin bir uygulama yazalim.

1.Text editorunuzu acip asagidaki kodlari yazin.

<HTML>
<HEAD></HEAD>
<BODY>
Seres Bankasi Kredi Isteme Formu

<FORM METHOD=POST ACTION="kredi3.php"
<BR>
Ne kadar kredi almak istiyorsunuz?
<BR>
<BR>
<INPUT NAME="Kredi" TYPE="Radio" VALUE=1000>Kredi miktari 1000 TL Faiz %5
<BR>
<INPUT NAME="Kredi" TYPE="Radio" VALUE=5000>Kredi miktari 5000 TL Faiz %10
<BR>
<INPUT NAME="Kredi" TYPE="Radio" VALUE=10000>Kredi miktari 10000 TL Faiz %15

<BR>
<BR>

Aylik ne kadar geri odeme yapabilirsiniz?
<INPUT NAME="AylikOdeme" TYPE=Text SIZE=5>

<BR>
<BR>

<INPUT TYPE=SUBMIT VALUE="Buraya Tiklayarak Geri Odeme icin Kac Ay Gerektigini Hesaplayin">

</FORM>
</BODY>
</HTML>

2.Bu dosyayi "kredi3.html" olarak kayit edin.

3.Yeni bir text dosyaysi acip asagidaki kodlari yazin.

<HTML>
<HEAD></HEAD>
<BODY>
<?php
$Sure=0;
switch ($Kredi) {
case 1000:
$Faiz = 5;
break;
case 5000:
$Faiz = 6.5;
break;
case 10000:
$Faiz = 8;
break;
default:
echo "Bir paket secmelisiniz!";
exit;
}
while ($Kredi > 0)
{
$Sure = $Sure + 1;
$AylikNet = $AylikOdeme - ($Kredi*$Faiz/100);
if ($AylikNet<=0)
{
echo "Daha yuksek bir odeme miktari secmelisiniz!";
exit;
}
$Kredi = $Kredi - $AylikNet;
}
echo "Toplam $Sure ayda yuzde $Faiz faiz ile kredinin tamamini odemis olacaksiniz.";
?>
</BODY>
</HTML>

4.Bu dosyayi "kredi3.php" olarak kayit edin.

5."kredi3.html" dosyasini acin ve bir kac veri girin.

Program nasil calisiyor?

Formdan gelen veriler yazdigimiz PHP programina ulastiginda su verileri kesin olarak biliyoruz,(Kullanici kisi forma bu verileri kendisi girdi.)

$Kredi
$Faiz
$AylikOdeme

Simdi ilk yaptigimiz islem kullanicin sectigi pakete gore faiz orani ve kredi miktarini programda tanimlamak.

Bunun icin "switch" komutunu kullanarak elimizde bulunan butun kosullari programin icinde tanimliyoruz..

$Kredi degiskenin alabilecegi 3 tane deger vardir.Bunlar 100,5000,ve 10000 dir.Biz bu degerleri kulllanarak program icinde $Faiz degiskeni icinde bir atama yapilmasini sagliyoruz.Bunu hangi kredi miktarini kullanici secmis ise "switch" ile tanimlarken bir alttaki satirda $Faiz degiskenine deger atayarak yapiyoruz.

$AylikOdeme miktarini da zaten kullanicimiz en basta bizim icin text alanina girmisti.

Bu noktadan sonra artik "while" dongumuzu kullanarak kisinin bu aldigi krediyi kac ayda tam olarak geri odeyebilcegini hesaplayabiliriz.

While ($Kredi >0)
{

Bu ifade ile dongumuzu baslatiyoruz.Kredi miktarimiz mutlaka sifirdan buyuk olmalidir.Zaten $Kredi degiskenimizin alabilcegi 3 tane deger var ve bunlar sifirdan farkli.o yuzden sorun cikmasi ihtimali yok.

Bir sonraki satirda programi yazmamizin amaci olan kac ayda odeyebilecegi sorusuna cevap verecek $Sure sayacimizi tanimliyoruz.Dongumuz her calistiginda bu sayac birer birer artacak.Bu degisken icerisinde ,boylece dongu sonunclaninca dongunun kac defa calistigi yani aylik odemelerin kac ayda tamamlanacagi degeri bu degiskende saklanmis olacak.Dongu mesela iki defa calisip biterse demek ki kullanici 2 ayda tum krediyi geri odemis olacak.

$Sure = $Sure + 1;

Bir alttaki satirda aylik odemelrin ne kadar olacagi hesaplaniyor.Bu deger tabiiki faiz miktari dusuldukten sonra olmalidir.Cunku kullanicinin odedigi paranin belli miktarini faize gidecek.Eger faiz hic isin icinde olmasaydi tabii ki kullanicidan gelen butun parayi ($AylikOdeme) gozununde bulundurup faiz kismini isin icine katmayacaktik.Faize giden parayi sanki kullanici hic odememis gibi dusunebilirsiniz.

$AylikNet = $AylikOdeme - ($Kredi * $Faiz/100);

yukarida gordugunuz gibi $Kredi ile $Faiz orani carpilip yuzdesi alinmakta.Bu miktari kullanicin aylik odemesinde dusmekteyiz.bu sekilde net olarak kullanicidan gelen net miktari hesapliyoruz.

Bir sonraki satirda ,

if (AylikNet <= 0)

{

echo "Aylik odeme miktarini biraz daha yuksek secmelisiniz";
exit;

}

Kod grubu ile ,kullanicidan gelen miktar eger faizi bile karsilamaya yetmiyorsa programin yapacagi islem tanimlaniyor.Eger boyle durum olursa "exit" komutu ile program sonlaniyor.(Tabii ki sonlanmadan once bir bilgi mesji ekrana gordugunuz gibi "echo" komutuyla basiliyor. )

Bir sonraki,

$Kredi = $Kredi - $AylikNet;

kod satirinda kullanicin aldigi kredi miktarindan ,odedigi miktar dusulurek yeni deger yine $Kredi degiskeninde saklaniyor.

Boylece dongumuzun bir defalik cevrim surecini aciklamis olduk.Dongumuz tum bu islemleri ,

While ($Kredi >0)

sartimiz "false" oluncaya kadar tekrarlayacaktir.Gordugunuz gibi dongunun her calismasinda $Kredi degiskeni icerisinde saklanan deger yavas yavas azalmaktadir.

(Cunku dongu her calsitiginda $Kredi = $Kredi - $AylikNet; formulu ile $Kredi degiskenin degerini dusurmektedir)

Simdi bir de sayisal ornek vererek dongunun nasil calistigini aciklayalim.

Ornek olarak kullanicin 1000 dolarlik krediyi yuzde 5 faiz ile aldigini kabul edelim.Kullanicimiz aylik 100 dolar odeyebilcegini soyluyor.O zaman degiskenlerin degerleri asagidaki gibi olacaktir.

$Kredi = 1000
$Faiz = 5
$Sure = 0
$AylikOdeme = 100

Dongumuzun en basinda ,

Kullanicinin aldigi Kredi 1000 dolar,Faiz orani 5, Aylik,Odeme 100 ve Sure 0 olacaktir.

Simdi programin ilk satiri soyle olacaktir,

while (1000>0)

Evet 1000 sayisi 0 sayisindan buyuk rahatlikla dongunun icerisndeki islemler uygulanabilir.

$Sure = 0 + 1;

Simdi $Sure degiskenimiz 1 e esit.

Bir sonraki satir,

$AylikNet = 100 - (1000*5/100);

$AylikNet = 100 - 50;

artik $AylikNet degiskenimiz 50'ye esit.

Son satirda bu degeri yerine koyuyoruz
$Kredi = 1000 - 50;

Artik $Kredi degiskenimiz 950 dir.Program en basa donerek bu degeri kontrol degeri ile karsilastiracaktir.

While (950>0)

Evet 950 sayisi 0 sayisindan buyuk rahatlikla dongunun icerisndeki islemler tekrar uygulanabilir.

$Sure = 1 + 1;

artik $Sure degiskenimiz 2 ye esit.

$AylikNet = 100 - (950*5/100);

Artik $AylikNet degiskenimiz 52.5 e esittir.

$Kredi = 950 - 52.5;

Artik $Kredi degiskenimiz 897.5 e esittir.

While (897.5>0)

Evet 897.5 buyuktur 0 dan diyerek ayni sekilde dongu taa ki $Kredi degeri 0'a veya 0 dan kucuk bir sayiya esit olana kadar devam edecektir.

Zaten $Kredi degiskeni 0 dan kucuk olunca bizim kullanicimizda Kredinin tamamini odemis demektir dogru degilmi.?

Dongumuz calismayi bitirince dongunun disindaki ilk satirdan programin isleyisi devam eder.

Ve en sonunda "echo" komutuyla "$Sure" degiskeninin icindeki deger ekrana yazilir.