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.
Ornek Dosyalar
http://www.turk-php.com/ornekler/kredi3.html
http://www.turk-php.com/ornekler/kredi3.php
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.
Gorus ve onerilerinizi asagidaki mail adresine gonderebilirsiniz.Basarilar
dilerim
serkan@turk-php.com