Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.061 c
6-1218124422
dozcent
2008-08-07 19:53
2010.08.27
TSeverThead, TServerSocket


15-1274646586
Юрий
2010-05-24 00:29
2010.08.27
С днем рождения ! 24 мая 2010 понедельник


15-1272918602
Юрий
2010-05-04 00:30
2010.08.27
С днем рождения ! 4 мая 2010 вторник


2-1272953338
Беликов А.А
2010-05-04 10:08
2010.08.27
Конвертация TBitmap в TGPBitmap


2-1273239423
Алексей 123
2010-05-07 17:37
2010.08.27
Как переопределить DoMouseLeave у потомка TCustomControl?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский