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

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

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

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





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

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


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

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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 31.12.2006 0:46
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 31.12.2006 1:12
Сообщение #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 как правильное быть распечатано, или только то, что подходит под заданную в первом сообщении маску?
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 31.12.2006 1:24
Сообщение #4


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

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

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


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

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


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


Michael_Rybak
*****

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

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


Вольво, а как тебе пример "12.12.2E-12"? smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 31.12.2006 1:48
Сообщение #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
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 31.12.2006 2:04
Сообщение #7


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

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

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


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


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


Гость






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


Гость






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

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

 



- Текстовая версия 20.07.2025 3:00
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"