PROGRAMLAMA DLLERNE GR Ders 4 Fonksiyonlar Yrd Do

  • Slides: 32
Download presentation
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 4: Fonksiyonlar Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar

PROGRAMLAMA DİLLERİNE GİRİŞ Ders 4: Fonksiyonlar Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği

Akış Çizelgesi Elemanları Başla / Bitir Ekrana Gösterme Veri Girişi Koşul Klavyeden Veri Girişi

Akış Çizelgesi Elemanları Başla / Bitir Ekrana Gösterme Veri Girişi Koşul Klavyeden Veri Girişi Döngü İşlem Fonksiyon Çağırma Yazıcıdan Çıktı Doğrudan Erişimli Dosya Sıralı Erişimli Dosya Akış Yönü

Faktöriyel Hesabı Akış Çizelgesi Başla sayi fakt = 1 i=1 i <= sayi i++

Faktöriyel Hesabı Akış Çizelgesi Başla sayi fakt = 1 i=1 i <= sayi i++ fakt = fakt * i i <= sayi H fakt Bitir E fakt = fakt * i i=i+1

Permütasyon & Kombinasyon • Eleman sayısı n olan bir kümenin içinden r kadar eleman

Permütasyon & Kombinasyon • Eleman sayısı n olan bir kümenin içinden r kadar eleman seçerek yapılabilecek permütasyonların hesabı: • Kombinasyonun permütasyondan farkı, sıralamanın önemli olmamasıdır. Kombinasyonu P(n, r) permütasyonların toplamını seçilen elemanların kendi aralarındaki sıralanma sayılarına bölerek bulabiliriz:

Permütasyon Hesabı Akış Çizelgesi Başla n, r i=1 i <= n - r i++

Permütasyon Hesabı Akış Çizelgesi Başla n, r i=1 i <= n - r i++ f 1 = 1 f 2 = 1 i=1 i <= n i++ f 1/f 2 f 1 = f 1 * i Bitir f 2 = f 2 * i

Kombinasyon Hesabı Akış Çizelgesi Başla n, r f 1 = 1, f 2 =

Kombinasyon Hesabı Akış Çizelgesi Başla n, r f 1 = 1, f 2 = 1 f 3 = 1 i=1 i <= n i++ f 1 = f 1 * i i=1 i <= n - r i++ f 2 = f 2 * i i=1 i <= r i++ f 3 = f 3 * i f 1/(f 2*f 3) Bitir

Fonksiyon • Bir program içinde sıkça kullanılan bir işlem bloğunu fonksiyon olarak tanımlamak ve

Fonksiyon • Bir program içinde sıkça kullanılan bir işlem bloğunu fonksiyon olarak tanımlamak ve ihtiyaç duyulduğunda bu fonksiyonu çağırmak daha pratik ve okununca anlaşılması daha kolay olan bir yöntemdir. • Fonksiyonlar bir ya da daha çok argüman (parametre) alarak, bu argümanlara göre işlemi yapar, ve geriye bir sonuç döndürürler. • Permütasyon için 2 defa, kombinasyon için 3 defa faktöriyel hesabı döngüsünü tekrar etmek yerine faktöriyel fonksiyonu yaratılabilir.

Fonksiyon ile Permütasyon Hesabı Başla n, r f 1 = fakt(n) f 2 =

Fonksiyon ile Permütasyon Hesabı Başla n, r f 1 = fakt(n) f 2 = fakt(n-r) f 1/f 2 Bitir • Yandaki akış çizelgesindeki fonksiyon ile çözüm çok daha basit ve anlaşılır görünmektedir. • Program kodunda aynı döngünün tekrar yazılması her ne kadar programın çalışma hızını etkilemese de, kodun gereksiz yere uzun olmasına ve kodu okuyan için daha karmaşık görünmesine neden olacaktır.

Permütasyon Programı Döndüreceği değerin veri tipi static long fakt(int sayi) { Alacağı değerin (parametrenin)

Permütasyon Programı Döndüreceği değerin veri tipi static long fakt(int sayi) { Alacağı değerin (parametrenin) veri tipi long f = 1; for (int i = 2; i <= sayi; i++) f = f * i; Main fonksiyonu içinde tanımlanan n ve r return f; değişkenleri byte olarak tanımlanmış olsa da n - r } hesabı int veri tipinde sonuç üretir (C dilinde böyle bir durum olmaz). Bu nedenle fonksiyonun static void Main() { parametresi int olarak belirtilmiştir. byte n, r; Console. Write("n değerini giriniz : "); n = Convert. To. Byte(Console. Read. Line()); Console. Write("r değerini giriniz : "); r = Convert. To. Byte(Console. Read. Line()); Console. Write. Line("permütasyon = " + fakt(n) / fakt(n - r)); } Fonksiyonun parametresi byte olsaydı, buradaki n - r için tip dönüşümü yapılmalıydı: fakt((byte)(n - r)). Aksi halde cannot convert from 'int' to 'byte' hatası verir.

Permütasyonu Hızlı Hesaplamak Başla n, r per = 1 i = n-r+1 i <=

Permütasyonu Hızlı Hesaplamak Başla n, r per = 1 i = n-r+1 i <= n i++ per Bitir per = per * i • Permütasyon hesabı yaparken, faktöriyel fonksiyonunu 2 defa çağırmak yerine, faktöriyel için kurulan for döngüsünü 1 yerine (n-r)+1 değerinden başlatan yeni bir fonksiyon yazmak daha uygundur.

Ödev 1 • fakt fonksiyonunu değiştirerek per fonksiyonu oluşturunuz. • Bu iki fonksiyonu kullanarak

Ödev 1 • fakt fonksiyonunu değiştirerek per fonksiyonu oluşturunuz. • Bu iki fonksiyonu kullanarak kombinasyon hesabı yapan programı yazınız. • Programda ikinci girilen sayının ilk sayıdan küçük olması kontrol edilsin hata varsa tekrar girilmesi sağlansın (r < n olmalı).

Parametre olarak aldığı sayının asal olup olmadığını bulan fonksiyon static bool asal(int sayi) {

Parametre olarak aldığı sayının asal olup olmadığını bulan fonksiyon static bool asal(int sayi) { for (int i = 2; i <= sayi / 2; i++) if (sayi % i == 0) return false; return true; } static void Main() Int 32. Parse ile Convert. To. Int 32 aynıdır. { Console. Write("Sayıyı giriniz : "); int n = Int 32. Parse(Console. Read. Line()); if (asal(n)) Console. Write("Sayı asaldır"); else Console. Write("Sayı asal değildir"); } NOT: if(asal(n)) yerine if(asal(n) == true) yazılabilirdi. Eğer bu şekilde yazılırsa, asal fonksiyonu true değer döndürdüğünde (true == true) kontrolü yaparak fazladan bir karşılaştırma yapmış olurduk.

Prosedür (Yordam) • Fonksiyonun değer döndürmeyen türüdür. • Değer döndürmediği için prosedür isminden önce

Prosedür (Yordam) • Fonksiyonun değer döndürmeyen türüdür. • Değer döndürmediği için prosedür isminden önce void yazılır ve prosedür içinde return ifadesi kullanılamaz. • Genellikle matematiksel hesaplama işlemlerinde değil, programın mantıksal olarak bloklara ayrılmasında kullanılır. • Tüm programlarda yer alan static void Main() programın başlangıç prosedürüdür (Bir proje içinde birden fazla bulunamaz).

Toplama yapan Prosedür ve Fonksiyon static void Toplam. Goster(int a, int b) { Değer

Toplama yapan Prosedür ve Fonksiyon static void Toplam. Goster(int a, int b) { Değer döndüremediğimiz için sonucu Console. Write. Line(a + b); burada ekrana göstermek zorundayız } static int Topla(int a, int b) { return a + b; } Toplam sonucunu döndürüyoruz, burada ekrana göstermeye gerek yok static void Main() { Toplam. Goster(45, 67); Console. Write. Line(Topla(45, 67)); } Topla fonksiyonundan gelen 112 değerini burada ekrana gösteriyoruz

Dört İşlem Prosedürü static void Dort. Islem(int a, char c, int b) { if

Dört İşlem Prosedürü static void Dort. Islem(int a, char c, int b) { if (c == '+') Console. Write. Line("{0} + {1} = {2}", a, b, a + b); if (c == '-') Console. Write. Line("{0} - {1} = {2}", a, b, a - b); if (c == '*') Console. Write. Line("{0} * {1} = {2}", a, b, a * b); if (c == '/') Console. Write. Line("{0} / {1} = {2}", a, b, a / b); } static void Main() { Dort. Islem(4, '*', 3); } NOT: Bazı dillerde fonksiyon tanımı «function» , prosedür tanımı ise «procedure» yada «subroutine» gibi isimler ile yapılır. C ve türevi olan C++, Java, C# gibi dillerde böyle bir tanım olmadığı için genellikle prosedüre de fonksiyon denir.

Parametresiz Prosedürler • Prosedürler parametre verilmeden de çağrılabilir. Önceki örnekte Dort. Islem prosedürü a,

Parametresiz Prosedürler • Prosedürler parametre verilmeden de çağrılabilir. Önceki örnekte Dort. Islem prosedürü a, b ve c parametreleri ile çağrılmıştır. Bu değerler global değişken olarak tanımlanabilir, ve Dort. Islem() şeklinde parametresiz çağrım yapılabilirdi. • Programın başlangıç noktası olan Main prosedürü hem parametre ile hem de parametresiz kullanılabilir: static void Main(string[] args) static void Main()

Parametre alan Main ile dört işlem args string dizisi komut istemi (siyah ekran) static

Parametre alan Main ile dört işlem args string dizisi komut istemi (siyah ekran) static void Main(string[] args) üzerinden verilen argümanları alır { double sayi 1 = Convert. To. Double(args[0]); double sayi 2 = Convert. To. Double(args[2]); if (args[1] == "+") Console. Write. Line(sayi 1 + sayi 2); if (args[1] == "-") Console. Write. Line(sayi 1 - sayi 2); if (args[1] == "*") Console. Write. Line(sayi 1 * sayi 2); if (args[1] == "/") Console. Write. Line(sayi 1 / sayi 2); } Program derlendikten sonra elde edilen dosyanın adı “hesapla. exe” ise; komut isteminden hesapla 2, 5 * 5, 3 şeklinde çalıştırıldığında; args[0] = "2, 5", args[1] = "*" ve args[2] = "5, 3" olacak ve işlemin sonucu ekranda gösterilecektir.

Parametre alan Main ile permütasyon static long fakt(int sayi) { long f = 1;

Parametre alan Main ile permütasyon static long fakt(int sayi) { long f = 1; for (int i = 2; i <= sayi; i++) f = f * i; return f; } C#’ta fakt fonksiyonu Main fonksiyonundan sonra da yazılabilirdi. Fakat C dilinde bunu yapabilmek için fakt fonksiyonunun tanımını main fonksiyonundan önce vermelisiniz (bak: son slayt) static void Main(string[] args) { byte n = Convert. To. Byte(args[0]); byte r = Convert. To. Byte(args[1]); Console. Write. Line(fakt(n) / fakt(n - r)); } Program derlendikten sonra elde edilen dosyanın adı “permutasyon. exe” ise; komut isteminden permutasyon 10 5 şeklinde çalıştırıldığında; args[0] = "10" ve args[1] = "5" olacaktır.

Lokal ve Global Değişkenler • Fonksiyon içinde tanımlanan bir değişken lokal değişkendir ve sadece

Lokal ve Global Değişkenler • Fonksiyon içinde tanımlanan bir değişken lokal değişkendir ve sadece o fonksiyon içinde kullanılabilir. • Fonksiyon dışında (sınıf içinde) tanımlanan değişken ise global değişkendir ve o sınıfa ait tüm fonksiyonlarda kullanılabilir. • Eğer değişken fonksiyonun içindeki bir kod bloğunda (örneğin for döngüsünün içinde) tanımlanmış ise, o değişken sadece o kod bloğunda ve varsa alt kod bloklarında geçerlidir.

Global ve Lokal olarak aynı değişken ismini kullanma durumu • Eğer aynı isimde bir

Global ve Lokal olarak aynı değişken ismini kullanma durumu • Eğer aynı isimde bir değişken hem sınıf içinde hem de fonksiyon içinde yar alıyorsa fonksiyonun içinde lokal olan değişken kullanılır (C++ dilinde global olana erişmek için değişken adından önce : : kullanılabilir). class A { int i = 0; void F() { i = 1; int i; i = 2; } } Bu kod üzerinde hem lokal hem de global olarak ‘i’ adında bir değişken tanımlandığı için F() prosedürü içinde lokal olan i değişkene değer atanabilir. Fonksiyondaki ilk satır hata verir. Çünkü lokal olan değişken ikinci satırda tanımlanmıştır. İkinci satırı silerseniz hata vermez (global olan değişkeni görür)

Örnek: Aşağıdaki programın üreteceği ekran çıktısını yazınız static float fonk(float a, float b){ while

Örnek: Aşağıdaki programın üreteceği ekran çıktısını yazınız static float fonk(float a, float b){ while (b > a) { for ( ; b > a; a *= 2) { a = a*2; Console. Write. Line("{0: F 2}", b/a); } 9, 00 4, 50 return a; 4, 50 2, 25 1, 13 } 1, 13 0, 56 3, 00 16, 00 static void Main(){ float a=3, b=3, c=fonk(a/b, a*b); Console. Write("{0: F 2} {1: F 2} {2: F 2}", a, b, c); }

Ödevler 2. Bir sayının karekökünü bulan ve değer olarak döndüren fonksiyonu yazınız. 3. OBEB

Ödevler 2. Bir sayının karekökünü bulan ve değer olarak döndüren fonksiyonu yazınız. 3. OBEB ve OKEK işlemlerini fonksiyonları kullanarak yapınız. 4. Parametre olarak aldığı sayının yazı ile yazılışını döndüren fonksiyonu yazınız. Örn: 694 değerini parametre olarak alacak “AltıYüz. Doksan. Dört” string’ini döndürecek.

Ödevler 5. Parametre olarak aldığı 2 sayının “dost sayılar” olup olmadığını bulan fonksiyonu yazınız.

Ödevler 5. Parametre olarak aldığı 2 sayının “dost sayılar” olup olmadığını bulan fonksiyonu yazınız. • A ve B tam sayılardır: – – A’nın tam bölenlerinin toplamı B’ye eşitse B’nin tam bölenlerinin toplamı A’ya eşitse Bu iki sayı dost sayıdır Örn: 220 ve 284 sayıları dost sayıdır

Ödevler 6. M. Ö. 2589 -2566 yılları arasında yapıldığı tahmin edilen dünyanın 7 harikasından

Ödevler 6. M. Ö. 2589 -2566 yılları arasında yapıldığı tahmin edilen dünyanın 7 harikasından biri olan Keops Piramdi’nin en az 2. 3 milyon taş bloktan oluştuğu tahmin edilmektedir. A. B. Piramidin tabanında kare biçiminde yerleştirilmiş N*N adet, ikinci katında (N-1)*(N-1), üçüncü katında (N-2)*(N-2), . . . , N. katında (son kat) 1 taş blok olduğu kabul edilirse, piramitin kaç taş bloktan oluştuğunu ve kaç katlı olduğunu bulan programı yazınız (2. 3 milyondan büyük olacak şekilde en az kaç kat olmalıdır). Piramidin tam 24 yılda bittiğini ve işçilerin günde 10 saat çalıştıklarını düşünelim. İşçilerin bir saatte ortalama kaç blok yerleştirdiklerini bulan Saat. Basina. Blok fonksiyonu yazınız (1 yıl = 365 gün + 6 saat kabul edilecek).

EKLER C ve VB. NET dilleri ile ilgili bu kısımdaki slaytlardan sınavlarda sorumlu değilsiniz.

EKLER C ve VB. NET dilleri ile ilgili bu kısımdaki slaytlardan sınavlarda sorumlu değilsiniz.

Permütasyon Programı (C) #include <stdio. h> Döndüreceği değerin veri tipi long int fakt(short int

Permütasyon Programı (C) #include <stdio. h> Döndüreceği değerin veri tipi long int fakt(short int sayi){ Alacağı değerin veri tipi long int f=1; for (int i=2; i<=sayi; i++) f = f * i; return f; } NOT: long int yerine long, short int yerine short yazılabilir. void main(){ short int n, r; printf("n degerini giriniz : "); scanf("%d", &n); printf("r degerini giriniz : "); scanf("%d", &r); printf("permutasyon = %d", fakt(n) / fakt(n-r)); }

Permütasyon Programı (VB. NET) Function fakt(sayi As Byte) As Long fakt = 1 For

Permütasyon Programı (VB. NET) Function fakt(sayi As Byte) As Long fakt = 1 For i = 2 To sayi = fakt = fakt * i Next End Function Döndüreceği değerin veri tipi Dim f As Long = 1 For i = 2 To sayi f = f * i Next Return f Alacağı değerin veri tipi Sub Main() Dim n, r As Byte Console. Write("n degerini giriniz : ") n = Convert. To. Byte(Console. Read. Line()) Console. Write("r degerini giriniz : ") r = Convert. To. Byte(Console. Read. Line()) Console. Write("permutasyon = " + (fakt(n) / fakt(n - r)). To. String) End Sub

Parametre olarak aldığı sayının asal olup olmadığını bulan fonksiyon (C) #include <stdio. h> bool

Parametre olarak aldığı sayının asal olup olmadığını bulan fonksiyon (C) #include <stdio. h> bool asal(int sayi){ for (int i=2; i<=sayi/2; i++) if (sayi%i == 0) return false; return true; } C dilinde bool veri tipi yoktur, C++ dilinde vardır. Kaynak kodunuzun dosya isminde uzantı ‘cpp’ ise C++’a göre derleme yapılır. Uzantı ‘c’ ise derlediğinizde bool veri tipi için ve true/false değerleri için hata verecektir. “true” için 1, “false” için 0, “bool” için de int kullanabilirsiniz. void main(){ int n; C dilinde for içinde değişken printf("sayiyi giriniz : "); tanımı yapılamaz, C++ ve C# scanf("%d", &n); dillerinde yapılabilir. if (asal(n)) printf("Sayi asaldir"); else printf("Sayi asal degildir"); } NOT: if(asal(n)) yerine if(asal(n) == true) yazılabilirdi. Eğer bu şekilde yazılırsa, asal fonksiyonu true değer döndürdüğünde (true == true) kontrolü yaparak fazladan bir karşılaştırma yapmış olurduk.

Prosedür Tanımlama ve Çağırma • C void Toplam. Goster(int a, int b){ printf("%dn", a

Prosedür Tanımlama ve Çağırma • C void Toplam. Goster(int a, int b){ printf("%dn", a + b); } Toplam. Goster(45, 67); • C# void Toplam. Goster(int a, int b){ Console. Write. Line(a + b); } Toplam. Goster(45, 67); • VB. NET Sub Toplam. Goster(a As Integer, b As Integer) Console. Write. Line(a + b) End Sub Toplam. Goster(45, 67)

Parametre alan main ile permütasyon #include <stdio. h> #include <stdlib. h> long fakt(short sayi){

Parametre alan main ile permütasyon #include <stdio. h> #include <stdlib. h> long fakt(short sayi){ long int f=1; for (int i=2; i<=sayi; i++) f = f * i; return f; } stdlib. h kütüphanesi atoi fonksiyonu için eklenmiştir. Bu fonksiyon C# ve VB dillerinde kullandığımız Convert. To. Int 32 gibi string -> integer dönüşümü yapar. argv[] verilen parametreleri string türünde elde etmemizi sağlayan bir dizi, argc ise bu dizideki eleman sayısını veren tamsayı değişkendir. void main(int argc, const char* argv[]){ short n = atoi(argv[1]); short r = atoi(argv[2]); printf("permutasyon = %dn", fakt(n) / fakt(n-r)); } Program derlendikten sonra elde edilen dosyanın adı “permutasyon. exe” ise; komut isteminden permutasyon 10 5 şeklinde çalıştırıldığında; argc = 3, argv[0] = "permutasyon", argv[1] = "10" ve argv[2] = "5" olacaktır.

Örnek: Aşağıdaki programın üreteceği ekran çıktısını yazınız #include <stdio. h> float fonk(float a, int

Örnek: Aşağıdaki programın üreteceği ekran çıktısını yazınız #include <stdio. h> float fonk(float a, int b){ while (b > a) { 9. 00 4. 50 a = a*2; for (; b>a; a=a*2) 4. 50 2. 25 printf("%. 2 fn", b/a); 2. 25 1. 13 } 1. 13 0. 56 return a; 3. 00, 16. 00 } main(){ float a=3, b=3, c=fonk(a/b, a*b); printf("%. 2 f, %. 2 f", a, b, c); }

C’de Fonksiyonun Tanımı • C dilinde ya diğer tüm fonksiyonlar main() fonksiyonundan önce yazılır,

C’de Fonksiyonun Tanımı • C dilinde ya diğer tüm fonksiyonlar main() fonksiyonundan önce yazılır, yada en azından tanım satırları yazılır. Örn: int fakt(int); // fonksiyon tanımı void main(){ printf("%d", fakt(5)); } int fakt(int sayi){ … faktöriyel hesabı … }