Слайд 1Программирование
на языке Паскаль
Символы и
символьные строки
Слайд 2Строковый тип данных определяет совокупность символов произвольной длины.
Для определения строкового типа
используется зарезервированное слово String с указанием максимальной длины строки.
Слайд 3Описание строк
В разделе var строки описываются следующим образом:
var : string[]
Максимальная длина строки - 255 символов. Нумеруются ее
компоненты начиная с 0, но этот нулевой байт хранит длину строки.
Если <длина> не указана, то считается, что в строке 255 символов. Поэтому для экономии памяти следует по возможности точно указывать длину используемых строк.
Слайд 4Примеры описаний:
var s1: string[10]; (*строка длиной 10 символов*)
s2:
string; (*строка длиной 255 символов*)
Необходимо отметить, что один символ и строка длиной в один символ
var c: char;
s: string[1];
совершенно не эквивалентны друг другу. Вне зависимости от своей реальной длины, строка относится к конструируемым структурированным типам данных, а не к базовым порядковым
Слайд 5Символ-константа и строка-константа
Неименованные константы
В тексте программы на языке Pascal последовательность любых символов,
заключенная в апострофы, воспринимается как символ или строка. Например:
c:='z'; {c: char} s:='abc'; {s: string}
Константе автоматически присваивается "минимальный" тип данных, достаточный для ее представления:
char или string[k]. Поэтому попытка написать
c:='zzz'; {c: char}
вызовет ошибку уже на этапе компиляции.
Слайд 6Пустая строка задается двумя последовательными апострофами:
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, задается в разделе const следующим образом:
const
c4: char = ''''; {это один символ - апостроф!}
s4: string[20] = 'This is a string';
Слайд 10Действия с символами
Операции
Результатом унарной операции
#
является символ, номер которого в таблице ASCII соответствует заданному
числу. Например,
#100 = 'd‘
#39 = '''' {апостроф}
#232 = 'ш’
#1000 = 'ш' {потому что (1000 mod 256)= 232}
Кроме того, к символьным переменным, как и к значениям всех порядковых типов данных, применимы операции сравнения <, <>, >, =, результат которых также опирается на номера символов из таблицы ASCII.
Слайд 11Стандартные функции
Функция 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(), определенные для значений любого порядкового
типа, применимы также и к символам (значениям порядкового типа данных 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;
Это массив символов:
каждый символ
– отдельный объект;
массив имеет длину N, которая задана при объявлении
Что нужно:
обрабатывать последовательность символов как единое целое
строка должна иметь переменную длину
Слайд 14Символьные строки
длина строки
рабочая часть
s[1]
s[2]
s[3]
s[4]
var s: string;
var s: string[20];
Длина строки:
n := length
Слайд 15Строки можно рассматривать как одномерный массив символов, но в отличии от
массива длина строк может меняться. Элемент строки можно извлечь так же, как элемент массива.
Слайд 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. Сравнение строк
( <, <=, >, >=, =, <> )
Сравнение строк происходит посимвольно. Строки равны, если имеют одинаковую длину и посимвольно эквивалентны.
(программа «Строка 4»)
Слайд 19
Задания
"4": Ввести символьную строку и заменить все буквы "а" на буквы
"б" и наоборот, как заглавные, так и строчные.
Пример:
Введите строку:
ааббссААББСС
Результат:
ббаассББААСС
"5": Ввести символьную строку и проверить, является ли она палиндромом (палиндром читается одинаково в обоих направлениях).
Пример: Пример:
Введите строку: Введите строку:
АБВГДЕ КАЗАК
Результат: Результат:
Не палиндром. Палиндром.
Слайд 20Функции и процедуры для работы со строками
1. Функция concat(s1,_,sN:string):string осуществляет слияние ( конкатенацию )
всех перечисленных строк или символов в указанном порядке. Если длина итоговой строки больше 255-ти символов, то произойдет отсечение "хвоста". Кроме того, даже если результат конкатенациине был усечен, но программа пытается сохранить его в переменную заведомо меньшей длины, то усечение все равно состоится:
concat('abc','3de',' ','X','yz') = 'abc3de Xyz'
Слайд 21Функции и процедуры для работы со строками
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) удаляет из строки 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) вставляет подстроку 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 возвращает длину строки 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) превращает десятичное число 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 := '123456789';
Delete ( s,
3, 6 );
с 3-его символа
6 штук
строка
меняется!
'123456789'
'129'
s := '123456789';
Insert ( 'ABC', s, 3 );
Insert ( 'Q', s, 5 );
куда вставляем
что вставляем
начиная с 3-его символа
'12ABC3456789'
'12ABQC3456789'
Слайд 28Поиск в строке
Поиск в строке:
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 );
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
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": Ввести имя файла (возможно, без расширения) и изменить его расширение
на ".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
Рекурсия: Решения задачи для слов из К букв сводится к
4-м задачам для слов из K-1 букв.
1
K
1
K
1
K
перебрать все варианты
перебрать все варианты
перебрать все варианты
перебрать все варианты
Слайд 36Процедура
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;
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
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 пробелов
глобальные переменные
Слайд 39
Задания
Алфавит языка племени "тумба-юмба" состоит из букв Ы, Ц, Щ и
О. Число K вводится с клавиатуры.
"4": Вывести на экран все слова из К букв, в которых буква Ы встречается более 1 раза, и подсчитать их количество.
"5": Вывести на экран все слова из К букв, в которых есть одинаковые буквы, стоящие рядом (например, ЫЩЩО), и подсчитать их количество.