IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Строки.Плавающая точка., Выделить подстроку, соответствующую вещественному числу с плавающей
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 8
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


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

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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


сходу вот такой кошмарик получился:
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 обойтись...


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Ну, без 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 как правильное быть распечатано, или только то, что подходит под заданную в первом сообщении маску?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


да не, так кошмарик меньший, но непринципиально меньший....
читается легче.

ожидала кучу удивленных смайликов и программу в 2 строчки...
потому что у меня стойкое ощущение, что какое-то простое решение упускаю sad.gif


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Вольво, а как тебе пример "12.12.2E-12"? smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






В принципе, вот ЭТО тоже вариант:
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
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


если нужно соответствие маске - то не вариант....
попробуй 111111111111111111fkjfl2.2E+7
если все, что допустимо для val - другое дело....


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Ждем ответа автора...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Всем спасибо.Буду разбираться.
И с Новым годом вас всех!!!
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 25.04.2024 18:01
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name