You are on page 1of 30

Bölüm 4

C# Program Yapısı

1 2
öğrenme çıktıları

Metotlar Matematik Sınıfı


1 Metot oluşturabilme ve program içinde 2 Matematiksel işlemleri programlama dilini
metot çağırabilme karşılıkları ile ilişkilendirebilme

3 4
Collection Sınıfı
3 Listeleme için kullanılacak veri türlerini String Sınıfı
öğrenebilme ve farklarını açıklayabilme 4 String sınıfının özelliklerini kullanabilme

Anahtar Sözcükler: • Metot • Özyinelemeli Metotlar • Metot Aşırı Yükleme • Math • Matematik Sınıfı
• Collection • Dizi Yapıları • String Sınıfı

82
4
İleri Programlama I

GİRİŞ güncellenmesi yeterli olacaktır. Böylece hem za-


Programlama, problemlere çözüm aramadır. mandan tasarruf edilecek hem de olası hatalar en-
Bir programın uzun ömürlü olması da probleme gellenmiş olacaktır.
ve olası sorunlara geniş bir çözüm kümesi sunmak Metotlar, bir kere yazıldıktan sonra kod içeri-
üzere dizayn edilmesinden geçmektedir. Nasıl ki sinde istenilen yerde ve istenildiği kadar çağrılabi-
yemekte lokmalarımızı küçük parçalar hâlinde lir. Yerine getireceği işlemler için parametre alacak
yiyerek sindirim sistemimize gelecek yükü en aza bir yapıda hazırlanabilir. Böylece benzer işi yapan
indiriyorsak, çözülecek problem mümkün olduğu ortak kodlar bir araya getirilerek daha genel amaçlı
kadar küçük parçalara ayrılarak, programın çalış- kod blokları geliştirilebilir.
ması daha verimli hâle getirilip kodun bakımı ve Yaptıkları işlemlere göre bir sonuç döndürebi-
güncellemesi daha rahat yapılabilir. Ayrıca, prog- lirler veya void türde tanımlanarak herhangi bir
ram hazırlarken, mümkün olduğu kadar hazır sı- sonuç döndürmeyen metotlar da hazırlanabilir.
nıfları kullanmamız hem işimizi kolaylaştırarak C# dilinde, metotlar mutlaka bir struct (yapı) veya
hızlandıracak hem de hata yapma riskimizi en aza class (sınıf ) içerisinde tanımlı olmalıdır. Bu yapılar
indirecektir. dışında bir yerde tanımlanamazlar.
Program yazmak karmaşık bir süreçtir. Önemli Programların çalıştırılabilmesi için bir başlan-
olan, bu süreci en basit ve anlaşılır şekilde çöze- gıç noktasına ihtiyaçları vardır. C# dilinde de bu
bilmektir. Bir modül ya da metot çok çeşitli işler başlangıç noktası Main metodudur. Main meto-
yapıyorsa burada bir bölünme gerektiği düşünül- du, programın bütün işlevlerinden sorumlu, onları
melidir. Unutulmamalıdır ki bir iş ne kadar basitse çalıştıran hatta başka sınıflar ile iletişim kuran ana
o kadar az hataya açıktır ve takip edilebilmesi de ol- metoddur. Her programda sadece bir tane ana me-
dukça kolaydır. Nesne yönelimli programlamanın tot işlevi taşıyan Main() metodu olabilir.
da temel amaçlarından biri tüm işlemlerin küçük
parçalara ayrılması, kod tekrarının önlenerek mo-
düllerin her yerde kullanılmasına imkân sağlamak- Metot Tanımlama
tır. Geliştireceğimiz programlarda, kodları küçük C# programlama dilinde, metotların tanımlan-
modüller ve metotlara ayırarak çalışmamızın bizle- dıkları sınıf içerisinde birtakım kurallara uymaları
re kazanç olarak döneceğini unutmayalım. gerekmektedir.
• Metot isimleri de değişken isimleri kuralla-
rına uygun şekilde verilmelidir.
METOTLAR
• Metotların erişim belirleyicisi belirtilmeli-
Belirli görevleri yerine getirmek amacıyla tasar-
dir, aksi hâlde “private” olarak kabul edilir.
lanmış kod bloklarına metot ya da fonksiyon denir.
Metotlar kod içerisinden çağırılır; bu yüzden belirli • Her zaman için bir sınıf yapısı içinde ta-
kurallara uygun yazılmaları gerekmektedir. nımlanmalıdır.
Metotlar, kod içerisinde tekrar eden işlemlerin • Her metodun geri döndürdüğü değerin
her seferinde tekrar yazılmasının önüne geçmesi türü belirtilmelidir. Geri değer döndürmü-
açısından önemlidir. Kodun okunurluğunun art- yorsa da dönüş tipi olarak “void” tanım-
masının yanında, yazılan koda bakan başka bir lanmalıdır. Döndürülecek değer, “return”
programcının da kodu anlamasını kolaylaştıracak- anahtar kelimesi kullanılarak döndürülür.
tır. Ayrıca yapılan işlemde herhangi bir değişiklik • Parametre alan bir metot tanımlandıysa,
olduğunda, kod içerisinde yazılan tüm işlemlerin birden fazla parametresi varsa aralarına vir-
güncellenmesi yerine, sadece hazırlanan metodun gül “,” koyarak ayrılmalıdır.
Metot şablonunu inceleyim:

Erişim Belirleyici | Dönüş Türü | Metot İsmi ( parametre_türü Parametre1,


parametre_türü Parametre2, parametre_türü Parametre3 ...)
{
//Metot Gövdesi
}

83
4
C# Program Yapısı

C# kodlarıyla örnek bir metot tanımlarsak:

public int ucgenAlanHesapla( int taban, int yukseklik )


{
int alan = ( taban * yukseklik ) / 2 ;
return alan ;
}

Sırayla metodumuzdaki elemanları inceleyelim.


• Erişim belirleyicisi “public” (programın her yerinden çağrılabilir) olarak tanımlanmıştır.
• Metodun geri döndürdüğü değer türü “int” olarak tanımlanmıştır.
• Metodun içine bakıldığında “alan” değişkeni int olarak belirtilmiş ve metotta “return” anahtar ke-
limesi ile geri döndürülen değer, dönüş türü ile aynı olduğu görülmüştür.
• Metodun isimlendirilmesinde “camelCase” isimlendirme standardı kullanılmıştır.
• Metodumuz iki tane “int” türünde parametre almış ve aralarına virgül “,” koyularak ayrılmıştır.
• Metodumuz { } arasına yazılarak kod bloğu ayrılmıştır. Bu bloğa metodun gövdesi de diyebiliriz.

Metot Çağırma
Hazırlanan metotlar, Main() metodu içinden ya da başka metotlardan çağrılabilir. Metotları çağırırken
erişim belirleyicileri, varsa aldıkları parametreler ve bunların türlerine uygun bir şekilde çağrılmalı ve belir-
tilmiş ise geri dönüş tiplerine uygun bir şekilde de değişkenlere atama yapılmalıdır.
Bir metot, Main metodu içinden direk çağrılmak isteniyorsa, static bir metod içinden yine bir static
metot çağrılabilir kuralı gereğince metodun static olması gerekmektedir. Bunun yanında, parametre alma-
yan ve bir değer döndürmeyen metotlar da tanımlanabilmektedir.

static void ekranaYaz()


{
Console.WriteLine("Merhaba dünya!");
}

public static void Main(string[] args)


{
ekranaYaz();
}

Bu örneğimizde, static Main metodu içinden yine static ve bir değer döndürmeyen “ekranaYaz” me-
todunu çağırdık.

static void mesaj( string isim )


{
Console.WriteLine( isim + ", aramıza hoşgeldiniz!" );
}

public static void Main(string[] args)


{
Console.WriteLine("Lütfen adınızı giriniz");
string ad = Console.ReadLine();
mesaj(ad);
}

84
4
İleri Programlama I

Bu örnekte, dönüş değeri olmayan ama parametre alan static bir metot çağrısı yapıldı. Dikkat edilirse,
metodun aldığı ve gönderdiğimiz parametreler aynı türden tanımlanmıştır. Programın çıktısı da şu şekilde
olacaktır:

Lütfen adınızı giriniz


Dünyalı
Dünyalı, aramıza hoşgeldiniz!

static double daire_alani( int yaricap )


{
double alan = 3.14 * yaricap * yaricap ;

return alan ;
}

public static void Main(string[] args)


{
Console.WriteLine("Dairenin yarıçapını giriniz:");
int yaricap = Int32.Parse(Console.ReadLine());

double alan = daire_alani( yaricap );

Console.WriteLine( alan );
}

Bu örnekte ise parametre alan ve aynı zamanda “double” türünde değer döndüren bir metodu çağırdık.
Ekran çıktısı ise şu şekilde olacaktır:

Dairenin yarıçapını giriniz:


6
113.04

Özyinelemeli (Recursive) Metotlar


Bu özel metot türü, içine eklenen bir kontrol durumu gerçekleşene kadar kendini çağırarak istenilen işi
yapan fonksiyonlardır. Bu metotlar doğrudan ya da dolaylı olarak kendilerini çağırarak görevlerini yapar-
lar. Yazımı ve kullanımı tıpkı diğer metotlar gibidir.
Matematikten hatırlayacağımız faktöriyel hesaplama metodunun yazımını inceleyelim. Faktöriyel, bir
tam sayının 0’dan büyük değerler ile, her adımda 1 azaltılarak kendisiyle çarpımıdır. Yani 6! = 6*5*4*3*2*1
şeklinde hesaplanır.

static int faktoriyelHesapla(int sayi)


{
if (sayi == 0)
return 1;
else
return sayi * faktoriyelHesapla( sayi - 1 );
}

85
4
C# Program Yapısı

Özyinelemeli fonksiyonları daha iyi kavrayabilmek için faktöriyel hesaplama fonksiyonumuzu adım
adım işleyelim. 6 sayısı için bu metodu çağırdığımızı düşünerek tabloyu dolduralım. fh kısaltması “fakto-
riyelHesapla” metodu için kullanılmıştır. Kodumuzda, özyinelemeli fonksiyonumuz 0 ile çağrılana kadar
kendisini çağırmaya devam edecektir. Ne zaman parametre olarak 0 gelirse, sonuç olarak 1 döndürür. En
son 1 değeri döndüğünde, bu metodu içeriden çağıran değerler, return ile bir önceki metot çağırımını
tamamlayacaklar ve en son sonuç olarak da 720 değeri bulunacaktır.

Tablo 4.1 Özyinelemeli metot örneği incelemesi


Adım Parametre Dönüş Değeri
1 6 fh(6) = 6 * faktoriyelHesapla( 5 ) fh( 6 ) = 6 * fh( 5 )
2 5 fh(5) = 5 * faktoriyelHesapla( 4 ) fh( 5 ) = 5 * fh( 4 )
3 4 fh(4) = 4 * faktoriyelHesapla( 3 ) fh( 4 ) = 4 * fh( 3 )
4 3 fh(3) = 3 * faktoriyelHesapla( 2 ) fh( 3 ) = 3 * fh( 2 )
5 2 fh(2) = 2 * faktoriyelHesapla( 1 ) fh( 2 ) = 2 * fh(1)
6 1 fh(1) = 1 * faktoriyelHesapla( 0 ) fh( 1 ) = 1 * fh(0)
7 0 fh(0) = 1 fh( 0 ) = 1

Tabloya göre biraz hesaplama yapmamız gerekecek. İlk tanımlı değerimiz fh(0)=1 olduğunu görüyo-
ruz. Bu değerden hareketle, ilk adıma kadar fonksiyonlar hesaplanan değerleri döndürerek istenen fh(6)
değerimizi elde etmemizi sağlayacaktır. Sonucun hesaplandığı tabloda ise işlemlerin sonuçları, sondan başa
doğru metodun döndürdüğü değerler yazılarak hesaplanmıştır.

Tablo 4.2 Özyinelemeli metot sonuç hesaplama


Metot Sonuç
fh( 0 ) = 1 1
fh( 1 ) = 1 * fh(0) 1
fh( 2 ) = 2 * fh(1) 2
fh( 3 ) = 3 * fh( 2 ) 3*2=6
fh( 4 ) = 4 * fh( 3 ) 4 * 6 = 24
fh( 5 ) = 5 * fh( 4 ) 5 * 24 = 120
fh( 6 ) = 6 * fh( 5 ) 6 * 120 = 720

Metotların Aşırı Yüklenmesi (Method Overloading)


Sınıfımızın içinde kullanmakta olduğumuz bir metodumuz olsun. Fakat aynı işi farklı bir parametre ile
yapan aynı isimde bir metoda daha ihtiyacımız olduğunu düşünün. İşte tam da bu noktada metotların aşırı
yüklenmesi devreye giriyor. Daha iyi anlaşılması için bir örnek üzerinde inceleyelim:

86
4
İleri Programlama I

public class Uyeler {


protected Personel personelBilgiGetir( int id )
{
return db.where( id ) ;
}
protected Personel personelBilgiGetir( string isim )
{
return db.where( isim ) ;
}
protected Personel personelBilgiGetir( long tckimlikno )
{
return db.where( tckimlikno ) ;
}
}

Örneğimizde aynı sonucu döndüren fakat farklı parametreler alan üç farklı metot görüyoruz. Metotları
aşırı yüklerken dikkat etmemiz gereken iki nokta vardır.
• Metotların dönüş tiplerinin aynı olması
• Metotların farklı tipte parametre alması

Öğrenme Çıktısı
1 Metot oluşturabilme ve program içinde metot çağırabilme

Araştır 1 İlişkilendir Anlat/Paylaş

Bir metodun çok sayıda


Günlük hayatta küçük parça- Hazırlanan programda me-
değeri geri döndürebilme-
lara ayırarak yaptığınız işleri totlar oluşturulurken nelere
si için ne yapılması gerekir
metotlar ile ilişkilendirin. dikkat etmeliyiz?
araştırın.

MATEMATİK SINIFI
C# dilinde, matematiksel işlemlerin daha kolay yapılabilmesi amacıyla, bazı işlemler “System.Math”
sınıfı içinde toplanmıştır. Bir sayının karesini alma, karekökünü bulma, n’inci dereceden kuvvetini alma,
alt ve üste yuvarlama, Sin/Cos.. gibi trigonometrik işlemler, logaritmik işlemler, sayı karşılaştırma gibi
işlemleri desteklemektedir.
Ayrıca sıklıkla kullanılan Pi sayısı ve Euler değeri de bu sınıf içerisinde birer sabit olarak tanımlanmıştır.

public const double PI = 3.14159;


public const double E = 2.71828;

Şeklinde birer sabit olarak tanımlanmışlardır. Kullanımını da bir örnek ile gösterelim.

var cevre = Math.PI * 2 * yaricap ;


var alan = Math.PI * r * r ;

87
4
C# Program Yapısı

Matematik Sınıfının Metotları


Math sınıfında hazırlanmış tüm metotlar static’tir ve bu sınıf mühürlüdür (sealed). Yani Math sınıfın-
dan kalıtım yapılamaz. Math sınıfının bir nesnesi de yaratılamaz. Bu yüzden, Math sınıfındaki metotlar
“Math.Abs()” şeklinde sınıf adı ile birlikte kullanılmalıdır. Math sınıfında çok kullanılan metodları ince-
leyelim.
Math.Abs( sayı ): Mutlak değer hesaplama fonksiyonudur. Parametre olarak herhangi bir sayısal değer
verilebilir. Zaten sadece pozitif değerler alabilen uint, ulong ve ushort türünden sayısal değerleri alamaz.

var sayi = Math.Abs(-123.45);


Console.WriteLine( "Değer: " + sayi );

Kullanımının gösterildiği kod örneğinin ekran çıktısı da şu şekilde olacaktır:

Değer: 123.45

Math.Min( sayı1, sayı2 ), Math.Max( sayı1, sayı2 ): İki sayı arasında karşılaştırma yapmak için kulla-
nılır. Min ile küçük sayı, Max ile de büyük sayı eşitlikteki değişkene atanır. Karşılaştırmak için de herhangi
bir sayısal değer alabilirler.

int x = 7, y = 12 ;
int buyuk = Math.Max( x, y ) ;

// buyuk değişkeninin değeri 12 olacaktır


int kucuk = Math.Min( x, y ) ;

// kucuk değişkeninin değeri 7 olacaktır

Math.Sign( sayı ): Parametre olarak girilen “unsigned” olmayan herhangi bir sayının işaretini bulmak
için kullanılır. Pozitif sayılar için +1, negatif için -1 ve sıfır için 0 olarak bir int değer döndürür.

int bilinmeyenSayi = -24, baskaSayi = 88 ;


int isaret1 = Math.Sign( bilinmeyenSayi ) ;
// isaret1 değişkeninin değeri sayımız negatif olduğu için -1 olacaktır
int isaret2 = Math.Sign( baskaSayi ) ;
// isaret2 değişkeninin değeri sayımız pozitif olduğu için +1 olacaktır

Math.BigMul( sayı1, sayı2 ): Parametre olarak iki tane int türünde sayı almaktadır. Bu iki sayının çar-
pımlarının sonucunu, kendi türlerinden daha fazla veri alabilen “long” türünde döndürmektedir. Çünkü
aynı türdeki değişkenlerin çarpımının sonucu, yüksek olasılıkla kendi türlerinin desteklediği sayı limitle-
rini geçecektir.

int x = 432145600, y = 654123987 ;


long z = Math.BigMul( x, y ) ;
Console.WriteLine( "Çarpım sonucu: " + z );

Kodun çıktısı ise şu şekilde olacaktır:

Çarpım sonucu: 282676802836507200

88
4
İleri Programlama I

Math.DivRem( bölünen, bölen, out kalan ): % operatörü ile kalan hesaplanabilirken bu fonksiyon
ile iki tam sayının bölüm sonucu ve kalanı hesaplanabilmektedir. Dönen sonuç ve parametreleri int veya
long türünde olabilir.

int x = 76, y = 8, kalan ;


int bolum = Math.DivRem( x, y, out kalan ) ;
Console.WriteLine( x + " / " + y + " = " + bolum + " kalan: " + kalan );

İşlemin sonucu da şu şekilde olacaktır:

76 / 8 = 9 kalan: 4

Math.Floor( sayı ): Yuvarlama fonksiyonlarındandır. Sayıyı aşağı doğru yuvarlamak için kullanılır.
Parametre olarak aldığı sayı double, decimal veya bunlara dönüştürülebilir olmalıdır.

double sayi ;
sayi = Math.Floor( 4.7 ) ; // sonuç: 4
sayi = Math.Floor( 7.3) ; // sonuç: 7
sayi = Math.Floor( -9.3 ) ; // sonuç: 10
sayi = Math.Floor( -6.8 ) ; // sonuç: 7

Math.Ceiling( sayı ): Yuvarlama fonksiyonlarındandır. Sayıyı yukarı doğru yuvarlamak için kullanılır.
Parametre olarak aldığı sayı double, decimal veya bunlara dönüştürülebilir olmalıdır.

double sayi ;
sayi = Math.Ceiling( 4.7 ) ; // sonuç: 5
sayi = Math.Ceiling( 7.3) ; // sonuç: 8
sayi = Math.Ceiling( -9.3 ) ; // sonuç: 9
sayi = Math.Ceiling( -6.8 ) ; // sonuç: 6

Math.Round( sayı ): Yuvarlama fonksiyonlarındandır. Sayıyı en yakın tam sayıya çevirmek için kulla-
nılır. Parametre olarak aldığı sayı double, decimal veya bunlara dönüştürülebilir olmalıdır.

double sayi ;
sayi = Math.Round( 4.7 ) ; // sonuç: 5
sayi = Math.Round( 7.3) ; // sonuç: 7
sayi = Math.Round( -9.3 ) ; // sonuç: 9
sayi = Math.Round( -6.8 ) ; // sonuç: 7

Math.Round( sayı , basamak_sayısı ): Yuvarlama fonksiyonlarındandır. Virgülden sonra kaç basama-


ğa yuvarlanacağı belirtilebilir. Parametre olarak aldığı sayı double, decimal veya bunlara dönüştürülebilir
olmalıdır.

double sayi ;
sayi = Math.Round( 4.745, 2 ) ; // sonuç: 4.75
sayi = Math.Round( 7.356, 2 ) ; // sonuç: 7.36
sayi = Math.Round( -9.365, 2 ) ; // sonuç: 9.37
sayi = Math.Round( -6.812, 2 ) ; // sonuç: 6.81

89
4
C# Program Yapısı

Math.Truncate( sayı ): Sayının tam kısmını döndürür, ondalıklı kısmını siler. Parametre olarak aldığı
sayı double, decimal veya float gibi ondalıklı sayılar olabilir.

double sayi = Math.Truncate( 456.34 ) ;


Console.WriteLine( "Sonuç: " + sayi ) ;

Ekrana basılan sonuç da şu şekildedir:

Sonuç: 456

Math.Log10( sayı ): Parametre olarak alınan sayının 10 tabanına göre logaritmasını hesaplamaktadır.
Sayı, double veya double türüne dönüştürülebilir olmalıdır.

x = log10 1000
double x = Math.Log10( 1000 ); // işlem sonucu 3

Math.Log( sayı ): Taban değeri belirtilmediği için, sonuç sayı değerinin “e” tabanındaki logaritması
olacaktır. Sayı, double veya double türüne dönüştürülebilir olmalıdır.

x = loge 1000 ;
double x = Math.Log( 1000 ) ; // işlem sonucu 6.90775527898214

Math.Log( sayı, taban ): Parametre olarak verilen sayıyı, istenilen tabandaki algoritması hesaplanarak
sonuç elde edilir. Sayı ve taban, double veya double türüne dönüştürülebilir olmalıdır.

x = log2 1000 ;
double x = Math.Log( 1000, 2 ) ; // işlem sonucu 9.96578428466209

Math.Pow( sayı, üs ): Parametre olarak verilen sayının belirtilen kuvvetini hesaplamak için kullanılır.
Sayı ve üs, double veya double türüne dönüştürülebilir olmalıdır.

x = 72 y=ab

double x = Math.Pow( 7, 2 ) ; // sonuç 49 olacaktır


double y = Math.Pow( b, 1/a ) ;
double y = Math.Pow( 256, 0.25 ) ; // 4 olacaktır

Math.Sqrt( sayı ): Parametre olarak alınan sayının karekökünü hesaplayan fonksiyondur. Sayı, double
veya double türüne dönüştürülebilir olmalıdır.

x = 121
double x = Math.Sqrt( 121 ) ; // sonuç 11 olacaktır

Math.Exp( üs ): Parametre olarak verilen “üs” değerine göre “e” sayısının kuvvetini hesaplar. Üs, doub-
le veya double türüne dönüştürülebilir olmalıdır.

x = e5
double x = Math.Exp( 5 ) ; // sonuç 148.413159102577

90
4
İleri Programlama I

Math.Sin( açı ), Math.Cos( açı ), Math.Tan( açı ): Parametre olarak verilen “açı” değerinin Sinus,
Cosinus ve Tanjant değerlerini hesaplayan fonksiyondur. Açı, double veya double türüne dönüştürülebilir
ve radyan cinsinden olmalıdır.
Örneğin, 60 derecelik açı, pi cinsinden p * ( 60 / 180 ) şeklinde yazılmalıdır.
sin(60) => x = sin(p/3), cos(60) => x = cos(p/3), tan(60) => x = tan(p/3)

double sinDeger = Math.Sin( Math.PI / 3 ) ; // sonuç 0.866025403784439


double cosDeger = Math.Cos( Math.PI / 3 ) ; // sonuç 0.5
double tanDeger = Math.Tan( Math.PI / 3 ) ; // sonuç 1.73205080756888

Math.Asin( değer ), Math.Acos( değer ), Math.Atan( değer ): Matematikte ters trigonometrik


fonksiyonlar, tanım kümesinde bulunan trigonometrik fonksiyonların ters fonksiyonudur. arcsin, arccos,
arctan sırasıyla sin−1, cos−1, tan−1 olarak gösterilir. Sinus, cosinus ve tanjant değerleri belli olan açıların
hesaplanmasında kullanılır. Hesaplanan açı radyan cinsinden olduğundan, açıya dönüştürmek için 180
ile çarpılması gerekmektedir. Değer, double veya double türüne dönüştürülebilir ve ( -1 ≤ değer ≤ 1)
aralıklarında olmalıdır.
sin−1(0.5), cos−1(0.5), tan−1(0.5) için hesaplamaları yapmak istersek;

double asinDeger = Math.Asin(0.5) * 180 / Math.PI; // sonuç 30


double acosDeger = Math.Acos(0.5) * 180 / Math.PI; // sonuç 60
double atanDeger = Math.Atan(0.5) * 180 / Math.PI;
// sonuç 26.565051177078

Math.Sinh( açı ), Math.Cosh( açı ), Math.Tanh( açı ): Parametre olarak verilen açıların hiperbolik
sinus, cosinus ve tanjant değerlerini hesaplanmasında kullanılır. Hesaplanan açı radyan cinsinden oldu-
ğundan, açıya dönüştürmek için 180 ile çarpılması gerekmektedir. Açı, double veya double türüne dönüş-
türülebilir ve radyan cinsinden olmalıdır.
Örneğin; 60 derecelik açı, pi cinsinden p * ( 60 / 180 ) şeklinde yazılmalıdır.
sinh(60) => x = sinh(p/3), cosh(60) => x = cosh(p/3), tanh(60) => x = tanh(p/3)

double sinDeger = Math.Sinh( Math.PI / 3 ) ; // sonuç 1.24936705052398


double cosDeger = Math.Cosh( Math.PI / 3 ) ; // sonuç 1.60028685770239
double tanDeger = Math.Tanh( Math.PI / 3 ) ; // sonuç 0.780714435359268

Random Sınıfı
C# programlama dilinde program geliştirirken kimi zaman rastgele değerlere ihtiyaç duyabiliriz. Bu
ihtiyaca yönelik Random sınıfı geliştirilmiştir. Random sınıfı, sistem zamanına (tarih-saat) göre rastgele
bir değer oluşturur. Kullanabilmek için bu sınıftan yeni bir nesne oluşturulması gerekmektedir. Bir örnek
ile inceleyelim.

// Random sınıfından rastgele isminde bir nesne oluşturma


Random rastgele = new Random() ;
int sayi = rastgele.Next() ;
// int olarak tanımlanan bu sayıya, rastgele nesnesinden üretilen sayı
// atanmaktadır.
// Üretilen sayı int tipinde ve her zaman değeri 0’a büyük eşittir.

Sınıfın metotlarını birkaç tane örnek ile inceleyelim.

91
4
C# Program Yapısı

Random rastgele = new Random() ;


int sayi1 = rastgele.Next( 9, 26 );
int sayi2 = rastgele.Next( 66 );
int sayi3 = rastgele.Next();
double sayi4 = rastgele.NextDouble();

Rastgele üretilen sayılardan ilki, sayi1 için, 9 ile 26 arasında 9’un dahil olduğu ama 26’nın dahil olma-
dığı int türünde bir sayı üretilir. sayi2 değişkenine ise 0 ile 66 arasında, yine 0’ın dahil olup 66’nın dahil
olmadığı int türünde bir sayı üretilir. Üçüncü örnekte ise int türünden pozitif bir sayı üretilir. Son örnekte
ise double türünde 0.0 ile 1 arasında rastgele bir değer üretilir.

Öğrenme Çıktısı
2 Matematiksel işlemleri programlama dilini karşılıkları ile ilişkilendirebilme

Araştır 2 İlişkilendir Anlat/Paylaş

Karmaşık bir problemi bi- C# programlama dili için


Matematiksel işlem yapar-
limsel hesap makinesi kulla- geliştirilmiş matematik sını-
ken her zaman matematik
narak çözmek ile aynı prob- fı haricinde başka bir branş
sınıfının metotlarını mı
lemi program ile çözmeyi için geliştirilmiş sınıf olup
kullanmalıyız?
karşılaştırın. olmadığını araştırın.

COLLECTION SINIFI
C# programlama dilinde koleksiyonlar, nesneleri gruplamayı sağlayan sınıflardır. Klasik dizi (array)
yapısından çok daha fazla özelliği olan, System.Collections altında tanımlı bir veri türüdür. IEnumerable
arayüzü koleksiyon sınıflarının tümüne uygulanmıştır. Böylece tüm koleksiyon nesneleri foreach döngüsü
ile kullanılabilir.
Koleksiyonlar, nesnelerden oluşmuş, çok sayıda verinin tutulduğu türlerdir. Diziler ile arasındaki fark
ise diziler sabit boyutlara sahip iken, koleksiyon yapılarının boyutları dinamik olarak artmaya ve azalmaya
imkân sunar. Bunun yanında koleksiyondaki elemanları numaralamak, sıralamak, yeni eleman eklemek,
eleman çıkartmak, koleksiyonda eleman aramak gibi özellikleri destekleyen bir yapıdır. Farklı durumlar
için oluşturulmuş çeşitli koleksiyon yapıları mevcuttur. Ayrıca kullanıcıların da kendi koleksiyonlarını
oluşturmalarına izin vermektedir. Koleksiyon türlerin bazılarından kısaca bahsedeceğiz.
• ArrayList: En genel amaçlı kullanılan koleksiyon türüdür. Nesnelerden oluşan dizi yapısıdır. Add()
metodu ile ArrayList’e yeni eleman eklenir. Aynı eleman birden fazla eklenebilir. Elemanları sıralı
değildir. 0’dan başlayan bir sayaç ile elemanlarına ulaşılabilir. RemoveAt( sayaç ) ile istenilen sırada-
ki eleman listeden çıkarılabilir.
ArrayList kullanımını bir örnek ile inceleyelim.

92
4
İleri Programlama I

using System;
using System.Collections;
public class Koleksiyonlar
{
public static ArrayList DiziOlustur( int elemanSayisi )
{
ArrayList al = new ArrayList() ;
for( int i = 0; i < elemanSayisi; i++ )
{
// diziye, parametreden gelen sayı kadar,
// bir formül ile oluşturduğumuz değerleri atıyoruz

al.Add( i * 3 + 5 ) ;
}
return al;
}

public static void DiziYazdir( ArrayList dizi )


{
foreach(object o in dizi)
Console.Write(o.ToString()+" ");
Console.WriteLine();
}

public static void Main()


{
ArrayList liste = new ArrayList();
liste = DiziOlustur( 20 ) ;
DiziYazdir( liste ) ;
}
}

Örnek kodun ekran çıktısı ise şöyle olacaktır:

5 8 11 14 17 20 23 26 29 32 35 38 41 44 47 50 53 56 59 62

• Hashtable: Array ve ArrayList sınıflarından tanımlanmış dizi elemanlarına bir indeks numarası
ile erişebiliriz. Ancak kod yazımında bu her zaman en verimli yöntem olmayabilir. Çünkü hangi
nesnenin hangi sırada listeye eklendiğini bilmemiz gerekir. Hashtable sınıfı da tam bu eksikliği
gidermek üzere tasarlanmıştır. Bu koleksiyon türünde, listeye ekleyeceğimiz her bir eleman için
indeks kullanmak yerine, bir anahtar ve buna karşılık değer ataması yapılmaktadır.

93
4
C# Program Yapısı

using System;
using System.Collections;

public class Koleksiyonlar


{
public static void Main()
{
Hashtable sehirler = new Hashtable();
sehirler.Add("06", "Ankara");
sehirler.Add("26", "Eskişehir");
sehirler.Add("34", "İstanbul");
// ya da
sehirler["16"] = "Bursa" ;
sehirler["35"] = "İzmir" ;
sehirler["20"] = "Denizli" ;

ICollection anahtarlar = sehirler.Keys;


foreach(string s in anahtarlar)
Console.Write( s + " " );
Console.WriteLine( s );
ICollection degerler = sehirler.Values;
foreach(string s in degerler)
Console.Write( s + " " );
Console.WriteLine();
Console.WriteLine("34 plakalı şehir: " + sehirler["34"] ) ;
}
}

Örnek kodda kullanılan bir özellikten daha bahsetmek gerekiyor. ICollection sınıfından türetilen
“anahtarlar” ve “degerler” değişkenlerine Hashtable’daki elemanların anahtar ve bunlara karşılık gelen de-
ğerleri dizi şeklinde bu değişkenlere atanıyor. Programın çıktısı ise şu şekilde görünecektir.

26 20 34 06 16 35
Eskişehir Denizli İstanbul Ankara Bursa İzmir
34 plakalı şehir: İstanbul

• Queue: Sözlük anlamı olarak sıra, kuyruk manası vardır. Programlamada da yine anlamı ve gerçek
hayattaki kullanımı ile ilişkili bir yapıyı göstermektedir. FIFO (First In First Out) yani ilk giren ilk
çıkar yapısını sergilemektedir. Bunu yemekhane kuyruğu gibi düşünebiliriz, kuyruğa ilk giren ilk
çıkacaktır. Queue’nun önünden bir eleman çekmek için Dequeue(), sonuna bir eleman eklemek
için de Enqueue() metodu kullanılmaktadır.

94
4
İleri Programlama I

using System;
using System.Collections;

public class Program


{
public static void Main(string[] args)
{
Queue kuyrukListesi = new Queue() ;

kuyrukListesi.Enqueue( "Fiat" ) ;
kuyrukListesi.Enqueue( "Volkswagen" ) ;
kuyrukListesi.Enqueue( "Peugeot" ) ;
kuyrukListesi.Enqueue( "Ford" ) ;
kuyrukListesi.Enqueue( "Opel" ) ;
kuyrukListesi.Enqueue( "BMW" ) ;
kuyrukListesi.Enqueue( "Mercedes" ) ;

while( kuyrukListesi.Count > 0 )


Console.WriteLine( kuyrukListesi.Dequeue( ) ) ;
}
}

Örnek kodumuzda kuyrukListesi isimli Queue listemize sırayla araba markalarını ekledik. Daha sonra
listemizden sırayla eklediğimiz elemanları çektik. Sonuçta, listeye ilk eklenen değeri, kuyruğun önünden
ilk çekilen değer olarak görmekteyiz.

Fiat
Volkswagen
Peugeot
Ford
Opel
BMW
Mercedes

• Stack: Sözlük anlamı olarak yığın, istif gibi anlamlara gelmektedir. Tıpkı Queue gibi gerçek ha-
yattaki kullanımı programa aktarılmıştır. LIFO (Last In First Out) yani son giren ilk çıkar yapısını
sergilemektedir. Bu yığına yine yemekhane ile ilgili tabldotların ya da tepsilerin üst üste koyul-
maları örnek verilebilir. İlk konulan tepsi, mecburen en son alınacaktır. Son konulan ise ilk önce
alınacaktır. Yığının en üstüne bir eleman eklemek için Push() metodu, üstten bir eleman çekmek
için de Pop() metodu kullanılır. Bir örnek ile inceleyelim.

95
4
C# Program Yapısı

using System;
using System.Collections;

public class Program


{
public static void Main(string[] args)
{
Stack egitim = new Stack() ;

egitim.Push( "Doktora" ) ;
egitim.Push( "Yüksek Lisans" ) ;
egitim.Push( "Lisans" ) ;
egitim.Push( "Önlisans" ) ;
egitim.Push( "Lise" ) ;
egitim.Push( "Ortaokul" ) ;
egitim.Push( "İlkokul" ) ;

while( egitim.Count > 0 )


Console.WriteLine( egitim.Pop( ) ) ;
}
}

Stack değişkenimize sırayla en sondan en başa doğru eğitim seviyelerini ekledik. Daha sonra sırayla ele-
manları çektiğimizde en son ekleneni ilk olarak karşımızda gördük. Programın çalıştırılmasında şu şekilde
bir sonuç elde ettik.

İlkokul
Ortaokul
Lise
Önlisans
Lisans
Yüksek Lisans
Doktora

• Dictionary: Hashtable sınıfının özelleşmiş bir versiyonudur. Dictionary nesnesinin elemanlarının


türleri şablon olarak verilmektedir. Elemanlar anahtar ve değer şeklinde eklenmektedir. Kullanımı
şu şekildedir:

96
4
İleri Programlama I

using System;
using System.Collections.Generic;

public class Program


{
public static void Main(string[] args)
{
var sinifOgretmenleri = new Dictionary<int,string>();
sinifOgretmenleri.Add( 1, "Kamil Yurt" ) ;
sinifOgretmenleri.Add( 2, "Handan Zeytin" ) ;
sinifOgretmenleri.Add( 3, "Seda Yalçın" ) ;
sinifOgretmenleri.Add( 4, "Dilek Aslan" ) ;
sinifOgretmenleri.Add( 5, "Selami Genç" ) ;
foreach (KeyValuePair<int,string> ogretmen in sinifOgretmenleri)
{
Console.WriteLine( "Sınıf =>" + ogretmen.Key + "\t" + "Ad Soyad => " +
ogretmen.Value );
}
}
}

Örneğimizde, anahtarı int türünde ve değeri string türünde bir dictionary nesnesi oluşturduk. Sırasıyla
indeksimize string değerleri atadık. En son olarak da atadığımız değerleri anahtar değerleri ile birlikte yaz-
dırdık. Programın çalışması sonucu da şu şekilde olacaktır:

Sınıf =>1 Ad Soyad => Kamil Yurt


Sınıf =>2 Ad Soyad => Handan Zeytin
Sınıf =>3 Ad Soyad => Seda Yalçın
Sınıf =>4 Ad Soyad => Dilek Aslan
Sınıf =>5 Ad Soyad => Selami Genç

Öğrenme Çıktısı
3 Listeleme için kullanılacak veri türlerini öğrenebilme ve farklarını açıklayabilme

Araştır 3 İlişkilendir Anlat/Paylaş

Queue (Kuyruk) yapısı için Hash table ile bir yabancı Liste yapılarında <T> gene-
program yazarken kullanıla- dil için kullanılan sözlük rics kullanılmasının fayda-
bilecek bir durumu açıklayın. yapılarını ilişkilendirin. larını anlatın.

97
4
C# Program Yapısı

STRING SINIFI
System.String sınıfını temsil etmektedir. String, günlük hayattaki metinleri, bilgisayar ortamında ise
art arda gelen karakter dizilerini simgeler. String veri türü her ne kadar değer tipi kabul edilse de referans
tipinde bir veri türüdür.

string <değişken_adı> = <değer> ;

şeklinde kullanılır. String sınıfının çeşitli metotları vardır, bunlardan en sık kullanılanları kısaca inceleyelim.
• Length: Metnin uzunluğunu yani kaç karakterden oluştuğu bilgisini vermektedir. int türünde de-
ğer döndürür.

int uzunluk = degisken_ismi.Length;

şeklinde kullanılır.

string yazi = "C# Öğreniyorum!";


int uzunluk = yazi.Length;
Console.WriteLine( uzunluk ); // karakter sayısı 15 olarak hesaplanır.

• ToLower: String türünde tanımlanmış değişkendeki metnin tümünü küçük harfe çevirir.

string kucuk_metin = degisken_ismi.ToLower();

• ToUpper: String türünde tanımlanmış değişkendeki metnin tümünü büyük harfe çevirir.

string buyuk_metin = degisken_ismi.ToUpper();

• Compare: Metin karşılaştırma işlemi yapmak için kullanılır. String ifadeleri karakter karakter kar-
şılaştırarak sonucu int bir değer olarak döndürür.
- -1 sonucu, ilk metnin karşılaştırılan karakteri, ikinci metinden küçüktür (metin1 < metin2)
- 0 sonucu, iki metin de tamamen eşittir (metin1 = metin2)
- 1 sonucu, ilk metnin karşılaştırılan karakteri, ikinci metinden büyüktür (metin1 > metin2)

int sonuc = String.Compare( metin1, metin2 ) ;


int sonuc = String.Compare( metin1, metin2, büyük-küçük harf duyarlılık (true/
false) );

Büyük-küçük harf duyarlılığı “true” olduğu zaman, büyük-küçük harfe duyarsız olacaktır. ADANA ve
Adana eşit kabul edilecektir.
Tam tersi “false” olduğu zaman da büyük-küçük harfe duyarlı olduğu kabul edilecektir. ADANA ve
Adana eşit değil kabul edilecektir.
• Concat: Bu metot, string ifadeleri birleştirmek için kullanılır. Verilen metinleri art arda ekler ve
yine string türünden bir değer döndürmektedir.
string tumMetin = String.Concat( Parametre Listesi );

98
4
İleri Programlama I

using System;
using System.Collections.Generic;

public class Program


{
public static void Main(string[] args)
{

string m1 = "C# ";

string m2 = "Öğreniyorum!";

double ym2 = 123.456;

string sayiAyirici = "|" ;

int sayi = 26;

string sonuc=String.Concat(m1, m2, ym2, sayiAyirici, sayi);


Console.WriteLine(sonuc);
}
}

Programın sonucu:

C# Öğreniyorum!123.456|26

• Copy: Metni başka bir değişkene kopyalamak için kullanılır.

string kopya_metin = String.Copy( gercek_metin );

• Format: Verilen string bir ifadeyi istenilen formata uygun şekilde düzenleyerek yine geriye string bir
değer döndürür.

// ekrana soldan 3 boşluk bırakır ve 26 yazar, toplam 5 karakterden oluşur


String.Format("{0,5}", 26);

// ekrana 00026 yazar


String.Format("{0:00000}", 26);
// ekrana verilen formata uygun olarak metni yazar, (555) 444 33 22
String.Format( "{0:(###) ### ## ##}", 5554443322)
// ekrana verilen formata uygun olarak metni yazar, (555)-444-33-22
String.Format("{0:(###)-###-##-##}", 5554443322)

• IsNullOrEmpty: Parametre olarak verilen string değişkenin boş olup olmadığını kontrol etmek için
kullanılır. Sonucu boolean olarak döndürmektedir.

99
4
C# Program Yapısı

using System;

public class Program


{
public static void Main(string[] args)
{
string metin1 = "Anadolu Üniversitesi";
string metin2 = "";

bool sonuc1 = String.IsNullOrEmpty(metin1);


bool sonuc2 = String.IsNullOrEmpty(metin2);

if(sonuc1 == true)
Console.WriteLine("Metin1 isimli değişkenin içi boş");
else

Console.WriteLine("Metin1 isimli değişkenin içinde veri bulunmaktadır.");

if(sonuc2 == true)
Console.WriteLine("Metin2 isimli değişkenin içi boş");
else

Console.WriteLine("Metin2 isimli değişkenin içinde veri bulunmaktadır.");


}
}

Örnek programın çıktısı şu şekilde olacaktır:

Metin1 isimli değişkenin içinde veri bulunmaktadır.


Metin2 isimli değişkenin içi boş

• Contains: Bu metot, bir string değer içinde karakter ya da metin aramak için kullanılmaktadır. Boo-
lean bir değer döndürür. True ise aranan metin, string değerin içinde vardır, false ise bulunamamıştır.

using System;

public class Program


{
public static void Main(string[] args)
{

string metin = "Anadolu Üniversitesi";

string aranan_metin = "Üni";

bool sonuc = metin.Contains( aranan_metin );


Console.WriteLine(sonuc);
}
}

100
4
İleri Programlama I

Metnin içerisinde aranan “Üni” sözcüğü olduğu için sonuç True dönecektir. Dikkat edilmesi gereken
bir durum da aranan metnin büyük-küçük harf duyarlılığı olduğudur. “üni” kelimesini arattığımızda so-
nuç False dönecektir.
• CopyTo: Bu metot ile, string bir değişken içinden belirtilen konumdan bir char dizisine kopyala-
ma yapar. String değişkenin başlangıç indeksi seçilir, char dizisinin kopyalama yapılacağı başlangıç
indeksi ve kopyalanacak karakter sayısı verilerek kopyalama yapılır. Kullanımı da şu şekildedir:

string metin = "kopyalama yapılacak metin" ;


metin.CopyTo(başlangıç_indeksi, char_türünde_dizi,
hedef_başlangıç_indeksi, kopyalanacak_karakter_sayısı);

• EndsWith: String bir değişkenin sonunun verilen bir char veya string türündeki değere eşit olup
olmadığını kontrol eder. Kullanımı şu şekildedir:

string metin = "sonu kontrol edilecek metin" ;


bool sonuc = metin.EndsWith( kontrol_edilen_karakter_veya_metin );

• IndexOf: String bir değişken veya değer içinde karakter ya da string bir ifadeyi aramak için kullanı-
lır. Aranan değer bulunur ise ilk bulduğu metnin indeks değerini döndürür. Bulamazsa -1 döndü-
rür. 4 farklı kullanım şekli vardır.
- IndexOf(Char)
- IndexOf(String)
- IndexOf(Char degisken_ismi, int başlangıç_konumu)
- IndexOf(String degisken_ismi, int başlangıç_konumu)

using System;

public class Program


{
public static void Main(string[] args)
{

string metin="C# öğrenmek çok kolay ve zevkli!";

string aranan="kol" ;

int sonuc=metin.IndexOf(aranan, 11);


Console.WriteLine(sonuc);
}
}

Örnek programımızın sonucu “kol” metninin ilk geçtiği konum olan “16” olarak bulunacaktır. Dikkat
edelim, C# dilinde dizilerin ilk elemanlarının konumu 0’dan başlamaktadır.
• Insert: Verilen string bir değer içerisine, belirtilen başlangıç pozisyonundan itibaren araya yeni
metin ilave edilir. Geriye metnin ilave edilmiş hâlini döndürür. Kullanımı şu şekildedir:

string yeni_metin = metin.Insert( int baslangic_sayisi, string eklenecek_metin );

101
4
C# Program Yapısı

using System;

public class Program


{
public static void Main(string[] args)
{

string metin = "C# çok güzel!";

string eklenecek="öğrenmek ";

string yeni_metin=metin.Insert( 3, eklenecek );


Console.WriteLine(yeni_metin);
}
}

Program çıktı olarak C# öğrenmek çok güzel! verecektir.


• LastIndexOf: IndexOf metoduna benzerdir ve benzer bir kullanımı vardır. IndexOf aranan metnin
bulduğu ilk indeksini verirken, LastIndexOf ise aranan metnin bulunduğu son konumu int türün-
de vermektedir. Aranan metin bulunamazsa yine -1 değerini döndürür.
Yine unutulmamalıdır ki C# dilinde dizilerin ilk elemanlarının konumu 0’dan başlamaktadır.
- LastIndexOf(Char)
- LastIndexOf(String)
- LastIndexOf(Char degisken_ismi, int başlangıç_konumu)
- LastIndexOf(String degisken_ismi, int başlangıç_konumu)
• PadLeft: İki çeşit kullanımı vardır.
- PadLeft(int bosluk_sayisi): Metnin sol başına verilen boşluk sayısı kadar “ ” boşluk karakteri
ekler. Kullanımı şu şekildedir:

string yeni_metin = metin.PadLeft(bosluk_sayisi);

- PadLeft(int bosluk_sayisi, char karakter): Metnin sol başına parametrede verilen sayı kadar
belirtilen karakteri ekler. Kullanımı şu şekildedir:

string yeni_metin = metin.PadLeft(int bosluk_sayisi, char karakter);

• PadRight: Kullanımı ve özelliği PadLeft gibidir. İki çeşit kullanımı vardır.


- PadRight(int bosluk_sayisi): Metnin sağına verilen boşluk sayısı kadar “ ” boşluk karakteri
ekler. Kullanımı şu şekildedir:

string yeni_metin = metin.PadRight(bosluk_sayisi);

- PadRight(int bosluk_sayisi, char karakter): Metnin sağına parametrede verilen sayı kadar belir-
tilen karakteri ekler. Kullanımı şu şekildedir:

string yeni_metin = metin.PadRight(int bosluk_sayisi, char karakter);

102
4
İleri Programlama I

• Remove: Bu metodun da iki farklı kullanımı vardır.


- Remove( int baslangıç_konumu ): String ifadenin verilen konumundan sonuna kadar silmek
için kullanılır. Kullanımı şu şekildedir:

string yeni_metin = metin.Remove( int baslangıç_konumu )

- Remove( int baslangıç_konumu, int kaç_adet_silineceği ): String ifadenin verilen başlangıç


konumundan belirtilen adet kadar karakter silmek için kullanılır. Kullanımı şu şekildedir:

string yeni_metin=metin.Remove( int baslangıç_konumu, int adet )

• Replace: Verilen metin içerisindeki bir metin arar ve bunu yeni metin ile değiştirir. İki farklı kulla-
nımı vardır.
- string degistirilmis_metin = eski_metin.Replace( char eski_karakter, char yeni_karakter )
- string degistirilmis_metin = eski_metin.Replace( string eski_kelime, string yeni_kelime )
• Split: String bir değişkenin değerini belirtilen koşullara göre parçalara ayırmaya yarar. İçerisinde
nokta “.” geçen bir paragraf metnini, cümlelerden oluşan bir string dizisine çevirebilir. Kullanımı
şu şekildedir:

string[ ] bölünmüş_dizi = metin.Split( char parçalama_karakteri );

• StartsWith: Bir metnin verilen bir karakter ya da bir metin ile başlayıp başlamadığını kontrol et-
mektedir. Boolean bir değer döndürür. True ise verilen metin ile başlamış, False ise verilen metin ile
başlamamıştır. Kullanımı şu şekildedir:

bool sonuc = metin.StartsWith( kontrol_edilen_karakter_veya_metin );

• Substring: Bir metnin içinden istenilen yerden, istenildiği kadar metin almak için kullanılır. İki
farklı kullanımı vardır.
- Substring( int başlangıç_konumu ): Verilen başlangıç konumundan metnin sonuna kadar ala-
rak bir metin oluşturur. Kullanımı şu şekildedir:

string yeni_metin = metin.Substring( int başlangıç_konumu );

- Substring( int başlangıç_konumu, int adet ): Verilen başlangıç konumundan parametrede be-
lirtilen adet kadar karakter alarak metin oluşturur. Kullanımı şu şekildedir:

string yeni_metin = metin.Substring( int başlangıç_konumu, int adet );

103
4
C# Program Yapısı

Araştırmalarla
İlişkilendir
Günlük Hayatta Fonksiyonlar • Bütün yazılım hizmetleri algoritmalarla yapılır.
Matematik her anlamda hayatımıza doğru- Algoritmanın temeli ise matematiksel fonksi-
dan etki etmektedir. Biz bunu her zaman fark et- yonlardır.
mesek de matematiksiz bir hayat aslında düşünü- • Otomat cihazları fonksiyon mantığıyla çalışırlar.
lemez. Matematiğin en önemli konularından biri • Ekonomik tahminler, beklentiler, ölçümler
ise fonksiyonlardır. Her ne kadar günlük hayatta matematiksel fonksiyonlarla hesaplanır.
kullandığımız problemlerle ilgisiz gibi görünse
• Termometreler genleşme sonucu sıcaklığı ma-
de fonksiyonlar konusu da günlük yaşam için
tematiksel bir işlem mantığıyla bize sunarlar.
önemlidir. Bu yazıda günlük hayatta fonksiyon-
lar üzerinde duracağız. • Bir aracın ne kadar sürede ne yakacağı aracın ya-
kıt performans fonksiyonunun bir ürünüdür.
Fonksiyonlar iki veri arasındaki ilişkiyi orta-
ya koyan bağıntılardır. Basit bir örnekle bir yatı- • Herhangi bir veri tahminimde önceki veriyle yeni
rım aracı 2 kat kazanıyorsa bunu f(x) = 2x şeklin- veri arasındaki ilişki fonksiyonla ifade edilir.
de ifade edebiliriz. Yani 1 lira koyduğunuzda 2 • Ekonomide çıktılar girdilerin birer fonksiyo-
lira olan şeyi bir fonksiyonla ifade edebiliriz. nudur. Bu girdileri değiştirerek fonksiyonların
Matematikte çok daha karmaşık fonksiyon büyümesi sağlanır.
işlemleri bulunmaktadır. Her işlem aynı zaman- Eğer bir matematikçi değilseniz ya da iş saha-
da bir fonksiyon olduğu için bu konunun anlaşıl- nızda yaygın olarak matematik kullanmıyorsanız
ması matematik için çok önemlidir. bunların farkına çok varmayabilirsiniz. Ancak sa-
Şimdi de günlük hayatta fonksiyonların kul- hip olduğumuz birçok şey için fonksiyonlar kul-
lanımına biraz değinelim. lanıldığı için fonksiyonların günlük hayatımıza
etkisi de büyüktür.
Günlük Yaşamda veya Doğada Fonksiyon
Konusunun Yeri Nedir? Modern yaşam modern matematik bilgisiyle
inşa edilmiştir. Fiziğin gelişmesi bile matematiğin
Günlük yaşamda fonksiyonların çok geniş
gelişmesiyle mümkün olmuştur. Fonksiyonlar ise
kullanım alanları bulunmaktadır. Bunların hep-
matematiğin geliştirilmesindeki ana etmenlerden
sinin farkında olmayabiliriz. Birkaç örnekle gös-
biridir.
terelim:
• Bilgisayar, telefon gibi teknolojik cihazların
işlemcileri matematiksel fonksiyonlarla dizayn Kaynak: Yılmaz, M. (2020). Günlük Hayatta
edilir. Fonksiyonlar. (2021, 20 Ağustos) https://tercih-
rehberin.com/gunluk-hayatta-fonksiyonlar/

Öğrenme Çıktısı
4 String sınıfının özelliklerini kullanabilme

Araştır 4 İlişkilendir Anlat/Paylaş

String sınıfındaki işlemler Metin düzenlemede en çok


Metinlerle işlem yapabil-
ile kelime işlemci program- karşılaştığınız sorunları ve
mek için sadece String sınıfı
ların özelliklerini ilişkilen- bunlar için kullandığınız
mı kullanılabilir araştırın.
dirin. çözüm yollarını anlatın.

104
4
İleri Programlama I

1 Metot oluşturabilme ve program


içinde metot çağırabilme

öğrenme çıktıları ve bölüm özeti


Metot

Belli bir işlemi yapmak için özelleşmiş kod bloklarına metot denir. Kod içerisinde sürekli kullanılacak işlemler
metotlara ayrılabilir. Böylece hem kodun okunurluğu artacak hem de bakım ve güncelleme zamanı kısalacaktır.
Tüm metotlar bir struct veya bir class yapısı içinde tanımlanmalıdır. C# dilinde, programların çalışabilmesi için
Main metodunun tanımlı olması gerekmektedir. Ayrıca metotlara erişim belirleyicilerin eklenmesi, isimlendir-
melerinin kurallara uyması, geri döndürdüğü değer türünün belirtilmesi gibi durumlara dikkat edilmelidir.
Hazırlanan metotlar da bu metotların tanımlamalarına uygun şekilde ve uygun parametreler ile bir metot
içerisinden çağrılmalıdır. Kendi kendini çağıran metotlara da rastlayabiliriz. Bunlara özyinelemeli (recursive)
metotlar denmektedir. İçlerine eklenen kontrol durumu sağlanan kadar metot kendi kendini çağırmaya de-
vam eder.
Bir sınıf içinde aynı isimli birden çok metot yazılabilir. Burada dikkat edilmesi gereken nokta, metotların pa-
rametrelerindeki türlerin ya da parametre sayılarının farklı olması gerekmektedir. Bu duruma metotların aşırı
yüklenmesi (method overloading) denmektedir.

Matematiksel işlemleri
2 programlama dilini karşılıkları
ile ilişkilendirebilme

Matematik Sınıfı

Matematiksel hesaplamalarda kullanılmak üzere tasarlanmış bir sınıftır. Bir sayının kuvvetini alma, kök hesap-
lama, trigonometrik hesaplamalar, logaritmik işlemler ve karşılaştırma işlemleri gibi sık kullanılan işlemler bu
sınıfta toplanmıştır. Tüm metotlar statik tanımlanmış olup, bu sınıftan kalıtım yapılamamaktadır.
Random sınıfı ise sistem zamanını kullanarak, belirlenen aralıklarda istediğimiz türde rastgele sayısal değerler
oluşturmaktadır.

105
4
C# Program Yapısı

Listeleme için kullanılacak


3 veri türlerini öğrenebilme ve
farklarını açıklayabilme
öğrenme çıktıları ve bölüm özeti

Collection Sınıfı

Dizilerin daha gelişmiş şekli olan koleksiyonlar, nesnelerin gruplandırılmasında kullanılır. Boyutları diziler gibi
sınırlandırılmamıştır, dinamik olarak artmaya ve azalmaya imkân verir. Kullanım özelliklerine göre özelleşmiş
koleksiyon yapıları mevcuttur.
• ArrayList: Nesnelerden oluşan dizi yapısıdır. 0’dan başlayan bir indis ile elemanlarına erişilebilir.
• Hashtable: Bu liste türünde indis kullanılmaz. Elemanlarına anahtar ve buna karşılık gelen değerler şeklin-
de erişilebilir.
• Queue: İlk girenin ilk çıktığı bir kuyruk yapısıdır. Bu kuyruğun sonuna bir eleman eklemek için Enque-
ue(), başından bir eleman çekmek için de Dequeue() metotları kullanılır.
• Stack: Son girenin ilk çıktığı bir yığın yapısıdır. En üste yeni eleman eklemek için Push(), en üstten bir
eleman çekmek için de Pop() metotları kullanılır.
• Dictionary: Hashtable’ın özelleşmiş bir türüdür. Elemanları anahtar ve değer şeklinde eklenmektedir.

4 String sınıfının özelliklerini


kullanabilme

String Sınıfı

Bilgisayar ortamında art arda gelen karakter dizilerini temsil etmektedir. Bu karakter dizilerinin boyutları, ka-
rakter büyütme/küçültme işlemleri, metin parçalama, metin kopyalama, metin birleştirme, içerik kontrolü gibi
çeşitli işlemlerin yapılmasına izin veren bir sınıftır.

106
4
İleri Programlama I

1 Belirli görevleri yerine getirmek amacıyla 4 I. Değerlerini sistem zamanına göre oluşturur.
tasarlanmış kod bloklarına denir. Kod içerisinden
çağrılırlar ve bu yüzden belirli kurallara uygun ya- II. Kullanabilmek için bu sınıftan bir nesne

neler öğrendik?
zılması gerekmektedir. oluşturulmalıdır.
Yukarıda tanımı verilen kavram aşağıdakilerden III. Belli başlangıç ve bitiş noktaları tanımla-
hangisidir? nabilir.
A. Değişken Yukarıda özellikleri verilen sınıf aşağıdakilerden
B. Dizi hangisidir?
C. Metot A. String sınıfı
D. İşlem B. Logaritma sınıfı
E. Parametre C. Random sınıfı
D. Math sınıfı
2 Aşağıdakilerden hangisi metotların tanımlan- E. Collection sınıfı
dıkları sınıf içerisinde uyması gereken kurallardan
biri değildir? 5 I. Nesnelerden oluşmuş, çok sayıda türü
A. Birden fazla parametre alan metotlarda, para- tutabilir.
metreler arasına virgül koyulmalıdır. II. Boyutları dinamik olarak artıp azaltılabilir.
B. Metot isimleri de değişken isimleri kurallarına
uygun şekilde verilmesi III. İhtiyaca göre kullanıcılar tanımlayabilir.
C. Her zaman geri döndürdüğü değerin türü belir- Yukarıda özellikleri verilen sınıf aşağıdakilerden
tilmelidir. hangisidir?
D. Bir sınıf yapısı içinde tanımlanmalıdır. A. Collection
E. Metotların içinde mutlaka bir atama işlemi ya- B. String
pılmalıdır. C. Math
D. System.IO
3 Programların çalıştırılabilmesi için bir baş- E. Exception
langıç noktasına ihtiyaçları vardır. ….., programın
bütün işlevlerinden sorumlu, onları yaptıran hatta
başka sınıflar ile iletişim kuran ana metottur. 6 Aşağıdaki maddelerden hangisi Queue (Kuy-
ruk) yapısı için doğru verilmiş bir örnektir?
Yukarıda boş bırakılan yeri aşağıdakilerden hangisi
doğru şekilde tamamlar? A. Kütüphanedeki raflardaki kitaplar
B. Üst üste konulmuş tabaklar
A. Kurucu metot C. Market sırasında bekleyen insanlar
B. Yapıcı metot D. Sözlükteki kelimeler
C. Yıkıcı metot E. Kitabın fihrist kısmı
D. Main metot
E. Public metot
7 Aşağıdaki maddelerden hangisi String sınıfı-
nın özelliklerinden biri değildir?
A. Count
B. ToUpper
C. Length
D. ToLower
E. Compare

107
4
C# Program Yapısı

8
public static void Main(string[] args)
neler öğrendik?

{
string metin = "Programlama öğreniyorum ve eğleniyorum!";
string aranan = "en" ;
int sonuc = metin.IndexOf(aranan);
Console.WriteLine(sonuc);
}

Yukarıda verilen kod örneği çalıştırıldığında ekrana yazılan sonuç ne olacaktır?


A. öğreniyorum
B. 15
C. 16
D. 31
E. eğleniyorum

9
double x = Math.Pow( 7, 2 ) ;

Yukarıda kodu verilen matematiksel işlem aşağıdakilerden hangisidir?


A. x = 72
B. x = 27
C. x = 7 × 2
D. 7 = x2
E. 2 = x7

10
string metin = "C:/Program Files/Users/Documents/sample codes";
string[ ] dizi = metin.Split( ′/' );
Console.WriteLine( dizi[3] + " " + dizi[2] );

Yukarıda verilen kod örneği çalıştırıldığında ekrana yazılan sonuç ne olacaktır?


A. Users Program Files
B. Documents Users
C. Program Files Users
D. Users Documents
E. Program Files C

108
4
İleri Programlama I

1. C Yanıtınız yanlış ise “Metotlar” konusunu ye- 6. C Yanıtınız yanlış ise “Collection Sınıfı” konu-
niden gözden geçiriniz. sunu yeniden gözden geçiriniz.

neler öğrendik yanıt anahtarı


2. E Yanıtınız yanlış ise “Metotlar” konusunu ye- 7. A Yanıtınız yanlış ise “String Sınıfı” konusunu
niden gözden geçiriniz. yeniden gözden geçiriniz.

3. D Yanıtınız yanlış ise “Metotlar” konusunu ye- 8. B Yanıtınız yanlış ise “String Sınıfı” konusunu
niden gözden geçiriniz. yeniden gözden geçiriniz.

4. C Yanıtınız yanlış ise “Matematik Sınıfı” konu- 9. A Yanıtınız yanlış ise “Matematik Sınıfı” konu-
sunu yeniden gözden geçiriniz. sunu yeniden gözden geçiriniz.

5. A Yanıtınız yanlış ise “Collection Sınıfı” konu- 10. B Yanıtınız yanlış ise “String Sınıfı” konusunu
sunu yeniden gözden geçiriniz. yeniden gözden geçiriniz.

109
4
C# Program Yapısı

Araştır Yanıt
4 Anahtarı

Böyle bir işlem yapabilmek için değer döndüren referans parametreler de var-
dır. Fakat özellikle web servislerde, çok sayıda veri döndürme işlemleri için
Araştır 1 kullanılan JSON formatında düzenlenmiş metinlerin gönderilmesi çok daha
kullanışlı olacaktır.

Matematik işlemleri için oluşturulmuş Matematik sınıfındaki metotlar hari-


cinde, kendimiz de ihtiyaçlar doğrultusunda bir sınıf oluşturabiliriz. Yalnız
Araştır 2 aynı metotları tekrar yazarsak, muhtemelen bu sınıftaki çalışma hızını yaka-
layamayız.

Queue (Kuyruk) yapısı, hazırlanan programda eğer bir SMS/e-posta gönder-


me servisi varsa, burada kullanılabilir. Mesajlar, sırasıyla gönderilmek istenen
kişilere gidecektir. Sıranın önemli olduğu durumlarda kullanılabilir. Ya da bir
Araştır 3
onay zinciri uygulamasında sırasıyla onay verecek kişilere giden bir onay met-
ni olduğunu düşünün. Bu uygulamada da sıra önemli olduğu için kuyruk
yapısı kullanılabilir.

Metin işlemleri yapmak için sadece String sınıfına bağımlı değiliz. Yazdığımız
programda ihtiyacımıza uygun şekilde, yeni metin düzenleme metotları hazır-
Araştır 4 layabiliriz. Bu metotlardan oluşan sınıfımızı da bir kütüphane şeklinde tüm
projelerimizde kullanabiliriz.

110
4
İleri Programlama I

Kaynakça
Karaçay, T. Bölüm 12, Metotlar (2021, 15 Ağustos). https://www.baskent.edu.tr/~tkaracay/etudio/
ders/prg/csharp/ch12.pdf
C# Metotlar. (2021, 15 Ağustos). https://www.azkod.com/csharp/c-metotlar
Duran, S. (2015). C# ile Recursive İşlemler. (2021, 16 Ağustos). https://www.semihduran.com/c/c-ile-
recursive-islemler.html
Akgül, B. (2014). BPR Algoritma ve Programlama I. (2021, 16 Ağustos). https://www.slideserve.com/
chenoa/bpr151-algor-tma-ve-programlama-i
Çelen, E. (2021). C# Math Sınıfı Nedir? (2021, 17 Ağustos). https://emrecelen.com.tr/c-sharp-math-
sinifi-nedir/
Wagner, B. (2015). Collections (C#). (2021, 18 Ağustos). https://docs.microsoft.com/en-us/dotnet/
csharp/programming-guide/concepts/collections
Ders 33. Koleksiyonlar (2021, 18 Ağustos). https://tr.wikibooks.org/wiki/C_Sharp_Programlama_
Dili/Koleksiyonlar
C# Metinsel Metotlar. (2021, 18 Ağustos). https://www.azkod.com/csharp/c-metinsel-metotlar

111

You might also like