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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2012, 09:26   #1
Corpuscul
Пользователь
 
Регистрация: 21.09.2012
Сообщений: 35
По умолчанию Разделение текста на слова

Доброго времени суток. Есть такая задачка, необходимо разделить строку записанную в Edit или Мемо на составные части. ниже приведен скрипт, найденный в интернете, приспособленный под мои нужды, но вот запятые он не воспринимает. Например, 10*50*120 он разделяет нормально, а вот 10,5*125*130 он разделяет на 10 /5/ 125/ 130, а я хочу получить в переменные значения типа double. Т.е. мне надо, чтобы числа разделились 10,5/125/130, подскажите пожалуйста как это сделать.


Код:
procedure SplitTextIntoWords(const str: string; 
output: Tstringlist; minLength: integer=1{минимальная длина слова});
var
  positionStart, positionEnd: integer;
  wordToAdd: string;
begin
  Assert(Assigned(output));
  output.Clear;
  positionStart := 1;
  while positionStart <= Length(str) do
  begin
    while (positionStart <= Length(str)) and not IsCharAlphaNumeric(str[positionStart]) do
      Inc(positionStart);
    if positionStart <= Length(str) then
    begin
      positionEnd := positionStart + 1;
      while (positionEnd<= Length(str)) and IsCharAlphaNumeric(str[positionEnd]) do
        Inc(positionEnd);
      wordToAdd := Copy(str, positionStart, positionEnd - positionStart);
      if (Length(wordToAdd) >= minLength) then
      begin
        // добавление слова в список
        output.Add(AnsiLowerCase(wordToAdd));
      end;
      positionStart := positionEnd + 1;
    end;
  end;
end;


	procedure TForm1.Button1Click(Sender: TObject);
var words: TStringList;
begin
  words:= TStringList.Create;
  SplitTextIntoWords(Memo1.Text,words);
  Memo2.Text:=words.Text;
  words.Free;
end;



___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 21.09.2012 в 09:33.
Corpuscul вне форума Ответить с цитированием
Старый 21.09.2012, 09:58   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Код:
and (IsCharAlphaNumeric(str[positionEnd]) or (str[positionEnd]=','))
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 21.09.2012, 11:17   #3
Corpuscul
Пользователь
 
Регистрация: 21.09.2012
Сообщений: 35
По умолчанию

Спасибо, сегодня попробую.
Corpuscul вне форума Ответить с цитированием
Старый 21.09.2012, 16:53   #4
Corpuscul
Пользователь
 
Регистрация: 21.09.2012
Сообщений: 35
По умолчанию

Сейчас попробовал, все получилось! Большое спасибо. У меня вот еще такой вопрос: как получить данные в переменную из предыдущей процедуры не используя вот это
Код:
procedure TForm1.btn1Click(Sender: TObject);
 var words: TStringList; d, e, f: string; a, b, c: Double;
begin
    words:= TStringList.Create;
  SplitTextIntoWords(edt1.Text,words);
   mmo3.Text:=words.Text;
  words.Free;
  d:= mmo3.Lines[0];
  e:= mmo3.Lines[1];
  f:= mmo3.Lines[2];
  a:= StrToFloat(d);
  b:= StrToFloat(e);
  c:= StrToFloat(f);
  tolshina(a);

  end;
P.S. не судите строго я недавно программирую.
Corpuscul вне форума Ответить с цитированием
Старый 21.09.2012, 19:04   #5
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
как получить данные в переменную из предыдущей процедуры не используя вот это
Ничего не понятно, вижу только кусок кода. Какая из переменных в нем вызывает вопрос, какая процедура должна получить ее значение?

Цитата:
не судите строго я недавно программирую.
Так никто и не судит Все когда-то начинали...
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 21.09.2012, 19:35   #6
Corpuscul
Пользователь
 
Регистрация: 21.09.2012
Сообщений: 35
По умолчанию

Ну, в общем идея такая: необходимо рассчитать припуски заготовки при тепловой резке стали. Соответственно, в edit 1 я ввожу размеры детали, которые разбиваю на строки и чтобы получить их обратно в переменные a,b,c в типе double, я использую поле мемо 3 куда вношу строки, а потом присваиваю их переменным a,b,c. Как-то нерационально получается. Там еще проблема с выводом текста 'нет' , когда толщина больше 300, тоже пока что не понятно, пишутся цифры
Вот полный код.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    edt1: TEdit;
    edt4: TEdit;
    edt5: TEdit;
    edt7: TEdit;
    edt8: TEdit;
    edt9: TEdit;
    btn1: TButton;
    edt10: TEdit;
    cbb1: TComboBox;
    edt11: TEdit;
    edt12: TEdit;
    edt13: TEdit;
    edt14: TEdit;
    edt15: TEdit;
    edt16: TEdit;
    edt17: TEdit;
    edt18: TEdit;
    edt19: TEdit;
    edt20: TEdit;
    edt21: TEdit;
    edt22: TEdit;
    mmo1: TMemo;
    lbl1: TLabel;
    lbl2: TLabel;
    lbl5: TLabel;
    lbl6: TLabel;
    lbl7: TLabel;
    lbl8: TLabel;
    lbl9: TLabel;
    lbl10: TLabel;
    lbl11: TLabel;
    lbl12: TLabel;
    lbl13: TLabel;
    lbl14: TLabel;
    lbl15: TLabel;
    lbl16: TLabel;
    lbl17: TLabel;
    lbl18: TLabel;
    lbl19: TLabel;
    lbl20: TLabel;
    lbl21: TLabel;
    lbl22: TLabel;
    lbl23: TLabel;
    lbl24: TLabel;
    lbl25: TLabel;
    mmo3: TMemo;
    edt6: TEdit;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure tolshina (a: Double);
   var  a, b, c: Double;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure SplitTextIntoWords(const str: string;
output: Tstringlist; minLength: integer=1{минимальная длина слова});
var
  positionStart, positionEnd: integer;
  wordToAdd: string;
begin
  Assert(Assigned(output));
  output.Clear;
  positionStart := 1;
  while positionStart <= Length(str) do
  begin
    while (positionStart <= Length(str)) and not IsCharAlphaNumeric(str[positionStart]) do
      Inc(positionStart);
    if positionStart <= Length(str) then
    begin
      positionEnd := positionStart + 1;
      while (positionEnd <= Length(str)) and (IsCharAlphaNumeric(str[positionEnd]) or (str[positionEnd]=',')) do
        Inc(positionEnd);
      wordToAdd := Copy(str, positionStart, positionEnd - positionStart);
      if (Length(wordToAdd) >= minLength) then
      begin
        // добавление слова в список
        output.Add(AnsiLowerCase(wordToAdd));
      end;
      positionStart := positionEnd + 1;
    end;
  end;
end;
procedure TForm1.tolshina (a: Double);
 var v: Double;
begin
  if (a>=5) and (a<10) then  v:= 550-(((550-540)/4)*(a-5)) else
   if (a>=10) and (a<20) then v:= 450-(((450-440)/9)*(a-10)) else
    if (a>=20) and (a<30) then v:= 390-(((390-380)/9)*(a-20)) else
     if (a>=30) and (a<50) then v:= 320-(((320-310)/19)*(a-30)) else
      if (a>=50) and (a<80) then v:= 260-(((260-250)/29)*(a-50)) else
       if (a>=80) and (a<100) then v:= 210-(((210-200)/19)*(a-80)) else
        if (a>=100) and (a<150) then v:= 165-(((165-160)/49)*(a-100)) else
         if (a>=150) and (a<200) then v:= 140-(((140-130)/499)*(a-150)) else
          if (a>=200) and (a<250) then v:= 105-(((105-100)/99)*(a-200)) else
           if a=300 then v:= 70 else edt6.Text:= ('* нет *');

       edt6.Text:= FloatToStr(v);

end;


procedure TForm1.btn1Click(Sender: TObject);
 var words: TStringList; d, e, f: string; a, b, c: Double;
begin
    words:= TStringList.Create;
  SplitTextIntoWords(edt1.Text,words);
   mmo3.Text:=words.Text;
  words.Free;
  d:= mmo3.Lines[0];
  e:= mmo3.Lines[1];
  f:= mmo3.Lines[2];
  a:= StrToFloat(d);
  b:= StrToFloat(e);
  c:= StrToFloat(f);
  tolshina(a);

  end;


end.
Corpuscul вне форума Ответить с цитированием
Старый 21.09.2012, 19:38   #7
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Код:
  if (a>=5) and (a<10) then  v:= 550-(((550-540)/4)*(a-5)) else
   if (a>=10) and (a<20) then v:= 450-(((450-440)/9)*(a-10)) else
не очень удачное оформление записи - кажется, что операторы if вложенные. На самом деле If и else равнозначны.

И вообще все эти ветвления оформляются оператором case..of..else:

Код:
case a of
  5..9  : v:= 550-(((550-540)/4)*(a-5));
  10..19: v:= 450-(((450-440)/9)*(a-10));
  //и так далее - думаю, идея понятна. А в конце:
else edt6.Text:= ('* нет *');
end; //это обязательно, обозначает конец ветвления
Далее, у Вас в процедуре tolshina возникнет явная проблема в случае, если срабатывает else: значение переменной v может быть любым.
Поэтому пишем:

Код:
v:=-1; //Инициализируем v отрицательным, потому что по формулам оно может быть и нулевым
case a of //Структура, которую я привел выше
..
else edt6.Text:= '* нет *';
end;
//А здесь уже проверка - если v вычислено, то есть больше или равно нулю то:
if v>=0 then  edt6.Text:= FloatToStr(v);
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 21.09.2012 в 19:53.
Sciv вне форума Ответить с цитированием
Старый 21.09.2012, 21:19   #8
Corpuscul
Пользователь
 
Регистрация: 21.09.2012
Сообщений: 35
По умолчанию

[QUOTE=Sciv;1103233]

И вообще все эти ветвления оформляются оператором case..of..else:

Код:
case a of
  5..9  : v:= 550-(((550-540)/4)*(a-5));
  10..19: v:= 450-(((450-440)/9)*(a-10));
  //и так далее - думаю, идея понятна. А в конце:
else edt6.Text:= ('* нет *');
end; //это обязательно, обозначает конец ветвления
Ввел, при запуске программы выделяет красным
Код:
case a of
а внизу пишет:
[DCC Error] Unit1.pas(107): E2030 Duplicate case label
[DCC Error] Unit1.pas(108): E2030 Duplicate case label
[DCC Error] Unit1.pas(109): E2030 Duplicate case label
[DCC Error] Unit1.pas(110): E2030 Duplicate case label
[DCC Error] Unit1.pas(111): E2030 Duplicate case label
[DCC Error] Unit1.pas(112): E2030 Duplicate case label
[DCC Error] Unit1.pas(113): E2030 Duplicate case label
[DCC Error] Unit1.pas(117): E2015 Operator not applicable to this operand type
[DCC Fatal Error] Project1.dpr(5): F2063 Could not compile used unit 'Unit1.pas'
Что это значит, где может быть ошибка?
Corpuscul вне форума Ответить с цитированием
Старый 21.09.2012, 22:47   #9
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

приведите весь код который ввели... У Вас ошибки - Удвоение кейса и Оператор не соответствует этому типу операнда. Надо смотреть всю процедуру...
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 21.09.2012, 23:25   #10
Corpuscul
Пользователь
 
Регистрация: 21.09.2012
Сообщений: 35
По умолчанию

Код:
 public
    { Public declarations }
    procedure tolshina (a: Double);
   var  a, b, c: Double;
  end;
Вот эта процедура
Код:
procedure TForm1.tolshina (a: Double);
 var v: Double;
begin
v:=-1
case a of
5..9 : v:= 550-(((550-540)/4)*(a-5));
10..19 : v:= 450-(((450-440)/9)*(a-10));
20..29 : v:= 390-(((390-380)/9)*(a-20));
30..49 : v:= 320-(((320-310)/19)*(a-30));
50..79 : v:= 260-(((260-250)/29)*(a-50));
80..99 : v:= 210-(((210-200)/19)*(a-80));
100..149 : v:= 165-(((165-160)/49)*(a-100));
150..199 : v:= 140-(((140-130)/499)*(a-150));
200..250 : v:= 105-(((105-100)/99)*(a-200));
300 : v:= 70;
else edt6.Text:= '* нет *';
end;
if v>=0 then edt6.Text:= FloatToStr(v);

end;
Вызов процедуры
Код:
procedure TForm1.btn1Click(Sender: TObject);
 var words: TStringList; d, e, f: string; a, b, c: Double;
begin
    words:= TStringList.Create;
  SplitTextIntoWords(edt1.Text,words);
   mmo3.Text:=words.Text;
  words.Free;
  d:= mmo3.Lines[0];
  e:= mmo3.Lines[1];
  f:= mmo3.Lines[2];
  a:= StrToFloat(d);
  b:= StrToFloat(e);
  c:= StrToFloat(f);
  tolshina(a);

  end;

Последний раз редактировалось Corpuscul; 21.09.2012 в 23:42.
Corpuscul вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан текст. Слова в тексте отделены одним пробелом, в конце текста точка. Распечатать все слова текста, которые содержат..... Anton94.by Паскаль, Turbo Pascal, PascalABC.NET 1 06.02.2012 23:36
Дан текст, в котором слова отделяются друг от друга пробелами, удалить из текста все повторно встречающиеся слова Anton94.by Паскаль, Turbo Pascal, PascalABC.NET 1 16.12.2011 11:03
Разделение слова на отдельные символы,вычисление их количества tagantroy Паскаль, Turbo Pascal, PascalABC.NET 2 18.07.2011 00:39