![]() |
Karar Yapıları 1- Döngüler - Baskı Önizleme +- AccessTr.neT (https://accesstr.net) +-- Forum: Microsoft Access (https://accesstr.net/forum-microsoft-access.html) +--- Forum: Access Dersleri (https://accesstr.net/forum-access-dersleri.html) +--- Konu Başlığı: Karar Yapıları 1- Döngüler (/konu-karar-yapilari-1-donguler.html) Sayfalar:
1
2
|
Karar Yapıları 1- Döngüler - mehmetdemiral - 03/05/2009 Karar yapilari 1: Döngü Yapilari: • Do...Loop • For...Next Döngüler Program denetiminde yaygin olarak kullanilan mekanizmalardan birisi de döngülerdir. Döngüler islemlerin yinelenmesi anlamina gelir. Örnegin dosyanin sonuna kadar kayitlarin birer birer okunmasi ve her okunan kayit üzerinde belli islemlerin yapilmasi gibi. Çünkü burada yapilacak is lem aynidir ama dosyada yer alan bütün kayitlar için uygulanir. Visual Basic'te iki ana tip döngü vardir: • Kosullu döngüler • Sayaçli döngüler Kosullu döngüler belli bir kosul yerine gelinceye kadar ya da belli bir kosul oldugu süre boyunca yineleme islemini sürdürürler. Sayaçti döngüler ise islemleri belirtildigi kadar yinelerler. Döngü yapilari: Do...Loop: Bir kosula göre döngü. For...Next: Belli bir sayida döngü (sayaçli). Bir sayaçli döngü For...Next döngüsü olarak bilinir. For deyimi ile döngünün sayaci tanimlanir. Next deyimi ile yinelecek blok sona erer. Döngünün her dönüsünde sayaç degiskeni bir sayi artirilir. Böylece bir sayidan digerine kadar islemler sürüdürülür. Do...Loop Deyimi Bir blok deyimi verilen kosul dogru (True) oldugu sürece isletir. Yapisi: Do [( While | Until) kosul1] [ ifade blogu] [Exit Do] [ ifade blogu] Loop Bir blok, deyimi verilen kosul saglanincaya kadar isletir. Yapisi-2: Do [ifade blogu] [Exit Do] [ ifade blogu] Loop [(While | Until) kosul1] Do...Loop deyiminde kullnilan elemanlarin islevleri sunlardir: Eleman Islevi Do Do..Loop kontrol yapisinin ilk deyimi. While Iken: Belirtilen kosul dogru oldugu sürece döngünün isleyecegini belirtir. Until 'e kadar: Kosul dogru oluncaya kadar döngü isletilir. kosul Sayisal ya da karakter bir ifade; dogru (0 hariç) ya da yanlis (0 ya da Null) degeri degerlendirir. ifade blogu Do ile Loop arasinda; kosul saglanincaya kadar isletilecek olan program satirlari. Exlt Do Döngüden çikisi saglar.Bir If-Then deyimi ya da diger kosullarda döngüden ayrilmayi saglar.Istenildigi kadar kullanilabilir. Loop Do..Loop döngüsünü bitirir. Do döngülerinin temelinde kosul (condition) yatar. Bir kosul True ya da False olabilen bir ifadedir. Bu bir fonksiyon (örnegin EOF), özellik ya da bir iki degerin bir iliski operatörü ile karsilastirilmasi yapilabilir. Iliski operatörleri Operatör Anlami < Küçüktür <= Küçük esittir > Büyüktür > = Büyük esittir <> Esit degildir = Esittir And Ve Or Veya - Ya da Not Degil Örnek: Bir döngü kurma Do While Ücret < 10000 ' Ücret 10000 den küçük oldugunda Toplam = Toplam + Ücret Loop Iki temel Do döngüsü vardir: Do While Döngüsü, Do Until Döngüsü. Do...While döngüsünde While deyiminde belirtilen kosul dogru oldugu süre boyunca döngü yinelenir. Kosulun saglanmadigi anda program döngüyü atlayarak Loop deyiminden sonraki deyimlere geçer. Örnek: Bir Veritabanini Isle me Do While Not Tablo.EOF Tablo.Edit If Bakiye > 100000 Then Durumu = "ödeme mektubu gönder" Else Durumu = "ekstre gönder" End If Tablo.Update Tablo .MoveNext Loop While deyiminde kosul dogru oldugu sürece döngü sürüdürülür. Until deyiminde ise kosul dogru olmadigi (yanlis oldugu süre) süre boyunca döngü yinelenir. Do...Until döngülerde ise Until deyiminde belirtilen kosul dogru oluncaya kadar döngü yinelenir. Diger bir deyisle kosul yanlis (False) oldugu sürece döngü yinelenir.Do…Until döngüler, yaygin olarak veritabani islemlerinde kullanilir.Bir döngü ile tablonun ilk kaydindan son kaydina kadar okunmasi saglanir. Örnek: Dosya sonuna kadar okuma Dim Vt As Database, Tablo As Recordset Set Vt = DBEngine.Workspaces(0).Databases ("C: \my documents\adresler.MDB") Set Tablo = Vt.OpenRecordset ("Ogrenciler", dbOpenTable) Tablo.Movefirst Do Until Tablo.EOF YzListe.AddItem Tablol ("Ogrenciler") Tablo.MoveNext Loop Tablo.close vt.Close NOT: Do While döngüsü içinde bir de Loop Until deyimi konulmaz. Bu durum hataya neden olur. Asagidaki örnekte dosya sonuna kadar islem yapilir. Örnekte MYFILE dosyasi text bir dosyadir. Dim InputData Open "MYFILE" For Input As #1 ' input açilan dosya. Do While Not EOF(1) ' end of file kontrolü. Line Input #1, InputData ' data oku. Debug.Print InputData ' Immediate window’a yaz. Loop Close #1 ' dosya kapat. Asagidaki örnekte ise veriler; dosyanin sonundan basina dogru (ters sirada) okunur. MyRecordset .moveLast Do While not MyRecordset.EOF Print MyRecordset.fields.getValue(“myfield”) MyRecordset.movePrevious Loop Döngünün Basinda ve Sonunda Denetim Do.. .Loop döngüsünün basi ve sonu vardir. While ve Until deyimleri (iken ve 'e kadar) kendi anlamlarini sürdürmekle birlikte döngü yapisinin basinda ve sonunda kullanilmasina göre degisik anlamlar tasirlar. Kosullarin DO döngüsünün basinda yer almasi denetimin döngünün basinda yapilmasi anlamina gelir. Döngü basinda kullanilan Until deyimi kosul False oldugu süre boyunca döngünün islemesini ve kosul testinin döngünün basinda her seferinde yapilmasini saglar. While deyimi ise yine döngü basinda kosulun True olmasi durumunda geçise izin verir. NOT: Do... Until yerine While..Wend deyimleri ile de dödngü yaratilabilir.Ancak daha esnek olduklari için While Wend döngüleri yerine Do... Until döngüleri önerilir. Örnek: Giris Kontrolü .Asagidaki örnekte tipik olarak bir giris kontrolü yapilmaktadir. Kullanici belirtilen sayilari girmedigi takdirde program kontrolü bu alani geçmemektedir: Dim Yanit As String Do ' döngü basi Yanit = InputBox ("1,2,3 sayilarindan birisini girin . " ) Loop Until Yanit >= 1 And Yanit =< 3 'döngü sonu Örnek: Dosya sonuna kadar okuma Dim SAYAC, OGR1SAYAC, OGR2SAYAC As tnteger Dim Vt As Database Dim Tablo as Recordset Set Vt = DBEngine .Workspaces (0).Databases ( "C: \DATA\OKUL.MDB") Set Tablo = Vt.OpenRecordset ( "OGRENCIHAREKET") Do If Tablo!OGR = "OG01" Then OGR1SAYAC = OGR1SAYAC + 1 If Tablo!OGR = "OG02" Then OGR2SAYAC = OGR2SAYAC + 1 SAYAC = SAYAC + 1 Tablo.MoveNext Loop Until Tablo.EOF MsgBox SAYAC & " " & OGR1SAYAC & " " & OGR2SAYAC Bir Kosul Dogru Oluncaya Kadar Döngü Bir Do...Loop Until döngüsündeki kosulu kontrol etmek için Until deyimini kullanmanin iki yolu vardir. Birincisinde kosul döngüye girmeden önce kontrol edilir. Ikincisinde kosul döngünün sonunda kontrol edilir; bu yöntemde döngü birkez dönmüs olur. Giriste kontrol: Sub IlkUntil() Sayaç = 0 Sayi = 20 Do Until Sayi = 10 Sayi = Sayi - 1 Sayaç = Sayaç + 1 Loop MsgBox "Döngü " & Sayaç & " kere döndü." End Sub Çikista kontrol: Sub SonUntil() Sayaç = 0 Sayi = 1 Do Sayi = Sayi + 1 Sayaç = Sayaç + 1 Loop Until Sayi = 10 MsgBox "Döngü " & Sayaç & " kere döndü." End Sub While ve Until Sistemi: While Yapisi: Sayaç = 1 Do While Sayaç <= 10 MsgBox sayaç Sayaç = Sayaç + 1 Loop Do Yanit=InputBox ( "Parolayi girin") Loop While Yanit <> "XXX" Until Yapisi: Sayaç = 1 Do Until Sayaç > 10 MsgBox sayaç Sayaç = Sayaç + 1 Loop Do Yanit=InputBox ( "Parolayi girin") Loop Until Yanit <> "XXX" Döngüden Çikis Bir Do. ..Loop döngüsünden kosulsuz çikmak için Exit Do deyimi kullanilir. Yapisi: Exit Do Asagidaki örnekte bir If ...Then ...Else deyimi içinde kosul test edilerek döngüden çikilmakta böylece sonsuz döngü engellenmektedir: Sub ÇikisÖrnegi() Sayaç = 0 Sayi = 9 Do Until Sayi = 10 Sayi = Sayi - 1 Sayaç = Sayaç + 1 If Sayi < 10 Then Exit Do Loop MsgBox "Döngü " & Sayaç & " kere döndü." End Sub NOT: Bir sonsuz döngüyü durdurmak için ESC ya da CTRL+BREAK tuslari kullanilir. For...Next Deyimi Bir grup deyimi belli sayida çalistirarak (tekrar ederek) bir döngü olusturur. Örnegin birden ona kadar (on kere) su islemi yap seklinde. Özellikle bir döngü denetim degiskenin kullanildigi (sayaç) bu döngü yapisi iç içe döngülerin de yapilmasini saglar. For...Next döngüleri özellikle dizilerin islen-mesinde de yaygin olarak kullanilir. Yapisi: For sayaç = baslangiç To bitis [ Step artirim ] [ifade blogu] [Exit For] [ifade blogu] Next [sayaç] For...Next deyiminde kullanilan parametreler sunlardir: Parametre Açiklama For For..Next döngüsüne baslar. sayaç Döngünün kaç kere tekrar edecegini belirten sayisal deger. baslangiç Sayacin ilk degen. To Baslangiç ve bitis degerlerini artirmak için kullanilan sözcük. bitis Sayacin son degeri. Step Artirim sayisi. Belirtilmezse 1 sayilir. Exit For For..Next döngüsünü sona erdirir. Artirim degerini sayaca ekler. Next For..Next döngüsünü sona erdirir. Artirim degerini sayaca ekler. Artirim degeri döngünün isleyisini asagidaki biçimde kontrol eder: Artirim degeri Döngünün isletilmesi kosulu Pozitif ya da 0 sayaç <= bitis Negatif sayaç >= bitis Döngü birkez isledikten sonra artirim degeri sayaç degerine eklenir. Eger herhangi bir artirim degeri kullanilmadiysa o zarnan sayaç bir artirilir. Sayaç degeri bitis degerinden büyük oldugunda döngü sona erdirilîr ve programin kontrolü Next deyiminden itibaren devam eder. NOT: Eger döngünün baslangiç degeri bitis degerinden büyükse döngü çalismaz. Ancak böyle bir döngü Step deyiminin düzenlenmesiyle yapilabilir. Next deyiminin ardinda sayaç degiskenini belirtmek zorunda degilsiniz. Ancak özellikle iç içe döngülerde belirtmekte yarar var. NOT: Sayaç degiskenine döngü iç inde yeniden atama yapmayin. Eger yaparsaniz sonsuz bir döngüye yol açabilirsiniz. For..Next yapisi iç içe (nested) de kurulabilir.Iç içe döngünün isletilmesinde; distaki bir döngünün bir sefer dönmesi içteki döngünün kendi sayisi kadar dönmesi anlamina gelir. Genellikle siralama vb. gibi birbiriyle ilgili iç islemleri olan döngülerde kullanilir: Iç-içe Döngü: For I = 1 To 10 For J = 1 To 10 For K = 1 To 10 ... Next K Next J Next I Örnek: Birden ona kadar sayilarin toplamini alir: Sub Button31_Click() Dim Toplam As Double Toplam = 0 For I = 1 To 10 Toplam = Toplam + I Next I MsgBox " 1'den 10'a kadar sayilarin toplami: " & Toplam Buble Sort (Köpük Siralama) Verilerin siralanmasi programlamada sik karsilasilan bir konudur. Çok sayida siralama yöntemi (algoritmasi) vardir. Bunlardan birisi de köpük siralamadir. Birden çok sayinin siralanmasi için geleneksel yöntemlerden birisi de köpük siralamadir. Köpük siralamadaki algoritma söyledir: Siralanacak elemanlar bir dizi (array) olarak düzenlenir. Ardindan birinci elemanla ikinci eleman birbiriyle karsilastirilir. Eger ikinci ele man birinciden küçükse birinciyle yer degistirilir. Bu islem böyle devam eder: For r = 1 to n-1 For J = r+1 to n if x(j) < x® Then Swap (x(j), x®) Next J Next r Yukardaki ham kodda görüldügü gibi köpük siralama iç -içe iki döngü ile yapilmaktadir. Distaki döngü r'den n- 1 'e kadar dönerken, içteki döngü r+1 'den n'e kadar dönmektedir. For...Next döngüsünde döngü degiskeni, döngünün kullaniminda önemli bir rol oynar. Kullanimlardan genellikle döngü degiskeni ile bir dizinin elemani ya da kayit sayisi gibi degerler temsil edilir: For i = 1 to 7 Günler(i) = " " Next i Asagidaki döngü 10 kez çalisacak ve bilgisayardan 10 kez ses çikartacaktir: Sub Beeps() For x = 1 To 10 Beep Next x End Sub Asagidaki kod ise kullanilabilir ekran yazi tiplerini listeler: Private Sub Form_Click() Dim I As Integer For i = 0 To Screen. FontCount Print Screen. Fonts(i) Next End Sub Step Deyiminin Kullanimi Step deyimi döngü degiskenin (sayacin) belirtilen degerde artmasini ya da azalmasini saglar.Örnegin döngü degiskenin 2,4,6 diye gitmesi. Sub IkininToplami() For j = 2 To 10 Step 2 Toplam = Toplam + j Next j MsgBox "Toplam: " & Toplam End Sub Adimlama azalan biçimde de yapilabilir: Sub Toplama1() For Sayi = 16 To 2 Step -2 Toplam = Toplam + Sayi Next Sayi MsgBox "Toplam: " & Toplam End Sub Dizileri Islemek Için Döngülerin Kullanilmasi Özellikle çok boyutlu dizilerin elemanlarina erismek, onlara deger atamak için For... Next döngüleri idealdir. Asagidaki örnekte iki boyutlu bir dizinin elemanlari sifirlanmaktadir: Örnek: Integer To 10) As Double Dim I As Integer, J As Static MatrisA (1 To 10, 1 For I= 1 To 10 For J = 1 To 10 MatrisA( I , J) = 0 Next J Next I Örnek: Bir ListBox içindeki çift elemanlari silme For i = 0 To List1.ListCount For j = i +1 to List1.ListCount If List1.List(i) = List1.List(j) Then List1.RemoveItem i Ne xt j Next i For...Next Döngülerinden Çikis Bir For...Next deyiminden çikmak için Exit For devimi kullanilir. Yapisi: Exit For Tamsayi Degiskenler Ile Daha Hizli Döngüler Integer degiskenler Variant bir tipli bir degiskene göre daha az bellek yeri harcarlar. Küçük bir programda bu fark o kadar önemli olmayabilir. Ancak büyük programlarda ya da yapilan islem sayisi arttikça bu önem kazanir: Dim HizliSay As Integer ' Birinci durum. Integer kullan. For HizliSay = 0 to 32766 Next HizliSay Dim YavasSay As Variant ' Ikinci durum. Variant kullan. For YavasSay = 0 to 32766 Next YavasSay Yukaridaki örneklerden birinci olani daha hizli çalisir. Bununla birlikte HizliSay degiskeni 32,767'yi geçerse hata olusur. Bunun önlemek için HizliSay degiskeni Long olarak tanimlanabilir. Not: Bilgiler alıntıdır. Cvp: Karar Yapıları 1- Döngüler - goodfalles - 03/05/2009 sağolun hocam güzel paylaşım : ) Cvp: Karar Yapıları 1- Döngüler - Puletin - 03/05/2009 Teşekkürler Hocam Paylaşımınız için... Cvp: Karar Yapıları 1- Döngüler - hakanuss - 03/05/2009 Sayın Hocam teşekkürler vediğiniz bilgiler için Cvp: Karar Yapıları 1- Döngüler - benremix - 18/05/2009 teşekkürler hocam elinize sağlık.... Cvp: Karar Yapıları 1- Döngüler - esrefigit - 18/05/2009 teşekkürler |