- •Основы программирования на языке Паскаль
- •Часть 1. Основы языка Паскаль 2
- •Часть 2. Элементы профессионального программирования на Паскале 44
- •От автора
- •Часть 1. Основы языка Паскаль
- •1. Алгоритм и программа
- •1.1. Алгоритм
- •1.2. Свойства алгоритма
- •1.3. Формы записи алгоритма
- •1.4. Программа и программное обеспечение
- •1.5. Этапы разработки программы
- •2. Данные в языке Паскаль
- •2.1 Константы
- •2.2 Переменные и типы переменных
- •3. Арифметические выражения
- •4. Линейный вычислительный процесс
- •4.1 Оператор присваивания
- •4.2 Оператор ввода
- •4.3 Оператор вывода
- •4.4 Управление выводом данных
- •4.5 Вывод на печать
- •5. Структура простой программы на Паскале
- •6. Компилятор и оболочка Turbo Pascal
- •7. Разветвляющийся вычислительный процесс и условный оператор
- •7.4. Короткий условный оператор
- •If логическое_выражение then оператор1;
- •7.5. Полный условный оператор
- •If логическое_выражение then оператор1
- •7.7. Вложенные условные операторы
- •7.9. Примеры программ с условным оператором
- •8. Директивы компилятора и обработка ошибок ввода
- •9. Оператор цикла. Циклы с предусловием и постусловием
- •10. Цикл со счетчиком и досрочное завершение циклов
- •11. Типовые алгоритмы табулирования функций, вычисления количества, суммы и произведения
- •11.1 Алгоритм табулирования
- •11.2 Алгоритм организации счетчика
- •11.3 Алгоритмы накопления суммы и произведения
- •12. Типовые алгоритмы поиска максимума и минимума
- •13. Решение учебных задач на циклы
- •14. Одномерные массивы. Описание, ввод, вывод и обработка массивов на Паскале
- •15. Решение типовых задач на массивы
- •Часть 2. Элементы профессионального программирования на Паскале
- •16. Кратные циклы
- •16.1 Двойной цикл и типовые задачи на двойной цикл
- •16.2 Оператор безусловного перехода
- •17. Матрицы и типовые алгоритмы обработки матриц
- •18. Подпрограммы
- •18.1 Процедуры
- •18.2 Функции
- •18.3 Массивы в качестве параметров подпрограммы
- •18.4 Открытые массивы
- •19. Множества и перечислимые типы
- •20. Обработка символьных и строковых данных
- •20.1. Работа с символами
- •20.2 Работа со строками
- •21. Текстовые файлы
- •21.1 Общие операции
- •21.2 Примеры работы с файлами
- •21.3 Работа с параметрами командной строки
- •22. Записи. Бинарные файлы
- •23. Модули. Создание модулей
- •23.1. Назначение и структура модулей
- •23.2. Стандартные модули Паскаля
- •24. Модуль crt и создание простых интерфейсов
- •25. Модуль Graph и создание графики на Паскале
- •Приложение 1. Таблицы ascii-кодов символов для операционных систем dos и Windows
- •Приложение 2. Основные директивы компилятора Паскаля
- •Приложение 3. Основные сообщения об ошибках Паскаля
- •Приложение 4. Дополнительные листинги программ
- •Приложение 5. Расширенные коды клавиатуры
- •Ascii‑коды
- •Расширенные коды
- •Приложение 6. Правила хорошего кода
- •Приложение 7. Рекомендуемая литература
20. Обработка символьных и строковых данных
Компьютер способен обрабатывать не только числовые данные. Задачи обработки символьных данных распространены не менее, а возможно и более, чем чисто арифметические расчеты. В этой главе мы изучим работу с символами и строками средствами Паскаля.
20.1. Работа с символами
Для работы с отдельными символами описываются переменные типа char:
Var ch:char;
{ . . . }
Ch:='Y';
Одна переменная типа char хранит информацию об одном коде ASCII-символа. Это можно использовать, например, для отслеживания действий пользователя по нажатию клавиш. Приведем пример одного из вариантов такой программы:
var ch:char;
begin
repeat
writeln;
write ('Продолжить? (Y/N)');
readln (ch);
if (ch='Y') or (ch='y') then begin
{Здесь программируется нужный вычислительный процесс}
end
else if (ch='N') or (ch='n') then halt {Завершение программы}
else writeln ('Нажмите Y или N, затем Enter!');
until false;
end.
Для работы с кодами символов существуют 2 основных функции:
Function Ord(X) : Char; - возвращает ASCII-код символа X
Function Chr(X : Byte) : Char; - возвращает символ с указанным ASCII-кодом X
Используем последнюю функцию для того, чтобы узнать, как вообще выглядит таблица символов:
var i,j:integer;
begin
Writeln;
Write ('ASCII-коды [32..255]');
for i:=2 to 15 do begin
writeln;
write (i*16:3,' ');
for j:=0 to 16 do write (Chr(i*16+j), ' ');
end;
Writeln;
Write ('ENTER для выхода...');
readln;
end.
Здесь печатаются только символы с кодами от 32 до 255 включительно, т.к. первые 32 символа с кодами от 0 до 31 – непечатаемые (такие, как табуляция или перевод строки).
Для определения того, попадает ли код символа в некоторый диапазон значений, удобно использовать оператор in, как это делает следующий фрагмент программы:
write ('Введите символ: '); readln (ch);
if ch in ['A'..'Z'] then write ('Большая латинская;')
else if ch in ['a'..'z'] then write ('Малая латинская;')
else if (ch in ['А'..'Я']) then write ('Большая русская;')
else if (ch in ['а'..'п']) or (ch in ['р'..'я']) then
write ('Малая русская;')
else if ch in ['0'..'9'] then write ('Цифра;')
else write ('Это не алфавитно-цифровой символ;');
write (' Код Вашего символа= ',Ord(ch));
Работая с алфавитными символами, приходится отдельно учитывать ввод строчных и прописных букв. Удобнее сначала преобразовать все символы к прописным с помощью функции Upcase:
var ch:char; i:integer;
begin
repeat
for i:=1 to random(72) do write ('*');
writeln;
write ('Продолжить? (Y/N)');
readln (ch);
until upcase(ch)='N';
end.
К сожалению, эта функция бесполезна при работе с символами русского и других национальных алфавитов, для ее замены напишем и протестируем собственную подпрограмму c названием upcase_ru:
procedure upcase_ru (var s:string);
var i,l,c:integer;
begin
l:=length(s);
for i:=1 to l do begin
c:=Ord(s[i]);
if (c>=Ord('а')) and (c<=Ord('п')) then c:=c-32
else if (c>=Ord('р')) and (c<=Ord('я')) then c:=c-80;
s[i]:=Upcase(Chr(c));
end;
end;
var s:string;
begin
writeln ('Введите строку текста:');
readln (s);
upcase_ru (s);
writeln ('Преобразованная строка:');
writeln (s);
end.
Программа учитывает, что в кодировке DOS не все символы кириллицы закодированы идущими подряд числами (см. Приложение 1).
Кроме того, в программе уже применяется массив символов, которому в Паскале соответствует тип данных String. Мы упоминали этот тип данных, но еще не работали с ним. Сделаем это в следующем разделе.