[ /tv/ /rf/ /vg/ /a/ /b/ /u/ /bo/ /fur/ /to/ /dt/ /cp/ /oe/ /bg/ /ve/ /r/ /mad/ /d/ /mu/ /cr/ /di/ /sw/ /hr/ /wh/ /lor/ /s/ /hau/ /slow/ /gf/ /vn/ /w/ /ma/ /azu/ /wn/ ] [ Main | Settings | Bookmarks | Music Player ]

No.1384 Reply
File: 12595774120573.jpg
Jpg, 50.34 KB, 600×759 - Click the image to expand
edit Find source with google Find source with iqdb
12595774120573.jpg
Вечер добрый, уважаемые кодеры, очень стыдно просить помощи, но здесь наверно единственное место, где я могу расчитывать на таковую. Да, это конечно задача.
Осталась последняя, она меня совсем доконала, но решать надо.
Суть такова: надо взять строку, заданную в виде одномерного массива, например char text[100], и удалить из нее все повторяющиеся слова. На первый взгляд задача кажется простой
Алгоритм я себе представляю примерно так: взять всю строку, из нее выделить первое слово, далее каким-то образом сравнивать его с оставшимися, при совпадении оба слова вырезать из строки, если вырезали или дошли до конца — переходим в начало. В общем реализовать это не получается никак у меня.
  
#include <stdio.h>
#include <string.h>
  
int main(int argc, char* argv[])
{
    int h, i=0, j=0;
    char text[81], word[10];
    gets (text);
    h=strlen(text);
    while (i<=h)
    {if ((text[i]==' ')||(i==h)) //конец слова, т.е. пробел или конец строки
        {
            word[i]==text[i]; //заносим в слово
               //тут дальше должна наверно быть проверка по алгоритму
               //ну и потом соответствующие операции со строкой
        }
    i++;
    }
  
getch();
  
}
Выглядит конечно мой код не очень красиво, но красота вроде бы и не требуется.
Единственное, что я сделал на отличную оценку — так это перерыл все интернеты на предмет решения (уже отчаявшись), но в этот раз гугл меня подвел видимо.
Буду благодарен за любую помощь.
>> No.1385 Reply
File: Безымянный.jpg
Jpg, 30.08 KB, 677×340 - Click the image to expand
edit Find source with google Find source with iqdb
Безымянный.jpg
>> No.1386 Reply
>>1384
Я бы посоветовал следующий подход:
1. Определяем какие символы являются разделителями, а не словами (пробелы, знаки препинания, скобки и т.д.). Либо от обратного - определяем, какие символы могут состовлять слова (например, слово - это последовательность символов алфавита и никаких других).
2. Берём массив указателей на char - по сути массив строк. Назовём его "М".
3. Заводим переключатель "слово|разделитель" (либо это byte - кодируем числами 0 и 1, либо enum - ну ты понел). Назовём его "П". Начальное значение П = "разделитель".
4. Движемся по исходной строке от самого первого символа к концу строки, читаем посимвольно. Вооружившись критерием из шага 1 определяем, какой символ мы только что прочитали:
   - если это часть слова и П == "разделитель", то мы только что нашли первую букву очередного слова. Запоминаем смещение этого символа в массиве М. П = "слово".
   - если это разделитель и П == "слово", то мы только что достигли конца слова. Заменяем в строке текущий символ на \0. П = "Разделитель".
   - если прочитанный символ это \0 - выйти из цикла.
5. Имеем М - массив слов. Цикл по i от первого элемента М к предпоследнему. Во вложенном цикле по j идём от (i+1) к последнему. Если элементы i и j - одинаковые, то элемент о помечается как повтор (например, можно записать вместо первого символа \0). Если элемент j помечен как повторяющийся, то переходим к следующей итерации. Аналогично во внешнем цикле если элемент i помечен как повторяющийся, то переходим к следующей итерации.
6. Склеиваем неповторяюшиеся слова из М в новую строку. Всё!
>> No.1387 Reply
>>1386
> 5. ... Если элементы i и j - одинаковые, то элемент о помечается
Если элементы i и j - одинаковые, то элемент j помечается
>> No.1389 Reply
>>1386
И ещё: можно итегрировать пункт 5 внутрь пункта 4 если при нахождении очередного конца слова (уже после записи \0 в исходную строку) сравнивать последний элемент массива М со всеми предыдущими элементами (естественно, не забываем помечать как повтор; ранее найденные повторы при сравнении - игнорировать. В принципе, всё зависит от организации массива. Если последний элемент оказался повтором, то можно счётчик количества элементов массива уменьшить на 1, тогда следующее найденное слово запишется поверх повтора - но такой подход годится, пожалуй, только для статических массивов М).
>> No.1390 Reply
var s = "ololo vse vi bidlo ololo";
  
var res = string.Join (" ", s.Split (new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Distinct ().ToArray ());
>> No.1391 Reply
>>1386
Это все конечно очень круто, но не для моих мозгов наверно, особенно >>1389
Но тем не менее, спасибо за старания!
>> No.1392 Reply
>>1391
> очень круто, но не для моих мозгов
Ты охренел чтоле?! Это задачка для первокурсников. Ну-ка, взял и запогромировал это всё. Быстра блджад. для кого я столько старался?!
>> No.1393 Reply
>>1386
Да, вот такую кашу представляет собой типичная сишкаёбская программа.
Не могут нормально выполнить декомпозицию, разработать эффективный алгоритм зато уже какие-то массивы и указатели. ИМХО преподавание сишки в школах и институтах вообще надо запретить. Она утянет на дно IT образование любой, а такой отсталой как Россия вообще не позволит ни на миллиметр из говна высунуться.
>> No.1394 Reply
>>1393
> разработать эффективный алгоритм зато уже какие-то массивы и указатели
Ну-ка, ну-ка. Много ли ты знаешь эффективных алгоритмов, в которых не используются ни массивы, ни динамические структуры?
>> No.1395 Reply
>>1394
stupid russian bitches don't know bout my Okasaki.
>> No.1396 Reply
>>1394
Даже в этом можно сделать nlog(n) от кол-ва слов, а не nn как делают плюсоёбы. И да, "массив" как синоним эффективности и "поинтер" как синоним динамических структур - это пиздец.
>> No.1397 Reply
>>1396
Вопрос только в сокращении перебора при поиске одинаковых слов в массиве. Интересно, что Си нам преподавали на втором курсе, а крутые алгоритмы - на четвёртом. То, что я посоветовал ОПу - как раз требуемый уровень знаний: задача, решённая верно, но без претензий. Я уж не говорю о том, что на младших курсах наиболее интересной задачей является разработка пунктов 3 и 4.
>> No.1398 Reply
>>1397
Быстрая сортировка уже стала крутым алгоримом?
> я уж не говорю о том, что на младших курсах наиболее интересной задачей является
анализ задач, поиск решения и написане понятных, хорошо структурированных программ, а не ебля с поинтерами и тупыми условностями сишки (типа /0-терминация строк).
>> No.1399 Reply
File: с.png
Png, 0.95 KB, 200×20 - Click the image to expand
edit Find source with google Find source with iqdb
с.png
>>1398
Каковы ваши предложения?
>> No.1400 Reply
>>1399
А что тут предлагать? Все уже давно предложено. В университетах (на CS) на первом курсе нужно давать SICP, в институтах (на "программиста") - HtDP. Все просто, и оно работает. А сишку любой программист сам сможет выучить по документации. Главное, чтобы у людей не возникало иллюзии, что написание портянки для перекладывания байтиков и есть программирование.
>> No.1401 Reply
>>1400
Каковы ваши предложения ОПу?
>> No.1402 Reply
>>1401
Бочка и хуйцы.
>> No.1403 Reply
>>1401 — не оп
>> No.1469 Reply
>>1384
Не могу сказать, что мне очень уж нравится твоя картинка, но всегда прокручиваю страничку до этого треда и несколько секунд гляжу на миниатюру. Это происходит в 7 или 8 раз уже, потому решил сообщить на всякий.
>> No.1475 Reply
File: mega_milk_chun_li.jpg
Jpg, 191.64 KB, 630×727 - Click the image to expand
edit Find source with google Find source with iqdb
mega_milk_chun_li.jpg
Фу, ОП, так бесстыдно выпрашивать код, когда тебе уже дали весь алгоритм. Читай его, думай, составляй блок-схему, в конце-концов.


Password:

[ /tv/ /rf/ /vg/ /a/ /b/ /u/ /bo/ /fur/ /to/ /dt/ /cp/ /oe/ /bg/ /ve/ /r/ /mad/ /d/ /mu/ /cr/ /di/ /sw/ /hr/ /wh/ /lor/ /s/ /hau/ /slow/ /gf/ /vn/ /w/ /ma/ /azu/ /wn/ ] [ Main | Settings | Bookmarks | Music Player ]