Методические указания и задания к лабораторным работам для учащихся ссуз специальности Т1002 «Программное обеспечение информационных технологий»
Вид материала | Методические указания |
- Методические указания по дипломному проектированию для учащихся специальности 2-40, 316.16kb.
- Методические указания к лабораторным работам для студентов специальности 210100 "Автоматика, 536.56kb.
- Методические указания и контрольные задания по дисциплине системное программное обеспечение, 196.97kb.
- Методические рекомендации по прохождению преддипломной практики для учащихся специальности, 898.69kb.
- Методические указания к лабораторным работам №1-5 для студентов специальности 210100, 363.6kb.
- Методические указания по лабораторным работам Факультет: электроэнергетический, 554.73kb.
- Методические указания к лабораторным работам по курсу, 438.32kb.
- Методические указания к лабораторным работам по физике по практикуму «Вычислительная, 138.12kb.
- Методические указания к лабораторным работам Самара 2007, 863.04kb.
- Название дисциплины, 52.28kb.
Порядок выполнения работы
- Изучить теоретические сведения по теме ” Разработка программы использования динамической памяти”.
- Получить у преподавателя индивидуальное задание и разработать программу для работы с динамической памятью и динамическими переменными согласно заданному варианту.
- Показать работающую программу преподавателю.
- Ответить на контрольные вопросы.
Контрольные вопросы
- Статические и динамические переменные.
- Указатели: типизированные, нетипизированные, Nil. Доступ к переменной по указателю.
- Процедуры и функции управления динамической памятью
Лабораторная работа № 33
Разработка программы создания связанного списка
Цель работы: формирование знаний и умений по работе с динамической памятью. Приобретение навыков работы с динамическими структурами данных.
Краткие теоретические сведения
Использование указателей для организации связанных списков
Ч

аще всего указатели используются для ссылки на записи, тем самым достигается значительная экономия памяти. Если же сама запись содержит в себе поле-указатель, указывающий на следующую за ней запись, то это позволяет образовать связанные списки - структуру, в которой отдельные записи последовательно связаны друг с другом. В приведенном ниже примере используются записи, в которых наряду с данными об автомобиле имеется указатель на следующую запись, благодаря чему получается связанный список.
Одно из полей каждого объекта связанного списка имеет тип указатель и указывает на очередной объект в списке. Указатель на первый объект содержится в переменной First, а последний объект имеет указатель на Nil.
Пример программы создания и использования связанного списка
Пусть требуется создать связанный список из записей, содержащих сведения об автомобилях, а также реализовать операции со связанным списком: запись первым в список, удаление первого объекта из списка, просмотр всего списка, удаление объекта, следующего за указанным.
{Пример использования указателей для обработки связанного списка}
Program point;
Uses Crt;
Type
NameStr = String [20];
Link = Auto;
Auto = record
Name : NameStr; {Марка автомобиля}
Speed : real; {Скорость}
Next : Link; {Поле для связи со следующим объектом в списке}
end;
Var
Р,First : Link; {Указатели на запись: текущую, первую}
NamFind : NameStr; {Марка автомобиля для поиска}
V : 0..4; {Селектор меню}
EndMenu : boolean; {Окончание вывода меню}
{Поиск объекта с именем FN, по результатам поиска возвращает указатель на найденный объект или Nil, если объект не найден}
Function FindName(FN:NameStr) : Link;
Var
Curr : Link;
begin
Curr:=First; {Установить указатель на первом объекте в списке }
{Повторять пока не дойдем до конца списка}
while Curr <> Nil do
if Curr.Name=FN then {Если нашли заданный объект}
begin
FindName:=Curr; {Возвращаем значение указателя на него}
Exit; {Завершаем функцию}
end
else
Curr:=Curr .Next; {Перейти к следующей записи}
FindName:=Nil; {В списке нет искомого объекта}
end; {Конец FindName}
{Добавление записи первой в связанный список}
procedure AddFirst(A:Link);
begin
A. Next:=First; {Новый объект первый в списке}
First:=А; {Голова списка ссылается на новый объект}
end; {Конец AddFirst}
{Удаление первого объекта из списка}
procedure DelFirst(var A:Link);
begin
A:=First;
First:=First. Next; {Теперь First указывает на тот объект, на который ранее ссылался объект А}
end; {Конец DelFirst}
{Удаление из списка объекта, стоящего после объекта Old}
procedure DelAfter(Old:Link; var A:Link);
begin
A:=Old.Next; {Переменной А присваивается значение указателя на удаляемый объект}
Old.Next:=Old.Next.Next; {Теперь Old указывает на тот объект, на который ранее ссылался следующий за ним объект, а объект А исключен из связанного списка}
end; {Конец DelAfter}
{Ввести данные об объекте}
procedure InpAvto;
begin
P:=New(Link); {Создать очередной объект типа Auto}
Write('Введите марку автомобиля :');
Readln(P.Name) ;
Write('Максимальная скорость :');
Readln(Р.Speed);
AddFirst(Р); {Вызов процедуры добавления записи, на которую ссылается указатель Р (Р- фактический параметр, А - формальный параметр-значение) }
end; {Конец InpAvto}
{Вывести на экран все объекты из связанного списка}
procedure MyList;
var
Curr : Link; {Локальная переменная - указатель на очередной объект}
begin
Curr:=First; {Установить указатель на первом объекте в списке}
{Повторять, пока не дойдем до конца списка}
while Curr <> Nil do
begin
Writeln( 'Марка : ' , Curr. Name,' скорость : ', Curr. Speed) ;
Curr:=Curr.Next; {Перейти к очередному объекту связанного списка}
end ;
Write('Вывод списка окончен. Нажмите Enter');
Readln;
end; {Конец MyList}
Begin {Основная программа}
New(P); {Создать новую динамическую переменную и установить на нее переменную-указатель}
EndMenu:=False ;
repeat {Очищать экран и выводить меню до тех пор, пока EndMenu<>True}
CIrScr;
Writeln('Укажите вид работы:');
Writein('1. Запись первым в список');
Writeln('2. Удаление первого объекта из списка');
Writein('3. Просмотр всего списка') ;
Writein('4. Удаление объекта, следующего в списке за указанным') ;
Writein('0. Окончание работы');
Readin(V) ;
Case V of {Вызов разных процедур в зависимости от выбора пункта меню}
1 : InpAvto; {Ввод данных об объекте}
2 : DelFirst(P); {Удаление первого в списке}
3 : MyList; {Вывод списка всех элементов связанного списка}
4 : begin {Удаление объекта, следующего за указанным}
Write('Введите марку автомобиля, за которым следует удаляемый из списка :');
Readln(NamFind) ;
DelAfter(FindHame(NamFind),P); {Вызов процедуры
DelAfter с параметрами: функцией FindName(NamFind) и указателем Р}
end
else
EndMenu:=True; {Завершить вывод меню}
end;
until EndMenu; {Если EndMenu=True, то завершить вывод меню на экран}
Dispose(Р); {Уничтожить динамическую переменную Р и освободить память в куче}
end.
Порядок выполнения работы
- Изучить теоретические сведения по теме ” Разработка программы создания связанного списка”.
- Получить у преподавателя индивидуальное задание и разработать программу для работы со связанным списком согласно заданному варианту.
- Показать работающую программу преподавателю.
- Ответить на контрольные вопросы.
Контрольные вопросы
- Связанные списки.
- Применение указателей для организации связанных списков.
Лабораторная работа № 34
Разработка программы для работы с процедурным типом
Цель работы: формирование знаний и умений по работе с процедурным типом данных.
Краткие теоретические сведения
Нетипизированные параметры. Параметры процедурного типа
Нетипизированные параметры - это группа параметров, перед которыми стоит ключевое слово Var и за которым не следует тип. Фактическими параметрами в операторе вызова процедуры в данном случае могут быть переменные любого типа.
Поскольку у нетипизированных параметрах тип отсутствует, то изначально они совместимы с переменными всех типов.
Обеспечение совместимости с фактическими параметрами может быть достигнуто двумя способами.
Способ 1: внутри процедуры объявляется локальная переменная нужного типа, наложенная на переданный фактический параметр. Для описания такой переменной используется зарезервированное слово Absolute.
Пример 1.
program Primer1;
Var {Обьявление глобальных переменных}
x1,x2,y1,y2,z1,z2: real;
{процедура возведения в степень}
procedure stepen (x,y : real; var s); {x, y – параметры значения}
var ss: real absolute s; {s- параметр без типа, ss наложенная на s – локальная переменная типа real}
begin
ss:=exp(y*ln(x));
end; {конец процедуры stepen}
begin{основная программа}
writeln(‘Введите значение переменных в последовательности: x1 y1 x2 y2’ );
readln (x1, y1, x2, y2); {Чтение исходных данных}
stepen (x1, y1, z1); {Первый оператор вызова процедуры stepen}
stepen(x2, y2, z2); {Второй оператор вызова процедуры stepen}
z1:= z2+z1; {Формироваие результата}
writeln(z1); {печать результата}
end.
Способ 2: внутри процедуры вводится нужный тип. Данный тип ставится в соответствие нетипизированному параметру с помощью присваивания типа переменной.
Пример 2. В программе функция Sum выдает сумму двух вещественных переменных при N=Ø, и сумму двух одномерных массивов при N<>Ø.
program Primer2;
var
ind: integer;
m1,m2: array [1..5] of integer ; {описание массивов m1 m2}
x1,x2:real;
{функция вычисления суммы}
function sum(n: integer ; var y1,y2): real;
Type
mas = array [1..MaxInt] of integer;
Var
i: integer;
s: real;
begin
if n=Ø then sum:= real(y1)+real(y2);
else
begin
s:=Ø;
for i:=1 to n do
s:= s + mas(y1)[i]+mas(y2)[i];
sum:=s;
end;
end; {конец функции sum}
Begin {основная программа}
for ind:= 1 to 5 do
real(m1[i], m2[i] ); {заполнение массивов данными}
writeln(‘Введите 2 вещественных числа: ’)
read(x1,x2);
writeln(’x1 + x2’, sum(Ø,x1,x2)); {вызов в операторе writeln функции sum-для суммирования вещественных чисел x1 и x2 (n=0)}
writeln(’Массивы’, sum (5,m1, m2)); {вызов в операторе writeln функции sum-для суммирования массивов m1 и m2 (n=5<>0)}
end.
Параметр процедурного типа
В Паскале допускается передача в качестве параметра имени других процедур или функций.
Например:
Type
Func = function(x,y:byte):byte;
Proc = procedure(var x,e:byte);
var
P1 : Proc; F1: Func;
При этом должны совпадать число параметров и соответственно типы параметров. Всем процедуры и функции, имена которых присваиваются процедурным переменным, необходимо компилировать в режиме {$F+}.
Описание процедурных типов вводится в разделе Type. Синтаксис описания совпадает с заголовком процедуры, однако имя процедуры в описании опускается.
Имена параметров в описании процедурного типа играет чисто иллюстративную роль. Никакого влияния на значение этого описания данные имена не оказывают.
Процедурной переменной может быть присвоено значение другой процедурной переменной, имя процедуры или функция. При этом переменная слева и значение в правой части оператора присваивания должны быть совместимы по присваиванию.
Для обеспечения такой совместимости процедура, если её нужно присвоить процедурной переменной, должна удовлетворять следующим требованиям:
- Она должна компилироваться в состоянии {$F+} (в исходном тексте программы перед описанием такой процедуры должна быть размещена директива компилятора {$F+}, а в конце описания {$F-})
- Она не должна быть стандартной процедурой или функцией.
- Она не должна быть вложенной.
- Она не должна быть процедурой типа inline.
- Она не должна быть процедурой прерывания (interrupt).
Пример 3.
Program Primer3;
Type
Func=function(x,y:anteger):integer;
{$F+}
Function Add(a,b:integer):integer;
Begin
Add:=a+b;
end;
Function Multiplay(a,b:int):int;
Begin
Multiplay:=a+b;
end;
Function Div(a,b:int):int;
Begin
Div:=a/b;
end;
{$F-}
Procedure RAB(n,m:integer;Operation:Func); {Operation-параметр процедурного типа}
Var
i,j:integer;
Begin
for i:=1 to n do
for j:=1 to m do
write(operation (i,j):5);
end;
Begin {основная программа}
RAB(10,10,Add); {вызов процедуры RAB с последним параметром- процедурой Add}
RAB(20,10,Multiplay); ); {вызов процедуры RAB с последним параметром- процедурой Multiplay}
RAB(10,5,Div); ); {вызов процедуры RAB с последним параметром- процедурой Div}
End.
Порядок выполнения работы
- Изучить теоретические сведения по теме “ Разработка программы для работы с процедурным типом”.
- Получить у преподавателя индивидуальное задание и разработать программу для работы с процедурными типами данных согласно заданному варианту.
- Показать работающую программу преподавателю.
- Ответить на контрольные вопросы.
Контрольные вопросы
- Нетипизированный параметр. Способы присвоения конкретного типа нетипизированному параметру.
- Назначение процедурной переменной, объявление.
- Обеспечение совместимости процедуры, если её нужно присвоить процедурной переменной.
Литература
- Гусева А. И. Учимся программировать: Pascal 7.0. - М.: Бином, 1999.
- Сурков Д.А., и др. Программирование в среде Borland Pascal для Windows.-Мн.: “Вышэйшая школа”, 1996.
- Грызлов В.И. и др. Pascal 7.0.- Киев, BHV, 1999.
- Вирт Н. Алгоритмы и структуры данных –М.: “Мир”, 1989
Содержание
Лабораторная работа № 1 4
Блок-схемы как графическое представление алгоритмов. Основные блоки, используемые в блок- схемах алгоритмов 4
Лабораторная работа № 2 9
Построение блок-схем алгоритмов 9
Лабораторная работа № 3 15
Вызов интегрированной среды (ИС) языка программирования Паскаль. Структура основного экрана. Изучение меню 15
Разработка программ на Паскале включает в себя следующие действия (этапы разработки программы): ввод и редактирование текста программы на языке программирования Паскаль, ее трансляцию, отладку. 15
Для выполнения каждого этапа применяются специальные средства: для ввода и редактирования текста используется редактор текстов, для трансляции программы - компилятор, для построения исполняемого компьютером программного модуля с объединением разрозненных откомпилированных модулей и библиотекой стандартных процедур Паскаля - компоновщик (linker), для отладки программ с анализом ее поведения, поиском ошибок, просмотром и изменением содержимого ячеек памяти компьютера- отладчик (debugger). 15
Лабораторная работа № 4 24
Написание программы на Паскале с использованием операторов ввода-вывода данных 24
Лабораторная работа № 5 27
Написание программы на Паскале 27
с использованием операторов ввода-вывода данных с различными форматами выводимых данных 27
Лабораторная работа № 6 30
Написание программы на Паскале с использованием операторов присваивания и безусловного перехода 30
Лабораторная работа № 7 34
Написание программы на Паскале с использованием условных операторов и оператора выбора Case 34
Лабораторная работа № 8 39
Написание программы на Паскале с использованием 39
операторов повтора (For, Repeat) 39
Лабораторная работа № 9 44
Написание программы на Паскале 44
с использованием операторов повтора (While) 44
Лабораторная работа № 10 46
Написание программы на Паскале для решения задач на ввод-вывод линейных и двумерных массивов 46
Лабораторная работа № 11 53
Написание программы на Паскале для решения задач на обработку линейного массива 53
Лабораторная работа № 12 57
Написание программы на Паскале для решения задач на обработку двумерного массива 57
Лабораторная работа № 13 61
Написание программы на Паскале с использованием встроенных функций 61
Лабораторная работа № 14 66
Написание программы на Паскале с использованием функций, определенных пользователем 66
Лабораторная работа № 15 69
Написание программы на Паскале с использованием процедур, определенных пользователем. 69
Лабораторная работа № 16 74
Написание программы на Паскале с использованием рекурсии 74
Лабораторная работа № 17 78
Реализация алгоритма бинарного поиска при написании программы на Паскале 78
Лабораторная работа № 18 82
Реализация алгоритмов сортировок включением и выбором при написании программы на Паскале 82
82
Лабораторная работа № 19 85
Лабораторная работа № 20 89
Реализация алгоритмов внешних сортировок при написании программы на Паскале 89
Лабораторная работа № 21 92
Написание программы на языке Паскаль с использованием разработанного собственного модуля 92
Лабораторная работа № 22 98
Изучение наиболее часто употребляемых универсальных процедур и оформление их в виде личной библиотеки программиста 98
Лабораторная работа № 23 102
Написание программы на языке Паскаль с использованием стандартных строковых процедур и функций 102
Лабораторная работа № 24 106
Написание программы на языке Паскаль с использованием строковых переменных 106
Лабораторная работа № 25 112
Написание программы на языке Паскаль с использованием записей 112
Лабораторная работа № 26 116
Написание программы на языке Паскаль с использованием записей с вариантами 116
Лабораторная работа № 27 121
Написание программы на языке Паскаль с использованием множеств 121
Лабораторная работа № 28 127
Написание программы на языке Паскаль с использованием с использованием файловых переменных. 127
Разработка программы для работы с текстовым файлом 127
Лабораторная работа № 29 136
Разработка программы для работы с типизированным файлом 136
Лабораторная работа № 30 144
Разработка программы для работы с нетипизированным файлом 144
Лабораторная работа № 31 147
Изучение карты памяти. Разработка программы доступа к полям PSP 147
Лабораторная работа № 32 151
Разработка программы использования динамической памяти 151
Лабораторная работа № 33 158
Разработка программы создания связанного списка 158
Лабораторная работа № 34 162
Разработка программы для работы с процедурным типом 162
Литература 166
Содержание 167
Литература…………………………………………………………………………166