Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка2.doc
Скачиваний:
35
Добавлен:
13.02.2015
Размер:
1.4 Mб
Скачать

Исходные данные

Варианта

Система уравнений

Варианта

Система уравнений

1

11

2

12

3

13

4

14

5

15

6

16

7

17

8

18

9

19

10

20

Контрольные вопросы

  1. Записать ADT – формат класса TMatrix.

  2. Записать объявление класса TMatrix.

  3. Записать конструкторы класса TMatrix и объяснить их назначение.

  4. Записать реализацию оператора сложения с присвоением класса TMatrix и объяснить его работу.

  5. Записать реализацию оператора вычитания с присвоением класса TMatrix и объяснить его работу.

  6. Записать реализацию оператора умножения матрицы на число с присвоением и объяснить его работу.

  7. Записать реализацию оператора умножения матрицы с присвоением и объяснить его работу.

  8. Записать реализацию оператора сложения матриц и объяснить его работу.

  9. Записать реализацию оператора вычитания матриц и объяснить его работу.

  10. Записать реализацию оператора умножения матрицы на число и объяснить его работу.

  11. Записать реализацию оператора умножения матриц и объяснить его работу.

  12. Записать реализацию метода транспонирования матрицы и объяснить его работу.

  13. Записать реализацию метода нахождения определителя матрицы и объяснить его работу.

  14. Записать и протестировать в программе метод нахождения минора соответствующего элемента матрицы.

  15. Записать и протестировать в программе метод нахождения алгебраического дополнения соответствующего элемента матрицы.

  16. Записать и протестировать в программе оператор унарного минуса.

  17. Записать и протестировать в программе оператор префиксного инкремента.

  18. Записать и протестировать в программе оператор префиксного декремента.

  19. Записать и протестировать в программе оператор постфиксного инкремента.

  20. Записать и протестировать в программе оператор постфиксного декремента.

  21. Записать и протестировать в программе оператор присвоения.

  22. Записать и протестировать в программе оператор равно.

  23. Записать и протестировать в программе оператор не равно.

  24. Записать и протестировать в программе оператор умножения действительного числа на матрицу.

  25. Записать и протестировать в программе метод возведения матрицы в целую степень.

  26. Записать и протестировать в программе метод проверки, не является ли матрица единичной.

  27. Записать и протестировать в программе метод проверки, не является ли матрица диагональной.

  28. Записать и протестировать в программе метод проверки, не является ли матрица нулевой.

Лабораторная работа № 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