Download as pdf
Download as pdf
You are on page 1of 1500
PALME ZiRVEDEKi BEYINLER 55 Nihat DEMIRLi Yiiksel INAN Visual C# Net 2008 © PALME YAYINCILIK Ankara, 2010 PALME YAYINLARI: 546 Visual C# Net 2008 Nihat DEMiRLi MCP- MCSE- MCDBA- MCSD for NI ademirli@hotml.com |. Yiiksel INAN MCP- MCP+INT- MCSA- MCSE- MCDBA- MCSD for .NET- MCAD- MCT yyuksel@yukselinan.com — yuksel@zirvedekibeyinler.com Palme Yayincihk © 2010 ‘Yayin Koordinatérii: H. [brahim SOMYUREK Teknik Editér: Sibel YANAR INAN (MCP- MCSE), yanar_s@hotmail.com Yayina Hazirlama: PALME Dizgi, Tasarim ve Grafik Birimi Baski: Sézkesen Matbaast ISBN: 978-605-5829-42-1 Bilgisayar Eitim Merkezlerimiz: PRESTIJ BILGISAYAR EGITIM MERKEZLERL Adres : Halitaga Cad. Kivang Sok. No: 1/5 Kadikéy/ ISTANBUL Tel: (0216) 330 06 50 (pbx) Fax: (0216) 330 06 51 Adres : Gazi Universitesi Muhendislik-Mimarhk Fakilltesi Maltepe/ ANKARA Tel: (0312) 231 5459 ‘Adres : Ziya Gokalp Cad. Adakale Sok. 27/7 KIZILAY Tel: (0312) 430 40 16-17 e-mail; prestige @prestigetuk.com prestige @zirvedekibeyinler.com web: www.prestigeturk.com www prestigeturk.net www zirvedekibeyinler:com kitapta yer alan yaz, gekil ve fotogralar 5846 sayih yasanin hGkimlerine gre kismen ya da tamamen basilamaz, dotayl dahi olsa kullanlamaz,teksir, fotokopl ya da baska bir teknikle goGaltlamaz. Her hakkt saklidir, PALME YAVINCILIGA ait. © pauMe ‘YAYIN, DAGITIM, PAZARLAMA, igve Dig TICARET LTD. Sti. ‘Merkez: A. Adnan Saygun Cad. No: 10/A Sthhiye-ANKARA ‘Tel: 0312-433 3757 + Fax: 0.312-433 5272 Se eens) : /wwew palmeyayinevi.com ae tS, Ne aR Toro 7 i Fac STOOD Mocypbors susenin traps Svsoper Stk New->Project” menii seceneklerini takip ederek asagudaki ekrana ulasin, Bu ekran sayesinde projeyi gelistireceginiz bilgisayar dilini segebilirsiniz. ‘Visual C# Net 2008” stiriimit igerisinde bir cok degiisik segenek kullanarak uygulama gelistirebilirsiniz. Bunlar arasinda Console uygulamasindan tutunda Web uygulamasina kadar her cesit projeyi desteklemektedir. Hatta yeni yeni cok popiiler olmaya baslaya Mobile uygulamalar bile gok ustaca kullanlabilmektedir. Dofrusunu isterseniz belirtmekte yarar gériiyorum, C# ile yazacainiz, kodlarin nesnel tabanli olmasi dolayistyla hangi uygulamayt segerseniz segin benzer oldugunu géreceksiniz. Yani bir veri tabant bagilanti kodunun “Windows Application” ile “Web Application” (veya Console Application) arasinda pek fark etmedigini goreceksiniz. Project types: Templates: ‘Business Inteligence Projects || Visual Studio installed templates Visual C# ‘Wine wires Favins Abplicatian Web [3] WPF Application Smart Device PB console Appication Office [iI windows Service Database jet] WPF User Control Library Reporting $515_SciptComponent My Templates Fae Sarees ESsearch online Templates. wer Workflow Other Languages ‘Other Project Types Test Projects Eel [A project for creating en application wih a Windows Forms user interface GNET Fr Name: ‘OmelZ008 Location: —-_[c:[Users\AdminstratorIDesltop|{COrneller Sdlution Name: [Omneko0e z Ro Yukandaki form sayesinde olusturacaginiz projenin ismi ile kaydedilecegi yeti belirleyebilirsiniz. Ik olarak “Project Types” listesinde yer alan “Visual C#” dili ile “Windows” segenegini segin. “Templates” listesinden “Windows Forms Application” uygulamasi gelistireceginizi bilgisayara bildirmeyi unutmayin. Simdi formun alt kasminda yer alan segenekleri inceleyelim. Daha Once Visual C# uygulamasi gelistiren programe: arkadaslar bu béliimii gecebeilirler. “Name” kutusu projenizi daha sonra hatirlayacagimiz_-veya caligttracaginiz ismini barmdwacakur. “Location” kutusu ise ismini belitlediginiz projenizin saklanacagi klasoriin yerinin yazilacaga yer olacakur. Belirtelim “Browse” diigmesi ile kendinize ait bir Klasérii gosterebilirsiniz. Belirtilen degerleri girdikten sonra “OK” diigmesine uklayarak ilk uygulamanizi baslatabilirsiniz. Burada belirtmekte _yarar _—gériiyorum. Visual Studio uygulamalarmda framework farkliklari gergekten nemli sorunlar yaratabilmektedir. Bu amacla kullanacaginiz siiriimii sa%_ taraftan segmeniz 6nem arz edebilmektedir. Biz tiim 6mekleri son siiriim olan “Net Framework 3.5” ile gelistirecegiz. Beene [net Framework 3s sy : 213 e Projenizde ilk olarak “Forml.cs[Design]” yapragi olusur. Bu formunuzun tasanm amdir ve “ToolBox” penceresinden kontrolleri stirikleyerek formun iizerine birakabilirsiniz. Bu sayede bir ok uygulamada tasarim ekranlant igin kod yazmaniza gerek kalmayacakur. AP BindingNavigator 227 BindingSource’ patton IBS checked istBox |) ColorDialoa "EH Combobox. ‘ContextMenustrip Datacridview, “ToolBox” penceresinden siirikleyerek formunuzun_ tizerine yerlestirecefiniz kontrollerin iizerine Mouse ile gift tklarsaniz sizi kod yazabileceginiz (En Cok Kullamian) asagidaki ekrana génderecektir. 6 Degerli arkadaslar, formunuz iizerindeki tasarim gérlintiintiziin siiriilde birak teknigi ile olusturulmasmin herhangi bir sakincasinin olmamasint belirtmekle beraber, bu islemi gerceklestirdiginiz tim durumlarda, “C#” dili sizin yerinize arka plan kodlarm otomatik olarak olusturmaktadir. Yani asil olarak o kodlar énem arz edecektir. Tasarimda yapacagimz her degisiklik (mesela kontroliin koordinatlarin degistirmek vs.) otomatik olarak kodlarada_yansiyacakur. Otomatik olarak olusturulan bu kodlari nasil gérebiliriz derseniz “Solution Explorer” penceresini biraz kurcalarsamz “Forml.Designer.cs” segenegini ¢ift uklamanz yeterli olacakur (Birazdan daha detayli olarak incelenecektir).Amacumiz hentiz baslangig asamasindakafanvzin karigmamasi igin sadece sizleri bilgilendirmek amacmm giittiifti igin simdilik sadece bu bilgiyi bilin ilerleyen béltimlerde bu husus daha detayh olarak islenecektir. public partial class Form + ( Form public Form () ‘ InitializeComponent (} 7 » private void buttont_Click (object i //Taklenadaginda Bures: igier Pencere iizerinde Formunuza —_yerlestirmig —_oldugunuz Kontrollerden birinin ismini yazip “.” (nokta) tusuna basarsantz O Kontrole ait tim kullanabileceginiz komutlar (Prosediir-Fonksiyon- zellik vs.) karsinizda listelenecektir. Her ne kadar ilerleyen konulanmizda detaylandinlacak olursa olsun. Eklenen Kontrollerin (Extra islem yapmadiginiz stirece) sadece 0 form igerisinde kullanilabilecegini belirtmek isterim. —DeBisik segeneklerin kullanilabilecegi kistmlar sonradan islenecektir. jesonl® {Start Pa | | [5buttont che private void buttont_Click(object sender, © ( gheckBoxs.cHl y | conselect OF Copture 1 Cousestaidation # CausesValdetionChanged F ChangetsICues [contents Checked [Gets or set # CheckedChanged 7 F ceca eats # _CheckStateChanged Yukaridaki ekran iizerinde “{}” bloklan igerisine gerekli olan tim kodlan yazabilirsiniz. Ekran Pencereleri Kod yazma mantigimi tam olarak dgrendikten sonra ekran pencereleriylé ugrasmak sizlere sikici gelecektir, fakat o asamaya kadar simdi gisterecegimiz yardimci pencereleri_ cok sik kullanmantz gerekecektir (Dogrusunu isterseniz uzmanlastiginiz dénemlerde de sik sik bu pencerelkerden yardim alacaksimz ama bu islem artik otomatige baglanmis olacaktir.). imdi bu pencereleri gizden gecirelim. Properties Penceresi Formun iizerinde hethangi bir kontrol seemeniz durumunda aktiflesir. istediginiz dzellige istediginiz degeri atayabilirsiniz. (Mouse ile iizerine geldiginiz. zaman properties yazan diigmeye tiklaymn). Eger ekranda géziikmiiyor ise “View” Meniisiinden “Properties Window” segenegine tuklayiniz. Bu sayede gizlenmis (veya ekrandan daha fazla yararlanmak amach siz kapatmis olabilirsiniz) olan pencere karginiza gelecektir. rmi,ce*? Formi.cs [Design] | Start Page comboBox System Windows Fort ~ ete] 4 ihetiode Nocona IntegraHeight True Itembeight 13 { | Collection} {Gi Location 13:80 Items ‘The ems n the combo box. Kontrollere Ait Events’lara Erigmek Kod yazacagmiz Events’larada yine properties penceresinden ulasabilirsiniz. Fakat bu pencerede Events yazan Button’un tiklanmis olmast gerekir (izerinde simsee benzer bir resim vardir), Dikkat edin, kontroliin iizerine Mouse ile gift tklamak sizleri en gok tercih edilen yordama ulastiracaktr. Bu yordam sizlere uymuyorsa agaidaki sekilde istediginiz Events kullanilabilir. Herleyen dénemlerde sizlerde fark edeceksiniz. Bir ¢ok kod farklt yordamlarda olmalarina ragmen ayni islemi yapacaktr. Bu yiizden kodu en uygun olan yordama yazmak profesyonellik agismdan énemlidir. Yoksa uygulamanyz diizgtin sonuglar verse bile kullamlabilirlik agisindan sakimeal olacaktr. Unutmayin kodlarmzia agzimzla kug tutsanz bile ekran gériintiisii, printer crktist ve ekrammn kolay kullanimi kullantct igin nem arz edecektir. Yanhis yordama yazilan bir kod ile hata bir ekran tasarm,, Yazdiginiz giizel Kodlarn deger kaybetmesine sebep olacakutr. Hepsini bir biitiin olarak diisiinmelisiniz. | oa comboBox! ster. Windows. Fort» | = [PU [FS Regonchanged Resize RightToLeftChanged |Selectedindenchanged ‘Occurs when the value of the: ‘Selectedindes prone changes. Agilan bu formda hangi Events'a kod yazacaksimiz onun sagandaki kisma Mouse ile gift tiklamamiz gerekecektir. (Cortes foesigny* Start Page “Formt private void comboBoxl_SelectedIndexchanged (: ‘ y ToolBox Penceresi Formunuzun iizerine siiriikleyip burakabileceginiz kontroller bu pencerede bulunur. Belirtmekte yarar var, uygulamalarimz igin gerekli olan tim Kontroller bu palet izerinde yer almayabilir. Olmayan diger Kontrolleri pencereye eklemek igin, paletin tizerinde iken Mouse un sag tusuna uklayarak meniiniizii agurabilirsiniz. Bu mentide “Choose Items” segenegini kullanabilirsiniz. Eger ekranda géziikmilyorsa View meniisiinden ToolBox segenegine tiklayiniz. 10 ToolBox penceresinde istediginiz kontrolii Mouse ile siirtikleyerek formunuzun iizerine birakabilirsiniz. Form cs% Formi.cs [Design]* | Start Page Pointer GF BackgroundWorker £7 indngtavigator | 247 BindingSource: Button CheckBc Tier atton ‘Checkedlistt version 2,0.0,0 fron EE Combobox _ Raises an event wh Solution Explorer Penceresi Samyorum uygulamamiz igin en Onemli pencere bu olacaktr. Sebebi basittir projenizin kullandigi tiim dosyalar (Smmflar, Resim Dosyalan, Xml Dosyalan vs) ile kaynak kodlarin yer aldigi diger dosyalar bu pencereden kolayca takip edilebilir. “Project->Add New Item” veya “Project->Add Existing Item” meni segeneklerini kullanarak uygulamaniza bir cok kaynak dosya ekleyebil ‘iz. Bu dosya “Xml” uzantili olabilecegi gibi “mdb” uzantil bir veri tabam uyugulamasida olabilecektir. Bu sayede secilen tim bu dosyalar aktif exe uygulamasinin bulundugu klasére atilacaktir. Hepsini “Solution Explorer” penceresinden takip edebilirsiniz. Diger sekilde bilgisayarin igerisinden Mouse veya klavye ile (Add New Item veya Add Existing Item segenegi kullaniimadan) bu klasére aktarlan dosyalar “Solution Explorer” penceresinde yer almaziar. Solution Explorer penceresinde, iist kisimda alt(6) adet button bulunmaktadir.-EZer en soldaki button’a tklarsaniz properties penceresinin gésterilmesini, ikinci diigmeye uklarsanz uygulamanizdaki tiim dosyalan, tigiineit diigmeye tklarsamz pencerenin yenilenmesini, in dérdiincii diigmeye tuklarsaniz kod penceresine gegisi, besinci diigmeye tuklarsamz uygulamamzin tasarim gértintiistinii, altinci digmeyle ise “Class” diyagramuna erisimi salayabilirsiniz. ‘op Solution ‘Ornek2008' (1 project) E- Fl omek2008 =~ (Sal Properties |i References (By Formt.cs {3 Foxmt.Designer.cs Fort. resx B Progames Server Explorer Penceresi Uygulamanizdan elde _edec verileri herhangi bir veritabanina kaydetmek isterseniz (veya daha dnceden bir veri tabanina ayit islemi gergeklestirdiyseniz) bu pencereden faydalanabilirsiniz. Bajlanti kuracagimz veri tabant Access veya Sql Server olabilir. Uygulamanizdan bir veritabanina sihirbaz segenekleri_ ile baglandigimiz zaman C# o veri tabamm hafvzaya alarak bir dahaki baglanti asamasinda sizlere kolaylik saglayacaktir. Biz tavsiyemizi sdyleyelim, gerekmedigi stirece veri tabant baglanularmi kodla yapm Server Explorer penceresinin tist kisminda bulunan, ilk diigme pencerenin refresh’lenmesini saglarikinci diigmeyle —baglanty kapatabilir.Ugiincii_diigmeyle Local makinenizdeki bir veritabanina balanabilir.Dérdiincii buttonla ise Network’ tiniizde bulunan herhangi bir Sql Server’ a baglanti kurabilirsiniz. 2 Pott es Forml.cs [Design]* [ |B servers 3 van.comscootauw Se Crystal Reports Services Be 6] Event Logs By Management Classes &- [Y? Management Events Ba Ef Message Queues 3> (2 Performance Counters a Services Error List Penceresi Programinizi calisurdigimz anda olusan hatalani gésteren cok yararh bir penceredir. Burada olusan hatalar program tarafindan size izah edilir, sizde ona gore gerekli olan kodlart ekleyebilirsiniz ‘Yukaridaki agiklamaya dikkat ederseniz olusan ilk hatanin satir sonuna “;” konmamasindan kaynaklanmg oldugu programerya gésterilmistir. Dikkat edin uygulamanin ismi Safa ait isimle beraber, maynt zamanda satir numaras: ile siitun numarasi gésterilerek yazdirilmistir. Bahsi gegen pencerelerden herhangi bir tanesini ekran tizerinde gdremiyorsaniz, tamami View meniistinde bulunmaktadir, tizerine tuklayarak ekran goriintiiniize alabilirsiniz. 1B Kod Sayfasia Satur Numarasim Yazdirmak Olusan “hatalari sar numaralarim gérerek daha rahat takip edebilirsiniz. Bu amacla “Tools->Options” menti adimlarim takip ederek asagidaki pencerenin acilmasim sailayin. Ie Text Editor [ee] Statement competion | | bsGeneral MlAuto lst members, | File Extension Dtide advanced members | | Gr AlLanquages | FAearameter information | IpeBasic nic Selling i —— | Cenable vitual space i Tabs | DWord wrap Formatting poly Cut or Copy comands to blank ine Intellisense ie we cicHe | | ess ii HTML ie -PYSQL | Plain Text f SQL Serpe | T-5Qh Dikkat edin “General” sekmesine ait “Line Numbers” isaret kutusu doldurulmustur. Bu kutu doldurulduktan sonra ekranimiz asagidaki sekilde olusacaktir. Burada her satin basinda_ editrdeki_ sa numarast yazdirilmaktadir. En azindan belirli bir stire bu sekilde kullanilmast sizin yarariniza olabilir. Kod Editiriine Ait Ayarlar Arkadaslar bir programe igin bu ayarlarm gok énem arz etmedigini biliyorum ama en azindan géz. zevkiniz agisindan uygun olan punto, font veya renk ile galismanizm hakkinizin oldugunu diisiiniiyorum, 14 “Tools->Options” meni adimlarim takip ederek asagidaki Pencerenin agilmasini saflayin.”"Environment” afag yapisi altda yer alan “Fonts and Colors” segenegini segerek sag taraftaki elemanlarin gésterilmesini saglaym. Bir cok ayari bu pencereden kolayca degistirebilirsiniz, Mesela yazt tipi biiytiklugi, rengi veya agajadaki mekte oldugu gibi segili alan rengini, hepsi gok kolay. “Display Items” listesinde yer alan elemana gore istediginiz ayant verebilirsiniz. Biz Editériimiiz igin “Display Items” listesinden “Selected Text” Szelligini segerek “Item BackGround” zelligine karmizi_rengi atadik.Bu agamadan sonra kod editériinde Mouse ile blokladiginiz tim alanlar kirmizi olarak karsiniza gikacaktr. = Environment show settings for: General et Add-in/Macros Security EEN 7 ‘AutoRecover ont (bold type indicates fixed-width Fonts): Documents [Courier ne Find and Replace ~ ~ ‘Fonts and Colors. Display items: oe iB-Help {Plain Text Impot and Export Settings || fasmaine ssa inactive Slctd Text Indeator Marg Keyboard Lie Nunbers ‘Startup |Nisible White Space ie [Eocene Chin ‘Web Browser {Brace Matching 2 1 Projects and Sohtions laaicer @emcn me ® Source Control Breakpoint (Enabled) i Text Editor Breakpoint (Error) & Database Tek (Bralpant Bu sekilde diger ayarlanda kolayca degistirebilir, kod yazarken gbzliniizii yormayacak stiller olusturabilirsiniz. Kod Tamamlamak Yeni editdrlerin neredeyse tamam higbir kodu ezbere bilmenizi gerektirmemektedir. Yani yazmaya galsuiginiz kodlan otomatik olarak kendisi tamamlayabilmekte veya en yakin olan komutu karsimiza cikarabilmektedir. 15 private void buttoni_Click(object sender, Bventiras @) i Forna Yeni = new Forn2(); Yeni.BhowDialog() 7 a 1° SetBounds (0% SetDesktopBounds privat, -® SetDesktopLocation 2% show dexChanged (object sen @| ) SF Showtcon SF showintaskbar # shown FF ste SP size Yukaridaki émek kodlamada “.” Tusuna basildiktan sonra o komutun Kullanabilecegi tim secenckler editér tarafindan karsimiza cikariimaktadir. Ayn! sekilde kod yazarken herhangi bir anda “Ctrl4Space” tuslarna beraberce basiiusa aym yardim alma sansimz dogacaktir. Belirtmekte yarar gériiyorum, kodlarimiz: studyoya ait editérde deBilde Notepad icerisinde yazyorsamz ozaman cok daha dikkatli olmamz gerekecektir. Bu sekilde bir yardim almantz olanaksizdir. 16 BOLUM 2 VISUAL C# .NET 3.5 TEMELLERI Ornekleri Yapabilmeniz igin Gerekli olan Pratik Kodlar Asajidaki Grek uygulamalar kitap igerisindeki diger kodlann anlasilabilmesi ve uygulanabilmesi igin gereklidir. Bu amagla tamamint anlamaya galisirsamz. seviniriz, Kontrol igeri Kullanmak deki Veriyi Matematiksel islemlerde Bir cok uygulamanizda matematiksel degerler formunuzun iizerindeki kontrollerde yer alacaktr. Bu igeriklerin matematiksel uygulamalarda kullanilabilmesi igin déniistim islemi uygulamalisiniz. Asagida bu hususa deginilmektedir. private void button1_| k1 (object sender, EventArgs e) { Decimal Mat_Deger; string Veri_Icerik; Veri_Icerik = textBox1.Text;//Kontrol Igerigini Al Mat_Deger = Convert. ToDecimal(Veri_Icerik); label. Text ="Sonuc=" + Mat_Deger.ToString()://Yazdir Sayfaniza bir adet Button, TextBox ve Label kontrolii ekleyerek Yukaridaki kod bloguna galistirisaniz, sonug ekran gériintiisti asagidaki sekilde olusacaktr. Senuc=285.35 Dikkat edin TextBox igerisindeki deer Label _icerisine aktariimaktadur. 19 Kontrollere String Veri Aktarmak “C# Net” uygulamalarinda kontrol igerisine asagidaki sekilde veri aktarabilirsiniz. private void button2_Click(object sender, EventArgs e) { textBox1.Text = "Gazi Universitesi"; EventArgs e) String Deger; Deger = "Gazi Universitesi"; textBox1.Text = Deger; Kontrol igeriklerini Temizlemek ‘Asaiidaki kodlamay: kullanarak, kontroller igerisindeki gdrlinir veriyi temizleyebilirsiniz. private void button3_Click(object sender, EventArgs e) textBox1.Text = "";//Igerigi Sil 20 Kontrollere Tarihsel igerik Yazdirmak Asaiidaki sekilde tarihsel degere sahip degisken igerikleri kolayca okunabilir ve yazdirilabilir. private void button3_Click(object sender, EventArgs e) String Metin_Deger; Metin_Deger = "17/09/2008"; DateTime Tarih_Deger; Tarih_Deger = Convert. ToDateTime(Metin_Deger); label Text = Tarih_Deger.ToString(; Veya String Metin_Deger; Metin_Deger = "17/09/2008"; DateTime Tarih_Deger: Tarih_Deg DateTime.Parse(Metin_Deger); label Text ‘arih_Deger.ToString(); Diger Sayfay: Acmak Uygulamanizda yer alan diger sayfalari asagidaki gekilde kolayca acabilir ve kullanabilirsiniz. private void buttonl_Click(object sender, EventArgs e) Form? Yeni = new Form2(); Yeni Show();//Diger Formu Ag 21 private void buttonl_Click(object sender, EventArgs e) { Form2 Yeni = new Form20); Yeni ShowDialog();//Diger Formu Ag Bu yéntemde dikkat edeceginiz husus, acilan form kapatilmadigt siirece diger formlara erisim saglanamayacagidir. Baska bir deyisle sadece en tistteki formda iglem yapabilirsiniz. Diger formlar Mouse ile segilemezler. Alt Satirlardaki Kodlar1 Okutmamak Bazi kosullarn saglanmast durumunda, 0 satrdan sonra yer alan diger kodlarin okutulmasi istenmeyebilir. iste o zamanlar agagidaki gekilde bir kodlama kullanabilirsiniz, Burada bizi amacumiza ule komut “return” olacaktr. private void button6_Click(object sender, EventArgs e) int Deger; Deger = 250; if (Deger >= 100) { return;//Alt satirlari okuma t else { label .Text="1000";//Bu Kod Hig Bir Zaman Calismaz. Uygulamaya ikinci Bir Form Eklemek Windows Form uygulamalarmda gogunlukla birden fazla (hatta onlarea) sayfa kullanmak zorunda kalacaksiniz. Bu amagla projenize yeni 22 formlar ekleyerek kullanmak zorunda kalacaksinrz. Cok basit olmakla beraber “Project->Add Windows Form” adimlar izleyerek projenize yeni bir form ekleyebilirsiniz. Pee Cee) File Edt View Refactor [Project | Buld Debug Deta Tools 11 i: 8- ea a4 PO) Ra |i) Add User Contra iB], Add Component... General Gg) Add Cass. Shitakec ferleyen béliimlerde bir gok defa bu forma basvuru yapacagiz, fakat siz simdilik anlatugim kasmi iyi algilarsaniz yeterli olacaktur. Mesela projeye bir adet “Xml” dosyas: eklemek gerekirse, veya raporlama islemi igin bir adet “Crystal Report” dékiimanina ihtiyag duyarsantz. vs. yine bu agilan formdan faydalanacagiz. Eklenen formu gériintiilemek igin daha énceden_ bahsetmis oldugumuz “Solution Explorer” penceresine bakmanuz yeterli olacaktr. Bkran gériintiisii asagida verilmistir. ‘aa Soktion ‘Orne project) & (J omek2008 1B aj Properties > By References SB Formt.cs ~ $9) Formt Designer.cs Formt.resx 1) Program.cs Yine belirtmekte yarar var. ilerleyen béliimlerde eklenen diger nesneleride bu pencerede gérebileceksiniz, Sayet ikinci formdaki bir kod bloguna kod yazacaksaniz, 0 zaman buradan o sayfanin tizerine Mouse 23 ile gift tuklayarak aktiflestirmeniz ve uygun yordam: bularak oraya kodu yazmamz. gerekecektir. Isi iyice dfrendikten sonra bu iglemler sizlere Gocuk oyuncag gibi gelecek olsada baslangicta biraz yabancihk gekmeniz normaldir. Uygulamayi ikinci Formdan Baslatmak Uygulamanizi ikinci bir sayfadan agmak isterseniz agagidaki adimlan takip etmelisiniz. Oncelikle “Solution Explorer” penceresini aktiflestirin. | ‘al ee eaad [le] Solution ‘Ornek2008" (1 project) Gl ornekz008 > Gal Properties > a References Formt.cs |i 3 Formt.Designer.cs ~ 93 Formi.resx Bu pencerede yer aln “program.cs” dosyast iizerine cift tiklayarak asagidaki kod sayfasimm agilmasim saglaym. Tek yapmamz gereken iglem asagidaki sekilde Main prosediirii_igerisindeki “Application. Run” satirmma baslangig formunun ismini girmek olacaktir. static void Main() { Application. EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form2());//Form2 ile basla 24 Bilgisayar ve Kullame: Adim Ogrenmek Uyguylamay: calistiran o anki kullanicimm ismini asagrdaki kodlamayla kolayca 6grenebilirsiniz. Komutun anlasilabilmesi igin asagidaki kod blogunu uygulamamza ekleyiniz. Caligurdiktan sonra Label kontrolii igerisinde bilgisayarmizm ve kullamemrzin_ ismini goreceksiniz. vate void button1_Click(object sender, EventArgs e) { labell.Text = System.Security.Principal. Windowsldentity.GetCurrent(). Name; Bilgisayar ve Kullanics Adi Sayisal igeriklere Parasal Format Vermek ilerleyen konularda daha deteyh olarak anlatilacak olmasina ragmen asagidaki kod blogunu kullanarak sayrlarak parasal format bigimini verebilirsiniz. private void Button]_Click(object sender, EventArgs e) { Decimal Deger; Deger = 350750.25M; String SonucDeger; SonucDeger = Deger. ToString(“#,###.00 TL labell Text = SonucDeger; Yukaridaki uygulamay: calistirirsamz formunuzun bashginda “350,750.25 TL” igerigi yazdirilacaktr. Sayet form iizerindeki bir Kontrolden aldirmak isterseniz 0 zaman kodunuzu asagidaki sekilde diizenlemeniz gerekecektir. Asagidaki ekran gériintiisiinii elde etmek igin eklemeniz gereken kod blogu asagida verilmistir. 25 I E i I / I I I private void Button]_Click(object sender, EventArgs e) Decimal Deger; Deger = Convert. ToDecimal(textBox!.Text); String SonucDeger; SonucDeger = Deger.ToString("#.###.00 TL"); label Text = SonucDeger; “Formatla” diigmesine uklanildiktan sonraki ekran_gériintlisit yukarida verilmistir. 26 Degiskenler Programlannn gelistirilmesi asamasinda aym amagh olarak farkl degerlerin Kkullamimasi gerekecektir. Bu yiizden bu deferleri kullanabilmek icin degiskenlerden faydalanmak gerekecektir. C#'da degisken tammlamak igin herhangi bir bildiri deyimine ihtiyag duyulmaz, Ayrica deiskeninizi kiick harfle tammlarsaniz, 0 degiskeni islemlerinizde biiyiik harfle kullanamazsimiz(C#’ da kodlamada Kiigiik-bilyék harf duyarlhgi vardir). Asagidaki sekilde, uygulama igerisinde degiskenlerinizi tanimlayabilir ve kullanabilirsiniz. private void button1_Click(object sender, EventArgs e) int Deger; String Metin; Double Ondalikli_Sayi; Decimal Para; Degiskenleri Tammlarken Dikkat Edilecek Hususlar Defiskenleri tammlarken dikkat etmeniz gereken bazi énemli hususlar olacak, simdi bu hususlara dikkatinizi cekmek istiyoram. © Degisken isimleri kesinlikle rakamla baslayamaz. Fakat diger karakterler rakam barindtrabilirler. private void buttonl_Click(object sender, EventArgs e) { int 9Deger;//Hata int Deger9://Hata Vermez String Metin3;//Hata Vermez } © Degisken isimlerinin icerisinde garip karakterler olamaz. Bu olay hem ilk karakter hemde digerleri igin gecerlidir. 21 private void buttonl_Click(object sender, EventArgs e) { int De&gery//Hata String Me+tin;//Hata Double Ondalikli_Sayi;//Hata Yok _ kullanilabilir Decimal Para; } © Degisken ismi birden fazla kelimeden olusamaz.Yani kelimeleri bosluk tusuyla ayiramazsiniz, Birden fazla kelimeden olusacak degisken isimlerinde araya”_” karakterini kullanin. [ private void button1_Click(object sender, EventArgs e) { String Adi Soyadi;//Hata Arada Bostuk Olmamalt String Adi_Soyadi;//Hata Yok * Degisken isimlerinizde Tiirkge karakter kullanabilirsiniz. Fakat biz kullanmamanizt éneriyoruz. j private void button1_Click(object sender, EventArgs e) String AdiSoyadi;//Tirkce karakter kullanilabilir } int if;//Hata String while;//Hata Komut [smi kullanilamaz Degisken Tipleri Defiskenleri nasil tanimlaman —_gerektigini__-yukaridaki 6meklerden anlamis olmamz gerekecektir. Simdi sizlere degiskenleri tammlayabileceginiz, standart tiplerden bahsedecegim. Aslinda “Object Oriented Programming” dil destekli programlarda her sintftan degisken tiiretilebilir. Fakat standart islemleriniz igin (String-Sayisal-Manuiksal) kullanabileceginiz degisken tipleri su an icin daha fazla énem arz etmektedir. Tam Say: Tipleri Sadece sayisal ifadelere yer verebileceginiz, aym zamanda bu degerlerin ondalikht kisimlarinin kullanilmayacagi durumlarda tercih edebileceginiz deBisken tipleridir. SByte Sadece “-128” ile “+128” arasindaki tam say: degerlerini aktarabileceginiz bir degisken tipidir. private void button2_Click(object sender, EventArgs e) { SByte Kucuk_Sayi; Kucuk_Sayi = 100;//Hata Yok Kucuk_Sayi = -100;//Hata Yok Kucuk_Sayi = 500;//Hata Sinir Degeri Asti Burada dikkatinizi gekmek istedigim bir husus olacakbr Asagidaki sekilde yazac { SByte Kucuk_Sayi; 01; 29 Kucuk_Sayi = Deger://Hata TextBox1.Text = Kucuk_Sayi.ToString(); Sebebi nedir diye soracak olursamz. “int” tipli bir degisken “SByte” tipli bir degiskene gore cok daha yiiksek degerler alabilir. zaman bu atama iglemini basarih bir sekilde yapamayacaktur. Peki bayle bir atamayi yapma sansimiz yokmudur derseniz, kodunuzu asagidaki sekilde degistirmelisiniz(islemde mod manuf: kullanilmaktadir). I] private void button1_Click(object sender, EventArgs e) SByte Kucuk_Sayi; int Deger = 545; Kucuk_Sayi =(sbyte) Deger;//Artik Hata Yok TextBox1.Text = Kucuk_Sayi. ToString(); Butiir “Boxing” islemlerine bundan sonraki bir cok émekte yer verecesiz. Ama hepsindeki manuk budur bilin. Byte “0-255” arasi deer alabilen tam say: tipidir. Diginda Bir deger aktarmum kabul etmeyecektir. private void button2_Click(object sender, EventArgs e) { Byte Deger; int Tam_Sayi; Tam_Sayi = 100; Deger = Tam_Sayi;//Hata TextBox1. Text = Deger.ToString(); Hem degiskenin deger araligint hemde “Boxing” islemlerini daha iyi anlayabilmeniz igin yukaridaki 6rne& incelemenizi istiyorum. Dikkat 30 edin “int” tipli degiskenin degeri “100” olmasina raémen (Bu Byte degisken simur araligindadir) direk bir atama gergeklesememistir. Bunun yerine asagidaki sekilde kullanacaginiz bir kod blogu isinizi gérecektir. private void button2_Click(object sender, EventArgs e) Byte Deger; int Tam_Sayi; Tam_Sayi = 100; Deger =(Byte) Tam_Sayi;//Hata Yok textBox1.Text = Deger. ToString(); Peki yukaridaki émek igin “int” tipli degiskenin degeri “Byte” defiskenine ait simrlar disinda ise ne olacakt. O zaman asaidaki kod blogunu incelemeniz gerekecektir. private void button3_Click(object sender, EventArgs e) { Byte Deger; int Tam_Sayi; Tam_Sayi = 257; Deger =(Byte) Tam_Sayi;//Boxing textBox!.Text = Deger.ToString()//1 Yazar Bu durumda “256” sayisima gére mod kurah uygulamakta, buldugu sonucu degiskene aktarmaktadir. Sayet “int” tipli deBiskenin degeri “258” olsaydi formun bashginda “2” degeri yazdinilacaku. Byte degisken tipi dzellikle karakterlerin “ASCII” degerleriyle ilgili cok giizel 6mekler yapabilmemizi saglamaktadir. Simdi bu hususu émeklendirmek istiyorum, private void button4_Click(object sender, EventArgs e) ‘ £ Char Karakter; Byte Numara; String Metin = "ANKARA"; Karakter = Metin{0}; Numara = (Byte)Karakter;//Karakteri Ascii Degeri textBoxl.Text = Karakter.ToString()) + " Karakterinin Ascii | Degeri=" + Numara.ToString(); short “32.768 ile +32.767” Arasi deer alabilen tamsay1 tipidir. Onceki degiskenler ile kullanirm arasinda fark olmadigi sadece tammlama sekli gosterilmektedir. private void button4_Click(object sender, EventArgs e) short Sayilar; short)Tam_Sayi; textBox1.Text = Sayilar.ToString(); private void button3_Click(object sender, EventArgs e) ushort Sayilar; int “.2.147.483.648 ile 2.147.483.647” Arasi deer alabilen tamsayt tipidir. Asagida kullanimina ait dmekler verilmistir. 32 private void buttonS_Click(object sender, EventArgs e) { int Deger; Double Sayi = 100.85; Deger = (int)Sayi; textBox1.Text = Deger.ToString();//100 Yazar Simdi aym 6megi “Convert” fonksiyonunu kullanarak gézecegim. Farkina liitfen dikkat ediniz. private void buttonS_Click(object sender, EventArgs e) int Deger; Double Sayi = 100.85; Deger = Convert. Tolnt32(Sayi); textBox1.Text = Deger.ToString();//101 Yazar Sonuglamt inceleyecek olursaniz, ilk dmekte “100” ikincide ise “101” yazdigumi gireceksiniz. Yani “Convert” fonksiyonu agagiya veya yukanya yuvarlama yapmakta, “Boxing” islemi ise ondalik degeri ne olursa olsun sadece tam kismim almaktadir. uint “0 ile 4,294,967,295” Arasi Deger alabilen pozitif tamsay: tipidir. || private void button5_Click(object sender, EventArgs e) { uint Deger; long “.9,223,372,036,854,775,808 ile _9,223,372,036,854,775,807” Arasinda deger alabilen tamsay1 tipli degisken seceneBinizdir. Agagidaki sekilde kolayca kullanilabilir. 33, ate void buttonS_Click(object sender, EventArgs e) long Deger; Double Sayi = 100.85; Deger = Convert. ToInt32(Sayi);//Hata Vermez textBox1.Text = Deger.ToString()//101 Yazar ulong “0 to 18,446,744,073,709,551,615” Arasinda pzitif tam sayt degerlerini alabilen degisken segenegiidir. private void buttonS_Click(object sender, EventArgs e) ulong Deger; } Ondabikh Say: Tipleri Cit NET 3.0 igerisinde Ondalikh say: degerlerini tutabileceginiz degisken tipleri asagada verilmistir. float “E15 x 10-45 to £3.4 x 1038” Arast deger alabilen ondahkh Say Tipidir (lk Yazilan araligin -1 ile 0 ve 0 ile +1 arast olduguna dikkat ediniz.). 7 adet Dijit hassasiyeti vardw.Bu tip degiskenler ile matematiksel islem yaparken litfen dikkatli olun. Asagida hassas noktalara deginilmektedir. private void button6_Click(object sender, EventArgs e) { float Deger; Deger = 10.85: 34 Simdi zor olmayan fakat dikkat edilmesi gereken birkag hususa deginmek istiyorum. Asagidaki 6rnegi dikkatlice takip edin private void button6_Click(object sender, EventArgs e) { float Deger; int IIkSayi = 20, SonSayi = 6; Deger = IkSayi / SonSayi; textBox1.Text = Deger.ToString();//3 Yazar Eski “C” uygulamalarmdan gelen bir aliskanlk aynen devam etmektedir. Birbirlerine béliinen iki tam sayism sonucun ondalikh bir sayiya atasaniz bile sonug tam olarak elde edilecektir (Aslinda sonug ondalikli gikmaliydi). Simdi aymi regi asagidaki gekilde deBistirin private void button1_Click(object sender, EventArgs e) { float Deger,SonSay int ThkSayi = 20; Deger = IIkSayi / SonSayi; textBoxl Text = Deger. ToString();//3,333. Sonug deferin ondalikl olabilmesi_agisindan, _islemlerde kullaniian degiskenlerin en azindan bir tanesinin ondahkh tip bir dogisken olmasi gerekmektedir. Olay: daha aydinlatabilmek agisindan birkag drek daha yapmak istiyorum. Asagidaki Omekler arasindaki farklan liitfen dikkatlice inceleyiniz. private void buttont_Click(object sender, EventArgs e) { float Deger; Deger = 10/4; textBoxl Text = Deger. ToStringQv/2 Yazar 35 Simdi aym Smeg asafadaki sekilde gerceklestirin. Alttaki mekte tam sayinin yanina eklenen “f” karakteri olay: cézmektedir. private void button1_Click(object sender, EventArgs e) float Deger; Deger = 10f / 4://f karakterine dikkat edin textBoxI Text = Deger.ToString();//2.5 Yazar ‘Yine belirtelim asagidaki sekilde yapacaginvz bir atama yanlis olacaktr. private void button8_Click(object sender, EventArgs e) float Deger; Deger = 10.0/ 4.0;//Hata textBoxl.Text = Deger.ToString(); } Sayet iki tamsayi tipli degiskeni birbirlerine béldiiriip sonucun ondalikli olmasin istiyorsaniz kodunuz asagidaki sekilde olmalidir. Private void button6_Click(object sender, EventArgs e) { float Deger; int IkSayi = 20, SonSayi = 6; Deger =(float) IIkSayi / SonSayi;/Boxing textBox1.Text = Deger.ToString();//3,333333 Yazar } Double “45.0 x 10-324 to #1.7 x 10308” Arast deger alabilen ondalik Say1 Tipidir. (lik Yazilan arahgm -1 ile 0 ve 0 ile +1 arasi olduguna -dikkat ediniz.) private void button9_Click(object sender, EventArgs e) { Double Deger, Deger = 10/4; textBoxl. Text = Deger.ToString();/2 Yazar “Double” degiskenler “float” degiskenler ile aym mantigt tasimaktadir. Biz genede drneklerimizi verip farkint gdsterelim. private void button9_Click(object sender, EventArgs e) { Double Deger; Deger = 10D / 4,//D Karakterine dikkat edin textBoxl Text = Deger.ToString();//2.5 Yazar private void button1_Click(object sender, EventArgs e) { Double Deger; int IkSayi = 20, SonSayi = 6; Deger = (float)IIkSayi / SonSayi; textBoxl.Text = Deger.ToString()\/3.33333333333333 Yazar Ornegin déndiirdiigii sonuca liitfen dikkat edin. “float” degisken tipi ile “Double” degisken tip arasindaki dijit sayisi epeyce fazia olmaktadir. Ayni OmeGi agagidaki gekilde de yapabilirsiniz. private void button1_Click(ebject sender, EventArgs e) { Double Deger; int IlkSayi = 20, SonSayi = 6; Deger = (Double)IIkSayi / SonSayii 37 Simdi igerisinde “Double” ve “float” degisken tiplerini kullanan dmekler vermek istiyorum. Asagidaki atamanin yanhis oldugunu belirtmek isterim. private void button1_Click(object sender, EventArgs e) Double Deger; float Sayi = 10.85,//Hata Deger = Sayi * 2; textBoxl.Text = Deger. ToString(); Kodu asagidaki sekilde degistirin. ick(object sender, EventArgs e) Double Deger; float Sayi = 10.85Fy/Hata Vermez Deger = Sayi * 2; textBox1.Text = Deger.ToString(); Her nekadar “Double” tip degiskenler ile “float” tip degiskenleri ile islem yapmak ayn gibi giziiksede kesinlikle dyle bir durum séz Konusu degildir. Farki anlamaniz igin asagidaki kod blogunu dikkatlice inceleyiniz. |] private void buttonl_Click(object sender, EventArgs e) Double Deger=10.85://Burada Hata Yok float Sayi; Sayi = Deger * 2,//Burada Hata Olugur Bu émekte olusan sorunu asagidakisekilde _kolayca dizeltebilirsiniz, Cikan sonucu iki Gneeki drnekle kayaslamanizt istiyorum. Dijit farkhhklan dikkatinizi gekecektir. private void button1_Click(object sender, EventArgs e) { Double Deger=10.85; float Sayi; Sayi =(float) Deger * 2;//Aruk Hata Yok textBoxl.Text = Sayi.ToString()v/21.75 Yazar Decimal “£1.0% 10e-28 to +7.9x 10e28” Arasinda deger alabilen ondalikl degisken tipidir. 28 Dijite kadar hassasiyetinin oldugunu belirtmek isterim. private void buttonl_Click(object sender, EventArgs e) { Decimal Deger; Deger = 10,25,//Hatalt Atama textBox1.Text = Deger.ToString(); } ‘Yukandaki dmek uygulamada direk olarak yapilan atama islemi hatalt sonug verecektir. Sayet ondalkl bir say: atamasi yapilacaksa asagidaki sekilde bir iglem gerceklestirilmelidir. private void button1_Click(object sender, EventArgs e) { Decimal Deger; 0.25M/Artik Hat vermez 39 ‘Yine asagidaki sekilde yapilacak olan bir kodlama hatal sonug verecektir. private void buttonl_Click(object sender, EventArgs e) Decimal Deger; Double Sayi = 10.25; Deger = Sayi*2;//Hata Verir textBox1.Text = Deger.ToString(); Sonucu diizgiin bir sekilde hesaplamak igin asagidaki_sekilde basit bir “Boxing” isleminden faydalanmalisiniz } veya Reel Say: Tipli bir degigkenin degerini ‘Tam Sayt Yazdirmak C# Net 3.5” igerisinde sayisal deger igeren bir degiskeni “TextBox1.Text=Veri” seklinde yazdiramazsimz. Kullanietya bu degeri géstermek igin “ToString” ‘methodu kullamhr (veya Convert fonksiyonundan faydalanabilirsiniz). “ToString” kullanmadan boyle bir esitlik yazarsamz tip uyusmazhgi hatast_ verecek programinz kinilacaktr, Eger Dedisken string tipli ise boyle bir ceviriye gerek yoktur. Aynt sekilde double tipli bir degiskene de int tipli bir degiskene aktarmak direkt olarak miimkiin olmamaktadr (Bu hususta bir énceki konuda 40 bolca dmekler verilmistir). Simdi sizlere hesaplanarak elde edilen saytsal degiskenlerin yazdirilma segeneklerini verecegim. Dikkatlice takip ediniz. private void buttonl_Click(object sender, EventArgs e) { Double Deger; float Sayilar; Sayilar =(float) Convert. ToDouble(textBox1.Text);//Al Deger = Sayilar * Sayilar; textBoxL.Text = Deger. ToStringQs//Yazdir private void button1_Click(object sender, EventArgs e) { Double Deger; float Sayilar; Sayilar =(float) Convert. foDouble(textBox!.Text)//Al Deger = Sayilar * Sayilar; textBox2.Text =Convert,ToString(Deger);//Y azdir Metinsel Tipler Alfaniimerik degerleri barmdumak igin kullamilabilecek degisken tipleri agagida verilmistir. String Metin igerikli verilerin aktarilabilecegi degisken tipi olarak kullamlir. Butip degiskenlere aktarilan sayssal karakterler metinsel olarak islem gérecektir. 4 private void button1_Click(object sender, EventArgs e) { String Metin; Metin = textBox1.Text; labell.Text="Girilen Deger=" + Metin; Arayiiz islemlerinde kullanici tarafindan okunabilir tim veriler (neredeyse) bu tipte tanimlanmaktadir. Sadece géstermek amactyla asagidaki sekilde programcr tarafindan direk olarak degeri aktarilabilir. private void Button15_Click(object sender, EventArgs e) { String Metin; Metin = “Prestige Education Center”,//Cift Timak Kullanihr textBox1.Text= Metin; Char Karaktersel islemler igin kullanilan degisken tipidir. Her ne kadar karakter desekte ashnda calisma manugi “String” tip degiskenden cok farklidir. Simdi sizlere bu istemleri drnekleriyle aciklamak istiyorum. private void button1_Click(object sender, EventArgs e) { Char Karakter; Karakter = "A",//Hatal Atama } Goriildiigi gibi “String” tipte tek bir karakter degeri asla “Char” tipli degiskene aktanlamaz. Boyle bir atama igin asagidaki sekilde bir kodlama kullanmalisiniz, Yani aktaracagimz karakter tek tumak igerisinde girilmelidir. 42 private void button1_Click(object sender, EventArgs e) { Char Karakter; Karakter ='A'y/Dogru Atama } Asagidaki sekilde birden fazla aktarilan karakter atamasida hataya sebep olacaktir. private void button_Click(object sender, EventArgs e) { Char Karakter; Karakter = 'AB'y/Hatah Atama Tek Karakter Olacak Yine aymt mantikla tek karaktere sahip “String” tip bir degisken igerigide “Char” tipli degiskene aktarilamaz. private void buttonl_Click(object sender, EventArgs e) { Char Karakter; String Metin="A"; Karakter = Metiny/Hata } Bu atamanm gergeklesebilmesi igin “Boxing” de ise yaramayacaktir. Yani asagidaki sekilde girilecek bir kod sari hataya sebep olacaktur. private void button1_Click(object sender, EventArgs e) { Char Karakter; String Metin="A"; Karakter =(Char) Metin;//Hata } Gariildigit gibi “Char” tipli degisken ile “String” tip degisken arasinda bag kuramadik. Peki bu isin higbir yolu yokmudur hocam derseniz, tabi ki var hemen izah edelim, “String” tipteki karakterleri bir “Char” dizisine aktarabilirsiniz. Oncelikle tek karakterli bir Srnek vererek sizlerin daha iyi bir sekilde aydinlanmamizi saglamaya galisacagim. private void button1. "Click (object sender, EventArgs e) { Char Karakter; Karakter =Metin(0];//Aruk Hata Yok } Buradaki koddan gu anlami gikarabiliriz, “String” tip bir degisken igerisinde “Char” tipli bir dizi barindirmaktadir. Aym mantikla “Char” tipli bir degiskeni “Convert” islemi uygulamadan asla yazdiramazsiniz. private void button1_Click(object sender, EventArgs e) { Char Karakter; String Metin="A"; Karakter =Metin[0}; textBox1.Text = Karakter;//Hata Yazdirma isleminde de asagidaki sekilde yapacagimz bir “Boxing” islemi hatah olacaktir. private void button1_Click(object sender, EventArgs e) Char Karakter; String Metin="A"; Karakter =Metin(0); textBox1.Text =(String) Karakter://Hata “Char” tipli degiskeni nasil yazdiracagiz derseniz _asagdaki kodlamay1 kullanmahsmiz, private void button1_Click(object sender, EventArgs e) { Simdi dmnekleri biraz daha gelistirerek, “Char” dizi defiskenleri arasmda islem yaptiraca private void button1_Click(object sender, EventArgs e) { Char{] DiziKarakter; String Metin = "GAZI"; DiziKarakter = Metin. ToCharArray();//Timiinii Diziye Al textBox1.Text = DiziKarakter[1].ToString();//A Yazar Gérdiigiiniiz gibi “ToCharArray” fonksiyonu _ sayesinde “String” igerige sahip bir degiskenin tim karakterleri boyutu belirlenmemis bir “Char” dizisine kolayca aktanlabilmektedir. “Char” tip degisken ile “Byte” tip degiisken degerleri arasinda gok yakin bir iliski vardir. Simdi sizlere bu iligkiyi émekleriyle agiklamaya calisacagim. Onceki érneklerde “String” sinfimin “Char” sinifina (veya tam tersi) “Boxing” islemi yapamadigum gormiistik. Fakat “Byte” tip ile “Char” tip arasinda cok kuvvetli “Boxing” uygulama mantigi vardir. “Char” tipli bir karaktere “Byte” Boxing’i uygularsamz karakterin “ASCII” degerini, aym gckilde “Byte” tipli bir degiskene “Char” Boxing’i uygularsamz saymm karakter karsiligim elde edebilirsiniz. Asagidaki Smekler bu amagla oldukga faydal olacaktir. Liitfen dikkatlice anlamaya galiginz. 45 private void button1_Click(object sender, EventArgs e) { Char Karakter; Byte Numara; Karakter = 'A’; Numara = (Byte)Karakter; textBox1.Text = Numara.ToString()/65 Yazar Omege dikkat edin “A” karakterinin Ascii karsihg formun bashginda yazdirilmistir. Simdiki Gmegimiz tistteki Gmegin tam tersi olacak. Yani “Ascii” degeri girilen sayin karakter karsiligi kontrolde yazdinilacakur. private void button2_Click(object sender, EventArgs e) { Char Karakter; Byte Numara; Numara = 65; Karakter = (Char)Numara; textBox1.Text = Karakter.ToString()V/A Yazar Asagadaki orek uygulamada Kontrol (TextBox) igerisine girilen karakterin “Ascii” kargiligi formun bashginda yazdirilmaktadir, private void button1_Click(object sender, EventArgs e) { String Deger, Char Karakter; Byte Numara; Deger = textBox1.Text; Karakter = Deger[0]; ‘Numara = (Byte)Karakter; label Text ="Ascii Karsihgi=" + Numara,ToString(); 46 Simdi igerisinde “String” “Char” ve “Byte” degiskenleri ile ilgili islem yapabilecegimiz gtizel bir 6mek yapacagim. Kontrol icerisine girilen igerige ait karakterlerle, Ascii degerlerini liste igerisine yazdiracagim. FARK CELIK lolx private void button1_Click(object sender, EventArgs e) { String Deger; Char{] Karakter; Byte[] Numara; Deger = textBox1.Text; Karakter = Deger.ToCharArray(); Numara = System, Text Encoding UTF8.GetBytes(Karakter); for (int i = 0; i <= Karakter.Length - 1; i++) { listBox I Items.Add(Karakter[i] + "=" + Numara{i]); 4 bool Sadece “true” veya “false” degeri alabilen veri tipidir (evet-hayir veya evli-bekar gibi iki alternatifli durumlar igin kullanir). Omek uygulamamuzda formun iizerine yerlestirilen “radioButton” kontroliiniin isaretli olup olmamasina gére, personelin evli olup olmadigi kontrol edilmektedir. aii Gote [Ce PenonelEvE private void button1_Click(object sender, EventArgs e) bool DurumGoster; DurumGoster = radioButton1.Checked; if (DurumGoster == true) { Jabell.Text = "Personel Evli"; } else { labell.Text ‘Personel Bekar"; Dikkat edin tanimladimiz bool tip DurumGoster isimli degisken ile Evlilik Durumunu gésteren radioButton kontroliiniin isareti kontrol edilmektedir. 48 Sabit Tammlamak Matematikteki “pi” veya “é” sayisi gibi degerleri uygulama igerisinde degismeyen tipteki degiskenlerinizi “const” bildirisiyle tanmlayabilirsiniz. Dikkat edeceginiz bir husus, tanimlama aninda degerini atamak zorundasiniz [[psrate void button1_Click(object sender, EventArgs e) { const Double PiSayis 14//Sabit deBer Dilerseniz asajidaki sekilde bir kullantmida sézkonusudur, Tercih sizlere kalmistr. private void buttonl_Click(object sender, EventArgs e) { const Double PiSayisi = Math.PI; Double Alan, YariCap=10; Alan = PiSayisi * YariCap * YariCap; textBox.Text = "Dairenin Alam=" + Alan.ToString0; Belirtmekte yarar gériiyorum, “const” bildirisiyle deklare edilen degiskene ait deger uygulama igerisinde degistirilemez. Yani asagidaki sekilde bir kodlama hata verecektir. || private void button1_Click(object sender, EventArgs e) { const Double PiSayisi = Math.PT; Double Alan, YariCap=10; PiSayisi = 20;//Hata Verir. Degeri Degistirilemez Alan = PiSayisi * YariCap * YariCap; textBoxl.Text = "Dairenin Alam=" + Alan.ToString(); 49 DateTime Tarih veya zaman igerikli degerlerin tutulacags degiskenleri bu tip tammlayabilirsiniz. private void buttonl_Click(object sender, EventArgs e) { DateTime TarihZaman; TarihZaman = DateTime.Now://Su Anki Tarih textBoxl.Text = TarihZaman.ToString(); } Sayet formun iizerindeki hethangi bir Kontrolden alinacaksa asaidaki sekilde bir kodlama kullanabilirsiniz. Object Icerisine hertiirli verinin aktanlabilecegi sinif tiirtidiir. Ashnda biitiin nesnelerin icerisinde barindinilabilecegi bir ézellige sahiptir desek dogru séylemis oluruz. Igerigin resim,metin say: vs. olmast hig fark etmeyecektir. private void button1_Click(object sender, EventArgs e) { Object Nesne; Nesne = textBox1.Text; label. Text = Nesne.ToString(); } 50 “Object” sinfi her seyin atasidir deyip olay: bitirmek sanmim dogru olmayacaktur. Diger simflar bu sinif degiskenine kolayca “Boxing” uygulayabilirler. Simdi asagidaki émekleri dikkatlice takip ediniz. private void button1_Click(object sender, EventArgs e) { Object Nesne; String Deger; Nesne = textBox!.Text; Deger = (String)Nesne; labell.Text = Deger; Simdi ayn iglemi sayisal igerikli bir deiskenle yapacagim. Dikkat edin “Boxing” yine basarih olacaktr. private void buttont_Click(object sender, EventArgs e) { Object Nesne; int Deger; Nesne = 25; Deger = (int)Nesne; label1. Text = Deger.ToString(); } Bu asamada “TextBox” igerisine sadece rakamsal bir veri girseniz, bile “Boxing” islemi basarih olmayacaktir. Sonug olarak “Object” siniflara atadigimz deferler tipleriyle beraber tutulmaktadr. Simdi birde resim igerikli érmek yaparak konuyu sonlandiracagim. || private void button1_Click(object sender, EventArgs e) i { Object Nesne; Bitmap Resim; Nesne = PictureBox2.Image; Resim = (Bitmap)Nesne; pictureBox3.Image = Resim; 51 Alt Yordamlarm Beraber Kullanabilecegi Degisken. Tammlamak Projelerinizde bir yordamin (veya sizlerin yazmis oldugu prosediir) kullandig degisken, diger yordamlar tarafindan son degeriyle kullanilacaksa degiskeninizi o sinif igin Global olarak tanmlamalisiniz. Bu sayede yapilacak olan deger de@isikligi tim bloklar tarafindan algilamp ona gore kullanilacaktr. Herhangi bir alt yordamda tanmlanan degigken sadece 0 yordam tarafindan kullantlabilir. Diger yordamlarn o degiskenden haberleri olmayacakur. int GlobalDeger=20,//Global Dexisken private void Buttoni_Click(object sender, EventArgs e) Jabell.Text = GlobalDeger.ToString(); GlobalDeger = 555; } private void Button2_Click(object sender, EventArgs e) label |. Text = GlobalDeger.ToString(); GlobalDeger = 888; Yukandaki kod blogunu uygulamaya ekledikten sonra programinizi calistrabilirsiniz. Simdi diigmelere basarak sonuglant gorebilirsiniz. [Ik diigmenin atadigi degeri ikinci diigme rahathikla kullanabilmektedir. Dikkat edecegiiniz husus, Global degiskenleri “void” blogu (fonksiyon vs. bloguda olabilir) icerisinde degil dis alanda tanimlamanuzin gerekliligidir. Static Degiskenler Tammlamak Global bir degisken tammlanurken, éncesinde bir bildiri yapiimazsa bilgisayar onu “private” degisken olarak algilar. Yani sadece 0 form (Daha Dogrusu Class) tarafindan kullantlabilir. Diger sayfalar 0 degiskenden haberdar olmaziar. Diger formlarin bu degiskenin degerini kullanabilmesi igin Gncelikle “‘public” bildirisinin _ eklenmesi gerekecektir. Her ne kadar “public” bildirisi eklenen degisken diger sayfalar tarafindan kullanulabilir olsada, bu kullanum kasithidir. Yani tanimlandig andaki degere erigebilirler. Alt yordamda kodla degistirilen degeri kullanmalart miimkiin degildir. Dekiistirilen yeni degerin diger sayfalardan kullanilabilir olmast igin “static” bildirisinin “public” bildirisinin yanma_ eklenmesi getekecektir. Simdi uygulamaniza ikinci formunuzu _ekleyerek kodlarmizi agidaki sekilde degistirin. namespace Ornek2008 public partial class Form6 : Form public static string DahaGlobal = "ANKARA"; private void button1_Click(object sender, EventArgs e) { DahaGlobal = "ISTANBUL", Form? Yeni = new Form70; Yeni.Show(; Ikinci formunuza asagidaki kod blogunu ekleyerek uygulamamzi galigurm. Géreceksiniz static olarak bildirilmis degisken degeri diger formdan kolayca elde edilebilecektir. 53 namespace Ornek2008 public partial class Form7 : Form { private void Form7_Load(object sender, EventArgs e) MDiger Form String Deger; Deger = Form6.DahaGlobal;//Onceki Form Degiskeni label. Text = Deger//ISTANBUL Yazar ilk sayfadan kodu yazdigimiz diigmeye basarak ikinci sayfay1 agarsaniz, kodda atamis oldugumuz deger ikinci sintf (Form?) igerisinde haturlanacak ve “ISTANBUL” degeri yazdinlacakur. Bu érnekte dikkat edin eklenen ilk sayfanin Class ismi “Form6”, ikinci sayfanin Class ismi ise “Form7” olarak olusturulmustur. “Private” olarak deklarasyonu yapilmis degiisken, prosediir, fonksiyon vs. gibi methodlar sadece 0 Class igerisinde kullamlabilirler (Burada Class olarak Formlar kullantlmaktadir). Diger formlarin kullanabilecegi methodlar “public” olarak deklare edilmelidir. Aksi bir yaklasim cagirma aninda hata ile sonuglanacaktr. 4 Aynt islemi asagidaki sekildede yaptrabilirsiniz. Bu sefer Binding sinif degiskeninden faydalanmaktay1z. ikinci Form Binding YeniNesne; te void Form2_Load(object sender, EventArgs ¢) YeniNesne = new Binding("Text",Form1.Eleman,"Text"); textBox!.DataBindings. Add(YeniNesne); dik Form public static TextBox Eleman=new TextBox(); private void buttonl_Click(object sender, EventArgs e) { Form2 Yeni = new Form2(); Yeni. Show(); } private void textBox1_TextChanged(object sender, EventArgs e) { Eleman.Text = textBox1.Text; } Simi ilk fornm galistirm. TextBox igerisine degerlerinizi girerek ikinci forma agtirin. Deiskenlere ilk Deger Atanmast Bazi Durumlarda uygulamanzz igerisinde degiskeni tammladigamiz anda ona defer atamak zorunda kalabilirsiniz. Bu sayede degiskeninizin varsaytlan bir degeri olacaktir. Gnemli bir husus daha, bir cok dilde herhangi bir degisken tantmlandigs anda ilk degeri “O” olarak atanmistir. “C#’ igin bdyle bir durum sdzkonusu degildir. Bu degerin Sfrenilebilmesiigin muhakkak deer atamasinin_—_yapilmast gerekmektedir. Bu mantikla asagidaki sekilde bir kodlama hatal sonug verecektir. private void button1_Click(object sender, EventArgs e) int Deger;/igerik Belirsiz label Text = Deger.ToString();//Hata Deger Atanmadi } Fakat asagidaki sekilde yapacagimz bir kodlama kesinlikle diizgiin calisacaktr. private void button1_Click(object sender, EventArgs e) { int Deger=222;//ilk Deger Atandi label Text = Deger.ToString();//222 Yazar Asagidaki sekilde ayn satir icerisinde’ birden fazla degiskene varsayrlan deger atayabilirsiniz. [private void button1_Click(object sender, EventArgs e) { int Deger=222,IlkSayi=20,SonSayi=45;//Aym Satirda Tanmli string Sehir = "ANKARA"sIIce = "KIZILAY"; label.Text sehir; } 56 ilk deger atanmadig: siirece o degiskenin atama isleminin saginda kullanilamayacagimt belirtmistik. Fakat bu durumun istisnast vardr. Asagidaki ekilde Global alanda tammlanan bir degiskene deger atamadan yazdirirsanyz sonucun “0” oldugunu goreceksiniz. |] int Deger: private void button1_Click(object sender, EventArgs e) { labell Text = Deger.ToString();//0 Yazar Aynt islemi “String” tip degisken igin kullanirsan1z, Sonug “null” degeri déndurecektir. String Veris private void button1_Click(object sender, EventArgs e) Jabell Text = Veri;//null 7 Dizi Degiskenler Defigkenleri nasil tanumlayabileceginizi yukarida _sizlere gésterdik. Fakat bir cok durumda uygulamanizin_ kullanabilecegi degiskenleri béyle tek basina tammlamaniz sikici, hatta imkansiz olacakur. Sebebi basittir, “50” kisilik bir sinif igin her 6Brenciye bir isim vermeye kalkarsamz kod satirlarmzin alacagi hali diisiinmek bile istemiyorum. Dizilerin énemli ikinci bir ézelligi daha vardir. Mesela “10” elamanh bir dizi tanmladiginizi diisiinelim. Bu elemanlar bellekte arka arkaya yer isgal edecek, islemci bu degerler tizerinde gok daha hizit iglem yapabilecektir. “C#” uygulamalamalarinda dizi deiskenleri asagidaki gekilde tanmmlayabilirsiniz. private void button1_Click(object sender, EventArgs e) { Double[} DiziDeger;//Once Tanmlamyor MKodlar DiziDeger = new Double[20];//20 Eleman Boyutlandinhyor } Yukaridaki Grnek tanimlamada “20” elamanli “Double” tip dizi degiskeni olusturulmustur. ik elemani indis numaras1"0” son elemanin indis numarast ise “19” olacaktr. Ayn iglemi tammlandij satirda boyutlandirarakta yapabilirsiniz. ] private void buttonl_Click(object sender, EventArgs e) { Double[] DiziDeger = new Double[20]; } Dikkat edin yaptlan islem aymidir. Yine “20” elemanh bir dizi tanimlanmis olup, ilk elemanin indis numarast “0”, son elemanin indis numarasi ise “19” olacaktir. Yukaridaki tanimlamadan sonra “19” indis numarasindan daha biiytk bir deger kullansrsantz galiyma aninda uygulamaniz kinilacakur. 58 Projelerinin gogunda dizi degiskeninizin eleman sayist uygulamanizdaki bir kontrol igeriginden gelecektir. Sebebi basittir, her simfin 6grenci sayist farkl olacagi icin diziyi her seferinde o simifin @¥renci sayisina gore boyutlandirmalisiniz. Gayet eleman sayist kontrol igeriginden alinacaksa agagidaki sekilde bir kodlama kullanabilirsiniz. private void button1_Click(object sender, EventArgs e) int OgrenciSayisi; String[] AdiSoyadi; OgrenciSayisi = Convert. Tolnt32(textBox!.Text); AdiSoyadi = new String{OgrenciSayisi];/Boyutlandrr. Gérlildigu gibi tammladizinz diziyi “TextBox” igerisine girilen deger kadar boyutlandirmis oldunuz. Dizilere deger atamak ve bu degerleri elde etmek indis numarasim kullanarak gok kolay bir sekilde gergeklestirilebilmektedir. Asagidaki tammlamalarda bu —hususa deginilmektedir. private void button}_Click(object sender, EventArgs e) { int[] DiziDeger = new int(5}:/5 Elemanh Dizi DiziDeger{0) DiziDeger{1] DiziDeger{2] = DiziDeger[3] Dikkat edin asagidaki sekilde yaratilmamis indis numarah elemana deger atarsaniz projeniz kirlacaktir. private void button1_Click(object sender, EventArgs e) { int[] DiziDeger = new int{5]¥/5 Elemanh Dizi DiziDeger{0] 39 DiziDeger{1] = 25; DiziDeger{2} = 40; DiziDeger[S] = 20;//Hata Bu Eleman Yaratiulmadi } Dizinin bir elemanina ait deferi elde etmek isterseniz. asagidaki sekilde bir kodlama kullanabilirsiniz. private void button1_Click(object sender, EventArgs e) int{) DiziDeger = new int{5]; DiziDeger{0] = 20; DiziDeger{1] = 25; DiziDeger{2] = 40; DiziDeger{3] = 80; labelll. Text = DiziDeger[2].ToString()s//40 Yazar Dizi elemanlant normal degiskenlerden farkli karakteristik ézellik gésterir. Yani bir dizi elemana ilk degerini atamadan yazdirabilirsiniz. Sonug sayrsal degiskenler icin “0”, String” tip degiskenler iginse “null” seklinde olacaktir. private void buttonl_Click(object sender, EventArgs e) { int{] DiziDeger = new int{5}; labell.Text = DiziDeger[0].ToString();/0 Yazar ate void buttoni_Click(object sender, EventArgs e) String[] DiziDeger = new String{5]; label .Text = DiziDeger[0];//null 60 Dizi Degiskenlere Varsayslan Deger Atamak Dizi degiskenlere tammlandiklant anda ilk degerleri aktanlabilir. Bu sayede varsayilan degerleri “0” (veya null vs) de@ilsizin belirleyeceginiz yeni deger olacakur. private void button1_Click(object sender, EventArgs e) { int[] DiziDeger = new int{] { 10, 20, 30 };//3 Eleman labelll Text = DiziDeger{1].ToString),//20 Yazar private void button1_Click(object sender, EventArgs e) int[] DiziDeger = new int{3] { 10, 20, 30 }; label .Text = DiziDeger{1].ToString();//20 Yazar } Asajidaki sekilde bir atama isleminin hatali olacagim belirtmek isterim. Oregimizde “3” elemanl dizi tanimlanmus, fakat “2” elemanna varsayilan deger atanmaya galisilmistir. private void buttonl_Click(object sender, EventArgs e) int[] DiziDeger = new int{3] { 10, 20};//Hata labell Text = DiziDeger{1].ToString(); } Dilerseniz. asagidaki gekilde bir atamada yapabilirsiniz. Burada gergeklesen olay Sncekinden higte farkh degildir. Eleman sayisma gore dizi kendisini otomatik olarak boyutlandiracakur. Dizinin varsaytlan degerinin nasil aktarilacags programerya burakilmistr. 61 | private void buttont_Click(object sender, EventArgs €) int{] DiziDeger ={ 10, 20, 30 };//3 Elemanli Jabell.Text = DiziDeger[1].ToString();//20 Yazar Asagidaki émek uygulamada diziye ait tim elemanlar liste igerisine aktarilmaktadir. Em private void button1_Click(object sender, EventArgs e) String{] AdresDeger =new String[3}{" VAN ","RIZE","MUS"}; for (int i = 0; i <= AdresDeger.Length - 1; i++) listBox1.Items.Add(AdresDeger{i]); JEnumerator Interface’ini Kullanarak Dizi Elemanlarim Dolasmak Dizi degiskenlerinizi indis numarasm kullanarak kolayca dolasabileceginiz gibi, asagidaki sekilde “IEnumerator” interface 2 yardimiylada kolayca elde edebilirsiniz. Simdi bir énceki émekte yapilan islemin aynisini daha degisik bir kod blogu ile gergeklestirecegim. || private void button2_Click(object sender, EventArgs e) { String[] AdresDeger = new String[3] { "VAN", "RIZE", "MUS" }; System Collections. [Enumerator DiziOku =AdresDeger.GetEnumerator(); while (DiziOku.MoveNext())//Baska Eleman Varsa { listBox | Items. Add(DiziOku. Current. ToString());//Aktif Eleman Matrix Diziler Geligmig projeler gelistirebilmek agisindan bilinmesinin zorunlu oldugunu diisiindiigiim bir yapry: sizlere aciklayacagim. Gergekten profesyonel uygulamalarm vazgegilmez alt yapisim “Matrix” diziler olusturmaktadir. Omeklendirmek gerekirse veri tabam uygulamalarinda kullanilan tablolar tamamen matrix dizilerden olusur. Aynt sekilde her kayit baska bir dizi elemanr ile ifade edilebilebilir. ADO .NET uygulamalaninda kullanilan “DataSet”,”DataView”,”DataTable” vs. gibi nesnelerin olusturulma mantiginda bu dizilerin katkist gok biiyiiktiir. Gok Boyutlu dizi tanmlamak, sizi tek boyutlu bir cok dizi tanmlamak yerine bir tane cok boyutlu dizi tanmlayarak problemi gézme imkant verir. Bu sayede olusabilecek dizi karmagasindan kurtulabilirsiniz, Ayn manukla gelistireceginiz algoritmalar da daha anlasilar ve rahat yazima kavusacaktr. private void buttonl_Click(object sender, EventArgs e) { String[,] DiziDeger; MKodlar DiziDeger = new string{2, 3];//6 Elemanh Matrix Dizi Asaidaki sekilde olusturulan matrix dizi elemanlarma deger atayabilirsiniz. [| private void button1_Click(object sender, EventArgs e) String[,] DiziDeger; WKodlar DiziDeger = new string[2, 3]; DiziDeger{0, 2] = "GAZi UNIVERSITESI"; DiziDeger[1, 2] = "ODTU"; Asaadaki gekilde ise matrix diziye ait elemanlardan herhangi bir tanesinin degerini kolayca yazdirabilirsiniz. private void button1_Click(object sender, EventArgs e) { String[,] DiziDeger; DiziDeger = new string[2, 3}; | DiziDeger[0, 2] = "GAZi UNIVERSITESI"; label Text = DiziDeger(0, 2]; DiziDeger [2,3] iin sonugta 6 elemanh bir dizi oldugu agagida anlatilmaya galisildh. DiziDeger [0,0] DiziDeger [0,1] DiziDeger [0,2] DiziDeger [1,0] DiziDeger [1,1] DiziDeger [1,2] Belirtmek isterim bu elemanlar digindaki bir elemana deger atarsaniz veya yazdirmaya caligrsantz, calisma zamanmnda projeniz kanilacaktur.Agaidaki Smekte bu hususa deginilmisti. 64 private void button1_Click(object sender, EventArgs e) String[,] DiziDeger; DiziDeger = new string{2, 3); DiziDeger{0, 3] = "GAZI UNIVERSITESI";//Hata label Text = DiziDeger{0, 3);//Bu Eleman Yok } Matrix Dizilere ilk Degerin Atanmasi Matrix dizilere tanmmlandiklan anda asagidaki sekilde kolayca deger atayabilirsiniz, Bu sayede atadiginiz degerleri varsayilan olarak kullanabilirsiniz. int[,] DiziDeger=new int{,]{ {10,11,12},{20,21,22}}; label Text=DiziDeger{1,1].ToString();//21 Yazar iu Veya e) int[,] DiziDeger=new int{2,3]{ { 10,11,12}, {20,21,22}}; label. Text=DiziDeger[1,1].ToString();//21 Yazar private void buttonl_Click(object sender, EventArgs e) { i int{,] DiziDege: { 10, 11, 12 }, { 20, 21,22) ); labell Text = DiziDeger[1, 1].ToString()/21 Yazar 65 Biz dmeklerimizi “int” tipli bir degisken igin yapuk, sizler degisik bir tip degiskeni kullanabilirsiniz. Agagidaki mek uygulamada matrix bir dizi degiskene ait tiim elemanlar liste igerisine aktarimaktadur. Dikkat edin ig ige iki adet “for” déngiisii kullaniimisur. Belirtmekte yarar gériiyorum “GetUpperBound” fonksiyonu girilen indis numarah elemanin eleman sayisim dondiirmektedir. [private void buttoni_Click(object sender, EventArgs ¢) String[,] DiziDeger ={ { "ANKARA", "IZMIR", "RIZE" }, { "BURSA", "ORDU", "BOLU" } }; for (int i = 0; i <= DiziDeger.GetUpperBound(0); i++) for (int j = 0; j <= DiziDeger.GetUpperBound(1); j++) { listBox 1 Items.Add(DiziDegerli, j)); Uygulamanin gahsuktan sonraki ekran gériintiisit_ yukanda verilmistir. Tiim elemanlarm yazdirildigana dikkat ediniz. 66 IEnumerator ve Matrix Diziler Yukardaki érnek uygulamay: ‘TEnumarator” interface’i aracihgiylada kolayca _gergeklestirebilirsiniz. “IEnumarator” kullanirken ilk tklamaniz biraz yavag olabilir, fakat sonrakilerde bu hiz farki ortadan kalkacaktrr. Buradaki manuk, oncelikle ilk satirda yer alan degerler yazdirilacak, ardindan ikinci satura (ve digerlerine) gecilecektir. private void Button1_Click(object sender, EventArgs e) { String[,] DiziDeger ={ { "ANKARA", "IZMIR", "RIZE" }, { "BURSA", "ORDU", "BOLU" } }; System.Collections.Enumerator DiziOku = DiziDeger.GetEnumerator(); while (DiziOku. MoveNext()) { listBox 1 Items.Add(DiziOku.Current); Ekran gériintiistinin yukandakiyle aym oldugu dikkatinizi gekmistir. 67 Fonksiyonlardan Matrix Dizi Degiskeni Dindiirebilmek Agagidaki sekilde bir kodlama_ kullanarak fonksiyonlardan hesaplanan degerleri bir dizi degiskende tutup,bu diziye ait tiim degerleri kullanieiya gnderebilirsiniz. Yukaridaki ekran goriintiisiine dikkat edecek olursaniz TextBox kontrolii igerisine girilen metnin karakterlere ayrilmis halini listede goreceksiniz. Bu islemi gergeklestirmek igin geriye Char dizisi dondiren “Karakterler” isimli bir fonksiyon olusturulmustur. | namespace Ornek2008 { public partial class Form9 : Form { private Char[] Karakterler(string Metin) { Char[} Dizi = Metin. ToCharArray(); return Dizi; 68. ite void button1_Click(object sender, EventArgs e) Char{] YeniDizi = Karakterler(textBox1.Text); foreach (Char Eleman in YeniDizi) listBox1 Items.Add(Eleman.ToString()); 9 Matrix Dizileri Yeniden Boyutlandirmak C#da diziler énce tanimlamp daha sonra eleman sayisi belirlendigi igin bu diziler aym zamanda dinamik dizi olarak ta kullanilabilirler. Burada “{]” parantez igerisindeki deger herhangi bir kontrolden veya bir inputBox’tan rahathkla aldinlabilir. Yeniden boyutlandirma asamasinda unutmamaniz gereken husus, eski degerlerin unutulacagidr. private void buttont_Click(object sender, EventArgs e) int[,] DiziDeger ={ { 10, 11, 12 }, { 20, 21, 22} } /Kodlar DiziDeger = new int{2, 4] { { 100, 101, 102, 103 }, ( 200, 201, 202, 203 } }://Yeniden Boyutlandinild: textBox1.Text = DiziDeger[1, 1].ToString();//201 Yazar } “C# NET 3.0” Bilgisayar dilinde tanmlanan dizi degiiskeni istediginiz kadar yeniden boyutlandirabilirsiniz. Burada unutmamaniz gereken husus bir diziyi yeniden boyutlandirmaniz durumunda eski degerlerin kaybolacagidir, yani defer belirtmezseniz. tam sayt tipli degiskenler igin deger otomatik olarak “O” olacakur. private void button1_Click(object sender, EventArgs e) { int[,] DiziDeger ={ { 10, 11, 12 }, ( 20, 21,22} }; dKodlar DiziDeger = new int[2, 4]; textBox1.Text = DiziDeger[1, 1].ToString();/Artik 0 Yazar Burada belirtmekte yarar gorilyorum, ikinci kez yapilan boyutlama ilk dizi elemanlarindan fazla veya az olabilit. Herhangi bir hata séz konusu olmayacaktur. 70 Uc veya Daha Cok Boyutlu Dizi Degisken Tanimlamak Matrix diziler hususunda sizleri bilgilendirdikten sonra olayt biraz daha karmasiklastiran tig veya daha fazla boyuta sahip diziler iizerinde galigma yapacagiz. Amacimiz kesinlikle kafa karistirmak de@il, indislerin ne anlama geldigini sizlere anlatmaktr. Asagida tig boyutlu bir dizinin nasil tanmlanacagi gésterilmektedir. private void button _Click(object sender, EventArgs e) int[, ,] UcBoyut = new int[2, 3, 2]; UcBoyut/1, 2, 0] = 25;//Deger Ata textBoxl Text = UcBoypt{L, 2, 0]. ToString()/¥ azdir } Dilerseniz asagidaki sekilde tanmmlandigi anda dizi elemanlarma degerlerini atayabilirsiniz. private void buttonl_Click(object sender, EventArgs e) int{, ,] UcBoyut = new int[, ,} ( { { 10, 11 { 101 }, { 200, 201 } }, { { 10, 11}, { 20, 21 }}, {f yas }, { 20, 21 }}, {{ 100, 100, 101 }, { 200, 201 textBox1.Text = UcBoyut{I, 1, 1]. ToString();//201 Yazar Matematiksel islem yapmak isterseniz asagidaki sekilde bir kodlama kullanmalisiniz J private void buttonl_Click(object sender, EventArgs e) { int{, ,] UcBoyut = new intf,.] { { (10, 11 }, (20,21) }, { { 100, 101 }, ( 200, 201 } }, ( (10, 11 }, { 20,21} J, { { 100, 101 }, { 200, 201) }}5 UcBoyut{l, 1, 1] = UcBoyut{0, 0, 0) * TextBoxl.Text = UcBoyut{I, I, I]. ToString(;//80 Yazar } Ug Boyutlu Dizi Elemanlarmi Dolasmak Asaidaki dmek uygulama sonucunda tig boyutlu diziniz igerisindeki ttim elemanlar mesaj penceresi igerisinde kullamciya gosterebilirsiniz. private void buttonl_Click(object sender, EventArgs ¢) { int[, ,] UcBoyut = new int[,,] { { { 10, 11 }, { 20, 21} }, { { 100, 101 }, { 200, 201 } }, { { 10, 11 }, { 20, 21 } }, { { 100, 101 }, { 200, 201) } 5 System.Collections.[Enumerator DiziOku = UcBoyut.GetEnumerator(); while (DiziOku.MoveNext()) JistBox1 .Items.Add(DiziOku.Current.ToString()); Asajiidaki 6mek uygulamada ig boyutlu dizi dekiskene ait degerler “IEnumurator” kullanilarak iki boyutlu dizi degiskene aktarilmaktadir. Dikkatlice incelemenizi éneririm. private void button1_Click(object sender, EventArgs e) int[, ,] UcBoyut = new int{,,] { ( { 10, 11 }, ( 20,21} }, € { 100, 101 }, { 200, 201 } }, { { 10, 11 }, { 20, 21 } }, { { 100, 101 }, { 200, 201} } }s System. Collections IEnumerator DiziOku = UcBoyut.GetEnumerator(); int{,] YeniDizi = new int(4, 4]; for (int i = 0; i <= YeniDizi.GetUpperBound(0); i++) ‘= YeniDizi-GetUpperBound(1); j++) DiziOku.MoveNext(): YeniDizili, j) =(int)DiziOku.Current; 2 } } System.Collections.[Enumerator DiziYaz = YeniDizi.GetEnumerator(); while (Dizi Yaz. MoveNext()) { listBox1 Items. Add(DiziYaz.Current.ToString()); } } Gériildigi gibi “IEnumerator” sayesinde tig boyutla dizinin tim elemanlarina erigilerek, iki boyutlu diziye aktanlmaktadir. Burada dizi elemanlarma erisimin “ReadOnly” olarak yapulabildigini belirtmek isterim - B Jagged Diziler Matrix dizilerin bir cok uygulama igin cok etkili céztimler sundugunu dnceki konumuzda belirtmistik. Fakat baz1 6zel durumlar igin Matrix dizi céziimleri yerine Jagged dizi céztimlerini tercih etmeniz gerekecektir. Sebebine gelince dizinizin satwr saytlarinin her zaman aynt olmasi saglanamayabilir. Yani her sat farkh degerler_ ile boyutlandinimast gerekebilir. Bu tir islemleri Matrix dizilerle gézmeye kalkarsaniz extra kontroller koymaniz ve bellekte bosu bosuna kullaniimayacak olan elemanlarin yaratilmasina sebep olacaksiniz. ANKARA isTANBUL RIZE BOLU VAN TRABZON Jagged diziler, tek bir dizi ismi alunda bir gok alt dizinin barndiga anlamim tasimaktadir. Mantigm anlagilmast agisindan_asagidaki agiklamalan dikkatlice okuyun. Size sdyle bir soru sordugumu diistiniin. Liste igerisinde yer alan her satirdaki karakterleri iki boyutlu bir matrix dizi igerisine aktann. izleyeceginiz yo! sanmm su olurdu. Oncelikle liste igerisinde yer alan en uzun satirt bularak siitun sayisim ona gére belirleyeceginiz. bir matrix dizi tammlardinz. Yani en uzun isim “ISTANBUL” (8 karakter) olacagindan satir sayisida “6” oldugu igin string[,] sehir=new string[6,8] seklinde bir dizi tammlayacakuniz. Peki degerleri aktardigimz zaman bellekteki durum ne olacakti sizce, bir siirit kullanilmayacak eleman ‘asagidaki sekilde). iste jagged diziler bu durumlar igin cok etkili géziimler sunar, Hemen érnegimizi sematize edelim. Matrix Dizi lle Céziim A N K A R A I s T A N B U R : Z E B 0 L U Vv A N R A B Z oO N Omege Dikkat Edin tam “16” adet eleman bosa tanimlanmig ve bellekte yer isgal etmis olacaktir. Jagged Dizi lle Céziim A N K A R A I s T A N B U L R I Z E B oO L U Vv A N T R A B Z 0 N Her satirm eleman sayist farklt verilerek bellekte bos clemanin olmasi engellenmis. Karakterler yine belirli bir mantikla diziye aktariimistur. Ikisinde de ortak olan deger dizinin saur sayisidir, Bu amagla Jagged diziler tammlandiklan anda ilk boyutlar: muhakkak verilmelidir. Simdi bir jaggad dizinin nasil tanmlanmast gerektigini gérelim. ‘Yukaridaki kodlamada programes sunu demek istemistir. Ben “4” satirdan olusan bir dizi tammladim. Fakat her satirm eleman sayist birbitinden farklt olacaktr (Aymida olabilir). Bu sayilan da programin herhangi bir yerinde bildirecegim. private void buttonS_Click(object sender, EventArgs ¢) { int{J() JaggedDizi; JaggedDizi = new int(3)0); JaggedDizi(0] = new int[4] /ilk saur 4 Eleman JaggedDizi[1] = new int{3],/fikinci saur 3 Eleman JaggedDizi(2] = new int[2];/. 8 Wl JaggedDizi[0}[3] = 100,/flk satirin 4, stitunu JaggedDizi(2][1] = 500; textBox1.Text = JaggedDizi(2)[1].ToString();//500 Yukaridaki kod asagidaki gibi sematize edilebilir. JaggedDizi[O){0] JaggedDizi (0][1] JaggedDizi [0][2] JaggedDizi (01{3) JaggedDizi [1][0} JaggedDizi (1][1] JaggedDizi (1)(2] JaggedDizi [2110] JaggedDizi [0}{1] gibi ilk satu 4 elemandan, 2.saur 3 elemandan, 3 satirda 2 elemandan olusmaktadir. Arik her elemana rahathkla deger atayabilirsiniz. Burada dikkat edilmesi gereken husus JaggedDizi (41[5] (yukanidaki elemanlar disinda herhangi bir tanesi de olabilir) elemanma deger atayamayacagimizdir. Eger béyle bir atama yaparsamiz, galisma aninda programiniz kirlacaktir. Simdi sizlere Jagged dizi kullanarak listBox igerisindeki satirlan alfabetik listeye gore siralalayacak bir uygulama géstermek istiyorum. Omegimiz igin asagida verilen tasarmi olusturunuz. _iolx Programa ait tim kodlar asagida verilmistir. Cok dikkatlice inceleyiniz. 6 private void Button1_Click(object sender, EventArgs e) inti, j, k,l y, z, satir; string deger, degistir; string[]() dizi;//Jagged Dizi satir = listBox1.Items.Count; string[] veri = new String[satir]; dizi = new string{satir]{];//Satur Sayist Belirlendi for (i = 0; i <= satir - 1; i++) stBox 1 Items[i].ToString(); .ew string{deger. Length}; verii] = deger; for (y = 0; y <= satir- 1; y+4) { k = verily]. Length; for (z= 0; 2 <=k- 1; 244) dizi{y]{z) = verify] Substring(z,1); } } for (i= 1; i <= satir - 1; i++) for (j= 0;j<=i-1;j+#) { 1 = verifj].Length; for (k = 0; k <=1- 1; k++) if ((byte)(Convert. ToChar(dizifil[k)) < (byte)(Convert. ToChar(dizifj][k}))) { degis verili); verifi] = verilj); verilj] = degistir; for (y = 0; y <= satir- 1; y+) 1 deger =listBox1 Items[y].ToString(); dizily] = new string[veri[y].Length]; for (y = 0; y <= satir- 1; y+) k =veri[y].Length; for (z= 0; z<=k- 1; 2++4) dizity]{z] =veri[y}.Substring(z, 1); else { if ((byte)(Convert.ToChar(dizifi][k])) > (byte) (Convert. ToChar(dizifj}(k}))) { listBox2.Items.Clear();//Temizle for (i =0; i <= satir - 1; i++) listBox2.Items.Add(verifi}); Uygulamay: calistirip “Jagged Dizi [le Sirala” isimli buttona tklarsanz, Agagidaki sekilde bir ckran gériintiisiiyle kargilasirsimz. Dikkat edin Universite isimleri alfabetik straya gére gésterilmektedir. “ANKARA” Universitesi siralamaya gore en iiste alinacaktrr. 8 int{][] JaggedDizi = { new int(2}, new int{4], new int(3) }; JaggedDizi[1}[0] = 150; textBox1.Text = JaggedDizi(! (0). ToString()//150 Dilerseniz asagidaki sekilde de bir “jagged” dizi tanmlamas: yapabilirsiniz. Dikkat edin saur sayisi belirtilmemekte fakat belirtilen parantez saytlarndan (ilgilisinden tabi) kendisi otomatik olarak olusturulmaktadir private void buttonl_Click(object sender, EventArgs e) { int{](] JaggedDizi = new int{]{] { new int{] { 10, 40, 551 }, new int{] J { 321, 18, 96,77, 10} textBox 1 Text = JaggedDizi(1][2].ToString()://96 yazar Asagidaki Jagged dizi tammlamast kesinlikle dogrudur. int{J{,] JaggedDizi = new int[3][.] { new int{,] { {20,80}, (30,5} }, new intf,) {{12,32}, {5,6}, {70,10} }, new int[,] { {140,800}, {700,50}, {10,90}} Buradaki “new” komutu her satiri ayri ayri boyutlandirma islevini gormektedir. private void button1_Click(object sender, EventArgs e) int[J[.] JaggedDizi = new int[3][,] { new int{,]{ {20,80}, {30,5} }, new int{,]{ {12,32}, {5,6}, {70,10} }, new int[,]{ {140,800}, {700,50}, {10,90} } h textBox1.Text = JaggedDizi[2][1, 1]-ToString)v/50 Jagged Dizileri anlamaniz icin asagidaki Smek uygulamayi dikkatlice takip etmenizi istiyorum. Oncelikle verilen tasarimi olusturun. Oncelikle amacimuzi izah edelim. Liste igerisindeki sehir isimleri “Char” tipli Jagged diziye aktamlarak istenilen karakter kolayca yazdinlacaktur. 80 namespace Ornek2008 public partial class Forml1 : Form { private void Form11_Load(object sender, EventArgs e) int adet, sayi; string satir; adet = listBox1Jtems.Count/Kag Sauir Karakterler = new char[adet](];//Saur Boyutu for (int i = 0; i <= adet - 1; i++) { Karakterler{i] = new char{sayi]; for (int j = 0;j <= sayi- 1: j+4) Karakterlerfil [j) = satir{j);//Karakter i; } char[][] Karakterler;//Global Jagged Dizi 81 private void button1_Click(object sender, EventArgs e) { int satir, sutun; satir = Convert. Tolnt32(textBox 1. Text); sutun = Convert, Tolnt32(textBox2. Text) Jabel3.Text = "Istenen Karakter=" + Karakterler(satir]{sutun].ToString(); Uygulamaniz: galistiip “Karakter Bas” diiimesine uklarsamz ekran gérintliniiz agagidaki sekilde olusacakur. Dikkat edin 4 kaydin 3. Karakteri yazdirilmak istenmistit. Buda “GUL” iin “L” harfine tekabiil etmektedir. 82 Dizilerle ilgili Diger islemler Uygulamalarnizda kullandigimz dizi degiskenler ile ilgili bilmeniz gereken énemli komutlar bulunmaktadir. Simdi sizlere bu hususlant izah etmeye galisacagum. Dizinin Eleman Sayisim Ogrenmek in kag elemandan olustugu Length le égrenilir. Tek boyutlu veya cok boyutlu olmast énem arz etmeyecektir, private void button1_Click(object sender, EventArgs e) { String{] DiziDeger = new String[10}; int Adet; Adet = DiziDeger.Length;//Kag Eleman this. Text = Adet.ToString()//Sayfa Bashginda 10 Yazar private void buttonl_Click(object sender, EventArgs e) String{] DiziDeger = new String[2,5]; int Adet; Adet = DiziDeger.Length;//Kag Eleman this.Text= Adet.ToString();//Yine 10 Yazar Eger Jagged bir dizide ayn fonksiyonu kullanursanz geriye sauir sayinz diner. Ciinkii hangi sata kag eleman atayacaginuz degiskenlik gosterecektir. 83, private void button2_Click(object sender, EventArgs e) { int(]() JaggedDizi; JaggedDizi = new int{4](); JaggedDizi[0] = new int[4]; JaggedDizif1] = new int{3]; JaggedDizi[2] JaggedDizi[2}[1] = 500; this. Text = JaggedDizi.Length-ToString();//4 yazar Fakat asagidakli sekilde “Jagged Dizi” nin indis numarasim girerseniz, o satira ait eleman sayisim 6grenebilirsiniz. Bunun anlamt “Jagged Dizi” birden fazla diziyi ig ige barndirmaktadir. private void button1_Click(object sender, EventArgs e) { int[)[] JaggedDizi; i = new int(4)[]; Dizinin Boyutunu Ogrenmek Bir Dizinin Boyutunu Ogrenmek igin Rank Kullamlr. Genellikle deger atamalarinda ig ice kullanilacak olan “for” sayisim bu deger belirlemektedir. private void button1_Click(object sender, EventArgs e) String[,,] DiziDeger = new String{2, 5,3]; this.Text = DiziDeger. Rank. ToStringQ)y/3 Yazar 84 Aynt fonksiyonu Jagged diziler igin kullanursamz geriye “1” degeri doner. private void button1_Click(object sender, EventArgs e) { int(]{,] JaggedDizi = new int{3]L,] { new int[,] { {20,80}, {30,5} }, new int{,] { {12,32}, {5,6}, {70,10} }, new int[,] { {140,800}, {700,50}, {10,90}} i this. Text = JaggedDizi.Rank.ToString()//1 Yazar Fakat asaidaki sekilde “Jagged Dizi” ye ait indis numarasim belirtirseniz, o satirin kag boyuttan olustugunu ogrenebilirsiniz. int{][,] JaggedDizi = new int{3][,] { new int[,] { {20,80}, {30,5} }, new int[,) { {12,32}, {5,6}, {70,10} }, new int{,] { {140,800}, {700,50}, {10,90}} k this.Text= JaggedDizi[1].Rank.ToString();//2 Yazar Belirtilen Dizi Boyutunun Eleman Sayism Ogrenmek Bir dizinin herhangi bir boyutunun kag elemanh oldugunu égrenmek icin GetLength kullanir. Asagida dizi degiskeninin ilk boyutunu textBox’in igine yazdirdik. Dizi cok boyutluda olabilirdi o zaman “GetLength(1)” veya daha biiyiik bir deger girilebilirdi. 85 [[ private void buttonl_Click(object sender, EventArgs e) Stringl, ,] DiziDeger = new String[2, 5, 3]; MKodlar this. Text = DiziDeger.GetLength(1).ToString0;//5 Yazar ‘Ayn fonksiyonu asagidaki sckilde Jagged diziler gin kullamrsaniz ilk satir igin calisir. Yani dizinin ilk boyutunun kag clemandan olustugunu ogrenebilirsiniz. Cunkii tammlandigi anda diger boyutlar belli degildir. private void buttonl_Click(object sender, EventArgs e) int{][,] JaggedDizi = new int{3]L.] { new int{,] { {20,80}, (30,5) }, new int{,] { {12,32}, {5,6), {70,10} }, new int{,] { {140,800}, {700,50}, {10,90}} hb this. Text = JaggedDizi.GetLength(0).ToString(),/3 Yazar Dizide Belirtilen Boyutun Ust Simrm Ogrenmek Bir dizinin herhangi bir boyutunun en ist simimint Ofrenmek igin “GetUpperBound” kullanlir. Normal sartlarda “GetLength” ile clde edilen degerin “1” eksigidir. | private void Button!_Click(object sender, EventArgs e) String[, ,] DiziDeger = new String[2, 5, 3}; WKodlar this. Text = DiziDeger. GetUpperBound(1).ToString(/4 Yazar } 86 Aynt islemi asagidaki gekilde Jagged diziler icin kullamrsamz, Sadece ilk boyut igin deger déndirebilirsiniz. Baska bir boyut girerseniz programinz calismayacaktur. private void button1_Click(object sender, EventArgs e) { int(][,] JaggedDizi = new int{3][,] { new int[,] { {20,80}, (30,5) }, new int{,] { {12,32}, {5,6}, {70,10} }, new int[,] { {140,800}, {700,50}, {10,90}} b this.Text= JaggedDizi.GetUpperBound(0).ToString();/2 Yazar “Jagged Dizi” ler ile kullanacagini komurlarda “Matrix Diziler” den biraz daha hassas davranmalisimz. Mantig: anladiktan sonra ikisiylede galigmaktan zevk alacaksiniz. 87 Struct “Struct” benzer ézellik ve methodlann aynt gati altinda toplanp bu isim yardimiyla cagrilabilmesini saglamaktadir. Ashnda bu olay “Class” lardada aymdir. Fakat aralarindan kullamm agisindan farklar vardir, “2002” Siiriimiinde “Struct” igerisinde baska bir “struct” veya “Class” tammlanamazken bu olay “2005” siiriimiinde degismistir. Bu ézellikleri “Class” a yaklastrilmistir. Kalitum islemlerinde ise “Class” lar daha gelismig ézelliklere sahiptir. Asagidaki Smek en basit anlamda, uygulamada bir “struct” tammlamanin —nasil_yapilabilece¥i anlatulmaktadir. struct Kitaplar public String KitapAdi; public String KitapYazari; cagnlabilmeleri icin “public” veya “Internal” bildirisiyle yapmalan gerekmektedir. Yukaridaki tammlamadan sonra “struct” igerisindeki degiskenlere asagidaki sekilde kolayca erigebilirsiniz. protected void Buttont_Click(object sendez, Zveat 4 xivaplar YeniRitep = new Hitapler(); yenixitap.| + *@ Equals © GettiashCode °% GelType rng Witopler.KtepAdl] Dikkat edin “Kitaplar” isimli “struct” ifadeden tiiretilen “YeniKitap” isimli de®isken yapinin igerisindeki tiim degerleri (public) kolayca kullanabilmektedir. 88 namespace Ornek2 { public partial class Form : Form { struct Kitaplar public String KitapAdi; public String KitapYazari; } private void button1_Click(object sender, EventArgs e) Kitaplar YeniKitap = new Kitaplar()://Yavru Degigken YeniKitap.KitapAdi = "ASP NET 3.5"; labell.Text = YeniKitap.KitapAdi; W YeniKitap.KitapYazari = "Nihat DEMIRLI"; label2. Text = YeniKitap.KitapYazari; Konunun analastlabilmesi igin biraz daha karmasik bir émek vermek istiyorum. fk olarak asagidaki tasarim sayfaniz iizerinde olugturunuz. (Sart Bage | Program.c | Formac Forme.cs [Design] | ici Simdi asagida verilen kod blogunu sayfaniza ait uygun olan yordamlara ekleyiniz. namespace Ornek2 public partial class Form2 : Form { private void button1_Click(object sender, EventArgs e) { Kitaplar YeniKitap = new Kitaplar(); ‘YeniKitap.KitapAdi = textBox1.Text; YeniKitap.KitapYazari = textBox2.Text; YeniKitap.KitapFiyat = Convert. ToDecimal(textBox3.Text); textBox4.Text = YeniKitap KitapKdv.ToString(); textBox5.Text = YeniKitap KitapToplam.ToString(); } struct Kitaplar { public String KitapAdi; public String KitapYazari 90 public Decimal KitapFiyat; public Decimal KitapKdv { get { Decimal Deger; Deger = (Decimal)KitapFiyat * 0.15M; return Deger; } } public Decimal KitapToplam { get { Decimal Deger; Deger = KitapFiyat + KitapKdv; return Deger; private void Form2_Load(object sender, EventArgs e) { textBox4.Enabled = false; textBox5.Enabled = false; this. Text = "ZIRVEDEKi BEYINLER"; Sayet parasal veri igeren kontrolleri formatlamak isterseniz. kodu asaidaki sekilde degistirmeniz yeterli olacakur. 91 private void buttonl_Click(object sender, EventArgs e) { Kitaplar YeniKitap = new Kitaplar(); 7] YeniKitap.KitapAdi = textBox1.Text; YeniKitap.KitapYazari = textBox2.Text; YeniKitap.KitapFiyat = Convert. ToDecimal(textBox3.Text); W textBox4.Text YeniKitap.KitapKdv.ToString("#,##.00 TL"); $u asamada biraz air olabilir fakat, Formatlama igleminizide “struct” igerisinde yapunrsamz cok daha giizel olacaktr. Bu sayede program icerisinde yazilacak olan kodlar daha az olacak, programct size daha fazla tesekkiir edecektir. Simdiki kodlara bakacak olursanz formatlama iglemide “struct” igerisinde yaptinldigi igin, programcs igin sadece deger atayip almaktan baska yapacak bir sey kalmamishr. Sizde yazacagimz “Dil” dosyalari igerisinde miimkiin oldugu kadar programetyt uygulamada zorlamayacak sekilde kodlama yaparsamz, takdir alirsimz. _ {CR.NET 35 [Nhat DEMIR namespace Ornek2 public partial class Form2 : Form { private void button1_Click(object sender, EventArgs e) { Kitaplar YeniKitap = new Kitaplar(); YeniKitap.KitapAdi = textBox|.Text; YeniKitap.KitapYazari = textBox2.Text; YeniKitap.KitapFiyat = Convert. ToDecimal(textBox3.Text); textBox4.Text = YeniKitap KitapKdv.ToString(); textBox5.Text = YeniKitap.KitapToplam.ToString(); } struct Kitaplar { public String KitapAdi; public String KitapYazari public Decimal KitapFiyat; public String KitapKdv { get Decimal Deger; Deger = (Decimal)KitapFiyat * 0.15M; 93 return Deger.ToString("#,##.00 TL"); } t public String KitapToplam get { Decimal Deger; Deger = (Decimal)KitapFiyat * 1.15M; return Deger.ToString("#,##.00 TL"); } + } private void Form2_Load(object sender, EventArgs e) textBox4.Enabled = false; textBox5.Enabled = false; this. Text = "ZIRVEDEKI BEYINLER"; Struct ifadelerde Constructor Struct bildirilerinde aynen siniflarda oldugu gibi parametrelerinizi constructor igerisinde bildirebilirsiniz. Bu size extra bir method gagirma zorunlulugundan kurtaracakur. Bazi programetlar class aliskanhklar geregi cotructor igerisinde parametre bildirmeyi daha fazla tercih edebilirler. Simdi sizlere bu iglemin nasil yapilabilecegini gésterecegim, Konunun anlasilabilmesi igin asagidaki iki kod grubunu dikkatlice karsilastirmanizi istiyorum. namespace Ornek2 public partial class Forml : Form { 94 struct Kitaplar { public String KitapAdi; public String KitapYazari; } Ozelliklere Deger Aktarilarak Cagriliyor private void button]_Click(object sender, EventArgs e) { Kitaplar YeniKitap = new Kitaplar();//Y avru Degisken YeniKitap.KitapAdi = " C# NET3.5"; labell. Text = YeniKitap.KitapAdi; W ‘YeniKitap.KitapYazari = "Nihat DEMIRLI"; label2. Text = YeniKitap.KitapY azari; Simdide agagidaki kod bloklarim inceleyin. namespace Ornek2 public partial class Form : Form struct Kitaplar public Kitaplar(string Ad, string Yazar) { KitapAdi = Ad; KitapYazari = Yazar; } public String KitapAdis public String KitapYazari; } 95 11Bu Cagurma iglemine dikkat private void button1_Click(object sender, EventArgs e) { Kitaplar YeniKitap = new Kitaplar("C# NET 3.5", "Nihat } DEMIRLI"); labell Text = YeniKitap KitapAdi; label2.Text = YeniKitap Kitap Yazari; Bu iki kodlamanin yaptigi ig neredeyse tamamen aynidir. Fakat caginrken kullandigmz kodlamanin fark olduguna dikkat ediniz. Constructor sayesinde prosediir icerisinde ézelliklere deer atamasi yapmak zorunda degilsiniz. Yine belirtmekte yarar gériiyorum, constructor _igerisinde dilediginiz kadar fark parametre belirleyip kullanabilirsiniz. Burada belirlenen bir kisitlama bulunmamaktadir. Enum Objeleri matematiksel olarak ifade edebilmek amagh kullanilan tanimlama segenegidir. Bu sayede bilgisayara sayisal anlam olmayan degerleri sirah bir sekilde ifade edebilirsiniz. Arkadaslar, bilgisayar “1” den sonra “2” nin gelecegini bilir, fakat kitaptan sonra defterin gelecegini veya arabadan sonra evin gelecegini en giizel sekilde bu tammlamayla izah edebilirsiniz. Yani Kitaba “1”, Deftere “2” degerini verirseniz bu iligkiden faydalanarak aradaki bagi kolayea olusturacaktrr. Burada belirtmekte yarar gériyorum, renklere verilen degerler “1- 2-3” siralamasina uygun olmak zorunda degildir. Daha farkh degerler verebilirsiniz. $imdi asada tanimlamaya ait mek verilmektedir. namespace Ornek2 { public partial class Form3 : Form enum Renkler Renkler YeniRenk; Color[] RenkDizi 7 private void button1_Click(object sender, EventArgs e) listBox1.BackColor = RenkDizi[(int)YeniRenk++]; private void Form3_Load(object sender, EventArgs e) RenkDizi[0] = Color.Red; RenkDizi[1] = Color.Blue; RenkDizi[2] = Color. Yellow; Wt YeniRenk = 0; Omek uygulamamizi galistirdiginiz zaman, “Button” kontroliine her tklayigimzda “TextBox” nesnesine ait zemin rengi degigecektir. Sadece “3” renk tanmladigimiz igin dérdinci uklamada_projeniz karilacaktir. Kodu asaiidaki sekilde degistirirseniz. her defasinda yeniden renk almaya baslayacaktr. private void button1_Click(object sender, EventArgs e) JistBox 1.BackColor = RenkDizi[(int)YeniRenk++%3};, } Artik “3” sayisma gére mod almacak, projeniz kesinlikle larilmayacakur. Asagida daha deBisik bir mek verilmeye galisilmistr. Dikkatlice takip ediniz. namespace Ornek2 public partial class Form4 : Form 98, enum HaftaninGunleri Pazartesi = 0, Sali= 1, Carsamba = 2, Persembe = 3, Cuma = 4, Cumartesi = 5, Pazar = } private void button1_Click(object sender, EventArgs e) { Type Gun = typeof(HaftaninGunleri); foreach (string Bugun in Enum.GetNames(Gun)) listBox1 Items.Add(Bugun); Enum ifadesi ile tanmlama yaprldiktan sonra kod editériiniizde asagidaki sekilde bir goriintii olusturabilirsiniz. 99 > enum HaftaninGunleri { Pazartesi = 0, Sali = 1, Cersenba = 2, Persenbe = 3, Cuma = 4, Cumartesi = 5, 6 Pazar y a private void buttoni_Click(object sender, Eventi ( & 7*Type Gun (Cae ninGunler i) : foreach (strijg® cums” (Enum. GetNames (Gun) ) t i? Cumartesi ListBox1. a pezer Jorun) ; ae GP Pazartes| a? Persembe > iP Sob Asagidaki mek uygulamada girilen tarih degerinin hangi giine kargihk geldigi “enum” bildirisiyle kolayca 6grenilebilmektedir. namespace Ornek2 { public partial class FormS : Form { enum HaftaninGunleri { Pazartesi = 0, Sali =1, Carsamba = 2, Persembe = 3, Cuma = 4, Cumartesi = 5, 100 Pazar =6 } private void button1_Click(object sender, EventArgs e) HaftaninGunleri Bugun; DateTime Tarih; String Deger; int Sayi; textBox1.Text; ‘onvert, ToDateTime(Deger); int)Tarih. DayOfWeek; Bugun = (HaftaninGunleri)Sayi; Jabel2.Text = "Girilen Tarih " + Bugun.ToString() + " Giiniine Bu asamadan sonra uygulamamz: galistirip “TextBox” kontrolit igerisine hethangi bir tarih girin. Diigmeye ukladiktan sonra label iizerinde o giine ait ismin yazdhgim goreceksiniz. 101 Enum Class’ma Ait Kullanilabilir Methodlar Tammladigamz “enum” blogu degiskenine ait kullanabileceginiz bir cok 8zellik mevcuttur. Simdi sizlere bu hususu aktarmak istiyorum. Deferlerin isimlerini dgrenmek icin “GetNames” methodundan faydalanabilirsiniz. enum HaftaninGunleri { Pazartesi = Sali = 1, Carsamba = 2, Persembe = 3, Cuma = 4, Cumartesi = 5, Pazar =6 private void buttonl_Click(object sender, EventArgs e) Type Tipler = typeof(HaftaninGunleri); string[] Deger; Deger = Enum.GetNames(Tipler); foreach (string Eleman in Deger) listBox1.Items.Add(Eleman);//Ekle Asagidaki Smek uygulamada sayisal degeri verilen sarin ismini kolayca égrenebilirsiniz. 102 enum HaftaninGunleri Sali = 1, Carsamba = 2, Persembe = 3, Cuma = Cumartesi = 5, Pazar = 6 } private void Button2_Click(object sender, EventArgs e) { ‘Type Tipler = typeof(HaftaninGunleri); string Deger; Deger = Enum.GetName(Tipler, 4)//Cuma Yazar this. Text = Deger; Asagidaki Smek uygulamay: kullanarak “enum” _ ifadesi igerisindeki degeri kolayca yazdurabilirsiniz. pe Tipler = typeof(HaftaninGunleri); string Deger; Deger = Enum.Format(Tipler, HaftaninGunleri.Cuma, "d"); Text = Degery/4 Yazar 103 BOLUM 3 C# .NET 3.5 ATAMA ISLEMLERI C# .Net 3.5 Operatérleri Islemlerinizi gergeklestrebilmek amaciyla “C#” igerisinde tanh olarak kullanilan bir cok operatér bulunmaktadir. Simdi sizlere bu operatérleri ve islevlerini anlatacagim. SSeS SS ——— a a EsitDexil_ | while(a!=20) Veya I [__ Manuksal Veya && Ve While (a==20)&8(a>10)| & |L__ Manuksal Ve es | 252 | << D SS til Soladtele _ If 24<<2 Cee Topla At=10 ee | Bol A/=10 [ Sola Otele Ace=2 Saga Otele Mod > Biiyaktiir While(a>20) < ] Kitgiktiir [ whitea20) 107 ive rs | Atama {slemlerine Ornekler xt X=K+1; x ‘in énceki degerine 1 ekleyerek tekrar x’e atar. Eger x++ bir degiskene aktarilirsa aktarilan degiskenin degeri x’e esit olur yalntz x’in degeri “1” artar. private void button1_Click(object sender, EventArgs e) int Deger=20; int Sonuc; Sonue = Deger++; labell.Text = Deger.ToString();/21 label2. Text = Sonuc.ToString();//20 44x? x=xt]; x’in Onceki degerine 1 ekleyerek x’e atar. Bger ++x bir degiskene aktarrsa aktarlan degiskenin degeri x’in (1) fazlasidir, x’in degeri de bir artar. Omeklere bakarak ikisi arasindaki farki anlamaya caligin. private void button1_Click(object sender, EventArgs e) { int Deger=20; int Sonue; Sonuc = ++Deger; 108 label .Text = Deger.ToString();//21 label2,Text = Sonuc.ToString();//21 x=x-1; x ‘in Snceki degeri 1 azalarak tekrar x’e atanir. Eger x-- bir degigkene aktarilirsa aktarilan degiskenin degeri x’e esit olur yalniz x’in degeri (1) azabir. private void button1_Click(object sender, EventArgs e) int Deger = 20; int Sonuc; Sonue = Deger--; labell Text = Deger.ToString();//19 label2. Text = Sonuc.ToString();//20 XK: xex-l x ‘in Onceki degeri 1 azalarak tekrar x’e atar. Ber —x bir degiskene aktanlirsa aktanlan defiskenin degeri x’in (1) eksigi olur. yalmz x’in degeri de (1) azalir. private void button1_Click(object sender, EventArgs e) int Deger = 20; int Sonuc; Sonue = --Deger; label Text = Deger.ToString0y//19 label2. Text = Sonuc.ToString)/19 xteS: X=x+5; x’in degerine 5 eKleyerek x’e atamr. Aynt mantikla a+=b yazarsak a’nin degerine b’nin deerini ekler ve sonucu a’ya atar. xin degeri 5 azalarak x’e atamir, Aymt mantikla a-=b yazarsak a’nin degerinden b’nin degerini gikanir ve sonucu aya atar. XEx*5; x’in degerini 5 le carparak x’e atar. Aym manuikla a*=b yazarsak a’nin degerine b’nin degeriyle garpar ve sonucu a’ya atar. { int Deger | 110 Deger *= 10; this. Title= Deger. ToString();//200 Yazar } xex/5; x'in degerini 5’e biilerek x’e atar. Aynt manuikla a/=b yazarsak a’nin degerini b’nin degerine béler ve sonucu aya atar. private void button1_Click(object sender, EventArgs e) { int Deger Deger /= this. Text = Deger.ToString();//2 Yazar 20; xext25; x’in degerini 2°nin S*inci kuwvetiyle garpar, sonucu x’e atar. Kodu dikkatlice inceleyiniz. private void button5_Click(object sender, EventArgs e) Deger.ToString(),//192 Yazar x=x/25; xin degerini 2’nin S'inci kuvvetine béler, sonucu x’e atar. Dikkatlice takip ediniz. m1 int Deger = 24; Deger >>= 3; this. Text= Deger.ToString();//3 Yazar x%=5: x=x mod 5; x'in degerini S'e béler, kalam x’e atar. Kodu dikkatlice inceleyiniz. [ private void buttoni_Click(object sender, EventArgs e) Sayilari Bitlerine Erismek Oteleme operatérlerini kullanarak sayrlarin (veya karakterlerin) “pit” degerlerine kolayca erigebilirsiniz. }] private void button1_Click(object sender, EventArgs e) { byte Deger:Byte Bit; Deger = Convert. ToByte(textBox1.Text); label. Tex ; for (int i= 0;i Bit = (byte)(Deger >> i & 1);//Mantiksal Ve label. Text += Bit.ToStringQ); } labell.Text = "Sayinin Bitleri=" + Labell.Text; Bu asamadan sonra uygulamanizi alistirmp “Bit Géster” diigmesine tuklayabilirsiniz. “TextBox” igerisindeki sayimin “bit” kargihklari “Label” igerisinde yan yana gésterilecektir. Formé Karakterlerin Bit Kargihklarina Erismek Karakterlerin sayisal karsiiklarinin “Ascii” degerleriyle ifade edildigini belirtmek isterim. Bu deger rakamlarla ifade edilmektedir. Bu yiizden her karakter dncelikle “Ascii” degerine déniistiriiltir, ardindan bellege yazdinihr. Asagidaki drmek uygulama bu hususa deginmektedir. private void button1_Click(object sender, EventArgs e) { Char Deger; Byte Bit, KarakterAscii; Deger = Convert. ToChar(textBox1.Text); KarakterAscii = (byte)Deger; labell.Text = null; 113 for (int 8; i++) Bit = (byte)(KarakterAscii >> i & 1); Jabell.Text += Bit. ToString(); } labell.Text = "Karakterin Bitleri=" + labell Text; Uygulamay: ¢ahstinp yukaridaki sekilde “TextBox” icerisine iz karakteri girin, “Bit Gdster” diigmesine tklarsamz ekran goriintiintiz yukaridaki sekilde olusacaktr (bitler ters yazdirilmistir). 14 BOLUM 4 FONKSIYON & PROSEDURLER Fonksiyon ve Prosediir’ler Prosediir ve fonksiyonlar biitiin bilgisayar dillerinde énemli yer tutmaktadirlar.- Sebebi basittir, gok kullanilan kodlari ézel bir bloga yazarak, her defasinda aym kodlan uygulamanizda yazmazsiniz. Bu sayede hem zamandan kazam, hemde hata yapma sansimzi minimuma indirirsiniz. Fonksiyonlarla prosediirler arasindaki fark geriye deger dondirme olayiyla agiklansa da aslinda olay tam olarak dyle degildir. Oncelikle fonksiyon geriye defer déndiiriir dogru ama isterseniz prosediirlede uygulamaya istediginiz kadar deger alabilirsiniz. Herleyen konularda bu hususlara bolca dmekler verilecektir. Prosediir Tanmmlamak Prosediirler “void” ile deklare edilen kod bloklarmdan olugur. Fonksiyonlardan farklari herhangi bir degiskene esitlenmemelerinden kaynaklanmaktadir. Uygulamaniza ait Kontrollerin — kullandiklari yordamlar, aslnda birer prosediirden ibarettir. Yalnz dikkat edin, bu 6zel yordamlar kendilerine has parametre igeririler. Oncelikle formunuzun iizerine bir adet “Button” kontrolti siiriikleyerek iizerine Mouse ile cift uklayin, Asagidaki sekilde bir blok otomatik olarak “C#” tarafindan olusturulacaktir. private void Button_Click(object sender, EventArgs e) { WKodlar Dikkat edin, eklenen prosediiriin ismi “button1_Click” olarak “C#” tarafindan belirlenmistir. Bu asamada Source kod sayfasinda asagidaki sekilde bir saur otomatik olarak eklenecektir. Omek igin “Button!” kontroliine tiklanildigi zaman “button|_Click” prosediiriiniin igletilmesinin sebebini dgrenek icin “Solution Explorer” penceresinde yer alan “Form1.Designer.cs” dosyasinin iizerine Mouse ile cift uklayin. nT ‘od Solution ‘OrnekFonk (1 project) 2 Gl omekFonk Gay Properties fh il References rormtcs 2 93 Form esx @ Progam.cs Agilan dosyada yer alan InitializeComponent prosediri igerisinde olusan button!” kontroliine ait kod satirlarma dikkat edin. private void InitializeComponent() { this.buttond = new System. Windows.Forms.Button(); this.SuspendLayout(); HW / button! W this. button! Location = new System.Drawing Point(13, 32); this. button! Name = "button1"; this. button1 Size = new System.Drawing.Size(75, 23); this. button! TabIndex = 0; this.button1.Text = "button1"; this. button] Use VisualStyleBackColor = true; this.button1.Click += new System. EventHandler(this.button1_Click);//Bu Satur Sayesinde Us / Digerleri " Simdi formunuza ait “Button” kontroliine ait yordami asagidaki sekilde degistirin, 18 private void DugmeyeBasildi(object sender, EventArgs e) { this. Text "Faruk CELIK"; Dikkat edin — “Button_Click” olan prosediir_—_ismi “DugmeyeBasildi” olarak degistirilmistir. Simdi aym digmeye tiklandigt zaman buradaki kodun igletilebilmesi. igin “FormDesigner.cs” dosyasinda asagidaki degisikligide yapmak zorundasimz. private void InitializeComponent() { this.button = new System.Windows.Forms.Button(); this.SuspendLayout(); Mutton this.button1 Location = new System.Drawing Point(13, 32); this.button1.Name = "button"; this.button Size = new System.Drawing.Size(75, 23); this. button .TabIndex = 0; this.button1.Text this. button] .UseVisualStyleBackColor = true; this.button1.Click += new System. EventHandler( this, DugmeyeBasildi);//Burasida Degigecek Ark uygulamanizi caligtirabilirsiniz, “Button” kontroliine her tuklayrsimzda bashk asagudaki sekilde igerik alacaktur. 19 Kontrol Yardamlarmnda Kullamilan Parametreler Kontrollere ait Yordamlarda zel_parametrelerin oldugu gériilmektedir. $imdi bu parametreleri sizlere izah etmeye galsacagim. Oncelikle bu paramatreleri bir g6relim. | private void button|_Click(object sender, EventArgs e) Dikkat edin “sender” ve “e” isminde iki farkli degisken otomatik olarak olusturulmustur. Yeri gelmisken belirtelim, prosediirleriniz igerisinde “e” diye bir degisken tantmlamasi yapmayin dememizin sebebi zaten burada var oldugu igindir. Parametrelerin _isimlerini defistirebilirsiniz. Herhangi bir sorun gikmayacaktir. Fakat dikkat edin yazacagimiz kodlarda artik bu parametre isimlerini kullanmalisimz. button! _Click(object Nihat, EventArgs Yuksel) Oncelikle “object sender” parametiesini_izah__edelim (degistirildikten sonraki isimde aym seyi yapacaktir. “Sender” parametresini anlamantz igin formunuzun tizerine yeni bir “Button” Kontrolii daha yerlestirin.ikinci Button Kontroliintin “Properties” penceresinde yer alan Simsek diigmesine uKlayarak asagadaki sekilde “Click” yordamina “buttonl_Click” prosediiriinii gosterin. Pie | button? System. Windows.Forms.Bi = — 5 uuttont_Click =] 4] GlentSizec! i Context Controladded ControlRemove pat Click 120 Yukaridaki adimdan sonra o form ait “Designer.cs” dosyasina bakarsaniz, asagidaki sekilde bir satirm eklendigini géreceksiniz. {ki diigmede “Button _Click" yordamum géstermektedir. private void InitializeComponent() iv I button MW this.button1.Click += new System.EventHandler(this.button1_Click); W H button2 MW this.button2,Click += new System. EventHandler(this.button1_Click);//Dikkat button1_Click W Dikkat edin bilgisayar “Button2” kontroliine uklandigi zaman “buttonl_Click” yordamim: isletecektir. Simdi gelelim asil olaya, iki “Button” da aym prosedtirii igletecekse “C#” olay: gerceklestiren kontrolii nasil ayirt edecektir. iste “sender” bu ise yaramaktadhr. Asagida, “Button2” kontroliine ait “Click” yordaminn, daha énce “Button!” tarafindan olusturulan “button]_Click” yordamina nasil yonlendirilecegi gésterilmektedir. private void buttoni_Click(object sender, EventArgs e) { if (sender == button1) { labeli .Text="{Ik Diigme"; } 11 Verilen kodlar1 ckledikten sonra iki diigmeyede basin. Ekran gériintiileri asaidaki sekilde olusacaktr. Sayet parametrelerin isimlerini de@istirdiyseniz,_kodunuzu asagidaki sekilde kullanabilirsiniz. Higbir mahsuru yoktur. Hatta daha anlasiir bir kod blogu elde etmis olursunuz. private void button1_Click(object Nihat, EventArgs Yuksel) { if (Nihat == button!) labell Text="iIk Diigme"; } else if (Nihat == button2) label. Text="Ikinci Diigme"; ikinci olarak kullanilan “e” parametresi ise ilerleyen béliimlerde izah edilecektir. 122 Kullame: Tanimh Prosediir Olusturmak Bir programct igin uygulama igerisinde prosediir olusturmak son derece énemlidir. Dedikya aym kodlarin tekrar tekrar yazdirilmasindan bu sayede kurtulabilirsiniz. Simdi sizlere bu prosediirlerin nasil olusturulabilecegini gosterecegim. private void lesaj() { WKodlar } Yapilan islem sudur. Programe: “GaziMesaj” isminde bir prosediir olusturmustur. Bu ismi kullanarak istedigi bir anda bu bloktaki kodlar: isletebilir. private void GaziMesaj() { } private void button1_Click(object sender, EventArgs e) { } this. Text="Zirvedeki Beyinler"; GaziMesaj();/Prosediiri Galisur Uygulamay: calistirdiktan sonra uygun olan “Button” kontroliine tuklarsaniz ekran gériintiiniiz yukaridaki sekilde olusacaktr 123, Prosediirler tanmlanirkan asagidaki hususlara dikkat etmelisiniz. Yoksa sonug basariz olacaktr. Prosediirler “void” bildirisiyle tanumlanir. © Diger Formlann veya Classlarin kullanmasi istenirse Public ‘le (internal) Sadece Bu formun kullanmas1 iginse Private ile tammlanr. Eger isim kullanilmazsa Private olarak algilanir. Prosediiriiniize Diizgiin Bir isim vermelisiniz. ‘Aynt isimle birden fazia prosediir tanmlayabilirsiniz. Fakat bilgisayarin bunu anlayabilmesi igin en az bir parametre sayisi veya tipi degisik olmalidir.. Parametre igeren Prosediir Tanmlamak Asajudaki émek uygulamada olusturdugunuz proseditr igerisinde nasil parametre tanmlayabileceginiz gésterilmektedir. Bu sayede program igerisinden géndereceginiz degerler ile prosediirii isletebilir, uygun sonuclart elde edebili Snceki prosediire ait kod blogunu asagidaki sekilde yeniden diizenleyin. private void GaziMesaj(string Deger) { + private void buttont_Click(object sender, EventArgs e) { this.Text= Deger; String Deger; Deger = textBox1.Text; GaziMesaj(Deger); } Simdiki uygulamada “Button” kontroliine tklamadan énce “TextBox” icerigine prosediire génderecegiiniz deferi girmelisiniz. Ekran goriintiisiine dikkat edin, formun bashginda gonderdiginiz parametre degeri yer almaktadir. 124 JFaruk CELIK Birden Fazla Parametreli Prosediir Olusturmak Olusturdugunuz prosediir igerisinde parametre sayisimn birden fazla olmast higbir sorun gikarmayacaktur. Kolayca tanumlayabilirsiniz. _ lI Tayi EROOGAN Bapboken AdieT ayyip ERDOGAN. erie BET EAE Mualefet-Deniz BAYKAL Uygulamay: alistirdiktan sonra sayfa izerindeki_ uygun boliimlere degerlerinizi_girin. “Géster” diigmesinden sonra ekran gortintniiz. yukaridaki sekilde olusacaktr. private void GaziMesaj(String Bashakan, String AnaMuhalefet) { labell Text = "Basbakan Adi=" + Basbakan; Jabel2.Text = “Muhalefet=" + AnaMuhalefet; private void buttonl_Click(object sender, EventArgs e) GaziMesaj(textBox1.Text,textBox2.Text); } 125 Dizi Parametreli Prosediir Tanmlamak Prosediire génderilecek olan parametreler dizi igerikli olabilir. Bu sayede bir cok deger hesaplamalarim da yaptirabilirsiniz. Gergekten parametrelerin dizi ile bildirilmeleri sizlere gok zel_imkanlar saglayacakur. Hemen gosterelim. Simdi amacimuz birinci listede yer alan isimlerin basina akademik iinvanlart ekleyerek ikinci listede yerlerini almalarim salamak olacaktir. namespace OrnekFonk { public partial class Formd : Forin private void AkademisyenGoster(Object[] OgrUyeleri) foreach (Object Eleman in OgrUyeleri) string Deger; Deger = Convert. ToString(Eleman); listBox2.Items.Add('Prof. Dr.” + Deger); private void button1_Click(object sender, EventArgs e) { int Adet; Adet = listBox! Items.Count;//Eleman Sayisim Al ‘Object[] DiziEleman = new Object[Adet}; for (int i = 0; i <= Adet - 1; i++) { DiziEleman{i] = listBox1.Items{i]; } AkademisyenGoster(DiziEleman),/Prosediirii Islet Parametre Olarak Matrix Dizi Kullanmak Olusturacagimz proseditrler igerisinde “Matrix” —dizileride kullanabilirsiniz. Bir gok projenizde bu hususa yer vermek zorunda kalacaksmiz. Sebebi basitir, muhtemelen bir cok koleksiyon degerini bloga sokup sonug degerini isteyeceksiniz. Buda ancak gésterecegimiz yontemle gergeKlesebilecektir. Simdi bu hususu émeklendirecegim. Dikkatlice takip ediniz. 127 [namespace OrnekFonk public partial class Form4 : Form: private void DegerGoster(int{,] DiziDeger) System. Collections.IEnumerator DiziOku = DiziDeger.GetEnumerator(); int Toplam = 0; while (DiziOku.MoveNext() { int Deger; Deger = Convert.ToInt32(DiziOku.Current); Toplam += Deger; } MessageBox Show("Toplam=" + Toplam); } private void button2_Click(object sender, EventArgs e) int[,] Dizi = new int[,] { { 10, 20, 30 }, { 100, 101, 102 } }; DegerGoster(Dizi);//Prosediirit Istet me =| | Toplam=363 Dikkat \edin génderilen deferlerin toplam mesaj_ olarak kullanctya gésterilmektedir. 128 Prosediirlerin Agni Yi Jenmesi Class igerisinde bazi durumlarda aymi isimle birden fazla proseditr tanimlayabilirsiniz. Dogrusunu isterseniz béyle bir zoruntuluk olmamasina ragmen opsiyonel parametreli durumlarin olmasi gereki zamanlar methodlarin gok anlasilir olmasin saglamaktadir. Oncelikle asajadaki yaprya dikkatinizi gekmek istiyorum. 4 private void buttonl_Click(object sender, ( Nessagefox. show f fast of 21% DialogResult MessageBox, Show (string tent) text: The text to display in the message box. “MessageBox” nesnesine ait “Show” isimli asin yiiklenmis “21” adet methodu yazilmistr. Aym isimle dilediginizi Kullanabilirsiniz. Hangisini isletecegine parametrelerin sayisina ve tipine bakarak karar verecektir. Buradan su anlam gikmaktadir. En az bir parametrenin tip veya sayilart fark olmalidir. Simdi ayn. mantigi birde olusturmayt deneyelim. Asagidaki kod blogunu uygulamanizda olusturun. private void Topla(int x, int y) ‘ int Sonuc = x + yz dessageBox.Show("Iki Sayinin Toplami=" + Sonuc.Tof > private void Topla(int{] Dizi) t int Sonuc=0 ; foreach (int Eleman in Dizi) ‘ Sonuc += Elemen: ) MessayeDox.Show("Koleksiyonun Toplema=" + Sonuc.Te > private void button _Click(object sender, Eventirgs e) « Toplaip, 3) [M2 oF Ze void Forms. Topla Gnt x, my) 129 En alttaki balon mesaja dikkat edecek olursaniz iki adet “Topla” isimli prosediiriin yazilmis oldugunu _goreceksiniz. Hangisinin cagrilacagina géndereceginiz parametreler karar verecektir. Sayet “int” tip tek parametre ile isletirseniz ilk prosediir, int tip dizi parametreli olarak isletirseniz ikinci prosediir cagnlacaktir. Ref Prosediire ginderdiginiz degigkenin degeri, prosediir icerisinde ona karsihk gelen degiskene aktarilacakur. iste bu degiskenin degerinin prosediir igerisinde degismesi durumunda uygulamadan ona génderilen degiskeni etkilemesi isteniyorsa o degiskenin “ref” bildirisiyle deklare edilmesi gerekmektedir. Bu manu gelistirerek prosediir igerisinden istediginiz kadar degiskeni uygulamanuza alabilirsiniz. Oncelikle basit bir ‘mek verelim. namespace OrnekFonk { public partial class Form6 : Form { private void MesajVer(ref String Sehir) { MessageBox.Show( Sehir ); Sehir = "BURSA"; } private void button1_Click(object sender, EventArgs e) String MesajDeger; MesajDeger = "IZMIR"; MesajVer(ref MesajDeger); this. Text = MesajDeger://BURSA Yazar Bu omekte prosediir parametre degeri olarak “IZMIR” gonderilmistir, Bu deger mesaj olarak kullameinin karsisma aynen 130 ikacakur. Prosediir igerisinde bu deger “BURSA” olarak degistirildigi ve “ref” ile bildirildigi igin son deger uygulamaya dénecek, formun bashiginda “BURSA” yazacakt. Omekte prosediir igerisindeki degisken “ref” ile bildirilmeseydi, Mesaj olarak “iZMIR” bildirilecekti. Aymi sekilde buradaki deger degisimi uygulamay: etkilemeyecegi igin formun bashjinda da “IZMIR” yazacaku, Belirtmekte yarar gériiyorum, prosediir igerisinde “ref” ile belirlenen parametreye uygulamadan yine “ref” bildirisini kullanarak deger yollayabilirsiniz. Aksi takdirde uygulamaniz galismayacakur, Yine ikinci bir uyart, prosediirler igerisindeki dizi degisken parametreler otomatik olarak ref bildirili davrams gésterirler. Out Olusturdugunuz prosediir igerisinde, uygulamadan génderdiginiz bir degerin kesinlikle bir degiskene aktarlmasim istemiyorsaniz (Atamalarda egitlik karakterinin saginda kullaniimasi durumu) o deiskeni prosediir igerisinde “out” bildirisiyle deklare etmeli, uygulamadan génderilecek parametrenin baginda yine “out” bildirisi girilmelidir. Asagidaki bir kullamim bu agidan hata ile sonuglanacaktr. private void Mesaj Ver(out String AdiSoyadi) { String GelenVeri; GelenVeri = AdiSoyadi;//Hata ‘AdiSoyadi = "Ayse DEMIRLI"; } private void Button2_Click(object sender, EventArgs e) { String Deger; Deger = "Nihat DEMIRLI"; MesajVer(out Deger); Belirtmekte yarar gériiyorum, prosediir icerisinde bu degiskene deger aktarilabilir, bu islem hata vermeyecektir. BI private void MesajVer(out String AdiSoyadi) { AdiSoyadi = "Ayse DEMIRLi";//Hata Yok } private void Button2_Click(object sender, EventArgs e) { String Deger; Deger = "Nihat DEMIRLi"; ‘MesajVer(out Deger); } Params Génderilecek olan degiskenler dizi olarak de@il birden fazla degisken ismiyle yapilacaksa “params” bildirisinden faydalanabilirsiniz. Asajidaki Omekte bu husus islenmektedir. System.Collections.[Enumerator DiziOku =AdiSoyadi.GetEnumerator(); while (DiziOku.MoveNext()) { String Deger; Deger = (String)DiziOku.Current; Response. Write(""); } t private void Button_Click(object sender, EventArgs e) { String Bir, Iki, Uc, Dort; "Nihat DEMIRLi Iki = "Ayse DEMIRLi": "Yiiksel INAN"; ‘Sibel YANAR"; IsimGoster(Bir, Iki, Uc, Dort); “{simGoster” prosediiriinii cajsrirken Kullanilan parametrelerin dizi degisken de@il, birden fazla degisken ismi olduguna dikkat ediniz. Burada bir esnekligi géziiniirden kacumamanizi istiyorum. Biz ‘rnegimizi “4” parametreyle islettik. Siz dilerseniz “3” veya daha degisik bir saytyla da isletebilirdiniz. Génderdiginiz. parametreler hangileriyse ona gore prosediir isletilecektir Asagidaki dmnek ise giinlUk yazdigmz bir gok kod igerisinde karsilasabileceginiz. bir durumdur. Oncelikle verilen ekran gériintisiinti olusturunuz. ston Simdi asagidaki kod saturlarm uygulamaniza ekleyin. using System.Collections;//Ekleyin namespace OrnekFonk { public partial class Form7 : Form { ArrayList Dizi = new ArrayList(); private void KelimeleriBul(params Char{] Karakterler) { Dizi.Clear(); int IIk, Son; String Kelime; string Deger = textBox1.Text: 133 Tk =0; . for (int i = 0; i <= Deger.Length - 1; +++) for (int j = 0; j <= Karakterler.Length - 1; j++) { if (Karakterler{j] == Degerfi]) { Son =i; Kelime = Deger.Substring(IIk, Son - IIk); Dizi.Add(Kelime); Tk = Son; private void button1_Click(object sender, EventArgs ¢) MextBox1.Text = "Gazi Universitesi Miihendislik Mimarhk Fakiiltesi "; KelimeleriBul(’’, *); for (int i = 0; i <= Dizi.Count - 1; i++) listBox1 Items.Add(Dizi{i].ToString()); Bu asamadan sonra uygulamanizi ¢alisturabilirsiniz. TextBox igerisine metni girdikten sonra Bul diigmesine tklarsaniz girmig oldugunuz metin bosluk, nokta, virgiil, iki nokta tist iiste, tire, alt cizgi veya yildiz karakterine gore kelimelere ayrilacaktir. Uygulama calistiktan sonra ekran gériintiisii asagida verilmistir. Dikkat ‘edin bosluk Karakterine gre kelimeler _birbirlerinden ayrigurilmasuir. 134 Simdi TextBox igerisindeki metni asaidaki sekilde degistirerek sayfay: yeniden yiikleyin. Dikkat edin bu sefer metin igerisindeki kelimeler “.” Karakterine gre ayrigurilacakur. 135 i Fonksiyon Tammlamak Fonksiyonlar olusturulma agisindan prosediirlere ok benzerler. Proseditrler Konusunda dikkat ettiyseniz higbir tanesi deiskenlere esitlenmemistir. Ama fonksiyonlar bir degiskene (veya dizi degiskene) esitlenenrek direk deger alabilmektedir. | private Double FonksiyonHesapla(int Iksayi,int SonSayi,int Ara) | { MFonksiyona Ait Kod Blogu return Degisken * Fonksiyonda aynen Procedure gibi Private veya Public ‘le tanmmlanr (Internal veya Private). © Uygulamaya déniis degeri muhakkak “return” ile belirtilmelidir. * Fonksiyona isim verilir. (Bizim émegimizde FonksiyonHesapla) * Fonksiyon adindan sonraki Parantez icerisinde fonksiyonun kullanacaji parametreler tipleriyle belirtilir. * Fonksiyonun geri déniis degerine ait tip, fonksiyonun isminden hemen énce bildirilmelidir (Bizim dmegimizde Double) private Double FonksiyonHesapla(int Hksayi, int SonSayi) { My=2x*x45*x410 Double SonDeger; SonDeger = 2 * Iiksayi * Iksayi + 5 * SonSayi + 10; return SonDeger; } private void Buttont_Click(object sender, EventArgs e) { int IkKatsayi = 10, IkinciKatsayi = 20; Double SonucDeger; SonucDeger = FonksiyonHesapla(IkKatsayi, IkinciKatsayi); this. Text = "Hesaplanan Sonuc=" + SonucDeger.ToString(); 136 Fonksiyonlarm Agim Yiiklenmesi Prosediirlerde oldugu gibi benzer is goren farkli fonksiyonlant aynt isimle (Asin: Yiikleme) farkh farkh bloklarda kodlayabilirsiniz. Yine hangisinin cagrilacagina parametrelerin sayisi veya tipleri karar verecektir. private Double FonksiyonHesapla(int Ilksayi, int SonSayi) My=2x*x45*x+10 Double SonDeger; SonDeger = 2 * Iiksayi * Iksayi + 5 + SonSayi + 10; return SonDeger; } private Double FonksiyonHesapla(int Iksayi, int SonSayi, int UcuncuSayi) Uy=2xtxsStxtk Double SonDeger; SonDeger = 2 * Uksayi * IIksayi + 5 * SonSayi + 10 + UcuncuSayi; return SonDeger; } private void Button2_Click(object sender, EventArgs e) int IlkKatsayi = 10, IkinciKatsayi = 20, UcuncuSayi = 30: Double SonucDeger; SonucDeger = FonksiyonHesapla(IkKatsayi, IkinciKatsayi, UcuncuSayi); this. Text = "Hesaplanan Sonuc=" + SonucDeger.ToString(); } } Kodlamaya dikkat edin “FonksiyonHesapla” isminde fark kod blokian isleten iki adet fonksiyon tanmlanmustir. Ikiside “Double” tip deger déndiirmektedir, fakat birinci fonksiyonun “2” parametresi olmasina karsilik, ikinci fonksiyonun “3” parametresi bulunmaktadir. “C# parametre sayisina bakarak hangisinin cagrildigimt kendisi belirleyebilecektir. 137 Dizi Degiskenleri Parametre Olarak Kullanmak Prosediirlerde oldugu gibi fonksiyonlar igerisinde de dizi degigkenler kullanabilirsiniz. Asagida bu husus émeklendirilmistir. private Double ToplamHesapla(int{] Dizi) { Double ToplamDeger = 0; System.Collections.[Enumerator DiziOku = Dizi.GetEnumerator(); while (DiziOku MoveNext()) { ToplamDeger += (int)DiziOku.Current; } return ToplamDeger; private void Button1_Click(object sender, EventArgs e) int{] DiziElemanlari = new int[} { 10, 30, 40, 70 }; Double SonucDeger; SonucDeger = ToplamHesapla(DiziElemanlari); this. Title = "Elemanlarin Toplami=" + SonucDeger.ToString(); Diiimeye tiklandiktan sonra sayfanin bashgina bakacak olursantz génderilen sayilann toplammin yazdigim géreceksiniz. $imdi asatidaki kodlant sayfaniza ekleyin. private Double ToplamHesapla(int[] Dizi) { Double ToplamDeger = 0; System.Collections.[Enumerator DiziOku = Dizi.GetEnumerator(); while (DiziOku.MoveNext()) { 138 ToplamDeger += (int)DiziOku.Current; } return ToplamDeger; } private void Buttonl_Click(object sender, EventArgs ¢) { int{] DiziElemanlari; Double SonucDeger; DiziElemanlari = new int{listBox1.Items.Count]; for (int i = 0; i <= listBox1.Items.Count - 1; i++) { DiziElemanlari{i] = Convert. Tolnt32(listBox 1 .Items[i]); } SonucDeger = ToplamHesapla(DiziElemanlari); labell Text = "Liste Toplami=" + SonucDeger.ToString(); Ee =o xi Topla * Uste Toplami=210 Bu drnege dikkat edecek olursamz, listede yer alan tiim degerlerin toplam alinarak Label kontrolii igerisinde gosterilmistir 139 Rekursive Fonksiyonlar Fonksiyonun kod blogu icerisinde kendi kendisini gagirmast islemiyle olusan yapiya rekiirsif fonksiyon adi verilmektedir. Bazi durumlarda oldukga kullanish olmakla beraber, hiz agisindan.tercih edilmemesi gereken durumlarda séz konusudur. Asagida faktéryel hesaplayan fonksiyon rekiirsif olarak tanmlanmistir. fBRekursive private Double FaktoryelHesapla(int Deger) Double CarpimSonuc if (Deger > 1) { CarpimSonuc = Deger * FaktoryelHesapla(Deger - 1); } return CarpimSonuc; } private void Button1_Click(object sender, EventArgs e) { int SayiBul; Double SonucDeger; SayiBul = Convert Toint32(textBox1.Text); SonucDeger = FaktoryelHesapla(SayiBul); label2. Text = "Faktdryel Sonucu=" + SonucDeger.ToString(); Obeb Hesaplayan Fonksiyon Matematikte ortak bélenlerin en biiyiigii olarak biline obeb fonksiyonuna ait kodlama asagida verilmistir. Su asamada biraz ag gelebilir fakat incelenmesi gereken bir fonksiyon oldugu igin burada veriyorum. Obeb Bulacagiz. jE ids Saylam Obebixd Uygulamaya ait ttim kod blogu asagida verilmistir. private int ObebBul(int{} DiziDeger) int Deger, Eleman; int i= 0, j,k; int(] DiziElemanlar; bool YonDurumu; Eleman = DiziDeger.GetUpperBound(0); DiziBlemanlar = new int{Eleman]; while (i <= Eleman - 1) DiziElemanlar(i] = DiziDeger{i); it; } Mi while (i <= Eleman - 1) for (j = 0; j <= Eleman - 1; j++) if (DiziElemanlar{i) > DiziElemanlar{j)) { Deger = DiziElemanlarti); DiziElemanlar[i] = DiziElemanlar(j); DiziElemanlar[j] = Deger; for (i = DiziElemanlar{Eleman - 1]; i >= 2; i--) YonDurumu = false; k=0; while (k <= Eleman - 1) if (DiziElemanlar[k] % i != 0) { -YonDurumu = true; break; ket; } if (YonDurumu { } } return i; } private void Button1_Click(object sender, EventArgs e) { int KacAdet, i int{} DiziDeger; break; 142 while (i <= KacAdet - 1) { DiziDeger{i] = Convert. Tolnt32(listBox | Items[i++]); } textBox1.Text = "Sayilarin Obebi ObebBul(DiziDeger); Uygulamay: galisunp “...” digmesine tiklarsaniz, sonug ekran g6riintiisii yukaridaki sekilde olusacaktir. Okek Hesaplayan Fonksiyon Matematikte ortak katlarin en kligiigii olarak adlandirtlan “Okek” fonksiyonuna ait kod blogu agagida verilmistir. Dikkatlice inceleyiniz. Okek Buluyoruz. Baylin Okekind® Uygulamaya ait ttim kod blogu asagida verilmistir. int j = 0, k, OkekBulundu; int{] DiziElemanlar; bool Yon; OkekBulundu = 1; Eleman = DiziDeger.Length; DiziElemanlar = new int{Eleman]; while (i <= Eleman - 1) DiziElemanlar{i] = DiziDeger{i++]; i=0; while (i <= Eleman - 1) for (j = 0; j <= Eleman - 1; j++) if (DiziElemanlar[i] > DiziElemanlar{j]) { Deger = DiziElemanlarli}; DiziElemanlar(i) = DiziElemanlar{j}; DiziElemanlar[j] = Deger; } } itt } Deger = DiziElemanlar{0]; k=2; while (k <= Deger) false; ); i <= Eleman - 1; i++) if (DiziElemanlar[i] % k == 0) { Yon = true; DiziBlemanlar{i] /= k; if (Yon == true) OkekBulundu *= k; k=1; } k++; } return OkekBulundu; private void Buttonl_Click(object sender, EventArgs e) yt int KacAdet, i = 0; int[] DiziDeger; KacAdet = listBox 1 Items.Count; DiziDeger = new int{KacA det}; while (i <= KacAdet - 1) { DiziDeger[i] = Convert. Tolnt32(listBox | Items[i++]. ToString()); textBox].Text = "Sayilarin Okeki=" + OkekBul(DiziDeger); Uygulamay: calistinp “...” diigmesine tilarsamz sonug ekran g6riintiisil yukaridaki gekilde olusacakur. 145, Dizi Degisken Dindiirmek Fonksiyonlarda tablo yapisina benzer degerleri dizi_degisken yardiyla kolayca uygulamaniza gonderebilirsiniz. Bu olay: “C#” kendi igerisinde bir cok kere kullanmistir. Mesela agagidaki sekilde bir kullanm “ADO .NET” uygulamalarinda gok¢a kullanilmaktadw. Yapulan islem sudur, tablonun belirtilen indis numaralt satin “Satir” isimli degiskene aktarilmaktadir. Bu kodlamada “GetBytes” methodu sayesinde “TextBox” igerisindeki “String” veri “Byte” dizisi olarak uygulamaya geri gonderilmektedir. Uygulama igerisinde “Byte” dizisi olarak tantmlanan “Karakterlerim” deBigkeni bu degerleri direk kullanabilir Simdi bizde buna benzer bir dmek gelistirip, girilen “String” igeriginin tim Karakterlerini uygulamada “Char” dizi degiskenine aktaracagiz. ae ow Faruk CELIK beh ~ ikKerakter private Char[] Karakterler(String Veri) { Char[] KarakterDizi; int Adet, i= 0; 146 ‘Adet = Veri. Length; KarakterDizi = new CharlAdet]; while (i <= Adet - 1) { KarakterDizi[i] = Verifi++]; } return KarakterDizi; } private void Button1_Click(object sender, EventArgs ¢) { Char{] Karakter; String Deger; Deger = textBox 1. Text; Karakter = Karakterler(Deger); label2. Text ="IIk Karakter=" + Karakter[0].ToString(); Bu asamadan sonra uygulamanizi gahistirabilirsiniz. “TextBox” Kontrolii igerisine gireceginiz metne ait tim karakterler fonksiyon sayesinde “Karakter” isimli dizi degigkene gonderilecektir. istediginiz elemanim indis numarasim kullanarak yazdurabilirsiniz. Enum Degiskeni Kullanmak Fonksiyonlarda parametre olarak sadece Class isimleri kullanmak zorunda degilsiniz. Simdi sizlere daha énceki konularda anlatilmis olan “enum” ifadesinden yaratiimig bir deiskeni fonksiyonlarda nasil kullanabileceginizi gsterecegim. ilk olarak sayfaniza bir adet RadioButtonList kontrolii, bir adet Label ve bir adet Button Kontrolit yerlestirin. namespace OrnekFonk { public partial class Form12 : Form 147 enum Mevsimler { SonBahar = 0, Kis =1, UkBahar = 2, Yaz private String MevsimGoster(Mevsimler Isim) String MevsimAdi ="; if (Isim == Mevsimler.IkBahar) { MevsimAdi = "Ik Bahar"; else if (Isim == Mevsimler-Kis) { MevsimAdi = "Kis"; } else if (Isim == Mevsimler.SonBahar) { MevsimAdi = "Son Bahar"; } else if (Isim == Mevsimler.Yaz) MevsimAdi = "Yaz"; } return MevsimAdi; } Meysimler BuMevsim;//Degisken. private void button1_Click(object sender, EventArgs e) if (radioButton Checked ) { BuMevsim = Mevsimler.SonBahar; } else if (radioButton2, Checked) { 148 BuMevsim = Mevsimler Kis; bse if (radioButton3.Checked) BuMevsim = Mevsimler.IIkBahar; tise if (radioButton4.Checked) ‘ BuMevsim = Mevsimler. Yaz; bering Deger; Deger = MevsimGoster(BuMevsim)://enum Degiskenle islet labell ‘Text = "Bulundugunuz Mevsim=" + Deger; z. Bkran gériintilstt yukaridaki sekilde olugacakur. amadan sonra _mevsim ismini segip “...” diigmesine 149 Struct Degiskeni Kullanmak Fonksiyon veya prosediirler parametre olarak “Class-struct-enum” defiskenlerinin tamamini alabilir, istediginiz tipte bir deger déndiirebilirsiniz. Simdiki amacimiz fonksiyona gonderecegimiz “struct” tip bir degiskene ait degerleri “ArrayList” Class degiskeni ile geri déndiirmek olacakur.Diger parametreleri nasil tammbyorsamz “struct” detiskeni fonksiyon igerisinde aym mantukla bildirebilirsiniz. private System.Collections.ArrayList OzellikiGoster(UniversiteBilgileri Bilgiler)//struct DeBisken { IKodlar return DiziDeger; Oncelikle asagida verilen sayfa tasarimim uygulamanuz igerisinde olusturun. Programa ait tim kod blogu asagida_verilmistir. Kodlart ekledikten sonra uygulamanizi galisturabilirsiniz. Dikkat edin fonksiyon 150 igerisinde birden fazla degeri igerisinde barindiran tek bir “struct” tip degiskeni kullanilmstir. Bu sayede génderilen tiim degerler “ArrayList” sinif degiskeniyle uygulamaya génderilmektedir. struct UniversiteBilgileri { public String UnIsmi; public String RektorAdi; public DateTime KurTarihi: public int UnYasi; } private System.Collections.ArrayList OzellikiGoster(UniversiteBilgileri Bilgiler) { System.Collections. ArrayList DiziDeger; DiziDeger = new System.Collections.ArrayList(); DiziDeger.Add(Bilgiler.UnIsmi); DiziDeger.Add(Bilgiler.RektorAdi); DiziDeger.Add@ilgiler.KurTarihi); DiziDeger.Add(Bilgiler.UnYasi); return DiziDeger; } private void Buttonl_Click(object sender, EventArgs e) UniversiteBilgileri YeniDeger/Struct Degiigken YeniDeger.Unlsmi = textBox1 Text; YeniDeger.RektorAdi = textBox2.Text; YeniDeger.KurTaril ‘onvert.ToDateTime(textBox3.Text); YeniDeger.UnYasi = Convert. Tolnt32(textBox4.Text); System. Collections. ArrayList YeniDizi; YeniDizi = new System.Collections.ArrayList(); YeniDizi = OzellikiGoster(¥eniDeger); Is for (int i = 0; i <= YeniDizi.Count - 1; i++) { listBox1 Items.Add(YeniDizili).ToString(); ‘Graverste ce [Gazi Universitesi 01.1828 00:00:00 Program ¢alistirildiktan sonraki ekran gértintiisti yukarida verilmistir. Sakin su soruyu sormayin, biz bu iglemi daha basit kodlarla yapabilirdik, sebebi basittir amactmiz daha farkh! 152 Kullancr Tamm Sunflari Parametre Degiskeni Olarak Kullanmak Programe: kendi yazmis oldugu simi fonksiyona parametre olarak gdnderebilir. Bu islem “struct” ifadeden pek farkli degildir. Ayn drnegi “class” olarak cézecesim. class UniversiteBilgileri//Bu sefer sumf olarak tanmmlandi { } publi String Unismi; public String RektorAdi; public DateTime KurTarihi:; public int UnYasi; private System.Collections. ArrayList OzelliklGoster(UniversiteBilgileri Bilgiler) { } System.Collections. ArrayList DiziDeger; DiziDeger = new System.Collections.ArrayList(); DiziDeger.AddBilgiler.UnIsmi); DiziDeger.AddBilgiler RektorAdi); DiziDeger.Add@ilgiler KurTarihi); DiziDeger.Add@Bilgiler.UnYasi); 7 return DiziDeger; private void Button1_Click(object sender, EventArgs e) { UniversiteBilgileri YeniDeger=new UniversiteBilgi YeniDeger.Unlsmi = textBox Text; YeniDeger.RektorAdi = textBox2.Text; YeniDeger.KurTarihi = Convert.ToDateTime(textBox3.Text); YeniDeger.UnYasi = Convert. Tolnt32(textBox4.Text); System. Collections. ArrayList YeniDizi; = new System.Collections.ArrayList(); OzellikiGoster(YeniDeger); 153 for (int i = 0; YeniDizi.Count - 1; i++) { listBox1 Items. Add(YeniDizi[i].ToString()); “YeniDeger” isimli degisken (class degiskeni) “struct” yapisindan farkh olarak new komutuyla kesinlikle yaratilmak zorundadir. 154 1Enumerator interface Tipli Deger Dondiirmek Fonksiyonlardan “IEnumerator” tipli deger déndiirmek bazi durumlarda gergekten gok isinize yarayacakur. Bu sayede uygulama igerisinde tanmlayacagimz bir “IEnumerator” degiskeni ile tim dizi elemanlarimi elde edebilirsiniz. Bir fonksiyonun “IEnumerator” deger dondiirmesi birden fazia deferin aym anda uygulamaya génderilmesi anlamint tasir. Yani bir nevi dizi degisken déndiirmek gibidir. Boyle durumlarda “return” komutunun basina_ “yield” parametresi eklenmelidir. Asagidaki mek uygulamay1 dikkatlice takip ediniz, _ sini! using System.Collections;/Ekleyin namespace OrnekFonk { public partial class Form14 : Form { private IEnumerator GeriYolla(int{] Dizi) { for (int i = 0; i <= Dizi.Length - 1; i++) 155 156 for (int j =i + 1;j <= Dizi.Length - 1;j+)) { int Deger; if Dizifi) > Dizilj)) ; i <= Dizi Length - 1; i+) yield return Dizili]; } } private void button1_Click(object sender, EventArgs e) { int{) YeniDizi = new int{listBox1 Items.Count}; for (int i = 0; i <= YeniDizi.Length - 1; i++) { } Enumerator DiziOku = GeriYolla(YeniDizi); while (DiziOku.MoveNext()) ‘YeniDizi[i] = Convert. ToInt32(listBox 1 .Items[i]); listBox2.Items.Add(DiziOku.Current.ToString()); Yapilan islem, rasgele elemanlara sahip bir dizi, fonksiyona gdderilerek siralt halde geri getirilmektedir. 157 ICollection Interface Tipli Deger Dondiirmek Bir fonksiyonda “ICollection”’ interface tipli deger déndiirmek, fonksiyondan dizi degisken ismi d6ndirmek gibidir. Bu sayede uygulamadan tim elemanlarina “foreach” déngiisiiyle erisebilirsiniz. Tiim kod asagida verilmistir. Dikkatlice inceleyiniz.Kodu ekledikten sonra uygulamanizi ¢alistirirsaniz, Listede yer alan tiim elemanlar fonksiyon sayesinde sirah halde uygulamaya geri gonderilecektir. private [Collection TopluAl(int{} Dizi) { for (int i = 0; i <= Dizi Length - 1; i++) { for (int j =i + 1;j <= Dizi-Length - 1; j++) int Deger; if (Dizili] > Dizilj) { Deger = Dizi Dizifi] = Dizifj]; Dizilj] = Deger; private void Button2_Click(object sender, EventArgs e) int[] YeniDizi = new int{ListBox1 Items.Count]; for (int i = 0; i <= YeniDizi.Length - 1; i++) YeniDizi{i] = Convert. Tolnt32(ListBox1 Items{i].Text); 158 it Eleman in TopluAl(Yer this. Text = "Elemanlari Siral Olarak Gésteriyorum"; MessageBox.Show( Eleman.ToString() ); 159 Methodlara Agiklama Balonlan: Eklemek Kod yazarken kolayhk olmasi baglammda “C#” sizlere fonksiyonlar hakkinda yanma bir baloncuk gikararak yardimet olmaktadir. 4) /// Seyinan Faktéryeli Hesaplanacak UU (// 44/ private Double Faktoryel(int Deger) ‘ double Sonuc = 1; for (int i = 2; i <= Deger; i+) ‘ Sonuc *= Deger; ) return Sonuc; y private void buttoni_Click(object sender, ventizas e) « int Sayi = 107 double Hes: Hes=f, © Ag ExecutionéngineException “4g ExpandableObjectConverter * ExtenderProvidedPropertyAttribute am an false Yukanidaki ekran gériintiisiinii elde edebilmek igin agagidaki kod satirlarm kullanmaniz gerekecektir. Mouse ile Faktoryel isimli fonksiyonu aktiflestirdiginiz zaman sag tarafnda_fonksiyonun parametreleriyle beraber ismi ve ne ise yaradigi (cklediginiz. metin) karginiza gikacakur. [couble Formi6.FaktoryeKint —Hsaynn Faktéeyel Hesaplane 160 Ml I Sayinn Faktoryeli Hesaplanacak M1 IH Il! }) private Double Faktoryel(int Deger) double Sonue for (int i = 2; i <= Deger; i++) { Sonue *= Deger; } return Sonuc; private void buttoni_Click(object sender, EventArgs e) { int Sayi = 10; double Hesapla = Faktoryel(Sayi); this. Text = Hesapla. ToString(); “Summary” xml tagi_kullamlarak —fonksiyonun _islevi programeiya aktarilmisuir. fslemi gerceklestiren tag asada ayrica verilmistir, M1 MI Saynin Faktoryeli Hesaplanacak M MI ii] “Hf” slag ile baslayan taglar bu tir islemlerinizi kolayca gerceklestirebilirsiniz. Tagi eklerken editér “Enter” tusundan sonra size bayagr yardimer olacaktir, 161 BOLUM 5 KOSUL KONTROLLERI & DONGULER Dallanma Segenekleri Programlama dillerinde, bir cok kere alternatifli durumlarla karsilasacaksimz. Segenekler fazla oldugu icin mecburen her sartin kendisine ézgi komutlarim isletmek durumunda kalacaksmuz. Simdi sizlere bu ifadelerin neler oldugunu ifade edecegim. If Bloklari Samyorum dallanma islemlerinde en cok tercih edilen yap. oldugunu séylersek dogru bir ciimle kurmus oluruz. Kendi igerisinde bir gok seceneBi bulunmaktadir. Bu secenekleri teker teker inceleyecegiz private void button! k(object sender, EventArgs e) { String Sehir = ""ANKARA"; if (Sehi ‘ANKARA")//Cift Esittir J/Kogula Uyan Kodlar this,Text = Sehir,/Burast Kosula Bagh Degildir. Kodlamaya dikkat edin “Sehir” isimli “String” tip degisken sayet “ANKARA” igerigine sahipse, “{-}" bloklan arasindaki_kodlar isletilecektir. Asagidaki Omek samyorum bu hususu daha iyi anlatacaktur. EventArgs e) String Schir = "ANKARA"; if (Schir == "ANKARA")//Cift Egittir labell .Text="Oturulan Sehir=" + Sehir; } this. Text= Sehir,//Burasi Kosula Bagli Degildir. 165 Dilerseniz. daha onceki béltimlerde belirttigimiz operatérleri kullanarak sayisal kiyaslamalarda yapabilirsiniz. private void button2_Click(object sender, EventArgs e) Byte OgrenciNotu; OgrenciNotu = Convert. ToByte(textBox I. Text); if (OgrenciNotu >= 50) { labell Text="Geger Not Aldiniz"; } this.Text= OgrenciNotu.ToString(); Kodlamaya dikkat edin “this.Text = OgrenciNotu.ToString” satirt if kiime blogu icerisinde olmadigi igin not her zaman sayfamin bashiginda yazdinlacaktur. “Geger Not Aldinz” mesajinin verilebilmesi iginse muhakkak 6frenciye ait olan notun “SO” nin tizerinde olmast gerekmektedir. IF-Else Bloklari Dallanma durumunda alternatifleriniz, sadece iki taneyse, bu durumlarda “if-else” bloklarmdan faydalanabilirsiniz. Asagida bu hususa ‘Srnek verilmistir. |] private void button1_Click(object sender, EventArgs e) { String Schir = "ANKARA"; if (Schir == "ANKARA") MKosul Gecerli ise Isleyecek Olan Blok } else IKosul Gegerli Degilse Igleyecek Olan Blok Bu asamada daha somut bir mek verelim, Kodunuzn agagudaki sekilde degistirin. private void button1_Click(object sender, EventArgs e) String Sehir = "ANKARA"; if (Sehir == "ANKARA") label Text="Baskentte Oturuyor"; else labell.Text ="Bagkentte Oturmuyor"; } this,Text = Sehiry/Burasi Kosullara Bagh Degiildir. Dilerseniz. agagidaki sekilde Sayisal ifadeler iginde “if-else” bloklanndan faydalanabilirsiniz. private void button1_Click(object sender, EventArgs e) { Byte OgrenciNotu; OgrenciNotu = Convert. ToByte(textBox!.Text); if (OgrenciNotu >= 50) Jabell.Text ="Geger Not Aldiniz"; else labell.Text ="Maalesef Basarisiz Oldunuz"; } this. Text = OgrenciNotu.ToString(); Simdi her haliikarda basari veya basarisiz. mesajlarndan bir tanesi verilecektir. 167 If - Else If -Else Bloklar: Alternatiflerin “2” den fazla olmasi durumunda bu bloklardan faydalanmahsmz. “else” bloklarmda_—herhangi_—bir —_—kosul belirtilmemektedir (Kalan diger biitiin kosullan igerir), Fakat “elseif” bloklarindan sonra muhakkak “if” de oldugu gibi kosulunuzu girmeniz gerekecektir. private void button1_Click(object sender, EventArgs e) { String Sehir = "ANKARA", if (Sehir == "ANKARA") /Ankarada Oturuyorsa Burast Isler "iSTANBUL") bse if (Sehir ‘ /fistanbulda Oturuyorsa Buras1 Isler den if (Sehir == "IZMIR") Hizmirde Oturuyorsa Burast igler else //Diger Sehirlerde Oturuyorsa Burast isler } this.Text = Sehir,//Burasi Kosullara Bagh Degildir. Dikkat edin kosul kontrolleri yapilirken istediginiz kadar “else if” blogu kullanabilirsiniz. Yani her farkh kosul icin “else if” blogu kullanilabilir. Fakat bu “if? ve “else” bloklan icin gecerli degildir. Ayn alternatifi inceleyen kod bloklarinda sadece bir tane “if”, sadece bir tane “else” kullanilabilir. Agagida daha somut bir émek verilmektedir. Dikkatlice inceleyiniz. | private void button1_Click(object sender, EventArgs e) String Sehir = textBox!.Text, label .Text="Baskentte Oturuyor"; } | else if (Sehir == "iSTANBUL") i labell.Text="En Biiyiik [Ide Oturuyor"; label Text="Uciineii Bityiik ilde Oturuyor"; } else labell Text="Biiyiik Sehirler Disinda Ikamet Ediyor"; } this. Text = Sehir;//Burast Kosula Bagh Degildir, Dilerseniz bu bloklari sayisal degerler (bool olabilir) iginde kullanabilirsiniz. private void buttonl_Click(object sender, EventArgs e) int OgrenciNotu; OgrenciNotu = Convert: Tolnt32(textBox1.Text); if (OgrenciNotu <0) label .Text=""Yanlis Not"; } | else if(OgrenciNotu<50) | label .Text="Maalesef Basarisiz Oldunuz"); else if (OgrenciNotu <= 100) { Jabell .Text="Tebrikler Geger Not"; else labell.Text=”"Yanhg Not"; } this. Text = OgrenciNotu. ToString(); Uygulamayr galistirdiktan sonra “TextBox” igerisine her tirlii duruma uyan degerleri girerek sonuglant test edin. Birden Fazla Kosulu Kontrol Etmek Yukaridaki mek uygulamada dgrencinin notunun “O” dan kiigiik veya “100” den biiytik girilmesi durumunda aymi mesaj icerigi ile uyariimaktadir. O zaman bu iki kosulu ayni satirda diizenleyebilirz. Asaiidaki Omek uygulamada dgrenciye ait notun “0” dan ktigik veya “100” den biiyik olmast durumu “if” blogu igerisinde kontrol edilerek “else” blogunun koddan ¢ikartilmast saglanmistir. Bu sayede daha kisa satith kodlar yazabilirsiniz. Ayrica bu érnekte “else” blogunun zorunlu olmadiginida anlamissinizdir. Ps TebthlerGererNot Simdi yukandaki sayfa tasanmim olusturup asaifidaki kod bloklarin: uygun olan yerlere ekleyiniz. 170 private void button!_Click(object sender, EventArgs e) { int OgrenciNow; OgrenciNotu = Convert Tolnt32(TextBox.Text); 7] if (OgrenciNotu < 0 ll OgrenciNotu > 100)//iki Farkli Kogul label .Text="Yanlis Not"; bse if (OgrenciNotu < 50) : label. Text = "Maalesef Basarisiz. Oldunuz"; bse if (OgrenciNotu <= 100) label .Text="Tebrikler Geger Not”; } this.Text = OgrenciNotu.ToString(; Ayn sonuca ulasmak igin veya (“Il")yerine and (“&&”) de kullanabilirsiniz, Tercih tamamen programeiya kalmistir. private void button _Click(object sender, EventArgs e) { int OgrenciNotu; OgrenciNotu = Convert.ToInt32(textBox1.Text); u if (OgrenciNotu >= 0 && OgrenciNotu <= 49) label !.Text="Maalesef Basarisiz Oldunuz"; m1 else if (OgrenciNotu >= 50 && OgrenciNotu { labell.Text="Tebrikler Geger Not"; } else ( label Text="Yanlis Not"; } this. Text = OgrenciNotu.ToString(); } Bu uygulamayt calistrdigimiz. zaman éncekiyle aym davramsi gosterdigini goreceksiniz. Arak disi durumlan kontrol ederken “II”, arahk igi durumlarda ise “& &” operatérleri kullanthir. If Ozel Kodlamasi Kogullarmzi dallandinirken “if” bloklart igerisine yazilacak kod tek satirdan ibaretse “{-}” blogu kullanmayabilirsiniz. Biz olay tam olarak kavrayana kadar her zaman kiime isaretlerini kullanmamizi éneririz. private void Button3_Click(object sender, EventArgs e) { int OgrenciNotu; OgrenciNotu = Convert. Tolnt32(textBox1 Text); textBoxl.Text= OgrenciNow>50 ? "Gecti" : "Kaldi" } } Dikkat edin, sayet herhangi bir kosuldaki satir sayrst “1” den fazla ise 0 zaman “{-}” blogu kullanmak zorunlu hale gelecektir. OgrenciNotu>s0 ? "Geeti" : "Kald:"; Bu satir “50” den biiyiik notlar icin “?” den sonrasim, kiigik notlar iginse “:” operatoriinden sonrasint isletir. 172 Bool Tip Degisken Kullanmak Aslnda bu hususu 6zel bir bashk altnda incelemek ne kadar dogrudur bilinmez, fakat bir cok kodlamada rastlayabileceginiz. icin asagidaki yapiya dikkatinizi cekmek istedim. private void button]_Click(object sender, EventArgs e) { bool Durum; Durum = checkBox| Checked: if (Durum)/Esitlik Belirtilmedi { label1.Text="Personel Evli"; } else { label -Text="Personel Bekar"; } (ieee es rea Persone Evi : Persone! Bekar Yukandaki kodlamada “Durum” degiskeni igin “if” blogunda hethangi bir esitlik belirtilmemistir. Boyle bir kodlama “bool” tip deiskenine 6zeldir ve “true” degeri anlamimt tasimaktadir. Yani yukaridaki kod blogunu asagidaki sekilde de yazabilirsiniz. 173, Switch Bloklari Alternatifli dallanma durumlarnda “if? bloklarina alternatif olarak kullanilabilir bir ifadedir. “if” bloklan kadar kullanil olmamakla beraber, bir gok durumda kodlarin daha anlasilabilir olmasi agisindan tercih edebileceginiz bir kodlamaya sahiptir. Sebebi basittir, ig ige “if” bloklarinm bulundugu kod satirlarinda, ig ige “switch — if? bloklani kullanmamiz daha uygun olabilir. private void buttonl_Click(object sender, EventArgs e) { switch (OgrenciNotu) { case lIkDeger: IKodlar; break; case ikinciDeger: IKodlar break; default: MKodlar break; Asagida basit anlamda bir kodlama verilmistir. Samyorum anlasilamayacak bir durum yoktur. private void button1_Click(object sender, EventArgs e) { int OgrenciNotu; OgrenciNotu = Convert. Tolnt32(textBox1.Text); switch (OgrenciNotu) { case 10: this. Text = "Girilen Sayi= break; 174 case 20: this. Text = "Girilen Say1=20"; i break; | : case 30: this. Text = "Girilen Say1=30"; break; default: this. Text = "Girilen Say1 Fark"; Bu ifadeyi kullanirken her “case” ifadesini “break” komutuyla bitirmeyi unutmamabsinz, Amag her fark kosulu “case” ifadeleri igerisinde kodlamak olacaktr. Bu ifade ile “String” tip igerikleri de kontrol edebilirsiniz. private void button1_Click(object sender, EventArgs e) { String Sehir; Schir = textBox1.Text; switch (Schir)//Dallandinlacak Degisken { case "ANKARA": this.Text = "Personel ANKARA da Oturuyor"; breal case "IZMIR": this.Text = "Personel izmirde Oturuyor"; break; case "ISTANBUL": this, Text = "Personel istanbul'da Oturuyor"; break; default: 175 Text = "Biiyiik Sehirde Oturmuyor' break; Bu bloklar igerisinde dallandiracagimz degisken “Double” tip olamaz. Bu durumlarda hata ile karsilagirsiniz. Fakat asagidaki sekilde basit bir “Boxing” olay: gézecektir. Double OgrenciNotu; OgrenciNotu = Convert. Tolnt32(textBox!.Text); switch ((int)OgrenciNotu) { case 10: this Text = "Girilen Say1=10"; break; case 20: this. Text = "Girilen Say1=20"; break; case 30: this. Text = "Girilen Say1=30"; break; default: this. Text = "Girilen Say: Farkh"; Sayet “Char” tipli karakterlerle iglem yapacaksanz kodlanmizi asagidaki gekilde kullanabilirsiniz. 176 Char Karakter; Karakter = Convert. ToChar(textBox1.Text); W switch ((Byte)Karakter) { case 65: this.Text = "A Tuguna Bastiniz’ textBox1.Text = null; textBoxl.Focus(); break; case 66; this.Text = "B Tusuna Bastiniz"; textBox1 Text = null; textBox1.Focus(); break; default: this. Text = "Diger Tuslara Bastiniz"; textBox1.Text = null; textBox Focus(); break; } } catch {} } Asagada “DateTime” sinifi kullanilarak haftanin giintinti “switch” bloguyla hesaplatmaktayrz. Dikkat edin Text icerisindeki tarih bilgisi dallandirma islemine tabi tutularak, girilen tarihin hangi giine ait oldugu belitlenebilmektedir. private void Button5_Click(object sender, EventArgs e) { DateTime Tarih; Tarih = Convert. ToDateTime(textBox I.Text); int Numara; 7 ‘Numara = (int)Tarih. DayOfWeek; switch (Numara) { case 0: this. Text = "Bugiin Pazar"; break; case 1: this. Text = "Bugiin Pazartesi"; break; case 2: this. Text = "Bugiin Sah”; break; case 3: this.Text = "Bugiin Carsamba"; break; case 4: this. Text = "Bugiin Pergembe"; break; case 5: this, Text = "Bugiin Cuma"; break; case 6: this. Text = "Bugiin Cumartesi"; break; 178 Enum Degiskenlerini Kullanmak Dallanma degiskeni olara “enum” tanimlanmis bir tipi kullanabilirsiniz. Asagida bu husus drneklendirilmektedir. ny f1670372008 enum Hafta { } Persembe Cuma = 5, Cumartesi = 6 private void button]_Click(object sender, EventArgs e) { DateTime Tarih; Tarih = Convert. ToDateTime(textBox!.Text); int Numara; Numara = (int)Tarih. DayOfWeek; I Hafta Bugun; Bugun = Hafta.Pazar + Numara; 179 switch ((int)Bugun) " { case 0: Labell.Text = "Bugiin Pazar"; break; case I: Jabell.Text = "Bugiin Pazartesi"; break; case 2: Jabell Text = "Bugiin Sali"; break; case 3 labell Text = "Bugiin Carsamba"; break; case 4: labell.Text = "Bugiin Pergembe", break; case 5: labell Text = "Bugiin Cuma”; break; case 6: label ‘Text = "Bugiin Cumartesi; break; 180 Déngiiler Bilgisayar dillerinin iglemleri arka arkaya yapmasim saglayan , bu sayede iglemei hizinin Gnemli oldugunu gésteren komutlar déngillerdir. Bir cok amprik islemin sonuclari déngiiler kullanilarak formulize edilebilir ve calistinlabilir. Simdi sizlere sirasiyla tim déngiileri teker teker dmekleriyle izah edeceyim. For Dingiisii Dogrudan veya dolayh olarak sayag (déngiiniin kag kare tekrarlanacagi) sayisinn bilindigi durumlarda kullanabilecek olan en ideal déngii cesididir. “C#” uygulamalannda “for” déngiisii cok esnek bir yapiya sahip olup neredeyse tiim déngii gerektiren problemler bir sekilde bu komutlagéziilebilir. Oncelikle kullantmina ait émek sablonu vermek istiyorum. private void button1_Click(object sender, EventArgs e) { for (int { WKodlar BaslangicDeger; i <= BitisDeger; DegisimDegeri) Déngiide kullanilan sayag degiskeni (Bizim émegimizde i) aralarma “;” karakteri kullanilarak tig degisik sekilde bildirilmelidir. Birinci parametre baslangig degerini, ikinci parametre bitis derini, iigiincii ve son parametre ise sayicin degisim miktarim géstermektedir. private void button1_Click(object sender, EventArgs e) { int Toplam for (int i= 15i { 181 Toplam += i; this. Text = "Aradaki Sayrlann Toplami=" + Toplam.ToString(); 11820 Yazar } Veya private yoid button1_Click(object sender, EventArgs e) int Toplam for (int i = 1; i <= 40; +4i)/Dikkat { Toplam += i; } this.Text = "Aradaki Sayrlarin Toplami=" + Toplam.ToString(); } Aymt dmekte eger gift saytlarin toplanmast istenseydi tek yapmanw gereken adim degerini iki artrmak olacakt. private void button1_Click(object sender, EventArgs e) { int Toplam for (int i = 1; i <= 40; i += 2)/Ciftler Toplam += i; } this. Text = "Aradaki Gift Sayslarin Toplami=" + Toplam.ToString(); 1400 Yazar } Kontrollere girilen degerler arasindaki sayslarm toplamint hesaplatmamz gerekirse o zaman asagidaki sekilde bir kodlama kullanabilirsiniz. 182 private void button}_Click(object sender, EventArgs e) { int likSayi, SonSayi, Toplam = 0; ilkSayi = Convert. ToInt32(textBox1.Text); SonSayi = Convert, Tolnt32(textBox2.Text); for (int i = lIkSayi; i <= SonSayi; i+) { Toplam += i; } Labell ‘Text ="Aradaki Sayi Toplami=" + Toplam.ToString(; Asagidaki 6mek uygulamada iki farkh kontrolden alinan degerler kullanilarak aralanndaki gift sayilarm toplam: hesaplatilmaktadir. Omegi iki fark: yOntemle gézecegim. Hangisinin daha hizh olduguna siz karar verin. private void button1_Click(object sender, EventArgs ¢) , SonSayi, Toplam = 0, DegerDeneme; Convert. Tolnt32(textBox!.Text); Convert. Tolnt32(textBox2.Text); if (lIkSayi > SonSayi)//ilk Say: Biiyiikse Degistir { DegerDeneme = flkSayi; ilkSayi = SonSayi; SonSayi = DegerDeneme; } if ({1kSayi % 2 != 0) fikSayit+y/Kiigik Say Tekse Cift Yap } for (inti = likSayi; i <= SonSayi; i += 2) { Toplam += i; : 183, Asapidaki émek uyugulamada dejisik bir teknik kullanilarak dizi elemanlani siralatilmistir. private void button1_Click(object sender, EventArgs e) int[] DiziElemanlar = new int[8] { 10, 5, 25, 15, 80, 75, 70, 30 }; System.Collections.IEnumerator DiziOku = DiziBlemanlar.GetEnumerator(); int DegerDene; for (int i = 0; i <= DiziBlemanlar Length - 1; i++) { intj =0; DiziOku.Reset(); while (DiziOku.MoveNext()) { int Deger = Convert. Tolnt32(DiziOku. Current); if (Deger > DiziElemanlar{i]) { DegerDene = DiziElemanlar[i]; DiziElemanlar{i] = DiziElemanlar{j}; DiziElemanlar{j] = DegerDene; foreach (int Eleman in DiziElemanlar) listBox1 .Items.Add(Eleman.ToString()); Asagidaki dmek algoritma aym: siralama islemini yapmakla beraber biraz daha karmasik bir yaplya sahiptir. ‘ate void button1_Click(object sender, EventArgs e) int{] DiziBlemanlar = new int[8] { 10, 5,25, 15, 80,75, 70, 30 }; System.Collections. IEnumerator DiziOku = DiziElemanlar.GetEnumerator(); System.Collections. IEnumerator DiziOku2 = DiziElemanlar.GetEnumerator(); for (int i =0;i<= DiziElemanlar.Length - 1; i++) int j =0; DiziOku2.MoveNext(); int KiyasDeger = Convert. Tolnt32(DiziOku2.Current); DiziOku.Reset(); while (DiziOku.MoveNext()) int Deger = Convert. Tolnt32(DiziOku,Currend); if (Deger > KiyasDeger) { DiziElemanlar{i] = Deger; DiziOku2.Reset(); for (int k = 0; k <= i; k++) DiziOku2.MoveNext(); DiziElemanlar{j] = KiyasDeger; KiyasDeger = Convert.Tolnt32(DiziOku2.Current); } jes } foreach (int Eleman in DiziElemanlar) listBox 1 .Items.Add(Eleman.ToString()); Bu déngliyii agagidaki gekillerde kullanarak diger déngiilere déniistiirebilirsiniz. private void button1_Click(object sender, EventArgs e) int Toplam = 0; int i= 0; for (; i <=40; i++) { Toplam + } this. Text = Toplam.ToString()//210 Yazar Bu Smekte dogru sonug verecektir. Aym zamanda asagidaki sekilde bir kullanim sayesinde sayact dongtl igerisinde degistirebilirsiniz. Asagidaki kodlama kesinlikle dogrudur. private void button1_Click(object sender, EventArgs e) { int Toplam = 0; inti= for (i { 0; ) Toplam += i; its } this.Text = Toplam.ToString();//210 Yazar Dilerseniz kosulu déngii igerisinde _girebilirsiniz. Sonug degismeyecektir. private void button1_Click(object sender, EventArgs e) { int Toplam = 0; int 186 if (i > 20) break; } Toplam += ims } this, Text = Toplam. ToString();//210 Yazar Son bir ornek vererek “for” déngiistinit sonlandiracagim. Bu sefer ig ige “for” déngtilerinden faydalanacagim. Bu sayede konu dahada pekismis olacak. private void button1_Click(object sender, EventArgs e) { int{] DiziBlemanlar = new int[8] { 10, 5, 2: System.Collections.IEnumerator DiziOk DiziBlemanlar.GetEnumerator(); System.Collections.IEnumerator DiziOku2 = DiziElemanlar.GetEnumerator(); int i=0; for (; DiziOku2.MoveNext(; ) { int j=0; int KiyasDeger = Convert.Tolnt32(DiziOku2. Current), DiziOku Reset(); for (; DiziOku.MoveNext(); ) k { I 15, 80, 75, 70, 30 }; int Deger = Convert ToInt32(DiziOku.Current); if (Deger > KiyasDeger) DiziElemanlar{i] = Deger; DiziOku2.Reset(); 187 I for (int k = 0; k <=i; k++) { DiziOku2.MoveNext(); } DiziElemanlar{j] = KiyasDeger; KiyasDeger = Convert. ToInt32(DiziOku2.Current); DiziOku.Reset(); for (; DiziOku.MoveNext(); ) { listBox1 Items.Add(DiziOku.Current. ToString()); } } While Dingiisii Déngi komutlarin isleyebilmesi igin bildirilen kosulun dogru olmast gerekmektedir. Yani kosul “true” degerini déndiiriiyorsa dongit komutlart devamil olarak tekrar isletilecektir. private void button1_Click(object sender, EventArgs e) while (Kosullcerigi) { MKodlar } } Simdi bu donguyl kullanarak girilen iki sayi arasindaki tek sayilan toplatacak bir uygulama yapacagim. Dikkatlice takip ediniz. 188 int [kSayi, SonSayi, Toplam = 0, DegerDeneme; iikSayi = Convert. ToInt32(textBox!.Text); SonSayi = Convert. Tolnt32(textBox2.Text); if (llkSayi > SonSayi) { DegerDeneme = IlkSayi; iDkSayi = SonSayi; SonSayi = DegerDeneme; int i= ikSayi; while (i <= SonSayi) { if (i % 2 !=0) { Toplam += i; its; ) this. Text = Toplam.ToString(); int iIkSayi, SonSayi, Toplam = 0, DegerDeneme; ilkSayi = Convert. ToInt32(textBox1.Text); SonSayi = Convert Tolnt32(textBox2.Text); if (kSayi > SonSayi) { DegerDeneme = [IkSayi; ilkSayi = SonSayi; SonSayi = DegerDeneme; if (IIkSayi % 2 == 0) iDkSayi+4; ioe int i = iikSayi; while (i <= SonSayi) { Toplam += i; it=2; } this, Text = Toplam.ToString(); Asagidaki sekilde “while” déngiisiinit kullanarak kolayca sonsuz bir sayag olusturabilirsiniz. While déngiisiinde kosul olarak girilen igerik “pool” tip bir deger déndiirecektir. Do while Dingiisit Bu ifadenin “while” déngiistinden tek farki, sartm déngit gikisinda kontrol edilmesidir. Kosul saglandigi siirecede déngii devam eder. Dikkat edilecek diger bir husus, kogul déngii gikist kontrol edildigi igin déngii igindeki kodlar enaz bir kere isletilir. Oncelikle prototipini verelim. ]] private void button1_Click(object sender, EventArgs e) { dof IKodlar }while (Kosulleerik);//Kosul Asagidaki 6mek uygulamada toplam degerinin “100” ii gegtigi durum hesaplatilmaktadir, { Double Sonuc = 0; int i=1; [= void Button1_Click(object sender, EventArgs e) 190 do { } while (Sonuc <= 100); this. Text = i. ToString() + " Sayisina Kadar OK "; Sonuc += i++; Foreach Dangiisti Dizi degisken degerleriyle ilgili kullanilabilen cok kullanish bir dongtidiir. Muhakkak dizi degisken olmasi zorunlulugu vardir. Amag her defasinda dizinin bir sonraki elemanim gosterip, o elemana ait igerigin elde edilebilmesi hususudur, Asada déngtiye ait yap1 verilmistir. private void button1_Click(object sender, EventArgs e) { HKodlar foreach (string Deger in Dizi)//Dizi Degisken Olmak Zorunda { /Kodlar Simdi basit bir Smekle déngiiyii izah etmeye galigalim, Amacumz diziye ait tiim elemanlari bu déngiiyti kullanarak mesaj igerigi olarak kullamerya gistermek olacaktur. “Listele” diigmesi igin asagidaki kod blogunu kullanacagiz. Tiklandiktan sonraki ekran goriintiisil yukarida verilmistir. private void button1_Click(object sender, EventArgs e) { MListele String[] DiziElemanlari = new string[3] ( "ANKARA", "IZMIR", "ISTANBUL" } 191 foreach (string TekEleman in DiziBlemanlari) { listBox1.Items.Add(TekEleman); Asagidaki Smek uygulamada génderilen dizi elemanlant toplatilarak sonug deri elde edilmektedir. Belirtmekte yarar gériiyorum, “foreach” déngiisii mkullanilarak dizilerin tim elemanlarina indis numarasi belirtmeden erisim saglanmaktadir. Bu erisim sadece okuma anlaminda kullamlabilir, aktarilan degiskenin degeri déngii igerisinde kesinlikle degistirilemez (Bizim Omegimizde “TekEleman” degiskeni bu gorevi iistlenmistir). private void buttonl_Click(object sender, EventArgs e) int{] DiziElemanlar = { 15, 30, 20, 40, 70 }; int DiziToplam = 0; foreach (int TekEleman in DiziElemanlar) { DiziToplam += TekEleman; } this. Text = DiziToplam.ToString();//175 Yazar Dongiileri Yénlendirme Komutlar: Yukanda gérmilg oldugumuz déngt kod bloklanna ait kullanabileceginiz 6zel komutlar bulunmaktadir, Bu komutlar sayasinde déngit igerisinde daha rahat kod yazabilmekteyiz. Asaida bu komutlar incelenmektedir. Continue Kod bloklan isletilirken belirli kosullarm saglanmasi durumunda © satirdan sonraki (Déngii Blogu icerisinde) kodlarin isletilmesini 192 istemeyebilirsiniz (basa dénmek igin). iste bu tip durumlarda bas vuracaginiz, komnut kesinlikle “continue” olmalidr. private void button1_Click(object sender, EventArgs e) { int ToplamDeger = 0, i = 0; for (; i <= 20;) { i++; if (i %2!=0) { continuey/Fora Tekrar Don } ToplamDeger += i; } this.Text = ToplamDeger.ToStringQ;//110 Yazar Bu komut “while” déngiisii__igerisinde de —aynen kullamlabilmektedir. Sonug ayn olacaktir. $imdi while ile bir cézim iiretelim. private void button1_Click(object sender, EventArgs e) { int ToplamDeger = 0, i = 0; while (i <= 20) { ins if § % 2 !=0) { continue;//while Tekrar Don } ToplamDeger += i; } this. Text = ToplamDeger.ToString();//110 Yazar 193, Sayet “continue” komutunu “foreach” ile _—_beraber kullanacaksanz © zaman kodunuzun asagidaki sekilde olmast gerekecektir. private void button1_Click(object sender, EventArgs e) { int[] DiziElemanlar = { 10, 11, 12, 13, 14, 15 }; int ToplamDeger = 0; foreach (int Eleman in DiziElemanlar) { if (Eleman % 2 != 0) { continue;//foreach e Tekrar Don } ToplamDeger += Eleman; } this. Text = ToplamDeger.ToString()://36 Yazar Break Cahsma manugi olarak “continue” komutuna ok benzer bir manuk kullanr, Tek fark continue komutunda basa dontilirken, “break” Komutunda ise dOngiiden gikilmaktadir, Asagidaki 6mek uygulamada kosul saglandigi zaman yaratilmis bulunan sonsuz déngiiden giktlarak kod sonlandinilmaktadir. private void button1_Click(object sender, EventArgs e) { int ToplamDeger = 0, i = 0; for (; true; )//Sonsuz Dégit { if (> 20) { breaky/For dan Gik } ToplamDeger += 194 } this. Text = ToplamDeger.ToString()y//110 Yazar } } Ozellikle ayn: sonucu veren érnekler ¢dziilerek komutlarm farklarm anlayabilmeniz, saglanmaya galisiimaktadir. “Break” komutu sadece “for” déngiisti icin kullamlmaz, dilerseniz “while-foreach” déngilleri iginde kullamiabilmektedir. Asagidaki Smekler bu hususu igermektedir. private void buttont_Click(object sender, EventArgs e) { int ToplamDeger = 0, i= 0; while (true) { if (i > 20) { break;//while den Ck } ToplamDeger += i; i4=2; } this. Text = ToplamDeger.ToString();//110 Yazar Komutun “foreach” igerisindeki kullamm: 2 Defisik durumlar yaratip yeni ornekler tiretebilirsiniz. private void Button2_Click(object sender, EventArgs e) { int[] DiziElemanlar = { 10, 11, 12, 13, 14, 15}; inti 195 foreach (int Eleman in DiziElemanlar) its if (Eleman == 12) { break;//foreach ten Cik } this. Text = i, ToString() + ".ci Elemanin Degeri 12 dit"; BOLUM 6 KOLEKSIYONLAR Koleksiyonlar ister Windows uygulamasi olsun isterse web uygulamast, iyi bir proje icin cok iyi bilinmesi gereken yapilarn baginda koleksiyonlar gelmektedir. Bir degisken deklarasyonu yaptigimz zaman ona belirttiginiz tipe gore bellekte otomatik olarak yer ayrilacaktr. Koleksiyon deBiskenler tek bir degere sahip olmamakla beraber degisik karakteristik tipte bir cok faydali degeri hafizaya alabilmektedir. Bu sayede profesyonel uygulamalarda cok fazla kullanilmakla beraber extra bir takim bilgi bloguna, programery1 ihtiyag halinde burakmaktadhr. Dizi olarak tanimlanan degiskenler normalde koleksiyon olarak adlandinimasa bile davranis bakimindan benzer kullamim sekilleri bulunmaktadir. Koleksiyon tek bir degiskenden olusmakla beraber igerisinde birden fazia farkh tiplerde _deiskenleri_kolayca barindirabilmektdir. Oysa dizi degisken olarak tammmlama yapilmast tek bir defisken degil belirtilen kadar ayri deBiskenin _bellekte olusturulmasim saglamaktadw. Konu koleksiyon olunca devreye IEnumerator, [Enumerable, IComparer vs. interface tanimlamalan girecektir. Bir ¢ tarafindan itici bulunmakla beraber dikkatlice incelen« zaman kalite farkimn ortaya gikarildigt agikca gértilecektir. Bu am sizlere biraz kalite kazandirmak istiyoruz. Oncelikle asagidaki_ bir tanmlamanin koleksiyon olmadigimt fakat Koleksiyona benzer géziimleri oldugunu séylemekte yarar var. [ private void button1_Click(object sender, EventArgs e) { string[] MDizi = new string{5]; int{] SDizi = new int{5}; Koleksiyonlarin kullanilabilmesi igin asagidaki_namespace’in uygulamaya dahil edilmesi gerekmektedir. using System.Collections 199 IEnumerator Bu bir interface tammlamasidir. Bu interface den yaratacaginuz bir yavru degisken ile koleksiyon degerlerine tek tek erigme sansina sahip olabilirsiniz. Oncelikle nasil kullamildigint sizlere gésterecegim. Simdi yukaridaki ekran gériintiisiinii olusturacak kodu verelim. using System.Collections;//Ekleyin namespace OrnekDonguler public partial class Formi : Form private void buttonl_Click(object sender, EventArgs e) string{] MDizi = new string{] ( "A", "B", "C°, "D", "E" }; IEnumerator Oku = MDizi.GetEnumerator(); while (Oku.MoveNext() listBox1 Items.Add(Oku.Current.ToString()); 200 Onceki izahatimizda dizi tammlamalarmin bir koleksiyon oladigim belirtmistik. Fakat uygulama agisimdan sonuca_gidebilme mantiinda cok benzerlikler bulunmaktadir. “GetEnumerator” methodu kullamlarak degerlerin tamamina salt okunur olarak “Current” Szelligiyle erigebilmeyi sagladik GetEnumerator Methodu Method interface degiskenine ait olmamakla beraber bu method sayesinde dizide (ashnda koleksiyonda) yer alan tiim degerler interface degiskeninin kullammina sunulmaktadyr, Current Ozelligi Koleksiyonda yer alan elemanlardan hangisinin aktif oldugu bu ézellikte tutulur, MoveNext Methodu Bu method isletilerek bir sonraki_elemana _erisim saglanabilmektedir. Reset Methodu Interface degiskeninin ilk elemanna dénmek igin kullanslan methodudur. IEnumerator interface’ ini kullanarak tim koleksiyonlarda émek uygulama yapacagiz. Bu amacla burada konuyu kesmek istiyorum. flerleyen sayfalarda koleksiyon defiskenlerine daha detayh deginilecegi igin anlamaniz daha kolay olacaktur. 201 IEnumerable Bu interface Koleksiyonu komple ifade etmek igin kullamr. IEnumerable degiskenini Enumerator degfiskeni ile kullanarak kolayca degerleri elde edebilirsiniz. using System.Collections;//Ekleyin namespace OrnekDonguler public partial class Form! : Form private void buttont_Click(object sender, EventArgs e) string{] MDizi = new string[] ( "A", "B","C", "D", "E" ) IEnumerable Komple = MDizi://Komple Aktarilryor IEnumerator Oku = MDizi.GetEnumerator(); while (Oku.MoveNext()) listBox1 .Items.Add(Oku.Current. ToString()); Bu émekte dikkat edecek olursamz “MDizi” isimli string tipte dizi degiskene ait tim degerler “Komple” isimli “[Enumerable” interface degiskenine esitlenmistir. Sayet aktarlacak olan koleksiyonun tipi tam olarak belli ise 0 zaman asagidaki sekilde bir kodlama daha dogru olacakur. using System.Collections.Generic; using System.Collections;//Ekleyin namespace OrnekDonguler { 202 public partial class Forml : Form { private void button1_Click(object sender, EventArgs e) { string{} MDizi = new string{] {"A","B", "C°, "D", "E" }; IEnumerable Komple = MDiziy//string Tip IEnumerator Oku = Komple.GetEnumerator(); while (Oku.MoveNext()) { listBox Items. Add(Oku.Current.ToString()); IEnumerable tanimlamast kafantzt__karistirmasin. Oncekinden tek farki, koleksiyonun string tipten ibaret oldugunun dnceden belirtilmesidir. Daha sonraki béltimlerde (6zellikle LINQ konusunda) daha detayli érnekler verilecektir Burada belirtmekte yarar gorllyorum sayet koleksiyon agagudaki sekilde “int” tipli olmug olsa idi kullanacagimz kodlama asagidaki sekilde olacakt. using System.Collections.Generic;//Eklemeyi Unutmayin private void button1_Click(object sender, EventArgs e) { int[] TDizi = new int{] (10,20,40,30 }; IEnumerable Komple = TDi IEnumerator Oku = Komple.GetEnumerator(); while (Oku. MoveNext()) { listBox 1 Items.Add(Oku.Current.ToString(); } } 203 ArrayList C#'ta cok fazla fonksiyon bulunmaktadir. Bu fonksiyonlar sayesinde kendinizi fazla zorlamadan cok Kolay islem yapabilirsiniz. ‘Asagida bu islemlerde kullanabileceiniz dizi fonksiyonlan Smeklerle aciklanmistt. En genel anlamda dizi degisken asaiadaki gibi tammlanabilir. Eleman sayisi daha sonra aktarilacaktir. Daha dogru bir deyisle eklediginiz her eleman adeti bir arturacaktr. using System.Collect ArrayList Koleksiyon=new ArrayList()//Seklinde Tammlanit Add Parametre ile belirlenen degiskene ait igerigi ArrayList dizi degiskenine eklemek igin kullanihr. private void buttonl_Click(object sender, Event { int{] Degerler = new int{] { 10, 20, 30, 40, 50, 60, 70, 80 }; ArrayList Koleksiyon = new ArrayList()//dizi tanmland, Koleksiyon.Add(Degerler[5]);//Altinci Elemam Ekle this. Text = Koleksiyon[0].ToString();//60 yazar. Sayet “Add” metodunda dizinin ismi direk olarak kullamilirsa 0 zaman cok boyutlu bir dizi olusturulur. Asajidaki kodlamay1 dikkatlice inceleyiniz. private void button1_Click(object sender, EventArgs e) int{] Degerler = new int{] { 10, 20, 30, 40, 50, 60, 70, 80 }; ArrayList Koleksiyon = new ArrayList(); Koleksiyon.Add(Degerler); this. Text = ((int[])Koleksiyon[0})[3].ToString()//40 204 Burada dikkat etmenizi istedigim husus, “sayi[0]” disnda baska bir indis numaras: kullanamayacaginizdir. Ciinkii tek boyutlu bir dizi eklediniz. $imdi dikkatinizi asagudaki kod bloguna gekmek istiyorum, private void button! _Click(object sender, EventArgs e) | int{,] Degerler = new int{,] { { 10, 20, 30 }, { 40, 50, 60 }, { 70, 80, | 90} }: ArrayList Koleksiyon = new ArrayList():// Koleksiyon.Add(Degerler); this. Title = ((int{,})Koleksiyon[0))[1, 1]-ToStringQ,//50 } AddRange Bir dizideki veya koleksiyondaki bilgileri dizi elemanlarina aktarmak igin kullamlir. Mesela listBox kontroliiniin tim elemanlarin: diziye almak igin kullanilabilir. private void Button4_Click(object sender, EventArgs e) int{} Degerler = new int{] { 10, 20, 30, 40, 50, 60, 70 }; ArrayList Koleksiyon = new ArrayList(); Koleksiyon.AddRange(Degerler); this Text = Degerler{2].ToString)/30 yazar Clear Dizideki tim clemanlan silmek igin kullanr. Eger silinen elemanlarin indis numaralariyla islem yapilirsa uygulamanz kirilacaktr. || private void Button5_Click(object sender, EventArgs e) { int[] Degerler = new int{] { 10, 20, 30, 40, 50 }; ArrayList Koleksiyon = new ArrayList(); 205 Koleksiyon.AddRange(Degerler); Koleksiyon.Clear();// Temizle this. Text = Koleksiyon{2].ToString();//Hata Verit Contains Parametre ile girilen degiskenin dizinin elemanlanndan biri olup olmadigim kontrol ettirmek igin kullanilan bir metod’dur. Eger eleman dizi igerisinde varsa “true”, yoksa “false” degerini déndurtir. Asagidaki Ornekte Sncelikle sayi isimli dinamik diziye “x” dizisinin tim elemanlan aktariImakta ardindan da textBox’a girilen degerle dizi elemanlan eslestirilerek 0 elemanmn daha énceden dizide var olup olmadigi kontrol ettirilmektedir. Eger varsa diziye eklenmemekte, yoksa diziye ekletilip son eleman oldugu igin de yazdurimaktadir. private void buttonl_Click(object sender, EventArgs e) ArrayList Koleksiyon = new ArrayList(); Koleksiyon.Clear(); Koleksiyon.AddRange(listBox! Items); if (Koleksiyon.Contains(textBox Text) == true) { Koleksiyon.Add(textBox Text); } else { . MessageBox Show("icerik Zaten Var"); + this Text = Koleksiyon[Koleksiyon.Count - 1].ToString(); listBox | Items.Clear(); IEnumerator Oku = Koleksiyon.GetEnumerator(); while (Oku.MoveNext()) { listBox 1 Items.Add(Oku.Current.ToString()); CopyTo Dizi’deki elemanlari baska bir diziye kopyalamak igin kullanuhr. Burada tim elemanlari alma zorunlulugu yoktur. Mesela 5. elemandan sonra kopyalama yapilacaksa baslangig isimli parametreye 4 (ilk eleman ©) yazihr. fkinci parametre ise hangi diziye kopyalanacagi,iigiinct parametre (boyut) Dizinin hangi boyutunun kopyalanacagi, son parametreyle de kag elemanin kopyalanacagi belirlenebilir. | private void buttonl_Click(object sender, EventArgs e) { int[] XDizi = new int{] { 10, 20, 30, 40, 50, 60, 70, 80 }; int{] ¥Dizi = new int{4]; ArrayList Koleksiyon = new ArrayList(); Koleksiyon.AddRange(XDizi); Koleksiyon.CopyTo(2, YDizi, 0, 4); this. Text = YDizi[2].ToString();//50 yazar Count Dizi degiskenin eleman sayisim veren fonksiyondur, private void buttont_Click(object sender, EventArgs ¢) { int[] XDizi = new int{] { 10, 20, 30, 40, 50 }; int Adet; ArrayList Koleksiyon = new ArrayList(); Koleksiyon.AddRange(XDizi); Adet = Koleksiyon.Count; textBox1.Text = Adet.ToString() +" Elemani Var"; IndexOf Dizi degisken igerisinde aranan isimli deger, birinci parametre ile belirtilen siradan baslayarak ikinci parametresiyle verilen eleman kadar 207 aranir. Eger bulunursa geriye bulundugu sira déner (ilk elemanmn numarast “0” dir). Eger elemam bulamazsa geriye “1” degeri déner. [ private void Button4_Click(object sender, EventArgs e) int[] XDizi = new int{] { 10, 20, 30, 40, 50 }; int Kacinci,Deger = 40; ArrayList Koleksiyon = new ArrayList(); Koleksiyon.AddRange(XDizi); Kacinci = Koleksiyon.IndexOf(Deger, 0, Koleksiyon.Count - 1); textBox 1. Text = Kacinci.ToString() +" .ci Eleman"; Arama igleminde tipe de dikkat etmeniz. gerektigini hatirlatmak isterim. Yani aagidaki sekilde yapacagimz bir arama iglemi “1” dondurecektir. Insert Dizi degiskende birinci parametre ile belirtilen swaya ikinci parametre ile belirtilen degeri ckler. Bu islem sayesinde diziye yeni bir eleman eklendigini (kayit sayisi artar) dikkatinizden kagirmayinyz. private void buttoni_Click(object sender, EventArgs e) { int[] XDizi = new int{] { 10, 20, 30, 40, 50 }; int Deger = 80; ArrayList Koleksiyon = new ArrayList(); Koleksiyon.AddRange(XDizi); Koleksiyon Insert(3, Deger);//Araya Ekle textBox1.Text = Koleksiyon[5].ToString()//50 yazar InsertRange Dizi degiskene birinci parametre ile belirtilen siradan sonra ikinci parametre ile belirtilen dizi elemanlarim: ekler. 208

You might also like