1

在我尝试要求任何事情之前,我会尽量澄清事情。所以我目前正在高中作为一名程序员学习。最近我的老师让我在 RAD Studio XE3 中创建一个 VCL 表单应用程序,有点像 C 程序,但只有表单和东西。

我必须创建矩阵 N*M(最终是二维字符数组),其中存储有拉丁字符。然后我不得不用插入排序方法对其进行排序。所以到目前为止我所做的是,我定义了数组,我创建了一个 StringGrid1 从中读取这些字符。我将它们存储到二维字符数组中,但对我来说最难的是让它按字母顺序对这些字符进行排序,但我不必将所有内容排序在一起,只需将每一行单独排序,然后进行最终更改回到 StringGrid1 (这不是问题)。

正如我之前所说,我在使这种事情发挥作用时遇到了一些重大困难。我已经浏览了十亿个例子,在 Google 上搜索了类似的 AGE。如果这些是整数值,那将一事无成,但我什至无法忍受 C 讨厌 String 值的事情。

我的程序:

http://i.stack.imgur.com/Brx9X.jpg

这就是我设法从 StringGrid1 字符读取并将它们存储到数组 [i] [j] 中的方式。mmax 和 nmax 用于告诉阅读的距离,因为用户可以自己选择行和列数。

    for(int i=0; i < mmax; i++)    //Rindas (kolonnas)
    {
        for(int j=0; j < nmax; j++) //Kolonnas (rindas)
            {
                char * temp = (char*)(StringGrid1->Cells[i][j]).c_str();    //Nolasam no Edit lauka char elementu
                array[i][j] = temp[0];       //Piešķiram masīvam šo elementu
                ListBox1->Items->Add(array[i][j]);    //Ierakstam ListBox1 masīva elementu
                Button3->Enabled = False;
                Button6->Enabled = True;

            }
    }
StringGrid1->Options = StringGrid1->Options >> goEditing;  //Neatļauj lietotājam rediģēt StringGrid1 laukus

所以,现在是排序的事情......我该怎么做?我没有线索了。如何从二维中对字符进行排序,以便每一行都应该单独排序,例如,有 5 行,并且每一行都被一一排序。

4

1 回答 1

0

首先,您没有正确填充数组。这一行:

char * temp = (char*)(StringGrid1->Cells[i][j]).c_str();

从属性中获取一个临时 实例,通过其方法获取指向其内部数据的指针,然后在超出范围时释放它,使指针悬空,使其在此行无效:StringCellsc_str()String

array[i][j] = temp[0];

您的数组恰好以正确的字符值结束,但这只是因为 aString的内部数据被引用计数,并且TStringGrid仍然对原始String值有活动引用,所以String数据还没有从内存中物理释放,所以你的temp指针仍然指向仍然存在的原始内存,但这是您不应该依赖的实现细节。

改用这个:

String temp = StringGrid1->Cells[i][j];
array[i][j] = temp[1]; // or temp.c_str()[0]

或这个:

array[i][j] = StringGrid1->Cells[i][j][1]; // or StringGrid1->Cells[i][j].c_str()[0]

现在,话虽如此,实际的排序逻辑相当简单,特别是如果您使用 STL 为您进行实际排序,例如:

#include <algorithm>

for(int i=0; i < mmax; i++)
{
    std::sort(&(array[i][0]), &(array[i][nmax]));
}

如果您需要对排序进行更多控制,可以使用自定义比较功能:

#include <algorithm>

bool my_compare(char a, char b)
{
    // return true if the first argument is less than the second, otherwise return false.
}

for(int i=0; i < mmax; i++)
{
    std::sort(&(array[i][0]), &(array[i][nmax]), my_compare);
}
于 2013-02-28T02:31:28.327 回答