Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ строки и списки

Автор: crazysun 19.12.2004 22:57

Вводится строка символов, в которой могут встречаться пробелы, цифры, буквы 'Е' и 'е', знаки '+' и '-'. Известно, что первый символ отличен от пробела. Из данной строки выделить подстроку символов, предшествующих первому пробелу. Требуется определить, является ли эта подстрока числом (в смысле Паскаля). Если да, то выяснить: целое или вещественное это число, положительное или отрицательное.

Автор: volvo 19.12.2004 23:11

crazysun
Все очень просто - есть такая функция Pos(subst, st: string):byte, и если ее применить в виде:

Код
...
p := pos(' ', s);
if p > 0 then
 st := copy(s, 1, p-1)
else st := s;
...

то в st как раз будет кусок исходной строки до первого пробела (если пробела нет, то скопируется вся строка). Дальше - дело техники (можно использовать Val, например)

Автор: crazysun 19.12.2004 23:44

thx

Автор: volvo 21.12.2004 18:09

crazysun
Вот программа полностью...

{$N+}
const
 s: string = '+1.256723E-23 and so on...';

{ В переменной IsNegative возвращается признак того, является ли число
в строке отрицательным, IsLongInt - признак того, является ли число целым...
Внимание: Обе эти переменные содержат правильные результаты ТОЛЬКО
тогда, когда сама функция возвращает True!!! }
function isNumber(s: string;
        var isNegative, isLongInt: boolean): boolean;
 var
   TnLong: LongInt; TnDouble: Double;
   err: Integer;
 begin
   IsLongInt := True;
   Val(s, TnLong, err);
   if err <> 0 then
     begin
       IsLongInt := False;
       Val(s, TnDouble, err);
       isNumber := False;
       if err <> 0 then Exit
     end;
   IsNegative := (s[1] = '-');
   isNumber := True
 end;

var
 b, bNeg, bLong: boolean;
begin
 b := isNumber(copy(s, 1, pred(pos(' ', s)) + 255*byte(pos(' ', s) = 0)),
               bNeg, bLong);
 writeln('is number: ', b);
 if b then
   begin
     writeln('is negative: ', bNeg);
     writeln('is integer: ', bLong);
   end;
end.