Программирование на языке Паскаль. Символы и символьные строки

Содержание

Слайд 2

Строковый тип данных определяет совокупность символов произвольной длины. Для определения строкового

Строковый тип данных определяет совокупность символов произвольной длины. Для определения строкового типа

используется зарезервированное слово String с указанием максимальной длины строки.
Слайд 3

Описание строк В разделе var строки описываются следующим образом: var :

Описание строк

В разделе var строки описываются следующим образом:
var <имя_строки>: string[<длина>]
Максимальная длина строки - 255 символов. Нумеруются ее

компоненты начиная с 0, но этот нулевой байт хранит длину строки.
Если <длина> не указана, то считается, что в строке 255 символов. Поэтому для экономии памяти следует по возможности точно указывать длину используемых строк.
Слайд 4

Примеры описаний: var s1: string[10]; (*строка длиной 10 символов*) s2: string;

Примеры описаний:
var s1: string[10]; (*строка длиной 10 символов*)
s2: string; (*строка

длиной 255 символов*)
Необходимо отметить, что один символ и строка длиной в один символ
var c: char;
s: string[1];
совершенно не эквивалентны друг другу. Вне зависимости от своей реальной длины, строка относится к конструируемым структурированным типам данных, а не к базовым порядковым
Слайд 5

Символ-константа и строка-константа Неименованные константы В тексте программы на языке Pascal

Символ-константа и строка-константа

Неименованные константы
В тексте программы на языке Pascal последовательность любых символов,

заключенная в апострофы, воспринимается как символ или строка. Например:
c:='z'; {c: char} s:='abc'; {s: string}
Константе автоматически присваивается "минимальный" тип данных, достаточный для ее представления:
 char или string[k]. Поэтому попытка написать
c:='zzz'; {c: char}
вызовет ошибку уже на этапе компиляции.
Слайд 6

Пустая строка задается двумя последовательными апострофами: st:= ''; Если же необходимо

Пустая строка задается двумя последовательными апострофами:
st:= '';
Если же необходимо сделать так, чтобы среди символов строки содержался и

сам апостроф, его нужно удвоить:
s:='Don''t worry about the apostrophe!';
Если теперь вывести на экран эту строку, то получится следующее:
Don't worry about the apostrophe!
Слайд 7

Нетипизированные константы Все правила задания символов и строк как неименованных констант

Нетипизированные константы

Все правила задания символов и строк как неименованных констант остаются

в силе и при задании именованных нетипизированных констант в специальном разделе const. Например:
const c3 = ''''; {это один символ - апостроф!}
s3 = 'This is a string';
Слайд 8

Типизированные константы Типизированная константа, которая будет иметь тип char или string,

Типизированные константы

Типизированная константа, которая будет иметь тип char или string, задается в разделе const следующим образом:
const

c4: char = ''''; {это один символ - апостроф!}
s4: string[20] = 'This is a string';
Слайд 9

Программа «Строка 1»

Программа «Строка 1»

Слайд 10

Действия с символами Операции Результатом унарной операции # является символ, номер

Действия с символами

Операции
Результатом унарной операции
#<положительная_неименованная_константа_целого_типа>
является символ, номер которого в таблице ASCII соответствует заданному

числу. Например,
#100 = 'd‘
#39 = '''' {апостроф}
#232 = 'ш’
#1000 = 'ш' {потому что (1000 mod 256)= 232}
Кроме того, к символьным переменным, как и к значениям всех порядковых типов данных, применимы операции сравнения <, <>, >, =, результат которых также опирается на номера символов из таблицы ASCII.
Слайд 11

Стандартные функции Функция chr(k:byte):char "превращает"; номер символа в символ. Действие этой

Стандартные функции

Функция chr(k:byte):char "превращает"; номер символа в символ. Действие этой функции аналогично действию операции #. Например:
c:= chr(48);

{c: char} {c = '0'}
Обратной к функции chr() является функция ord(). Таким образом, для любого числа k и для любого символа с:
ord(chr(k)) = k и chr(ord(c)) = c
Слайд 12

Стандартные процедуры и функции pred(), succ(), inc() и dec(), определенные для

Стандартные процедуры и функции  pred(), succ(), inc() и dec(), определенные для значений любого порядкового типа,

применимы также и к символам (значениям порядкового типа данных char ). Например:
pred('[') = 'Z’
succ('z') = '{‘
inc('a') = 'b’
inc('c',2) = 'e’
dec('z') = 'y’
dec(#0,4) = '№' {#252}
Слайд 13

Чем плох массив символов? var B: array[1..N] of char; Это массив

Чем плох массив символов?

var B: array[1..N] of char;

Это массив символов:

каждый символ

– отдельный объект;
массив имеет длину N, которая задана при объявлении

Что нужно:
обрабатывать последовательность символов как единое целое
строка должна иметь переменную длину

Слайд 14

Символьные строки длина строки рабочая часть s[1] s[2] s[3] s[4] var

Символьные строки

длина строки

рабочая часть

s[1]

s[2]

s[3]

s[4]

var s: string;

var s: string[20];

Длина строки:

n := length

( s );

var n: integer;

Слайд 15

Строки можно рассматривать как одномерный массив символов, но в отличии от

Строки можно рассматривать как одномерный массив символов, но в отличии от

массива длина строк может меняться. Элемент строки можно извлечь так же, как элемент массива.
Слайд 16

Программа «Строка 2»

Программа «Строка 2»

Слайд 17

Символьные строки Задача: ввести строку с клавиатуры и заменить все буквы

Символьные строки

Задача: ввести строку с клавиатуры и заменить все буквы "а"

на буквы "б".

program qq;
var s: string;
i: integer;
begin
writeln('Введите строку');
readln(s);
for i:=1 to Length(s) do
if s[i] = 'а' then s[i] := 'б';
writeln(s);
end.

readln(s);

writeln(s);

Length(s)

ввод строки

длина строки

вывод строки

Слайд 18

Операции над строками 1. Сцепление строк (конкатенация). (программа «Строка 3») 2.

Операции над строками

1. Сцепление строк (конкатенация).
(программа «Строка 3»)
2. Сравнение строк

( <, <=, >, >=, =, <> )
Сравнение строк происходит посимвольно. Строки равны, если имеют одинаковую длину и посимвольно эквивалентны.
(программа «Строка 4»)
Слайд 19

Задания "4": Ввести символьную строку и заменить все буквы "а" на

Задания

"4": Ввести символьную строку и заменить все буквы "а" на буквы

"б" и наоборот, как заглавные, так и строчные.
Пример:
Введите строку:
ааббссААББСС
Результат:
ббаассББААСС
"5": Ввести символьную строку и проверить, является ли она палиндромом (палиндром читается одинаково в обоих направлениях).
Пример: Пример:
Введите строку: Введите строку:
АБВГДЕ КАЗАК
Результат: Результат:
Не палиндром. Палиндром.
Слайд 20

Функции и процедуры для работы со строками 1. Функция concat(s1,_,sN:string):string осуществляет

Функции и процедуры для работы со строками

1. Функция concat(s1,_,sN:string):string  осуществляет слияние ( конкатенацию )

всех перечисленных строк или символов в указанном порядке. Если длина итоговой строки больше 255-ти символов, то произойдет отсечение "хвоста". Кроме того, даже если результат конкатенациине был усечен, но программа пытается сохранить его в переменную заведомо меньшей длины, то усечение все равно состоится:
concat('abc','3de',' ','X','yz') = 'abc3de Xyz'
Слайд 21

Функции и процедуры для работы со строками 2. Функция copy(s:string;i,k:byte):string вычленяет

Функции и процедуры для работы со строками

2. Функция copy(s:string;i,k:byte):string
вычленяет из строки s подстроку длиной k символов, начиная

с i -го. Если i больше длины строки, то результатом будет пустая строка. Если же k больше, чем длина оставшейся части строки, то результатом будет только ее "хвост":
copy('abc3de Xyz',2,4) = 'bc3d'
copy('abc3de Xyz',12,4) = ''
copy('abc3de Xyz',8,14) = 'Xyz'
Слайд 22

Функции и процедуры для работы со строками 3. Процедура delete(s:string;i,k:byte) удаляет

Функции и процедуры для работы со строками

3. Процедура delete(s:string;i,k:byte) удаляет из строки s подстроку длиной k символов, начиная

с i -го. Если i больше длины строки, то ничего удалено не будет. Если же k больше, чем длина оставшейся части строки, то удален будет только ее "хвост":
{s = 'abc3de Xyz'} {s = 'abc3de Xyz'}
delete(s,2,3); delete(s,8,13);
{s = 'ade Xyz'} {s = 'abc3de '}
Слайд 23

Функции и процедуры для работы со строками 4. Процедура insert(ss,s:string;i:byte) вставляет

Функции и процедуры для работы со строками

4. Процедура insert(ss,s:string;i:byte) вставляет подстроку ss в строку s, начиная с i -го символа.

Если i выходит за конец строки, то подстрока ss припишется в конец строки s (если результат длиннее, чем допускается для строки s, произойдет его усечение):
{s = 'abc3de Xyz'} {s = 'abc3de'}
insert('xyz',s,2); insert('xyz',s,12);
{s = 'axyzbc3de Xyz'} {s = 'abc3dexyz'}
Слайд 24

Функции и процедуры для работы со строками 5. Функция length(s:string):byte возвращает

Функции и процедуры для работы со строками

5. Функция length(s:string):byte возвращает длину строки s:
length('abc3de Xyz') =

10
6. Функция pos(ss,s:string):byte определяет позицию, с которой начинается первое (считая слева направо) вхождение подстроки ss в строку s. Если ss не встречается в s ни разу, функция вернет 0:
pos('X', 'abc3de Xyz') = 8
Слайд 25

Функции и процедуры для работы со строками 7. Процедура str(x[:w[:d]],s:string) превращает

Функции и процедуры для работы со строками

7. Процедура str(x[:w[:d]],s:string) превращает десятичное число x (можно указать,

что в этом числе w цифр, из них d дробных) в строку s. Если число короче указанных величин, то спереди и/или сзади оно будет дополнено пробелами:
str(156.4:7:2,s); {s = ' 156.4 '}
8. Процедура val(s:string;i:<арифметический_тип>;err:byte)
 превращает строку s в десятичное число i (в случае ошибки в переменную err будет записан номер первого недопустимого символа ):
{s = '15.47'} val(s,x,err); {x = 15.47}
Слайд 26

Операции со строками Объединение: добавить одну строку в конец другой. Запись

Операции со строками

Объединение: добавить одну строку в конец другой.

Запись нового значения:

var

s, s1, s2: string;

s := 'Вася';

s1 := 'Привет,';
s2 := 'Вася';
s := s1 + ', ' + s2 + '!';

'Привет, Вася!'

Подстрока: выделить часть строки в другую строку.

s := '123456789';
s1 := Copy ( s, 3, 6 );
s2 := Copy ( s1, 2, 3 );

'345678'

'456'

с 3-его символа

6 штук

Слайд 27

Удаление и вставка Удаление части строки: Вставка в строку: s :=

Удаление и вставка

Удаление части строки:

Вставка в строку:

s := '123456789';
Delete ( s,

3, 6 );

с 3-его символа

6 штук

строка
меняется!

'123456789'

'129'

s := '123456789';
Insert ( 'ABC', s, 3 );
Insert ( 'Q', s, 5 );

куда вставляем

что вставляем

начиная с 3-его символа

'12ABC3456789'

'12ABQC3456789'

Слайд 28

Поиск в строке Поиск в строке: s := 'Здесь был Вася.';

Поиск в строке

Поиск в строке:

s := 'Здесь был Вася.';
n := Pos

( 'е', s );
if n > 0 then
writeln('Буква е – это s[', n, ']')
else writeln('Не нашли');
n := Pos ( 'Вася', s );
s1 := Copy ( s, n, 4 );

var n: integer;

s[3]

3

n = 11

Особенности:
функция возвращает номер символа, с которого начинается образец в строке
если слова нет, возвращается 0
поиск с начала (находится первое слово)

Слайд 29

Примеры s := 'Вася Петя Митя'; n := Pos ( 'Петя',

Примеры

s := 'Вася Петя Митя';
n := Pos ( 'Петя', s );
Delete

( s, n, 4 );
Insert ( 'Лена', s, n );

'Вася Лена Митя'

s := 'Вася Петя Митя';
n := length ( s );
s1 := Copy ( s, 1, 4 );
s2 := Copy ( s, 11, 4 );
s3 := Copy ( s, 6, 4 );
s := s3 + s1 + s2;
n := length ( s );

'Вася Митя'

14

'Вася'

'Митя'

'Петя'

'ПетяВасяМитя'

12

6

Слайд 30

Пример решения задачи Задача: Ввести имя, отчество и фамилию. Преобразовать их

Пример решения задачи

Задача: Ввести имя, отчество и фамилию. Преобразовать их к

формату "фамилия-инициалы".
Пример:
Введите имя, фамилию и отчество:
Василий Алибабаевич Хрюндиков
Результат:
Хрюндиков В.А.

Алгоритм:
найти первый пробел и выделить имя
удалить имя с пробелом из основной строки
найти первый пробел и выделить отчество
удалить отчество с пробелом из основной строки
"сцепить" фамилию, первые буквы имени и фамилии, точки, пробелы…

Слайд 31

Программа program qq; var s, name, otch: string; n: integer; begin

Программа

program qq;
var s, name, otch: string;
n: integer;
begin
writeln('Введите имя, отчество

и фамилию');
readln(s);
n := Pos(' ', s);
name := Copy(s, 1, n-1); { вырезать имя }
Delete(s, 1, n);
n := Pos(' ', s);
otch := Copy(s, 1, n-1); { вырезать отчество }
Delete(s, 1, n); { осталась фамилия }
s := s + ' ' + name[1] + '.' + otch[1] + '.';
writeln(s);
end.
Слайд 32

Задания "4": Ввести имя файла (возможно, без расширения) и изменить его

Задания

"4": Ввести имя файла (возможно, без расширения) и изменить его расширение

на ".exe".
Пример:
Введите имя файла: Введите имя файла:
qqq qqq.com
Результат: Результат:
qqq.exe qqq.exe
"5": Ввести путь к файлу и "разобрать" его, выводя каждую вложенную папку с новой строки
Пример:
Введите путь к файлу:
C:\Мои документы\10-Б\Вася\qq.exe
Результат:
C:
Мои документы
10-Б
Вася
qq.exe
Слайд 33

Программирование на языке Паскаль Рекурсивный перебор

Программирование на языке Паскаль

Рекурсивный перебор

Слайд 34

Рекурсивный перебор Задача: Алфавит языка племени "тумба-юмба" состоит из букв Ы,

Рекурсивный перебор

Задача: Алфавит языка племени "тумба-юмба" состоит из букв Ы, Ц,

Щ и О. Вывести на экран все слова из К букв, которые можно составить в этом языке, и подсчитать их количество. Число K вводится с клавиатуры.

1

K

в каждой ячейке может быть любая из 4-х букв

4 варианта

4 варианта

4 варианта

4 варианта

Количество вариантов:

Слайд 35

Рекурсивный перебор 1 K Рекурсия: Решения задачи для слов из К

Рекурсивный перебор

1

K

Рекурсия: Решения задачи для слов из К букв сводится к

4-м задачам для слов из K-1 букв.

1

K

1

K

1

K

перебрать все варианты

перебрать все варианты

перебрать все варианты

перебрать все варианты

Слайд 36

Процедура procedure Rec(p: integer); begin if p > K then begin

Процедура

procedure Rec(p: integer);
begin
if p > K then begin
writeln(s);
count

:= count+1;
end
else begin
s[p]:='Ы'; Rec ( p+1 );
s[p]:='Ц'; Rec ( p+1 );
s[p]:='Щ'; Rec ( p+1 );
s[p]:='О'; Rec ( p+1 );
end;
end;

1

K

p

Глобальные переменные:
var s: string;
count, K: integer;

s

p+1

рекурсивные вызовы

окончание рекурсии

Слайд 37

Процедура procedure Rec(p: integer); const letters = 'ЫЦЩО'; var i: integer;

Процедура

procedure Rec(p: integer);
const letters = 'ЫЦЩО';
var i: integer;

begin
if p > k then begin
writeln(s);
count := count+1;
end
else begin
for i:=1 to length(letters) do begin
s[p] := letters[i];
Rec(p+1);
end;
end;
end;

const letters = 'ЫЦЩО';

for i:=1 to length(letters) do begin
s[p] := letters[i];
Rec(p+1);
end;

все буквы

цикл по всем буквам

локальная переменная

Слайд 38

Программа program qq; var s: string; K, i, count: integer; begin

Программа

program qq;
var s: string;
K, i, count: integer;
begin
writeln('Введите длину слов:');

read ( K );
s := '';
for i:=1 to K do s := s + ' ';
count := 0;
Rec ( 1 );
writeln('Всего ', count, ' слов');
end.

procedure Rec(p: integer);
...
end;

процедура

s := '';
for i:=1 to K do s := s + ' ';

строка из K пробелов

глобальные переменные