Browsed by
Category: C/C++

C ve C++ Yazılım geliştirme

Singleton C++ Gerçeklemesi

Singleton C++ Gerçeklemesi

Lazy Initialization

#include;



using namespace std;



class Singleton
{



private:
    static Singleton *single;
    Singleton()
    {
        //private constructor
    }



public:
    static Singleton* getInstance();
    void method();
};



Singleton* Singleton::single = NULL;



Singleton* Singleton::getInstance()
{
    if(single == NULL)
    {
        single = new Singleton();
        instanceFlag = true;
        return single;
    }
    else
    {
        return single;
    }
}



void Singleton::method()
{
    cout << "Method of the singleton class"<< endl; } int main() { Singleton *sc1,*sc2; sc1 = Singleton::getInstance(); sc1->method();
    sc2 = Singleton::getInstance();
    sc2->method();



    return 0;
}
C++ Matrix Yazı Kaydırması :)

C++ Matrix Yazı Kaydırması :)

Donanımhaber forumunda yazılım geliştirme bölümünden bulduğum tatlı bi kod 🙂

Ne işe yarar diye soracak olursanız, sadece eğlence amaçlıdır.

Kod:

#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
 using namespace std;

 int main(int argc, char *argv[])
{
  int a;
   string array [42] = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","0","1","2","3","4","5","6","7","8","9", " ", " ","?","!","#","*"};
   system("TITLE The Matrix");
   system("color 0A");
   while(1)
   {
      Sleep(45);
      for(int i=0; i<27; i++)
      {
         a = rand()%42;
         cout << " " << array[a];
         cout << " ";
      }
      cout << endl;
   }
getch();
return 0;
}
</span>
</span>

Yada exe olarak çalıştır.

Kaynak: http://forum.donanimhaber.com/m_57070202/tm.htm

Assembly ve C dilinde Konvolüsyon ile Sinyal Filtreleme

Assembly ve C dilinde Konvolüsyon ile Sinyal Filtreleme

Mikroişlemciler dersimizin bu dönemki dönemlik ödeviydi.Biraz daha görsel ve anlaşılır olsun diye raporun hepsini paylaşıyorum.Umarım yararı olur.Bana hiç yararı olmadı 😀

Filtreleme:
Filtreler gürültü oranını iyileştirerek sinyalin algılanmasını kolaylaştırırlar.Bir telefon şebekesinde, diğer taraftan alınan sinyalin yolda bozularak geldiğini varsayalım.Cızırtılı seslerin kaynağı budur.Karşı taraftan gelen sinyale filtre uygulandığında karma karışık gelen gürültülü sinyali, gürültüden arındırarak daha temiz bir sinyal elde etmemizi sağlar.

 

Mesela yukarıda gönderilen gürültülü sinyali bir kare dalga ile filtreye sokarsak, gürültüyü büyük ölçüde soğurmuş oluruz.Böylece artık telefondan cızırtılı bir ses algılamayız.
Sinyal filtreleme tekniklerinin bir çok yolu vardır.Ancak bu ödevde, konvolüsyon formulü ile filtrelemeye değineceğim.

Konvolüsyon Formülü ile Sinyal Filtreleme:

Elimizde  a ve b diye iki tane dizimizin olduğunu varsayalım.a = [1 2 3 4] ve
b = [5 6] olsun.Bir de c diye bir çıktı dizimiz olsun.

Konvolüsyon formülünün bu iki diziye uygulanarak elde edilen dizi bizim çıktı dizimiz olur.Çıktı dizisinin eleman sayısı bu iki dizinin eleman sayıları toplamından bir eksiktir.

S(c) = S(a) + S(b) -1

Konvolüsyon formulü: c(k)= ∑_(j=1)^k▒〖a(j)*b(k-j+1)〗
(parantez aralarındaki dizi indisleridir.)

 

Buna göre, a ve b’nin konvolüsyonundan şu şekilde bir yapı çıkar:

c(1) = a(1)*b(1) = 1 * 5 = 5
c(2) = a(1)*b(2)+a(2)*b(1) = 1 * 6 + 2 * 5 = 16
c(3) = a(1)*b(3)+a(2)*b(2)+a(3)*b(1) = 1 * 0 + 2 * 6 + 3 * 5 = 27
c(4) = a(1)*b(4)+a(2)*b(3)+a(3)*b(2)+a(4)*b(1)
= 1 * 0 + 2 * 0 + 3 * 6 + 4 * 5 = 38

c(5) = a(1)*b(5)+a(2)*b(4)+a(3)*b(3)+a(4)*b(2)+a(5)*b(1)
= 1 * 0 + 2 * 0 + 3 * 0 + 4 * 6 + 0 * 5 = 24

Önce matlabda bakıp doğru mu diye testini yaptığım bu dizileri ardından c kodumda da kullandım.

 

C kodu:

#include&lt;iostream&gt;
#include&lt;conio.h&gt; 

 int main()
{
   int S[5]={0,1,2,3,4};
   int F[3]={0,5,6};
   int D[6]={0};
   //dizilerin ilk indislerinin 0 dan başlamasının sebebi, 0. Indis olarak almak zorunda //kalmamız.0’dan konvolüsyon formulü kullanımı için indisleri bu şekilde düzenlemem gerekti.
    //çıktı sinyalini oluşturabilmemize yarayan döngü
   {
      for(int j=1;j&lt;=k;j++)//konvolüsyon işlemi için aralık sağlayan döngü
      {
         if((k-j+1)&lt;3 &amp;&amp; j&lt;5)//sınırları belirleyen if yapısı
         D[k]+=S[j]*F[k-j+1];//ve konvolüsyon formülümüz
      }
   }
   printf("Sinyal:");//yazdırma
   for(int i=1;i&lt;5;i++)
   printf("%d ",S[i]);
   printf("nFiltre Sinyali:");
   for(int i=1;i&lt;3;i++)
   printf("%d ",F[i]);
   printf("nCikti:");
   for(int i=1;i&lt;6;i++)
   printf("%d ",D[i]); 

    getch();
   return 0;
} 

 

Çıktıyı matlab ile karşılaştırarak doğruluğunu test ettim.
Ardından assembly’ye çevirdim.Assembly’de dizilerin ilk indislerini 0 almadan yaptım.

Assembly Kodu:


data segment
Sig db 8,10,1,3,8,1,6,5,4,1 ;Sinyal dizisi
Filt db 5,10,5,10,5 ;filtre dizisi
Outp db 14 dup(0) ;cikti dizisi
ForCh EQU 15 ;Cikti dizisine eleman atmak icin for
AboveSi EQU 9  ;sinyal disinin 0 dan basladigi varsayilarak, son eleman siniri
AboveDi EQU 14 ;A dan itibaren baslayan filtre dizisinin son eleman siniri
;C kodu ile ayni mantikta çcalisan assembly kodu 

 code segment
start: 
    mov ax, data
   mov ds, ax
   mov es, ax 

    lea si,Sig ;sinyal dizisinin ilk elemaninin adresini aldik
   lea di,Filt;filtre dizisinin ilk elemaninin adresini aldik 

     mov cl,1 ;cl = j
   mov ch,1 ;ch = k
   sub dx,dx
   sub ax,ax 

   ;w(k)=TOPLAM(S[j]*F[k-j+1]) 

    For:cmp ch,ForCh  ;k nin sinirlari kontrol edilir
   je FINISH
   For2:cmp cl,ch
   ja ForEx   ;j nin sinirlari kontrol edilir 

    add al,ch  ;F[k-j+1] = di
   inc al
   sub al,cl
   add di,ax   ;offset ayarlanir 

    add dl,cl  ;S[j] = si
   add si,dx  ;offset ayarlanir 

   dec si     ;aradigimiz elemanin bir fazlasi gelir hep
   dec di     ;bu yuzden bir eksiltiriz offsetleri 

   cmp si,AboveSi ;sinyal dizisi sinirlari belirlemede kullanilir
   ja ABOVE
   cmp di,AboveDi ;filtre dizisi sinirlari belirlemede kullanilir
   ja ABOVE
   ; sinir asimina gore ABOVE label'ina gidilir
   mov al,[di]  ;Filtre dizisi elemani
   mov ah,[si]  ;Sinyal dizisi elemani
   mul ah 

    lea si,Outp  ;cikti dizisi ilk eleman adresi alinir
   sub dx,dx    ;dl ye byte seklinde atama yapilirken dh deki veriler temizlensin
   mov dl,ch    ;dl ye k eklenir
   add si,dx    ;yani cikti dizisinin k. elemanina gidilir,
   dec si            ;yalniz bir fazlasi oldugu icin bir onceki elemana gidilir
   add [si],ax  ;ax e atilan carpim degerini, o elemana ekleriz 

   ABOVE:
   sub dx,dx;toplama ve carpma islemleri icin veriler 0lanir
   sub ax,ax
   inc cl
   lea si,Sig     ;dizilerin ilk elemanlarina geri donulur
   lea di,Filt 

     jmp For2
   ForEx:mov cl,1   ;j tekrar 1 olur
   inc ch     ;k artar
   jmp For

     FINISH: 

      mov ax, 4c00h ; exit to operating system.
   int 21h
ends 

 end start 

 

Veri Yönetimi ve Dosyalama, Coalesced Hashing(Direct Chaining) Ödevim

Veri Yönetimi ve Dosyalama, Coalesced Hashing(Direct Chaining) Ödevim

2. sınıfta yaptığım bir coalesced hashing ödevi:

Ödevin amacı:6 haneli sayılardan oluşan deprem bölgelerinin kodları ve bu bölgelere ait özellikler vardır.Bunların hepsinin taranıp öncelikle yapmamız gereken bir hash tablosuna oturtmak.

Ödevin orijinal açıklaması ve Kodu:Indir

Mesela   toplamda 383 tane veri var diyelim.Bizim burda yapmamız gereken bu veriler için optimal uzunlukta tabloyu bulabilmek.Erişim sayısını minimum tutabilmek için.

Sonraki işlem ise, 233236    4.4    8    FIJI ISLANDS REGION

143359    4.6    12    FIJI ISLANDS REGION
130713  4.70  4       SOLOMON ISLANDS

152108  4.90  6       BANDA SEA

verilerini 389 veri tutabilen bir tabloya coalesced hashing ile yerleştirelim.Coalesced hashing ile yapacağımız şey öncelikle home adresslerini bulmak olacaktır.Anak buradakilerin sadece örnek olduğunu ödevden bağımsız anlattığımı bilmelisiniz.

Coalesced hashing metodunu biliyor olduğunuzu varsayarak 🙂

233236  % 389  =  225 tir.  Buna göre bu verinin home adressi 225tir.225 sayılı adresimiz boştur.O halde oraya yerleştirebiriz.

143359 % 389 =  207 dir.Ozaman bu veriyi de 207 numaralı adresimize yerleştiriyoruz.

130713 % 389 = 9 dur.O halde bunu da 9 numaralı hash dizimizin adresine atıyoruz.

Gel gelelim son elemana.

152108 % 389 = 9 dur. Hah şimdi ne yapacağız?  Bildiğiniz gibi bizim bir boş yer bulma göstericimiz vardı.Taa dizinin en sonunu gösteriyordu.Bunun gibi çakışmalarda ona baş vurarak dizinin en sonundan aşağı doğru tarayarak boş yer bulup bize haber veriyodu.İşte şimdi en dizimizin en sonunu gösteren bu pointerla son verimizi yerleştireceğiz.

P=388 i gösteriyordu.Orada bir veri mevcut değil.O halde oraya yerleştirebiliriz.Ve Pyi bir eksilterek aşağıya kaydırabiliriz pointerımızı.

Ancak ulaşabilmek için home adresindeki elemanın tuttuğu bir pointer değeri daha vardır.Yani 9 numaralı adresteki elemanın göstericisi 388 numaralı adresi göstermektedir.

Silme işleminde ise, sildiğmiz elemanın bağlantılı olduğu zincirde, sildiğimiz yerdeki elemanın adresi, home adresi olan bir eleman var ise o elemanın home adresine kavuşturarak zincirimizi de ona göre güncelleyiyoruz.

 

C++ Nesne Tabanlı Sıralama(Sorting) Algoritmaları ve Zamanları

C++ Nesne Tabanlı Sıralama(Sorting) Algoritmaları ve Zamanları

1000, 10000, 100000,1000000 veri sayıları arasından Ters, Önceden sıralı ve Rasgele olarak zamanlarının çıkarılmasını sağlayan bir Nesne tabanlı C++ programıdır.Bu yılki ilk kod ödevimiz .Gerçi daha vermedik ama kimse bakmıyo nede olsa buraya, kopya çekemezler 😛

Algoritmalar:Insertion Sort Daha Fazla Bilgi İçin

Selection Sort Daha Fazla Bilgi İçin

Quick Sort Daha Fazla Bilgi İçin

Bubble Sort Daha Fazla Bilgi İçin

Merge Sort. Daha Fazla Bilgi İçin

Ama unutmayın ki, bu sıralama süreleri bilgisayardan bilgisayara değişebilir.

bir milyonda da deneme yaptığımız için ve sıkıntı olmaması için long tanımladım değişkenleri.Tabiki bunları bu şekilde yazabilmeniz için öncelikle  Algorithms adında class oluşturmanız gerek.

Programı indir


——————————-

Insertion Sort Kod:

void Algorithms::InsertionSort(long *InsertionArray,long Size)
{
   int key,i;

   for(int j=1;j&lt;Size;j++) 
   {
     key=InsertionArray[j];

     i=j-1;
     while(InsertionArray[i]&gt;key &amp;&amp; i&gt;=0)
     {
         InsertionArray[i+1]=InsertionArray[i];
         i--;
     }
     Count++;
     if(Count % 100000 == 0)
        cout&lt;&lt;Count&lt;&lt;". Karsilastirman";
     InsertionArray[i+1]=key;
   }

}


Quick Sort Kodu:

void Algorithms::QuickSort(long *QuickArray,long Start,long End)
{
   long split;

   if (Start &lt; End)
   {
      Count++;
      if(Count % 100000 == 0)
      cout&lt;&lt;Count&lt;&lt;". Karsilastirman";
 
      split = <strong>Partition</strong>(QuickArray, Start, End);
      QuickSort(QuickArray, Start, split-1);
      QuickSort(QuickArray, split+1, End);
   }
   else
   {
      Count=0;
 
   }
}
 
long Algorithms::<strong>Partition</strong>(long *QuickTheArray,long Start,long End)
{
   int Pivot = QuickTheArray[(End+Start)/2];
   int Bottom = Start-1;
   int Top = End;
 
   bool NotDone = true;
   while (NotDone)
   {
      while (NotDone)
      {
         Bottom += 1;
 
         if (Bottom == Top)
         {
             NotDone = false;
             break;
         }
         if (QuickTheArray[Bottom] &gt; Pivot)
         {
             QuickTheArray[Top] = QuickTheArray[Bottom];
             break;
         }
      }
      while (NotDone)
      {
          Top = Top-1;

          if (Top == Bottom)
          {
              NotDone = false;
              break;
          }
          if (QuickTheArray[Top] &lt; Pivot)
          {
          QuickTheArray[Bottom] = QuickTheArray[Top];
          break;
          }
       }
    }
   QuickTheArray[Top] = Pivot;
   return Top;
}


Merge Sorting Kodu:

void Algorithms::MergeSort(long *MergeArray,long Left,long Right,long *Temp)
{
   long Middle;
 
   if(Left &lt; Right)
   {
      Count++;
      if(Count % 100000 == 0)
      cout&lt;&lt;Count&lt;&lt;". Karsilastirman";
 
      Middle = (Left + Right) / 2;
      MergeSort(MergeArray,Left,Middle,Temp);
      MergeSort(MergeArray,Middle + 1,Right,Temp);
  
   Merge(MergeArray,Left,Middle,Right,Temp);
   }
   Count=0;
}
 
void Algorithms::Merge(long *MergeArray,long Left,long Middle,long Right,long *Temp)
{
   long h,i,j,k;
 
   h=Left;
   i=Left;
   j=Middle+1;
 
   while(( h &lt;= Middle ) &amp;&amp; ( j &lt;= Right ))
   {
      if(MergeArray[h] &lt;= MergeArray[j])
      {
         Temp[i]=MergeArray[h];
         h++;
      }
      else 
      {
          Temp[i]=MergeArray[j];
          j++;
      }
      i++;
    }
 
   if(h &gt; Middle)
   {
       for(k=j;k&lt;=Right;k++)
       {
          Temp[i]=MergeArray[k];
          i++;
       } 
   }
   else
   {
       for(k=h;k&lt;=Middle;k++)
       {
          Temp[i]=MergeArray[k];
          i++;
       }
   }
   for(k=Left;k&lt;=Right;k++)
   MergeArray[k]=Temp[k];
}


Selection Sort Kodu:

void Algorithms::SelectionSort(long *SelectionArray,long Size)
{
   int i, j, MinIndex, Temp;
 
   for (i = 0; i &lt; Size - 1; i++) {
 
      MinIndex = i;
      Count++;
      if(Count % 100000 == 0)
         cout&lt;&lt;Count&lt;&lt;". Karsilastirman";
 
      for (j = i + 1; j &lt; Size; j++)
      {
          if (SelectionArray[j] &lt; SelectionArray[MinIndex])
          MinIndex = j;
      }
      if (MinIndex != i) {
          Temp = SelectionArray[i];
          SelectionArray[i] = SelectionArray[MinIndex];
          SelectionArray[MinIndex] = Temp;
 
      }
 
   }
   Count=0;
}

Ve Diğer algoritmalar için

 

C de Binary Search Tree(İkili Arama Ağacı) ile Metin İçerisindeki Kelimeleri Sayma

C de Binary Search Tree(İkili Arama Ağacı) ile Metin İçerisindeki Kelimeleri Sayma

2. sınıf ta  yaptığım basit bir C  ödevi.Bir *.txt dosyası içerisindeki metini Binary Search Tree’ye diziyor.Dizerken daha önce olan bir  kelimeyle karşılaşırsa sadece sayısını 1 arttırıryor.Ve ekrana alfabetik sıralaryıp  şu kelimeden şukadar var diye yazdırıyor.Uzun zaman oldu kodda neler yaptım bilmiyorum, açıklama satırı yazamadım o yüzden  ancak işinize yarayabilir.

İşte Program:Indir

 

C de Signature Tree (İmza Ağacı)

C de Signature Tree (İmza Ağacı)

Yine ikinci sınıf ödevlerinden birisi olan imza ağacı oluşturma.

Meslea şu şekilde verilerimiz var ve kısa yoldan ulaşmak istiyoruz.

İsim                                    Çalıştıkları Alan                      Departman          Yönetici                              Maaşları


Ceyda Matthews       0123       Engineer                     Accounting         Melissa Jones                     0026000
Tammy Boger        0240           Analyst                           Dataproc.             Morris Lanchaster          0032000
Morris Lanchaster  0067      Manager                        Dataproc.              Charles Hall                         0045000
Larry Cookman      0189           Programmer               Security                 John Bittle                             0025000
David Caudle       0423              Analyst                           Accounting        Melissa Jones                        0047000
Richard Lehner     0847         Instructor                      Training              Tom Nelson                             0031000
Robert Blom        1002               Programmer                Accounting      George Steel                             0027000
Nancy White        0417            Programmer                 Operations         Curt Alexander                   0028000
Randy Wheeler      0293        Analyst                             Dataproc.            William Crocker                  0031500
John Bittle        0367                  Senior                                 Security              Robert Wilson                       0043000

Burada maaşlarına göre, Yöneticilerinin  ilk harfine göre ve departmanlarının ilk harflerine  göre  her birisi için bi imza oluşturuyoruz öncelikle.imzalar signature.dat dosyası şeklinde oluşuyor ve ordaki imzalardan yol çıkarak aradığımız şeyi diğer dosyadan buluyoruz.

Ayrıntılar rarda.

İşte Program:Indir

Size nekadar yararlı olabildiğim benim için önemlidir.Bunu, yazının başındaki oylama yıldızları ya da yorumlarınız ile belirtebilirsiniz.