Максим Шилов
Ученик
(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;
разница, мягко говоря, огромная
Добавлено через 1 мин.
IUnknown, спасибо за совет
Как найти в определенном предложении всё слова, где присутствуют цифры.
То есть в итоге вывести количество таких слов.
Делал вот так но что то не работает
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
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
Поправил.
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
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.