Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
19 / 19 / 3
Регистрация: 11.11.2012
Сообщений: 253

Удаление кратных пробелов

02.09.2013, 17:40. Показов 1621. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как из строковой последовательности удалить кратные пробелы. Знаю как сделать для 2 под ряд идущх пробелов а для 3 и более затруднение. Помогите пожалуйста.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.09.2013, 17:40
Ответы с готовыми решениями:

удаление пробелов
Напишите программу, удаляющую из строки все пробелы Добавлено через 2 минуты даже если в строке стоят два пробела подряд они должны...

удаление пробелов
Создать приложение Visual. предлагающее пользователю ввести строку, из которой затем удаляются все лишние пробелы. Пробел лишний, если он...

Удаление излишних пробелов
На экране имеются Edit1,Edit2,Button1. В первом Edit содержится произвольное текстовое предложение. Предполагается, что между словами...

3
Мишка Косолапый :)
 Аватар для zuxa-zuxa
285 / 255 / 86
Регистрация: 15.02.2012
Сообщений: 1,511
02.09.2013, 17:55
При нахождении пробела увеличивай переменную.
Дели кол-во пробелов на число так: i div 2 это разделит i на 2 нацело.
Ну и останется удалить.
НО! удялять нужно начиная с последнего пробела к первому.
0
19 / 19 / 3
Регистрация: 11.11.2012
Сообщений: 253
02.09.2013, 17:57  [ТС]
Спасибо. Вот сам додумался до такого (вроде работает):
Delphi
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    lbl1: TLabel;
    edt1: TEdit;
    btn1: TButton;
    btn2: TButton;
    btn3: TButton;
    edt3: TEdit;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
   s1,s2:string;
 z,i,k:integer;
implementation
 
{$R *.dfm}
 
procedure TForm1.btn1Click(Sender: TObject);
begin
 s1:=edt1.text;
  for i:=1 to length(s1) do
  if(s1[i]=' ')  then begin
                       k:=i+1;
                        while(s1[k]=' ')do begin
inc(z); inc(k);
delete(s1,i+1,z+1);
  edt3.Text:=s1;
      end;
end;
end;
 
procedure TForm1.btn2Click(Sender: TObject);
begin
edt1.Clear;  edt3.Clear;
end;
 
procedure TForm1.btn3Click(Sender: TObject);
begin
Close;
end;
 
end.
0
Заблокирован
03.09.2013, 14:24
Вообще операция удаления очень долгая. Есть несколько алгоритмов работающих намного быстрее. основаны они на копировании.

Один из них такой.
Нужно ввести счётчик записи. счётчик цикла будет считать чтение символа.
и ещё нужно ввести переменную, сохраняющую предыдущий символ.

при сканировании строки, инкримируем счётчик записи. и каждый символ перезаписываем.
При этом он сохраняется как предыдущий символ.
Когда встречается пробел, ситуация меняется. идёт проверка на предыдущий символ. Если это не пробел, то всё идёт как обычно. Если предыдущим символом был пробел, то записи не происходит и счётчик записи не увеличивается.

Таким образом следующий символ (позицию записи надо инкримировать) записывается в позицию сразу же после одного пробела. Таким образом вся строка начинает "поджиматься."
Когда сканирование закончится, в счётчике записи будет новая длина строки. По ней обрезаем "хвост".
Ещё можно ввести флаг по которой перезаписи символа вначале производится не будет, поскольку перезапись нужна только при поджиме, и если дублей пробелов нет, то будет только лишняя трата времени. Как только встретиться дубль, флаг сбросится и все последующие символы будут перезаписываться в новую позицию.

Вот так за один проход. А функция delete производит поджим после каждого удаления.

Добавлено через 10 минут
Второй алгоритм требует сделать копию строки.
При этом читать будем копию, а записывать в исходник.
Всё аналогично, только без поджима. Просто игнорируется запись "дубля"
В конце по счётчику позиций обрезаем хвост.
Флаг тоже можно ввести. Но теперь мы никакой записи не производим и копии не создаём, пока не встретим дубль. После это уже и делаем копию и начинаем перезапись строки.

Добавлено через 3 минуты
Я не врубался в ваш алгоритм, но у вас явный недочёт
edt3.Text:=s1; нужно вынести за пределы цикла. Зачем каждый раз выводить формируемую строку?

Добавлено через 6 часов 54 минуты
Если кому-то надо, то вот код первого варианта
Delphi
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
34
35
36
37
function DelDubSpace(S_S:string):string;
var
i:Integer;
S,Old:Char;
Pos_:Integer;
Ignor:Boolean;
 
begin
Pos_:=1;
Old:=' ';
Ignor:=true;// Ïîäæèìàíèå ïîêà íå íóæíî
for i:=1 to Length(S_S) do begin
S:= S_S[i];
//Ýòî äóáëü. Èãíîðèðóåì åãî.
if (S = ' ') and  (Old = ' ') then begin
                                    Ignor:= False;
                                    Continue;
                                   end;
                                   
                                   //Óíè÷òîæåíèå ïðîáåëà â êîíöå ñòðîêè
                                   //ìíîãîñòðî÷íîãî òåêñòà
                                    if (S = Chr($d)) and  (Old = ' ') then begin
                                    Ignor:= False;
                                    Pos_:= Pos_- 1;
                                   end;
                                   
if not Ignor then S_S[Pos_]:=S;
Pos_:= Pos_+1;
if (S = Chr($d)) or  (S = Chr($a)) then Old:= ' ' else Old:= S;
                           end;
 
 
if S_S[Pos_ -1]=' ' then  SetLength(S_S,Pos_-2) else SetLength(S_S,Pos_-1);
 
 
Result:= S_S;
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.09.2013, 14:24
Помогаю со студенческими работами здесь

Удаление ненужных пробелов
Вообщем решил задачу: "Прочитать текстовый файл и удалить из него незначащие пробелы". Всё работает, но только для первой (одной...

Удаление повторяющихся пробелов / символов в тексте
есть исходник текстового редактора, надо вставить 2 действия на 2 разные кнопки 1. удаление повторяющихся пробелов в тексте 2. удаление...

Удаление лишних пробелов из текстового файла.
Загружаю в мемо текстовый файл, в котором в начале каждой строки идут пробелы. Как удалить эти пробелы? сможете мне помочь? спасибо..))

удаление пробелов перед знаками препинания
здравствуйте! вот пишу программу, которая удаляет пробелы, если таковых в тексте встречаеться два или более.var c, i: integer; stt,...

Удаление всех пробелов в текстовом файле
Приветствую всех форумчан, В университете задали задание - написать процедуру которая будет из текстового файла удалять все пробелы...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru