ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 21.04.2025
Просмотров: 1362
Скачиваний: 0
СОДЕРЖАНИЕ
Министерство образования и науки российской федерации
Начальный курс программирования на основе алгоритмического языка Паскаль
Часть. Основы программирования на Паскале
1.1. Структура простейшей Паскаль-программы
1.2. Данные и операции над ними
1.2.1. Свойства ячейки памяти. Переменные и константы
1.2.3. Правила записи констант
1.2.4. Описание переменных и именованных констант в Паскале
1.3. Операторы преобразования данных
1.4. Разработка простейших программ
1.4.1. Понятие о качестве программы и основные технологические принципы разработки программ
1.4.2. Алгоритм и способы его записи.
1.4.3. Изображение алгоритмов в виде блок-схем
1.4.4. Базовые структуры алгоритмов и их кодирование на Паскале
1.4.5. Примеры разработки программ
1.5.1. Понятие массива. Основные правила работы с массивами в Паскале
1.5.2. Примеры программ с массивами
1.614. Структура паскаль-программы
2.1. Общие сведения о подпрограммах
2.4. Глобальные и локальные имена
2.5. Использование подпрограммы в качестве параметра другой подпрограммы
2.6.4. Модули как средство программирования
Часть. Обработка символьной информации и документов сложной структуры
3.1. Обработка символьной информации
3.1.3. Подпрограммы, работающие со строками
Часть IV. Работа с динамическими массивами
Приложение 1. Краткая инструкция по работе в среде Turbo (Borland) Pascal.
Режимы компиляции программы, использующей модули
{ObjectPascal: вместо предыдущего оператораSetLength(s,n-1)}
n:=n-1;
End;
Until i>n;
WriteLn(' Измененная стpока'); Writeln(s);
End.
Объектный Паскаль, как более мощный алгоритмический язык, по сравнению с Турбо Паскалем имеет расширенный набор строковых типов. Данные типа string (эквивалентное названиеAnsiString)могут содержать до 231 символов типаchar. ТипShortString эквивалентен типу string Турбо Паскаля. ТипWideStringсоответствует строкам максимальной длины до 230 символов типа widechar. Объектный Паскаль с целью увеличения надежности программ не разрешает менять нулевой байт строки и предлагает для изменения длины строки применять процедуруSetLength(строка,новая_длина_строки) – см. комментарии примера 2.
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).
3.2. Тип запись
Пока мы рассматривали одну сложную структуру (сложный тип) - массив; одним из основных свойств массива является однотипность его компонент. Многие информационно-логические задачи связаны с обработкой документов, содержащих в себе информация разного типа (числовую, символьную и т. д.) Примеры таких документов: платежные ведомости (фамилии и имена - символьная информация, денежные суммы - числовая), карточки больных в поликлинике, библиотечная информация. Как обрабатывать такие данные с помощью строковых типов, показано в §3.1.3; при этом приходится выделять подстроки и переводить некоторые из них в число. Для упрощения программирования алгоритмов обработки такой информации необходимо иметь сложный тип, объединяющий разнотипные компоненты. Таким типом в Паскале является запись.
Запись- это переменная, состоящая из фиксированного числа компонент, вообще говоря, разного типа, причем каждая компонента имеет свое имя. Компоненты записи также называютсяполями записи. Сравним два типа - массив и запись. Компоненты массива имеют одинаковый тип; компоненты записи могут иметь разный тип (хотя могут быть и однотипны). Для обращения к элементу массива надо указать его номер (индекс), при обращении к полю записи указывается его имя.
Описание типа запись:
TYPE имя_типа= RECORD
список_1_имен_полей:тип_1;
список_2_имен_полей:тип_2;
. . .
список_N_имен_полей:тип_N;
END;
Например:
TYPE COMPLEX=RECORD{значения переменныx этого типа - комплексные числа}
Re,Im:REAL {действительная и мнимая части}
END;
DATE = RECORD {для описания дат (число, месяц, год)}
Day : 1..31; {число}
Month = (January, February, March, April, May, June, July, August, September, October, November, December); {месяц}
Year : Integer; {год}
END;
BOOK = RECORD {для описания книг в каталоге библиотеки}
Author,Title,Publisher:String;
{автор, название, издательство}
Year,Volume,Pages:Integer;
{год издания,том,количество страниц}
END;
Память, занимаемая записью, равна сумме объемов памяти полей (если исключить из рассмотрения особенности, связанные с выравниванием). В любом случае для определения размера памяти записи можно использовать функцию sizeof(переменная_или_тип).
Для обращения к полю записинадо указать имя записи, а затем, через точку, имя поля. Например: