Churn Modelleme Uygulaması #1
Kütüphanelerin ve Veri Setinin Yüklenmesi

Bu yazımızda sizinle farklı makine öğrenmesi algoritmalarını kullanarak Churn modelleme uygulamasına başlayacağız. Burada yapacağımız Churn modelleme uygulamasının kapsamı yalnızca makine öğrenme algoritmalarının kullanılması olmayacak.

Buna ek olarak, bu algoritmalar ile kullanacağımız veri seti üzerinde veriden bilgi edinme, veri ön işleme, veri görselleştirme ve farklı algoritmaları birbirleriyle farklı başarı kriterlerine göre kıyaslama gibi işlemleri de gerçekleştireceğiz. Bu kıyaslama işlemi ile birlikte her algoritmanın bu farklı başarı kriterleri ile veri üzerindeki başarısını göreceğiz ve ardından genel bir değerlendirme yapacağız.

Yazımıza başlıkta da kullandığımız Churn’un ne anlam ifade ettiğini açıklamakla başlayalım.

Churn Nedir?

Terminolojik olarak kayıp anlamına gelir. Bu herhangi bir alandaki bir hedef verinin kaybı olarak yorumlanabilir.  Yaygın olarak bu çalışmadaki Churn ise, belli bir dönem içerisinde bir işletmenin ne kadar müşteri kaybettiğini ifade eder. Churn modelleme ile herhangi bir işletmenin müşteri kaybı analizini yapabiliriz. Bu analiz sayesinde işletmeler, kendileri ile artık çalışma yapmayacak müşterileri tahmin edebilirler.

Bu uygulamamızı yaparken kullanacağımız veri setine buradan erişebilirsiniz. Veri setimizi diğer yazılarımızda olduğu gibi Google Colab üzerinden Python kullanarak inceleyeceğiz. Bunun için öncelikle veri setini ilgili siteden indirip Google Drive’a yüklemelisiniz. Google Drive için kullandığınız e-posta adresiniz ile Google Colab’ta oturum açtıktan sonra veri kümesini artık kullanabilir durumda olacaksınız.

Yukarıda gerçekleştirdiğimiz adımlardan sonra artık veri seti üzerinde işlem yapabilir durumdayız. Öncelikle veri seti üzerinden kullanacağımız kütüphaneleri yüklememiz gerekmektedir. Bunun için aşağıdaki kod bloğunu kullanabiliriz:

!pip install researchpy
!pip install keras-tuner

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import warnings
import researchpy as rp
import lightgbm as lgb
warnings.filterwarnings("ignore")
from sklearn.metrics import roc_auc_score, accuracy_score, confusion_matrix,classification_report,roc_auc_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB,MultinomialNB,ComplementNB,BernoulliNB
from sklearn.metrics import roc_curve, auc

roc_auc_score, accuracy_score, confusion_matrix, classification_report ve roc_auc_score’u, algoritmaların başarılarını ölçmek için kullanacağız. Buradan elde ettiğimiz sonuçları birbirleri ile kıyaslayıp hangi algoritmanın hangi metrik ile ne kadar başarılı olduğunu görebiliriz.

Veri setimiz Excel formatında olduğundan Python ortamında yüklemek için pandas kütüphanesinin read_csv metodunu kullanacağız. Verilerimizi yükledikten sonra head metodunu kullanacağız ve böylelikle veri kümemiz içerisinden belirlediğimiz sayı kadar veriyi ekrana göstereceğiz.

data = pd.read_csv("/content/drive/MyDrive/Churn_Modelling.csv")
data.head(10)

Veri kümemiz içerisinde yer alan parametrelerin açıklamaları aşağıda yer alan tablodaki gibidir.

ParametreAçıklaması
CreditScoreMüşterinin kredi skorunu belirtir.
GeographyMüşterinin ülkesini belirtir.
GenderMüşteri cinsiyetini belirtir.
AgeMüşterinin yaşını belirten sütundur.
TenureMüşterinin banka ile çalışma süresini belirten sütundur.
BalanceMüşterinin bakiyesini belirten sütundur.
   NumOfProductsMüşterinin sahip olduğu ürün sayısını belirten sütundur.
HasCrCardMüşterinin Kredi kartı sahibi olup olmadığını belirten sütundur.
IsActiveMemberMüşterinin aktif kullanıcı olup olmadığımı belirten sütundur.
EstimatedSalaryMüşterinin tahmini yıllık maaşını belirten sütundur.
ExitedMüşterinin bankadan ayrılıp ayrılmadığını belirten sütundur.
RowNumberMüşterinin sütun numarasını belirtir.
CustomerIdMüşterinin kullanıcı numarasını belirten sütundur.
SurnameMüşteri soyadını belirten sütundur.

Veri setimizi ve parametreleri incelediğimizde RowNumber, CustomerId ve Surname parametreler önemsiz olduğundan veri setimiz içerisinden silmemiz gerekmektedir. Aynı zamanda kişinin yaşadığı bölge ve cinsiyeti bankaden ayrılıp ayrılmayacağını belirlemediği için bu değerleri nümerik hale dönüştürürken One Hot dönüşümü yapacağız.

Bu işlemlerin ardından yaş grubunu belli aralıklara göre gruplayıp kategorik hale dönüştüreceğiz ve ardından One Hot dönüşümü ile nümerik hale getireceğiz.

Yukarıda belirttiğimiz işlemleri gerçekleştirmeden önce veriden bilgi edinmeye çalışalım.

Veri Setinden Bilgi Edinme

Veri setimizde “Exited” sütunu olduğunu görüyoruz. Bu değer müşterinin bankadan ayrılıp ayrılmadığını belirttiğinden bu sütunun toplamı alırsak bankadan ayrılan toplam müşteri sayısını elde edebiliriz.

INPUT:

data["Exited"].sum()

OUTPUT :


2037

Veri setinde 2037 tane bankadan ayrılmış müşterinin var olduğunu görüyoruz.

INPUT:

data.isna().sum()

OUTPUT:

RowNumber          0
CustomerId         0
Surname            0
CreditScore        0
Geography          0
Gender             0
Age                0
Tenure             0
Balance            0
NumOfProducts      0
HasCrCard          0
IsActiveMember     0
EstimatedSalary    0
Exited             0
dtype: int64

Veri setinde boş değer yer almamaktadır.

INPUT:

data.info()

OUTPUT:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10000 entries, 0 to 9999
Data columns (total 14 columns):
 #   Column           Non-Null Count  Dtype  
---  ------           --------------  -----  
 0   RowNumber        10000 non-null  int64  
 1   CustomerId       10000 non-null  int64  
 2   Surname          10000 non-null  object 
 3   CreditScore      10000 non-null  int64  
 4   Geography        10000 non-null  object 
 5   Gender           10000 non-null  object 
 6   Age              10000 non-null  int64  
 7   Tenure           10000 non-null  int64  
 8   Balance          10000 non-null  float64
 9   NumOfProducts    10000 non-null  int64  
 10  HasCrCard        10000 non-null  int64  
 11  IsActiveMember   10000 non-null  int64  
 12  EstimatedSalary  10000 non-null  float64
 13  Exited           10000 non-null  int64  
dtypes: float64(2), int64(9), object(3)
memory usage: 1.1+ MB

Dönen değerleri incelediğimizde veri setinde boş değer olmadığını bir kez daha görmüş olduk. Aynı zamanda veri setinde yer alan sütunların veri tiplerini de görebiliriz.

INPUT

data["Geography"].unique()

OUTPUT:

array(['France', 'Spain', 'Germany'], dtype=object)

Veri setimizde 3 farklı ülkeden insanlar bulunmaktadır. Bunlar; İspanya, Fransa ve Almanya’dır.

Veri setimizde yer alan kategorik sütunların içerisinde sınıfların dağılım yüzdelerini incelemek için aşağıdaki kod bloğunu kullanabiliriz:

INPUT:

fig, axarr = plt.subplots(2, 3, figsize=(30, 10))
data["Gender"].value_counts().plot.pie(explode = [0.05,0.05], autopct = '%1.1f%%',ax=axarr[0][0]);
data["Geography"].value_counts().plot.pie(explode = [0.05,0.05,0.05], autopct = '%1.1f%%',ax=axarr[0][1]);
data["IsActiveMember"].value_counts().plot.pie(labels = ["Active","Inactive"],explode = [0.05,0.05], autopct = '%1.1f%%',ax=axarr[0][2]);
data["NumOfProducts"].value_counts().plot.pie(explode = [0.05,0.05,0.05,0.06], autopct = '%1.1f%%',ax=axarr[1][0]);
data["HasCrCard"].value_counts().plot.pie(labels = ["Yes","No"],explode = [0.05,0.05], autopct = '%1.1f%%',ax=axarr[1][1]);
data["Exited"].value_counts().plot.pie(labels = ["Not Exited","Exited"],explode = [0.05,0.05], autopct = '%1.1f%%',ax=axarr[1]

Yukarıda yer alan pasta grafiklerini incelediğimizde:

  • Veri setinde yer alan insanların çoğunluğunun erkek olduğunu,
  • Müşterilerimizin çoğu Fransız müşteriler olduğunu; aynı zamanda Fransız müşterilerin varlığının, Alman ve İspanyol müşterilerin varlığının neredeyse 2 katı olduğunu,
  • Müşterilerimizin çoğunluğu aktif kullanıcı olmasına rağmen aktif olmayan kullanıcılarımızın yüzdesinin bir hayli yüksek olduğunu,
  • Müşterilerimizin %96,7’sinin en fazla 2 ürüne sahip olduğunu,
  • Müşterilerimizin çoğunluğunun kredi kartına sahip olduğunu,
  • Veri setimizdeki müşterilerin %79,6’sının bankanın müşteri olmaya devam ettiğini görebiliriz.

Veri setimizde kaç sütun ve veri örneği olduğunu öğrenmek istersek aşağıdaki kod bloğunu kullanabiliriz:

INPUT:

data.shape

OUTPUT:

(10000, 14)

Kodu bloğu çalıştırıldığında (10000, 14) sonucunu elde ederiz. Bu 10000 veri örneği, 14 sütun olduğunu gösterir.

Bir sonraki yazımızda veri setimiz üzerinde görselleştirme yaparak verilerimizden bilgi edinmeye devam edeceğiz.

Buraya tıklayarak bir sonraki yazımıza erişebilirsiniz.

MCHNLRNRU95A10517
Python’da Veri Tabanı İşlemleri #2

Bu yazıda bir önceki yazımızda oluşturmuş olduğumuz MusteriTablosu isimli tablo üzerinde Python ile örnek uygulamalar yapacağız. Burada kullanacağım veri tabanı ile ilgili daha fazla bilgi için buraya tıklayarak bir önceki yazıya gidebilirsiniz.

Uygulama 1: Müşteri tablosunda taksit sayısı 6’dan küçük olanları listeleyelim.

INPUT: 

musteriler = sqlite3.connect("musteriler.sqlite")
imlec = musteriler.cursor()
secilenler = imlec.execute("Select * From MusteriTablosu WHERE MusteriTaksitsayisi < 6")
print(secilenler.fetchall())

OUTPUT:

[(127650, 'Ece', 'Gündüz', 28, 'K', 3655, 1760, 4, 440)]

Burada veri tabanına olan erişimimizi kapatmıyorum. Çünkü yazı boyunca aynı bağlantı kodunu tekrar tekrar yazmayalım.

Uygulama 2: Müşteri tablosunda geliri 3000 TL’den fazla ve yaşı 30’dan küçük olan müşterileri listeleyelim.

INPUT:

secilenler1 = imlec.execute("Select * From MusteriTablosu WHERE MusteriGeliri > 3000 AND MusteriYas < 30")
secilenler1.fetchall()

OUTPUT:

[(127650, 'Ece', 'Gündüz', 28, 'K', 3655, 1760, 4, 440),
 (518023, 'Gizem', 'Duyar', 23, 'K', 3500, 2750, 12, 229.17)]

Uygulama 3: Müşteri tablosunda cinsiyeti kadın olanları listeleyelim.

INPUT:

secilenler2 = imlec.execute("Select * From MusteriTablosu WHERE MusteriCinsiyet  = 'K'")
secilenler2.fetchall()

OUTPUT:

[(127650, 'Ece', 'Gündüz', 28, 'K', 3655, 1760, 4, 440),
 (518023, 'Gizem', 'Duyar', 23, 'K', 3500, 2750, 12, 229.17),
 (812503, 'Aslı', 'Çevik', 26, 'K', 3000, 1650, 6, 550),
 (356721, 'Betül', 'Çevreci', 26, 'K', 2800, 1400, 6, 233.34)]

Uygulama 4: Müşteri tablosunda aylık ödemesi 600 TL’den düşük olan müşterilerin borcunu, gelirini, adını ve soyadını listeleyelim.

INPUT:

secilenler3 = imlec.execute("Select MusteriAd, MusteriSoyad, MusteriGeliri, MusteriToplamBorc From MusteriTablosu WHERE MusteriAylikOdeme  < 600")
secilenler3.fetchall()

OUTPUT:

[('Ece', 'Gündüz', 3655, 1760),
 ('Gizem', 'Duyar', 3500, 2750),
 ('Aslı', 'Çevik', 3000, 1650),
 ('Betül', 'Çevreci', 2800, 1400)]

Uygulama 5: Insert komutunu kullanarak aşağıda verilen verileri veri tabanına ekleyelim.

(625173, “Salih”, “Güven”, 30, “E”, 2200.00, 1250.00, 6, 208.34)

(153294, “Melike”, “Özdemir”, 26, “K”, 4350.00, 4250.00, 12, 283.34)

(309852, “Berk”, “İnan”, 56, “E”, 3800.00, 2760.00, 12, 230.00)

Bu verileri liste olarak yazıp, bir önceki yazıda oluşturduğumuz fonksiyon içerisine yazalım.

INPUT:

yeniVeriler = [[625173, "Salih", "Güven", 30, "E", 2200.00, 1250.00, 6, 208.34], [153294, "Melike", "Özdemir", 26, "K", 4350.00, 4250.00, 12, 283.34], [309852, "Berk", "İnan", 56, "E", 3800.00, 2760.00, 12, 230.00]]
VeriGirisi(yeniVeriler)
musteriler.commit()
secilenler4 = imlec.execute("Select * From MusteriTablosu ")
secilenler4.fetchall()

OUTPUT:

[(136752, 'Ahmet', 'Yenidoğan', 36, 'E', 4500, 3800, 6, 633.34),
 (127650, 'Ece', 'Gündüz', 28, 'K', 3655, 1760, 4, 440),
 (201638, 'Ali', 'Çelik', 46, 'E', 6500, 8900, 12, 741.67),
 (518023, 'Gizem', 'Duyar', 23, 'K', 3500, 2750, 12, 229.17),
 (812503, 'Aslı', 'Çevik', 26, 'K', 3000, 1650, 6, 550),
 (437612, 'Mehmet', 'Bekçi', 35, 'E', 6500, 4800, 6, 800),
 (356721, 'Betül', 'Çevreci', 26, 'K', 2800, 1400, 6, 233.34),
 (971025, 'Cenk', 'Kahraman', 33, 'E', 4250, 9800, 12, 816.67),
 (625173, 'Salih', 'Güven', 30, 'E', 2200, 1250, 6, 208.34),
 (153294, 'Melike', 'Özdemir', 26, 'K', 4350, 4250, 12, 283.34),
 (309852, 'Berk', 'İnan', 56, 'E', 3800, 2760, 12, 230)]

Uygulama 6: Update komutunu kullanarak Melike Özdemir kişisinin borcunu 12800.00 TL ve taksit sayısını 8 olarak güncelleyelim. Buna bağlı olan sütunları da güncelleyelim.

INPUT:

imlec.execute("UPDATE MusteriTablosu SET MusteriToplamBorc = 12800.00, MusteriTaksitSayisi = 8, MusteriAylikOdeme = 1600.00 WHERE MusteriAd = 'Melike' AND MusteriSoyad = 'Özdemir'")
musteriler.commit()
Secilenler5 = imlec.execute("Select * From MusteriTablosu WHERE MusterID  = 153294")
Secilenler5.fetchall()

OUTPUT:

[(153294, 'Melike', 'Özdemir', 26, 'K', 4350, 12800, 8, 1600)]

Uygulama 7: MusteriID’si 625173 olan Salih Güven kişisini tablodan silelim.

INPUT:

imlec.execute("DELETE FROM MusteriTablosu WHERE MusterID = 625173")
musteriler.commit()
Secilenler6 = imlec.execute("Select * From MusteriTablosu")
Secilenler6.fetchall()

OUTPUT:

[(136752, 'Ahmet', 'Yenidoğan', 36, 'E', 4500, 3800, 6, 633.34),
 (127650, 'Ece', 'Gündüz', 28, 'K', 3655, 1760, 4, 440),
 (201638, 'Ali', 'Çelik', 46, 'E', 6500, 8900, 12, 741.67),
 (518023, 'Gizem', 'Duyar', 23, 'K', 3500, 2750, 12, 229.17),
 (812503, 'Aslı', 'Çevik', 26, 'K', 3000, 1650, 6, 550),
 (437612, 'Mehmet', 'Bekçi', 35, 'E', 6500, 4800, 6, 800),
 (356721, 'Betül', 'Çevreci', 26, 'K', 2800, 1400, 6, 233.34),
 (971025, 'Cenk', 'Kahraman', 33, 'E', 4250, 9800, 12, 816.67),
 (153294, 'Melike', 'Özdemir', 26, 'K', 4350, 12800, 8, 1600),
 (309852, 'Berk', 'İnan', 56, 'E', 3800, 2760, 12, 230)]

Uygulama 8: Müşteri tablosunda isminde A harfi olan kişileri listeleyelim.

INPUT:

Secilenler7 = imlec.execute("Select * From MusteriTablosu WHERE MusteriAd Like '%A%'")
Secilenler7.fetchall()

OUTPUT:

[(136752, 'Ahmet', 'Yenidoğan', 36, 'E', 4500, 3800, 6, 633.34),
 (201638, 'Ali', 'Çelik', 46, 'E', 6500, 8900, 12, 741.67),
 (812503, 'Aslı', 'Çevik', 26, 'K', 3000, 1650, 6, 550)]

Uygulama 9: Müşteri tablosunda soyadı Ç harfi ile başlayan kişileri listeleyelim.

INPUT:

Secilenler8 = imlec.execute("Select * From MusteriTablosu WHERE MusteriSoyad Like 'Ç%'")
Secilenler8.fetchall()

OUTPUT:

[(201638, 'Ali', 'Çelik', 46, 'E', 6500, 8900, 12, 741.67),
 (812503, 'Aslı', 'Çevik', 26, 'K', 3000, 1650, 6, 550),
 (356721, 'Betül', 'Çevreci', 26, 'K', 2800, 1400, 6, 233.34)]

Uygulama 10: Müşteri tablosunda ismi E harfi ile biten kişileri listeleyelim.

INPUT:

e("Select * From MusteriTablosu WHERE MusteriAd Like '%E'")
Secilenler9.fetchall()

OUTPUT:

[(127650, 'Ece', 'Gündüz', 28, 'K', 3655, 1760, 4, 440),
 (153294, 'Melike', 'Özdemir', 26, 'K', 4350, 12800, 8, 1600)]

Uygulama 11: Müşteri tablosunda geliri 3000 TL ya da 4500 TL olan kişilerin ad, soyad, maaş ve yaşını listeleyelim.

INPUT:

Secilenler10 = imlec.execute("Select MusteriAd, MusteriSoyad, MusteriGeliri, MusteriYas From MusteriTablosu WHERE MusteriGeliri IN(3000,4500)")
Secilenler10.fetchall()

OUTPUT:

[('Ahmet', 'Yenidoğan', 4500, 36), ('Aslı', 'Çevik', 3000, 26)]

Uygulama 12: Müşteri Tablosunda adında A harfi olmayan ve geliri 3500 TL, 4000 TL ya da 4800 TL olan kişilerin ad ve soyadlarını listeleyen sorguyu yazalım.

INPUT:

Secilenler11 = imlec.execute("Select MusteriAd, MusteriSoyad From MusteriTablosu WHERE MusteriAd NOT LIKE '%A%' AND MusteriGeliri IN(3500,4000,4800)")
Secilenler11.fetchall()

OUTPUT:

[('Gizem', 'Duyar')]

Uygulama 13: Müşteriler veri tabanına CihazTablosu isminde bir tablo oluşturalım. Bu tablonun içerisinde CihazID, CihazModel, CihazYıl ve CihazAd sütunlarını ekleyelim.

INPUT:

imlec.execute('''CREATE TABLE IF NOT EXISTS CihazTablosu(
                 CihazID INT NOT NULL, 
                 CihazModel Varchar(5), 
                 CihazYıl SMALLINT,
                 CihazAd Varchar(30))''')

Uygulama 14: Yeni oluşturduğumuz CihazTablosu isimli tabloya aşağıdaki verileri ekleyelim.

(“TBT16”, 2016, “Tablet”), (“BGR20”, 2020, “Bilgisayar”), (“TLN18”, 2018, “Telefon”), (“BZD19”, 2019, “Buzdolabı”), (“CMR21”, 2021, “Çamaşır Makinesi”), (“TVN21”, 2021, “Televizyon”)

INPUT:

cihazlar = [[1635,"TBT16", 2016, "Tablet"], [1654,"BGR20", 2020, "Bilgisayar"], [5643,"TLN18", 2018, "Telefon"], [4567,"BZD19", 2019, "Buzdolabı"], [1564,"CMR21", 2021, "Çamaşır Makinesi"], [4569,"TVN21", 2021, "Televizyon"]]
for cihaz in cihazlar:
 imlec.execute("INSERT INTO CihazTablosu VALUES (?,?,?,?)", cihaz)
musteriler.commit()
secilenler12 = imlec.execute("SELECT * FROM CihazTablosu")
secilenler12.fetchall()

OUTPUT:

[(1635, 'TBT16', 2016, 'Tablet'),
 (1654, 'BGR20', 2020, 'Bilgisayar'),
 (5643, 'TLN18', 2018, 'Telefon'),
 (4567, 'BZD19', 2019, 'Buzdolabı'),
 (4569, 'TVN21', 2021, 'Televizyon'),
 (1564, 'CMR21', 2021, 'Çamaşır Makinesi')]

Uygulama 15: Müşteri tablosuna SahipOlunanCihaz isimli ve veri türü INT olan bir sütun ekleyelim.

INPUT:

imlec.execute("ALTER TABLE MusteriTablosu ADD COLUMN SahipOlunanCihaz INT")
musteriler.commit()

Uygulama 16: Müşteri tablosuna yeni eklenen sütuna (1,3,5,6,2,4,3,5,1,6) değerlerini ekleyelim.

INPUT:

CihazNumaralari = [1,3,5,6,2,4,3,5,1,6]
MusteriNumaralari = [136752, 127650, 201638, 518023, 812503, 437612, 356721, 971025, 153294, 309852]
a = 0
for musteri in MusteriNumaralari:
 imlec.execute("UPDATE MusteriTablosu SET SahipOlunanCihaz = {} WHERE MusterID = {}" .format(CihazNumaralari[a], musteri))
 a += 1
musteriler.commit()
secilenler13 = imlec.execute("SELECT * FROM MusteriTablosu")
secilenler13.fetchall()

OUTPUT:

[(136752, 'Ahmet', 'Yenidoğan', 36, 'E', 4500, 3800, 6, 633.34, 1),
 (127650, 'Ece', 'Gündüz', 28, 'K', 3655, 1760, 4, 440, 3),
 (201638, 'Ali', 'Çelik', 46, 'E', 6500, 8900, 12, 741.67, 5),
 (518023, 'Gizem', 'Duyar', 23, 'K', 3500, 2750, 12, 229.17, 6),
 (812503, 'Aslı', 'Çevik', 26, 'K', 3000, 1650, 6, 550, 2),
 (437612, 'Mehmet', 'Bekçi', 35, 'E', 6500, 4800, 6, 800, 4),
 (356721, 'Betül', 'Çevreci', 26, 'K', 2800, 1400, 6, 233.34, 3),
 (971025, 'Cenk', 'Kahraman', 33, 'E', 4250, 9800, 12, 816.67, 5),
 (153294, 'Melike', 'Özdemir', 26, 'K', 4350, 12800, 8, 1600, 1),
 (309852, 'Berk', 'İnan', 56, 'E', 3800, 2760, 12, 230, 6)]

Bir sonraki yazımızda Python’dan bahsetmeye devam edeceğiz.

PYTN5JL10AJU0X299N
Java’da Döngüler

Bu yazıda sizlere JAVA’da yinelenen işlemlerin gerçekleştirildiği döngülerin neler olduğundan ve nasıl kullanıldığından bahsedeceğim. Genel olarak yazı içerisinde For ve while döngülerini inceleyeceğiz.

JAVA’da kod yazarken kodlarımızın içerisinde yinelenen işlemler olabilir. Örneğin 1’den 10’a kadar olan sayıları ekrana yazdırmak istediğimizi düşünelim. Bu durumda döngü kullanmadan 10 kez system.out.println() fonksiyonunu kullanmamız gerekir. Örnek olarak:

INPUT:

public class Main {
    public static void main(String[] args) {
        System.out.println(1);
        System.out.println(2);
        System.out.println(3);
        System.out.println(4);
        System.out.println(5);
        System.out.println(6);
        System.out.println(7);
        System.out.println(8);
        System.out.println(9);
        System.out.println(10);
    }
}

OUTPUT:

1
2
3
4
5
6
7
8
9
10

Ancak bu işlemi manuel olarak gerçekleştirmek bizim için ideal değildir çünkü kodlarımızı yazarken aynı işlemleri içeren kod satırlarını elle tekrar tekrar yazmamız gerekir. Bu hem zamandan kaybetmemize hem de yazdığımız kodun daha karışık ve uzun hale gelmesine yol açacaktır. Dolayısıyla, hem kodlarımızı daha az çaba harcayarak yazmalıyız hem de daha az kod satırı ile daha çok işlem gerçekleştirebiliyor olmalıyız. Bu sebeple yinelenen işlemlerde döngüleri kullanırız. Döngülerin amacı, aynı veya benzer kodu birkaç kez tekrarlamaktır. Bu tekrarlama belirli bir sayı kadar ya da bir koşul sağlanana kadar sürebilir. JAVA’da iki çeşit döngü mevcuttur. Bunlar for döngüsü ve while döngüsüdür.

İlk olarak while döngüsünden bahsedelim.

WHILE Döngüsü

While döngüsü, döngüde yazdığımız şart doğru olduğu sürece kod bloğu içerisindeki işlemleri gerçekleştirmeye devam eden döngü tipidir. While döngüsü aşağıdaki gibi yazılır:

public class Main {
    public static void main(String[] args) {
        while (kosul) {
            //Yazılan koşulun değeri true ise çalıştıralacak kod bloğu
        }

    }
}

While döngüsünün kullanımına ilişkin örnekler aşağıdaki gibidir:

INPUT:

public class Main {
    public static void main(String[] args) {
        int i = 0;
        while (i < 5) {
            System.out.println("i değeri : " + i);
            i += 1;
         }

    }
}

OUTPUT:

i değeri : 0
i değeri : 1
i değeri : 2
i değeri : 3
i değeri : 4
INPUT:

public class Main {
    public static void main(String[] args) {
        boolean deger = true;
        int sonuc = 0;
        while (deger == true) {
            sonuc += 3;
            if(sonuc > 40) {
                System.out.println("Limit Değere Aşıldı! Son Değer : " + sonuc);
                deger = false;
            }
            }
         }

    }

OUTPUT: 

Limit Değere Aşıldı! Son Değer : 42

While döngüsünde, koşul doğru ise kod bloğu çalışır.  Eğer döngüde yazılan şartın doğru ya da yanlış olduğuna bakılmaksızın kod bloğunun en az bir kez çalıştırılmasını istersek dowhile döngüsünü kullanmamız gerekir. Dowhile döngüsünün kullanımı ve mantığı while döngüsüne benzerdir. Ancak farkı, şartın durumuna bakmaksızın kod bloğunu bir kez çalıştırır. Dowhile döngüsü aşağıdaki gibi yazılır:

public class Main {
    public static void main(String[] args) {
        do {
            //çalıştırılmak istenen kod bloğu
        }
        while (kosul);

         }

    }

Dowhile döngünün kullanımına ilişkin örnek aşağıdaki gibidir:

INPUT:

public class Main {
    public static void main(String[] args) {
        int toplam = 0;
        do{
            System.out.println("Toplam : " + toplam);
            toplam += 10;
        }while(toplam < 100);
        }
}

OUTPUT:

Toplam : 0
Toplam : 10
Toplam : 20
Toplam : 30
Toplam : 40
Toplam : 50
Toplam : 60
Toplam : 70
Toplam : 80
Toplam : 90
INPUT:

import java.util.Scanner;

public class Main
{
	public static void main(String[] args) {
     int sayi1, sayi2, i, enBuyuk, enKucuk;
     
     Scanner input = new Scanner(System.in);
     
     System.out.println("Lutfen ilk sayiyi giriniz : ");
     sayi1 = input.nextInt();
     
     System.out.println("Lutfen ikinci sayiyi giriniz : ");
     sayi2 = input.nextInt();     
     
     int k = 2;
     i = 2;
     enBuyuk = 1;
     while(sayi1 >= i){
         
         if((sayi1 % i == 0) && (sayi2 % i == 0)){
                 enBuyuk = i;
         }
         
         i++;
     }
     
     enKucuk = (sayi1 * sayi2) / enBuyuk;
     
     System.out.println("En buyuk ortak bolen : " + enBuyuk);
     System.out.println("En kucuk ortak bolen : " + enKucuk);
	}
}

OUTPUT:

Lutfen ilk sayiyi giriniz : 
60
Lutfen ikinci sayiyi giriniz : 
70
En buyuk ortak bolen : 10
En kucuk ortak bolen : 420
For Döngüsü

For döngüsü, yazılan kod bloğunun istenilen sayı kadar yinelenmesini istediğimiz durumlarda kullanılan döngü tipidir. For döngüsü aşağıdaki gibi yazılabilir:

public class Main {
    public static void main(String[] args) {
        for (baslangıcDegeri; dongununDevamınıSaglayanSart; ArtısAzalısDegeri) {
            //çalıştırılmak istenen kod bloğu
        }

        }
}

For döngüsü yazılırken, döngü içerisindeki ilk alana bir değişken tanımlanır ve başlangıç noktası verilir. Ardından hangi koşul sağlanana kadar döngünün devam etmesi gerektiği yazılır. Son olarak, döngü her sonlandığında, başlangıç noktasından nasıl ilerleme ya da gerileme yapılacağı belirtilir. Bu değerlere göre for döngüsü çalışır ve istenilen işlemleri gerçekleştirir. For döngüsünün kullanımına ait aşağıdaki örnekleri inceleyebiliriz:

INPUT:

public class Main
{
    public static void main(String[] args) {

        boolean sorgu = true;

        for(int i = 2; i <= 100; i++){

            for(int k = 2; k < i; k++){

                if(i %k == 0){
                    sorgu = false;
                }
            }
            if(sorgu == true){
                System.out.print(" " + i);
            }
            sorgu = true;
        }
    }
}

OUTPUT:

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
INPUT:

import java.util.Scanner;

class HelloWorld {
    public static void main(String[] args) {
        int deger, us, sonuc;

        Scanner input = new Scanner(System.in);

        System.out.print("Lutfen bir deger giriniz : ");
        deger = input.nextInt();

        System.out.print("Lutfen bir us degeri giriniz : ");
        us = input.nextInt();

        sonuc = 1;

        for(int i = 0; i < us; i++){

            sonuc *= deger;

        }

        System.out.println("Sonuc : " + sonuc);

    }
}

OUTPUT:

Lutfen bir deger giriniz : 6
Lutfen bir us degeri giriniz : 2
Sonuc : 36

For döngüsü, bir başlangıç noktasından belirtilen koşul altında bir bitiş noktası boyunca belirli bir kod bloğunu tekrar tekrar çalıştırmanın dışında diziler üzerinde de kullanılabilir. Dizi üzerinde yazdığımız for döngüsü, dizinin her bir elemanını dolaşır ve istediğimiz işlemleri dizi elemanları üzerinde gerçekleştirir. Bu tip bir for döngüsünün kullanımı aşağıdaki gibidir:

class HelloWorld {
    public static void main(String[] args) {
        for (VeriTipi degiskenIsmı : diziIsmı) {
            //Çalıştırılması istenen kod bloğu
        }

    }
}

Yukarı yazdığımız for döngüsü tipine ait örnekler aşağıdaki gibidir:

INPUT:

class HelloWorld {
    public static void main(String[] args) {
      String[] dizi = {"Ahmet", "Mehmet", "Ali","Ayşe","Cansu","Gizem"};
      for(String eleman:dizi){
          if (eleman == "Ayşe"){
              System.out.println("Dizide " + eleman + " elemanına erişildi!");
              break;
          }
      }
    }
}

OUTPUT:

Dizide Ayşe elemanına erişildi!

Bu yazımızda son olarak while ve for döngüsünde kullanabileceğimiz break ve continue komutlarını kullanışlarından bahsedeceğiz. Break komutunun switchcase yapısında ne amaçla ve nasıl kullanıldığı görmüştük. Döngülerde de break komutunun kullanılma mantığı aynıdır.

Döngü içerisinde belli bir koşul sağlanmışsa ya da belli bir değere geldiğimizde döngünün sonlanmasını isteyebiliriz. Bu durumda döngü içerisinde break komutunu kullanabiliriz. Break komutu çalıştığı anda, döngünün devam etmesi gerekse bile döngüden çıkış yapılacaktır.

Örneğin, içerisinde 4 adet isim olan {“Ahmet”, “Mehmet”, “Ayşe”, “Fatma”} kümesini düşünelim. Bu küme üzerinde bir döngü yazalım. Öyle ki döngü, dizi içerisinde Ayşe ismine uğradığında döngüden çıkış yapsın. Bu döngüyü aşağıdaki gibi yazabiliriz:

INPUT:

public class Main {
    public static void main(String[] args) {
        String[] isimler = {"Ahmet", "Mehmet", "Ayşe", "Fatma"};
        for (String i : isimler) {
            if (i == "Ayşe"){
                System.out.println("Şu anki değer Ayşe olduğundan döngüden çıkıldı.");
                break;
            }else{
                System.out.println(i);
            }
        }
    }
}

OUTPUT:

Ahmet
Mehmet
Şu anki değer Ayşe olduğundan döngüden çıkıldı.

Yukarıda da görüldüğü gibi döngünün uğraması gereken Fatma ismi varken Ayşe’ye denk geldiğinde döngüden çıkıldı ve Fatma ismine hiç uğramadı.

Bu gibi durumlarda döngüden çıkılması istenirse break komutu kullanılabilir.

Continue komutu ise döngünün içerisinde herhangi değere ya da koşula denk gelindiğinde döngünün o basamağını atlamak için kullanılır. Döngü continue çalıştırdığı anda o an ki döngü basamağını atlar ve işlemleri gerçekleştirmeden sonraki döngü adıma geçiş yapar. Sonraki döngü adımında eğer continue’u içeren bloğa girmezse döngü bloğundaki işlemleri gerçekleştirir.

Örneğin, basit olarak 1’den 10’a kadar ekrana yazı yazdırmayı düşünelim. Ekrana bu sayıları yazdırırken 5 sayısının ekrana yazılmadan atlanmasını ve diğer sayıların ekrana yazılmasının devam etmesini isteyelim. Continue komutunu kullanarak bu isteği aşağıdaki gibi gerçekleştirebiliriz:

INPUT:

public class Main {
    public static void main(String[] args) {
    for(int i = 0; i <= 10; i++){
        if (i == 5){
            continue;
        }
        System.out.println(i);
    }
    }
}

OUTPUT:

0
1
2
3
4
6
7
8
9
10

Yazımızı for ve while döngüleri için birkaç örnek daha yaparak sonlandıralım.

INPUT:

import java.util.Scanner;

class HelloWorld {
    public static void main(String[] args) {
        int deger,toplam, basamak, deger1;

        Scanner input = new Scanner(System.in);
        System.out.print("Sayi Giriniz : ");
        deger = input.nextInt();

        deger1 = deger;
        toplam = 0;

        while (deger1 != 0) {
            basamak = deger1 % 10;
            toplam += basamak;
            deger1 /= 10;
        }

        System.out.println("Basamaklar toplami : " + toplam);
    }
}

OUTPUT:

Sayi Giriniz : 16
Basamaklar toplami : 7
INPUT:

import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int ilkSayi = 0, ikinciSayi = 1, toplam,deger;
        System.out.print("N Sayısını Girin:");
        deger = input.nextInt();
        System.out.print(ilkSayi+" "+ikinciSayi);

        for(int i = 2 ; i < deger + 1; ++i){
            toplam = ilkSayi + ikinciSayi;
            System.out.print(" "+toplam);
            ilkSayi = ikinciSayi;
            ikinciSayi = toplam;

        }
        System.out.println();
    }

}

OUTPUT:

N Sayısını Girin:8
0 1 1 2 3 5 8 13 21
INPUT:

import java.util.Scanner;

public class Main
{
    public static void main(String[] args) {


        Scanner input = new Scanner(System.in);

        System.out.print("Lutfen kac sayi girilecek? : ");
        int n = input.nextInt();

        System.out.print("Lutfen deger giriniz : ");
        int ilkDeger = input.nextInt();

        int enKucuk = ilkDeger;
        int enBuyuk = ilkDeger;
        for(int i = 0; i < n-1; i++){

            System.out.print("Lutfen deger giriniz : ");
            int deger = input.nextInt();

            if(deger > enBuyuk){
                enBuyuk = deger;
            }
            if(deger < enKucuk){
                enKucuk = deger;
            }
        }
        System.out.println("En buyuk deger : " + enBuyuk);
        System.out.println("En kucuk deger : " + enKucuk);
    }
}

OUTPUT:

Lutfen kac sayi girilecek? : 5
Lutfen deger giriniz : 15
Lutfen deger giriniz : 45
Lutfen deger giriniz : 321
Lutfen deger giriniz : 54
Lutfen deger giriniz : 34
En buyuk deger : 321
En kucuk deger : 15
INPUT:

import java.util.Scanner;

class Patika_Java_101 {
    public static void main(String[] args) {
        int nBitis;
        double toplam;

        Scanner input = new Scanner(System.in);

        System.out.print("Lutfen n sayisinin bitis degerini yaziniz : ");
        nBitis = input.nextInt();

        toplam = 0;

        for(double i = 1; i <= nBitis; i++){
            toplam += (1/i);
        }

        System.out.println("Harmonik Toplam : " + toplam);

    }
}

OUTPUT:

Lutfen n sayisinin bitis degerini yaziniz : 6
Harmonik Toplam : 2.4499999999999997

JAVA’da dizilerden bahsettiğimiz bir sonraki yazımıza buradan ulaşabilirsiniz.

JAVA9US7B9AB2H5L3R
Java’da If-Else Blokları
If – Else Blokları

Bu yazıda sizlere JAVA’da koşul bloklarını kullanabilmemizi sağlayan ifelse ve switchcase bloklarından bahsedeceğim. ifelse blokları diğer programlama dillerinde olduğu gibi JAVA’da da sık sık kullanılan ve önemli bir yere sahip ifadelerdir. ifelse blokları sayesinde yazdığımız kodlar içerisine koşullara bağlı farklı çıktı veren ya da farklı işlemler gerçekleştiren kod blokları ekleyebiliriz.

ifelse blokları, programcı tarafından mantıksal bir boolean koşulunun doğru ya da yanlış olmasına göre belirtilen eylemleri gerçekleştirmeye yarayan özelliktir. ifelse bloklarının JAVA’daki kullanımları aşağıdaki gibidir:

if (kosul1) {

  //kosul1 koşulunun true olması durumunda çalıştırılacak kod bloku

}else if (kosul2) {

  //kosul1 koşulunun false ve kosul2 kosulunun true olması durumunda çalıştırılacak kodu bloku

}else{

  //kosul1 koşulunun false ve kosul2 kosulunun false olması durumunda çalıştırılacak kodu bloku

}

Eğer ki yazdığımız kodun tek bir koşul altında farklı bir aksiyon göstermesini istiyorsak sadece if bloğunu da kullanabiliriz. Örneğin, verdiğimiz bir sayı karşılığında programın o sayının çift olduğu durumlarda dışarıya “Bu bir çift sayıdır.” yazmasını isteyelim. Diğer durumlarda programın herhangi bir aksiyon göstermemesini isteyelim. Bu durumda aşağıdaki gibi bir kod bloğu isteğimizi gerçekleştirebilir.

INPUT:

public class Main {
    public static void main(String[] args) {
        int A = 4;

        if (A % 2 == 0){
            System.out.println("Girdiğiniz sayı çift sayıdır");
        }

        }
}

OUTPUT:

Girdiğiniz sayı çift sayıdır.

Aynı zamanda aynı if bloğu içerisinde birden fazla koşula bağlı kodlar da yazabiliriz. Bunun için else if bloğunu devreye sokabiliriz. Yukarıdaki örneği çift sayıların dışında tek sayılar girildiğinde de “Bu bir tek sayıdır.” cümlesini ekrana gösterecek şekilde güncelleyelim. Böylece bu örnek için 3 koşul yazmamız gerekecektir. Bunlardan ilki verilen sayının çift olduğu durumdur, ikincisi, sayının tek olduğu durumdur ve sonuncusu ise verilen sayının bu iki koşulu da sağlamayan bir sayı olması durumudur. Örneğin verdiğimiz sayı bir ondalıklı sayı olabilir. Bu durumda bu sayı için 3. koşul devreye girer. Örneği aşağıdaki kod bloğu ile inceleyelim.

INPUT: 

public class Main {
    public static void main(String[] args) {
        double A = -5.2;

        if (A % 2 == 0){
            System.out.println("Girdiğiniz sayı çift sayıdır.");
        } else if (A % 2 == 1 || A % 2 == -1) {
            System.out.println("Girdiğiniz sayı tek sayıdır.");
        }else{
            System.out.println("Girdiğiniz sayı tam sayı değildir!");
        }

    }
}

OUTPUT:

Girdiğiniz sayı tam sayı değildir!

else ifadesi, yazdığımız if ve else if bloklarının hepsinin False olduğu durumda devreye girer ve hiçbir koşulun sağlanmadığı durumlarda alması istenilen aksiyonları gerçekleştirir.

ifelse bloklarında eğer ki ilk if koşulu sağlanırsa, koşul sağlandığında gerçekleştirilecek işlemler gerçekleştirilir ve ifelse bloğundan çıkılır.  if koşulu sağlanmazsa, if bloğundan sonra varsa else if bloğu true ise çalıştırılır ancak false ise ve başka else if bloğu varsa o çalıştırılır. Hiçbir else if bloğu true olmazsa ve else bloğu varsa else bloğu çalıştırılarak program sonlandırılır. Yani ifelse blokları yukarıdan aşağı olacak şekilde ifelse if – else yolu izlenerek çalıştırılır.

if bloğunu çalıştırırken dikkat etmemiz gereken noktalardan biri de if’in yazılış şeklidir. Eğer ki “İf” ya da “İF” şeklinde yazacak olursak if bloğu çalışmaz ve çıktı olarak bize hata döndürür. Kod bloğunda “if” şeklinde yazılmalıdır.

INPUT:

public class Main {
    public static void main(String[] args) {
        int A = 3;
        int B = 5;
        int C = 7;

        if (A > B && A > C && B > C){
            System.out.println("En büyük değer : " + A + " Ortanca değer : " + B + " En küçük değer : " + C);
        } else if (A > B && A > C && C > B) {
            System.out.println("En büyük değer : " + A + " Ortanca değer : " + C + " En küçük değer : " + B);
        } else if (B > A && B > C && C > A) {
            System.out.println("En büyük değer : " + B + " Ortanca değer : " + C + " En küçük değer : " + A);
        } else if (B > A && B > C && A > C) {
            System.out.println("En büyük değer : " + B + " Ortanca değer : " + A + " En küçük değer : " + C);
        } else if (C > B && C > A && A > B) {
            System.out.println("En büyük değer : " + C + " Ortanca değer : " + A + " En küçük değer : " + B);
        }else{
            System.out.println("En büyük değer : " + C + " Ortanca değer : " + B + " En küçük değer : " + A);
        }

    }
}

OUTPUT:

En büyük değer : 7 Ortanca değer : 5 En küçük değer : 3

ifelse bloklarının dışında koşul blokları oluşturmak için switchcase bloklarını da kullanabiliriz.

Switch-Case Blokları

Eğer birden fazla koşul içeren kod blokları yazmak istersek ifelse blokları dışında switchcase kod bloklarını da kullanabiliriz. Bu kod bloklarının çalışma mantığı ifelse’e benzer olup sonucu true olan koşulun bloğu çalıştırıldıktan sonra blok sonlandırılır. Switchcase kullanımı aşağıdaki gibidir:

INPUT:

switch(expression) {

case x:

  //Koşul sağlandığında çalıştırılacak kod bloğu

case y:

  //Koşul sağlandığında çalıştırılacak kod bloğu

}

Switchcase kullanımı daha kolay anlayabilmek için aşağıdaki örneği inceleyebiliriz.

INPUT:

public class Main {
    public static void main(String[] args) {
        int gun = 4;
        switch(gun) {

            case 1:

                System.out.println("Pazartesi");
                break;

            case 2:

                System.out.println("Salı");
                break;

            case 3:

                System.out.println("Çarşamba");
                break;

            case 4:

                System.out.println("Perşembe");
                break;

            case 5:

                System.out.println("Cuma");
                break;

            case 6:

                System.out.println("Cumartesi");
                break;

            case 7:

                System.out.println("Pazar");
                break;
        }

    }
}

OUTPUT:

Perşembe

Birden çok koşulun dahil olduğu switchcase bloklarında bir koşul sağlandıktan ve sağlanan koşulun kod bloğu çalıştırıldıktan sonra, kod bloğundan çıkılmasını istersek break komutunu kullanabiliriz. Bu ifade ile birlikte blok içerisinde daha fazla kod çalıştırılmasının önüne geçebiliriz. Break komutunun kullanımına dair yukarıdaki örneği inceleyebiliriz.

Break komutunu bize kod bloğunun çalıştırılma süresinden kazanç sağlayabilir. Bunun sebebi sadece sonucu true olan koşulun kodunun çalıştırılmasından ve diğer blokların atlanmasından dolayıdır.

Break komutunun dışında switchcase bloklarında hiçbir koşulun sağlanmadığı durumlar için default anahtar kelimesini kullanabiliriz. Bu anahtar kelime, hiçbir koşul sağlanmadığında varsayılan olarak çalıştırılması istenen kod satırlarını içerebilir. default komutu switchcase bloklarının en sonunda kullanılırsa break komutu ile beraber çalıştırılmasına gerek yoktur. default komutunun kullanımına dair örneği aşağıda inceleyebilirsiniz.

INPUT:

public class Main {
    public static void main(String[] args) {
        String sehir = "Sivas";
        switch(sehir) {

            case "İstanbul":

                System.out.println("Marmara Bölgesi");
                break;

            case "İzmir":

                System.out.println("Ege Bölgesi");
                break;

            case "Antalya":

                System.out.println("Akdeniz Bölgesi");
                break;

            case "Samsun":

                System.out.println("Karadeniz Bölgesi");
                break;

            default:

                System.out.println("Girmiş olduğunuz şehir başka bir bölgeye aittir.");
                break;
        }

    }
}

OUTPUT:

Girmiş olduğunuz şehir başka bir bölgeye aittir.

ifelse ve switchcase dışında kısa koşul ifadeleri ile de koşul blokları oluşturmamız mümkündür. Önceki yazılarımızda da bahsettiğimiz bu yöntemin kullanılışı aşağıdaki gibidir:

degisken = (kosul) ? dogruİfade :  Yanlısİfade;

Yukarıda da görüldüğü gibi bu ifade üç işlenenden oluştuğundan üçlü operatör olarak da isimlendirilebilir.

INPUT:

public class Main {
    public static void main(String[] args) {
     //degisken = (kosul) ? dogruİfade :  Yanlısİfade;

        String kelime1 = "Edirne";
        String kelime2 = "Ankara";

        String degisken = (kelime1.length() == kelime2.length()) ? ("İki kelimenin uzunluğu aynıdır.") : ("İki kelimenin uzunluğu aynı değildir.");
        System.out.println(degisken);

    }
}

OUTPUT:

İki kelimenin uzunluğu aynıdır.

Bu yazımızda sizlere JAVA’da kullanabileceğimiz koşul bloklarından bahsettim. Bir sonraki yazımızda JAVA’dan bahsetmeye devam edeceğiz.

JAVAVBZ0921LHO19WO
Java’da Operatörler

Bu yazıda sizlere JAVA’da kullanılan operatörlerden bahsedeceğim. Genel olarak yazı içerisinde mantıksal, aritmetiksel, koşul, atama ve karşılaştırma operatörlerine ve örneklerine değineceğim.

Operatörler

Operatörler, JAVA’da pek çok işlem esnasında kullanabileceğimiz ifadelerdir. Operatörler sayesinde matematiksel işlemler, değişkenlerin sahip olduğu değerleri karşılaştırma işlemi veya mantıksal işlemleri gerçekleştirebiliriz.

JAVA’da operatörleri aşağıdaki gibi ifade edebiliriz:

  • Mantıksal Operatörler
  • Aritmetik Operatörler
  • Karşılaştırma Operatörleri
  • Atama Operatörleri

Yukarıda yer alan operatör grupları içerisindeki operatörleri tablolar halinde ifade edeceğiz. Ardından operatörlerin kullanımlarına ilişkin örnekleri inceleyeceğiz.

Karşılaştırma Operatörleri

Karşılaştırma Operatörleri iki değeri karşılaştırmak için kullanılır. Aşağıdaki tabloda karşılaştırma operatörlerini görebilirsiniz.

OperatörAçıklama
==Eşittir
!=Eşit değil
Büyüktür
Küçüktür
>=Büyük ya da eşit
<=Küçük ya da eşit

Yukarıdaki tabloda yer alan karşılaştırma operatörlerini kullandığımızda çıktı olarak True ya da False ifadelerini görürüz. Bu yaptığımız karşılaştırmanın doğru olduğunu ya da yanlış olduğunu ifade eder. Örnek vermek gerekirse girdi olarak 6 > 7 ifadesini verirsek çıktı olarak False değerini alırız. Bu 6’nın 7’den büyük olmadığını ifade eder.

Tabloda yer alan operatörlerin kullanımlarına ilişkin örnekler aşağıdaki gibidir:

INPUT:

public class Main {
    public static void main(String[] args) {
        int sayi1 = 5;
        int sayi2 = 1;

        System.out.println(sayi1==sayi2);
        System.out.println(sayi1!=sayi2);
        System.out.println(sayi1>sayi2);
        System.out.println(sayi1<sayi2);
        System.out.println(sayi1>=sayi2);
        System.out.println(sayi1<=sayi2);
    }
}

OUTPUT:

false
true
true
false
true
false

Atama Operatörleri

JAVA’da bir değişkene değer atamak için atama operatörlerini kullanılır. Sol tarafta yazılan değişkene sağ tarafta yazılan değer atanır. Başlıca atama operatörleri tablodaki gibidir:

OperatörÖrnekAçıklama
=x = 10x’e 10’u atar.
+=x += 10x’e 10 ekler.
-=x -= 10x’ten 10 çıkarır.
*=x *= 10x’i 10 ile çarpar.
/=x /= 10x’i 10’a böler.
%=x %= 10x’in 10 ile bölümünden kalanı x’e atar.
INPUT:

public class Main {
    public static void main(String[] args) {
        int sayi1 = 10;

        System.out.println(sayi1 += 10);
        System.out.println(sayi1 -= 10);
        System.out.println(sayi1 *= 10);
        System.out.println(sayi1 /= 10);
        System.out.println(sayi1 %= 10);

    }
}

OUTPUT:

20
0
100
1
0

Aritmetiksel Operatörler

Aritmetiksel operatörler, çoğunlukla matematiksel işlemleri gerçekleştirmek için kullanılan operatörlerdir. Bunun dışında string ifadelerin toplanması gibi işlemlerde de aritmetiksel operatör kullanılabilir. Aritmetiksel operatörleri aşağıdaki tabloda görebiliriz.

OperatörİsimKullanımı
+Toplamaa + b
Çıkartmaa – b
*Çarpmaa * b
/Bölmea / b
%Mod Almaa % b
INPUT:

public class Main {
    public static void main(String[] args) {
        int sayi1 = 4;
        int sayi2 = 2;

        System.out.println(sayi1 + sayi2);
        System.out.println(sayi1 - sayi2);
        System.out.println(sayi1 * sayi2);
        System.out.println(sayi1 / sayi2);
        System.out.println(sayi1 % sayi2);
        }
}

OUTPUT:

6
2
8
2
0

Mantıksal Operatörler

Mantıksal operatörler sayesinde birden fazla koşulun dahil olduğu kod blogları yazabiliriz. Bu operatörler kullanıldığında sonuç olarak True ya da False değerleri döner. Döngülerde ya da ifelse bloklarında mantıksal operatörler sıklıkla kullanılır. Aşağıdaki tablo ile mantıksal operatörleri inceleyebiliriz.

OperatörİsmiAnlamıKullanımı
&&Ve operatörüİki ifade doğruysa True döndürür.A > 5 && A < 10
||Veya operatörüİki ifadeden biri doğruysa True döndürür.A > 5 || A < 10
!Değil operatörüMantıksal durumu tersine çevirir. True ise False döndürür.not(A > 5 && A < 10)
INPUT:

public class Main {
    public static void main(String[] args) {
        int A = 4;
        int B = 2;

        System.out.println(A > 5 && B < 10);
        System.out.println(A > 5 || B < 10);
        System.out.println((!(A > 5 && B < 10)));

        }
}

OUTPUT:

false
true
true

Burada bahsettiklerimizin dışında ifelse bloklarını içermeden nasıl koşul ifadesi içeren kodlar yazabileceğimizden bahsedelim.

JAVA’da yazdığımız kodların belli koşullara göre farklı sonuçlar vermesini ya da farklı işlemler gerçekleştirmesini isteyebiliriz. Bu gibi durumlar ifelse bloklarının dışında koşul operatörlerini kullanabiliriz.

Koşul içeren bir ifadeyi aşağıdaki gibi yazabiliriz:

degisken = (kosul) ? (kosul sonunda True yapılması istenen) : (kosul sonunda False yapılması istenen)

Koşul ifadeleri sayesinde kodumuzu belli şartlara ya da verilere göre çalışabilir hale getirebiliriz. İstenen ya da istenmeyen şartlar altında kodlarımız kullanıcıya nasıl tepki vermesi gerektiğini belirleyebiliriz. Bunların dışında koşul ifadeleri ile birlikte daha büyük ve kompleks kod blokları oluşturabiliriz.

INPUT:

public class Main {
    public static void main(String[] args) {
        int A = 4;
        int B = 2;
        String sonuc = (A > 5 && B < 10) ? ("Bu kosul doğrudur"):("Bu kosul yanlıştır.");
        System.out.println(sonuc);


        }
}

OUTPUT:

Bu kosul yanlıştır.

Bir sonraki yazılarımızda Java’da gerçekleştirilen işlemlerden bahsetmeye devam edeceğiz.

JAVA3N3AQ4SI94U18Z
Düğümler, Elemanlar, Serbestlik Derecesi ve Sınır Koşulları

Kısaca hatırlamak gerekirse; kompleks mekanik sistemleri veya yapıları analiz etmek söz konusu olduğunda, mühendisler ve bilim insanları genellikle bu sistemleri basitleştirilmiş bir şekilde temsil eden matematiksel modellere dayanırlar.

Modelleme dünyasında, düğümler, elemanlar ve serbestlik dereceleri doğru ve verimli modeller oluşturmada önemli bir rol oynayan temel kavramlardır.

Düğümler

Düğümler, temel olarak bir model oluşturmak için bir araya getirilen elemanların bağlandığı noktalardır. Başka bir deyişle, sistem veya yapıların farklı bileşenlerinin birbirine bağlandığı fiziksel konumları temsil ederler.

Elemanlar

Elemanlar, farklı geometrik şekillere sahip olabilirler ve farklı tiplerde sınıflandırılabilirler. Bunlar arasında çubuk elemanlar, düzlem elemanlar ve kabuk elemanlar bulunur.

2 boyutlu ve 3 boyutlu değişen sayılarda düğümlere sahip eleman tipleri

Çubuk elemanlar (rods, bars, poles, beams), silindirik veya dikdörtgen prizma gibi basit geometrik şekillere sahiptir ve iki düğüm arasındaki bağlantıyı temsil eder. Genellikle yapılarda çerçeve veya kirişlerin modellenmesinde kullanılırlar. Makine elemanı olarak ise kafes (truss) yapılarda karşımıza çıkar.

Düzlem elemanlar (plates), ince bir düzlem şekline sahiptir ve düzlem gerilmeleri modeller. Bu elemanlar, genellikle levhalar, duvarlar, plakalar veya tabakalar gibi yapı bileşenlerinin modellenmesinde kullanılırlar. Düzlem elemanlarının örnekleri arasında üçgen veya dikdörtgen şeklinde elemanlar yer alabilir. Kabuk elemanlar (shells), üç boyutlu yüzeylere sahip elemanlardır. Kabuk elemanları, çatılar, kubbe veya silolar gibi çeşitli yapı bileşenlerinin modellenmesinde kullanılır. Kabuk elemanlarının örnekleri arasında küresel, silindirik veya konik şekilli elemanlar yer alabilir.

Sonlu elemanlar analizi yapılan bir ağ örgüsü oluşturulmuş materyal üzerinde düğüm ve eleman gösterimi. kaynak

Bu eleman tipleri, modellemede kullanılan farklı geometrik şekillere sahip elemanları ifade etmektedir. Farklı eleman tiplerinin seçimi, yapı bileşenlerinin gerçekçi bir şekilde modellenmesine ve doğru sonuçlar elde edilmesine yardımcı olur.

Serbestlik Derecesi

Serbestlik derecesi (degrees of freedom), bir elemanın hareket edebileceği veya dönebileceği yolları ifade eder. Bunlar dönme (rotation) ve öteleme (translation) hareketi olarak ifade edilebilir. Bir elemanın her bir serbestlik derecesi, bir düğümün konumundaki değişime bağlıdır. Bir elemanın serbestlik derecesi, elemanın bir düğüme bağlanabilecek en fazla sayıda hareket derecesini belirler.

Her elemanın farklı sayıda serbestlik derecesi olabilir. Örneğin, bir çubuk elemanının iki serbestlik derecesi vardır: öteleme ve dönme. Bir düzlem elemanının üç serbestlik derecesi vardır: iki düzlemdeki gerilme ve düzlemler arasındaki kayma. Kabuk elemanlarının ise altı serbestlik derecesi vardır: x, y ve z eksenlerindeki hareket ve x, y ve z eksenlerindeki dönme hareketleri.

Serbestlik dereceleri, yapının davranışının anlaşılması ve modellenmesi için önemlidir. Bu kavramın doğru anlaşılması, yapıların analizinde ve tasarımında önemli bir rol oynar. Farklı disiplinlerde serbestlik dereceleri farklı formlar halinde olabilir. Örneğin katı mekaniğinde bir elemanın serbestlik derecesi yer değiştirme (displacement), dönme (rotation) olarak ifade edilebilirken; ısı transferi veya termal analiz söz konusu olduğunda serbestlik derecesi sıcaklık (temperature) olur.

Çeşitli eleman tipleri için eksenel hareket serbestisi örnekleri


Sınır Koşulları

Sınır koşulları, bir yapı elemanının veya bir makine elemanının hareketinin sınırlandığı yerlerde belirlenen koşullardır. Mekanikte sınır koşulları, bir elemanın yerleştirildiği ve diğer elemanlarla olan etkileşimini tanımlayan önemli bir konudur. Sınır koşulları, elemanların hareketine, deformasyonuna ve gerilimine etki eder ve doğru bir şekilde tanımlanmadığı takdirde yapı elemanlarının davranışı yanlış yorumlanabilir.

Sınır koşulları, üç temel tiptedir: sabitlenmiş sınır koşulları, hareketli sınır koşulları ve yük sınır koşulları.

Sabitlenmiş sınır koşulları

Sabitlenmiş sınır koşulları, bir elemanın hareketinin tamamen sınırlandığı koşullardır. Bu koşul, elemanın yer değiştirmesi veya döndürülmesi gibi herhangi bir hareketini engeller. Bu tip sınır koşulları genellikle yapının temelinde veya sabitlenmiş bir duvarda bulunur.

Hareketli sınır koşulları

Hareketli sınır koşulları, bir elemanın hareketinin kısmen sınırlandığı koşullardır. Bu koşullar, elemanın yer değiştirme veya döndürülmesini belli bir dereceye kadar engeller, ancak elemanın kalan hareketi serbesttir. Bu tip sınır koşulları, bir elemanın bir diğer elemana veya bir yapıya sabitlenmesinde kullanılır.

Yük sınır koşulları

Yük sınır koşulları, bir elemanın üzerine uygulanan yükün etkisini belirler. Bu koşullar, elemanın deformasyonuna ve stresine etki eder. Elemanın deformasyonu, elemanın üzerindeki yükün büyüklüğüne bağlıdır ve yük arttıkça elemanın deformasyonu da artar.

Sınır koşulları, yapı elemanlarının doğru bir şekilde modellenmesi ve analiz edilmesi için kritik öneme sahiptir. Yanlış sınır koşulları, elemanların davranışını yanlış yorumlamaya ve yapı sisteminin yanlış bir şekilde modellenmesine neden olabilir. Bu nedenle, sınır koşulları, yapı elemanlarının doğru bir şekilde analiz edilmesi için doğru bir şekilde belirlenmelidir.

Bu sınır koşulları temel olarak üç şekilde ifade edilebilir: sınır koşulunun tanımlandığı Dirichlet tipi koşullar, bu sınır koşuluna bağlı bir gradyan olarak ifade edilen Neumann tipi koşullar ve bu ikisinin kombinasyonu olan, bağımlı bir değişkenin ve bu değişkenin gradyanını içeren Robin tipi koşullar.

Katı mekaniğinden örnek verecek olursak Dirichlet tipi koşul – yer değiştirme (displacement), Neumann tipi koşul – çekiş ya da gerilme (traction, stress), Robin tipi koşul ise yay (spring) olur.



Sonlu elemanlar analizinde en temel tanımlamalardan biri olan bu terimlerin öğrenilmesi, analizin doğru kavranması için önemlidir.

Sonraki yazılarda sonlu elemanlar analizi üzerine yoğunlaşarak; katı mekaniği, malzeme mekaniği gibi konular üzerinde daha teknik ve detaylı yazılarla devam edeceğiz.


ANZ35TUTCTS4G4822