BİLGİSAYAR PROGRAMLAMAYA GİRİŞ 8. DERS NOTU Uygulama örnekleri Function m-dosyaları Kaynak: Dr.Deniz DAL kitabı ve ders sunumları 2.KıSA SıNAV SORUSU 1(İ.Ö.): DıŞARıDAN GIRILEN KENAR UZUNLUKLARıNA GÖRE BIR ÜÇGENIN ÇEVRESINI HESAPLAYAN VE EKRANA BIR IFADE ILE SONUCU YAZAN PROGRAMı M-DOSYASı ILE YAZıNıZ. EĞER KULLANıCı NEGATIF BIR SAYı GIRERSE EKRANA “POZITIF SAYı GIRINIZ” UYARıSı YAPTıRıNıZ. clc clear all kenar1=input('üçgenin 1. kenar uzunluğunu giriniz'); kenar2=input('üçgenin 2. kenar uzunluğunu giriniz'); kenar3=input('üçgenin 3. kenar uzunluğunu giriniz'); if kenar1<=0 || kenar2<=0 || kenar3<=0 disp('lütfen pozitif bir sayı giriniz') else cevre=kenar1+kenar2+kenar3; fprintf('üçgenin çevresi %g dir\n', cevre) end 2.KıSA SıNAV SORUSU 2(İ.Ö.): BIR IKIZKENAR ÜÇGENIN TEPE AÇıSı 30-90 0 (30 VE 90 DAHIL) ARASıNDAKI TAMSAYıLAR IÇIN DEĞIŞIRKEN ÜÇGENIN DIĞER (EŞ) AÇıLARıNı HESAPLAYAN VE HER SEFERINDE “ACI1, ACI2, ACI3” ŞEKLINDE ALT ALTA 3 AÇıYı BIRLIKTE EKRANA YAZAN PROGRAMı M-DOSYASı ILE YAZıNıZ. clc clear all for i=30:90 aci=(180-i)/2; fprintf('%g, %g, %g\n', i, aci, aci) end 2.KıSA SıNAV SORUSU 1(Ö.Ö.): DıŞARıDAN GIRILEN X VE Y DEĞERLERINE GÖRE AŞAĞıDAKI FONKSIYONUN DEĞERINI HESAPLAYAN VE BIR IFADE ILE EKRANA YAZAN BIR PROGRAM YAZıNıZ. X >0 𝐹 𝑥, 𝑦 = 𝑥 2 𝑦 + 𝑥𝑦 + X ≤0 𝐹 𝑥, 𝑦 = 𝑥 3 𝑦 + 𝑥 𝑒𝑦 𝑙𝑛 𝑥 + 1 𝑥 + 𝑡𝑎 𝑛 𝑙𝑜𝑔10 (𝑦) 𝑦 clc clear all x=input('x değerini giriniz'); y=input('y değerini giriniz'); if x>0 f=x^2*y+sqrt(x*y)+(log(exp(x))+1)/log10(y)+tan(x/y); else f=x^3*y+abs(x)/exp(y); end fprintf('işlem sonucu %g dir\n', f) 2.KıSA SıNAV SORUSU 2(Ö.Ö.): 50-120 KM/SA ARASıNDAKI TAMSAYıLAR IÇIN DEĞIŞEN HıZDAKI ARAÇLARıN X KM’LIK MESAFEYI (MESAFEYI KULLANıCıDAN ALARAK) NE KADAR ZAMANDA ALıNDıĞıNı HESAPLAYAN VE HER SEFERINDE ALTALTA HıZ VE SÜREYI BIRLIKTE “V,T “ ŞEKLINDE EKRANA YAZAN MATLAB PROGRAMıNı M-DOSYASıNDA YAZıNıZ. clc clear all x=input('mesafeyi km cinden giriniz'); for v=50:120 t=x/v; fprintf('%g, %g\n', v,t) end KITAPTAN 20. BÖLÜM UYGULAMALARıNı ÇÖZELIM… FONKSİYONLAR Fonksiyonlar da bilgisayar programlarıdır. Bilgisayarlar yardımıyla çözülmeye çalışılan problemler fonksiyonlar sayesinde yönetilmesi daha kolay, küçük parçacıklara bölünürler. Bu metoda “Böl ve Yönet” ya da “Divide and Conquer” adı verilir. Her fonksiyon: Kendine özgü bir isme sahiptir. GENELLİKLE kendine, üzerinde işlem yapacağı bir argüman (parametre) ya da argümanlar (parametreler) alır. GENELLİKLE geriye bir değer döndürür. (skaler, vektör ya da matris.) FONKSİYON M-DOSYALARI Bir fonksiyon m-dosyasının iki bileşeni vardır: 1 – Fonksiyonun imzası veya prototipi (İlk satırda tanımlanır.) 2 – Fonksiyonun tanımı (yapması gereken iş) (İkinci satırdan başlar ve devam eder.) FONKSİYON İMZASI VEYA PROTOTİPİ function cikisParametresi = FonksiyonAdi (girisParametreleri 1, 2, …n) function [cikisParametreleri 1, 2,…, n] = FonksiyonAdi (girisParametreleri 1, 2, …n) function cikisParametresi = FonksiyonAdi ( ) function cikisParametresi = FonksiyonAdi function FonksiyonAdi (girisParametreleri 1, 2, …n) Fonksiyon m-dosyalarının ilk satırı MUHAKKAK yukarıda tanımladığımız gibi fonksiyonların imzası veya prototipi dediğimiz satırlardan oluşmalıdır. Bir fonksiyonu yazmaya başlamadan önce onun imzası hakkında iyice düşünmeliyiz. (Giriş parametresi(leri) almalı mı, geriye bir değer döndürmeli mi?) Fonksiyon M-Dosyaları Oluşturulurken Dikkat Edilmesi Gereken Hususlar: 1 - Her MATLAB fonksiyonu function anahtar kelimesi ile başlamalıdır. 2 - FonksiyonAdi m-dosyasına verilen isimle aynı olmalıdır. 3 - Bir MATLAB fonksiyonu komut penceresinden fonksiyon adı ve varsa eğer parantez içerisinde birbirlerinden virgüllerle ayrılmış parametrelerle çağrılmalıdır. 4 - Parametre aktarımı olması durumunda alt ve ana programda eşit sayıda giriş parametresi olmalıdır. Uygulama: İki nokta arasındaki uzaklığı bulan programı m-fonksiyon kullanarak yazınız. x1 = 1. noktanın x koordinati; x2 = 2. noktanın x koordinati y1 = 1. noktanın y koordinati; y2 = 2. noktanın y koordinati Uzaklik.m function mesafe = Uzaklik(x1,y1,x2,y2) %İmza mesafe=sqrt((x2-x1)^2+(y2-y1)^2); %Tanım KOMUT PENCERESİ >> sonuc=Uzaklik(3,4,1,2) %veya >> Uzaklik(3,4,1,2) %sonuç ans adlı değişkene atanır BİR ÖNCEKİ ÖRNEĞİN DÜZYAZI M-DOSYASI İLE ÇÖZÜMÜ Uzaklik.m x1=input(' x1 koordinatını gir: '); y1=input(' y1 koordinatını gir: '); x2=input(' x2 koordinatını gir: '); y2=input(' y2 koordinatını gir: '); mesafe=sqrt((x2-x1)^2+(y2-y1)^2); fprintf(' Girilen 2 nokta arası mesafe: %f \n ',mesafe); KOMUT PENCERESİ >>Uzaklik !!! ÖNEMLİ !!! Fonksiyon m-dosyalarının imza satırlarında yer alan fonksiyon adları Paskal notasyonu ile tanımlanır. Aynı şekilde fonksiyon mdosyalarına verilen isimler için de düzyazı m-dosyalarına verilen isimler de olduğu gibi Paskal Notasyonu kullanılır. Fonksiyon m-dosyalarının imza satırlarındaki giriş ve çıkış parametrelerini ifade etmek amacıyla kullanılan değişkenler deve notasyonuyla tanımlanırlar. Fonksiyon m-dosyaları içerisinde input komutu kullanılarak kullanıcıdan bilgi ALINMAZ. Fonksiyon içerisinde değerlendirilecek bilgi programa parametre olarak aktarılır. Fonksiyon m-dosyaları program yazma editörü içerisindeki run butonu tıklanarak ÇALIŞTIRILMAZLAR. Komut penceresinden parametre(ler) girilerek çalıştırılırlar. ANA FONKSİYON, ALT (YARDIMCI) FONKSİYON MANTIĞI Bir fonksiyon m-dosyasının içerisinde daha önceden tanımlanmış ve çalışma dizininizin altında mevcut olan başka bir fonksiyon m-dosyasını (alt program, yardımcı program) kullanabilirsiniz. FonksiyonA.m (Ana) function sonuc1=FonksiyonA(n) sonuc1=FonksiyonB(n)+5; FonksiyonB.m (Alt) function sonuc2=FonksiyonB(m) sonuc2=m*sqrt(m); FonksiyonA temelde ne iş yapıyor? Çağrılma Sırası Komut Penceresi -> FonksiyonA -> FonksiyonB -> FonksiyonB(sonuc) -> FonksiyonA(sonuc)->Komut Penceresi(sonuc) GERİYE SADECE 1 VEYA 0 DEĞERİNİ DÖNDÜREN FONKSİYONLARIN if ve while YAPILARINDA KOŞUL OLARAK KULLANILMASI Bundan önceki derslerimizde if ve while deyimlerini kontrol amacıyla kullanılacak koşulları oluştururken sadece ilişkisel ve mantıksal operatörlerden faydalandık. Bundan sonra if ve while deyimlerinin yanında koşul olarak geriye sadece 1 veya 0 değerini döndüren ve bizlerin oluşturduğu alt (yardımcı) fonksiyonları da kullanabileceğiz. if AsalMi(n) %birşey yap end while ~RakamlariFarkliMi(n) %birşey yap end İPUCU Bilgisayar programlamada, geriye 1 veya 0 değerini döndüren MATLAB fonksiyonlarının adlarının sonuna Mi veya Mu eklerini getiren ve böylece onları diğer fonksiyonlardan kolayca ayırt edebilmeye imkan tanıyan bir notasyondan faydalanılır. Bu türden fonksiyon adlarına örnek TekSayiMi, AsalSayiMi SayininRakamlariFarkliMi verilebilir. olarak veya UYGULAMA Kendisine parametre olarak aldığı sayı bir tek sayı ise geriye 1 değerini aksi takdirde geriye 0 değerini döndüren bir MATLAB fonksiyonunu TekSayiMi.m adındaki fonksiyon m-dosyasının içerisine yazınız. function sonuc=TekSayiMi(sayi) sonuc=mod(sayi,2); KOMUT PENCERESİ >>TekSayiMi(9) ans= 1 >>TekSayiMi(8) ans= 0 UYGULAMA Kendisine parametre olarak aldığı bir alt limit ile bir üst limit arasındaki tek sayıların adedini hesaplayarak geriye döndüren bir MATLAB fonksiyonunu AraliktakiTeklerinSayisiniHesapla.m adındaki fonksiyon m-dosyasının içerisine yazınız. function teklerSayaci=AraliktakiTeklerinSayisiniHesapla(altLimit,ustLimit) teklerSayaci=0; for i=altLimit:ustLimit if TekSayiMi(i)%Geriye 1 veya 0 Döndüren Alt Fonksiyon teklerSayaci=teklerSayaci+1; end end KOMUT PENCERESİ >>AraliktakiTeklerinSayisiniHesapla(1,100) ans= 50 return Komutu Yazdığınız MATLAB programını herhangi bir anda (programın normalde sona erdiği noktanın haricinde - early termination) sona erdirmek için return komutunu kullanabilirsiniz. Eğer return komutu ana program içerisinde kullanılmışsa, kontrol komut penceresindeki klavyeye geçer. Eğer return komutu bir fonksiyon içerisinde kullanılmışsa, kontrol bu fonksiyonu çağıran ana fonksiyona devredilir. return komutunun hata ayıklama modundan çıkmak için de kullanıldığını hatırlayınız. Soru: Ax²+Bx+C=0 şeklinde verilen 2. derece denklemin köklerini bulan programı yazınız. ÇÖZÜM 1 ÇÖZÜM 2 A=input('A Katsayısını Giriniz= '); A=input('A Katsayısını Giriniz= '); B=input('B Katsayısını Giriniz= '); B=input('B Katsayısını Giriniz= '); C=input('C Sabitini Giriniz= '); C=input('C Sabitini Giriniz= '); delta=B^2-4*A*C; delta=B^2-4*A*C; if delta<0 if delta<0 disp('Kökler Sanal'); disp('Kökler Sanal'); else end return; %Programı Ani Sonlandır x1=(-B+sqrt(delta))/(2*A); end x2=(-B-sqrt(delta))/(2*A); x1=(-B+sqrt(delta))/(2*A); fprintf('1. Kök : %f \n', x1); x2=(-B-sqrt(delta))/(2*A); fprintf('2. Kök : %f \n', x2); fprintf('1. Kök : %f \n', x1); fprintf('2. Kök : %f \n', x2); DÜZYAZI M ÇÖZÜMLER Olmayana Ergi Yöntemi ile İspat Bu ispat yöntemi doğruluğu gösterilmek istenen bir ifadenin yanlış olduğunu kabul ederek bir ispat yolculuğuna koyulur. Yöntem, eğer bu (yanlışlığı ispat) yolculuğu esnasında bir çelişkiyle karşılaşırsa başta yanlış olduğunu kabul ettiği ifadenin aslında doğru bir ifade olduğunu ispatlamış olur. Bu yöntem tam ters bir mantıkla da çalışır. UYGULAMA Kendisine parametre olarak aldığı sayı bir çift sayı ise geriye 1 değerini aksi takdirde geriye 0 değerini döndüren bir MATLAB fonksiyonunu CiftSayiMi.m adındaki fonksiyon m-dosyasının içerisine yazınız. function sonuc=CiftSayiMi(sayi) sonuc=0;%Sayının Çift Sayı Olmadığını Kabul Et if mod(sayi,2)==0 sonuc=1;%Başlangıç Kabulünü Değiştir end KOMUT PENCERESİ >>CiftSayiMi(8) ans= 1 >>CiftSayiMi(9) ans= 0 GizemliFonksiyon.m function GizemliFonksiyon(n) clc; if (n<2)||(n>20) disp('Beklenen Aralıkta Bir Giriş Değil.'); return; end for i=1:n if (i==1)||(i==n) for j=1:n fprintf('#'); %Ekrana # Bas end fprintf('\n'); else fprintf('@'); %Ekrana @ Bas for j=2:(n-1) fprintf(' '); %Ekrana Boşluk Bas end fprintf('@\n'); end end Yanda verilen GizemliFonksiyon.m adlı fonksiyon m-dosyası genel olarak nasıl bir iş yapar? Komut penceresinde çalıştırılan GizemliFonksiyon(10) nasıl bir ekran çıktısı verir? Çözüm: Fonksiyon içerisinde n gördüğünüz her yere 10 rakamını yerleştirip sanki MATLAB programıymışsınız gibi fonksiyonu satır satır işletmelisiniz. TEŞEKKÜR Ders notlarından yararlandığım Değerli Hocamız Dr. Deniz DAL’a teşekkürlerimle…
© Copyright 2024 Paperzz