ALGORİTMALAR VE PROGRAMLAMA DENEY-2: MATLAB da FONKSİYON M-DOSYALARI, KOŞUL İŞLEMLERİ (switch case), BREAK, CONTINUE, RETURN KOMUTLARI FONKSİYON M-DOSYALARI: Fonksiyon, belirli sayıda verileri kullanarak bunları işleyen ve bir sonuç üreten yapıdır. Fonksiyon m-dosyaları düzyazı (script) m-dosyalarına benzerler. Ancak iki temel farkı vardır. 1. Fonksiyonlar bir değeri ve değerler kümesini döndürür. 2. Fonksiyonların içinde atanmış değişkenler, fonksiyona ait yerel değişkenlerdir (local variables) ve MATLAB komut penceresinde gösterilmezler. Bu değişkenler komut satırından da geri çağırılamazlar. Oysa script lerde değişkenler genel (global variables) olup MATLAB komut penceresinde gösterilir ve komut satırından çağırılabilirler. Fonksiyonlar, belirli sayıda verileri kullanarak bunları işleyen ve bir sonuç üreten programlardır. Fonksiyonları programlarda sadece fonksiyon adı ve sözdizimine uymak şartıyla defalarca kullanma olanağı bulunmaktadır. Fonksiyonların genel yazım biçimi; function cikisdegiskeni_1=fonksiyon_adi (girisdegiskeni_1) Bu yazım biçiminde fonksiyona bir adet parametre (giriş_değişkeni_1) ile giriş verilmektedir. Fonksiyonun çıkış değişkeni sayısı ise yine bir tanedir. Giriş ve çıkış sayısı birden fazla ise fonksiyon tanımlaması aşağıdaki gibi yapılır; function [out1,out2,...,outn] = fonksiyon_adı (in1,in2,...,inm) Aşağıda bir örnek fonksiyon dosyası verilmiştir. Fonksiyon m-dosyasında önemli noktalar: 1. Fonksiyon m-dosyalarında ilk satır kesinlikle function ile başlamalıdır. Bu ilk satır fonksiyon tanımının yapıldığı satır olup fonksiyon adı ve giriş çıkış değişkenleri bu satırda belirtilir. 1
2. Fonksiyon hakkında yardım istenildiğinde, yani help fonksiyon_adi yazıldığında görüntülenecek % ile başlayan açıklama satırları ilk satırdan hemen sonra yazılmalıdır. 3. Fonksiyon adı ile dosya adı aynı olmalıdır. 4. Değişken çıkışları ekrana yazdırılmamalıdır. 5. Bir fonksiyon içerisinde kullanılan bütün değişkenler bu fonksiyon için geçerlidir. Örnek: İki nokta arasındaki uzaklığı bulan programı m-fonksiyon kullanarak yazınız. x1 = 1.noktanın koordinatının apsisi; x2 = 2.noktanın apsisi y1 = 1.noktanın ordinatı; y2 = 2.noktanın ordinatı ---------------------------------------------------------------- function mesafe = uzaklik(x1,y1,x2,y2) % İki nokta arasındaki uzaklık hesaplanır. mesafe=sqrt((x2-x1)^2+(y2-y1)^2); ---------------------------------------------------------------- Oluşturulan dosyanın adı uzaklik.m olacak şekilde kayıt edilmelidir. Artık uzaklik adında bir fonksiyon oluşturuldu. Bu fonksiyonu oluşturmak için bir m-dosyasında aşağıdaki kodları yazınız ve çalıştırınız. clear all; clc; devam=1; while devam==1 a1=input('birinci noktanın x ekseni değerini giriniz:'); b1=input('birinci noktanın y ekseni değerini giriniz:'); a2=input('ikinci noktanın x ekseni değerini giriniz:'); b2=input('ikinci noktanın y ekseni değerini giriniz:'); uzk=uzaklik(a1,b1,a2,b2); fprintf('iki nokta arasındaki uzaklık %4.2f '' dir.\n',uzk); goster=sprintf('uzaklik değeri:%4.2f',uzk); msgbox(goster,'uzaklik'); x=input('yeni bir uzaklık hesabı yapmak ister misiniz? (Evet:E), (Hayır:Diğer Tuşlar)','s'); if x=='e' x=='e' devam=1; else devam==2; break; help uzaklik Örnek: Girilen iki sayının harmonik ortalamasını bulan fonksiyon m-dosyasını yazınız. function h=horta(a,b) %horta:harmonik Ortalama % horta(a,b) verilen iki sayının harmonik ortalamasını hesaplar h=2/(1/a+1/b) Bu fonksiyonu komut penceresinden çağırarak istediğiniz iki sayının harmonik ortalamasını hesaplayınız. Örnek: Girilen bir sayı vektörünün ortalama değerini ve standart sapmasını bulan bir fonksiyon yazalım. ----------------------------------------- function [ort, stds] = ort_stdsapma (x) 2
% ort_stdsapma fonksiyonu girilen matristeki her bir sütunun ortalama değerini %ve standart sapmasını bulur. [m,n] = size(x); if m == 1 m = n; ort = sum(x)/m; stds=sqrt(sum(x.^2)/m-ort.^2); ------------------------------------------------- MATLAB komut satırında aşağıdaki satırlar sırasıyla yazılırsa; >> a=[1 2 3 4 5]; >> [x,y]=ort_stdsapma(a) Örnek: Bir metin içinde kaç tane a harfinin bulunduğunu hesaplamak için bir fonksiyon-m dosyası oluşturunuz. function kactane=a_harfi_sayisi(x) kactane=0; for i=1:1:length(x) if x(i)=='a' kactane=kactane+1; clear all; clc; metin=input('bir metin giriniz:','s'); sayi=a_harfi_sayisi(metin); fprintf('a harfi sayısı %d dir. \n',sayi); Örnek: Aşağıdaki gibi bir ekran çıktısı verecek ekranarakambas.m adında bir fonksiyon M dosyası yazınız. (Fonksiyonunuz kisine hiçbir argüman almayacak ve geriye yine hiçbir değer çevirmeyecektir.) EKRAN ÇIKTISI >>ekranarakambas() 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 1 2 3 4 5 6 1 2 3 4 5 1 2 3 4 1 2 3 1 2 1 ekranarakambas.m function ekranarakambas() clc; for i=1:9 %satir sayisi for j=1:(10-i) %sutun sayisi fprintf('%d ',j); fprintf('\n'); Komut satırında aşağıdaki komutu çalıştırınız. >>ekranarakambas Örnek: Aşağıda bir M-fonksiyon ve bir de M-düzyazı şeklinde MATLAB kodları verilmiştir. function s=polinom_sonuc(a,k) % A polinomunun x=k için değerini hesaplar. s=0; for i=0:1:(length(a)-1) s=s+a(i+1)*k^(i); clear all; B=[1 2 5]; Sonuc=polinom_sonuc(B,3) 3
Yukarıda verilen kodları uygun şekilde MATLAB de yazınız ve kaydediniz. M-düzyazı şeklinde olan MATLAB kodunu çalıştırınız. Burada; B(x) polinomu 2 B ( x) x 2x 5 dir. Fonksiyon-m dosyasının çalışmasını inceleyiniz. SORULAR: 1) Bir n elemanlı kümenin r elemanlı kombinasyon sayısını hesaplamak için bir n! fonksiyon-m dosyası oluşturunuz. C( n, r) r!( n r)! 2) a) Aşağıda sağda akış diyagramı verilen, p sayısından A matrisinde kaç tane olduğunu bulan fonksiyonun MATLAB kodunu yazınız. (İlk satır: function sayi=kactane(a,p) olacaktır). b) Aşağıda solda verilen akış diyagramını gerçekleyen MATLAB kodunu yazınız. SINAV SORUSU Başla A=[1 2 1;2 1 1;4 1 1]; B=[8 9 1;5 7 8;9 1 6]; sayi=kactane(a,1) [a,b]=size(b) kactane fonkiyonuna Başla A değişkenini ve p değişkenini fonksiyon girişi olarak al. [m,n]=size(a) sayi=0 i=1,a,1 B Dur j=1,b,1 B(i,j)<sayi E B(i,j)=0 H B(i,j)=1 i=1,m,1 sayi değerini fonksiyon dönüş değeri olarak döndür Dur j=1,n,1 A(m,n)=p E sayi=sayi+1 H 3) Girilen iki sayının aralarında asal olup olmadığını kontrol edecek ve aralarında asal ise 1 değil ise 0 çıkışı verecek olan fonksiyon-m dosyasını oluşturunuz. 4) MATLAB da tanımlı olan polyder adlı bir fonksiyon mevcuttur. Bu fonksiyon girilen bir 2 polinomun türevini almaktadır. Örneğin; A ( x) x x 1 olsun. Bu polinomun türevi tura ( x) 2x 1 dir. MATLAB da aşağıdaki satırları yazınız. >> A=[1 1 1]; >> polyder(a) Buradaki polyder() fonksiyonunun işini gerçekleyen bir fonksiyon-m dosyası oluşturunuz. Fonksiyonunuzun adı polinomturev.m olsun. KOŞUL İŞLEMLERİ: if (eğer) yapısı bir koşulun gerçekleşmesi durumunda bir i yaptırmak için sıklıkla kullanılır. Bu ifade, if koşul if koşul else if koşul elseif else 4
switch (değiştir) if yapısına benzer. Burada daha çok sözel olarak belirtilen durumlara göre yönlirme i yapılır. Bu yapının kullanımı case ile aşağıdaki gibidir; switch durum case durum1 1 case durum2 2 otherwise 3 Örnek: gun degiskeninin, is gunu olup olmadığına karar vermek için aşağıdaki kodlar düşünülür; gun=input('hangi gun=', 's'); switch lower(gun) case {'pazartesi', 'sali','carsamba','persembe','cuma'} disp('iş günü') case {'cumartesi','pazar'} disp('tatil!') Örnek: Kullanıcı tarafından girilen bir a=10.2424542 değişkeninin virgülden sonra 2 mi 3 hane mi yazdırılacağının sorgulanması. a=10.2424542; buton=questdlg('virgülden sonra kaç hane verilsin?','sonuc','2 hane', '3 hane','3 hane'); switch buton case {'2 hane'} fprintf('%1.2f \n',a); case {'3 hane'} fprintf('%1.3f \n',a); Aynı kodu aşağıdaki gibi yazınız. a=10.2424542; buton=questdlg('virgülden sonra kaç hane verilsin?','sonuc','2 hane', '3 hane','3 hane'); switch buton case {'2 hane'} x=sprintf('%1.2f \n',a); msgbox(x,'sonuc'); case {'3 hane'} x=sprintf('%1.3f \n',a); msgbox(x,'sonuc'); Örnek: Aşağıdaki programı yazınız. clear all; x=input('x tam sayısını giriniz:'); secim=menu('işlem türünü seçiniz','x! hesabı','taylor serisine açarak e^x hesabı','x sayısına kadar olan Fibonacci serisinin hesaplanması'); f=1; switch secim case 1 for i=1:x f=f*i; fprintf('x!=%6.2f dir\n',f) case 2 5
N=input('Taylor serisindeki terim sayısını giriniz:'); T=1; for i=1:1:(n-1) f=f*i; T=T+x^i/f; fprintf('%d terim sayısı için e^x=%6.2f dir\n',n,t) case 3 terim1=1; terim2=1; fprintf('%d, %d ',terim1, terim2) i=1; while (terim1+terim2)<=x terim3=terim1+terim2; fprintf(' %d, ',terim3) terim1=terim2; terim2=terim3; for, döngüsü bir in birden daha fazla sayıda yaptırılmasında kullanılır. (Örneğin, kök bulma problemlerinde kullanılan iterasyon çözümleri). Kullanımı, biçimindedir. for i=1:n (i Tam sayı (integer)) while, döngüsü, belirli bir durumun gerçekleşmesi durumunda bir in birden daha fazla sayıda yaptırılmasında kullanılır. done=0; while done==0 Örnek: 1 den N ye kadar olan sayıların toplamını while, döngüsü ile yapan bir program düşünelim. clear,clc N=input('bir sayi giriniz='); say=0; i=0;done=0; while done==0 i=i+1; %bir önceki örnekte for, döngüsündeki i ye karşılık gelir. if i==n done=1; say=say+i; say break, continue ve return komutları: 6
break komutu döngüleri sonlandırır. Genellikle bir koşula bağlıdır. continue komutu döngünün bir sonraki adımına atlar. * for için döngü değişkeni arttırılır! * Genellikle bir koşula bağlıdır. return komutu programı sonlandırır. Örnek: Aşağıdaki fonksiyon-m dosyasını oluşturunuz. 7
Örnek: Bir oyun programı yazalım. Koşullar şöyle 1. MATLAB 0 ile 100 arasında rasgele bir tam sayı belirleyecek 2. Sizden tahminler yapmanızı isteyecek 3. Tahmin ettiğiniz sayı, MATLAB in tuttuğu sayıdan küçükse ekrana büyült, büyükse kücült yazdıracak. 4. Sayıyı tahmin ettiğinizde döngü kırılacak ve size kaç tahmin yaptığınızı söyleyecek. Örnek: Girilen iki sayının en küçük ortak katını bulan bir fonksiyon yazalım. İki sayının en küçük ortak katı en fazla o iki tam sayının çarpımı kadardır. Girilen sayıların tamsayı olup olmadığının da kontrolünü yapalım! Sorular: 1) Girilen iki sayının en büyük ortak bölenini bulmak için gerekli olan fonksiyon-m dosyasını oluşturunuz. 8