課題5

さて、前期最後にして最大の課題です。覚悟して取り組んでください。

このようなプログラムを作ってください。

条件1:

上のテキストボックスに空白(半角)で区切った数字を入力てボタンを押すと

上の図のように昇順に並べて表示します。

条件2:

ウインドウのどこかにラベルを使ってあなたの名前と学籍番号を表示してください。

条件3:

実行ファイルを提出してください。

ProjectX.exe(Xは数字)となっているはずなのでこれを

ユーザ名-5.exeとして提出してください。

提出するファイルはこのような感じになるのではないでしょうか。

 

これくらいのプログラムがパパッと書けるようになるとなかなかのプログラマーになったと言えると思います。


 

ヒント1:

エディットボックスに入力されるのは文字列なのでこれを空白で分解して分解したものをそれぞれ数字にして配列に格納しないといけません。

配列の要素は動的に確保する(STLを使うかnew演算子を使う)のがベターですが、数字は100個までという制限を付けても構いません。

ヒント2:

並べ替えの関数は以前作りましたね。でも、並べ替える数字の個数は固定でした。この課題では個数が変わるのでこれを何とかしないといけません。

ヒント3:

AnsiStringという便利な文字列クラスがあります。これを使うと文字列を数字にすることも簡単にできます。Helpやインターネットで調べてください。

AnsiStringで整数を文字にするには
AnsiString a;
int i = 100;
a.sprintf("%d", i);
のようにします。

逆に文字を数字にするには、
AnsiString a = "100";
int i = a.ToInt();
のようにします。

文字列クラスを使わないなら、atoiという関数を使うという方法もあります。Helpやインターネットで調べてください。


ヒント4:

文字列をどうやって分割して数字にするかが問題ですね。

これは、分割して数字にする関数の一例です。

void split(AnsiString& text, std::vector<int>& v)
{
    for(int i = 0; i < text.Length(); i++)
    {
        if(text[i+1] == ' ')
        {
            AnsiString tmp = text.SubString(i, text.Length() - i);
            split(tmp, v);
        }
        else

        {
            int c = i;
            int t;
            for(t = i; t < text.Length(); t++)
            {
                if(text[t+1] == ' ') break;
            }
            AnsiString s = text.SubString(c +1, t - c +1);
            AnsiString s2 = s.Trim();
            v.push_back(s2.ToInt());
            i = t;
        }
    }
}

各機能はHELPで調べてください。

使い方はこんな感じです。

std::vector<int> v; //配列を定義しておいて

split(Edit1->Text, v);//Edit1ボックスの文字列を分解して数字にして、vに数字として入れる。