На занятии будет рассмотрен Строковый тип данных в Паскаль и примеры работы с ним
Символьный тип 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. |
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 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); // Ю |
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'); |
#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.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 принадлежит английским буквам |
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); |
//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. |
var a:string;
begin
a:='Привет всем!';
writeln(a);
end.
Ввод значения строковой переменной с клавиатуры:
1
2
3
4
5
6
| var a:string;
begin
writeln('Введите слово');
readln(a);
writeln('Вы ввели слово ',a);
end. |
var a:string;
begin
writeln('Введите слово');
readln(a);
writeln('Вы ввели слово ',a);
end.
Строка «рассматривается» компилятором, как массив букв:
для компилятора:
s[1]='Б' s[2]='а' s[3]='н' s[4]='к' s[5]='а' |
s[1]='Б' s[2]='а' s[3]='н' s[4]='к' s[5]='а'
Важно: Значения строковых переменных всегда заключаются в одинарные кавычки
Функции работы со строками в Pascal
Исходные данные |
Операция |
Результат |
|
|
s3=’Мотороллер’ |
|
|
k=5 |
|
|
l=10 |
|
|
s4= ‘трон’ |
|
|
s5=’Корочка’ |
|
|
s6=’Рубашка’ |
|
|
s8=’2.73′ |
|
|
x=2.73 |
Пример: Подсчитать кол-во букв «f» в тексте.
Показать решение:
Паскаль |
PascalAbc.NET |
1
2
3
4
5
6
7
8
9
10
11
| var s:string[30];
n,i:integer;
begin
writeln('введите текст');
readln(s);
n:=0;
for i:=1 to length(s) do
if s[i]='f' then
n:=n+1;
write('в тексте букв f = ',n)
end. |
var s:string[30];
n,i:integer;
begin
writeln('введите текст');
readln(s);
n:=0;
for i:=1 to length(s) do
if s[i]='f' then
n:=n+1;
write('в тексте букв f = ',n)
end.
|
1
2
3
4
5
6
7
8
| begin
var s := readString('введите текст');
var n := 0;
foreach var c in s do
if c = 'f' then
inc(n);
Print(n);
end. |
begin
var s := readString('введите текст');
var n := 0;
foreach var c in s do
if c = 'f' then
inc(n);
Print(n);
end.
|
Операции со строками:
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 |
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 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| const
m = ['0'..'9'];
var
s: string;
i, k: byte;
begin
read(s);
k := 0;
for i := 1 to length(s) do
if s[i] in m then inc(k);
writeln('цифр = ', k);
readln;
end. |
const
m = ['0'..'9'];
var
s: string;
i, k: byte;
begin
read(s);
k := 0;
for i := 1 to length(s) do
if s[i] in m then inc(k);
writeln('цифр = ', k);
readln;
end.
|
1
2
3
4
5
6
7
8
| begin
var s := readString;
var k := 0;
foreach var c in s do
if char.IsDigit(c) then
k += 1;
Print($'цифр = {k}');
end. |
begin
var s := readString;
var k := 0;
foreach var c in s do
if char.IsDigit(c) then
k += 1;
Print($'цифр = {k}');
end.
|
Пример: Определить является ли данное слово перевертышем (палиндромом).
Показать решение:
Паскаль |
PascalAbc.NET |
1
2
3
4
5
6
7
8
9
10
11
12
13
| var a,b,c:string;
i:longint;
begin
write('введите слово:');
readln(a);
b:='';
for i:=1 to length(a) do
b:=a[i]+b;
if a=b then
write('перевертыш')
else
write('не перевертыш');
end. |
var a,b,c:string;
i:longint;
begin
write('введите слово:');
readln(a);
b:='';
for i:=1 to length(a) do
b:=a[i]+b;
if a=b then
write('перевертыш')
else
write('не перевертыш');
end.
|
1
2
3
4
5
6
7
8
9
10
| // с помощью среза
begin
var s := readString;
var n := s.Length;
var s1 := s[::-1];
if s = s1 then
print('перевертыш')
else
print('не перевертыш');
end. |
// с помощью среза
begin
var s := readString;
var n := s.Length;
var s1 := s[::-1];
if s = s1 then
print('перевертыш')
else
print('не перевертыш');
end.
|
String 5. Составить программу подсчета
количества встречаемых в тексте сочетаний букв «
ма».
String 6. Определить, встречается ли в тексте сочетание букв «
ку».
Пример выполнения:
Введите строку:
Кума
Результат: да
Введите строку:
Дед
Результат: нет
String 7. Заменить данную букву в слове другой буквой (буквы вводит пользователь).
Пример выполнения:
Введите строку:
Барабулька
Введите букву, которую заменить:
а
Введите букву, на которую заменить:
у
Результат: Бурубульку
String 8. Дано предложение, определить количество слов, начинающихся с буквы «к».
String 9. Дано предложение, состоящее из букв и цифр. Определить слово с наибольшим количеством букв (не цифр). В качестве подсказки можете использовать предложенный ниже алгоритм:
Пример выполнения:
Введите строку:
1234567891011слово следующееСлово иСледСлово
Слово с максимальным количеством букв:
следующееСлово
Алгоритм:
После того как строка считывается (вводится), измеряется ее длина (функция length).
Далее стока просматривается посимвольно в цикле while или for
.
Если символ строки входит в множество букв (const letters=['a'..'z'];
), то этот символ прибавляется к первому элементу массива слов строки (... array [1..100] of string
).
Если символ равен пробелу, то увеличиваем счетчик для массива слов и переходим к следующей итерации цикла.
String 10. Дано предложение. Расположить слова в нем в порядке возрастания числа букв в словах. В качестве подсказки можете использовать предложенный ниже алгоритм:
Алгоритм:
В цикле до конца длины строки выполняем: если текущий символ строки — не пробел, то формируем элемент массива arrayS (arrayS: array[1..100] of string;
строковый массив — будущий массив из слов предложения). Добавляя каждую букву к элементу arrayS[k].
При достижении пробела переходим к следующему элементу arrayS[k] и начинаем формировать следующее слово.
После того, как массив из всех слов arrayS сформирован: выполняем сортировку массива по длине букв в словах.
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. |
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 |
'мама мыла раму'.CountOf('м').Print; // 4
Contains
— содержит ли (логическая)
'мама мыла раму'.Contains('б').Print; // False |
'мама мыла раму'.Contains('б').Print; // False
IndexOf
— индекс искомого вхождения
'hello world'.IndexOf('w').Print; // 6 |
'hello world'.IndexOf('w').Print; // 6
Remove
— удаление вхождения
'hello world'.Remove(' ').Print; // helloworld |
'hello world'.Remove(' ').Print; // helloworld
Replace
— замена вхождений символа на другой символ
'hello world'.Replace('l','L').Print; // heLLo worLd |
'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 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 году.
Потренируйтесь в решении задач по теме, щелкнув по пиктограмме:
Даны натуральные числа n и m и строки длиной 2n и m. Получите новую, третью строку, элементы которой получены путем добавления символов второй строки в центр первой.