if Komutu Bir mantıksal (boolean) ifadenin sonucuna göre bazı komutların çalıştırılıp, bazı komutların da çalıştırılmamasını sağlar. Komut(lar) (Doğru) Doğru Yanlış Boolean Komut(lar) (Yanlış) if (boolean ifade) doğru iken komut(lar) else yanlış iken komut(lar) if Komutu if (x<0)x = -x; x = -x x<0? if (x>y) int t = x; x = y; y = t; ; if (x>y) max = x; else max = y; x>y? int t = x; x = y; y = t; x>y? max = x; max = y; MAT213 Bilgisayar Programlama I Anadolu Üniversitesi Fen Fakültesi Matematik Bölümü Emrah Akyar Sunum #2 Kontrol Yapıları ve Döngüler Doğru Komut 1 Komut 2 Komut 1 Boolean 1 Yanlış Doğru Komut 3 Boolean 2 Komut 2 Komut 4 Yanlış Komut 3 Doğrusal kontrol akış diyagramı (straight-line control flow chart) Kontrol yapıları ve döngü içeren akış diyagramı (control flow with conditionals and loops)
while komutu (örnek) int i = 4; while (i <= 10) i = 4; i <= 10? i = i + 1; Döngü içerisindeki komutlarla bir noktadan sonra mutlaka mantıksal ifadenin false değer alması sağlanmalıdır. while komutu (örnek) int i = 4; while (i <= 10) i = 4; i <= 10? i = i + 1; Döngü içerisindeki komutlarla bir noktadan sonra mutlaka mantıksal ifadenin false değer alması sağlanmalıdır. if Komutu (Örnek) public class YazıTura public static void main(string[] args) double para = Math.random(); if (para<0.5) System.out.println("Tura"); else System.out.println("Yazı"); para>=0.5 while Komutu while (mantıksal ifade) doğru iken çalıştırılacak komut(lar) Kullanım şekli if komutuyla aynıdır. Ancak if komutundan farklı olarak mantıksal ifadenin sonucu mantıksal ifade false oluncaya kadar her seferinde yeniden kontrol edilir. Yani while komutu özdeş bir dizi if komutuna denktir. if (mantıksal ifade) komut(lar) if (mantıksal ifade) komut(lar) if (mantıksal ifade) komut(lar) Döngünün devam koşulu Ayrı bir başlangıç komutu Döngü içerisinde tek komut olduğunda parantezler kullanılmayabilir. int v=1; while ( v<=n/2 ) v=2*v; Gövde (body) kısmı
for döngüsü for (<başlangıç>; <mantıksal ifade>; <artış>) <komut(lar)> <başlangıç>; while (<mantıksal ifade>) <komut(lar)> <artış>; for döngüsü for(int i = 1; i <=10; i=i+1) System.out.println(i + ". Merhaba"); Birleşik atama ifadeleri: i=i+1; i++; ++i; i+=1; i=i+1; i--; --i; i-=1; v=2*v; v*=2; v+=v; Tamsayılar için kullanılır. while komutu (örnek) Argüman olarak verilen negatif olmayan bir N tamsayısı için 2 nin 2 N sayısına kadar olan kuvvetlerini yazan program. public class IkininKuvvetleri public static void main(string[] args) int N = Integer.parseInt(args[0]); int v = 1; int i = 0; while (i<=n) System.out.println(i+ " " + v); v = 2*v; i = i+1; Alıştırma: Argüman olarak verilen ve negatif olmayan bir N tamsayısı için 2 nin N den daha küçük yada N ye eşit olan en büyük kuvvetini yazan program. Alıştırma (while komutu) Argüman olarak verilen ve negatif olmayan bir N tamsayısı için 2 nin N den daha küçük yada N ye eşit olan en büyük kuvvetini yazan programı yazınız. Örneğin, N=13 ise sonuç 8, N=1000 ise sonuç 512 olmalıdır. int v = 1; while ( v <= N/2 ) v = 2*v; v her zaman 2 nin kuvveti olur. v asla N den büyük olmaz. Döngü içerisinde v hep arttığından döngü sona erer. Döngü sona erdiğinde 2*v değeri N den daha büyüktür.
İç içe geçmiş if, while ve for komutları i=1; i++; i<=10? for(int i = 1; i <=10; i=i+1) j++; for (int j=1; j<=10; j++) System.out.print(i*j + "\t"); System.out.println(); j=1; j<=10?.print(i*j + "\t");.println(); İç içe geçmiş for komutu (Asal çarpanlara ayırma) long N=1234567890L; for (long i=2; i<=n/i; i++) while (N%i==0) System.out.print(i+" "); N=N/i; if (N>1) System.out.print(N); long tipteki bir değişkenin içerisine çok büyük basamaklı sayılar koyabilmek için değerin (literal) sonuna L harfi koyulmalıdır. Küçük L harfi de kullanılabilir ancak 1 ile karıştığı için tavsiye edilmez. Asal çarpanlara ayırma kriptoloji açısından çok önemli bir konudur ve maalesef çok büyük sayıları (yüzlerce ya da binlerce basamağı olan) asal çarpanlarına ayırmak için henüz efektif bir algoritma yoktur. for döngüsü for Döngüsünde Tanımlanan Değişkenin Kapsamı (Scope): for(int i = 1; i <=10; i=i+1) System.out.println(i + ". Merhaba"); Gövde/Body (for) Hata! i değişkeni for döngüsü dışında tanımlı değil! İç içe geçmiş if, while ve for komutları 1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100
switch Komutu switch (gun) case 0 : System.out.println("Pazartesi"); case 1 : System.out.println("Salı"); case 2 : System.out.println("Çarşamba"); case 3 : System.out.println("Perşembe"); case 4 : System.out.println("Cuma"); case 5 : System.out.println("Cumartesi"); case 6 : System.out.println("Pazar"); default: System.out.println("Hatalı"); if (gun==0) System.out.println("Pazartesi"); else if (gun==1) System.out.println("Salı"); else if (gun==2) System.out.println("Çarşamba"); else if (gun==3) System.out.println("Perşembe"); else if (gun==4) System.out.println("Cuma"); else if (gun==5) System.out.println("Cumartesi"); else if (gun==6) System.out.println("Pazar"); else System.out.println("Hatalı"); switch Komutu (Örnek) int month = 2; int year = 2000; int numdays = 0; switch (month) case 1: case 3: case 5: case 7: case 8: case 10: case 12: numdays = 31; case 4: case 6: case 9: case 11: numdays = 30; case 2: if (((year % 4 == 0) &&!(year % 100 == 0)) (year % 400 == 0)) numdays = 29; else numdays = 28; default: System.out.println("Hatalı ay!"); System.out.println("Number of Days = " + numdays); break komutu Bazı durumlarda döngü tamamlanmadan döngünün bitirilmesi gerekebilir. break komutu bu amaçla kullanılır. long N=234534567708541L; boolean asal=true; for (long i=2;i <= Math.round(Math.sqrt(N));i++) if (N%i == 0) asal=false; System.out.println(asal); Sayı asal değilse, döngünün tamamlanmasını beklemeden döngüden çık! Bir sayı asal değilse, karekökünden daha küçük olan bir asal çarpanı vardır (Neden?). continue komutu continue komutu döngünün gövde (body) kısmında yer alan ve bu komuttan sonra gelen komutların çalıştırılmaması için kullanılır. for (int i=1;i<=5;i++) if (i%2==0) continue; Çıktısı: 1 3 5
do-while komutu do komut(lar) while (<mantıksal ifade>); while döngüsüne benzer ancak ilk başta mantıksal ifadenin doğru olup olmadığı kontrol edilmez. Yani while döngüsünün başlangıç koşulu doğru (true) ise aralarında bir fark yoktur. int i=1; do while (i<1); Mantıksal ifade doğru olmadığı halde, döngü içerisindeki println komutu çalıştırılır. Ekrana 1 yazar. int i=1; while (i<1) Mantıksal ifade doğru olmadığı için döngü içerisindeki println komutu çalıştırılmaz. Ekrana herhangi birşey yazmaz. do-while komutu double x,y; do x = Math.random()*2.0-1.0; y = Math.random()*2.0-1.0; while ( x*x + y*y > 1.0); System.out.println(x); System.out.println(y); (x,y)