bilgiz.org

C# İle biLGİsayar programlama temelleri (C# Programlama Kitabı) Svetlin Nakov & Co




Sayfa9/31
Tarih02.07.2017
Büyüklüğü3.36 Mb.

Indir 3.36 Mb.
1   ...   5   6   7   8   9   10   11   12   ...   31


Örneğin Windows konsolu başlatıldığında, etkileşimli modda sistem programlarını ve komutları yürüten Windows komut yorumlayıcısını (cmd.exe) çalıştırırız. Örneğin, dir komutu geçerli dizin içindeki dosyaları gösterir:


4.2.4 Temel Konsol Komutları
Windows standart komut istemindeki programları bulmak ve başlatmak için yararlı olan bazı temel komutlara göz atacağız.

4.2.4.1 Windows Konsol Komutları
Konsolda çalışan komut yorumlayıcısı "Komut İstemi" veya "MS-DOS Komut İstemi" (Windows'un eski sürümlerinde) olarak adlandırılır. Bu yorumlayıcı için bazı temel komutlara bir göz atacağız:

Komut

Açıklama

Dir

Geçerli dizinin içeriğini gösterir.

cd

Geçerli dizini değiştirir.

mkdir

Geçerli dizinde yeni bir dizin oluşturur.

rmdir

Varolan bir dizini siler.

type

Dosya içeriğini görüntüler.

copy


Bir dosyayı başka bir dosya içine kopyalar.


Windows’un komut kabuğu tarafından çalıştırılan birden fazla komuta bir örnek aşağıda verilmiştir. Çalıştırılan komutların sonucu konsolda görüntülenir:

C:\Documents and Settings\User1>cd "D:\Project2009\C# Book"
C:\Documents and Settings\User1>D:
D:\Project2008\C# Book>dir

Volume in drive D has no label.

Volume Serial Number is B43A-B0D6
Directory of D:\Project2009\C# Book
26.12.2009 12:24

.

26.12.2009 12:24

..

26.12.2009 12:23 537 600 Chapter-4-Console-Input-Output.doc

26.12.2009 12:23

Test Folder

26.12.2009 12:24 0 Test.txt

2 File(s) 537 600 bytes



3 Dir(s) 24 154 062 848 bytes free
D:\Project2009\C# Book>

4.3 Standart Girdi-Çıktı
"Standart G/Ç" olarak da bilinen standart girdi-çıktı yıllar önce geliştirilen UNIX işletim sistemlerinden bu yana oluşturulmuş bir sistem giriş-çıkış mekanizmasıdır. Giriş ve çıkış için verilerin girdi ve çıktı olabileceği özel çevresel aygıtlar kullanılır.
Program, bilgi kabul modundayken ve kullanıcıdan eylem bekliyorsa, sistemin komut girilmesini bekliyor olduğunu gösteren konsolda yanıp sönen bir imleç vardır.
Konunun ilerisinde konsoldan veri girişi girilmesini bekleyen C# programlarını yazmayı öğreneceksiniz.

4.4 Konsola Yazdırma
Yazdırma ve konsoldan bilgi okuma çoğu programlama dillerinde benzer şekillerde uygulanmaktadır ve çözümlerin çoğu "standart girdi" ve "standart çıktı" kavramına dayanmaktadır.

4.4.1 Standart Giriş ve Standart Çıkış
İşletim sisteminin kullanıcı etkileşimi için standart giriş-çıkış mekanizmasını tanımlaması gereklidir. Belirli bir konsol programını başlatırken, programın ilk kullanıma hazırlanması sırasında çalışan sistem kodu sürekli iletim halinde gönderilip okunabilen veri akımlarının giriş-çıkış için işletim sistemi mekanizmaları tarafından tahsis edilmesi için açılmasından (kapanmasından) sorumludur. Bu sistem kodu ilgili programlama dilinde gömülü kullanıcı etkileşimi için program soyutlamasını ilk kullanıma hazır hale getirir. Bu şekilde başlayan uygulama otomatik olarak standart girdi akımından kullanıcı girişini okuyabilir, (C# dili için bu Console.In), standart çıkış akışına bilgileri yazdırır, (C# dili için bu Console.Out), ve standart hata akışında problem durumları için sinyal verebilir (C# dili için bu Console.Error).
Akım kavramı daha sonra detaylı olarak ele alınacaktır. Şimdilik C# dilinde program girişi ve çıkışına ilişkin teorik temel üzerinde durulacaktır.

4.4.2 Konsol Girdi ve Çıktı İçin Aygıtlar
Klavyenin yanı sıra bir uygulama girdisi, dosya, mikrofon, barkod okuyucu ve diğerleri gibi pek çok başka yerden gelebilir. Bir programın çıkışı (ekranda) konsol üzerinde olabileceği gibi, bunun yanı sıra bir dosya veya yazıcı gibi bir başka çıkış aygıtı da olabilir.

C# tarafından bize sağlanan standart girdi ve standart çıktıya erişmek için soyutlama yoluyla konsola metin yazdırmayı gösteren bir örnek göstereceğiz:

Console.Out.WriteLine("Hello World");


Kodun yukarıdaki gibi çalıştırılmasının sonucu şu olacaktır:

Hello World



4.4.2 Console.Out Akımı
System.Console sınıfının farklı özellikleri ve yöntemleri vardır (sınıflar "Nesneleri Oluşturma ve Kullanma" Bölümü’nde detaylı olarak dikkate alınacaktır). Bunlar konsoldan okumak ve metin biçimleyerek konsol üzerinde metin görüntülemek için kullanılırlar. Aralarında etki yapan üç özellik vardır ve bunlar verileri girme ve görüntüleme ile ilgilidir, yani Console.Out, Console.In ve Console.Error. Onlar sırasıyla, konsola yazdıran, konsoldan okuyan, ve hata mesajlarını raporlayan standart akımlara erişim sağlar.  Onları doğrudan kullanabiliyor olmamıza rağmen, System.Console sınıfının diğer yöntemleri de giriş-çıkış konsol işlemleri ile çalışmak için bize kolaylık verir ve aslında en sık bu özellikler göz ardı edilir. Ancak konsol işlevselliğinin bu kısmının bu standart akımlar üzerinde çalıştığını hatırlamak iyidir. Fakat gerekirse de, varsayılan giriş/çıkış/hata akımları çalışma zamanında, sırasıyla, Console.SetIn(...), Console.SetOut(...) ve Console.SetError(...) yöntemlerini kullanarak değiştirilebilir.
Şimdi konsolda metin yazdırmak için en sık kullanılan yöntemleri inceleyeceğiz.
4.4.3 Console.Write(…) ve Console.WriteLine(…) Kullanımı
Bu yöntemler ile çalışmak kolaydır, çünkü hepsi temel türleri (dize, sayısal ve temel türleri) yazdırabilir.
İşte veri yazdırmak için çeşitli bazı örnekler:

// Print String

Console.WriteLine("Hello World");


// Print int

Console.WriteLine(5);


// Print double

Console.WriteLine(3.14159265358979);




Bu kodun çalıştırılmasının sonucu şöyle görünüyor:

Hello World

5

3.14159265358979




Gördüğünüz gibi, Console.WriteLine(...) kullanılarak çeşitli veri türlerini yazdırmak mümkündür, çünkü her bir tür için Console sınıfının içindeki WriteLine(...) metotunun önceden tanımlanmış bir gerçekleştirimi ve sürümü vardır. Write(...) ve WriteLine(...) arasındaki fark Write(...) yöntemi parantez arasında ne görünüyorsa konsolda onu yazdırır, ancak buna ek olarak hiçbir şey yapmaz. Öte yandan WriteLine(...) yöntemi doğrudan "satırı yazdır" anlamına gelir. Bu yöntem Write(...) ne yapıyorsa onu yapar, ancak ek olarak yeni bir satıra gider. Aslında yöntem, yeni bir satır yazdırmaz, sadece yeni satırın başladığı konuma imleci hareket ettirmek için bir "komut" koyar (bu komut \r karakterini takiben \n karakterinden oluşur).
Write(...) ve WriteLine(...) arasındaki farkı gösteren bir örnek aşağıda verilmiştir:


Console.WriteLine("I love");

Console.Write("this ");

Console.Write("Book!");



Bu örneğin çıktısı şöyledir:

I love

this Book!




Kod üç satır üzerinde yazılmış olmasına rağmen, bu örneğin çıktısının iki satır üzerinde basılı olduğunu fark ediyoruz. Kodun ilk satırında WriteLine(...) kullanımı nedeniyle “I love” yazılır ve sonra yeni bir satıra gider. Kodun sonraki iki satırı Write(...) metotunu kullanıyor yeni bir satıra gitmeden yazdırır ve böylece kelime "this" ve "Book!" kelimeleri aynı satırda kalır.

4.4.3.1 Dizeleri Bitiştirme
Genelde C# string nesneleri üzerinde işleçlerin kullanımına izin vermez. Bu kuralın tek istisnası iki dizeyi bitiştiren (peş peşe ekleyen) ve sonuç olarak yeni dizeyi döndüren toplama işlemi (+) dir. Bu (+) işlemlerinin zincirleme bir sırayla birbiri ardına birleştirilmesini sağlar. Bir sonraki örnek üç dizeyi bitiştirmeyi gösteriyor.

string age = "twenty six";

string text = "He is " + age + " years old.";

Console.WriteLine(text);



Bu kodun çalıştırılmasının sonucu yine bir dizedir:


He is twenty six years old.



4.4.3.2 Karışık Türlerin Bitiştirilmesi
Farklı türlerden oluşan büyük ve daha karmaşık metinleri yazdırmak istediğiniz zaman ne olur? Şimdiye kadar belirli bir türü yazdırmak için WriteLine(...) metotunun sürümlerini kullandık. Aynı anda farklı türleri yazdırmak istediğinizde, bu türlerin her biri için, WriteLine (...) metotunun farklı bir versiyonunun kullanılması gerekli midir? Bu sorunun cevabı "hayır" olacaktır, çünkü C# dilinde biz "+" işlecini kullanarak metin ve diğer verileri (örneğin, sayısal) birleştirebiliriz. Aşağıdaki örnek önceki gibidir, ancak yıl (age) tamsayı türündedir.

int age = 26;

string text = "He is " + age + " years old.";

Console.WriteLine(text);



Bu örnekte gerçekleştirilen bitiştirme ve ekran üzerinde yazdırmadır. Örnek sonucu aşağıdadır:

He is 26 years old.


Örnek kodun ikinci satırında "He is" dizesi ile tamsayı türündeki "age" değişkeninin bitiştirildiğini görüyoruz. İki farklı türü birleştirmek için çalışıyoruz. Bu aşağıdaki önemli kural varlığı mümkündür.



Bir dize başka bir tür ile birleştirildiğinde sonuç her zaman bir dizedir.


Kuraldan "He is" + age sonucunun yine bir dize olduğu açıktır ve daha sonra sonuç ifadesinin son kısmına “ years old.” eklenir. Yani + işleçlerinin zincirleme çağrılmasından sonra nihayetinde sonuç bir dizedir ve böylece WriteLine(...) metotunun dize sürümü çağrılır.
Kısacası yukarıdaki örnek aşağıdaki gibi yazılabilir:

int age = 26;

Console.WriteLine("He is " + age + " years old.");




4.4.3.3 Dizeleri Bitiştirmenin Bazı Özellikleri
Dizeleri bitiştirme (toplama) ile ilgili bilmeniz ve çok dikkatli olmanız gereken bazı ilginç durumlar vardır, çünkü hatalara yol açabilirler. Aşağıdaki örnek kodda şaşırtıcı bir davranış ile karşılaşacaksınız:


string s = "Four: " + 2 + 2;

Console.WriteLine(s);

// Four: 22
string s1 = "Four: " + (2 + 2);

Console.WriteLine(s1);

// Four: 4




Örnekten görüldüğü gibi işleçlerin çalışma sırası (bkz. “İşleçler ve İfadeler” Bölümü) büyük önem taşımaktadır! İlk örneğimizde "Four:" ve "2" birleştirmesi yapılır ve işlemin sonucu dizedir. Daha sonra ikinci sayı ile başka bir birleştirme gerçekleştirilir ve elde edilen beklenmedik sonuç beklenen "Four: 4" yerine "Four: 22" dir. Çünkü bu işlemlerin soldan sağa doğru yapılmasındandır ve bu senaryoda her bir işleme bir dize katılmıştır.
Bu tatsız durumu önlemek için ve istenen sonucu elde etmek için işleçlerin çalışma sırasını değiştirecek parantezleri kullanabilirsiniz. Parantez içindeki işleçler en yüksek önceliğe sahiptir ve iki sayının “toplama” işleminin çalıştırılmasının soldaki dize ile birleştirme öncesinde yapılmasını sağlar. Böylelikle ilk önce iki sayının toplaması yapılır ve sonra dize ile birleştirilir.
Bu hata acemi programcılar arasında çok yaygındır çünkü dize birleştirmenin soldan sağa doğru yapıldığı düşünülmez, çünkü sayıların toplaması da birleştirme gibi aynı önceliğe sahiptir.



Dizeleri bitiştirdiğiniz ve ayrıca sayıları topladığınız zaman, işlemlerin doğru sırasını belirlemek için parantez kullanın. Aksi halde soldan sağa doğru çalıştırılacaktır.


4.4.4 Write(…) ve WriteLine(…) ile Biçimli Çıktı
Uzun ve ayrıntılı bir eleman serisini yazdırmak için Write(...) ve WriteLine(...) yöntemlerine özel seçenekler (ayrıca aşırı yüklenme olarak da bilinir) getirilmiştir. Bu seçeneklerin C# dilinde yazdırmak için standart yöntemlerden tamamen farklı bir kavramı vardır. Ana fikir olarak özel biçimlendirme karakterleri ile biçimlendirilmiş özel bir dize kabul ederler, ve "biçim belirteçleri" yerine ikame etmesi gereken bir değerler listesi alırlar. İşte standart C# kütüphanelerindeki Write(...) tanımı:

public static void Write(string format, object arg0,

object arg1, object arg2, object arg3, …);





4.4.4.1 Biçimli Çıktı – Örnekler
Aşağıdaki örnek, aynı şeyi farklı şekillerde ancak iki kez yazdırır:

string str = "Hello World!";
// Print (the normal way)

Console.Write(str);


// Print (through formatting string)

Console.Write("{0}", str);




Bu örneğin çalıştırılmasının sonucu şöyledir:

Hello World!Hello World!


"Hello World!" sonucunu iki kez bir satırda görüyoruz, çünkü programda yeni bir satır hiçbir yazdırma olmamasıdır.
Önce diğer yaklaşımla farkı görmek için iyi bilinen bir yolla dizeyi yazdırıyoruz. İkinci baskı Write(...) biçimlendirmesidir ve ilk argüman biçim dizesidir. Bu durumda {0} biçimlendirme dizesinden sonra ilk argümanı {0} yerine koymak anlamına gelir. {0} ifadesi bir tutucu olarak adlandırılır, yani yazdırma sırasında belirli bir değer ile değiştirilecek yer.
Bir sonraki örnek bu kavramı daha fazla açıklayacaktır:


string name = "John";

int age = 18;

string town = "Seattle";

Console.Write(



"{0} is {1} years old from {2}!\n", name, age, town);


Bu örneğin çalıştırılmasının sonucu şöyledir:

John is 18 years old from Seattle!


Bu Write(...) sürümünün işaretinden görüleceği gibi ilk argüman biçim dizesidir. Kıvırcık parantez içerisindeki sayılara yerleştirilen bir dizi argüman izler. {0} ifadesi yerine biçim dizesi sonrasındaki ilk argümanın (bu durumda name) konulması anlamına gelir. Sonraki {1} yerine ikinci argümanı (age) koymak anlamına gelir. Son tutucu {2} bir sonraki parametre (town) ile değiştirmek anlamına gelir. Son olarak yeni bir satıra geçilmesini belirten özel bir karakter \n yazılmıştır.
Aslında Windows için yeni satır komutunun \r\n ve Unix tabanlı işletim sistemleri için \n olduğunu belirtmek yerinde olacaktır. Konsol ile çalışırken sadece \n kullanmamız önemli değildir, çünkü standart giriş akımı \n karakterini \r\n gibi düşünmektedir, ancak örneğin bir dosyaya yazarsanız, sadece \n (Windows üzerinde) yanlış olacaktır.

4.4.4.2 Bileşik Biçimlendirme
Console sınıfının biçimlendirilmiş çıktısını sağlayan yöntemler bileşik biçimlendirme adı verilen özelliği kullanır. Bileşik biçimlendirme konsola yazdırmak için, yanı sıra dizeler ile ilgili bazı işlemlerde kullanılır. Bir önceki örnekte en basit şekilde bileşik biçimlendirme incelenmişti, ancak gördüğümüzden daha anlamlı ve büyük bir potansiyele sahiptir. Temelde bileşik biçimlendirme iki şeyi kullanır: bileşik biçimlendirme dizesi ve dizenin bazı yerlerine değiştirilen bir argümanlar serisi.

4.4.4.2 Bileşik Biçimlendirme Dizesi
Bileşik biçimlendirme dizesi normal bir metin ve biçimlendirme elemanlarının bir karışımıdır. Normal metin dizesi, biçimlendirme içinde olduğu gibi aynı kalır ve biçimlendirme elemanlarının yerleri ilgili argümanların belli kurallara göre yazdırılan değerleri ile değiştirilir. Bu kurallar biçimlendirme elemanlarının sözdizimini kullanarak belirtilir.

4.4.4.2 Biçimlendirme Elemanları
Biçimlendirme elemanları görüntülenen değerlerin güçlü kontrolü için imkan sağlar ve bu nedenle çok karmaşık şekiller alabilir. Aşağıdaki oluşum şeması biçimlendirme elemanlarının genel sözdizimini gösteriyor:

{index[,alignment][:formatString]}


Buradan anladığınız gibi, biçimlendirme elemanının açılışı kıvırcık parantez ile başlar { ve kapanış kıvırcık parantez } ile biter. Parantez arasındaki içerik üç parçaya ayrılmıştır, burada yalnızca endeks bileşeninin zorunludur. Şimdi her bir elemanı ayrı ayrı inceleyeceğiz.

4.4.4.3 Endeks Bileşeni
Endeks bileşeni bir tamsayıdır ve argüman listesindeki argümanın pozisyonunu gösterir. İlk argüman "0", ikincisi "1" ile gösterilir, vb. Bileşik biçimlendirme dizesi tek ve aynı argüman ile ilgili birden fazla biçimlendirme elemanı için olanak sağlar. Bu durumda bu elemanların endeks bileşeni bir olup aynı sayıdır. Argümanların çağrılma sırasında herhangi bir kısıtlama yoktur. Örneğin, aşağıdaki biçimlendirme dizesini kullanabiliriz:

Console.Write(

"{1} is {0} years old from {3}!", 18, "John", 0, "Seattle");




Herhangi bir argümanın biçimlendirme elemanlarının hiçbirisi tarafından başvurulmadığı durumlarda, bu argümanlar basitçe göz ardı edilir ve bir rol oynamaz. Ancak argümanlar listesinden bu tür argümanları kaldırmak iyidir, çünkü gereksiz karmaşıklığa neden olabilir ve karışıklığa yol açabilir.
Tersi durumda, bir biçimlendirme elemanı argümanlar listesinde bulunmayan bir argümana başvurduğunda, bir istisna atılır. Örneğin, biçimlendirme yer tutucusu olarak {4} varsa ve sadece iki argümanlık bir liste verilmesi halinde bu durum oluşabilir.
4.4.4.4 Hizalama Bileşeni
Hizalama bileşeni isteğe bağlıdır ve dize hizalamasını gösterir. Bu bir pozitif veya negatif tamsayıdır ve pozitif değerler sağa – ve negatif değerler sola hizalamayı göstermektedir. Sayı değeri hizalanacak pozisyon sayısını gösterir. Eğer göstermek istediğimiz dize, sayı değerinden daha büyük yada eşit uzunluktaysa, o zaman bu sayı göz ardı edilir. Daha az ise, halbuki, doldurulmamış pozisyonları boşluk ile doldurulur.

Örneğin, aşağıdaki biçimlendirmeyi deneyelim:


Console.WriteLine("{0,6}", 123);

Console.WriteLine("{0,6}", 1234);

Console.WriteLine("{0,6}", 12);

Console.Write("{0,-6}", 123);

Console.WriteLine("--end");




Çıktısı aşağıdaki sonucu verecektir:


123

1234


12

123 --end




Hizalama bileşenini kullanmaya karar verirseniz, yukarıda örnekte de olduğu gibi bir virgül ile endeks bileşeninden ayırmak gerekir.

4.4.4.5 "formatString" Bileşeni
Bu bileşen dizenin özel formatlamasını belirtir. Argümanın türüne bağlı olarak değişir. formatString bileşenlerinin üç ana tipi vardır:


  • sayısal türde argümanlar için

  • tarih türünde argümanlar için (DateTime)

  • numaralandırma türünde argümanlar için (listeli türler)
1   ...   5   6   7   8   9   10   11   12   ...   31






    Ana sayfa


C# İle biLGİsayar programlama temelleri (C# Programlama Kitabı) Svetlin Nakov & Co

Indir 3.36 Mb.