0 / 0 / 0 Регистрация: 09.12.2019 Сообщений: 3 |
|
1 |
|
Поиск чисел в строке06.02.2020, 16:54. Показов 10171. Ответов 5
Приветствую. Подскажите, как найти числа в строке. Как найти сумму цифр, я разобрался. Но не могу понять, как выделить числа из строки.
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
06.02.2020, 16:54 |
Ответы с готовыми решениями: Поиск и вывод чисел в строке Поиск вещественных чисел в произвольной строке символов Поиск в строке чисел Нужно из строки взять только числа и… Поиск чисел в строке 5 |
Почетный модератор 64287 / 47586 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
|
06.02.2020, 17:10 |
2 |
0 |
0 / 0 / 0 Регистрация: 09.12.2019 Сообщений: 3 |
|
06.02.2020, 17:59 [ТС] |
3 |
Нахождение суммы цифр я уже сделал, не могу разобраться именно с числами
0 |
Почетный модератор 64287 / 47586 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
|
06.02.2020, 19:09 |
4 |
Так я дал ссылку, смотри мои последние посты в той теме.
0 |
JuriiMW 5056 / 2630 / 2345 Регистрация: 10.12.2014 Сообщений: 9,993 |
||||||||||||
07.02.2020, 04:34 |
5 |
|||||||||||
Если при наличии отсутствия цифр, устроит ответ 0, то можно так:
Ой! Это же паскаль без .NET…
0 |
Cyborg Drone Модератор 9588 / 4908 / 3244 Регистрация: 17.08.2012 Сообщений: 15,337 |
||||
07.02.2020, 19:59 |
6 |
|||
JuriiMW, это не полностью по заданию. Полностью по заданию можно так:
0 |
На занятии будет рассмотрен Строковый тип данных в Паскаль и примеры работы с ним
Содержание:
- Символьный тип char в Паскале
- Основные функции для работы с символами
- Строковые переменные в Паскаль
- Функции работы со строками в Pascal
- Стандартные методы и запросы (pascalAbc.net)
- Посимвольный ввод до пробела
Символьный тип char в Паскале
Символьной переменной соответствует тип char:
Инициализация символьной переменной:
Основные функции для работы с символами
Функция преобразует целое число, имеющее тип BYTE, в один символ ASCII-кода:
Пример: распечатать двойную кавычку по ее коду в ASCII-таблице
1 2 3 4 5 6 7 |
var a:char; i:byte; begin i:=34; {код, соответствующей символу " в ASCII-таблице} a:=chr(i); writeln(a) end. |
Функция возвращает порядковый номер символа параметра в таблице ASCII:
Пример: Распечатайте часть таблицы ASCII, конкретнее — символы, соответствующие кодам 32-255
1 2 3 4 5 |
var i: integer; begin for i:=32 to 255 do write(chr(i):3); end. |
Примеры:
var c := 'Ю'; var n := Ord(c); // n := c.Code Print(n); // 1070 c := Chr(n); print(c); // Ю
Символьные константы: #код
– символ с определенным кодом:
#10 – новая строка (Linux) #13#10 – новая строка (Windows) #9 – tab Print('a'#10'b');
Методы класса типа char
char.IsLetter(с); // буква ли, boolean char.IsDigit(с); // десятичное ли число, boolean char.IsLower(с); // буква нижнего регистра, boolean char.IsUpper(с); // буква верхнего регистра, boolean char.IsPunctuation(с); // знак препинания, boolean с := char.ToLower(с) ; с := char.ToUpper(с);
Операции для типа char
c1 < c2;// сравнение по коду c1 > c2; с in ['a','e','i','o','u',’y’]; // c принадлежит гласным с in ['a'..'z','A'..'Z’]; // c принадлежит английским буквам
Задание:
Запросите ввести два символа. Определите, принадлежат ли символы английским буквам, и если да, то гласные ли это буквы. Преобразуйте в верхний регистр ту букву, код которой меньше.
Пример вывода:
Введите два символа: u z u - английская буква, гласная z - английская буква, не гласная Буква u в верхнем регистре U
Некоторые выражения:
//c принадлежит диапазону: c.InRange('a'..'z'); //Трансформация символа в цифру: var n := Ord(c) – Ord('0'); // Увеличение кода символа на n: c := Chr(Ord(c) + n); // или Inc(c,2);
Строковые переменные в Паскаль
Строковые переменные в Паскале имеют тип String
Объявление и инициализация строковой переменной:
1 2 3 4 5 var a:string; begin a:='Привет всем!'; writeln(a); end.Ввод значения строковой переменной с клавиатуры:
1 2 3 4 5 6 var a:string; begin writeln('Введите слово'); readln(a); writeln('Вы ввели слово ',a); end.Строка «рассматривается» компилятором, как массив букв:
для компилятора:
s[1]='Б' s[2]='а' s[3]='н' s[4]='к' s[5]='а'
Важно: Значения строковых переменных всегда заключаются в одинарные кавычки
Функции работы со строками в Pascal
Исходные данные | Операция | Результат |
---|---|---|
s1:='Мото'; s2:='роллер' |
s3:=s1+s2; |
s3=’Мотороллер’ |
s5:='Мотороллер'; |
k:=Pos('рол',s5); |
k=5 |
s3:='Мотороллер'; |
l:=Length(s3); |
l=10 |
s3:='астроном'; |
s4:=Copy(s3,3,4); |
s4= ‘трон’ |
s5:='Коробочка'; |
Delete(s5,4,2); |
s5=’Корочка’ |
s6:='Рука'; s7:='баш'; |
Insert(s7,s6,3); |
s6=’Рубашка’ |
x:=2.73284; |
Str(x:4:2,s8); |
s8=’2.73′ |
s8='2.73'; |
Val(s8,x,Osh); |
x=2.73 |
Пример: Подсчитать кол-во букв «f» в тексте.
Показать решение:
Паскаль | PascalAbc.NET | ||||
---|---|---|---|---|---|
|
|
Операции со строками:
s1 + s2 // конкатенация s1 и s2 s1 += s2 s1 < s2 // лексикографическое сравнение 'abcd' < 'aad' s * n // конкатенация n копий строки s s[a:b] // срез (индексация с 1) s[a:b:step] // срез с шагом s?[3:5] ; // безопасный срез (не вызывает ошибок) s?[a:b:step] // безопасный срез с шагом s1 in s
String 1. Дан текст. Удалить в нём все слова кот. Выполнить задание двумя способами: используя стандартные функции работы со строками, и, работая со строкой как с массивом символов.
Пример выполнения:
введите строку мой кот - хороший кот Результат: мой - хороший
* Задание повышенной сложности: запросить у пользователя ввести подстроку, которую требуется удалить из исходной строки.
String 2. Составить программу проверки, есть ли в тексте буква s. Выдавать true (если найдено) или false (если не найдено).
Примеры использования логического типа (true и false) смотрите здесь.
Пример выполнения:
Введите строку: Hello world Результат: false
Введите строку: Hello students Результат: true
String 3. Имеется строка текста. Требуется написать программу, которая зашифровывала бы ее в другую строку — заменяя каждый символ текста символом, следующим по порядку в таблице ASCII. Тогда слово КОТ превратится в слово ЛПУ. Требуется составить и программу дешифровки.
Использовать функции для работы с символами: chr и ord pascal.
String 4. Дано предложение, определить количество слов в нём.
Подсказка: считать количество слов по количеству пробелов в строке.
* усложненный вариант: предусмотреть, что в начале или в конце введенной строки введен пробел
Пример: Найти количество цифр в строке.
Показать решение:
Паскаль | PascalAbc.NET | ||||
---|---|---|---|---|---|
|
|
Пример: Определить является ли данное слово перевертышем (палиндромом).
Показать решение:
Паскаль | PascalAbc.NET | ||||
---|---|---|---|---|---|
|
|
String 5. Составить программу подсчета количества встречаемых в тексте сочетаний букв «ма».
String 6. Определить, встречается ли в тексте сочетание букв «ку».
Пример выполнения:
Введите строку: Кума Результат: да
Введите строку: Дед Результат: нет
String 7. Заменить данную букву в слове другой буквой (буквы вводит пользователь).
Пример выполнения:
Введите строку: Барабулька Введите букву, которую заменить: а Введите букву, на которую заменить: у Результат: Бурубульку
String 8. Дано предложение, определить количество слов, начинающихся с буквы «к».
String 9. Дано предложение, состоящее из букв и цифр. Определить слово с наибольшим количеством букв (не цифр). В качестве подсказки можете использовать предложенный ниже алгоритм:
Пример выполнения:
Введите строку: 1234567891011слово следующееСлово иСледСлово Слово с максимальным количеством букв: следующееСлово
Алгоритм:
for
.const letters=['a'..'z'];
), то этот символ прибавляется к первому элементу массива слов строки (... array [1..100] of string
).String 10. Дано предложение. Расположить слова в нем в порядке возрастания числа букв в словах. В качестве подсказки можете использовать предложенный ниже алгоритм:
Алгоритм:
arrayS: array[1..100] of string;
строковый массив — будущий массив из слов предложения). Добавляя каждую букву к элементу arrayS[k].String 11. Ввести имя, отчество и фамилию. Преобразовать их к формату «фамилия-инициалы».
Пример: Введите имя, фамилию и отчество: Иван Алибабаевич Попов Результат: Попов И.А.
Примечание:
Использовать функции: Pos, Copy, Delete
String 12. Программа должна позволять ввести текст, и потом удалять в нем все восклицательные знаки, расположенные непосредственно перед запятой, и выводить измененный текст на экран.
Пример:
Входной текст: Алгоритм — это правила выполнения определенных действий!, предписание исполнителю! совершить последовательность действий!, набор команд для компьютера! Выходной текст: Алгоритм — это правила выполнения определенных действий, предписание исполнителю! совершить последовательность действий, набор команд для компьютера!
Трудность низкая:
Программа должна формировать в памяти вторую строковую переменную с измененным текстом, а потом выводить ее на экран.
Трудность высокая:
Программа должна преобразовывать исходную строку без использования дополнительных переменных, и затем выводить ее на экран.
А теперь рассмотрим олимпиадное задание по Паскалю:
Задача Цезарь: Шифр Цезаря заключается в том, что каждая буква исходной строки заменяется третьей после нее буквой в алфавите, который считается написанным по кругу (все символы текста латинские и прописные).
* Решить ту же задачу, в которой сдвиг будет не на 3 позиции, а на k
, причем отрицательное значение является признаком сдвига влево, положительное — вправо.
Показать решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
var a:char; i,n:byte; s,s1:string; begin s1:=''; readln(s); for i:=1 to length(s) do begin n:=ord(...); n:=n+3; if n=123 then n:=97; {в ASCII 120 - x, 97 - a} if ...; {в ASCII 121 - y, 98 - b} if ...; {в ASCII 122 - z, 99 - c} a:=chr(...); s1:=...; end; writeln(s1) end. |
Стандартные методы и запросы (pascalAbc.net)
CountOf
— количество вхождений'мама мыла раму'.CountOf('м').Print; // 4
Contains
— содержит ли (логическая)'мама мыла раму'.Contains('б').Print; // False
IndexOf
— индекс искомого вхождения'hello world'.IndexOf('w').Print; // 6
Remove
— удаление вхождения'hello world'.Remove(' ').Print; // helloworld
Replace
— замена вхождений символа на другой символ'hello world'.Replace('l','L').Print; // heLLo worLd
и другие…
Запросы LINQ со строками
* LINQ (Language Integrated Query) — язык интегрированных запросов
Where
— Фильтрация массива (последовательности) с условиемvar sArr:=Arr('aab','bcd','efg'); sArr.Where(w->w.Contains('b')).Print; // aab bcd sArr.Where(w->w.CountOf('a')=2).Print; // aab
Задания: Предыдущие задания выполнить с использованием стандартных методов и запросов фильтрации.
Посимвольный ввод до пробела
Посимвольный ввод удобен для «мгновенной» обработки символов в строке.
Пример: посимвольно считывать фамилию
Решение:
var name: array[1..n] of string; c:char; ...
Для организации массива символьных строк:
Пример: посимвольно считывать фамилии и заносить их в массив фамилий
Решение:
String 13. Программа должна позволять ввести предложение до точки (.
). Необходимо в введенном тексте вместо всех букв «ё» ставить буквы «е». Выполнить, работая со строкой посимвольно: программа должна формировать в памяти вторую строковую переменную с измененным предложением, а потом выводить ее на экран.
Пример:
Входной текст: Алгоритм — это правила выполнения определённых действий. Выходной текст: Алгоритм — это правила выполнения определенных действий.
String 14. с клавиатуры вводится число N, обозначающее количество студентов в группе, а затем – N строк, в каждой из которых – информация о студенте в формате:
<Фамилия> <год рождения> <оценка>
- Все данные разделяются одним пробелом. Нужно подсчитать, сколько студентов получили отметку 5.
- Вывести фамилии студентов, у которых оценка 2.
- Вывести фамилии студентов, родившихся в 1996 году.
Потренируйтесь в решении задач по теме, щелкнув по пиктограмме:
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.
Как найти в определенном предложении всё слова, где присутствуют цифры.
То есть в итоге вывести количество таких слов.
Делал вот так но что то не работает
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
Бывалый
Группа: Пользователи
Сообщений: 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, спасибо за совет