Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глоссарий.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
526.34 Кб
Скачать

Самостоятельная работа студентов

1Fns 12017 Алгоритмы, структуры данных и языки программирование

(шифр и наименование модуля)

по дисциплине ASDYaP1202 Алгоритмы, структуры данных и языки программирование

(код и полное наименование дисциплины по рабочему учебному плану)

для студентов специальности 5В070300 Информационные системы

(шифр и наименование специальности/специализации)

Астана

2012

Самостоятельная работа студентов по дисциплине «Алгоритмы, структуры данных и языки программирования»

СРС №1 Алгоритмический язык Турбо Паскаль 7.0. Алфавит. Типы данных

Задания:

1. Нарисовать в конспекте диаграмму взаимосвязей всех простых типов.

2. Законспектировать подробные определения порядковых и вещественных типов.

3. Выписать примеры констант всех простых типов.

Методические рекомендации к выполнению:

Сведения о типах необходимо оформить в виде стандартных таблиц: имя типа, название типа, точность в десятичных цифрах (для вещественных типов), диапазон значений, число занимаемых байтов.

Обратите внимание на две формы записи целых, символьных и вещественных констант.

СРС 2

Операции. Стандартные функции. Выражения

Задания:

1. Законспектировать и разобрать сведения об арифметических, логических, строковых и множественных операциях. Привести примеры.

2. Законспектировать сведения о стандартных математических, порядковых функциях и функциях преобразования типов. Привести примеры выражений разных типов.

Методические рекомендации к выполнению:

Сведения об операциях необходимо оформить в виде стандартных таблиц: приоритет, обозначение операции, название операции, тип операндов, тип результата.

Сведения о функциях также необходимо оформить в виде стандартных таблиц: обращение к функции, математическое обозначение функции, тип аргумента, тип результата. Рассмотрите следующие функции: Abs, ArcTan, Cos, Exp, Frac, Int, Ln, Pi, Sin, Sqr, Sqrt, Odd, Ord, Succ, Pred, Round, Trunc, Chr.

СРС №3.

Структура программы. Инструкции присваивания и ввода/вывода. Пустая инструкция

Задания:

1. Выписать общий вид и примеры всех разделов описаний.

2. Законспектировать сведения об инструкциях присваивания, ввода с клавиатуры и вывода на экран.

Методические рекомендации к выполнению:

При оформлении примеров разделов описаний аккуратно выделяйте каждый раздел единообразным отступом.

Обратите внимание на различие описания и использования обычных именованных констант и типизированных констант.

Для инструкций присваивания приведите подробные примеры преобразования типов в случае, когда слева от знака присваивания – переменная целого типа, а выражение справа от присваивания – вещественного типа.

В инструкциях ввода/вывода обратите внимание на различие потокового и построчного обмена, а также возможность отсутствия списка параметров в инструкциях ReadLn и WriteLn. Для инструкций вывода приведите подробные примеры форматирования выводимых значений.

СРС №4

Блок. Ветвление. Инструкции альтернативы и варианта

Задания:

1. Словесно и с помощью блок-схем описать алгоритм выполнения инструкций альтернативы и варианта. Законспектировать сведения об этих инструкциях. Привести разнообразные примеры.

2. Разобрать случаи вложения блока в инструкции альтернативы и варианта, инструкций альтернативы друг в друга, а также – в инструкцию варианта.

Методические рекомендации к выполнению:

При оформлении примеров инструкций аккуратно выделяйте каждую вложенную структуру единообразным отступом.

При разборе вложения инструкций подробно обосновывайте его необходимость, а при вложении альтернатив – перебирайте возможные основные комбинации (альтернатива в then-ветви, альтернатива в else-ветви).

СРС №5

Циклы. Инструкция безусловного перехода, метки

Задания:

1. Словесно и с помощью блок-схем описать алгоритм выполнения инструкций всех трёх видов циклов. Законспектировать сведения об этих инструкциях. Привести разнообразные примеры.

2. Разобрать случаи вложения циклов друг в друга, блока и ветвлений в циклы.

3. Изложить концепцию структурного программирования на языке Паскаль (теорему, следствие и их доказательства).

Методические рекомендации к выполнению:

При оформлении примеров инструкций аккуратно выделяйте каждую вложенную структуру единообразным отступом.

При разборе вложения циклов обратите внимание на "скорость" их работы (внутренний – "быстрее", а внешний – "медленнее").

Рассмотрите возможность "аварийного" прерывания итераций вложенных циклов с помощью инструкции безусловного перехода.

Подробно остановитесь на возможных алгоритмических ошибках: зацикливание, лишняя итерация в цикле с предусловием, влияние на счётчик цикла в теле цикла, неправильное оформление цепочки в качестве тела цикла.

СРС №6

Перечислимый и ограниченный типы. Массивы

Задания:

1. Законспектировать из [6] описание перечислимого типа, в том числе и четыре аксиомы определения этого типа. Привести примеры перечислимого типа и типов-диапазонов для разных базовых типов.

2. Выписать примеры различных массивов и определить количество байтов, которое они занимают. Найти и выписать ограничение на объём массивов в Турбо Паскале.

3. Законспектировать и разобрать из [6, 13] примеры поиска в одномерном массиве.

4. Написать и объяснить работу программ умножения и транспонирования матриц.

5. Для заданной матрицы смежности M произвольного графа построить её транзитивное замыкание M+ с помощью алгоритма Уоршала.

Методические рекомендации к выполнению:

При конструировании перечислимых типов используйте осмысленные имена.

Обратите внимание на то, что многомерный массив можно воспринимать как массив массивов и индекс его элемента записывать как такую последовательность: [I1][I2] … [ID].

При вводе данных с клавиатуры используйте организацию простого диалога с собственной программой с помощью печати приглашений строкового типа инструкциями Write, WriteLn.

При печати строки элементов матрицы можно использовать потоковый вывод (Write), а при переходе на новую строку – инструкцию WriteLn.

Алгоритм Уоршала приводится в [15]. Поскольку логические значения не вводятся с клавиатуры, воспользуйтесь целочисленными значениями 0 и 1.

СРС №7

Строки

Задания:

1. Привести примеры действий и операций с данными строкового типа.

2. Законспектировать описания стандартных процедур и функций для строковых данных, сопроводив их примерами, а примеры – объяснениями.

3. Написать и объяснить работу программ по распознанию слов-палиндромов и поиску всех вхождений подстроки в строку.

Методические рекомендации к выполнению:

При присваивании и вводе используйте значения как большие максимально допустимой длины переменной, так меньшие максимально допустимой длины. Приведите примеры сравнения строк как равной, так и неравной длины.

Приведите пример и проанализируйте использование в строковой константе символа апострофа (').

Рассмотрите следующие символьно-строковые процедуры и функции: Insert, Delete, Str, Val, Copy, Length, Pos, UpCase.

При поиске всех вхождений подстроки в строке учитывайте, что функция Pos ищет, начиная с первого символа, первое слева вхождение, поэтому для поиска последующих вхождений надо учитывать смещение от начала строки до предыдущего вхождения подстроки.

СРС №8

Файлы

Задания:

1. Законспектировать описания стандартных процедур и функций для работы с файлами, сопроводив их примерами, а примеры – объяснениями. Объяснить смысл файловых переменных Input, Output, а также логических устройств, привести примеры.

2. Написать и объяснить работу программы подсчёта количества строк в текстовом файле, элементов – в типизированном файле, записей – в нетипизированном файле.

3. Организовать ввод (вывод) матриц из текстового файла (в текстовой файл) и использовать это в программах умножения и транспонирования матриц и в алгоритме Уоршала построения транзитивного замыкания матрицы смежности произвольного графа.

4. Написать и объяснить работу программы нахождения значения матричного выражения A*B+C*D. Промежуточные результаты (произведения матриц) сохранять во временных типизированных файлах, элементы которых – матрицы! Попытаться просмотреть содержимое этих файлов на экране.

5. Проделать предыдущее задание для нетипизированных файлов.

6. Проделать 4-е задание с единственным типизированным файлом и организацией позиционирования в нём.

Методические рекомендации к выполнению:

Обратите внимание на особенности работы процедур и функций Append, Reset, SeekEof, Eof, FileSize, FilePos, Seek для различных видов файлов. Ответьте на вопрос: как организовать дозапись элементов в типизированном файле?

При подсоединении к файлу используйте гибкую форму: задавайте имя файла в строковой переменной, значение которой предварительно вводите с клавиатуры.

В задании 2 сравните обработку текстового файла и строк, вводимых с клавиатуры. Есть ли между ними разница?

В задании 3 при печати строки элементов матрицы используйте потоковый вывод (Write), а при переходе на новую строку – инструкцию WriteLn. Алгоритм Уоршала приводится в [15]. Поскольку логические значения не вводятся с клавиатуры, воспользуйтесь целочисленными значениями 0 и 1.

В заданиях 4 – 6 в программе достаточно трёх матриц.

СРС №9

Множества. Записи

Задания:

1. Законспектировать описания всех операций над множествами и их элементами, сопроводив всё это примерами, а примеры – объяснениями.

2. Законспектировать описания стандартных процедур Include и Exclude, сопроводив их примерами, а примеры – объяснениями. Сравнить их действие с операциями объединения (+) и разности (-).

3. Написать и объяснить работу программы, которая ищет в заданном подмножестве целых чисел наличие хотя бы одного нечётного числа.

4. Привести примеры записей, вложенных друг в друга, и доступа к полям таких записей, объяснить эти примеры.

5. Законспектировать определение инструкции присоединения, привести примеры вложения в неё других инструкций, сопроводив их объяснениями.

6. Законспектировать и разобраться с применением вариантной части записи. Привести пример программы наложения двух однобайтовых полей на одно двухбайтовое поле, распечатать отдельно их значения и проинтерпретировать результат.

Методические рекомендации к выполнению:

Обратите внимание на возможность использования в конструкторах не только списков констант, но и переменных.

При сравнении процедур Include и Exclude с операциями "+" и "-" программу откомпилируйте в .exe файлы (меню Compile→Destination) и сопоставьте длины этих файлов.

При наложении полей в вариантной части записи обратите внимание, что для целых не однобайтовых типов любой младший байт располагается в памяти раньше старшего байта.

СРС №10

Подпрограммы-процедуры. Локальность имён. Параметры процедуры

Задания:

1. Привести примеры различных видов передачи параметров, сопроводив их объяснениями.

2. Привести примеры неправильного указания типов формальных параметров (перечислимый тип, диапазон, массив, строка и другие) и правильные альтернативные примеры с именованием этих типов в разделе type.

3. Оформить программы вычисления произведения и транспонирования матриц и алгоритм Уоршала построения транзитивного замыкания матрицы смежности произвольного графа в виде процедур и объяснить применяемые способы передачи параметров.

4. Написать примеры программ с "перекрытием" глобальных имён локальными и подробно проанализировать результаты их работы.

5. Написать пример процедуры с нежелательным побочным эффектом через глобальную переменную – эта переменная должна использоваться в качестве счётчика внешнего цикла, в теле которого вызывается процедура, и в качестве счётчика цикла внутри тела процедуры. Проанализировать результаты её работы.

6. Организовать несколько вложений подпрограмм друг в друга и проанализировать использование областей существования локальных переменных этих подпрограмм.

Методические рекомендации к выполнению:

Обратите внимание на объединение в группы формальных параметров, передача которых осуществляется одинаковым способом.

Обратите внимание на то, что типы, обозначаемые одним зарезервированным словом, не надо обязательно именовать, например: string, file, Text и большинство простых типов.

Алгоритм Уоршала приводится в [15]. Поскольку логические значения не вводятся с клавиатуры, воспользуйтесь целочисленными значениями 0 и 1.

Обратите внимание на то, что "перекрываются" не только имена глобальных переменных, но и имена констант, типов, подпрограмм. А вот метки всегда локальны, то есть инструкцией goto нельзя передать управление вовнутрь процедуры, минуя её заголовок.

СРС №11

Подпрограммы-функции. Побочный эффект

Задания:

1. Подробно разобрать пример функции с побочным эффектом в лекции по Теме "Побочный эффект".

2. Написать пример функции, определяющей по трём вещественным значениям, являются ли они длинами сторон треугольника. Если это так, то функция в качестве побочного эффекта должна выдавать площадь этого треугольника.

Методические рекомендации к выполнению:

Выполните трассировку с просмотром текущего значения переменной A.

При вычислении площади треугольника используйте формулу Герона.

СРС №12

Процедурный тип. Рекурсия

Задания:

1. Написать процедуру PrintFunc, печатающую таблицу значений произвольной функции на заданном отрезке [a, b], то есть использующую параметр процедурного типа. Напечатать с её помощью значения sin x, cos x и параболы y=x2.

2. Детально законспектировать методику создания рекурсивных алгоритмов в [15]. Каковы ограничения на объём стека, и как их регулировать в IDE?

3. Написать и проанализировать работу рекурсивных функций вычисления n! и n-го числа Фибоначчи. Сравнить их с простыми итеративными алгоритмами.

Методические рекомендации к выполнению:

Функции, передаваемые в качестве параметров, определите в дальней модели памяти разными способами. Обратите внимание на запрет передачи имён стандартных функций в качестве параметров.

Для управления объёмом стека можно использовать меню Options→Memory sizes в IDE либо директиву компилятору {$M}.

Поскольку факториал n! увеличивается быстро при росте n, то рекомендуемый тип функции – LongInt.

СРС №13

Модули

Задания:

1. Найдите в литературе или экспериментально ответы на вопросы: каковы ограничения по памяти, накладываемые на модуль; какова модель памяти по умолчанию подпрограмм модуля; что будет "видно" в программе, подключающей модуль, если в ней встретится объект, одноимённый с объектом в модуле, и как эту "видимость" можно изменить?

2. Сконструируйте новый тип "комплексные числа" с именем TComplex, операции сложения, вычитания, умножения, деления и умножения на вещественную константу комплексных чисел оформите в виде процедур. Всё это сгруппируйте в отдельном модуле UComplex.

3. Подробно законспектировать, разобраться теоретически и экспериментально в различиях между тремя режимами компиляции модулей.

4. Написать иерархию из одной программы и шести модулей с непустыми инициализирующими частями. Программа должна подключать два модуля, а каждый из этих модулей – ещё по два. Проследить, в каком порядке срабатывают инициализирующие части модулей.

5. Кратко законспектировать задачи, решаемые стандартными модулями, перечисленными в лекции по Теме "Модуль".

6. Скопируйте в свой каталог демонстрационные примеры Турбо Паскаля из каталога BP\EXAMPLES\DOS\TVDEMO. Откомпилируйте и выполните программы tvedit.pas (простенький редактор текста) и tvdemo.pas (демонстрация работы модулей библиотеки Turbo Vision, в их числе: таблица ASCII, календарь, калькулятор, игрушечная головоломка).

Методические рекомендации к выполнению:

Обратите внимание на то, что данные (переменные, типизированные константы) и программа (инструкции) занимают разные области памяти, поэтому ограничения на них накладываются раздельно.

При определении модели памяти для подпрограмм рассмотрите отдельно подпрограммы, "видимые" в интерфейсной части и, соответственно, "не видимые" в этой части.

Для типа "комплексные числа" подходящим является тип "запись".

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

Для определения порядка срабатывания инициализирующих частей модулей достаточно использовать простой вывод на экран.

При недостатке памяти для компиляции и компоновки можно поместить буфер компоновщика на диске, а не в памяти. Для этого в меню Options→Linker→Link buffer производится переключение со значения Memory на значение Disk.

Другой способ выхода из этого затруднения – это покинуть IDE и воспользоваться пакетным компилятором tpc.exe.

СРС №14

Ссылочный тип. Динамические переменные

Задания:

1. Привести примеры всех перечисленных в лекции по Теме "Ссылочный тип. Динамические переменные" действий и операций, связанных со ссылочным типом. Отдельно рассмотреть типизированные и нетипизированные указатели. В качестве указываемых объектов использовать обычные статические переменные.

2. Описать переменные: указатель на массив, массив указателей, указатель на запись, запись с полем-указателем. После этого выпишите, как организовать доступ к элементам этих структур при использовании разыменования "^".

3. В программе описаны типы и переменные:

type

TA = array[1..5] of Double;

TB = array[1..20] of LongInt;

TC = array[1..30] of Integer;

TD = array[1..20] of Boolean;

var

A: ^TA; B: ^TB; C: ^TC; D: ^TD;

E: TB;

После выполнения инструкций присваивания массивы A^, B^, C^, D^ будут "наложены" на какие-то участки единственного реального массива E:

B := @E; A := @B^[11]; C := @B^[6]; D := @B^[16];

Определить смещения в байтах элементов массивов A^[4], B^[10], C^[20], D^[5] от начала массива E. Все ли массивы A^, B^, C^, D^ целиком "покрываются" массивом E?

4. Запрограммируйте фрагмент из лекции, иллюстрирующий "висячую" ссылку. Выполните эту программу, переведите и выпишите сообщение об ошибке, которое будет получено. Выполните то же упражнение для процедур GetMem и FreeMem.

5. Напечатайте объём свободного пространства в куче при правильном захвате и освобождении динамических переменных, определив разницу между функциями MaxAvail и MemAvail.

6. Определите размер в байтах ссылочных типов в зависимости от типа, на который они указывают, множественных типов в зависимости от типа их элементов и различных файловых типов.

7. Выполните вычисление произведения и транспонирования матриц и алгоритм Уоршала построения транзитивного замыкания матрицы смежности произвольного графа для динамических массивов.

Методические рекомендации к выполнению:

Сравните возможности функции Addr и операции @.

Сопровождайте примеры иллюстрациями: переменные можно обозначать прямоугольниками, а ссылки на них – стрелками. Ссылку nil можно обозначать точкой внутри соответствующего прямоугольника.

Для однозначности при доступе к элементам структурных переменных воспринимайте запись разыменованного указателя A^ как единое имя переменной.

При выполнении 3-го задания необходимо учесть длину в байтах элемента массива каждого типа и свойство массивов Турбо Паскаля занимать сплошной отрезок памяти.

Чтобы увидеть разницу между функциями MaxAvail и MemAvail захватите, к примеру, две небольших динамических переменных, затем освободите первую из них. Далее захватите более длинную переменную и только тогда освободите вторую небольшую переменную.

Обратите внимание на то, что аргумент функции SizeOf является именем только переменной или типа. В последнем случае функцию SizeOf можно использовать и в разделах описаний.

Для задания динамической матрицы её можно предварительно линеаризовать, выложив строки в динамический вектор. Тогда для доступа к элементу матрицы существенной величиной помимо индекса [I, J] будет размер (число элементов) её строки – N.

type {Тип вектора, который будет хранить матрицу}

TVect = array[1..65535 div SizeOf(TE)] of TE;

PVect = ^TVect;

После захвата памяти под вектор Vect: PVect; доступ к элементу матрицы с индексом [I, J] (1 ≤ I ≤ M, 1 ≤ J ≤ N) в реальности будет доступом к элементу вектора Vect^[N*(I - 1) + J].

Другой путь задания динамической матрицы заключается в использовании сочетания двух типов: TRow – тип строки матрицы, TCol – тип вектора-столбца указателей на строки.

type

TRow = array[1.. 65535 div SizeOf(TE)] of TE;

PRow = ^TRow;

TCol = array[1.. 65535 div SizeOf(PRow)] of PRow;

Сами типы ориентированы на максимально возможные размеры индекса, поэтому память для динамической матрицы Matr: ^TCol; может захватываться без опасения выхода индекса за допустимые границы. Сначала захватывается динамический вектор-столбец указателей на строки (Matr^), а затем в цикле для каждого элемента столбца (Matr^[I]) – сами динамические строки (Matr^[I]^). Для доступа к элементам матрицы используется конструкция Matr^[I]^[J].