Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2012, 01:39   #1
Dark~VIN
Пользователь
 
Аватар для Dark~VIN
 
Регистрация: 30.04.2012
Сообщений: 21
Сообщение Архивирование строки

Здравствуйте.
Задали в универе лабораторную по C#. Сужу над ней уже сколько времени, не могу написать эту элементарщину. Ребята, помогите с этим заданием, пожалуйста!

Розробити архіватор: символи строки, що повторюються, заміняти на послідовність – {символЧислоПовторювань}, наприклад: «fehhh eryaaa» повинна перетворитися на строку виду «feh3 erya3». Також реалізувати зворотну функцію програми.
Завтра будет.
Лучше.
Dark~VIN вне форума Ответить с цитированием
Старый 01.05.2012, 01:58   #2
Рико
Пользователь
 
Регистрация: 30.04.2012
Сообщений: 31
По умолчанию

Возможно, если бы писали по русски, вам бы быстрее помогли
ася- 391166346
почта- riko07@mail.ru
skype- riko0760
Рико вне форума Ответить с цитированием
Старый 01.05.2012, 02:35   #3
Dark~VIN
Пользователь
 
Аватар для Dark~VIN
 
Регистрация: 30.04.2012
Сообщений: 21
Сообщение

Я просто скопировал с методички. Щас переведу (самому тяжело на украинском):

Разработать архиватор: символы строки, которые повторяются, заменить на последовательность – {символЧислоПовторений}, например: «fehhh eryaaa» должна превратиться на строку вида «feh3 erya3». Также реализовать обратную функцию программы.
Завтра будет.
Лучше.

Последний раз редактировалось Dark~VIN; 01.05.2012 в 02:44.
Dark~VIN вне форума Ответить с цитированием
Старый 01.05.2012, 03:08   #4
Рико
Пользователь
 
Регистрация: 30.04.2012
Сообщений: 31
По умолчанию

тут посимвольный проход строки, для каждого символа строки цикл типа while (пока символ совпадает с предыдущим считаем его), смотрим если переменная счета равна 1, то просто пишем символ, иначе пишем символ плюс цифру.

Обратно: тоже посимвольный проход, только работа с текущим символом и следующим, если следующий цифра, то текущий записываем нужное число раз. На компе нет C# , если нужен код, могу сделать, но только вечером
ася- 391166346
почта- riko07@mail.ru
skype- riko0760

Последний раз редактировалось Рико; 01.05.2012 в 03:10.
Рико вне форума Ответить с цитированием
Старый 01.05.2012, 10:47   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Строго говоря, предложенный метод "архивации" является необратимым, т.е. по "сжатому" тексту невозможно восстановить первоначальный.
Приведите формулировку задания полностью.

Пример: попытайтесь сжать "q1h333bbb6a" этим алгоритмом, а потом подумайте, что будете делать с результатом.
s-andriano вне форума Ответить с цитированием
Старый 01.05.2012, 11:52   #6
Рико
Пользователь
 
Регистрация: 30.04.2012
Сообщений: 31
По умолчанию

Гы..Весь смысл не в том , что бы написать реальный архиватор, а в том что бы научиться обрабатывать строки. Тут не указано, но скорее всего подразумевается, что начальная строка состоит только из символов не цифр. У меня жена подобные задания даёт студентам первого курса, что бы научить работать со строками
ася- 391166346
почта- riko07@mail.ru
skype- riko0760
Рико вне форума Ответить с цитированием
Старый 01.05.2012, 12:25   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Рико Посмотреть сообщение
Гы..Весь смысл не в том , что бы написать реальный архиватор, а в том что бы научиться обрабатывать строки. Тут не указано, но скорее всего подразумевается, что начальная строка состоит только из символов не цифр.
В условии этого нет.
И тех преподавателей, которые дают студентам подобные задания, следует стучать по башке. Причем, нещадно! Т.к. они прививают студентам вредные навыки. А переучиваться потом существенно сложнее, чем с самого начала учиться правильно.

В исходной формулировке возможно написать "сжиматель", притом, он должен уметь работать с любыми символами. Но невозможно написать "расжиматель". И студент это должен четко осознавать. А если преподаватель ему в этом препятствует... мне жалко студентов этого преподавателя.

В данном конкретном случае у студентов есть реальная возможность "настучать преподавателю по башке". И мне кажется, что это непременно нужно сделать. Потому как вреда от такого "педагога" существенно больше, чем пользы.
s-andriano вне форума Ответить с цитированием
Старый 01.05.2012, 12:47   #8
Рико
Пользователь
 
Регистрация: 30.04.2012
Сообщений: 31
По умолчанию

Согласен, что с определение "архиватор" препод перестарался, НО наши шибко умные студенты "просто задачи" делать не хотят, им подавай "а зачем это надо", вот и исхитряются преподаватели
ася- 391166346
почта- riko07@mail.ru
skype- riko0760
Рико вне форума Ответить с цитированием
Старый 01.05.2012, 13:31   #9
Dark~VIN
Пользователь
 
Аватар для Dark~VIN
 
Регистрация: 30.04.2012
Сообщений: 21
По умолчанию

Прислал мне ответ по почте некий глубокоуважаемый Reskov с кодом...

Чуть переделал под себя....

Значит сжатие строки работает:
Код:
private void button1_Click(object sender, EventArgs e)
        {            
            if (textBox1.Text != "")
            {
                String stringToMatch = textBox1.Text;
                var p = new Regex(@"(\w)\1+");

                var items = p.Matches(stringToMatch);
                foreach (Match m in items)
                {
                    if (m.Success)
                    {
                        string val = m.Groups[0].Value;
                        int ind = stringToMatch.IndexOf(val) + 1;
                        stringToMatch = stringToMatch.Substring(0, ind) + val.Length + stringToMatch.Substring(ind + val.Length - 1);
                    }
                }
                label2.Text = stringToMatch;
            }
        }
А вот в обратном действии ругается на Enumerable.Repeat(stringToMatch[ind - 1], count - 1)

Пишет:
Error 1 The best overloaded method match for 'string.Join(string, string[])' has some invalid arguments
Error 2 Argument 2: cannot convert from 'System.Collections.Generic.IEnumer able<char>' to 'string[]'


Код:
 private void button2_Click(object sender, EventArgs e)
        {
            if (textBox1.Text != "")
            {
                String stringToMatch = textBox1.Text;
                var p = new Regex(@"(\d+)");

                var items = p.Matches(stringToMatch);
                foreach (Match m in items)
                {
                    if (m.Success)
                    {
                        string val = m.Groups[0].Value;
                        int ind = stringToMatch.IndexOf(val);
                        int count = int.Parse(val);
                        stringToMatch = stringToMatch.Substring(0, ind) + String.Join("", Enumerable.Repeat(stringToMatch[ind - 1], count - 1)) + stringToMatch.Substring(ind + val.Length);
                    }
                }
                label2.Text = stringToMatch;
            }
Посидел чуть, поковырял код, абстрактно понял суть (не давали нам на изучение такие операторы... Правда я заочник...)
Завтра будет.
Лучше.

Последний раз редактировалось Dark~VIN; 01.05.2012 в 13:35.
Dark~VIN вне форума Ответить с цитированием
Старый 01.05.2012, 18:13   #10
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Рико Посмотреть сообщение
Согласен, что с определение "архиватор" препод перестарался, НО наши шибко умные студенты "просто задачи" делать не хотят, им подавай "а зачем это надо", вот и исхитряются преподаватели
Нет, препод не перестарался, а "недостарался", не определив входной алфавит, с которым должен работать архиватор. Без такого определения следует считать, что алфавит содержит все возможные символы, а из этого вытекает, что подобная форма "сжатой" последовательности не допускает однозначного восстановления.
Впрочем, возможно, он действительно перестарался, указав конкретный вид последовательности. Без такого указания задача становится разрешимой.

В общем, в том виде как есть, задача неразрешима, а для того, чтобы она стала разрешима, в условие следует внести изменения. Причем, последние можно сделать разными способами, и в результате получатся разные задачи (а не разные формулировки одной и той же задачи).
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Архивирование строки Dark~VIN C# (си шарп) 0 30.04.2012 16:41
Архивирование Яр|/||< (^_^) Общие вопросы Delphi 1 16.03.2010 16:28
Архивирование в Delphi BuT@JL Помощь студентам 1 23.03.2009 11:40
архивирование das-xp Общие вопросы Delphi 5 26.06.2007 20:13
архивирование dron-s Общие вопросы Delphi 3 03.05.2007 11:56