Makale Özeti

Temel Programlama ve C# (Bölüm-2)

Makale

Array’ler 

          C# array’ler için bize yeni bir syntax sunmaktadır.Array tanımlaması sırasında köşeli parantezler kullanılır ve tanımlama işlemi sırasında değerler atanabilir. 

using System;
public
class ArrayExample
{
           
public static int Main()
           
{
                       
//Aşağıdaki işlem array tanımını ve 
                       
//değer atamasını gerçekleştirir.
                       
int[] aryInt={1,2,3};
                       
return 0;
           
}

}
         

          Bu yöntem ile 2,3 ve çok boyutlu arrayler tanımlanabilir. 

using System;
public
class ArrayExample
{

           
public static int Main()

           
{

                       
//Aşağıdaki işlem 2D bir array tanımını ve 

                       
//değer atamasını gerçekleştirir.

                       
int[,] aryInt=

                                   
{

                                               
{1,2,3},

                                               
{4,5,6},

                                               
{7,8,9}

                                   
};

                       
return 0;

           
}

}
 

          Alternatif olarak new keyword’ü ile dimension’ı daha sonra belirtilmek üzere bir array tanımlanabilir. 

          protected bool[,] MyBool; 

          İstenildiği takdirde array dinamik olarak da oluşturulabilir. Aşağıdaki örnekte array ilgili class’ın constructor’ına eklenerek class yaratıldığında dimension’ı dinamik olarak tanımlanan bir dizi yaratılması sağlanmıştır. 

using System;
public
class Arrays
{

           
private int MaxCols;

           
private int MaxRows;

           
private bool[,] MyBool;

           
public Arrays(int Rows, int Cols)

           
{

                       
MaxCols=Cols;

                       
MaxRows=Rows;

                       
MyBool=new bool[Rows,Cols];        
           
}
}

public
class ArrayExample
{

           
public static int Main()

           
{

                       
Arrays MyArray=new Arrays(1,2);

                       
return 0;

           
}
}
 

          C# aynı zaman ‘orthogonal’ (dikey) ve ‘jagged’ (çapraz – her rowda farklı eleman sayısına sahip diziler) array tanımlamalarına izin verir. Aşağıdaki örnek 1.rowunda 1, 2.rowunda 2, 3. rowunda 3 elemana sahip bir ‘diagonal matris’ (yatay) tanımı yapacaktır.

using System;
public
class ArrayExample
{

           
public static int Main()

           
{

                       
int[][] ary=new int[3][];

                       
ary[0]=new int[1];

                       
ary[1]=new int[2];

                       
ary[2]=new int[3];

                       
ary[0][0]=1;

                       
ary[1][0]=2;

                       
ary[1][1]=3;

                       
ary[2][0]=4;

                       
ary[2][1]=5;

                       
ary[2][2]=6;

                       
for (int i=0;i<=2;i++)

                       
{

                                   
for (int j=0;j<=i;j++)

                                   
{

                                               
Console.Write(ary[i][j].ToString()+" ");

                                   
}

                                   
Console.WriteLine();

                       
}

                       
Console.ReadLine();

                       
return 0;

           
}
}

          Bütün C# array’leri System.Array tipinden inherit edilir ve bu bize birçok avantaj sunar. Aşağıdaki örnekte System.Array class’ının birkaç method’unu ve avantajlarını görüyoruz. 

using System;
public
class ArrayExample
{

           
public static int Main()

           
{

                       
int[] ary={7,3,9};

                       
//Aşağıdaki kod tanım sırası ile değerleri

                       
//ekrana yazdırır

                       
foreach (int j in ary)

                       
{

                                   
Console.Write(j.ToString()+" ");

                       
}

                       
Console.WriteLine();

                       
//Aşağıdaki kod Matrisi ters çevirir

                       
Array.Reverse(ary);

                       
foreach (int j in ary)

                       
{

                                   
Console.Write(j.ToString()+" ");

                       
}

                       
Console.WriteLine();

                       
//Aşağıdaki kod ise dizi elemanlarını sıralar

                       
Array.Sort(ary);

                       
foreach (int j in ary)

                       
{

                                   
Console.Write(j.ToString()+" ");

                       
}

                       
Console.ReadLine();

                       
return 0;

           
}
}
         

Enumeration 

          Enumarationlar kişiye özel integer tiplerdir. Enumaration tanımlandığında tanımlanan tipin alabileceği değerler belirlenmiş olur. Enumarationlar ile geliştirdiğimiz class’ın içerisine istenmeyen değerlerin programcı tarafından assign edilmesini engeller ve intellisense özelliği ile programcıya kullanılabilecek parametrelerin değerlerini göstermeden programın kolay kullanımını sağlarız. 

using System;
public
class EnumerationExample
{

           
enum Renkler {Siyah,Beyaz,Kirmizi,Mavi};

           
public static int Main()

           
{

                       
Renkler[] j={Renkler.Beyaz,Renkler.Kirmizi,Renkler.Mavi,Renkler.Siyah};

                       
for (int i=0;i<4;i++)

                       
{

                        
            Console.WriteLine(j[i]);

                       
}

                       
Console.ReadLine();

                       
return 0;

           
}

}
                 

Constant

          Program içerisinde hiç değişmeyecek değerler kullanmak istediğimizde sabitler yani constant kullanılır. Constant tanımlama aynı zamanda client programcılarına kullanabilecekleri limitleri göstermek açısından da faydalı olabilir. 

abstract public class Deneme
{

           
public const int MaxRows=50;

           
public const int MaxCols=100;

}
         

C#’ta Program Akış Kontrol Mekanizmaları 

          Data tipleri hakkında birçok noktaya değindikten sonra şimdi de akış kontrol mekanizmalarına göz atabiliriz. 

Fonksiyonlar 

          Fonksiyonlar programın akışı sırasında en çok başvurduğumuz yapılardır. Fonksiyon kullanmanın nedenlerini 3 şekilde açıklayabiliriz: 

·         Yeniden kullanım,

·         Çok fazla değişen fonksiyonelliği sağlamak,

·         Kodun ne yaptığını anlatmaya yardımcı olmak. 

Fonksiyon Tanımlama 

          Bir fonksiyon matematikte olduğu gibi geriye her zaman bir değer döndürür. Bu tanımdan yola çıkarak tanımlayacağımız fonksiyonun ne tip değer döndüreceğini de söylememiz gerekmektedir. Aynı zamanda fonksiyonlar’ın içerisine yine tipi belli değerler parametere olarak gönderilebilir. Geriye döndürdüğümüz değeri ise return statement’ı ile compiler’a belirtiriz. Eğer geriye bir parameter göndermek istemiyorsak o zaman kullanmış olduğumuz yapı fonksiyon değil bir metoddur. 

          Bir class içerisinde tanımlı bir fonksiyonu class içerisinden instance’ını yaratmadan kullanabilmek için static keyword’ünü kullanırız. 

          Aşağıdaki örnek static bir fonksiyon tanımlayarak içeriye gönderilen iki parametreden büyük olanını geriye döndürmektedir. 

            public static int Max(int value1, int value2)
           
{

                       
int ReturnValue;

                       
if (value1>value2)

                       
{

                        
            ReturnValue=value1;

                       
}

                       
else

                       
{

                        
            ReturnValue=value2;

                       
}

                       
return ReturnValue;

           
}
 

Fonksiyonu Aktif Hale Getirmek 

          Fonksiyonun aktif hale getirilebilmesi için fonksiyon adından sonra parantezler ve hemen ardından içeriye gönderilecek parametreler belirtilir ve parantez kapatılır. Aşağıdaki örnek ile yukarıda yazılan Max fonksiyonun kullanımı görülmektedir. 

using System;
public
class FunctionExample
{

           
public static int Max(int value1, int value2)

           
{

                       
int ReturnValue;

                       
if (value1>value2)

                       
{

                                   
ReturnValue=value1;

                       
}

                       
else

                       
{

                                   
ReturnValue=value2;

                       
}

                       
return ReturnValue;

           
}

           
public static int Main()

           
{

                       
int k;

                       
k=Max(1,5);

                       
Console.WriteLine(k);

                       
Console.ReadLine();

                       
return 0;

           
}
}
 

Fonksiyonlar ve Parametreler 

          C#’ta fonksiyon kullanımı sırasında value tipler value referans tipler ise referans olarak fonksiyon içerisine geçer. Bu pratik olarak şu demektir fonksiyonun içerisine gönderilen değer parametrenin bir kopyasıdır ve değer üzerinde yapılan herhangi bir değişiklik parametrede bir değişikliğe yol açmaz. Bunu bir örnekle açıklamak yerinde olacaktır. 

using System;
public
class ByValSample
{

           
//void deyimi ile geriye parametre döndürmeyeceğimiz

           
//yani kullanılan fonksiyonun bir metod gibi davranacağını
            //belirtiyoruz.
           
public static void ChangeValue(int y)

           
{

                       
y=20;

                       
return;

           
}

           
public static int Main()

           
{

                       
int x=10;

                        Console.WriteLine("Metod çağrılmadan önce x="+x);
                       
ChangeValue(x);

                       
Console.WriteLine("Metod Çağrıldıktan Sonra x="+x);

                       
Console.ReadLine();
 

                        return 0;
           
}

}
         

          Eğer C#’ın bu davranışını değiştirmek istersek yani fonksiyona parametre olarak gönderilen değer üzerinde yapılan herhangi bir değişikliğin aynı zamanda değişkene de yansımasını istiyorsak parametre tanımında geçişin referans olarak yapıldığını belirtmek zorundayız. Bu sayede parametrede yapılan bir değişiklik fonksiyona gönderilen değişkene yansıyacaktır. Bu işlemi gerçekleştirirken tek dikkat etmemiz gereken şey fonksiyona gönderilen parametrenin bir değere sahip olması yani kullanılmadan önce initialize edilmesi gerekliliğidir. 

using System;
public
class RefSample
{

           
//ref keywordü ile parametrenin referans olarak 

           
//işlem göreceğini belirtiyoruz.

           
public static void ChangeValue(ref int y)

           
{

                       
y=20;

                       
return;

           
}

           
public static int Main()

           
{

                       
int x=10;

                       
Console.WriteLine("Metod çağrılmadan önce x="+x);
                       

                        //İçeriye gönderilen parametrenin referans olarak 
                       
//geçmesini sağlıyoruz.

                       
ChangeValue(ref x);
                       

                        Console.WriteLine("Metod Çağrıldıktan Sonra x="+x);
                       
Console.ReadLine();
 

                        return 0;
           
}
}
 

          Eğer initialize (değeri henüz atanmamış) olmayan bir değer fonksiyona göndereceksek aynı zamanda gönderilen değerin ilgili initialization işlemine tabi tutulması gerektiğini belirtmek zorundayız bunu yapmak için ise out keyword’ü kullanılmaktadır. Aşağıdaki örnek bu yöntem ile referanssal bir geçiş sağlamaktadır. 

using System;
public
class OutSample
{

           
public static void ChangeValue(out int y)

           
{

                       
y=20;

                       
return;

           
}

           
public static int Main()

           
{

                       
int x;

                       
ChangeValue(out x);
                       

                        Console.WriteLine("Metod Çağrıldıktan Sonra x="+x);
                       
Console.ReadLine();

                       
return 0;

           
}
}
         

          Diğer bir keyword ise içeriye gönderilecek kaç tane parametre olacağının bilinmediği durumlarda kullanılmak üzere geliştirilmiş params keyword’üdür. Bu sayede fonksiyon içerisine n tane parametre gönderilebilir. Aşağıdaki örnek içeriye gönderilen n parametreden en küçük olanı bulmaktadır. 

using System;
public
class ParamExample
{

           
public static int FindMinimum(params int[] values)

           
{

                       
int intMin=-1;

                       
//.Length ile fonksiyona herhangi bir

                       
//parametre gönderilip gönderilmediğini anlıyoruz.

                       
if (values.Length>0)

                       
{

                                   
intMin=values[0];

                       
}

                       
for (int i=1;i<values.Length;i++)

                       
{

                                   
if (values[i]<intMin)

                                   
{

                                               
intMin=values[i];

                                   
}

                       
}

                       
return intMin;

           
}

           
public static int Main()

           
{

                       
int j,k;

                       
//j değişkenine 2 değerden küçük olanı atanıyor.

                       
j=FindMinimum(5,4);
 

                        //k değişkenine FindMinimum fonksiyonuna 12 tane 
                       
//parametre gönderilerek gönderilenlerin en küçüğü 

                       //atanıyor

                       
k=FindMinimum(5,4,1,-1,-8,1000,34,100,1000,10001,-100,1);
 

                        Console.WriteLine(j);
                       
Console.WriteLine(k);

                       
Console.ReadLine();

                       
return 0;

           
}
}
         

  Üçüncü bölümde koşul deyimleri, döngüler ve error handlingden bahsedeceğiz.


Oğuzhan ÖRDE
MCSD,MCDBA,MCP,MCT,ATECH