Алгоритмы и структуры данных: Методические рекомендации

Министерство образования и науки Республики Казахстан
Павлодарский государственный университет им. С. Торайгырова
Кафедра «Вычислительная техника и программирование»
МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ И УКАЗАНИЯ
к лабораторным работам
по дисциплине Алгоритмы и структуры обработки данных в ЭВМ
для студентов специальности 5В070400 Вычислительная техника и программное
обеспечение
Павлодар
Лист утверждения методических
рекомендаций и указаний, методических
рекомендаций, методических указаний
Форма
Ф СО ПГУ 7.18.3/38
УТВЕРЖДАЮ
Проректор по УР
___________ Н.Э. Пфейфер
(подпись)
(Ф.И.О.)
«___»_____________201_г.
Составитель: к.т.н., доцент_____________
А.В. Мануковский
(должность, учёная степень, звание, подпись)
(Ф.И.О.)
Кафедра Вычислительная техника и программирование
(наименование кафедры)
Методические рекомендации и указания
к лабораторным работам
(наименование вида учебного документа (КП/КР/Кр/РГР/ЛР))
по дисциплине Алгоритмы и структуры обработки данных в ЭВМ
(полное наименование дисциплины по рабочему учебному плану)
для студентов специальности 5B070400 Вычислительная техника и программное обеспечение
(шифр и полное наименование специальности)
Рекомендовано на заседании кафедры
«_____»______________201__г., протокол №__
Потапенко О.Г. «____» ________201__г
Заведующий кафедрой ____________
(подпись)
(Ф.И.О.)
Одобрена учебно-методическим советом факультета ФМиИТ
«_____»______________201_г. Протокол №____
Председатель УМС ________________
(подпись)
СОГЛАСОВАНО
Декан факультета ________________
(подпись)
ОДОБРЕНО
Начальник УМО ______________
(подпись)
Искакова А.Б. «____» ________201__г
(Ф.И.О.)
Испулов Н.А. «____» ________201__г
(Ф.И.О.)
Жуманкулова Е.Н. «____» ________201__г
(Ф.И.О.)
Одобрена учебно-методическим советом университета
«_____»______________201_г. Протокол №____
Лабораторная работа №1.
ИНТЕГРИРОВАННАЯ СРЕДА BORLAND PASCAL 7.0
Цель: знакомство со средой Borland Pascal, привитие начальных умений
работы в среде.
Материалы и оборудование: ПК, среда Turbo Pascal, методические указания к
лабораторным работам.
Содержание и порядок выполнения работы:
1. Повторить теоретический материал по данной теме.
Интегрированная среда разработчика фирмы Borland International (IDE
Integrated Developer Environment) запускается с помощью выполняемых
файлов
bp.exe или turbo.exe (В Turbo Pascal – только turbo.exe). Если у Вас находятся
оба эти файла, то возникает вопрос – какой же из них надо запустить? Если
вы
находитесь в Windows 95/98, то желательно запустить bp.exe, иначе можно
turbo.exe. (Примечание: в любом случае bp.exe предпочтительнее).
Итак, интегрированная среда Borland Pascal 7.0 (далее IDE) имеет Рабочую
Область и Меню.
Рабочая Область - это главное окно в котором пользователь открывает
свои окна. Например, окно для редактирования программы, окно сообщений
и
т.д.
Меню состоит из 9 пунктов: File, Edit, Search, Run, Compile, Debug, Tools,
Option, Window, Help.
Рис. №1.
Рабочая область
В начале “правильной” работы у вас рабочая область должна быть чистой,
т.е. чтобы на ней не было открытых окон. Окно отличается от рабочей
области
тем, что у окна имеется заголовок. На рис.№2 окно имеет заголовок
NONAME00.PAS
129
программы
Строка состояния
Заголовок Номер
Окно редактирования
Рис.№2 Открыто окно редактирования программы.
Допустим, что при запуске у вас открылись ненужные вам окна. То
(забегая вперёд) для того, чтобы их закрыть надо удерживая клавишу ALT
нажать клавишу W, затем (отпустив ALT и W) нажать клавишу O (прим.
латинская). Если всё получилось правильно, то у вас экран должен быть
таким
же, как и на рис.№1.
Теперь вы готовы к работе!
Настало время для подробного рассмотрения Меню. (Посмотрим на
некоторые из них.)
Подменю меню File(файл): Подменю меню Run(запуск):
130
Меню Debug(отладка): Меню Options(настройки) Меню Window(окно):
Рис.3. Вид команд меню
Здесь показаны основные меню. Как видно каждое меню содержит
подменю. Открытым может быть только одно меню. Например, если вы
открыли Debug, то, не закрыв его, вы не сможете открыть Window.
2. Разобрать пример разработки программы в IDE
Задание: Написать программу, которая запрашивает с клавиатуры два
целых числа, и, поменяв их местами, выводит на экран.
Program MyFirst;
uses crt; {Модуль в котором содержится функция clrscr}
var
a, b, c: integer;
procedure swap(x, y: integer); {Процедура замены}
begin
c := x;
x := y;
y := c;
end;
begin {Основная программа}
clrscr; {Очистка экрана}
write('a = '); {Вывод на экран того, что содержится в кавычках}
readln(a); {Считывает с клавиатуры число и записывает в a}
write('b = ');
readln(b);
swap(a, b); {Меняет значения переменных местами}
writeln('a = ', a); {Выводит на экран а = и её значение}
writeln('b = ', b);
end.
131
Это текст программы. Его набирают в окне редактирования программы. Для
этого нам необходимо открыть это окно:
1. Откройте меню File. {Удерживая ALT нажмите первую букву нужного
вам меню. В данном случае букву F}
2. С помощью клавиш управления курсором (стрелки) выберите пункт
New.
3. Нажмите Enter
Если вы сделали всё верно, то экран должен выглядеть как на рис.№2.
Наберите текст программы. Нет ли у нас каких-либо ошибок? Проверить это
нам поможет компиляция (сборка программы). Запуск на компиляцию
производится с помощью “горячего ключа” – ALT + F9. Такая запись
означает, удерживая ALT нажать F9.
Если всё правильно, то вы увидите такое сообщение:
Рис.4. Вид окна при удачной компиляции программы.
Теперь уже можно запускать и на выполнение:
Запустите программу: CTRL + F9.
На запрос (а = ) введите 1 и нажмите Enter, (т.е. a = 1).
На запрос (b = ) введите 2 и нажмите Enter, (т.е. b = 2).
Ответ будет таким:
a=1
b=2
Просмотреть ответ можно, нажав: ALT + F5. Вернутся обратно к
программе позволяет нажатие любой клавиши, например, пробел.
132
Что же случилось? Вроде программа написана без ошибок, а ответ не тот.
Скорее всего мы допустили ошибку которую не “увидел” компилятор. Как
найти такую ошибку?
Для нахождения ошибок, т.е. отладки программы, нам поможет меню
Debug. Зайдите в это меню (ALT + D). Выберите Add Watch…(добавить
просмотр…) В открывшемся диалоговом окне введите a нажмите Enter.
Таким
же образом добавьте ещё b, x, y, c. У вас теперь два окна Окно
редактирования
программы и Окно Просмотра. Если на экране не видно Окна Просмотра, то
войдите в меню Window(ALT + W). Выберите Tile.
Если всё готово, приступим к отладке.
Нажмите F7. Появится линия отладки, она показывает, какая строчка
будет выполняться. Нажимайте её пока вы не достигнете процедуры Swap.
Теперь внимательно смотрите за переменными в Окне Просмотра. Можно
заметить, что переменные x, y изменяются, а переменные a, b остались без
изменения. Т.е. формальные параметры изменились, а фактические – нет.
Чтобы при изменении формальных параметров изменялись и фактические,
необходимо в функции вместо Swap(x, y: integer) записать Swap(var x, y:
integer).
Если у вас в Окне редактирования программы видна линия отладки
нажмите CTRL + F2. И вновь, нажимая F7 просмотрите за изменениями в
Окне
просмотра. Теперь вы увидите, что значения переменных a и b изменились.
Вот теперь наша программа работает верно!
Дополнения.
Переключение между окнами осуществляется следующим образом:
ALT+#, где # - номер окна.(см. рис.№2)
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ
1. Прогоните программу еще раз, предварительно удалив строку clrscr.
2. Попробуйте удалить комментарии к выводу и прогнать программу.
3. В новом окне редактирования наберите следующий код программы:
Program MyProgram;
uses crt; var
a, b, c: integer;
begin {Основная программа}
clrscr; {Очистка экрана}
write('a = '); {Вывод на экран того, что содержится в кавычках}
readln(a); {Считывает с клавиатуры число и записывает в a}
write('b = ');
readln(b);
c:=a+b;
writeln('c = ', c);
end.
4. Выполните программу, предварительно откомпилировав.
5. Попробуйте модифицировать программу.
133
Форма отчета о выполнении лабораторной работы.
Отчет должен содержать:
1. Знание назначения и структуры окон среды
программирования;
2. Знание комбинации клавиш для работы в среде;
3. Результат выполнения модифицированной программы.
Блиц-тест.
1. Для перехода из состояния редактирования к выбору из главного меню, в
среде Паскаль используется клавиша (или комбинация клавиш):
а) F 10, б) Alt + F5, в) Alt + F3, г) F6 д) F5
2. Какая из перечисленных опций меню EDIT среды Паскаль не связана с
содержимым буфера обмена Clipboard?
а)Clear; б) Cut; в) Copy; г)Paste; д) Show Clipboard.
3. Какая из перечисленных ниже опций меню RUN интегрированной среды
Паскаль начинает или продолжает пошаговое прослеживание работы
программы с прослеживанием работы вызываемых процедур и функций?
а) TRACE INTO; б) GO TO CURSOR; в) STEP OVER; г) PARAMETERS; д)
PROGRAM RESET;
Контрольные вопросы.
1. Для чего предназначена компиляция программы?
2. В чем суть команды, вызываемой комбинацией клавиш Ctrl+F9?
3. Как создать новое окно редактирования?
Литература.
1. Бурин Е.А. «Программирование на языке Турбо-Паскаль», Учебное
пособие, Алматы, АГУ,2000
2. А.М. Епанешников, В.А. Епанешников Программирование в среде Turbo
Pascal 7.0, Москва, Диалог-МИФИ, 1998
3. Абрамов С.А., Зима Е.В. «Начало программирования на языке Паскаль»,
М., Наука,1987
Лабораторная работа №2.
ОСНОВНЫЕ ОПЕРАТОРЫ ЯЗЫКА ПАСКАЛЬ. ОРГАНИЗАЦИЯ
ПРОГРАММ.
Цель: привитие навыков работы по составлению простейших программ на
языке Паскаль
Материалы и оборудование: ПК, среда Turbo Pascal, методические указания к
лабораторным работам.
Содержание и порядок выполнения работы:
1. Повторить теоретический материал по данной теме.
Программа, написанная на языке ТР, состоит из заголовка программы,
блока программы и знака «.» (точка). В заголовке определяют имя
программы.
Блок состоит из декларативной и исполняемой частей. Заголовок и
декларативная часть могут быть опущены.
134
Заголовок программы: служебное слово PROGRAM , за которым следует
идентификатор.
Например: PROGRAM MyProg_1;
В декларативной части определяются типы, имена констант,
определяются и описываются подпрограммы, описываются метки и
переменные. Все декларации могут следовать в произвольном порядке. В
ранних версиях Паскаля требовалось соблюдение такого порядка
деклараций:
метки, константы, типы, переменные, процедуры и функции.
Исполняемая часть (тело программы) начинается служебным словом
BEGIN, за которым следуют операторы программы и служебное слово END
со
знаком точка.
ОПИСАНИЕ МЕТОК: Label список_меток;
ОПРЕДЕЛЕНИЕ ИМЕН КОНСТАНТ: Const имя_константы = значение;
Зарезервированы следующие имена констант:
Pi – типа real, представляющая константу 3.141592…
MaxInt - типа integer, представляющая константу 32767.
ОПРЕДЕЛЕНИЕ ТИПОВ: Type имя_типа = значение;
ОПИСАНИЕ ПЕРЕМЕННЫХ: Var имя_переменной : тип;
2. Разобрать пример выполнения работы:
А) Получить результат нижеприведенной программы; обратить внимание на
работу каждого оператора.
PROGRAM PRIM;
VAR A,B,P,S: REAL;
BEGIN
READ (A,B);
P:=SQRT (A*B);
S:=(A+B)/2;
WRITELN ('P=',P);
WRITELN ('S=',S)
END.
Примечание: Не забудьте ввести числовые значения переменных А, В (ввод
осуществляется после запуска программы на выполнение, т.е. после нажатия
комбинации клавиш Ctrl+F9 или выбора команды Run из главного меню).
Б) Составьте программу вычисления значения выражения a x 2 3ab
b 5
Program my_prog;
Uses crt;
Var a, b, x, y: real;
Begin
Clrscr;
Write(‘Введите значение переменной a=’);
Readln(a);
Write(‘Введите значение переменной b=’);
Readln(b);
135
3
1
Write(‘Введите значение переменной x=’);
Readln(x);
Y:=a/(b+5)-sqrt(sqr(x)+3*a*b);
Writeln(‘y=’,y);
End.
В) Правильно ли составлена программа? Исправьте ошибку.
PROGRAM PR2;
VAR X: REAL;
BEGIN
X:=Y/A;
WRITE(X)
END.
Г) Какая ошибка допущена в написании оператора присваивания. Исправьте
ошибку.
PROGRAM PR3;
VAR A,B : REAL;
BEGIN
READ (A);
SIN(A):=B;
WRITE(B)
END.
3. Внимательно прочитать условие задачи.
4. Составить алгоритм решения задачи согласно варианта.
5. Реализовать алгоритм на языке Turbo Pascal.
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ
Составьте программу вычисления значения выражения
1. b b 4ac
2
2a
sin 2 ( x ) cos2 ( x) 2. cos x sin x e ln x
x y
sin
2
sin 2 ( x y ) 3. x
x 2x (1 x 2 y 2 )
4. p ( p a ) 2 ( p b )( p c )2
5. a
1
1
c a 2d
11
b c 2b
df
136
2
1
6.
(ax b)2 x c x d x e
y z
7.
1
x
x
1y 23
1 sin 2 (x y) 8. xy
2 cos x 2
9. (a b)(a c)2 e x 1
x 10.
sin(x 2 ) cos2 ( )
x y
2
2
11. tg 2
x 1
2 cos(x
/6)
5
nx
ln x
x
1
2
12
sin y
2
xyz 3. 3 x 4 y
12.
107 lg 4
13. e x y ln(1 e ) log2 tg 2
14. 2 3 1 tg(x 1) sin (x 1) cos(x 1) 3
15. 3 x 1 3 log x
x 3
Форма отчета о выполнении лабораторной работы.
Отчет должен содержать:
1. Алгоритм решения задачи;
2. Программу реализации алгоритма;
3. Результат выполнения программы.
Блиц-тест.
1. Комментарий языка Паскаль – это:
а) пояснения к программе, не влияющие на процесс выполнения программы.
б) текст программы. в) названия операторов. г) пояснения к программе,
влияющие на процесс выполнения программы. д) название стандарттных
идентификаторов.
2. Служебные слова используемых для обозначения меток:
а) label. б) const. в) var. Г) function. д) type.
3. Чему будут равны значения переменных а и b после выполнения
операторов
присваивания a:=trunc(5.8); b:=round(5.8)?:
а) а=5, b=6. б) а=-6, b=5. в) а=6, b=5. г) а=6, b=-5. д)
а=5, b=5.
Контрольные вопросы.
1. Из каких двух частей состоит программа?
2. Какова основная структура программы, написанной на языке Паскаль?
3. Каково назначение процедур write и writeln?
137
4. Может ли быть пустым список ввода?
5. Сколько процедур read может быть в программе?
Глоссарий.
Тип данных определяет:
Формат представления в памяти компьютера
Множество допустимых значений, которые может принимать
принадлежащая к
выбранному типу переменная или константа
Множество допустимых операций, применимых к этому типу.
Основные (интересующие нас) типы данных в Паскале:
Целочисленные типы (ShortInt, Integer, LongInt, Byte, Word);
Логический тип (Boolean);
Символьный тип (Char);
Вещественный тип (Real, Single, Double, Extended, Comp).
Идентификатор - имя любого элемента программы, которое может
включать буквы, цифры и символ подчеркивания. Пробел использовать в
идентификаторе нельзя, т.е. он всегда должен записываться слитно.
Желательно, чтобы идентификатор нес определенную смысловую
информацию
об элементе программы, который он описывает. Длина идентификатора
может
быть любой, но значимыми являются только первые 63 символа, и по этим
символам все они должны быть уникальными.
Разделители используются для отделения друг от друга
идентификаторов, чисел, зарезервированных слов. В качестве разделителей
можно применять: пробел; любой управляющий символ (с кодами от 0 до
31),
включая символ возврата каретки; комментарий.
Комментарии заключаются либо в скобки { }, либо в скобки вида (* *) и
могут занимать любое число строк.
Выражения – это группы слов, имеющие смысл в данном языке.
Выражения представляются формулами вычисления значений некоторой
переменной. Могут быть арифметическими, логическими. Записываются по
определенным правилам, которые задаются с учетом приоритета операций, а
также с учетом типа получаемого результата от типа исходных данных.
Оператор – это описание действий, которые будут выполнены при
реализации алгоритма.
Оператор присваивания: переменная:= значение (или выражение);
Оператор ввода: read(список ввода); readln(список ввода);
Оператор вывода: write(список вывода); writeln(список вывода);
Литература.
1. Фаронов В.В. «Turbo Pascal 7.0», М., Издательство «Нолидж», 1997
2. Марченко А.И. «Программирование в среде Turbo Pascal 7.0» Учебное
пособие, Киев, «Век+»,1998
3. Бурин Е.А. «Программирование на языке Турбо-Паскаль», Учебное
пособие, Алматы, АГУ,2000
4. Немнюгин С.А. TURBO PASCAL, СПб, Питер, 2000
5. Попов В.Г. . «Turbo Pascal 7.0», М., Финансы и статистика, 1998
138
6. Абрамов С.А., Зима Е.В. «Начало программирования на языке Паскаль»,
М., Наука,1987
7. Программирование на языке Паскаль./Под редакцией УСКОВОЙ О.Ф. –
СПб, Питер, 2002
Лабораторная работа №3.
РАЗВЕТВЛЯЮЩИЕСЯ АЛГОРИТМЫ. УСЛОВНЫЙ И СОСТАВНОЙ
ОПЕРАТОР.
Цель: Привить навыки реализации разветвляющихся алгоритмов на языке
Паскаль.
Материалы и оборудование: ПК, среда Turbo Pascal, методические указания к
лабораторным работам.
Содержание и порядок выполнения работы:
1. Повторить теоретический материал по данной теме.
Разветвляющиеся алгоритмы реализуются с помощью структуры развилка
(рис.5.). Эта структура, называемая также ЕСЛИ-ТО-ИНАЧЕ, служит для
выбора одной из двух альтернатив.
развилка
Р
a
b
+
Рис.5. Структура
Сначала вычисляется логическое выражение р – оно может быть либо
отдельной переменной, принимающей значение вида «истина-ложь», «данет» и
т.п., либо комбинацией таких переменных, объединенных в выражения.
Другими словами, указанное выражение должно быть приведено к условию
типа «истина-ложь». Если выражение истинно (+), то выполняется действие
а,
если ложно (-) – действие b. Направление, по которому идет ход вычислений
в
зависимости выполнения логического условия называется ветвью алгоритма.
В
каждом конкретном случае по результатам проверки логического условия
реализуется только одна ветвь алгоритма.
Внутри структуры ЕСЛИ-ТО-ИНАЧЕ можно снова употреблять
структуру ЕСЛИ-ТО- ИНАЧЕ (рис.6.).
139
А=С
х=1
А=В х=3
х=2
+
+
Рис.6. Вложенные структуры
Глубина вложенности не должна быть большой, иначе программа станет
трудно читаемой.
Обобщением развилки является структура ВЫБОР. Она полезна, когда
желательно с помощью одной проверки выбрать одну из нескольких
альтернатив.
2. Разобрать пример выполнения работы:
А) Определить какой процесс осуществлен и обратить внимание на работу
каждого оператора.
Program EXAMPLE;
var x, y: real;
begin
read (x);
if x > 0 then y := ln(x) else y := cos(x);
write ('y = ', y);
end.
Б) Объяснить выполнение процесса, если по условию выполняется несколько
операторов:
Program chpr;
var x,y,z: real;
begin
read (x,y);
if x>y then begin z:=x*x; y:=-y end
else begin z:=y*y; x:=-x end;
write ('z=', z, 'x= ', x, 'y= ', y);
end.
В) Какой результат будет получен в результате выполнения следующей
программы?
Program UROK;
var n: integer;
begin
read (n);
140
case n of (* нач. опер. выб. *)
1: writeln ('МАТЕМАТИКА');
2: writeln ('ИНФОРМАТИКА');
3: writeln ('ФИЗИКА');
4: writeln ('ИСТОРИЯ');
5: writeln ('другой');
end;
end.
3. Внимательно прочитать условие задачи.
4. Составить алгоритм решения задачи согласно варианта.
5. Реализовать алгоритм на языке Turbo Pascal.
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ
1. Дано двузначное число. Определить какая из его цифр больше, первая
или вторая.
2. Дано двузначное число. Определить, равен ли квадрат этого числа
учетверенной сумме кубов его цифр. Например, для числа 48 ответ
положительный, для числа 52- отрицательный.
3. Дано двузначное число. Определить, является ли сумма его цифр
двузначным числом.
4. Дано двузначное число. Определить, кратна ли сумма его цифр числу а.
5. Дано трехзначное число. Верно ли, что все его цифры одинаковые?
6. Проверить, принадлежит ли число, введенное с клавиатуры, интервалу (5,
3).
7. Определить, является ли треугольник со сторонами a, b,
равнобедренным.
8. Даны два числа. Если квадратный корень из второго числа меньше
первого, то увеличить второе число в пять раз.
9. Даны три числа. Вывести на экран те из них, которые являются четными.
10.Даны три вещественных числа. Возвести в квадрат те их них, значения
которых неотрицательны.
11.Даны четыре вещественных числа. Найти сумму тех из них, которые
больше пяти.
12.Даны четыре целых числа. Определить сумму тех из них, которые кратны
трем.
13.Определить максимальное и минимальное значения из трех различных
вещественных чисел.
14.Составить программу нахождения суммы двух наибольших из трех
различных чисел.
15.Дано трехзначное число. Определить, входит ли в него цифра n.
141
c
Форма отчета о выполнении лабораторной работы.
Отчет должен содержать:
1. Алгоритм решения задачи;
2. Программу реализации алгоритма;
3. Результат выполнения программы.
Блиц-тест.
1. Какой результат выполнения выражений в ТР неправильный:
а) (3>2) AND (5>6)=true; б) NOT (30>10)=False; в) (70>60) OR (100>90)=true;
г) (‘a’<’b’) XOR (1>0)=False; д) (15<2) AND (7>3)=False.
2. Оператор безусловного перехода применяется тогда, когда:
а) после выполнения некоторого оператора надо выполнить не следующий по
порядку, а какой-либо другой оператор. б) не нужно выполнять каких-либо
действий. в) нужно выбрать один из нескольких операторов. г) нужно
вызвать
процедуру. д) нужно неоднократно выполнять одни и те же действия.
3. Условные операторы предназначены для:
а) Выбора к исполнению одного из возможных действий в зависимости от
некоторого условия. б) Вызова процедуры. в) Повторения одних и тех же
действий. г) Перехода к концу программы. д) Вычисления арифметического
выражения.
Контрольные вопросы.
1. Какова основная структура написания условного оператора? Какие
существуют виды условных операторов?
2. Как реализуются составные условия на языке ПАСКАЛЬ?
3. Какова основная структура написания оператора выбора и как он
работает?
4. Какие операторы входят в состав разветвляющихся программ?
5. В каких случаях в программе используется неполный условный оператор?
Глоссарий.
Условный оператор состоит из ключевого слова if, после которого идет
логическое выражение, ключевое слово then и оператор. После оператора
может следовать ключевое слово else и снова оператор.
Если оператор, заключенный в условном операторе if, также является
условным, то в нем должно быть ключевое слово else.
IF УСЛОВИЕ THEN СЕРИЯ_1 ELSE СЕРИЯ_2;
Оператор выбора является обобщением условного оператора для случая
нескольких альтернатив. Оператор состоит из ключевого слова CASE, после
которого идет индекс варианта, ключевое слово OF, список оператор выбора,
каждому из которых предшествует метка выбора, а после него ключевое
слово
END.
CASE ИНДЕКС_ВАРИАНТА OF
МЕТКА1: ОПЕРАТОР1;
МЕТКА2: ОПЕРАТОР2;
МЕТКА3: ОПЕРАТОР3;
…
МЕТКАN: ОПЕРАТОРN;
142
END;
Литература.
1. Фаронов В.В. «Turbo Pascal 7.0», М., Издательство «Нолидж», 1997
2. Марченко А.И. «Программирование в среде Turbo Pascal 7.0» Учебное
пособие, Киев, «Век+»,1998
3. Бурин Е.А. «Программирование на языке Турбо-Паскаль», Учебное
пособие, Алматы, АГУ,2000
4. Немнюгин С.А. TURBO PASCAL, СПб, Питер, 2000
5. Попов В.Г. . «Turbo Pascal 7.0», М., Финансы и статистика, 1998
6. Абрамов С.А., Зима Е.В. «Начало программирования на языке Паскаль»,
М., Наука,1987
7. Программирование на языке Паскаль./Под редакцией УСКОВОЙ О.Ф. –
СПб, Питер, 2002
Лабораторная работа №4.
ОПЕРАТОРЫ ЦИКЛА (ЦИКЛ-ПОКА, ЦИКЛ-ДО, ЦИКЛ С
ПАРАМЕТРОМ).
Цель: привить навыки построения циклических программ, используя
операторы цикла.
Материалы и оборудование: ПК, среда Turbo Pascal, методические указания к
лабораторным работам.
Содержание и порядок выполнения работы:
1. Повторить теоретический материал по данной теме.
Алгоритм циклического типа, если в последовательности команд,
описывающей алгоритм решения задачи, есть команда(ы) выполняющиеся
повторно. Часто такой алгоритм называют, просто, циклом.
Тело цикла составляют действия (операции), выполняющиеся повторно.
Собственно говоря, для повторного выполнения тела цикла и организуется
цикл.
Цикл называется сложным, если его тело содержит внутренний цикл,
который называется вложенным циклом.
Цикл называется простым, если его тело не содержит внутреннего цикла.
Эквивалентным понятием сложности цикла является понятие кратности
цикла. Простой цикл называют однократным. Цикл двукратный, если есть
вложенный цикл. И цикл трехкратный, если во внутренний цикл вложен еще
цикл. Кратность цикла определяется уровнем последнего вложенного цикла.
Операторы цикла с параметром используются для организации
повторяющегося выполнения. Такие циклы удобны в тех случаях, когда, вопервых, заранее известно число повторений и, во-вторых, когда необходимо
некоторым образом использовать в теле цикла информацию о номере
очередного повторения.
Цикл с предусловием называют циклом WHILE.
Оператор WHILE выполняется по следующему алгоритму;
4. Определяется значение выражения.
5. Если это значение false, то выполнение оператора считается законченным.
143
6. Если получено значение true, то выполняется оператор, следующий после
ключевого слова do, а потом описанные действия повторяются сначала.
Цикл с постусловием называют циклом REPEAT.
Оператор REPEAT выполняется по следующему алгоритму;
5. Выполняются операторы, идущие после ключевого слова repeat.
6. Определяется значение выражения после ключевого слова until.
7. Если это значение true, то выполнение оператора считается законченным.
8. Если получено значение false, то описанные действия повторяются
сначала.
Циклы с постусловием также задают повторяющееся выполнение
операторов. Однако решение о продолжении цикла принимается после
очередной итерации, а не перед ней, как в циклах с предусловием. Это
гарантирует хотя бы однократное выполнение операторов тела цикла.
2. Разобрать пример выполнения работы:
А) Обратите внимание на выполнение оператора цикла, получите результаты.
Program sum;
var x,y: real;
begin
x:=1;
while x<=20 dо
begin
y:=sqr(x)+15;
write ('y= ', y);
x:=x+1;
end
end.
Б) Объяснить работу следующей программы:
Program prim;
var i, r: integer;
begin
for i:=10 to 50 do
begin
r:=i mod 7;
if (r=5) or (r=2) then write ('i= 'i);
end
end.
В) Обратить внимание на организацию вложенного цикла. Определить
результаты.
Program pifagor;
var i, j, p : integer;
begin
for i:=1 to 9 dо
begin
writeln;
for j:=1 to 9 dо
144
145
begin
p:=i*j;
write (p:3);
end;
end;
end.
3. Внимательно прочитать условие задачи.
4. Составить алгоритм решения задачи согласно варианта.
5. Реализовать алгоритм на языке Turbo Pascal.
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ
Дано действительное x (для заданий 1-3). В заданиях 1-6 вычислить
приближенное значение суммы бесконечного ряда, до тех пор, пока
очередное
cлагаемое не станет <E (наименьшее число).
1) 1
23
23
x
xx
x ...
2) 1
23
23
x
xx
x ...
3) 1
35
35
x
xx
x ...
4) 1
1
2
1
3
1
2 2 42
...
5) 1
1
2
1
3
1
4
...
6) 1 1
3
1
5
1
7
...
7) Дано действительное b>0. Последовательность a a 1 2 , ,... образована по
следующему закону: a a a i 1 i i 1
1 2 1 2 3 , ( , ,...) .
Требуется получить все ai, меньшие или равные числу b.
8) Дано действительное число b>0. Последовательность a a 1 2 , ,...
образована по
следующему закону: a b a a
i
i1ii1
1
2 3 , ( , ,...) .
Найти первый отрицательный член последовательности a a 1 2 , ,...
9) Дано действительное число b<0. Последовательность a a 1 2 , ,...
образована по
следующему закону: a b a a i i i 1 i i 1
1 2 2 3 , ( ) / ( sin )( , ,...) .
Найти первые десять членов последовательности.
В заданиях 10-11 вычислить произведения первых N cлагаемых.
10) x x x
1! 2 3
,
!
,
!
, ... .
146
11) x x x x
3! 5 7 9
,
!
,
!
,
!
, ....
Пусть даны натуральное число n и вещественное число x. Вычислить
значения
выражений (в заданиях 12-15):
12) sin x+ sin2x+ …+sinnx.
13) sin x+ sin x2 +…+ sin xn.
14) (1+sin x)(1+sin 2x)…(1+sin nx).
15) 1!+2!+3!+…+n!.
Форма отчета о выполнении лабораторной работы.
Отчет должен содержать:
1. Алгоритм решения задачи;
2. Программу реализации алгоритма;
3. Результат выполнения программы.
Блиц-тест.
1. Оператор repeat также называют:
а) оператором цикла с постусловием; б) оператором цикла с предусловием; в)
условным оператором; г) оператором цикла с параметром; д) оператором
безусловного перехода.
2. Оператор for также называют:
а) оператором цикла с параметром; б) оператором цикла с предусловием; в)
условным оператором; г) оператором безусловного перехода; д) оператором
цикла с постусловием.
3. Сколько раз выполнится цикл I:=0; Repeat I:=I+1; Until (I=10);
а) 10 б) 11 в) 9 г) 0 д) 1.
Контрольные вопросы.
1. В каком случае используются операторы цикла?
2. Какие существуют способы организации циклов в ПАСКАЛЕ?
3. Как работает оператор цикла с параметром?
4. В чем состоит различие между операторами цикла - пока и цикла -до?
5. В каком случае удобно использовать оператор цикла с параметром?
Глоссарий.
ЦИКЛ С ПАРАМЕТРОМ
Оператор состоит из ключевого слова for, после которого следует
идентификатор параметра цикла, символ присваивания, выражение,
определяющее начальное значение параметра цикла, ключевое слово to или
downto, ключевое слово do и любой оператор:
FOR переменная:= нач_значение_A TO конечное_значение_B DO оператор;
FOR переменная:= нач_значение_A DOWNTO кон_значение_B DO оператор;
ЦИКЛ WHILE
Оператор состоит из ключевого слова while, после которого выражение
типа boolean, ключевое слово do и любой оператор:
147
WHILE ВЫРАЖЕНИЕ DO ОПЕРАТОР;
ЦИКЛ REPEAT
Оператор состоит из ключевого слова repeat, после которого следует
любой оператор, ключевое слово until и выражение типа boolean:
REPEAT ОПЕРАТОР UNTIL ВЫРАЖЕНИЕ;
Процедура BREAK прекращает выполнение ближайшего охватывающего
цикла. Управление передается на оператор, следующий за данным циклом.
Процедура CONTINUE вызывает прекращение текущей итерации
(выполнения) ближайшего охватывающего цикла и переход к анализу конца
цикла и выполнению следующей итерации.
Литература.
1. Фаронов В.В. «Turbo Pascal 7.0», М., Издательство «Нолидж», 1997
2. Марченко А.И. «Программирование в среде Turbo Pascal 7.0» Учебное
пособие, Киев, «Век+»,1998
3. Бурин Е.А. «Программирование на языке Турбо-Паскаль», Учебное
пособие, Алматы, АГУ,2000
4. Немнюгин С.А. TURBO PASCAL, СПб, Питер, 2000
5. Попов В.Г. . «Turbo Pascal 7.0», М., Финансы и статистика, 1998
6. Абрамов С.А., Зима Е.В. «Начало программирования на языке
Паскаль», М., Наука,1987
7. Программирование на языке Паскаль./Под редакцией УСКОВОЙ О.Ф.
–СПб, Питер, 2002
Лабораторная работа №5.
ОБРАБОТКА ОДНОМЕРНЫХ МАССИВОВ.
Цель: овладение практическими навыками работы с массивами,
особенностями их ввода и вывода, приобретение дальнейших навыков по
организации программ циклической структуры с использованием приемов
программирования.
Материалы и оборудование: ПК, среда Turbo Pascal, методические указания к
лабораторным работам.
Содержание и порядок выполнения работы:
1. Повторить теоретический материал по данной теме.
В общем случае массив – это структурированный тип данных, состоящий
из фиксированного числа элементов, имеющих один и тот же тип.
Название регулярный тип (или ряды) массивы получили за то, что в них
объединены однотипные (логически однородные) элементы, упорядоченные
(урегулированные) по индексам, определяющим положение каждого
элемента
в массиве.
Элементами массива могут быть данные любого типа, включая
структурированные. Тип элементов массива называется базовым.
Особенностью языка Паскаль является то, что число элементов массива
фиксируется при описании и в процессе выполнения программы не меняется.
Элементы, образующие массив, упорядочены таким образом, что
каждому элементу соответствует совокупность номеров (индексов),
148
определяющих его местоположение в общей последовательности. Доступ к
каждому отдельному элементу осуществляется путем индексирования
элементов массива. Индексом может быть произвольное выражение
порядкового типа, заключенное в квадратные скобки. Допустимый диапазон
индексов определяется в описании массива. Если в описании массива задан
один индекс, массив называется одномерным. Одномерный массив
соответствует понятию линейной таблицы (вектора). Одномерные массивы
обычно используются для представления векторов.
Для работы с массивами как единым целым используется идентификатор
массива без указания индекса в квадратных скобках. Массив может
участвовать
только в операциях «равно», «не равно» и в операторах присваивания.
Массивы, участвующие в этих действиях должны быть идентичны по
структуре, т.е. иметь одинаковые типы индексов и одинаковые типы
компонентов.
Элементы массива могут стоять как в левой части оператора
присваивания, так и в выражениях. Над элементами массива можно
производить те же операции, которые допустимы для данных его базового
типа.
Если базовый тип есть integer, то допустимы все операции над данными
целого
типа, включая и стандартные функции.
2. Разобрать пример выполнения работы:
Найти наибольший элемент массива A1, ....,An и его порядковый номер
(n<=30).
Алгоритм выполнения примера. При выполнении задания необходимо
использовать
прием нахождения наибольшего. Для этого перед циклом следует задать
начальное
значение наибольшего, равное первому элементу массива; в том случае, если
текущий
элемент больше наибольшего и предыдущих, то считать его наибольшим.
Для
нахождения порядкового номера наибольшего элемента массива необходимо
перед
циклом задать его начальное значение, равное 1, а в цикле всякий раз, когда
текущий
элемент массива больше наибольшего, считать номером наибольшего номер
текущего
элемента массива.
Program max_element;
uses crt;
const n=10;
a=array[1..n] of integer=(5, 7, 9, 3, -8, -74, 6, -23, 0, 4 );
var i, max, nom_max : integer;
begin
clrscr;
max:=a[1]; nom_max:=1;
for i:=2 to 10 dо
if a[i]>max then begin max:=a[i]; nom_max:=i end;
writeln(‘max=’, max:4, ‘nom_max=’, nom_max)
end.
3. Внимательно прочитать условие задачи.
4. Составить алгоритм решения задачи согласно варианта.
5. Реализовать алгоритм на языке Turbo Pascal.
149
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ
1. Вычислить сумму и количество элементов массива Х, удовлетворяющих
условию 0<=Xi.
2. Вычислить среднее арифметическое значение элементов массива А.
3. Переписать элементы массива Х, удовлетворяющие условию -1<=Xi<=1, в
массив Y и подсчитать их количество.
4. Определить максимальный среди отрицательных элементов элемент
массива В и его порядковый номер.
5. Определить минимальный элемент массива С и его порядковый номер.
6. Найти максимальный и минимальный элемент массива, и поменять их
местами.
7. Вычислить среднее геометрическое элементов массива Y. (Yi>0)
8. Расположить в массиве R сначала положительные, а затем отрицательные
элементы массива Z.
9. Определить сумму элементов массива N, кратных трем.
10. Вычислить сумму и количество элементов массива Х, удовлетворяющих
условию 0<Xi<25.
11. Вычислить среднее арифметическое значение элементов массива,
больших
10.
12. Изменить знак у максимального по модулю элемента массива.
Минимальный элемент массива при этом не определять.
13. Переписать в массив Y положительные элементы, а в массив Z
отрицательные элементы массива Х.
14. Верно ли, что сумма элементов массива, которые больше 20, превышает
100.
15. Верно ли, что количество максимальных элементов не превышает пяти.
Форма отчета о выполнении лабораторной работы.
Отчет должен содержать:
1. Алгоритм решения задачи;
2. Программу реализации алгоритма;
3. Результат выполнения программы.
Блиц-тест.
1. Переменная, имеющая тип ARRAY, - это
а) совокупность ограниченного количества компонентов одного и того же
типа;
б) запись; в) процедура; г) совокупность элементов различного типа; д)
совокупность неограниченного множества компонентов одного и того же
типа;
2. Что будет напечатано следующей программой:
var a: array [1..3] of integer; i,s: integer;
begin
s:=0;
for i:=1 to 3 do
begin a[i]:=i+1; s:=s+a[i] end;
writeln (s)
end.
150
а) 0 ; б) 6; в) 9 ; г) 4 ; д)10.
3. Служебное слово, используемое при описании массива:
а) integer б) const в) array г) record д) string
Контрольные вопросы.
1. В чем состоит особенность организации цикла при обработке массивов?
2. Указать особенности ввода и вывода элементов массивов.
3. Как в программе использовать значение конкретного элемента
одномерного
массива?
4. Как называется номер элемента одномерного массива?
5. Существуют ли ограничения на размерность массива?
Глоссарий.
Массив – это структурированный тип данных, состоящий из
фиксированного числа элементов, имеющих один и тот же тип.
В разделе описания переменных форма описания имеет вид:
VAR ИМЯ_МАССИВА: ARRAY [нач_индекс..кон_индекс] OF тип_данных;
Описание в разделе типов:
Сначала в разделе описания типов указывается тип массива. Затем в
разделе описания переменных перечисляются массивы, относящиеся к
указанному типу.
TYPE имя_типа = ARRAY[нач_индекс..кон_индекс] OF тип_данных;
VAR имя_массива: имя_типа;
После объявления массива каждый его элемент можно обрабатывать, указав
идентификатор (имя) массива и индекс элемента в квадратных скобках.
Индексированные элементы массива называется индексированными
переменными, и могут быть использованы так же, как и простые переменные.
Например, они могут находиться в выражениях в качестве операторов,
использоваться в операторах for, while, repeat, входить в качестве параметров
в
операторы read, readln, write, writeln; им можно присваивать любые значения,
соответствующие их типу.
Литература.
1. Фаронов В.В. «Turbo Pascal 7.0», М., Издательство «Нолидж», 1997
2. Марченко А.И. «Программирование в среде Turbo Pascal 7.0» Учебное
пособие, Киев, «Век+»,1998
3. Бурин Е.А. «Программирование на языке Турбо-Паскаль», Учебное
пособие, Алматы, АГУ,2000
4. Немнюгин С.А. TURBO PASCAL, СПб, Питер, 2000
5. Попов В.Г. . «Turbo Pascal 7.0», М., Финансы и статистика, 1998
6. Абрамов С.А., Зима Е.В. «Начало программирования на языке Паскаль»,
М., Наука,1987
7. Программирование на языке Паскаль./Под редакцией УСКОВОЙ О.Ф. –
СПб, Питер, 2002
151
Лабораторная работа №6.
ОБРАБОТКА МАТРИЦ.
Цель: овладение навыками алгоритмизации и программирования структур с
вложенными циклами, навыками использования приемов программирования
во
вложенных циклах, способами ввода и вывода матриц.
Материалы и оборудование: ПК, среда Turbo Pascal, методические указания к
лабораторным работам.
Содержание и порядок выполнения работы:
1. Повторить теоретический материал по данной теме.
Массивы представляют собой ограниченную упорядоченную совокупность
однотипных величин. Каждая отдельная величина называется компонентой
массива. Тип компонент может быть любым, принятым в языке ПАСКАЛЬ,
кроме файлового типа. Тип компонент называется базовым типом.
Вся совокупность компонент определяется одним именем. Для обозначения
отдельных компонент используется конструкция, называемая переменной с
индексом или с индексами:
A[5] S[k+1] B[3,5].
В качестве индекса может быть использовано выражение. Тип индексов
может
быть только интервальным или перечисляемым. Действительный и целый
типы недопустимы. Индексы интервального типа, для которого базовым
является целый тип, могут принимать отрицательные, нулевые и
положительные значения.
2. Разобрать пример выполнения работы:
Вычислить сумму элементов каждой строки двумерного массива.
Var
A: array [1..5,1..5] of real; s: real; i,j: byte;
Begin
Writeln(‘Введите матрицу ’);
For i:=1 to 5 do
For j:=1 to 5 do
Read(a[i,j]);
For i:=1 to 5 do begin
S:=0;
For j:=1 to 5 do
s:=s+a[i,j];
Writeln(‘сумма элементов’,i, ‘строки равна ’, s);
End;
Readln;
End.
3. Внимательно прочитать условие задачи.
4. Составить алгоритм решения задачи согласно варианта.
5. Реализовать алгоритм на языке Turbo Pascal.
152
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ
1. Вычислить и запомнить сумму и число положительных элементов каждого
столбца матрицы А(10,15). Результат отпечатать в виде двух строк.
2. Вычислить и запомнить сумму и число положительных элементов каждой
строки матрицы A(N,M). Результат отпечатать в виде двух столбцов.
3. Вычислить сумму и число элементов матрицы B(N,N), находящихся под
главной диагональю и на ней.
4. Вычислить сумму и число положительных элементов матрицы B(N,N),
находящихся под побочной диагональю.
5. Записать на место отрицательных элементов матрицы D(K,K) нули и
вывести
ее на печать в общепринятом виде.
6. Записать на место отрицательных элементов матрицы D(10,10) нули, а на
место положительных - единицы. Вывести на печать нижнюю треугольную
матрицу в общепринятом виде.
7. Найти в каждой строке матрицы максимальный и минимальный элементы
и
поместить их на место первого и последнего элемента строки
соответственно.
Матрицу напечатать в общепринятом виде.
8. Расположить в массиве R сначала положительные, а затем отрицательные
элементы массива F(10,8).
9. Для целочисленной матрицы найти для каждой строки число элементов,
кратных пяти, и наибольший из полученных результатов.
10. В двумерном массиве имеются отрицательные элементы. Определить
координаты самого нижнего и самого правого из них.
11. Найти в каждой строке матрицы наибольший элемент и поменять его
местами с элементом главной диагонали. Отпечатать полученную матрицу в
общепринятом виде.
12. Найти наибольший и наименьший элементы массива R(K,N)и поменять
их
местами.
13. Дан массив S(5,8). Вывести исходные данные в первые 4 строки и 7
столбцов. Вычислить среднее арифметическое значение элементов каждой
строки и записать его в 8-ой столбец, а также среднее арифметическое
каждого столбца и записать его в 5 строку.
14. Найти строку с наибольшей и наименьшей суммой элементов. Вывести на
печать найденные строки и суммы их элементов.
15. Определить сумму тех элементов двумерного массива, сумма индексов
которых кратна трем.
Форма отчета о выполнении лабораторной работы.
Отчет должен содержать:
1. Алгоритм решения задачи;
2. Программу реализации алгоритма;
3. Результат выполнения программы.
Блиц-тест.
1. Квадратной матрицей называется матрица, у которой
А) количество строк и столбцов одинаково
Б) элементы являются полными квадратами
153
В) элементы главной и побочной диагонали равны
Г) квадраты сумм элементов по главной и побочной диагоналям равны
Д) количество строк и столбцов четно
2. Укажите правильное описание двумерного массива
А) Var A: array[1..5,1..4] of real;
Б) Var A: array[1..5;1..4] of real;
В) Var A: array[1..5:1..4] of real;
Г) Var A: array[1:5,1:4] of real;
Д) Var A: array[5, 4] of real;
3. Фрагмент программы
For i:=1 to 4 do begin
S:=0;
For j:=1 to 6 do
S:=s+a[I,j];
End;
А) вычисляет сумму элементов массива А
Б) вычисляет сумму элементов каждой строки массива А
В) вычисляет сумму элементов каждого столбца массива А
Г) вычисляет количество нулевых элементов массива А
Д) обнуляет элементы массива А
Контрольные вопросы.
1. Указать основные правила организации вложенных циклов.
2. Указать способы выхода из внутреннего цикла.
3. Как организовать вывод матрицы в общепринятом виде?
4. Как организовать вывод нижней треугольной матрицы в общепринятом
виде?
5. Как организовать ввод элементов матрицы размером (N,M)?
Глоссарий.
Поскольку элементами массива могут быть массивы, легко сконструировать
дву– и многомерные массивы.
Двумерный массив описывается следующим образом:
В разделе описания переменных форма описания имеет вид:
VAR имя_массива: ARRAY [нач_инд1..кон_инд1, нач_инд2..кон_инд2] OF
базовый_тип;
где инд1 указывает номер строки массива, инд2 указывает номер столбца
массива.
Описание в разделе типов:
TYPE имя_типа = ARRAY[нач_инд1..кон_инд1, нач_инд2..кон_инд2] OF
базовый_тип;
VAR имя_массива: имя_типа;
Литература.
1. Фаронов В.В. «Turbo Pascal 7.0», М., Издательство «Нолидж», 1997
2. Марченко А.И. «Программирование в среде Turbo Pascal 7.0» Учебное
пособие, Киев, «Век+»,1998
154
3. Бурин Е.А. «Программирование на языке Турбо-Паскаль», Учебное
пособие, Алматы, АГУ,2000
4. Немнюгин С.А. TURBO PASCAL, СПб, Питер, 2000
5. Попов В.Г. . «Turbo Pascal 7.0», М., Финансы и статистика, 1998
6. Абрамов С.А., Зима Е.В. «Начало программирования на языке Паскаль»,
М., Наука,1987
7. Программирование на языке Паскаль./Под редакцией УСКОВОЙ О.Ф. –
СПб, Питер, 2002
Лабораторная работа №7.
СТРОКОВЫЙ ТИП.
Цель: овладение практическими навыками работы со строковыми данными,
их
вводом, выводом, обработкой.
Материалы и оборудование: ПК, среда Turbo Pascal, методические указания к
лабораторным работам.
Содержание и порядок выполнения работы:
1. Повторить теоретический материал по данной теме.
Данные строкового типа (тип STRING) позволяют представлять в
программах тексты и производить над ними некоторые редакционные
операции, например, исправлять орфографические ошибки, вставлять,
удалять
отдельные буквы, слова. Кроме того, они дают возможность обрабатывать
различные ведомости, документы, справочники.
Символьная или литерная константа есть любой символ языка,
заключенный в апострофы.
Над строковыми данными применимы операции сравнения, которые
выполняются по их кодам ASCII, и операция сцепления.
Для сравнения строк применяются все операции отношения. Сравнение строк
происходит посимвольно, начиная с первого символа. Строки равны, если
имеют одинаковую длину и посимвольно эквивалентны.
При сравнении двух строковых переменных меньшей считается та
символьная
переменная, текст которой стоит раньше, если бы эти строковые переменные
были упорядочены в алфавитном порядке. Если одна сравниваемая строка
длиннее другой, то недостающие символы короткой строки дополняются
пробелами.
Особенностью строковых переменных является то, что к ним можно
обращаться как к скалярным переменным, так и к массивам. Во втором
случае
применяется конструкция "переменная с индексом", что обеспечивает доступ
к
отдельным символам строки. При этом нижняя граница индекса равна 1.
2. Разобрать пример выполнения работы:
Определить количество символов «а» в данной строке.
Program primer;
var s: string;
k, i: byte;
begin
155
write(‘введите строку’);
readln(s);
k:=0;
for i:=1 to length(s) do
if s[i]=’a’ then k:=k+1;
writeln(‘в строке’, k, ‘букв «а»’);
end.
3. Внимательно прочитать условие задачи.
4. Составить алгоритм решения задачи согласно варианта.
5. Реализовать алгоритм на языке Turbo Pascal.
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ
1. Напечатать true, если в заданном тексте буква “а” встречается чаще, чем
буква “в”, и напечатать false в противном случае.
2. Напечатать заданный непустой текст, удалив из него все цифры и удвоив
знаки "+" и "-".
3. Напечатать заданный текст, удалив из него лишние пробелы, т.е. из
нескольких подряд идущих пробелов оставить только один.
4. Известно, что в заданный текст входит буква “а”, причем не на последнем
месте. Требуется напечатать литеру текста, непосредственно следующую за
первым вхождением “а”.
5. Напечатать заданный непустой текст, удалив из него все знаки "+",
непосредственно за которыми идет цифра.
6. Напечатать заданный непустой текст, заменив в нем все пары ph на букву
f.
7. Дана непустая последовательность непустых слов из латинских букв;
соседние слова отделены друг от друга запятой; за последним словом - точка.
Определить количество слов, которые начинаются с буквы “а”.
8. Если в заданный текст входит каждая из букв слова key, тогда напечатать
yes,
иначе - no.
9. Значениями литерных переменных с2, с1 и с0 являются цифры. Присвоить
целой переменной k число, составленное из этих цифр (например, если с2='8',
c1='0' и с0='5', то k=805).
10. Напечатать заданный непустой текст, удалив из него все буквы “в”,
непосредственно перед которыми находится буква ‘с’.
11. Проверить, правильно ли в заданном тексте расставлены круглые скобки
(т.е. находится ли справа от каждой открывающей скобки, а слева от каждой
закрывающей соответствующая ей открывающая). Ответ - ДА или НЕТ.
12. Дана непустая последовательность непустых слов из латинских букв.
Определить количество слов, оканчивающихся буквой w.
13. Выяснить, имеется ли пара соседствующих символов , - (запятая, тире) в
тексте.
14. Дан текст. Определить количество слов начинающихся и
оканчивающихся
одной и той же буквой.
156
15. Дан текст. Определить количество слов, которые содержат ровно три
буквы
е.
Форма отчета о выполнении лабораторной работы.
Отчет должен содержать:
1. Алгоритм решения задачи;
2. Программу реализации алгоритма;
3. Результат выполнения программы.
Блиц-тест.
1. Для того, чтобы отыскать в строке ST первое вхождение строки SUBST с
указанием порядкового номера этой позиции в ТР применяется функция:
а) pos (SUBST, ST); б) insert (ST, SUBST, INDEX); в) copy (ST,INDEX,
SUBST);
г) LENGTH (ST); д) delete (st, index, subst);
2. Результатом вычисления функции copy('информатика', 3, 5) будет слово
А) форма; б) рма; в) атика; г) инфор; д) рофни;
3. Результатом вычисления процедуры INSERT('CAL', ' PASE' , 4) будет
слово
А) PASCALE б) CALPASE в) PASCAL г) PASE
д) CALPAS
Контрольные вопросы.
1. Для чего используются величины, представляющие собой символьные
строки? Как они описываются?
2. Какие операции можно выполнять над строками?
3. Укажите стандартные функции для работы со строковым типом данных.
Глоссарий.
Строка – это последовательность символов произвольной длины,
каждый из которых занимает 1 байт в памяти. Строку можно рассматривать
как
массив символов.
Описание строкового типа состоит из ключевого слова STRING, после
которого в квадратных скобках указано максимальное количество символов
строки данного типа. Если размер строки не указан, он считается равным
255.
Конкатенация – это операция сцепления строк и символов,
представляется она символом +. Результат конкатенации (сцепления) –
строка, сформированная присоединением к значению левого операнда
значения правого операнда, длина которой равна сумме длин сцепленных
строк.
Литература.
1. Фаронов В.В. «Turbo Pascal 7.0», М., Издательство «Нолидж», 1997
2. Марченко А.И. «Программирование в среде Turbo Pascal 7.0» Учебное
пособие, Киев, «Век+»,1998
3. Бурин Е.А. «Программирование на языке Турбо-Паскаль», Учебное
пособие, Алматы, АГУ,2000
4. Немнюгин С.А. TURBO PASCAL, СПб, Питер, 2000
5. Попов В.Г. . «Turbo Pascal 7.0», М., Финансы и статистика, 1998
6. Абрамов С.А., Зима Е.В. «Начало программирования на языке Паскаль»,
М., Наука,1987
157
7. Программирование на языке Паскаль./Под редакцией УСКОВОЙ О.Ф. –
СПб, Питер, 2002
Лабораторная работа №8.
МНОЖЕСТВА.
Цель: овладение практическими навыками работы с типом данных –
множество.
Материалы и оборудование: ПК, среда Turbo Pascal, методические указания к
лабораторным работам.
Содержание и порядок выполнения работы:
1. Повторить теоретический материал по данной теме.
Множество - это структурированный тип данных, представляющий
собой набор взаимосвязанных по какому либо признаку или группе
признаков
объектов, которые можно рассматривать как единое целое. Каждый объект в
множестве называется элементом множества. Все элементы множества
должны принадлежать одному из скалярных типов, кроме вещественного.
Этот
тип называется базовым типом множества. Базовый тип задается диапазоном
или перечислением.
Область значений типа множества – набор всевозможных
подмножеств, составленных из элементов базового типа. В выражениях на
языке Паскаль значения элементов множества указывается в квадратных
скобках: [1,2,3,4], [‘а’,’в’, ’с’ ], [‘a’… ‘z’].
Если множества не имеет элементов множества, называют пустым и
обозначают как []. Количество элементов множества называется его
мощностью.
Для описания множественного типа используют словосочетание Set of
(множество из …).
Формат записи множественных типов:
Type <имя типа>=set of <элемент1, … , элемент n>;
Var <идентификатор>: <имя типа>;
При работе с множествами допускается использование операций
отношения “ = ”, “ <> ”, “ >= ”, “ <= ”, объединения, пересечения, разности
множеств и операции in. Результатами выражений с применением этих
операций является значения True или False.
Применяемые к множествам операции: операция “равно”(=), операция
«не равно» (<>),операция «больше или равно» (>=), операция “меньше или
равно” (<=), операция in, объединение множеств( ), разность множеств(-).
Операция in используется для проверки принадлежности какого- либо
значения указанному множеству. Обычно применяется в условных
операторах.
При использовании операции in проверяемое на принадлежность значения и
множество в квадратных скобках не обязательно предварительно описывать
в
разделе описаний. Операция in позволяет эффективно и наглядно
производить
сложные проверки условий, заменяя иногда десятки других операций.
158
Например, выражение if (a=1)or (a=2) or (a=3) or (a=4) or (a=5) or (a=6) then …
можно заменить более коротким выражениям if a in [1…6] then … .
Часто операцию in пытаются записать с отрицанием: NOT(X in M)
2. Разобрать пример выполнения работы:
Опишите множества M (1…50). Сделайте его пустым. Вводя целые числа с
клавиатуры, заполните множество 10 элементами.
Program Inpu_Mno;
Var M: Set of 1..50;
X, I: integer;
begin
M: = [];
for I: = 1 to 10 do
begin
write (‘Введите’, I, ‘ - й элемент множества:’);
readln (X);
if (X in M ) then Writeln (X, ‘помещен в множество 1..50’);
M: = M+[X];
end
Writeln;
End.
3. Внимательно прочитать условие задачи.
4. Составить алгоритм решения задачи согласно варианта.
5. Реализовать алгоритм на языке Turbo Pascal.
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ
1. Составьте программу вычисления суммы номеров мест, на которых в
слове S стоят гласные буквы.
2. Пусть вводится последовательность символов. Признак конца
последовательности – точка. Напечатайте все латинские буквы, которые есть
в
данной последовательности символов.
3. Пусть дан текст, заканчивающийся точкой. Текст состоит из слов,
разделенных пробелами. Слово представляет собой последовательность
латинских букв. Напечатайте те слова, в которые не входит ни одна из букв
первого слова.
4. Пусть задана целочисленная квадратная матрица размерности n.
Напечатайте все значения i (1<= i <=n), при которых i-я строка симметрична,
а
i-й столбец упорядочен по убыванию.
5. Пусть дан текст, заканчивающийся точкой. Текст состоит из слов,
разделенных пробелами. Слово представляет собой последовательность
русских букв (как строчных, так и прописных). Напечатайте слова, имеющие
четный номер, которые состоят только из повторяющихся букв.
6. Пусть дан текст, заканчивающийся точкой. Текст состоит из слов,
разделенных пробелами. Слово представляет собой последовательность
159
латинских букв. Напечатайте слова текста, имеющие нечетный номер, в
которых нет ни одной повторяющейся буквы.
7. Пусть задана целочисленная квадратная матрица размерности n.
Элементы матрицы находятся в диапазоне от 1 до 100. Напечатайте все
цифры
из заданного диапазона, которых нет ни в одной из строк заданной матрицы.
8. Пусть задана символьная матрица размерности nxm. Напечатайте все
символы, находящиеся в столбцах, элементы которых симметричны.
9. Напечатайте все целые числа, лежащие в диапазоне от 5 до 2500, которые
представимы в виде 5n+7m, где n и m – целые числа (m,n >=0).
10. Пусть вводится последовательность чисел в диапазоне от1 до 255.
Признак конца последовательности – 0. Определите переменные min и max
как
минимальное и максимальное из введенных чисел. Напечатайте по одному
разу
все числа из интервала (min, max), которые не были введены.
11. Пусть дан текст, заканчивающийся точкой. Текст состоит из слов,
разделенных пробелами. Слово представляет собой произвольную
последовательность символов, отличных от пробела. Напечатайте все слова,
которые состоят из тех же литер, что и последнее слово текста.
12. Пусть задана символьная квадратная матрица размерности n. Напечатайте
элементы матрицы, лежащие на ее главной диагонали, если все они отличны
от
элементов, принадлежащих побочной диагонали. Если это условие не
выполняется, то напечатайте элементы побочной диагонали этой матрицы.
13. Напечатайте все целые числа в диапазоне от 1 до 1600, которые
представимы в виде x2 + y2, но которые нельзя представить в виде xy = c2,
где с
изменяется от 1 до 5.
14. Пусть заданы n отрезков с целочисленными координатами отрезков.
Координаты концов находятся в диапазоне от 0 до 100 включительно.
Определите, существует ли точка с целочисленными координатами, которая
принадлежит всем этим отрезкам.
15. Пусть заданы два предложения, слова в которых разделены запятыми
или пробелами. Каждое предложение заканчивается точкой. Можно ли из
букв
первого предложения составить второе предложение и наоборот? Если
нельзя
ни то, ни другое, то перечислите буквы, которых не хватает в первом
(втором)
предложениях, чтобы составить второе (первое).
Форма отчета о выполнении лабораторной работы.
Отчет должен содержать:
1. Алгоритм решения задачи;
2. Программу реализации алгоритма;
3. Результат выполнения программы.
Блиц-тест.
1. Структурированный тип данных, представляющий собой набор
взаимосвязанных по какому либо признаку или группе признаков объектов,
которые можно рассматривать как единое целое называется
а) массивом; б) множеством; в) записью; г) строкой; д) файлом.
160
2. Количество элементов множества – это
а) мощность; б) размерность; в) длина; г) диапазон; д) допустимые
значения.
3. Какая из операций не допустима над множествами
а) сравнения; б) разности; в) пересечения; г) объединения; д)
конкатенации.
Контрольные вопросы.
1. Что называется базовым типом множества?
2. Может ли множество содержать элементы различных типов?
3. Может ли множество содержать несколько одинаковых элементов?
4. Что называется мощностью множества?
5. Какие операции допустимы над множествами?
Глоссарий.
Множество - это структурированный тип данных, представляющий
собой набор взаимосвязанных по какому либо признаку или группе
признаков
объектов, которые можно рассматривать как единое целое.
Элементом множества называется каждый объект в множестве.
Область значений типа множества – набор всевозможных
подмножеств, составленных из элементов базового типа.
Если множества не имеет элементов множества, называют пустым и
обозначают как [].
Мощность множества - количество элементов множества.
Литература.
1. Фаронов В.В. «Turbo Pascal 7.0», М., Издательство «Нолидж», 1997
2. Марченко А.И. «Программирование в среде Turbo Pascal 7.0» Учебное
пособие, Киев, «Век+»,1998
3. Бурин Е.А. «Программирование на языке Турбо-Паскаль», Учебное
пособие, Алматы, АГУ,2000
4. Немнюгин С.А. TURBO PASCAL, СПб, Питер, 2000
5. Попов В.Г. . «Turbo Pascal 7.0», М., Финансы и статистика, 1998
6. Абрамов С.А., Зима Е.В. «Начало программирования на языке Паскаль»,
М., Наука,1987
7. Программирование на языке Паскаль./Под редакцией УСКОВОЙ О.Ф. –
СПб, Питер, 2002
Лабораторная работа №9.
РАСШИРЕНИЕ ТИПОВ ЯЗЫКА PASCAL. ЗАПИСИ.
Цель: Знакомство с комбинированными типами языка Turbo Pascal –
записями;
получение навыков в организации ввода и вывода значений
комбинированных
типов данных; получение практических навыков программирования задач с
использованием записей.
Материалы и оборудование: ПК, среда Turbo Pascal, методические указания к
лабораторным работам.
161
Содержание и порядок выполнения работы:
1. Повторить теоретический материал по данной теме.
Запись – это структура данных, состоящая из фиксированного числа
компонентов, называемых полями. Поля могут быть различного типа.
Каждому
полю задается имя, так называемый идентификатор поля. Идентификатор
поля
используется при организации доступа к компонентам записи.
Определение типа записи начинается зарезервированным словом record
/запись/, за ним следует список полей записи.
В конце списка полей записи ставится зарезервированное слово end /конец/.
Список полей представляет собой последовательность разделов записи,
отделенных друг от друга точкой с запятой. Каждый раздел записи состоит
из
одного или нескольких идентификаторов, отделяемых друг от друга
запятыми,
вслед за которыми следует двоеточие и либо идентификатор типа, либо
описание типа. Т.о., каждый раздел записи определяет тип одного или более
полей. Идентификатор поля должен быть уникальным только в пределах той
записи, в которой он определен. Обращение к полю осуществляется при
помощи идентификатора переменной и идентификатора поля, разделенных
друг от друга точкой.
2. Разобрать пример выполнения работы:
Задание: Составить программу для вычисления среднего балла и зачисления
студентов на стипендию, получивших оценки «4» и «5» или имеющих оценку
«3», но активно выполняющих общественные поручения. Студент, имеющий
все оценки «5» получает повышенную стипендию. Признак активности –
буква
«а», неактивности – буква «н». Программа составляется из расчета четырех
экзаменов и должна использовать признак 1, если студент активно выполняет
общественные поручения, или 0 – в противном случае. Признаками
зачисления
на стипендию являются: 0 – отсутствие стипендии; 1-обычная стипендия; 2 –
повышенная стипендия.
Решение на языке Pascal имеет следующий вид:
Program Zapis_Stud (input, output);
Uses ort; {только для версии 5.5}
Const
Nk=4; Nst=5;
Type
Rez = array[1..nk] of integer;
Student = record
Fam: string[20];
Ekz: rez;
Srb: real;
Act: char;
Stip: integer;
End;
Grup =array[1..nst] of student;
Var
St: grup; Sum: real; I,j,: integer;
162
Begin
Clrscr; Writeln;
Writeln(‘ Программа, демонстрирующая использование записи.’);
Writeln(‘ ********************************************** ’);
Writeln;
I:=1
Repeat { Цикл ввода студентов группы: заполнение массива}
Write (‘Введите фамилию студента:’);
Readln (st[i].fam);
For j:=1 to nk do
Begin
Write (‘ введите оценку за ‘,j,’ экзамен: ’);
Readln (st[i].ekz[j]);
End;
Write (‘ введите активность студента: ’);
Readln (st[i].act);
i:=i+1;
Writeln;
Until (i>nst);
I:=1;
Repeat { Цикл подсчета среднего балла и определении типа стипендии}
Sum:=0;
For j:=1 to nk do begin
If (st[i].ekz[j]<3) then st[i].stip:=0
Else sum:=sum+st[i].ekz[j]
End;
St[i].srb:=sum/nk;
If (st[i].srb>=5) then st[i].stip:=2;
If (st[i].srb>=4) and (st[i].srb<5) then st[i].stip:=1;
If (st[i].srb>=3) and (st[i].srb<4) then st[i].stip:=0;
If (st[i].srb>=3) and (st[i].srb<4) and (st[i].act=’1’)
Then st[i].stip:=1;
I:=i+1;
Until (i>nst);
I:=1; clrscr;
Writeln;
Writeln (‘ Результаты начисления ‘);
Writeln;
Writeln (‘ Ф.И.О. Средний балл Активность Отметка о начислении‘);
Writeln (‘ ------------------------------------------------------------------------------- ‘);
Reperat {‘ Цикл вывода результатов на экран}
case st i , stip of
O: begin
Writeln (‘ ‘, st i . fam , ‘ ‘, st i . srb: 4:2, ‘ ‘, st i . act,
‘стипендия не начисляется’);
163
end;
1: begin
writeln (‘ ‘, st i . fam, ‘ ‘, st i .srb: 4: 2, ‘ ‘, st i .act,
начислена обычная стипендия);
end;
2: begin
writeln (‘ ‘, st i . fam, ‘ ‘, st i .srb: 4: 2, ‘ ‘, st i .act,
начислена повышенная стипендия’);
end;
end;
i:=i+1;
until (i>nst);
end.
3. Внимательно прочитать условие задачи.
4. Составить алгоритм решения задачи согласно варианта.
5. Реализовать алгоритм на языке Turbo Pascal.
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ
1. Разработать программу для составления списков студентов, имеющих
оценки: только «отлично», «отлично» и «хорошо», только «хорошо» и
«удовлетворительно», только «удовлетворительно».
2. Составить программу для нахождения групп на курсе, в которых учатся
студенты, имеющие одинаковые фамилии.
3. Вывести на экран в общепринятом виде список сотрудников данной
организации, фамилии которых начинаются на А, и их средний месячный
заработок.
4. Сведения об ассортименте обувного магазина представлены в виде записи.
Определить самую дорогую женскую обувь, а так же наименования всей
имеющейся в ассортименте мужской обуви с указанием ее стоимости.
5. Составить программу, моделирующую телефонный справочник. Вывести
список абонентов женского поля с указанием номера телефона и
домашнего адреса.
6. Сведения о машинах, прошедших ремонт в данной ремонтной организации
представлены в виде записи. Определить номера и марку машин имеющих
красный цвет.
7. Информация о сотрудниках некоторой организации представлена в виде
записи. Вывести на экран список сотрудников мужского пола с указанием
специальности и возраста.
8. Составить каталог книг, указав название, фамилию автора, год издания,
цену и тираж. Вывести на дисплей упорядоченный список книг каталога
по алфавиту и тиражу.
9. В железнодорожной кассе имеется следующая информация: номер поезда,
станция назначения, наличие билетов. Узнать номера поездов и станцию
назначения на те поезда, для которых число свободных билетов равно 125.
164
10.Упорядочить список Вашей учебной группы по алфавиту и дате рождения
студентов. Результат вывести в общепринятом виде.
11.Составить программу, позволяющую получить сведения о задолжниках
библиотеки: фамилия, домашний адрес и место работы. Пользователь
библиотеки, имеющий задолженность отмечается в общем списке
читателей буквой «з».
12.Разработать программу способную выводить на экран список посетителей
стоматологической клиники, фамилии которых начинаются на одну из
букв интервала от Б до Л.
13.Вывести на экран анкетные данные студентов, получивших за все время
обучения одну оценку 4, при условии, что все остальные оценки – 5.
14.Вычислить средний балл группы и вывести на экран список студентов,
имеющих средний балл выше среднего балла группы.
15.Вывести информацию о сотрудниках некоторой фирмы в следующей
форме: фамилию и имя, если сотрудник женщина – информацию о цвете
глаз, если мужчина – отношение к курению.
Форма отчета о выполнении лабораторной работы.
Отчет должен содержать:
1. Алгоритм решения задачи;
2. Программу реализации алгоритма;
3. Результат выполнения программы.
Блиц-тест.
1. Запись-это структурированный тип, который содержит
A. Компоненты разных типов;
B. Компоненты одного типа;
C. Только целочисленные компоненты;
D. Только один компонент;
E. Не менее пяти компонентов.
2. Для доступа к значению компонента записи (полю) необходимо
A. Указать как имя записи, так и имя компоненты;
B. Достаточно указать имя записи;
C. Достаточно указать имя компоненты;
D. Использовать оператор присоединения;
E. Обратиться к компоненте как к элементу массива.
3. Оператор WITH – это
A. Оператор присоединения;
B. Оператор присваивания;
C. Служебное слово, обозначающее поле записи;
D. Оператор печати компоненты записи;
E. Служебное слово, обозначающее конец записи.
Контрольные вопросы.
1. Что понимается под записью в языке Pascal?
2. Как объявляются записи?
165
3. Какие операции допустимы над элементами записи?
4. Как организовать ввод и вывод данных записи?
5. Какие операции допустимы над записью в целом?
Глоссарий.
Запись является составной структурой данных в Turbo Pascal. Записи могут
объединять в единое целое любое число структур данных других типов:
простых переменных, массивов, множеств, записей и файлов.
В Turbo Pascal различают фиксированные и вариантные записи.
Обычно фиксированная запись состоит из одного или нескольких полей, для
каждого из которых при объявлении указывается имя (идентификатор) и тип.
Вариантные записи включают две части: первая часть - обычная
фиксированная
запись; вторая часть – вариантная, состоящая из поля признака и одной или
нескольких вариантных компонент. Вариантные компоненты включаются в
конкретный элемент типа «запись» по альтернативному принципу, в
зависимости от значения поля признака.
Литература.
1. Фаронов В.В. «Turbo Pascal 7.0», М., Издательство «Нолидж», 1997
2. Марченко А.И. «Программирование в среде Turbo Pascal 7.0» Учебное
пособие, Киев, «Век+»,1998
3. Бурин Е.А. «Программирование на языке Турбо-Паскаль», Учебное
пособие, Алматы, АГУ,2000
4. Немнюгин С.А. TURBO PASCAL, СПб, Питер, 2000
5. Попов В.Г. . «Turbo Pascal 7.0», М., Финансы и статистика, 1998
6. Абрамов С.А., Зима Е.В. «Начало программирования на языке Паскаль»,
М., Наука,1987
7. Программирование на языке Паскаль./Под редакцией УСКОВОЙ О.Ф. –
СПб, Питер, 2002
Лабораторная работа №10.
ОБРАБОТКА ФАЙЛОВЫХ СТРУКТУР ДАННЫХ.
Цель: овладение навыками алгоритмизации и программирования файловых
структур данных; проектирование структуры файла, вывод данных в файл,
чтение данных из файла.
Материалы и оборудование: ПК, среда Turbo Pascal, методические указания к
лабораторным работам.
Содержание и порядок выполнения работы:
1. Повторить теоретический материал по данной теме.
Файловый тип данных или файл определяет упорядоченную совокупность
произвольного числа однотипных компонент. Количество компонент файла в
тексте программы не определяется и может быть произвольным.
При работе с файлами выполняются операции ввода - вывода. Операция
ввода
означает перепись данных с внешнего устройства (из входного файла) в
166
основную память ЭВМ, операция вывода - это пересылка данных из
основной
памяти на внешнее устройство (в выходной файл).
С файловой системой TURBO PASCAL связано понятие буфера ввода вывода. Ввод и вывод данных осуществляется через буфер. Буфер – это
область в памяти, которая выделяется для каждого файла. При записи в файл
вся информация сначала направляется в буфер и там накапливается до тех
пор,
пока весь объем буфера не будет заполнен. Только после этого или после
специальной команды сброса происходит передача данных на внешнее
устройство. При чтении из файла данные вначале считываются в буфер,
причем
данных считывается не столько, сколько запрашивается, а сколько
поместится в
буфер.
Описание файловых переменных текстового типа производится с помощью
служебного слова Text, например:
var tStory: Text;
Описание типизированных файлов имеет вид:
var fComp: File of T;
где T - тип компоненты файла. Примеры описания файловой переменной
типизированного типа:
type M= array[1..500] of Longint;
var f1: File of Real;
f2: File of Integer;
fLi: File of M;
Нетипизированные файлы описываются с помощью служебного слова File:
var f: File;
Файловые переменные, которые описаны в программе, называют
логическими файлами. Все основные процедуры и функции,
обеспечивающие ввод - вывод данных, работают только с логическими
файлами. Физический файл должен быть связан с логическим файлом до
выполнения процедур открытия файлов.
2. Разобрать пример задачи:
Задание А: Выполнить на ЭВМ программу создания файла, содержащего
сведения о сдаче студентами сессии. Структура записи содержит поля:
индекс
группы, фамилию студента, оценки по пяти экзаменам. Количество записей в
файле произвольное.
Решение на языке Pascal имеет следующий вид:
Program FileTest;
Uses crt;
Type
zap = record
index: string[6];
Fam: string[20];
Marker: array[1..3] of integer;
End;
Var Ses: file of zap; X: zap; Flag: boolean; K,i:integer; Ch: char;
167
Begin
Clrscr;
K:=0; flag:=false;
Writeln(‘ Программа составления файла данных для зачисления
студентов на стипендию’);
Writeln (‘ ********************************************** ’);
Writeln;
Writeln (‘ Необходимо ввести фамилию студента, индекс его
группы и оценки за 3 экзамена’);
Writeln (‘ ------------------------------------------------------------------- ‘);
Writeln (‘ признаком окончания ввода считать введение
символов # # # вместо индекса группы’);
Writeln (‘ ------------------------------------------------------------------- ‘);
Assign (ses, ‘nw.dat’); Rewrite (ses);
Repeat
Writeln; Write (‘ Введите фамилию ’); readln (x.fam);
Write (‘ Введите индекс ’); readln (x. index);
For i:=1 to 3 do begin
Write (‘ введите оценку за ‘,i, ’ экзамен: ’);
Readln (x.marcer [i]);end;
If x.index<>’ # # #’ then begin
K:=k+1
Write (ses,x);
End
Else
Flag:=true;
Until flage;
Clrscr;
Writeln (‘ Проверка корректности записи файла ‘);
Writeln (‘ --------------------------------------------------- ‘);
Writeln (‘ В файле ‘,k, ‘ записей’); writeln;
Reset (ses);
Writeln (‘ Фамилия Группа Оценки ‘);
Writeln (‘ -------------------------------------------------- ‘);
While not eof (ses) do
Begin
Read (ses,x);
Writeln (‘ ‘,x. fam , ‘, ‘, x. Index, ‘ ‘, x. Marcer 1 , ‘ ‘,x. Marcer 2 , ‘ ‘,
x. Marcer 3 );
end; close (ses);
readln;
end.
Задание Б: Написать программу зачисления на стипендию студентов
группы Х. Размер обычной стипендии вводить с клавиатуры. Студенту,
168
получившему все оценки 5, начисляется повышенная на 50% стипендия;
получившему оценки 4 и 5 начисляется стипендия, повышенная на 25%.
Студенту, получившему хотя бы одну оценку 2, стипендия не начисляется. В
остальных случаях начисляется обычная стипендия.
Решение на языке Pascal имеет следующий вид:
Program FileTest2 (input, output);
Uses crt;
Type
zap = record
index: string[6]
Fam: string[20];
Marker: array[1..3] of integer;
End;
Var
Ses: file of zap; X: zap; St, Srb, Stn:real; Flag: boolean; K,i,j:integer;
Ch: char;
Begin
Clrscr;
Writeln(‘ Программа начисления стипендии ’);
Writeln (‘ ***************************** ’); Writeln;
Writeln (‘ введите размер обычной стипендии (тенге): ’);
Readln (st);
i:=0; srb:=0; j:=1; stn:=0; Writeln;
Writeln(‘ Ведомость зачисления студентов на стипендию ’);
Writeln (‘ ------------------------------------------------------------- ‘);
Writeln (‘ Фамилия Отметка о начислении ‘);
Writeln (‘ ------------------------------------------------------------- ‘);
Assign (ses, ‘nw.dat’); Reset (ses);
While not eof (ses) do begin
Read (ses,x);
For i:=1 to 3 do srb:=srb+x.marcer [i];
Srb:=srb/3;
If (srb>=2) and (srb<3) then
Writeln (‘ ‘, x.fam, ‘ ‘, ‘ стипендия не начисляется ‘);
If (srb>=3) and (srb<=4) then
Writeln (‘ ‘, x.fam, ‘ ‘, ‘ ‘, st: 4:2,’ тнг. ‘);
If (srb>4) and (srb<5) then begin
Stn:=st+st*25/100;
Writeln (‘ ‘, x.fam, ‘ ‘, stn:4:2, ‘ тнг.’);
end;
if (srb=5) then begin
stn:=st+st*50/100;
writeln (‘ ‘, x.fam, ‘ ‘, ‘ ‘, stn:4:2, ‘ тнг.’);
end;
169
stn:=0; srb:=0;
end;
close (ses);
readln;
end.
3. Внимательно прочитать условие задачи согласно варианта.
4. Составить алгоритм решения задачи.
5. Реализовать алгоритм на языке Turbo Pascal.
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ
Задание А. Выполнить на ЭВМ программу создания файла в
соответствии с вариантом задания, указанного ниже.
Задание В. Выполнить на ЭВМ программу обработки файла, созданного
согласно заданию А.
1. А. Создать файл, содержащий сведения о месячной заработной плате
рабочих
завода. Каждая запись содержит поля: Фамилия рабочего, наименование
цеха,
размер зарплаты.
Б. Вычислить общую сумму выплат по цеху Х, среднемесячный заработок
рабочего цеха.
2. А. Создать файл, содержащий сведения о количестве изделий, собранных
сборщиком цеха за неделю. Каждая запись содержит поля: фамилия
сборщика,
количество изделий, собранных им ежедневно в течение шестидневной
недели.
Б. Написать программу, определяющую фамилию сборщика и общее
количество деталей, собранное им за неделю.
3. А. Создать файл, содержащий сведения о количестве изделий категорий
А,В,С, собранных рабочим за месяц. Структура записи имеет поля: фамилия
сборщика, наименование цеха, кол-во изделий по категориям, собранных
рабочим за месяц.
Б. Считая заданными значения расценок Sa, Sb, Sc за выполненную работу по
сборке единицы изделия категорий А, B, С определить заработную плату
рабочих цеха Х.
4. А. Создать файл, содержащий сведения о телефонах абонентов.
Каждая запись имеет поля: фамилия абонента, год установки телефона,
номер
телефона.
Б. Написать программу, определяющую количество телефонов,
установленных
с ХХХХ года. Номер года вводиться с терминала.
5. А. Создать файл, содержащий сведения об ассортименте игрушек в
магазине.
Структура записи: название игрушки, цена, количество, возрастные границы.
Б. Выдать следующие сведения: названия игрушки, которые подходят детям
от
2 до 5 лет, стоимость самой дорогой игрушки.
6. А. Создать файл, содержащий сведения о сдаче студентами сессии.
Структура записи: индекс группы, фамилия студента, оценки по 5 экзаменам.
Количество записей –30.
170
Б. Написать программу зачисления студентов на сессию. Отличники
получают
повышенную стипендию, хорошисты обычную. Остальным стипендия не
начисляется.
7. А. Создать файл, содержащий сведения о сдаче студентами сессии.
Структура записи: индекс группы, фамилия студента, оценки по 5 экзаменам.
Количество записей –30.
В. Определить неуспевающих студентов, средний бал группы.
8. А. Создать файл, содержащий сведения о сдаче студентами сессии.
Структура записи: шифр книги, автор, названия, год издания.
В. Выдать следующую информацию: список книг автора Х, количество книг
издания ХХ года. Фамилия автора и год издания вводятся с клавиатуры.
9. А. Создать файл, содержащий сведения о наличии билетов и рейсов
Аэрофлота. Структура записи: номер рейса, пункт назначения, время вылета,
количество свободных мест в салоне.
Б. Выдать следующую информацию: время отправления самолетов в город
Х;
наличие свободных мест на рейс Х.
10. А. Создать файл, содержащий сведения об ассортименте обуви в
магазине.
Структура записи: наименование, стоимость одной пары.
Б. Определить наименование самой дорогой пары обуви.
11. А. Создать два файла, содержащих сведения о десяти нападающих
команд
«Динамо» и «Спартак»: имена нападающих, число заброшенных им шайб.
Б. Определить самого результативного игрока этих команд.
12. А. Создать файл, содержащий сведения о том, какие из пяти
предлагаемых
дисциплин желает слушать студент. Структура записи: фамилия студента, 5
дисциплин, средний балл успеваемости. Выбранная дисциплина отмечается
1,
иначе -0
Б. Вывести на экран список студентов, желающих дисциплину Х. Если число
таких студентов больше 8, то приоритет имеют студенты, имеющие высокий
средний балл.
13. А. Создать файл, содержащий сведения об отправлении поездов с
вокзала.
Структура записи: номер поезда, время в пути, станция назначения, наличие
билетов в кассе.
Б. Определить количество билетов на поезд номер N, направляющийся в
город
Х, добирающийся до пункта назначения за самое минимальное время.
14. А. Создать файл, содержащий сведения о сотрудниках фирмы. Структура
записи: фамилия, возраст, стаж работы.
Б. Вывести на экран список сотрудников пенсионного возраста с указанием
стажа работы.
15. А. Создать файл о пациентах глазной клиники. Структура записи:
фамилия
пациента, пол, возраст, диагноз.
Б. Определить фамилии пациентов-мужчин в возрасте Х. Указать диагноз.
Форма отчета о выполнении лабораторной работы.
Отчет должен содержать:
1. Алгоритм решения задачи;
171
2. Программу реализации алгоритма;
3. Результат выполнения программы.
Блиц-тест.
1. Файловый тип можно задать одним из:
A. двух способов;
B. шести способов.
C. пяти способов;
D. четырех способов;
E. трех способов;
2. Если файл задается способом FILE OF.., то это:
A. типизированный файл;
B. нетипизированный файл;
C. текстовый файл;
D. стандартный файл;
E. любой из перечисленных файлов.
3. Имя файла – это выражение:
A. логического типа;
B. целого типа;
C. действительного типа;
D. строкового типа;
E. символьного типа.
4. Процедура REWRITE (<ф.п.>) используется для:
A. инициирования записи информации в файл;
B. закрытия файла;
C. переименования файла;
D. удаления файла;
E. копирования файла
5. Процедура CLOSE (<ф.п.>)
A. инициирует запись информации в ранее существовавший текстовый файл;
B. переименовывает файл
C. удаляет файл;
D. закрывает файл;
E. копирует файл
Контрольные вопросы.
1. Объяснить, что означают термины: файл, запись, структура записи?
2. Указать, с помощью каких операторов выполняется запись данных в файл
последовательного доступа?
3. Привести примеры файлов последовательного доступа?
4. Как распознать конец файла данных? Как распознать файл на диске?
5. Какого типа могут быть компоненты файла?
6. Нужно ли при определении файла заранее указывать его длину?
7. Куда помещается при записи очередной компонент типизированного
файла?
172
Глоссарий.
File (в переводе с английского языка) означает папка, досье, а также
хранить информацию.
У понятия файл есть две стороны.
С одной стороны, файл- это именованная область внешней памяти,
содержащая
какую-либо информацию. Файл в таком понимании называют физическим
файлом.
С другой стороны, файл- это одна из многих структур данных, используемых
в
программировании. Файл в таком понимании называют логическим файлом.
Файлы в Turbo Pascal классифицируются по двум признакам:
по типу (логической структуре): текстовые, типизированные,
нетипизированные;
по методу доступа к элементам файла: последовательного доступа,
прямого доступа.
Текстовые файлы представляют собой последовательность строк, а строки последовательность символов. Строки имеют переменную длину, каждая
строка завершается признаком конца строки.
Компонентный или типизированный файл - это файл с объявленным типом
его
компонент. Компонентные файлы состоят из машинных представлений
значений переменных, они хранят данные в том же виде, что и память ЭВМ.
Нетипизированные файлы позволяют записывать на диск произвольные
участки памяти ЭВМ и считывать их с диска в память.
Смысл последовательного доступа заключается в том, что в каждый момент
времени доступна лишь одна компонента из всей последовательности. Для
того, чтобы обратиться (получить доступ) к компоненте с номером К,
необходимо просмотреть от начала файла К-1 предшествующую компоненту.
Прямой доступ предполагает, что файл представляет собой линейную
последовательность блоков.
Литература.
1. Фаронов В.В. «Turbo Pascal 7.0», М., Издательство «Нолидж», 1997
2. Марченко А.И. «Программирование в среде Turbo Pascal 7.0» Учебное
пособие, Киев, «Век+»,1998
3. Бурин Е.А. «Программирование на языке Турбо-Паскаль», Учебное
пособие, Алматы, АГУ,2000
4. Немнюгин С.А. TURBO PASCAL, СПб, Питер, 2000
5. Попов В.Г. . «Turbo Pascal 7.0», М., Финансы и статистика, 1998
6. Программирование на языке Паскаль./Под редакцией УСКОВОЙ О.Ф. –
СПб, Питер, 2002
Лабораторная работа №11.
ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ ПОДПРОГРАММ.
Цель: Овладение практическими навыками алгоритмизации и
программирования с использованием подпрограмм пользователя, овладение
навыками написания подпрограмм и обращения к ним.
173
Материалы и оборудование: ПК, среда Turbo Pascal, методические указания к
лабораторным работам.
Содержание и порядок выполнения работы:
1. Повторить теоретический материал по данной теме.
Решение отдельного фрагмента сложной задачи может представлять
собой самостоятельный программный блок, называемый подпрограммой.
Подпрограммой называют обособленную, оформленную в виде
отдельной синтаксической конструкции и снабженную именем часть
программы. Использование подпрограмм позволяет, сосредоточив в них
подробное описание некоторых операции, в остальной программе только
указывать имена подпрограмм, чтобы выполнить эти операции.
За наличие подпрограмм как средства структурирования программ языка
программирования Турбо Паскаль называется процедурноориентированным.
Подпрограммы в Турбо Паскале реализованы посредством процедур и
функции.
Отличие подпрограмм–процедур от подпрограмм-функции состоит в том,
что
процедуры служат для задания совокупности действий, направленных на
изменения внешней по отношению к ним программной обстановки, а
функции,
являясь частным случаем процедур, отличаются от них тем, что они
обязательно возвращают в точку вызова основной программы единственный
результат как значение имени этой функции.
Общая структура описания процедур
Procedure <имя> (формальные параметры ) ;
Const … ;
Type … ;
Var … ;
Begin
< операторы >
End;
Общая структура описания функций
Function <имя> (формальные параметры): <тип результата>;
Const … ;
Type … ;
Var … ;
Begin
<операторы>
End;
Подпрограмма не может выполняться сама, её необходимо вызвать по имени
и указать фактические параметры того же типа, что и формальные.
Количество
и тип формальных параметров равны количеству и типу фактических
параметров.
2. Разобрать пример:
Выполнить на ЭВМ решение задачи. Даны действительные числа a,b,c.
Получить
1 max ,1,15
max , max( , )
a bc
aababc
.
174
В качестве подпрограммы использовать функцию нахождения
максимального
из двух чисел.
Function max(x,y: integer):integer;
Begin
If x>y then max:=x
Else max:=y;
End;
3. Внимательно прочитать условие задачи согласно варианту.
4. Составить алгоритм решения задачи.
5. Реализовать алгоритм на языке Turbo Pascal.
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ
1. Найти наименьшие элементы и номера строк и столбцов, в которых они
расположены для матриц А(10,15) и В(15,12).
2. Вычислить Z=(U1+U2+U3)/ 3, где U1, U2, U3 - объемы шаров с
радиусами R1, R2, R3 соответственно. Вычисление Ui организовать в
подпрограмме.
3. Вычислить среднее арифметическое положительных элементов массивов
A(N1), B(N2), C(N3).
4. Подсчитать количество элементов матриц Х(10,15) и Y(20,12),
удовлетворяющих условиям 0<=Xij<=1 и 0<=Yij<=1.
5. Вычислить суммы положительных элементов каждой строки матриц
А(10,12) и В(15,10).
6. Вычислить суммы элементов главных диагоналей А(N,N) и В(M,M).
7. Вычислить Z=(Xm1+Xm2) /2, где Xm1 и Xm2 - наименьшие элементы
массивов Х1 и Х2
8. Вычислить Z=(S1+S2) /2, где S1 - сумма положительных элементов
массива Х(50); S2 - сумма отрицательных элементов массива Y(60). Обе
суммы вычисляют в одной подпрограмме.
9. Подсчитать число нулевых элементов для матриц А(N,N) и B(M,N).
10.Вычислить суммы элементов нижних треугольных матриц для матриц
А(15,15) и В(20,20).
11.Определить число положительных элементов до первого отрицательного
элемента в массивах Х(40), Y(50), Z(N).
12.Вычислить и запомнить суммы положительных элементов каждой строки
матрицы А(10,20), В(15,10).
13.Найти наибольшие элементы и их порядковые номера массивов X(N) и
Y(M).
14.Переписать положительные элементы массивов Х(100) и Y(80) в массив
Z подряд. Запись в массив Z осуществлять в подпрограммме.
15.Вывести на печать элементы целочисленных матриц N(5,8) и М(10,6),
кратных трем.
175
Форма отчета о выполнении лабораторной работы.
Отчет должен содержать:
1. Алгоритм решения задачи;
2. Программу реализации алгоритма;
3. Результат выполнения программы.
Блиц-тест.
1. Заголовок процедуры имеет вид:
A. PROCEDURE <имя> [(<список формальных параметров>)]: <тип>;
B. PROCEDURE <имя> [(<список формальных параметров>)];
C. FUNCTION <имя> [(<список формальных параметров>)]: <тип>;
D. FUNCTION <имя> [(<список формальных параметров>)];
E. PROGRAM <имя>;
2. Заголовок функции имеет вид:
A. PROCEDURE <имя> [(<список формальных параметров>)]: <тип>;
B. PROCEDURE <имя> [(<список формальных параметров>)];
C. FUNCTION <имя> [(<список формальных параметров>)];
D. FUNCTION <имя> [(<список формальных параметров>)]: <тип>;
E. PROGRAM <имя>;
3. Стандартная директива FORWARD используется
A. При опережающем описании для сообщения компилятору, что описание
подпрограммы следует где-то дальше по тексту программы
B. При создании процедур обработки прерываний
C. Для объявления внешней подпрограммы
D. Для отмены стандартной последовательности машинных инструкций
E. Для указания на то, что тело подпрограммы реализуется с помощью
встроенных машинных инструкций
Контрольные вопросы.
1. Дайте определение подпрограммы.
2. Сколько элементов может содержать список формальных параметров.
3. Чем глобальные переменные отличаются от локальных.
4. Может ли элемент массива быть формальным параметром.
Глоссарий.
Подпрограмма- это независимая часть программы, которая состоит из
группы
операторов для выполнения некоторого единого действия.
Областью действия (сферой видимости) идентификатора называется часть
программы, где он может быть использован. Область действия
идентификаторов определяется местом их объявления. Если идентификаторы
допускается использовать только в рамках одной процедуры или функции, то
такие идентификаторы называются локальными. Если действие
идентификаторов распространяется на несколько вложенных (не менее
одной)
процедур или функций, то такие идентификаторы называются глобальными.
Параметры, указываемые в заголовке процедуры/функции при ее описании,
называются формальными параметрами.
Параметры, указываемые при вызове процедуры/функции, называются
фактическими параметрами.
176
Процедура - это называемая именованная часть программы, которую можно
вызвать по имени для выполнения определенных действий. Структура
процедуры повторяет структуру программы. Процедура не может выступать
как операнд в выражении. Упоминания имени процедуры в тексте
программы
приводит к активизации процедуры и называется ее вызовом.
Функция аналогично процедуре, но имеются два отличия: функция передает
в
точку вызова скалярное значение; имя функции может входить в выражении
как операнд.
Литература.
17.Фаронов В.В. «Turbo Pascal 7.0», М., Издательство «Нолидж», 1997
18.Марченко А.И. «Программирование в среде Turbo Pascal 7.0» Учебное
пособие, Киев, «Век+»,1998
19.Бурин Е.А. «Программирование на языке Турбо-Паскаль», Учебное
пособие, Алматы, АГУ,2000
20.Попов В.Г. . «Turbo Pascal 7.0», М., Финансы и статистика, 1998
21.Абрамов С.А., Зима Е.В. «Начало программирования на языке Паскаль»,
М., Наука,1987
Лабораторная работа №12.
РЕКУРСИЯ
Цель занятия: Приобретение навыков работы по разработке программ на
основе рекурсивных алгоритмов.
Материалы и оборудование: ПК, среда Turbo Pascal.
Содержание и порядок выполнения работы:
1. Повторить теоретический материал по данной теме.
2. Внимательно прочитать условие задачи.
3. Составить алгоритм решения задачи.
4. Реализовать алгоритм на языке Turbo Pascal.
Задания для самостоятельного выполнения
Решить следующие задачи, используя рекурсивную подпрограмму.
1. Найти сумму цифр заданного натурального числа.
2. Подсчитать количество цифр в заданном натуральном числе.
3. Описать функцию С (m,n), где 0 m n , для вычисления биномиального
коэффициента Сn
m по следующей формуле:
С0
n=Cn
n =1; Cn
m = Cn-1
m + Cn-1
m-1 при 0<m<n.
4. Описать рекурсивную функцию Root (a,b,c), которая методом деления
отрезка пополам находит с точностью с корень уравнения f(x)=0 [a,b] (
c>0, a<b, f (a)* f (b)<0 и f (x) – непрерывная и монотонная на отрезке [a,b]
функция).
177
5. Описать функцию min (x) для определения минимального элемента
линейного массива Х, введя вспомогательную рекурсивную функцию min1
(к), находящую минимум среди последних элементов массива Х, начиная с kго.
6. Описать рекурсивную логическую функцию Simm (S,I,J), проверяющую,
является ли симметричной часть строки S, начинающаяся i-м и
заканчивающаяся j-м ее элементами.
7. Составить программу для вычисления наибольшего общего делителя двух
натуральных чисел.
8. Составить программу для нахождения чисел, которое образуется из
данного натурального числа при записи его цифр в обратном порядке.
Например, для числа 1234 получаем результат 4321.
9. Составить программу для перевода данного натурального числа в р-ичную
систему счисления (2 p 9 ).
10. Дана символьная строка, представляющая собой запись натурального
числа в р-ичную системе счисления (2 p 9 ). Составить программу для
перевода этого числа в десятичную систему счисления.
11. Составить программу для вычисления суммы: 1!+2!+3!+ …+n! (n 15).
Примечание. Тип результата значения функции – LongInt.
13*. Дано n различных натуральных чисел. Напечатать все перестановки этих
чисел.
14. Логическая функция возвращает True, если ее аргумент – простое число.
15. Описать функцию, которая удаляет из строки все лишние пробелы.
Пробелы считаются лишними, если их подряд идет более двух, если они
стоят в конце строки после последней точки, если стоят после
открывающегося парного знака препинания.
Форма отчета о выполнении лабораторной работы.
Отчет должен содержать:
1. Алгоритм решения задачи;
2. Программу реализации алгоритма;
3. Результат выполнения программы.
Блиц-тест.
1. Рекурсия - это…
A. способ организации вычислительного процесса факториала;
B. способ организации вычислительного процесса, при котором
осуществляется многократный переход от конца к началу;
C. способ организации вычислительного процесса, при котором
подпрограмма
в ходе выполнения составляющих ее операторов обращается сама к себе;
D. способ организации вычислительного процесса, при котором
осуществляется многократный переход от начала к концу;
E. способ организации вычислительного процесса, при котором некоторая
последовательность действий выполняется N раз;
2. Стандартная деректива INTERRUPT используется
178
A. При опережающем описании для сообщения компилятору, что описание
подпрограммы следует где-то дальше по тексту программы
B. При создании процедур обработки прерываний
C. Для объявления внешней подпрограммы
D. Для отмены стандартной последовательности машинных инструкций
E. Для указания на то, что тело подпрограммы реализуется с помощью
встроенных машинных инструкций
3. Обязательное требование к рекурсивным процедурам:
A. Вызов рекурсивной процедуры должен выполняться по условию, которое
на
каком то уровне рекурсии станет ложным.
B. Вызов рекурсивной процедуры должен выполняться по условию, которое
на
каком то уровне рекурсии станет истинным.
C. Вызов рекурсивной процедуры должен выполняться вне зависимости от
каких-либо условий.
D. Вызов рекурсивной процедуры должен выполняться по условию, которое
всегда будет истинным.
E. Вызов рекурсивной процедуры должен выполняться по условию, которое
всегда будет ложным.
Контрольные вопросы.
1. Как называются процедуры или функции, которые вызывают сами себя?
2. Для каких целей создаются рекурсивные алгоритмы?
3. Всегда ли в рекурсивном алгоритме должно присутствовать условие
выхода
из рекурсии?
4. Что произойдет, если рекурсивный алгоритм будет вызывать сам себя
«бесконечное» число раз?
Глоссарий.
Рекурсивным называется объект, который частично определяется через
самого
себя.
Максимальное число рекурсивных вызовов процедуры без возвратов,
которое
происходит во время выполнения программы, называется глубиной
рекурсии.
Число рекурсивных вызовов в каждый конкретный момент времени,
называется текущим уровнем рекурсии.
Литература.
1. Марченко А.И. «Программирование в среде Turbo Pascal 7.0» Учебное
пособие, Киев, «Век+»,1998
2. Бурин Е.А. «Программирование на языке Турбо-Паскаль», Учебное
пособие, Алматы, АГУ,2000
3. Немнюгин С.А. TURBO PASCAL, СПб, Питер, 2000
179
Лабораторная работа №13.
МОДУЛИ.
Цель: овладение навыками решения задач с использованием модулей.
Материалы и оборудование: ПК, среда Turbo Pascal, методические указания к
лабораторным работам.
Содержание и порядок выполнения работы:
1. Повторить теоретический материал по данной теме.
Модуль – это набор ресурсов (функций, процедур, констант, переменных,
типов и т.д.), разрабатываемых и хранимых независимо от использующих их
программ. В отличии от внешних подпрограмм модуль может содержать
большой набор процедур и функций, а также других ресурсов для разработки
программ. Обычно каждый модуль содержит связанные между собой
программные ресурсы.
Модуль имеет следующую структуру:
Unit <имя модуля>; {заголовок модуля}
Interface
{интерфейсная часть}
Implementation
{раздел реализации}
Begin
{раздел инициализации модуля}
End.
После служебного слова Unit записывается имя модуля, которое (для
удобства
дальнейших действий) совпадать с именем файла, содержащего данный
модуль.
В разделе Interface объявляются все ресурсы, которые будут в дальнейшем
доступны программисту при подключении модуля. Для подпрограмм здесь
указывается лишь полный заголовок.
В разделе Implementation реализуются все подпрограммы, которые были
ранее
объявлены. Кроме того, здесь могут содержаться константы, переменные,
типы,
подпрограммы и т.д., которые носят вспомогательный характер и
используются
для написания основных подпрограмм. В отличии от ресурсов, объявленных
в
разделе Interface , все, что дополнительно объявляется в Implementation , уже
не будет доступно при подключении модуля. При написании основных
подпрограмм указать их имя (т.е. не нужно полностью переписывать весь
заголовок), а затем записать тело подпрограммы.
Наконец, раздел инициализации (который часто отсутствует) содержит
операторы, которые должны будут выполнены сразу не после запуска
программы, использующий модуль.
2. Разобрать пример:
Реализовать в виде модуля набор подпрограмм для выполнения следующих
операций над обыкновенными дробями вида P/Q ( P - целое, Q –
натуральное):
1) сложение; 2) вычитание; 3)умножение; 4) деление; 5)сокращение дроби; 6)
180
возведение дроби в степень N (N – натуральное ); 7)функции, реализующие
операции отношения ( =, <>, >=, <=, <, > )
Дробь представить следующим типом:
Type frac= record
P: Integer;
Q: 1 . . High (LongInt )
End;
Используя этот модуль решить следующие задачи:
1. Дан массив А обыкновенных дробей. Найти сумму всех дробей, ответ
представить в виде несократимой дроби. Вычислить среднее
арифметическое всех дробей, ответ представить в виде несократимой дроби.
2. Дан массив А обыкновенных дробей. Отсортировать его в порядке
возрастания.
Модуль будет выглядеть следующим образом:
Unit Droby;
Interface
Type
Natur = 1 . . High (LongInt);
Frac = Record
P : LongInt; { числитель дроби}
Q : Natur {знаменатель дроби}
End;
Procedure Sokr (Var A : Frac);
Procedure Summa ( A,B : Frac ; Var C : Frac);
Procedure Raznost ( A,B : Frac ; Var C : Frac);
Procedure Proizvedenie ( A,B : Frac ; Var C : Frac);
Procedure Chastnoe ( A,B : Frac ; Var C : Frac);
Procedure Stepen ( A : Frac ; N : Natur; Var C : Frac);
Function Menshe ( A,B : Frac ): Boolean;
Function Bolshe ( A,B : Frac ): Boolean;
Function Ravno ( A,B : Frac ): Boolean;
Function MensheRavno ( A,B : Frac ): Boolean;
Function BolsheRavno ( A,B : Frac ): Boolean;
Function NeRavno ( A,B : Frac ): Boolean;
{Раздел реализации модуля}
Implementation
{наиб. общ. делитель двух чисел – вспомогательная функция,
ранее не объявлена}
Function NodEvklid ( A,B : Natur ): Natur;
Begin
While A < > B Do
If A > B Then
181
If A Mod B < > 0 Then A:= A Mod B
Else A:= B
Else
If B Mod A <> 0 Then B:= B Mod A
Else B:= B;
NodEvklid := A
End;
Procedure Sokr; {сокр. дроби}
Var M,N : Natur;
Begin
If A .P <>0 Then
Begin
A .P<0 Then M:= Abs(A .P)
Else M:= A .P ; {совмещение типов, т.к. A .P –
LongInt}
N := NodEvklid (M, A .Q);
A . P:= A . P Div N;
A . Q:= A . Q Div N
End
End;
Procedure Summa;
Begin
{знаменатель дроби}
C.Q:= (A . Q * B. Q) Div NodEvklid(A .Q, B.Q );
{числитель дроби}
C.P:= A .P * C.Q Div A .Q + B.P * C.Q Div B.Q;
Sokr ( C )
End;
Procedure Raznost;
Begin
{знаменатель дроби}
C.Q:= (A . Q * B. Q) Div NodEvklid(A .Q, B.Q );
{числитель дроби}
C.P:= A .P * C.Q Div A .Q - B.P * C.Q Div B.Q;
Sokr ( C )
End;
Procedure Proizvedenie;
Begin
{знаменатель дроби} C.Q:= A .Q * B.Q;
{числитель дроби} C.P:= A .P * B.P;
182
Sokr ( C )
End;
Procedure Chastnoe;
Begin
{знаменатель дроби} C.Q:= A . Q * B.P;
{числитель дроби} C.P:= A .P * B.Q ;
Sokr ( C )
End;
Procedure Stepen;
Var I: Natur;
Begin
C.Q:= 1; C.P:= 1; Sokr (A);
For I:=1 to N Do Proizvedenie (A , B , C)
End;
Function Menshe;
Begin Menshe:= A .P * B.Q <A .Q * B.P End;
Function Bolshe;
Begin Bolshe:= A .P * B.Q > A .Q * B.P End;
Function Ravno;
Begin Ravno:= A .P * B.Q = A .Q * B.P End;
Function BolsheRavno;
Begin BolsheRavno:= Bolse (A, B) or Ravno (A,B) End;
Function MensheRavno;
Begin MensheRavno:= Menshe (A, B) or Ravno (A,B) End;
Function NeRavno;
Begin NeRavno:= Not Ravno (A,B) End;
{раздел инициализации модуля}
Begin
End.
Рекомендации по разработке модулей:
1. Сначала надо спроектировать модуль, т.е. выделить основные и
вспомогательные подпрограммы;
2. Каждую подпрограмму целесообразно отладить отдельно, после чего
вставить в текст модуля.
183
Сохраним текст разобранной программы в файле droby.pas и откомпилируем
наш модуль. Для этого можно воспользоваться внешним компилятором,
поставляемым вместе с ТР. Компиляция будет выглядеть так : tpc droby.pas
или Run make или Build
Решим задачу суммирования дробей:
Program sum;
Uses Droby;
Var
A: Array [1.. 100] of frac;
I, N : Integer;
S : Frac;
Begin
Write(‘Введите количество элементов: ‘);
Readln(N);
S.P:=0; S.Q:=1; {первоначальная сумма дробей = 0}
For I:=1 to N do {вводим и суммируем дроби}
Begin
Write(‘Введите числитель ‘, I ,’ –й дроби:’);
Readln(A[I].P);
Write(‘Введите знаменатель ‘, I ,’ –й дроби:’);
Readln(A[I].Q);
End;
Write(‘Ответ: ‘, S.PI ,’ / ’,S.Q);
End.
3. Внимательно прочитать условие задачи согласно варианта.
4. Составить алгоритм решения задачи.
5. Реализовать алгоритм на языке Turbo Pascal.
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ
1. Реализовать в виде модуля набор подпрограмм для выполнения
следующих
операций над комплексными числами: 1) сложение; 2) вычитание; 3)
умножение; 4) деление; 5) вычисление модуля комплексного числа; 6)
возведение компл. Числа в степень n (n- натуральное).
Комплексное число представить в следующим типом:
Type Complex=Record
R, M : Real; {действительная и мнимая части числа}
End;
Используя этот модуль решить следующие задачи:
А) Дан массив А комплексных чисел. Получить массив С, элементами
которого будут модули сумм рядом стоящих комплексных чисел.
В) Дан массив A[M] комплексных чисел. Получить матрицу B[N,M] ,
каждая строка которой получается возведением в степень, равную, номеру
этой строки, соответствующих элементов массива А.
184
2. Реализовать в виде модуля набор подпрограмм для выполнения
следующих
операций с квадратными матрицами: 1) сложение 2х матриц; 2) умножение
одной матрицы на другую; 3) нахождение транспонированной матрицы;
Матрицу описать следующим образом:
Const Nmax=10;
Type Matrica = Array [1.. Nmax,1.. Nmax] of real;
Используя этот модуль решить следующие задачи:
А) решить систему линейных уравнений N-го порядка (2<=N<=10) методом
Крамера.
В) задан массив величин типа Matrica. Отсортировать этот массив в порядке
возрастания значений определителей матриц.
3. Реализовать в виде модуля набор подпрограмм для выполнения
следующих операций над векторами на плоскости 1) сложение; 2)
вычитание; 3) скалярное умножение; 4) умножение вектора на число; 5)
определение длины вектора
Вектор представить в следующим типом:
Type Vector = Record X,Y : Real End;
Используя этот модуль решить следующие задачи:
А) Дан массив А векторов. Отсортировать его в порядке убывания длин
векторов.
В) С помощью датчика случайных чисел сгенерировать 2N целых чисел.
Эти N пар чисел задают N точек координатной плоскости. Вывести числа ,
которые являются координатами вершин треугольника с наибольшим углом.
4. Реализовать в виде модуля набор подпрограмм для выполнения
следующих действий над одномерным числовым массивом: 1) нахождение
максимального элемента массива; 2) нахождение минимального элемента
массива; 3) упорядочения элементов массива по возрастанию; 4)
упорядочения элементов массива по убыванию;
Используя этот модуль решить следующие задачи:
А) для двух массивов A(N) и B(M) разной размерности определить
разность между их максимальными элементами;
В) используя данные массивы A(N) и B(M) создать массив С(N+M),
состоящий из элементов этих массивов и упорядоченный по убыванию.
5. Реализовать в виде модуля набор подпрограмм для выполнения
следующих действий над одномерным числовым массивом: 1) нахождение
суммы положительных элементов массива; 2) нахождение произведения
отрицательных элементов массива; 3) нахождение среднего
арифметического элементов массива; 4) нахождение среднего
геометрического элементов массива;
Используя этот модуль решить следующие задачи:
А) вычислить сумму положительных элементов массива A(N) и
отрицательных элементов массива B(M);
185
B) вычислить разность между средним арифметическим элементов массива
A(N) и средним геометрическим элементов массива B(M).
6. Реализовать в виде модуля набор подпрограмм для выполнения
следующих
действий над матрицами: 1) объединение двух матриц с одинаковым числом
столбцов в одну матрицу : матрица B(L,M) присоединяется снизу к матрице
A(N,M), в результате получается матрица R(L+N, M); 2) объединение двух
матриц с одинаковым числом строк в одну матрицу: матрица B(N,L)
присоединяется справа к матрице A(N,M), в результате получается матрица
R(N,M+L); 3) сортировка элементов строк матрицы по возрастанию; 4)
сортировка элементов столбцов матрицы по убыванию; 5) вывод элементов
матрицы в общепринятом виде;
Используя этот модуль решить следующие задачи:
A) объединить две матрицы с одинаковым числом столбцов в одну матрицу и
в полученной матрице упорядочить элементы строк по возрастанию;
B) объединить две матрицы с одинаковым числом строк в одну матрицу и в
полученной матрице упорядочить элементы столбцов по убыванию;
7. Реализовать в виде модуля набор подпрограмм для выполнения
следующих
действий над матрицами: 1) нахождение наибольшего элемента матрицы; 2)
нахождение наименьшего элемента матрицы; 3) сложение двух матриц
A(N,M) и B(N,M) ; 4) нахождение суммы элементов каждой строки данной
матрицы; 5) вывод матрицы в общепринятом виде.
Используя этот модуль решить следующую задачу:
Сложить две матрицы A(N,M) и B(N,M). Полученную матрицу напечатать в
общепринятом виде, найти в ней наибольший и наименьший элементы , а
также вычислить суммы элементов каждой строки;
8. Реализовать в виде модуля набор подпрограмм для выполнения
следующих
операций над строками:
1) подсчет длины строки; 2) “переворот строки”; 3) конкатенация слов
строки, начинающихся с буквы “c”; 4) удаление из строки слов,
заканчивающихся буквой ( литерой)“k”.
Используя этот модуль решить следующие задачи:
А) Дан непустой текстовый файл f, разбитый на строки. Вывести на печать
самую длинную строку этого файла с указанием ее порядкового номера в
файле.
В) Дан текстовый файл g, разбитый на непустые строки. Создать и вывести
на
печать текстовый файл g1, получаемый из g путем “ переворота” нечетных
строк и удаления из четных строк всех слов , начинающихся с буквы “k”.
9. реализовать в виде модуля набор подпрограмм для выполнения
следующих
операций над строками:
1) подсчет слов, начинающихся с буквы “а”; 2) подсчет количества слов в
строке; 3) проверка “ вхождения ” какого-либо слова в строку; 4)
186
перепись слов строки в обратном порядке ( Мама мыла раму -- раму
мыла Мама);
используя этот модуль решить следующие задачи :
А) Переписать в текстовый файл f1 строки из непустого текстового файла
f состоящие из не менее , чем 7 слов или в которых имеется по крайней
мере 2 слова, начинающихся с буквы “а”.
В) переписать в текстовый файл g1 строки из текстового файла g в
неизменном виде, если они не содержат слово “тур”. В противном случае
их необходимо переписать в обратном порядке слов.
10. Реализовать в виде модуля набор подпрограмм для выполнения
следующих операций над натуральными числами в системах счисления с
основанием p (2<=p<=9): 1) сложение; 2) вычитание; 3) умножение; 4)
деление; 5) перевод из десятичной системы счисления в систему счисления
с основанием p; 6) перевод из системы счисления c основанием p в
десятичную систему ; 7) логическая функция поверки правильности записи
числа в системе счисления с основанием p; 8) функции, реализующие
операции отношения (=, <>, >=, <=, >, <)
Число в системе счисления с основанием p представить следующим типом:
Type Chislo = Array [1 .. 64] of 0..8;
Используя этот модуль решить следующие задачи:
А) Возведение числа в степень (основание и показатель степени записать в
системе счисления с основанием p). Ответ выдать в десятичной системе
счисления и системе счисления с основанием p.
В) Дан массив A чисел, записанных в системе счисления с основанием p.
Упорядочить его по убыванию. Ответ выдать в десятичной системе
счисления и системе счисления с основанием p.
11. Реализовать в виде модуля набор подпрограмм для выполнения
следующих операций над натуральными числами в шестнадцатеричной
системе счисления : 1) сложение; 2) вычитание; 3) умножение; 4) деление;
5) перевод из двоичной системы счисления в 16-чную ; 6) перевод из 16-ти
ой системы счисления в десятичную; 7) функция поверки правильности
записи числа в 16- ой системе счисления; ; 8) функции, реализующие
операции отношения (=, <>, >=, <=, >, <)
Используя этот модуль, решить следующие задачи :
А) Возведение числа в степень (основание и показатель степени записать в
16 –ой системе счисления). Ответ выдать в 16- ой и десятичной системах
счисления.
В) Дан массив A чисел, записанных в 16 ой системе счисления.
Упорядочить его по убыванию. Ответ выдать в 16-ой и десятичной системах
счисления.
12. Определим граф как набор точек, некоторые из которых соединены
отрезками, подграф-ком граф, представляющей собой подмножество
187
некоторого графа. Реализовать в виде модуля набор подпрограмм,
определяющих 1) число точек в графе; 2) число отрезков в графе;
3) число изолированных подграфов в графе (подграфов несоединенных
отрезками); 4) диаметр графа – длину максимальной незамкнутой линии в
графе ( длина каждого звена – единица); 5) граф-объединение двух графов;
6) подграф – пересечение двух графов; 7) подграф-дополнение данного
графа до полного (графа с тем же количеством вершин, что и в заданном, и с
отрезками между некоторыми двумя вершинами); 8) число отрезков,
выходящих из каждой вершины графа.
При запуске должны инициализироваться переменные:
Full_Graph – полный граф с числом вершин NumberOfVertix,
Null_Graph – граф без отрезков с числом вершин NumberOfVertix
Граф описать следующим образом:
Const NumberOfVertix=50;
Type Graph = Array[1 .. NumberOfVertix, 1 .. NumberOfVertix] of Boolean;
Используя модуль решить следующую задачу: найти все правильные графы
с N вершинами (граф правилен, если из всех вершин выходит равное
количество отрезков).
13. Реализовать в виде модуля набор подпрограмм для выполнения
следующих операций над длинными целыми числами (числами,
выходящими за диапазон допустимых значений некоторого целого типа): 1)
сложение; 2) вычитание; 3) умножение; 4) нахождение частного и остаток
от деления одного числа на другое; 5) функции, реализующие операции
отношения (=, <>, >=, <=, >, <)
“Длинное” число представить следующим типом:
Type Tsifra = 0 .. 9;
Shislo = Array [1 .. 1000] of Tsifra;
Используя _______этот модуль, решить следующие задачи :
А) Возведение числа в степень (основание и показатель степени «длинные»
числа).
В) Дан массив «длинных» чисел. Упорядочить этот массив по убыванию.
14. Реализовать в виде модуля набор подпрограмм для выполнения
следующих операций с многочленами от одной переменной ( первый
многочлен степени m, второй степени n): 1) сложение; 2) вычитание; 3)
умножение; 4) деление с остатком; 5) операции отношения (=, <>); 6)
возведение в нат.степень k одного из многочленов; 7) вычисление
производной от многочлена; 8) вычисление значение многочлена в точке x0.
Многочлен представить следующим типом:
Type Mnogochlen = Array [1 .. 500] of integer;
Используя этот модуль, решить следующие задачи :
А) Найти наибольший общий делитель многочленов P(x) и Q(x).
В) Вычислить : PS(X) – QR(X) (S,R- натуральные).
188
15. Реализовать в виде модуля набор подпрограмм для выполнения
следующих операций над «длинными» действительными числами (числами,
выходящими за диапазон допустимых значений некоторого действительного
типа или не представимых в памяти ЭВМ) : 1) сложение; 2) вычитание; 3)
умножение; 4) нахождение частного от деления одного числа на другое с
заданным количеством знаков после запятой; 5) функции, реализующие
операции отношения (=, <>, >=, <=, >, <); 6) тригонометрические функции,
где аргументом и значением являются «длинные» действительные числа
(указание: использовать разложение соответствующей функции в ряд).
«Длинное» действительное число представить следующим типом:
Type Tsifra = 0 .. 9;
Chislo = Array[1 .. 1000] of Tsifra;
LongReal = Record
Znak : 0 ..1; {0- «плюс», 1 –«минус»}
Ts, Dr : Chislo; {целая и дробная части}
End;
Используя этот модуль, решить следующие задачи :
А) Возведение число в степень (основание – «длинное» действительное
число, показатель степени – «длинное» целое число)
В) Дан массив «длинных» действительных чисел. Упорядочить этот массив
по возрастанию.
Форма отчета о выполнении лабораторной работы.
Отчет должен содержать:
1. Алгоритм решения задачи;
2. Программу реализации алгоритма;
3. Результат выполнения программы.
Блиц-тест.
1. Укажите вариант ответа, не входящий в структуру модуля:
A) Заголовок модуля.
B) Интерфейсный блок.
C) Блок реализации.
D) Локальный блок.
E) Блок инициализации.
2. Служебное слово, объявляющее реализацию модуля:
A) Unit
B) Implementation.
C) Interface.
D) Begin.
E) Uses.
3. Что такое модуль:
A) Программа, компилирующаяся независимо от основной.
B) Самостоятельно выполняющаяся программа.
C) Подпрограмма.
D) Основная программа.
189
E) Программа не компилирующаяся самостоятельно.
Контрольные вопросы.
1. Из каких частей состоит модуль?
2. Обязательно ли должны совпадать имя модуля и имя файла, в который
помещен модуль?
3. Обязательна ли секция инициализации в модуле?
4. Сколько раз выполняются операторы секции инициализации?
5. Как подключить к основной программе модуль пользователя?
Глоссарий.
Модуль – это автономно компилируемая программная единица для хранения
элементов, которые можно использовать в тех или иных программах.
В интерфейсной секции модуля определяются глобальные объекты,
доступные для программы и других модулей.
Исполнительная часть модуля включает все подпрограммы модуля в той
последовательности, в какой были даны их заголовки в интерфейсной части.
Секция инициализации содержит исполняемые операторы, которые
выполняются единственный раз в момент запуска программы, перед
обращением к модулю.
Литература.
1. Фаронов В.В. «Turbo Pascal 7.0», М., Издательство «Нолидж», 1997
2. Бурин Е.А. «Программирование на языке Турбо-Паскаль», Учебное
пособие, Алматы, АГУ,2000
3. Немнюгин С.А. TURBO PASCAL, СПб, Питер, 2000
4. Попов В.Г. . «Turbo Pascal 7.0», М., Финансы и статистика, 1998
5. Программирование на языке Паскаль./Под редакцией УСКОВОЙ О.Ф. –
СПб, Питер, 2002
Лабораторная работа №14.
ГРАФИЧЕСКИЕ ВОЗМОЖНОСТИ ТР
Цель: изучение базовых процедур и функций графических программ,
изучение
методов построения и получение практических навыков создания программ
построения графиков функций.
Материалы и оборудование: ПК, среда Turbo Pascal, методические указания к
лабораторным работам.
Содержание и порядок выполнения работы:
1. Повторить теоретический материал по данной теме.
Инициализация графики
Видеорежимы
Прежде чем работать с графикой, необходимо установить наиболее
подходящий для Вашего монитора видеорежим. Turbo Pascal имеет
фиксированное число драйверов, каждый из которых поддерживает от
одного
до трех видеорежимов. Тип драйвера и видеорежим задаются как число или
как
символическая константа. Для режимов адаптера VGA используются
константы:
190
VGALo = 0 - графика низкого разрешения для VGA (640*200 точек, 16
цветов,
4 видеостраницы)
VGAMed = 1 - графика среднего разрешения для VGA (640*350 точек, 16
цветов, 2 видеостраницы)
VGAHi = 2 - графика высокого разрешения для VGA (640*480 точек, 16
цветов,
1 видеостраница)
Инициализация и закрытие видеорежима
После подключения модуля Graph программисту доступны все находящиеся
в
нем подпрограммы. В первую очередь вызывается процедура InitGraph,
которая устанавливает один из возможных графических режимов. Формат
процедуры:
Initgraph(<драйвер>, <режим>, <путь>); где
<драйвер> - пременная типа integer, задающая тип графического драйвера;
<режим> - пременная типа integer, определяющая режим работы
графического
адаптера;
<путь> - выражение типа string, содержащее путь к файлу графического
драйвера (если он находится в активном каталоге, то вместо указания пути
ставятся два апострофа - ' ').
Если Вы не знаете тип дисплея, то для задания типа драйвера можно
использовать стандартную константу Detect или ноль (0).
Начало программы для работы с графикой будет выглядеть так:
Program77;
Uses Crt, Graph;
Var
driver, regim: integer;
Begin
driver:=detect;
Initgraph (driver,regim,'');
Для закрытия графического режима используется не имеющая
параметров процедура Closegraph. В процессе ее выполнения освобождается
память, распределенная под драйверы графики, файлы шрифтов и
промежуточные данные и восстанавливается режим работы видеоадаптера до
состояния, в котором он находился до инициализации графического режима.
Процедура Restorecrtmode служит для кратковременного возврата в
текстовый режим. В отличие от процедуры Closegraph, не сбрасываются
установленные параметры графического режима и не освобождается память,
выделенная для размещения графического драйвера. Выполнив необходимые
действия в текстовом режиме, можно вернуться в графический процедурой
setgraphmode (getgraphmode).
Для очистки графического экрана используется процедура ClearDevice.
Производится очистка всего экрана с отменой всех настроек экрана,
процедур и
функций, сделанных до этого и графический курсор устанавливается на
первую
точку экрана (0,0).
Процедура Graphdefaults сбрасывает все установленные пользователем
типы линий, заполнения, шрифтов и пр.
191
Установка видеостраницы
Память видеобуфера подразделяется на несколько частей, которые
называются
видеостраницами.Их количество зависит от текущего режима и типа
адаптера.
Нумерация страниц начинается с нуля.
В каждый отдельный момент на экране может быть отображена только одна
страница - она называется видимой. Такая организация памяти видеобуфера
позволяет с помощью процедур и функций модуля Graph формировать
изображения на любой из страниц.
Процедура SetActivePage (Page: word) устанавливает активную страницу для
построения изображения, например:
SetActivePage (1); Здесь активной устанавливается страница 1. Построение
изображения производится незаметно для пользователя (активная страница
может не совпадать с видимой страницей. Сформированную страницу можно
показать на экране с помощью процедуры:
SetVisualPage (Page: word);
Обработка ошибок
Графическая программа может содержать ошибки, поэтому программист
должен предусмотреть все возможное для их своевременного обнаружения и
нейтрализации. Для этого имеются две функции: GraphResult,
GraphErrorMsg. Возможные ошибки и их коды приведены в таблице 1.
Таблица 1. Коды ошибок.
Константа
Значен
ие
Описание
GrOK
GrNoInitGraph
grNoDetected
grFileNottFound
grInvalidDriver
grNoLoadMem
grNoScanMem
grNoFloodMem
grFontNoFound
grNoFontMem
grInvalidMode
grError
grIOerror
grInvalidFont
grInvalidFontNu
m
0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-11
-12
-13
-14
Нет ошибок
Графика не инициализирована
Графическое устройство не обнаружено
Файл драйвера устройства не найден
Неправильный файл драйвера устройства
Недостаточно памяти для загрузки драйвера
Выход за пределы памяти при заполнении (scan
fill)
Выход за пределы памяти при заполнении (flood
fill)
Файл шрифта не найден
Недостаточно памяти для загрузки шрифта
Неверный графический режим для этого драйвера
Графическая ошибка
Ошибка графического ввода-вывода
Неверный файл шрифта
Неверный номер шрифта
Можно пользоваться как кодом ошибки, так и соответствующей константой,
например:
Uses Graph,CRT; Var ErrorNumber: integer; BEGIN
ErrorNumber:=GraphResult;
192
В переменной GraphResult содержится код ошибки. В программе
организовывается сообщение:
If ErrorNumber <> grOK then Writeln ('Обнаружена ошибка');
Базовые процедуры и функции графических программ
Система координат
Для построения изображений на экране монитора используется система
координат. Отсчет начинается от левого верхнего угла экрана (0,0); значение
Х
увеличивается слева направо, значение Y - сверху вниз.
Управление графическим курсором, цветами фона и вывода.
Процедура MoveTo(x,y); устанавливает курсор по заданным координатам
(х,у).
Функции GetX и GetY определяют текущие координаты курсора.
Процедура SetColor(<цвет>:word) устанавливает текущий цвет для
последующего вывода графической и текстовой информации на графический
экран в этом цвете, где <цвет>:word - выражение для номера цвета. В модуле
graph определены следующие константы для задания цвета:
const black =0; {черный} blue =1; { синий}
green =2; {зеленый } cyan =3; {голубой}
red =4; { красный} magenta =5; { фиолетовый}
brown =6; { коричневый} lightgrey =7; { светло - серый}
darkgrey =8; { темно - серый} lightblue =9; { ярко - синий}
lightgreen =10; { ярко - зеленый} lightcyan =11; {ярко голубой }
lightred =12; {розовый } lightmagenta =13; { малиновый}
yellow =14; {желтый} white =15; {белый}.
Функция GetColor выдает номер текущего цвета вывода.
Функция GetMaxColor выдает максимальный номер цвета вывода.
Процедура SetBkColor(<цвет>:word) сразу, при исполнении, изменяет
текущий цвет фона графического экрана на заданный цвет, где <цвет>:word выражение для номера цвета.
Функция GetBkColor выдает номер текущего цвета фона вывода.
Функция GetMaxColor выдает максимальный номер цвета вывода.
Процедура SetLineStyle(вид:word, образец:word, толщина:word);
устанавливает стиль вычерчиваемых линий. Вид линий определяется
следующими константами:
const solidln =0; { сплошная линия}
dottedln =1; { точечная линия}
centerln =2; {штрихпунктирная линия}
dashedln =3; { пунктирная линия}
uerbitln =4; { вид линии определяется пользователем}.
Для всех видов линий от 0 до 3 значение образец задается равным 0; для
пользовательского вида задается собственный шаблон.
Параметр толщина задает толщину линий и может принимать одно из
двух значений:
const normwidth =1; { толщина в одну точку}
193
thickwidth =3; { толщина в три точки}.
Процедура SetFillStyle(тип:word, цвет:word); устанавливает стиль заполнения
фигур.
Тип заполнения определяется следующими константами:
const emptyfill =0; {заливка цветом фона}
solidfill =1; { заливка назначенным цветом}
linefill =2; {штриховка линиями}
itslashfill =3; {штриховка ////////}
slashfill =4; { штриховка утолщенными ////////}
bkslashfill =5; { штриховка \\\\\\\}
itbkslashfill =6; { штриховка утолщенными \\\\\\\\}
hatchfill =7; { штриховка +++++}
xhatchfill =8; { штриховка xxxxxx}
interleavefill =9; { штриховка в клетку}
widedotfill =10; { штриховка редкими точками}
closedotfill =11; { штриховка частыми точками}
userfill =12; {определяется пользователем}.
Построения на графическом экране
Процедура PutPixel(x,y,цвет); выводит на экран графическую точку по
заданным координатам заданным цветом.
Процедура Outtextxy(x,y,текст); выводит текст на экран с точки, заданной
координатами х,у.
Процедура Line(х1,у1,х2,у2); строит текущим цветом отрезок по заданным
координатам его начала и конца.
Процедура LineTo(x,y); строит текущим цветом отрезок от позиции
графического курсора до точки с заданными координатами.
Процедура LineRel(dx,dy); строит текущим цветом отрезок от позиции
графического курсора до точки, определяемой заданными приращениями к
координатам курсора.
Процедура RecTangle(x1,y1,x2,y2); вычерчивает прямоугольник, со
сторонами
параллельными осям координат экрана, по указанным координатам двух
вершин на его диагонали.
Процедура Bar3d(x1,y1,x2,y2,<глубина>,<верх.грань>); вычерчивает
текущим
цветом трехмерное изображение прямоугольного параллелепипеда и
закрашивает его переднюю грань.
Процедура Circle(x,y,r); вычерчивает окружность радиуса r с центром (x,y).
Процедура Arc(x,y,нач.угол, кон.угол,r); вычерчивает дугу радиуса r с
центром (x,y). Нач.угол, кон.угол - выражения типа word, задающие
начальный
и конечный углы дуги, углы отсчитываются против часовой стрелки и
указываются в градусах.
Процедура Pieslice(x,y,нач.угол, кон.угол,r); вычерчивает сектор окружности
радиуса r с центром (x,y). Нач.угол, кон.угол - выражения типа word,
задающие
начальный и конечный углы сектора, углы отсчитываются против часовой
194
стрелки и указываются в градусах. Построенный сектор заполняется
текущим
цветом и стилем.
Процедуры Ellipse(x,y,нач.угол,кон.угол,rx,ry); Fillellipse(x,y,rx,ry);
Sector(x,y,нач.угол,кон.угол,rx,ry); вычерчивают эллипсную дугу, эллипс или
его сектор. x,y - центр, нач.угол, кон.угол - выражения типа word, задающие
начальный и конечный углы дуги, углы отсчитываются против часовой
стрелки
и указываются в градусах, rx,ry - выражения типа word, определяющие
горизонтальный и вертикальный радиусы эллипса. Эллипс, построенный
процедурой Fillellipse, или его сектор (sector) заполняется текущим цветом и
стилем.
Процедура FloodFill(x,y, цвет границы); закрашивает текущим цветом и
стилем произвольную замкнутую фигуру, x,y - координаты любой точки
внутри
замкнутой фигуры.
2. Разобрать пример построения графика функции
Построение графиков функций
График может служить хорошим примером представления информации
на экране. Основу его построения составляет черчение линий по заданным
точкам. Проще всего такие точки выбирать в соответствии с делениями оси
Х.
Т.к. на экране мы не можем уместить весь график функции на интервале от
минус бесконечности до плюс бесконечности, то мы сможем посмотреть
только
часть графика, ограниченного прямоугольником, координаты левого нижнего
и
правого верхнего углов которого хранятся в переменных (x2,y2) и (x1,y1)
соответственно.
Поскольку размер этой прямоугольной плоскости может не совпадать с
размером экрана (640x480), то нам надо ввести две переменные dx и dy. Они
будут хранить коэффициент растяжения прямоугольной плоскости на экран
монитора. Их значения задаются формулами: dx:= (x1 - x2)/640 (растяжение
по
оси OX) и dy:= (y1 - y2)/480 (растяжение по оси OY).
После того, как нашли коэффициент, на экране надо нарисовать
координатные
оси, если они входят в нашу прямоугольную плоскость. Чтобы это сделать
потребуется оси спроектировать на экран. Для этого найдём x0 и y0. x0:=
round
(0-x2/dx), т.е. мы от начала координат отнимаем координату левого края
нашей
прямоугольной плоскости и переводим в экранные координаты, поделив на
коэффициент dx. После этого рисуем прямую на экране от точки (x0,0) до
(x0,480) - получили на мониторе ординату координатной плоскости.
Аналогично поступим с абсциссой: y0:= round (0-y2/dy) и прямая (0,y0)(640,y0).
Теперь переходим непосредственно к построению графика:
1. Задаём цикл i от нуля до 640 (от левого края экрана до правого);
2. Проектируем экранную точку с x-координатой, равной i, на координатную
ось: x:= x2 + i * dx;
3. Находим с помощью заданной функции y(x);
4. Проектируем точку на экран: yx:=-round((y2+y)/dy). Т.к. начало отсчёта в
графическом режиме на мониторе начинается с левого верхнего угла, то без
знака "-" график получился бы перевёрнутым;
195
5. Выводим точку с координатой (i, yx) на экран;
6. Переходим в пункт 1;
7. Конец программы.
ПРИМЕР
Программа построения графика функции
program funk1;
uses crt, graph;
var
dv,{Графический драйвер}
Mv,{Графический режим}
{Вспомогательные переменные}
x1,x2,y1,y2:integer; {с помощью этих переменных задаём квадрат на
координатной плоскоти, внутрянная часть которого должна отобразится на
экране}
x0,y0:integer; {оси абсцисс и ординат}
dx,dy:real; {коэффициенты растяжения заданной части координатной
плоскости на экран}
x,y:real; {эти переменные задают функцию}
yx:integer;
i:real;
{Тело программы}
BEGIN
dv:=detect;
InitGraph(dv,mv,'c:\bp\bgi'); {инициализация графического режима}
{Вывод результатов исследования функции}
SetBkColor(white);
Setcolor(blue);
outtextxy(80,10,'Исследование y=(x^2+1)/(x^2-1) и построение ее графика.');
Setcolor(cyan);
outtextxy(10,40,'Находим область определения функции: x<>+1, x<>-1');
outtextxy(10,45,' + +');
outtextxy(10,60,'Находим области значении функции: y=(x^2+1)/(x^2-1) .
.. ');
outtextxy(10,68,' -1 1 ');
outtextxy(10,80,'Находим точки пересечения с осями: OX y=0, (x^2+1)/(x^21)=0,') outtextxy(10,100,' x^2+1=0, x^2=-1 - решений нет.');
outtextxy(10,120,Пересечения с осью OX нет.');
1
1
2
2
x
x
y
196
outtextxy(10,140,' : OY x=0, y=(0+1)/(0-1)=-1');
outtextxy(10,160,'Пересечение с осью OY (0;-1).');
outtextxy(10,180,'Нахождение точек разрыва: в точках х=1; х=-1 функция не
существует, т.к..');
outtextxy(10,200,'при подставлении в уравнение y=(x^2+1)/(x^2-1) x=-1,x=1
получаем ');
outtextxy(10,220,'неопределенность 0/0, следовательно х=1,х=-1 - точки
разрыва.');
outtextxy(10,240,Нахождение асимптот: вертикальные х=1 и х=-1;');
outtextxy(10,260,'горизонтальные y=1; ');
outtextxy(10,280,'наклонные асимптоты вида y=kx+b ');
outtextxy(10,300,'k=0 - вертикальная асимптота выродилась в
горизонтальную;');
outtextxy(10,320,'b=1 - горизонтальная асимптота.');
outtextxy(10,340,' + + - ');
outtextxy(10,360,'Находим экстремумы функции: x=0; x=1; x=-1 . . .
');
outtextxy(10,380,' -1 0 1
');
outtextxy(10,400,' f(0)=(0+1)/(0-1)');
outtextxy(10,420,' (0;-1) - точка максимума');
Setcolor(magenta);
outtextxy(10,470,'ДЛЯ ПРОДОЛЖЕНИЯ НАЖМИТЕ ЛЮБУЮ КЛАВИШУ');
{_________________________________________________________________
_}
{ЗАДЕРЖКА КАРТИНКИ НА ЭКРАНЕ}
readkey;
{ОЧИСТКА ЭКРАНА}
cleardevice;
Setcolor(cyan);
{ВЫВОД ГРАФИКА ЗАДАННОЙ ФУНКЦИИ}
outtextxy(150,10,'ГРАФИК ФУНКЦИИ');
outtextxy(10,470,'ДЛЯ ВЫХОДА ИЗ ПРОГРАММЫ НАЖМИТЕ ЛЮБУЮ
КЛАВИШУ');
setcolor(9);
x1:=10; y1:=15;
x2:=-10; y2:=-15; {задаём квадрат на координатной плоскости, который
нам потребуется просмотреть}
dx:=(x1-x2)/640; {устанавливаем коэффициенты растяжения заданной части
координатой плоскости на экран}
dy:=(y1-y2)/480;
x0:= round (-x2/dx);
y0:= round (-y2/dy);
{ВЫВОД КООРДИНАТНЫХ ОСЕЙ}
line(x0,30,x0,460); {рисуем ось ординат (OY)}
197
line(50,y0,550,y0); {рисуем ось абсцисс (OX)}
outtextxy(x0+3,y0+3,'0');
outtextxy(x0+230,y0+5,'x');
outtextxy(x0+10,y0-200,'y');
setlinestyle(1,0,1);
Setcolor(7);
{ВЫВОД ВСПОМОГАТЕЛЬНЫХ ЛИНИЙ}
line(287,y0+220,287,y0-220);
line(353,y0+220,353,y0-220);
line(x0+225,255,x0-255,255);
line(x0+225,225,x0-255,225);
setcolor(Blue);
outtextxy(x0+3,y0+20,'-1');
outtextxy(x0+3,y0-15,'1');
outtextxy(x0+35,y0+3,'1');
outtextxy(x0-35,y0+3,'-1');
setcolor(7);
outtextxy(405,230,'y=1');
outtextxy(355,350,'x=1');
outtextxy(255,350,'x=-1');
{ПОСТРОЕНИЕ ГРАФИКА ФУНКЦИИ}
i:=60;
repeat {построение графика функции}
x:=x2 + i * dx; {пересчитываем координаты экранные в координаты
плоскости}
y:=(x*x+1)/(x*x-1); {задаём функцию на координатной плоскости}
yx:=-round((y2+y)/dy); {пересчитываем координату для отображения на
экране}
PutPixel (round(i),yx,9); {ставим точку с кооринатой (i,yx)}
i:=i+0.111;
until i>550;
{ЗАДЕРЖКА КАРТИНКИ НА ЭКРАНЕ}
readkey;
{ЗАКРЫТИЕ ГРАФИЧЕСКОГО РЕЖИМА}
Closegraph;
END.
3. Внимательно прочитать условие задачи.
4. Составить алгоритм решения задачи.
5. Реализовать алгоритм на языке Turbo Pascal.
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ
Исследовать функцию и построить ее график. Исследование вывести на
экран,
построение графика должно происходить динамически.
Варианты заданий:
198
Форма отчета о выполнении лабораторной работы.
Отчет должен содержать:
1. Алгоритм решения задачи;
2. Программу реализации алгоритма;
3. Результат выполнения программы.
Блиц-тест.
1. Процедура InitGraph (VarDriver, Mode:Integer; Path: String):
A. завершает работу адаптера в графическом режиме и восстанавливает
текстовый режим работы экрана;
B. устанавливает нужный текстовый режим;
C. инициирует графический режим работы адаптера ;
D. очищает экран и помещает курсор в верхний левый угол;
E. устанавливает текущее окно для графического вывода.
2. Процедура SetBkColor (Color:Word) в ТР:
A. устанавливает цвет фона;
B. штрихует замкнутую область, используя текущий цвет;
C. устанавливает основной цвет, которым осуществляется рисование;
D. устанавливает стиль линии;
E. возвращает текущий цвет
3. Графические драйверы обычно располагаются на диске в виде файлов с
расширением
A. COM;
B. TRU;
C. PAS;
D. BGI;
E. TPL.
yxx
x
yx
x
x
y
y x arctgx
x
x
y
x
y
yxx
yex
yx
x
e
y
x
x
y
x
x
y
x
x
12) sin
2
11) sin
sin
10)
9) 2
4
1
8)
1
1
7)
6) 4 3
5) sin
4) ln( 1)
3)
1
2)
1
1)
2
2
2
sin
2
2
2
2
199
4. Процедура Line (x1,y1,x2, y2:Integer) в Turbo Pascal:
A. рисует прямоугольник с координатами верхней левой вершины x1,y1 и
нижней правой x2,y2;
B. смещает текущий указатель от точки x1,y1 до точки x2,y2;
C. рисует линию от точки x1,y1 до точки x2,y2;
D. рисует полосу заданного размера, используя текущий стиль и цвет x1,y1 –
координаты левого верхнего и x2,y2 – правого нижнего углов
закрашиваемой области;
E. рисует трехмерную полосу, используя текущий стиль и цвет x1,y1 –
координаты левого верхнего и x2,y2 – правого нижнего углов передней
грани.
5. Процедура PutPixel (x,y: Integer; Color: word) в Turbo Pascal:
A. выводит заданным цветом точку по указанным координатам
B. рисует прямоугольник с координатами верхней левой вершины x1,y1 и
нижней правой x2,y2;
C. смещает текущий указатель в точку по указанным координатам;
D. рисует полосу заданного размера, используя текущий стиль и цвет x1,y1 –
координаты левого верхнего и x2,y2 – правого нижнего углов
закрашиваемой области;
E. рисует линию от точки x1,y1 до точки x2,y2;
6. Процедура Circle (x,y: Integer; R: word) в Turbo Pascal:
A. выводит заданным цветом точку по указанным координатам
B. рисует прямоугольник с координатами верхней левой вершины x1,y1 и
нижней правой x2,y2;
C. смещает текущий указатель в точку по указанным координатам;
D. вычерчивает окружность с центром в точке с координатами x,y и
радиусом
R
E. рисует линию от точки x,y длиной R
Контрольные вопросы.
1. Какой вид имеет система координат в графическом режиме?
2. Какие процедуры и функции применяются для сохранения и
последующей выдачи изображений.
3. Назовите информационные процедуры модуля GRAPH, какую
информацию можно получить с их помощью.
4. Какая функция позволяет выполнять обработку ошибок графического
режима?
5. Какие процедуры используются для вывода текста в графическом
режиме?
Глоссарий.
Графика языка Паскаль – это перечень графических процедур и функций. Все
аргументы всех графических процедур и функций могут быть только целого
типа.
Драйвер – это специальная программа, осуществляющая управление теми
или
иными техническими средствами ПК. Графические драйверы располагаются
в
отдельном подкаталоге bgi в виде файлов с расширением . bgi.
200
Инициализация графического режима – это переход из текстового в
графический режим работы адаптера (экрана).
Чередование засвечиваний и гашений изображения используют для
имитации
движения этого изображения на экране. Перед очередным засвечиванием
объект необходимо переместить в направлении его движения. Движение
изображения на экране называют анимацией. Для имитации движения
объекта
на экране нужно выполнить такой циклический алгоритм:
1. Нарисовать объект в нужной точке, сделать паузу.
2. Удалить объект, закрасив его цветом фона.
3. Изменить координаты объекта.
4. Возвратиться к пункту 1.
Литература.
1. Фаронов В.В. «Turbo Pascal 7.0», М., Издательство «Нолидж», 1997
2. Бурин Е.А. «Программирование на языке Турбо-Паскаль», Учебное
пособие, Алматы, АГУ,2000
3. Немнюгин С.А. TURBO PASCAL, СПб, Питер, 2000
4. Попов В.Г. . «Turbo Pascal 7.0», М., Финансы и статистика, 1998
5. Программирование на языке Паскаль./Под редакцией УСКОВОЙ О.Ф. –
СПб, Питер, 2002
201
?
?
Адрес1
Адрес2
Лабораторная работа №15.
РАБОТА С ДИНАМИЧЕСКИМИ СТРУКТУРАМИ.
Цель: овладение навыками алгоритмизации и программирования
динамических структур данных.
Материалы и оборудование: ПК, среда Turbo Pascal, методические указания к
лабораторным работам.
Содержание и порядок выполнения работы:
1. Повторить теоретический материал по данной теме.
При объявлении данных динамической структуры в разделе описаний
указывается не сама переменная какого-либо типа, а указатель (ссылка) на
нее.
В результате указатель будет обычной переменной, а переменная на которую
он указывает – динамической.
P: ^Char; P^ :Char; var P: ^Char;
Begin
P^:= ’*’;
...
End.
Использование идентификатора указателя в программе означает обращение к
адресу ячейки памяти, на которую он указывает. Чтобы обратиться к
содержимому ячейки, на которую указывает указатель, требуется после его
идентификатора поставить символ ^. Эта операция называется операцией
разыменования.
Указательная переменная P может быть в трех состояниях:
1. Содержать адрес какой-либо переменной, память под которую уже
выделена.
2. Содержать специальный пустой адрес nil.
3. Находиться в неопределенном состоянии.
В неопределенном состоянии указатель бывает в начале работы программы
до
первого присваивания ему или конкретного, или пустого адреса nil, а также
после освобождения области памяти на которую он указывает.
ПРОСТЕЙШИЕ ДЕЙСТВИЯ НАД УКАЗАТЕЛЯМИ.
Действие Результат
1. Объявление
____________type a ?
Plnt = ^integer;
Var a,b: Plnt; b ?
2. выделение памяти a a^
new(a);
new(b); b b^
Адрес ‘ *’
202
Адрес1 1
Адрес2 2
Адреc1 1 2
Адреc2 2
Адреc2
2
Адреc2 2
Адреc2
Адреc2 2
Адреc2
nil
2
3. занесение информации a a^
a^:=1;
b^:=2; b b^
4. копирование информации a
a^ a^:=b^ a^:=b^
b b^ a<>b
5. a) копирование адреса
a:= b; a a^=b^
b a^ a=b
b^
б) dispose(a); a
a:= b;
b a^
b^
a a^
b:= nil;
b b^
Процедура New(a) выделяет область памяти соответственно тому типу,
который описан для указателя А и записывает адрес выделенной памяти в
указатель.
Процедура Dispose(A) освобождает область памяти , на которую указывает
указатель А, после чего эта область памяти становится доступной для
распределения под другие динамические переменные.
203
ОРГАНИЗАЦИЯ ВЗАИМОСВЯЗЕЙ В СВЯЗАННЫХ ДИНАМИЧЕСКИХ
ДАННЫХ.
Связанные динамические данные характеризуются высокой гибкостью
создания структур данных различной конфигурации. Это достигается
благодаря возможности выделять и освобождать память под элементы в
любой момент времени работы программы и возможности установить
связь между двумя любыми элементами с помощью указателей.
Для организации связей между элементами динамической структуры данных
требуется, чтобы каждый элемент содержал кроме информационных
значений
как минимум один указатель. Отсюда следует, что в качестве элементов
таких
структур необходимо использовать записи, которые могут объединять в
единое
целое разнородные элементы.
В простейшем случае элемент динамической структуры данных должен
состоять из двух полей: информационного и указательного.
Схематично такую структуру данных можно показать следующим
образом:
Соответствующие ей объявления будут иметь такой вид:
Type
TPtr = ^ TElem;
TElem = Record
Inf : real;
Link: TPtr
End;
Правило последовательности описаний в Турбо Паскаль требует, чтобы
каждый идентификатор был описан, прежде чем он будет использоваться для
других объявлений. Для описания типов элементов динамических структур
данных сделано исключение.
Тип указателя на элемент динамической структуры данных может и должен
быть описан перед описанием типа этого элемента.
ОПЕРАЦИИ НАД СПИСКАМИ.
Основными операциями над списками являются:
1. переход от элемента к следующему элементу;
2. включение нового элемента в список;
3. исключение элемента из списка.
Пусть значением переменной q типа TPtr является ссылка на некоторый
элемент списка целых чисел. Тогда после присваивания q:= q^.link ее
inf
link
inf
link
inf
link
204
значением будет или ссылка на следующий элемент этого списка (если такой
элемент имеется ) или NIL. Пользуясь таким способом перехода от одного
элемента к другому , можно просматривать весь список или его часть.
Пусть имеются переменные p, q, r типа TPtr и значением переменной q
является ссылка на некоторый элемент списка целых чисел? А значением p ссылка на первый элемент этого списка, пусть требуется включить в данный
список после элемента? Ссылка на который является значением переменной
q,
новый элемент, содержащий число 17. Для этого нужно выполнить
последовательность операторов
New( r ); r^.inf:= 17; r^.link:= q^.link; q^.link:=r;
Пусть теперь значением переменной q является ссылка на некоторый (не
последний) элемент списка целых чисел и требуется исключить из списка
элемент, следующий за тем, ссылка на который является значением
переменной q. Для этого нужно выполнить последовательность операторов
R:= q^.link; q^.link:= q^.link^.link; r^.link:= nil
Второе из этих присваиваний – это исключение элемента из списка, а первое
выполняется для того, чтобы сохранить ссылку на исключенный элемент, т.е.
чтобы после исключения из списка он оставался доступным и с ним можно
было бы выполнять некоторые действия (например, вставить его на другое
место в списке или освободить занимаемую им память с помощью dispose).
Третье присваивание выполняется для того, чтобы сделать исключение
окончательным, т.е. чтобы из исключенного элемента по ссылке нельзя было
попасть в список, из которого этот элемент исключен.
Таким образом, операции включения и исключения элементов представляют
собой изменение значений полей ссылочного типа некоторых элементов
списка. Однако рассмотренные методы включения и исключения не подходят
для включения нового элемента в начало списка и для исключения первого
элемента списка, так как у первого элемента нет предшествующего. Пусть
попрежнему значением переменной p типа TPtr является _______ссылка на
первый
элемент списка целых чисел. Для того чтобы включить в начало списка
новый
элемент, содержащий число 17, нужно выполнить действия:
New( r ); r^.inf:= 17; r^.link:= p; p:=r;
Для исключения первого элемента из списка нужно выполнить:
R:=p; p:=p^.link; r^.link:= nil;
То, что включение (или исключение) в зависимости от местоположения
элемента в списке выполняется по разному, доставляет неудобства при
программировании. В программах приходится предусматривать
дополнительные проверки для того, чтобы выполнить включение или
исключение одним из двух способов. Чтобы сделать действия, выполняемые
при включении элемента в список (исключение элемента из списка),
единообразным, применяется следующий прием. В начало каждого списка
добавляется заглавный элемент. Он никогда не исключается из списка и
перед
ним в список никогда не включается новые элементы. Информационная
часть
заглавного элемента или не используется вообще, или используется для
205
специальных целей. Например, в случае списка целых чисел она может
содержать число , равное количеству элементов списка. Добавление
заглавного
элемента в список приводит к тому, что теперь у всех элементов, в том числе
и
у первого элемента, имеется предшественник, и действия по включению
новых
элементов в список (или исключению элементов из списка) проводятся
одним
способом.
2. Разобрать пример задачи:
Создать список, информационная часть которого содержит фамилии
студентов.
Распечатать созданный список.
Построение выполняется до нажатия клавиши <enter> вместо ввода фамилии.
ПРОГРАММА:
Type
p_stud = ^ student;
student = record
name : string[20];
next : p_stud;
end;
var
head: p_stud; {начало списка}
curr : p_stud;
buf : string[20];
Begin
Repeat
Write(‘Фамилия? ‘);
Readln(buf);
If length(buf) <> 0 then
Begin
New(curr);
curr^.name := buf;
curr^.next := head;
head := curr;
end;
until length(buf) = 0;
writeln(‘***введенный списоr***');
curr := head;
while curr<> nil do
begin
writeln(curr^.name);
curr:= curr^.next
end;
readln
end.
3. Внимательно прочитать условие задачи согласно варианта.
4. Составить алгоритм решения задачи.
5. Реализовать алгоритм на языке Turbo Pascal.
206
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ
1.Дан однонаправленный список. Информационная часть списка содержит
целые числа. Вычислить среднее арифметическое элементов списка.
2.Дан однонаправленный список. Информационная часть списка состоит из
символов. Заменить в списке символ «а» на «д».
3.Дан однонаправленный список. Поменять местами первый и последний
элементы непустого списка L.
4.Описать процедуру или функцию, которая переносит в конец непустого
списка L его первый элемент.
5.Описать процедуру или функцию, которая вставляет в список L новый
элемент E1 за каждым вхождением элемента E.
6.Описать процедуру или функцию, которая вставляет в непустой список L
пару элементов E1, E2 перед его последним элементом.
7.Описать процедуру или функцию, которая удаляет из списка L за каждым
вхождением элемента E один элемент , если такой есть и он отличен от E.
8.Описать процедуру или функцию, которая удаляет из списка L все
отрицательные элементы (инф. часть = real).
9.Описать процедуру или функцию, которая проверяет есть ли в списке L
хотя бы два одинаковых элемента.
10. Описать процедуру или функцию, которая которая переносит в начало
непустого списка L его последний элемент.
11. Описать процедуру или функцию, которая добавляет в конец списка L1
все элементы списка L2.
12. Описать процедуру или функцию, которая вставляет в список L за
первым вхождением элемента E все элементы списка L1, если E входит в L.
13. Описать процедуру или функцию, которая в списке L из каждой группы
подряд идущих равных элементов оставляет только один.
14. Описать процедуру или функцию, которая находит максимальный
элемент непустого списка L ( инф. часть = Real).
15. Описать процедуру или функцию, которая формирует список L ,
включив в него по одному разу элементы , которые входят в список L1, но не
входят в список L2.
Форма отчета о выполнении лабораторной работы.
Отчет должен содержать:
1. Алгоритм решения задачи;
2. Программу реализации алгоритма;
3. Результат выполнения программы.
Блиц-тест.
1. Стек- это частный случай однонаправленного списка, в котором:
A) разрешается добавлять элемент в начало, а удалять любой элемент с
конца;
B) разрешено добавлять и удалять элементы с одного конца, который
называется
вершиной;
C) определена связь между последним и первым элементом;
D) разрешается добавлять элемент в конец, а удалять с начала;
E) любой из перечисленных вариантов;
2. Очередь - это частный случай однонаправленного списка, в котором:
A) разрешается добавлять элемент в начало, а удалять любой элемент с
конца;
207
B) определена связь между последним и первым элементом;
C) разрешено добавлять и удалять элементы с одного конца, который
называется
вершиной;
D) любой из перечисленных вариантов;
E) разрешается добавлять элемент в конец, а удалять с начала;
3. К нелинейным связанным структурам относятся:
A) Стеки, очереди, списки
B) Деревья, сети
C) Стеки, деревья
D) Списки, очереди, сети
E) Списки, сети
Контрольные вопросы.
1. Укажите принципиальное отличие статических переменных от
динамических.
2. Поясните роль базового типа при работе с указателями.
3. Укажите причины использования динамических переменных.
4. Можно ли в качестве базового типа использовать тип, определяемый
пользователем?
5. Ограничена ли динамическая память?
Глоссарий.
Адрес – это совокупность двух шестнадцатиразрядных слов, называемых
сегментом и
смещением.
Сегмент – участок памяти, имеющий длину 64 кбайт и начинающийся с
физического адреса,
кратного 16.
Смещение указывает, сколько байт от начала сегмента необходимо
пропустить, чтобы
обратиться к нужному адресу.
Указатель – это переменная, которая в качестве своего значения содержит
адрес байта
памяти. Указатели различают типизированные и нетипизированные.
Динамические структуры данных – это структуры данных с переменным
числом
однотипных элементов. Каждый элемент имеет две части: информационную
и ссылочную.
Линейные списки – это данные динамической структуры, которые
представляют собой
совокупность линейно связанных однородных элементов, и для которых
разрешается
добавлять элементы между любыми двумя другими, и удалять любой
элемент.
Кольцевые списки – это такие же данные, как и линейные списки, но
имеющие
дополнительную связь между последним и первым элементами списка.
Очередь – частный случай линейного односвязного списка, для которого
разрешены только
два действия: добавление элемента в конец очереди и удаление элемента из
начала очереди.
Стек - частный случай линейного односвязного списка, для которого
разрешено добавлять
или удалять элементы только с одного конца списка, который называется
вершиной стека.
Деревья – это динамические данные иерархической структуры произвольной
конфигурации.
Элементы дерева называются вершинами (узлами).
Пирамидой (упорядоченным деревом) называется дерево, в котором значения
вершин (узлов)
всегда возрастают или убывают при переходе на следующий уровень.