Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 19.07.2018
Сообщений: 82

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

08.12.2019, 18:04. Показов 3664. Ответов 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
9921 / 6457 / 2457
Регистрация: 21.01.2014
Сообщений: 27,399
Записей в блоге: 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
9921 / 6457 / 2457
Регистрация: 21.01.2014
Сообщений: 27,399
Записей в блоге: 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
9921 / 6457 / 2457
Регистрация: 21.01.2014
Сообщений: 27,399
Записей в блоге: 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
9921 / 6457 / 2457
Регистрация: 21.01.2014
Сообщений: 27,399
Записей в блоге: 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
9921 / 6457 / 2457
Регистрация: 21.01.2014
Сообщений: 27,399
Записей в блоге: 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
9921 / 6457 / 2457
Регистрация: 21.01.2014
Сообщений: 27,399
Записей в блоге: 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
9921 / 6457 / 2457
Регистрация: 21.01.2014
Сообщений: 27,399
Записей в блоге: 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
9921 / 6457 / 2457
Регистрация: 21.01.2014
Сообщений: 27,399
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru