Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Строки. Замена нескольких подряд входящих символов


Автор: Metalex 10.3.2010, 21:17
Всем доброго времени суток! Помогите мне, пожалуйста, с C#! 
Задача такова:
Разработать архиватор: символы строки, которые повторяются заменить на последовательность - СиволЧислоПовторений, например: «fehhh   eryaaa» должна быть преобразована в строку вида: «feh3 erya3». Также реализовать обратную расшифровку.
Я попытался сделать средствами С++ не затрагивая СиШарп, но и там не все до конца получается..

Автор: Fortnox 11.3.2010, 00:11
Шифрование:
Код

       private static string Encrypt(string input)
        {
            int count = 0;
            string outStr = "";
            char ch = ' ';

            // проходим по символам в строке
            for (int i = 0; i <= input.Length - 1; i++)
            {
                ch = input[i]; // запоминаем текущий символ 

                // цикл по проходу от текущего символа к концу строки 
                // (на случай, если до конца строки идет один и тот же символ)
                for (int j = i; j <= input.Length - 1; j++)
                {
                    // если текущий символ не равен начальному, то выходим из цикла, то есть:
                    // fehhgh
                    //   | |
                    //   |  --- значение input[j]
                    //   |
                    //   --- значение переменной ch
                    // input[j] не равно ch - значит символ уже не тот, выходим из цикла.
                    if (input[j] != ch)
                        break;
                    // иначе (символ все еще тот же), увеличиваем его кол-во (переменная count)
                    else
                        count++;
                }
                // добавляем текущий символ к нашей выходной строке
                outStr += ch; 

                // если символ встретился более одного раза
                if (count != 1)
                {
                    // добавляем значение переменной count к строке
                    outStr += count.ToString();
                    // устанавливаем значение счетчика равным количеству повторений символа минус 1
                    i += --count;
                }
                // сбрасываем счетчик количества повторений символа в 0
                count = 0;
            }
            return outStr;
        }


Расшифрование:
Код

private static string Decrypt(string input)
        {
            char ch = ' ';
            string outStr = "";

            // проходим по строке
            for (int i = 0; i <= input.Length - 1; i++)
            {
                // запоминаем текущий символ
                ch = input[i];

                // если текущий символ является цифрой
                if (char.IsDigit(ch))
                {
                    // конвертируем его в целочисленной значение
                    int len = Convert.ToInt32(ch.ToString());

                    // добавляем это значение в виде повторений символа ch в выходную строку
                    for (int j = 0; j <= len - 2; j++)
                        outStr += input[i - 1];
                }
                // иначе, добавляем символ к выходной строке
                else
                    outStr += ch;
            }
            return outStr;
        }


Вывод:
Код

Enter string: fehhh eryaaa
feh3 erya3
fehhh eryaaa

Автор: Metalex 11.3.2010, 00:25
Fortnox, огромная просьба: прокомментируй код....

Автор: Fortnox 11.3.2010, 00:37
Metalex, каюсь: после отправки сообщения, посмотрел на код и понял, что надо его прокомментировать. Сделано (первое сообщение отредактировано)

Автор: Metalex 11.3.2010, 00:59
Fortnox, Огромное спасибо! Завтра на чистую голову разбиратся буду.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)