Professional Documents
Culture Documents
MATLAB
(1. Sunu)
ANALİZ: Çözülmesi istenen problemin tamamen
anlaşılmasını sağlayacak ön çalışmalardır.
ALGORİTMA GELİŞTİRME: Problemi çözecek
adımların sıralı olarak ifade edilmesidir.
AKIŞ ŞEMASI ÇİZİMİ: Geliştirilen algoritmanın şekillerle
ifade edilmesidir.
PROGRAMLAMA DİLİ SEÇİMİ: Geliştirilen algoritmayı
kolay bir şekilde bilgisayar ortamına aktaracak bir
bilgisayar programlama dilinin seçilmesidir.
PROGRAMIN YAZILMASI: Seçilen programlama dilinin
kuralları kullanılarak programın yazılması aşamasıdır.
A1 : Başla
A4 : toplam= sayi1+sayi2
A6 : Bitir
Dışarıdan girilen 3 sayıdan en büyüğünü bulan
algoritmayı geliştiriniz.
A1 : Başla
A2 : sayi1, sayi2 ve sayi3 sayılarını dışarıdan gir
A3 : enBuyuk=sayi1
A4 : Eğer sayi2>enBuyuk ise enBuyuk=sayi2 yap
A5 : Eğer sayi3>enBuyuk ise enBuyuk=sayi3 yap
A6 : enBuyuk değerini ekrana yaz
A7 : Bitir
0’dan 100’e kadar olan sayma sayılarının
kümülatif toplamını ekrana yazdıran algoritmayı
geliştiriniz.
A1 : Başla
A2 : toplam=0;sayac=1 başlangıç değerlerini ata
A3 : Eğer sayac 100’e eşit ise 6. adıma git
A4 : toplam=toplam+sayac
A5 : sayac=sayac+1 yap ve 3. adıma geri dön
A6 : toplam ı ekrana yaz
A7 : Bitir
Verilen bir sayının faktöriyelini hesaplayan programın algoritmasını yazınız.
(Faktöriyeli hesaplanacak sayı negatif girilmişse yeniden giriş istenmelidir.)
Değişkenler:
Sayının Faktöriyeli : faktor , Faktöriyel Değişkeni :sayac
Faktöriyeli Hesaplanacak Sayı :Y
Algoritma:
A1: Başla Anlamlı Değişken İsimleri
A2: faktor =1; sayac =1 Seçmek Çok Önemli !!!!!!!!!!!!
A3: Y’yi gir
Hangi amaçlarla kaç değişkene ihtiyaç var?
A4: Eğer Y<0 ise 3. adima git
A5: Eğer sayac>Y ise adim 8 e git
A6: faktor=faktor*sayac
A7: sayac =sayac+1 yap ve adım 5 e git
A8: faktor degerini ekrana yaz
A9: Bitir
Akış diyagramları, algoritmaların sembolik olarak gösterimidir. Bilgisayarda
gerçekleştirilecek her tür aksiyon ayrı bir sembolle gösterilir.
Verilen iki sayının ortalamasını Akış diyagramı: Başla
hesaplayan programın algoritmasını
geliştiriniz ve akış diyagramını çiziniz.
sayi1=?
Algoritma:
A1 : Başla
sayi2=?
A4 : ortalama = (sayi1+sayi2)/2
ortalama
A5 : ortalama degerini ekrana yaz
A6 : Bitir Bitir
AX+B=0 şeklinde verilen 1. derece denklemin
çözümünü bulan programın algoritmasını geliştiriniz
ve akış diyagramını çiziniz. (A=0 girilmiş ise veri
girişi yenilenecektir.)
Algoritma:
A1: Başla
A2: sayac=0
A3: toplam=0
A4: sayac=sayac+1
A5: toplam=toplam+sayac
A6: Eğer sayac 100’e eşit değilse Adım 4’e git
A7: ortalama=toplam/sayac
A8: Yaz toplam, ortalama
A9: Bitir
Algoritma: ???
Ax²+Bx+C=0 şeklinde verilen 2. derece denklemin köklerini bulan
programın akış diyagramını çiziniz. (İkinci derece denklem olmadığı
uyarısını nasıl verirsiniz?)
10 tane N sayısının
faktöriyelini hesaplayan
programın akış
diyagramını çiziniz.
(Yandaki diyagramdaki
sorunları bulunuz.)
Kenar uzunlukları dışarıdan girilen bir ABC üçgenini kenar
uzunluklarına göre inceleyen programın algoritmasını kurunuz.
A1: Başla
A2: A,B,C değerlerini gir
A3: A=B ise A4’e git değilse A5’e git
A4: B=C ise A6’ya git değilse A8’e git
A5: A=C ise A8’e git değilse A7’e git
A6: ‘Üçgen Eşkenardır’ yazdir ve A10’a git
A7: B=C ise A8’e git, değilse A9’a git
A8: ‘Üçgen İkizkenardır’ yazdir ve A10’a git
A9: ‘Üçgen Çeşitkenardır’ yazdir
A10: Bitir Hangi amaçlarla kaç değişkene ihtiyaç var?
A1 Başla
A2 A,B,C Gir
A3 Eşkenar : A=B=C
H E
A=B İkizkenar: A=B veya
A=C veya
B=C
Çeşitkenar: A=B=C
A5 A4 A6
H E H E
A=C B=C Eşkenar
A7 A8
H E
B=C İkizkenar
A9
Çeşitkenar Bitir
A10
Bilgisayar Programlama
MATLAB
2.SUNU
MATLAB
Ticari karşılığı olan MATLAB ile çoğunlukla uyumlu bir dil kullanır.
Fakat, ne yazık ki OCTAVE tüm MATLAB özelliklerini
kapsamamaktadır.
OCTAVE Kullanıcı Arayüzü
MATLAB Programlama Ortamının Tanıtımı
Çalışma Alanı
(Workspace)
Çalışma Dizini
(Current Folder)
ans=
610
Komut Satırında Yanlışların Düzeltilmesi: Klavyede yer alan ok tuşları
komut satırında yapılan yanlışlıkların düzeltilmesine imkan verir. Bunlar
yukarı “↑” aşağı “↓” sol “←” sağ “→”. Yukarı tuşu yardımıyla bir
önceki satır tekrar görüntülenerek sağ ve sol tuşları ile yanlış yazılı yere
imleç taşınarak düzenleme gerçekleştirilir.
Sonucun Ekranda Görüntülenmesini Gizleme: Bir deyim yazıp, ENTER
tuşuna basınca sonuçlar ekranda otomatik olarak görüntülenir. Buna
karşılık, deyimin sonuna “ ; ” ilave edilecek olursa yapılan hesaplamalar
ekranda görüntülenmez.
MATLAB’DE DEYİMLER VE BİLEŞENLERİ
Öncelik İşlem
1. Parantez (İçten Dışa Doğru)
2. Üs Alma (Soldan Sağa Doğru) (2^2^3=???)
3. Çarpma ve Bölme (Soldan Sağa Doğru)
4. Toplama ve Çıkarma (Soldan Sağa Doğru)
MATLAB’in Kullanıma-Hazır Bazı Matematiksel
Fonksiyonları
Örnekler:
c
Uygulama 1: a 4
x ba ( ac) 3
a
2
3
1 c2 a b4
a a
b 5 cd 3
>>doc sqrt
MATLAB’ DE DEĞİŞKEN TÜRLERİ
VE DEĞER ATAMALARI
Herşey matris?
Matris
Satır Vektörü
Sütun Vektörü
Karakter Dizisi (Katar) (String)
Skaler
(İKİ BOYUTLU) MATRİSLERİN DEĞİŞKENLERE
DEĞER OLARAK ATANMASI
(TEK BOYUTLU) SATIR VEKTÖRLERİNİN
DEĞİŞKENLERE DEĞER OLARAK ATANMASI
(TEK BOYUTLU) SÜTUN VEKTÖRLERİNİN
DEĞİŞKENLERE DEĞER OLARAK ATANMASI
KARAKTER DİZİLERİNİN DEĞİŞKENLERE DEĞER
OLARAK ATANMASI
SKALERLERİN DEĞİŞKENLERE DEĞER OLARAK
ATANMASI
YERLEŞİK ans DEĞİŞKENİ VE MATEMATİK SABİTLERİ
ans DEĞİŞKENİ
pi SABİTİ
i SABİTİ
Matlab
yorumlayıcısının inf
sabitini sonuç olarak
ürettiği durum
NaN SABİTİ
Konum İşlev
bank Ayraçtan sonra gösterilen ondalık hane sayısı:2
Diğer yandan :
\n : İmleci bir alt satırın başına götürür. (n, newline)
\t : İmleci bir TAB kadar sağa kaydırır.
fprintf Kullanımına Örnekler
fprintf İLE ALAN, HİZALAMA VE DUYARLILIK KONTROLÜ
• fprintf ile
Ondalıklı sayıların ayraçtan itibaren kaç basamak duyarlılıkla ekrana
yazdırılacağı
• % karakteri ve onu takip eden daha önce bahsi geçen özel karakterler
arasına yeni karakterler eklenerek yapılır.
fprintf İLE ALAN, HİZALAMA VE DUYARLILIK KONTROLÜ
• %f yi ele alalım
%±6.2f örneğindeki
Söz konusu karakterlerin bu iki komut için özel anlamlar ifade etmektedir.
Çözüm: Kaçış karakterlerini ekrana yazdırmak için bunlardan peş peşe iki
adet kullanmak gerekir.
KAÇIŞ KARAKTERLERİ Kullanım Örnekleri
MATLAB’DE PROGRAMLAMA
Herhangi bir uzun MATLAB deyiminin görüş alanı içerisinde kalan kısmı,
deyimi içeren satırın sonu olarak yan yana üç nokta (…) karakterleri
sayesinde işaretlenmiş olur.
MATLAB yorumlayıcısı da, böyle bir durumda, bir alt satıra taşan bilgilerin
mevcut satırdaki bilgilerle birleştirildikten sonra bir MATLAB deyimi olarak
değerlendirilmesi gerektiğini anlar.
MATLAB PROGRAMLAMA ORTAMI İLE İLGİLİ
BAZI PRATİK BİLGİLER
Ctrl+C
UYGULAMALAR
Uygulama 3.1
input komutu ile kullanıcıdan klavye yoluyla 2 sayının geometrik ortalamasını
hesaplayan ve bu ortalamayı fprintf komutuyla ekrana basan (yazdıran)
MATLAB programını IkiSayininGeometrikOrtalamasiHesapla.m adındaki
düzyazı m-dosyasının içerisine yazınız ve programı çalıştırınız. (İpucu:
Geometrik ortalama hesabındaki karekök alma işlemi için MATLAB in sqrt()
fonksiyonunu kullanınız.)
Örnek
Komut
Penceresi
Çıktısı
Uygulama 3.4
input komutu ile kullanıcıdan klavye yoluyla aldığı bir dairenin yarıçap değerini
kullanarak bu dairenin çevresini ve alanını hesaplayarak fprintf komutuyla
ekrana basan bir MATLAB programını DaireninCevresiniVeAlaniniHesapla.m
adındaki düzyazı m-dosyasının içerisine yazınız ve programı çalıştırınız. (İpucu:
𝜋 sayısı için MATLAB in yerleşik pi sabitini kullanınız.)
Örnek
Komut
Penceresi
Çıktısı
Uygulama 3.6
input komutu ile kullanıcıdan klavye yoluyla aldığı bir zaman dilimine (saat ve
dakika) ait akrep ve yelkovan arasındaki açıyı hesaplayarak fprintf komutuyla
ekrana basan bir MATLAB programını
AkrepIleYelkovanArasindakiAciyiHesapla.m adındaki düzyazı m-dosyasının
içerisinine yazınız ve programı çalıştırınız. (Kullanıcının saat değeri olarak 0 ile 11
ve dakika değeri olarak da 0 ile 59 arasında bir veri girişi yapacağının garanti edildiği
kabulünü yapabilirsiniz.) (İpucu: Mutlak değer işlemi için MATLAB in abs() fonksiyonunu
kullanınız.)
== Eşit Mi?
~= Eşit Değil Mi?
> Büyük Mü?
>= Büyük veya Eşit Mi?
< Küçük Mü?
<= Küçük veya Eşit Mi?
İlişkisel operatörler sonuç olarak 1 (BİR) (true) veya
0 (SIFIR) (false) değerlerini üretirler.
Eşitlik testinde 2 adet "==" işareti kullanılır. Oysa değişken
atamalarında kullandığımız eşittir "=" 1 tanedir.
MATLAB komut penceresinde 3=5 yazdığımızda program hata
verir. Oysa 3==5 yazdığımızda bu “3, 5'e eşit midir?" anlamına gelir,
karşılaştırma yanlıştır ve MATLAB bu durum için 0 (Sıfır) sonucunu
üretir.
İLİŞKİSEL OPERATÖRLERİN
ÖNCELİK SIRALARI
İlişkisel operatörler aritmetik operatörlerden daha düşük
bir işlem önceliğine sahiptirler.
Örneğin komut penceresinde 3+4<7-5 şeklinde
çalıştırılacak bir MATLAB deyimi arka planda önce 7<2
formuna dönüştürülür ve ilişkisel test (küçüklük testi)
daha sonra gerçekleştirilir.
Benzer şekilde i+j==10 gibi bir eşitlik testi, öncelikle
hesaplanan i+j aritmetik işleminin sonucu ile 10 sayısı
arasında gerçekleştirilir.
Yukarıdaki deyimler, karışıklığa meydan vermemek için
(3+4)<(7-5) ve (i+j)==10 formlarına sokulabilirler.
MANTIKSAL OPERATÖRLER
Birden fazla ilişkisel durumu birbirine mantıksal olarak
bağlamaya yarar.
Mantıksal operatörler de ilişkisel operatörler gibi sonuç
olarak 1 (BİR) (true) veya 0 (SIFIR) (false) değerlerini
üretirler.
MANTIKSAL İŞLEVİ
MATLAB
OPERATÖR
a&&b VE (AND)
a||b VEYA (OR)
~a DEĞİL (NOT)
MANTIKSAL OPERATÖRLERİN
DOĞRULUK TABLOLARI
1 1 1
MANTIKSAL OPERATÖRLERİN
DOĞRULUK TABLOLARI
ans =
0
İlişkisel ve mantıksal operatörler her zaman bool
tipinde (yani 1 (true) veya 0 (false) değerinde, başka bir
ifadeyle sadece iki değerli) bir sonuç geriye döndürürler.
Dolayısıyla if ve while deyimleri ile birlikte karar verme
amacıyla kullanılabilirler.
if Şartlı Deyimi
Bir karşılaştırma ifadesini veya mantıksal bir ifadeyi test ederek bunun
sonucuna göre mümkün seçeneklerden birini icra edebilen bir komuttur.
Uygulama1.m
Programınızı en az kaç
clc; %Komut penceresini temizle kez çalıştırmalısınız?
clear; %Degiskenleri sil
pay = input('Lutfen Payi Giriniz: ');
pay
payda = input('Lutfen Paydayi Giriniz: '); oran
payda
if payda==0
disp('Uzgunum! Sifira Bolum Hatasi Var.');
else
oran=pay/payda;
fprintf('Oran = %f \n',oran);
%disp(['Oran = ' num2str(oran)]);
end
Örnek: Kullanıcıdan klavye yoluyla alınan x ve y değerlerine
göre aşağıdaki sonuçlardan birini hesaplayan bir MATLAB
programını bir m-dosyası içine yazınız ve komut penceresinden
dosya adı ile çalıştırınız.
Uygulama2.m
x>y ise sonuc= (x-y)
x=y ise sonuc=(x+y)7 x=input('Lutfen x Degerini Giriniz : ');
y=input('Lutfen y Degerini Giriniz : ');
x<y ise sonuc=x*y
if x>y
sonuc=sqrt(x-y);
elseif x==y
sonuc=(x+y)^7;
else
Programınızı en az kaç sonuc=x*y;
kez çalıştırmalısınız?
end
disp(['Sonuc=' num2str(sonuc)]);
m-dosyalarını oluşturduğunuz
MATLAB metin editörünün >>Uygulama2
program yazma stiline
müdahale etmeyiniz !!!!!
UYGULAMA
Girilen ay numarasına göre gün sayısını hesaplayan MATLAB
programını yazınız.
Programınızı en az
kaç kez
Uygulama3.m çalıştırmalısınız?
switch değisken
case koşul1
işlem(ler)
case koşul2
işlem(ler)
.
otherwise
işlem(ler)
end
switch Şartlı Deyimi
Uygulama4.m
K>>return
>>
UYGULAMALAR
Uygulama 4.1
Her bir doğru sorunun karşılığının 4 puan olduğu ve 4 yanlışın 1 doğruyu götürdüğü 25
soruluk bir testten alınan puanı hesaplayacak bir MATLAB programını
TestPuaniniHesapla.m adındaki düzyazı m-dosyasının içerisine yazınız ve programı
çalıştırınız. Programınız input komutu ile kullanıcıdan klavye yoluyla doğru, yanlış ve boş
cevap sayılarını almalıdır ve hesapladığı test puanını fprintf komutuyla ekrana
basmalıdır. Kullanıcının tutarsız veri girişi yapması durumunda ise ekrana sadece disp
komutuyla «Tutarsız Veri Girişi Yaptınız.» mesajı yazdırılmalıdır.
x=y*bölüm+kalan
x=y*fix(x/y)+mod(x,y)
BİR SAYININ ÇİFT SAYI VEYA TEK SAYI
OLUP OLMADIĞININ ARAŞTIRILMASI
Bir sayı ikiye tam olarak bölünebiliyorsa yani
sayının ikiye bölümünden kalan sıfırsa bu sayı
bir çift sayıdır.
Bir sayının ikiye bölümünden kalan 1 ise bu
sayının bir tek sayıdır.
rand FONKSİYONU RASTGELE SAYI ÜRETİMİ
rand(n,m) fonksiyonu MATLAB’de nxm boyutunda ve
elemanları rastgele sayılar olan bir matris oluşturur.
Oluşturulan bu rastgele sayılar 0 ile 1 arasındadır ve düzgün
dağılımlıdır.
Üretilmek istenen matris kare bir matris ise yani n satır
sayısı, m sütun sayısına eşit ise rand(n,n) yerine sadece
rand(n) kullanılabilir.
0 ile 1 arasında rastgele ondalıklı bir skaler sayı üretmek için
ise rand(1) fonksiyonunun kullanımı yeterlidir.
Rastgele sayılardan oluşan bu matrisin tüm elemanlarını k
gibi bir sayı ile çarparak sayıları 0 ile k aralığına çekebiliriz.
Ondalıklı sayılardan oluşmuş bir matrisin elemanlarını
yuvarlayıp tamsayı yapmak için herhangi bir yuvarlama
fonksiyonunu, mesela round fonksiyonunu kullanabiliriz.
AŞAĞIDAKİ MATLAB DEYİMLERİ KOMUT
PENCERESİNDE ÇALIŞTIRILDIKLARINDA
NASIL ÇIKTILAR ÜRETİRLER?
>> a=rand(1,10)
>> b=fix(rand(3,5))
>> c=round(40*rand(5,3))
>> d= 40*round(rand(5,3))
>> e=round(10+40*rand(5,3))
>> f=10+40*round(rand(5,3))
>> g=round(50+250*rand(3,4))
>> h=round(1000*rand(1))
zeros FONKSİYONU İLE SADECE 0’LAR İÇEREN
BİR MATRİSİN OTOMATİK OLARAK
OLUŞTURULMASI
zeros(n,m) fonksiyonu nxm boyutunda
(n satırlı ve m sütunlu) ve her bir elemanı 0
olan bir matris üretmek amacıyla kullanılır.
Üretilmek istenen matris kare bir matris ise
yani n satır sayısı, m sütun sayısına eşit ise
zeros(n,n) yerine sadece zeros(n)
kullanılabilir.
>> zeros(1,3) zeros(3,5) deyimi acaba
>> zeros(3,1) fix(rand(3,5)) deyimi ile aynı
>> zeros(4,4) sonucu üretir mi?
>> zeros(4)
>> zeros(3,5)
ones FONKSİYONU İLE SADECE 1’LER İÇEREN
BİR MATRİSİN OTOMATİK OLARAK
OLUŞTURULMASI
ones(n,m) fonksiyonu nxm boyutunda
(n satırlı ve m sütunlu) ve her bir elemanı 1
olan bir matris üretmek amacıyla kullanılır.
Üretilmek istenen matris kare bir matris ise
yani n satır sayısı, m sütun sayısına eşit ise
ones(n,n) yerine sadece ones(n)
kullanılabilir.
>> ones(1,3) ones(3,5) deyimi acaba
>> ones(3,1) ceil(rand(3,5)) deyimi ile
>> ones(4,4) aynı sonucu üretir mi?
>> ones(4)
>> ones(3,5)
UYGULAMA
Dünyaya geldiğiniz gün 0 (sıfır) başlangıç değeri ile çalışmaya başlayan ve
mevcut değerini her gün 1 arttıran bir sayaca sahip olduğunuzu hayal edin.
Böyle bir sayıcının, ekranında gördüğünüz değere ulaşmak için kaç yıl, kaç ay
ve kaç gün süreyle sayma işlemi gerçekleştirdiğini hesaplayacak bir MATLAB
programını yazınız. Programınız input komutu ile kullanıcıdan klavye yoluyla
söz konusu sayıcı değerini almalıdır ve hesapladığı yıl, ay ve gün değerini
fprintf komutuyla ekrana basmalıdır. Bir yılın 365 ve bir ayın da 30 günden
oluştuğunu kabul edebilirsiniz.
end
end
Başlangıç değeri bitiş değerinden küçük fakat
artım miktarı negatif bir for döngüsü işletilmez.
while DÖNGÜSÜ
Tekrarın bir koşula bağlı olarak işletilmesini sağlayan bir yapı
while koşul
işlem_1
işlem_2
koşul denilen şey sonucu BİR veya
SIFIR olan bir eşitlik testi, karşılaştırma
işlem_n işlemi veya mantıksal bir test olabilir.
end
UYGULAMA
Ekrana adınızı ve soyadınızı 10 kez yazan bir
MATLAB programını while döngüsü kullanarak
oluşturunuz.
devamEt=1;
i=0; %sayac
Yandaki programı ekrana 10
while devamEt kere “Merhaba Dünya” yazacak
disp(‘Merhaba Dünya'); şekilde nasıl
i=i+1; modifiye edersiniz???
end
UYGULAMA
Ocak ayının 1. gününde doğan bir bebek tek numaralı ayların sonunda ağırlığının
%7’sini kaybederken, çift numaralı ayların sonunda ağırlığının %9’u kadar kilo
alıyor. Bu bebeğin kaç ay sonra doğum ağırlığının %10’undan fazla bir ağırlığa
ulaşacağını hesaplayan ve fprintf komutuyla ekrana basan bir MATLAB
programını yazınız.
kilo=100; %Bebeğin başlangıç ağırlığı
ay=1;
while kilo<=110
if mod(ay,2)==1
kilo=kilo*0.93; %kilo=kilo-kilo*0.07;
else
kilo=kilo*1.09; %kilo=kilo+kilo*0.09;
end
ay=ay+1;
end
fprintf('Çözümü Sağlayan Ay: %d\n',ay);
UYGULAMALAR
Uygulama 5.1
Dünyaya geldiğiniz gün 0 (sıfır) başlangıç değeri ile çalışmaya başlayan ve mevcut
değerini her saniye 1 arttıran bir sayaca sahip olduğunuzu hayal ediniz. Böyle bir
sayıcının, ekranında gördüğünüz değere ulaşmak için kaç gün, kaç saat, kaç dakika ve
kaç saniye süreyle sayma işlemi gerçekleştirdiğini hesaplayacak bir MATLAB programını
SaniyeSayacininKarsiliginiHesapla.m adındaki düzyazı m-dosyasının içerisine yazınız
ve programı çalıştırınız. Programınız input komutu ile kullanıcıdan klavye yoluyla söz
konusu sayıcı değerini almalıdır ve hesapladığı gün, saat, dakika ve saniye değerini
fprintf komutuyla ekrana basmalıdır.
Yukarıda verilen denklemi sağlayan N sayısını while döngüsü kullanarak bulan ve fprintf
komutuyla ekra ve fprintf komutuyla ekrana basan bir MATLAB programını
GizemliKuplerToplami.m adındaki düzyazı m-dosyasının içerisine yazınız ve programı
çalıştırınız.
for i=1:10
if i==4
break;
EKRAN ÇIKTISI ???
end
fprintf('i=%d\n', i);
end
break DEYİMİ
Bora arkadaşı Kaan’a «Kaç tane bilyen var?» diye soruyor ve «Bilyelerimi
ikişer, üçer, dörder, beşer ve altışar saydığımda hep bir bilyem artarken
yedişer saydığımda hiç bilyem artmamaktadır. Toplam bilye sayım ise
1000’den azdır» şeklinde bir cevap alıyor. Kaan’ın bilyelerinin sayısının
maksimum kaç olabileceğini hesaplayıp ekrana basacak programı yazalım.
for i=1000:-1:1
if (mod(i,2)==1) && (mod(i,3)==1) && (mod(i,4)==1) && . . .
(mod(i,5)==1) && (mod(i,6)==1) && (mod(i,7)==0)
fprintf(' Maksimum Bilye sayısı:%d\n', i);
break; % Sonuca ulaşıldı
end
end
continue DEYİMİ
Genellikle for döngülerinde, program akışı ayrıca continue deyimi ile kontrol
edilebilir. continue deyimi işletildiğinde continue deyiminden sonraki bütün
herşey ihmal edilir ve döngü değişkeni güncellenerek döngü bir sonraki
iterasyona başlar.
for i=1:10
if i==4
continue;
end
EKRAN ÇIKTISI ???
fprintf('i=%d\n', i);
end
continue DEYİMİ
1-ile 20 arasındaki tek sayıları ekrana alt alta yazdıran programı continue
deyimini kullanarak yazdıralım.
for i=1:20
if mod(i,2)==0
continue;
end
disp (i);
end
toplam=0; deyimi
for i=1:5
dıştaki for döngüsünün
toplam=0;
bir üst satırına
for j=1:5
taşınsaydı nasıl bir
toplam=toplam+j;
ekran çıktısı elde
end
edilirdi?
disp(toplam*i);
end
Bu MATLAB deyimi
kaç kere işletilir?
Komut penceresi
çıktısını bu hale
dönüştürmek için
programda nasıl
bir değişiklik
yapılmalıdır???
Sonsuz Döngüler
Bazı uygulamalarda belirli bir şart gerçekleşinceye kadar bir takım
işlemlerin devamı istenir ve bu gerçekleşmesi beklenen işlem
program içerisinde dinamik olarak belirleniyor olabilir. Örneğin
kullanıcının bilgisayarın tuttuğu bir sayıyı tahmin oyununda, oyun
sayı doğru tahmin edilinceye kadar devam etmelidir. (Bunun ne
kadar süreceği dinamik bir süreç sonunda bilinebilir ancak.) Bu tür
durumlarda sonsuz bir döngünün içine girerek bu şartın
gerçekleşmesini beklemek tercih edilen metodlardan biridir.
devamEt=1; while 1
if tahmin==sayi
while devamEt
break;
if tahmin==sayi
end
devamEt=0;
end
end
end
UYGULAMA
Bir sonsuz döngü içerisinde 0-100 arasındaki sayılar rastgele bir şekilde
üretilip sıra numarası ile birlikte ekrana bastırılmak isteniyor. O ana kadar
üretilen sayıların toplamı 10000’i aşınca programın sonlandırılması ve
üretilen rastgele sayıların toplamının ekrana basılması istenmektedir.
toplam=0;
sayac=0;
while 1
sayi=fix(rand(1)*100);
sayac=sayac+1;
fprintf('\n%d. rasgele sayı:%d',sayac,sayi);
toplam=toplam+sayi;
if toplam>10000
break;
end
end
fprintf('\nRastgele üretilen sayıların toplamı:%d',toplam);
UYGULAMA
Bilgisayarın rastgele üreteceği 100 ile 999 arasındaki bir tamsayıyı
kullanıcı olarak bulmaya çalışacağımız bir sayı tahmin oyun
programını MATLAB’de yazalım.
Yazacağımız program bilgisayar tarafından rastgele üretilen sayı ile
kullanıcının klavye yoluyla girdiği tahminini karşılaştırarak bir sonraki
iterasyonda kullanılmak üzere kullanıcıya «Küçük Bir Sayı Tahmininde
Bulundunuz.» veya «Büyük Bir Sayı Tahmininde Bulundunuz.» şeklinde
ipuçları vermelidir.
Sayı doğru tahmin edildiğinde ise rastgele üretilen sayının kaçıncı tahminde
bulunduğu bilgisi ekrana yansıtılmalıdır ve kullanıcıya oyuna devam etmek
isteyip istemediği sorulmalıdır.
Oyuna devam edilmek istenirse komut penceresi ekranı temizlenmeli ve yeni
üretilen bir sayı ile oyun yeniden başlamalıdır. Örnek Ekran
Görüntüsü
Oyuna devam edilmek istenmezse program sonlandırılmalıdır.
UYGULAMA
tic Ve toc Komutları İle Performans
Ölçümü
Örnek Komut
Penceresi
Çıktısı
Uygulama 6.2
𝒂 < 𝒃 < 𝒄 iken 𝒂𝟐 + 𝒃𝟐 = 𝒄𝟐 şartını sağlayan pozitif 𝒂, 𝒃 ve 𝒄 sayılarından oluşan sete
Pisagor Üçlüsü adı verilir. Örneğin 𝒂 = 𝟑, 𝒃 = 𝟒 ve 𝒄 = 𝟓 bir Pisagor üçlüsüdür.
İMZA 5 ile imzası tanımlanan fonksiyon birden fazla parametre alır fakat
geriye hiçbir değer döndürmez.
Uzaklik.m
function mesafe = Uzaklik(x1,y1,x2,y2) %imza
mesafe=sqrt((x2-x1)^2+(y2-y1)^2); %tanim
KOMUT PENCERESİ
>> sonuc=Uzaklik(3,4,1,2) %veya
>> Uzaklik(3,4,1,2) %sonuc ans adli degiskene atanir
BİR ÖNCEKİ ÖRNEĞİN DÜZYAZI M-DOSYASI İLE ÇÖZÜMÜ
Uzaklik.m
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 m-
dosyalarına verilen isimler için de düzyazı m-dosyalarına verilen
isimlerde 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 A fonksiyonu, işlevini yerine getirirken bir B fonksiyonundan yardım
alabilir.
• Böyle bir durumda A fonksiyonu ana ve B fonksiyonu da alt veya
yardımcı fonksiyon olarak adlandırılır.
FonksiyonA.m (Ana) FonksiyonB.m (Alt)
function sonuc=FonksiyonA(x) function sonuc=FonksiyonB(y)
araSonuc=FonksiyonB(x); %Alt fonk. çağır sonuc=y^2;
sonuc= araSonuc+x +1;
FonksiyonB işlevi, kendisine argüman
FonksiyonA bir x sayısını parametre olarak aktarılan herhangi bir y sayısının
olarak alır, bu sayıyı kullanarak 𝐱 𝟐 + 𝐱 + 𝟏 karesini almaktan ibarettir.
işleminin sonucunu doğrudan değil de
FonksiyonB adlı bir alt/yardımcı Bir fonksiyon m-dosyasının içerisinde daha
fonksiyon sayesinde dolaylı olarak önceden tanımlanmış ve çalışma dizininizin
hesaplar ve geriye döndürür. altında mevcut olan başka bir fonksiyon
m-dosyasını (alt program, yardımcı program)
kullanabilirsiniz.
ANA FONKSİYON, ALT (YARDIMCI) FONKSİYON MANTIĞI
FonksiyonA.m (Ana) FonksiyonB.m (Alt)
function sonuc=FonksiyonA(x) function sonuc=FonksiyonB(y)
araSonuc=FonksiyonB(x); %Alt fonk. çağır sonuc=y^2;
sonuc= araSonuc+x +1;
ln( x) 1 x
f(x, y) x y x.y
2
tan( )
log10 ( y) y
Bu fonksiyon m-dosyasının imzası ne olmalıdır?
ln( x) 1 x
f(x, y) x y x.y
2
tan( )
log10 ( y) y
𝒇 𝒙, 𝒚 = 𝒚
𝟏
ෑ 𝟏+ , 𝒙<𝒚
𝒊𝟑
𝒊=𝒙
𝒍𝒐𝒈𝟐 𝒙𝒚 , 𝒙=𝒚
function fXY=ParcaliFonk(x,y)
if x>y
toplam=0; %Toplamada Etkisiz Eleman
for i=y:x
toplam=toplam+(5+sqrt(4^i))^3;
end
fXY=toplam^2;
elseif x<y
fXY=1; %Çarpmada Etkisiz Eleman
for i=x:y
fXY=fXY*(1+1/(i^3));
end
else
fXY=log2(x*y);
end
UYGULAMA 3
Kendisine parametre olarak aldığı bir ondalıklı sayıyı yine kendisine
parametre olarak aldığı bir tamsayı adedince virgülden sonra yuvarlayan
ve geriye döndüren bir MATLAB fonksiyonunu OndalikliSayiyiYuvarla.m
adındaki fonksiyon m-dosyasının içerisine yazalım.
function yuvarlanmisSayi=OndalikliSayiyiYuvarla(sayi,basamak)
yuvarlanmisSayi=round(sayi*(10^basamak))/(10^basamak);
UYGULAMA 4
Kendisine parametre olarak aldığı 2 sayıdan küçük olanı bularak geriye
döndüren bir MATLAB fonksiyonunu IkiSayininMinimumunuBul.m
adındaki fonksiyon m-dosyasının içerisine yazalım.
function kucukSayi=IkiSayininMinimumunuBul(sayi1,sayi2)
if sayi1<sayi2
kucukSayi=sayi1;
else
kucukSayi=sayi2;
end
UYGULAMA 5
Sıralı (küçükten büyüye veya büyükten küçüğe) bir sayı dizisinin tam
ortasında bulunan dizi elemanına ortanca (median) adı verilir. Örneğin 12,
3 ve 5 sayılarının ortancası 5’tir.
Kendisine parametre olarak aldığı 3 sayının ortancasını bularak geriye
döndüren bir MATLAB fonksiyonunu UcSayininOrtancasiniBul.m
adındaki fonksiyon m-dosyasının içerisine yazalım.
function ortanca=UcSayininOrtancasiniBul(a,b,c)
enKucuk=UcSayininMinimumunuBul(a,b,c); %Alt Fonksiyon
if a==enKucuk
ortanca=IkiSayininMinimumunuBul(b,c); %Alt Fonksiyon
elseif b==enKucuk
ortanca=IkiSayininMinimumunuBul(a,c); %Alt Fonksiyon
elseif c==enKucuk
ortanca=IkiSayininMinimumunuBul(a,b); %Alt Fonksiyon
end
UYGULAMA 6
Kendisine parametre olarak aldığı 2 pozitif tam sayının En Büyük Ortak
Bölenini (EBOB) (Greatest Common Divisor-GCD) bularak geriye
döndüren bir MATLAB fonksiyonunu IkiSayininEBOBunuBul.m adındaki
fonksiyon m-dosyasının içerisine yazalım. (Fonksiyona parametre olarak
aktarılan sayıların her ikisi de pozitif değilse geriye -1 değeri
döndürülmelidir.)
function ebob=IkiSayininEBOBunuBul(sayi1,sayi2)
if (sayi1>0)&&(sayi2>0) %Her iki sayı da pozitif ise
%küçük olanını alt fonksiyon ile bul
kucukSayi=IkiSayininMinimumunuBul(sayi1,sayi2);
for i=kucukSayi:-1:1
if (mod(sayi1,i)==0)&&(mod(sayi2,i)==0)
ebob=i;
break; % EBOB bulundu
end
end %for
else
ebob=-1; %Hatalı parametre girişinin çıkışı
end
UYGULAMA 7
Kendisine parametre olarak aldığı sayi1, sayi2 ve sayi3 tam sayılarını
kullanarak sayi1* sayi2* sayi3 çarpımının sonucunu sadece toplama
yaparak hesaplayan ve geriye döndüren bir MATLAB fonksiyonunu
UcSayiyiToplayarakCarp.m adındaki fonksiyon m-dosyasının içerisine
yazalım. (Parametre olarak kullanılan sayıların hem pozitif hem de negatif
sayılar olabileceğini unutmayınız.)
function carpim=UcSayiyiToplayarakCarp(sayi1,sayi2,sayi3)
carpim=0; %Toplamada Etkisiz Eleman
for i=1:abs(sayi1) %sayi1 Kere
for j=1:abs(sayi2) %sayi2 Kere
carpim=carpim+sayi3; %sayi3 Topla
end
end
if ((sayi1<0)&&(sayi2>0))||((sayi1>0)&&(sayi2<0))
carpim=carpim*(-1); %ilk 2 sayıdan sadece 1'i negatif
end % ise sonucun işaretini değiştir.
UYGULAMA 8
Kendisine parametre olarak aldığı pozitif bir sayi1 tam sayısı ile pozitif bir
sayi2 tam sayısını kullanarak sayi1’in sayi2’ye bölümünden kalanı
(MATLAB’de tanımlı mod veya rem hazır fonksiyonlarını kullanmadan)
hesaplayan ve geriye döndüren bir MATLAB fonksiyonunu
KalaniHesapla.m adındaki fonksiyon m-dosyasının içerisine yazalım.
function kalan=KalaniHesapla(bolunen,bolen)
while bolunen>=bolen
bolunen=bolunen-bolen;
end
kalan=bolunen;
function kalan=KalaniHesaplaV2(bolunen,bolen)
if bolunen<bolen
kalan=bolunen;
else
bolum=fix(bolunen/bolen);
kalan=bolunen-bolen*bolum;
end
UYGULAMA 9
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … şeklinde sıralanan ve serideki
her bir sayının kendisinden bir önceki ve iki önceki sayı toplanarak
(f(n)=f(n-1)+f(n-2)) elde edildiği seriye Fibonacci Serisi adı verilir. Serinin
ilk 2 elemanı sabittir ve sırasıyla 0 ve 1 değerlerine sahiptir. (f(0)1 ve
f(1)=1)
Kendisine parametre olarak aldığı pozitif bir tam sayı değerini indis olarak
kullanarak bu indisteki Fibonacci sayısını hesaplayan ve geriye döndüren
bir MATLAB fonksiyonunu FibonacciSayisiniHesapla.m adındaki
fonksiyon m-dosyasının içerisine yazalım. Örneğin
FibonacciSayisiniHesapla(1) 0 değerini, FibonacciSayisiniHesapla(2)
1 değerini ve FibonacciSayisiniHesapla(13) 144 değerini geri
döndürmelidir. Fonksiyona parametre olarak aktarılan indis değerinin 0
veya negatif bir tam sayı olması durumuna geriye -1 değeri
döndürülmelidir.
UYGULAMA 9
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … ,f(n)=f(n-1)+f(n-2))
function sonuc=FibonacciSayisiniHesapla(indis)
if indis<1
sonuc=-1; %Hatalı Parametre Girişinin Çıkışı
elseif indis==1
sonuc=0; %Serinin Birinci Elemanı
elseif indis==2
sonuc=1; %Serinin İkinci Elemanı
else
ikiOncekiEleman=0; %Serinin Birinci Elemanı
birOncekiEleman=1; %Serinin İkinci Elemanı
for i=3:indis
sonuc=ikiOncekiEleman+birOncekiEleman;
ikiOncekiEleman=birOncekiEleman;
birOncekiEleman=sonuc;
end
end
UYGULAMALAR
Uygulama 7.1
Kendisine parametre olarak aldığı 3 sayının en küçüğünü bularak geriye döndüren bir
MATLAB fonksiyonunu UcSayininMinimumunuBul.m adındaki fonksiyon m-dosyasının
içerisine yazınız.
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
Programın çalışabilmesi için bu alt
fonksiyonun
fonksiyon m-dosyasının çalışma
içerisine dizini altında tanımlı
yazınız.
olması (mevcut olması) gereklidir.
function teklerSayaci=AraliktakiTeklerinSayisiniHesapla(altLimit,ustLimit)
teklerSayaci=0;
for i=altLimit:ustLimit
KOMUT
if TekSayiMi(i)%Geriye PENCERESİ
1 veya 0 Donduren Alt Fonksiyon
>>AraliktakiTeklerinSayisiniHesapla(1,100)
teklerSayaci=teklerSayaci+1;
ans=
end 50
end
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)
if mod(sayi,2)==0
sonuc=1;
else
sonuc=0;
end
UYGULAMA
Kendisine parametre olarak aldığı sayı bir tam sayı ise
geriye 1 değerini aksi takdirde geriye 0 değerini döndüren
bir MATLAB fonksiyonunu TamSayiMi.m adındaki
fonksiyon m-dosyasının içerisine yazınız.
function sonuc=TamSayiMi(sayi)
if sayi==round(sayi)
sonuc=1;
else
sonuc=0; Round yerine herhangi
end bir yuvarlama fonksiyonu
kullanılabilir mi?
Diğer yuvarlama
fonksiyonlarını deneyelim:
fix, ceil, floor
UYGULAMA
Ortak Bölenlerinin En Büyüğü 1 olan iki sayı aralarında asal (relatively
prime, coprime) sayılar olarak adlandırılırlar.
Kendisine parametre olarak aldığı 2 pozitif tam sayı aralarında asal
iseler geriye 1 değerini aksi takdirde geriye 0 değerini döndüren bir
MATLAB fonksiyonunu AralarindaAsallarMi.m adındaki fonksiyon m-
dosyasının içerisine yazınız.
function sonuc=AralarindaAsallarMi(sayi1,sayi2)
ebob=IkiSayininEBOBunuBul(sayi1,sayi2);
if ebob==1
sonuc=1;
else
sonuc=0;
end
UYGULAMA
Kendisine parametre olarak aldığı pozitif bir tam sayının 2 sayısının
herhangi bir üssü olup olmadığını bulan bir MATLAB fonksiyonunu
IkininUssuMu.m adındaki fonksiyon m-dosyasının içerisine yazınız.
Fonksiyona parametre olarak aktarılan sayı 2 sayısının bir x. üssü
olarak ifade edilebiliyorsa geriye [1 x] değerlerini aksi takdirde geriye
[0 0] değerleri döndürülmelidir.
function [sonuc,us]=IkininUssuMu(sayi)
if (sayi>0)&&(TamSayiMi(log2(sayi))) %Alt Fonk.
sonuc=1;
us=log2(sayi);
else
sonuc=0;
us=0;
end
return Komutu
DÜZYAZI M ÇÖZÜMLER
ÇÖZÜM 3
function IkinciDereceDenkleminKokleriniHesapla(A,B,C)
delta=B^2-4*A*C;
if delta<0 Çözümün hem if ve hem de else bloğunda
kök hesabı yaptırılmadığı için (sadece
disp('Kokler Sanal');
else bloğunda yaptırılıyor) geriye belirli
else
bir değer döndürülmediğine dikkat ediniz.
x1=(-B+sqrt(delta))/(2*A);
Bu yüzden imza satırında bir atama
operatörü kullanılmamıştır.
x2=(-B-sqrt(delta))/(2*A);
fprintf('1. Kok : %f \n', x1);
fprintf('2. Kok : %f \n', x2);
end
1. FONKSİYON M ÇÖZÜM
ÇÖZÜM 4
function IkinciDereceDenkleminKokleriniHesapla(A,B,C)
delta=B^2-4*A*C;
if delta<0
disp('Kokler Sanal');
return; %Programi Ani Sonlandir
end
İmza satırında
x1=(-B+sqrt(delta))/(2*A); bir atama operatörü
kullanılmadığına, yani fonksiyonun geriye
x2=(-B-sqrt(delta))/(2*A);
bir değer döndürmediğine dikkat ediniz.
fprintf('1. Kok : %f \n', x1);
fprintf('2. Kok : %f \n', x2);
2. FONKSİYON M ÇÖZÜM
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.
function sonuc=CiftSayiMi(sayi)
sonuc=0;%Sayinin Cift Sayi Olmadigini Kabul Et
KOMUT PENCERESİ
if mod(sayi,2)==0
>>CiftSayiMi(8)
ans=
sonuc=1;%Baslangic Kabulunu Degistir
1
end
>>CiftSayiMi(9)
ans=
0
DİZİLER
• Dizi (array), en genel tanımıyla birbirleri ile ilişkili
nümerik veya metinsel değerler topluluğudur.
• Değişkenler içerisinde yalnız bir tek bilgi
depolarken dizileri kullanarak aynı türden birden
fazla bilgiyi saklayabiliriz.
• Programımız içerisinde kullanacağımız 100 adet
tamsayıyı 100 farklı değişken içinde saklamak
yerine bu amaçla içinde 100 tamsayı saklı bir dizi
kullanmak daha mantıklıdır.
• Dizi elemanlarına ulaşmak için indis dediğimiz
yapılardan ve parantezlerden faydalanırız.
MATLAB’DE DİZİLER
for i=1:length(A)
fprintf('%d\n',A(i));
end
İPUCU
function enBuyuk=DizininMaksimumunuBul(A)
enBuyuk=A(1); %Dizinin ilk elemani en buyuk olsun
for i=2:length(A) %Kac elemanli birKOMUT PENCERESİ
vektor acaba?
>>B= [2, 4, -5, 6, 7, 99, -132, 126];
if A(i)>enBuyuk
>>DizininMaksimumunuBul(B)
enBuyuk=A(i);
end ans=
end 126
>>DizininMaksimumunuBul( [2, 4, -5, 6, 7, 99, -132, 126] )
ans=
126
SORULAR…
Bir A satır vektörünün elemanlarının toplamı
Bir A satır vektörünün aritmetik ortalaması
Bir A satır vektörünün harmonik ortalaması
Bir A satır vektörünün elemanlarının çarpımı
Bir A satır vektörünün geometrik ortalaması
Bir A satır vektörünün içerisindeki çift sayıların adedi
UYGULAMA
Sayılar 𝒙𝟏 , 𝒙𝟐 , 𝒙𝟑 , … , 𝒙𝒏 olmak üzere n adet sayının geometrik ortalaması
aşağıdaki formül kullanılarak hesaplanır.
𝑮 = 𝒏 𝒙𝟏 . 𝒙𝟐 . 𝒙𝟑 … 𝒙𝒏
Kendisine parametre olarak aldığı satır vektörü formundaki bir dizinin
elemanlarının geometrik ortalamasını hesaplayarak geriye bir MATLAB
fonksiyonunu DizininGeometrikOrtalamasiniHesapla.m adındaki fonksiyon m-
dosyasının içerisine yazınız.
function ortalama=DizininGeometrikOrtalamasiniHesapla(A)
carpim=1;
diziBoyutu=length(A);
for i=1:diziBoyutu
carpim=carpim*A(i);
end
ortalama=nthroot(carpim,diziBoyutu);
BİR SATIR VEKTÖRÜNÜN BİLGİ
DEPOLAMAK AMACIYLA KULLANILMASI
A=[ ]; %Baslangicta Bos
1. METOD 2. METOD
A=[A x]; %A=[x] A(1)=x; %A=[x]
A=[A y]; %A=[x y] A(2)=y; %A=[x y]
1. RESİM 2. RESİM
A=[A x]; %A=[x] A=[x A]; %A=[x]
A=[A y]; %A=[x y] A=[y A]; %A=[y x]
Son eklenen dizi elemanı dizinin Son eklenen dizi elemanı dizinin
son elemanı oluyor. ilk elemanı oluyor.
function sonuc=DiziSadeceBirlerMiIceriyor(B)
for i=1:length(B)
if B(i)==1
sonuc=1;
else
KOMUT
sonuc=0;PENCERESİ
>>DiziSadeceBirlerMiIceriyor([-8
end
4 6 25 1])
ans=
end 1
ÇALIŞAN ÇÖZÜM
function sonuc=DiziSadeceBirlerMiIceriyor(B)
sonuc=1;%Dizinin Sadece 1 Degeri Icerdigini Kabul Et
for i=1:length(B)
KOMUT
if B(i)~=1%En PENCERESİ
Az 1 Adet Aksi Ornek Mevcutsa
>>DiziSadeceBirlerMiIceriyor(ones(1,10))
sonuc=0;%Kabulu Degistir
ans=
1break;%return Komutu da Kullanılabilir
>>DiziSadeceBirlerMiIceriyor([1
end 1 1 25 1])
end
ans=
0
UYGULAMA
Kendisine parametre olarak aldığı satır vektörü formundaki tek boyutlu bir
dizinin içerisindeki en küçük elemanı ve bu elemanın dizinin kaçıncı elemanı
olduğunu bularak geriye döndüren bir MATLAB fonksiyonunu
DizininMinimumunuVeIndisiniBul.m adındaki fonksiyon m-dosyasının
içerisine yazınız.
KOMUT PENCERESİ
UYGULAMA
function sonuc=SonluAritmetikDiziMi(A)
diziBoyutu=length(A);
if diziBoyutu>=3
sonuc=1; %Aritmetik Dizi Kabulü Yap
ortakFark=A(2)-A(1);
for i=3:diziBoyutu
if (A(i)-A(i-1))~=ortakFark
sonuc=0; %Kabulü Değiştir
break; %En az 1 Tane Aksine Örnek Yeterli
end
end
else
sonuc=0; %En Az 3 Terimle Bir Karara Varılabilir.
end
UYGULAMA
KOMUT PENCERESİ
UYGULAMALAR
Uygulama 8.1
Kendisine parametre olarak aldığı pozitif bir alt limit ile pozitif bir üst limit arasındaki bütün
aralarında asal sayı çiftlerini bulan ve ekrana alt alta basan bir MATLAB fonksiyonunu
AraliktakiAralarindaAsalSayiCiftleriniBul.m adındaki fonksiyon m-dosyasının içerisine
yazınız. Fonksiyonunuzun geriye hiçbir değer döndürmeyeceğine dikkat ediniz ve
fonksiyon imzasında bu durumu göz önüne alınız.
Örnek
Komut
Penceresi
Çıktısı
Uygulama 8.3
Kendisine parametre olarak aldığı satır vektörü formundaki tek boyutlu bir dizinin
içerisindeki negatif tek sayıları toplamını hesaplayarak geriye döndüren bir MATLAB
fonksiyonunu DizidekiNegatifTeklerinToplaminiHesapla.m adındaki fonksiyon m-
dosyasının içerisine yazınız.
1. boyut
2. boyut
MATRİS ELEMANLARINA İNDİS İLE
ULAŞMA
Matrislerde Çarpma
Matrislerin Transpozu
Matrislerin Bir Skalerle Çarpımı
Kendisine parametre olarak aldığı bir M matrisinin her bir
elemanını yine kendisine parametre olarak aldığı bir k skaleri ile
çarpan ve elde ettiği N matrisini geriye döndüren bir MATLAB
fonksiyonunu MatrisiSkalerleCarp.m adındaki fonksiyon
m-dosyasının içerisine yazınız.
function N=MatrisiSkalerleCarp(M,k)
N=[ ];%Baslangicta Bos Bir Matris
[satirSayisi sutunSayisi]=size(M);
for i=1:satirSayisi
for j=1:sutunSayisi
KOMUT PENCERESİ
N(i,j)=M(i,j)*k;
>>MatrisiSkalerleCarp([1 2;3 4],6)
end
ans=
end
6 12
18 24
Matrislerde Toplama ve Çıkarma İşlemi
Kendisine parametre olarak aldığı bir M matrisi ile yine kendisine
parametre olarak aldığı bir N matrisini toplayarak elde ettiği T
matrisini geriye döndüren bir MATLAB fonksiyonunu
IkiMatrisiTopla.m İki
adındaki
matrisin fonksiyon
toplanabilmesi veya çıkarılabilmesi
m-dosyasının içerisine
yazınız. ancak ve ancak boyutlarının (yani satır ve
sütun sayılarının) eşit olması ile mümkündür.
function T=IkiMatrisiTopla(M,N)
T=[ ];%Baslangicta Bos Bir Matris
[satirSayisiM sutunSayisiM]=size(M);
[satirSayisiN sutunSayisiN]=size(N);
KOMUT PENCERESİ
if (satirSayisiM==satirSayisiN)&&(sutunSayisiM==sutunSayisiN)
>>IkiMatrisiTopla([1
for i=1:satirSayisiM%Veya 2;3 4],[5 6;7 8])
satirSayisiN
ans=
for j=1:sutunSayisiM%Veya sutunSayisiN
6 8
T(i,j)=M(i,j)+N(i,j);
end 10 12
end
end
Matrislerde Çarpma İşlemi
A ve B gibi iki matrisin A=[1 2 1;0 3 -1];
çarpılabilmesi için A matrisinin B=[1 2; 1 5;2 3];
sütun sayısının B matrisinin satır [satirA sutunA]=size(A);
sayısına eşit olması [satirB sutunB]=size(B);
gerekmektedir. A matrisi m×n, B if sutunA ~= satirB
matrisi n×r ise bu çarpma işlemi disp('Çarpma yapılamaz.');
sonucunda elde edilecek C return;
matrisinin boyutu m×r olacaktır. end
Örnek
C=zeros(satirA, sutunB);
for i=1: satirA
for j=1: sutunB
1 2 for k=1: sutunA %veya satirB
1 2 1
A
B 1 5 C(i,j)=C(i,j)+A(i,k)*B(k,j);
0 3 1 2 3
end
end
end
5 15 disp(A);
C A B disp(B);
1 12 disp(C);
Matrislerde Transpoz İşlemi
Transpoz, matrislerde satır ile sütunun yer değiştirmesi işlemidir.
Yani A=2×3’lük bir matrisin transpozu alındığı zaman B=AT=3×2’lik bir
matris elde edilir.
𝟒 𝟒 −𝟏𝟓 𝟑 𝟐𝟕
𝟏 𝟕𝟖 𝟗 𝟏𝟔 −𝟕
Dış Döngü
𝑴 = 𝟏𝟐𝟑 −𝟗 𝟐𝟓 𝟑𝟒 𝟐
Değişkeni (i)
𝟒 𝟓𝟖 𝟑𝟒 𝟒𝟐 𝟓𝟔
−𝟔𝟓 𝟏𝟏𝟐 𝟐 𝟖 𝟑
𝟒 𝟒 −𝟏𝟓 𝟑 𝟐𝟕
𝟏 𝟕𝟖 𝟗 𝟏𝟔 −𝟕
Dış Döngü
𝑴 = 𝟏𝟐𝟑 −𝟗 𝟐𝟓 𝟑𝟒 𝟐
Değişkeni (i)
𝟒 𝟓𝟖 𝟑𝟒 𝟒𝟐 𝟓𝟔
−𝟔𝟓 𝟏𝟏𝟐 𝟐 𝟖 𝟑
function ortalama=AnaKosegeninAritmetikOrtalamasi(M)
[satirSayisi sutunSayisi]=size(M);
if satirSayisi==sutunSayisi % M Bir Kare Matris İse
toplam=0;
for i=1:satirSayisi %for i=1:sutunSayisi
toplam=toplam+M(i,i);
end
ortalama=toplam/satirSayisi;
else
ortalama=0; % M Bir Kare Matris Değilse
end
UYGULAMA
Kendisine parametre olarak aldığı bir M kare matrisinin ikincil
köşegeni üzerindeki elemanlarının geometrik ortalamasını
bularak geriye döndüren bir MATLAB fonksiyonu yazınız. (İç içe
2 for döngüsüne ihtiyaç duyulur mu? Tek for döngüsü ile
çözüme ulaşabilir miyiz?)
function ortalama=IkincilKosegeninGeometrikOrtalamasi(M)
[satirSayisi sutunSayisi]=size(M);
if satirSayisi==sutunSayisi % M Bir Kare Matris İse
carpim=1;
for i=1:satirSayisi % for i=1:sutunSayisi
carpim=carpim*M(i,satirSayisi+1-i); % (i+j)=(n+1)
end
ortalama=nthroot(carpim,satirSayisi);
else
ortalama=0; % M Bir Kare Matris Değilse
end
İPUCU
Bir kare matrisin sadece birincil veya ikincil
köşegeni üzerindeki elemanlarını ilgilendiren
uygulamalar geliştirilirken iç içe 2 for döngüsü
kullanılmasına gerek yoktur. Bu amaca yönelik
olarak tek bir for döngüsü yeterlidir.
UYGULAMA
Simetrik Matrislerin Tespiti
Ana köşegenin ayırdığı üst yarısı ile alt yarısı birbirinin aynası
görüntüsünde olan kare matrise Simetrik Matris (Symmetric
Matrix) denir. Başka bir deyişle transpozu kendisine eşit olan bir
kare matris simetriktir. Örnek :
𝟕 −𝟐 𝟓
𝑴 = −𝟐 𝟖 𝟏𝟒
𝟓 𝟏𝟒 𝟎
Kendisine parametre olarak aldığı bir M kare matrisi simetrik matris ise
geriye 1 değerini aksi takdirde geriye 0 değerini döndüren bir MATLAB
fonksiyonunu SimetrikMatrisMi.m adındaki fonksiyon m-dosyasının
içerisine yazalım.
UYGULAMA
Simetrik Matrislerin Tespiti
function sonuc=SimetrikMatrisMi(M)
[satirSayisi sutunSayisi]=size(M);
if satirSayisi==sutunSayisi % M Bir Kare Matris İse
sonuc=1; % Ana köşegen ikincil köşegene eşittir kabulünü yap
for i=1:satirSayisi
for j=1:sutunSayisi
if M(i,j)~=M(j,i)
sonuc=0; % Kabulü değiştir
return; %Programı ani sonlandır
end
return komutu yerine break
end
kullanılsaydı ne olurdu?
end
else
sonuc=0; % M nin önce kare matris olması lazım
end
UYGULAMA
Üst Üçgen Matrislerin Tespiti
Bir kare matrisin ana köşegeninin o matrisi, birisi köşegenin
altında ve diğeri de köşegenin üstünde olmak üzere 2 üçgen
bölgeye ayırdığını bilinmektedir. Ana köşegenin altında kalan
üçgen bölgenin tüm elemanları 0 değerine sahip olan kare
matrise Üst Üçgen Matris (Upper Triangular) denir. Örnek:
𝟕 −𝟐 𝟓
𝑴= 𝟎 𝟖 𝟏𝟒
𝟎 𝟎 𝟎
Kendisine parametre olarak aldığı bir M kare matrisi üst üçgen matris
ise geriye 1 değerini aksi takdirde geriye 0 değerini döndüren bir
MATLAB fonksiyonunu UstUcgenMatrisMi.m adındaki fonksiyon m-
dosyasının içerisine yazalım.
UYGULAMA
Üst Üçgen Matrislerin Tespiti
function sonuc=UstUcgenMatrisMi(M)
[satirSayisi sutunSayisi]=size(M);
if satirSayisi==sutunSayisi % M Bir Kare Matris İse
sonuc=1; % M nin bir üst üçgen olduğunu kabul et
for i=1:satirSayisi
for j=1:sutunSayisi
if (i>j)&&(M(i,j)~=0)
sonuc=0; % Kabulü değiştir
return; %Programı ani sonlandır
end
end
end
else
sonuc=0; % M nin önce kare matris olması lazım
end
UYGULAMA
Aşağıdaki gibi bir ekran çıktısı verecek EkranaRakamBas.m adında
bir fonksiyon m-dosyası yazınız. (Fonksiyonunuz kendisine hiçbir
argüman almayacak ve geriye yine hiçbir değer çevirmeyecektir.)
EKRAN ÇIKTISI
>>EkranaRakamBas()
111111111
22222222
3333333
444444
55555
6666
777
88
9
UYGULAMA
Aşağıdaki gibi bir ekran çıktısı verecek EkranaRakamBas2.m adında
bir fonksiyon m-dosyası yazınız. (Fonksiyonunuz kendisine hiçbir
argüman almayacak ve geriye yine hiçbir değer çevirmeyecektir.)
Örnek
Komut
Penceresi
Çıktısı
Uygulama 9.4
Kendisine parametre olarak aldığı bir M kare matrisinin alt üçgen bölgesindeki
elemanlarını olduğu haliyle, ana köşegendeki elemanlar yerin boşluk karakteri
kullanarak ve üst üçgen bölgesindeki elemanlar yerine de ‘*’ kullanarak bu matrisi ekrana
basan bir MATLAB fonksiyonunu EkranaSekilCiz2.m adındaki fonksiyon m-dosyasının
içerisine yazınız.
Örnek
y(t ) 3t 2 5t 8 fonksiyonu ile türevi olan y(t ) 6t 5
fonksiyonunun t’ye göre değişimlerini aynı grafik penceresi üzerinde
gösterebilmek için aşağıda verilen MATLAB programı çalıştırılır:
Grafik3.m
clear;
t=0:0.1:5;%artis miktari grafigin seklini etkiler !!!
y1=3*t.^2-5*t+8;
y2=6*t-5;
plot(t,y1,t,y2);
UYGULAMA
0 ile 360 derece arasındaki açı değerleri için sin(x) ve cos(x)
fonksiyonlarını aynı grafik penceresinde çizen bir MATLAB programı
yazınız.
Grafik4.m
clear;
derece=0:10:360; %Artis miktari 60 deneyiniz
s=sind(derece);
c=cosd(derece);
plot(derece,s,derece,c);
GRAFİKLERİ DÜZENLEME
Çizeceğimiz grafiklerde aşağıda belirtilen türlerde düzenlemeler
yapabiliriz:
1. Çizgi rengi ve tipini değiştirmek
2. x değeri ile fonksiyon değerinin kesiştiği noktaları işaretlemek
3. Grafiklere açıklama eklemek
0.8
0.6
0.4
0.2
-0.2
-0.4
-0.6
-0.8
-1
0 50 100 150 200 250 300 350 400
clear;
derece=0:10:360;
s=sind(derece);
plot(derece,s, 'ro-');
Grafik6.m
clear;
x=0:pi/30:2*pi;
y1=sin(x);
y2=cos(x);
figure(1);
plot(x,y1,'bo:');
figure(2);
plot(x,y2,'r*-');
title('cos(x) grafigi');%sadece figure 2’ye ait baslik
Açık Olan Grafik Pencerelerinin
Tümünü Birden Kapatma
figure komutu kullanarak açılmış birden fazla pencere olabilir.
Bu pencerelerin hepsini birden kapatmak için;
subplot Fonksiyonu ile Alt Grafikler
subplot(2,2,3:4);
hold Komutu
Aynı eksen takımında birden fazla grafik hold komutu yardımıyla da çizilebilir.
figure fonksiyonu kullanılmadığı sürece işletilen herbir plot komutu aynı grafik
penceresinde işlem görür. Aynı grafik ekranına çizilecek fonksiyonların sayısı
fazla ise eğer plot komutu içinde fonksiyonları birbirinden virgülle ayırmak sıkıcı
olabilir. Bu tür durumlarda hold komutu kullanılmalıdır.
Grafik8_1.m Grafik8_2.m
clear; clear;
x=0:pi/30:2*pi; x=0:pi/30:2*pi;
y1=sin(x); y1=sin(x);
y2=exp(2*sin(x)); y2=exp(2*sin(x));
plot(x,y1,'r*:'); plot(x,y1, 'r*:',x,y2, 'bo--');
hold; legend('sin(x)','e^{2*sin(x)}');
plot(x,y2,'bo--');
legend('sin(x)','e^{2*sin(x)}');
hold komutunu kaldırsak ne olur?
Eğlenceli Bir Uygulama
Grafik9.m
clear;
x=[10,5,3,2,9,14,17,20,25,27,28,29,30,38,45,49,52,54,58,...
59,60,62,66,72,78,81,82,84,87,90,97,102,106,109,112,119,...
125,128,126,122,118,117,121,134,154,174,190,194,194,185];
y=[16,50,70,104,106,104,95,80,67,59,87,124,153,157,144,127,...
109,90,71,100,134,163,178,179,174,161,141,117,93,76,89,105,...
123,140,153,156,144,128,106,86,65,48,30,17,24,29,25,21,16,7];
plot(x,y);
UYGULAMALAR
Uygulama 10.1
1’er derecelik artışla 360°’ye kadar hesaplanan ‘sin’, ‘cos’ ve bunlar kullanılarak
oluşturulan ‘sin vs cos’ ve ‘cos vs sin’ grafiklerini MATLAB grafik komutlarını kullanarak
aşağıdaki çıktıyı üretecek şekilde oluşturunuz.
Bilgisayar Programlama
(11. Sunu)
REKÜRSİF FONKSİYONLAR
Şu ana kadar tanımladığımız fonksiyonlarda
hiyerarşik bir yapı içerisinde bir fonksiyon başka
bir fonksiyonu (alt/yardımcı fonksiyonu)
çağırabiliyordu.
function sonuc=FaktoriyeliRekursifHesapla(n)
if n<0
sonuc=0; %Hatalı Parametre Girişinin Çıkışı
elseif n<=1 %Temel Durum (n=0 veya n=1)
sonuc=1;
else
sonuc=n*FaktoriyeliRekursifHesapla(n-1); %Genel Durum
end
UYGULAMA 2: REKÜRSİF ÜS ALMA
Kendisine parametre olarak aldığı bir sayi1 doğal sayısı (sayi1 ≥ 𝟎) ile bir
sayi2 doğal sayısını (sayi2 ≥ 𝟎 ) kullanarak sayi1’in sayi2. üssünü
(sayi1sayi2 ) rekürsif olarak hesaplayan ve geriye döndüren bir MATLAB
fonksiyonunu RekursifUssunuAl.m adındaki fonksiyon m-dosyasına
yazalım.
function sonuc=RekursifUssunuAl(sayi1,sayi2)
if (sayi1>=0)&&(sayi2>=0)
if sayi2==0 %Temel Durum
sonuc=1;
else
%Genel Durum
sonuc=sayi1*RekursifUssunuAl(sayi1,sayi2-1);
end
else
sonuc=-1; %Hatalı Parametre Girişinin Çıkışı
end
UYGULAMA 3: REKÜRSİF ÇARPMA
Kendisine parametre olarak aldığı bir sayi1 doğal sayısı (sayi1 ≥ 𝟎) ile bir
sayi2 doğal sayısını (sayi2 ≥ 𝟎) kullanarak sayi1.sayi2 çarpımını rekürsif
olarak hesaplayan ve geriye döndüren bir MATLAB fonksiyonunu
IkiSayiyiRekursifCarp.m adındaki fonksiyon m-dosyasına yazalım.
Çözümümüzde örneğin 4.7 çarpma işleminin sonucunun 4+4.6 ile de
hesaplanabileceği ipucundan faydalanalım.
function sonuc=IkiSayiyiRekursifCarp(sayi1,sayi2)
if (sayi1>=0) && (sayi2>=0)
if sayi2==0 %Temel Durum
sonuc=0;
else
%Genel Durum
sonuc=sayi1+IkiSayiyiRekursifCarp(sayi1, sayi2-1);
end
else
sonuc=-1; %Hatalı Parametre Girişinin Çıkışı
end
DOSYA İŞLEME
Şu ana kadar yazdığımız bütün MATLAB
programlarında, programların kullanacakları
verileri input komutu yardımıyla kullanıcıdan
klavye yardımıyla alıyorduk.
Bu giriş verileri ile programlarımızın
hesapladığı/ürettiği çıktılar ise bilgisayarın kalıcı
olmayan hafızasında bir başka deyişle ana
belleğinde tutuluyordu.
Bilgisayar kapatıldığında veya MATLAB programı
sona erdirildiğinde bu veriler de kaybolur.
DOSYA İŞLEME
Oysa pek çok uygulamada hem giriş verilerinin
ve hem de program çıktılarının daha sonra
tekrar tekrar kullanılmak üzere bilgisayarımızın
kalıcı hafızasında yani sabit diskinde saklanması
gerekir.
Bunun için bütün programlama dilleri söz
konusu verileri bir dosyadan okuyabilmeye veya
çıktıları bir dosyaya kaydedebilmeye imkan
tanıyan yapılar/komutlar içerirler.
3 ADIMDA DOSYA YÖNETİMİ
1) İşleyeceğin dosyayı aç. (fopen)
Kullanım formatı:
dosyaDegiskeni=fopen('dosyaAdi', 'mod' );
MOD İŞLEV
‘w' Var olan bir veri dosyasının içeriğini siler, dosya yoksa
oluşturur ve dosyayı yazmaya açar. (write)
‘a' Var olan bir veri dosyasını yazmak için açar, dosya
yoksa oluşturur ve girilecek bilgileri dosyanın sonuna
ekler. (append) Mevcut dosyanın içerisinde var olan
bilgiler silinmez. Yeni bilgilerin sona erdiği noktadan
itibaren dosyaya kaydedilir.
fclose KOMUTU İLE DOSYALARIN
KAPATILMASI
Yazma ve/veya okumaya açılan dosyanın MATLAB ile ilişkisini
kesmeye (dosyayı kapatmaya) yarar. (Açılan bütün dosyalar
muhakkak kapatılmalıdır.)
Kullanım formatı:
fclose(dosyaDegiskeni );
hucreDizisi=textscan(dosyaDegiskeni, 'format');
function DosyayaRastgeleSayilariKaydet(dosyaAdi,adet)
dosyaDegiskeni=fopen(dosyaAdi,'w'); %Dosyayı Yazmaya Aç
for i=1:adet
%Dosyaya Yaz
fprintf(dosyaDegiskeni,'%d\n',round(1+999*rand(1)));
end
fclose(dosyaDegiskeni); %Dosyayı Kapat
UYGULAMA: BİR DOSYANIN İÇERİSİNİN RASTGELE TAM
SAYILARLA DOLDURULMASI
UYGULAMALAR
Uygulama 11.1
Kendisine parametre olarak aldığı pozitif bir tam sayı değerini indis olarak kullanan ve bu
indisteki Fibonacci sayısını rekürsif olarak hesaplayarak geriye döndüren bir MATLAB
fonksiyonunu FibonacciSayisiniRekursifHesapla.m adındaki fonksiyon m-dosyasına
yazalım.