>>

‹çindekiler

CHIP Workshop Klasörü
Kesin, biriktirin, kendi arflivinizi oluflturun
CHIP WORKSHOP’da BU AY
Web Programc›l›¤›
JavaScript veya Flash ile flifre korumal› sayfalar

CHIP Workshop Klasörü’nü ayraçlar›yla birlikte siparifl edebilir ve kendi arflivinizi oluflturabilirsiniz.
Fiyat: 9.000.000

Windows 2000
Windows 2000Server’larda Güvenlik

TL

(KDV ve gönderim ücreti dahil)

Java Serisi
Java ile Programlama Bölüm 3

Siparifl için: http://abone.vogel.com.tr

ÅCD yaz›c› testi Å205 Dolardan bafllayan DVD yaz›c›lar ÅCD Klonlama yöntemleri ÅCD Etiketi haz›rlama ÅAudio, MP3, Foto¤raf CD’si yazma ÅFilm kopyalama ÅYaz›labilir CD’lerin teknik ayr›nt›lar›...

ÅÇekim ÅRötufllama ÅBask› ÅTEST: 45 dijital foto¤raf makinesi ÅSat›n alma dan›flman› ÅBenzersiz Plug-in efektleri ÅTV’nizde foto¤raf gösterisi ÅProfesyonel çekim için foto¤raf kursu ÅPortre, Sualt›, Do¤a, Ürün çekim yöntemleri...

ÖZEL SAYI’lar Bayilerde, www.chip.com.tr, www.hepsiburada.com’da

Web Programc›l›¤›

<<

JavaScript veya Flash ile flifre korumal› sayfalar
Web sitenizi yerlefltirdi¤iniz hosting hesab›n›z sunucu tarafl› teknolojileri desteklemiyor mu? Ya da bunun için sizden ek bir ücret mi talep ediliyor? Sadece Flash veya JavaScript kullanarak sayfalar›n›za flifre korumas› yerlefltirebilirsiniz!
enellikle JSP, PHP ve ASP gibi sunucu tarafl› uygulamalarda görmeye al›fl›k oldu¤umuz flifre korumal› web sayfalar›n› Flash veya JavaScript gibi istemci tarafl› bir teknolojiyle de gerçeklefltirmeniz pekala mümkün. Tüm yapman›z gereken bu bölümde nas›l çal›flt›¤›n› görece¤iniz script’i veya Flash filmini kullanmak. StudioWeb’in daha ilk say›lar›nda web teknolojilerini sunucu tarafl› ve istemci tarafl› olarak iki gruba ay›rm›fl, sunucu tarafl› teknolojilerle istemci tarafl› teknolojilerin farklar›n› görmüfltük. K›saca bir hat›rlatma yapmak gerekirse sunucu tarafl› teknolojilerde bütün program mant›¤›, sunucuda çal›flan bir uygulama program› taraf›ndan yürütülür. Bir dizi ifllemden sonra elde edilen dinamik içerik, saf HTML (ya da dilenirse bunlara ilaveten istemci tarafl› script) kodlar› olarak kullan›c›ya gönderilir. Bu bak›mdan flifre korumas›, login prosedürü gibi ifllemler bizzat sunucuda yer alan bilgilerle karfl›laflt›r›larak

G

güvenli bir flekilde ele al›n›r. ‹stemci tarafl› teknolojilerde (Flash, JavaScript, DHTML, Java appletleri vs.) ise sayfaya ilifltirilmifl script veya dosya parçalar› bizzat ziyaretçi bilgisayar›nda lokal olarak çal›fl›rlar. Bu bak›mdan istemci tarafl› dosyalar›n çal›flabilmeleri için ziyaretçi bilgisayar›na ulaflmalar› gerekir. Bu da, kullan›c›lar›n bu dosya, script ya da kodlara eriflebilmelerine imkan oldu¤u anlam›na gelir. Peki o zaman hem flifre bilgimiz script’imizle ziyaretçimizin bilgisayar›na gidecek hem de bu bilgiyi ziyaretçiden saklayaca¤›z. Bu nas›l olacak? Bunu yapman›n bir kaç yolu var. En basiti, gizli olacak sayfan›z›n ad›n› flifreniz olarak belirlemek. Diyelim ki flifrenizi hokusPokus olarak seçtiniz. Gizleyece¤iniz sayfan›n ad›n› hokusPokus.html olarak koyabilirsiniz. fiifreyi soran sayfada ise form alan›na girilen bilginin sonuna .html dize parças›n› ekleyerek script’inize bu sayfaya gitmesini söyleyebilirsiniz.
location.href=document.myform.mytext. value + ".html?"; p

gellemek için script’te bir karfl›laflt›rma ifadesinin olmas›, bu ifadenin ziyaretçinin girdi¤i de¤er flifre ile ayn›ysa do¤ru sayfaya, yanl›flsa baflka sayfaya göndermesi gerekir. O zaman flifremizi ve gizli sayfa ad›n› script kodlar› içinde nas›l gizleyece¤iz? Bunu yapman›n tek yolu flifreniz için bir kriptolama gelifltirmek ve script’inize flifrenizin kriptolu versiyonunu yerlefltirmek olacakt›r. Kriptolama ile kastedilen flifre bilgisini belli bir algoritmaya göre farkl› bir de¤ere çevirmektir. Buna kodlamak (enkode etmek) denebilir (Enkode edilmifl bir de¤eri orijinal haline döndürmek, yani flifreyi çözmek ise dekode olarak adland›r›labilir). Kriptolama ifllemi asl›nda çok ciddi bir prosedürdür. Ancak biz script’imiz için çok basit bir kripto kullanaca¤›z. Basitli¤ine karfl›n kriptomuz iflimizi görecektir.

Kripto scripti
Öncelikle “kendimiz” için bir flifreyi belli bir algoritmaya göre kriptolayan ya da kriptolu bir de¤eri çözebilen bir uygulamaya ihtiyac›m›z olacak. Bu ifl için afla¤›daki script’i oluflturdum. Kripto.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title></title> <script language="JavaScript"> var dec="" var enc=""; dizi1="opTjklu03BCghV8EFW6D5efp Q2bcqrLM1O9aPdKmiYvRSstzAHwyp p

gibi bir ifade ile script’iniz do¤ru de¤eri giren ziyaretçiyi gizli sayfaya yönlendirecektir. Görüldü¤ü üzere kodlarda hiç bir dize karfl›laflt›rmas› yok ve flifreniz sayfa kodunda gözükmüyor. Buraya kadar her fley güzel, ancak bu yaklafl›m›n en önemli dezavantaj› yanl›fl flifre girildi¤inde ortaya ç›k›yor. Zira flifreyi diyelim ki “abrakadabra” olarak girmifl bir ziyaretçi, sitenizde akrakadabra.html isimli bir sayfaya yönlendirilmeye çal›fl›lacak, böyle bir sayfan›z bulunmad›¤›ndan da çirkin bir “The page cannot be found / Sayfa bulunamad›” manzaras› ile karfl›laflacak. Bu durumu en-

94• CHIP Workshop > >

>>
4NIJ7GnUZ"; +vkaB%*tp2q EueSTGm"; function okuDec(){ }

Web Programc›l›¤›

onClick="okuDec();enkript()"></td> <td width="150"><input name="dytext"></td>

anahtar="!ywzA$hj34MPc57N(s#8b6@9rHJfgLFQRKnWd&CD)/p </tr> </table> <br><br> </form> </body> function okuEnc(){ enc=document.myform.dytext.value; } function enkript(){ for (var i=0; i<dec.length; i++){ for (var j=0; j<dizi1.length; j++){ if(dec.charAt(i)==dizi1.charAt(j)){ enc=enc+anahtar.charAt(anahtar.length - j - 1); } } } document.myform.mytext.value=""; document.myform.dytext.value=enc; enc=""; dec=""; } function dekript(){ for (var x=0; x<enc.length; x++){ for (var y=0; y<anahtar.length; y++){ if(enc.charAt(x)==anahtar.charAt(y)){ dec=dec+dizi1.charAt(dizi1.length - y - 1); } } } document.myform.dytext.value=""; document.myform.mytext.value=dec; enc=""; dec=""; } </script> </head> <body bgcolor="#b0c4de"> <h2> Kripto </h2> <form action="get" name="myform"> <table border="0" cellpadding="0" cellspacing="0"> <tr> <td width="150"><input name="mytext"></td> <td width="150" align="center"><input style="width:100px" type= "button" value="<< Dekode et " onClick="okuEnc();dekript()"><br> <input style="width:100px" type="button" value=" Kriptola >>" p p p

dec=document.myform.mytext.value;

fiifremizi enkode edebilen ya da kriptolu bir flifreyi dekode edebilen uygulamam›z
</html>

Bu script web sitenizde yer almayacak olup sadece flifre script’imizi oluflturmada bize yard›mc› olacak. Script iki adet diziden oluflmakta. dizi1 ve anahtar. Bu dizilerin özellikleri flu: dizi1 flifrede kullan›labilecek karakterlerden (Büyük harf, küçük harf ve rakamlar) olufluyor. Her bir karakter dizide bir defa yer al›yor ve bu dizideki karakterlerin s›ras› mühim de¤il. anahtar kripto haline dönüflen de¤erde görünecek karakterlerden (diledi¤iniz ASCII karakteri) olufluyor. Her bir karakter dizide bir defa yer al›yor ve bu dizideki karakterlerin s›ras› da mühim de¤il. Scriptimizdeki okuDec() ve okuEnc() fonksiyonlar› girilen de¤erleri elde etmeye yar›yor. Di¤er iki fonksiyonumuzdan enkript() kripto uygulamam›zda sol tarafa girilen de¤eri kriptolayarak sa¤ tarafta enkode halini gösteriyor. Di¤er fonksiyonumuz dekript() ise kripto uygulamam›zda sa¤ tarafa girilen de¤eri kriptolu de¤eri çözerek sol tarafta flifremizin orijinal halini gösteriyor. Script’imizin kullan›m› görüldü¤ü gibi gayet basit. Kriptolama iflleminin neye göre yap›ld›¤›n› merak edenler için bunu da aç›klayal›m. Script’imiz belirledi¤iniz flifredeki harfleri s›ras›yla ele al›yor. Harflerin dizi1 dizisindeki s›ra numaras›n› (indexNo) bulup bunun tersten anahtar dizesindeki karfl›l›¤›n› elde ediyor. Mesela “op” de¤erinde bir flifre (dizi1 dizesinde bu harfler ilk iki pozisyonda yer al›yorlar) kriptoland›¤›nda “mG” de¤erini (anahtar dizesinde bu harfler son iki pozisyonda yer al›yorlar) al›yor. San›r›m bu, dizilerdeki karakterlerin neden birden fazla tekrarlanmamas› gerekti¤ini de aç›kl›yor. Sizin de fark edece¤iniz üzere ayn› flifre kelimesinin büyük harfli ve küçük harfli versiyonlar› ayn› olmay›p farkl› de¤erleri ifade ediyorlar.

Login sayfas›
Gelelim web sitemizde kullanaca¤›m›z sayfalar› oluflturmaya. ‹lk say-

< CHIP Workshop • 95 <

Web Programc›l›¤›

<<

fam›z flifre bilgisini soracak (ve kontrol edecek) olan login sayfas›. Sayfam›z görünürde iki adet form alan› ve bir dü¤meden olufluyor. Sayfam›zdaki script ise kripto.html sayfam›zdaki script’imizin daha sade bir versiyonu.
</form>

<input type="button" value="Login" onClick="enkript()"> <br><br> fiifre: hokusPokus (büyük harf küçük harf ayr›m›na dikkat!)

login.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Login</title> <meta http-equiv="Content-Type" content="text/html; p charset=windows-1254"> <meta http-equiv="Content-Type" content="text/html; charset= p ISO-8859-9"> <script> var sifre="%meENrmeEN"; var dec=""; var enc=""; dizi1= "opTjklu03BCghV8EFW6D5efQ2bcqrLM1O9aPdKmi p </html> YvRSstzAHwy4NIJ7GnUZ"; anahtar="!ywzA$hj34MPc57N(s#8b6@9rHJfgLFQRKnWd&CD)/ p +vkaB%*tp2qEueSTGm"; function okuDec(){ dec=document.myform.mytext.value; usr=document.myform.mytext2.value; } function enkript(){ if ((document.myform.mytext.value!="") && p (document.myform.mytext.value!=null)){ okuDec(); for (var i=0; i<dec.length; i++){ for (var j=0; j<dizi1.length; j++){ if(dec.charAt(i)==dizi1.charAt(j)){ enc=enc+anahtar. p charAt(anahtar.length - j - 1); } } } if (enc==sifre){location.href= dec + ".html?" + usr;} p else {location.href="red.html";} enc=""; dec=""; } } </script> </head> <body bgcolor="#ffffff"> <form action="get" name="myform"> Kullan›c› ad›: <input name="mytext2" type="Text"><br> fiifre:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p &nbsp;&nbsp; &nbsp; <input name="mytext" type="Password"><br> hokusPokus.html?Ufuk if (enc==sifre){location.href= dec + ".html?" + usr;} else {location.href="red.html";} p var sifre="%meENrmeEN"; </body>

Kullan›c› ismini ve flifresini girip dü¤meye bast›¤›nda sayfam›zdaki script girilen de¤eri kriptolayarak

sat›r›ndaki de¤erle karfl›laflt›r›yor. De¤er do¤ru ise

sat›r› kullan›c›y› ismiyle birlikte gizli sayfaya gönderiyor. Diyelim ki kullan›c› ad› olarak “Ufuk”, flifre olarak da “hokusPokus” girildi. Bu durumda kullan›c›n›n gönderilece¤i link

oluyor. Sayfa sonuna ekli parametrenin ne ifle yarad›¤›n› birazdan

Do¤ru giriflte sayfam›z kullan›c›m›z› gizli sayfaya yönlendiriyor ve selaml›yor. 96• CHIP Workshop > >

>>

Web Programc›l›¤›

Bundan sonra sayfam›z›n geri kalan›nda diledi¤iniz yerde kullan›c› ad›n› flu flekilde ça¤›r›p kullanabilirsiniz.
<script>document.write(isim)</script>

Nas›l kullanaca¤›m?
fiifre script’ini kullanmak anlamaya çal›flmaktan çok daha kolay. Bunun için afla¤›daki ifllemleri yapman›z yeterli. ❶ Bir flifre belirleyin ve gizli olacak sayfan›z›n ad› olarak bu flifreyi kullan›n. Örne¤in flifremiz “hokusPokus” ise gizli sayfam›z›n ad› “hokusPokus.html” olmal›. ❷ Kripto arac›n›z› (kripto.html) aç›n ve belirledi¤iniz flifrenizi sol tarafa yaz›p Kriptola>> tufluna bas›n. ❸ Kripto arac›n›zdaki sa¤ tarafta görünecek de¤eri seçip kopyalay›n ve bu de¤eri flifre soracak sayfan›zdaki script’te (login.html) , en üstte sifre isimli de¤iflkenin de¤eri olarak girin.
var sifre="%meENrmeEN";

Yanl›fl giriflte sayfam›z kullan›c›y› uyar›yor ve tekrar denemesi için login sayfas›na gönderiyor

görece¤iz. E¤er kullan›c› taraf›ndan girilen de¤er yanl›fl ise red.html isimli sayfaya gönderiliyor.

Gizli sayfa
Script’imizin esas ifllevi flifre kontrolü. Kullan›c› kim olursa olsun do¤ru flifreyi girdi¤i sürece gizli olan sayfaya ulaflacakt›r. Kullan›c›dan girmesini istedi¤imiz ad›n› script’imizde ilginç bir ifllevde kullan›yoruz. Gizli sayfan›n url adresinin sonuna parametre olarak eklenen kullan›c› ad› gizli sayfam›zdaki minik script taraf›ndan alg›lanmakta. hokusPokus.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Gizli</title> <meta http-equiv="Content-Type" content="text/html; charset=windows-1254"> <meta http-equiv="Content-Type" content="text/html; charset= ISO-8859-9"> <SCRIPT LANGUAGE = "JavaScript"> <!-if (location.search) { var isim = location.search.substring(1) } //--> </SCRIPT> </head> <body bgcolor="White"> Merhaba <script>document.write(isim)</script>, <br><br> Gizli sayfaya hoflgeldin. </body> </html> p p

Art›k flifreli sayfan›z› test edebilirsiniz. Not: fiifrenizin ayn› script’i kullanan baflkalar›n›nkinden farkl› olarak kriptolanmas›n› isterseniz dizi1 ve/veya anahtar dizilerindeki karakterlerin s›ras›n› diledi¤inizce de¤ifltirin. Dikkat etmeniz gereken tek fley hem kripto.html sayfan›zdaki hem de login.html sayfan›zdaki dizilerin ayn› olmas› gerekti¤i.

Sonuç
Sadece sayfam›zdaki arayüze bakarak flifrelemenin sunucu tarafl› yerine kullan›c› tarafl› oldu¤unu tahmin etmek kolay de¤il. fiifreyi girdikten sonra kabul ya da ret sayfas›na yönlendirme iflleminin çok seri olmas› belki tecrübeli bir kullan›c›y› flüphelendirebilir. Bunun için dilenirse bir zamanlay›c› kullanabilirsiniz. fiifreyi merak eden bir kullan›c› sayfan›n koduna bakacak olursa görece¤i tek fley “%meENrmeEN” kripto de¤eri olacak. Bu da do¤ru flifrenin ne oldu¤unu anlamak için yeterli de¤il elbette. Buna ilaveten sayfada yer alan JavaScript kodu flifreyi dekode eden fonksiyonu de¤il enkode fonksiyonu içermekte. E¤er JavaScript kodlar›n›z› bir de harici .js uzant›l› dosya olarak sayfan›za eklerseniz sayfa koduna bak›nca çok daha az fley ulafl›labilir olacakt›r. K›sacas› flifrenizin ne oldu¤unu ancak tecrübeli ve ayn› zamanda merakl› bir programc› çözebilir. Yine de çok hayati bilgileri korumak için istemci-tarafl› yöntemin %100 güvenli olmad›¤›n› hat›rlatal›m. Bu script sadece sunucu tarafl› uygulama imkanlar›n›n olmad›¤› yerlerde oldukça basit ve pratik bir çözüm sunmakta. Kodlar›n›z ille de sayfan›z›n kaynak kodunda olmayabilir. Mesela JavaScript kodlar›n› harici bir dosyaya eklemek ya da merakl›lar için okunamaz hale getirmek mümkünse de bu hiç bir zaman deneyimli kullan›c›lar›n bu bilgilere ulaflamayaca¤›n›n garantisini vermez.

Flash ile flifreli koruma
Sahip oldu¤u multimedya özellikleri sayesinde zengin internet içerikleri oluflturmakta faydalan›lan Flash temelde istemci tarafl› bir uygulama olmas›na ra¤men, sunucu tarafl› uygulamalarla da dayan›flma içinde kullan›labilir. Mesela Flash içinde görünen içerikler veritaban› ya da harici tekst dosyas› kökenli olabilece¤i gibi, Flash formu içine girilen bilgiler sunucudaki ColdFusion, PHP ya da JSP uygulamalar›na gönderilebilir. Bu ayn› zamanda klasik sunucu-tarafl› flifre kontrolü mekanizmas›n›n Flash ve herhangi bir sunucu aplikasyonu kombinasyonu ile de yap›laca¤› anlam›na gelir. Biz bir önceki konumuza istinaden Flash’in bu özelli¤inden çok yine sunucu tarafl› uygulama deste¤i

Bu minik scriptimiz parametre olarak gelen kullan›c› ad›n› sayfan›n en bafl›nda okuyarak isim ad›ndaki de¤iflkene de¤er olarak at›yor.
var isim = location.search.substring(1)

< CHIP Workshop • 97 <

Web Programc›l›¤›

<<

olmayan alanlarda sadece sayfan›za ekleyece¤iniz bir Flash ile flifre kontrolü yap›p yapamayaca¤›m›z› incelece¤iz. Flash programlamada kullan›lan ve JavaScript’e oldukça benzeyen ActionScript sayesinde etkileflimli Flash uygulamalar› gelifltirmek mümkündür. ActionScript’in sahip oldu¤u temel programc›l›k ifllevleri sayesinde Flash içinde flifre kontrolünü gerçeklefltirmek olas›d›r. Zira Flash uygulamalar› .fla uzant›l› kaynak dosyalar›n derlenerek .swf uzant›l› filmlere dönüfltürülmesiyle elde edilirler. Derlenmifl Flash filmi içindeki ActionScript kodlar› sadece belli baz› yaz›l›mlar yard›m›yla tekrar okunabilir, bunun d›fl›nda normal kullan›c›lar için kodlara yazaca¤›n›z flifreniz ulafl›lamaz durumdad›r. Laf› fazla uzatmadan uygulamam›z› nas›l yapaca¤›m›za geçelim. Flash’ta bofl bir sayfa aç›n ve diledi¤iniz görsellikte iki adet girdi alan›

on (release) { if(sifre == "kamikaze"){ if(isim != ""){ fscommand("kullaniciAdiBelirle",isim);

ve bir adet butondan oluflan basit bir login form arayüzü oluflturun. Bunun için: Kullan›c› ad› için metin arac›yla çizece¤iniz metin alan›n›n properties panelinden (Text type) metin özelli¤ini Input Text, (line type) sat›r özelli¤ini ise Single Line olarak seçin. Bu durumda metin alan›n›z kul}

fscommand("sayfayaGit", } } else { getURL("red.html"); }

"gizli.html");

Bu durumda flifreniz “kamikaze” iken flifre korumal› sayfan›z›n ad› gizli.html ve hatal› flifre girildi¤inde gönderilecek sayfan›z›n ad› ise red.html. Action panelindeki bu kodlar› diledi¤iniz de¤erlerle de¤ifltirebilirsiniz. Art›k Flash dosyan›z› Publish ile yay›mlayabilirsiniz [Shift+F12]. S›ra yay›mlanan swf dosyas›n› kullanacak login sayfas›n› oluflturmaya geldi. Login sayfas› için afla¤›daki kodlar› kullanabilirsiniz

lan›c›n›n içine yazabilece¤i bir form girdi alan›na dönüflecektir. Var de¤iflken ismi olarak ise isim de¤erini girin. fiifre için metin arac›yla çizece¤iniz metin alan›n›n properties panelinden (Text type) metin özelli¤ini Input Text, (line type) sat›r özelli¤ini ise Password olarak seçin. Bu durumda metin alan›n›z kullan›c›n›n içine yazabilece¤i bir form flifre alan›na dönüflecektir. Var de¤iflken ismi olarak ise sifre de¤erini girin. Alanlar›n›z›n alt›na buton amaçl› bir flekil çizin ya da yaz› oluflturun. fiekliniz seçili halde iken [F8] (Insert / Convert to Symbol) ile buton haline getirin. Butonunuz seçili iken Action panelindeki alana flu kodlar› girin

98 • CHIP Workshop > >

>>
login.html
<HTML> <HEAD> windows-1254"> charset=ISO-8859-9"> <TITLE>password</TITLE> </HEAD>

Web Programc›l›¤›

<meta http-equiv="Content-Type" content="text/html; charset= p <meta http-equiv="Content-Type" content="text/html; p

<BODY bgcolor="#FFFFFF"> <SCRIPT language="JavaScript"> var kullaniciAdi=""; function Film_DoFSCommand(komut, param) { if (komut=="kullaniciAdiBelirle") { kullaniciAdi=param; } if (komut=="sayfayaGit") { location.href=param + "?" + kullaniciAdi; } } </SCRIPT> <SCRIPT language="VBScript"> on error resume next Sub Film_FSCommand(ByVal command, ByVal args) call Film_DoFSCommand(command, args) end sub </SCRIPT> <OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/ shockwave/cabs/flash/swflash.cab#version=6,0,0,0" ID="Film" WIDTH="220" HEIGHT="150" ALIGN=""> <PARAM NAME=movie VALUE="password.swf"> <PARAM NAME=quality VALUE=high> <PARAM NAME=bgcolor VALUE=#FFFFFF> if(sifre == "kamikaze"){ <EMBED src="password.swf" quality=high bgcolor=#FFFFFF WIDTH="220" HEIGHT="150" ALIGN="" NAME="Film" swLiveConnect="true" TYPE="application/x-shockwave-flash" </EMBED> </OBJECT> <br><br> fiifre: kamikaze </BODY> </HTML> p } PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"> ... } else { getURL("red.html"); p gizli.html?Ufuk } } } if (komut=="sayfayaGit") { location.href=param + "?" + kullaniciAdi;

fonksiyon blo¤u, flifre bilgileri girilip dü¤meye bas›ld›¤› anda tetikleniyor. ‹lk bölümdeki kodlar kullan›c› ad› alan›na girilen de¤eri kullaniciAdi isimli JavaScript de¤iflkenine atamakta. ‹kinci bölümdeki kodlar ise e¤er girilen flifre do¤ru ise gizli sayfan›n ismini Flash’tan okuyarak okuyucuyu bu sayfaya yönlendirmekte. Gidilecek sayfan›n url adresinin sonuna aynen daha önceki uygulamam›zda yapt›¤›m›z üzere kullan›c› ad› parametre olarak eklemekte. Bu durumda e¤er kullan›c› diyelim ki isim olarak “Ufuk”, flifre olarak da “kamikaze” de¤erini girdiyse ziyaretçimizin gönderilece¤i url adresi

fleklinde olacakt›r. fiifre korumal› ve ret sayfalar›m›z›n içerikleri ve ifllevleri bir önceki uygulamam›zdakiyle ayn›. Geçerli olmayan bir flifre girildi¤inde kullan›c›y› ret sayfas›na yönlendiren ifllev bizzat Flash filminin içindeki ActionScript’te yer almakta

Numan Pekgöz numanpekgoz@chip.com.tr

» eCHIP StudioWeb+’da bu ay:
FLASH VE JAVASCRIPT’LE fi‹FREL‹ SAYFALAR

Art›k flifre korumal› sayfan›z› test edebilirsiniz. Sayfam›zdaki scriptimizde yer alan
function Film_DoFSCommand(komut, param) { if (komut=="kullaniciAdiBelirle") { kullaniciAdi=param;

Bu bölümde örnek olarak verilen uygulamalar›n birer kopyas›n› dergimizin CD’sindeki StudioWeb+ bölümünde bulabilirsiniz.

99 • CHIP Workshop > >

Windows 2000

<<

Windows 2000 Server’larda güvenlik
Sistemlerinizde sizden habersiz birilerinin dolaflmas›n› ister miydiniz? Bu soruya muhtemelen kimse olumlu cevap vermeyecektir.
eknoloji ile iç içe oldu¤umuz bu günlerde internetin önemini anlatmama san›r›m gerek yok. fiirketler, teknolojinin ilerlemesine paralel olarak hem bilgisayar teknolojisini daha fazla kullanmaya hem de bir anlamda daha çok risk almaya bafllamaktad›rlar. Risk kelimesi beraberinde “Güvenlik“ unsurunu da ak›llar›m›za getirmektedir. Günümüzde art›k yapt›¤›m›z ço¤u ifllemleri bilgisayarlar üzerinde yap›yoruz. Muhasebe kay›tlar›n›n tutulmas›, özel yaz›l›mlar›n çal›flmas›, e-postalar›m›z, web sayfalar›m›z gibi daha birçok örnek verebiliriz. Tüm bu bilgileri korumak, ifl ak›fl süreçlerini h›zland›rmak ve elimizdeki kaynaklar› en efektif flekilde kullanmak, bizim gibi IT sektöründekilerin bir nevi görevidir. Her birimiz gerçek anlamda bilgiyi iflleyen kiflileriz ve onlar›n da sorumlusuyuz. San›r›m hiç kimse bu türden çok önemli bilgilerin bir flekilde kaybolmas›n› ya da sorumsuz kiflilerin eline geçmesini istemez.

T

‹nternet teknolojisinin gittikçe daha fazla kullan›lmaya baflland›¤› günümüzde, art›k bilgilerin de¤eri bir kaç kat daha artt›rm›flt›r. Buna paralel olarak da güvenlik tedbirlerinin art›r›lmas› gerekiyor. ‹flletmeler, ifl ak›fl süreçlerini h›zland›rmak ve bilgiye her an her yerden eriflebilmek için en etkili yol olan interneti art›k daha fazla tercih etmektedirler. Bilgilerini müflterileri ile paylaflmak, daha çok kitleye eriflmek gibi nedenler, bu kullan›m› nerede ise biraz da zorunlu hale getirmektedir. ‹flte bu ay, elimizdeki mevcut imkanlar› kullanarak, internete ba¤l› Windows 2000 Server’lar›m›z› nas›l daha güvenli hale getirece¤imizden bahsetmeye çal›flaca¤›z. Bu türdeki yaz›lar› okumaktan s›k›lm›fl olabilirsiniz. Belki de her yaz› ilginizi çekiyor ve dikkatlice okuyorsunuz. Bu kadar popüler ve gündem-

de olmas›na ra¤men hala gerekti¤i kadar özen gösterilmedi¤inden ve üzerinde ciddi flekilde durmad›¤›m›zdan olsa gerek, güvenlik konusu hiçbir zaman gündemden düflmemifltir. Uzun süredir içinde bulundu¤um IT sektöründeki en önemli deneyimlerimden biri, bilgilerin bir flekilde kaybolmas› ya da istenmeyen kiflilerin eline geçmesi olmufltur. Maalesef kurulumunu yapt›¤›m›z sunucularda gözümüzden kaçan küçük noktalar yüzünden ya da sistemi varsay›lan kurulumda b›rakmaktan ve daha baflka birçok sebepten dolay› bilgilerimizi kaybetmekteyiz. Bu noktada hemen benim güvenlik konusuna yaklafl›m derecemi söylemeden geçemeyece¤im. Belki sizlere abart›l› gelebilir ama biraz olsun güvende olmak istiyorsak “Paranoyak” olmak zorunday›z. Tamam› ile güvenlikten bahsetmiyorum. Çünkü bu çok zor ya da imkans›z. Yaz›lan binlerce kod içinde mutlaka gözümüzden kaçan noktalar olacakt›r. Belki bu çok az olabilir ama dedi¤im gibi, yine bir flekilde atlad›¤›m›z çok küçük de olsa bir eksik ya da aç›k olacakt›r. ‹yi ve güvenli olarak tan›mlad›¤›n›z sistemlerin ço¤u bir flekilde afl›labilir. Birgün a¤›n›z›n taranaca¤›ndan flüpheniz olmas›n. Bunun için çok büyük bir iflletme ya da çok hit alan bir web sitesi olman›za gerek yok. ‹nternete ba¤l› olman›z sald›r›lara aç›k olman›z demektir. Ço¤u yaz›larda güvenlik politikalar›ndan, pahal› firewall’lardan ve daha akl›n›za gelebilecek bir sürü güvenlik önlemlerinden bir flekilde bahsedilmifltir. Tabii ki bunlar çok önemli bilgiler, kesinlikle dikkate al›nmas› ve her birinin üzerinde titizlikle durulmas› gereken konular. Ancak biz bu yaz›m›zda daha reel bir flekilde bu konunun üzerinde durarak, mevcut altyap›m›za küçük ve az masrafl› cihazlar, yaz›l›mlar ya da componentler ekleyerek bulundu¤umuz a¤› koruma alt›na almaya çal›flaca¤›z. Ço¤u iflletmede güvenlik konusu Bilgi ‹fllem yöneticilerinin insiyatifine b›rak›lm›flt›r. Gerek maliyetlerin azalt›lmas› amac›yla gerekse baflka flirket politikalar›ndan kaynaklanan sebeplerden dolay› bu kadar hayati önem tafl›yan bir konuda maalesef gerekli hassasiyet gösterilmemektedir. Güvenlik konusu, üzerinde uzmanlaflm›fl, yeterli tecrübe ve bilgiye sahip kifliler taraf›ndan yap›lmal›d›r. Yapaca¤›m›z ifllere bafllamadan önce bu ifllemleri uygulayaca¤›n›z sunucunuzu her-

hangi bir port tarama program› ile öncelikle taraman›z› öneriyorum. Bir de yaz›n›n sonunda tüm ifllemleri yapt›ktan sonra tekrar port taramas› yapman›z› öneriyorum. Yapt¤›m›z iflin asl›nda ne kadar önemli oldu¤unu o zaman daha iyi anlayaca¤›n›z› düflünüyorum. Size sald›rmaya çal›flan kifliler de ilk ifl olarak sizin yapt›klar›n›z› yapacakt›r. Sizin sunucunuzdan daha aç›k ve kolay sunucular karfl›lar›na ç›karsa, unutmay›n ki önceli¤i onlara vereceklerdir. Tüm bu ifllemler sadece kendimizi daha çok güvene almak için. Tamam› ile güvenlik sa¤lamak için de¤il. Unutmay›n … fiimdi biraz da olaya bize as›l gerekli olan teknik aç›dan yaklaflal›m. Windows 2000 Server’lar› güvenli hale getirmek için yapaca¤›m›z ifllemleri bafl›l›klar halinde s›ralamaya çal›flal›m. • Fiziksel güvenlik • Servislerin düzenlenmesi • Service Pack’lerin önemi • Audit ve Policy yap›land›rmas› • TCP/IP Filtering

Fiziksel güvenlik
Server’lar bir iflletmenin bilgi ifllemedeki en önemli ve olmazsa olmaz yap› tafllar›ndand›r. Onlar› fiziksel olarak da güvenli bir ortamda bulundurmak gerekir. Belirli bir s›cakl›kta olan, toz oran› minimuma indirilmifl ve kilitli bir odan›n seçimi, sunucumuzun çal›flmas›n› hem güvenlik hem de performans aç›s›ndan etkileyecektir. Yine bu kilitli odaya bir kamera tak›lmas› ve devaml› izlenmesi, video fleklinde de kay›t tutulmas› da uygun olacakt›r.

Servislerin düzenlenmesi
Sisteminizi güvenli ve gerçekten performansl› çal›flt›rmak istiyorsan›z yapman›z gereken en önemli ifllemlerden biri gerekli ve gereksiz servisleri birbirinden ay›rmak olacakt›r. Bu da sunucunuzu hangi amaçla kullanaca¤›n›za ba¤l› olarak de¤ifliklikler göstermektedir. Biz sunucumuzu internet amaçl› kullanaca¤›m›01 • CHIP Workshop > >

>>

Windows 2000

z› göze alarak gerekli servisleri çal›flt›r›p gereksiz olanlar› ise kald›raca¤›z. ‹nternete ba¤l› Windows 2000 Server’da çal›flmas› gereken servislerin listesini afla¤›da bulabilirsiniz. Bu konuya geçmeden önce, internete ba¤layaca¤›m›z sunucunun a¤da nerede bulunmas› gerekti¤inden de bahsedelim. Bu tip sunucular sald›r›ya do¤rudan aç›k cihazlard›r. ‹nternet üzerinden gelecek ve gidecek tüm sorgulara cevap verecek olan server’lar da yine bunlard›r. O yüzden bu ifllem için dedicated bir server ay›rman›z en do¤ru seçim olacakt›r. Yani bu sunucu üzerinde baflka bir uygulaman›n çal›flmamas›, herhangi bir flirket bilgisi ya da özel bilginin bulunmamas› gerekmektedir. Kötü niyetli bir kiflinin sunucuya girmesi durumunda bu tip hayati önem tafl›yan bilgilerin baflka bir yerde tutulmas›n›n önemi karfl›m›za ç›kmaktad›r. Baz› servisler sistemlere göre de¤ifliklikler gösterebilmektedir. Burada “disable” etti¤imiz servisler, normal flartlarda sadece internet paylafl›m hizmeti vermek için tasarlanm›fl dedicated cihazlar için öngörülen servis durumlar›d›r. Bu durumu göz önüne alarak size de önce servislerinizin durumunu inceledikten sonra durdurman›z› tavsiye ediyorum. Baz› durumlarda bizim burda gereksiz gördü¤ümüz servis, sizin için çal›flmas› gereken bir servis olabilir. E¤er bu gibi servisleri durdurursan›z ilgili uygulamalar›n›z çal›flmayabilir.

IPSec Security
Bu özellik bir grup için kullan›ld›¤›nda daha çok önemlidir. Domain ortamlar›nda olan ya da birden çok server içeren sistemlerde daha çok kullan›lmaktad›r. IPSec özelliklerinde ipsec’i devreye ald›ktan sonra “Local Security Setting”e girip kendi policy kurallar›n›z› oluflturman›z gerekmektedir. Üç sütunlu bu tablolar, IPSEC filter lists, IPSec filter action ve IPSec policy rules’ dur. IPSec kural›n› uygulad›¤›n›z sisteminize gelen ve giden trafi¤in filtrelendirilmesi s›ras›nda uygulanacak politikalar› (policy rules), hangi paketlerin filtrelenece¤ini (filter lists) ve son olarak da bu kurala uygulanacak olan ifllemi (filter action) içermektedir. Bu ifllemleri tamamlad›ktan sonra “Local Machine”de “IP Security Policies”i kullanmaya va yap›land›rmaya bafllayabilirsiniz. Oluflturdu¤unuz kural› “enable” etmeyi unutmay›n. Sonuç olarak burada anlatmaya çal›flt›¤›-

n›zdan ç›karmay›n. Siz güncellemelerinizi yapt›¤›n›z sürece, sistemlerinizdeki problemleriniz de o kadar az olacakt›r.

Audit ve Policy yap›land›rmas›
Bu k›s›m tamam› ile bu server üzerindeki logon, logoff, kullan›c› haklar›, güvenlik seçenekleri gibi bileflenleri yap›land›rmak içindir ve yukar›dakiler kadar önemlidir. Start – Programs – Administrative Tools – Local Security Policy’yi t›klayarak Policy ayarlar›n› aç›yoruz (fiekil 2). Burada varsay›lan ayarlar› görüyor olacaks›n›z. Sizlere afla¤›da gördü¤ünüz yap›land›rmay› öneriyorum. Siz bu de¤erlere kendi sisteminizdeki yap›y› göz önüne alarak daha de¤iflik de¤erler verebilirsiniz. Teker teker tüm de¤erleri bir liste halinde vermenin bir anlam› yok. Önemli olan mant›¤› anlatabilmek. Bu anlatmaya çal›flt›¤›m yap›land›rmadan muhtemelen hepimiz birfleyler anlad›k. Local Security Policy sekmesinde bulunan di¤er tüm birimlerdeki (Audit Policy, User Rights Assignment vs.) de¤erleri ayarlamak size kalm›fl. Kendi incelemelerinizi yap›p, a¤›n›z için en uygun de¤erleri vermek de siz sistem yöneticilerine kalm›fl.

Service Pack’lerin önemi
En az yukar›daki özellikler kadar önemli olanlar konulardan biri de yeni ç›kan service pack’leri düzenli olarak sunucumuza uygulamak. Asl›nda bunun için birçok yöntem mevcut. Bu güncellemeleri sadece internete ba¤l› sunucunuzda de¤il, a¤›n›zdaki tüm sunucularda yapmal›s›n›z. Farkl› uygulama metodlar› ile, örne¤in group policy, (service pack’leri birden çok sunucuya uygulamak için) sunuculara bu yeni yamalar› yükleyebilirsiniz. Konumuz bu olmad›¤› için, biz do¤ruca Microsoft’un konu ile ilgili sitesine (http://windowsupdate.microsoft.com) giderek yeni ç›kan service pack’leri ve yamalar› server üzerinde güncelliyoruz. (fiekil 1) Tabii ki kullanmad›¤›n›z servisleri güncellemenize gerek yok. Bunlar› taramadan sonraki ekrandan iptal edebilirsiniz. Yamalarla ilgili bir örnek vermek gerekirse, güncellefltirmesi yap›lmam›fl IIS’ler yüzünden Nimda virusu dünya üzerinde çok h›zl› bir flekilde yay›lm›fl ve birçok kiflinin de bafl›n› a¤r›tm›flt›. Demek ki asl›nda bu güncellemelere gerekti¤i kadar özen göstermiyor ve bazen atl›yoruz. Bir sistem yöneticisinin en önemli görevlerinden birinin bu oldu¤unu sak›n akl›< CHIP Workshop • 02 <

TCP/IP Filtering
Bu konuyu isminden de anlafl›laca¤› üzere IP paketlerini filtrelemek olarak k›saca aç›klayabiliriz. Asl›nda dikkate al›nmas› gereken oldukça ciddi bir konudur paket filtreleme; firewall mant›klar›nda kullan›lan bir sistemdir. IP Filtering sayesinde hangi paket bu a¤a geçsin, hangisi geçmesin; flu paket flu a¤a ya da flu istemciye gitsin ya da gitmesin türünde ifllemler yapabilir. Windows 2000’de iki çeflit filtreleme bulunuyor. Birincisi TCP/IP filtrelemesi, ikincisi de IPSec. TCP/IP tek bilgisayar için kullan›l›rken, IPSec “Group Policy” olarak tan›mlanabiliyor. TCP/IP filtrelemeden bahsedecek olursak, sistemizdeki gerekli ya da gereksiz port’lar›n kullan›ma aç›lmas›n› ya da kapat›lmas› için kullan›l›yor. Varsay›lan olarak bu özellik kapal› durumda geliyor. Siz yap›land›rmak istiyorsan›z Start – Settings – Network and Dial-Up Connections – Local Area Connection – Properties – Internet Protocol (TCP/IP) – Properties – Advanced – Options – TCP/IP Filtering k›sm›na gelerek (fiekil 3) bu özelli¤i etkinlefltirebiliyor ve gerekli port’lar› aç›p gereksiz port’lar› da kapatabiliyorsunuz. m›z ifllemler daha önce de söyledi¤imiz gibi server’›m›z› ve sistemimizi daha güvenli hale getirmek için uygulanacak kurallar dizisidir. Güvenlik konusu kesinlikle uzmanl›k alan› isteyen bir konudur. Sektör itibari ile her fleyi cok iyi bilmemiz ve uzman› olmam›z tabii ki söz konusu de¤il. Olmaya çal›flmak da zaten takdir edersiniz ki, yanl›fl bir yaklafl›m olacakt›r. Siz hem güvenlikte, hem uygulamada, hem yaz›l›mda hem de donan›m gibi ögelerin hepsinde birden iyi olmaya çal›fl›rsan›z, asl›nda hiçbirinde iyi de¤ilsiniz demektir. Anlatt›klar›m›z belki de bazen uygulama alan›nda yetersiz kalacakt›r. Bu yüzden konuyla ilgili daha fazla araflt›rma yapman›z› öneriyorum. San›r›m hiçbir yönetici özenle kurdu¤u bir sistemin birkaç dakikada çökmesini ve tüm bilgilerinin kaybolmas›n› istemez. En güvenilir dedi¤iniz sistemler bile, unutmay›n ki iyi bir çal›flma ile kullan›lamaz hale getirilebilir. Daha fazla güvende olman›z dileklerimle …
FAT‹H GÖKÇEN

Java Serisi

<<

JAVA ile Programlama Bölüm 3
Geçen dersimizde Java Programlama diline genel bir girifl yaparak bu dilin önemli özelliklerini ve bu dil ile program yazabilmek için gerekli olan ilk ayarlar›n nas›l yap›laca¤›n› görmüfltük.
ekrar merhaba. Bundan önceki dersimizde Java programlama dilinde de¤iflkenlerin nas›l kullan›ld›klar›n›, operatörleri ve vazgeçilmez kayna¤›n›z olan Java Dokümantasyonu'nu nas›l kullanaca¤›m›z ö¤renmifltik. Bu say›m›zda ifli biraz daha ileri götürecek ve program ak›fl›n› kendi iste¤imiz do¤rultusunda yönlendirebilece¤imiz deyimleri ve döngüleri ö¤renece¤iz. Yeni bir dil ö¤renmenin en zor yan›, dilin temel kurallar›n› ö¤renme aflamas›n›n oldukça yo¤un ve s›k›c› geçmesidir. Bunun nedeni de ö¤renme aflamas›nda s›n›rl› bilgiyle henüz ele avuca s›¤ar uygulamalar gelifltiremiyor olmam›zd›r. Sizlerin de flu aflamada ayn› s›k›nt›y› çekti¤inizi tahmin ederek, motivasyonunuzu art›rmak amac›yla Java içerisinde yer alan demolar› göstermek istiyorum. Az sonra nas›l çal›flt›rabilece¤inizi anlataca¤›m bu uygulamalar› inceleyerek, ileride varaca¤›n›z noktay› görme flans›na sahip olacaks›n›z:

T

sat›rlar› belli durumlarda okumadan, ya da baz› sat›rlar› birden fazla defa okuyacak flekilde yönlendirmemiz mümkün hale gelir. Ancak bu deyim ve döngülerin daha iyi anlafl›lmas› aç›s›ndan, öncelikle faaliyet alan› kavram›na de¤inmekte yarar var.

Faaliyet Alan› Nedir Ne ‹fle Yarar?
Faaliyet alan›, yazd›¤›m›z program içerisinde belirli bölgeleri temsil eden ve nesnelerin etkin oldu¤u s›n›rlar› belirleyen alanlard›r. Bir nesnenin etkin oldu¤u bölgeye, o nesnenin “faaliyet alan›” denilmektedir. Faaliyet alan› kod içerisinde { ve } ile belirlenmektedir. Bu iki parantez aras›nda mevcut bir faaliyet alan› vard›r. Bir de¤iflken e¤er { ve } aras›nda tan›mlanm›flsa bu de¤iflken bu iki parantez d›fl›nda kullan›lamaz. Buna göre de¤iflkenin faaliyet alan› da bu iki parantez içerisinde ya da yarat›ld›¤› alan içerisinde s›n›rl›d›r.
/**** Main.java ****/ import javax.swing.*; class Main { public static void main(String[] args) { int k = 10; { int c = 20; JOptionPane.showMessageDialog(null, "k nin degeri: "+k+ "\nc nin degeri: "+c); } System.exit(0); p

Java içerindeki SwingSet2.jar uygulamas›
java -jar SwingSet2.jar

Bu uygulamay› diledi¤iniz gibi kar›flt›rabilir, hatta j2sdk dizini içerisindeki demo dizini ve alt›ndaki di¤er tüm uygulamalar› da inceleyebilirsiniz.

Java'da Deyim ve Döngüler: Okumaktan S›k›lanlar ‹çin
Demolar sdk ana dizini içerisinde bulunan “demo” isimli dizinde bulunuyor. Sdk ana dizininiz sizin Java'y› ilk yükledi¤iniz yerdir ve ismi de muhtemelen j2sdk.1.3.1 ya da j2dk1.4.2 fleklinde olacakt›r. Benim Linux sistemimde ana dizinin tam yolu /opt/j2sdk_nb/j2sdk1.4.2/ fleklinde. Buradaki demo isimli dizinin içinde de, jfc ve onunda için de SwingSet2.jar ad›ndaki uygulamay› önce jfc dizini içerisine girerek flu flekilde çal›flt›rabilirsiniz: Program yazarken, yazd›¤›m›z kodlar›n yukar›dan afla¤›ya do¤ru s›ras›yla çal›flt›r›ld›¤›n› biliyoruz. Ancak bazen bu kodlar›n bu s›rada de¤il de belirli flartlara ba¤l› olarak birkaç sat›r›n atlan›p ileriden devam edilmesi ya da ayn› sat›rlar›n birden fazla say›da çal›flt›r›lmas› gibi isteklerimiz olabilir. ‹flte bunun için kullanaca¤›m›z baz› deyimler ve döngüler vard›r. Bu deyim ve döngüler sayesinde normalde her sat›rdan bir defa geçen ve yukar›dan bafllayarak afla¤› sat›rlara do¤ru ilerleyen program ak›fl›n›, baz›

09 • CHIP Workshop > >

>>
} } /*******************/

Java Serisi

Bu örnekte iki tane faaliyet alan› görmekteyiz. Birinci faaliyet alan› s›n›f›m›z›n kendisidir ve s›n›f ad› Main yaz›ld›ktan hemen sonra { ile aç›lm›fl ve tüm sat›rlardan sonra da } ile kapat›lm›flt›r. Bu faaliyet alan›n›n içinde de k de¤iflkeni tan›mland›ktan sonra yine { ile baflka bir faaliyet alan› aç›lm›fl ve bu yeni faaliyet alan›nda da sadece c de¤iflkeni yarat›lm›flt›r. Ancak dikkat ederseniz bu örnekte, s›n›f›n faaliyet alan›, içeride aç›lan faaliyet alan›n› kapsamaktad›r. Bu yüzden k de¤iflkeni tan›mlanmam›fl oldu¤u içerideki faaliyet alan› içerisinde de kullan›labilir. Ancak tersi mümkün de¤ildir. Yani c de¤iflkenini k'nin tan›ml› oldu¤u faaliyet alan›nda kullanmaya kalksayd›k hata mesaj› alacakt›k.
/**** Main2.java ****/

da anlatt›¤›m›z, “boolean türü ve boolean operatörleri” konusunu hat›rlay›n›z!). Ayn› flekilde bu flart›n sa¤lanmamas› ise ifadenin false de¤erini üretmesi anlam›na gelir. Yukar›daki örnekte not > 50 ifadesi e¤er false olursa ekrana hiç bir mesaj gelmeyecektir. Ancak true olursa “Tebrikler. Bu dersten geçtiniz” mesaj›n› al›rs›n›z. Burada girdi¤iniz notun asl›nda bir String türünde oldu¤unu ve bu de¤erin Integer s›n›f›n›n parseInt metoduyla sonradan integer türüne dönüfltürlüp kullan›ld›¤›na dikkat ediniz (Bundan önceki say›da yer alan “Tür Dönüflümlerine ‹liflkin Özel Metodlar” konusunu hat›rlay›n›z.) Peki ya e¤er kullan›c› notu 50'den küçük olsa da bir mesaj almak istiyorsa ne yapacak? ‹flte bu durumda,
..... if(ifade) { .... }

if deyiminin çal›flma prensibi
import javax.swing.*; else {

if Deyimi:
class Main2 { public static void main(String[] args) { int k = 10; { int c = 20; } JOptionPane.showMessageDialog(null, p "k nin degeri: "+k+ "\nc nin degeri: "+c); /*c degiskeni bu faaliyet alan›nda tan›ml› p degildir*/ System.exit(0); } } notStr = JOptionPane.showInputDialog p //bu program çal›flmayacakt›r /*******************/ (null, "Notunuzu giriniz: "); not = Integer.parseInt(notStr); if(not > 50) { JOptionPane.showMessageDialog(null, p "Tebrikler. Bu dersten gectiniz :)"); } System.exit(0); } } /********************/ /**** Deyimler1.java****/ import javax.swing.*; class Deyimler1 { public static void main(String[] args) {

.... }

if deyimi belli bir flart sa¤lanmas› durumunda program ak›fl›n› kendi faaliyet alan› içerisine yönlendirir. Kendi faaliyet alan›n›n en son sat›r›na kadar kodlar› çal›flt›r›r ve daha sonra da program ak›fl› if deyiminin faaliyet alan›n›n bitti¤i yerden devam eder.

kal›b›n› kullanmak gerekecektir. Bu kal›ba göre program ak›fl›, e¤er if içerisindeki ifade true ise if deyiminin, de¤ilse else deyiminin faaliyet alan› içerisine yönlenecektir. Az önceki örne¤i genellefltirelim:
/**** Deyimler2.java ****/ import javax.swing.*; class Deyimler2 {

String notStr; int not;

public static void main(String[] args) { String gectiMesaji = “Tebrikler! Bu p dersten gectiniz!”; String kaldiMesaji = “Malesef bu dersten kaldiniz.”; String notStr; int not; notStr = JOptionPane.showInputDialog p (null, "Notunuzu giriniz: "); not = Integer.parseInt(notStr); if(not > 50) { JOptionPane.showMessageDialog(null, gectiMesaji); } else { JOptionPane.showMessageDialog(null, p p p

Faaliyet alan›na iliflkin unutulmamas› gereken bir fley daha var: Ayn› faaliyet alan› içerisinde, ayn› isimli birden fazla de¤iflken tan›mlanamaz. Bu örnekte k’n›n faaliyet alan›, c’nin faaliyet alan›n› da kapsad›¤›ndan, c’nin tan›mland›¤› yerde k ad›nda baflka bir de¤iflken daha tan›mlayamazs›n›z. Çünkü baflka faaliyet alan› olsa da, içerideki faaliyet alan›nda yukar›da tan›mlanan k de¤iflkeni hala geçerlidir. Buna dikkat edin. Faaliyet alan›na iliflkin bu bilgilerle art›k deyim ve döngüleri inceleyebiliriz.
< CHIP Workshop • 10 <

Daha teknik söylemek gerekirse, flart›n sa¤lanmas› demek, asl›nda if deyiminin kontrol parantezleri içerisindeki ifadenin true olmas› demektir (bundan önceki say›-

Java Serisi

<<

kaldiMesaji); } System.exit(0); } } /***********************/ } }

JOptionPane.showMessageDialog(null, "Dereceniz: D");

p

else { JOptionPane.showMessageDialog(null, kaldiMesaji); p

faaliyet alan› içerisindeyken, while içersindeki ifadeyi de¤ifltirecek bir komut yazmazsan›z, ilk durumda bu ifade hep true oldu¤u için ve döngü içinde de hiç de¤iflmedi¤i için sonsuz bir döngüye girersiniz.
while(ifade) { satir 1 satir 2 ... satir n /*flSimdi akisfl tekrar while(ifade) satirina yönlenecek ve kontrol yap›lacakt›r. e¤er ifade false olmussa program ak›fl› satir n+1 den devam etmektedir.*/ } satir n+1

Aktif olarak projelerde çal›flt›¤›n›z zaman kullan›c› isteklerinin bitmedi¤ini göreceksiniz. Diyelim ki bu sefer de kullan›c› programa girdi¤i nota göre bir harf ile derecesini ö¤renmek istiyor olsun. Bu durumda girilen not belli aral›klara göre belli dereceler alacakt›r ve bu dereceler 2 taneden fazla olabilir. O zaman da if else kal›b› ifle yaramayacakt›r. Bu durumlarda if, else if, else if, .... , else kal›b›n› kullanmak gerekir. Örne¤i inceleyiniz:
/**** Deyimler3.java****/ import javax.swing.*; class Deyimler3 { public static void main(String[] args) { String kaldiMesaji = "Dereceniz F: Bu p dersten kaldiniz."; String yanlisNot = "Yanlis not girisi! p Tekrar deneyiniz."; String notStr; int not; notStr = JOptionPane.showInputDialog p (null, "Notunuzu giriniz: "); not = Integer.parseInt(notStr); if(not > 100 || not < 0) { JOptionPane.showMessageDialog(null, yanlisNot ); } p

System.exit(0); } } /*******************/

while Döngüsü:
Kullan›c› istekleri hala bitmiyor. fiimdi de kullan›c›m›z bizden program çal›flt›¤›nda sürekli notu sormas›n› ve buna karfl›l›k düflen dereceyi bize vermesini istiyor. Ne zaman ki girifl “Q” karakteri olur, o zaman program sonlans›n diyor. Bu durumda not girifli bir döngü içerisine sokulmal›d›r. Bu döngünün en bafl›nda önce giriflin Q olup olmad›¤›na bak›lmal› sonra ya döngü tekrar dönmeli ya da sonland›r›lmal›d›r. Bunun için en uygun döngü while döngüsü olacakt›r. While, e¤er içerisindeki ifade true ise program ak›fl›n› kendi içine yönlendirir. Program while faaliyet alan›n›n en sonuna geldi¤inde tekrar while döngüsünün ilk sat›r›na döner ve ifadeyi yine kontrol eder. Bu ifllem, while içerisindeki ifade false olana kadar devam eder. Not: Bu tür döngülerde, e¤er döngünün

Bu durumda kullan›c›m›z›n yeni iste¤ine göre örne¤i tekrar düzenleyelim:
/**** Deyimler4.java ****/ import javax.swing.*; class Deyimler4 { public static void main(String[] args) { String yanlisNot = "Yanlis not girisi! p Tekrar deneyiniz."; String giris = "Bir not giriniz (0 - 100)\n p Çikis için notu -1 giriniz"; String notStr; int not; notStr = JOptionPane.showInputDialog p (null, giris); not = Integer.parseInt(notStr); while(not != -1) { if (not > 100) {

else if(not <= 100 && not > 86) { JOptionPane.showMessageDialog(null, "Dereceniz: A"); } else if(not <= 85 && not > 71) { JOptionPane.showMessageDialog(null, "Dereceniz: B"); } else if(not <= 70 && not > 66 ) { JOptionPane.showMessageDialog(null, "Dereceniz: C"); } else if(not <= 65 && not > 50) { p } p } p }

JOptionPane.showMessageDialog(null, p yanlisNot); else if (not <= 100 && not > 86) { JOptionPane.showMessageDialog p (null, "Not: " + not + " Derece: A"); else if (not <= 85 && not > 71) { JOptionPane.showMessageDialog p (null, "Not: " + not + " Derece: B"); else if (not <= 70 && not > 66) { JOptionPane.showMessageDialog p

while döngüsünün ak›fl› flemas›

(null, "Not: " +

11• CHIP Workshop > >

>>
} (null, "Not: " + } else {

Java Serisi

not + " Derece: C"); if(x_flag) { JOptionPane.showMessageDialog p (null, "Hoscakalin"); } not + " Derece: D"); else { JOptionPane.showMessageDialog p (null, "Merhaba "+k_adi); } not + " Derece: F"); } notStr = JOptionPane.showInputDialog p (null, giris ); not = Integer.parseInt(notStr); } JOptionPane.showMessageDialog(null, "Program Sonlandi."); System.exit(0); } } /**********************/ p } /*************************/ } System.exit(0); JOptionPane.showMessageDialog p (null, "Not: " + JOptionPane.showMessageDialog p else if (not <= 65 && not > 50) {

rar say›s› da belirlemek istiyorsak o zaman for döngüsünü kullanmak gerekir. For döngüsü flöyle çal›flmaktad›r:
for( <ilk deger> ; <kosul> ; <ifade> ) { ... }

Buna göre ilk de¤er ile bafllayan döngü ile program for blo¤una girdikten sonra blo¤un sonuna geldi¤inde koflulun sa¤lan›p sa¤lanmad›¤›n› kontrol edecek ve koflul sa¤lan›yorsa ifadeyi gerçekleyip tekrar döngüye girecektir. Örne¤in:
/****ForDongusu.java****/

break Anahtar Sözcü¤ü:
Bazen bir döngü içerisindeyken, asl›nda döngünün bitmesine neden olacak flart sa¤lanmad›¤› halde özel olarak döngüyü sonland›rmak istedi¤imiz durumlar do¤acakt›r. Bu durumlar›n sa¤lanmas› neticesinde program break komutunu gördü¤ü yerde içerisinde bulundu¤u ilk döngüyü (çünkü iç içe döngüler de olabilir) sonland›racak ve döngüden sonraki sat›rdan itibaren çal›flmaya bafllayacakt›r.
/**** Sifre.java ****/ import javax.swing.*; public class Sifre { public static void main(String arg[]) { String kontrol_isim = "elvantasbas"; String k_adi = JOptionPane.showInput p Dialog(null, "Lutfen kullanici adini giriniz:"); boolean x_flag = false; while(!k_adi.equals(kontrol_isim)) { if(k_adi.equals("x")) { JOptionPane.showMessageDialog p (null,"Islem sonland?r?l?yor.."); x_flag = true; break; } k_adi = JOptionPane.showInputDialog p (null, "Girdiginiz isim yanlis. Tekrar giriniz:"); }

Programda while parantezi içerisinde yaz›l› olan while(!k_adi.equals(kontrol_isim) komutuna göre e¤er k_adi kontrol_isim'e eflit olursa k_adi.equals(kontrol_isim) metodu true de¤erini üretecektir. Ancak bu metodun bafl›nda yaz›l› olan ! operatörü bu de¤erin de¤ilini alacak ve false de¤eri üretecektir. Demek ki kullan›c› ad› do¤ru girilmedi¤i sürece bu while parantezi içerisinde true de¤eri olacak, do¤ru girildi¤i zaman ise false de¤eri olacak ve dolay›s› ile while blo¤una girilmeyecektir. Bu örnekte kullan›c›, kullan›c› ad›n› yanl›fl girdi¤i ama x girmedi¤i sürece while döngüsü bloklar›nda kullan›c›dan tekrar isim girmesi istenecektir. ‹sim yanl›fl girildi¤inde ve x girildi¤inde program while içerisindeki if blo¤una girecek ve burada ifllem sonland›r›l›yor mesaj› ile döngüden break sayesinde ç›kacakt›r. Döngüden ç›kmadan hemen önce x_flag de¤iflkeninin de¤eri de true yap›acakt›r. Bu de¤iflken döngüden x ile ç›k›l›p ç›k›lmad›¤› bilgisini tutmak için kullan›lan bir ara de¤iflkendir. Döngüden ç›k›ld›ktan sonra e¤er x de¤iflkeninin de¤eri true ise while bloklar› bitimindeki if bloklar›na girilecek ve ekrana hoflçakal›n mesaj› yaz›lacakt›r. E¤er döngüden x yaz›ld›¤› için de¤il de kullan›c› ad› do¤ru girildi¤i için ç›k›lm›fl ise x de¤iflkenin de¤eri false kald›d¤› için if blo¤una girilmeyecek onun yerine else blo¤una girilecektir. Buradaki mesaj ekrana geldikten sonra else blo¤undan da ç›k›lacak ve System.exit(0) metodu çal›flt›r›larak program sonland›r›lacakt›r.

public class ForDongusu { public static void main(String arg[]){ for(int i = 0; i < 10; i++) { System.out.println("i nin degeri: "+i); } } } /*********************/

Bu program çal›flt›¤›nda ekrana 10 sat›r boyunca
i nin degeri: 0 i nin degeri: 1 ... i nin degeri: 9

yazacakt›r. Program ak›fl› her döngüye giriflinde i’nin de¤eri ekrana yaz›lmakta ve blok sonunda i++ ifadesinden dolay› bu de¤er bir art›r›lmakta ve koflulun sa¤lan›p sa¤lanmad›¤›na bak›lmaktad›r.

switch Deyimi:
switch deyimi kullan›m› da, birden fazla else if kullan›m›na alternatiftir. Mesela yazd›¤›n›z programda kullan›c›dan bir girifl isteyebilirsiziniz. Kullan›c›n›n girece¤i bu de¤er 4 tane de¤erden bir tanesi olabilir ve siz olas› her de¤er için bir ifllem yapmak istiyor olabilirsiniz. Bunun için
if(deger 1) { } else if(deger 2) { }

for Döngüleri:
fiu ana kadar bir koflul sa¤land›¤› sürece otomatik olarak döngüye girilmesini while deyimi ile yapabilece¤imizi gördük. Ancak bu döngü koflul sa¤land›¤› sürece, belli bir tekrar say›s› kadar de¤il, her zaman devam ediyordu. Koflul sa¤lansa bile belirli bir tek-

< CHIP Workshop • 12 <

Java Serisi

<<

public class Menu { ... public static void main(String arg[]){ else { boolean secim_flag = true; } while(secim_flag) { if(i % 3 == 0) { continue; String secim = JOptionPane.showInput p Dialog(null, "Bir sayi giriniz: (1, 2, 3, 4)"); int sayi = Integer.parseInt(secim); secim_flag = false; switch( <degisken> ) { case deger1: ifade ya da islemler; break; case deger2: ifade ya da islemler; break; switch(sayi) { case 1: JOptionPane.showMessageDialog p (null, "Sectiginiz sayi: bir"); break; case 2: JOptionPane.showMessageDialog p (null, "Sectiginiz sayi: iki"); break; ... ... case deger n: ifade ya da islemler; break; default: ifade ya da ifllemler; break; } case 3: JOptionPane.showMessageDialog p (null, "Sectiginiz sayi: uc"); break; case 4: JOptionPane.showMessageDialog p (null, "Sectiginiz sayi: dort"); break; default: secim_flag = true; JOptionPane.showMessageDialog p (null, "Beklenenden farkli bir sayi girdiniz"); break; } } System.exit(0); } } /*********************/ } } JOptionPane.showMessageDialog(null, p "Toplam: " + toplam); System.exit(0); } } toplam += i; public class Toplama { public static void main(String arg[]){ int toplam = 0; for(int i = 0; i < 10; i++) {

yap›s›n› kullanabilirsiniz. Ancak böyle durumlarda switch daha iyi bir alternatif olacakt›r. switch deyimi de flöyle çal›flmaktad›r:

Bu örnekte % operatörünü kulland›k. Bu operatör soldaki say›n›n sa¤daki say›ya bölümünden kalan de¤eri üretir. Yani i say›s› o anda hangi de¤ere sahipse, bu de¤erin 3'e bölümünden kalan say›n›n 0'a eflit olup olmad›¤› kontrol edilmektedir. E¤er bu kalan say› 0'a eflit ise demek ki say›m›z ^ya da 'ün bir kat›d›r. Bu yüzden if parantezi içerisindeki == kontrolü sa¤land›¤›ndan dolay› true de¤eri üretilecek ve dolay›s› ile if blo¤u içerisine girilecektir. If blo¤u içerisinde continue anahtar sözcü¤ü sayesinde o andaki for ad›m› sonlanacak ve bir sonraki i de¤eri ile for blo¤unun en bafl›na dönülecektir.

Bu yap›ya göre program ak›fl›, degisken içindeki de¤ere göre case anahtar sözcü¤ü ile belirlenmifl uygun sat›ra atlar. O sat›rdaki ifade ya da ifllemler gerçeklefltirildikten sonra switch deyiminden ç›k›l›r. Afla¤›daki örnek program›m›zda kullan›c›ya bir menü sunal›m ve bu menüden bir seçene¤i seçmesini isteyelim. Bu seçim neticesinde de seçime uygun bir mesaj›n ekrana gelmesini sa¤layal›m. Örne¤imizde ilk baflta yarat›lan secim_flag ad›ndaki boolean de¤iflken ilk de¤er olarak true oldu¤u için, program ak›fl›n›n ilk seferde while döngüsüne girece¤ini garanti etmifl oluyoruz. E¤er kullan›c› listede olmayan bir seçim girecek olursa, secim_flag de¤iflkeni tekrar true de¤erini alacak ve kullan›c›dan tekrar bir girifl yapmas› istenecektir. Kullan›c› listede olan bir girifl yaparsa program sonlanacakt›r. Bu durumda listede olmayan girifller girildi¤i sürece program çal›flmaya devam edecektir.
/****Menu.java****/ import javax.swing.*;

Diziler
Bu ana kadar programla içerisinde kullanaca¤›m›z de¤iflkenler oldu¤unu ve bu de¤iflkenlerin de belirli türelere sahip olduklar›n› görmüfltük. Ancak biliyoruz ki her de¤iflken sadece bir de¤er tutmaktad›r. ‹çerisinde de¤er tutan bu de¤iflkenler de bellekte farkl› yerlerde saklanmaktad›r. Dizi denilen de¤iflkenler ise içlerinde birden fazla de¤er tutarlar ve di¤er de¤iflkenler gibi belirli bir türe sahiplerdir. Ayr›ca bu de¤erler de bellekte ard›fl›k biçimde saklan›rlar ve hepsi ayn› türe iliflkin olmak zorundad›r. Buna göre bir diziyi asl›nda arka arkaya s›ralanm›fl bir de¤iflken paketi olarak düflünebiliriz. Ancak flunu unutmamal›y›z: Dizilerin içlerinde tutacaklar› eleman say›s› sahiptir. Baz› elemanlara siz de¤er vermeseniz bile bu elemanlar için bellekte yer ayr›l›r. Ayr›ca dizinin içerisinde saklanan de¤erlerin türü ile dizinin türü ayn› olmak zorundad›r.

continue Anahtar Sözcü¤ü
Herhangi bir döngü içerisine girildi¤inde, daha döngü blo¤unun sonuna gelinmeden o andaki ad›m için ifllemleri sonland›r›p bir sonraki döngü ad›m›na hemen geçilmek isteniyorsa, continue anahtar sözcü¤ünü kullanmak gerekir. Mesela yazd›¤›m›z programda 1'den 10'a kadar olan say›lar toplamak istiyoruz ama bu toplam içerisine 3 ve ün katlar›n› eklemek istemiyoruz. Bunun için bir for döngüsü kullanmak gerekir. Ancak bu döngüyü 3 ve 3'ün katlar›na gelindi¤inde durdurup bir sonraki de¤erle döngüye devam etmek gerekmektedir:
/**** Toplama.java ****/

Dizilerin Yarat›lmas›:
Normalde de¤iflkenleri yarat›rken de¤iflkenin türünü ve sonra da ad›n› yaz›yorduk.
13 • CHIP Workshop > >

>>
int [] sayilar;

Java Serisi

(int b; ya da double a; gibi) Dizilerin yarat›lmas› ise biraz daha farkl›d›r. Bir dizinin yarat›lmas› iki ad›mdan oluflur. Birinci ad›m “bildirim” dedi¤imiz ve dizinin türünü ve dizi de¤iflkeninin ad›n› belirledi¤imiz ad›md›r:

2 3 public class Kayit { 4 public static void main(String arg[]){ 5 6 String kayit_str = JOptionPane.showInput p Dialog(null, "Kac tane kayit gireceksiniz:"); 7 String cikisMesaji = "Hernagi bir anda p cikmak icin " 8 int kayit = Integer.parseInt(kayit_str); 9 10 String isimler[] = new String[kayit]; 11 for(int i = 0; i < isimler.length; i++) { 12 13 14 15 16 else isimler[i] = giris; 17 18 } 19 20 String mesaj = "isim Listesi\n********"; 21 22 for(int i = 0; i < isimler.length; i++) { 23 24 25 } 26 27 JOptionPane.showMessageDialog(null, p mesaj); 28 System.exit(0); 29 } 30 } if(isimler[i] != null) mesaj += "\n"+i+" --> "+isimler[i]; int sayi = i+1; String giris = JOptionPane.showInput p if(giris.equals(“X”)) break;

Burada “sayilar” adinda ve içerisinde integer de¤erler tutacak olan bir dizi bildirimi yapm›fl olduk. Ancak bu dizi bildiriminin de¤iflken bildiriminden fark›n›n [ ] karakterlerinin eklenmesi fleklinde oldu¤una dikkat ediniz. ‹kinci ad›m ise tahsisat denilen ve dizi de¤iflkenin kaç tane de¤er tutaca¤›n› belirledi¤imiz ad›md›r:
sayilar = new int[10];

Dialog(null, sayi + ". kaydi giriniz:");

Bu örnekte, daha önce bildirimini yapt›¤›m›z sayilar dizisine 10 tane integer say› tutabilecek kadar alan› tahsis etmifl olduk. Bu ifllem asl›nda new anahtar sözcü¤ü sayesinde yap›lm›fl oldu. Ancak, bu ad›mdan sonra dizi de¤iflkenimiz belirlenmifl ve de¤erleri saklayabilece¤i alan tahsis edilmifl olsa bile, dizimizin içerisinde hala hiç bir de¤er saklanmamaktad›r. Dizilerin içerisinde elemanlara eriflmek ve yeni elemanlar eklemek için indeks numaras› denilen bir kavram kullan›lmaktad›r. ‹ndeks operatörü [ ] ile gösterilir ve dizinin ad›n›n yan›na eklenerek kullan›l›r. Bir dizinin ilk eleman›n indeks numaras› 0 d›r. Buna göre dizimize de¤er atamak için:
sayilar[9] = 12; sayilar[0] = 3;

bofl bir String ya da 0 de¤ildir. Kendi bafl›na anlaml›d›r. Bu döngü bittikten sonra yeni bir for döngüsü ile de diziden her kay›t tek tek okunmakta (22. sat›r) ve “mesaj” ad›ndaki String de¤iflkeni içerisine at›lmaktad›r (24. sat›r). Daha sonra bu mesaj isimli de¤iflken ekrana yaz›lacakt›r (27. sat›r). E¤er kullan›c› diziye ayr›lan yer kadar kay›t girmeyip arada X ile ç›k›fl yapm›flsa, bu durumda diziye girilmemifl olan elemanlar yerine null de¤eri olacakt›r. Bu de¤erler varsa mesaj içerisine eklenmemektedir. Bu yüzden o andaki ad›mda, diziden gelen de¤erin null olup olmad›¤› kontrol edilmekte, de¤er null de¤ilse mesaj de¤iflkenine eklenmektedir (23. sat›r). Dizilere iliflkin temel bilgileri ö¤renmeyi burada sonland›r›yoruz. Siz de kendi yeteneklerinizi s›namak için di¤er dersimize kadar tüm ö¤rendiklerinizi kullanarak afla¤›daki uygulamay› yapmaya çal›fl›n›z. Bu uygulaman›n cevab›n› di¤er dersimiz içerisinde bulabileceksiniz : UYGULAMA: Kendi bafl›n›za içerisinde isimler saklayan bir dizi yarat›n›z ve daha sonra bu dizide kullan›c›dan ald›¤›n›z bir ismi arat›n›z. E¤er isim dizinin içerisinde bulunursa bu ismin indeks numaras›n› ekrana yazd›r›n›z. Bulunamazsa ismin bulunamad›¤›na dair bir mesaj yazd›r›n›z.

Bundan Sonra Ne Ö¤renece¤iz?
Bu ana kadar ö¤rendi¤imiz programc›l›¤›n temel yap› tafllar›n› kullanarak art›k bilgilerimizi daha da ileri götürebilece¤iz. Di¤er dersimizde programlaman›n en önemli yap›lar› olan metotlar› ve s›n›flar› ayr›nt›l› bir flekilde ö¤renecek ve böylece harika uygulamalar gelifltirebilmek için gereken teknik altyap›n›n çok büyük bir k›sm›n› tamamlam›fl olaca¤›z. Bunun devam›nda da art›k gerçek uygulamalar gelifltirebilecek ve asl›nda imkans›z gibi görülen birçok fleyi Java ile bir ç›rp›da nas›l yapt›¤›n›za hayret edeceksiniz. Di¤er dersimize kadar önceki derslerim tamam›n› iyice sindirmenizi, tüm örnekleri tek tek yaz›p çal›flt›rman›z› ve tam olarak anlayana kadar üzerinde çal›flman›z› ›srarla tavsiye ediyorum. Görüfl, öneri, elefltiri ve sorular›n›z için elektronik postalar›n›z› bekliyorum: ermanaykac@chip.com.tr Sevgi ve Sayg›lar›mla,
Erman Aykaç ‹stanbul Bilgi Üniversitesi Bilgisayar Bilimleri Bölümü

fleklinde [ ] ve bir indeks numaras› kullan›larak atama yap›labilir. NOT: Burada dikkat edilmesi gereken fley, dizimizin uzunlu¤undan daha fazla eleman atamas› yapmamakt›r. Bu örne¤imize göre sayilar dizisinin son eleman›na sayilar[9] ile eriflebiliriz. Sayilar[10] = 23; hatal› bir atama olacakt›r çünkü 10 nolu indekste 11. eleman olur. Ancak dizimiz sadece 10 eleman tutacak alan tahsis edilmiflti! fiimdi kullan›c›dan gelecek olan isimleri bir dizide saklayan bir program yazal›m:
/**** Kayit.java ****/ 1 import javax.swing.*;

Bu programda, önce kullan›c›n›n kaç kay›t girece¤i sorulmaktad›r. Çünkü dizilerin uzunlu¤u sabittir ve önceden bir defa yer ayr›ld›¤›ndan bu uzunluk bilinmelidir. Uzunlu¤u de¤iflen dizileri için baflka algoritmik çözümler vard›r, ancak de¤iflmeyen her bir dizinin uzunlu¤u sabittir ve sonradan uzat›l›p k›salt›lamaz. Bu örnekte kullan›c›n›n girece¤i kay›t kadar yer tahsisat› yap›ld›ktan sonra for döngüsü ile her ad›mda girilecek olan kay›t istenmekte ve diziye at›lmaktad›r. E¤er kullan›c› baflta belirledi¤i kadar kay›t girmekten vazgeçip o anda ifllemi sonland›rmak isterse isim yerine X girifli yapabilecektir. Programda her girifl yap›ld›ktan sonra bu de¤erin X olup olmad›¤›na bak›lmaktad›r (14. sat›r). E¤er girifl X olursa döngü break ile sonland›r›l›r (15. sat›r). De¤ilse, girifl diziye yaz›l›r ve döngü devam eder (16. sat›r). NOT: String türünde diziler için tahsis edilen yerlerin içine bir fley doldurulmaz ise, bu yerler otomatik olarak null denilen özel bir de¤erle doldurulur. null de¤eri , “ ” gibi

< CHIP Workshop • 14 <

Sign up to vote on this title
UsefulNot useful