- •Лабораторная работа № 1 рациональные числа
- •Теоретические сведения
- •Синтаксис объявления класса tRational
- •Программа работы
- •Исходные данные
- •Контрольные вопросы
- •Лабораторная работа № 2 комплексные числа
- •Теоретические сведения
- •Синтаксис объявления класса tComplex
- •Программа работы
- •Исходные данные
- •Контрольные вопросы
- •Лабораторная работа № 3 векторы
- •Теоретические сведения
- •Синтаксис объявления класса tVector
- •Программа работы
- •Контрольные вопросы
- •Лабораторная работа № 4 матрицы
- •Теоретические сведения
- •Арифметические операции с матрицами
- •Синтаксис объявления класса tMatrix
- •Основные свойства и методы компонента StringGrid
- •Программа работы
- •Исходные данные
- •Исходные данные
- •Контрольные вопросы
- •Лабораторная работа № 5 строки
- •Теоретические сведения
- •Программа работы
- •Исходные данные
- •Контрольные вопросы
- •Лабораторная работа № 6 стек
- •Теоретические сведения
- •Синтаксис объявления класса tStack
- •Программа работы
- •Контрольные вопросы
- •Лабораторная работа № 7 очередь
- •Теоретические сведения
- •Синтаксис объявления класса tQueue
- •Программа работы
- •Контрольные вопросы
- •Лабораторная работа № 8 деревья
- •Теоретические сведения
- •Синтаксис объявления класса tTreeNode
- •Синтаксис объявления класса tTree
- •Программа работы
- •Контрольные вопросы
- •Библиографический список
- •Содержание
Исходные данные
№ Варианта |
Система уравнений |
№ Варианта |
Система уравнений |
1 |
|
11 |
|
2 |
|
12 |
|
3 |
|
13 |
|
4 |
|
14 |
|
5 |
|
15 |
|
6 |
|
16 |
|
7 |
|
17 |
|
8 |
|
18 |
|
9 |
|
19 |
|
10 |
|
20 |
|
Контрольные вопросы
Записать ADT – формат класса TMatrix.
Записать объявление класса TMatrix.
Записать конструкторы класса TMatrix и объяснить их назначение.
Записать реализацию оператора сложения с присвоением класса TMatrix и объяснить его работу.
Записать реализацию оператора вычитания с присвоением класса TMatrix и объяснить его работу.
Записать реализацию оператора умножения матрицы на число с присвоением и объяснить его работу.
Записать реализацию оператора умножения матрицы с присвоением и объяснить его работу.
Записать реализацию оператора сложения матриц и объяснить его работу.
Записать реализацию оператора вычитания матриц и объяснить его работу.
Записать реализацию оператора умножения матрицы на число и объяснить его работу.
Записать реализацию оператора умножения матриц и объяснить его работу.
Записать реализацию метода транспонирования матрицы и объяснить его работу.
Записать реализацию метода нахождения определителя матрицы и объяснить его работу.
Записать и протестировать в программе метод нахождения минора соответствующего элемента матрицы.
Записать и протестировать в программе метод нахождения алгебраического дополнения соответствующего элемента матрицы.
Записать и протестировать в программе оператор унарного минуса.
Записать и протестировать в программе оператор префиксного инкремента.
Записать и протестировать в программе оператор префиксного декремента.
Записать и протестировать в программе оператор постфиксного инкремента.
Записать и протестировать в программе оператор постфиксного декремента.
Записать и протестировать в программе оператор присвоения.
Записать и протестировать в программе оператор равно.
Записать и протестировать в программе оператор не равно.
Записать и протестировать в программе оператор умножения действительного числа на матрицу.
Записать и протестировать в программе метод возведения матрицы в целую степень.
Записать и протестировать в программе метод проверки, не является ли матрица единичной.
Записать и протестировать в программе метод проверки, не является ли матрица диагональной.
Записать и протестировать в программе метод проверки, не является ли матрица нулевой.
Лабораторная работа № 5 строки
Цель работы: изучить типы данных для работы с символьной информацией в средеDelphi, разработать методы для выполнения основных действий со строками и получить практический навык их использования.
Теоретические сведения
Строка(String) – это структура данных, представленная в виде списка элементов и предназначенная для хранения символьной информации.
Символьные данные включают в себя: прописные и строчные буквы, цифры, знаки пунктуации и специальные символы.
Для представления этих элементов в электронном виде используют различные виды кодировок, одним из которых является стандарт ASCII(American Standard Code for Information Interchange). В нем каждому символу ставится в соответствие восьмибитовое число (1 байт), позволяющее задать 256 символов (28). Младшие 128 символов (0 ¸127) являются стандартными дляASCIIкода, а старшие (128 ¸255) используются для поддержки национального языка в стандартеANSI(American NationalStandardof Information). Значения последних зависят от установленного на данный момент в операционной системе набора символов (кодовой страницы). Для русской раскладки клавиатуры – номер кодовой страницы 866.
ANSIстандарт не является единственно возможным. В последнее время широкое распространение получилUniCodeстандарт. В нем каждому символу ставится в соответствие двух байтное число, что позволяет поддерживать до 65536 символов (216). Первые 128UniCodeсимволов соответствуют стандартуASCII, а остальные используются для расширенного кодирования различных национальных языков.
Для преобразования 'Символ – Код' и, наоборот, в языкеObjectPascalпредусмотрены две функцииOrdиChr.
Функция Ordвозвращает значение кода, который соответствует символу, аChr– значение символа, которое соответствует его коду.
Ord('A') = 65; Chr(65) = 'A'; Ord(Chr(65)) = 65; Chr(Ord('A')) = 'A'.
В языке ObjectPascalпредопределены несколько типов данных для хранения символьной информации (таблица №1).
Таблица №1
Символьные типы данных
Тип |
Размер в байтах |
Назначение |
ANSIChar |
1 |
Хранение одного ANSI символа |
WideChar |
2 |
Хранение одного UniCodeсимвола |
Char |
1 |
Сейчас эквивалентен ANSIChar |
ANSI или UniCode символы объединяются в последовательности, которые называются строками. Самый простой способ организации строки – это массивы.
var
S:array[0..255]ofChar;
S:array[0..255]ofWideChar;
Однако в языке ObjectPascalпредусмотрены более гибкие структуры для работы со строками.Таблица №2
Строковые типы данных
Тип |
Максимальная длина |
Требования к памяти |
Назначение |
ShortString |
255 |
от 2 до 256 |
Обратная совместимость |
AnsiString |
~231 |
от 4 до 2 Гб |
Хранение ANSI символов |
WideString |
~230 |
от 4 до 2 Гб |
Хранение UniCodeсимволов |
String |
255 или ~231 |
от 2 до 256 или от 4 до 2 Гб |
AnsiString или ShortString |
Короткая строка(ShortString) представляет собой последовательностьANSIсимволов, первый байт которой отведен для хранения текущей длины строки – количества символов в ней.
Рис. 1. Структура строки ShortString
Несмотря на то, что длина строки может изменяться динамически (от 1 до 255), память под этот тип данных выделяется один раз во время компиляции программы. По умолчанию отводится 256 байт (1 байт для хранения длины строки и 255 – для символов). При необходимости можно ограничить длину строки, указав при объявлении новое значение в квадратных скобках.
var
S1:ShortString; // память отводится для 255 элементов
S2:ShortString[50];// память отводится для 50 элементов
Для нахождения текущей длины строки S= 'ShortString' можно использовать библиотечную функциюLengthили непосредственно обратиться к нулевому байту:Length(S) = 10 или S[0] =10.
Чтобы изменить текущую длину строки необходимо воспользоваться библиотечной функцией SetLengthили записать новое значение (не больше 255) в нулевой байт: SetLength(S, 20) или S[0] = 20.
В настоящее время короткие строки практически не применяются, а тип ShortStringоставлен в средеDelphiдля совместимости с ранними версиями языкаPascal.
Длинная строка(AnsiString) представляет собой последовательностьANSIсимволов, последний байт которой предназначен для хранения символа конца строки (#0).
Переменная с типом AnsiStringпо своей структуре является указателем, т.е. занимает в памяти только 4 байта. В ней храниться адрес первой ячейки памяти, начиная с которой располагаются сами данные.
Рис. 2. Структура строки AnsiString
Память под переменную с этим типом выделяется автоматически, в зависимости от текущего числа символов в строке. Если AnsiString строка не содержит ни одного элемента, то указатель равен нулю (nil) и на его хранение требуется только 4 байта памяти. Если число символов в строке больше 0, то компилятор автоматически выделяет под них память, размещает в ней новые данные и добавляет в конец нулевой символ (#0). После этого указателю присваивается адрес первой ячейки памяти, начиная с которой были размещены сами символы.
Так как переменная с типом AnsiStringявляется указателем, то на одну и туже ячейку памяти могут ссылаться несколько переменных. При этом память под сами символы не выделяется, а происходит только увеличение на единицу счетчика ссылок на них. При изменении исходных данных счетчик ссылок уменьшается на единицу, а в памяти создается новаяAnsiStringстрока. Когда счетчик ссылок уменьшится до нуля, символы из памяти будут удалены автоматически. Этот механизм получил названиеcopy-on-writeи позволяет существенно повысить эффективность использованияAnsiStringстрок.
Широкая строка(WideString)представляет собой последовательностьUniCodeсимволов, заканчивающуюся символом конца строки (#0).
Рис. 3. Структура строки WideString
Как и строка AnsiString, переменная с типомWideStringявляется указателем, но в отличие от длинных строк в ней хранятсяUniCodeсимволы, которые занимают в памяти не один, а два байта (рис. 3). Кроме этого, широкие строки не поддерживают механизмСopy-On-Write, что делает их применение менее эффективным по сравнению сAnsiStringстроками. Однако они необходимы для поддержки COMтехнологии в серверах и интерфейсах.
Тип Stringявляется родовым как для строкAnsiString, так и для строкShortString. Его значение зависит от директивы компилятора$H. Если она включена{$H+}, то типStringинтерпретируется какAnsiString, если же она выключена{$H-}, то – какShortString. В средеDelphiэта директива включена по умолчанию, т.е. типStringэквивалентен типуAnsiString.
Изменить значение StringнаShortStringможно и без директивы$H, указав непосредственно длину строки в квадратных скобках.
var
S1: String; // Строка AnsiString
S2: String[50]; // Строка ShortString
Строка PCharпредставляет собой указатель на массивANSIсимволов с нулевым символом конца строки (#0).
Этот вид строк является одной из самых простых структур данных, и используется для поддержки функций Windows APIи языкаС++.
В отличие от строк AnsiStringиндексация символов начинается не с единицы, а с нуля. Кроме этого, типPCharне имеет счетчика ссылок и длины строки (рис. 4).
Рис. 4. Структура строки PChar
Память под этот тип данных выделяется автоматически только при присвоении строковых констант. Во всех остальных случаях её необходимо выделять с помощью специальной функции SetLength.
Для того чтобы узнать текущую длину строки необходимо воспользоваться библиотечной функцией Length:
Length(S) = 6.
Тип PCharсовместим по присваиванию со строкамиAnsiString, но для обратной совместимости необходимо использовать явное преобразование типов.
var
S1: String;
S2: PChar = ‘Указатель’;
begin
S1 := S2; // совместимы по присваиванию
S2 :=PChar(S1); // явное преобразование типов
end;
Строки являются часто используемой структурой данных во всех языках программирования. Для работы с ними в среде Delphiпредусмотрены стандартные процедуры и функции, действия которых можно представить в виде специального ADT – формата.
ADT – формат данных String
ADT String
Данные
Последовательность ANSI символов, оканчивающаяся NULL–символом
Операции
Нахождение длины (Length)
Вход: Строка S
Предусловие: Нет
Процесс: Подсчет числа символов до NULL–символа
Выход: Возвращает количество символов в строке
Постусловие: Нет
Копирование (Copy)
Вход: Строка S. Индекс первого символа, с которого начинается копирование (Index). Количество копируемых символов (Count).
Предусловие: Нет
Процесс: Копирование до Count символов из строки S, начиная с позиции Index, в строку S1. Если Index меньше единицы, то копируются все символы от 1 до Count. Если Index + Count – 1 больше длины строки S, то копируются все символы от Index до конца строки S.
Выход: Возвращается строка S1 или пустая строка, если Index превышает длину исходной строки S или сама S является пустой или Count меньше 1.
Постусловие: Строка S1 с новой длиной и данными. Строка S не изменяется.
Конкатенация (Concat)
Вход: Две строки S1 и S2
Предусловие: Нет
Процесс: Сцепление строк S1 и S2 за счет создания строки S с присвоением ей строки S1, выделения дополнительной памяти для вставки символов из строки S2 и копирования всех символов из строки S2 в конец строки S.
Выход: Возвращается строка S или строка S2, если строка S1 является пустой.
Постусловие: Строка S с новой длиной и данными. Строки S1 и S2 не изменяются
Сравнение (StrComp)
Вход: Две строки S1 и S2
Предусловие: Нет
Процесс: ASCII-упорядочивания к этим строкам
Выход: - 1, если Str1 < Str2; 0, если Str1 = Str2;
1, если Str1 > Str2
Постусловие: Нет
Индексация (Pos)
Вход: Подстрока SubStr и строка Str
Предусловие: Нет
Процесс: Поиск первого вхождения подстроки SubStr в строку Str.
Выход: Возвращается индекс первого символа найденной подстроки или 0, если подстрока SubStr не найдена
Постусловие: Нет
Удаление (Delete)
Вход: Строка S. Индекс первого символа (Index), с которого начинается удаление. Число удаляемых символов (Count).
Предусловие: Нет
Процесс: Удаление до Count символов из строки S, начиная с позиции Index, за счет сдвига всех не удаленных символов с позиции Index + Count на Count позиций вперед. Если Index меньше единицы, то удаляются все символы от 1 до Count. Если Index + Count - 1 больше длины строки S, то удаляются все символы от Index до конца строки S.
Выход: Строка S
Постусловие: Строка S с новой длиной и данными или исходная строка, если Index превышает её длину или сама строка S является пустой или Count меньше 1.
Вставка (Insert)
Вход: Строка Source и S. Индекс первого символа (Index), с которого начинается вставка.
Предусловие: Нет
Процесс: Вставляется строка Source в строку S, начиная с позиции Index, за счет перемещения всех символов строки S с позиции Index на длину строки Source назад и копирования всех символов строки Source вместо перемещенных символов строки S. Если индекс Index меньше 1, то символы вставляются с первой позиции. Если Index больше длины строки S, то символы строки Source вставляются в конец строки S.
Выход: Строка S или строка Source, если строка S является пустой.
Постусловие: Строка S с новой длиной и данными. Строка Source не изменяется.
Замена (Replace)
Вход: Строка Source и S. Индекс первого символа (Index), с которого начинается замена.
Предусловие: Нет
Процесс: Вставляется строка Source в строку S, начиная с позиции Index, за счет замены всех символов строки S с позиции Index до конца строки Source. Если индекс Index меньше единицы, то символы вставляются с первой позиции. Если Index больше длины строки S, то символы строки Source вставляются в конец строки S.
Выход: Строка S или строка Source, если строка S является пустой.
Постусловие: Строка S с новой длиной и данными. Строка Source не изменяется.
Конец ADT String