![](/user_photo/2706_HbeT2.jpg)
- •Министерство образования и науки российской федерации
- •Начальный курс программирования на основе алгоритмического языка Паскаль
- •Введение
- •Часть. Основы программирования на Паскале
- •1.1. Структура простейшей Паскаль-программы
- •1.2. Данные и операции над ними
- •1.2.1. Свойства ячейки памяти. Переменные и константы
- •1.2.2. Типы данных
- •1.2.3. Правила записи констант
- •1.2.4. Описание переменных и именованных констант в Паскале
- •1.2.5. Выражения
- •1.3. Операторы преобразования данных
- •1.3.1. Оператор присваивания
- •1.3.2. Понятие ввода и вывода
- •1.3.3. Оператор вывода
- •1.3.4. Оператор ввода
- •1.4. Разработка простейших программ
- •1.4.1. Понятие о качестве программы и основные технологические принципы разработки программ
- •1.4.2. Алгоритм и способы его записи.
- •1.4.3. Изображение алгоритмов в виде блок-схем
- •1.4.4. Базовые структуры алгоритмов и их кодирование на Паскале
- •1. Следование
- •2. Ветвление (развилка)
- •If условие then
- •If условие then
- •3. Цикл
- •1.4.5. Примеры разработки программ
- •1.5. Массивы
- •1.5.1. Понятие массива. Основные правила работы с массивами в Паскале
- •1.5.2. Примеры программ с массивами
- •1.614. Структура паскаль-программы
- •Часть.Подпрограммы
- •2.1. Общие сведения о подпрограммах
- •2.2. Процедуры в Паскале
- •2.2.1.Описание процедур
- •2.2.2. Обращение к процедуре
- •2.3. Функции Паскаля
- •2.3.1. Описание функций
- •2.3.2. Обращение к функции
- •2.4. Глобальные и локальные имена
- •2.5. Использование подпрограммы в качестве параметра другой подпрограммы
- •2.6. Модули
- •2.6.1. Общие сведения
- •2.6.2. Структура модуля
- •2.6.3. Использование модулей
- •2.6.4. Модули как средство программирования
- •Часть. Обработка символьной информации и документов сложной структуры
- •3.1. Обработка символьной информации
- •3.1.1. Символьный тип
- •3.1.2.Строковые типы
- •3.1.3. Подпрограммы, работающие со строками
- •Функции
- •Процедуры
- •3.2. Тип запись
- •3.3. Файлы
- •3.3.1. Общие понятия
- •3.3.2. Файлы в Турбо Паскале
- •3.3.3. Текстовые файлы
- •Пример 1
- •Пример 2
- •3.3.4. Типизированные файлы
- •3.3.5. Нетипизированные файлы
- •Часть IV. Работа с динамическими массивами
- •О статическом и динамическом распределении памяти
- •Указатели в Паскале
- •Динамические массивы
- •Формальные параметры-массивы без указания границ
- •Приложение 1. Краткая инструкция по работе в среде Turbo (Borland) Pascal.
- •Режимы компиляции программы, использующей модули
- •Приложение 2. Краткая инструкция по работе в режиме консольного приложения средыDelphi. Создание консольного приложения
- •Сохранение консольного приложения.
- •Отладка программы
- •Контрольные вопросы
- •Заключение
- •Библиографические ссылки
- •Содержание
- •Часть IV. Работа с динамическими массивами 98
3.1.3. Подпрограммы, работающие со строками
Рассмотрим лишь некоторые подпрограммы. Они имеются во всех рассматриваемых версиях Паскаля.
Функции
CONCAT(S1 ,S2,...,SN)-функция типаSTRING; возвращает строку, представляющую собой сцепление (конкатенацию) строк-параметровS1,S2,...,SN. Конкатенацию строк можно также получить с помощью операции +.
COPY(ST,INDEX,COUNT)-функция типаSTRING; копирует из строкиST COUNTсимволов, начиная с символа с номеромINDEX.
LENGTH(ST)-функция типаINTEGER; возвращает длину строкиST.
POS(SUBST,ST)-функция типаINTEGER; отыскивает в строке ST первое вхождение подстрокиSUBSTи возвращает номер позиции, с которой она начинается; если подстрока не найдена, возвращает нуль.
Процедуры
DELETE(ST,INDEX,COUNT)-удалениеCOUNTсимволов из строкиST, начиная с символа с номеромINDEX.
INSERT(SUBST, ST, INDEX)- вставка подстрокиSUBST в строкуST, начиная с символа с номеромINDEX.
STR(X[:WIDTH[:DECIMALS]],ST)-преобразование значения типа REALилиINTEGERв строку символовSTтак, как это делает процедураWRITELNперед выводом; параметрыWIDTHиDECIMALS, если они присутствуют, задают формат преобразования (WIDTH- длину числа,DECIMALS- длину дробной части; параметрDECIMALимеет смысл указывать только для вещественных чисел).
VAL(ST, X, CODE)- преобразование строкиSTво внутреннее представление целого или вещественного числаХ; параметрCODEсодержит нуль, если преобразование прошло успешно, в противном случае он содержит номер символа в строкеST, где обнаружен ошибочный символ; пробелы перед числом в строкеSTдолжны отсутствовать.
Одной из практически важных задач, решаемых с помощью строковых типов, является задача обработки данных сложной структуры. Эти данные часто собраны в таблицу. Строка таблицы соотвествует некоторому объекту исследования: товару, человеку, предприятию. Строка, несмотря на то, что состоит из символов, содержит смысловые данные разного типа; например, наименование товара имеет символьный тип, его стоимость – вещественный, и т. д.
Для обработки такой строки необходимо выделить ее смысловые поля-подстроки (с помощью функции COPY), перевести некоторые поля из символьного представления в числовое (с помощью процедурыVAL). Затем, возможно, потребуется проанализировать символьные поля с помощью функцииPOSи подготовить строку выходных данных с помощьюSTR иCONCAT.
Ниже рассматривается пример такой задачи.
Пример. Сведения об игрушках представлены в виде таблицы:
N |
название игpушки |
миним. возраст |
максим. возраст |
цена (руб.) |
1 |
Конструктор "Юность-3" |
4 |
10 |
70 |
2 |
LEGO (конструктор) |
3 |
7 |
200 |
3 |
Кукла |
2 |
5 |
50 |
… |
|
… |
|
|
2 с. |
29 символов |
8 симв. |
8 симв. |
8 симв. |
Последняя строка таблицы не относится к исходным данным, в ней задается ширина столбцов в символах без учета разделителей между столбцами.
Определить самый дорогой конструктор для детей в возрасте до семи лет и его стоимость.
Program Primer3_1_3;
VAR N:Integer;{число строк таблицы}
TABL:String[60];{строка таблицы–содержимое столбцов +5 разделителей}
nu:String[2]; {подстрока-номер игрушки}
name:String[29]; {подстрока-название игрушки}
MinAge,MaxAge,Rub:String[8]; {подстроки: мин. и макс. возраст,цена}
max:Real; {максимальная стоимость конструктора}
MaxAR,RubR:Real;{макс.возраст и стоимость в веществен. представлении}
namemax:String[29];{название конструктора с максимальной ценой}
i {счетчик игрушек},
C {номер ошибочного символа при преобразовании строки в число} :Integer;
BEGIN
Writeln(' Введите число наименований игpушек');
ReadLn(N);
max:=0;
Writeln('Вводите сведения об игpушках в виде таблицы');
Writeln(
'┌─┬─────────────┬─────┬─────┬────┐');
Writeln(
'|N | название игpушки | миним. | макс. | стои- |');
Writeln(
'| | | возpаст |возpаст |мость |’);
Writeln(
'├─┼─────────────┼─────┼─────┼────┤');
For i:=1 to N Do
BEGIN
Readln(TABL);
name:=Copy(TABL,5,29); {выделение подстрок названия}
MaxAge:=Copy(TABL,44,8); {и максимального возраста}
Val(MaxAge,MaxAR,C); {преобразование строка - число }
If C<>0 Then
Writeln(' ошибка в',C,'-й позиции MaxAge')
Else
Begin
If ((Pos('констpуктоp',name)>0) or {входит ли в название}
(Pos('Констpуктоp',name)>0)) and {слово "конструктор"}
(MaxAR<=7) Then
Begin
Rub:=Copy(Tabl,53,8); {выделение подстроки цены}
Val(Rub,RubR,C); {преобразование строка-число}
If C<>0 Then
Writeln(' ошибка в',C,'-й позиции Rub')
Else
Begin
If RubR>max Then {определение текущего значения}
BEGIN {максимальной цены}
max:=RubR;
namemax:=name{запомнили конмтруктор с макс. ценой}
END;
End
End
End
END;
If max=0 Then
WriteLn(' Констpуктоpов для детей до семи лет нет')
Else
BEGIN
WriteLn('Cамый доpогой констpуктоp для детей до семи лет');
STR(max:6:2,Rub);{перевод max в строку}
WriteLn(CONCAT(namemax, ' стоит ',Rub, ‘ рублей’);
END;
END.
При обработке таблиц большого объема эта программа имеет, по крайней мере, два недостатка:
количество строк таблицы задается вводом (но ручной подсчет количества строк таблицы – это достаточно большой труд);
ввод данных происходит с экрана, хотя, конечно, лучше хранить данные в файле на внешнем носителе и осуществлять ввод из файла.
Эти недостатки можно устранить, используя тип файл (см. §3.3).