Nhờ tư vấn  Ý tưởng mã hóa chuỗi bằng tọa độ C#?

daithai263

chuỗi sẽ mã hóa ntn ạ:
nếu kí tự "o" ở vị trí 0 => ~ , vị trí 1 => $ , vị trí 2 => không mã hóa
ví dụ : tet roi = > ^et r$=

thuật toán của mình làm được phân nữa test thử thì nhảy bừa qué.. bác nào biết chỉnh ở đâu lại không ạ?.
Mã:
{
            //cắt khoảng trắng, cho từng chữ vào mảng
            string[] mang = txtNhap.Text.Split(' ');

            //duyệt từng phần tử trong mảng
            for (int i =0; i<mang.Length;i++)
            {
                string chudangxet = mang;

                //VỊ TRÍ 0;
                if (chudangxet.Substring(0, 1) == "o")
                {
                    chudangxet = chudangxet.Replace("o", "~");
                }
                else if (chudangxet.Substring(0, 1) == "y")
                {
                    chudangxet = chudangxet.Replace("y", "!");
                }
                else if (chudangxet.Substring(0, 1) == "e")
                {
                    chudangxet = chudangxet.Replace("e", "@");
                }
                else if (chudangxet.Substring(0, 1) == "u")
                {
                    chudangxet = chudangxet.Replace("u", "#");
                }
                else if (chudangxet.Substring(0, 1) == "a")
                {
                    chudangxet = chudangxet.Replace("a", "$");
                }
                else if (chudangxet.Substring(0, 1) == "i")
                {
                    chudangxet = chudangxet.Replace("i", "%");
                }
                else if (chudangxet.Substring(0, 1) == "t")
                {
                    chudangxet = chudangxet.Replace("t", "^");
                }
                else if (chudangxet.Substring(0, 1) == "h")
                {
                    chudangxet = chudangxet.Replace("h", "&");
                }
                else if (chudangxet.Substring(0, 1) == "n")
                {
                    chudangxet = chudangxet.Replace("n", "*");
                }
                else if (chudangxet.Substring(0, 1) == "b")
                {
                    chudangxet = chudangxet.Replace("b", "(");
                }
                else if (chudangxet.Substring(0, 1) == "c")
                {
                    chudangxet = chudangxet.Replace("c", ")");
                }
                else if (chudangxet.Substring(0, 1) == "g")
                {
                    chudangxet = chudangxet.Replace("g", "-");
                }
                else
                    continue;

                //VỊ TRÍ 1
                if (chudangxet.Substring(1, 1) == "o")
                {
                    chudangxet = chudangxet.Replace("o", "$");
                }
                else if (chudangxet.Substring(1, 1) == "u")
                {
                    chudangxet = chudangxet.Replace("u", "!");
                }
                else if (chudangxet.Substring(1, 1) == "t")
                {
                    chudangxet = chudangxet.Replace("t", "@");
                }
                else if (chudangxet.Substring(1, 1) == "h")
                {
                    chudangxet = chudangxet.Replace("h", "=");
                }
                else if (chudangxet.Substring(1, 1) == "b")
                {
                    chudangxet = chudangxet.Replace("b", "*");
                }
                else if (chudangxet.Substring(1, 1) == "c")
                {
                    chudangxet = chudangxet.Replace("c", "#");
                }

                //VỊ TRÍ 2
                if (chudangxet.Substring(2, 1) == "y")
                {
                    chudangxet = chudangxet.Replace("y", "#");
                }
                else if (chudangxet.Substring(2, 1) == "e")
                {
                    chudangxet = chudangxet.Replace("e", "$");
                }
                else if (chudangxet.Substring(2, 1) == "a")
                {
                    chudangxet = chudangxet.Replace("a", "^");
                }
                else if (chudangxet.Substring(2, 1) == "i")
                {
                    chudangxet = chudangxet.Replace("i", "=");
                }
                else if (chudangxet.Substring(2, 1) == "n")
                {
                    chudangxet = chudangxet.Replace("n", "@");
                }
                else if (chudangxet.Substring(2, 1) == "g")
                {
                    chudangxet = chudangxet.Replace("g", "(");
                }
                else
                    continue;
           
                //VỊ TRÍ 3
            }
            // nối chuỗi lại
            string themkhoangcach = string.Join(" ", mang);
            txtMaHoa.Text = themkhoangcach;
        }
 
Sửa lần cuối:
Trả lời

dammage

Rìu Bạc
lâu quá không đụng tới c# quên hết trơn rồi, hình như bạn sai cái hàm replace, đọc được ở đây
https://docs.microsoft.com/en-us/dotnet/api/system.string.replace?view=netframework-4.8#System_String_Replace_System_String_System_String_

hàm replace sẽ thay thế tấc cả chuỗi 1 bằng chuỗi 2, giả sử cho chuỗi "casablanca", bạn gọi hàm chudangxet.Replace("a", "^"); thì tấc cả chữ a sẽ bị thay bằng ^, thành ra "c^s^bl^nc^"

theo tui thì mình cứ truy xuất thẳng kí tự trong chuỗi thôi, đâu cần trích xuất substring này nọ làm gì
C#:
{
    //cắt khoảng trắng, cho từng chữ vào mảng
    string[] mang = txtNhap.Text.Split(' ');

    //duyệt từng phần tử trong mảng
    for (int i =0; i<mang.Length;i++)
    {
        string chudangxet = mang[i];

        //VỊ TRÍ 0;
        if (chudangxet[0] == 'o')
        {
            chudangxet[0] = '~';
        }
        else if (chudangxet[0] == 'y')
        {
            chudangxet[0] = '!';
        }
        else if chudangxet[0] == 'e')
        {
            chudangxet[0] = '@';
        }
        else if chudangxet[0] == 'u')
        {
            chudangxet[0] = '#';
        }
        else if chudangxet[0] == 'a')
        {
            chudangxet[0] = '$';
        }
        else if chudangxet[0] == 'i')
        {
            chudangxet[0] = '%';
        }
        else if chudangxet[0] == 't')
        {
            chudangxet[0] = '^';
        }
        else if chudangxet[0] == 'h')
        {
            chudangxet[0] = '&';
        }
        else if chudangxet[0] == 'n')
        {
            chudangxet[0] = '*';
        }
        else if (chudangxet[0] == 'b')
        {
            chudangxet[0] = '(';
        }
        else if (chudangxet[0] == 'c')
        {
            chudangxet[0] = ')';
        }
        else if (chudangxet[0] == 'g')
        {
            chudangxet[0] = '-';
        }
        else
            continue;

        //VỊ TRÍ 1
        if (chudangxet[1] == 'o')
        {
            chudangxet[1] = '$';
        }
        else if (chudangxet[1] == 'u')
        {
            chudangxet[1] = '!';
        }
        else if (chudangxet[1] == 't')
        {
            chudangxet[1] = '@';
        }
        else if (chudangxet[1] == 'h')
        {
            chudangxet[1] = '=';
        }
        else if (chudangxet[1] == 'b')
        {
            chudangxet[1] = '*';
        }
        else if (chudangxet[1] == 'c')
        {
            chudangxet[1] = '#';
        }

        //VỊ TRÍ 2
        if (chudangxet[2] == 'y')
        {
            chudangxet[2] = '#';
        }
        else if (chudangxet[2] == 'e')
        {
            chudangxet[2] = '$';
        }
        else if (chudangxet[2] == 'a')
        {
            chudangxet[2] = '^';
        }
        else if (chudangxet[2] == 'i')
        {
            chudangxet[2] = '=';
        }
        else if (chudangxet[2] == 'n')
        {
            chudangxet[2] = '@';
        }
        else if (chudangxet[2] == 'g')
        {
            chudangxet[2] = '(';
        }
        else
            continue;

        //VỊ TRÍ 3
    }

    // nối chuỗi lại
    string themkhoangcach = string.Join(" ", mang);
    txtMaHoa.Text = themkhoangcach;
}
không biết bạn học switch chưa, nếu học rồi thì có thể xài switch thay cho if
C#:
        string chudangxet = mang[i];

        //VỊ TRÍ 0;
        switch(chudangxet[0])
        {
            case 'o':
                chudangxet[0] = '~';
                break;
            case 'y':
                chudangxet[0] = '!';
                break;
            case 'e':
                chudangxet[0] = '@';
                break;
            case 'u':
                chudangxet[0] = '#';
                break;
            case 'a':
                chudangxet[0] = '$';
                break;
            case 'i':
                chudangxet[0] = '%';
                break;
            case 't':
                chudangxet[0] = '^';
                break;
            case 'h':
                chudangxet[0] = '&';
                break;
            case 'n'
                chudangxet[0] = '*';
                break;
            case 'b':
                chudangxet[0] = '(';
                break;
            case 'c':
                chudangxet[0] = ')';
                break;
            case 'g':
                chudangxet[0] = '-';
                break;
            default:
                continue;
                break;
        }
        .......
        vị trí 1 với 2 cũng tương tự
sau này học lên mấy cái collection thì bạn có thể xài dictionary để xây dựng cái bảng mã hóa luôn

quên, thêm 1 cái góp ý nữa, lần sau post code bạn nhớ bỏ vô tag [ CODE ] như tui ở trên vậy đó, post khơi khơi vậy dễ bị lỗi lắm, như cái mang[ i ] bị nó hiểu lầm thành tag in nghiêng, thành ra [ i ] bị ẩn mất tiêu còn có mang không à
 

daithai263

Búa Gỗ Đôi
Thử kiểu thủ công ntn xem được ko nhé bạn {yes}

C#:
string[] m = chuoibandau.Split(' ');
int id;
for (int i = 0; i < m.Length; i++)
{
string s = m[i];
if ((id = s.IndexOf("t", 0, s.Length)) == 0)
{
s = s.Remove(id, 1);
s = s.Insert(id, "^");
}
//
}
dòng
if ((id = s.IndexOf("t", 0, s.Length)) == 0)
{
s = s.Remove(id, 1);
s = s.Insert(id, "^");

chưa học nên ch hiểu lắm, cảm ơn bác.
 

daithai263

Búa Gỗ Đôi
lâu quá không đụng tới c# quên hết trơn rồi, hình như bạn sai cái hàm replace, đọc được ở đây
https://docs.microsoft.com/en-us/dotnet/api/system.string.replace?view=netframework-4.8#System_String_Replace_System_String_System_String_

hàm replace sẽ thay thế tấc cả chuỗi 1 bằng chuỗi 2, giả sử cho chuỗi "casablanca", bạn gọi hàm chudangxet.Replace("a", "^"); thì tấc cả chữ a sẽ bị thay bằng ^, thành ra "c^s^bl^nc^"

theo tui thì mình cứ truy xuất thẳng kí tự trong chuỗi thôi, đâu cần trích xuất substring này nọ làm gì
C#:
{
    //cắt khoảng trắng, cho từng chữ vào mảng
    string[] mang = txtNhap.Text.Split(' ');

    //duyệt từng phần tử trong mảng
    for (int i =0; i<mang.Length;i++)
    {
        string chudangxet = mang[i];

        //VỊ TRÍ 0;
        if (chudangxet[0] == 'o')
        {
            chudangxet[0] = '~';
        }
        else if (chudangxet[0] == 'y')
        {
            chudangxet[0] = '!';
        }
        else if chudangxet[0] == 'e')
        {
            chudangxet[0] = '@';
        }
        else if chudangxet[0] == 'u')
        {
            chudangxet[0] = '#';
        }
        else if chudangxet[0] == 'a')
        {
            chudangxet[0] = '$';
        }
        else if chudangxet[0] == 'i')
        {
            chudangxet[0] = '%';
        }
        else if chudangxet[0] == 't')
        {
            chudangxet[0] = '^';
        }
        else if chudangxet[0] == 'h')
        {
            chudangxet[0] = '&';
        }
        else if chudangxet[0] == 'n')
        {
            chudangxet[0] = '*';
        }
        else if (chudangxet[0] == 'b')
        {
            chudangxet[0] = '(';
        }
        else if (chudangxet[0] == 'c')
        {
            chudangxet[0] = ')';
        }
        else if (chudangxet[0] == 'g')
        {
            chudangxet[0] = '-';
        }
        else
            continue;

        //VỊ TRÍ 1
        if (chudangxet[1] == 'o')
        {
            chudangxet[1] = '$';
        }
        else if (chudangxet[1] == 'u')
        {
            chudangxet[1] = '!';
        }
        else if (chudangxet[1] == 't')
        {
            chudangxet[1] = '@';
        }
        else if (chudangxet[1] == 'h')
        {
            chudangxet[1] = '=';
        }
        else if (chudangxet[1] == 'b')
        {
            chudangxet[1] = '*';
        }
        else if (chudangxet[1] == 'c')
        {
            chudangxet[1] = '#';
        }

        //VỊ TRÍ 2
        if (chudangxet[2] == 'y')
        {
            chudangxet[2] = '#';
        }
        else if (chudangxet[2] == 'e')
        {
            chudangxet[2] = '$';
        }
        else if (chudangxet[2] == 'a')
        {
            chudangxet[2] = '^';
        }
        else if (chudangxet[2] == 'i')
        {
            chudangxet[2] = '=';
        }
        else if (chudangxet[2] == 'n')
        {
            chudangxet[2] = '@';
        }
        else if (chudangxet[2] == 'g')
        {
            chudangxet[2] = '(';
        }
        else
            continue;

        //VỊ TRÍ 3
    }

    // nối chuỗi lại
    string themkhoangcach = string.Join(" ", mang);
    txtMaHoa.Text = themkhoangcach;
}
không biết bạn học switch chưa, nếu học rồi thì có thể xài switch thay cho if
C#:
        string chudangxet = mang[i];

        //VỊ TRÍ 0;
        switch(chudangxet[0])
        {
            case 'o':
                chudangxet[0] = '~';
                break;
            case 'y':
                chudangxet[0] = '!';
                break;
            case 'e':
                chudangxet[0] = '@';
                break;
            case 'u':
                chudangxet[0] = '#';
                break;
            case 'a':
                chudangxet[0] = '$';
                break;
            case 'i':
                chudangxet[0] = '%';
                break;
            case 't':
                chudangxet[0] = '^';
                break;
            case 'h':
                chudangxet[0] = '&';
                break;
            case 'n'
                chudangxet[0] = '*';
                break;
            case 'b':
                chudangxet[0] = '(';
                break;
            case 'c':
                chudangxet[0] = ')';
                break;
            case 'g':
                chudangxet[0] = '-';
                break;
            default:
                continue;
                break;
        }
        .......
        vị trí 1 với 2 cũng tương tự
sau này học lên mấy cái collection thì bạn có thể xài dictionary để xây dựng cái bảng mã hóa luôn

quên, thêm 1 cái góp ý nữa, lần sau post code bạn nhớ bỏ vô tag [ CODE ] như tui ở trên vậy đó, post khơi khơi vậy dễ bị lỗi lắm, như cái mang[ i ] bị nó hiểu lầm thành tag in nghiêng, thành ra [ i ] bị ẩn mất tiêu còn có mang không à
Tìm hiểu switch cũng dễ nhưng sau lên sữa = thành == cũng đỏ lòm v bác.. có vẻ ổn :3
 

lvt491

Rìu Sắt
dòng
if ((id = s.IndexOf("t", 0, s.Length)) == 0)
{
s = s.Remove(id, 1);
s = s.Insert(id, "^");

chưa học nên ch hiểu lắm, cảm ơn bác.
Ý nghĩa là kiểm tra nếu ký tự "t" nằm ở vị trí index = 0 trong chuỗi s thì xóa ký tự "t" và thay bằng ký tự "^".
Tương tự với các ký tự khác ở vị trí khác trong chuỗi bạn tự suy luận nhé.

Chỗ s.IndexOf("t", 0, s.Length) bạn có thể viết gọn lại thành s.IndexOf("t")
 

dammage

Rìu Bạc
Tìm hiểu switch cũng dễ nhưng sau lên sữa = thành == cũng đỏ lòm v bác.. có vẻ ổn :3
nó báo read only nghĩa là không cho gán trực tiếp kiểu đó, vậy chắc phải xài 2 hàm remove với insert như bạn ở trên quá, lâu rồi tui hông đụng tới c# hông nhớ nữa

đọc kỹ lại post đầu hình như bạn bị dính 1 lỗi nữa thì phải
C#:
{
    //cắt khoảng trắng, cho từng chữ vào mảng
    string[] mang = txtNhap.Text.Split(' ');

    //duyệt từng phần tử trong mảng
    for (int i =0; i<mang.Length;i++)
    {
        string chudangxet = mang[i];

        .............
    }

    // nối chuỗi lại
    string themkhoangcach = string.Join(" ", mang);
    txtMaHoa.Text = themkhoangcach;
}
trong vòng for bạn copy từ mang[ i ] ra chudangxet đúng hông, sau đó mọi thao tác thay thế gì đó là đều trên cái chudangxet này hết, đâu có thay thế trong mang[ i ] đâu, như vậy cuối cùng bạn nối chuỗi lại cũng thành ra như chuỗi ban đầu à, chắc phải sửa lại như vầy
C#:
//duyệt từng phần tử trong mảng
for (int i =0; i<mang.Length;i++)
{
    //VỊ TRÍ 0;
    switch(mang[i])
    {
        case 'o':
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, "~");
            break;
        case 'y':
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, "!");
            break;
        case 'e':
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, "@");
            break;
        case 'u':
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, "#");
            break;
        case 'a':
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, "$");
            break;
        case 'i':
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, "%");
            break;
        case 't':
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, "^");
            break;
        case 'h':
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, "&");
            break;
        case 'n'
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, "*");
            break;
        case 'b':
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, "(");
            break;
        case 'c':
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, ")");
            break;
        case 'g':
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, "-");
            break;
        default:
            continue;
            break;
    }
}

// nối chuỗi lại
string themkhoangcach = string.Join(" ", mang);
txtMaHoa.Text = themkhoangcach;
tui hông có cài c# nên hông chạy test được, bạn tự test rồi bổ sung thêm nha
 

daithai263

Búa Gỗ Đôi
nó báo read only nghĩa là không cho gán trực tiếp kiểu đó, vậy chắc phải xài 2 hàm remove với insert như bạn ở trên quá, lâu rồi tui hông đụng tới c# hông nhớ nữa

đọc kỹ lại post đầu hình như bạn bị dính 1 lỗi nữa thì phải
C#:
{
    //cắt khoảng trắng, cho từng chữ vào mảng
    string[] mang = txtNhap.Text.Split(' ');

    //duyệt từng phần tử trong mảng
    for (int i =0; i<mang.Length;i++)
    {
        string chudangxet = mang[i];

        .............
    }

    // nối chuỗi lại
    string themkhoangcach = string.Join(" ", mang);
    txtMaHoa.Text = themkhoangcach;
}
trong vòng for bạn copy từ mang[ i ] ra chudangxet đúng hông, sau đó mọi thao tác thay thế gì đó là đều trên cái chudangxet này hết, đâu có thay thế trong mang[ i ] đâu, như vậy cuối cùng bạn nối chuỗi lại cũng thành ra như chuỗi ban đầu à, chắc phải sửa lại như vầy
C#:
//duyệt từng phần tử trong mảng
for (int i =0; i<mang.Length;i++)
{
    //VỊ TRÍ 0;
    switch(mang[i])
    {
        case 'o':
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, "~");
            break;
        case 'y':
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, "!");
            break;
        case 'e':
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, "@");
            break;
        case 'u':
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, "#");
            break;
        case 'a':
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, "$");
            break;
        case 'i':
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, "%");
            break;
        case 't':
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, "^");
            break;
        case 'h':
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, "&");
            break;
        case 'n'
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, "*");
            break;
        case 'b':
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, "(");
            break;
        case 'c':
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, ")");
            break;
        case 'g':
            mang[i] = mang[i].Remove(0, 1);
            mang[i] = mang[i].Insert(0, "-");
            break;
        default:
            continue;
            break;
    }
}

// nối chuỗi lại
string themkhoangcach = string.Join(" ", mang);
txtMaHoa.Text = themkhoangcach;
tui hông có cài c# nên hông chạy test được, bạn tự test rồi bổ sung thêm nha
OK ạ, cảm ơn bạn đã tận tình nha, để mình test thử.
 

Handrf

Búa Đá Đôi
mình hơi gà C# nên code hơi ngáo. k biết trùng với ý tưởng bác nào chưa. lười đọc code các bác quá

Dùng dictionary để lưu bảng mã với từ khóa (key) là ký tự cần mã hóa, giá trị (value) là một mảng lưu các ký tự đã được mã hóa theo vị trí. mảng này lưu các ký tự đã được mã hóa có vị trí và giá trị tương ứng với vị trí và giá trị của key sau khi được mã hóa. ví dụ ký tự "a" tại vị trí 1 sau khi mã hóa sẽ thành "&" -> mảng value sẽ là ["KyTu0", "&", "KyTu2"...]. vậy là value[1] == "&".
như vậy chỉ cần biết ký tự cần mã hóa là lấy được "bảng" mã hóa của ký tự đó. sau đó chỉ cần truyền vị trí của nó vào trong "bảng" mã vừa lấy là sẽ được ký tự sau khi mã hóa.

C#:
        static void Main(string[] args)
        {
            // bang ma hoa
            string[] o = { "~", "$", "o", "=", "o", "o", "@" };
            string[] y = { "!", "y", "#", "y", "*", "y", "^" };
            string[] e = { "@", "e", "$", "#", "e", "=", "e" };
            string[] u = { "#", "!", "u", "@", "u", "u", "*" };
            string[] a = { "$", "a", "^", "a", "!", "#", "a" };
            string[] i = { "%", "i", "=", "*", "i", "(", "i" };
            string[] t = { "^", "@", "t", "$", "t", "t", ")" };

            // su dung dict de luu va truy xuat
            Dictionary<string, string[]> encodeTable = new Dictionary<string, string[]>();
            encodeTable.Add("o", o);
            encodeTable.Add("y", y);
            encodeTable.Add("e", e);
            encodeTable.Add("u", u);
            encodeTable.Add("a", a);
            encodeTable.Add("i", i);
            encodeTable.Add("t", t);

            // Nhap du lieu vao
            Console.Write(">> ");
            string input = Console.ReadLine();
            string output = "";

            for (int j = 0; j < input.Length; j++)
            {
                // ky tu can ma hoa. check xem co o trong bang ma k?
                string key = input[j].ToString();
                string encodedString = key;
                if (encodeTable.ContainsKey(key))
                {

                    string[] value = encodeTable[key];
                    // trong pham vi thi ma hoa. ngoai pham vi thi giu nguyen
                    if (j < value.Length)
                        encodedString = value[j];
                }
                output += encodedString;
            }
            Console.WriteLine("<< " + output);
            Console.ReadLine();
        }