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

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

08.12.2019, 18:04. Показов 3597. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.12.2019, 18:04
Ответы с готовыми решениями:

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

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

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

33
0 / 0 / 0
Регистрация: 19.07.2018
Сообщений: 82
08.12.2019, 18:17  [ТС]
скрин
Миниатюры
Ввод текста в Мемо1 и вывод текста в Мемо2 по возрастанию слов  
0
Модератор
 Аватар для D1973
9907 / 6444 / 2455
Регистрация: 21.01.2014
Сообщений: 27,353
Записей в блоге: 3
08.12.2019, 18:30
sayer, в каком виде текст находится в Мемо1? По одному слову на строке? Или как? Покажите пример текста...
0
0 / 0 / 0
Регистрация: 19.07.2018
Сообщений: 82
08.12.2019, 18:34  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
Покажите пример текста...
Может быть и так и так. Стандартный текст.
Миниатюры
Ввод текста в Мемо1 и вывод текста в Мемо2 по возрастанию слов  
0
Модератор
 Аватар для D1973
9907 / 6444 / 2455
Регистрация: 21.01.2014
Сообщений: 27,353
Записей в блоге: 3
08.12.2019, 19:00
Лучший ответ Сообщение было отмечено 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  [ТС]
D1973
Спасибо конечно.
Но пояснить бы что здесь происходит не помешало бы.
0
Модератор
 Аватар для D1973
9907 / 6444 / 2455
Регистрация: 21.01.2014
Сообщений: 27,353
Записей в блоге: 3
08.12.2019, 20:16
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  [ТС]
D1973
Спасибо конечно. На заметку оставлю себе.
Но нужно исполнение именно с применением массивов(

Не по теме:

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

0
08.12.2019, 20:32

Не по теме:

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

0
0 / 0 / 0
Регистрация: 19.07.2018
Сообщений: 82
08.12.2019, 20:36  [ТС]
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
Модератор
 Аватар для D1973
9907 / 6444 / 2455
Регистрация: 21.01.2014
Сообщений: 27,353
Записей в блоге: 3
08.12.2019, 20:38
C++
1
if (str[l] == ' ') ...
0
0 / 0 / 0
Регистрация: 19.07.2018
Сообщений: 82
09.12.2019, 06:32  [ТС]
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
Модератор
 Аватар для D1973
9907 / 6444 / 2455
Регистрация: 21.01.2014
Сообщений: 27,353
Записей в блоге: 3
09.12.2019, 08:25
Цитата Сообщение от 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  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
то вот пример с динамическим строковым массивом
Можно литературу, почитать про это всё?
А то мои вопросы ещё страниц пять займут.

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

Добавлено через 24 минуты
Да и еще, у меня прога почему то последнее слово съедает.
0
Модератор
 Аватар для D1973
9907 / 6444 / 2455
Регистрация: 21.01.2014
Сообщений: 27,353
Записей в блоге: 3
10.12.2019, 09:44
Цитата Сообщение от 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  [ТС]
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
Модератор
 Аватар для D1973
9907 / 6444 / 2455
Регистрация: 21.01.2014
Сообщений: 27,353
Записей в блоге: 3
10.12.2019, 10:36
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  [ТС]
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
Модератор
 Аватар для D1973
9907 / 6444 / 2455
Регистрация: 21.01.2014
Сообщений: 27,353
Записей в блоге: 3
10.12.2019, 12:44
Цитата Сообщение от sayer Посмотреть сообщение
то все что было в str3 по идее должно сбрасываться в массив p
Но ведь р у Вас не массив, а просто строка!
В принципе я понял, чего Вы хотите добиться... Пример набросаю позже, сейчас пора домой с работы добираться...
0
0 / 0 / 0
Регистрация: 19.07.2018
Сообщений: 82
12.12.2019, 06:02  [ТС]
D1973
Хорошо. Если TStringDynArray массив, то как отсортировать его по длине элементов? И как потом вывести его в строку, а затем в Мемо?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.12.2019, 06:02
Помогаю со студенческими работами здесь

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

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

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

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

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


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

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

Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru