Python ile Veritabanı İşlemleri #1

Bu bölümde sizlere Python’da veritabanı işlemlerinin nasıl gerçekleştiğinden bahsedeceğim. Bu yazı kapsamında SQLITE ile veritabanı işlemleri gerçekleştirilecektir. SQLITE kullanmamızın sebebi, herhangi bir sunucuya ek bağlantı yapmadan SQL sorgularını hızlı ve taşınabilir dosya sistemlerinde kullanabilmektir. SQLITE veritabanı oldukça güçlü bir veritabanıdır. Burada kullanacağımız SQL sorgularını web sitemizde yer alan “SQL İle Veritabanı İşlemleri” yazılarında detaylı bir şekilde inceleyebilirsiniz. İlk olarak SQLITE bağlantısının nasıl yapılacağından bahsedelim.

Python’da SQLITE Bağlantısı Kurma

Python ile veritabanı işlemlerini gerçekleştirebilmek için SQLITE veritabanı ile ilk olarak bağlantı kurmamız gerekir. Bunun için SQLITE modülünü aşağıdaki gibi Python’a çağırmalıyız.

İmport sqlite3

Artık SQLITE veritabanına Python ile erişim sağlayabiliriz. Eğer kullandığımız SQLITE modülünün versiyonunu öğrenmek istersek aşağıdaki kodu kullanabiliriz.

INPUT: 

sqlite3.version


OUTPUT:

2.6.0

Veritabanı Oluşturma

Şimdi ise veritabanımızı oluşturalım. Bunun için aşağıdaki kod kullanılabilir.

musteriler = sqlite3.connect(“musteriler.sqlite”)

sqlite3.connect() fonksiyonu hem var olan bir veritabanına bağlanmak hem de yeni bir veritabanı oluşturmak için kullanılır. Ben burada Jupyter tabanlı Google Colab’ta kodları yazdığım için eğer var olan bir veritabanına bağlanmak isteseydim Google Drive’a veritabanı dosyasını yüklemem gerekirdi. Google Colab’ta kullandığınız Google hesabınız ile Google Drive’deki hesabınızın aynı olmasına ve bağlantı kurmuş olduğunuza dikkat ediniz.

Eğer var olan bir veritabanına bağlanmak isteseydim, veritabanının bulunduğu yolu sqlite3.connect() içerisine yazmam gerekirdi. Ben burada musteriler adlı yeni bir veritabanı oluşturdum. Eğer ki veritabanınızı istediğiniz yere kurmak istiyorsanız, kurmak istediğiniz yerin dosya yoluna veritabanı adınızı ekleyip sqlite.connect() içerisine yazabilirsiniz. Örnek olarak:

sqlite3.connect(“D:/ … /yeni klasör/veritabanım.db”)

Bu işlemin ardından veritabanımız oluşturuldu. Veritabanı üzerinde işlem yapabilmek için imleç tanımlamamız gerekir. Bu imleci tanımlamak için cursor() özelliği kullanılabilir. Veritabanımız üzerinde işlem yapabilmek için imleç oluşturalım.

imlec = musteriler.cursor()

Veritabanına Tablo Ekleme

Yukarıdaki işlemlerin ardından artık veritabanımızda sorgular ile işlemler gerçekleştirebiliriz. Veritabanımızda bir MusteriTablosu isimli bir tablo oluşturalım. Yazdığımız sorgu komutlarının veritabanında çalışması için execute() özelliğini kullanmalıyız.

INPUT: 

imlec.execute('''CREATE TABLE IF NOT EXISTS MusteriTablosu(
                          MusterID INT NOT NULL,
                          MusteriAd  varchar(20),
                          MusteriSoyad varchar(30),
                          MusteriYas TINYINT,
                          MusteriCinsiyet  char(1),
                          MusteriGeliri  Decimal(7,2),
                          MusteriToplamBorc  Decimal(7,2),
                          MusteriTaksitSayisi  TINYINT,
                          MusteriAylikOdeme Decimal(4,2))''')

Yukarıdaki kodda müşterilerimizin bazı bilgilerini tutan bir tablo oluşturduk. Bu tabloyu oluştururken IF NOT EXISTS dememizin sebebi, eğer böyle bir tablo yok ise oluştur demektir. Veritabanında işlemler gerçekleştirirken farkına varmadan yapılabilecek hataların önüne geçmek için kullanılabilir. MusterID sütununun birincil anahtar olduğunu ve boş olamayacağını belirttikten sonra diğer sütunlarımızı ve veri türlerini yazıp kod bloğunu çalıştırdık. Böylece veritabanımızda 9 sütunlu MüsteriTablosu isimli bir tablo oluşturulmuş oldu. Eğer SQLITE daha fazla incelemek isterseniz buraya tıklayarak resmi sayfaya gidebilirsiniz.

Şimdi ise oluşturduğumuz bu tabloya veri girişini sağlayalım. Birden fazla veriyi tek tek girmek yerine bir for döngüsü oluşturalım. Liste içerisine yazdığımız veriler döngü ile veritabanına aktaralım. Bunun için aşağıdaki kod bloğu kullanılabilir.

INPUT:

def  VeriGirisi(veri):
        for veriler in veri:
               imlec.execute(“INSERT INTO MusteriTablosu Values(?,?,?,?,?,?,?,?,?)”,veriler)
               musteriler.commit()
verilerim = [[136752, “Ahmet”, “Yenidoğan”,36,”E”, 4500.00, 3800.00, 6, 633.34], 
             [127650, “Ece”, “Gündüz”, 28,”K”, 3655.00, 1760.00, 4, 440.00], 
             [201638, “Ali”, “Çelik”, 46,”E”, 6500.00, 8900.00, 12, 741.67], 
             [518023, “Gizem”, “Duyar”, 23, “K”, 3500.00, 2750.00, 12, 229.17], 
             [812503, “Aslı”, “Çevik”, 26, “K”, 3000.00, 1650.00, 6, 550.00], 
             [437612, “Mehmet”, “Bekçi”, 35, “E”, 6500.00, 4800.00, 12, 400.00], 
             [356721, “Betül”, “Çevreci”, 26, “K”, 2800.00, 1400.00, 6, 233.34], 
             [971025, “Cenk”, “Kahraman”, 33, “E”, 4250.00, 9800.00, 12, 816.67]]

Yukarıda görüldüğü gibi 8 adet verimiz var. Bu verileri döngü ile veritabanına aktarma işlemini bir fonksiyon olarak tanımladık. Bu fonksiyonu çağırmak ve içerisine verilerin listesini yerleştirmemiz gerekiyor.

VeriGirisi(verilerim)

Yukarıda fonksiyonu tanımlarken imlec.commit() diye bir kod yazdık. Bu kod her veriyi disk üzerine yazmayı sağlar. Girilen veriler sadece bellekte olur ve disk üzerine yazılmaz. Bizde bağlantıyı koparmadan commit() fonksiyonu ile verilerimizi diske yazıyoruz. Eğer veritabanı üzerinde yapacağımız işlemler sonlandıysa veritabanımızı mutlaka kapatmalıyız. Bunun için close() fonksiyonu kullanılabilir.

musteriler.close()

Böylece veritabanımızı kapatmış olduk. Eğer veritabanı üzerinde yeniden işlem yapmak istersek tekrar bağlantı kurmamız gerekir. Veritabanımızın veri girişi yapıldıktan sonraki halini görmek için listeleyelim. Bunun için aşağıdaki kodlar kullanılabilir.

INPUT:

musteriler = sqlite3.connect("musteriler.sqlite")
imlec = musteriler.cursor()
imlec.execute("Select * From MusteriTablosu") 
liste = imlec.fetchall()
print("Müsteriler Listesi")
print("----------------------------------------------------------")
for müsteri in liste:
      print("Müsteri ID : {}\nMüşteri Adı : {}\nMüsteri Soyadı : {}\nMüşteri Yaş : {}\nMüşteri Cinsiyet : {}\nMüşteri Gelir : {}\nMüşterinin Borc : {}\nMüşteri taksit sayısı :{}\nMüşteri Aylık Ödeme : {}".format(müsteri[0], müsteri[1], müsteri[2], müsteri[3], müsteri[4], müsteri[5], müsteri[6], müsteri[7], müsteri[8]))
      print("-----------------------------------------------------")
musteriler.commit()
musteriler.close()










-

OUTPUT:

Müsteriler Listesi
-------------------------------------------
Müsteri ID : 136752
Müşteri Adı : Ahmet
Müsteri Soyadı : Yenidoğan
Müşteri Yaş : 36
Müşteri Cinsiyet : E
Müşteri Gelir : 4500
Müşterinin Borc : 3800
Müşteri taksit sayısı :6
Müşteri Aylık Ödeme : 633.34
-------------------------------------------
Müsteri ID : 12765
Müşteri Adı : Ece
Müsteri Soyadı : Gündüz
Müşteri Yaş : 28
Müşteri Cinsiyet : K
Müşteri Gelir : 3655
Müşterinin Borc : 1760
Müşteri taksit sayısı :4
Müşteri Aylık Ödeme : 440
                         ...

Veri Çekerken Kullanılabilecek Farklı Fonksiyonlar

Yukarıda yazdığım kod bloğuyla ilk önce veritabanına bağlandım. Ardından veritabanı üzerinde imleç oluşturdum. Bu adımdan sonra veritabanındaki tüm verileri çektim. fetchall() fonksiyonunu kullanarak tüm verileri çağırıp listeye aldım. Eğer burada fetchone() fonksiyonunu kullansaydım verileri tek tek çağırıp listelerdim. fetchone() fonksiyonu her çalıştığında bir sonraki satır listelenir. Bu iki fonksiyonun dışında fetchmany() fonksiyonu bulunur. Bu fonksiyon ile istediğimiz satırı listeyebiliriz.  Yukarıdaki kod bloğunu fetchone() ve fetchmany() ile tekrar çalıştırıp sonuçları görelim.

INPUT:

musteriler = sqlite3.connect("musteriler.sqlite")
imlec = musteriler.cursor()
imlec.execute("Select * From MusteriTablosu") 
liste = imlec.fetchone()
print("Müsteriler Listesi")
print("----------------------------------------------------------")
print("Müsteri ID : {}\nMüşteri Adı : {}\nMüsteri Soyadı : {}\nMüşteri Yaş : {}\nMüşteri Cinsiyet : {}\nMüşteri Gelir : {}\nMüşterinin Borc : {}\nMüşteri taksit sayısı :{}\nMüşteri Aylık Ödeme : {}".format(liste[0], liste[1], liste[2], liste[3], liste[4], liste[5], liste[6], liste[7], liste[8]))
print("----------------------------------------------------------")
musteriler.commit()
musteriler.close()


-
OUTPUT:


Müsteriler Listesi
----------------------------------------------------------
Müsteri ID : 136752
Müşteri Adı : Ahmet
Müsteri Soyadı : Yenidoğan
Müşteri Yaş : 36
Müşteri Cinsiyet : E
Müşteri Gelir : 4500
Müşterinin Borc : 3800
Müşteri taksit sayısı :6
Müşteri Aylık Ödeme : 633.34
----------------------------------------------------------
INPUT:

musteriler = sqlite3.connect("musteriler.sqlite")
imlec = musteriler.cursor()
imlec.execute("Select * From MusteriTablosu") 
liste = imlec.fetchmany(2)
print("Müsteriler Listesi")
print("----------------------------------------------------------")
for müsteri in liste:
      print("Müsteri ID : {}\nMüşteri Adı : {}\nMüsteri Soyadı : {}\nMüşteri Yaş : {}\nMüşteri Cinsiyet : {}\nMüşteri Gelir : {}\nMüşterinin Borc : {}\nMüşteri taksit sayısı :{}\nMüşteri Aylık Ödeme : {}".format(müsteri[0], müsteri[1], müsteri[2], müsteri[3], müsteri[4], müsteri[5], müsteri[6], müsteri[7], müsteri[8]))
      print("-----------------------------------------------------")
musteriler.commit()
musteriler.close()











-

OUTPUT:


Müsteriler Listesi
-----------------------------------------------
Müsteri ID : 136752
Müşteri Adı : Ahmet
Müsteri Soyadı : Yenidoğan
Müşteri Yaş : 36
Müşteri Cinsiyet : E
Müşteri Gelir : 4500
Müşterinin Borc : 3800
Müşteri taksit sayısı :6
Müşteri Aylık Ödeme : 633.34
-----------------------------------------------
Müsteri ID : 127650
Müşteri Adı : Ece
Müsteri Soyadı : Gündüz
Müşteri Yaş : 28
Müşteri Cinsiyet : K
Müşteri Gelir : 3655
Müşterinin Borc : 1760
Müşteri taksit sayısı :4
Müşteri Aylık Ödeme : 440
-----------------------------------------------

Bu veritabanı üzerinde daha fazla işlem gerçekleştireceğiz. Ancak bu yazımızın daha fazla uzamaması adına bu veritabanı üzerinde bir tane daha örnek yapıp yazımızı sonlandıralım.

Örnek

MusterID’si 437612 olan müşterinin taksit sayısını 12 aydan 6 aya düşürün ve buna bağlı olan sütunları güncelleyin.

Burada yapmamız gereken MusterID’si  437612 olan Mehmet Bekçi adlı müşterinin taksit sayısını 6 aya indirmektir. Buna bağlı olan aylık ödeme tutarını güncellememiz gerekir. Bunun için update komutunu kullanmamız gerekir.

INPUT:

musteriler = sqlite3.connect("musteriler.sqlite") 
imlec = musteriler.cursor()
imlec.execute("UPDATE MusteriTablosu SET MusteriTaksitSayisi = 6, MusteriAylikOdeme = 800.00  WHERE  MusterID = 437612")
GuncellenmisSatir = imlec.execute("Select * from MusteriTablosu where MusterID = 437612")
GuncellenmisSatir.fetchone()
musteriler.commit()
musteriler.close()



-

INPUT:

musteriler = sqlite3.connect("musteriler.sqlite")
imlec = musteriler.cursor()
imlec.execute("Select * From MusteriTablosu") 
liste = imlec.fetchall()
print("Müsteriler Listesi")
print("----------------------------------------------------------")
for müsteri in liste:
      print("Müsteri ID : {}\nMüşteri Adı : {}\nMüsteri Soyadı : {}\nMüşteri Yaş : {}\nMüşteri Cinsiyet : {}\nMüşteri Gelir : {}\nMüşterinin Borc : {}\nMüşteri taksit sayısı :{}\nMüşteri Aylık Ödeme : {}".format(müsteri[0], müsteri[1], müsteri[2], müsteri[3], müsteri[4], müsteri[5], müsteri[6], müsteri[7], müsteri[8]))
      print("-----------------------------------------------------")
musteriler.commit()
musteriler.close()
OUTPUT:

Müsteriler Listesi
-------------------------------------------
Müsteri ID : 136752
Müşteri Adı : Ahmet
Müsteri Soyadı : Yenidoğan
Müşteri Yaş : 36
Müşteri Cinsiyet : E
Müşteri Gelir : 4500
Müşterinin Borc : 3800
Müşteri taksit sayısı :6
Müşteri Aylık Ödeme : 633.34
-------------------------------------------
Müsteri ID : 127650
Müşteri Adı : Ece
Müsteri Soyadı : Gündüz
Müşteri Yaş : 28
Müşteri Cinsiyet : K
Müşteri Gelir : 3655
Müşterinin Borc : 1760
Müşteri taksit sayısı :4
Müşteri Aylık Ödeme : 440
-------------------------------------------
Müsteri ID : 201638
Müşteri Adı : Ali
Müsteri Soyadı : Çelik
Müşteri Yaş : 46
Müşteri Cinsiyet : E
Müşteri Gelir : 6500
Müşterinin Borc : 8900
Müşteri taksit sayısı :12
Müşteri Aylık Ödeme : 741.67
-------------------------------------------
Müsteri ID : 518023
Müşteri Adı : Gizem
Müsteri Soyadı : Duyar
Müşteri Yaş : 23
Müşteri Cinsiyet : K
Müşteri Gelir : 3500
Müşterinin Borc : 2750
Müşteri taksit sayısı :12
Müşteri Aylık Ödeme : 229.17
-------------------------------------------
OUTPUT DEVAMI:

Müsteri ID : 812503
Müşteri Adı : Aslı
Müsteri Soyadı : Çevik
Müşteri Yaş : 26
Müşteri Cinsiyet : K
Müşteri Gelir : 3000
Müşterinin Borc : 1650
Müşteri taksit sayısı :6
Müşteri Aylık Ödeme : 550
-------------------------------------------
Müsteri ID : 437612
Müşteri Adı : Mehmet
Müsteri Soyadı : Bekçi
Müşteri Yaş : 35
Müşteri Cinsiyet : E
Müşteri Gelir : 6500
Müşterinin Borc : 4800
Müşteri taksit sayısı :6
Müşteri Aylık Ödeme : 800
-------------------------------------------
Müsteri ID : 356721
Müşteri Adı : Betül
Müsteri Soyadı : Çevreci
Müşteri Yaş : 26
Müşteri Cinsiyet : K
Müşteri Gelir : 2800
Müşterinin Borc : 1400
Müşteri taksit sayısı :6
Müşteri Aylık Ödeme : 233.34
-------------------------------------------
Müsteri ID : 971025
Müşteri Adı : Cenk
Müsteri Soyadı : Kahraman
Müşteri Yaş : 33
Müşteri Cinsiyet : E
Müşteri Gelir : 4250
Müşterinin Borc : 9800
Müşteri taksit sayısı :12
Müşteri Aylık Ödeme : 816.67
-------------------------------------------

-

Sonraki yazılarımızda Python ile veritabanı işlemlerine devam edeceğiz.

PYTNBLHO08H3A1G74C

SQL Hasta-Personel Veri Tabanı Uygulaması #2

Bu yazıda sizlere bir önceki yazıda oluşturduğumuz veri tabanı üzerinde çeşitli örnek uygulamalardan bahsedeceğim.

Örnek 1: Veri tabanında yer alan tablolar arasındaki ilişkileri kurunuz.

Örnek 2: Personel tablosunda mesleği danışman olan personellerin maaşlarını 3500 TL olarak güncelleyelim.

USE Hasta_Personel_Veri_Tabani
UPDATE PersonelTablosu SET Maas = Maas + 300 WHERE MESLEK = 5
SELECT * FROM PersonelTablosu

Örnek 3: Personel tablosunda maaşı 4000-9000 TL arasında olan ve cinsiyeti erkek olan personelleri listeleyelim.

USE Hasta_Personel_Veri_Tabani
SELECT * FROM PersonelTablosu WHERE Maas BETWEEN 4000 AND 9000 AND Cinsiyet = 'E'

Örnek 4: Hasta tablosunda isminde E harfi geçen ama H harfi geçmeyen ve ziyarete uygun olan hastalarını listeleyelim.

USE Hasta_Personel_Veri_Tabani
SELECT * FROM HastaTablosu WHERE Ad_Soyad LIKE '%E%' AND Ad_Soyad NOT LIKE '%H%' AND ZiyaretDurumu = 1

Örnek 5: Personel tablosundaki toplam maaşı ve ortalama yaşı listeleyelim.

INPUT:
USE Hasta_Personel_Veri_Tabani
SELECT AVG(Yas) FROM PersonelTablosu

OUTPUT:
       36

INPUT:
USE Hasta_Personel_Veri_Tabani
SELECT SUM(Maas) FROM PersonelTablosu

OUTPUT:
       140800.00

Örnek 6: Hasta tablosunda  vefat eden hastaların ortalama yaşını listeleyelim.

INPUT:
USE Hasta_Personel_Veri_Tabani
SELECT AVG(Yas) FROM HastaTablosu WHERE SaglıkDurumu = 4

OUTPUT:
        63

Örnek 7: Hasta tablosunda sağlık durumu kritik olan hastalarımızın sayısını listeleyelim.

INPUT:
USE Hasta_Personel_Veri_Tabani
SELECT COUNT(*) FROM HastaTablosu WHERE SaglıkDurumu = 3


OUTPUT:
        7

Örnek 8: Personel tablosundaki en yaşlı ve en genç personelleri listeleyelim.

USE Hasta_Personel_Veri_Tabani
SELECT * FROM PersonelTablosu WHERE Yas = (SELECT MIN(Yas) FROM PersonelTablosu )

USE Hasta_Personel_Veri_Tabani
SELECT * FROM PersonelTablosu WHERE Yas = (SELECT MAX(Yas) FROM PersonelTablosu )

Örnek 9: Alt sorguları kullanarak personel tablosunda mesleği göz doktoru olan personelleri listeleyiniz.

INPUT:
USE Hasta_Personel_Veri_Tabani
SELECT AdSoyad,MeslekAdi FROM PersonelTablosu 
INNER JOIN MeslekTablosu ON PersonelTablosu.Meslek = MeslekTablosu.ID
WHERE MeslekAdi = (SELECT MeslekAdi FROM MeslekTablosu WHERE ID = 13)



OUTPUT:
       Atahan Adanır Göz Doktoru

Örnek 10: Personel tablosunda meslek adları yazacak şekilde Güvenlik personellerinin isimlerini ve mesleklerini listeleyelim.

INPUT:
USE Hasta_Personel_Veri_Tabani
SELECT AdSoyad,MeslekAdi FROM PersonelTablosu 
INNER JOIN MeslekTablosu ON PersonelTablosu.Meslek = MeslekTablosu.ID
WHERE MeslekAdi = 'Güvenlik Görevlisi'

Örnek 11: Personel tablosundaki tüm sütunlar için birleştirmeleri gerçekleştirelim.

CREATE VIEW View_1
AS
SELECT AdSoyad,Maas,Yas,Cinsiyet,SehirAdi,OgrenimTuru,MeslekAdi,HastalikAdi,MedeniHal,CocukSayisi,Calisma_Durumu,KademeAdi From PersonelTablosu 
INNER JOIN MeslekTablosu ON PersonelTablosu.Meslek = MeslekTablosu.ID 
INNER JOIN SehirTablosu ON PersonelTablosu.Sehir = SehirTablosu.ID
INNER JOIN OgrenimTablosu ON PersonelTablosu.Ögrenim = OgrenimTablosu.ID 
INNER JOIN HastalikTablosu ON PersonelTablosu.HastalikTürü = HastalikTablosu.ID  
INNER JOIN MedeniDurumTablosu ON PersonelTablosu.MedeniDurum = MedeniDurumTablosu.ID
INNER JOIN CalismaTablosu ON PersonelTablosu.CalismaDurumu = CalismaTablosu.ID  
INNER JOIN PersonelKademeTablosu ON PersonelTablosu.Kademe = PersonelKademeTablosu.ID 
SELECT * FROM View_1

Örnek 12: Hasta tablosundaki ad, hastalık, medeni durum,İlgilenenPersonel, SaglıkDurumu, ZiyaretDurumu ve HastanınBulunduğuKonum için birleştirmeleri gerçekleştirelim.

CREATE VIEW View_2
AS
SELECT Ad_Soyad,HastalikAdi,MedeniHal,AdSoyad,Saglik_Durumu,Ziyaret_Durumu,Konum From HastaTablosu 
INNER JOIN HastalikTablosu ON HastaTablosu.Hastalik = HastalikTablosu.ID  
INNER JOIN MedeniDurumTablosu ON HastaTablosu.MedeniDurum = MedeniDurumTablosu.ID
INNER JOIN PersonelTablosu ON HastaTablosu.İlgilenenPersonel = PersonelTablosu.ID  
INNER JOIN SaglikTablosu ON HastaTablosu.SaglıkDurumu = SaglikTablosu.ID  
INNER JOIN ZiyaretTablosu ON HastaTablosu.ZiyaretDurumu = ZiyaretTablosu.ID  
INNER JOIN HastaKonumTablosu ON HastaTablosu.HastanınBulunduğuKonum = HastaKonumTablosu.ID  

Örnek 13: Personel tablosundan eğitimi Lisans mezunu olan ve  hali hazırda çalışıyor olan personellerin adlarını, yaşlarını, cinsiyetlerini, maaşlarını ve mesleklerini listeleyelim.

USE Hasta_Personel_Veri_Tabani
SELECT AdSoyad,Yas,Cinsiyet,Maas,MeslekAdi FROM PersonelTablosu 
INNER JOIN MeslekTablosu ON PersonelTablosu.Meslek = MeslekTablosu.ID
WHERE Ögrenim = 5 AND CalismaDurumu = 1

Örnek 14: Hasta tablosunda yer alan hastalarımızı sağlık durumlarına göre gruplayalım. Sağlık durumlarını z’den a’ya doğru sıralayalım

USE Hasta_Personel_Veri_Tabani
SELECT Saglik_Durumu,COUNT(*) AS 'Sayısı' FROM HastaTablosu 
INNER JOIN SaglikTablosu ON HastaTablosu.SaglıkDurumu = SaglikTablosu.ID
GROUP BY Saglik_Durumu ORDER BY Saglik_Durumu DESC

Örnek 15: Personel tablosundaki personelleri kademelerine göre gruplayıp, üst kademe olan personelleri listeleyelim.

USE Hasta_Personel_Veri_Tabani
SELECT KademeAdi,COUNT(*) AS 'Sayısı' FROM PersonelTablosu 
INNER JOIN PersonelKademeTablosu ON PersonelTablosu.Kademe = PersonelKademeTablosu.ID
GROUP BY KademeAdi HAVING KademeAdi= 'Üst'


Örnek 16: Personel tablosunda mesleği göz doktoru olan personellerin maaşına 500 TL zam yapalım.

USE Hasta_Personel_Veri_Tabani
UPDATE PersonelTablosu SET Maas = Maas + Maas*0.30 WHERE Meslek = 19 
SELECT * FROM PersonelTablosu Where Meslek = 19


Örnek 17: Başhekim’in maaşını maksimum maaş tutarının 1000 TL fazlasına göre güncelleyelim.

USE Hasta_Personel_Veri_Tabani
UPDATE PersonelTablosu SET Maas = (SELECT Max(Maas) FROM PersonelTablosu) + 1000 WHERE Meslek = 16
SELECT * FROM PersonelTablosu Where Meslek = 16



Örnek 18: Personel tablomuzdaki tüm isimleri tersten yazan sorguyu yazalım.

USE Hasta_Personel_Veri_Tabani
SELECT AdSoyad,REVERSE(AdSoyad) AS 'Tersten Yazımı' FROM PersonelTablosu




Örnek 19: Personel tablomuzdaki personellerimizin maaşlarının standart sapmalarını hesaplayalım.

INPUT:
DECLARE @sayi1 Decimal(15,2), @sayi2 Decimal(15,2), @standartSapma Decimal(15,2)
SET @sayi1 = (SELECT AVG(Maas) from PersonelTablosu)
SET @sayi2 = (SELECT SUM(POWER((Maas-@sayi1),2)) from PersonelTablosu)
SET @standartSapma = (SELECT  SQRT(@sayi2/20))
PRINT @standartSapma

OUTPUT:
       3863.48


Örnek 20: Hasta tablomuzdaki 45 yaşından küçük olan hasta kadınların sağlık durumlarını listeleyen sorguyu yazalım.

USE Hasta_Personel_Veri_Tabani
SELECT Ad_Soyad,Yas,Cinsiyet,Saglik_Durumu FROM HastaTablosu
INNER JOIN SaglikTablosu ON HastaTablosu.SaglıkDurumu = SaglikTablosu.ID
WHERE Yas < 45 AND Cinsiyet = 'K' 



Örnek 21: Durumu kritik olan hastalarımızın adlarını, yaşlarını, hastalıklarını ve ziyaret durumlarını listeleyen sorgumuzu yazalım.

USE Hasta_Personel_Veri_Tabani
SELECT Ad_Soyad,Yas,Hastalik,Saglik_Durumu,Ziyaret_Durumu FROM HastaTablosu
INNER JOIN SaglikTablosu ON HastaTablosu.SaglıkDurumu = SaglikTablosu.ID
INNER JOIN ZiyaretTablosu ON HastaTablosu.ZiyaretDurumu = ZiyaretTablosu.ID
WHERE Saglik_Durumu = 'Kritik'



Örnek 22: Her bir personelimizin hastalığını ve yaşını listeleyelim.

USE Hasta_Personel_Veri_Tabani
SELECT AdSoyad,Yas,HastalikAdi FROM PersonelTablosu
INNER JOIN HastalikTablosu ON PersonelTablosu.HastalikTürü = HastalikTablosu.ID




Örnek 23: Her bir kademe için gereken minimum eğitim seviyesini listeyen sorguyu yazalım.

USE Hasta_Personel_Veri_Tabani
SELECT KademeAdi,OgrenimTuru AS 'Gereken Minimum Eğitim Seviyesi' FROM PersonelKademeTablosu
INNER JOIN OgrenimTablosu ON PersonelKademeTablosu.GerekenMinEgitim = OgrenimTablosu.ID





Örnek 24: Hastalarımızın ve personellerimizin ortalama yaşlarının farkını listeleyen sorguyu yazalım.

INPUT:
USE Hasta_Personel_Veri_Tabani
DECLARE @sayi1 DECIMAL(7,2), @sayi2 DECIMAL(7,2), @yasFarki DECIMAL(7,2)
SET @sayi1 = (SELECT AVG(Yas) FROM HastaTablosu)
SET @sayi2 = (SELECT AVG(Yas) FROM PersonelTablosu)
SET @yasFarki = @sayi1 - @sayi2 
PRINT @yasFarki


OUTPUT:
       15.00



Örnek 25: Cinsiyeti erkek olan hastaların sayısını listeleyen sorguyu yazalım.

INPUT:
USE Hasta_Personel_Veri_Tabani
SELECT COUNT(*) FROM HastaTablosu WHERE Cinsiyet = 'E'


OUTPUT:
        11



Bir önceki yazıya ulaşmak için buraya tıklayınız.

SQL19K777RYM81TP66
SQL Hasta-Personel Veri Tabanı Uygulaması #1

Bu bölümde örnek bir veri tabanı oluşturulmasından bahsedeceğim. Oluşturacağımız veri tabanı Hasta-Personel bilgilerini saklayan bir veri tabanı olacaktır. Veri tabanımızın yapısını aşağıdaki şema ile gösterebiliriz.

Veri Tabanı Diagramı

Bu tablolara eklenecek olan veriler aşağıdaki tablolarda listelenmiştir.

Veri Tabanındaki Tablolara Eklenecek Sütunlar
Ziyaret Durumu
Ziyarete Uygun
Kısıtlı Ziyaret
Ziyarete Kapalı
Sağlık Durumu
Normal
Rahatsız
Kritik
Vefat
Medeni Hal
Evli
Bekar
Dul
Boşanmış
Çalışma Durumu
Çalışıyor
Yıllık İzinde
Raporlu
İstifa Etti
Emekli Oldu
Hastanın Bulunduğu Yer
Hasta Odası
Ameliyathane
Morg
Yoğun Bakım
Öğrenim Türü
İlkokul Mezunu
Ortaokul Mezunu
Lise Mezunu
Önlisans Mezunu
Lisans Mezunu
Yüksek Lisans Mezunu
Doktora Mezunu
Hastalıklar Tablosu
Kalp-Damar Hastası
Böbrek Yetmezliği
Karaciğer Yetmezliği
Sinirsel Bozukluk
Alzheimer
Göz Bozukluğu
İşitme Sorunu
Şeker Hastalığı
Kolesterol Hastalığı
Kemik Erimesi
Solunum Yetmezliği
Bağırsak Kanseri
Yaralanma
Kırık-Çıkık
Hastalığı Yok
Prostat Kanseri
Şehir
İstanbul
Ankara
İzmir
Bursa
Kocaeli
Nevşehir
Antalya
Adana
Muğla
Diyarbakır
Mardin
Erzurum
Balıkesir
Trabzon
Niğde
Ordu
Osmaniye
Şanlıurfa
Sivas
Samsun
Meslekler
KBB Doktor
Hemşire
Hasta Bakıcı
Temizlik Personeli
Danışman
Güvenlik Görevlisi
Genel Cerrah
Anestezi Uzmanı
Morg Görevlisi
Adli Tıpçı
İç Hastalıkları Uzmanı
Beyin Cerrahı
Göz Doktoru
Üroloji Doktoru
Nefroloji Doktoru
BaşHekim
Ortopedi Doktoru
Kadın Hastalıkları Doktoru
Personel Kademesi
Alt Kademe
Orta Kademe
Üst Kademe

Böylece oluşturacağımız veri tabanı yapısını ve verileri görmüş olduk. Şimdi bu veri tabanını oluşturalım. Bunu sorgu komutları ile yapalım.

Veri Tabanı Ve Tabloların Kodlar İle Oluşturulması

CREATE DATABASE Hasta_Personel_Veri_Tabani

Sorguyu çalıştırdığımızda veri tabanımız oluşturulmuş olur. Veri tabanımızda oluşturmamız gereken tabloları isterseniz Object Explorer (Nesne gezgini) kısmından isterseniz sorgu komutları ile oluşturabilirsiniz. Sorgu komutları için aşağıdaki gibi komutlar kullanılabilir:

CREATE TABLE SehirTablosu(
  ID INT IDENTITY(1,1) PRIMARY KEY,
  SehirAdı   varchar(30)
)
CREATE TABLE MeslekTablosu(
  ID INT IDENTITY(1,1) PRIMARY KEY,
  MeslekAdi   varchar(30)
)
CREATE TABLE HastalıkTablosu(
  ID INT IDENTITY(1,1) PRIMARY KEY,
  HastalikAdi   varchar(30)
)

Ziyaret durumu, sağlık durumu, medeni hal ve çalışma durumu gibi tabloların oluşturulma komutları yukarıdaki örnekler ile aynı olduğundan bunlar ve benzeri tabloların oluşturulma komutlarını buraya eklemiyorum. Bunlardan farklı olarak personel kademesi, çalışma durumu, hasta tablosu ve personel tablolarını oluşturalım.

CREATE TABLE CalismaTablosu(
  ID INT IDENTITY(1,1) PRIMARY KEY,
  SaglikDurumu INT,
  CalismaDurumu INT,
)
CREATE TABLE PersonelKademeTablosu(
  ID INT IDENTITY(1,1) PRIMARY KEY,
  GerekenMinEgitim INT,
  Kademe varchar(10),
)

CREATE TABLE PersonelTablosu(
  ID INT IDENTITY(1,1) PRIMARY KEY,
  AdSoyad varchar(40),
  Yas TINYINT,
  Maas Decimal(10,2)
  Cinsiyet INT,
  Sehir INT,
  Ögrenim INT,
  Meslek INT,
  HastalikTürü INT,
  MedeniDurum INT,
  CocukSayisi TİNYİNT,
  CalismaDurumu INT
)
CREATE TABLE HastaTablosu(
  ID INT IDENTITY(1,1) PRIMARY KEY,
  Ad_Soyad varchar(40),
  Yas TINYINT,
  Cinsiyet varchar(1),
  Hastalik INT,
  MedeniDurum INT,
  İlgilenenPersonel INT,
  SaglıkDurumu INT,
  ZiyaretDurumu INT,
  HastanınBulunduğuKonum INT,
  BosSutun char(5)
)

Örnekler

Bu komutları yazarken dikkat ettiyseniz bazı yerleri eksik, yanlış ya da alakasız değerler yazdık. Bunun sebebi DDL komutlarını bu örnek veri tabanı üzerinde basit de olsa görebilmektir.

Örnek 1:  Hasta tablosundan BosSutun adlı sütunu kaldırınız.

ALTER TABLE HastaTablosu DROP COLUMN BosSutun

Bu sorgunun ardından hasta tablomuzda BosSutun adlı bir sütun olmayacaktır. Bunu Object Explorer (Nesne gezgini) sekmesinden tabloyu görüntüleyerek görebilirsiniz.

Örnek 2:  Personel tablosuna Kademe adlı bir sütun ekleyiniz.

ALTER TABLE PersonelTablosu ADD Kademe INT

Örnek 3:  Personel tablosundaki cinsiyet sütununun veri türünü değiştiriniz.

ALTER TABLE PersonelTablosu ALTER COLUMN Cinsiyet Varchar(1)

Bu komutların ardından veri tabanında yer alan tablolar artık istediğimiz şekilde olacaktır. Bu sebeple tablolarımıza Object Explorer (Nesne gezgini) sekmesini kullanarak veri girişlerini yapalım. Veri girişlerinin ardından hasta tablosunu ve personel tablosunu listeleyelim.

Hasta Tablosu
Personel Tablosu

Örnek 4:  Personel tablosuna (Onur Taylan, 46, 5000, E, 5, 5, 9, 15, 1, 3, 1, 3) ve (Mehmet Emin, 38, 3200, E, 4, 3, 5, 15, 1, 3, 1, 2) kişileri ekleyelim.

INSERT INTO PersonelTablosu VALUES (‘Onur Taylan’, 46, 5000, ‘E’, 5, 5, 9, 15, 1, 3, 1, 3)

INSERT INTO PersonelTablosu VALUES (‘Mehmet Emin’, 38, 3200, ‘E’, 4, 3, 5, 15, 1, 3, 1, 2)

Örnek 5: Personel tablosundan Mehmet Emin isimli kişiyi çıkaralım.

DELETE FROM PersonelTablosu WHERE AdSoyad =’Mehmet Emin’

Buraya kadar yaptıklarımızla veri tabanını oluşturduk. Yukarıdaki veri tabanı şemasına baktığımızda tablolar arasında ilişkiler olduğu görülüyor. Bir sonraki yazıda veri tabanımız üzerindeki tablolar arası ilişkileri oluşturacağız, DML komutlarını ve Aggregate fonksiyonlarını kullanacağız. Bir sonraki yazıya ulaşmak için buraya tıklayınız.

SQL121378HK02225Y7
Matlab’de Matematiksel İşlemler

Bu yazıda sizlere limit, türev, integral ve diferansiyel denklemlerin Matlab’de nasıl çözüldüğünden bahsedeceğim.

Matlab’de Limit

Matematikte çok önemli bir yere sahip olan limit problemlerini Matlab’de çözmek mümkündür. Bunun için limit() komutunu kullanmamız gerekir. Komutun içerisine yazmamız gereken fonksiyon sembolik nesnelerden oluşmalıdır. Eğer sembolik nesne ile ilgili herhangi bir fikriniz yoksa buradan bir önceki yazımızı okumanızı tavsiye ederim. Komutun kullanılışı,

limit(fonksiyon,değişken,değer,left-right)

şeklindedir. Burada eğer fonksiyonumuz x değişkenine bağlı ise değişken yerine x yazılır. x değişkeninin yaklaşmaya çalıştığı değer b ise  değer yerine b yazılmalıdır. Eğer ki b değerine b+(sağdan) ya da b(soldan) yaklaşıyorsak left veya right değerlerinden biri yazılmalıdır.

    \[lim_{x\to b^+}f(x)\]

ifadesinin limitini bulmak için komut satırına limit(f(x),x,b,right) ifadesi yazılmalıdır. Eğer değer yerine herhangi bir şey yazılmaz ise 0 olarak kabul edilir.

Limit x→∞ ise değer yerine inf, x→-∞ ise –inf yazılmalıdır.  Böylece limit bulunmuş olacaktır. Birkaç örnek yapalım.

Örnekler

    \[lim_{x \to \infty}\frac{7^{2x+1}-49.7^{x+3} }{49^{x-1}+77 }    =?\]

INPUT:
 >> syms x;
 >> f = (7^(2*x+1) - 49*(7^(x+3)))/(49^(x-1) + 77);
 >> sonuc = limit(f,x,inf);
 >> sonuc
 OUTPUT:
 sonuc =
  343 

    \[lim_{x \to {0}^{-}}\frac{9x}{|x|} =?   \hspace{3em} lim_{x \to 1}\frac{3x^2-3}{x-1} =? \]

 INPUT:
 >> syms x;
 f1 = (9*x)/abs(x);
 >> sonuc1 = limit(f1,x,0,'left');
 >> sonuc1
 OUTPUT:
 sonuc1 =
 -9 

INPUT:
>> syms x;
>> f2 = (3*(x^2) - 3)/ (x-1);
>> sonuc2 = limit(f2,x,1);
>> sonuc2
OUTPUT:
sonuc2 = 
6

    \[lim_{x \to a}\frac{x^3-a^3}{sin(3x-3a)} =? \hspace{3em} lim_{x \to {1}^{+}}\frac{6x^2+5x+3}{9x} =? \]

INPUT:
syms x a;
f3 = ((x^3) - (a^3))/(sin(3x -3a));
sonuc3 = limit(f3,x,a) ;
sonuc3
OUTPUT:
sonuc3 =
a^2    

INPUT:
>> syms x;
>> f4 = (6*(x^2) + 5*x + 3) / (9*x);
>> sonuc4 = limit(f4,x,1,'right');
>> sonuc4
OUTPUT:
sonuc4 =
14/9 

Matlab’de Türev

Mühendislik ve matematik başta olmak üzere birçok alanda karşımıza çıkan türev problemlerini matlab ile çözmek için diff() komutunu kullanmamız yeterlidir. Türevini hesaplama ihtiyacı duyduğumuz fonksiyonu diff() komutuna yazarken, fonksiyonun değişkenini matlab’de sembolik nesne olarak tanımlamış olmamız gerekir. Komutun kullanışı diff(fonksiyon,derece,değişken) şeklindedir. Fonksiyon ve değişken kısımlarına neler yazılması gerektiği limit() komutundan biliyoruz. Derece yerine ise fonksiyonun kaçıncı mertebeden türevinin olmaması gerektiği yazılmalıdır. Örnek olarak f(x) fonksiyonunun 2.mertebeden türevi hesaplanmak isteniyorsa komut satırına diff(f(x),2,x) yazılması yeterlidir. Matlab sonucu bize çıktı olarak gösterecektir.

Örnekler

    \[f(x)=7x^6+ 6x^5 + 10x^4 + 2x^2+ 1  \quad ise  \quad f'(x) = ?\]

INPUT:
>> syms x;
>> f = 7*(x^6) + 6*(x^5) + 10*(x^4) + 2*(x^2) + 1;
>> sonuc = diff(f,1,x);
>> sonuc
OUTPUT:
sonuc = 
42*x^5 + 30*x^4 + 40*x^3 + 4*x 

    \[f(x)=x^2tan(x)+cos^2(4x^2) \quad  ise  \quad f'(x) = ?\]

INPUT:
>>syms x;
>>f = (x^2)tan(x) + (cos(4(x^2)))^2;
>>sonuc = diff(f,1,x);
>>sonuc
OUTPUT:
>>sonuc =
>>2xtan(x) + x^2(tan(x)^2 + 1) - 16xcos(4x^2)sin(4x^2)    

    \[f(x)=e^xsin(5x) \quad  ise  \quad f^3(x) = ?\]

INPUT:
>>syms x;
>>f = exp(x)(sin(5x));
>>sonuc = diff(f,3,x);
>>sonuc
OUTPUT:
>>sonuc =
>>-110cos(5x)exp(x) - 74sin(5x)exp(x)         

    \[f(x)=\frac{1}{2+sin(2x)}\hspace{0.2 cm}ise\hspace{0.2 cm}f^2(x)=?\hspace{0.2 cm}ve\hspace{0.2 cm}x=5\hspace{0.2 cm}noktasındaki\hspace{0.2 cm}2. türevi\hspace{0.2 cm}nedir?\]

INPUT:
>>syms x;
>>f = (1)/(2 + sin(2x)); 
>>turevin_sonucu = diff(f,2,x);
>>sonuc = subs(turevin_sonucu,5);  %x = 5 noktasındaki 2.türevin sonucuna bakıyoruz.  
>>sonuc 
>>OUTPUT: 
>>sonuc =  (4sin(10))/(sin(10) + 2)^2 + (8*cos(10)^2)/(sin(10) + 2)^3       

Matlab’de İntegral

Matlab’de int() komutunu kullanarak herhangi bir integral probleminin çözümünü bulabiliriz. Bu komutun içerisine yazacağımız fonksiyonun değişkeninin yine önceki iki komut gibi sembolik nesne olarak tanımlanmış olması gerekir. int() komutu ile belirli veya belirsiz integraller çözdürülebilir. Eğer belirsiz integral çözmek istiyorsak int(fonksiyon) komutunu kullanmalıyız. Fakat belirli integral çözmek istiyorsak int(fonksiyon,başlangıç değeri,bitiş değeri) komutunu kullanmamız yeterlidir. Bazı durumlarda matlab integrali hesaplayamayabilir. Bu durumda quad() komutunu kullanarak integralin yaklaşık değerini hesaplayabiliriz.

Örnekler

    \[\int (3x^5+2x^2+1)dx\hspace{0.2 cm}integralini\hspace{0.2 cm}hesaplayınız.\]

INPUT:
>> syms x;
>> f = 3*(x^5) + 2*(x^2) + 1;
>> sonuc = int(f);
OUTPUT:
sonuc =
x^6/2 + (2*x^3)/3 + x 

    \[\int (x^2sin(x))dx\hspace{0.1 cm}integralini\hspace{0.1 cm}hesaplayınız.\]

INPUT:
>> syms x;
>> f = (x^2)*sin(x);
>> sonuc = int(f);
>> sonuc
OUTPUT:
sonuc =
2*x*sin(x) - cos(x)*(x^2 - 2) 

    \[\int_{0}^1 \frac{2}{2+3x}dx\hspace{0.1 cm}integralini\hspace{0.1 cm}hesaplayınız.\]

INPUT:
>>syms x;
>>f = (2)/(2 + 3*x);
>>sonuc = int(f,0,1);
>>sonuc
OUTPUT:
>>sonuc =
>>log(50^(1/3)/2)    

    \[\int_{0}^{\pi/2} sin^2(3x)cos(x)dx\hspace{0.1 cm}integralini\hspace{0.1 cm}hesaplayınız.\]

INPUT:
>>syms x;
>>f = ((sin(3x))^2)cos(x);
>>sonuc = int(f,0,pi/2);
>>sonuc
OUTPUT:
>>sonuc =
>>17/35    

Bu tip integral hesaplamalarının dışında iki katlı ya da üç katlı integraller hesaplanabilir.

Çok Katlı İntegraller

    \[\int_{a}^{b}\int_{b}^{a}f(x,y)dxdy\]

biçimindeki iki katlı integrali hesaplamak için int(int(f(x,y),x,c,d),y,a,b) komutunun kullanılması yeterlidir. Burada dikkat edilmesi gereken husus, integral probleminde hangi değişkene göre integral önce hesaplanması gerekiyorsa, int(f(x,y),x,c,d) komutunun değişkeni ve sınırları ona göre belirlenmelidir. Eğer integral problemi ilk y değişkenine göre hesaplanması gerekseydi, içerideki komut int(f(x,y),y,c,d) şeklinde olurdu. Benzer şekilde üç katlı

    \[\int_{a}^{b}\int_{c}^{d}\int_{e}^{f}f(x,y,z)dxdydz\]

integralini hesaplamak için int(int(int(f(x,y,z),x,e,f),y,c,d),z,a,b) komutunu kullanmamız gerekir.

Örnekler

    \[\int_{0}^{3}\int_{0}^{x/4}(x^2+y^2)dydx\hspace{0.1 cm}integralini\hspace{0.1 cm}hesaplayınız.\]

INPUT:
>>syms x y;
>>f = (x^2) + (y^2);
>>sonuc = int(int(f,y,0,x/4),x,0,3);
>>sonuc
OUTPUT:
>>sonuc =    
>>1323/256

    \[\int_{0}^{4}\int_{0}^{5}\int_{0}^{3}(x^2y^2z^2)dxdydz\hspace{0.1 cm}integralini\hspace{0.1 cm}hesaplayınız.\]

INPUT:
>>syms x y z;
>>f = (x^2)(y^2)(z^2);
>>sonuc = int(int(int(f,x,0,3),y,0,5),z,0,4);
>>sonuc
OUTPUT:
>>sonuc =    
>>8000

Bu şekilde matlab’de herhangi bir integral problemini hesaplayabiliriz. Son olarak diferansiyel denklem çözümlerinden bahsedip yazıyı sonlandıracağım.

Matlab’de Diferansiyel Denklemler

Limit, türev, integral gibi matematik, fizik ve mühendislik alanlarında önemli bir yere sahip olan diferansiyel denklemleri matlab üzerinde çözebilmek mümkündür. Bilinmeyen fonksiyonun bir bağımsız değişkene bağlı olduğu adi diferansiyel denklemleri çözmek için Dsolve() komutu kullanılabilir. Komut içerisindeki d/dt ifadesi ‘D’ ile temsil edilir. Dsolve komutunun kullanımı Dsolve(‘Diferansiyel denklem’,başlangıç koşulları) şeklindedir. Diferansiyel denklemin matlab’de temsili aşağıdaki gibidir:

    \[y' = Dy,    y'' = D2y,     y''' = D3y,    y'''' = D4y,  … ,  = Dny\]

Örnekler

    \[y'' - 6y' + 25y = 0\hspace{0.1 cm}diferansiyel\hspace{0.1 cm}denklemini\hspace{0.1 cm}çözünüz.\]

INPUT:
>>syms x y;
>>x=dsolve('D2y-6Dy+25y=0');
>>x
OUTPUT:
>>x =
>>C1cos(4t)exp(3t) + C2sin(4t)exp(3t)    

    \[y'' - y' - 2y = e^{4t}\hspace{0.1 cm}diferansiyel\hspace{0.1 cm}denklemini\hspace{0.1 cm}çözünüz.\]

INPUT:
>>syms x y t;
>>x=dsolve('D2y-Dy-2y=exp(4t)');
>>x
OUTPUT:
>>x =
>>exp(4t)/10 + C1exp(2t) + C2exp(-t)    

    \[y'' - 8y' + 2y + 1= t\hspace{0.1 cm}diferansiyel\hspace{0.1 cm}denklemini\hspace{0.1 cm}\hspace{0.1 cm}y(0) =0\hspace{0.1 cm}ve\hspace{0.1 cm}y'(0) = -1\]

    \[koşulları\hspace{0.1 cm}altında\hspace{0.1 cm}çözünüz\hspace{0.1 cm}ve\hspace{0.1 cm}grafiğini\hspace{0.1 cm}çiziniz.\]

INPUT:
>>syms x y t;
>>x=dsolve('D2y+8Dy+2y+1=t','y(0)=0','Dy(0)=-1'); 
>>x
>>ezplot(x)
OUTPUT:
>>x =
>>t/2 + exp(t(14^(1/2) - 4))((1714^(1/2))/56 + 5/4) + (14^(1/2)exp(-t(14^(1/2) + 4))(5*14^(1/2) - 17))/56 - 5/2    

MTLBI7J25966U28A3H

Python’da Fonksiyonlar

“def” İle Tanımlanan Fonksiyonlar

Bu yazıda sizlere Python’da fonksiyonlardan bahsedeceğim. Fonksiyonların kullanımları matematikte bildiğimiz fonksiyonlar gibi olup, bir fonksiyon tanımlandıktan sonra içerisine bir girdi yazarız. Ardından fonksiyon bu girdiye göre bize bir çıktı verir.

Örnek olarak f(x) = 2x + 1 fonksiyonunu düşünürsek, x = 5 için fonksiyon çıktı olarak f(5) = 11 değerini bize verir. Python’da da fonksiyonlar, bir girdi alan (zorunlu değil) ve bu girdiyi bazı işlemlerden geçirip sonucunu bize geri döndüren ifadelerdir. Programımız için kod yazarken bazı kodları tekrar tekrar kullanmak zorunda kalabiliriz. Bu tür durumlada aynı kodu tekrar yazmak yerine kodumuzu bir fonksiyon olarak tanımlayıp, o fonksiyonu çağırabiliriz. Bu bize çok büyük bir kolaylık sağlayacaktır. Python’da fonksiyon tanımlamak için fonksiyon ifadesinin başına ‘def’  ifadesi eklenir. Bu ifade ingilizce ‘definition’ olan tanımlama kelimesidir. Örnek bir fonksiyon tanımlayalım.

Örnek 1

INPUT: 

  def f(x):
    print(2x+1)
  
  f(5)


OUTPUT:

     11

Yukarıdaki örnekte fonksiyonun içerisine girilen parametre için 2x+1 işlemini gerçekleştirip çıktıyı ekrana yazdıran bir fonksiyon tanımladık. Tanımladığımız fonksiyonların ekrana sonuç yazdırmasını istiyorsak print() ya da return gibi ifadeleri kullanmamız gerekir. return ifadesi döndürmek anlamına gelir. Örnek kullanımını gösterelim.

Örnek 2

INPUT:

isim = input("Lütfen bir isim giriniz :  ")
def f(deger):
        karsilamaMesaji = "Merhaba" + " " + deger
        return karsilamaMesaji
f(isim)       

OUTPUT:

Lütfen bir isim giriniz :  Adil
'Merhaba Adil'

Yukarıdaki fonksiyon dışarıdan girilen ismi karşılama mesajına ekleyip sonucu bize döndürecektir. Bir başka örnek:

Örnek 3

INPUT:

isim = input("Lütfen bir isim giriniz : ")
def karsilamaMesaji(yeni_deger):
       if yeni_deger.isnumeric():
           sonuc = yeni_deger + " " + "bir nümerik değerdir." 
           return sonuc
       else:
           print(yeni_deger + " " + "bir nümerik değer değildir.")
karsilamaMesaji(isim)

OUTPUT:

Lütfen bir isim giriniz : Erhan
Erhan bir nümerik değer değildir.  

Fonksiyonlarda kullanılan değişkenler yerel değişkenlerdir. Yani fonksiyon bloğu dışında bu değişkenlere erişilemezdir. Örnek olarak:

Örnek 4

INPUT:

def f():
    y = 5
    return y 
print(y)

OUTPUT:

NameError: name 'y' is not defined

Burada yaptığımız örneklerin dışında fonksiyonlar birden fazla parametre almaları mümkündür. Örnek olarak:

Örnek 5

INPUT:

def f(x,y,z):
    a = 2*(x**2) + 5 
    b = 3*(y**3) + 6
    c = z  + 6
    return a,b,c

f(2,5,7)   

OUTPUT:

(13, 381, 13)

Örnek 2’de dışarıda tanımladığımız x = 5 değişkenini fonksiyon içerisine yazdıktan sonra tekrar çağırdığımızda x’in değeri yine 5 olarak ekrana yansımıştı. Dışarıda tanımladığımız değişkenin fonksiyon içerisindeki değişiminin her yerde geçerli olması için değişkeni fonksiyon içerisinde global olarak tanımlamamız gerekir. Örnek olarak:

Örnek 6

INPUT:

x = 5                            
def f(x):                      
    x += 1                           
    return x                          
f(x),x 

OUTPUT:

(6, 5)      

INPUT:

x = 5
def f1():
    global x
    x += 1  
    return x
f1(),x

OUTPUT:

(6, 6)

Burada yaptığımız örneklerin dışında fonksiyonların birden fazla parametre almaları mümkündür. Örnek olarak:

Örnek 7

INPUT:

def f(x,y,z):
    a = 2*(x**2) + 5 
    b = 3*(y**3) + 6
    c = z  + 6
    return a,b,c

f(2,5,7)  


OUTPUT:

  (13, 381, 13) 

Bunun dışında fonksiyon içinde fonksiyon tanımlamak ve bir fonksiyonun içerisinde başka bir fonksiyonun sonucunu kullanmak mümkündür. Örnek olarak:

Örnek 8

INPUT:


def fonksiyon():
     x = int(input("Lütfen bir sayı giriniz: "))
     a = x/2
     b = x/3
     def fonksiyon1():
        c = a+5
        d = b+5
        return c,d
     return print("a = {}, b = {}, c ve d = {} olarak elde edilir".format(a,b,fonksiyon1()))

fonksiyon()


OUTPUT:

Lütfen bir sayı giriniz: 6
a = 3.0, b = 2.0, c ve d = (8.0, 7.0) olarak elde edilir

Örnek 9

INPUT:

def f(a,b,c): 
   toplam = a+b+c 
   return toplam
def g(a,b,c):
    ortalama = f(a,b,c)/3
    return ortalama    

g(3,5,4)


OUTPUT:

     4.0

Buraya kadar yaptığımız örneklerin dışında birkaç örnek daha yapalım ve ardından lambda fonksiyonundan bahsedelim.

Örnek 10

Vize, final notunun girildiği ve sonuç olarak dersten geçme-kalma durumunun döndürüldüğü bir program yazınız.

INPUT:

def DersDurum(VizeNotu, FinalNotu):
    ortalama = (0.4*VizeNotu) + (FinalNotu*0.6)
    if ortalama >= 50:
       return (ortalama, "Geçtiniz")
    else:
       return (ortalama, "Kaldınız") 
DersDurum(45,50)
(48.0, 'Kaldınız')

OUTPUT:

    (48.0, 'Kaldınız')

Örnek 11

Girilen bir sayının çift olup olmadığını tespit eden bir fonksiyon yazınız.

INPUT:

def f(z):
    if z%2 ==0:
       print("Girilen sayı çiftir.")
    else:
       print("Girilen sayı tektir.")   
f(5),f(8)

OUTPUT:

Girilen sayı tektir.
Girilen sayı çiftir.

Lambda Fonksiyonu

Python’da fonksiyon tanımlamanın bir diğer yolu lambda fonksiyonunu kullanmaktır. def ile tanımlanan fonksiyondan farkı ise adsız olarak tek bir satır ile oluşturulabilen fonksiyonlar olmasıdır. Lambda fonksiyonları, birden fazla parametre alabilirken içerisinde yalnızca tek işlem yapabilirler. Bu fonksiyon, fonksiyon parametreleri döndürmek için kullanılabilir. def fonksiyonuna benzer olarak başka fonksiyonlar içerisinde de kullanılması mümkündür. Lambda fonksiyonunun kullanımı aşağıdaki gibidir:

lambda parametre(ler): işlem

Örnek 12

INPUT:

y = lambda x: x+2
print(y(2))

OUTPUT:

       4

Örnek 13

INPUT:

z = lambda a,b: 2*a + 3*b +5
print(z(5,2))


OUTPUT:

       21

Örnek 14

INPUT:


def islem(a,b,c):
     f = lambda x,y,z : 6*x + 7*y + 8*(z**2)
     sonuc = f(a,b,c) + 100
     return sonuc
islem(3,5,7)


OUTPUT:

    545

Bu yazımızda sizlere Python’da fonksiyonların nasıl kullanıldıkların ve fonksiyon çeşitlerinden bahsettik. Python ile ilgili yeni içeriklerimizi okumak için sitemizi takip etmeyi unutmayınız.

PYTNC59YX0N8ZQ3V49
Polimer Matris Malzemeli Tekne Gövdesi Tasarımı ve Hidrodinamik Difraksiyon Analizi #2

Makine Mühendisliği Proje Çalışması Örneği #1


 

#2 – Tasarım, Analiz ve Sonuçların Değerlendirilmesi

 

Tasarım

 

Bu tasarım planlanırken günlük hayatta kullanılan tekneler orijinal boyutları ile ele alınmıştır. Analiz sürecini daha verimli yönetmek ve daha az karmaşık sonuçlar elde etmek için tasarım sadeleştirilmiştir. Analizi kolaylaştırmak için yapılan bu sadeleştirme, planlanan gerçek model ile yaklaşık sonuçlar verecek şekilde malzeme koşulları ve boyutları ayarlanmıştır.

Öncelikle seçilen malzemeye göre gerçekçi bir ağırlık sağlamak için ve modelin tam bir insan veya mal yükü ile kullanıldığı varsayılarak Şekil 2.10’da gösterildiği gibi dolduruldu. Ayrıca tasarımda böyle bir dolgunluğun seçilmesinin bir diğer nedeni de geometrinin iç kafes yapılarının karmaşıklığını analiz programında en aza indirerek ortaya çıkabilecek teknik sorunları önlemektir.

Şekil 2.10: Tekne Modeli 1

İkinci seçenek, gerçekçi bir görünüm sağlamak için 0,4m kalınlığa sahip olmak, ancak analiz etmemekti. 0,4m kalınlık teknenin ucunda Şekil 2.11’de görüldüğü gibi geometrinin karmaşıklığını arttırdığından, 0,4m kalınlık geometrinin karmaşıklığını artırarak meshleme sırasında bazı hatalara neden olarak tasarımın farklı bir şekil almasına neden olur. Bu, üzerinde anlaşılan tekne tasarımının hidrodinamik analizleri açısından istenmeyen bir durumdur.

Model 2 için planlanan ağ oluşturma ve yük dağılımı analiz süreçleri, programda çözüm analizi için gereken karmaşıklığı ve çözüm süresini artırdıkça, daha az karmaşık bir modele ihtiyaç doğmuş ve Model 1’deki hacim yeniden tasarlanmıştır. Diğer taraftan ağırlık kaybı olmaması için kullanılan malzemeler arasından daha uygun bir kompozit malzeme seçilmiştir.

Şekil 2.11: Tekne Modeli 2

Şekil 2.12: Tekne Modeli 3
Şekil 2.13: Nihai Tekne Tasarımının Çizgi Görünümü

Analiz

1 – Statik Yapısal Analiz

Varsayımlar, açıklamalar ve girdiler

Analiz için:

a. Metrik (m,kg,N,s,mV,mA) sistemi olarak alınan birimler.

b. Global Koordinat Sistemi varsayılan koordinat sistemi olarak alınmıştır.

Geometri ve Malzemeler

Teknenin toplam kütlesi yaklaşık 42 ton olarak hesaplanmıştır. Bunun nedeni, teknenin boyutları günlük kullanılan tekneler kadar normal olmasına rağmen, malzemenin yüksek yoğunluğudur.

Şekil 3.10: Ansys’de Geometri Parçaları Arayüzü ve Malzeme
Şekil 3.11: Ansys’de Model Geometri Arayüzü
Malzeme:

Malzeme tanımlama sürecinde ilk olarak Karbon Fiber kompozit malzeme kullanılmıştır. Yüksek Karbon Fiber (395 GPa) yoğunluğu ve gerçekçi olmayan sonuçlar vermesi nedeniyle malzeme Epoksi Karbon Dokuma (230 GPa) Prepreg olarak değiştirildi.

Şekil 3.13: Epoksi Karbon Dokuma Malzeme Özellikleri

Şekil 3.12: Karbon Fiber Malzeme Özellikleri

Şekil 3.14: Meshleme Ayarlarının Tanımlanması

Şekil 3.15: Meshleme Kalite Tanımlaması

2 – Hidrodinamik Kırınım Analizi

Varsayımlar, açıklamalar ve girdiler

Analiz için:

a. Metrik (m,kg,N,s,mV,mA) sistemi olarak alınan birimler.

B. Global Koordinat Sistemi varsayılan koordinat sistemi olarak alınmıştır.

Bu yöntem, teknenin dinamik güçlerinin görülmesini ve dalga frekansına bağlı olarak değişen hareketlerin ve salınım frekanslarının incelenmesini sağlar.

Öncelikle çevre koşullarının tanımlanması gerektiğinden 1000m derinlikte bir su hacmi oluşturulmuştur.

Standart Yer çekimi de dahildir.

Şekil 4.10: Su Özellikleri

Geometri ve Malzemeler

1.1 Nokta Kütle: Yaklaşık 42 ton olarak malzeme özelliklerinden dolayı kütleyi karşılayacak şekilde tanımlanmıştır.

1.2 Bölme Yüzeyi: Teknenin su altı kısmının uzunluğunun geometrik kütle merkezi olarak hesaplanması sonucunda, üstten 1.2041 metre (z ekseni) uzunluğundaki teknenin geometrik hacmi ikiye bölünmüştür. Şekil 4.10’da gösterilmiştir.

Şekil 4.11: Ek Kütle Uygulaması

Şekil 4.12: 1000m Uzunluğunda Su Derinliği

Teknenin su üzerindeki gücünü incelemek için belirli frekans, büyüklük ve yönlerdeki dalgalar belirlendi.

Şekil 4.13: Difraksiyon (Kırınım) Ağacının Şematik Görünümü

Dalga yönleri teknenin etrafında -180° ile 180° arasında ayarlandı. Dalga frekans dağılımları geometriye göre hesaplanmıştır. Analizler 0.40m dalga boyunda yapılmıştır.

Tablo 1.10: Dalga Yönleri
Tablo 1.11: Dalga Frekans Dağılımları
Şekil 4.14: Tüm Çevre Koşulları Eklenmiş Görünüm

Meshleme

0,2 ila 0,4 metre arasında değişen ağ ayarlandı. Burada, statik ağ oluşturmadan farklı olarak, yüz boyutlandırma yerine varsayılan ayarlar kullanılır.

Şekil 4.15: Mesh Parametreleri
Şekil 4.16: 0,4m Kalınlığında Mesh Görünüm
Şekil 4.17: İnce Plakalı Mesh Görünüm

Çözüm Süreci ve Sonuçları

Çözüm sonuçları incelendiğinde, tekne geometrisinin izin verdiği farklı frekans değerleri altında yapılan basınç ve hareket hesapları sonuçlanmıştır.

Şekil 4.18: Dalga Uygulama Yönleri
OrtalamaUygulanmaya
Müsait Dalga
Frekansları (Hz)
Maksimum Basınç
(Pa) (x10-3)
Minimum Basınç
(Pa) (x10-3)
1.0,01593,2-3,2
2.0,134545,1-45,1
3.0,2532239,7-239,7
4.0,3718448,0-448,1
5.0,4904351,7-351,7
6.0,60911193,8-1193,8
7.0,72771055,4-1055,4
8.0,84631398,4-1398,4
Ortalama0,4311591,9-591,9
Ortalama frekansa göre399,8-399,8
Tablo 2.10: Dalga – Basınç İlişkileri
Şekil 5.10: Dalganın en düşük frekans büyüklüğünde en yüksek zirvesindeki 1. durum
Şekil 5.11: Dalganın en düşük frekans büyüklüğünde en düşük zirvesindeki 2. durum
Şekil 5.12: Dalganın ortalama frekans büyüklüğünün en yüksek zirvesindeki 1. durum
Şekil 5.13: Dalganın ortalama frekans büyüklüğünün en düşük zirvesindeki 2. Durum
Şekil 5.14: Batan Teknenin En Yüksek Dalga Frekansında Alt ve Üst Görünümleri

-180 ile 180 derece arasında değişen dalga uygulama çözümüne son hali verilerek elde edilen veriler ve görseller yorumlanmak üzere not edilmiştir. Ancak, tekneye mukavemet ve ortalama değer olarak farklı büyüklükte 8 dalga frekansının uygulanabileceği belirlenmiş ve bu değere en yakın değerler Tablo 1.10’da görüldüğü gibi en iyi sonucun alınabilmesi için vurgulanmıştır.

Verilerin Değerlendirilmesi

Tekne analiz sonuçları incelendiğinde:

1. Şekil 5.12 ve Şekil 5.13’te gösterildiği gibi, 8 farklı dalga frekansı arasından alınan ortalama değere en yakın 2 frekans değeri (0.3718 Hz ve 0.49043 Hz) ile yapılan analizde dayanım sonuçları elde edilmiştir. teknenin geometrisi ve seçilen malzemenin akma dayanımı (230 GPa) göz önüne alındığında da uygulanabilir bir tasarım olduğu tespit edilmiştir.

2. Teknenin uygulanabilir en düşük dalga frekansı (0.01592 Hz) ile yapılan analizlerde, Şekil 5.10 ve Şekil 5.11’de ve Tablo 1.10’da görüldüğü gibi mukavemet büyüklükleri elde edilmiştir. Bu değerler teknenin sağlamlığına göre görülmüştür.

3. Teknenin geçerli ortalama frekans değerlerinden daha büyük frekans değerleri için Şekil 5.14’te görüldüğü gibi teknenin batmasına neden olacak şiddette dalgalanmalar olduğu tespit edilmiştir.

Sonuç

Tekne için kullanılan Epoksi Karbon Dokuma (230 GPa) Prepreg malzeme, belirtilen koşullarda yapılan analizler sonucunda mukavemeti yüksek bir malzeme olarak nitelendirilebilir ve ışıkta tekne için uygun bir malzeme olduğu söylenebilir. Bu analizden ve literatür araştırması sonucunda elde edilen veriler. Ayrıca tekne geometrisi yüksek frekanslı su dalgaları için uygun görülmemektedir.

Teknik Çizim (Özet)

Proje raporu burada bitmektedir. Bu proje çalışması; mühendislik öğrencilerine proje çalışmaları için teknik rapor yazımında rehber olması, tasarım ve analiz aşamalarında izlenebilecek adımların gösterilmesi açısından ışık tutması ve söz konusu programların kullanımının örneklendirilmesi amacıyla sunulmakla beraber tüm hakları saklıdır.

Projenin bir önceki yazısına gitmek için buraya tıklayın.

ANZ313726W7387H4C4
Polimer Matris Malzemeli Tekne Gövdesi Tasarımı ve Hidrodinamik Difraksiyon Analizi #1

Makine Mühendisliği Proje Çalışması Örneği #1


#1 – Giriş ve Teorik Arkaplan

Gelişen teknoloji ile birlikte birçok kuruluş tekne üretiminde yeni tasarım ve üretim standartları geliştirmekte ve malzeme seçimi bu standartlara uygun olarak yapılmaktadır. Öte yandan uzun süreli kullanım, güvenli sürüş ve birçok doğa koşuluna dayanıklı olacak üretim malzemelerinin uzun süreli kullanımı için arayışlar devam etmektedir.

Kompozit malzemeler son yüzyıla damgasını vuran en önemli malzemelerden biridir. Otomotiv sektöründe karoser, motor aksamları, iç aksamlar, fren diskleri, tamponlar ve lastikler gibi birçok yerde kullanılan kompozitler; İnşaat sektöründe esnek ve kolay tasarım özelliği, yüksek yalıtım kapasitesi, nakliye ve montajdaki avantajları sayesinde soğuk hava deposu, paneller, yapı kalıpları, cephe korumaları gibi çok çeşitli alanlarda tercih edilmektedir. Diğer yandan tekne üretiminde oldukça tercih edilen kompozit malzemelerin mukavemet analizleri farklı programlar ve çözüm yöntemleri ile yapılmaktadır.

Bu çalışmada, polimer matrisli kompozit malzemelerden Ansys programı malzeme kitaplığında tanımlanan Epoksi Karbon Dokuma (230 GPa) Prepreg ile tasarlanan tekne gövdesinin statik ve ardından hidrodinamik analizi yapılacak ve malzeme ve tasarım değerlendirilecektir.

Deneysel Prosedür

Bu proje için 2 aşamalı bir deneysel prosedür öngörülmüştür ve bu deneysel bölüm tasarım ve analiz aşamalarından oluşmaktadır. İlk aşama olan tekne tasarımında kullanılacak çizim standartları araştırılmış ve buna göre kullanılacak tasarıma karar verilmiştir. Analiz aşamasını daha verimli hale getirmek için daha basit bir tasarıma olan ihtiyaç dikkate alınarak yaklaşık 15 metre uzunluğunda, 5,4 metre genişliğinde ve 2,35 metre derinliğinde bir tasarım yapılmıştır. Teknenin gövde kalınlığı 0,4 metre olarak ayarlanmıştır.

Tekne için dolu ve boş olmak üzere iki varyasyon tasarlanmış ve analizler sırasında teknik koşullardan kaynaklanabilecek problemler dikkate alınarak boş tekne tasarımına devam edilmiştir.

Analiz aşamasında, Ansys programı ile Statik Yapısal ve Hidrodinamik Kırınım modülleri kullanılmış ve ağ ile tasarımın düğüm, eleman, kütle, ağ kalitesi, gövde kalınlığı ve seçilen uygun malzeme gibi parametreler Statik. Yapısal modül. Hidrodinamik Kırınım modülü ile tekne kararlı durumda yüzdürüldü ve belirli koşullar altında dinamik analiz yapıldı.

Kompozit Malzemeler

Kompozitler, kendi özelliklerini koruyan bir arayüz ile birbirine bağlanan farklı fazlar veya malzemelerin bir kombinasyonudur. Kompozitin fiziksel ve mekanik özelliklerini belirlemek için farklı elemanlar bir araya gelir.

Şekil 1.10: Kompozit Malzeme Yapısı

Kompozitteki birincil faz matristir; Sürekli ve esnektir, dağıtma (takviye) fazını tutar ve uygulanan yükün dağıtılmasını sağlar. Dağınık faz genellikle matristen daha güçlüdür, matris içinde sürekli veya rastgele düzenlemelerde bulunabilir.

Polimer Matrisli Kompozitler

Polimer matrisli kompozitler, matris olarak bir polimer reçine ve takviye ortamı olarak lifler ve/veya diğer takviye malzemeleri içeren kompozitlerdir. Takviye fazı ve matris arasındaki etkileşim, güçlü kimyasal bağlardan zayıf sürtünme kuvvetlerine kadar farklı biçimler alabilir. Ara yüzey olarak tanımlanan bu tür etkileşimler, donatıların uygun malzemelerle kaplanmasıyla kontrol altında tutulur.

Polimer matrisli kompozitler kompozit uygulamalarında en çok kullanılan kompozit türüdür; fabrikasyon işlemleri kolaydır. Yüksek çekme mukavemeti, sertliği, kırılma tokluğu ve aşınmaya, delinmeye ve korozyona karşı dayanıklıdır. PMC’lerin önemli dezavantajları, düşük termal direnç ve yüksek termal genleşmedir. Yüksek performanslı fiber takviyeli polimer matrisli kompozitler, hafiflikleri, korozyon direnci, yorulma direnci ve kolay montajı nedeniyle çok çeşitli branşlarda tercih edilen malzemelerdir. Uzay aracı ve uçak yapıları, elektronik ambalaj malzemeleri, tıbbi ekipman, ev aletleri gibi kullanım alanları arasında çeşitli ön ekler verilebilir.

En önemli polimerik kompozitler doğada bulunur; bunlar ‘doğal kompozitler’ olarak tanımlanır; örneğin ahşap, lignin matrisinde selüloz lifleri bulunan doğal bir bileşiktir.

Tasarım

Günümüzde gelişen bazı tasarım kriterleri göz önünde bulundurularak tekne tasarımları yapılmaktadır. Ayrıca kompozit malzemelerin tasarım için yaygın olarak kullanıldığı gözlemlenmiştir.

Şekil 1.11: Tekne Gövde Şekli Örnekleri
Şekil 1.12: Tekne Örnekleri

Analiz

Tasarlanan bir tekne imal edilmeden önce bazı test ve analizlerden geçmelidir. Bu bağlamda statik ve dinamik özelliklerin incelenmesi, dayanım hesaplarının yapılması tasarım için nihai üretim kararı vermeden önce yapılması gereken işlemler arasındadır. Teknenin kendi ağırlığı ile su üzerindeki davranışı ve ilave ağırlık uygulandığında yapısal davranışının nasıl değişeceği de araştırma konularından bazılarıdır.

Kullanılan Yazılımlar ve Analiz Yöntemleri
Bilgisayar Destekli Tasarım

Tasarımın çeşitli aşamalarında çizimlerden yararlanılır. Tasarımı anlatan ve imalat ile tasarım arasındaki iletişimi sağlayan çizimler. Klasik çizim mantığı, çizim tahtası ve cetvel gibi çizim cihazlarının kullanılması ve teknik resim ilkelerine bağlı kalınması ile anlatılmaktadır. CAD mantığı, klasik mantığın dezavantajlarını ortadan kaldırmak için geliştirilmiştir. CAD çizim mantığında klasik çizim araçlarının yerini bilgisayar donanımı ve bir nesneyi iki veya üç boyutlu olarak gösterecek programlara bırakmıştır. CAD için kullanılan diğer bir terim olan CADD (bilgisayar destekli tasarım ve çizim), tasarım ve çizimi birlikte ifade eder. Klasik mantık ve CAD mantığının ortak özelliği, çizim için vazgeçilmez bir kural olan teknik çizim prensipleridir.

SolidWorks

SolidWorks, katı modeller oluşturan bir bilgisayar destekli tasarım (CAD) ve bilgisayar destekli mühendislik (CAE) programıdır. Solidworks, DSS Solidworks olarak da bilinir. DSS, bu programı geliştiren bir şirket olan Dassault Systeme’nin kısaltmasıdır. Bu CAD yazılımı, herhangi bir karmaşıklık olmadan hızlı bir şekilde 2D veya 3D katı modeller oluşturmanıza olanak tanır. Diğer CAD programlarına göre en büyük avantajı çok kullanışlı bir arayüze sahip olmasıdır.

Şekil 1.13: SolidWorks Arayüzü ve Örnek 3B Model
SEA ve Kullanılan Analiz Sistemleri
Sonlu Elemanlar Analizi

Sonlu Eleman Analizi (SEA), Sonlu Elemanlar Yöntemi (SEM) adı verilen sayısal bir teknik kullanan herhangi bir fiziksel olgunun simülasyonudur. Mühendisler bu yöntemi, fiziksel prototiplerin ve deneylerin sayısını azaltmak ve daha iyi ürünler geliştirmek için tasarım aşamasında bileşenleri optimize etmek için kullanırlar. Yapı veya akışkan davranışı, termal konveksiyon, dalga yayılımı, biyolojik hücrelerin

Şekil 1.14: Örnek Ansys: Workbench Analizi

büyümesi vb. gibi herhangi bir fiziksel fenomeni kapsamlı bir şekilde anlamak ve ölçmek için matematiği kullanmak gerekir. Bu işlemlerin çoğu Kısmi Diferansiyel Denklemler (KDD’ler) kullanılarak açıklanmıştır. Ancak bir bilgisayarın bu denklemleri çözebilmesi için son birkaç on yılda sayısal teknikler geliştirilmiştir ve bunlardan öne çıkanlardan biri Sonlu Elemanlar Analizidir. Diferansiyel denklemler sadece doğal süreçleri değil, aynı zamanda mühendislik mekaniğinde karşılaşılan fiziksel olayları da tanımlayabilir. Bu kısmi diferansiyel denklemler, bir yapıdaki ilgili miktarları (gerinim tipi, ısı transferi vb.) hesaplamak ve belirli bir yük altında çalışılan bileşenin belirli bir davranışını tahmin etmek için çözülmesi gereken karmaşık denklemlerdir. SEA’nın probleme sadece yaklaşık bir çözüm verdiğini ve bu kısmi diferansiyel denklemlerin gerçek sonucu elde etmek için sayısal bir yaklaşım olduğunu bilmek önemlidir. Basitleştirilmiş haliyle SEA, bir parçanın veya montajın belirli koşullar altında nasıl davrandığını tahmin etmek için kullanılan sayısal bir yöntemdir. Modern simülasyon yazılımı için bir temel olarak kullanılır ve mühendislerin tasarımlarındaki zayıf noktaları bulmalarına yardımcı olur. SEA yöntemine dayalı bir simülasyonun sonuçları, şekilde gösterildiği gibi genellikle bir renk skalası ile gösterilir.

A. Statik Yapısal (Static Structural)

Statik bir yapısal analiz, önemli atalet ve sönümleme etkilerini indüklemeyen yüklerin neden olduğu yapılarda veya bileşenlerde meydana gelen yer değiştirmeleri, gerilmeleri, gerinimleri ve kuvvetleri belirler. Sabit yükleme ve tepki koşulları varsayılır; yani, yükler ve yapının tepkisinin zamana göre yavaş değiştiği varsayılır. ANSYS, Samcef veya ABAQUS çözücü kullanılarak statik bir yapısal yük gerçekleştirilebilir. Statik bir analizde uygulanabilecek yükleme türleri şunları içerir:

Şekil 1.15: Örnek 2 Ansys: Workbench Analizi

a. Dışarıdan uygulanan kuvvetler ve basınçlar

b. Kararlı durum atalet kuvvetleri (yer çekimi veya dönme hızı gibi)

c. Uygulanan (sıfır olmayan) yer değiştirmeler

d. Sıcaklıklar (termal zorlanma için)

e. Diğer bir deyişle, bu özellikler zaman ve mekana göre değişmeyen daha statik yükleme koşullarında kullanılmaktadır.

Örneğin, bir sandalyeye oturduğunda oluşan tepkiler ve herhangi bir cıvata-somun çiftinin yarattığı gerilmeler, statik yapısal problemlere en iyi örneklerden biri olarak kabul edilebilir.

Şekil 1.16: Örnek 3 Ansys: Workbench Analizi
B. AQWA Hidrodinamik Difraksiyon (Kırınım)

ANSYS AQWA, dalga, rüzgar ve akımın; yenilenebilir enerji sistemleri, FPSO sistemleri, gergi bacak platformları (TLP’ler), gemiler, yarı-dalgıçlar, dalgakıran mimarisi ve direkler gibi yüzer ve sabit açık deniz ve deniz yapıları üzerindeki etkisini incelemek için bir mühendislik araç takımıdır.

AQWA Hidrodinamik Kırınım, karmaşık hareketler ve reaksiyon analizleri için gereken birincil hidrodinamik parametreleri oluşturmak için optimize edilmiş bir ortamdır. Çoklu cisimler için, tüm hidrodinamik reaksiyon etkileri dikkate alınarak üç boyutlu doğrusal radyasyon ve kırınım analizi gerçekleştirilebilir.

Yüzer yapılar için özel olarak oluşturulan modellerde dalgakıran veya yerçekimi esaslı yapılar gibi sabit gövdeler kullanılabilir. İkinci dereceden dalga kuvvetlerini hesaplamak için tam kuadratik transfer fonksiyonu matrislerinin kullanılması, çok çeşitli su derinliklerinde kullanıma izin verir.

Şekil 1.17: Örnek Ansys: Aqwa Zaman Tepki Analizi

Projenin ikinci kısmı olan tasarım, analiz ve sonuçların değerlendirilmesi başlıklı yazıya ulaşmak için buraya tıklayınız.

TSRM5WIUTZ61V3D3XD
Python ile Dosya İşlemleri

Önceki yazılarda yazdığımız Python kodları, program sonlandığı andan itibaren kaybolur. Program yeniden başlatıldığında daha önceden yazdığımız kodlar eğer kaydedilmemiş ise erişilemezdir. Bilgisayarların temel görevi ve bizlerin istediği verilerimizin depolanmasıdır. Bir veriyi kalıcı olarak depolayabilmek için ya sabit disklerde ya da kalıcı belleklerde saklanması gerekir. Verilerimizi disk üzerlerinde saklamanın en iyi yolu, verileri dosya olarak kaydetmektir.

Dosya Oluşturma

Bu bölümde sizlere Python ile dosyaları nasıl oluşturabileceğimizden ve düzenleyebileceğimizden bahsedeceğim. Bunun için bilgisayarımızda bir metin dosyası oluşturabilir ya da bu işlemi kod ile gerçekleştirebiliriz. open() fonksiyonu bilgisayarda oluşturulan bir dosyayı açmak için ya da dosya oluşturmak için kullanılır. open() fonksiyonunun içerisine, eğer bilgisayarınıza yüklü bir Python IDE’si kullanıyorsanız dosyanın bilgisayardaki konumunu yazmanız yeterlidir. Eğer Jupyter gibi tarayıcıda çalışan IDE’ler kullanıyorsanız, dosyayı kullandığınız IDE ortamına yükleyip dosya yolunu open() fonkiyonuna yazmanız yeterlidir. Eğer adını yazdığınız dosya oluşturulmamış ise open() fonksiyonu dosyayı oluşturacaktır. Bu şekilde dosya Python içerisine aktarılmış olacaktır.

INPUT:
open("/content/drive/MyDrive/Colab Notebooks/İstiklal Marşı.txt")

Dosya Okuma

Python’a yüklediğimiz dosyayı bir değişkene atayıp satır satır okumak için readline() komutunu kullanabiliriz.

INPUT:
file = open("/content/drive/MyDrive/Colab Notebooks/İstiklal Marşı.txt")
file.readline().rstrip()

OUTPUT:
  'Korkma, sönmez bu şafaklarda yüzen al sancak;'

Programı her çalıştırdığımızda diğer satırlar ekrana gelmeye devam eder. Eğer herhangi bir satırda, baştan okuma işlemi yapmak istiyorsak seek(0) fonksiyonunu kullanabiliriz. Eğer seek() fonksiyonun içerisine farklı bir değer yazarsak, o değerin karşılık geldiği karakterden sonrasını okuma işlemi yapar. Örnek olarak:

INPUT:
file.seek(2)
file.readline().rstrip()

OUTPUT:
'rkma, sönmez bu şafaklarda yüzen al sancak;'

Dosya Üzerinde For Döngüsü Oluşturma

Dosya üzerinde for döngüsü oluşturup, bütün satırlara erişmek mümkündür.

INPUT:
file.seek(0)
for i in file:
     print(i)


OUTPUT:

Korkma, sönmez bu şafaklarda yüzen al sancak;

Sönmeden yurdumun üstünde tüten en son ocak.

O benim milletimin yıldızıdır, parlayacak;

O benimdir, o benim milletimindir ancak.

Eğer dosya üzerinde yaptığımız işlemler sona erdiyse close() fonksiyonunu kullanıp, dosyayı kapatabiliriz.

INPUT:
file.close()

readlines() fonksiyonunu kullanıp, tüm dosya içeriğini bir listeye dönüştürebiliriz. Örnek olarak:

INPUT:
file = open("/content/drive/MyDrive/Colab Notebooks/İstiklal Marşı.txt")
file_list = file.readlines()
for i in range(0, len(file_list)):
   file_list[i] = file_list[i].rstrip()
file_list  

OUTPUT:

['Korkma, sönmez bu şafaklarda yüzen al sancak;',
 'Sönmeden yurdumun üstünde tüten en son ocak.',
 'O benim milletimin yıldızıdır, parlayacak;',
 'O benimdir, o benim milletimindir ancak.'] 

Örnek

Üyeler adlı bir dosya oluşturalım ve bu dosya içerisine aşağıdaki bilgileri yazalım.

12345-Ali-10-5

6789-Ayşe-20-7

10112-Mustafa-50-15

12134-Gönül-5-8

Kitap satın alma sitesinde üyelerin bilgilerinin bulunduğu bu dosyayı Python’a aktaralım ve listeye dönüştürelim. Ardından Üye bilgilerini sorguladığımız bir program yazalım.

INPUT:
members = open("/content/drive/MyDrive/Colab Notebooks/Üyeler.txt").readlines()
for member in range(len(members)):
    members[member] = members[member].rstrip()
    members[member] = members[member].split("-")
members



OUTPUT:

[['12345', 'Ali', '10', '5'],
 ['6789', 'Ayşe', '20', '7'],
 ['10112', 'Mustafa', '50', '15'],
 ['12134', 'Gönül', '5', '8']]

Böylece dosyadaki üyeleri listeye atıp düzenlemiş olduk. Üye numarası, para ve kitap adedi gibi değerlerin tiplerini for döngüsü ile integer’a dönüştürebiliriz.

INPUT:
for i in members:
  i[0] = int(i[0])
  i[2] = int(i[2])
  i[3] = int(i[3])
members 


OUTPUT:

[[12345, 'Ali', 10, 5],
 [6789, 'Ayşe', 20, 7],
 [10112, 'Mustafa', 50, 15],
 [12134, 'Gönül', 5, 8]]

Şimdi ise gireceğimiz üye numarası ile üyelik bilgilerini sorgulayalım.

INPUT:
MemberNo = input("Lütfen sorgulamak istediğiniz üye numarasını giriniz : ")
if MemberNo.isnumeric():
   for member in members:
       if int(MemberNo) == member[0]:
          print("Üye numarası {0} olan,\nadlı kişinin hesabından {2} Türk lirası bakiye bulunmaktadır.\nŞu zamana kadar {3} adet kitap satın almıştır.".format(member[0],member[1],member[2],member[3]))
          break;
       else:
         print("Üye numarasına ait kişi bulunamadı.")
else:
  print("HATA! SANIRIM YANLIŞ BİR ŞEY OLDU\nÜye numarası sayılardan oluşmalıdır.")


OUTPUT:

Lütfen sorgulamak istediğiniz üye numarasını giriniz : 12345h
HATA! SANIRIM YANLIŞ BİR ŞEY OLDU
Üye numarası sayılardan oluşmalıdır.

Dosya üzerine yazmaya geçmeden evvel şunu hatırlatmakta fayda var; şu ana kadar yaptıklarımız var olan bir dosya üzerinden, yani daha önceden oluşturup veriler girdiğimiz dosya üzerinden gerçekleşmektedir.

Dosya Üzerine Yazma

Dosya oluşturmak ya da var olan bir dosyayı açmak için open() fonkisyonunu kullanıyorduk. open() fonksiyonun içerisine aşağıdaki tabloda yer alan argümanlardan birini girerek dosyanın ne şekilde açılacağına karar verebiliriz.

ArgümanAçıklama
r Salt okuma
w Yazma
aSonuna ekleme
bİkili kip
tSalt metin
+Dosya güncelleme

Eğer var olan bir dosyayı w argümanı ile açarsak, dosyanın içerisindeki tüm içerikler silinir ve boş bir dosya olarak açılmış olur. Açtığımız dosya içerisine write() fonksiyonu ile satır eklemesi yapabilirsiniz. Dosya üzerinde yaptığınız değişiklikleri kaydetmek için flush() fonksiyonu kullanılabilir. Açılan dosya flush() fonksiyonu ile kaydedilmeden kapatılırsa, otomatik kayıt yapılır. Örnek olması için bir dosya oluşturup içerisine bilgiler yazalım.

INPUT:
customers = open("customers.txt","w")
customers_list = [[1245,"Gizem","Borcu yok"],[6789,"Aslı","Borcu Yok"],[6123,"Kerim","Borcu var"]]
for customer in customers_list:
    for i in customer:
        customers.write(str(i)+"-")
    customers.write("\n")    
customers.close()   

customers = open("customers.txt",”r”)
customers.seek(0)
customers_list1 = customers.readlines()
for i in range(0,len(customers_list1)):
   customers_list1[i] = customers_list1[i].rstrip()
customers_list1 


OUTPUT:

['1245-Gizem-Borcu yok-', 
'6789-Aslı-Borcu Yok-', 
'6123-Kerim-Borcu var-']

Örnekler

Aşağıdaki şekilde bir mat.txt dosyası oluşturalım.

   No      Ad-soyad        mat      fizik      kimya

11      Ayşe Gök         60         50         70

12      Ahmet altun   20         40         50

13      Can Emek        80         60         70

14      Nesrin Ay        90          60         20

a) Yukarıdaki şekilde mat.txt dosyası oluşturulması ve verilerin girilmesini sağlayan bir program yazınız.

INPUT:
#Dosyanın Oluşturulması
open("mat.txt", "w")
#Dosyayı yazmak için açıyoruz ve içerisine veri ekliyoruz.
with open("mat.txt", "a")  as  dosya:
    dosya.write("No      Ad-Soyad       Mat     Fizik   Kimya\n")
    dosya.write("11      Ayşe Gök       60       50      70\n")
    dosya.write("12      Ahmet Altun    20       40      50\n")
    dosya.write("13      Can Emek       80       60      70\n")
    dosya.write("14      Nesrin Ay      90       60      20\n")
dosya.close()  

b) Ekrana sadece Numara ad-soyad ve kimya notunu listeleyen bir program yazınız.

INPUT:
with open("mat.txt")  as  dosya:
  dosya.seek(0) 
  liste = dosya.readlines()
  for x in range(0,5):
      a = liste[x:x+1]  
      print(a[0][0:2],"\t",a[0][8:20],"\t",a[0][39:44])

OUTPUT:

No 	 Ad-Soyad     	 Kimya
11 	 Ayşe Gök     	  70

12 	 Ahmet Altun  	  50

13 	 Can Emek     	  70

14 	 Nesrin Ay    	  20

c) Ekrana her üç dersten 50 nin altında alanları listeleyınız.



INPUT:
with open("mat.txt")  as  dosya:
  dosya.seek(0) 
  liste = dosya.readlines()
  Fizikten_Kalanlar = []
  Matematikten_Kalanlar = []
  Kimyadan_Kalanlar = []
  for x in range(1,5):
      a = liste[x:x+1]
      Mat_Not = int(a[0][23:26]) 
      Kimya_Not = int(a[0][39:44])
      Fizik_Not = int(a[0][30:35])
      if Mat_Not < 50: 
         Matematikten_Kalanlar.append("{} kişisi Matematikten {} alarak bu dersten kalmıştır.".format(a[0][8:20],a[0][23:26].rstrip()))
      if Kimya_Not < 50: 
         Kimyadan_Kalanlar.append("{} kişisi Kimyadan {} alarak bu dersten kalmıştır.".format(a[0][8:20],a[0][39:44].rstrip()))
      if Fizik_Not < 50: 
         Fizikten_Kalanlar.append("{} kişisi Fizikten {} alarak bu dersten kalmıştır.".format(a[0][8:20],a[0][30:35].rstrip()))
  print("Matematikten kalanlar : ",Matematikten_Kalanlar)
  print("Fizikten kalanlar : ",Fizikten_Kalanlar)
  print("Kimyadan_Kalanlar : ",Kimyadan_Kalanlar)


OUTPUT:

Matematikten kalanlar :  ['Ahmet Altun  kişisi Matematikten 20 alarak bu dersten kalmıştır.']
Fizikten kalanlar :  ['Ahmet Altun  kişisi Fizikten   40 alarak bu dersten kalmıştır.']
Kimyadan_Kalanlar :  ['Nesrin Ay    kişisi Kimyadan  20 alarak bu dersten kalmıştır.']

PYTNFEXVD4K26M2510
Matlab’de İki Boyutlu Grafik Çizimi

Bu yazıda sizlere Matlab’de iki boyutlu grafiklerin çizimlerinden bahsedeceğim.

Yaptığımız işlemlerin sonuçlarını hem görebilmek hem de analiz etmek için verileri görselleştirmemiz gerekebilir. Bu gibi durumlarda, Matlab yardımıyla verilerimizi görselleştirebiliriz. Grafik çizimi için ilk olarak plot() komutundan bahsedelim. plot() komutunu kullanabilmek için ilk önce x vektörünü Matlab’de tanımlamış olmamız gerekir. Ardından bu x vektörünün her bir değeri için y değerleri hesaplanmalıdır. Bu işlemlerin ardından x ve y vektörünü plot(x,y) yazarak verileri görselleştirebiliriz. Bu komut yerine iki noktayı doğru olarak birleştiren line() komutunu da kullanabiliriz. Bu komutları kullanarak grafik çizerken grafiğe ait doğrunun özelliklerini belirleyebiliriz. Bu özelliklere kısaca değinelim.

color: Çizginin rengini değiştirmek için kullanılır.

linestyle: Çizginin stilini belirlemek için kullanılan özelliktir.

linewidth: Çizgi kalınlığını belirleyen özelliktir.

Bu özelliklere ek olarak marker adı verilen ve çizginin şeklini belirleyen özellik vardır. Bu özellikler sayesinde grafiğimizi oluşturan çizgiyi aşağıdaki tabloda verilen işaretlerden oluşturabiliriz.

İşaretAçıklama
+Çizgi + işaretinden oluşur.
oÇizgi daire işaretinden oluşur.
*Çizgi yıldız işaretinden oluşur.
.Çizgi nokta işaretinden oluşur.
xÇizgi çarpı işaretinden oluşur.
sÇizgi kare işaretinden oluşur.
dÇizgi elmas işaretinden oluşur.
^Çizgi yukarı gösteren üçgen işaretinden oluşur.
vÇizgi aşağı gösteren üçgen işaretinden oluşur.
>Çizgi sağa doğru üçgen işaretinden oluşur.
<Çizgi sola doğru üçgen işaretinden oluşur.
pÇizgi pentagon yıldız işaretinden oluşur.
hÇizgi hexagon yıldız işaretinden oluşur.
noneİşaretsiz.

Şimdi plot() komutunu ve yukarıdaki özelliklerden bazılarını kullanarak grafik çizdirelim. Örnek olarak 1’den 100’e kadar 0.5 artımla y = x2 + 2x +1 grafiğini çizdirelim.

INPUT:
>>x = 1:0.5:100;
>>y = x.^2 +2.*x + 1;
>>plot(x,y)

OUTPUT:
 Oluşan grafiği matlab üzeriden görebilirsiniz. 

Kodları bu şekilde yazarsak grafiğimiz standart biçimde gözükecektir. Eğer grafiğin özelliklerini değiştirmek istiyorsak, yukarıdaki özellikleri plot() komutunun içerisine yazmamız gerekir. Bu sefer örnek olarak x değerleri 0 ile 10 arasında 1 artımla y = x3 + 5x2 + 6x + 1 fonksiyonu ile verilsin. Grafiğin çizgisinin şekli elmas, kalınlığı 2 ve rengi yeşil olsun. Bu grafiği matlab’de aşağıdaki gibi çizebiliriz.

INPUT:
>>x = 0:1:10;
>>y =2.*x.^3 + 5.*x.^2 + 6.*x + 1;
>>plot(x,y,'dg','linewidth',2)

OUTPUT:
  Oluşan grafiği matlab üzeriden görebilirsiniz.

Bunların haricinde x değerlerine karşılık birden fazla fonksiyon varsa bu fonksiyonları tek bir eksende çizdirebiliriz. Örnek olarak 0<x<10 aralığında x değerleri 0.5 artım ile y1 = 2cosx + 2x ve y2 = sinx +x2 fonksiyonlarının grafiklerini aynı eksende çizdirelim.

INPUT:
>>x = 0 : 0.5 : 10;
>>y1 = 2.*(cos(x)) + 2.*x;
>>y2 = (sin(x)) + x.^2;
>>plot(x,y1,"g+",x,y2,"b*")

OUTPUT:
  Oluşan grafiği matlab üzeriden görebilirsiniz.

Fonksiyonların grafiklerini çizerken x veya y değerlerinden herhangi birinin aralığı çok geniş ise bu değerleri logaritmik artış ile tanımlayabiliriz. Eğer hem x hem de y’nin aralığı geniş ise loglog() komutunu, sadece x’in aralığı çok geniş ise semilogx() komutu, sadece y’nin aralığı x’e göre çok geniş ise semilogy() komutunu kullanarak grafiğimizi çizebiliriz. Bu komutları tek tek örnek ile görelim.

-100<x<100 aralığındaki x değerlerini 0.1 artım ile y = x4 + 3x + 1 fonksiyonunun grafiğini loglog(), semilogx() ve semilogy() komutlarını kullanarak çizdirelim.

INPUT:
>>x = -100:0.1:100; 
>>y = x.^4 + 3.*x + 1;
>>plot(x,y)
>>semilogx(x,y)
>>semilogy(x,y)
>>loglog(x,y)

OUTPUT:
 Oluşan grafiği matlab üzerinden görebilirsiniz. 

Aynı eksen üzerinde iki fonksiyona ait grafikleri üst üste çizdirebilmek için hold fonksiyonunu kullanabiliriz. Böylece iki fonksiyonun grafiklerini karşılaştırabilir ya da analiz edebiliriz. Örnek olarak [0, 4π] aralığında f(x) = tanx ve g(x) = cotx fonksiyonlarının grafiklerini çizdirelim.

INPUT:
>>x = 0: 0.1 : 4*pi; 
>>f = tan(x);
>>g = cot(x);
>>plot(x,f);
>>hold;
>>plot(x,g)

OUTPUT:
Oluşan grafiği matlab üzerinden görebilirsiniz.

Bu şekilde sayısal aralıkları farklı olan iki fonksiyonu aynı eksen üzerinde çizdirdiğimizde bir fonksiyonun değerleri diğer fonksiyonun değerlerinden daha küçük olduğunda tam olarak ayırt edilemeyebilir. Böyle bir durumda plotyy() fonksiyonunu kullanarak fonksiyonların grafiklerini daha ayrıntılı bir şekilde çizdirebiliriz. Örnek olarak [0,6π] aralığında f(x) = 2x2 – 10x + 5 ile g(x) = cos(x/3) fonksiyonlarının grafiklerini aynı eksende çizdirelim.

INPUT:
>>x = 0: 0.1:6*pi;
>>f = 2.*x.^2-10.*x+5; 
>>g = cos(x./3); 
>>plotyy(x,f,x,g)

OUTPUT: 
  Oluşan grafiği matlab üzerinde görebilirsiniz. 

Bu bölümde son olarak polar(t,r) komutundan bahsetmek istiyorum. Bu komut sayesinde kutupsal koordinatları verilen bir fonksiyonun grafiğini çizdirebiliriz. Buradaki t, grafiğe ait noktaya karşılık gelen vektörün Ox ekseniyle yaptığı açıyı, r ise vektörün uzunluğunu ifade eder. Örnek olarak t açısı [0,5π] aralığında iken r = (cos2(t)).sin(t) fonksiyonunun grafiğini çizelim.

INPUT:
>>t = 0: 0.2: 5*pi;
>>r =((cos(t)).^2).*sin(t);
>>polar(t,r)

OUTPUT:
 Oluşan grafiği matlab üzerinden görebilirsiniz.
MTLB2CH9T4Y8H74M05
SQL Server İle Veri Tabanı İşlemleri #2

Bu yazıda sizlere SQL’de ilişkili tablolardan, SUM(), AVG(), MIN(), MAX() gibi Aggregate fonksiyonlarından, sütunların takma ad ile çağrılmasından, Between ve Distinct gibi komutlardan bahsedeceğim.

İlişkili Tablolar

İlişkili tabloları daha iyi anlayabilmek için bir personel tablomuzun olduğunu varsayalım. Bu tabloda personellerimizin adı, soyadı, yaşı, maaşı, departmanı, mesleği ve cinsiyeti gibi bilgiler olsun.

USE PersonelBilgileri
CREATE TABLE PersonelTablosu(
   ID INT IDENTITY(1,1) PRIMARY KEY,
   Ad Varchar(30),
   Soyad Varchar(30),
   Cinsiyet Char(1),
   Yas TINYINT,
   Maas DECIMAL(7,2),
   Departman INT,
   Meslek INT
)

Kod Bloğunu Çalıştırdığımızda Oluşan Personel Tablosu

Eğer bu şirketin çalışan sayısı çok fazla ise (örneğin 1000 ya da daha fazla) bu personellerin departmanları ve meslek bilgileri bellekte fazla yer tutmaya başlar. Bu sebeple her personelin departman ve meslek bilgisini yazmak yerine departman bilgilerini ve meslek bilgilerini tutan iki tablo oluşturabiliriz.

USE PersonelBilgileri
CREATE TABLE Departman(
  ID INT IDENTITY(1,1) PRIMARY KEY,
  DepartmanAdi Varchar(30)
)
CREATE TABLE Meslek(
  ID INT IDENTITY(1,1) PRIMARY KEY,
  MeslekDepartmanı INT,
  MeslekAdi Varchar(30)
)

Kod Bloğunu Çalıştırdığımızda Oluşan Departman Tablosu
Kod Bloğunu Çalıştırdığımızda Oluşan Meslek Tablosu

Böylece personelin departmanının adını ve meslek adını yazmak yerine o departman ve meslek bilgisinin ilgili tablolardaki ID’lerini yazabiliriz. Örneğin personelin mesleği Bilgisayar Mühendisliği ise bu bilgiyi yazmak yerine meslekler tablosundan  Bilgisayar mühendisliğinin ID numarasını yazabiliriz. Bu şekilde yaklaşık olarak 19 karakter fazladan bellekte bellekte yer tutmamış olacağız. Yaptığımız bu işlemle meslekler ve departmanlar tablosu ile personel tablosu ilişkili hale gelmiş olur. 3 tip ilişki türü vardır. Bunlar bire-bir ilişki, bire-çok ilişki ve çoka-çok ilişkidir. Bunları bu yazıda detaylı olarak anlatmayacağım. Bizim kullanacağımız genelde bire-çok ilişki türü olacaktır.

Bu tabloların ilişki içerisinde olduğunu SQL’in anlaması için bu ilişkiyi SQL üzerinde tanımlamamız gerekir. Bunun için Object Explorer penceresindeki Database Diagrams klasörüne sağ tıklayıp New Database Diagram’ı seçmemiz gerekir. Karşımıza gelen pencereden hangi tablolar ilişki içerisinde ise seçilmesi gerekir. Burada önemli bir husus daha vardır. Tablolarımızdaki ID sutununu Birincil Anahtar (Primary Key) olarak tanımlamış olmamız gerekir. Primary Key satırların birbirleri ile karışmaması ve ayırt edilebilmesi için kullanılan benzersiz alanlardır. Genellikle ID alanları için kullanılır. Bir sütunu birincil anahtar olarak tanımlamayı tablo yaratırken komut ile belirleyebileceğimiz gibi sonradan da belirleyebiliriz. Örnek olarak:

CREATE TABLE DenemeTablosu(
      ID INT IDENTITY(1,1) PRİMARY KEY,
       ……
)

verilebilir. Bu örnekte ID alanının birincil anahtar olduğunu ve 1’den başlayıp her bir satır için 1’er 1’er artması gerektiğini söyledik.

Eğer tablo üzerinden düzenleme yapabilme iznimiz var ise tablomuzdaki ID sütununa sağ tıklayıp “set primary key” dersek birincil anahtar olarak belirlemiş oluruz.

Bunun dışında Birincil anahtara çok benzeyen benzersiz anahtar (Unique Key) vardır. Birincil anahtardan farklı boş değer(null) alabiliyor olmasıdır.

Birincil anahtar olmayan ve başka bir tablo ile ilişkilendirilebilen alanlara ise Yabancıl Anahtar denir. Örneğin Personel tablosundaki departman ve meslek sütunları yabancıl anahtardır.

İlişkilendirmek istediğimiz tabloları seçtikten sonra hangi tabloların birincil anahtarları hangi tabloların yabancıl sütunu ile ilişkilendirilecekse, birincil anahtar sürüklenip yabancıl anahtarın üzerine bırakılmalıdır.

Tablolarımız Arasındaki İlişkilerin Kurulması

Böylece artık yabancıl anahtardaki değer birincil anahtarın olduğu tablodaki bir veriyi temsil eder. Örneğin personel tablosundaki Adil Kaşıkçı adlı personelin mesleğine 6 yazıldığından, meslekler tablosunda ID numarası 6 olan meslek bu personelin mesleği olur. Meslekler tablosunda ID numarası 6 olan meslek şef olduğundan Adil Kaşıkçı adlı personelin mesleği şef olmuş olur. SQL bunu anlar.

Meslek Tablosu

Departman Tablosu

Personel Tablosu (Tabloda yer alan kişiler hayalidir.)

Ancak biz listeleme yaparken personel tablosunu listelediğimizde bu personellerin departman ve meslek sütunları hala sayı olarak görünür. Eğer bu sütunların meslek ve departman adları ile görünmesini istersek birleştirmeleri kullanmamız gerekir. Bu konudan sonraki yazılarda bahsedeceğim. Şu ana kadar en az iki tablonun nasıl ilişkilendirileceğini gördük. Eğer ilişkide düzenleme ya da değişiklik yapacaksak Database Diagrams klasörünün altındaki ilişki diagramımıza sağ tıklayıp “modify” dememiz yeterli olacaktır. Açılan diagramda istediğiniz düzenlemeyi yapabilirsiniz.

Aggregate Fonksiyonları

Aggregate fonksiyonları bir tabloda kullanılabilecek SUM(), AVG(), COUNT(), MIN() ve MAX() gibi fonksiyonlardır. Bu fonksiyonları kullanarak örneğinm personel tablosunda personel sayısı, ortalama maaş, ortalama yaş ve en genç personel gibi değerler bulunabilir. Aggregate fonksiyonları Select komutu ile birlikte kullanılır. Bu komutlar aşağıdaki gibi özetlenebilir:

SUM()

İstenen sütunlardaki tüm veriyi toplamak için kullanılır. Toplaması yapılan sütunun sayısal değerlerden oluşması gerekir. Örnek kullanımı aşağıdaki gibidir:

SELECT SUM(sütun adı) FROM (tablo adi)

Eğer ihtiyaç duyulursa bu komuta şartta bağlanabilir. Örneğin yaşı 25’ten küçük olanların maaşı nedir? Dersek,

INPUT:
SELECT SUM(Maas) FROM PersonelTablosu WHERE Yas<25

OUTPUT:
5300.00 

sorgusunu kullanılabiliriz.

AVG()

İstenilen sütunlardaki ortalamayı hesaplamak için kullanılan komuttur. Örneğin personel tablosunda ortalama yaşı bulmak istersek,

INPUT:
SELECT AVG(Yas) FROM PersonelTablosu

OUTPUT:
 29

sorgusunu kullanılabiliriz.

COUNT()

İstenen sütunlardaki verileri saymak için kullanılan komuttur. Örneğin personel tablosunda kaç tane veri olduğunu öğrenmek istiyorsak,

INPUT:
SELECT COUNT(*) FROM PersonelTablosu

OUTPUT:
  10

sorgusunu kullanabiliriz. Bir başka örnek olarak personel tablosunda maaşı 3000 TL’den büyük olan personellerin sayısını öğrenmek istersek,

INPUT:
SELECT COUNT(*) FROM PersonelTablosu WHERE Maas>3000

OUTPUT:
  8

sorgusunu kullanabiliriz.

MIN()-MAX()

İlgili sütuna ait en küçük ve en büyük değerleri listelemek için kullanılan komutlardır. Örneğin personel tablosundaki en genç ve en yaşlı personellerin yaşlarını listelemek istersek,

INPUT:
SELECT MIN(Yas) FROM PersonelTablosu

OUTPUT:
  22
INPUT:
SELECT MAX(Yas) FROM PersonelTablosu

OUTPUT:
  36

sorgularını kullanabiliriz.

Bir başka örnek olarak şirketimizde  en az maaş alan kişinin ne kadar maaş aldığını listelemek istersek,

INPUT:
SELECT MIN(Maas) FROM PersonelTablosu

OUTPUT:
  2500.00

sorgusunu kullanabiliriz.

Böylece Aggregate fonksiyonlarından bahsetmiş olduk. Şimdi ise listeleme yaparken listelediğimiz herhangi bir sütunu takma ad ile nasıl listeleyebileceğimizden bahsedelim.

ALIAS İFADESİ

Yukarıdaki örneklerde ortalama yaşı listelemek için bir sorgu komutu kullandık. Bu sorgu çalıştıktan sonra sonuç bize görünür ancak sütun adı “No Column Name” olarak görünür.

Eğer burada listelemek istediğimiz sonuç bir sütun adı ile görünsün istersek Alias ifadesini kullanmamız gerekir. Bu ifade sorguda AS olarak yazılır. Bahsettiğim örneği tekrar yazmak istersek,

INPUT:
SELECT AVG(Yas) AS “Ortalama Yaş” FROM PersonelTablosu

sorgusunu yazabiliriz.

NULL DEĞERLER

SQL’de eğer bir satırın herhangi bir sütununa değer girilmemiş ise o sütun NULL olarak görünür. Listemele yaparken NULL değeri bulunan verileri listelemek mümkündür.

DISTINCT KOMUTU

Bir tablodaki herhangi bir sütunda bulunan benzersiz verileri listelemek için kullanılan komuttur. Örneğin personel tablosunda isimleri benzersiz olanları listeleyelim.

INPUT:
SELECT DISTINCT(Ad) FROM PersonelTablosu

OUTPUT:
  Adil
  Ahmet
  Ayşe
  Betül
  Buse
  Didem
  Ferit
  Gizem
  Mehmet
  Ömer Faruk
BETWEEN OPERATÖRÜ

Bir tablodaki herhangi bir sütun için istediğimiz alt ve üst limitler arasındaki değere sahip verileri listelemek için kullanılan komuttur. Örneğin Personel tablosundaki yaş aralığı 30-35 ve maaş aralığı 2800-4000 TL olan verileri listeleyelim.

INPUT:
SELECT * FROM PersonelTablosu WHERE Yas BETWEEN 30 AND 35 AND Maas BETWEEN 2800 AND 4000

Bunların dışında kısaca aritmetik işlemlerden bahsetmek istiyorum. SQL’de aritmetik işlem yapmak herhangi bir programlama dilinde işlem yapmaya benzerdir. Aritmetik işlemler Select komutu ile kullanılabilir. Yapılmak istenen işleme göre matematiksel operatör kullanılarak aritmetik dört işlem gerçekleştirilir. Birkaç örnek gösterip yazımızı sonlandıralım.

INPUT:
SELECT 4+6 AS "TOPLAM"
SELECT 10*6 AS "ÇARPIM"
SELECT 60/2 AS "BÖLME"
SELECT 30-20 AS "ÇIKARMA"
SELECT (((30-5)+10)/7)*5 AS "DÖRT İŞLEM"

SQL27WU355YJ0IC75Y