DİZİ KAYIT ADIM ADIM COZUM - SOFTSAM

Breaking

About Software

DİZİ KAYIT ADIM ADIM COZUM

Adım adım Çözüm:

-          İlk önce ana menüyü ekrana yazdıralım.


-          Yapılan secimi değerlendirmek için seçimin hemen altında bir switch yapısı oluşturarak ekrana hangi bölümün seçildiğini yazdıralım

-          Kodu çalıştırıp bakalım. Hangi bölümü seçersek ekrana o bölümün bilgisi yazılıyor. Ancak ana menü görüntüsü de ekranda kalıyor. Ana menü görüntüsünü ekrandan kaldırmak için her bölüm başında bölüm bilgisini yazdırmadan ekranı temizleyelim

-          Buradaki her case bölümü ana menüde verilen bir işlemi temsil etmekte. Bu case içlerini daha sonra dolduracağız. Entere basmak o işlemin tamamlanmasını temsil ediyor. Entere basılınca işlem bitiyor ve program sona eriyor.
Soru her işlemden sonra ana menüye dönülmesini ve ancak çıkış seçildiğinde programın sonlanmasını istiyor. O zaman biz, bütün işlemi çıkış seçilinceye kadar tekrarlatmalıyız. Tekrarlama işlemini, bütün bu işlemleri bir döngü içerisine alarak yapabiliriz. Ana menü seçimi aSec değişkeninde saklanıyor o halde oluşturacağımız döngü aSec, 4 olmadığı müddetçe bütün işlemi tekrarlamalı ve aSec 4 olunca döngüden çıkılmalıdır.
Her halukarda menü bir kere görüntüleneceği için tekrarlama işlemi ne en uygun döngü yapısı do-while döngüsüdür. While kısmında vereceğimiz şartta (aSec!=4) olacaktır
-          Ana menünün hemen başında döngü bloğumuzun başını oluşturalım


-          Ana menü işlemlerinin en sonunda da döngü bloğumuzu kapatalım


-          Şuana kadar yaptıklarımızı çalıştırıp menü sistemimizin çalışıp çalışmadığını kontrol edelim. (geçersiz değeri de kontrol etmeyi unutmayın)
-          Şu anda işlem bölümlerinde ekran temizlendiği halde menüye döndüğümüzde işlem kalıntıları ekranda kalıyor. Ana menüyü temiz bir ekranda göstermek için menüyü yazdırmadan hemen önce ekranı temizletelim.


-          Tekrar çalıştırarak kontrol edelim
-          Ana menü sistemimiz çalıştığına göre artık alt işlemlere geçebiliriz. Her bölüm kendi alanına yeni bir programmış gibi tasarlayabilirsiniz.
-          Kayıt Ekleme
-          Soruya göre arka arkaya kayıt ekleyebileceğiz ve bu kayıtlar hafızada tutulacak. En fazla 50 kayıtla sınırlı olacak.
-          Programda yapılabilecek en fazla kayıt sayısını tutacak maxKayit isminde bir sabit (const)  tanımlayalım. Bu sayede üst sınırda bir değişiklik olursa yada test amaçlı daha az sayıda kayıt girmek istersek sadece bu değişkenin değerini değiştirmemiz kafi olur.


-          Kayıt sayısı kadar yer ayırma: Kayıtta Ad ve Borç bilgileri girilecek. Ad string türünde borç ise sayısal türde bir veridir. Girilen kayıtların hafızada tutulabilmesi için maxKayit sayısı kadar Ad verisi için, yine aynı sayıda da borç verisini tutacak iki dizi tanımlamalıyız.

13. ve 14. satırda bu diziler tanımlandı. Bu dizilerin aynı indis numaralı elemanlarında aynı kaydın verileri bulunacaktır. Örneğin ad[2]’ kayıtlı kişinin borcu borc[2]’ de bulunacaktır.
-          Kayıt yapılacak indis numarasını tutacak değişken tanımlama: 13 ve 14. Satırlarda yaptığımız dizi tanımlaması neticesinde 50 yapraklı boş bir defter edindiğimizi varsayalım (her indis numarası bir sayfa). Şimdi bir kayıt gireceğimizi düşünelim. Peki bu kaydı hangi sayfaya (yada hangi indis numarasına) gireceğiz? Tabi ki en son kayıt yaptığımız sayfadan bir sonraki boş sayfaya. Bu durumda da en son nereye kayıt yapacağımızı bilmemiz gerekiyor. Kayıtlar ilk sayfadan (sıfırıncı indisten) başlanarak sırayla gideceğine göre  bir değişken tanımlar ve başlangıç değerini sıfır veririz. Yeni kaydı bu değişkenin gösterdiği indis numarasına yapar her kayıttan sonrada bu değişkenin değerini bir artırırsak hem bir sonraki kayıt yapacağımız yeri biliriz hem de top kayıt sayısını öğrenebiliriz.
Bu amaçla kayitYeriVeToplamKayit isminde kayıt yerini ve aynı zamanda kayıt sayısını tutacak olan bir değişken tanımlayalım

-          Kayıtla ilgili şimdilik gerekli ön tanımlamaları yaptığımıza göre bu kısmı da parça parça oluşturalım. Kayıt bölümünde veri giriş ekranımızı aşağıdaki gibi oluşturalım

Soruya göre kayıt ekranının üst kısmında toplam kaydın görüntülenmesi isteniyor. 35. satırda bu işlem yerine getiriliyor. Şuan veri girişi yapacağımız yerlerdeki başlıkları (etiketleri) oluşturduk. Çalıştırıp durumu görün. 40. Satır sadece Entere basıncaya kadar görüntüyü ekranda bekletmek için.
-          Şimdi bu etiketlerin karşısından veri girişlerini yaptırmak için kodu aşağıdaki gibi düzenleyelim.

Girilen veriler ilgili dizilerin kayitYeriVeToplamKayit değişkeninin gösterdiği yere aktarılacak. Ve kayıt girildikten sonra 42. satırda bu değişkenin değeri bir artırılarak  sonraki kaydın yapılacağı yeri göstermesi sağlanıyor. Aynı zamanda bu değişken yapılan kayıtları da saymış oluyor. Kodu çalıştırıp kayıt işlemini test edin. Mevcut kayıt sayısı doğru olarak gösteriliyor mu?
Şimdilik kaydımız yapılıyor ancak her kayıttan sonra Ana menüye dönülüyor. Oysa ki soruda kayıt yapıldıktan sonra yeni kayıt yapılıp yapılmayacağının sorulması ve eğer yeni kayıt isteniyorsa ana menüye gitmeden tekrar kayıt ekranının çalışması isteniyor.
-          Yeni kayıt isteğinin sorulması ve Ana Menüye dönmeden yeni kayda geçme: Bu işlemi aynen tekrarlanan menü sistemindeki gibi düşünebiliriz. Tüm kayıt işlemini do-while döngüsü içerisine alır, döngü içerisinde iken kayıt yapıldıktan sonra yeni kayıt istenip istenmediğini sorar ve verilen cevabı while şartında kontrol ederiz. Şart verilen cevap hayırdan farklı olduğu müddetçe (diğer her şey evet kabul edilerek) döngüyü tekrarlatacak şekilde ayarlanır.
Bunun için ilk önce yeni kayıt istenip istenmediği sorusuna verilen cevabı tutacak bir değişken tanımlamalıyız. Bu ve benzeri işlemlerde kullanmak için string türünde sec isminde bir değişken tanımlayalım.


Kayıt işlemlerini döngü içerisine alıp devam sorusunu soralım

Kodu çalıştırarak arka arkaya birkaç kayıt girin. Ana menüye döndükten sonra tekrar kayıda girerek yeni kayıtlar yapın.
Burada 36-44 satırları arası kayıt işlemlerini yapmakta, 46-47. Satırlarda oluşturulmuş yeni kayıt istenip istenmediği sorusuna verilen cevp while döngü şartında kontrol edilmekte eğer hayırdan farklıysa 35-49 arası tekrarlanarak yeni kayıt girilmekte. Eğer hayır verilirse bu döngü terk ediliyor ve bu case bloğunda çalıştırılacak başka komut olmadığından case ve switch blokları terk edilerek ana menü döngüsü aracılığıyla tekrar Ana menü çalıştırılıyor.
-          Kayıt sınır kontrolü: Şu ana kadar kayıt işlemini başarıyla gerçekleştirdik. Şimdi ilk başta tanımlanan ve kayıt miktarını tuttan  “const int maxKayit = 50;” satırını “const int maxKayit = 3;” şeklinde değiştirin ve programı çalıştırarak arka arkaya 4 kayıt girmeyi deneyin.
Eğer bu şekilde çalıştırdıysanız aşağıdaki gibi “IndexOutOfRangeException” hatasını almanız gerekir

Bu hata dizi kullanımında verilen indis numarasının dizinin üst sınırından büyük veya alt sınırından küçük olduğu durumlarda oluşur. Biliyoruz ki dizinin alt sınırı sıfır üst sınırı ise diziye ayrılan eleman sayısının bir eksiği kadardır (birinci eleman indisi sıfırdan başladığı için). Hatanın oluştuğu ad dizi değişkeninin indisinde kullanılan kayitYeriVeToplamKayit değişkeninin üzerinde fare işaretçisini kısa bir süre bekletirseniz o anki değeri küçük bir çerçeve içerisinde görülür.
maxKayit değişkeni girilebilecek en fazla kayıt sayısını tutuyordu ve bu değişkenin değerine göre diziler için yer ayrılıyordu. Yapılan değişiklikle dizi için 3 elemanlık yer ayrılmış oluyor, dolayısıyla da bu dizilerin en büyük indis değerleri 2 olabilir.  Ancak biz 4. kaydı girerken ad dizisinde indis değeri olarak kullanılan kayitYeriVeToplamKayit değişkeninin değeri 3’ü gösterdiğinden program hata veriyor.    

Bu durumu önlemek için kayıt işleminden önce en fazla kayıt sayısına ulaşılıp ulaşılmadığını kontrol etmemiz gerekiyor. Zaten soruda da bu isteniyor. Bunun için kayıt bölümünü aşağıdaki gibi düzenleyelim

Kodun bu son halinde 37. Satırda kayitYeriVeToplamKayit değişkeninin değerinin maxKayit değerine eşit veya büyük (ki aslında bu koddan sonra büyük olma şansı kalmıyor) olup olmadığı kontrol ediliyor. Biliyoruz ki her kayıttan sonra kayitYeriVeToplamKayit değişkeni bir artırılarak kayıtlar sayılıyor. Eğer bu iki değişken birbirine eşitse üst sınıra ulaşılmış demektir ve bu durumda da ekrana bu durumu belirten bir mesaj veriliyor. Mesajdan sonra entere basılması bekleniyor ve 42. Satırdaki break komutu sayesinde program akışının döngü dışına çıkması sağlanıyor (buradaki break komutunun case’i değil döngüyü sonlandırdığına dikkat ediniz). Böylelikle yeni bir kayıt işlemi önlenmiş oluyor.
-          Ada Göre Arama:
-          Arama işlemi için ilk önce aranacak ismi alır daha sonra bu ismi bir döngü içerisinde ad dizisi içerisinde ararız. Eğer bulunursa bu ismi ve borç dizisi içerisindeki aynı indis numaralı değeri ekranda görüntüler, aranan kaydın bu olup olmadığını sorarız eğer hayır denirse döngü çalışmasına devam eder. Eğer kayıt bulunmazsa döngü sona ulaşacağında döngü terk edilir. Eğer bulunursa o noktada döngüden çıkarız.
İki durumda da döngüden çıkılıyor. Ancak soruda kayıt bulunmazsa ekranda mesajla belirtilmesi isteniyor. Bunu nasıl sağlayacağız? Bunun için bool türünde bir değişken tanımlarız ve döngüye girmeden önce değerini false yaparız. Döngü içerisinde kayıt bulunur ve kullanıcıda bunu onaylarsa döngüyü terk etmeden önce bu değişkenin değerini true yapar öyle döngüyü terk ederiz. Kayıt bulunmadan döngüden çıkılırsa bu değişkenin değeri false olur. Arama döngüden sonra bu değişkenin değerini kontrol ederek kaydın bulunup bulunmadığına karar verebiliriz. Eğer değişken hala false durumnda ise kayıt bulunamamış demektir ozaman gerekli mesajı verebiliriz.
Bu düşünceyi adım adım gerçekleştirelim
-          İlk önce aranacak adı ekrandan alalım. Tabi bunun için girilen isimi tutacak bir değişkenle (arananAd), yine yukarıda açıkladığımız gibi kaydın bulunup bulunmadığını kontrol etmemizi sağlayacak bool türündeki (kontrol) değişkenlerimizi programın başında tanımlayalım.

Şimdide aranan ismi alalım



-          Şimdi girilen ismi ilk kayıttan son kayda kadar ad dizisinde arayalım. Bunun için arayacağımız kayıt sayısı belli olduğundan (çünkü o ana kadar girilen kayıtlar kayitYeriVeToplamKayit değişkeninde sayıldı) for döngüsü bu iş için idealdir. Döngümüz sıfırdan başlar kayitYeriVeToplamKayit değerine kadar gide. Döngü sayacını da dizideki verileri teker teker elde edip aranan isimle karşılaştırmak içen dizi indisi olarak kullanabiliriz.






68. satırda döngü içerisinde kaydın bulunup bulunmadığını kontrol edeceğimiz kontrol değişkenine başlangıç olarak false değeri veriliyor.
69. Satırda tüm diziyi tarayabilmek için ilk kayıttan son kayıda kadar bir döngü oluşturuluyor.
71. Satırda aranan isim her döngü tekrarında ad dizisinin i’ninci elemanıyla karşılaştırılıyor.
71. Satırda verilen karşılaştırmanın sonucu her hangi bir döngü tekrarı sırasında doğru olursa o isimde bir kayıt bulunmuş demektir. Bu durumda isim ve borç (o kişinin borç bilgisi de borc dizisinin aynı index numaralı elemanındadır. Çünkü kayıt kodlarında o şekilde programlanmıştır) bilgileri 73 – 76 satırları arasında düzenli bir şekilde ekrana yazılmıştır.
77-79 arasında görüntülenen kaydın aranan kayıt olup olmadığı sorulmakta ve verilen cevap 80. Satırda değerlendirilmektedir. Burada verilen cevap hayır ise program akışı alt tarafa geçmeden tekrar döngü başına gönderilir (continue döngünün sona ulaşmadan program akışının döngü başına gitmesini sağlar. Eğer for döngüsü içerisinde kullanılmışsa akışın son işleme geçmesini sağlar). Eğer soruya evet cevabı verilmişse (bu koda göre “h” veya “H” dışındaki her şey evet anlamını taşır) akış 81. Satıra geçer burada kontrol değişkenine true değeri atanarak (döngü dışında bu değişken kontrol edilerek kayıdın bulunup bulunmadığı kontrol edilecek) 82. Satırdaki break komutuyla döngü şarta bakılmaksızın terk edilir.
86-91 arasında kontrol değişkeni kontrol edilerek kayıt bulunmadıysa ekrana mesaj verilmesi sağlanmakta. (kontrol  değişkeni 80-81 arasındaki mekanizme sayesinde ancak kayıt bulunduğunda doğru olur).
93 teki break komutuyla bu bölüm tamamlanır ve ana menüye dönüş sağlanır.
-          Soruda olmamasına rağmen burada bir ekleme yapalım. Arama işlemi tamamlandıktan sonra Yeni arama yapılıp yapılmayacağı sorulsun. Yapılacaksa arama tekrarlansın. Bunuda siz yapın

-          Listeleme bölümü
-          Burada bir alt menü sistemi karşımıza çıkıyor. Buradaki menüyü de aynen ana menü sisteminde olduğu gibi oluşturabiliriz.



-          Tüm Liste :  liste kodlarına geçmeden önce listelenen kayıt sayılarını tutmak için program başında int türünde listeToplami adında bir değişken tanımlayalım.

 Tüm liste bölümünü aşağıdaki gibi düzenleyelim

Bu kısımda aslında anlatacak çokta fazla bir şey yok. 109-113 arasında başlık kısımları ekrana yazıldıktan sonra 116-121 arasında tüm dizideki veriler düzgün bir şekilde ekrana yazdırılmaktadır.

Console.CursorLeft, imlecin bulunduğu satırdaki sütun konumunu ayarlar.

-          Referans Listesi: Bu liste türünde kullanıcı belirli bir borç tutarını belirledikten sonra bu miktara eşit yada  daha az veya eşit yada daha çok borcu olanları listeleyebilecek.
Bunun için ilk önce referans borç miktarını tutacak referans isminde, daha az borcu olanların mı yoksa daha çok borcu olanların mı listeleneceğini tutacak yon isminde iki değişkeni program başında tanımlayalım.


Bu listeleme işlemi de hemen hemen tüm liste işlemine benzer. Tek fark tüm dizi taranarak yapılan yön seçimine göre sadece referanstan az veya çok olanların listelenmesi.
Bunun için ilk önce referans ve yön verilerini alıp liste başlıklarını ekrana yazalım.

132-138 arasında gerekli veriler alınıyor. Eğer Yön “a” veya “A” girilmişse borcu referansa eşit yada daha az olanlar diğer durumlarda eşit yada fazla olanlar listelenecektir.
140-144 arasında liste başlıkları oluşturuluyor. 145 te ise listelenen kayıtları saymak için kullanılacak değişkene başlangıç değeri olarak sıfır atanıyor.
Şimdi verilere göre listeleme işlemini yapalım

Burada 146-172 arasında switch ifadesiyle yön verisi test edilip ona göre liste ekrana yazdırılmaktadır. 148 ve 149 da iki farklı değerin nasıl tek bir işlem için birleştirildiğine dikkat edin.

-          Ana menüye dönüş: Liste menü sistemindeki döngü tekrar şartını sec değişkeninin “3” değerinden farklı olmasına bağladığımız için sec değişkeninin “3” olması durumunda liste menü sisteminin döngüsü zaten terk edileceğinden bu durumu değerlendiren case ifadesinde hiçbir işlem yapmamıza gerek yoktur.

Liste menüsünden Ana menüye dön seçeneği seçildiğinde sec değişkeninin değeri “3” olacak bu 181 deki case ifadesiyle değerlendirilecek ve hiçbir şey yapılmadan switch bloğu terk edilerek 184 teki Liste menü sistemi döngüsü sonuna ulaşılacak. Burada verilen while şartı yanlış olacağından bu döngüden de çıkılarak ana menü seçeneklerinin değerlendirildiği switch bloğunun Liste seçeneği case bloğuna dönülmüş olacak.

-          Çıkış ve Yanlış seçim:
Eğer ana menüden  dört yanı “Çıkış” seçildiyse 187-192 arasındaki case ifadesi çalıştıktan sonra 203’teki while ile verilmiş döngü şartına gelinecek ve bu şart yanlış olunacağından ana menüyü tekrarlayan döngüden çıkıldığı ve başkada kod olmadığından program sonlanmış olacaktır.

1 yorum:

  1. BİRE BİR YAZDIM AMA SIKINTI VAR ÇÖZEMEDİM ?
    BUNUN TAMAMINI PAYLAŞABİLİR MİSİNİZ ?

    YanıtlaSil