Контрольные вопросы - Автоматизированная информационная

advertisement
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ
РЕСПУБЛИКИ КАЗАХСТАН
ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
имени ШАКАРИМА города Семей
УЧЕБНО-МЕТОДИЧЕСКИЙ КОМПЛЕКС
ДИСЦИПЛИНЫ
«Алгоритмизация и основы программирования»
для специальности 5В070400-Вычислительная техника и программное
обеспечение
УЧЕБНО-МЕТОДИЧЕСКИЕ МАТЕРИАЛЫ
Семей 2014
СОДЕРЖАНИЕ
1 Глоссарий
2 Лекции
3 Лабораторные занятия
4 Практические занятия
5 Самостоятельная работа студента
1 ГЛОССАРИЙ
Алгоритм — это последовательность действий, которые необходимо
выполнить, чтобы решить поставленную задачу.
Проект - Документ, полученный в результате проектирования.
Обследование — это изучение и диагностический анализ существующей
системы обработки информации.
Техническое задание — это документ, утвержденный в установленном
порядке, определяющий цели, требования и основные исходные данные,
необходимые для разработки автоматизированной системы управления, и
содержащий предварительную оценку экономической эффективности системы.
Технический проект системы — это техническая документация,
утвержденная в установленном порядке, содержащая общесистемные
проектные решения, алгоритм решения задач, а также оценку экономической
эффективности автоматизированной системы управления и перечень
мероприятий по подготовке объекта к внедрению.
Рабочий проект — это техническая документация, утвержденная в
установленном порядке, содержащая уточненные данные и детализированные
общесистемные проектные решения, программы и инструкции по решению
задач, а также уточненную оценку экономической эффективности
автоматизированной системы управления и уточненный перечень мероприятий
по подготовке объекта к внедрению.
Переменная — это программный объект, значение которого может
изменяться в процессе работы программы.
Тип данных — это характеристика диапазона значений, которые могут
принимать переменные, относящиеся к этому типу данных.
Константа — это объект, значение которого известно ещё до начала
работы программы.
Литерная константа - любой символ языка, заключенный в апострофы.
Для обьявления переменных символьного типа в разделе переменных
используется слово CHAR.
Список ввода — это последовательность имён переменных, разделённых
запятыми. Например, при помощи команды.
Массивом будем называть упорядоченную последовательность данных
одного типа, объединенных под одним именем.
Метка помечает какое-либо место в тексте программы. Метками могут
быть числа от 0 до 9999 или идентификаторы, которые в этом случае уже
нельзя использовать для каких-либо иных нужд.
Тип-файл представляет собой последовательность компонент одного
типа, расположенных на внешнем устройстве (например, на диске). Элементы
могут быть любого типа, за исключением самого типа-файла.
Отладка — это поиск и исправление ошибок в программе.
Тестирование — это составление специальных наборов входных и
выходных данных (тестов), а затем исполнение программы и проверка
полученных результатов в поисках возможных семантических или логических
ошибок.
Имена, даваемые программным объектам (константам, типам,
переменным, функциям и процедурам, да и всей программе целиком)
называются идентификаторами.
Оператор присваивания - основной оператор любого языка
программирования. Общая форма записи оператора:
имя величины := выражение
Например, V:=A; или V:=A+1;
Элементарные конструкции - это минимальные единицы языка,
имеющие самостоятельный смысл.
Строки — это единственный структурированный тип данных, для
элементов которого определён порядок и, следовательно, возможны операции
сравнения (=, >, <).
Множество — это структурированный тип данных, поэтому его
невозможно задать нетипизированной константой.
Символы языка-это основные неделимые знаки, в терминах которых
пишутся все тексты на языке.
Массив - набор конечного числа элементов одинакового типа,
объединенных общим именем.
Индекс - это величина, характеризующая положение элементов
относительно начала массива.
Динамическая память -- это оперативная память ПК, предоставляемая
программе при ее работе, за вычетом сегмента данных (64 Кбайт), стека
(обычно 16 Кбайт) и собственно тела программы.
Решение задачи на ЭВМ — это сложный процесс, в ходе которого
пользователю приходится выполнять целый ряд действий, прежде чем он
получит интересующий его результат.
Интерпретатор - переводит на машинный язык отдельный оператор
(обычно строку программы) и сразу же выполняет его. Из современных языков
программирования интерпретатор используется в Basic (включая VBA) и
языках веб-разработки, например, PHP, JavaScript.
Транслятор переводит программу с языка программирования на
машинный язык "дословно" - целиком.
Жизненный цикл программы - весь путь ее создания от постановки
задачи до получения реальных результатов конечным пользователем
программы.
Цикл — это последовательность операторов, которая может выполняться
более одного раза. В языке Паскаль разработано три механизма для
конструирования циклов, использующих операторы FOR, WHILE, REPEAT.
2ЛЕКЦИИ
Алгоритмический язык Паскаль разработан профессором Цюрихского
технологического института Никлаусом Виртом в 1969-71 годах для обучения
студентов структурному программированию. Идеи, заложенные в основу
создания языка, позволили фирме Borland International значительно расширить
алгоритмические средства языка, а удобный интерфейс (меню команд) и
высокая скорость компиляции (процесса перевода текста программы в
машинные коды) сделали язык Турбо-Паскаль (Turbo-Pascal) одним из самых
распространенных среди начинающих и профессиональных программистов.
Процесс программирования начинается, как правило с составления
алгоритма - последовательности операций, описывающих процесс решения
задачи. Графическая запись алгоритма представляется в виде блок-схемы.
Составление алгоритма заключается в логическом описании процесса решения
задачи и требует знания элементов математической логики. Следует отметить,
что программированию предшествует важнейший этап - постановка задачи.
Постановка задачи может включать широкий спектр вопросов (разработка
математических и физических моделей, вывод расчетных формул и т. п. ).
Программист должен четко представлять явление или формулу, которые он
алгоритмизирует.
Программирование заключается в записи алгоритма на языке
программирования и отладке программы. Текст программы записывается в
текстовом редакторе, затем программа компилируется - переводится
транслятором (переводчиком) в машинные коды и запускается на выполнение.
Процесс отладки программы начинается с выявления:
 синтаксических ошибок в тексте ( неверно записанных операторов ),
 ошибок при выполнении программы ( недопустимые математические
действия, операции с числами, превосходящими предельные значения ),
 алгоритмических ошибок ( неверно составлен или запрограммирован
алгоритм ), и заканчивается, как правило написанием новой программы,
поскольку каждый программист знает, что программу можно
усовершенствовать до бесконечности, а отлаженную программу лучше не
изменять.
2.1 Лекция №1. Предмет курса, его цели и задачи. Роль
вычислительной техники в компьютерных системах.
Продолжительность – 1 час
Цель лекции – ознакомить обучающихся с предметом курса
«Алгоритмизация и программирование», дать понятие заничимости
вычислительной техники не только в отрасли компьютерных систем, но и,
вообще, в жизни человечества.
Предмет курса, его цели и задачи. Целью преподавания дисциплины
"Алгоритмизация и основы программирования" является получение студентами
знаний по организации основных этапов решения задач на ЭВМ, способам
конструирования программ с применением языков высокого уровня и основам
доказательства их правильности.
Автоматизированные системы обработки информации структурируются
по видам обеспечения: математическое обеспечение, программное обеспечение,
техническое обеспечение, информационное обеспечение, организационное
обеспечение, методическое обеспечение.
Математическое обеспечение - это совокупность математических
методов, математических моделей и алгоритмов обработки информации,
необходимых для выполнения прикладных процедур конкретной предметной
области автоматизации.
Программное обеспечение - совокупность машинных программ,
необходимых для выполнения автоматизированных процедур обработки
информации. Среди этой совокупности выделяются программы для
организации функционирования технических средств, т.е. для планирования и
управления вычислительным процессом, распределения вычислительных
ресурсов между многими пользователями. Эта часть представляет
общесистемное программное обеспечение (ПО). Общесистемное ПО создается
для многих приложений и не отражает специфику предметной области. Эта
специфика находит отражение в базовом и прикладном ПО. В базовое ПО
входят программы, обеспечивающие функционирование прикладных программ.
В прикладном ПО реализуется математическое обеспечение для
непосредственного выполнения автоматизированных процедур обработки
информации. Часто прикладное ПО реализуется в виде пакетов прикладных
программ (ППП).
Техническое обеспечение (ТО) представляет совокупность технических
средств, предназначенных для выполнения автоматизированных процедур
обработки информации. ТО делится на группы средств: программной
обработки данных, подготовки и ввода данных, отображения и
документирования, архива информации, передачи данных. Средства
программной
обработки
данных
представлены
процессорами
и
запоминающими устройствами, в которых реализуется программная обработка
данных, программное управление и вычисления. Средства подготовки, ввода,
отображения и документирования данных служат для общения человека с
ЭВМ. Средства архивирования представлены внешними запоминающими
устройствами. Средства передачи данных используются для организации
связей между территориально удаленными ЭВМ и терминалами (оконечными
устройствами).
Информационное обеспечение включает информацию для обработки и
хранения. Информация об объектах автоматизации представляется в виде
документов на машинных носителях, содержащих все необходимые для
процедур обработки информации сведения справочного характера, сведения о
текущем состоянии объекта автоматизации и т.п. Основная составная часть ИО
- банк данных, состоящий из базы данных (БД) и системы управления базой
данных (СУБД). БД - сами данные, находящиеся на машинных носителях
информации, т.е. в запоминающих устройствах ЭВМ и структурированные в
соответствии с принятыми в БД правилами. СУБД - совокупность программных
средств, обеспечивающих функционирование банка данных. С помощью СУБД
производится запись данных в базу, их выборка по запросам пользователей и
прикладных программ, обеспечивается защита данных от искажений и от
несанкционированного доступа и т.п.
Лингвистическое обеспечение - это язык общения проектировщика с
ЭВМ. В некоторых автоматизированных системах это очень простой язык, не
требующий значительной подготовки пользователя к работе с системой. В
других автоматизированных системах язык общения пользователя с ЭВМ
достаточно сложен и требует высокой квалификации от пользователей.
Например, в развитых САПР таких языков может быть несколько, причем
каждый из них основывается на правилах формализации естественного языка и
использует методы сжатия и развертывания текста.
Методическое обеспечение составляют документы, регламентирующие
состав, правила отбора и эксплуатации средств автоматизированной обработки
информации. Допускается и более широкая трактовка понятия методического
обеспечения, при котором под ним понимается совокупность математического,
лингвистического обеспечения и названных документов, регламентирующих
правила использования средств автоматизации.
Организационное обеспечение включает положения, инструкции,
приказы, штатные расписания, квалификационные требования и другие
документы, регламентирующие организационную структуру подразделений
организаций-пользователей ПО и взаимодействие подразделений с комплексом
средств автоматизации.
Следует отметить, что в виде программ реализуются такие виды
обеспечения
автоматизированных
систем,
как
математическое,
информационное и лингвистическое, не говоря уже о собственно программном
обеспечении. Это свидетельствует о преобладании в структуре
автоматизированных систем обработки информации программной и
технической составляющей. Эти составляющие известны с момента появления
вычислительной техники как Hard Ware (техническая составляющая) и Soft
Ware (программная составляющая). Развитие вычислительной техники
происходило таким образом, что на ранних этапах в стоимости ЭВМ
преобладала стоимость технических средств. После появления вычислительной
техники на быстрых интегральных схемах (БИС) и сверхбыстрых интегральных
схемах (СБИС) стоимость технических средств в составе вычислительной
техники начала снижаться и современный этап развития вычислительной
техники характеризуется преобладанием стоимости программного обеспечения.
Кроме этого на рынке вычислительной техники сильна конкуренция, что
приводит к быстрому моральному старению как технической, так и
программной составляющей. В связи с этим обстоятельством особенно важным
становится снижение сроков разработки программных средств, что, в свою
очередь, требует коллективного труда при создании ПО.
Роль вычислительной техники в компьютерных системах. Так, в системах
автоматизированного проектирования (САПР), пожалуй, самой важной
составляющей является математическое обеспечение, т.к. при проектировании
объект проектирования не существует физически, а представления о будущем
объекте существуют в виде его математических моделей. В информационных и
банковских системах обрабатываются и хранятся большие объемы
информации, поэтому для них наиважнейшее значение имеет организация баз
данных, т.е. информационное обеспечение.
Современные средства вычислительной техники позволяют, используя в
необходимых сочетаниях измерительные преобразователи, интегрирующие
элементы, блоки памяти, логические схемы, действующие по заданной
программе, создавать устройства для измерения интегральных значений тока
или напряжения, мощности, фазы и других параметров в диапазоне ИНЧ.
Современные средства вычислительной техники играют важную роль при
создании систем управления и используются для исследования сложных
динамических систем. Изучение биологических или химических объектов и
решение многих других практических задач, связанных с движением
переменных во времени масс или обменом веществ, также осуществляется при
широком использовании этих средств, которые благодаря высокому
быстродействию, сравнительной простоте и удобствам в эксплуатации
являются наиболее пригодными для математического моделирования самых
разнообразных явлений, процессов и объектов. Они позволяют проводить
указанные расчеты за несколько минут.
Современные средства вычислительной техники весьма разнообразны,
однако они имеют много общего, и поэтому программисту необходимо знать их
классификацию, общие структурные схемы, виды машин, элементную базу, а
также области применения, для того чтобы квалифицированно вести их ремонт
и обслуживание.
Современные средства вычислительной техники и системы управления
оборудованием
позволяют
решить
практически
любую
задачу
диагностирования и прогнозирования его состояния. Широкому применению
автоматизированных методов контроля препятствуют неприспособленность
большинства видов оборудования, недоработанность самих методов,
отсутствие средств (датчиков) и сети диагностических подразделений в
промышленности.
Контрольные вопросы лекции №1
1. Цели и задачи курса.
2. Какую роль играет ВТ в компьютерных системах?
3. В каких еще отраслях используется вычислительная техника?
4. Что такое математическое обеспечение?
5. Что такое программное обеспечение?
6. Что такое техническое обеспечение?
7. Что такое информационное обеспечение?
8. Что такое лингвистическое обеспечение?
9. Что такое методическое обеспечение?
10.Что такое организационное обеспечение?
Лекция №2. Определение алгоритма. Способы описания.
Разновидности структур алгоритмов. Полное построение алгоритма
решения задач.
Продолжительность – 1 час
Цель лекции- ознакомить обучающихся с понятием «алгоритма», с
историей возникновения термина, со способами описания алгоритма.
Определение алгоритма. Слово «Алгоритм» происходит от algorithmi латинского написания имени аль-Хорезми, под которым в средневековой
Европе знали величайшего математика из Хорезма (город в современном
Узбекистане) Мухаммеда бен Мусу, жившего в 783-850 гг. В своей книге «Об
индийском счете» он сформулировал правила записи натуральных чисел с
помощью арабских цифр и правила действий над ними столбиком. В
дальнейшем алгоритмом стали называть точное предписание, определяющее
последовательность действий, обеспечивающую получение требуемого
результата из исходных данных. Алгоритм может быть предназначен для
выполнения его человеком или автоматическим устройством. Создание
алгоритма, пусть даже самого простого, - процесс творческий. Он доступен
исключительно живым существам, а долгое время считалось, что только
человеку. Другое дело - реализация уже имеющегося алгоритма. Ее можно
поручить субъекту или объекту, который не обязан вникать в существо дела, а
возможно, и не способен его понять. Такой субъект или объект принято
называть формальным исполнителем. Примером формального исполнителя
может служить стиральная машина-автомат, которая неукоснительно исполняет
предписанные ей действия, даже если вы забыли положить в нее порошок.
Человек тоже может выступать в роли формального исполнителя, но в первую
очередь формальными исполнителями являются различные автоматические
устройства, и компьютер в том числе. Каждый алгоритм создается в расчете на
вполне конкретного исполнителя. Те действия, которые может совершать
исполнитель, называются его его допустимыми действиями. Совокупность
допустимых действий образует систему команд исполнителя. Алгоритм должен
содержать только те действия, которые допустимы для данного исполнителя.
Данное выше определение алгоритма нельзя считать строгим - не вполне
ясно, что такое «точное предписание» или «последовательность действий,
обеспечивающая получение требуемого результата». Поэтому обычно
формулируют несколько общих свойств алгоритмов, позволяющих отличать
алгоритмы от других инструкций.
Такими свойствами являются:
Дискретность (прерывность, раздельность) - алгоритм должен
представлять процесс решения задачи как последовательное выполнение
простых (или ранее определенных) шагов. Каждое действие, предусмотренное
алгоритмом, исполняется только после того, как закончилось исполнение
предыдущего.
Определенность - каждое правило алгоритма должно быть четким,
однозначным и не оставлять места для произвола. Благодаря этому свойству
выполнение алгоритма носит механический характер и не требует никаких
дополнительных указаний или сведений о решаемой задаче.
Результативность (конечность) - алгоритм должен приводить к решению
задачи за конечное число шагов.
Массовость - алгоритм решения задачи разрабатывается в общем виде, то
есть, он должен быть применим для некоторого класса задач, различающихся
только исходными данными. При этом исходные данные могут выбираться из
некоторой области, которая называется областью применимости алгоритма.
Способы описания. На практике наиболее распространены следующие
формы представления алгоритмов:
 словесная (записи на естественном языке);
 графическая (изображения из графических символов);
 псевдокоды (полуформализованные описания алгоритмов на условном
алгоритмическом языке, включающие в себя как элементы языка
программирования, так и фразы естественного языка, общепринятые
математические обозначения и др.);
 программная (тексты на языках программирования).
Словесное описание алгоритма. Данный способ получил значительно
меньшее распространение из-за его многословности и отсутствия наглядности.
Блок-схема алгоритма. А этот способ оказался очень удобным средством
изображения алгоритмов и получил широкое распространение в научной и
учебной литературе.
Структурная (блок-, граф-) схема алгоритма - графическое изображение
алгоритма в виде схемы связанных между собой с помощью стрелок (линий
перехода) блоков - графических символов, каждый из которых соответствует
одному шагу алгоритма. Внутри блока дается описание соответствующего
действия.
Графическое изображение алгоритма широко используется перед
программированием задачи вследствие его наглядности, т.к. зрительное
восприятие обычно облегчает процесс написания программы, ее корректировки
при возможных ошибках, осмысливание процесса обработки информации.
Можно встретить даже такое утверждение: Внешне алгоритм представляет
собой схему - набор прямоугольников и других символов, внутри которых
записывается, что вычисляется, что вводится в машину и что выдается на
печать и другие средства отображения информации. Здесь форма
представления алгоритма смешивается с самим алгоритмом.
Принцип программирования «сверху вниз» требует, чтобы блок-схема
поэтапно конкретизировалась и каждый блок «расписывался» до элементарных
операций. Но такой подход можно осуществить при решении несложных задач.
При решении сколько-нибудь серьезной задачи блок-схема «расползется» до
такой степени, что ее невозможно будет охватить одним взглядом.
Блок-схемы алгоритмов удобно использовать для объяснения работы уже
готового алгоритма, при этом в качестве блоков берутся действительно блоки
алгоритма, работа которых не требует пояснений. Блок-схема алгоритма
должна служить для упрощения изображения алгоритма, а не для усложнения.
Полное построение алгоритма. Для начала следовало бы рассказать о том,
чего мы хотим достичь. В своей теоретической и практической деятельности вы
будете иметь дело с задачами, для решения которых потребуются знания в
области математики и программирования. Для этого часто нужно будет
построить алгоритм.
Моя цель - помочь вам научиться: 1) поставить задачу, 2) построить
работающий алгоритм, 3) реализовать алгоритм как машинную программу и 4)
оценить эффективность алгоритма.
Такую цель легче сформулировать, чем реализовать.
Основными этапами построения алгоритма являются:
1. Постановка задачи.
2. Построение модели.
3. Разработка алгоритма.
4. Проверка правильности алгоритма.
5. Реализация алгоритма.
6. Анализ алгоритма и его сложности.
7. Проверка программы.
8. Составление документации.
Контрольные вопросы к лекции №1
1. Дайте понятие «алгоритма».
2. Какие свойства алгоритмов вы знаете?
3.
4.
5.
6.
Какие способы описания алгоритмов вы знаете? Опишите их.
Что такое блок-схема?
Опишите принцип программирования «сверху-вниз».
Перечислите основные этапы построения алгоритма.
Лекция №3. Алфавит языка. Правила записи основных объектов.
Типы данных. Переменные. Объекты. Арифметические и логические
выражения.
Продолжительность – 2 часа
Цель лекции- ознакомить обучающихся с алфавитом языка
программирования Турбо Паскаль, с правилами записи объектов языка. Дать
понятие «типов данных», переменных. Перечислить основные логические и
арифметические операции языка программирования.
Алфавит языка. Основой любого языка является алфавит (набор знаков,
состоящий из букв, десятичных и шестнадцатеричных цифр, специальных
символов).
Алфавит Паскаля составляют:
· прописные и строчные буквы латинского алфавита: A, B, C…Y, Z, a, b, c,…y,
z;
· десятичные цифры: 0, 1, 2,…9;
· специальные символы: + - * / > < = ; # ‘ , . : {} [] ( )
· комбинации специальных символов, которые нельзя разделять пробелами,
если они используются как знаки операций: «:=» - знак присваивания, «<>» - не
равно, «<=» - меньше или равно, «>=» - больше или равно, «{}» - комментарии.
· Неделимые последовательности знаков алфавита образуют слова, отделенные
друг от друга разделителями. Ими могут быть пробел, комментарий или символ
конца строки.
Комментарии. Следующие конструкции представляют собой комментарии и
поэтому игнорируются компилятором:
{любой текс, не содержащий символ «}»}
(*любой текст, не содержащий символы «*)»*)
Зарезервированные слова имеют фиксированное написание и навсегда
определенный смысл. Они не могут изменяться программистом и их нельзя
использовать в качестве имен для обозначения величин.
Таблица 3.1 Некоторые зарезервированные слова языка Паскаль.
absolute
library
and
mod
array
абсолютный
библиотека
логическое и
остаток от деления
массив
string
else
then
end
to
строка
иначе
то
конец блока
увеличивая
not
begin
Or
case
Of
const
object
Div
procedure
go to
program
Do
repeat
downto
логическое не
начало блока
логическое или
вариант
из
константа
объект
деление нацело
процедура
переход на
программа
выполнять
повторять
уменьшить до
file
type
for
until
function
uses
if
var
interrupt
while
interface
with
label
xor
файл
тип
для
до
функция
использовать
если
переменная
прерывание
пока
интерфейс
с
метка
исключающее или
Идентификатор - это имя переменной, постоянной, функции, процедуры,
типа, самой программы и т.д.
При написании идентификаторов, необходимо придерживаться следующих
правил:
1. Идентификатор начинается только с буквы или знака.
2. Идентификатор может состоять из латинских букв, цифр, знака.
3. Наибольшая длина идентификатора - 127 символов, но значащими
являются только 63.
4. Назначать идентификатор лучше по смыслу.
5. Строчные и прописные буквы в идентификаторах и в служебных словах
не различаются.
6. Нельзя использовать зарезервированные служебные слова в качестве
идентификатора.
Главными элементами любой программы являются операторы,
переменные и постоянные.
Оператор - предложение ЯП, задающее полное описание некоторого
действия, которое необходимо выполнить.
Переменная - это ячейка (или несколько) оперативной памяти, которой
присвоено определенное имя, и значение которой может меняться в течение
программы.
Постоянная - это ячейка (или несколько) оперативной памяти, которой
присвоено определенное имя, и значение которой не меняться в течение
программы.
Правила записи основных объектов. Программа на языке Паскаль близка
по своему виду к описанию на алгоритмическом языке.
Заголовок программы начинается со слова Program, за которым следует
произвольное имя, придуманное программистом:
Program <имя программы>;
Имя программы, имена констант, переменных и других объектов программы
называются ИДЕНТИФИКАТОРАМИ. Они записываются по правилам:
1. Имя должно лаконично отражать сущность объекта.
S,v,t - общепринятые обозначения;
Summa, N_max - значения суммы номера максимума.
2. Длина идентификатора не должна превышать 127 символов, но для Паскаля
значимы только первые 63 знака.
3. В запись идентификатора могут входить только цифры, английские буквы и
знак подчеркивания.
4. Начинаться идентификатор должен с буквы или знака подчеркивания.
5 .Маленькие и большие буквы в записи идентификаторов Паскаль не
различает.
Раздел описания переменных начинается со слова Var (variables – переменные),
за которым идет список имен переменных через запятую. Тип указывается
после двоеточия. В стандарте языка Паскаль существует два типа числовых
величин: вещественный и целый.
Слово integer обозначает целый тип (является идентификатором целого типа).
Вещественный тип обозначается словом real. Например, раздел описания
переменных может быть таким:
var a, b: integer; c, d: real;
Идентификаторы переменных составляются из латинских букв и цифр;
первым символом обязательно должна быть буква.
Раздел операторов – основная часть программы. Начало и конец раздела
операторов программы отмечаются служебными словами begin (начало) и end
(конец).
В самом конце программы ставится точка:
begin
<операторы>
end.
Операторы ввода, вывода и присваивания
Ввод исходных данных с клавиатуры происходит по оператору read или
readln:
read(<список переменных>)
или readln(<список переменных>)
При выполнении команды ввода компьютер ожидает действий
пользователя. Пользователь набирает на клавиатуре значения переменных в
том порядке, в каком они указаны в списке, отделяя их друг от друга
пробелами. Одновременно с набором данных на клавиатуре они появляются на
экране. В конце нажимается клавиша <ВВОД>(<ENTER>).
Разница в выполнении операторов readln и read состоит в том, что после
выполнения ввода по оператору readln экранный курсор перемещается в начало
новой строки, а по оператору read этого не происходит.
Вывод результатов происходит по оператору write или writeln:
write(<список вывода>)
или writeln(<список вывода>)
Результаты выводятся на экран компьютера в порядке их перечисления в
списке. Элементами списка вывода могут быть константы, переменные,
выражения.
Разница выполнения операторов writeln и write состоит в том, что после
выполнения вывода по оператору writeln экранный курсор перемещается в
начало новой строки, а по оператору write этого не происходит.
Арифметические и логические выражения
Арифметический оператор присваивания на Паскале имеет следующий
формат:
<числовая переменная>:=<арифметическое выражение>
Арифметическое
выражение
может
содержать
числовые
константы и переменные, знаки арифметических операций, круглые
скобки. Кроме того в арифметических выражениях могут
присутствовать функции.
Таблица 3.2 Некоторые формы записи арифметических
операций:
Действие
Результат
Смысл
2+3
5
Плюс
4–1
3
Минус
2*3
6
Умножить
10 / 5
2
Разделить
17 div 5
3
целочисленное деление
17 mod 5
2
остаток от целочисленного
деления
Таблица 3.3 Дополнительные арифметические операции
Pi
3.1415
..
число пи
Frac(23.192)
0.192
дробная часть числа
Int(3.98)
3.0
целая часть числа
Round(5.8)
6
Округление
Abs(-20)
20
абсолютная величина (модуль) числа
Random
0.7308
8
случайное число из диапазона (0-1)
Random(200)
106
случайное целое число из диапазона (0-199)
Правила записи арифметических выражений:
1. Арифметическое выражение записывается в строку.
2. Нельзя ставить подряд два знака арифметических операций.
3. Нельзя опускать знак умножения.
4. Можно использовать только круглые скобки.
5. Приоритет выполнения арифметических операций следующий:
a) Действия в скобках;
б) Вычисление функций;
в) Умножение, деление, DIV, MOD;
г) Сложение, вычитание;
Контрольные вопросы к лекции №3.
1.
2.
3.
4.
5.
Что такое алфавит языка программирования?
Перечислите основные элементы алфавиты языка Турбо Паскаль?
Какие основные объекты языка вы знаете?
Опишите правила записи основных объектов.
Типы данных языка Паскаль.
Лекция №4. Программирование линейных структур алгоритмов.
Организация ввода-вывода. Структура программы.
Продолжительность – 1 час
Цель лекции-дать обучающимся понятия, касающиеся построения
алгоритма линейных структур и написания программ, организации вводавывода данных, дать понятие общей структуры программы линейного
алгоритма.
Программирование линейных структур алгоритмов. Простейшей
алгоритмической структурой является линейная последовательность операций,
которые выполняются по очереди и именно в том порядке, в котором они
записаны. Линейные алгоритмы и линейные программы обычно предназначены
для решения относительно простых задач, в которых не предусмотрен выбор из
нескольких возможных альтернатив или циклических повторений каких-либо
операций.
Оператор - предписание в языке программирования, предназначенное для
задания некоторого завершенного действия в процессе переработки
информации на ПЭВМ.
Основная часть программы на языке Паскаль представляет собой
последовательность операторов, каждый из которых производит некоторое
действие над данными. Операторы выполняются последовательно в том
порядке, в котором они записаны в тексте программы. Разделителем
операторов служит точка с запятой.
Все операторы языка Паскаль подразделяются на три группы: простые,
ввода-вывода и структурные. Фактически операторы ввода-вывода являются
обращением к стандартным процедурам, так как в Паскале нет специальных
операторов ввода-вывода. Однако по установившейся традиции такие
обращения называют операторами.
Пример: Осуществить вывод на принтер таблицы, в которой записаны
значения сторон прямоугольника и его площадь.
Program DemoWriteln;
Uses CRT;
Var { A, B - стороны, Area - площадь }
A, B, Area : integer;
Begin
A := 8; B := 4;
Area := A * B;
{ Lst указывает, что вывод производится на принтер }
WriteLn(Lst, '-----------------------------------');
WriteLn(Lst, '| Сторона A | Сторона B | Площадь |');
WriteLn(Lst, '-----------------------------------');
WriteLn(Lst, '|', A:6, '|':6, B:6, '|':6, Area:6, '|':4);
WriteLn(Lst, '-----------------------------------');
End.
Операторы ввода-вывода.
В любом языке программирования
предусмотрена возможность обмена или пересылки информации между ОЗУ
(оперативным запоминающим устройством) и внешними устройствами
(принтер, дисплей, дисководы и т.д.).
Для ввода в ОЗУ (чтения) и вывода из ОЗУ (записи) данных в Турбо
Паскале существуют стандартные (встроенные) процедуры ввода-вывода,
вызываемые соответственно, операторами Read и Write.
Ввод данных. Для организации процедуры чтения данных с клавиатуры в
ОЗУ используются три оператора:
 Read(список_переменных);
каждое
вводимое
значение
последовательно присваивается переменным из списка; вводимые числа
должны отделяться друг от друга при вводе пробелами или нажатием
клавиши Enter;
 ReadLn(список_переменных); - то же, что и оператор Read, только
на экране после ввода данных происходит переход на новую строку (т.е.
следующий оператор ввода будет вводить данные с новой строки);
вводимые числа должны отделяться друг от друга при вводе пробелами
или нажатием клавиши Enter;
 ReadLn; - происходит переход на новую строку без ввода данных.
Значения вводимых переменных должны соответствовать типам
переменных из списка ввода. В Турбо Паскале допускается вводить значения
следующих данных: целых (integer), вещественных (real), символьных (char), а
также строковых переменных (string).
С клавиатуры нельзя ввести:
 значение логической переменной;
 значение переменной типа "перечисление";
 значение переменной типа "массив" (можно вводить значения
отдельных элементов массива);
 значение переменной типа "множество" (можно вводить значения
отдельных элементов множества);
 значение переменной типа "запись" (можно вводить значения
отдельных полей записи);
Пример: Пусть имеются переменные следующих типов: R: real; C1, C2, C3:
char, которым необходимо присвоить соответствующие значения: 1.5, 'M', 'N',
'K'. Для этого используется оператор Read(R, C1, C2, C3). При вводе значения
переменных можно расположить следующим образом: 1.5MNK или 1.5E0MNK
(без апострофов), но нельзя после 1.5 поместить пробел, т.к. он воспринимается
как значение символьной константы.
Вывод данных. Вывод данных обычно принимает форму, которая
зависит от выходного устройства: на экран, на запоминающие устройства, в
порты ввода/вывода. Для организации процедуры чтения данных из ОЗУ и
записи на экран используются три оператора:
 Write(список_переменных); - выводит последовательно значения
переменных из списка;
 WriteLn(список_переменных); - то же, что и оператор Write, но
после вывода значений на экране осуществляется переход на новую
строку (следующий оператор вывода будет выводить данные с начала
новой строки);
 WriteLn; - осуществляет переход на новую строку без вывода
данных (вывод "пустой" строки).
В Турбо Паскале допустим вывод значений следующих данных:
 целых переменных (integer);
 вещественных переменных (real);
 символьных переменных (char);
 логических переменных (boolean);
 символьных констант;
 арифметических и логических выражений;
 строковых переменных.
С помощью оператора вывода нельзя вывести:
 значение переменной типа "перечисление";
 значение переменной типа "массив" (можно выводить значения
отдельных элементов массива);
 значение переменной типа "множество" (можно выводить значения
отдельных элементов множества);
 значение переменной типа "запись" (можно выводить значения
отдельных полей записи);
Пример: Пусть в результате выполнения программы переменные получили
значения: I = -5, R = 3.52, C = '+', B = True. Выведем их на дисплей:
program Pr;
var I: integer; R: real;
C: char; B: boolean;
................
Write('ПРИМЕР'); WriteLn;
WriteLn(' I =',I,' R =',R);
WriteLn(' Символ - ',C);
Write(' B =',B);
В результате выводимые значения будут такими:
ПРИМЕР
I =-5 R = 3.5200000000E+00
Символ - +
B =TRUE
В Турбо Паскале предусмотрен вывод данных в определенном пользователем
форматом (форматированный вывод). В общем случае формат имеет
следующий вид: P:M, где P - имя переменной, M - целая константа,
указывающая на число позиций, необходимых для выводимой величины P (в
качестве параметра M может указываться не число, а имя константы, описанное
в разделе const).
Для вещественных переменных формат может быть задан в таком виде:
P:M:N (элемент : длина : количество цифр), где M - общее число позиций для
выводимой переменной P, включая знак числа, целую часть, точку и дробную
часть; N - число позиций дробной части. В этом случае переменная P выводится
в виде константы с фиксированной точкой.
Контрольные вопросы к лекции №4.
1. Что такое линейный алгоритм?
2. Опишите алгоритм линейной структуры.
3. Какие операторы используются для ввода данных?
4. Какие операторы используются для вывода данных?
5. Приведите пример программы с линейной структурой.
Лекция №5. Программирование разветвляющихся
Программирование циклических структур.
структур.
Продолжительность – 2 часа
Цель лекции- дать обучающимся понятия, касающиеся программ с
условным оператором, и программ с циклическими структурами. Перечислить
виды операторов, используемых для создания программ с циклическими
структурами.
Программирование разветвляющихся структур.
Условный оператор.
Условный оператор удобно применять, когда требуется выбрать одну из
двух альтернатив. Условные операторы обеспечивают выполнение некоторого
оператора, группы операторов или блока в зависимости от заданных условий.
Паскаль допускает использование двух условных операторов: if и case.
Общий вид оператора условного перехода:
if <лог_выр> then <опер_1> [else <опер_2>];
Здесь квадратные скобки означают, что конструкция else с <опер_2>
может отсутствовать.
Перед else точка с запятой не ставится. <Опер_1> или <опер_2> - это
простые или составные операторы.
<Лог_выр> - это выражение булевского типа. Оно может быть простым
или сложным. Сложные условия образуются с помощью логических операций
AND, OR, NOT. При записи условий могут использоваться все возможные
операции отношения. Результат <лог_выр> всегда имеет булевский тип.
Если <лог_выр> истинно, то выполняется <опер_1>, иначе - <опер_2> (или
следующий
за
if
оператор,
если
else
отсутствует).
В качестве <опер_1> или <опер_2> могут использоваться другие операторы if.
В этом случае каждое else относится к ближайшему слева if, не имеющему else.
Для удобства восприятия программы рекомендуется слово else писать под
соответствующим ему словом then.
Пример: Вычислить:
x+1, при x < 0
sin(x), при 0 <=
Y
x<5
={
cos(x), при x >=
5
Фрагмент программы, описывающий эту алгебраическую конструкцию:
....................
if x < 0 then y := x +1;
if (x >= 0) and (x < 5) then y := sin(x);
if x >= 5 then y := cos(x);
....................
В этом примере наличие скобок в логических выражениях оператора if является
обязательным, т.к. операции сравнения имеют более низкий приоритет, чем
логические операции.
В операторе if после then или else часто используется пустой или
составной оператор.
Пример:
if a = 0 then
{ применение пустого оператора }
else y := x * a;
if x1 < x2 then
{ применение составного оператора }
begin
y := x2;
x2 := x1;
x1 := y
end;
Пример: Разберем программу с одним из вариантов вычисления выражения:
15 * A2 + 21 * B2 при A >
B,
K
={
15 * B2 + 21 * A2 при 1 < A
<= B
где A = 2.34E+2 и B = 17.2
program PR1;
uses CRT;
const A = 2.34E+2; B = 17.2;
var K, K1, K2 : real;
Begin
ClrScr;
K1 := Sqrt(15 * A * A + 21 * B * B);
K2 := Sqrt(15 * B * B + 21 * A * A);
if A > B then K := K1;
if (1 < A) and (A <= B) then K := K2;
if A <= 1 then Write('Результат неопределен')
else Write(' K =', K:5:5);
ReadLn
End.
Оператор множественного выбора.
Оператор выбора case является обобщением оператора if и позволяет
сделать выбор из конечного числа имеющихся альтернатив. Он состоит из
выражения, называемого селектором, и списка констант выбора (список может
состоять и из одной константы). Как и в операторе if, здесь может
присутствовать слово else, имеющее тот же смысл. Его общий вид следующий:
case <выражение_селектор> of
список_констант_1: оператор_1;
список_констант_2: оператор_2;
..............................
список_констант_n: оператор_n
else
оператор
end;
Здесь значения <выражение_селектор> и констант должны быть одного и
того же скалярного типа (кроме real), т.е. integer, boolean, char, ограниченного
типа или иметь тип "перечисление".
Оператор case работает следующим образом. Сначала вычисляется
значение <выражение-селектор>, затем обеспечивается реализация того
оператора, константа выбора которого равна текущему значению селектора.
Если ни одна из констант не равна текущему значению селектора, выполняется
оператор, стоящий за словом else. Если слово else отсутствует, активизируется
оператор, находящийся за словом end, т.е. первый оператор за границей case.
Ниже приведены типичные формы записи оператора CASE. Селектор
интервального типа:
case I of
1..10 : Writeln('Число ', I:4, ' в диапазоне 1 - 10');
11..20 : Writeln('Число ', I:4, ' в диапазоне 11 - 20');
21..30 : Writeln('Число ', I:4, ' в диапазоне 21 - 30')
else Writeln('Число ', I:4, ' вне предела контроля')
end;
Селектор целочисленного типа:
case K of
1 : Z := K + 10;
2 : Z := K + 100;
3 : Z := K + 1000
end;
case I + 1 of
2 : x := 0;
100, 3 : x := x * x;
4 : x := Sin(x)
end;
Например, если значение I + 1 есть 100 или 3, то выполняется оператор x
* x и т.д.
ПРИМЕЧАНИЕ: Метки оператора CASE не описываются в разделе меток
(label), и на них нельзя переходить оператором goto.
Селектор перечисляемого типа:
var Season: (Winter, Spring, Summer, Autumn);
Begin
......
case Season of
Winter: Writeln('Зима');
Spring: Writeln('Весна');
Summer: Writeln('Лето');
Autumn: Writeln('Осень')
end;
Пример: Программа, с помощью которой инициируется нажатие клавиши на
клавиатуре.
program prg;
uses CRT;
var I : char;
Begin
ClrScr;
Write('Введите символ с клавиатуры'); ReadLn(I);
case I of
'A'..'Z':Write('Прописная буква латинского алфавита',I);
'a'..'z':Write('Строчная буква латинского алфавита',I);
'0'..'9':Write('Введена цифра',I);
'А'..'Я':Write('Прописная буква русского алфавита',I);
'а'..'я':Write('Строчная буква русского алфавита',I)
else Write('Введен символ - ',I)
end;
ReadLn
End.
Программирование циклических структур. При решении многих задач
некоторую последовательность действий приходится выполнять несколько раз.
Например, чтобы найти фамилию ученика в списке, надо проверить первую
фамилию списка, затем вторую, третью и т.д. до тех пор, пока не будет найдена
нужная или не будет достигнут конец списка. Такие повторяющиеся действия
называются циклами и реализуются в программе с использованием инструкций
циклов.
В Турбо Паскале различают три вида операторов организации циклов:
 while - оператор цикла с предварительным условием (цикл с
предусловием);
 repeat - оператор цикла с последующим условием (цикл с постусловием);
 for - оператор цикла с управляющим параметром (цикл с параметром).
Оператор цикла while. Цикл с предусловием характерен тем, что перед
выполнением цикла всегда необходимо проверить условие. Если условие
истинно, то цикл продолжается, иначе - цикл заканчивается.
Общий вид оператора следующий:
while <логическое_выражение> do <оператор>;
где <оператор> - простой или составной оператор, а <логическое_выражение> выражение булевского типа.
Оператор цикла while действует следующим образом. Предварительно
проверяется значение логического выражения. Пока оно истинно, выполняется
оператор циклической части (после do). Как только значение логического
выражения становится ложным, происходит выход из цикла.
Если с самого начала значение логического выражения ложно, то
оператор циклической части не выполняется ни разу. Если логическое
выражение никогда не принимает значение False (ложно), то цикл будет
выполняться бесконечно долго.
Пример: Вычислить значение выражения A**7 при любом значении A
(например, при A < 0, когда выражение Exp(7 * Ln(A)) недопустимо).
program prg;
uses СRT;
var I : integer; A, P : real;
Begin
ClrScr;
I := 1; P := 1;
Write('Введите основание степени: '); ReadLn(A);
while I <= 7 do
begin
P := P * A;
I := I + 1 { Можно использовать функцию Inc(I) }
end;
Write('Значение выражения A**7 равно ', P:5:10);
ReadLn
End.
Оператор цикла repeat. Оператор повтора repeat состоит из заголовка
(repeat), тела цикла и условия окончания (until). Цикл с постусловием
характерен тем, что вначале обязательно выполняются хотя бы один раз
команды, составляющие тело цикла.
После выполнения операторов циклической части проверяется условие.
Если условие ложно, то вновь выполняются операторы циклической части.
Если
условие
истинно,
то
цикл
заканчивается.
Общий вид оператора следующий:
repeat
<оператор_1>;
<оператор_2>;
...........
<оператор_n>
until <логическое_выражение>;
<Логическое_выражение> (условие) - выражение булевского типа. При
написании условия допустимы булевские операции и операции отношения.
Операторы, заключенные между словами repeat и until, являются телом цикла.
Оператор цикла repeat действует следующим образом:
 выполняются операторы циклической части, проверяется значение
логического выражения: если оно ложно, то вновь выполняются
операторы циклической части; если же оно истинно, то цикл
заканчивается;
 если значение логического выражения истинно с самого начала, то
операторы циклической части выполняются один раз. Если же логическое
выражение никогда не принимает значение "истинно", то операторы
циклической части выполняются бесконечное число раз, т.е. происходит
"зацикливание";
 нижняя граница операторов циклической части четко обозначена словом
until, поэтому нет необходимости заключать эти операторы в
операторные скобки begin - end. В то же время дополнительное наличие
операторных скобок не является ошибкой.
Пример: Программа нахождения простых чисел. Как известно, число
называется простым, если оно делится только на единицу и себя. Проверить,
является ли число N простым, можно делением на 2, на 3 и т.д. до N и
проверкой остатка после каждого деления. Если остаток равен 0, то
следовательно найдено число, на которое N делится без остатка. Сравнив N и
полученное таким образом число, можно определить, является ли N простым.
program ProstoeChislo;
uses CRT;
var N, d, r : integer;
Begin
ClrScr;
Write('Введите целое число: '); ReadLn(N);
d := 2; { сначала делим на 2 }
repeat
r := N mod d; { вычисление остатка от деления }
{ если N не разделилось нацело на d }
if r <> 0 then d := d + 1;
until r = 0; { выполнять, пока не нашли число, на которое
делится N }
{ если число N равно d, то ... }
if d = N then WriteLn(N, '- простое число')
else WriteLn(N, '- не является простым числом');
repeat until KeyPressed
End.
Примечание: Оператор repeat until KeyPressed (исполняется "пустой" цикл до
тех пор, пока не будет нажата любая клавиша) служит для задержки результата
выполнения программы до нажатия на любую клавишу.
Оператор цикла for. Цикл с параметром характерен тем, что количество
исполняемых циклов определено в заголовке цикла при записи оператора for.
Общий вид оператора: for I := N1 to N2 do <оператор>;
где I - переменная (параметр) цикла; N1, N2 - начальное и конечное значения
переменной цикла.
В качестве переменной I может использовать только простую
переменную, а в качестве N1, N2 могут использоваться выражения (за
исключением вещественного типа real).
Параметры I, N1, N2 должны быть одного и того же скалярного типа, но
не real (т.е. целого, символьного, ограниченного типа или типа "перечисление").
Переменная цикла I принимает последовательные значения данного типа от N1
до N2. Если I, N1, N2 - целого типа, то в этом случае шаг изменения
переменной цикла всегда равен +1.
Пример:
program Pr6;
const A = 10.2;
var X : integer;
Begin
for X := 5 to 35 do Writeln('Y=', A * X * X)
End.
Пример цикла, когда параметр принимает значения символьного типа: for I =
'A' to 'W' do Write(' ', I). В примере осуществляется печать букв латинского
алфавита от A до W.
Если необходимо записать цикл по убывающим значениям параметра I от
N1 до N2, то используется следующий оператор:
for I := N2 downto N1 do <оператор>;
В этом случае параметр I принимает последовательные убывающие значения
данного типа от N2 до N1.
Пример: for I := 20 downto 1 do S := S + 1;
Здесь I изменяется от 20 до 1 с шагом -1.
Контрольные вопросы к лекции №5
1. Что такое разветвляющаяся структура?
2. Как осуществляется алгоритм разветвляющейся структуры?
3. С помощью каких операторов можно осуществить алгоритм
разветвляющейся структуры?
4. Что такое множественный выбор?
5. Что такое переключатель?
6. Какие виды циклических операторов вы знаете?
7. Чем один циклический оператор отличается от другого?
Лекция №6. Программирование сложных структур алгоритмов.
Программирование ввода-вывода массивов. Обработка массивов.
Продолжительность – 1 час
Цель лекции –дать обучающимся понятие о сложных структурах,
ознакомить с понятием массива, дать навыки работы с одномерными и
многомерными массивами.
Массивы. Программирование ввода-вывода массивов. В жизни человека
встречается много задач, суть которых сводится к обработке большого
количества однотипных данных. Для удобства хранения и обработки таких
данных необходимо, чтобы каждый элемент данных имел свой уникальный
порядковый номер и все эти элементы имели бы одно и то же имя. Такая
совокупность данных называется массивом.
Итак, под массивом понимается упорядоченная совокупность конечного
числа данных одного типа. Иными словами массив - это структурированный
тип данных, состоящий из фиксированного числа элементов, имеющих один и
тот же тип и одно и то же имя.
Массивы удобно использовать для хранения однотипной информации,
например, элементов таблиц, коэффициентов уравнений и т.п. Можно
использовать и любой другой ранее описанный тип, поэтому вполне
правомерно существование массивов записей, массивов указателей, массивов
строк, массивов массивов и т.д.
Элементами массива могут быть данные любого типа, включая
структурированные. Тип элемента массива называется базовым. Число
элементов массива фиксируется при описании и в процессе выполнения
программы не меняется. Доступ к каждому элементу осуществляется путем
индексирования элементов массива. Индексы представляют собой выражения
любого скалярного типа, кроме вещественного. Тип индекса определяет
границы изменения значений индекса. Для описания массива предназначено
словосочетание array of (массив из).
Возможны два способа описания массивов:
1. type имя_типа = array[t1, t2, ..., tn] of <тип_элем>;
var имя_массива : имя_типа;
2. var имя_массива : array[t1, t2, ..., tn] of <тип_элем>;
Здесь t1, t2, t3,..., tn - типы индексов массива. Количество индексов n
определяет размерность массива; <тип_элем> - базовый тип элементов массива.
Размерность n массива в Турбо Паскале ограничена размером сегмента данных
- 64 Кбайт.
В качестве индекса массива могут использоваться константы и переменные
любого скалярного типа, кроме real.
Тип индекса (t1, t2,..., tn) может быть любым скалярным типом, кроме real
и integer, т.к. в последнем случае неизвестно число элементов массива.
Пример:
type Klass = (K1, K2, K3, K4);
Znak = array[1..256] of char;
{ Тип Znak предварительно описан в разделе типов }
var M1: Znak;
{ Прямое описание массивов M2 и Мas }
M2: array[1..60] of integer;
Mas: array[1..4] of integer;
M3: array[1..4] of Klass;
Если в описании массива задан один индекс, массив называется
одномерным, если два индекса - двумерным, если n индексов - n-мерным.
Размерность ограничена только объемом памяти конкретной ПЭВМ.
Одномерные массивы обычно используются для представления векторов, а
двумерные - для представления матриц.
Примеры описания массивов:
var Vector : array[1..40] of real;
{ Одномерный массив - набор из 40 вещественных чисел }r
Matr : arrayr[1..8, 1..5] ofr byte;
{ Двумерный массив представляет матрицу из 8 строк и 5 столбцов с
элементами байтового типа }r
ThreeDim : arrayr[1..4, 1..5, 1..8] ofr integer;
{ Трехмерный массив с элементами целого типа }
Для описания массива можно использовать предварительно определенные
константы.
Пример: Const G1 = 4; G2 = 6;
var MasY : array[1..G1, 1..G2] of real;
Элементы массива располагаются в памяти последовательно. Элементы с
меньшими значениями индекса хранятся в более низких адресах памяти.
Многомерные массивы располагаются в памяти таким образом, что самый
правый индекс возрастает самым первым. Например, если имеется массив A :
array[1..5, 1..5] of integer; то в памяти элементы массива будут размещены по
возрастанию адресов: A[1, 1], A[1, 2],..., A[1, 5], A[2, 1], A[2, 2],..., A[5, 5].
Контроль правильности значений индексов массива может проводиться с
помощью директивы компилятора R. По умолчанию директива R находится в
пассивном состоянии {$R-}. Перевод в активное состояние вызывает проверку
всех индексных выражений на соответствие их значений диапазону типа
индекса.
Пример: Опишем двумерный массив (матрицу) Mas, состоящий из 2-х строк и
3-х столбцов:
125
672
- описание 1-м способом:
type Massiv = array[1..2, 1..3] of integer;
var Mas: Massiv;
- описание 2-м способом:
var Mas: array[1..2, 1..3] of integer;
В самой программе, задав конкретные значения индексов, можно выбрать
определенный элемент массива: N := Mas[2, 2]; (т.е. в данном примере N будет
равно 7).
В качестве индексов массива могут использоваться и выражения, частным
случаем которых являются константы и переменные:
P1 := Mas[2 * I + 1, 3];
Sum := Sum - C[k];
B[5] := B[3] + 10;
Обработка массивов. К типичным задачам по обработке массивов можно
отнести следующие:





вывод массива;
ввод массива;
поиск заданного элемента;
поиск в массиве максимального и минимального элемента;
сортировка массива.
Пример: Пусть задан двумерный массив:
2 1 5 < tr>
A=
3 4 1 < tr>
Необходимо транспонировать данный массив (т.е. поменять местами
строки и столбцы).
program Trans;
uses CRT;
var A : array[1..2, 1..3] of integer;
At : array[1..3, 1..2] of integer;
I, J : integer;
Begin
ClrScr;
{ Ввод и транспонирование массива A }
for I := 1 to 2 do
for J := 1 to 3 do
begin
WriteLn('Введите элемент массива - A[', I,',', J,']');
ReadLn(A[I, J]);
At[J, I] := A[I, J]
end;
{ Распечатка массива At }
Write('Транспонированный массив');
for I := 1 to 3 do
begin
for J := 1 to 2 do Write(At[I, J]:5);
WriteLn;
end;
repeat until KeyPressed
End.
В этом примере инициализация (заполнение массива данными) производилась
вручную, с клавиатуры. В следующем примере задача инициализации массива
решается с помощью генерации случайного числа (random). Все элементы
массива - целые положительные числа из промежутка [0; 1000].
program Trans1;
uses CRT;
var A : array[1..5, 1..7] of integer;
At : array[1..7, 1..5] of integer;
I, J : integer;
Begin
{ Ввод и транспонирование массива A }
Randomize;
ClrScr;
{ Ввод и распечатка массива A }
Write('Массив до транспонирования');
for I := 1 to 5 do
begin
WriteLn;
for J := 1 to 7 do
begin
A[I, J] := Round(random * 1000);
Write(A[I, J]:5); At[J, I] := A[I, J];
end
end;
WriteLn;
{ Распечатка массива At }
Write('Транспонированный массив');
for I := 1 to 7 do
begin
for J := 1 to 5 do Write(At[I, J]:5)
WriteLn;
end;
repeat until KeyPressed
End.
Пример: Дан массив M размерностью 10х10, содержащий целые числа.
Вывести на дисплей сумму четных элементов этого массива.
program SumElem;
uses Crt;
const N = 2;
var M : array[1..N, 1..N] of integer;
I, J, Sum : integer;
Begin
Sum := 0;
Randomize;
ClrScr;
{ Ввод и распечатка массива M }
for I := 1 to N do
begin
WriteLn;
for J := 1 to N do
begin
M[I, J] := Round(random * 100);
Write(M[I, J]:5);
end
end;
WriteLn;
for I := 1 to N do
for J := 1 to N do
{ Odd() - Определение нечетного числа (odd - нечетный) }
if not Odd(M[i, J]) then Sum := Sum + M[I, J];
Write('Сумма четных чисел равна: ', Sum);
repeat until KeyPressed
End.
Контрольные вопросы к лекции №6
1. Дайте понятие массива.
Какого типа бывают массивы?
Как производится объявление массива?
Как осуществить вывод массива на экран?
С помощью какого массива производится ввод данных массива?
Какое зарезервированное слово используется для объявления
массива?
7. Какой вид оператора цикла используется для работы с массивами?
8. Перечислите типичные виды обработки массивов.
9. Приведите пример программы с использованием массивов.
2.
3.
4.
5.
6.
Лекция №7. Строковые данные. Программирование задач обработки
символьных данных.
Продолжительность – 1 час
Цель лекции- Дать студентам понятие о таком типе данных, как
строковые, дать теоретические знания по программированию задач
обработки символьных данных.
Строковые данные. Помимо числовой информации компьютер может
обрабатывать символьную информацию. Турбо Паскаль оперирует с
символьной информацией, которая может быть представлена отдельными
символами или строками символов.
Строка - это последовательность символов кодовой таблицы ПЭВМ. При
использовании в выражениях строка заключается в апострофы. Количество
символов в строке (длина строки) может динамически изменяться от 0 до 255.
Для определения данных строкового типа используется служебное слово
string, за которым может следовать заключенное в квадратные скобки значение
максимально допустимой длины строки данного типа. Если это значение не
указывается, то по умолчанию длина строки равна 255 байт (символов).
Данные типа string (строки символов), как и числовые данные,
подразделяются на константы и переменные.
Строковые константы - это последовательность символов, заключенных
в апострофы. Например, 'ABC 3A', 'Пример 2'.
Строковые константы могут быть описаны в разделе констант, например:
const Str = 'STROKA'; C = 'СТРОКА';
Турбо-Паскаль реализует переменные типа string, которые являются
расширением стандарта языка Паскаль.
Описание строковых переменных имеет вид:
type имя_типа = string[N];
var имя_перем : имя_типа; или var имя_перем : string[N];
Здесь N - целая константа, указывающая максимальную длину строки
(количество символов в строке). В Турбо Паскале 1 <= N <= 255.
Пример:
type Line : string[80]; var MyLine : Line;
Возможно также описание вида: var имя_перем : string; которое
определяет строковую переменную максимально возможной длины (в 255
символов).
Пример:
Const Adress = 'ул. Королева, 10'; { Строковая константа }
type Flot = string[125];
var FStr: Flot; { Описание с заданием типа }
St1: string; { По умолчанию длина строки равна 255 }
St2, St3: string[50];
Name: string[280]; { Ошибка, длина Name больше 255 байт }
Для определения объема памяти в байтах, требуемой для размещения
строки, к значению ее максимальной длины прибавляется 1. Например, для
размещения в памяти переменных FStr, St1, St2 требуется соответственно 126,
255 и 51 байт. Дополнительный байт расположен в самом начале строки (имеет
нулевой номер) и содержит значение текущей длины строки.
В Турбо Паскале переменные типа string[N] занимают N+1 байт. Так, в
приведенном примере St3 будет занимать 51 байт.
Строковые переменные аналогичны массивам типа char. Их отличием
является то, что число символов (или текущая длина строки) может
динамически меняться в интервале от нуля до заданного верхнего значения N.
Как и в массивах, к отдельным символам строки можно обратиться с помощью
индексов в квадратных скобках: St1[1], St2[8]. Нулевой индекс определяет
позицию, в которой содержится текущая длина строки.
Турбо Паскаль допускает также использование типизованных констант
строкового типа:
const S1: string[6] = 'строка';
S2: string[2] = #13#10;
S3: string[5] = '0';
Строковые данные могут участвовать в строковых выражениях,
состоящих из строковых констант, переменных типа string и char, знаков
операций и встроенных функций. При этом над строковыми данными
допустимы следующие операции: присваивание, сцепление (конкатенация) и
отношения.
Операция присваивания.
Общий вид этой операции следующий:
имя_строковой_переменной := строковое_выражение;
Например, S1 := 'D'; S2 := 'AbCd'; S1 := S2;
Если длина строкового выражения превышает максимальную длину
строковой переменной, то все лишние символы справа отбрасываются.
Пример:
program Prim; {В результате выполнения этой программы получим: C =C.}
uses CRT;
var Str: string[5];
Cr, C: char;
begin
ClrScr;
Str := 'ABCD';
C := Str[3];
WriteLn(' C =', C);
Cr := ReadKey;
end.
Ввод и вывод значений строковых переменных осуществляется без
апострофов. Например, для выполнения оператора ReadLn(Str) во входном
файле
необходимо
набрать
ABCD,
начиная
с
1-й
позиции.
ЗАМЕЧАНИЕ: Для исключения ошибок ввода строковых переменных всегда
используйте оператор ReadLn (вместо Read).
Операция сцепления.
Эта операция применяется для сцепления нескольких строк в одну
результирующую строку. Для обозначения операции сцепления в Турбо
Паскале используется знак "+".
'AB' + 'CD'='ABCD'
'кот' + ' ' + 'усатый'='кот усатый'
Пример: Программа, иллюстрирующая операцию конкатенации.
program Szepka; {Пусть была введена строка ЛЕВ+.После выполнения этой
программы получим: S2 = ЛЕВS1+}
var C : char;
S1 : string[3];
S2 : string[7];
begin
ReadLn(S1, C);
S2 := S1 + 'S1' + C;
Write('S2 = ', S2)
end.
Пример: Программа, с помощью которой на дисплей выводятся строчные
буквы русского алфавита.
program RusAlfavit;
uses CRT;
var Str : string[32]; I : integer;
begin
Clrscr;
Str := '';
for I := 1 to 32 do Str := Str + Chr(Ord('А') + I - 1);
WriteLn(Str);
repeat until KeyPressed
end.
Сделаем незначительные поправки:
1) замените в строке Str : string[32] число 32 на 26;
2) замените в строке for I := 1 to 32 do число 32 на 26;
3) замените в строке Str := Str + Chr(Ord('А') + I - 1); русскую букву А на
латинскую букву A, Вы получите распечатку прописных букв латинского
алфавита.
Операция отношения.
Операции отношения (=, <, >, <>, >=, <=) проводят сравнение двух
строковых операндов и имеют более низкий приоритет, чем операция
сцепления. Сравнение строк производится слева направо до первого
несовпадающего символа, и та строка считается большей, в которой первый
несовпадающий символ имеет больший номер в таблице ASCII.
Результат выполнения операций отношения над строковыми операндами
всегда имеет логический тип и принимает значение True (истинно) или False
(ложно). Строки считаются равными, если полностью совпадают по текущей (а
не по объявленной) длине и содержат одни и те же символы. Например, в
результате выполнения программы
program Stroka;
var S1 : string[3];
S2 : string[10];
begin
S1 := 'ABC';
S2 := S1;
if S1 = S2 then WriteLn('S1 равно S2')
else WriteLn('S1 не равно S2');
end.
Следует также учитывать, что одинаковые прописные и строчные буквы в
строках определяют разные значения строковых переменных. Так, если S1 :=
'ABC', а S2 := 'Abc', то S1 не равно S2.
Для сравнения значений строковых типов применяются следующие
правила:
более
короткая
строка
всегда
меньше
более
длинной;
- если длины сравниваемых строк равны, то происходит поэлементное
сравнение символов этих строк с учетом лексикографической упорядоченности
значений стандартного символьного типа char.
Программирование задач обработки символьных данных. Для хранения и
обработки отдельных символов используются переменные типа CHAR.
Значением переменной типа CHAR может быть любой символ.
Как и любая переменная программы, переменная типа CHAR может
получить значение в результате выполнения присваивания или ввода (Read,
ReadLn). Если переменная типа CHAR получает значение в результате
выполнения операции присваивания, то справа от знака := должно стоять
выражение типа CHAR, например, переменная типа CHAR или символьная
константа - символ, заключенный в апострофы.
Переменную типа CHAR можно сравнивать с другой переменной типа
CHAR или с символьной константой. Сравнение основано на том, что каждому
символу поставлено в соответствие число (код из кодовой таблицы ASCII).
Таким образом, можно записать:
'0'<1<...<9<...A
Символам русского языка соответствуют коды таблицы ASCII большие,
чем символа латинского алфавита, при этом справедливо следующее:
'А'<Б<В<...<Ю<Я<а<б<в<...<э<ю<я.
Пример: Программа выводит на экран первую половину таблицы кодировка
символов (символы с кодами от 0 до 128). так как символы с кодами от 7 до 13
являются служебными, например, при выводе символа с кодом 7 раздается
звуковой сигнал, а символ с кодом 13 вызовет переход к новой строке, то
вместо этих символов в таблице выведем пробелы.
Program TabChar;
Uses CRT;
Var Ch : char; { Символ }
dec : integer; { Десятичный код символа }
i, j : integer;
Begin
ClrScr;
dec := 0;
for i := 1 to 16 do { Шестнадцать строк }
begin
{ Чтобы получить таблицу кодировки для символов с кодами 128-255,
следующую инструкцию замените на dec:=i+128; }
dec := i;
for j := 1 to 8 do { ...восемь колонок }
begin
if (dec < 7) or (dec >= 14) then
Write(dec:4, '-', ' ', chr(dec):1, chr(179))
else { ...символы CR, LF, TAB не отображаются }
Write(dec:4, '-', ' ', chr(179));
dec := dec + 16;
end;
WriteLn; { ...переход к новой строке экрана }
end;
ReadLn
End.
Контрольные вопросы к лекции №7
1. Как описывается символ на языке Турбо Паскаль?
2. Для чего понадобилось ввести символьный тип данных в язык
программирования?
3. В каких случаях используют данный тип?
4. Что такое строковая переменная?
5. Как описать строку?
6. Какие действия можно производить с символьными элементами?
7. Какие действия можно производить со строковыми отношениями?
8. Что такое операция слияния?
9. Что такое операция отношения?
Лекция №8. Подпрограммы, их классификация. Способы оформления
подпрограмм. Обращение к подпрограммам. Передача фактических
параметров.
Продолжительность – 2 часа.
Цель лекции – дать студентам основные понятия о подпрограммах,
процедурах и функциях, о способах оформления подпрограмм, объяснить,
как организовать вызов процедур и функций.
Подпрограммы, их классификация. В практике программирования часто
встречается ситуация, когда одну и ту же группу инструкций, реализующих
определенную цель в программе (например, выполнение одних и те же
вычислений, но каждый раз с другими данными), требуется повторить без
изменений в нескольких местах программы. Чтобы не загромождать текст
программы, удобно часто повторяющиеся ее строки записать один раз и по
мере необходимости обращаться к ним. Для таких целей и предусмотрено
использование подпрограмм.
Подпрограмма - это именованная логически законченная группа
инструкций языка, которую можно вызвать для выполнения по имени любое
количество раз из различных мест программы.
Использование подпрограмм позволяет:
 сделать основную программу более наглядной и компактной;
 уменьшить объем используемой памяти ЭВМ;
 сократить время отладки, так как программирование, отладку
основной программы и подпрограммы могут осуществить параллельно
разные программисты.
В Турбо Паскале объектами, описывающими определенные фрагменты
программы (подпрограммы), являются процедуры и функции. Структура
процедур и функций такая же, как и структура основной программы, т.е.
включает в себя заголовок, раздел описаний и раздел операторов. Текст
процедуры или функции может быть размещен в основной программе одним из
следующих способов:
 расположен непосредственно в разделе описаний основной
программы;
 записан в отдельный файл и вставлен в раздел описаний основной
программы с помощью директивы компилятора {$I имя_файла};
 оформлен в виде внешнего модуля.
Имея один и тот же смысл и аналогичную структуру, процедуры и
функции различаются назначением и способом их использования. Процедуры
служат для возврата в программу совокупности каких-либо действий
(выполненных процедурой), например определение новых значений
переменных, запись информации во внешние файлы (в частности, печать) и т.п.
Смысл функций заключается в первую очередь в том, чтобы возвращать в
программу какое-то вычисленное значение.
Процедура и функция - это два способа оформления подпрограммы или
фрагмента программы, предназначенного для решения части общей задачи.
Одну и ту же подпрограмму можно оформить как процедуру или как функцию.
Каким же критерием пользоваться при выборе способа оформления
подпрограммы? Можно сформулировать правило: если подпрограмма должна
возвратить измененное значение только одной переменной основной
программы, то ее следует оформить как функцию, в остальных случаях
подпрограмму следует оформлять как процедуру.
Процедуры.
В Турбо Паскале процедурой называется часть программы, имеющая имя
и предназначенная для решения определенной задачи. Процедура состоит из
заголовка и тела. После однократного описания процедуру можно вызвать по
имени из последующих частей программы любое количество раз. Когда
процедура выполнит свою задачу, программа продолжится с оператора,
следующего непосредственно за оператором вызова процедуры.
Так же как и все остальные объекты программы, процедуру перед
использованием необходимо объявить (описать). То есть, с одной стороны,
существует определение процедуры, а с другой стороны, правила ее
использования в программе.
Описание процедуры имеет вид:
procedure Имя [(формальные_параметры)];
<раздел описаний>
begin
<раздел операторов>
end;
и помещается в основной программе (program) в разделе описаний. Здесь Имя имя процедуры. Раздел описаний, как и в основной программе (program), может
включать разделы label, const, type, var и раздел процедур и функций.
Формальные_параметры представляют собой список переменных с
указанием их типа, которые отделяются друг от друга точкой с запятой. Эти
переменные
не
описываются
в
разделе
описаний
процедур.
Формальные_параметры не обязательны. Допускается использование процедур
без списка параметров. Имя процедуры не может находиться в выражении в
качестве операнда.
Подпрограмма выполняется только после ее вызова. Вызов процедуры в
основной программе осуществляется с использованием ее имени. В круглых
скобках после имени перечисляются параметры процедуры (если они были
описаны) и производится оператором вида:
Имя_процедуры(список фактических параметров);
Оператор вызова процедуры может находиться в любом месте программы,
например:
........................
Summa(10, S);{ вызов процедуры с именем Summa (передается
........................число слагаемых суммы - 10, в S хранится
........................возвращаемое значение
Функции.
Другой вид подпрограмм в языке Турбо Паскаль - функции. Функция
оформляется аналогично процедуре и отличается от нее по структуре только
заголовком, общий вид которого такой:
function имя[(формальные_параметры)]: тип_результата;
Пример: Function Proverka(X, Y, I: integer): real; Function Logic: boolean;
Отличительные особенности функции следующие:




функция имеет только один результат выполнения (но может иметь
несколько входных параметров). Возвращаемый результат функции
может иметь любой скалярный тип, тип string и тип "указатель";
результат обозначается именем функции. Имя функции может входить в
выражение как операнд. Поэтому в разделе операторов (при описании
функции) обязательно должен присутствовать оператор присваивания, в
левой части которого стоит имя этой функции;
в заголовке функции обязательно должен быть указан тип возвращаемого
значения функции;
вызов функции в основной программе осуществляется непосредственно
внутри выражения по ее имени с указанием фактических параметров.
Тело функции представляет собой локальный блок, по структуре аналогичной
программе:
function имя [(формальные_параметры)]: тип_результата;
<разделы_описаний>
begin
<раздел_операторов>
end;
В разделе операторов должен находиться хотя бы один оператор,
присваивающий идентификатору функции значение. Если таких присваиваний
несколько, то результатом выполнения функции будет значение последнего
оператора присваивания.
Обращение к функции осуществляется по имени с необязательным
указанием списка фактических параметров. Каждый фактический параметр
должен соответствовать формальным параметрам, указанным в заголовке, и
иметь тот же тип.
Вызов функции может осуществляться в выражении в виде обозначения
функции,
например:
........
Y := Func(10); { вызов функции Func, вычисленное значение функции хранится
в
переменной
Y
}
........
Способы оформления подпрограмм. Если процедура должна возвращать в
программу какие-то значения, соответствующие переменные должны быть
описаны как параметры-переменные с использованием слова var.
Соответственно описание выходных параметров выглядит так:
var список_пер1: тип1; var список_пер2: тип2;...
Пример: Описание процедуры нахождения N-первых натуральных чисел.
.......
procedure Summa(N : integer; var Sum : integer);
var i : integer;
begin
Sum := 0;
for i := 1 to N do Sum := Sum + i;
end;
.......
Вызов функции может осуществляться в выражении в виде обозначения
функции, например:
........
Y := Func(10); { вызов функции Func, вычисленное значение функции хранится
в переменной Y }
........
или иначе: WriteLn('Значение функции ', Func(10));
Функции могут возвращать значения целочисленных, вещественных,
булевских, символьных, строковых, ссылочных, перечислимых
пользовательских типов.
Контрольные вопросы к лекции№8
1. Дайте понятие подпрограммам.
2. Что такое процедура?
3. Что такое функция?
4. В чем отличие процедуры от функции?
5. Как производится обращение к подпрограммам?
6. Как осуществляется выход из подпрограмм?
Лекция №9. Работа с записями. Работа с множествами.
Продолжительность – 1час
Цель лекции- ознакомить студентов с понятием записей и множеств.
Дать теоретический материал по методам программирования записей и
множеств.
Работа с записями. Во многих экономических и информационных
задачах при обработке ведомостей, документов, списков возникает
необходимость объединения различного типа данных в одну группу. Такие
задачи можно описывать с использованием пользовательских типов данных.
Каждую таблицу, рассмотренную в предыдущем пункте, можно
рассматривать как массив, в котором каждый элемент - запись.
Запись - это структура данных, состоящая из фиксированного числа
элементов одного или нескольких типов. Как правило, запись состоит из
нескольких полей. В одном поле данные имеют один и тот же тип, а в разных
полях могут иметь разные типы.
Общий вид описания записи следующий:
var имя_записи: record
список_элементов_1: тип_1; {Поле 1}
список_элементов_2: тип_2; {Поле 2}
список_элементов_3: тип_3; {Поле 3}
....................................
список_элементов_n: тип_n; {Поле n}
end;
Другой способ: type имя_типа = record
список_элементов_1: тип_1; {Поле 1}
список_элементов_2: тип_2; {Поле 2}
список_элементов_3: тип_3; {Поле 3}
....................................
список_элементов_n: тип_n; {Поле n}
end;
var имя_записи: имя_типа;
Здесь список_элементов - перечень имен элементов через запятую; тип_1,
тип_2,..., тип_n - типы полей.
Пример: Описание записи "владелец автомобиля".
type Auto = record
{ Номер автомобиля }
Nomer: integer;
{ Марка автомобиля }
Marka: string[20];
{ Фамилия, имя, отчество владельца }
FIO: string[40];
{ Адрес владельца }
Adress: string[60];
end;
var M, V: Auto;
В данном примере запись Auto содержит четыре поля: Nomer, Marka, FIO
и Adress. Доступ к полям записи осуществляется через переменную типа
запись. В нашем случае это переменные M и V типа Auto.
Объем памяти, необходимый для записи, складывается из длин полей.
Значения полей записи могут быть использованы в выражениях. Имена
отдельных полей не применяются по аналогии с идентификаторами
переменных, поскольку может быть несколько записей одинакового типа.
Обращение к значению поля осуществляется с помощью
идентификатора, в котором указывается имя записи и имя поля, разделенных
точкой. Такая комбинация называется составным именем. Например, чтобы
получить доступ к полям записи типа Auto (переменная M), надо записать:
M.Nomer, M.Marka, M.FIO, M.Adress.
Составное имя можно использовать везде, где допустимо применение
типа поля. Для присваивания полям значений используется оператор
присваивания.
Пример: M.Nomer := 2013;
M.Marka := 'ВАЗ-21099';
V.FIO := 'Орлов Н.С.';
V.Adress := 'ул. Садовая 12 - 21';
Составные имена можно использовать, в частности, в операторах вводавывода.
Пример:
........
write('Укажите номер автомобиля: '); read(M.Nomer);
write('Укажите марку автомобиля: '); read(M.Marka);
........
write(M.Nomer:4, M.Marka:10, M.FIO:12, M.Adress:25);
Допускается применение оператора присваивания и к записям в целом,
если они имеют один и тот же тип. Например, V := M. После выполнения этого
оператора значения полей записи V станут равны значениям соответствующих
полей записи M. В ряде задач удобно пользоваться массивами из записей. Их
можно описать следующим образом:
type Person = record
FIO : string[20];
Age : 1 .. 90;
Prof : string[30];
end;
var List : array[1 .. 50] of Person;
i : integer;
Для заполнения данных удобно использовать оператор цикла. Для
вышеописанного примера это может выглядеть так:
for i := 1 to 50 do
begin
Write('Введите инициалы клиента: '); ReadLn(List[i].FIO);
Write('Введите возраст клиента: '); ReadLn(List[i].Age);
Write('Введите профессию клиента: '); ReadLn(List[i].Prof);
end;
Элемент записи используется в программе так же, как и обычная
переменная, т.е. элемент записи можно указывать как в левой части оператора
присваивания, так и в правой части (в выражениях). Над элементом записи
можно выполнять любые действия, допустимые для данных его типа.
Сходство и различие между массивами и записями:
1. записи и массивы используют для описания упорядоченной
последовательности величин;
2. все элементы массива должны быть одного и того же типа. Записи могут
содержать элементы различных типов;
3. к элементам массива и записи имеется прямой доступ (по имени элемента
массива и составному имени элемента записи).
Пример: Пусть задана таблица следующего вида:
Детали
Детали №1
Детали №2
Количество Наименование Количество Наименование
18
Скоба
145.35
Стержень
50
Станина
20.3
Шток
Тогда каждую строку этой таблицы можно описать как запись одним из
следующих способов:
1) var Det : record
Det1 : record
Cnt1 : integer;
NDet1 : string[11];
end;
Det2 : record
Cnt2 : integer;
NDet2 : string[11];
end;
end;
2) Type Det1 = record
Cnt1 : integer;
NDet1 : string[11];
end;
Det2 = record
Cnt2 : integer;
NDet2 : string[11];
end;
Det = record
D1 : Det1;
D2 : Det2;
end;
Var Tablo : Det;
Работа с множествами. Для описания множественного типа используется
словосочетание set of (множество из...).
Как и массивы, множества могут быть описаны двумя способами:
1) type имя_типа = set of <базовый_тип>;
var имя_множества: имя_типа;
2) var имя_множества: set of <базовый_тип>;
Здесь <базовый_тип> - это тип элементов, входящих во множество. В
качестве базового типа можно использовать любой простой тип (стандартный,
перечисляемый или ограниченный) за исключением:
а) вещественного типа (real);
б) целого типа (integer), так как мощность множества в этом случае равна
бесконечности.
Пример:
type ProstChisl = set of (3, 5, 7, 11, 13);
Nomer = set of 1..31;
var Pr : ProstChisl;
N : Nomer;
{ Определение множества без предварительного описания в разделе типов }
Bukva: set of ('a', 'e', 'i', 'j');
В данном примере переменная Pr может принимать значение 3, 5, 7, 11,
13; N - любое значение в диапазоне 1..31; Bukva - любое из 'a', 'e', 'i', 'j'. Попытка
присвоить другие значения вызовет программное прерывание.
В Турбо Паскале максимальное число элементов во множестве равно
256. Соответственно номера значений базового типа должны находиться в
диапазоне 0..255. Контроль диапазонов осуществляется включением директивы
компилятора {$R+}. Объем памяти, занимаемый одним элементом множества,
составляет 1 бит. Объем памяти для переменной типа множество вычисляется
по формуле:
Объем памяти = (Max div 8) - (Min div 8) +1,
где Max и Min - верхняя и нижняя границы базового типа.
Три множества [1, 2, 3, 4, 5], [1, 2..5] и [1..5] считаются одинаковыми,
поэтому можно использовать последнюю, сокращенную, форму. Однако если
значение первой константы диапазона строго больше значения второй
константы, то задается пустое множество. Например, [5..3] обозначает пустое
множество.
Пример: 1) type set1 = set of 1..3;
var M: set1; или
2) var M: set of 1..3; или
3) type N = (1..3);
var M: set of N;
Во всех трех случаях множество M может принимать следующие значения: [],
[1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3].
Контрольные вопросы к лекции №9
1. Что такое запись?
2. С помощью какого служеюного слова описывается запись?
3. Какие операции с записями можно произвести?
4. Что такое множество?
5. В каких случаях используют тип множество?
6. Каким служебным словом обозначается множество?
7. Какие виды операций над множествами вы знаете?
Лекция №10. Работа с файлами. Различные типы файлов.
Продолжительность – 1 час
Цель лекции- ознакомить студентов с понятием файла, с различными
типами файлов и способами их описания.
Работа с файлами. При решении многочисленных задач обработки
больших объемов информации, бухгалтерского учета, ведения различных
картотек, справочников и баз данных используются файлы, которые позволяют
запоминать, изменять, хранить и читать различную информацию на внешних
носителях (магнитных дисках).
Файл представляет собой структурированный тип данных, содержащий
последовательность компонентов (чаще всего записей) одного типа и одной
длины (нетекстовые файлы), которые в процессе пересылки или обработки
рассматриваются как единое целое. Файл, как правило, размещается на
внешних запоминающих устройствах.
Число элементов в файле, называемое длиной файла, не фиксировано. В
этом основное отличие файла от массива. Файл можно представить как
магнитную ленту, у которой есть начало, а конец не фиксирован. Элементы
файла записываются на эту ленту последовательно, друг за другом с помощь
некоторого устройства, называемого указателем файла.
Файл, не содержащий ни одного элемента, называется пустым: его длина
равна нулю.
Файлы по методу доступа к их элементам подразделяются на файлы
последовательного и прямого доступа. По отношению к программе файлы
могут быть внешними и внутренними. Внутренними файлами являются такие,
которые создаются, используются и существуют только во время работы
данной программы. Примерами внутренних файлов могут служить исходные
данные в стандартном файле ввода Input или результаты выполнения
программы в стандартном файле вывода Output.
Файлы, размещенные на внешних устройствах, называют внешними
файлами. В качестве носителей внешних файлов обычно используют
магнитные диски.
Различные типы файлов.
В дальнейшем будут рассматриваться три вида файлов:
 типизированные файлы, записи которых имеют жесткую структуру;
 текстовые файлы, состоящие из символьных и строковых структур;
 нетипизированные файлы, при работе с которыми исходят лишь из
того ограничения, что в них могут передаваться блоки по 128 байт
каждый.
Внешние файлы, как и любая переменная, должны быть описаны в
разделе описаний программы. Описание файлов имеет следующий вид:
type имя_типа = file of ТипЭлементов;
var имя_файла: имя_типа;
или
var имя_файла: file of ТипЭлементов;
В качестве ТипЭлементов можно использовать любой тип данных (как
простой, так и сложный) за исключением типа file, например:
var File1 : file of integer; { Типизированный файл }
File2 : text; { Текстовый файл }
File1 : file; { Нетипизированный файл }
Для пересылки данных между программой и файлом используются
стандартные процедуры Read и Write. В этих процедурах указывают, откуда
считываются данные и куда данные должны пересылаться.
Доступ к элементам файла осуществляется через указатель файла. При
чтении или записи этот указатель перемещается к следующему элементу и
делает его доступным для обработки. В каждый момент доступен для записи
(чтения) только этот элемент файла, на который установлен указатель.
Программирование работы с файлами полностью обеспечивается
подпрограммами и глобальными переменными, входящими в состав
стандартных модулей System, Printer, Dos и Crt. Использование подпрограмм
для работы с файлами предполагает описание в программе используемых
модулей (раздел Uses) и наличие в библиотеке Турбо Паскаля
соответствующих стандартных модулей. В каждом виде работ с файлами
различают три этапа: подготовка файла к записи или чтению данных, передача
данных и завершение работы с файлом.
1) Связывание файла с файловой переменной. В Турбо Паскале файл является
некоторой переменной, следовательно он должен иметь имя. С другой стороны,
существует операционная система, которая в свою очередь использует имена
файлов. Значит необходимо установить связь между именами файлов в Турбо
Паскале и именами файлов, присваиваемых операционной системой.
- Assign(F, Name) - связывает имя файловой переменной F в программе с
именем внешнего файла на диске Name. Здесь Name - выражение строкового
типа
вида:
'диск:\имя_каталога\имя_подкаталога\
...\имя_файла'
Если в параметре Name имена диска и подкаталога не указаны, то выбирается
текущий диск и текущий каталог. Если вместо Name указать '' (без пробела), то
файл F оказывается связанным со стандартным файлом ввода Input или со
стандартным файлом вывода Output (в зависимости от того, как он будет
открыт - для чтения или для записи). После выполнения процедуры Assign все
действия над переменной F будут эквивалентны действиям над файлом,
определяемым спецификацией Name. Процедуру Assign необходимо
использовать до начала работы с файлом (до его открытия процедурой Reset
или Rewrite).
2) Открытие и закрытие файла. Прежде чем начинать работу с данными,
хранящимися
в
файле,
его
следует
открыть.
- Reset(F) - открывает уже существующий файл F. Можно передавать данные
как из файла в программу, так и из программы в файл. При этом указатель
файла устанавливается на первый элемент файла и функция Eof(F) = False. Если
файл
пустой,
то
Eof(F)
=
True;
- Rewrite(F) - открывает новый файл F. Можно передавать данные как из файла
в программу, так и из программы в файл. Но нужно помнить, что при записи
информации в файл "старая" информация уничтожается и Eof(F) = True.
- Append(F) - открывает уже существующий текстовый файл F. Можно
передавать данные из программы в файл. При этом указатель файла
устанавливается в конец файла, т.е. данные добавляются в конец файла и Eof(F)
=
True;
- Close(F) - с помощью этой стандартной процедуры запись данных в файл F
завершается. Файл после добавления метки конца файла (функция EOF)
закрывается и может быть в обычном порядке включен в каталог дискеты.
3) Переименование и удаление файла. Для удаления файла с внешнего носителя
используется процедура Erase(F), а для переименования - процедура Rename(F,
Name). Помните, перед тем, как файл переименовать или удалить, он должен
быть закрыт процедурой Close.
4) Перемещения по файлу. Для типизированных файлов с помощью процедуры
Seek(F, N) можно осуществить прямой доступ к элементам файла F. Здесь N целая положительная константа, соответствующая порядковому номеру
элемента в файле. Процедура Seek не выполняет операцию чтения или записи
элемента файла. Она лишь перемещает указатель файла к элементу с номером
N. При этом первый элемент файла имеет номер N = 0, второй - N = 1 и т.д.
5) Стандартные функции FilePos(F) и FileSize(F) позволяют определить
соответственно текущее положение указателя (порядковый номер элемента в
файле) и размер (число элементов) в файле F.
6) Определение конца файла. Так как, по определению, число элементов файла
не задается, то в Турбо Паскале для определения конца файла введена
стандартная функция Eof(F). При чтении данных из файла с помощью
процедуры Eof(F) можно установить, достигнут ли его конец или нет. Если
достигнут конец файла, Eof принимает значение True, иначе - False.
Типизированный файл - это файл, состоящий из элементов любого типа
данных, кроме файлового, например:
type Mas = array[1..10] of real;
Mno = set of 1..10;
Zap = record
FIO : string[30];
SEX : char;
end;
var F1: file of integer; {Элементы файла - целые числа}
F2: file of real; {Элементы файла - вещественные числа}
F3: file of char; {Каждый элемент файла - символ}
F4: file of Mas; {Каждый элемент файла - массив}
F5: file of Mno; {Каждый элемент файла - множество}
F6: file of Zap; {Каждый элемент файла - запись}
Для осуществления передачи данных из типизированного файла в программу
(чтение данных) используется процедура:
- Read(F, X1[, X2,..., Xn]) - считывает в переменную X1 (пересылка данных в
программу из файла) один элемент файла F (или несколько элементов в
переменные X1,..., Xn), начиная чтение с элемента, на который указывает
текущий указатель. Если F опущено, то подразумевается стандартный файл
Input.
Процедура чтения выполнима только в случае, если Eof(F) = False;
Для осуществления пересылки данных из программы в типизированный файл
(запись данных) используется процедура:
- Write(F, X1[, X2,..., Xn]); - записывают одно (X1) или более (X1, X2,..., Xn)
значений переменных в файл F, начиная с той позиции, на которую установлен
указатель. Если F опущено, то подразумевается стандартный файл Output. Write
выполним только в случае, если Eof(F) = True.
Контрольные вопросы к лекции №10.
1. Что такое файл?
2. Какого типа бывают файлы?
3. Как описываются файлы?
4. Какое служебное слово используется для описания файла?
5. Какие операции над файлами вы знаете?
6. Что такое типизированный файл?
7. Что такое нетипизированный файл?
8. Дайте понятие внешнего фала.
Лекция №11. Алгоритмы формирования графических изображений.
Продолжительность – 1 час
Цель лекции- ознакомить обучающихся с графическими возможностями
языка Турбо Паскаль.
Модуль Graph поддерживает графический режим работы дисплея. В этом
режиме любое изображение на экране дисплея синтезируется из множества
мельчайших элементов, называемых пикселями (pixel). Каждый пиксель
представляет собой светящуюся точку таких размеров, при которых
промежутки между соседними пикселями отсутствуют. Если группа смежных
пикселей светится, то они воспринимаются не как совокупность отдельных
точек, а как сплошной участок. Таким образом, на экране дисплея может быть
синтезировано любое графическое изображение.
В графическом режиме экран дисплея разделяется прямоугольной
сеткой, каждый элемент которой имеет свои координаты. Левый верхний угол
экрана имеет координаты (0, 0). Значение левой координаты (X) увеличивается
в горизонтальном направлении слева направо. Значение правой координаты (Y)
увеличивается в вертикальном направлении сверху вниз.
Графическому режиму, как и текстовому, присуще понятие текущего
указателя. Текущий указатель в любой момент времени может находиться в
любой точке экрана с координатами (X, Y). Его местонахождение отображается
курсором. В графическом режиме курсор невидим.
Образ любого изображения, высвечиваемого на экране дисплея с
помощью совокупности пикселей, хранится в специальной области
оперативной памяти компьютера, называемой видеопамятью. В ней каждому
пикселю отводится свой участок (бит, байт и т.д.), где хранится информация о
каждом из них (его состояние, цвет и пр.).
Электронная схема управления дисплеем сконструирована таким
образом, что обеспечивает постоянное сканирование видеопамяти и
отображение ее состояния на экране. Таким образом, любое изменение в
видеопамяти автоматически влечет за собой изменение изображения на экране
дисплея. Размер видеопамяти зависит от разрешающей способности дисплея
(максимальное количество пикселей по горизонтали и вертикали) и от
количества одновременно отображаемых цветов.
Реализация графического режима в ЭВМ обеспечивается благодаря
наличию специальной схемы, называемой графическим адаптером. Компьютер
может комплектоваться следующими типами графических адаптеров: CGA,
MCGA, EGA, VGA, SVGA, Hercules, AT&T, PC-3270, IBM-8514. Работу
графического адаптера поддерживает специальная программа, называемая
драйвером. Загрузочный модуль драйвера хранится в специальном файле с
расширением .BGI (Borland Graphic Interface). Широко распространены
следующие типы драйверов:
CGA.BGI - соответствует адаптерам CGA, MCGA;
EGAVGA.BGI - соответствует адаптерам EGA, VGA;
HERC.BGI - соответствует адаптеру Hercules;
ATT.BGI - соответствует адаптеру AT&T;
PC3770.BGI - соответствует адаптеру IBM3270 PC;
IBM8514.BGI - соответствует адаптеру IBM8514.
Каждому типу используемого графического драйвера в разделе
интерфейса модуля GRAPH.TPU соответствует своя константа. Список этих
констант выглядит следующим образом:
Const Detect = 0; { Автоматическое отпределение драйвера }
CGA = 1; IBM8514 = 6;
MCGA = 2; HercMono = 7;
EGA = 3; ATT400 = 8;
EGA64 = 4; VGA = 9;
EGAMono = 5; PC3270 = 10;
CurrentDriver = -128; { Передается в GetModeRange }
Используемый драйвер может функционировать в различных режимах.
Для выбора конкретного режима драйвера в разделе интерфейса модуля Graph
предусмотрен соответствующий список констант.
Любая графическая программа должна начинаться с инициализации
графического
режима
с
помощью
стандартной
процедуры:
InitGraph(var GraphDriver: integer; var GraphMode: integer; var DriverPath: string);
При этом в переменной GraphDriver задается тип загружаемого драйвера.
После загрузки драйвера происходит его настройка на режим, записанный в
переменной GraphMode (возможные графические режимы описывают
разрешение экрана, например 640х480 точек растра, а также набор цветов).
В переменной GraphPath задается путь к каталогу, где находится
соответствующий загружаемому драйверу BGI-файл. Если DriverPath = '', то
поиск BGI-файла осуществляется в текущем каталоге.
Ошибки, которые могут возникнуть при инициализации графического
режима, анализируют с помощью функции GraphResult.
Пример инициализации графического режима:
Uses Graph;
Var Gd, Gm : integer;
Begin
Gd := Detect; { Автоматическое определение }
InitGraph(Gd, Gm, '');
if GraphResult <> grOk then Halt(1);
..............
CloseGraph;
End.
Для выхода из графического режима используется стандартная процедура
CloseGraph. Эта процедура восстанавливает режим, существовавший до
инициализации графики.
Контрольные вопросы к лекции №11
1. Опишите графические возможности языка программирования.
2. Какой модуль используется для работы в графическом режиме?
3. Расскажите о режиме инициализации графики.
4. Расскажите о выходе из графического режима.
5. Какой драйвер используется для работы в графическом режиме?
6. Чем обеспечивается реализация графического режима?
Лекция №12. Указатели и динамическая память.
Продолжительность – 1 час
Цель лекции – ознакомить студентов с понятием указателей, с адресами и
операциями над адресами, с типом описания указателей.
При выполнении любой программы каждая используемая в ней
переменная получает свой адрес в оперативной памяти. Программисту не
нужно заботиться о механизме определения адресов, это делается
автоматически. В Турбо Паскале имеются два способа распределения памяти
для переменных: статический и динамический.
При статическом распределении всем объявленным в программе
переменным в сегменте данных выделяются фиксированные участки
оперативной памяти. В связи с этим использование заранее не объявленных
переменных не допускается.
При динамическом распределении памяти имеется возможность
создавать новые, не объявленные заранее переменные и размещать их на
свободные участки в динамической области оперативной памяти. Это
достигается за счет использования указателей.
Указатель - это элемент данных, представляющий собой ссылку (адрес)
на определенную ячейку оперативной памяти, начиная с которой записывается
значение переменной. Переменные, которые размещаются в динамической
области оперативной памяти с помощью указателя, называются динамическими
переменными.
Указатель может принимать значения, равные всем адресам оперативной
памяти, по которым возможна запись данных. Указатель может иметь также
стандартное значение Nil (пусто), которое говорит о том, что соответствующая
динамическая переменная в оперативной памяти отсутствует. Указатель
объявляется с помощью специального символа "карэ" (^), за которым
записывается идентификатор типа динамической переменной в следующем виде:
type имя_типа = ^тип;
var имя_переменной: имя_типа;
Пример:
type T = ^integer; или var A, B, C: ^integer;
var A, B, C: T;
В этом случае A, B, C - являются указателями на переменные типа integer. Для
обращения к значениям этих переменных служат идентификаторы A^, B^, C^.
Кроме того указатель может быть объявлен явно следующим образом: var P:
pointer;, где P - имя указателя, а pointer - тип указателя.
Турбо Паскаль допускает описание типизованных констант типа pointer
(констант ссылочного типа). Начальным значением таких констант может быть
только Nil. Например:
type A = array[0..5] of char;
P = ^A;
const P1 : P = Nil;
Значения указателей можно сравнивать только с помощью проверки на
равенство и неравенство. Допустимо также использование оператора
присваивания.
Для динамических переменных (в вышеприведенном примере это A^, B^,
C^) допустимы все те операции, что и над обычными переменными данного
типа.
Переменная задается тремя параметрами: именем, типом, значением и
адресом. Благодаря типу "указатель" появляется возможность использовать в
качестве значения переменной адрес другой переменной, так чтобы такая
переменная
как
бы
"указывала"
на
другую.
Например: Переменная типа "указатель"
Z
Имя
Задание типа "указывает на переменную типа real"
Значение
$24A2:$1000
Адрес
$1000:$2A34
Значением переменной Z с адресом $1000:$2A34 является адрес переменной
типа real (значение которой записывается начиная с адреса $23A2:$1000).
Тип данных "указатель" вводится следующим образом:
type real_index = ^real;
var head, tail: real_index;
или
var head, tail : ^real;
даже если наименование real_index не используется.
Переменная типа "указатель" указывает на переменную типа, заданного в
описании типа. Переменная связывается с этим типом. В качестве значения
такая переменная имеет адрес той переменной, на которую она указывает.
Переменной, на которую указывает указатель, не обязательно
присваивать какое-либо имя. К ней можно обращаться через имя указателя, а
потому она называется ссылочной переменной.
Например: Элементарные операции присваивания для переменных типа
"указатель".
Переменная head типа "указатель" имела в качестве значения адрес
вещественного числа 3.25, и имя head^, под которым можно было обратиться к
этому числу. Точно так же tail указывала на число 2.45.
Соответственно нужно различать два типа операций присваивания значения:
head^ := tail^;
Ссылочная переменная head^ получает значение tail^, т.е. head и tail
указывают теперь на одинаковые объекты 2.45.
Согласно head := tail переменные-указатели имеют одно и то же значение, то
есть указывают на один и тот же объект 2.45 (обратите внимание на различие
формулировок "одинаковые объекты" и "один и тот же объект").
В последней операции присваивания следует иметь в виду, что head и tail
должны указывать на объект одного и того же типа.
Оператор присваивания var rptr : ^real;
wptr : ^word;
rptr := wptr;
приводит при компиляции к ошибке, поскольку rptr и wptr - объекты
различного типа.
Между тем в качестве значения интерес представляет только один адрес, а
потому существует стандартный тип pointer, совместимый со всеми типами
указателей.
Ответим на следующие три вопроса:



Как присваивается значение переменной типа "указатель"?
Какие операторы и константы существуют для переменной типа
"указатель"?
Как можно выдать значение переменной типа "указатель"?
1. Начнем с первого вопроса: Как присвоить переменной Р типа "указатель"
некоторое значение? Для этого существует две принципиально
различных возможности:
o с помощью стандартной процедуры new(P) переменная Р получает
адрес динамической памяти и там резервируется место для
переменной P^;
o через оператор присваивания Р := допустимый адрес.
Рассмотрим сначала второй случай. Существует оператор @ для
задания адреса, применимый ко всем переменным:
var i : integer;
r : real;
zi : ^integer;
zr : ^real;
i := 135; zi := @i; (* Итак, zi^ = 135 *)
r := 1.3; zr := @r; (* Итак, zr^ = 1.3 *)
Кроме того, для работы с адресами существуют функции: addr(x),
ptr(seg, ofs), seg(x), ofs(x), dseg, cseg, sseg.
2. Перейдем ко второму вопросу: Какие константы и операторы существуют
для переменных типа "указатель"? Для такого типа переменных имеется
единственная константа nil, т.е. после
var P : pointer;
P := nil;
переменная Р не указывает ни на что (внутреннее представление
$0000:$0000). На вопрос об операторах ответить просто: их нет, т.е.
ничего подобного Р + 2 или Р - sizeof(real) не существует!
3. Остановимся на третьем вопросе: Как можно выдать значение
переменной типа "указатель"?Запись
var P : pointer;
P := какой-либо адрес;
write(P);
приведет к ошибке "Cannot write variable of this type" ("Нельзя записать
переменную такого типа"). Итак, для того, чтобы вывести значение Р в
нужной Вам форме в виде абсолютного адреса (отдельно
СЕГМЕНТ:СМЕЩЕНИЕ) в десятичном или шестнадцатеричном
представлении, нужно написать собственную процедуру.
Может сложиться представление, что после var P:^integer переменная Р^
является совершенно обычной целой переменной. Это так лишь тогда, когда Р
имеет некоторое определенное значение, а именно адрес Р^. Наиболее
распространенная ошибка, когда программу начинают строкой: Р^ := 17; не
присвоив Р значения, например, с помощью new(P). Тогда не ясно, где же
находится константа 17.
Контрольные вопросы к лекции №12
1. Опишите тип данных «указатель».
2. Что такое динамические переменные?
3. Какие значения может принимать указатель?
4. Дайте определение указателю.
5. Чем динамическое распределение памяти отличается от
статического?
3 ПРАКТИЧЕСКИЕ ЗАНЯТИЯ
Практическое занятие №1 Арифметические выражения. Типы данных.
Математические функции.
Методические указания к практическому занятию №1
Цель занятия: Освоение приемов построения алгоритмов небольших
расчетных задач. Ознакомление с типами данных и математическими
функциями.
Алгоритм – это инструкция о том, в какой последовательности нужно
выполнить действия при переработке исходного материала в требуемый
результат. [последовательность точных предписаний, понятных исполнителю
(компьютеру, роботу и пр.), совершить последовательность действий,
направленных на достижение конкретного результата.]
Наряду с понятием алгоритма используют термин алгоритмизация, под
которой понимают совокупность приемов и способов составления алгоритмов
для решения алгоритмических задач.
Часто алгоритм используется не как инструкция для автомата, а как схема
алгоритмического решения задачи. Это позволяет оценить эффективность
предлагаемого способа решения, его результативность, исправить возможные
ошибки, сравнить его еще до применения на компьютере с другими
алгоритмами решения этой же задачи. Наконец, алгоритм является основой для
составления программы, которую пишет программист на каком-либо языке
программирования с тем, чтобы реализовать процесс обработки данных на
компьютере.
Неотъемлемым свойством алгоритма является его результативность, то
есть алгоритмическая инструкция лишь тогда может быть названа алгоритмом,
когда при любом сочетании исходных данных она гарантирует, что через
конечное число шагов будет обязательно получен результат.
На практике получили известность два способа изображения алгоритмов:
в виде пошагового словесного описания;
в виде блок-схем.
Первый из этих способов получил значительно меньшее распространение
из-за его многословности и отсутствия наглядности. Второй, напротив,
оказался очень удобным средством изображения алгоритмов и получил
широкое распространение в научной и учебной литературе. Именно этот способ
будет использован ниже при составлении и описании алгоритмов.
Задания для самоконтроля к занятию №1
1. Составить программу вычисления площади поверхности фигуры по
формуле: S=2al+a2.(a=3,l=2)
НАЧАЛО
А=3
L=2
S=2*A*L+A^2
S
КОНЕЦ
2. Составить программу решения задачи, используя блок-схему:
Камень падает с высоты 20 м. Вычислите время его падения.
НАЧАЛО
H=20
G=10
T=2H/G
T,H
КОНЕЦ
3. Составьте алгоритм вычисления выражения у=2х2+в3 и записать его на
языке программирования Паскаль (х и в ввести с клавиатуры).
Подсказка:
На естественном языке:
1.Ввод х
2. Ввод в
3. у=2х2+в3
4. Напечатать у
Контрольные вопросы:
1 Что такое алгоритм?
2 Свойства алгоритма?
3 Что такое блок-схема?
4 Из каких блоков состоит блок-схема?
5 Способы описания алгоритмов?
Практическое занятие №2 Программирование линейных алгоритмов.
Условный оператор.
При выполнении практической работы нет нужды давать столь подробное
описание алгоритма. Тем не менее, описание должно быть выполнено с той
степенью полноты, которая позволяет дать ясное представление о всех
сторонах и особенностях алгоритмического процесса.
Цель занятия: Освоение приемов построения алгоритмов линейной и
разветвляющейся структур.
Линейный алгоритм – это алгоритм, в котором блоки выполняются
последовательно сверху вниз от начала до конца.
На практике алгоритмы линейной структуры встречается крайне редко.
Чаще необходимо организовать процесс, который в зависимости от каких-либо
условий проходит по той либо иной ветви алгоритма. Такой алгоритм
называется разветвляющимся.
1. Имя должно лаконично отражать сущность объекта.
S,v,t - общепринятые обозначения;
Summa, N_max - значения суммы номера максимума.
2. Длина идентификатора не должна превышать 127 символов, но для Паскаля
значимы только первые 63 знака.
3. В запись идентификатора могут входить только цифры, английские буквы и
знак подчеркивания.
4. Начинаться идентификатор должен с буквы или знака подчеркивания.
5 .Маленькие и большие буквы в записи идентификаторов Паскаль не
различает.
Раздел описания переменных начинается со слова Var (variables – переменные),
за которым идет список имен переменных через запятую. Тип указывается
после двоеточия. В стандарте языка Паскаль существует два типа числовых
величин: вещественный и целый.
Слово integer обозначает целый тип (является идентификатором целого типа).
Вещественный тип обозначается словом real. Например, раздел описания
переменных может быть таким:
var a, b: integer; c, d: real;
Идентификаторы переменных составляются из латинских букв и цифр;
первым символом обязательно должна быть буква.
Раздел операторов – основная часть программы. Начало и конец раздела
операторов программы отмечаются служебными словами begin (начало) и end
(конец).
В самом конце программы ставится точка:
begin
<операторы>
end.
Операторы ввода, вывода и присваивания
Ввод исходных данных с клавиатуры происходит по оператору read или
readln:
read(<список переменных>)
или readln(<список переменных>)
При выполнении команды ввода компьютер ожидает действий
пользователя. Пользователь набирает на клавиатуре значения переменных в
том порядке, в каком они указаны в списке, отделяя их друг от друга
пробелами. Одновременно с набором данных на клавиатуре они появляются на
экране. В конце нажимается клавиша <ВВОД>(<ENTER>).
Разница в выполнении операторов readln и read состоит в том, что после
выполнения ввода по оператору readln экранный курсор перемещается в начало
новой строки, а по оператору read этого не происходит.
Вывод результатов происходит по оператору write или writeln:
write(<список вывода>)
или writeln(<список вывода>)
Результаты выводятся на экран компьютера в порядке их перечисления в
списке. Элементами списка вывода могут быть константы, переменные,
выражения.
Разница выполнения операторов writeln и write состоит в том, что после
выполнения вывода по оператору writeln экранный курсор перемещается в
начало новой строки, а по оператору write этого не происходит.
Задания для самоконтроля к занятию №2
Задание А
ВАРИАНТ 1
1. Составьте блок-схему алгоритма и программу вычисления площади
треугольника по основанию и высоте.
2. Составьте блок-схему вычисления площади и периметра прямоугольника.
3. Составьте блок-схему вычисления потенциальной энергии тела.
ВАРИАНТ 2
1. Составьте блок-схему алгоритма и программу вычисления площади
параллелограмма по одной из сторон и высоте.
2. Составьте блок-схему вычисления площади и периметра квадрата.
3. Составьте блок-схему вычисления кинетической энергии тела.
ВАРИАНТ 3
1. Составьте блок-схему алгоритма и программу вычисления площади трапеции
по сумме оснований и высоте.
2. Составьте блок-схему вычисления периметра, медианы и площади
равностороннего треугольника.
3. Составьте блок-схему вычисления диагоналей параллелограмма по его
сторонам и углу.
ВАРИАНТ 4
1. Составьте блок-схему алгоритма и программу вычисления площади
треугольника по трем сторонам.
2. Составьте блок-схему вычисления объема, площади полной поверхности,
суммы ребер прямоугольного параллелепипеда.
3. Составьте блок-схему вычисления диагоналей ромба по стороне и углу.
Задание В
ВАРИАНТ 1
1.
Составьте блок-схему и программу вычисления значения функции:
2.
Составьте блок-схему, определяющую, является ли данное число
делителем числа 3.
3.
Составьте блок-схему, заменяющую меньшее из двух данных чисел
суммой, а большее - произведением этих чисел.
4.
Составьте блок-схему вычисления значения функции:
5.
Составьте блок-схему алгоритма и программу расположения трех
чисел в порядке возрастания.
6.
Составьте блок-схему, определяющую принадлежность точки А(х,
у) отрезку АВ, если A(x1, у1) и В(х2, у2) - концы отрезка.
ВАРИАНТ 2
1.
Составьте блок-схему и программу вычисления значения функции:
2.
Составьте блок-схему, определяющую, является ли данное число
кратным 4
3.
Составьте блок-схему, заменяющую большее из двух данных чисел
удвоенным произведением, а меньшее - полусуммой этих чисел.
4.
Составьте блок-схему вычисления значения функции:
5.
Составьте блок-схему алгоритма и программу расположения трех
чисел в порядке убывания.
6.
Составьте блок-схему, определяющую принадлежность точки А(х,
у) окружности с центром 0(0; 0) и радиусом R.
ВАРИАНТ 3
1.
Составьте блок-схему и программу вычисления значения функции:
2.
Составьте блок-схему, определяющую, является ли число А
делителем числа В.
3.
Составьте блок-схему, заменяющую меньшее из двух данных чисел
модулем разности, а большее - модулем произведения этих чисел.
4.
Составьте блок-схему вычисления значения функции:
5.
Составьте блок-схему алгоритма и программу расположения
четырех чисел в порядке возрастания.
6.
Составьте блок-схему, определяющую вид треугольника по трем
его сторонам - А, В, С.
ВАРИАНТ 4
1.
Составьте блок-схему и программу вычисления значения функции:
2.
Составьте блок-схему, определяющую остаток от деления числа А
на число В.
3.
Составьте блок-схему, заменяющую большее из двух данных чисел
модулем суммы, а меньшее - модулем полуразности этих чисел.
4.
Составьте блок-схему вычисления значения функции:
5.
Составьте блок-схему алгоритма и программу расположения
четырех чисел в порядке убывания.
6.
Составьте блок-схему, определяющую вид треугольника по двум
данным углам А, В
Практическое занятие №3 Операторы цикла.
При выполнении практической работы нет нужды давать столь подробное
описание алгоритма. Тем не менее, описание должно быть выполнено с той
степенью полноты, которая позволяет дать ясное представление о всех
сторонах и особенностях алгоритмического процесса.
Методические указания к практическому занятию №3
Цель занятия: Овладение теоретическими основами и практическими
навыками программирования итерационных вычислительных процессов
циклической структуры, получение дальнейших навыков по отладке и
тестированию программы.
Большинство вычислительных процессов обладает следующей
особенностью: отдельные участки вычислений повторяются многократно, при
этом всякий раз используются новые значения исходных данных.
Такие вычислительные процессы называют циклическими, а их
повторяющиеся участки - циклами.
В Турбо Паскале различают три вида операторов организации циклов:
 while - оператор цикла с предварительным условием (цикл с
предусловием);


repeat - оператор цикла с последующим условием (цикл с постусловием);
for - оператор цикла с управляющим параметром (цикл с параметром).
Оператор цикла while. Цикл с предусловием характерен тем, что перед
выполнением цикла всегда необходимо проверить условие. Если условие
истинно, то цикл продолжается, иначе - цикл заканчивается.
Общий вид оператора следующий:
while <логическое_выражение> do <оператор>;
где <оператор> - простой или составной оператор, а <логическое_выражение> выражение булевского типа.
Оператор цикла while действует следующим образом. Предварительно
проверяется значение логического выражения. Пока оно истинно, выполняется
оператор циклической части (после do). Как только значение логического
выражения становится ложным, происходит выход из цикла.
Пример: Вычислить значение выражения A**7 при любом значении A
(например, при A < 0, когда выражение Exp(7 * Ln(A)) недопустимо).
program prg;
uses СRT;
var I : integer; A, P : real;
Begin
ClrScr;
I := 1; P := 1;
Write('Введите основание степени: '); ReadLn(A);
while I <= 7 do
begin
P := P * A;
I := I + 1 { Можно использовать функцию Inc(I) }
end;
Write('Значение выражения A**7 равно ', P:5:10);
ReadLn
End.
Оператор цикла repeat. Оператор повтора repeat состоит из заголовка
(repeat), тела цикла и условия окончания (until). Цикл с постусловием
характерен тем, что вначале обязательно выполняются хотя бы один раз
команды, составляющие тело цикла.
После выполнения операторов циклической части проверяется условие.
Если условие ложно, то вновь выполняются операторы циклической части.
Если
условие
истинно,
то
цикл
заканчивается.
Общий вид оператора следующий:
repeat
<оператор_1>;
<оператор_2>;
...........
<оператор_n>
until <логическое_выражение>;
<Логическое_выражение> (условие) - выражение булевского типа. При
написании условия допустимы булевские операции и операции отношения.
Операторы, заключенные между словами repeat и until, являются телом цикла.
Оператор цикла repeat действует следующим образом:
 выполняются операторы циклической части, проверяется значение
логического выражения: если оно ложно, то вновь выполняются
операторы циклической части; если же оно истинно, то цикл
заканчивается;
 если значение логического выражения истинно с самого начала, то
операторы циклической части выполняются один раз. Если же логическое
выражение никогда не принимает значение "истинно", то операторы
циклической части выполняются бесконечное число раз, т.е. происходит
"зацикливание";
 нижняя граница операторов циклической части четко обозначена словом
until, поэтому нет необходимости заключать эти операторы в
операторные скобки begin - end. В то же время дополнительное наличие
операторных скобок не является ошибкой.
Примечание: Оператор repeat until KeyPressed (исполняется "пустой" цикл до
тех пор, пока не будет нажата любая клавиша) служит для задержки результата
выполнения программы до нажатия на любую клавишу.
Оператор цикла for. Цикл с параметром характерен тем, что количество
исполняемых циклов определено в заголовке цикла при записи оператора for.
Общий вид оператора: for I := N1 to N2 do <оператор>;
где I - переменная (параметр) цикла; N1, N2 - начальное и конечное значения
переменной цикла.
В качестве переменной I может использовать только простую
переменную, а в качестве N1, N2 могут использоваться выражения (за
исключением вещественного типа real).
Параметры I, N1, N2 должны быть одного и того же скалярного типа, но
не real (т.е. целого, символьного, ограниченного типа или типа "перечисление").
Переменная цикла I принимает последовательные значения данного типа от N1
до N2. Если I, N1, N2 - целого типа, то в этом случае шаг изменения
переменной цикла всегда равен +1.
Пример:
program Pr6;
const A = 10.2;
var X : integer;
Begin
for X := 5 to 35 do Writeln('Y=', A * X * X)
End.
Пример цикла, когда параметр принимает значения символьного типа: for I =
'A' to 'W' do Write(' ', I). В примере осуществляется печать букв латинского
алфавита от A до W.
Задания для самоконтроля к занятию №3
Задания к практической работе в электронном учебнике «1000 задач по
Паскаль»
Практическое занятие №4 Одномерные массивы. Двумерные массивы.
Обработка массивов.
При выполнении практической работы нет нужды давать столь подробное
описание алгоритма. Тем не менее, описание должно быть выполнено с той
степенью полноты, которая позволяет дать ясное представление о всех
сторонах и особенностях алгоритмического процесса.
Методические указания к практическому занятию №4
Цель работы: Овладение практическими навыками работы с
векторами и матрицами при программировании.
Массив - это упорядоченная последовательность данных, обозначаемая
одним именем (идентификатором). Члены этой последовательности называются
элементами массива. Каждый элемент определяется именем массива и его
положением в массиве. Положение элемента в массиве определяется его
индексом (порядковым номером). Упорядоченность последовательности
данных заключается в том, что элементы массива располагаются в
последовательных ячейках памяти.
Объявление одномерных массивов
1.
В разделе переменных
Var имя массива : Array [тип индекса] of тип элементов ;
2.
В разделе описания типов
Type имя типа = Array [тип индекса] of тип элементов ;
Var имя массива : имя типа ;
3.
В разделе констант
Const имя массива : Array [тип индекса] of тип элементов = (список
элементов);
Способы заполнения одномерных массивов
1.
Ввод массива с клавиатуры оператором Read.
For i:=1 to n do
Read (A[ i ]);
2.
Ввод массива оператором случайных чисел Random на интервале
[a;b]
(a;b)
For i:=1 to n do
For i:=1 to n do
A[ i ] := Random (b-a+1)+a;
A[ i ] := Random (b-a)+a;
3.
Ввод массива в разделе констант (производится вместе с
объявлением).
Например:
Const N=5;
A := Array [1..N] of integer = (-8,0,4,1,3);
Вывод одномерного массива
1.
Вывод линейного массива
В строку
В столбец
For i:=1 to n do
For i:=1 to n do
Write (a[i],' ');
Writeln (a[i],' ');
2. Поиск суммы произведения и количества элементов одномерного
массива
Названи
е
сумма
Произве
дение
Количес
тво
Действие до
цикла
S=0
S = S + A[i]
Действия после
цикла
Write (S=',s)
P=1
P = P * A[i]
Write (P=',p)
K=0
Дествие в цикле
If условие then K =
K+1
Поиск экстремального элемента в одномерном массиве
1.
Поиск минимального элемента
min := a[1];
k :=1;
for i := 1 to n do
begin
if A[i] < min then min := A[i];
k:=i;
end;
writeln (a[k]);
2.
Поиск максимального элемента
max := a[1];
k :=1;
for i := 1 to n do
begin
if A[i] > max then min := A[i];
k:=i;
end;
writeln (a[k]);
Объявление двумерных массивов
Write (K=',k)
Способы заполнения двумерных массивов
1.
По строке
For i := 1 to n do
For j := 1 to m do
a [i,j] := random (100) ; {или Readln[i,j]}
2.
По столбцу
For i := 1 to n do
For j := 1 to m do
a [i,j] := random (100) ; {или Readln[i,j]}
Вывод двумерного массива в виде таблицы
For i := 1 to n do
begin
for j :=1 to m do
write (a[i;j],' ');
writeln
end;
Задания для самоконтроля к занятию №4
Задания к практической работе в электронном учебнике «1000 задач по
Паскаль»
Практическое занятие №5 Обработка символьных и строковых данных.
При выполнении практической работы нет нужды давать столь подробное
описание алгоритма. Тем не менее, описание должно быть выполнено с той
степенью полноты, которая позволяет дать ясное представление о всех
сторонах и особенностях алгоритмического процесса.
Методические указания к практическому занятию №5
Цель работы: Овладение практическими навыками с символьными и
строковыми данными.
Описание строковых переменных имеет вид:
type имя_типа = string[N];
var имя_перем : имя_типа; или var имя_перем : string[N];
Здесь N - целая константа, указывающая максимальную длину строки
(количество символов в строке). В Турбо Паскале 1 <= N <= 255.
Пример:
type Line : string[80]; var MyLine : Line;
Возможно также описание вида: var имя_перем : string; которое
определяет строковую переменную максимально возможной длины (в 255
символов).
Пример:
Const Adress = 'ул. Королева, 10'; { Строковая константа }
type Flot = string[125];
var FStr: Flot; { Описание с заданием типа }
St1: string; { По умолчанию длина строки равна 255 }
St2, St3: string[50];
Name: string[280]; { Ошибка, длина Name больше 255 байт }
Для определения объема памяти в байтах, требуемой для размещения
строки, к значению ее максимальной длины прибавляется 1. Например, для
размещения в памяти переменных FStr, St1, St2 требуется соответственно 126,
255 и 51 байт. Дополнительный байт расположен в самом начале строки (имеет
нулевой номер) и содержит значение текущей длины строки.
В Турбо Паскале переменные типа string[N] занимают N+1 байт. Так, в
приведенном примере St3 будет занимать 51 байт.
Строковые переменные аналогичны массивам типа char. Их отличием
является то, что число символов (или текущая длина строки) может
динамически меняться в интервале от нуля до заданного верхнего значения N.
Как и в массивах, к отдельным символам строки можно обратиться с помощью
индексов в квадратных скобках: St1[1], St2[8]. Нулевой индекс определяет
позицию, в которой содержится текущая длина строки.
Турбо Паскаль допускает также использование типизованных констант
строкового типа:
const S1: string[6] = 'строка';
S2: string[2] = #13#10;
S3: string[5] = '0';
Строковые данные могут участвовать в строковых выражениях,
состоящих из строковых констант, переменных типа string и char, знаков
операций и встроенных функций. При этом над строковыми данными
допустимы следующие операции: присваивание, сцепление (конкатенация) и
отношения.
Задания для самоконтроля к занятию №5
Задания к практической работе в электронном учебнике «1000 задач по
Паскаль»
Практическое занятие №6 Процедуры и функции.
При выполнении практической работы нет нужды давать столь подробное
описание алгоритма. Тем не менее, описание должно быть выполнено с той
степенью полноты, которая позволяет дать ясное представление о всех
сторонах и особенностях алгоритмического процесса.
Методические указания к практическому занятию №6
Цель
работы:Приобретение
практических
навыков
в
программировании процедур и функций. Изучение механизма передачи
параметров. Знакомство с локальными и глобальными переменными.
Процедуры и функции являются мощным средством языка
программирования. Это средство удобно применять в тех случаях, когда при
решении задачи возникает необходимость в программе некоторую
совокупность операторов повторять несколько раз. Так например, может
возникнуть необходимость один и тот же цикл использовать в нескольких
местах программы. Функцию или процедуру можно сравнить с минипрограммой, именно поэтому их называют иногда одним общим именем "подпрограмма (ПП)". 1111 оформляется подобно программе: в начале
записывается заголовок ПП, затем следует декларативная часть ПП и после
процедурная. Декларативной части описываются все данные, область действия
которых ограничена телом данной ПП. Эти данные называются локальными.
Внутренняя процедура вложена в охватывающую ее процедуру.
Var a,b: integer;
Procedure внешняя;
Var c, t : real;
Procedure внутренняя;
Var e,q: real;
Begin (операторы внутр. процедуры) end;
Begin (операторы внешней процедуры) end;
Begin (операторы главной процедуры) end;
Данные, описанные в главной процедуре, могут использоваться всюду,
как в самой главной процедуре, так и во вложенных процедурах. Их называют
глобальными данными, а областью действия является вся программа.
Переменные c и t, объявленные во внешней процедуре, являются локальными
для этой процедуры, но областью их действия является еще и внутренняя
процедура, которая входит составной частью в тело внешней процедуры.
Область действия переменных e и q только внутренняя процедура.
Формат процедуры выглядит так:
Prucedure имя;
раздел описаний;
Begin;
раздел операторов процедуры;
End;
Заголовок функции имеет следующий вид:
Function <имя функции(список формальных параметров)>: <тип
результата>;
Зарезервированное слово function указывает на то, что начинается
описание функции. После него следует имя функции. В скобках после имени
функции указывается список формальных параметров. Список формальных
параметров - такой же, как и для процедуры.
Телом функции является блок, в котором должен быть один оператор
присваивания, присваивающий вычисленное значение имени функции.
Обращение к функции осуществляется указателем функции, состоящим
из имени вызываемой функции и списка фактических параметров,
заключенного в круглые скобки. Фактические и формальные параметры
должны быть согласованы между собой по смыслу, числу и типу.
В качестве примера составим программу для определения и вывода на
экран количества точек, попавших в заданный круг радиуса R с началом в точке
с координатами Xo, Yo.
Дано: Xo=13.4; Yo=16.8; R=8.5; No=0.
(X - Xo)2 + (Y - Yo)2 <= R2
Program tochki;
Label 3,4;
Const X0=3.4; Y0=16.8; R=8.5; N0=0;
Var X,Y:real; N:integer;
function TT(XT,YT:real): integer;
Begin
if (sqr(XT - X0) + sqr(YT - Y0) <= R*R then
TT := 1 else TT := 0
end;
Begin N := 0;
3: read(X,Y);
if (X=0) and (Y=0) then goto4
else N := N + TT(X,Y);
goto 3;
4: writeln(‘В круг попало’, N, ‘точек’)
end.
Задания для самоконтроля к занятию №6
Задания к практической работе в электронном учебнике «1000 задач по
Паскаль»
Практическое занятие №7 Записи и файлы.
При выполнении практической работы нет нужды давать столь подробное
описание алгоритма. Тем не менее, описание должно быть выполнено с той
степенью полноты, которая позволяет дать ясное представление о всех
сторонах и особенностях алгоритмического процесса.
Методические указания к практическому занятию №9
До сих пор данные вводились в программу через клавиатуру, т. е. с
непременным участием человека. Такой способ ввода информации называется
интерактивным режимом ввода. Возможен и иной подход, основывающийся на
использовании набора данных, подготовленных заранее и хранящихся в виде
файла на магнитном носителе. Иначе говоря, альтернативой интерактивному
режиму является такой способ ввода, при котором информация поступает из
источника, физически существующего вне программы. Этот процесс обычно
называют считыванием данных из внешнего файла (или просто из файла).
Указанный способ находит широкое применение при обработке
информационных массивов весьма значительного объема, когда интерактивный
режим становится слишком обременительным и малоэффективным. Вторым
мотивом использования файлов является то, что он может быть создан какой-то
другой программой. Таким образом, файл становится связующим звеном между
разными задачами. Наконец, последнее немаловажное соображение: если
входные данные поступают в программу из внешнего файла, то присутствие
пользователя в момент фактического исполнения программы становится
необязательным.
Файл - это именованная область внешней памяти компьютера (жесткого
диска, гибкой дискеты,...), содержащая логически связанную совокупность
данных.
Общий вид описания записи следующий:
var имя_записи: record
список_элементов_1: тип_1; {Поле 1}
список_элементов_2: тип_2; {Поле 2}
список_элементов_3: тип_3; {Поле 3}
....................................
список_элементов_n: тип_n; {Поле n}
end;
Другой способ: type имя_типа = record
список_элементов_1: тип_1; {Поле 1}
список_элементов_2: тип_2; {Поле 2}
список_элементов_3: тип_3; {Поле 3}
....................................
список_элементов_n: тип_n; {Поле n}
end;
var имя_записи: имя_типа;
Здесь список_элементов - перечень имен элементов через запятую; тип_1,
тип_2,..., тип_n - типы полей.
Пример: Описание записи "владелец автомобиля".
type Auto = record
{ Номер автомобиля }
Nomer: integer;
{ Марка автомобиля }
Marka: string[20];
{ Фамилия, имя, отчество владельца }
FIO: string[40];
{ Адрес владельца }
Adress: string[60];
end;
var M, V: Auto;
Задания для самоконтроля к занятию №7
Задания к практической работе в электронном учебнике «1000 задач по
Паскаль»
Практическое занятие №8 Реализация графики на языке Паскаль
При выполнении практической работы нет нужды давать столь подробное
описание алгоритма. Тем не менее, описание должно быть выполнено с той
степенью полноты, которая позволяет дать ясное представление о всех
сторонах и особенностях алгоритмического процесса.
Методические указания к практическому занятию №8
Цель работы: Овладение начальными навыками работы с
графическим режимом экрана, используя модуль GRAPH.
Стандартный модуль GRAPH содержит библиотеку из более чем 50
графических программ. В нем поддерживается несколько видов закрашивания,
типов линий и шрифтов, размер которых можно изменять.
Для переключения экрана в графический режим необходимо выполнить
процедуру:
InitGraph (var Graphdriver : integer; var GraphMode : integer; PathToDriver :
string); По этой процедуре выполняются:
- поиск в каталоге PathToDriver файла драйвера графической карты с
номером GraphDriver;
- загрузка драйвера в оперативную память;
- установка указанного графического режима GraphMode.
Если имя каталога не указано (параметр PathToDriver представляет собой
пустую строку ''), то файл ищется в текущем каталоге.
Задания для самоконтроля к занятию №8
Задания к практической работе в электронном учебнике «1000 задач по
Паскаль»
4 Лабораторный практикум
Основная цель, которая ставиться студенту при выполнении задания практическое освоение всех этапов разработки надежной программы для
решения задачи на ПЭВМ, начиная от анализа условия задачи и заканчивая
сдачей отчета по написанной программе. Каждая лабораторная работа состоит
из одной или 2-х задач и включает следующие виды работ:
 Анализ условия задачи и выработка подхода к ее решению.




Пошаговая разработка алгоритма решения и его описание.
Обоснование алгоритма.
Составление блок-схемы алгоритма.
Выбор и обоснование представления для входных, выходных и
промежуточных данных.
 Кодирование алгоритма, т. е. его запись на языке Pascal.
 Выбор набора тестов, на которых будет проверяться программа.
 Отладка программы и демонстрация правильной ее работы на выбранном
наборе тестов.
Обратите внимание на то, что для повышения эффективности
составления алгоритма относительно больших программ применяется
структурный подход к программированию. Это способствует уменьшению
затрат на создание и дальнейшее использование программ при эксплуатации.
Структурный подход к программированию состоит из трех частей:
нисходящая разработка, структурное программирование и сквозной контроль
(тестирование).
При нисходящей разработке проектирование программирование ведутся
по методу "сверху - вниз", который предусматривает сначала определение
задачи в общих чертах, а затем задача разбивается на ряд более простых
подзадач. Для каждой подзадачи составляется алгоритм ее решения.
В структурном программировании программист мыслит как конструктор,
в распоряжении которого есть некоторое (небольшое) число вполне
определенных типовых конструкций, причем заданы правила их соединения структуры можно сочленить друг с другом, вложить друг в друга, либо,
наоборот, разложить на составляющие. Структура - это оператор (вполне
определенный, не всякий) языка программирования, который имеет один вход
и один выход. Подготовка к каждой лабораторной работе производится во
внеаудиторное время. Выполнив лабораторную работу, студент оформляет
отчет, который состоит из следующих разделов:
1. Тема и цель работы.
2. Условия задания.
3. Схема алгоритма решения задачи.
 Математическая модель задачи;
 Блок схема алгоритма.
4. Анализ алгоритма.
5. Текст программы и размещение исходных данных при вводе.
6. Результаты выполнения программы.
7. Обоснование правильности разработанной программы.
8. Выводы.
Лабораторное занятие№1 Программирование линейных алгоритмов
Лабораторные работы содержат краткие теоретические сведения по
конкретной теме, контрольные вопросы, задание и методические указания к его
выполнению, а также варианты индивидуальных заданий.
Методические указания к лабораторному занятию №1
Цель работы: Овладение навыками разработки алгоритмов линейных
процессов, умением составлять математические модели алгоритмов и
записывать программы на языке Паскаль.
Краткие сведения из теории
Понятие алгоритма
Определение 1. Алгоритм - это четкое описание последовательности
действий, приводящих к решению задачи.
В теории алгоритмов принята следующая классификация алгоритмов:
линейные, разветвляющиеся, циклические.
Линейный алгоритм состоит из последовательности действий, каждое из
которых выполняется только один раз в порядке их следования.
Существует ряд способов записи алгоритмов; основными из них
являются: текстуальный, графический, операторный.
Определение 2. Схема алгоритма - это графическое изображение
алгоритма с помощью различных геометрических фигур или блоков. Каждому
блоку соответствует определенный этап решения задачи. Блоки соединяются
линиями потока информации, причем линии определяют направление
вычислений сверху вниз и слева направо. Если необходимо отразить другое
направление (снизу вверх или справа налево), то на линиях ставятся стрелки.
Внутри блоков записываются выполняемые действия. Для записи линейных
алгоритмов применяются следующие блоки (рис.1):
Рис.1. Основные элементы схем линейных алгоритмов.
Этапы решения задачи на ЭВМ
1.
Словесная постановка задачи. Этот этап предполагает точную
формулировку задачи и цели, которые необходимо достигнуть при ее решении.
Определение целей сводится к нахождению исходных и промежуточных
величин, а также результатов, т. е.
дано:
определить:
промежуточные величины.
2.
Математическая постановка задачи заключается в записи условия
задачи в виде математических соотношений с использованием выше
выбранных переменных. На этом же этапе осуществляется выбор
математического
метода
решения
задачи
согласно
составленной
математической модели. Метод должен обеспечить решение задачи
выполнением последовательности четырех арифметических операций и
функций. Для простых задач обычно метод решения очевиден, и этот этап
опускается.
3.
Разработка
алгоритма
и
его
графическое
описание.
Алгоритмизация задачи представляет собой первый этап программирования. В
процессе его выполнения устанавливается необходимая последовательность
арифметических и логических действий, с помощью которых реализуется
выбранный численный метод. Эту последовательность можно записать в виде
схемы алгоритма.
4.
Запись алгоритма на языке программирования. Алгоритм,
записанный
в
графическом
виде,
далее
записывается
в
виде
последовательности операторов выбранного языка программирования, т.е.
составляется программа решения задачи.
5.
Разработка контрольного теста и отладка программы. Отладка
программы необходима для выявления и устранения ошибок, допущенных на
предыдущих этапах.
Правильность выполнения программы осуществляется сравнением
результатов, полученных при расчете нескольких вариантов задачи вручную и
на ЭВМ. Полученный вручную расчет является контрольным тестом. Такой
метод называется тестированием программы.
6. Работа на ЭВМ с получением результатов. После решения задачи на
ЭВМ необходим анализ результатов. Решение задачи на ЭВМ производится по
отлаженной программе для всего множества исходных данных. Анализ
результатов выполняется, как правило, лицом, в интересах которого решалась
задача.
Структура программы на языке Паскаль
Язык программирования (алгоритмический язык) - это специальный язык
общения человека с ЭВМ. Общение производится следующим образом:
программа записывается средствами языка программирования;
эта запись переводится на язык команд ЭВМ с помощью специальной
программы, называемой транслятором или компилятором;
в результате трансляции (перевода) создается программа в машинных
кодах (объектный модуль);
объектный модуль компонуется и в результате создается загрузочный
модуль, при выполнении которого получается результат.
Программа на алгоритмическом языке состоит из предложений, каждое
из которых выполняет определенное действие.
Для описания линейных алгоритмов достаточно применение операторов
ввода, вывода и присваивания (назначения).
Программа на языке Паскаль состоит из двух частей: декларативной и
процедурной. В декларативную часть входят: заголовок программы; раздел
меток; раздел констант; раздел типов; раздел переменных; раздел процедур и
функций. Процедурная часть состоит из раздела операторов. Общая структура
программы на Паскале имеет следующий вид: PROGRAM имя
(INPUT,OUTPUT); - заголовок LABEL - раздел меток
CONST
- раздел констант
TYPE
- раздел типов
VAR
- раздел переменных
PROCEDURE,FUNCTION - раздел процедур и функций
BEGIN
оператор 1; оператор 2;
оператор n-1; оператор n
END.
Заголовок содержит служебное слово PROGRAM, имя программы,
задаваемое пользователем, и в круглых скобках имена стандартных процедур
INPUT, OUTPUT для
связи с внешними стандартными устройствами ввода-вывода ЭВМ.
Заголовок заканчивается символом "точка с запятой".
Декларативная часть программы предназначена для объявления всех
встречающихся в программе данных. После каждого объявления данного или
метки ставится точка с запятой. В стандартном Паскале разделы декларативной
части должны располагаться в строго указанном выше порядке, в ТурбоПаскале строгий порядок не обязателен. Следует заметить, что не все
перечисленные разделы должны обязательно присутствовать в программе. В
простых программах, например, могут потребоваться только разделы
объявления констант и переменных. Некоторые программы могут вообще не
содержать разделы декларативной части.
Раздел операторов заключается в операторные скобки BEGIN (начало) и
END (конец), при этом после END ставится точка. В этом разделе записывается
последовательность исполняемых операторов, после каждого из которых
ставится точка с запятой. Примечание:
a)
перед словом END точку с запятой можно опускать;
b)
указание стандартных устройств в заголовке программы не
обязательно в Турбо- Паскале, начиная с версии 4.0 и выше.
1.4.
Объявление констант и переменных
Для записи линейных программ в разделе описаний может потребоваться
объявление констант и переменных.
Объявление констант имеет вид: ключевое слово CONST, после которого
записываются имена используемых констант и их значения.
Имена и значения разделяются знаком равенства. Каждое определение
константы заканчивается точкой с запятой. Примеры: CONST
NMIN = 1; NMAX = 100; LIM = C;
Далее в разделе операторов используется только имя константы. Если
значение константы меняется, то изменение производится только в разделе
констант, что очень удобно. Если в программе не используются константы, то
этот раздел отсутствует.
Описание переменных начинается с ключевого слова VAR, за которым
идет перечисление имен всех переменных программы с указанием их типов,
разделенных символом "двоеточие".
Общий вид описания переменных: VAR
V1,V2,V3,...,Vn: T; где V1,V2,V3,...,Vn - имена переменных данного типа;
Т - тип переменных.
В разделах описаний данное может быть описано только один раз.
Примеры описания переменных стандартного типа.
VAR
A, B, C : real;
{переменные действительного типа}
N, K, L, M : integer; {переменные целого типа} D, BETA : boolean;
{переменные логического типа}
Stroka
: string[10]; {переменные строкового типа, в квадратных
скобках указана
максимальная длина переменной}
Для линейных программ достаточно применения операторов ввода,
вывода и присваивания.
1.5.
Операторы для записи линейных процессов 2.5.1. Оператор
присваивания
Этот оператор относится к простым операторам, т. к. не содержит внутри
себя других операторов.
Синтаксис оператора присваивания:
V : = A;
здесь V - имя переменной;
" : = " - знак присваивания; А - выражение.
Данный оператор вычисляет значение выражения А и присваивает
полученное значение переменной V. Выражение в правой части может быть
арифметическим, логическим и символьным. Поэтому при использовании
оператора присваивания нужно следить за тем, чтобы переменная в левой части
и выражение в правой части были одного и того же типа. Из этого правила
существует одно исключение: разрешается при целочисленном выражении
использовать переменную действительного типа в левой части. В этом случае
значение вычисленного выражения будет преобразовано в действительный тип.
Примеры:
Т: = 527.475;
M: = TEM;
Y: = SQRT^);
L: = A and B;
ST: = 'PASCAL';
C5: = 2*K-SIN(PI/4-Х);
Здесь T, Y, C5 имеют действительные значения и должны быть описаны в
разделе переменных как данные типа REAL.
Переменная ST должна иметь строковый тип в разделе описаний VAR;
переменные М и ТЕМ должны иметь любые одинаковые типы, а переменные К
и Х могут быть либо действительного типа, либо целого. Неверные записи:
а) VAR
б) VAR
D : REAL;
A,B,C,D : REAL;
beqin
beqin
D : = '7'
A : = (B<C) and (D>C)
end.
end.
В примере а) переменной D типа REAL присваивается константа типа
CHAR. Это вызовет ошибку "несоответствие типа данных".
В примере б) переменной А действительного типа присваивается
значение логического выражения, что также приведет к ошибке
"несоответствие типов данных".
Оператор ввода числовых данных
Ввод числовых данных на Паскале выполняется операторами READ и
READLN. Общий вид операторов следующий: READ(a1, a2 ,..., an); READLN;
READLN(a1, a2, ... , an); ,
где а1, а2,..., аn - имена переменных, которым последовательно
присваиваются вводимые с клавиатуры числовые значения.
При
выполнении оператора
READ
вычислительная система
приостанавливает работу и ждет ввода значений переменных, указанных в
данном операторе. Если в операторе указано две и более переменных, то
значения этих переменных при наборе на клавиатуре печатаются через пробел.
Также допускается применение оператора ввода без параметров - READLN.
Этот оператор выполняет переход на новую строку.
При выполнении оператора READLN^, а2 ,..., а^ вводятся значения всех
переменных, а затем осуществляется переход на новую строку.
Следует помнить, что значения переменных и их имена должны
соответствовать одному и тому же типу.
Оператор вывода числовых данных
Вывод числовых данных выполняется операторами WRITE и WRITELN,
которые имеют вид:
WRITE(b1, b2 ,..., bn); WRITELN;
WRITELN (b1, b2 ,..., bn);.
Оператор WRITE выполняет вывод значений переменных b1, b2,... , bn в
одной строке. Оператор WRITELN без параметров осуществляет переход на
начало новой строки. Оператор WRITELN с параметрами после вывода
последнего значения осуществляет переход на начало новой строки. Примеры:
1)
Write(a, b); Write(c); - вывод а, b, с в одну строку;
a)
Writeln(a, b); Write(c); - вывод а и b на одной строке, с- на
следующей строке.
Второй типовой структурой алгоритмов является разветвляющийся
вычислительный процесс, в котором направление вычислений зависит от
результата проверки некоторого условия. Направления, по которым может
следовать вычислительный процесс, называются ветвями. В программах
разветвляющихся процессов естественный порядок выполнения операторов
нарушается и обеспечивается выполнение той последовательности операторов,
которая соответствует выбранным условиям. В языке Паскаль это реализуется
специальными управляющими операторами или операторными структурами,
которые называются операторами перехода.
Схему алгоритма разветвленной структуры характеризует наличие блока
"условие", который имеет два выхода, помеченные словами "да" и "нет". Еще
этот блок называют логическим блоком. В этом блоке осуществляется проверка
выполнения некоторого логического условия. Если условие "истинно",
вычислительный процесс идет по выходу "да", в противном случае - по выходу
"нет". Различают три типа разветвляющихся алгоритмов, функциональные
схемы которых приведены на рисунке 1.
а
б
Рис.1. Функциональные схемы разветвляющихся процессов
Ветвление, представленное на рис.1(а), называется обходом, так как
оператор S, записанный в арифметическом блоке, не выполняется, если условие
В ложно. При реализации вычислительного процесса арифметический блок
будет обойден, и направление вычислений пойдет по ветви "нет".
Выбор из двух возможностей, или альтернатива, представлен на рис.1(б).
Если проверяемое условие В будет истинным, выполнится оператор S1, в
противном случае выполнится оператор S2. Отметим, что алгоритм обхода
является частным случаем альтернативы. Выбор из многих возможностей
представлен на рис.1(в). Здесь В1, i=1,K представляют собой условия выбора, в
зависимости от значений которых выполняется один из соответствующих им
операторов S1, S2, . . , SK.
3.2. Операторы перехода
Назначение операторов перехода состоит в организации безусловных и
условных переходов в программе в зависимости от результата проверки
логического условия В.
3.2.1. Операторная запись обхода
Разветвление такого типа может быть записано с помощью условного
оператора, который имеет вид:
IF < выражение > THEN < оператор > ,
где IF ( "если" ) и THEN ( "то" ) - ключевые слова;
<
выражение > - логическое условие;
<
оператор > - оператор.
При решении практических задач бывает необходимо в зависимости от
результата проверки, выполнить (или обойти) группу операторов. Язык
Паскаль предоставляет возможность сделать из группы операторов один
составной оператор, заключив группу операторов в операторные скобки Begin
и End.
Тогда условный оператор для записи обхода группы операторов имеет
вид: IF < выражение > THEN Begin < S1, S2, . . , SN > End;.
Операторная запись альтернативы
Выбор из двух возможностей реализуется условным оператором,
имеющим следующий синтаксис:
IF < выражение > THEN < оператор 1 > ELSE < оператор 2 >; где ELSE
("иначе") - ключевое слово.
Если < выражение > истинно, то выполняется < оператор 1 >, в
противном случае - < оператор 2 >.
Оператор, стоящий после ключевого слова ELSE, может быть любым
оператором, в том числе и условным. Кроме того, < оператор 1> и <оператор 2>
могут быть составными операторами.
Ниже приведена одна из возможных конструкций условного оператора:
IF B1 THEN Begin <S1, S2> End ELSE If B2 Then <S3> Else <S4>;
Здесь B1 и B2 - логические условия. < Оператор 1 > представляет собой
составной оператор, а < оператор 2 > - условный оператор If - Then - Else. Если
логическое условие В1 истинно, выполнятся S1 и S2, и управление будет
передано следующему в программе оператору. Если логическое условие В1
ложно, выбирается < оператор 2 >. При его выполнении проверяется условие
В2: в случае истинности выражения В2 выполняется оператор S3, в противном
случае - S4.
Операторная запись алгоритма выбора
Обычно при написании программ не рекомендуется использовать
многократно вложенные друг в друга условные операторы, так как программа
становится громоздкой и ее трудно понимать. Считается, что число уровней
вложения не должно превышать двух - трех. Для тех случаев, когда необходимо
проверять много условий и в зависимости от них выполнять различные
действия, в языке Паскаль существует специальный оператор выбора.
Синтаксис оператора выбора:
CASE < индекс выбора > OF < элементы списка выбора > [ELSE
<оператор>] END; Индекс выбора состоит из выражения. Элементы списка
выбора включают список операторов, каждый из которых помечен одной или
несколькими константами выбора. Все константы выбора должны быть
различными, а их тип должен быть идентичен типу выражения (индекса
выбора). В качестве типа выражения, следовательно, и констант выбора, можно
использовать любой простой тип, за исключением типа REAL. Выполнение
оператора выбора начинается с вычисления значения индекса выбора. Затем
выбирается для выполнения тот оператор из списка элементов выбора, который
помечен константой выбора, имеющей вычисленное значение индекса выбора.
Если константы с таким значением нет, то управление передается оператору,
стоящему за зарезервированным словом ELSE. Конструкция ELSE <оператор>
может отсутствовать. В этом случае при отсутствии в списке выбора нужной
константы ничего не произойдет и оператор выбора просто завершит работу.
Рассмотрим фрагменты программ, содержащие оператор выбора. Пример
1.
PROGRAM EXAMPL1( input, output ); VAR I : INTEGER; X : REAL;
BEGIN
CASE I OF
1
: X := Sin( X );
2
: X := tas( X );
3
: X := Exp( X );
4: X := Ln( X ) End;
END. Пример 2.
PROGRAM EXAMPL2; VAR
I : INTEGER; X : REAL;
BEGIN
CASE I OF
1 : X := Sin( X );
2
: X := tas( X );
3
: X := Exp( X );
4
: X := Ln( X ) ELSE
WriteLn ( ' Значение индекса выбора не соответствует заданным константам
.' );
END END. Пример 3.
В элементе списка выбора можно использовать несколько констант выбора, а также
диапазоны: CASE ХСН OF 'A', 'С', 'E', 'G' : WriteLn( 'Указано несколько констант'); 'K' . . 'R' :
WriteLn( 'Указан интервал') END;
В этом операторе переменная ХСН символьного типа. В заключение
отметим, что:
-в
качестве элемента списка выбора можно использовать составной
оператор;
все константы выбора внутри одного оператора выбора обязательно
должны быть различными, так как в противном случае возникает
неоднозначность в выборе исполняемого оператора;
в разных операторах выбора разрешается использовать одинаковые
константы выбора.
Метка. Оператор перехода. Пустой оператор.
Каждый оператор в программе может быть помечен меткой произвольным идентификатором. Метка позволяет именовать некоторый
оператор программы и таким образом ссылаться на него. Метка располагается
перед оператором и отделяется от него двоеточием. Например:
10: ReadLn( ' Введи значение переменной A:', A); 124: Y := X * X + S * Z;
Метки не влияют на выполнение оператора. Они должны быть описаны в
разделе описания меток. Описание меток состоит из ключевого слова LABEL и
следующего за ним списка меток. Например:
LABEL 10, 124, 540, L1, L2; Описания меток располагаются до
совокупности всех описаний переменных. Описанной меткой должен быть
помечен только один оператор программы.
Оператор перехода прерывает естественный порядок выполнения
операторов. Он состоит из ключевого слова GOTO, за которым следует метка.
Дальнейшее выполнение программы должно продолжаться, начиная с
оператора, помеченного указанной меткой. В языке Паскаль существует
довольно строгая дисциплина использования операторов перехода.
Сформулируем эти ограничения:
1)
с помощью оператора перехода нельзя войти внутрь составного
оператора, но внутри составного оператора разрешены любые передачи
управления;
2)
с помощью оператора перехода нельзя войти внутрь тела цикла,
минуя его заголовок. Внутри тела цикла разрешены любые передачи
управления;
3)
с помощью оператора перехода нельзя войти ни в одну из ветвей
условного оператора, а также передать управление из одной ветви в другую;
4)
с помощью оператора перехода нельзя войти внутрь оператора
выбора или передать управление на другую константу выбора;
5)
с помощью оператора перехода нельзя войти в тело процедуры;
6)
с помощью оператора перехода можно выйти из любой
конструкции языка программирования за единственным исключением: если в
программе содержатся многократно вложенные друг в друга процедуры, то из
любой внутренней процедуры можно выйти с помощью оператора перехода,
ведущего к метке, которой помечен оператор
на самом внешнем уровне вложенности блоков (то есть выйти можно
только в главную программу).
Пустой оператор в программе обозначается точкой с запятой. Чаще
всего он встречается с меткой и ставится в конце составного оператора или
программы.
Контрольные вопросы и задания к занятию №2
Контрольные вопросы:
1. Что называется алгоритмом?
2. Перечислите типы алгоритмов.
3. Дайте определение линейного алгоритма.
4. Перечислите способы описания алгоритмов.
5. Что называется схемой алгоритма?
6. Какие блоки используются для описания линейных алгоритмов?
7. Опишите этапы решения задачи на ЭВМ.
8. Дайте понятие контрольного теста.
9. Дайте понятие алгоритмического языка.
10. Что называется транслятором?
11. Что такое объектный модуль?
12. Что представляет собой программа на алгоритмическом языке?
13. Дайте понятие оператора.
14. Опишите структуру программы на Паскале.
15. Поясните смысл объявления констант и переменных.
16. Опишите выполнение оператора присваивания.
17. Объясните выполнение оператора ввода.
18. Что такое бесформатный вывод данных?
19. Какие форматы вывода данных вам известны?
20.Дайте классификацию разветвляющихся алгоритмов.
21.Какие блоки используются для описания разветвляющихся алгоритмов?
22.Какой оператор используется для записи обхода?
23.Какой оператор используется для записи альтернативы?
24.Каково назначение оператора выбора и в каких случаях он используется?
25.Каково назначение оператора перехода?
В следующих операторах присваивания укажите типы переменных:
а : = 32;
х : = sin(y + 2.3); l : = (k > 3) and (d < c); m : = 'Сегодня' + t; Ь : = '1993'.
Задание к работе
Задачу необходимо решать согласно рассмотренной технологии:
а) изучить словесную постановку задачи;
б) сформулировать математическую постановку задачи;
в) выбрать метод решения задачи, если это необходимо;
г) разработать схему алгоритма;
д) записать разработанный алгоритм на языке Паскаль;
е) разработать контрольный тест программы;
ж) отладить программу;
Варианты индивидуальных заданий
1. Треугольник задан длинами сторон. Найти длины высот.
2. Треугольник задан длинами сторон. Найти радиусы вписанной и описанной
окружностей.
3. Найти корни системы двух алгебраических уравнений с двумя неизвестными
по формуле Крамера, считая, что система разрешима.
4. Хозяин хочет оклеить обоями квартиру. Определить количество
необходимых рулонов и затрат на их приобретение.
5. В некотором треугольнике основание больше высоты на заданную величину
d. Определить значение высоты и основания, если известна величина площади
треугольника.
6. Известны координаты вершин треугольника. Определить периметр и
площадь треугольника.
7. Имеется кольцо с известными радиусами внутреннего и внешнего кругов.
Определить длины окружностей обоих кругов, а также площадь кольца.
8. Дано действительной число a. Не пользуясь никакими другими
арифметическими операциями, кроме умножения, получить а8 за три операции.
9. Дано действительной число a. Не пользуясь никакими другими
арифметическими операциями, кроме умножения, получить а5 и а13 за пять
операций.
10.
Определить площадь равнобедренной трапеции, если заданы
основание b, высота h и угол при основании b, равный L.
Лабораторная работа №3 Разработка программ с использованием
одномерных, двумерных массивов.
Лабораторные работы содержат краткие теоретические сведения по
конкретной теме, контрольные вопросы, задание и методические указания к его
выполнению, а также варианты индивидуальных заданий.
Методические указания к лабораторному занятию №8
Цель работы: Ознакомиться с массивами. Получить навыки в
организации работы с одномерными и двумерными массивами.
Массив - это упорядоченная последовательность данных, обозначаемая
одним именем (идентификатором). Члены этой последовательности называются
элементами массива. Каждый элемент определяется именем массива и его
положением в массиве. Положение элемента в массиве определяется его
индексом (порядковым номером). Упорядоченность последовательности
данных заключается в том, что элементы массива располагаются в
последовательных ячейках памяти.
Массивы бывают одномерные, двумерные, трехмерные, четырехмерные и
т.д. Понятие массива соответствует таким математическим понятиям как вектор
и матрица. Одномерный массив соответствует понятию вектора; двумерные,
трехмерные и т. д. массивы соответствуют понятию матрицы. Размерность
("мерность") массива определяет количество индексов отдельного элемента.
На языке Паскаль массивы описываются в разделе переменных
следующим образом: VAR
A : array[1..k] of < тип элементов массива > ; - описание одномерного
массива (вектора) А. Переменная k задает количество элементов в массиве, при
этом значение индекса элементов лежит в интервале от 1 до k и может
принимать только целые значения. Все элементы массива имеют один и тот же
тип. При этом тип элементов массива может быть как базовым, так и сложным
(типом, обьявленным в разделе TYPE).
B : array[1..k1, 1..k2] of < тип элементов массива >; - описание
двумерного массива (двумерной матрицы). Здесь k1 задает количество строк и
диапазон изменения индекса строк, k2 - количество столбцов и диапазон
изменения индекса столбцов. С : array[1..k1, 1..k2, 1..k3] of < тип элементов
массива> ; - описание трехмерного массива (трехмерной матрицы). Здесь k1
задает количество строк и диапазон изменения индекса строк, k2 - количество
столбцов и диапазон изменения индекса столбцов, k3 - количество слоев и
диапазон изменения индекса слоев.
Подобным образом описываются массивы и более высокой размерности.
Ограничений на максимальное значение размерности не существует. Но
программист должен помнить, что обьем массива в байтах не должен
превышать 64К в оперативной памяти. Упорядочение элементов многомерных
массивов выполняется от внутреннего индекса к внешнему, так, например,
элементы двумерной матрицы упорядочены сначала по строкам, а затем по
столбцам.
Обращение к отдельным элементам массива осуществляется по имени
массива и последовательности его индексов, заключенных в квадратные скобки
и разделенных запятой. Например:
A[1], A[n], A[2*k+1] - обращение к элементам вектора. Индекс может
быть задан константой, переменной и арифметическим выражением, причем,
индекс должен быть целого типа;
B[1,5], B[i,j], B[2, trunc(sqrt(X))] - обращение к элементам двумерной
матрицы. Пример.
Задана двумерная матрица B размерностью 3х2:
b11 b12 b13 b21 b22 b23
Ее описание может быть следующим: VAR B : ARRAY [1.3,1.2] OF
INTEGER;
Так как тип элементов INTEGER и длина элемента этого типа равна
четырем байтам, а количество элементов в массиве 3 * 2 = 6, то обьем
оперативной памяти, занимаемый массивов, составляет 24 байта. Элементы
двумерного массива В расположены в памяти следующим образом: b11, b12, b13,
b21 , b22 , b23 - упорядочение выполнено по строкам, а затем по столбцам.
Обращаясь к элементу второй строки третьего столбца, достаточно
записать В[2,3]. 7.2. Организация структурных циклических процессов
итераций: F'(X) = X CosX. Очевидно,
При
организации
таких что X > 0. Следовательно, рассматриваемый
процессов в качестве параметра процесс
цикла практически всегда удобно
использовать индекс массива. При работе с векторами организуются простые
циклы. Если размерность массива превышает единицу, то в этом случае
организуются вложенные циклы. При программировании структурных циклов
удобно использовать оператор цикла с параметром - FOR.
Контрольные вопросы и задания к занятию №7
Контрольные вопросы:
1. Дайте классификацию циклических процессов с указанием их особенностей.
Укажите отличительные особенности каждого из трех операторов цикла.
Дайте определение массива.
2. Напишите формулу для вычисления обьема памяти, занимаемого массивом.
3. В оперативной памяти любой многомерный массив располагается линейно.
Выведите
4. формулу, по которой процессор определяет порядковый номер элемента
многомерного
5. массива в памяти при известных значениях индексов.
6. Чему равен шаг изменения параметра цикла в предложении For?
7. В чем отличия итерационных циклов и циклов с фиксированным числом
повторений.
8. В чем состоят преимущества использования операторов цикла?
9. Указажите основные правила организации вложенных циклов.
10.Возможен ли выход из внутреннего цикла до его полного завершения ?
11.Как организовать ввод матрицы размером N*M элементов ?
12.Как организовать вывод матрицы ?
Задание к работе
1.
Выполнить индивидуальное задание А.
2.
Выполнить индивидуальное задание Б.
3.
Методические указания
При выполнении индивидуального задания необходимо соблюдать
технологию решения задач на ЭВМ:
 изучить словесную постановку задачи, выделив при этом все виды данных;
 сформулировать математическую постановку задачи, выделив при этом все
виды данных;
 сформулировать математическую постановку задачи;
 выбрать метод решения задачи, если это необходимо;
 записать разработанный алгоритм на языке Паскаль;
 разработать контрольный тест к программе;
 отладить программу;
 представить отчет по работе к защите.
Содержание отчета
1. Титульный лист.
2.
3.
4.
5.
6.
7.
8.
Словесная постановка задачи.
Математическая постановка задачи.
Графическая схема алгоритма решения задачи.
Листинг программы.
Контрольный тест.
Результаты тестирования программы.
Ответы на контрольные вопросы.
Варианты индивидуальных заданий
Задание А.
Вариант
задания
1
Массив
2
A(80)
3
X(70)
4
B(50)
5
C(40)
6
D(80)
7
Y(20)
8
Z(30)
9
N(50)
10
X(N)
X(100)
Действия
Условия и
ограничения
Вычислить сумму и количество элементов массива 0 < x[i] <1
Х.
Вычислить среднее арифметическое значение
a[i] > 0
элемента массива А
Переписать элементы массива Х в массив Y и -1 x[i] < 1
подсчитать их количество.
Определить максимальный элемент массива В и его
x[i] > 0
порядковый номер.
Вычислить минимальный элемент массива С и его
x[i] < 0
номер.
Найти максимальный и минимальный элементы
массива D и поменять их местами.
Вычислить среднее геометрическое элемента
y[i] > 0
массива Y.
Расположить в массиве R сначала положительные, а
затем отрицательные элементы массива Z.
Определить сумму элементов массива N, кратных n[i]/3*3=n[i]
трем.
Вычислить сумму и количество элементов массива
N < 40
Х.
Задание Б.
Вариант Матрица
Действия
Условия и
задания
ограничения
1
А(10,15) Вычислить
и
запомнить
сумму и
число
a[ij]>0
положительных
элементов
каждого
столбца
матрицы. Результаты отобразить в виде двух строк.
2
А(^М)
Вычислить и запомнить суммы и числа элементов N <= 20 М <=
каждой строки матрицы. Результаты отобразить в
15
виде двух столбцов.
3
B(N,N) Вычислить сумму и число элементов матрицы,
N <12
находящихся под главной диагональю и над ней.
4
C(N,N) Вычислить сумму и число положительных элементов c[ij]>0 N <12
матрицы, находящихся над главной диагональю.
5
D(K,K)
6
D(10,10)
7
F(N,M)
8
F(10,8)
9
N(10,10)
10
P(N,N)
Записать на место отрицательных элементов
K < 10
матрицы нули и отобразить ее в общепринятом виде.
Записать на место отрицательных элементов
матрицы нули, а на место положительных - единицы.
Отобразить нижнюю треугольную матрицу в
общепринятом виде.
Найти в каждой строке матрицы максимальный и N <20 M <10
минимальный элементы и поместить их на место
первого
и
последнего
элемента
строки
соответственно. Матрицу вывести в общепринятом
виде.
Транспонировать матрицу и вывести на печать
элементы главной диагонали и диагонали,
расположенной под главной.
Для целочисленной сатрицы найти для каждой nij /5*5= nij
строки число элементов, кратных пяти, и
наибольший из полученных результатов.
Найти в каждой строке матрицы наибольший
N <15
элемент и поменять его местами с элементом
главной диагонали. Отпечатать полученную матрицу
в общепринятом виде.
Лабораторное занятие№4 Программирование задач обработки
строковых данных.
Лабораторные работы содержат краткие теоретические сведения по
конкретной теме, контрольные вопросы, задание и методические указания к его
выполнению, а также варианты индивидуальных заданий.
Методические указания к лабораторному занятию №8
Цель работы: Ознакомиться со строковыми данными. Получить
навыки в организации работы со строковыми переменными: удалением,
вставкой, копированием, заменой одной строки на другую и т.д.
Краткие сведения из теории
Объявление строковых переменных
Турбо-Паскаль предоставляет средства для работы с данными строкового
типа, которые в дальнейшем будем называть стрингами. Строковый тип данных
представляет собой цепочку символов. Длина цепочки может изменяться от 0
до 255. Для определения строкового типа используется служебное слово
STRING, за которым в квадратных скобках указывается максимальная длина
строки, например: TYPE
line = string[25];
VAR
mline : line;
В
данном
примере
переменная
mline
представляет
собой
последовательность, включающую до 25 символов, причем каждый символ
имеет стандартный тип CHAR.
Значение строковой переменной может быть назначено оператором
присваивания, либо
введено с устройства ввода, например:
aline := 'ВСТИ';
mline := aline;
readln(mline);
Изображение строки строится из цепочки символов и заключается в
апострофы. Максимальная длина строки может быть задана целым числом, или
константой целого типа. Указание максимальной длины может быть опущено; в
этом случае подразумевается число 255, например: TYPE
line = string; line1 = string[255];
Описания типов в данном примере эквивалентны. Основное отличие
строк от символьных массивов заключается в том, что строки могут
динамически изменять свою длину, например:
mline := 'строка';
mline := mline + 'стала длинной';
В приведенном примере после первого присваивания длина переменной
mline равна шести. Второе присваивание увеличивает ее длину до 19 символов.
Динамические строки организуются в Турбо-Паскале следующем
образом: память под стринги отводится по максимуму (согласно описанию), а
используется лишь та ее часть, которая реально занята символами строки. При
такой организации работы со стрингами Турбо-Паскаль должен знать реальную
длину стринга. Поэтому для строковой переменной длиной N символов
отводится (N+1) байтов памяти, из которых N байтов предназначены для
хранения символов строки, а один байт - для хранения текущей длины строки.
Символы строки нумеруются целыми числами, начиная с единицы, а байт с
текущей длиной строки считается нулевым ее элементом. Длину текущей
строки можно определить следующим образом: len := ord(st[0]);
Здесь st - переменная строкового типа.
Если стрингу присваивается значение строкового выражения с длиной,
большей чем максимально допустимая, происходит отсечение строки до
максимальной длины, например: VAR
st : string[5]; BEGIN
st := 'очень длинная строка';
writeln(st); { будет отображено только: 'очень'}
Основные операции
Для строковых типов данных определена операция "конкатенация",
обозначаемая символом '+'. Смысл операции заключается в формировании
новой строки. Динамическая длина сформированной строки равна сумме
символов строк-операндов, а ее значение равно последовательности символов
исходных строк. Например:
VAR str1, str2 : string[10]; st : string[25];
BEGIN str1 := 'Паскаль - '; str2 := 'программа'; st := str1 + str2; WriteLn(st)
END.
В результате выполнения программы будет на экране отображена
текстовая строка: 'Паскаль - программа'.
Кроме операции конкатенации над значениями строковых типов
разрешены операции сравнения < , <=, > , >=, = , <>, IN, при выполнении
которых действуют следующие правила:
а)
более короткая строка всегда меньше более длинной;
б)
если длины сравниваемых строк равны, то происходит
поэлементное сравнение символов этих строк с учетом лексикографической
упорядоченности значений
в)
компаратор IN определяет вхождение левого операнда в правый.
Если левый операнд входит в правый, то результат компарации будет
истинным (TRUE), в противном случае - ложным (FALSE). Левым операндом
может быть только элементарное данное (здесь символ), а правым - любое
множество элементов, в данном случае стринг или литерный ряд.
Доступ к элементам строковых данных
Доступ к отдельным элементам строк осуществляется аналогично
доступу к элементам одномерного массива: после имени строковой переменной
необходимо в квадратных скобках указать арифметическое выражение целого
типа, например:
VAR mline : string; i : integer; BEGIN
for i := 1 to length( mline ) do
mline[i] IN ['a'...'z'] then
mline[i] := chr( ord( mline[i] ) + 1);
Можно заметить, что работа со строковыми данными аналогична работе с
символьными массивами, однако, это не означает их полную идентичность.
Так, распространенной ошибкой является работа с элементами строки без учета
ее текущей длины. Необходимо помнить, что если длина символьного ряда
статична, то длина стринга динамична.
Контрольные вопросы и задания к занятию №8
Контрольные вопросы
1. Дайте определение строковой переменной.
2. Какие типы данных используются в качестве базовых в
строковых данных?
3. Каким образом
распределяется память под строковые
переменные?
4. Какие операции выполняются над строковыми переменными?
5. В чем состоит сходство и различие строковых переменных и
символьных массивов?
6. Возможно ли преобразование строковых переменных?
7. Назовите основные функции над строковыми переменными и их
назначение.
Каково назначение процедур DELETE,INSERT.
Как реализуется ввод и вывод строковых переменных.
Предложите схему преобразования действительных чисел в
стринги.
11. Что такое литерный ряд?
12. В чем состоит отличие стринга от литерного ряда?
Задание к работе
Выполнить индивидуальное задание.
Методические указания
1. Строка символов формируется при вводе с клавиатуры.
2. При выполнении задания необходимо использовать
стандартные функции и процедуры работы со стрингами:
СОРУ, POS, LENGTH, INSERT, DELETE и операцию
конкатенации.
3. Написать и отладить программу.
4. Написать отчет по работе.
5. Содержание отчета
1. Титульный лист.
2. Словесная постановка задачи.
3. Графический или текстуальный алгоритм решения
задачи.
4. Листинг программы.
5. Контрольный тест и результаты тестирования
программы.
6. Анализ
ошибок,
допущенных
при
программировании.
7. Ответы на контрольные вопросы по согласованию с
преподавателем.
8. Варианты индивидуальных заданий
1. Дана строка символов. Подсчитать сколько
среди символов данной строки встречается
буква x.
2. Дана строка символов. Подсчитать:
a) сколько раз в данной строке встречается
символ + и сколько раз символ *;
b) общее число вхождений символов +, -, *
в строку.
3. Дана строка символов. Преобразовать данную
строку, заменив в ней:
a) все восклицательные знаки точками;
b) каждую точку многоточием.
8.
9.
10.
Дана строка символов S. Выяснить имеются ли
в данной строке такие символы si, si+1, что si .
это запятая, а si+1 - это тире.
5. Даны две строки символов S1 и S2. Выяснить,
верно ли, что среди символов строки S1
имеются все буквы строки S2.
6. Дана строка символов. Удалить из данной
строки все группы букв вида asdf.
7. Дана строка символов. Преобразовать строку,
удалив каждый символ * и повторив каждый
символ, отличный от *.
8. Дана строка символов. Заменить в данной
строке каждую группу букв child группой букв
children.
9. Дана строка символов. Исключить из строки
группы символов, расположенные между
парами скобок (, ), {, }. Сами скобки тоже
должны быть исключены. Предполагается, что
внутри каждой пары скобок нет других скобок.
10. Дана строка символов. Словом будем называть
группы символов, разделенных пробелами
(одним
или
несколькими).
Подсчитать
количество слов в данной строке.
4.
Лабораторное занятие№5 Разработка программ с использованием
процедур и функций.
Лабораторные работы содержат краткие теоретические сведения по
конкретной теме, контрольные вопросы, задание и методические указания к его
выполнению, а также варианты индивидуальных заданий.
Методические указания к лабораторному занятию №5
Цель
работы:
Приобретение
практических
навыков
в
программировании процедур и функций. Изучение механизма передачи
параметров. Знакомство с локальными и глобальными переменными.
Краткие сведения из теории
Процедуры и функции являются мощным средством языка
программирования. Это средство удобно применять в тех случаях, когда при
решении задачи возникает необходимость в программе некоторую
совокупность операторов повторять несколько раз. Так например, может
возникнуть необходимость один и тот же цикл использовать в нескольких
местах программы.
Функцию или процедуру можно сравнить с мини-программой, именно
поэтому их называют иногда одним общим именем - "подпрограмма (ПП)".
1111 оформляется подобно программе: в начале записывается заголовок ПП,
затем следует декларативная часть ПП и после процедурная. В декларативной
части описываются все данные, область действия которых ограничена телом
данной ПП. Эти данные называются локальными. Данные, объявленные в
основной (главной) программе, называются глобальными и они могут
использоваться в любой ПП, входящей в основную программу. В процедурной
части описывается тело ПП, реализующее алгоритм решения, и которое
заключается в операторные скобки BEGIN, END.
ПП помещается сразу же после объявления всех переменных. Заголовок
ПП для подпрограмм-функций начинается с ключевого слова FUNCTION, для
подпрограмм- процедур с ключевого слова PROCEDURE. Эти ключевые слова
играют роль признаков, которые распознает компилятор. Так как ПП
исполняется не сразу и возможно не один раз, то компилятор, встретив тело
ПП, должен его пропустить.
Функции
Общая схема функции следующая:
FUNCTION < идентификатор функции >(<параметр: тип параметра>
[,<параметр: тип параметра>, ...]) : <тип результата функции>;
< декларативная часть (разделы LABEL, CONST, TYPE, VAR ) объявление локальных данных > BEGIN
< процедурная часть функции - тело функции >
END;
В теле основной программы функция вызывается по имени, это значит,
что после FUNCTION необходимо записать идентификатор функции, а затем в
круглых скобках перечислить все параметры функции. Так как язык Паскаль
сильно типизирован, то он требует, чтобы после каждого параметра был указан
его тип. Результатом вычисления функции всегда получается одно значение.
Поэтому после круглых скобок в заголовке функции необходимо указать тип
результата, вычисляемого функцией.
Ко всем функциям обращаются одинаково: в любом предложении
программы они играют роль переменной.
Самым простым и наглядным примером использования функций
являются стандартные функции, например, функция LENGTH(St). Эта функция
может применяться в программе всякий раз, когда необходимо вычислить
длину стринга, в данном случае стринга St. Все стандартные функции входят в
состав компилятора, то есть они описаны в теле самого компилятора. LENGTH
- это идентификатор функции, St - аргумент функции. Заголовок этой функции
может быть следующий:
FUNCTION Lenght(St : string) : byte; Тип результата, возвращаемого этой
функцией, BYTE.
Процедуры
Подпрограмму следует оформить в виде процедуры, если она
предназначена для решения задачи одного из двух типов. Задача первого типа:
требуется выполнить некую последовательность действий, не возвращая
результирующего значения. Задача второго типа: требуется изменить значения
одного или нескольких фактических параметров. Процедура, как и функция,
помещается в конце декларативной части программы. Компилятор распознает
процедуру по ключевому слову PROCEDURE. С этого слова начинается
заголовок процедуры, после которого следует идентификатор процедуры, а
затем в круглых скобках перечисляются формальные параметры процедуры. В
Паскале передать параметры подпрограмме можно двумя способами. До сих
пор мы имели дело только с одним из них. Этот способ называют передачей
параметров по значению. Он состоит в том, что значение фактического
параметра назначается соответствующему формальному параметру. Другими
словами, перед началом выполнения процедуры вычисляется конкретное
значение фактического параметра (например, 1.5 или 3). Затем полученное
значение
копируется
в
соответствующий
формальный
параметр,
принадлежащий процедуре. Как только начинается выполнение процедуры,
никакие изменения значения формального параметра уже не оказывают
влияния на значение соответствующего фактического параметра. Это значит,
что по окончании работы процедуры фактический параметр будет иметь точно
такое же значение, каким он обладал до начала работы процедуры, вне
зависимости от того, что происходило с формальным параметром. Такой
способ передачи параметров действует при работе с функциями.
Второй способ передачи параметров называется передачей параметров по
ссылке или по адресу. При передаче параметра по ссылке в процедуру
пересылается уже не значение аргумента, а его местоположение (адрес) в
памяти компьютера. Чтобы сообщить компилятору о намерении передать такой
параметр, в заголовке процедуры в списке формальных параметров следует
указать слово VAR. Если формальный параметр снабжен атрибутом VAR, а
соответствующий ему фактический параметр является переменной, то любые
изменения формального параметра будут отражаться в значениях фактического
параметра, поскольку теперь формальный и фактический параметры занимают
одну и ту же область памяти.
Контрольные вопросы
1. Для чего предназначены функции?
2. Для чего предназначены процедуры?
3. Чем отличаются формальные и фактические параметры?
4. Опишите способы передачи параметров в подпрограммы и их особенности?
4. Что включает в себя заголовок подпрограммы?
5. Чем отличаются глобальные и локальные переменные?
6. Какая разница между процедурой и функцией?
Задание к работе
1. Модифицируйте подпрограмму, вычисляющую степенную функцию так,
чтобы она вычисляла и отрицательные степени.
2. Напишите
подпрограмму, способную вычислять любые степени:
положительные и отрицательные, целочисленные и действительные.
3. Выполните индивидуальное задание:
Дано несколько массивов чисел. Длины массивов заданы в варианте
индивидуального задания. Требуется в каждом массиве найти наибольший и
наименьший элементы и отобразить их на экране, затем все компоненты
каждого массива возвести в квадрат и снова найти наибольший и наименьший
элементы. Вычисление максимальной и минимальной величин оформить в виде
процедуры, глобальные параметры в процедуре не использовать.
Методические указания
1. При
выполнении пункта 2 задания необходимо использовать
экспоненциальную и логарифмическую функции.
2. При выполнении пункта 3 задания необходимо знать, что:
a)
если в качестве исходной информации в процедуру передается массив, то
его следует передавать по ссылке для экономии памяти, так как в этом случае
при вызове процедуры не образуется локальный массив;
b)
несмотря на то, что обрабатываемые массивы разной длины, они
описываются в программе как массивы одного и того же типа, так как при
обращении к процедуре типы соответствующих формальных и фактических
параметров должны совпадать.
3. Составить алгоритм решения задачи.
4. Написать программу и откомпилировать ее.
5. Составить контрольный тест и отладить (протестировать) программу.
6. Составить отчет и представить его к защите.
Содержание отчета
1. Титульный лист.
2. Словесная постановка задачи.
3. Графический или текстуальный алгоритм решения задачи.
4. Листинг программы.
5. Контрольный тест и результаты тестирования программы.
6. Ответы на контрольные вопросы.
Варианты индивидуальных заданий
Ввести и обработать:
1) два двумерных массива, содержащие соответственно 3х5 и 4х8 вещественных
элементов;
2) три массива, содержащие соответственно 3, 6 и 8 целых элементов без знака;
3) четыре массива, содержащие соответственно 4, 6, 3 и 5 целых элементов со
знаком;
4) два массива, содержащие соответственно 4 и 6 вещественных элементов;
5) три массива, содержащие соответственно 5, 10 и 4 целых элементов без
знака;
6) четыре массива, содержащие соответственно 3, 5, 8 и 6 вещественных
элементов;
7) два трехмерных массива, содержащие соответственно 2х3х2 и 3х4х2
вещественных элементов;
8) четыре массива, содержащие соответственно 4, 7, 3 и 5 вещественных
элементов;
9) три двумерных массива, содержащие соответственно 2х5, 3х6 и 3х4 целых
элементов без знака;
два двумерных массива, содержащие соответственно 6х2 и 3х2
вещественных элементов.
Лабораторное занятие№14 Введение в машинную графику
Лабораторные работы содержат краткие теоретические сведения по конкретной
теме, контрольные вопросы, задание и методические указания к его
выполнению, а также варианты индивидуальных заданий.
Методические указания к лабораторному занятию №14
Цель работы: Овладение начальными навыками работы с
графическим режимом экрана, используя модуль GRAPH.
Краткие сведения из теории
Стандартный модуль GRAPH содержит библиотеку из более чем 50
графических программ. В нем поддерживается несколько видов закрашивания,
типов линий и шрифтов, размер которых можно изменять.
Для переключения экрана в графический режим необходимо выполнить
процедуру:
InitGraph (var Graphdriver : integer; var GraphMode : integer; PathToDriver :
string); По этой процедуре выполняются:
поиск в каталоге PathToDriver файла драйвера графической карты с
номером GraphDriver;
загрузка драйвера в оперативную память;
установка указанного графического режима GraphMode.
Если имя каталога не указано (параметр PathToDriver представляет собой
пустую строку ''), то файл ищется в текущем каталоге.
Если GraphDriver = 0, то происходит автоматическое определение
графической среды, а переменным GraphDriver и GraphMode присваиваются
величины, определяющие номер драйвера и номер режима графического
экрана.
Номера карт (графических драйверов) и режимов могут быть выражены с
помощью следующих обозначений:
Detect=0 ^тематическое распознавание графической карты; CGA=1 карта CGA; MCGA=2 - карта MCGA; EGA=3 - карта EGA; EGA64=4 - карта
EGA64; EGAMono=5 - карта EGAMono; Reserved=6 - зарезервировано (не
используется); HercMono=7 - карта Hercules; ATT400=8 - карта ATT400;
VGA=9 - карта VGA; PC3270=10 - карта PC3270, а также используются
некоторые символы режима:
EGALo=0 - 620х200 пикселей, 16 цветов, 4 страницы; EGAHi=1 - 640x350
пикселей, 16 цветов, 2 страницы. Пиксель - это единичный элемент экрана.
Количеством пикселей по горизонтали и вертикали определяется размер
графического экрана. Синонимом пикселя является понятие "точка".
Для перехода из графического режима в текстовый используется
процедура CloseGraph без параметров, которая устанавливает текстовый режим
и очищает память, автоматически выделенную программе. Это выполняется
подсистемой управления графикой. Для того, чтобы с помощью операторов,
10)
строящих изображение, можно было обращаться к заданным точкам экрана,
необходимо иметь возможность однозначно их идентифицировать. Положение
точки (пикселя) задается с помощью двух координат X, Y, где X - номер
столбца, Y - номер строки. По соглашению верхний левый угол экрана имеет
координаты (0,0). Координата X увеличивается при перемещении вправо, а
координата Y - при перемещении вниз. Таким образом, координаты каждого из
четырех углов и конкретной точки, например, середины экрана, могут
выглядеть следующим образом:
Здесь рассмотрен графический режим с матрицей экрана 640х350
пикселей. В некоторых других режимах эта матрица может быть иной,
например, 320х200 или 640х200 и так далее. Определение координат правого
нижнего угла экрана выполняется по функциям: GetMaxX, GetMaxY.
Синтаксис:
GetMaxX : integer; GetMaxY : integer.
Графические объекты могут быть черно-белыми или цветными. Чернобелые рисунки выполняются обычно в системах с графическими картами, не
учитывающими цвет, например, с картой Hercules. Если возможен вывод в
цвете (например, карта EGA или CGA), то при установке графического режима
можно определить его параметры и тем самым доступную цветовую гамму.
Цвета гаммы (она отсутствует для карты Hercules) пронумерованы от 0 до
GetMaxColor. Цвета могут быть фиксированными (для карты CGA), либо
произвольно изменяемыми (для карты EGA и VGA). Если цвета могут
изменяться, то присвоение выбранного цвета позиции цветовой гаммы
производится с помощью процедуры SetPalette. SetPalette (ColorNum, Color :
word); Идентификатор цвета Color присваивается позиции ColorNum цветовой
гаммы. Изменение цвета на экране будет обнаружено после выполнения
процедуры SetPalette. Идентификаторы цветов могут быть выражены
следующим образом:
DarkGray=8
LightBlue=9
LightGreen=10
LightCyan=11
LightRed=12
LightMagenta=13
Yellow=14
White=15
(светло-серый);
Выбор номера цвета для изображения объектов обеспечивает процедура
SetColor. Синтаксис:
SetColor(N : word);
При выполнении этой процедуры объекты будут рисоваться цветом,
связанным аппаратно или программно с позицией N цветовой гаммы.
Программное присвоение этой позиции другого цвета немедленно изменяет
цвет рассматриваемых объектов.
Процедура SetBkColor изменяет цвет фона на такой цвет, который
соответствует позиции N текущей цветовой гаммы.
Синтаксис:
SetBkColor(N : word).
Контрольные вопросы
1. Какой модуль обеспечивает графику на ЭВМ?
2. Как инициализировать графический режим, если неизвестно, какой
графический драйвер используется на данной машине?
3. Всегда ли необходимо явно задавать все параметры процедуры InitGraph?
4. Что такое пиксел и каковы его характеристики?
5. С помощью каких функций можно узнать размеры экрана и количество
цветов в цветовой гамме (палитре) данного графического режима?
6. Могут ли на экране высвечиваться одновременно отрезки прямых линий
разных цветов?
7. Где будет графический курсор после выполнения одной из процедур
PutPixel, Line, LineRel, LineTo и как это проверить практически?
8. Всегда ли высвечиваются рисуемые точки после определения
графического окна?
9. Какими процедурами можно нарисовать окружность?
10. Как отсчитываются углы в тех процедурах, где они используются в
качестве параметров?
11. Почему в процедурах Rectangle и Bar указываются координаты лишь двух
вершин прямоугольника?
12. Какие из рассмотренных процедур рисуют линии, а какие - области?
13. Влияет ли процедура SetLineStyle на результаты работы процедур,
которые рисуют области?
14. Влияет ли процедура SetFillStyle на результаты работы процедур,
рисующих линии?
15. К каким результатам приводит обращение к процедуре FloodFill, когда
первые два ее параметра задают точку, лежащую вне области, охватываемой
линией?
16. Что произойдет, если в процедуре FloodFill линия , охватывающая
заданную точку, окажется не замкнутой?
17. Можно ли результаты процедур Ва^ PieSlice получать с использованием
других процедур?
Задание к работе
Построить круговую диаграмму, отображающую процентное соотношение
отличников, хорошистов и прочих. Для заливки секторов использовать
различные шаблоны и цвета. Построить столбиковую диаграмму,
отображающую рост цен на бензин. Построить график функции, заданной в
индивидуальном задании.
Методические указания
1. Разработать алгоритмы и программы для решения задач заданий.
2. Скомпилировать программы.
3. Составить контрольные тесты и протестировать программы.
4. Составить отчет и представить его к защите.
Для выполнения первого задания необходимо придерживаться следующей
схемы:
а)
подсчитать общее количество элементов, входящих в систему,
например:
К = КО + КХ + КП, где К - количество элементов в системе
(количество всех студентов); КО - количество отличников; КХ - количество
хорошистов; КП - количество прочих;
б)
вычислить процентное отношение группы элементов в системе,
например,
процентное отношение отличников в системе равно:
KO*100%
%O _ -----------------K
в)
вычислить, сколько радиан составляет та или иная группа элементов,
если вся
система составляет 2 п радиан, например:
2* п * %O
Кол.рад.отл.= ---------------100%
г)
используя графические процедуры и функции вывести на экране
круговую диаграмму.
Для выполнения второго задания необходимо:
а)
определить максимальное значение элементов, входящих в систему, в
нашем примере - максимальную стоимость (Max) бензина за рассматриваемый
период времени;
б)
рассчитать высоту HMax в пикселах самого высокого столбика Max,
используя функцию GetMaxY;
в)
вычислить количество пикселей KPixH, приходящихся на единицу
стоимости;
г)
вычислить высоту в пикселях каждого элемента системы;
д)
рассчитать ширину одного столбика, учитывая при этом
межстолбиковое расстояние и используя функцию GetMaxX;
е)
используя графические процедуры и функции вывести столбиковую
диаграмму на экран.
Для выполнения третьего задания используйте пример программы,
приведенный ниже. Пример. Построение графика функции Y = Sqr(X).
При отображении графика функции на экране необходимо выполнить переход
от
локальной системы координат в систему координат экрана, а также во
избежание помех
рассчитать граничные значения X, при которых значения Y начинают выходить
за пределы
экрана.
Программа:
Program GraficFunction;
Uses Graph;
Var
grDriver : Integer; grMode : Integer; ErrCode : Integer; X, Y, X1, Y1, CX, CY, XG:
Integer;
Begin
{*** инициализация графического режима экрана ***} grDriver := Detect;
InitGraph(grDriver, grMode,''); ErrCode := GraphResult;
If ErrCode=grOk then {инициализация графического экрана прошла
успешно}
begin {*** Построение осей координат ***}
CX := Round(GetMaxX / 2); {для настройки на координаты любого}
CY := Round(GetMaxY / 2); {экрана используем функции GetMaxX и GetMaxY}
{(СХ, СУ) - центр сист. коорд-т} Line(0, CY, GetMaxX,
CY); {вычерчивание оси ординат} Line(CX, 0, CX, GetMaxY); { - " - абцисс}
{*** Построение графика функции Y = Sqr(X)***}
XG:=Round(Sqrt(20*(GetMaxY-CY)));{определение ширины параболы} for X:=
-XG to XG do begin
X1 := X + CX; {определение текущей координаты Х экрана} Y := Sqr(X);
{определение ординаты функции} Y1 := GetMaxY - Round(( Y / 20 + CY));
{преобразование текущей ординаты функции в текущую координату Y экрана}
Circle(X1, Y1, 2) { точка, инцидентная параболе, вычерчивается в виде
окружности радиусом в два пикселя}
end;
{*** Вывод на экран пояснительного сообщения ***} SetTextStyle(0, 0, 2);
0utTextXY(180, 350, '^афик функции Y = Sqr(X)');
ReadLn;
CloseGraph;
end
else { возникла ошибка при инициации графического экрана}
WriteLn('Graphics error:',GraphErrorMsg(ErrCode)); {вывод диагностического
сообщения}
End.
Варианты заданий
1. Y = A • lg(X);
2. Y = A • sin(X);
3. Y = A • exp(X)
4. Y = AX2 + B X + C;
5. Y = A • tg(X);
6. Y = A • arctg(X);
7. Y = A • Xn + C, n=1;
8. Y = A • Xn + C, n=2;
9. Y = A • Xn + C, n=3;
10. Y = A • Xn + C, n=4,
где A, B, C - произвольные параметры.
Лабораторное занятие№6 Разработка программ с использованием
графических построений.
Лабораторные работы содержат краткие теоретические сведения по конкретной
теме, контрольные вопросы, задание и методические указания к его
выполнению, а также варианты индивидуальных заданий.
Методические указания к лабораторному занятию №6
Цель работы: Овладение начальными навыками работы с
графическим режимом экрана, используя модуль GRAPH.
Краткие сведения из теории
Стандартный модуль GRAPH содержит библиотеку из более чем 50
графических программ. В нем поддерживается несколько видов закрашивания,
типов линий и шрифтов, размер которых можно изменять.
Для переключения экрана в графический режим необходимо выполнить
процедуру:
InitGraph (var Graphdriver : integer; var GraphMode : integer; PathToDriver :
string); По этой процедуре выполняются:
поиск в каталоге PathToDriver файла драйвера графической карты с
номером GraphDriver;
загрузка драйвера в оперативную память;
установка указанного графического режима GraphMode.
Если имя каталога не указано (параметр PathToDriver представляет собой
пустую строку ''), то файл ищется в текущем каталоге.
Если GraphDriver = 0, то происходит автоматическое определение
графической среды, а переменным GraphDriver и GraphMode присваиваются
величины, определяющие номер драйвера и номер режима графического
экрана.
Номера карт (графических драйверов) и режимов могут быть выражены с
помощью следующих обозначений:
Detect=0 ^тематическое распознавание графической карты; CGA=1 карта CGA; MCGA=2 - карта MCGA; EGA=3 - карта EGA; EGA64=4 - карта
EGA64; EGAMono=5 - карта EGAMono; Reserved=6 - зарезервировано (не
используется); HercMono=7 - карта Hercules; ATT400=8 - карта ATT400;
VGA=9 - карта VGA; PC3270=10 - карта PC3270, а также используются
некоторые символы режима:
EGALo=0 - 620х200 пикселей, 16 цветов, 4 страницы; EGAHi=1 - 640x350
пикселей, 16 цветов, 2 страницы. Пиксель - это единичный элемент экрана.
Количеством пикселей по горизонтали и вертикали определяется размер
графического экрана. Синонимом пикселя является понятие "точка".
Для перехода из графического режима в текстовый используется
процедура CloseGraph без параметров, которая устанавливает текстовый режим
и очищает память, автоматически выделенную программе. Это выполняется
подсистемой управления графикой. Для того, чтобы с помощью операторов,
строящих изображение, можно было обращаться к заданным точкам экрана,
необходимо иметь возможность однозначно их идентифицировать. Положение
точки (пикселя) задается с помощью двух координат X, Y, где X - номер
столбца, Y - номер строки. По соглашению верхний левый угол экрана имеет
координаты (0,0). Координата X увеличивается при перемещении вправо, а
координата Y - при перемещении вниз. Таким образом, координаты каждого из
четырех углов и конкретной точки, например, середины экрана, могут
выглядеть следующим образом:
Здесь рассмотрен графический режим с матрицей экрана 640х350
пикселей. В некоторых других режимах эта матрица может быть иной,
например, 320х200 или 640х200 и так далее. Определение координат правого
нижнего угла экрана выполняется по функциям: GetMaxX, GetMaxY.
Синтаксис:
GetMaxX : integer; GetMaxY : integer.
Графические объекты могут быть черно-белыми или цветными. Чернобелые рисунки выполняются обычно в системах с графическими картами, не
учитывающими цвет, например, с картой Hercules. Если возможен вывод в
цвете (например, карта EGA или CGA), то при установке графического режима
можно определить его параметры и тем самым доступную цветовую гамму.
Цвета гаммы (она отсутствует для карты Hercules) пронумерованы от 0 до
GetMaxColor. Цвета могут быть фиксированными (для карты CGA), либо
произвольно изменяемыми (для карты EGA и VGA). Если цвета могут
изменяться, то присвоение выбранного цвета позиции цветовой гаммы
производится с помощью процедуры SetPalette. SetPalette (ColorNum, Color :
word); Идентификатор цвета Color присваивается позиции ColorNum цветовой
гаммы. Изменение цвета на экране будет обнаружено после выполнения
процедуры SetPalette. Идентификаторы цветов могут быть выражены
следующим образом:
DarkGray=8
LightBlue=9
LightGreen=10
LightCyan=11
LightRed=12
LightMagenta=13
Yellow=14
White=15
(светло-серый);
Выбор номера цвета для изображения объектов обеспечивает процедура
SetColor. Синтаксис:
SetColor(N : word);
При выполнении этой процедуры объекты будут рисоваться цветом,
связанным аппаратно или программно с позицией N цветовой гаммы.
Программное присвоение этой позиции другого цвета немедленно изменяет
цвет рассматриваемых объектов.
Процедура SetBkColor изменяет цвет фона на такой цвет, который
соответствует позиции N текущей цветовой гаммы.
Синтаксис:
SetBkColor(N : word).
Контрольные вопросы
18. Какой модуль обеспечивает графику на ЭВМ?
19. Как инициализировать графический режим, если неизвестно, какой
графический драйвер используется на данной машине?
20. Всегда ли необходимо явно задавать все параметры процедуры InitGraph?
21. Что такое пиксел и каковы его характеристики?
22. С помощью каких функций можно узнать размеры экрана и количество
цветов в цветовой гамме (палитре) данного графического режима?
23. Могут ли на экране высвечиваться одновременно отрезки прямых линий
разных цветов?
24. Где будет графический курсор после выполнения одной из процедур
PutPixel, Line, LineRel, LineTo и как это проверить практически?
25. Всегда ли высвечиваются рисуемые точки после определения
графического окна?
26. Какими процедурами можно нарисовать окружность?
27. Как
отсчитываются углы в тех процедурах, где они используются в
качестве параметров?
28. Почему в процедурах Rectangle и Bar указываются координаты лишь двух
вершин прямоугольника?
29. Какие из рассмотренных процедур рисуют линии, а какие - области?
30. Влияет ли процедура SetLineStyle на результаты работы процедур,
которые рисуют области?
31. Влияет ли процедура SetFillStyle на результаты работы процедур,
рисующих линии?
32. К каким результатам приводит обращение к процедуре FloodFill, когда
первые два ее параметра задают точку, лежащую вне области, охватываемой
линией?
33. Что произойдет, если в процедуре FloodFill линия , охватывающая
заданную точку, окажется не замкнутой?
34. Можно ли результаты процедур Ва^ PieSlice получать с использованием
других процедур?
Задание к работе
Построить круговую диаграмму, отображающую процентное соотношение
отличников, хорошистов и прочих. Для заливки секторов использовать
различные шаблоны и цвета. Построить столбиковую диаграмму,
отображающую рост цен на бензин. Построить график функции, заданной в
индивидуальном задании.
Методические указания
1. Разработать алгоритмы и программы для решения задач заданий.
2. Скомпилировать программы.
3. Составить контрольные тесты и протестировать программы.
4. Составить отчет и представить его к защите.
Для выполнения первого задания необходимо придерживаться следующей
схемы:
а)
подсчитать общее количество элементов, входящих в систему,
например:
К = КО + КХ + КП, где К - количество элементов в системе
(количество всех студентов); КО - количество отличников; КХ - количество
хорошистов; КП - количество прочих;
б)
вычислить процентное отношение группы элементов в системе,
например,
процентное отношение отличников в системе равно:
KO*100%
%O _ -----------------K
в)
вычислить, сколько радиан составляет та или иная группа элементов,
если вся
система составляет 2 п радиан, например:
2* п * %O
Кол.рад.отл.= ---------------100%
г)
используя графические процедуры и функции вывести на экране
круговую диаграмму.
Для выполнения второго задания необходимо:
а)
определить максимальное значение элементов, входящих в систему, в
нашем примере - максимальную стоимость (Max) бензина за рассматриваемый
период времени;
б)
рассчитать высоту HMax в пикселах самого высокого столбика Max,
используя функцию GetMaxY;
в)
вычислить количество пикселей KPixH, приходящихся на единицу
стоимости;
г)
вычислить высоту в пикселях каждого элемента системы;
д)
рассчитать ширину одного столбика, учитывая при этом
межстолбиковое расстояние и используя функцию GetMaxX;
е)
используя графические процедуры и функции вывести столбиковую
диаграмму на экран.
Для выполнения третьего задания используйте пример программы,
приведенный ниже. Пример. Построение графика функции Y = Sqr(X).
При отображении графика функции на экране необходимо выполнить переход
от
локальной системы координат в систему координат экрана, а также во
избежание помех
рассчитать граничные значения X, при которых значения Y начинают выходить
за пределы
экрана.
Программа:
Program GraficFunction;
Uses Graph;
Var
grDriver : Integer; grMode : Integer; ErrCode : Integer; X, Y, X1, Y1, CX, CY, XG:
Integer;
Begin
{*** инициализация графического режима экрана ***} grDriver := Detect;
InitGraph(grDriver, grMode,''); ErrCode := GraphResult;
If ErrCode=grOk then {инициализация графического экрана прошла
успешно}
begin {*** Построение осей координат ***}
CX := Round(GetMaxX / 2); {для настройки на координаты любого}
CY := Round(GetMaxY / 2); {экрана используем функции GetMaxX и GetMaxY}
{(СХ, СУ) - центр сист. коорд-т} Line(0, CY, GetMaxX,
CY); {вычерчивание оси ординат} Line(CX, 0, CX, GetMaxY); { - " - абцисс}
{*** Построение графика функции Y = Sqr(X)***}
XG:=Round(Sqrt(20*(GetMaxY-CY)));{определение ширины параболы} for X:=
-XG to XG do begin
X1 := X + CX; {определение текущей координаты Х экрана} Y := Sqr(X);
{определение ординаты функции} Y1 := GetMaxY - Round(( Y / 20 + CY));
{преобразование текущей ординаты функции в текущую координату Y экрана}
Circle(X1, Y1, 2) { точка, инцидентная параболе, вычерчивается в виде
окружности радиусом в два пикселя}
end;
{*** Вывод на экран пояснительного сообщения ***} SetTextStyle(0, 0, 2);
0utTextXY(180, 350, '^афик функции Y = Sqr(X)');
ReadLn;
CloseGraph;
end
else { возникла ошибка при инициации графического экрана}
WriteLn('Graphics error:',GraphErrorMsg(ErrCode)); {вывод диагностического
сообщения}
End.
Варианты заданий
1. Y = A • lg(X);
2. Y = A • sin(X);
3. Y = A • exp(X)
4. Y = AX2 + B X + C;
5. Y = A • tg(X);
6. Y = A • arctg(X);
7. Y = A • Xn + C, n=1;
8. Y = A • Xn + C, n=2;
9. Y = A • Xn + C, n=3;
10. Y = A • Xn + C, n=4,
где A, B, C - произвольные параметры.
Лабораторное занятие№7 Программирование задач обработки структур
данных, расположенных на внешних носителях.
Лабораторные работы содержат краткие теоретические сведения по
конкретной теме, контрольные вопросы, задание и методические указания к его
выполнению, а также варианты индивидуальных заданий.
Методические указания к лабораторному занятию №12
Цель работы: Изучение файловых типов в языке Турбо-Паскаль.
Получение навыков в организации файлов и использовании их для
обработки информации.
Краткие сведения из теории
До сих пор данные вводились в программу через клавиатуру, т. е. с
непременным участием человека. Такой способ ввода информации называется
интерактивным режимом ввода. Возможен и иной подход, основывающийся на
использовании набора данных, подготовленных заранее и хранящихся в виде
файла на магнитном носителе. Иначе говоря, альтернативой интерактивному
режиму является такой способ ввода, при котором информация поступает из
источника, физически существующего вне программы. Этот процесс обычно
называют считыванием данных из внешнего файла (или просто из файла).
Указанный способ находит широкое применение при обработке
информационных массивов весьма значительного объема, когда интерактивный
режим становится слишком обременительным и малоэффективным. Вторым
мотивом использования файлов является то, что он может быть создан какой-то
другой программой. Таким образом, файл становится связующим звеном между
разными задачами. Наконец, последнее немаловажное соображение: если
входные данные поступают в программу из внешнего файла, то присутствие
пользователя в момент фактического исполнения программы становится
необязательным.
Файл - это именованная область внешней памяти компьютера (жесткого
диска, гибкой дискеты,...), содержащая логически связанную совокупность
данных.
На языке Паскаль можно создавать три типа файлов : текстовый,
типизированный, нетипизированный, которые в программе (в разделе VAR)
объявляются следующим образом:
< файловая переменная > : text;
< файловая переменная > : file of < тип компоненты >;
< файловая переменная > : file.
< файловая переменная > - это логическое имя файла, используемое в
программе.
< тип компоненты > - компонентой файла может быть как переменная
базового типа, так и структурного. Структурный тип определяет данные типа
"запись" (record).
"Запись" - это логически связанная совокупность нескольких данных. К
данным типа RECORD можно обращаться как ко всей совокупности данных,
так и к ее отдельным данным (элементам). Для обращения к отдельным
элементам "записи" используется уточненное имя.
Уточненное имя состоит из идентификатора "записи", десятичной точки и
идентификатора элемента записи. В свою очередь каждый элемент "записи"
может быть "записью". Тогда, для обращения к внутреннему элементу
необходимо последовательно перечислить через десятичную точку все
идентификаторы иерархически вложенных "записей", начиная от внешнего
имени к внутреннему, последним в этой последовательности является
идентификатор самого элемента.
При использовании структурного типа компоненты "запись" необходимо
объявлять его в
программе в разделе TYPE.
Пример:
ТYPE
{ запись данных по студенту } RecFile = RECORD { признак начала
записи } Fam, Name, Otch : string[15];
GodR
: word;
Ngrup
: string[10];
END; { конец записи } VAR
F1 : Text; F2 : File of byte; F3 : File of RecFile; F4 : File;
Buf : RecFile; {_2буфер ввода-вывода_0, в который считываются данные
компоненты файла}
В этом фрагменте программы F1- файловая переменная текстового типа,
F2 и F3 - файловые переменные типизированного типа, причем F2 может
содержать только байтовые компоненты, а в файле F3 каждая компонента
представляет из себя "запись" из трех элементов, F4- файловая переменная
нетипизированного типа.
Уточненные имена элементов записи Buf: Buf.Fam, Buf .Name, Buf.Otch,
Buf. GodR,
Buf.NGrup.
Доступ к файлам
В первую очередь при работе с файлами необходимо привести в
соответствие файловую переменную и имя файла, с которым он хранится на
внешнем носителе. С этим именем работает операционная система(ОС) DOS.
Соответствие устанавливается с помощью процедуры:
ASSIGN (< ф.п.>, < имя файла или л.у .>);
Здесь < ф.п.> - файловая переменная; < имя файла или л.у.> - это полное
имя файла, которое включает в себя путь доступа, непосредственно имя файла
и расширение. "л.у." - стандартное логическое устройство.
Контрольные вопросы:
1. Укажите режимы ввода информации.
2. В каких случаях удобно использовать файлы?
3. Дайте определение файла и укажите его характеристики.
4. Что такое путь доступа к файлу?
5. Где хранятся файлы ?
6. Выведите формулу подсчета объема файла в байтах.
7. Каким образом описываются переменные файловых типов ?
8. Как подразделяются файлы по видам доступа к его компонентам ? Как
осуществляется доступ к компонентам файлов ?
9. Какие операции определены над файлами ?
Задание к работе:
Задание А. Разработать программу в соответствии с вариантом задания,
которая должна выполнять следующие функции: создание файла; чтение
данных из файла;
вывод считанных данных на экран дисплея.
Задание Б. В программу, разработанную по заданию А, добавить блок
обработки данных, инцидентных файлу, в соответствии с индивидуальным
заданием. Все полученные результаты отобразить на экране.
Методические указания
1. При разработке процедуры создания файла необходимо придерживаться
следующей схемы действий:
a) проверить с помощью процедуры DISKSIZE, есть ли место на диске;
b) проверить, нет ли файла с таким же DOS - им именем на диске (процедура
FINDFIRST, FINDNEXT);
c) привести в соответствие DOS - ое имя файла с файловой переменной,
используемой в программе (процедура ASSIGN);
d) открыть файл (процедура REWRITE);
e) ввести данные, предназначенные для записи в файл;
f) записать данные в файл (предложения WRITE / WRITELN);
g) закрыть файл (процедура CLOSE).
2. При создании процедуры чтения необходимо:
a) проверить, существует ли такой файл на диске (процедура FINDFIRST,
FINDNEXT);
b) если файл не существует, то необходимо уточнить имя в интерактивном
режиме и снова перейти к пункту а);
c) если файл существует, привести в соответствие DOS - ое имя файла с
файловой переменной, используемой в программе (процедура ASSIGN);
d) открыть файл (процедура RESET);
e) считать данные из файла (предложения READ / READLN);
f) отобразить считанные данные на экране дисплея;
g) закрыть файл (процедура CLOSE).
3. В начале каждой процедуры необходимо:
a) отключить стандартную проверку выполнения операций ввода-вывода,
используя директиву компилятора {$I-};
b) после выполнения каждой операции ввода-вывода самостоятельно
проверять код ее завершения с помощью функции IORESULT;
c) при неуспешном завершении операции ввода-вывода устранить причину ,
приведшую к этой ситуации.
Варианты индивидуальных заданий
Вариант 1
А. Создать файл, содержащий сведения о месячной заработной плате рабочих
завода. Каждая запись содержит поля - фамилия рабочего, наименование цеха,
размер заработной платы за месяц. Количество записей - произвольное.
Б. Вычислить общую сумму выплат за месяц по цеху Х, а также
среднемесячный заработок рабочего этого цеха. Вывести ведомость для
начисления заработной платы рабочим этого цеха.
Вариант 2
А. Создать файл, содержащий сведения о количестве изделий, собранных
сборщиками цеха за неделю. Каждая запись содержит поля - фамилия
сборщика, количество изделий, собранных им ежедневно в течение
шестидневной недели (в понедельник, вторник и т.д.). Количество записей произвольное.
Б. По каждому сборщику просуммировать количество деталей, собранное им за
неделю. Определить сборщика, собравшего наибольшее число изделий, и день,
когда он достиг наивысшей производительности труда.
Вариант 3
А. Создать файл, содержащий сведения о количестве изделий категорий А, В,
С, собранных рабочим за месяц. Структура записи имеет поля - фамилия
сборщика, наименование цеха, количество изделий по категориям, собранных
рабочим за месяц. Количество записей - произвольное.
Б. Считая заданными значения расценок Sа, Sb, Sc за выполненную работу по
сборке единицы изделия категорий A, B, C соответственно, подсчитать:
- общее количество изделий категорий А, В, С, собранных рабочим цеха Х;
- ведомость заработной платы рабочих цеха Х;
- средний размер заработной платы работников этого цеха.
Вариант 4
А. Создать файл, содержащий сведения о телефонах абонентов. Каждая запись
имеет поля - фамилия абонента, год установки телефона, номер телефона.
Количество записей - произвольное.
Б. По вводимой фамилии абонента выдать номер телефона. Определить
количество установленных телефонов с ХХХХ года. Номер года вводится с
терминала.
Вариант 5
А. Создать файл, содержащий сведения об ассортименте игрушек в магазине.
Структура записи - название игрушки, цена, количество, возрастные границы,
например 2 ^ 5, т.е. от двух до пяти лет. Количество записей - произвольное.
Б. Найти игрушки, которые подходят детям от 1 до 3 лет. Определить
стоимость самой дорогой игрушки и ее наименование. Определить игрушку,
которая по стоимости не превышает Х руб. и подходит ребенку в возрасте от А
до В лет. Значения Х, А, В ввести с терминала.
Вариант 6
А. Создать файл, содержащий сведения о сдаче студентами первого курса
сессии. Структура записи - индекс группы, фамилия студента, оценки по пяти
экзаменам, признак участия в общественной работе: "1" - активное участие, "0"
- неучастие. Количество записей - 30.
Б. Зачислить студентов группы Х на стипендию. Студент, получивший все
оценки "5" и активно участвующий в общественной работе, зачисляется на
повышенную стипендию (доплата 50 %), не активно участвует - доплата 25 %.
Студенты, получившие "4" и "5" , зачисляются на обычную стипендию.
Студент, получивший одну оценку "3", но активно занимающийся
общественной работой, также зачисляется на стипендию, в противном случае
зачисление не производится. Индекс группы вводится с терминала.
Вариант 7
А. Создать файл, содержащий сведения о сдаче студентами сессии. Структура
записи - индекс группы, фамилия студента, оценки по пяти экзаменам и пяти
зачетам ( "З" означает зачет, "Н" - незачет ). Количество записей - 25.
Б. Определить фамилии неуспевающих студентов с указанием индексов групп
и количества задолженностей. Найти средний балл, полученный каждым
студентом группы Х, и всей группой в целом.
Вариант 8
А. Создать файл, содержащий сведения о личной коллекции книголюба.
Структура записи - шифр книги, автор, название, год издания, местоположение
( номер стеллажа, шкафа и т. д.). Количество записей - произвольное. Б. Найти:
1) местонахождение книги автора Х названия Y;
2) список книг автора Z, находящихся в коллекции;
3) число книг издания ХХ года, имеющееся в библиотеке. Значения Х, Y, Z, XX
ввести с терминала;
Вариант 9
А. Создать файл, содержащий сведения о наличии билетов и рейсах Аэрофлота.
Структура записи - номер рейса, пункт назначения, время вылета, время
прибытия,
количество свободных мест в салоне. Количество записей - произвольное.
Б. Найти время отправления самолетов в город Х; наличие свободных мест на
рейс в город
Х с временем отправления Y.
Значения Х, Y вводятся по запросу с терминала.
Вариант 10
А. Создать файл, содержащий сведения об ассортименте обуви в магазине
фирмы. Структура записи - артикул, наименование, количество, стоимость
одной пары. Количество записей - произвольное. Артикул начинается с буквы
Д для дамской обуви, М для мужской, P для детской.
Б. Определить наличие в файле обуви артикула Х, узнать ее стоимость;
ассортиментный список дамской обуви с указанием наименования и
имеющегося в наличии числа пар каждой модели.
Значение Х вводится по запросу с терминала.
5 СРСП И СРС
При кредитной системе обучения предъявляются высокие требования к
повышению качества организации самостоятельной работы студента, которая
включает выполнение различных домашних заданий.
Самостоятельная работа студента под руководством преподавателя – одна
из форм учебной работы при кредитной системе обучения, которая проводится
в виде аудиторного занятия в диалоговом режиме, а также в виде консультаций
во внеаудиторное время.
Содержание самостоятельной работы студентов под руководством
преподавателя и чисто самостоятельной работы студента приведено в таблице 1
Таблица 1 – План СРСП и СРС
СРСП
СРС
№
п/п
1
2
3
Строки.
Процедуры
и
функции
для
Строки
это
единственный
1.
работы со строками
2.
Стандартные модули. Использование
библиотек стандартных модулей
3.
Примеры использования модульного
программирования при решении
сложных задач
4.
Использование стандартных процедур и
функций GRAPH
структурированный
тип
данных,
для
элементов которого определён порядок и,
следовательно, возможны операции сравнения
(=, >, <). Для обработки символьных массивов,
которыми являются строки, в языке Pascal
существуют специальные подпрограммы
Модули можно использовать для создания
библиотек стандартных подпрограмм и
данных. В Turbo Pascal в настоящее время
имеется большое количество стандартных
подпрограмм и данных, объединенных в
несколько
стандартных
модулей.
Они
позволяют упростить процедуру написания
программ,
более
полно
использовать
возможности компьютеров типа IBM PC,
возможности операционной системы MS DOS.
Суть модульного программирования состоит в
разбиении сложной задачи на некоторое число
более простых подзадач и составлении
программ для решения достаточно независимо
друг от друга. Модульность является одним из
основных
принципов
построения
программных проектов. В общем случае
модуль
отдельная
функционально
законченная программная единица, некоторым
образом идентифицируемая и объединяемая с
другими, средство определения логически
связанной совокупности объектов, средство их
выделения и изоляции. Модуль является
средством декомпозиции не только структур
управления, но и структур данных.
В состав Турбо Паскаля включена мощная
библиотека графических подпрограмм Graph,
остающаяся практически неизменной во всех
последующих версиях. Библиотека содержит в
общей сложности более 50 процедур и
функций, предоставляющих программисту
самые
разнообразные
возможности
управления графическим экраном.
5.
Использование динамической памяти
при разработке программ
Динамическая память -- это оперативная
память ПК, предоставляемая программе при ее
работе, за вычетом сегмента данных (64
Кбайт), стека (обычно 16 Кбайт) и собственно
тела программы.
Download