RSS
 

Archive for the ‘C programlama’ Category

Bilgisayar Mimarisi LMC(Little Man Computer)

31 Eki

Little Man Bilgisayar (LMC) Dr Stuart Madnick tarafından oluşturuldu. LMC modeller basit bir von Neumann mimarisi bilgisayar, bu yüzden tüm modern bir bilgisayarın temel özellikleri vardır. LMC makinesi veya montaj kodu, ve programlanabilir.

LMC Giriş ve Çıkış Talimatları

LMC Komutları

1-LOAD: Lmc posta kutusundaki veriyi ekrana tuşlar.
2-STORE: Komutla gelen Adrese hesap makinesindeki veriyi aktarır
3-ADD: Verilen adres ile ekranı toplar.
4-Substract: Çıkarma işlemi yapar
5-Input: LMC yi en üst posta kutusuna yönlendirir.
6-OutPut:Sonucu çıktı olarak verir
örneğin 3|25 şeklinde bir ifadenin ilk hanesi yani 3 yapılacak komutu belirler ayraçtan sonraki
ise posta kutusunun adresidir
Şimdi LMC ye iki sayıyı toplatalım
input 500
store 299
input 500
add 399
store 298
output 600
Coffee Break 700
Not=Saklama işlemine 99 dan başlamak gerekir 5-6-7 nolu komutların adres kutuları çalışmaz
 bu yüzden 00 olarak kaldı
Skip on condition:LMC ye verilen duruma göre uygun bir değerle karşılaştığında
sayaca gidip sayacın değerini 1 arttırır.
Bir sonraki komutu atla posta kutusu atla;
-KOMUT DÖNGÜSÜ:
1-Al-getir evresi:LMC nin komut sayacına gitmesi bir sonraki komutun yerini öğrenmesi
posta kutusuna yönelmesi ve değeri okuma işlemi en son olarak sayacı 1 arttırılması
2-İşletme Devresi(EXECUTE):Gelen komut işlem kodu ve adres olarak çözümlenir ve komutu işlenecek ünite
aktif hale getirilir.
Merkezi İşlem Birimi

Register:

İşlemci üzerinde değişik değişik amaçlarda kullanılırlar Belli bir adres kısımları yoktur
Lmc nin hesap makineside register sayılabilir çünkü bilgiyi alır almaz ekrana yazar

AKÜMÜLATÖR

Aritmetik ve mantıksal işlemler işlemlerin üzerinde işlem yaptığı yazmaçtır
işlemcide bulunması gerekn temel yazmaçlar;
1-Program Sayacı:İşletilen komutları ve sonra gelecek komutun adresini tutar
2-Komut yazmacı: İşletilmekte olan komutu tutar merkezi işlem birimi tarafından işletilmekte olan komutu
ve parametrelerini tutar
3-Hafıza adresleme yazmacı (MAR-memory access register): İşlmeciye veriyi getirecek olan birim.Hafızadan
adreslenerek verinin işlemciye taşınmasını sağlar.
4-Hafıza Veri Yazmacı(MDR-Memory Data Register)Mar tarafından adresnlenen verinin işlemciye taşımasını
 sağlar
5-Durum Bitleri (Flags):Komut içerisinde elde ettiği sonuçları durum kelimesine aktarır. Negatif mi,
pozitif mi bunu durum bitleri ayarlar.

Yazmaçların Kullanım Amaçları

1-Farklı yerlerden farklı verileri depolamak için -bu depolama önceki veriyi yok eder
2-Farklı noktalardan veriler yazmaçlarda toplanabilir çıkartılabilir, spnuç yazmaç üzerinde kalır
(LMC deki gibi)
3-Sağa sola kaydırarak çarpma ve bölme yapılır
Sola kaydırma çarpma,sağa kaydırma bölme işlemi örneğin;
01100=12
11000=24 // aynı sayıyı kaydırıyoruz *2
00110=6// kaydırdık /2
ayrıca yazmaçlar bazen 0 değeri yüklemek veya sıfılamak için kullanılırlar.
HAFIZA ÜNİTESİ:
Hafıza ünitesinde okuma anhtarına 3 sinyal gelir
*Adres Bilgisi
*Aktisyon Bilgisi
*Veriye hangi işlem olacağı
Diyelim elimizde 6 bitlik Mar varsa;
2^6=64 adet hafıza satırı adreslenir
11001=49 yani 49.satır aktif
Çoğumuzn kullandığı işlemciler 32 bitlik yani 2^32 yaklasık 4gb adresleme yapabilir

 
 

Her Yönüyle C#’da Yığın (Stack) Sınıfı

19 Eki

Yığın veri yapılarının çalışma mantıklarını anladıktan sonra .NET sınıf kitaplıklarında yeralan Stack sınıfını C#’da nasıl kullanacağımızı inceleyeceğiz.


1. Yığın veri Yapısının Çalışma Şekli
Yığınlar genelde aynı tipten verilerin tutulduğu ve Son Giren İlk Çıkar (LIFO) çalışma mantğını kullanan veri yapıları olarak tanımlanır. Bir yığına en son giren eleman ilk olarak çıkar. Yığınları anlatırken en çok üst üste konmuş tabaklar veya herhangi bir nesne grubunda çok kullanılana benzetirler. Mesela bir masanın üstünde sıra ile üst üste konmuş birden fazla tabaktan birisine ihtiyacımız olursa önce en üsttekini alırız. Bu aldığımız tabakların en son konulanıdır.

Yığınların çalışma prensibini daha iyi kavramak için yandaki canladırmayı inceleyelim. Canlandırmada yığının dışında bulunan sayıları yığının içine koymak için “Yığını Doldur” düğmesine tıkladığımızda sırası ile 17, 23, 4, 55 ve 8′i yığına sokuyor. Yığın doluyken “Yığını Boşalt” düğmesine tıklayınca ise yığındaki sayıların yerleştirildikleri sıranın tersi sıra ile boşaltır. Bu durumda en son giren 8 sayısı ilk önce, sonra 55, sonra 4 ve bu sıra ile en son 17 sayısı yığından dışarı çıkar.

2. .NET Sınıf Kütüphanesi Yığın Sınıfı (Stack)
.NET sınıf kütüphanesinde yığın veri yapısını kullanmak için Stack sınıfını kullanırız. Normalde C ve C++ dillerinde yığın veri yapısını değişik veri türleri ve kendi tanımladığımız sınıflarla birlikte kullanmak zahmetli bir işti. (C’de sınıf kavramı yoktur!) Ama .NET ortamında yığınlarımız bize birçok konuda esneklikler sunarak programlamayı daha zevkli ve verimli hale getiriyor.
.NET’in yığın (Stack) sınıfını kullanmak için program kodunun baş tarafına using System.Collections; eklememiz gerekir. Buradan yığın sınıfı System.Collections isim alanında bulunuyor sonucunu da çıkartırız.
C# veya herhangi bir dilde yazılan yığın veri yapılarında Push(), Pop(), Peek() veya Top(), Clear() fonksiyonları ve Count, özelliği temel olarak bulunur. Temel fonksiyonların yanında Clone(), CopyTo(), ToArray(), Contains() ve Equals() metodları .NET’in yığın sınıfında yeralır.
Yığın sınıfının Push() metodu yığına yeni bir eleman ekler. Pop() metodu ile yığının en üstündeki elemanı yığından siler ve silinen elemanı geriye döndürür. Eğer yığının tepesindeki elemanı öğrenmek istersek Peek() medodu işimize yarar. Bu metod yığının tepesindeki nesneyi döndürür ama bu nesneyi yığından silmez.
using System;
using System.Collections; // Stack sınıfı bu isim alanı içinde bulunur.

class YiginSinifi1
{
public static **** Main(string[] args)
{
// Stack sınıfından yigin nesnemizi tanımlıyoruz.
Stack yigin = new Stack();
// Yigini değişik değerlerde dolduruyoruz..
yigin.Push(12);
yigin.Push(5);
yigin.Push(23);
yigin.Push(34);
yigin.Push(70);
yigin.Push(;

Console.WriteLine(“Yığımızın ilk hali…”);
ElemanlariYaz(yigin);
// Yigininin tepesinden bir sayı aldık
// ve bunu sayi değişkenine atayıp ekrana yazdıralım
int sayi = (int) yigin.Pop();
Console.WriteLine(“\n Yığından {0} sayısını aldık”, sayi);
// Yigininin tepesinden bir sayı daha aldık
// ve bunu sayi değişkenine atayıp ekrana yazdıralım
sayi = (int)yigin.Pop();
Console.WriteLine(“\n Yığından {0} sayısını aldık”, sayi);
// Şimdi ise Yigininin tepesindeki sayıya bir bakalım
// bu sayıyı yığından çıkarmıyoruz.. Sadece ne olduğuna bakıyoruz..
sayi = (int) yigin.Peek();
Console.WriteLine(“\n Yığının tepesindeki sayı şu anda : {0}”, sayi);
Console.ReadLine();
}
public static **** ElemanlariYaz(Stack yigin)
{
object obj = new Object();
Stack yeniYigin = (Stack)yigin.Clone();
if(yigin.Count!=0)
{
while(yeniYigin.Count>0)
{
obj = yeniYigin.Pop();
Console.WriteLine(“\t”+ obj.ToString());
}
}
else Console.WriteLine(“Yığın boş…!”);
}
}
Yukarıdaki programda önce Stack sınıfından yigin isimli bir nesne oluşturuyoruz. Sonraki altı satırda yığınımıza 12, 5, 23, 34, 70 ve 8 tamsayılarını Push() metodu ile ekliyoruz. EkranaYaz() ismini verdiğimiz static fonksiyonumuz (bu fonksiyon tam olarak optimize edilmiş bir fonksiyon değil! ) ile yığınımızda bulunan elemanları ekrana yazdırıyoruz. Daha sonra yığından iki tane elemanı Pop() metodu yardımıyla alıyor ve herbirini ekrana yazdırıyoruz. Programın son kısmında ise Peek() metodunu kullanarak yığının en üstündeki elemanın ne olduğunu öğreniyoruz.
Yığın sınıflarında bulunan diğer iki temel fonksiyonlar olan Count özelliği ve Clear() metodlarıdır. Bunlardan Count, yığın nesnesinde bulunan elemanların sayısını geriye döndüren bir özelliktir. Özellikler C# dilinde sınıflarda bulunan üye değişkenlerin değerlerini öğrenmemize ve onların değerlerini değiştirmemize yarayan bir tür fonksiyonlardır. Count özelliği eleman sayısını int tipinde döndürür ve sadece okunabilen (readonly) yapıdadır. Özellikler program içinde çağrılırken parantezleri kullanmayız. Eğer yigini boşaltmak/temizlemek istersek Clean() metodu işimizi yarayacaktır. Clean() metodu hiçbir parametre almaz ve hiçbir şey döndürmez. Herhangi bir yığın nesnesinin içinde bir elemanın olup olmadığını anlamak için Contains() metodu kullanılır. Bu metod aranacak nesneyi alır ve geriye true veya false değerlerini döndürür. İsterseniz aşağıdaki programda Contains() ve Clear() metodları ile Count özelliklerini nasıl kullanabileceğimizi görelim:
using System;
using System.Collections; // Stack sınıfı bu isim alanı içinde bulunur.

class YiginSinifi1
{
public static **** Main(string[] args)
{
// Stack sınıfından yigin nesnemizi tanımlıyoruz.
Stack yigin = new Stack();
// Yığınımıza yeni elemanlar ekliyoruz.
yigin.Push(“Ahmet”);
yigin.Push(“Sefer”);
yigin.Push(“Cemal”);
yigin.Push(“Onur”);
yigin.Push(“Aziz”);
// Yığında kaç tane eleman bulunduğunu bulup yazalım.
int elemanSayisi= yigin.Count;
Console.WriteLine(“\nYığınımızdaki eleman sayısı: {0}”, elemanSayisi);

// Yığındaki elemanlar.
Console.WriteLine(“\nYığındaki elemanlar: “);
ElemanlariYaz(yigin);

//Contains() metodunun kullanımı:
if(yigin.Contains(“Sefer”))
Console.WriteLine(“\nYığında Sefer elemanı var…”);
else
Console.WriteLine(“\nYığında Sefer elemanı yok…”);
// Yığını boşaltalım.
yigin.Clear();
// Yığını boşalttıktan sonra kaç tane eleman bulunduğunu bulup yazalım.
elemanSayisi= yigin.Count;
Console.WriteLine(“\nYığınımızdaki eleman sayısı: {0}”, elemanSayisi);
Console.ReadLine();
}
public static **** ElemanlariYaz(Stack yigin)
{
object obj = new Object();
Stack yeniYigin = (Stack)yigin.Clone();
if(yigin.Count!=0)
{
while(yeniYigin.Count>0)
{
obj = yeniYigin.Pop();
Console.WriteLine(“\t”+ obj.ToString());
}
}
else Console.WriteLine(“Yığın boş…!”);
}
}
Hemen üstteki programdan önceki programda yığınımıza int tipinden nesneler (c#’ta primitive türler dahil herşey nesnedir!) yerleştirmiştik. Bu örnekte ise string sınıfına ait nesneleri yığınımıza ekledik ve onlar üzerinde işlemler yaptık. Yani yığın sınıfımız herhangi bir nesneyi tutabilecek yetenekler sabit. İster temel veri türleri olsun (int, byte, double veya bool) ister kendi tanımladığımız veri türleri olsun yığın sınıfımıza ekleyip çıkartabiliriz.
Yukarıdaki programda yigin olarak oluşturduğumuz ve yığın sınıfındaki nesnemize beş tane veriyi ekliyoruz. Sonra yığında kaç tane eleman olduğunu bulmak için Count özelliğinden faydalanıyoruz. Yığındaki elemanları yazdırmak için ElemanlariYaz() sabit fonksiyonumuzu kullanıyoruz. Contains() metodunu kullanımına örnek olması amacıyla if deyimi içinde yigin.Contains(“Sefer”) sorgusunu yapıyoruz. Eğer Sefer elemanı yığında mevcutsa ekrana yığında olduğunu, yoksa yığında olmadığını yazdırıyoruz. Programın geriye kalan kısmında yığını boşaltmak için Clear() metodunu kullanıyoruz,yığındaki eleman sayısını tekrar bulup bunu yazdırıyoruz. Eğer tekrar ElemanlariYaz() fonksiyonunu kullansaydık. “Yığın Boş..!” uyarısını alırdık!
.NET sınıf kütüphanesinde bulunan Yığın (Stack) sınıfının getirdiği kolaylıklar yukarıdakilerden daha fazladır. Mesela herhangi bir yığın nesnemizi başka bir yığının içine kopyalayabiliriz. Bir yığını başka bir yığına kopyalamak için Clone() metodunu kullanabiliriz. Ayrıca bir yığın nesnesini herhangi bir dizinin içine kopyalamak için ToArray() metodu kullanılabilir. İki tane yığının birbirlerine eşit olup olmadığını öğrenmek için Equals() metodu hemen yardımımıza yetişir. Burada şunu belirtmekte yarar var: Equals() metodu sanal (virtual) bir fonksiyon olup c#’daki tüm nesnelerin türediği System.Object nesnesine aittir.
Bu makalede inceleyeceğimiz son program aşağıdadır. Bu programla Clone(), Equals() ve ToArray() metodlarını programlarımız içinde ne şekilde kullanacağımızı öğrenebiliriz.
using System;
using System.Collections; // Stack sınıfı bu isim alanı içinde bulunur.

class YiginSinifi1
{
public static **** Main(string[] args)
{
// Stack sınıfından yigin nesnemizi tanımlıyoruz.
Stack yigin1 = new Stack();
// Yığınımıza yeni elemanlar ekliyoruz.
yigin1.Push(“Ahmet”);
yigin1.Push(“Sefer”);
yigin1.Push(“Cemal”);
yigin1.Push(“Onur”);
yigin1.Push(“Aziz”);
//İkinci yığınımızı tanımlıyor ve yigin1′in
// bir kopyasını yigin2′ye koyuyoruz..
Stack yigin2= (Stack)yigin1.Clone();
// yigin1′den bir eleman çıkartıyoruz.
yigin1.Pop();
//yigin1 ve yigin2 nesnelerimizin en üstteki
// elemanlarına bir bakalım:
Console.WriteLine(” Peek of Yığın2: “+ yigin2.Peek());
Console.WriteLine(” Peek of Yığın1: “+ yigin1.Peek());
//yigin1 ve yigin2 eşit mi? Bir bakalım:
Console.WriteLine(“\n yigin1 ve yigin2 eşit? –> “+ yigin1.Equals(yigin2));
//yigin2′yi kopyalamak için yeni bir dizi oluşturalım:
Array arr = new Array[5];
// yeni oluşturduğumuz diziye yigin2′yi kopyalayalım:
arr = yigin2.ToArray();
// arr nesnesinin elemanları:
Console.WriteLine( “\n\n arr nesnesinin elemanları:\n”+
“\n\t”+arr.GetValue(0)+
“\n\t”+arr.GetValue(1)+
“\n\t”+arr.GetValue(2)+
“\n\t”+arr.GetValue(3)+
“\n\t”+arr.GetValue(4) );

Console.ReadLine();
}
public static **** ElemanlariYaz(Stack yigin)
{
object obj = new Object();
Stack yeniYigin = (Stack)yigin.Clone();
if(yigin.Count!=0)
{
while(yeniYigin.Count>0)
{
obj = yeniYigin.Pop();
Console.WriteLine(“\t”+ obj.ToString());
}
}
else Console.WriteLine(“Yığın boş…!”);
}
}

Yazımızda bilgisayar programlama alanında en önemli veri yapılarından biri olan yığınların (Stack) nasıl çalıştıklarını ve .NET sınıf kütüphanesinde bulunan Stack sınıfını ve metodlarının nasıl işimize yarayacak şekilde kullanabileceğimizi öğrendik. Umarım bu yazının size gerçek manada yararı olur.

 
 

Temel Programlama Hataları

07 Eki

Symbols-Error-256x256

Programlamaya yeni başalyanların sık sık karşılaştığı hataları açıklamaya çalışacağız programlama dilleri farklı olsa bile genel uyulması gereken kurallar aynıdır. ;


  • Tanımlanmayan değişken kullanımı ;
int main()
{
  cin>>x;
  cout<<x;
}

bu kodu derlediğinizde Undeclared Variables hatası alırsınız. Çünkü derleyici x in ne olduğunu bilmiyor. aşağıdaki gibi değiştiiryoruz

int main()
{
  int x;
  cin>>x;
  cout<<x;
}
  • Döngüye sokulan değişkenin ilk değeri olmaması;
int count;
while(count<100)
{
  cout<<count;
}

burada da count ın degeri her sayı olabilir bu yüzden program döngüye giremiyor.

  • Değeri olmayan değişkene atama yapmak
int a, b;
int sum=a+b;
cout<<"iki sayi girin: ";
cin>>b;
cout<<"toplam: "<<sum;
çalıştıralım:
2 sayı girelim 1 ve 3
-1393 gibi sonuc çıkartır bilinmeyen rastgele bir sonuc üretir

bu programı a ve b değerlerini cin ile aldıktan sonra sum değişkenine atarsak hatayı çözebiliriz.

  • Tek = ifadesi kullanamak döngülerde

c dilinde if while döngülerinde çift eşittir kullanılır çünkü tek eşittir atama işleminde kullanılır atama ve eşitlik kontrolünü ayrılması için küçük bir farktır.

char x='Y';
while(x='Y')
{
  //...
  cout<<"kodlarımız  (Y/N)";
  cin>>x;
}

while döngüsünü while(x==’Y') olarak değiştiriyoruz

  • fazla işaret kullanılması: program yazarken sık sık sonunu ; ile bitiririz fakat döngülerin sonuna ; koymamalıyız (eğer döngüyü kendi içerisinde döndürmek istemiyorsak)
int x;
for(x=0; x<100; x++);
  cout<<x;

kodu derlediğimizde 100 yazar çünkü döngü kendi içerisinde dönecek alt bloklara uğramayacak

  • dizilerin sınırları dışına çıkılması: Dizilerin sıra numaraları 0 dan başlar yani 10 elemanlı bir dizi oluşturduğunuzda en fazla  sayi[9] a değer aktarabilirsiniz
int array[10];
//...
for(int x=1; x<=10; x++) // = kısmını kaldırarak hatayı çözebiliriz
  cout<<array[x];
  • || ve && operatörlerinin yanlış kullanılması
int value;
do
{
  //...
  value=10;
}while(!(value==10) || !(value==20))

|| operatörünü kaldırıp ve operatörü koyuyoruz.