26 Ocak 2023 Perşembe

C# Temelleri 1

 Merhaba,

Uzun zamandan sonra yeni bir yazı ile karşınızdayım. Bu sefer masaüstü uygulamalar için kullandığım C# programlama dilinin temelleri ile karşınızdayım. Otomasyon projeleri yaparken artık sadece bir üretimin yapılmasını kontrol etmek yetmiyor. Endüstri 4.0 falan derken bir çok fabrika üretimin yapılmasını sağlamanın dışında üretimin takip edilmesi, kalitesinin kayıt altına alınması, üretim hatlarından alınan bilgilerin ticari sistemlere kaydı, yapılacak işlerin ticari sistemden girilen siparişlere göre yapılması gibi otomasyon sistemi ile yönetim takip uygulamalarının ilişki kurmasını gerektirecek istekler ve ihtiyaçlar oluşmaya başladı. Bu amaçla çoğunlukla C# programlama dilini ve Windows işletim sistemini kullanmak zorunda kalıyorum. Yıllardır biriken tecrübelerim beni masaüstü uygulamalar için en geniş alt yapıya sahip ve çok kolay yardım bulabildiğim C# programlama diline neredeyse mecbur bıraktı. 

Bu yazıda C# programlama dilini kullanmaya başlamak için tüm gerekenleri topladım, anlatmaya çalışacağım. 

Önce neden C# öğrenmelisiniz ile başlayalım, motivasyon olsun.

  • Esnek yapısı (konsol uygulaması, web servisleri, oyunlar, masaüstü uygulamalar). 
  • Unity sistemi ile oyun geliştirme kabiliyeti.
  • İyi geliri olan bir iş.
  • Çok yaygın olması sayesinde yardıma ve örneklere çok kolay ulaşılabilmesi.

Baksanıza ben bile bu dilin uzmanı olmadığım halde internetten topladığım bilgilerle yazı yazabiliyorum. 

C# öğreneceksek ilk önce programlarımızı yazacağımız bir IDE (Integrated Development Environment) gerekiyor. Windows işleetim sistemi için bu IDE Visual Studio yazılımı. Bu yazımda da ben bu IDE ile programları yazıp resimlendireceğim. 


İlk C# Programımız

Visual Studio programını çalıştırdığımızda karşımıza ne yapmak istediğimizi soran bir karşılama penceresi çıkar. Burada şimdilik sağ alt köşedeki Kodsuz olarak devem et seçeneğini tıklayalım ve editörün proje olmadan açılmasını sağlayalım.

Yeni bir proje oluşturacağız ve denemelerimizi onunla yapacağız. Dosya -> Yeni -> Proje menüsüne tıkladığımızda karşımıza yeni bir proje oluşturmak için seçenekler çıkacaktır. 

Burada C# Konsol uygulamasını seçelim ve Sonraki butonuna tıklayarak ilerleyelim. 

Proje adını ben CSharpTemelleri verdim siz nasıl tercih ederseniz o ismi verin. Konum bölümü yanındaki butona tıklayarak projemizin yerleştirileceği klasörü seçiyoruz ve Sonraki butonuna tıklayarak kullanılacak .NET versiyonu seçim ekranına geçeriz.

 Burada bir şey değiştirmeden Oluştur butonuna tıklayarak projemizin oluşturulmasını sağlıyoruz. 

Editörde boş bir konsol uygulamasının kodları açılacaktır. Burada gördüğünüz yazı tipi ve boyutlarını değiştirmek isterseniz Araçlar -> Seçenekler menüsünden değiştirebilirsiniz. 

Karşımıza şöyle bir kod çıkar.

using System;

namespace CSharpTemelleri
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

En üstte using kelimesi ile başlayan satırlar bazı C# kod kütüphanelerini projemizde kullanacağımızı belirtiyor. Şimdilik bunlardan sadece System var. static void Main(string[] args) satırı altındaki süslü parantezler içine yazacağımız kodlar programı çalıştırdığımızda işletilecektir. Kodu şöyle düzenleyelim. 

using System;

namespace CSharpTemelleri
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Merhaba C#");
        }
    }
}

Console.WriteLine("Hello World!"); satırını komple silelim baştan yazalım. Kodları yazarken dikkatinizi çekeceği üzere Visual Studio editörü kod yazarken bize yardımcı oluyor. 

Seçenekler arasında ok tuşuyla gezebilir, istediğimiz seçenekte ise enter basarak kelimenin geri kalanının otomatik tamamlanmasını sağlayabiliriz. Yazarken herhangi bir anda bize olası önerilerini görmek istersek Ctrl+Space tuş kombinasyonu ile önerileri aktif edebiliriz. 

Bu kod konsol penceresine Merhaba C# yazar ve program biter. Programı çalıştırmak için yukarıda yanında yeşil bir play oku bulunan ve projemizin adı bulunan butona tıklarız. Program derlenir (compile edilir) ve çalıştırılır. Deneyelim.

Programı çalıştırdığımızda bir konsol penceresi açılacak ve mesajımızı yazacaktır.

Ben burada daha net görünsün diye konsol renkleri ve font boyutları ile biraz oynadım. 

Dikkat edersek bizim kodumuzda emrettiğimiz mesaj çıktısının yanında bir de debugger tarafından verilmiş uzun bir mesaj var. Kısaca diyor ki, programın çalışması bitti ama ben çıktıyı gör diye konsolu kapatmadım. Otomatik kapanmasını istersen git şu seçeneği etkinleştir. Hatta programı çalıştırdığımızda biz göremeden konsol bir açılıp hemen kapanıyorsa, bu otomatik kapatma aktif olabilir. Bunu aktif edeceğiz ama önce biraz kodu anlayalım.

static void Main(string[] args) satırı demiştik bu kısım programımızın Main metodu olarak adlandırılır ve her programda bir Main metodu bulunmalıdır. Program çalıştırılırken sistem bu Main metodunu bulur ve onu çalıştırır, başka çalışacak her şeyler buradan yönlenerek çalıştırılır. 

Metodun adının tanımlaması bu satırla yapıldıktan sonra bir süslü parantez içinde metodun kodu yazılır. Bu kısma metodun gövdesi denir. Süslü parantezler içinde değişik anlamlara sahip bir çok kod bloğu göreceğiz C# dilini kullandıkça. 

Burada metod tanımlaması yapılırken kullanılan static, void, string[], args, vs. hepsinin anlamlarını ilerledikçe birer birer öğreneceğiz. 

Console.WriteLine("Merhaba C#"); komutu konsola tırnak işaretlerinin içinde yazan yazıyı çıkartır. Console.WriteLine metodun adıdır. Metodlar adı yazıldıktan sonra parantez içinde işleyecekleri veri ya da veriler yazılarak kodlanır. Parantez içinde metodlara gönderilen verilere parametre adı verilir. 

Her komutun sonunda da bir noktalı virgül koyma zorunluluğu vardır. Bu o komutun artık bittiğini belirtir. Dikkat edersek süslü parantezler ile ifade edilen kod blokları sonunda noktalı virgül yoktur.

Şimdi kodumuzu 2 adet mesaj verecek şekilde değiştirelim.

... 
      static void Main(string[] args)
        {
            Console.WriteLine("Pizza severim");
            Console.WriteLine("Gerçekten harika birşey");
        }
...

ve çalıştırdığımızda

Gördüğümüz gibi her Console.WrtieLine() komutu konsola yeni bir satır olarak geliyor. Konsoldan bir ses çıkarmak istersek şu kodu yazabiliriz.

        static void Main(string[] args)
        {
            Console.WriteLine("Pizza severim");
            Console.WriteLine("Gerçekten harika birşey");
            Console.Beep();
        }

Console.Beep() metodu konsolda program o satırı işlerken bir bip sesi çıkartır. 

Böylece ilk programımızı yaptık ve en temel konsol uygulaması komutlarından birini öğrendik. Devam edelim.


C# Konsolda Çıktı Formatları ve Programa Yorum Eklemek

Yukarıda gördüğümüz üzere Console.WriteLine() metodu konsola bir satır yazı yazdırıyor. Bir diğer konsola yazdırma metodu da Console.Write(). Bir deneme yapalım.

Console.Write() metodu da tırnak içinde verilen yazıyı yazıyor ama sonrasında kursörü alt satıra geçirmiyor. Bu yüzden arkasından gelecek başka bir konsola yazma komutu (Write ya da WriteLine) yazmaya hemen onun bitirdiği yerden başlıyor. 

WriteLine komutunu yazmanın bir kısa yolu var. sadece cw yazıp 2 defa tab tuşuna basarsak satırı otomatik olarak yazacaktır.

Çok kullanılan bir kod parçacığı olduğu için kısa yol yapılmış. 

Program yazarken daha sonra inceleyecek ya da müdahale edecek kişilere bilgi vermek için satırlar arasına düz metin olarak yorumlar yazmamız gerekecektir. Hatta ileride kendi kodumuza bakarken bir şeyleri hatırlamak için kendimize de bir not yazabiliriz. C# dilinde yorum yazısı öncesinde 2 tane bölü işareti (//) kullanılır. Kodumuza bir yorum ekleyelim.

            Console.Write("Hey!");   //Bu kod satırı sonundaki yorum
            Console.WriteLine("Merhaba!");

            //Bu bir yorum satırı

Gördüğümüz gibi editör de otomatik olarak // sonrası yazılanların rengini değiştirdi. Yorumlar programımız çalışırken işlenmez. Kodun içinde yerleşmiş ama hiç bir iş yapmayan yazılardır. Sadece editörde programı açanları bilgilendirme amaçlıdırlar. Bir çok satırdan oluşan uzun bir yorum yazmak istersek /* karakterleri ile başlarız.

            //Bu bir yorum satırı
            /*
             * Bu
             * çok
             * satırlı
             * bir yorum
             */

Yorumu bitirmek için de tam tersini yapıp */ karakterleri koyuyoruz.

Konsola yazdırırken kullanabileceğimiz bir özellik de escape karakterler adı verilen yapı. Yapının özü yazı içinde bir ters bölü (\) ve arkasından gelen bir karakterle ifade edilen ve yazıya müdahale eden karakterler kullanmaktır. Mesela \t koyduğumuzda o noktada yazıya bir tab tuşu basılmış gibi boşluk eklenir. Deneyelim.

            Console.Write("Hey!");   //Bu kod satırı sonundaki yorum
            Console.WriteLine("Merhaba!");
            Console.WriteLine("\tÜmit");

Ümit yazısı öncesi tab tuşu basılmış gibi boşluk bırakıldı. \b silme tuşunun (back space) yaptığı işi yapar. \n enter tuşu basılmış gibi alt satıra geçer (new line). Bunları deneyip görün lütfen.

Son olarak konsola şu sistem tarafından yazılan bir sürü çöp yazıdan kurtulalım. Araçlar -> Seçenekler menüsünden açılan pencerede, Hata Ayıklama sekmesinde en altlarda Hata ayıklama durdurulduğunda konsolu otomatik olarak kapat seçeneğini işaretleyelim. Programı çalıştırdığımızda bu sefer yapacakları bittiği için biz daha çıktıyı göremeden konsol yok olacaktır. Bizim bir tuşa basmamızı beklemesi için program sonuna şu satırı ekleyelim.

            Console.Write("Hey!");   //Bu kod satırı sonundaki yorum
            Console.WriteLine("Merhaba!");
            Console.WriteLine("\tÜmit");

            Console.ReadKey();

Console.ReadKey() metodu program o noktaya geldiğinde herhangi bir tuşa basılana kadar bekler. Bu arada biz de program çıktısını görürüz. 

Yaşasın! Çöp yazılardan da kurtulduk. 


C#'ta Değişkenler 

Önce kodumuzu boşaltalım. En son satır haricini bir silelim ortalık temizlensin.

        static void Main(string[] args)
        {
           

            Console.ReadKey();
        }

Matematik derslerini hatırlarsanız bazı değerleri ifade etmek için x, y, z gibi isimler verirdik. Programlama dillerinde de değerleri ifade etmek için sembolik isimler verilen değişkenler kullanılır. Değişkenler sadece matematik değerleri değil yazıları, tek karakterleri veya sadece doğru/yanlış bilgisini de içlerinde barındırabilirler. Şimdi bu değişkenlerin nasıl kullanılacağını görelim. 

Bir değişkenin üretilmesi iki adımdan oluşur: tanımlama (declaration) ve değer girme (initialization). Bir değişken tanımlaması için ilk önce içinde saklanacak veri tipini ifade etmeliyiz. Örneğin bir tamsayı değer saklanacak değişken adı öncesinde int kelimesini kullanırız (integer kelimesinin kısaltılmışı). Sonra da değişken adını yazarız. Örnek

        static void Main(string[] args)
        {
            int x;

            Console.ReadKey();
        }

Bu adım tanımlamadır (declaration). Daha sonra bu değişkene bir değer gireriz.

        static void Main(string[] args)
        {
            int x; //tanımlama
            x = 123; //ilk değer girme

            Console.ReadKey();
        }

Değişkene ilk defa değer girilen satırda yapılan işe initialization denir. İkinci bir değişken tanımlayalım.

        static void Main(string[] args)
        {
            int x; //tanımlama
            x = 123; //ilk değer girme

            int y;

            Console.ReadKey();
        }

Burada y değişkeni tanımlanmış ama ilk değeri atanmamıştır (not initialized). Aynı anda hem tanımlama hem ilk değer vermek de mümkündür.

        static void Main(string[] args)
        {
            int x; //tanımlama
            x = 123; //ilk değer girme

            int y = 321; //tanımlama ve değer girme

            Console.ReadKey();
        }

Program içerisinde ihtiyaca göre her iki şekil de kullanılır. Diyelim bu değerleri konsolda yazdırmak istiyoruz.

            int x; //tanımlama
            x = 123; //ilk değer girme

            int y = 321; //tanımlama ve değer girme

            Console.WriteLine(x);
            Console.WriteLine(y);

            Console.ReadKey();

Çalıştıralım

Değerlerimizi değişkenler içinde yerleştirdikten sonra matematik işlemler için kullanabiliriz. Örneğin iki değerin toplamını başka bir değişkende kaydedelim ve konsola bu değeri yazdıralım.

        static void Main(string[] args)
        {
            int x; //tanımlama
            x = 123; //ilk değer girme

            int y = 321; //tanımlama ve değer girme

            int z = x + y;

            Console.WriteLine(x);
            Console.WriteLine(y);
            Console.WriteLine(z);

            Console.ReadKey();
        }

ve sonuç

Değişkenlerimize ne olduğu belirsiz isimler yerine anlamlı isimler de verebiliriz ki böyle yapılması daha doğru olur. Mesela yaşımızı ifade eden yaş adında bir değişken,

            int yaş = 56;

            Console.WriteLine("Yaşınız : " + yaş + ".");

sonuç

Burada konsola yazdırırken biraz düzenleme yaptık. Yazılacak birden fazla yazıyı aralarına toplama işareti koyarak yanyana yazdırabiliriz. Dikkat etmemiz gereken şey tırnak içinde yazdıklarımız aynen yazdırılıyor ama değişken değerlerinin yazılmasını istiyorsak tırnak içinde değil direk değişken adını yazmalıyız. Mesela 

            int yaş = 56;

            Console.WriteLine("Yaşınız : " + "yaş" + ".");

yazarsak sonuç

olacaktır. 

Bir başka değişken tipi de double, tamsayıları değil noktalı sayıları ifade etmek için kullanılır. Örnek olarak boyumuzu ifade etmek için bir değişken kullanalım.

            int yaş = 56;
            double boy = 1.74;

            Console.WriteLine("Yaşınız : " + yaş + ".");
            Console.WriteLine("Boyunuz : " + boy + " metre.");

ve sonuç

Burada çok gıcık olduğum bir nokta var. değeri program içinde verirken 1-nokta-74 diye giriyoruz ama konsolda gösterilirken 1-virgül-74 olarak yazılıyor. Daha ileride göreceğiz bu değeri kullanıcının konsoldan girmesini istediğimizde de kullanıcı nokta değil virgül kullanarak girmek zorundadır. Bu sadece Windows işletim sistemini Türkçe kullananlar için geçerli bir koşul. İngilizce kullananlar yazarken de , konsola yazdırırken de, konsoldan değer girerken de hep nokta kullanıyorlar.

Bu karışıklığa sebep olan kişi ilk Türkçe klavye tasarlanırken Microsoft'a nümerik pad'de biz virgül kullanıyoruz diyen kişidir. Allah onu nasıl biliyorsa öyle yapsın, bazen Türkçe karakter kullanmaktan bile büyük sorunlara sebep oluyor. Programlarda bir sürü ilave kod yazmak zorunda kalıyoruz. İşletim sistemi İngilizce ise başka Türkçe ise başka çalışan kodlar gerekebiliyor. 

Sıradaki veri tipi bool. Boolean değerler sadece true ya da false olabilir (doğru ya da yanlış). Mesela bir kişinin online olup olmadığı bu tip bir değişkene kaydedilebilir, ya da mesela yaşıyor olup olmadığı. 

            int yaş = 56;
            double boy = 1.74;
            bool yaşıyor = true;

            Console.WriteLine("Yaşınız : " + yaş + ".");
            Console.WriteLine("Boyunuz : " + boy + " metre.");
            Console.WriteLine("Yaşıyor musunuz? : " + yaşıyor + ".");

ve sonuç

bool değişkenlere sadece true ya da false değerleri verilebilir başka bir değer vermeye kalkarsak programımız hata verecektir. Sıradaki değişken tipimiz char. Sadece tek bir karakteri ifade eder, değer girilirken tek tırnak içinde verilir. Diyelim bir sembol karakterimiz olsun.

            int yaş = 56;
            double boy = 1.74;
            bool yaşıyor = true;
            char sembol = '@';

            Console.WriteLine("Yaşınız : " + yaş + ".");
            Console.WriteLine("Boyunuz : " + boy + " metre.");
            Console.WriteLine("Yaşıyor musunuz? : " + yaşıyor + ".");
            Console.WriteLine("Sembolünüz : " + sembol);

sonuç

Bir defa daha söyleyelim C#'ta karakterler ifade edilirken tek tırnak içinde yazılırlar. 

String tipi veriler birden çok karakterin birleşmesi ile oluşan yazılardır. 

            int yaş = 56;
            double boy = 1.74;
            bool yaşıyor = true;
            char sembol = '@';
            String isim = "Ümit";

            Console.WriteLine("Merhaba " + isim);
            Console.WriteLine("Yaşınız : " + yaş + ".");
            Console.WriteLine("Boyunuz : " + boy + " metre.");
            Console.WriteLine("Yaşıyor musunuz? : " + yaşıyor + ".");
            Console.WriteLine("Sembolünüz : " + sembol);

String yazarken ilk harfinin büyük olmasına dikkat edelim. String değerler ifade edilirken çift tırnak içinde yazılırlar. String bir değer verirken sadece tek bir karakter olarak da değer girilebilir ama bu o değişkeni karakter tipi yapmaz, çünkü tipini en başta String olarak tanımladık bir kere. Programı çalıştıralım

Diyelim sembol ve isimi birleştirerek bir kullanıcı adını username isimli değişkende hesaplayalım.

            Console.WriteLine("Yaşıyor musunuz? : " + yaşıyor + ".");
            Console.WriteLine("Sembolünüz : " + sembol);

            String username = sembol + isim;
            Console.WriteLine("Kullanıcı adınız : " + username);

ve sonuç

Değişkenler hakkında şimdilik bu kadar. Değişkenleri içinde bir şeyler saklanan küçük çekmecelere benzetebiliriz. Üzerlerinde de bir etikette değişken adı yazıyor. Lazım oldukça çekmeceyi açıp değeri okuyorsunuz ya da başka bir değer koyuyorsunuz. 


C# Sabitleri (Constant)

Sabitler değerleri değiştirilemeyen değişkenler olarak düşünülebilir. Değerleri program içinde verilir ve program çalışırken bir daha değiştirilemez. Bu açıdan düşününce az önceki örnekte verdiğimiz yaş, boy vs. değişkenler daha sonra değeri değişmediği için ve bir kez değer verildiği için sabit de olabilirdi. Ancak username değişkeni bir işlem sonucunda program çalışırken değeri hesaplandığı için sabit olarak düşünemeyiz. Sürekli kullanacağımız ama değeri değişmeden kalacak bir değeri program içinde sürekli yazmaktansa bir sabit olarak isim vererek kullanabiliriz. 

Örneğin pi sayısını hesaplarımızda kullanacağımız bir kodumuz olsun.

        static void Main(string[] args)
        {
            double pi = 3.14159;

            pi = 400;

            Console.WriteLine(pi);

            Console.ReadKey();
        }

Burada pi değişken olarak ifade edildi ve tabi ki sonradan değeri değiştirilebilir. Burada arka arkaya işlem yapıldığı için hemen değişiklik yapıldığını görebiliyoruz. Ama binlerce satırlık kod içinde yanlışlıkla sabit olması gereken değer biz ya da programa müdahale eden başka biri tarafından değiştirilebilir. Bu değişikliğin yapılmasını engellemek için pi değerini sabit olarak tanımlamalıyız. Bunu tanımlama başına const kelimesi ekleyerek yaparız.

            const double pi = 3.14159;

Şimdi programı çalıştırmaya kalkarsak değer değiştirilmeye çalışılan satırda hata verecektir. 

Visual Studio değer değiştirilmeye çalışılan satırda pi yazısı altına bir kırmızı çizgi çekerek bizi daha programı yazarken uyarıyor. Kursörü üzerine götürürsek de resimdeki gibi eşitliğin sol tarafında değişken bir şey olması gerektiğini söylüyor. 


C# Veri Tipi Değiştirme (Type Casting)

Veri tipini değiştirme (ya da tam anlamıyla dönüştürme) program yazarken çok gereken bir işlem. Mesela kullanıcı konsoldan bir değer girerse bunun karşılığı bir String tipi değerdir. Ama biz sayısal değerlerin de konsoldan girilmesini isteyebiliriz. Bu durumda girilen String değeri sayısal değerlere dönüştürmemiz gerekecektir. Aynı şekilde int bir değeri matematik işlem yaparken double bir değere ya da tersi bir dönüştürme de gerekebilir. 

Dönüştürme işlemlerinde Convert sınıfının metodları kullanılır. Örnek olarak bir değeri int bir değere dönüştürmek için ToInt32() metodu kullanılır.

        static void Main(string[] args)
        {
            double a = 3.14;
            int b = Convert.ToInt32(a);

            Console.WriteLine(b);

            Console.ReadKey();
        }

çalıştıralım

Convert.ToInt32(a) komutu ile a değişkeni değeri olan 3.14 değeri int değere dönüştürülünce noktadan sonraki kısmı atılıp sadece 3 değeri kalıyor. a değişkeni bu esnada hala eski değerini saklıyor. 

Ayrıca bir değerin veri tipini de GetType() metodu kullanarak yazdırabiliriz.

            Console.WriteLine(a);
            Console.WriteLine(a.GetType());
            Console.WriteLine(b);

sonuç

a değişkeni veri tipini System.Double yazdı. Hani programın en üstünde using System yazarak programımıza dahil edilen System ana sınıfının bir üyesiymiş meğer bizim double dediğimiz. 

Şimdi de int bir değeri double'a dönüştürelim.

            int c = 123;
            double d = Convert.ToDouble(c);

            Console.WriteLine(d);

ve sonuç

Direk olarak double yaptığımız için noktadan sonrası gösterilmiyor ama mesela dönüştürülen değere 0.1 eklersek,

            int c = 123;
            double d = Convert.ToDouble(c) + 0.1;

            Console.WriteLine(d);

sonuç virgülden sonrasını da gösterecektir.

int bir değeri String değere de dönüştürebiliriz.

            int e = 321;
            String f = Convert.ToString(e);

            Console.WriteLine(f);

ve sonuç

Bir int değeri String değere dönüştürdükten sonra matematik işlemde kullanamayız. Yanlış anlamayın e değişkenini değil dönüştürülmüş olan f değerini matematik işlemlerde kullanamayız. Ama tersine String bir değeri int değere dönüştürürsek matematik işlemlerde kullanabiliriz. 

String değer tek karakterden oluşuyorsa onu char değere dönüştürebiliriz.

            String g = "$";
            char h = Convert.ToChar(g);

            Console.WriteLine(h);

ve sonuç

Ama birden fazla karakterden oluşan bir String değeri char değere dönüştürmeye kalkarsak programımız hata verip dönüştürme satırında duracaktır. Örnek

            String g = "$a";
            char h = Convert.ToChar(g);

            Console.WriteLine(h);

hata mesajı şöyle olur

Diyor ki, String sadece bir karakter uzunluğunda olmalıdır. Program yarıda kesildiği için yukarıda kırmızı okla gösterdiğim stop butonuna basıp çalışmayı durdurmalıyız.

String bir değerden bool değere dönüştürme yapalım. 

            String i = "true";
            bool j = Convert.ToBoolean(i);

            Console.WriteLine(j);

sonuç

Dikkat edelim String değer çift tırnak içinde verilir, eğer

            String i = true;

yazarsak hatalı olacaktır

Visual Studio IDE'miz daha programı çalıştırmadan bizi uyarıyor.


C# Konsoldan Değer Okunması

Yazdığımız programlar çoğunlukla kullanıcı ile iletişime girer. Kullanıcının bazı değerleri girmesini isteriz. Bu girilen değerler programımıza String değerler olarak geleceğinden yukarıda gördüğümüz dönüştürme işlemlerini bu kullanıcı etkileşimlerinde bol bol kullanacağız. 

Diyelim kullanıcıdan ismini girmesini isteyeceğiz. Bu sefer işimiz kolay okunacak değer zaten String olacak. Konsoldan girilen değer kullanıcı enter tuşuna bastığında Console.ReadLine() metodu ile okunur. Program çalışırken bu komuta gelince olduğu yerde kalır ve enter basılana kadar girilen karakterleri bir String değer olarak hafızaya alır. Enter basılınca metod biriktirdiği String'i cevap olarak verir. Örnek

        static void Main(string[] args)
        {
            String isim = Console.ReadLine();

            Console.WriteLine("İsminiz : " + isim);

            Console.ReadKey();
        }

çalıştırıp adımızı yazıp enter basınca sonuç

Ama sanki biraz eksik oldu. Kullanıcının önüne boş bir konsolda kursörü verdik. Ne gireceğini nasıl bilecek. Hangi bilgiyi istediğimizi de belirtsek iyi olur.

            Console.WriteLine("Lütfen adınızı girin:");
            String isim = Console.ReadLine();

            Console.WriteLine("Merhaba " + isim);

ve sonuç

Böyle daha doğru oldu. Bir de program yazarken kullanıcıya hitaplarımızda kibar olmalıyız. Öyle "adınız?" falan gibi ifadeler kullanmamalıyız. 

Şimdi de kullanıcıdan yaşını girmesini isteyelim. Bu sefer bir veri tipi dönüştürmesi yapmamız gerekiyor.

            Console.WriteLine("Lütfen adınızı girin:");
            String isim = Console.ReadLine();

            Console.WriteLine(isim + " yaşınız kaç?:");
            int yaş = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine("Merhaba " + isim);
            Console.WriteLine("Yaşınız " + yaş);

Console.ReadLine() metodu girilen değeri String olarak veriyor sonra bunu Convert.ToInt32() metoduna parametre olarak vererek int değere dönüştürüyoruz. 

Program akışını gözümüzde canlandırmaya çalışalım. 

            int yaş = Convert.ToInt32(Console.ReadLine());

satırına gelince program soldan başlıyor önce int değişken olarak yaş değişkeni tanımlanıyor, sonra eşittir işareti yaş değişkenine bir değer atanacağını bildiriyor. Atanacak değer eşittir işaretinin sağ tarafındaki işlemlerin sonucu. Orada ne var bir Convert metodu. Metod işletilmeye başlanıyor ama bakılıyor parametresinde direk bir değer değil yine bir işlem var bu da konsoldan değer okuma işlemi. Önce bu işleme gidiliyor ve değer okunuyor geri dönen String değer Convert işleminin parametresi oluyor ve tip dönüştürme yapılıyor. Artık int olan sonuç da yaş değişkenine yazılıyor.

Zaman içinde kendimizi bilgisayar yerine koyup programın nasıl çalıştığına dair fikir yürütmek çok iyi bir antreman olacaktır. Biz üniversiteye giderken (yaklaşık 40 sene önce) program yazacağımız bilgisayar yoktu, her şeyi kafamızda çalıştırırdık. Sonra da çalışırdı , çalışmazdı diye tartışır dururduk. Önünüzdeki cihazın kıymetini bilin.

Neyse konumuza dönelim. Peki kullanıcı yaşı sorulduğunda bir tamsayıya dönüştürülebilecek değer girmezse ne olur? Bu durumda program bir hata verir buna exception denir (istisna-i durum). Yaş sorulduğunda konsoldan mesela bir yazı girerek enter basalım ve deneyelim,

System.FormatException istisnası oluşmuş. Buna niye error değil de exception diyorlar? Çünkü beklenmedik bir şey oldu ama bunu yazılımla da kurtarmak ve programın çökmesini engellemek mümkün. Ama bu sonra işleyeceğimiz bir konu. 


C# Temel Aritmetik İşlemler

Basit bir örnekle başlayalım.

        static void Main(string[] args)
        {
            int arkadaşlar = 5;
            arkadaşlar = arkadaşlar + 1;

            Console.WriteLine(arkadaşlar);

            Console.ReadKey();
        }

Basit derken yine yeni başlayanlar için kafa karıştırabilecek bir şey yaptık. 

            arkadaşlar = arkadaşlar + 1;

Bu ne demek bir değer kendisinin 1 fazlasına eşit olabilir mi? Tabi bunu x = x + 1 gibi matematik denklemi olarak düşünürsek olmaz. Ama bu bir program satırı ve oradaki şey bir eşitlik değil bir atama. Yani arkadaşlar değişkenine bir değer atanacak. Ne atanacak? Eşittir işaretinin sağındaki işlem ya da işlemlerin sonucu. Eşittir işaretinin sağında ne var? arkadaşlar + 1 . Bu işlem yapılırken arkadaşlar değeri ne? En son 5 değeri vermiştik. Yani 5 + 1 olacak ve işlemin sonucu 6 olacak. Eşittir işaretinin sağındaki işlemlerin sonucu 6 olduğu için bu değer arkadaşlar değişkenine atanacak ve sonraki satıra geçilecek. Bu durumda programı çalıştırınca konsola 6 yazılacak. Kısaca 

            x = arkadaşlar + 1;
            arkadaşlar = arkadaşlar + 1;

Satırları sonunda x değeri de arkadaşlar değeri de 6 olacaktır. Kafanızı karıştırmamış olmayı umuyorum. Değeri 2 arttırmak istersek

            arkadaşlar = arkadaşlar + 2;

yazarız. Değer arttırma ve azaltma gibi aynı değişken değerini kullanarak yapılan işlemler için aslında bir kısaltma var.

            //arkadaşlar = arkadaşlar + 2;
            arkadaşlar += 2;

+= 2 yazarak da aynı arttırma işlemini yapabiliriz, böylece değişken adını 2 defa yazmamıza gerek kalmaz. Benzer şekilde -= 2 değeri 2 eksiltir, *= 2 değeri 2 katı yapar, /= 2 değeri yarısı yapar. 

Değeri sadece 1 arttırmak ya da eksiltmenin se daha da kısa bir yolu var.

            //arkadaşlar = arkadaşlar + 2;
            //arkadaşlar += 2;
            arkadaşlar++;

hemen değişken adına bitişik ++ değerini 1 arttırır, -- değerini 1 eksiltir. ** ve // başka anlamlara sahip. Mesela // yoruma geçirir. 

Çarpma işlemi için * işareti kullanılır. Mesela 

            arkadaşlar = 7 * 2;
            arkadaşlar = arkadaşlar * 2;
            arkadaşlar *= 2;

son 2 satır aynı işlemi yapar. Bölme işlemleri içinse / işareti kullanılır. Örnek

            arkadaşlar = 7 / 2;
            arkadaşlar = arkadaşlar / 2;
            arkadaşlar /= 2;

Bölmede tamsayı bölmesi yapılır. 7 / 2 işleminin tamsayı bölümü sonucu 3 olacaktır. 3.5 bir tamsayı değil, virgülden önceki tamsayı kısmı sonuç olarak alınır. Eğer başta sayıyı double olarak tanımlarsak

            double arkadaşlar = 5;

            arkadaşlar = arkadaşlar / 2;

            Console.WriteLine(arkadaşlar);

sonuç

ama 

            arkadaşlar = 7 / 2;

işleminin sonucu yine tamsayı bölmesi olacak ve 3 yazacaktır. Çünkü double sayılar işlemlerde bu şekilde yazılmaz. Virgülden sonrası olmasa bile 7.0 / 2.0 gibi noktalı yazılmalıdır.

            arkadaşlar = 7.0 / 2.0;

şeklinde yazılır. Bir şey daha belirtelim 

            arkadaşlar = 7.0 / 2;

yazarsak yine double bölme işlemi yapılacaktır. Sayılardan biri double olduğundan ikinci sayı tamsayı gibi yazılmasına rağmen işlem double değerler üzerinden yapılır. Yani

            arkadaşlar = 7 / 2.0;

da bize 3.5 sonucu verir. Son işlemimiz modulus işlemi. Bir tamsayı bölümden kalanı hesaplar ve % işareti ile yapılır. Örnek

            int arkadaşlar = 10;

            int kalan = arkadaşlar % 3;

            Console.WriteLine(kalan);

kalan değeri 10 sayısının 3'e bölümünden artan 1 değeri olacaktır. Modulus işlemi sayının 2'ye bölümünden kalan olduğu düşünüldüğünde sayının tek mi, çift mi olduğunu belirlemekte kullanılabilir. Kod yazarken bir çok kez ihtiyaç duyulabilen bir işlemdir.


C# Math Sınıfı

Math sınıfı içinde birçok özel matematik metodlarını barındıran bir kütüphanedir. Bir sayının üslerini hesaplamak için kullanılan Pow metodu ile başlayalım (power kısaltması).

        static void Main(string[] args)
        {
            double x = 3;

            double a = Math.Pow(x, 2);

            Console.WriteLine(a);

            Console.ReadKey();
        }

Programı yazarken Math yazdıktan sonra noktaya bastığımızda karşımıza bu sınıfın metodları listesi yardım penceresinde çıkacaktır. Ne kadar çok metod var, bazılarını isimlerinden tahmin edebiliriz.  Math.Pow() metodu 2 tane parametre alıyor ilki üssü alınacak değer ki bizim burada x değeri oluyor. İkinci parametre ise sayının kaç üssü alınacağı. Burada değer 2 yani sayının karesi alınacak ve sonuç 9 olacaktır. Üs parametresi tamsayı olmak zorunda değil 

            double a = Math.Pow(x, 2.5);

de olabilir mesela. 

            double a = Math.Pow(x, -0.5);

şeklinde eksi bir üs değeri de olabilir. Bir sayının karekökünü de şöyle hesaplarız,

            //double a = Math.Pow(x, -0.5);
            double b = Math.Sqrt(x);

            Console.WriteLine(b);

Math.Sqrt() metodu parametresinde verilen sayının karekökünü hesaplar (Squareroot). Verilen sayının mutlak değerini hesaplayan metod,

            double x = -13;

            double c = Math.Abs(x);

            Console.WriteLine(c);

cevap 13 olacaktır (absolute value). Sayının virgülden sonrasını yuvarlayalım,

            double x = 3.14;

            double d = Math.Round(x);

            Console.WriteLine(d);

cevap 3 olacaktır. Math.Round() metodu bir yuvarlama metodudur (rounding), yani değer yukarıdaki örnekte 3.5 ya da daha yüksek olursa 4 e yuvarlayacaktır. 3.14 değeri 3.5 ten küçük olduğu için aşağıya yani 3 e yuvarlanır.  Her zaman yukarı yuvarlama istersek ceiling metodu kullanırız.

            double x = 3.14;

            double e = Math.Ceiling(x);

            Console.WriteLine(e);

Bu metod sayıyı bir üst tamsayı değere yuvarlar. Yukarıdaki örnekte sonuç 4 olacaktır. Tersi olarak aşağı yuvarlayan da floor metodudur,

            double x = 3.99;

            double f = Math.Floor(x);

            Console.WriteLine(f);

bu kodun sonucu 3 değerini yazar. Ceiling = Tavan ve Floor = Taban demektir Türkçe'de. 

Çok kullanılan bir işlem 2 sayıdan büyük olanı seçmek,

            double x = 3.99;
            double y = 5;

            double g = Math.Max(x, y);

            Console.WriteLine(g);

Math.Max(x, y) metodu parametresinde verilen 2 sayının büyük olanının değerini cevap olarak döner. Örnekte x değişkenine mesela 5.5 değeri versek bu sefer x değeri daha büyük olduğu için metoddan cevap olarak 5.5 değeri dönecektir. Küçük olan değeri bulmak için de Min() metodu kullanılır. 

            double x = 3.99;
            double y = 5;

            double h = Math.Min(x, y);

            Console.WriteLine(h);

En temel metodları ve yine en temel C# kodlama tekniklerini öğrendik. İlk kısmı burada bitirelim sonraki bölümlerde daha ileri kodlama teknikleri göreceğiz. 

Görüşmek üzere kalın sağlıcakla..

Sonraki bölüm https://ujk-ujk.blogspot.com/2023/02/c-temelleri-2.html



Hiç yorum yok:

Yorum Gönder