Процедура Str
Процедура Str в Паскале преобразует число или перечисление в строку. Синтаксис:
procedure Str(var X : TNumericType; var S : string);
Процедура Str возвращает строку, представляющую значение X , которое может быть любым числовым или перечисляемым типом. Фактическое объявление процедуры Str не соответствует синтаксису Паскаль и должно быть
procedure Str(var X : TNumericType [:NumPlaces [:Decimals]]; var S : String);
где необязательные спецификаторы NumPlaces и Decimals управляют форматированием строки:
- NumPlaces задаёт общую ширину строки
- Decimals задаёт количество десятичных знаков после символа десятичного разделителя
Процедуру Str также можно использовать для преобразования значения перечисляемого типа в строковое представление объявленного перечисления. Это означает, что будет работать следующее:
type TMyEnum = (One); var s : string; begin Str(One, s); Writeln(s); end.
Эта программа выведет на экран слово One . То же самое сделает и следующая программа:
type TMyEnum = (One); var s : string; E : TMyEnum; begin E := One; Str(E, s); Writeln(s); end.
Преобразование числа может быть выполнено, например, так:
Str(150, s); Writeln(s);
Если вы хотите преобразовать вещественное число и задать определённое количество знаков после запятой, то это можно сделать так:
Str(Pi:0:4, s); Writeln(s);
Примеры вывода показаны на рисунке:
Если хотите, можете с помощью процедуры Str создать собственную функцию преобразования вещественных чисел в строку с заданным количеством знаков после запятой. Функция может быть, например, такой:
//**************************************************************** // Функция преобразует вещественное число в строку // с указанным количеством знаков после запятой // ВХОД: х - число; n - количество знаков после запятой // ВЫХОД: строковое представление числа //**************************************************************** function MyFloatToStr(x : single; n : byte) : string; var st : string; begin Str(x:0:n, st); Result := st; end;
Здесь с помощью спецификатора Decimals мы задаём количество знаков после запятой. В программе функцию можно использовать так:
Writeln(MyFloatToStr(Pi*2, 3));
При этом на экран будет выведена строка 6.283
Спецификатор NumPlaces тоже может пригодиться, например, при выводе таблиц. С его помощью мы можем задать одинаковую ширину строки, и на экране вывод будет занимать всегда одинаковое заданное количество знакомест, независимо от того, сколько цифр у нас в числе. Пример:
for i := 1 to 16 do begin Str(i:3, s); if ((i mod 4) = 0) then WriteLn(s) else Write(s); end;
На экран будет выведена такая ровная таблица:
Символы и строки в PascalABC.NET
Символы имеют тип char, занимают 2 байта и хранятся в кодировке Unicode (UTF-16).
var c1: char; var c2 := 'z';
Для преобразования символа c в код используется функция Ord(c) , для обратного преобразования кода i в символ используется функция Chr(i) .
begin var c := 'ю'; Print(Ord(c)); // 1102 Print(Chr(1102)); // ю end.
Классический способ определить символ, следующий за данным в кодовой таблице, — это преобразовать символ в код, прибавить к коду число и потом преобразовать полученный код снова в символ:
Chr(Ord(c)+1)
Аналогично определяется предыдущий символ
Методы типа char
Методы, встроенные в тип char, делятся на две категории:
- проверяющие, принадлежит ли символ указанной категории: c.IsDigit , c.IsLetter , c.IsLower , c.IsUpper
- преобразующие символ: c.ToUpper , c.ToLower , c.ToDigit .
Отметим также, что c.IsLower возвращает True только если это буква в нижнем регистре — для не букв возвращается False .
Строки
Введение
Отметим, что для строк имеется много операций и методов, не все из которых мы рекомендуем для школьников.
Основная причина — многие методы строк в .NET считают, что строки индексируются с нуля, а в Паскале строки индексируются с 1.
Для устранения этой дилеммы при работе со школьниками мы не используем методы строк, которые работают с индексами, индексируемыми с нуля. Для них существуют эквивалентные замены внешними функциями, которые предполагают, что строки индексируются с 1.
Индексация строк
Строки в Паскале индексируются с 1. К символам строк можно обращаться по индексам — s[i] .
begin var s: string; s := 'тор'; Print(s[1],s[2],s[3]); end.
Символы строк можно менять:
begin var s := 'пир'; s[1] := 'м'; Print(s); // мир end.
Можно использовать индексацию с конца: s[^i] обозначает i-тый символ с конца
begin var s := 'мир'; s[^1] := 'г'; Print(s); // миг end.
Циклы по строкам
begin var s := 'привет'; for var i:=1 to s.Length do s[i] := Chr(Ord(s[i])+1); Print(s); end.
foreach var c in s do Print(c);
Операции +, *n и in
Строки можно складывать и умножать на целое положительное число
Пример. Генерация строки ‘abcdefghijklmnopqrstuvwxyz’
Идея. Начать с пустой строки. Всякий раз в цикле добавлять к строке символы от ‘a’ до ‘z’
begin var s := ''; for var c := 'a' to 'z' do s += c; end.
Методы Count, CountOf, Where
Чтобы посчитать количество символов в строке, удовлетворяющих определённому условию, используется метод Count. Если нужно посчитать, сколько раз встречается определенный символ, используется более простой метод CountOf
begin var s := 'абракадабра'; s.CountOf('а').Print; s := 'а123бр45а67к89адабра'; s.Count(c -> c.IsDigit).Print; end.
Если в строке надо отфильтровать только определенные символы, используется метод Where. Он возвращает последовательность символов, которую можно назад преобразовать к строке, используя метод JoinToString:
begin var s := 'а123бр45а67к89адабра'; s := s.Where(c -> c.IsLetter).JoinToString; end.
s.ToWords и разбиение строки на слова
Метод s.ToWords разбивает строку на массив слов, используя пробел в качестве разделителя. Полученный массив можно преобразовать и слить в строку, используя метод JoinToString:
begin var s := 'как однажды жак звонарь головой сломал фонарь'; var a := s.ToWords; Sort(a); s := a.JoinToString end.
По умолчанию JoinToString разделяет слова пробелами
Функция Pos и процедуры Delete, Insert
Pos(subs,s) возвращает позицию первого вхождения подстроки subs в сторке s или 0 если подстрока не найдена
Pos(subs,s,from) начинает искать подстроку в строке с позиции from .
Следующий код выводит позиции всех вхождений s1 в s:
begin var s := 'абракадабра'; var s1 := 'бра'; var p := Pos(s1,s); while p>0 do begin Print(p); p := Pos(s1,s,p+s1.Length); end; end.
©2023 PascalABCNET Team. All rights reserved.
Page last updated: 19.12.2020
Site last generated: Jul 31, 2023
Процедуры STR и VAL.
В строковую переменную можно записывать не только буквы, но и цифры. Однако это будут не числа, как таковые, а их символьное представление. Для преобразования символьных представлений числа в само число, и наоборот, используются процедуры STR и VAl.
Например, возьмем 2 числа: 125 и 347. Если эти числа записаны в строковых переменных, то с ними можно производить те действия, которые производятся над строками. Например, в результате операции сцепления 125+347 получится 125347. Если же данные числа будут записаны в переменных типа Integer или Real, то над ними можно производить операции, предусмотренные для чисел (сложение, вычитание умножение, деление, DIV, MOD и т.д.). Например, в результате операции сложения 125+347 получится 472.
В языке программирования Pascal предусмотрена возможность преобразования чисел в их символьное представление и наоборот.
Процедура STR преобразует число целого или вещественного типов в его строковое представление. Процедура имеет 2 параметра: STR (X, ST), где «X» — это число, а ST – его строковое представление. Также, можно указывать формат преобразования: STR(X:A:B, ST), где «A» задает ширину всего поля, которое выделяется для строкового представления числа, а «B» — количество символов в дробной части (последний параметр имеет значение в том случае, если преобразуется вещественное число). Процедура STR делает с числом то же, что и оператор Writeln перед тем как вывести число на экран (преобразует число в символ).
Процедура VAL преобразует строковое представление числа в само число, которое можно записать в целочисленную или вещественную переменную. Процедура имеет 3 параметра: VAL (ST, X, CODE), где ST – строка, которую необходимо преобразовать в число, X – вещественная или символьная переменная, в которую записывается это число, CODE – необязательный параметр, который, в случае ошибки будет содержать номер позиции, в которой обнаружен ошибочный символ.
Использование процедуры STR.
program string7; uses crt; var stroka,stroka1,stroka2:string; x,y,z:integer; begin clrscr; x:=1234; y:=5678; z:=x+y; writeln(z); str(x,stroka1); str(y,stroka2); stroka:=stroka1+stroka2; writeln(stroka); readln end.
Строка №3. Создаем 3 строковые переменные.
Строка №4. Создаем 3 целочисленные переменные.
Строка №7. В 1-ую переменную типа Integer записываем число 1234.
Строка №8. Во 2-ую переменную типа Integer записываем число 5678.
Строка №9. Складываем эти числа, результат записываем в 3-ю переменную.
Строка №10. Выводим результат на экран.
Строка№11. Переводим 1-ое число в его строковое представление, результат сохраняем в переменной «stroka1».
Строка №12. Переводим 2-ое число в его строковое представление результат сохраняем в переменной «stroka2».
Строка №13. Производим над строками операцию сцепления и записываем результат в переменную «stroka».
Строка №14. Выводим результат на экран.
О процедуре STR также можно прочитать в разделе, посвященному графике в Pascal.
Использование процедуры VAL.
Напишем программу, в которой строковой переменной будет присвоено значение, определяющее дату, например, 23.02.1965. Пусть эта дата обозначает год вашего рождения. Программа, должна подсчитать, сколько вам лет на текущий момент. Текущим моментом будем считать 2012 год.
program string8; uses crt; var stroka1,stroka2:string; rog, let:integer; begin clrscr; stroka1:='23.02.1965'; stroka2:=copy(stroka1,7,4); val(stroka2,rog); let:=2012-rog; writeln(let); readln end.
Строка №7. В переменную «stroka1» записываем дату рождения.
Строка №8. В переменную «stroka2» копируем из переменной «stroka1» последние 4 символа, 1965.
Строка №9. Преобразовываем эти 4 символа в число и записываем это число в целочисленную переменную «rog».
Строка №10. В целочисленную переменную «let» записываем значение, которое получится при вычитании из числа 2012 числа 1965.
Строка №11. Выводим значение переменной «let» на экран.
Pascal: Занятие № 11. Строковый тип данных в Паскаль
Функция возвращает порядковый номер символа параметра в таблице ASCII:
ORD(c: char): byte;
Пример: Распечатайте часть таблицы 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:='Банка';
s[1]='Б' s[2]='а' s[3]='н' s[4]='к' s[5]='а'
Важно: Значения строковых переменных всегда заключаются в одинарные кавычки
Функции работы со строками в Pascal
s1:='Мото'; s2:='роллер'
s3:=s1+s2;
s5:='Мотороллер';
k:=Pos('рол',s5);
s3:='Мотороллер';
l:=Length(s3);
s3:='астроном';
s4:=Copy(s3,3,4);
s5:='Коробочка';
Delete(s5,4,2);
s6:='Рука'; s7:='баш';
Insert(s7,s6,3);
x:=2.73284;
Str(x:4:2,s8);
s8='2.73';
Val(s8,x,Osh);
Пример: Подсчитать кол-во букв «f» в тексте.
Показать решение:
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
String 1. Дан текст. Удалить в нём все слова кот. Выполнить задание двумя способами: используя стандартные функции работы со строками, и, работая со строкой как с массивом символов.
введите строку мой кот - хороший кот Результат: мой - хороший
* Задание повышенной сложности: запросить у пользователя ввести подстроку, которую требуется удалить из исходной строки.
String 2. Составить программу проверки, есть ли в тексте буква s. Выдавать true (если найдено) или false (если не найдено).
Примеры использования логического типа (true и false) смотрите здесь.
Введите строку: Hello world Результат: false
Введите строку: Hello students Результат: true
String 3. Имеется строка текста. Требуется написать программу, которая зашифровывала бы ее в другую строку — заменяя каждый символ текста символом, следующим по порядку в таблице ASCII. Тогда слово КОТ превратится в слово ЛПУ. Требуется составить и программу дешифровки.
Использовать функции для работы с символами: chr и ord pascal.
String 4. Дано предложение, определить количество слов в нём.
Подсказка: считать количество слов по количеству пробелов в строке.
* усложненный вариант: предусмотреть, что в начале или в конце введенной строки введен пробел
Пример: Найти количество цифр в строке.
Показать решение:
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($'цифр = '); end.
begin var s := readString; var k := 0; foreach var c in s do if char.IsDigit(c) then k += 1; Print($’цифр = ‘); end.
Пример: Определить является ли данное слово перевертышем (палиндромом).
Показать решение:
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слово следующееСлово иСледСлово Слово с максимальным количеством букв: следующееСлово
Алгоритм:
String 10. Дано предложение. Расположить слова в нем в порядке возрастания числа букв в словах. В качестве подсказки можете использовать предложенный ниже алгоритм:
Алгоритм:
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; if . ; if . ; 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; if . ; if . ; a:=chr(. ); s1:=. ; end; writeln(s1) end.
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(s[i]); n:=n+3; if n=123 then n:=97; if n=124 then n:=98; if n=125 then n:=99; a:=chr(n); s1:=s1+a; 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(s[i]); n:=n+3; if n=123 then n:=97; if n=124 then n:=98; if n=125 then n:=99; a:=chr(n); s1:=s1+a; end; writeln(s1) end.
Стандартные методы и запросы (pascalAbc.net)
'мама мыла раму'.CountOf('м').Print; // 4
‘мама мыла раму’.CountOf(‘м’).Print; // 4
'мама мыла раму'.Contains('б').Print; // False
‘мама мыла раму’.Contains(‘б’).Print; // False
'hello world'.IndexOf('w').Print; // 6
‘hello world’.IndexOf(‘w’).Print; // 6
'hello world'.Remove(' ').Print; // helloworld
‘hello world’.Remove(‘ ‘).Print; // helloworld
'hello world'.Replace('l','L').Print; // heLLo worLd
‘hello world’.Replace(‘l’,’L’).Print; // heLLo worLd
Запросы LINQ со строками
* LINQ (Language Integrated Query) — язык интегрированных запросов
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 году.
Потренируйтесь в решении задач по теме, щелкнув по пиктограмме: