<< 基本交換法 | top | アセンブリ言語 >>

スポンサーサイト

一定期間更新がないため広告を表示しています

スポンサードリンク | - | | - | - |

複素数のバブルソート

 基本交換法の別名はバブルソートらしい。

バブルソートなら聞いたことある。

今回は基本情報とはあんまり関係ない話。

オブジェクト指向のメリットのひとつ、型の隠蔽について。

今ここにIntegerというクラスがあったとする。

Integer配列を引数とするSort(Integer *i)という関数があったとしよう。

この間数はInteger配列をバブルソートする関数とする。

バブルソートは絶対値を比較して行うとする。

ここで、複素数のバブルソートを行いたくなったとする。

つまり、複素数を絶対値順に並び替えたい。

Complexというクラスを作ってSort(Complex *c)という関数を作ればよい。

しかし、次のようなことをすればもっとエレガントにできる。

Integer及びComplexはValueという基本クラスの派生クラスとする。

Valueはメンバ変数として絶対値という概念を持っている。

バブルソート関数はSort(Value *v)というふうにする。

このように作っておけばいちいち型に合わせてSort関数を作らなくても

型キャストを行うことで対応できる。

設計の際に、将来変わりそうなところを予測して基本クラスでくくっておくと、

あとで対応が楽なのだ。

Sort関数は派生クラスを意識する必要はなく、派生クラスの隠蔽になっている。

実行結果の一部は下。ソースは続きから。


 #include <iostream>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#define N 100
using namespace std;

class Value
{
    public:
    int Abs2;
    public:
    virtual void Print() = 0;
};

class Integer : public Value
{
  private:
  int R;
  public:
  Integer()
  {
      R = rand() % 100;
      Abs2 = R*R;
  }
  void Print()
  {
      cout << "値は" << R << " 絶対値は" << Abs2 << endl;
  }
};
class Complex : public Value
{
    private:
    int Real,Imag;
    public:
    Complex()
    {
        Real = rand() % 100;
        Imag = rand() % 100;
        Abs2 = Real*Real + Imag*Imag;
    }
    void Print()
    {
        cout << "値は" << Real << "+" << Imag << "i" << "絶対値は" << Abs2 << endl;
    }
};

class Sort
{
    private:
    Value **value;
    void Kokan(int min,int max)
    {
        int i;
        Value *temp;
        for(i=min;i<max;i++)
        {
            if(value[i]->Abs2 > value[i+1]->Abs2)
            {
                temp = value[i];
                value[i] = value[i+1];
                value[i+1] = temp;
            }
        }
    }
    public:
    Sort(Value **value)
    {
        this->value = value;
        int i;
        for(i=N-1;i>0;i--)
        {
            Kokan(0,i);
        }
    }
};

int main()
{
    srand((unsigned int)time(NULL));
    Integer *integer[N];
    Complex *COmplex[N];
    int i;

    for(i=0;i<N;i++)
    {
        integer[i] = new Integer();
        COmplex[i] = new Complex();
        COmplex[i]->Print();
        //integer[i]->Print();
    }

    cout << "################################" << endl;

    Sort sort((Value**)integer);
    Sort sort2((Value**)COmplex);
    for(i=0;i<N;i++)
    {
        COmplex[i]->Print();
        //integer[i]->Print();
    }

    for(i=0;i<N;i++)
    {
        delete integer[i];
    }


    return 0;
}

ジャジャガッチ | 基本情報技術者試験 | 22:36 | comments(0) | trackbacks(0) |

スポンサーサイト

スポンサードリンク | - | 22:36 | - | - |
Comment









Trackback
URL:

07
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
--
>>
<<
--
PR
RECOMMEND
RECENT COMMENT
MOBILE
qrcode
OTHERS
Since 2013/09/17
LATEST ENTRY
CATEGORY
ARCHIVE
LINKS
PROFILE
SEARCH