Помощь - Поиск - Пользователи - Календарь
Полная версия: Строки.Плавающая точка.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Stefan
Задана строка символов, состоящая из букв, цифр, запятых, точек,
знаков “+” и “-“, открывающей и закрывающей скобок. Выделить подстроку,
соответствующую вещественному числу с плавающей точкой (т.е. в виде –0.00E-
00).

Подскажите,как это сделать?

мисс_граффити
сходу вот такой кошмарик получился:
program podstroka;
var s,pods:string;
i:integer;
done:boolean;

procedure ciferki(const s: string; var pods: string; var i: integer);
begin
while (s[i] in ['0'..'9']) and (i<=length(s)) do
  begin
  pods:=pods+s[i];
  inc(i);
  end;
end;

begin
writeln('input string?');
readln(s);
i:=1;
done:=false;
while not(done) and (i<=length(s)) do
  begin
  pods:='';
  while (not(s[i] in ['-','0'..'9'])) and (i<=length(s)) do
    inc(i);
  if s[i]='-' then
    begin
    pods:=pods+s[i];
    inc(i);
    end;
  if (i<=length(s)) then
    if not(s[i] in ['0'..'9']) then
      continue;
  ciferki(s,pods,i);
  if s[i]<>'.' then
    continue;
  pods:=pods+s[i];
  inc(i);
  if not(s[i] in ['0'..'9'])then
    continue;
  ciferki(s,pods,i);
  if s[i]<>'E' then
    continue;
  pods:=pods+s[i];
  inc(i);
  if (s[i]<>'+') and (s[i]<>'-') then
    continue;
  pods:=pods+s[i];
  inc(i);
  if not(s[i] in ['0'..'9'])then
    continue;
  ciferki(s,pods,i);
  done:=true;
  end;
if done then
  writeln(pods);
readln;
end.

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

А по-хорошему, надо подумать, как без continue обойтись...
volvo
Ну, без Continue получается гораздо больший "кошмарик":
program podstroka;
var
  s,pods:string;
  i:integer;
  done:boolean;

function next(var i: integer): integer;
begin
  next := i;
  inc(i);
end;

procedure ciferki(const s: string; var pods: string; var i: integer);
begin
while (s[i] in ['0'..'9']) and (i<=length(s)) do
  begin
  pods:=pods+s[i];
  inc(i);
  end;
end;

begin
(*
  writeln('input string?');
  readln(s);
*)
s := '(12.2E-12 + A)';

i:=1;

done:=false;
while not(done) and (i<=length(s)) do begin
  pods:='';
  while (not(s[i] in ['-','0'..'9'])) and (i<=length(s)) do inc(i);
  if s[i]='-' then begin
    pods:=pods+s[i];
    inc(i);
  end;
  if not((i<=length(s)) and (not(s[i] in ['0'..'9']))) then begin
    ciferki(s,pods,i);
    if s[i] = '.' then begin
      pods:=pods+s[next(i)];
      if (s[i] in ['0'..'9']) then begin
        ciferki(s,pods,i);
        if s[i] = 'E' then begin
          pods:=pods+s[next(i)];
          if not ((s[i]<>'+') and (s[i]<>'-')) then begin
            pods:=pods+s[next(i)];
            if (s[i] in ['0'..'9']) then begin
              ciferki(s,pods,i);
              done:=true;
            end
          end;
        end;
      end;
    end;
  end;
end;
if done then
  writeln(pods);
readln;
end.
(я немного разгрузил программу, добавив функцию next, но это - капля в море...)

Кстати, если ориентироваться на работу парсера TP, то он воспринимает 12.E-12 как правильное число, поэтому вопрос к автору: должно ли ЛЮБОЕ число, воспринимаемое компилятором TP как правильное быть распечатано, или только то, что подходит под заданную в первом сообщении маску?
мисс_граффити
да не, так кошмарик меньший, но непринципиально меньший....
читается легче.

ожидала кучу удивленных смайликов и программу в 2 строчки...
потому что у меня стойкое ощущение, что какое-то простое решение упускаю sad.gif
Michael_Rybak
Вольво, а как тебе пример "12.12.2E-12"? smile.gif
volvo
В принципе, вот ЭТО тоже вариант:
var
  s: string;
  start, len: integer;
  i, j, err: integer;
  f: real;
begin
  (*
    writeln('input string?');
    readln(s);
  *)
  s := '(12.2E-12 + A)';
  len := 0;
  for i := 1 to length(s) do begin
    for j := i to length(s) do begin

      val(copy(s, i, j - i + 1), f, err);
      if err = 0 then begin
        if j - i + 1 > len then begin
          start := i; len := j - i + 1;
        end
      end;

    end;
  end;
  writeln(copy(s, start, len));
end.


2 Michael_Rybak: Вот как раз новый-то вариант и обрабатывает такие примеры smile.gif
мисс_граффити
если нужно соответствие маске - то не вариант....
попробуй 111111111111111111fkjfl2.2E+7
если все, что допустимо для val - другое дело....
volvo
Ждем ответа автора...
-Stefan-
Всем спасибо.Буду разбираться.
И с Новым годом вас всех!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.