Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ Builder

Войти
Регистрация
Восстановить пароль
 
 
дно21
1 / 1 / 0
Регистрация: 15.08.2017
Сообщений: 81
#1

Удаление строк - C++ Builder

29.10.2017, 02:40. Просмотров 605. Ответов 39
Метки нет (Все метки)

Доброго времени суток!
Я сам не программист, но вышло так, что нужно написать небольшую программулину для работы. Вроде все хорошо и прога работает, но нужно реализовать одну функцию, а понять как это сделать не могу, может кто подскажет. Короче, суть функции:

нужно сделать функцию, которая будет делать так:
есть Memo1 в нем строки вида:

копать глубокую яму
яму глубокую копать
яму глубокую выкопать яша
катя яму глубокую выкопать

на выходе должно получаться так:
яму глубокую выкопать яша
катя яму глубокую выкопать

то есть, если допустим все слова из строки один, есть в строке два, то строку один - удалять

Спасибо программисты на перед)

Добавлено через 2 часа 3 минуты
по сути нужно сравнить строчки, к примеру, расскажу на примере двух строк:
в Мемо есть строки:

миша бежит по полю
миша бежит по полю летом

нужно удалить строку если в другой строке есть все слова из нее, в результате должно получится:

миша бежит по полю летом

Была написана такая функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
AnsiString SearchStr;
 
for(int i=0; i<Memo1->Lines->Count; i++){
   SearchStr = Memo1->Lines->Strings[i];
      
        for(int j=i+1; j<Memo1->Lines->Count; j++)
{
          if(Memo1->Lines->Strings[j].Pos(SearchStr))
             Memo1->Lines->Delete(i)
 
}//end for j
}//end for i
но она работает в случае если порядок слов в строках одинаковый(((
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2017, 02:40
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Удаление строк (C++ Builder):

Удаление строк StringGrid - C++ Builder
Задание: нужно вывести приборы с их параметрами(не суть, какие) и сравнить их с параметрами, вводимыми пользователем. Есть кнопка Найти...

Удаление одинаковых строк - C++ Builder
Доброе время суток, подскажите, правильно ли я делаю удаление одинаковых строк? сам код рабочий, но вот незадача... очень долго...

Удаление похожих строк - C++ Builder
Доброго дня.Появилось проблема, но тем похожих много на форуме. Может кто подскажет конкретно в моем случаи Имеется много файлов , мне...

Удаление строк из ListBox - C++ Builder
подскажи те плиз как удалить все строки из ListBox1 void __fastcall TForm1::remaccClick(TObject *Sender) { TStringList *s =...

Std + удаление пустых строк - C++ Builder
Доброго вечера.Ребята подскажите как удалить пустые строки из std::string s; То как то не выходит

Удаление одинаковых строк Листбокс - C++ Builder
Делаю игру алхимия и там добавляются одинаковые строки в лисбокс, а как сделать чтоб они одинаковые недобавлялись? или если добавились то...

39
lifeforce
199 / 159 / 44
Регистрация: 27.09.2010
Сообщений: 963
29.10.2017, 23:13 #31
можно добавить условие
C++
1
2
3
4
  if (
  Memo1->Lines->Strings[ii].LowerCase().Pos(sh->Strings[cq]) !=0
  && sh->Strings[cq].Length()>1// если больше одного символа
     ) mach++;
проверь все работает
0
дно21
1 / 1 / 0
Регистрация: 15.08.2017
Сообщений: 81
29.10.2017, 23:15  [ТС] #32
Можешь написать как уже будет выглядеть готовый код?)
а то я еще вставлю еще условие куда-то никуда))))
0
lifeforce
199 / 159 / 44
Регистрация: 27.09.2010
Сообщений: 963
29.10.2017, 23:18 #33
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ

Не по теме:

Avazart, не придирайся к копипасту .



Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void __fastcall TForm2::Button1Click(TObject *Sender)
{
    TStringList * sh = new TStringList();
 
    for (int i = 0; i<Memo1->Lines->Count; i++)
    {
sh->Clear();
sh->Text = Memo1->Lines->Strings[i].LowerCase(); //
sh->Text = StringReplace(sh->Text, " ", "\n", TReplaceFlags() << rfReplaceAll);
 for (int ii=0; ii<Memo1->Lines->Count; ii++)
 {
 int mach = 0;
 if( ii!=i  )
             {
      for(int cq = 0; cq<sh->Count; cq++)
   {
  if (
  Memo1->Lines->Strings[ii].LowerCase().Pos(sh->Strings[cq]) !=0
  && sh->Strings[cq].Length()>1
     ) mach++;
   }
   if(mach==sh->Count)// если найденные все слова в поиске
   {
 Memo1->Lines->Strings[i]="*";// Memo1->Lines->Delete(i);
   }
             }
 }
 
    }
 
 
  delete sh;
}
1
дно21
1 / 1 / 0
Регистрация: 15.08.2017
Сообщений: 81
29.10.2017, 23:28  [ТС] #34
В честь человека избавившего меня от мучений, назвал элемент обработки
Спасибо бро что ты есть и за то не прошел мимо и действительно помог мне!
наверное первый человек на форумах, который не шутил, не дерзил, не издевался и не кидался сарказмами, а действительно помог!
0
Миниатюры
Удаление строк  
lifeforce
199 / 159 / 44
Регистрация: 27.09.2010
Сообщений: 963
29.10.2017, 23:31 #35
можно еще и удалить все строки с символом *
0
дно21
1 / 1 / 0
Регистрация: 15.08.2017
Сообщений: 81
29.10.2017, 23:36  [ТС] #36
????????????

Добавлено через 4 минуты
звездочки мне не мешают, а даже помогают, поэтому, данная особенность твоей функции мне даже на руку )))

повесил на форму кнопку для удаления "*"
Код
for ( int i = Memo1->Lines->Count - 1; i >= 0; i-- ) {
 //CGauge1->Progress = i;
 if ( Memo1->Lines->Strings[i] == "*") {
            Memo1->Lines->Delete( i );
        }
         }
после работы функции и ручного осмотра строк, буду ее жмякать
1
lifeforce
199 / 159 / 44
Регистрация: 27.09.2010
Сообщений: 963
29.10.2017, 23:41 #37
Рад что быстро схватываешь!
0
Avazart
Эксперт С++
7585 / 5570 / 330
Регистрация: 10.12.2010
Сообщений: 24,990
Записей в блоге: 17
30.10.2017, 00:02 #38
Цитата Сообщение от lifeforce Посмотреть сообщение
Avazart, не придирайся к копипасту .
Да и игнорирование умных указателей.
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25523 / 17076 / 5412
Регистрация: 22.10.2011
Сообщений: 30,237
Записей в блоге: 6
30.10.2017, 13:14 #39
Вот то решение, которое предлагал я:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    std::auto_ptr<TStringList> what(new TStringList); // #include <memory>
    std::auto_ptr<TStringList> loop(new TStringList);
    TSysCharSet ch; TStrings *L = Memo1->Lines;
 
    for (int i = 0; i < L->Count; i++)
    {
        what->Clear(); // я почему-то всегда был уверен, что это должно делаться автоматически в ExtractStrings, ан нет...
        ExtractStrings(ch << ' ', ch, L->Strings[i].LowerCase().c_str(), what.get());
        for (int j = 0; j < Memo1->Lines->Count; j++)
        {
            if (i == j || L->Strings[j] == "*") continue;
            loop->Clear();
            ExtractStrings(ch << ' ', ch, L->Strings[j].LowerCase().c_str(), loop.get());
            if (loop->Count > what->Count)
            {
                bool contained = true;
                for (int k = 0; contained && k < what->Count; contained = (loop->IndexOf(what->Strings[k++]) != -1));
                if (contained)
                {
                    L->Strings[i] = "*"; break;
                }
            }
        }
    }
}
2
дно21
1 / 1 / 0
Регистрация: 15.08.2017
Сообщений: 81
30.10.2017, 13:33  [ТС] #40
Вариант функции от volvo работает, ее результат равен результату работы функции от lifeforce .
Тестил на 10 разных выборках, результаты одинаковые!! Ничья 1:1
Спасибо volvo за отличный вариант реализации обработчика
0
30.10.2017, 13:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2017, 13:33
Привет! Вот еще темы с ответами:

Удаление пустых строк в StringGrid - C++ Builder
Подскажите пожалуйста каким образом удалить все пустые строки в StringGrid? Заранее благодарен.

Удаление нескольких строк DeleteString ListBox - C++ Builder
z = c_list.GetCount(); c_list.DeleteString(z-1); Удаляет последнюю строку Как допустим удалить последние две?

Удаление пустых строк в текстовых файлах - C++ Builder
Дан текстовый файл, в котором встречаются пустые строки. Надо написать программу которая эти пустые строки из текстового файла удалит, и...

Splash screen, удаление строк в TStringList - C++ Builder
При старте программы вылазит SplashScreen, проверяет файлы на существование. Пути к файлам находятся в TStringList, если файл не найден,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru