Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2011, 01:00   #1
Lichnost3d
Новичок
Джуниор
 
Регистрация: 16.02.2009
Сообщений: 2
По умолчанию Процедура разбиения на слова

Всем доброй ночи, заранее извиняюсь если промахнулся с разделом.
Ну так вот в чём проблема, намедни пришлось мне вспомнить delphi после 3х лет простоя моих двух извилин в бездействии, и запнулся я вот на чём. Мне необходима процедура которая бы брала из Memo1 строки и делила бы их на слова занося их к себе в 2-х мерный массив для дальнейшего юзанья в самой программе.(в дальнейшем этот массив понадобится для вывода файла в виде xml )
Вот код процедуры
Код:
var wrd:array [0..99,0..99] of string;
          cnt:byte;
 {Процедура разбиения на слова}
    procedure DivStrToWrd(s:string);
    var k,p,b:integer;
     divs:set of char;
     w:boolean;
    begin
    divs:=[' ',',','.','!','?',':',';']; //разделители
    w:=false;
    for p:=0 to Form1.Memo1.Lines.Count-1 do //цикл перебора слов
    begin
    s:=Form1.Memo1.Lines[p]+' ';  //присваиваю s текущую строку Memo1
    for k:=1 to length(s) do  //цикл нахождения слов в строке
     begin
     if w then
      begin
      if s[k] in divs then
       begin
       inc(cnt);
       wrd[p,cnt]:=copy(s,b,k-b);
       w:=false;
       end;
      end else
      begin
      if not (s[k] in divs) then
       begin
       w:=true;
       b:=k;
       end;
      end;
     end;
     end;
    end;
Самое странное что пока массив был одномерным, всё работало. Я так подозреваю что здесь допущена ужасно глупая ошибка либо я мыслю в корне не верно.

При чем тут РНР код ?
Читаем правила раздела.
Там подробно написано, как следует оформлять код и что получается, если этого не делать.
Вложения
Тип файла: rar процедура.rar (168.5 Кб, 5 просмотров)

Последний раз редактировалось mihali4; 31.10.2011 в 02:55.
Lichnost3d вне форума Ответить с цитированием
Старый 31.10.2011, 09:23   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
s:=Form1.Memo1.Lines[p]+' '; //присваиваю s текущую строку Memo1
Обязательно построчно вычленять?
Цитата:
либо я мыслю в корне не верно.
Ну я бы мыслил либо так:http://www.programmersforum.ru/showt...369#post398369
Либо так:
Код:
 {Процедура разбиения на слова}
    procedure DivStrToWrd(s:string);
     var var wrd:TStringList;
    begin
    wrd:=TStringList.Create;
    for p:=0 to Form1.Memo1.Lines.Count-1 do   begin
     with  wrd do begin
       DelimitedText:=Form1.Memo1.Lines[p]
       for k:=0 to Count-1 do     begin
         Перебираем Strings[k] - Это слова попробельно разделенные в строке Мемо
       end;
     end;
     wrd.free; 
    end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.10.2011, 15:06   #3
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Stilet, плюсую. Пока читал пост - была та же мысль.
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 31.10.2011, 23:28   #4
Lichnost3d
Новичок
Джуниор
 
Регистрация: 16.02.2009
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Обязательно построчно вычленять?

Ну я бы мыслил либо так:http://www.programmersforum.ru/showt...369#post398369
Либо так:
Код:
 {Процедура разбиения на слова}
    procedure DivStrToWrd(s:string);
     var var wrd:TStringList;
    begin
    wrd:=TStringList.Create;
    for p:=0 to Form1.Memo1.Lines.Count-1 do   begin
     with  wrd do begin
       DelimitedText:=Form1.Memo1.Lines[p]
       for k:=0 to Count-1 do     begin
         Перебираем Strings[k] - Это слова попробельно разделенные в строке Мемо
       end;
     end;
     wrd.free; 
    end;
Спасибо Stilet Да действительно, можно было и не построчно вычленять.
я все строки присвоил одной string переменной и разбил на слова(так оказалось проще). Теперь всё работает. Вот что в итоге я сделал(на основе чужого кода)
Код:
var stroka:String;
    wrd:array [0..99] of string;
    cnt:byte;
procedure DivStrToWrd(s:string);
    var k,p,b:integer;
     divs:set of char;
     w:boolean;
    begin
    divs:=[' ',',','!','?',':',';']; {разделители}
    w:=false;
    s:=s+' ';
    for k:=1 to length(s) do {цикл нахождения слов в строке}
     begin
     if w then
      begin
      if s[k] in divs then
       begin
       inc(cnt);
       wrd[cnt]:=copy(s,b,k-b);{присвоение слова элементу массива}
       w:=false;
       end;
      end else
      begin
      if not (s[k] in divs) then
       begin
       w:=true;
       b:=k;
       end;
      end;
     end;
    end;
остался в программе один нюанс, нужно теперь сделать так чтобы если после последнего слова стоит ;#13 или ;; то присваиваем элементу массива wrd[cnt]:='_' как будто найдено слово
Lichnost3d вне форума Ответить с цитированием
Старый 01.11.2011, 06:33   #5
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

в сторону StringReplase посмотрите...
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
макрос жеребьёвки, разбиения на пары 1945zxc Microsoft Office Excel 21 03.11.2018 21:32
Определить количество разбиения положительного целого числа и глубину рекурсии в рекурсивном алгоритме! hazk Общие вопросы C/C++ 1 05.12.2010 14:52
Алгоритм разбиения двухмерной сетки ячеек на выпуклые прямоугольники(язык не важен) Qmaks Помощь студентам 0 17.10.2010 14:07
Ошибка разбиения ячеек в Word KiSH333 Общие вопросы Delphi 0 02.04.2009 10:02
процедура, которая выводит все слова, начинающиеся с согласных букв латинского алфавита. sergeyfsd Паскаль, Turbo Pascal, PascalABC.NET 6 21.02.2008 22:29