0 / 0 / 0
Регистрация: 19.07.2018
Сообщений: 82
1

Ввод текста в Мемо1 и вывод текста в Мемо2 по возрастанию слов

08.12.2019, 18:04. Показов 2865. Ответов 33
Метки нет (Все метки)

Здравствуйте!

Пользователь вводит текст в Мемо1, по нажатию кнопки текст должен выйти в Мемо2 уже отсортированным по возрастанию количества символов в словах.
Думаю сделать это так:
Текст считывается с Мемо1 по буквам, заносится в массив по словам. Далее по длине букв в словах массив сортируется. Слова из отсортированного массива заносятся в строку, которая потом выводится в Мемо2.
Гладко было на бумаге...
Как бы это реализовать не подскажете?
Вот что удалось набросать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char** a = (char**)malloc(sizeof(char)*10);
/*String a[1][1],str; */
AnsiString str;
String str2;
int line,symb,l;
/*calloc(a,10);*/
for (line = 0; line < Memo1->Lines->Count-1; line++)
for (symb = 1; symb < (str=Memo1->Lines->Strings[line]).Length(); symb++)
 
 {
 str2=Memo1->Lines[line][symb];
 }
 Memo2->Lines->Add(str);
}
В str находится массив первой строки, вместе со словами и пробелами. Нужна переменная через которую можно эти пробелы через цикл if отсеять. Но я никак не могу найти инфу как эту переменную инициализировать.

Спасибо.

P.S. Нуб в C++
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.12.2019, 18:04
Ответы с готовыми решениями:

Что надо прописать в батон , что бы с мемо1 вывести в мемо2 только числа , что есть в мемо1
Что надо прописать в батон , что бы с мемо1 (который состоит с текста, символов, знаков&quot;+&quot;и&quot;-&quot;)...

Проверяем каждую строчку в мемо1 и если в ней найдено login, то тогда в мемо2 под номером строчки из мемо1 добавляем стр
нужно сделать такое: проверяем каждую строчку в мемо1 и если в ней найдено login, то тогда в мемо2...

Вывод текста в мемо1
Разобрался как можно вывести из текстового документа в мемо1 ,понимаете в чем вопрос,я только могу...

Ввод текста, обработка и вывод текста в то же поле
Здравствуйте!Как сделать в delphi 10 seattle нечто вроде экспертных систем?Вводим текст (типа как в...

33
0 / 0 / 0
Регистрация: 19.07.2018
Сообщений: 82
08.12.2019, 18:17  [ТС] 2
скрин
Миниатюры
Ввод текста в Мемо1 и вывод текста в Мемо2 по возрастанию слов  
0
Модератор
8328 / 5541 / 2263
Регистрация: 21.01.2014
Сообщений: 23,807
Записей в блоге: 3
08.12.2019, 18:30 3
sayer, в каком виде текст находится в Мемо1? По одному слову на строке? Или как? Покажите пример текста...
0
0 / 0 / 0
Регистрация: 19.07.2018
Сообщений: 82
08.12.2019, 18:34  [ТС] 4
Цитата Сообщение от D1973 Посмотреть сообщение
Покажите пример текста...
Может быть и так и так. Стандартный текст.
Миниатюры
Ввод текста в Мемо1 и вывод текста в Мемо2 по возрастанию слов  
0
Модератор
8328 / 5541 / 2263
Регистрация: 21.01.2014
Сообщений: 23,807
Записей в блоге: 3
08.12.2019, 19:00 5
Лучший ответ Сообщение было отмечено sayer как решение

Решение

Ну, если для простоты упустить из виду, что в обычном тексте встречаются такие штуки, как знаки препинания и если принять, что слово - это непрерывный набор символов, отделенный от других слов знаком пробела - то можно это так сделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <System.Math.hpp>
#include <memory>
...
int __fastcall LenSort(TStringList *X, int i1, int i2)
{
   return CompareValue(X->Strings[i1].Length(), X->Strings[i2].Length());
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
   std::auto_ptr<TStringList> L (new TStringList);
   L->StrictDelimiter = true;
   L->Delimiter = ' ';
   L->DelimitedText = StringReplace(Memo1->Text.Trim(), "\r\n", "", TReplaceFlags() << rfReplaceAll);
   L->CustomSort(LenSort);
   Memo2->Text = L->DelimitedText;
}
Миниатюры
Ввод текста в Мемо1 и вывод текста в Мемо2 по возрастанию слов  
1
0 / 0 / 0
Регистрация: 19.07.2018
Сообщений: 82
08.12.2019, 19:30  [ТС] 6
D1973
Спасибо конечно.
Но пояснить бы что здесь происходит не помешало бы.
0
Модератор
8328 / 5541 / 2263
Регистрация: 21.01.2014
Сообщений: 23,807
Записей в блоге: 3
08.12.2019, 20:16 7
1. Создается список строк StringList
2. Указывается, что для разделения строк при заполнении списка будет использоваться единственный разделитель. Другие возможные разделители будут проигнорированы
3. Задается этот самый разделитель (символ "пробел")
4. Удаляем в Мемо1 все символы переноса строк (если они тем есть), удаляем лишние пробелы в начале и конце текста в Мемо1 (опять же, если они есть) и обработанный таким образом текст вносится в StringList, формируя список ( т.е. фраза "пользователь вводит текст в Мемо1" разбивается по пробелам и из нее получается список строк:
пользователь
вводит
текст
в
Мемо1
)
5. Сортируем список, используя метод CustomSort. В качестве параметра метода выступает доп. функция LenSort(), которая сортирует строки списка именно по их длинам.
6. Из отсортированного списка собираем строку, используя все тот же пробел в качестве разделителя слов. Полученный текст записываем в Мемо2

Вроде, все строки откомментировал...
1
0 / 0 / 0
Регистрация: 19.07.2018
Сообщений: 82
08.12.2019, 20:26  [ТС] 8
D1973
Спасибо конечно. На заметку оставлю себе.
Но нужно исполнение именно с применением массивов(

Не по теме:

... и не плохо было бы если вы подсказывали в другой теме. Там более понятно что происходит.

0
D1973
08.12.2019, 20:32
  #9

Не по теме:

Цитата Сообщение от sayer Посмотреть сообщение
Там более понятно что происходит
К сожалению, там я вообще сразу нить разговора потерял, когда Вы, вместо того, чтобы работать методами Билдера, уцепились за методы не С++ даже, а вообще С...

0
0 / 0 / 0
Регистрация: 19.07.2018
Сообщений: 82
08.12.2019, 20:36  [ТС] 10
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
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char** a = (char**)malloc(sizeof(char)*10);
/*String a[1][1],str; */
AnsiString str,v;
String str2;
int line,symb,l;
str2 = " ";
v = " ";
/*calloc(a,10);*/
for (line = 0; line < Memo1->Lines->Count; line++)
{
/*for (symb = 1; symb < (str=Memo1->Lines->Strings[line]).Length(); symb++)  */
 str=Memo1->Lines->Strings[line];
  for (l = 0; l < str.Length(); l++)
  {
   if (str[l] == " " ))// здесь выдает "Cannot convert 'char &' to 'const char *"
   {
   v=str[l];
   }
  }
}
 str2=Memo1->Lines->Strings[symb];
 Memo2->Lines->Add(v);
}
Подскажите в чем проблема?
0
Модератор
8328 / 5541 / 2263
Регистрация: 21.01.2014
Сообщений: 23,807
Записей в блоге: 3
08.12.2019, 20:38 11
C++
1
if (str[l] == ' ') ...
0
0 / 0 / 0
Регистрация: 19.07.2018
Сообщений: 82
09.12.2019, 06:32  [ТС] 12
D1973
Как это правильно написать?
Цитата Сообщение от D1973 Посмотреть сообщение
C++
1
if (str[l] == ' ') ...
Так?
C++
1
2
3
4
5
AnsiString str,v,*p;
...
p=str;
...
if (*(p+l) == " " ));
Добавлено через 47 секунд
так не работает. В ту сторону хоть иду?

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от D1973 Посмотреть сообщение
уцепились за методы не С++ даже, а вообще С...
какие знаю из инета, за такие и цепляюсь.

0
Модератор
8328 / 5541 / 2263
Регистрация: 21.01.2014
Сообщений: 23,807
Записей в блоге: 3
09.12.2019, 08:25 13
Цитата Сообщение от sayer Посмотреть сообщение
В ту сторону хоть иду?
sayer, вот без обид, но Вы никуда не идете, Вы тычетесь из угла в угол без какого-то продвижения вперед...
Начинать надо с постановки задачи! Вот есть у Вас задание: "выстроить слова текста в порядке возрастания их длин". Основной задачей теперь становится разбиение текста на отдельные слова, далее - помещение этих разделенных слов в объект, имеющий возможность сортировки (список, вектор или массив), потом непосредственно сама сортировка и, наконец, обратная сборка текста из отдельный слов. Ну и если Вы пишете:
Цитата Сообщение от sayer Посмотреть сообщение
нужно исполнение именно с применением массивов
то вот пример с динамическим строковым массивом
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
#include <System.StrUtils.hpp>
...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   //Удаляем в тексте концевые пробелы и переносы строк,
   //записываем текст из Мемо1 в переменную
   String tmp = StringReplace(Memo1->Text.Trim(), "\r\n", "", TReplaceFlags() << rfReplaceAll);
   //Объявили строковый динамический массив А
   //и заполнили его, разбив текст на отдельные слова по пробелам
   TStringDynArray A = SplitString(tmp, " ");
   //Банальная сортировка массива методом пузырька
   for(int i = 0; i < A.High - 1; i++)
     for(int j = 0; j < A.High - i - 1; j++)
       if(A[j].Length() > A[j + 1].Length())
         {
            tmp = A[j];
            A[j] = A[j + 1];
            A[j + 1] = tmp;
         }
   //Формируем строку из отсортированных элементов массива
   tmp = "";
   for(int i = 0; i < A.High; i++)
     tmp += A[i] + " ";
   //Выводим результат в Мемо2
   Memo2->Text = tmp;
}
Миниатюры
Ввод текста в Мемо1 и вывод текста в Мемо2 по возрастанию слов  
0
0 / 0 / 0
Регистрация: 19.07.2018
Сообщений: 82
10.12.2019, 06:02  [ТС] 14
Цитата Сообщение от D1973 Посмотреть сообщение
то вот пример с динамическим строковым массивом
Можно литературу, почитать про это всё?
А то мои вопросы ещё страниц пять займут.

Добавлено через 3 минуты
гуг не в счет.
Либо лабуда на английском.
Либо не по теме

Добавлено через 24 минуты
Да и еще, у меня прога почему то последнее слово съедает.
0
Модератор
8328 / 5541 / 2263
Регистрация: 21.01.2014
Сообщений: 23,807
Записей в блоге: 3
10.12.2019, 09:44 15
Цитата Сообщение от sayer Посмотреть сообщение
у меня прога почему то последнее слово съедает
Не у Вас, а у нас... Косякнул малость
Для исправления:
либо во всех циклах for условие втором параметре изменить на <=
C++
1
for(int j = 0; j <= A.High - i - 1; j++)
либо во всех циклах for свойство High заменить на Length
C++
1
for(int j = 0; j < A.Length - i - 1; j++)
0
0 / 0 / 0
Регистрация: 19.07.2018
Сообщений: 82
10.12.2019, 10:33  [ТС] 16
D1973
Есть массив букв
C++
1
str=Memo1->Lines->Strings[line];
и условие
C++
1
for (l = 0; l < str.Length(); l++)
Как поставить условие так чтобы l доходило до последнего элемента массива?
На это выдает Range Check Error
C++
1
str.Length()
0
Модератор
8328 / 5541 / 2263
Регистрация: 21.01.2014
Сообщений: 23,807
Записей в блоге: 3
10.12.2019, 10:36 17
C++
1
for (int l = 1; l <= str.Length(); l++)
Строки типа String (т.е. паскалевские строки) индексируются с 1
1
0 / 0 / 0
Регистрация: 19.07.2018
Сообщений: 82
10.12.2019, 12:11  [ТС] 18
D1973
Очень хорошо спасибо)
Теперь как бы из этого массива строк по букве вытаскивать и приставлять к строке, а в случае если встретится пробел то пропускать эту итерацию и продолжать цикл не приставляя пробел к строке?
C++
1
2
3
4
5
6
String str2;
str=Memo1->Lines->Strings[line];
for (l = 1; l < str.Length(); l++)
{
str2=str2+str[l];
}
Там вроде бы надо указать не пробел а код пробела?

Добавлено через 30 минут
D1973
В массив AnsiString можно записывать слова в элемент или только буквы? Массив такого типа может быть динамическим?
Если да, то как его удлинять?

Добавлено через 35 секунд
D1973
В массив AnsiString можно записывать слова в элемент или только буквы? Массив такого типа может быть динамическим?
Если да, то как его удлинять?

Добавлено через 56 минут
Опять тот же массив букв str. Начинаю вытаскивать из него буквы и прилеплять к строке str3. Если встречается пробел, то все что было в str3 по идее должно сбрасываться в массив p.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
AnsiString str,p;
String str3,str2;
...
str=Memo1->Lines->Strings[line];
 for (l = 1; l < str.Length()+1; l++)
  {
   str2=str[l];
   if (str2 != " " )
   {
   str3=str3+str2;
   }
   else
   if (str2 == " ")
   {
   for (j=0; j < p.Length(); j++)
   {
   p[j]=str3; // Cannot convert 'UnicodeString' to 'char'
   }
   continue;
   }
Но при выполнении
C++
1
p[j]=str3;
Выдает ошибку Cannot convert 'UnicodeString' to 'char'
Как то можно это исправить?
0
Модератор
8328 / 5541 / 2263
Регистрация: 21.01.2014
Сообщений: 23,807
Записей в блоге: 3
10.12.2019, 12:44 19
Цитата Сообщение от sayer Посмотреть сообщение
то все что было в str3 по идее должно сбрасываться в массив p
Но ведь р у Вас не массив, а просто строка!
В принципе я понял, чего Вы хотите добиться... Пример набросаю позже, сейчас пора домой с работы добираться...
0
0 / 0 / 0
Регистрация: 19.07.2018
Сообщений: 82
12.12.2019, 06:02  [ТС] 20
D1973
Хорошо. Если TStringDynArray массив, то как отсортировать его по длине элементов? И как потом вывести его в строку, а затем в Мемо?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.12.2019, 06:02
Помогаю со студенческими работами здесь

кнопка которая выводит текст в Мемо1 и в Мемо2
Привет.Такой вопрос: Есть кнопка которая выводит текст в Мемо1 и в Мемо2. Как сделать так что бы...

как сделать что бы программа заменяла в мемо1 букву на число строки на котором находится эта буква в мемо2
Подскажите как сделать что бы программа заменяла в мемо1 букву на число строки на котором находится...

Нужна програма в которой я буду в мемо1 вводить слова,а во втором Мемо2 она должна мне выводить пары
найти пары слов тоесть нужна програма в которой я буду в мемо1 вводить слова,а во втором Мемо2 она...

Сортировка строк текста по возрастанию количества слов
В Memo1 дан текст. Нужно также в Memo1 вывести для каждой строки количество четных по длине...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru