Как найти число в строке pascal

Максим Шилов



Ученик

(19),
закрыт



5 лет назад

ПРИВЕТ ВСЕМ!
помогите…как проверить,имеются ли в заданной строке типа string числа на паскале:)?

пример

var
str:string;
begin
str:=’bnfldn2ml4kn12h3;
//строка str имеет 5 символов цифр

я думаю что надо как то через цикл…тоесть брать каждый символ строки и рассматривать его…чем проще тем лучше
помогите плизз

nnn7

Просветленный

(20142)


12 лет назад

описываешь множество цифр ( от 0 до 9) и проверяешь его включение в строке. Допустим так:

Var s:string; ch:set of char; i,k:integer;
begin
ch:=[‘0’..’9′];
readln(s);
for I := 1 to length(s) do
if s[ i ] in ch then
inc(k);
writeln(k);
readln;
end.
end.

Алексей Азаров

Мастер

(1663)


12 лет назад

Ну вы правильно думаете, жаль я паскаль совсем не помню, но могу модульно написать,
1) Посчитать символы
2) пока i=<количества символов
проверять число оно или нет и присваивать ей инкремент (1)
Если символ число или сохранять его в переменную, маcсив или просто считать в зависимости от того что от вас требуется
3) сделать вывод.. .

Krab Вark

Оракул

(56898)


12 лет назад

С помощью функции val. Она сама проверяет, является ли строка записью числа, и выдает номер первого символа, с которого можно проверять дальше. То есть проверяешь с 1-го символа, если результат 0, то со 2-го и так далее, если не 0, то тебе выдается число и номер символа, с которого надо проверять дальше.

program lab3_1;
 
const
  alf = ['а'..'я', 'А'..'Я'];
 
var
  text: string;
  k, i, l, q: integer;
  s: array[1..4] of string;
 
begin
  k := 0;
  writeln('Введите текст:');
  readln(text);
  for i := 1 to length(text) do
  begin
    k := k + 1;
    if (text[k] in alf) then
    begin
      delete(text, k, 1);
      k := k - 1;
    end;
  end;
  
  Text := text + ' ';
  i := 0;
  l := 0;
  q := length(text);
  while q > 0 do 
  begin
    i := i + 1;
    q := q - 1;
    if text[i] <> ' ' then
    begin
      l := l + 1;
      while text[i] <> ' ' do
      begin
        s[l] := s[l] + text[i];
        i := i + 1;
        q := q - 1;
      end;
    end;
  end;
  writeln;
  for i := 1 to l do
    write(s[i], ' ');
  
end.

Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

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



вот что получилось с использованием конечного автомата

procedure TForm1.Button1Click(Sender: TObject);
type Mtype=(H,A,B,C,D,E,F,S);
var S1,S2: string;
i: integer;
q: Mtype;
begin
S1:=Edit1.text+' ';
i:=1;
S2:='';
q:=H;
Repeat
case q of
H: case S1[i] of
'.': begin
q:=B;
S2:=S2+S1[i];
Inc(i);
end;
'+','-': begin
q:=A;
S2:=S2+S1[i];
Inc(i);
end;
'0'..'9': begin
q:=C;
S2:=S2+S1[i];
Inc(i);
end;
else begin
q:=H;
Inc(i);
end;
end;
B: case S1[i] of
'0'..'9': begin
q:=D;
S2:=S2+S1[i];
Inc(i);
end;
else begin
q:=H;
S2:='';
end;
end;
A: case S1[i] of
'0'..'9': begin
q:=C;
S2:=S2+S1[i];
Inc(i);
end;
else begin
q:=H;
S2:='';
end;
end;
C: case S1[i] of
'.': begin
q:=F;
S2:=S2+S1[i];
Inc(i);
end;
'0'..'9': begin
q:=C;
S2:=S2+S1[i];
Inc(i);
end;
else q:=S;
end;
F: case S1[i] of
'0'..'9': begin
q:=D;
S2:=S2+S1[i];
Inc(i);
end;
else q:=S;
end;
D: case S1[i] of
'0'..'9': begin
q:=D;
S2:=S2+S1[i];
Inc(i);
end;
else q:=S;
end;
end;
Until q=S;
Label1.Caption:=S2;

end;

а вот как было до этого

procedure TForm1.Button1Click(Sender: TObject);
var s,s2: string;
m,m2,m3,m4,m5,z: sss;
i,k,j,n: integer;
f,f2: boolean;
begin
Label1.Caption:='';
s:=Edit1.Text;
m:=['0'..'9', '+', '-'];
z:=['+','-'];
m2:=['0'..'9', '.', ','];
m3:=[',', '.'];
m4:=['0'..'9', '+', '-', ',', '.'];
m5:=['0'..'9'];
s2:='';
i:=0;
n:=0;
k:=0;
f:=False;
f2:=False;
Repeat
Inc(i);
if (S[i] in m) then k:=i;
if ((S[i] in z) and (S[i+1] in m5)) or ((S[i] in m5) and (S[i+1] in m5)) then f:=True;
if S[i] in m5 then f2:=True;
until (((S[i] in m) and (pr(S[i], S[i+1],z)=True)) and (f=True)) or (i=Length(s)) or f2=True;

f:=False;

for j:=k to Length(s) do
begin
if s[j] in m then begin
f:=True;
Break;
end;
end;

k:=j;

if f=true then begin
for j:=k to Length (S) do
begin
if S[j] in m4 then
begin
if (S[j]=',') or (S[j]='.') then n:=n+1;
if (n=1) then if (S[j] in m5) or (S[j+1] in m5) or (j=Length(S)) then s2:=s2+s[j]
else break;
if (n=0) and (S[j] in m) then s2:=s2+s[j];
if S[j] in m3 then begin
if pr(S[j],S[j+1],m3)=False then Break; end;
end;
if (not (S[j+1] in m2)) or (n>1) then Break;
end;
end;

f:=False;

for i:=1 to Length(s2) do begin
if s2[i] in m5 then begin
f:=True;
Break;
end;
end;

if (s2='') or (f=False) then Label1.Caption:='net chisla'
else Label1.Caption:=s2;
end;

разница, мягко говоря, огромная smile.gif

Добавлено через 1 мин.
IUnknown, спасибо за совет smile.gif

Как найти в определенном предложении всё слова, где присутствуют цифры.
То есть в итоге вывести количество таких слов.
Делал вот так но что то не работает

Function num_count(s:string):integer;
Var i,num:integer;
n:0..9;
word:string;
begin
num:=0;
word:='';
for i:=1 to Length(S) do //просматриваем всю строку
begin
if(S[i]=' ') then    //если пробел то новое слово
  word:=''
else
begin
  //если находим цифру то прибавляем счетчик
if Pos(inttostr(n),word)<>0 then
num:=num+1;
word:=word+S[i];
Continue;
end;

Result:= num;
end;end;

задан 15 дек 2011 в 13:18

zerpico's user avatar

2

Вариант выше при пробелах подряд в середине и конце строки ошибается

А так же использует долгие функции

Вот приемлимый код по скорости и объему кода

function num_count(s:string):integer;
var
  i,num,len:integer;

begin
  num:=0;
  i:=1;
  len:=length(s);

   while (i<=len) do
        if (s[i] in ['0'..'9'] )
         then
            begin
            inc(num);
            while ( (s[i] <> ' ') and (i<=len) ) do inc(i);
            end
         else inc(i);

  result:= num;
end;

ответ дан 15 дек 2011 в 16:37

botanegg's user avatar

Поправил.

    Function num_count(s:string):integer;
    Var
      i,num:integer;
    begin

      num:=0;

      i:=1;

     While (S[Length(S)]=' ') Do // удаляю пробелы в конце
       Delete(S, Length(S), 1);

// Вместо предыдущего цикла в Delphi можно использовать S:=Trim(S);

        While (i<=Length(S)) Do
          Begin
            If (S[i]=' ') Then
              Begin
                Repeat // теперь не ошибётся
                  delete(S, 1, 1);
                Until (S[1]<>' ');
                i:=1;
              End;

            if (S[i] In ['0'..'9']) then
              Begin
                num:=num+1;
                If (Pos(' ', S)=0) Then
                  Break // можно написать так
                  {Begin // или так
                    Result:= num;
                    Exit;
                  End}
                Else
                  delete(S, 1, Pos(' ', S));
                i:=1;
              End
            Else
              Inc(i);
          End;

      Result:= num;
    end;

Теперь мой вариант не ошибается, если пробелов в центр строки натыкать, хотя достаточно велик по объёму кода (оптимизацией я тут не занимался – написал то, что первое в голову пришло).

ответ дан 15 дек 2011 в 13:30

DelphiM0ZG's user avatar

DelphiM0ZGDelphiM0ZG

3,03714 серебряных знаков18 бронзовых знаков

2

Сколько двухзначных чисел в исходной строке делются на 5.

function chs(s:string):integer;
var
l,i,q,j,k1,t,code:integer;
k:string;
begin
l:=length(s);
i:=1;
q:=0;
j:=0;
repeat
k:=copy(s,i,1); //находим числа
val(k,k1,code);
if code=0 then
while code=0 do
begin
t:=k1;
if not((q=0) and (t=0)) then q:=q+1;
i:=i+1;
k:=copy(s,i,1);
val(k,k1,code);
end;
if ((t=5) or (t=0)) and (q=2) then // кратность двухзначность
j:=j+1;
t:=3;
i:=i+1;
q:=0;
k:=copy(s,i,1);
val(k,k1,code);
until i>l-1;
chs:=j;
end;
var
string1:string;
begin
write(‘Исходная строка: ‘);
readln(string1);
write(‘Ответ: ‘);
write(chs(string1));
write(‘ двухзначное число кратно 5’);
end.

Найти среднее арифметическое всех чисел в тексте

uses crt;
var
a: string;
i,kol: integer;
b:integer;

sum:integer;

begin
writeln(‘vvedite stroky’);
readln(a);
i:=1;
sum:=0;
kol:=0;
while (i<=length(a)) and (a[i]<>’.’) do
begin
if ( ord(a[i])-48) in [0..9] then
begin
while ((ord(a[i])-48) in [0..9]) and (i<=length(a)) do
begin
b:=b*10 + (ord(a[i])-48);
i:=i+1;
end;
sum:=(sum + b);
kol:=kol+1;
delete (a, 1, i-1);
i:=1;
b:=0
end;
i:=i+1;
end;
writeln(sum/kol:1:0);
readkey();
end.

Добавить комментарий