Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Выделить подстроку: вещественное число с фиксированной точкой   Найти похожие ветки 

 
rozarock ©   (2010-04-13 21:13) [0]

Задача в следующем: дана строка символов, состоящая из букв, цифр, запятых, точек, знаков “+” и “-“. Выделить подстроку, которая соответствует записи вещественного числа с фиксированной точкой.

Строка вводится в ComboBox и при нажатии на кнопку необходимо вывести подстроку к примеру в Label.

Кусок моего нерабочего кода.
const
Digits = ["0".."9"];
var st : string;
    n,p,i,nst,mur,ind: integer;
begin
 n:=0;
     ind:=0;
 nst:=ComboBox1.ItemIndex;
 st:=ComboBox1.Items[nst];
   for i:=1 to Length(st) do begin
      case ind of
0 : if (st[i] in Digits) then begin
ind:=1;
n:=n+1;
// p:=pos(i,st);
end;
1 : if not (st[i] in Digits) then begin
ind:=0;
otv:=copy(st,i,n);
end;
Label3.Caption:=IntToStr(otv);
end;
end.


Ребята, помогите, пожалуйста.


 
MBo ©   (2010-04-13 21:19) [1]

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


 
И. Павел ©   (2010-04-13 22:17) [2]

Найти-то легко. А вот с разбором алгоритма судя по всему будет сложно.

http://forum.sources.ru/index.php?showtopic=276120

Если не подойдет - можно поискать в google.
http://www.google.com/#hl=en&source=hp&q=%D0%B4%D0%B0%D0%BD%D0%B0+%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0+%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%BE%D0%B2%2C+%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D1%89%D0%B0%D1%8F+%D0%B8%D0%B7+%D0%B1%D1%83%D0%BA%D0%B2%2C+%D1%86%D0%B8%D1%84%D1%80%2C+%D0%B7%D0%B0%D0%BF%D1%8F%D1%82%D1%8B%D1%85%2C+%D1%82%D0%BE%D1%87%D0%B5%D0%BA%2C+%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2&btnG=Google+Search&aq=f&aqi=&aql=&oq=%D0%B4%D0%B0%D0%BD%D0%B0+%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0+%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%BE%D0%B2%2C+%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D1%89%D0%B0%D1%8F+%D0%B8%D0%B7+%D0%B1%D1%83%D0%BA%D0%B2%2C+%D1%86%D0%B8%D1%84%D1%80%2C+%D0%B7%D0%B0%D0%BF%D1%8F%D1%82%D1%8B%D1%85%2C+%D1%82%D0%BE%D1%87%D0%B5%D0%BA%2C+%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2&gs_rfai=&fp=bcdf8cbbf06dc4f


 
rozarock ©   (2010-04-13 22:29) [3]

Я не могу адаптировать код с первой ссылки в Delphi самостоятельно. Там приведено решение на С.
Единственная надежда - уважаемые мастера, т.к. я не программист (


 
И. Павел ©   (2010-04-13 22:48) [4]


> Там приведено решение на С.



> i:= 1;


Так вот ты какой - це плюс плюс...


 
Игорь Шевченко ©   (2010-04-13 23:44) [5]

unit main;

interface

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

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   Label1: TLabel;
   Label2: TLabel;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   function GetFloatSubstring (const S: string): string;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 FloatStr: string;
begin
 FloatStr := GetFloatSubstring(Edit1.Text);
 if FloatStr = "" then
 begin
   Label1.Caption := "nothing";
   Label2.Caption := "nothing";
 end
 else
 begin
   Label1.Caption := FloatStr;
   Label2.Caption := FloatToStr(StrToFloat(FloatStr));
 end;
end;

function TForm1.GetFloatSubstring(const S: string): string;

 function IsDigit(C: Char): Boolean;
 begin
   Result := AnsiChar(C) in ["0".."9"];
 end;

type
 TAutomataState = (asNone, asDigit, asSeparator, asDigitAfterSeparator);
var
 I, NumberStart, NumberEnd: Integer;
 AutomataState: TAutomataState;
begin
 Result := "";
 NumberEnd := 0;
 NumberStart := 0;
 AutomataState := asNone;
 for I := 1 to Length(S) do
   case AutomataState of
   asNone: //Waiting for +,-,digit;
     if (S[I] = "+") or (S[I] = "-") or IsDigit(S[I]) then
     begin
       NumberStart := I;
       AutomataState := asDigit;
     end;
   asDigit: //Waiting for digit or decimal separator
     if S[I] = DecimalSeparator then
       AutomataState := asSeparator
     else if not IsDigit(S[I]) then
       AutomataState := asNone; //not a number
   asSeparator: //Got separator, waiting for digit
     if IsDigit(S[I]) then
       AutomataState := asDigitAfterSeparator
     else
       AutomataState := asNone; //not a number
   asDigitAfterSeparator:
     if not IsDigit(S[I]) then
     begin
       NumberEnd := Pred(I);
       Break;
     end;
   end;
 if AutomataState = asDigitAfterSeparator then
 begin
   if NumberEnd = 0 then
     NumberEnd := Length(S);
   Result := Copy(S, NumberStart, NumberEnd-NumberStart+1);
 end;
end;

end.


А вообще, бросай ты, девушка Катя, это программирование нафиг :)


 
Игорь Шевченко ©   (2010-04-13 23:47) [6]

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


 
Германн ©   (2010-04-14 00:55) [7]


> Игорь Шевченко ©   (13.04.10 23:47) [6]
>
> Вот что странно - описание задачи встречается во многих
> ссылках, в том числе и в методичках. Ну почему они, авторы
> методичек, там же не публикуют и решения ?

Может они их сами не знают? Решений т.е.


 
Anatoly Podgoretsky ©   (2010-04-14 08:41) [8]

> Игорь Шевченко  (13.04.2010 23:47:06)  [6]

Это не их задача и это их не колышет.


 
Anatoly Podgoretsky ©   (2010-04-14 08:41) [9]

> Германн  (14.04.2010 00:55:07)  [7]

И ходят по форумам, ищут


 
rozarock ©   (2010-04-15 01:02) [10]

Игорь, благодарю за решение. Сама бы я этого сделать не смогла. По крайней мере изящно и не в течение двух недель.
PS Зато я неплохой фотограф и экономист ;) Обращайтесь


 
Германн ©   (2010-04-15 01:11) [11]


> Зато я неплохой фотограф и экономист

Хм. Зачем неплохому фотографу и особенно экономисту сдалось программирование?
А уж анкета просто убивает. :)
Реальное имя: Разина Екатерина
Пол: Мужской


 
rozarock ©   (2010-04-15 01:22) [12]

Не будьте столь педантичны. Такие аккаунты создаются впопыхах.
Зачем? Ритуал получения высшего образования никто не отменял.
И переводчики вынуждены сдавать высшую математику. И менеджеры - знать проектирвоание ИС


 
Германн ©   (2010-04-15 01:24) [13]


> rozarock ©   (15.04.10 01:22) [12]
>
> Не будьте столь педантичны.

Я не педантичен. Вот только стиль "впопыхах" мне не известен.


 
И. Павел ©   (2010-04-15 08:07) [14]

> И переводчики вынуждены сдавать высшую математику. И менеджеры
> - знать проектирвоание ИС

Это называется "общее развитие" и важно для тех студентов, которые воспринимают получение высшего образования не как "ритуал". Это также важно, если вы не хотите краснеть перед своими детьми, будучи не в состоянии помочь им в учебе.


 
Anatoly Podgoretsky ©   (2010-04-15 08:49) [15]

> rozarock  (15.04.2010 01:02:10)  [10]

Вот если бы повар, то обратился бы.


 
Leonid Troyanovsky ©   (2010-04-15 12:39) [16]


> rozarock ©   (15.04.10 01:22) [12]

> - знать проектирвоание ИС


procedure TForm1.Button1Click(Sender: TObject);
var
 ss: TStringStream;
 p: TParser;
begin
 ss := TStringStream.Create(Memo1.Text);
 p := TParser.Create(ss);
 while (p.Token <> toEOF) do
   begin
     if (p.Token = "+") then
       p.NextToken;
     if (p.Token = toFloat) then
       ShowMessage(p.TokenString);
     p.NextToken;
   end;
 p.Free;
 ss.Free;
end;

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.148 c
15-1270672202
Юрий
2010-04-08 00:30
2010.08.27
С днем рождения ! 8 апреля 2010 четверг


2-1269445511
Kurilkin
2010-03-24 18:45
2010.08.27
TFrame


15-1265624198
Сергей М.
2010-02-08 13:16
2010.08.27
TMozillaBrowser и программный доступ к параметрам конфигурации


3-1240340701
VoznikVopros
2009-04-21 23:05
2010.08.27
Как произвести "выделение" в DBLookupListBox1 согласно № эл. в БД


2-1273576150
noob_one
2010-05-11 15:09
2010.08.27
Variant как массив.