Методичка по программированию

реклама
Содержание
1Алгоритмы линейных структур
1.1 Этапы разработки программы……………………….…….……………....6
1.2 Основные понятия………………………………………………..…….......7
1.3 Основная структура программы……………………………..…………....7
1.4 Алфавит языка…………………………………………………..…….........8
1.5 Идентификаторы…………………………………………..……………...10
1.6 Константы…………………………………………………..……………..10
1.7 Понятие переменной. Типы…………………………….………...………11
1.8 Операции присваивания. Арифметические выражения…..........…........12
1.9 Оператор ввода и вывода информации…………………………...…......14
1.10 Практические задачи………………………………………………........15
1.11 Примеры решения задач…………………………….…………..………22
2 Циклы
2.1 Циклы с предусловием………………………………..…………..………25
с постусловием………………………………………..………….27
со счетчиком.……………………....…………………….………28
2.2 Задачи……………………………………………………………..…….. 29
2.3 Примеры………………………………………….……………….……...47
3 Немного об алгоритмах
 алгоритм Кнута-Морриса-Пратта……………………………….………..50
 алгоритм Бойера-Мура………………….……………………..……..…...52
 алгоритм Рабина………………………………………………..…..……...54
3.1 Разветвляющиеся алгоритмы………………………...…………………..57
3.2 Задачи……………………………………………………………...……....58
 свойства и виды треугольников……………………………………..……58
 свойства и виды четырехугольников…………………......…………...…58
 Задачи………………………………………………………………………63
4 Массивы
4.1 Объявление массива…………………………………………….………...87
4.2 Действия над массивами……………………………….…………………88
4.3 Вывод массива…………………………………………………………….88
4.4 Ввод массива………………………………………………………….…...88
4.5 Сортировка массива……………………………………………………....89
4.6 Поиск в массиве…………………………………………………………..90
4.7 Поиск минимального ( максимального ) элемента массива…………...91
4.8 Многомерные массивы…………………………………………………...92
4.9 Ошибки при использовании массивов…………………………………..93
4.10 Задачи…………………………………………………………………….93
5 Множества
5.1 Описание типа множество………………………………………...…….102
5.2 Операции над множествами……………………………………...……..104
5.3 Группы операций……………………………………………..….………107
3
5.4 Упражнения………………………………………….……………..…….110
5.5 Задачи…………………………………………………….………….…...116
6 Записи
6.1 Понятие записи……………………………………………….….………124
6.2 Оператор присоединения with...do……………………………….….….126
6.3 Вариантные записи…………………………………………………..…..131
6.4
Работа
с
файлами
записей…………………………………………..…...135
6.5 Задачи…………………………………………………………….………135
7 Файлы
7.1 Работа с файлами………………………………………….……….…….145
7.2 Текстовые файлы………………………………………………….……..145
7.3 Типизированные файлы………………………………………….……...150
7.4 Нетипизированные файлы……………………………………….……...152
7.5 Задачи…………………………………………………………….………154
8 Графика
8.1 Графика в Турбо паскале………………………………………………..165
8.2 Базовые процедуры и функции……………………………….….……..166
8.3 Экран и окно в графическом режиме ……………………….….….......168
8.4 Вывод простейших фигур………………………………………..……...170
8.5 Графические процедуры……………………………………………..….172
8.6 Построение прямоугольников……………………………………..…....174
8.7 Построение многоугольников……………………………….….………174
8.8 Построение дуг и окружностей……………………………..….…….176
8.9 Работа с текстом……………………………………………….….……..178
8.10 Построение графиков функций………………………………….….....180
8.11 Циклы в графике. Построение случайных процессов…………..…...184
8.12 Создание иллюзий……………………………………………...……....185
Задания…………………………………………………………..……….…..190
Контрольные тесты……………………………………………………..…...196
Ответы………………………………………………………………….…….208
4
Введение
Сборник содержит подробную теорию и задания по следующим темам:

Программирование алгоритмов линейной структуры

Программирование алгоритмов циклической структуры

Записи

Регулярные типы (массивы)

Множества

Файлы

Графика
К каждой теме представлены практические задачи, а также тестовые
вопросы. Сборник может быть применен в курсах программирования ПРЗ
на ЭВМ.
К каждой теме представлены упражнения и задания с их решением и
блок-схемой, практические задачи для решения на Turbo Pascal для
школьников и студентов, а также тестовые вопросы для проверки
усвоенных знаний. Сборник может быть применен в курсах
программирования ПРЗ на ЭВМ как в общеобразовательных так и в
высших учебных заведениях.
5
1 Алгоритмы линейных структур
Прежде
всего,
следует
напомнить,
что
изучение
языка
программирования представляет собой знакомство с формальными
правилами записи алгоритмов для их последующего выполнения
компьютером. Формальность сия проистекает из самих принципов,
заложенных в архитектуру вычислительных устройств, и жесткости
математической логики. Поэтому, постарайтесь воспринять все довольно
строгие правила как неизбежность, настроить себя на серьезную,
скрупулезную, порой сложную работу. Однако не стоит бояться,
расстраиваться и сетовать на судьбу: немного аккуратности, внимания,
знания предыдущего материала - и вы уже программист.
В этом разделе рассматриваются базовые понятия программирования,
необходимые для начала работы в Turbo Pascal.
Программа, работающая на компьютере, нередко отождествляется с
самим компьютером. На самом деле преобразование исходных данных,
вводимых с клавиатуры, в результат, выводимый на экран монитора,
выполняет процессор компьютера. Чтобы компьютер выполнил некоторую
работу,
необходимо
разработать
последовательность
команд,
обеспечивающую выполнение этой работы, или, как говорят, написать
программу.
1.1 Этапы разработки программы
Программирование – это процесс создания (разработки) программы,
который может быть представлен как последовательность следующих
шагов:
- определение требований к программе
- разработка алгоритма решения поставленной задачи
- написание команд
- отладка
- тестирование.
Определение требований к программе – один из важнейших этапов. На
этом этапе подробно описывается исходная информация и формулируются
требования к результату. Кроме того, описывается поведение программы в
особых случаях.
На
этапе
разработки
алгоритма
необходимо
определить
последовательность действий, которые надо выполнить для достижения
результата. Результатом этого этапа должен быть алгоритм,
представленный в виде словесного описания или блок-схемы. После того
как определены требования к программе и составлен алгоритм решения,
алгоритм записывается на выбранном языке программирования.
6
Под отладкой понимается процесс поиска и устранения ошибок в
программе. Данный этап можно считать законченным, если программа
правильно работает на одном- двух наборах входных данных.
Этап тестирования особенно важен, если вы предполагаете, что вашей
программой будут пользоваться другие. На этом этапе следует проверить,
как ведет себя программа на как можно большем количестве входных
наборов данных, в том числе и на заведомо неверных.
1.2 Основные понятия
Как и любой алгоритм, являющийся, как вы помните,
последовательностью инструкций, программа на языке Паскаль состоит из
команд (операторов), записанных в определенном порядке и формате.
Команды позволяют получать, сохранять и обрабатывать данные
различных типов (например, целые числа, символы, строки символов, т.д.).
Однако кроме команд в записи программы участвуют еще так называемые
"служебные слова". Это и есть элементы формальности, организующие
структуру программы. Их не так много, но их значение трудно
переоценить. Служебные слова можно использовать только по своему
прямому назначению. Переопределять их не разрешается.
Вам уже известно, что основное назначение компьютера - облегчить
человеку работу с большими объемами информации, поэтому
подавляющее большинство программ построено по одному, довольно
простому принципу: получение данных из внешнего мира (ввод),
обработка их по соответствующему алгоритму, хранение необходимой
информации и вывод во внешний (по отношению к компьютеру) мир
полученных результатов. Все эти действия реализуются через имеющиеся
в языках программирования команды, алгоритмические структуры и
структуры данных.
1.3 Основная структура программы
Правила языка Паскаль предусматривают единую для всех программ
форму основной структуры:
Program <Имя программы>;
<Раздел описаний>
Begin
<Тело программы>
End.
Здесь слова Program, Begin и End являются служебными. Правильное и
уместное употребление этих слов является обязательным.
Угловые скобки в формате указывают на то, что вместо них при
реальном программировании должно быть подставлено конкретное
7
значение. Сама запись программы в принципе может производиться
вообще в одну стоку. При этом ее части должны отделяться друг от друга
хотя бы одним пробелом. Однако, такая запись неудобна для чтения,
недостаточно наглядна, поэтому я рекомендую придерживаться
приведенной структуры, а в теле программы по возможности записывать
по одному оператору в строке.
Имя программы выбирается программистом самостоятельно в
соответствии с правилами построения идентификаторов.
Все объекты, не являющиеся зарезервированными в Паскале, наличие
которых обусловлено инициативой программиста, перед первым
использованием в программе должны быть описаны. Это производится для
того, чтобы компьютер перед выполнением программы зарезервировал
память под соответствующие объекты и поставил в соответствие этим
участкам памяти идентификаторы. Раздел описаний может состоять из
пяти подразделов:
1. Описание меток (Label).
2. Описание типов (Type).
3. Описание констант (Const).
4. Описание переменных (Var).
5. Описание процедур и функций (Procedure, Function).
При отсутствии необходимости в каком-либо виде объектов,
соответствующий подраздел может быть опущен.
1.4 Алфавит языка
Основу любого языка составляет алфавит, то есть конечный,
фиксированный набор символов, используемых для составления текстов на
данном языке (в нашем случае - программ). Конечно, стройность картины
немного портит наличие диалектов, создающихся стихийно и очень часто
включающих в себя апокрифические (неканонические) буквы и знаки. В
программировании эта проблема решается введением понятия "стандарт
языка". Оно практически неприменимо к языкам человеческим, вечно
развивающимся и изменяющимся. Мы с вами в основном будем говорить о
той самодостаточной части языка Паскаль, которая входит в различные его
компьютерные реализации в неизменном виде. В плане изучения, я не
вижу большого смысла излагать вам строгие правила стандарта, хотя такие
существуют. Ограничимся некоторыми замечаниями, раскрывающими все
же формальности употребления символов в языке Паскаль.
Итак, алфавит языка Паскаль составляют:
1) буквы латинского алфавита;
2) арабские цифры;
3) специальные знаки.
8
Использование символов первой группы чаще всего вопросов не
вызывает, но свои тонкости здесь имеются. Во-первых, это употребление
заглавных и строчных букв. Большинство существующих трансляторов не
различают буквы разных регистров. Таким образом, записи "progRaM" и
"PROGram" будем считать идентичными. Во-вторых, некоторые символы
латиницы и кириллицы совпадают по начертанию. Нельзя ли вместо буквы
"К" латинской написать "K" русскую? Ответ: в тетради (если вы их
сможете различить) - пожалуйста, в программе на ЭВМ - ни в коем случае.
На вид они может быть и похожи, но уж коды-то у них совершенно
разные, а компьютер, как вам известно, оперирует внутри себя не буквами,
а их числовыми кодами.
По поводу привычных арабских цифр сказать можно только то, что с их
помощью записываются не только числа. Цифры в качестве обыкновенных
символов могут использоваться в различных других конструкциях языка.
Сложнее всего обстоит дело со специальными знаками, поэтому их
придется разобрать подробно, иногда забегая вперед, но вы пока можете
пропускать мимо ушей непонятные термины, не забывая, однако,
записывать все в тетрадь. Потом, при изучении соответствующих
структур, вы будете иметь возможность заглянуть в этот раздел для того,
чтобы уточнить какой знак в данном месте необходимо использовать.
Наиболее часто употребляемым специальным символом является
пробел (в значимых местах мы будем обозначать его в записях знаком
"V"). Его использование связано с форматами основной структуры
программы, разделов описаний, операторов. Не следует путать наличие
пробела с отсутствием символа.
. конец программы, разделение целой и дробной частей вещественного
числа (десятичная точка), разделение полей в переменной типа Record;
, разделение элементов списков;
.. указание диапазона;
: используется в составе оператора присваивания, а также для указания
формата вывода в операторе Writeln;
; отделяет один раздел программы от другого, разделяет операторы;
' используется для ограничения строковых констант;
- + * / ( ) арифметические знаки (используются по своему назначению);
< > знаки отношений;
= используется в составе оператора присваивания, в разделах описаний
констант и типов, используется как знак отношения (равно);
@ имя специального оператора определения адреса переменной,
подпрограммы;
^ используется для именования динамических переменных;
{} ограничение комментариев в программе;
[ ] заключают в себе индексы элементов массивов;
9
_ символ подчеркивания используется также как любая буква,
например, в идентификаторах - вместо пробела;
# обозначение символа по его коду;
$
обозначение
директивы
компилятора,
обозначение
шестнадцатеричного числа.
Возникает вопрос, а как же быть с русскими буквами и другими
знаками, имеющимися на клавиатуре? Некоторые версии Паскаля
допускают их использование в программе, но стандарт языка этого не
подразумевает. Поэтому включать эти символы в программу можно только
в качестве строковых констант или внутри комментария, то есть там, где
транслятор при компиляции их игнорирует. При использовании этих
знаков в качестве данных, они равноправны со всеми символами, которые
может хранить в памяти и обрабатывать компьютер.
1.5 Идентификаторы
Имена операторов, переменных, констант, типов величин, имя самой
программы назначаются программистом и называются в Паскале
идентификаторами. Существуют правила, которым должны отвечать все
идентификаторы:
- идентификатор должен быть уникальным, то есть одним и тем же
именем разные объекты не могут быть названы;
- идентификатор имеет ограничение по длине (зависит от конкретной
реализации языка на компьютере);
- идентификатор может состоять только из символов латинского
алфавита, цифр и знака подчеркивания ("_");
- идентификатор не может начинаться с цифры.
1.6 Константы
Из всех подразделов описаний сейчас мы рассмотрим только описание
констант и переменных, остальные - позже.
Вообще говоря, в Паскале константами являются любые явно заданные
в программе данные (например, 7493, 'привет', 54.899). Следует обратить
ваше внимание на то, что при записи числовых констант с дробной частью
эта часть отделяется от целой не запятой, как, возможно, вы привыкли, а
точкой. Для записи очень больших по модулю или очень малых (близких к
нулю) чисел существует возможность записи их в так называемой
экспоненциальной форме. С такой записью вы встречались в математике и
физике, но называли ее стандартным видом числа.
Пример: 2 . 4 5 6 7 Е - 0 6
^мантисса ^порядок
10
Здесь буква "Е" отделяет мантиссу (совокупность значащих цифр числа
с десятичной точкой после первой) от порядка (показателя степени десятки
в стандартном виде числа). Вам предстоит научиться как читать числа в
таком виде, так и записывать.
Константы, представляющие собой строковые величины, заключаются
в апострофы.
Если одна и та же величина используется в программе несколько раз, то
удобнее было бы обозначить ее каким-нибудь именем и использовать это
имя везде, где требуется записать соответствующую константу. Кроме
сокращения размера исходного текста программы, это позволит избежать
случайных ошибок, а также упростит отладку программы. Описание
именованных констант начинается служебным словом Const. Далее
следуют записи вида:
<Идентификатор> = <значение>;
1.7 Понятие переменной
Типы
Данные, как вы знаете, хранятся в памяти компьютера, но для указания
на конкретную информацию очень неудобно все время записывать
физические адреса ячеек. Эта проблема в языках программирования
высокого уровня, в частности в Паскале, решена введением понятия
переменной. Переменная в Паскале - именованный участок памяти для
хранения данных определенного типа. Значение переменной (информация
в соответствующих ячейках памяти) в ходе выполнения программы может
быть изменено. Константами же, как вы уже знаете, называются величины,
значение которых в ходе выполнения программы изменено быть не может.
Конкретные переменные и константы представляют собой объекты
уникальные и отличаются друг от друга именем.
В качестве данных в программах на языке Паскаль могут выступать
числа, символы, целые строки символов. Заметьте, что с этими
различными видами информации выполняются совершенно разные
действия.
Например,
с
числовыми
величинами
производятся
арифметические операции, чего невозможно сделать с символьными.
Кроме того, разные виды данных требуют различного объема памяти для
хранения. В соответствии с этими соображениями в языке Паскаль введено
понятие "Тип" (TYPE). Тип переменной указывает на то, какие данные
могут быть сохранены в этом участке памяти, и в каких действиях эта
переменная может участвовать. Существуют зарезервированные (базовые)
типы в языке Паскаль, но, как далее вы убедитесь, есть также возможность
создавать свои собственные, определяемые программистом типы
переменных.
11
К базовым типам относятся:
 Integer - тип целых чисел
 Longint - тип "длинных" целых чисел
 Real - тип действительных (вещественных) чисел (то есть - с дробной
частью)
 Byte - тип неотрицательных целых чисел от 0 до 255
 Word - тип неотрицательных целых чисел от 0 до 65535
 Char - символьный тип
 String - строковый тип
 Boolean - логический тип
Физически типы данных отличаются друг от друга количеством ячеек
памяти (байтов), отводимых для хранения соответствующей переменной.
Логическое же отличие проявляется в интерпретации хранящейся
информации. Например, переменные типа Char и типа Byte занимают в
памяти по одному байту. Однако в первом случае содержимое ячейки
памяти интерпретируется как целое беззнаковое число, а во втором - как
код (ASC) символа.
В отличие от констант, неименованных переменных не существует. Все
используемые в программе переменные должны быть описаны в
соответствующем разделе описания.
Раздел описания переменных начинается служебным словом Var, после
которого следуют записи следующего вида:
<Список имен переменных>:<Название типа>;
Список может состоять из нескольких имен (при этом они разделяются
запятыми), а также и из одного имени. Тип, указываемый после двоеточия,
определяет, какие данные теперь могут храниться в описанных таким
образом переменных. Для каждого используемого в программе типа
переменных в разделе их описания должна быть, как минимум, одна
собственная строка.
1.8 Оператор присваивания
Арифметические выражения
Самым простым действием над переменной является занесение в нее
величины соответствующего типа. Иногда говорят об этом, как о
присвоении переменной конкретного значения. Такая команда (оператор) в
общем виде выглядит на языке Паскаль следующим образом:
<Имя переменной> := <Выражение>;
Выражение, указанное справа от знака ":=", должно приводить к
значению того же типа, какого и сама переменная, или типа, совместимого
с переменной относительно команды присваивания. Например,
12
переменной типа Real можно присвоить значение типа Integer или Word
(впрочем, наоборот делать нельзя). Выражение будет сначала вычислено,
затем, его результат будет положен в ячейки памяти, отведенные для
переменной.
Что же представляет собой выражение на языке Паскаль? Многое
зависит от типа выражения. Рассмотрим сначала выражения
арифметические, то есть те, результатом которых является число.
В состав арифметического выражения на языке Паскаль могут входить:
- числовые константы;
- имена переменных;
- знаки математических операций;
- математические функции и функции, возвращающие число;
- открывающиеся и закрывающиеся круглые скобки.
Правила построения выражений напоминают математические с
некоторыми уточнениями. Выражение записывается в одну строку
(никакой многоэтажности), между операндами обязательно должен стоять
знак операции (Запись "2x" - не допускается), знаки некоторых операций и
названия некоторых функций отличны от привычных вам.
Операции:
+ сложение;
- вычитание;
/ деление;
* умножение;
MOD остаток от деления (записывается так: A MOD B; читается:
остаток от деления A на B); эта операция применима только к целым
числам;
DIV целочисленное деление (записывается так A DIV B; читается:
результат деления A на B без дробной части); эта операция тоже
применяется только для целых операндов.
Аргументы функций всегда записываются в круглых скобках:
SIN(X) sin x;
COS(X) cos x;
ARCTAN(X) arctg x;
ABS(X) абсолютное значение x (в математике - |x|);
SQR(X) возведение x в квадрат;
SQRT(X) извлечение квадратного корня;
TRUNC(X) отбрасывание дробной части х;
ROUND(X) округление х до ближайшего целого числа;
После выполнения второго оператора присваивания в участке памяти,
отведенном под переменную R, окажется результат указанного выражения,
однако, к сожалению, узнать его мы не сможем, поскольку пока не имеем
возможности "заглянуть" в память машины, вывести значение переменной
хотя бы на экран.
13
Составной оператор. Этот оператор, строго говоря, оператором не
является. Дело в том, что также как арифметические действия иногда
бывает необходимо заключать в скобки, последовательности команд
(операторов) тоже иногда требуют объединения. Это позволяют сделать
так называемые операторные скобки. Формат (общий вид) составного
оператора таков:
Begin
<Оператор 1>;
<Оператор 2>;
......
<Оператор N>
End;
1.9 Операторы ввода и вывода информации
Если вы помните, при рассмотрении примера работы оператора
присваивания мы столкнулись с необходимостью узнать результат
выполнения программы. Мы разобрались с тем, как информацию
сохранять (в переменных), как обрабатывать (с использованием
выражений), но два фундаментальнейших информационных процесса
остались вне нашего внимания: получение информации и передача ее во
внешний по отношению к компьютеру мир. Пока наши программы могут
использовать лишь информацию, которая находится непосредственно в
тексте программы. Узнать, какие значения в данный момент имеют
переменные, также не представлялось возможным. Программирование в
таких условиях теряет смысл.
Взаимодействие устройств обработки и хранения информации с
внешней средой (хотя бы с пользователем) является совершенно
необходимым. За такой интерфейс в языке Паскаль отвечают операторы
ввода-вывода информации. Эти инструкции позволяют ввести аргументы,
параметры расчетов во время выполнения программы (а не на этапе ее
написания), осуществить вывод рассчитанных данных в понятном
человеку виде.
Сначала операторы ввода (форматы операторов):
Read (<Список ввода>);
Readln (<Список ввода>);
В таком формате эти команды позволяют вводить данные в переменные
во время выполнения программы с клавиатуры. Элементами списка ввода
могут быть имена переменных, которые должны быть заполнены
значениями, введенными с клавиатуры.
Выполнение операторов ввода происходит так: ход программы
приостанавливается, на экран выводится курсор, компьютер ожидает от
пользователя набора данных для переменных, имена которых указаны в
14
списке ввода. Пользователь с клавиатуры вводит необходимые значения в
том порядке, в котором они требуются списком ввода, нажимает Enter.
После этого набранные данные попадают в соответствующие им
переменные и выполнение программы продолжается.
Для вывода информации в Паскале также есть две команды:
Write (<Список вывода>);
Writeln (<Список вывода>);
Такой формат использования Write и Writeln позволяет выводить на
экран монитора данные из списка вывода. Элементами списка вывода
могут являться имена переменных, выражения, константы. Прежде чем
вывести на экран компьютер значения выражений сначала вычислит.
Элементы списка, также как и в операторах ввода, разделяются запятыми.
Различие между двумя операторами вывода таково: после выполнения
оператора Writeln (от Write line) происходит переход на новую строчку, а
после выполнения инструкции Write, переход на новую строчку не
происходит и печать по последующим командам вывода Write или Writeln
будет происходить на той же строчке. При вызове оператора Writeln без
параметров просто происходит переход на новую строчку.
1.10 Практические задачи
№
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Условие задачи
Написать программу вычисления площади параллелограмма.
Написать программу вычисления объема параллелепипеда.
Написать
программу
вычисления
площади
поверхности
параллелепипеда.
Написать программу вычисления объема куба.
Написать программу вычисления объема цилиндра.
Написать программу вычисления стоимости покупки, состоящей из
нескольких тетрадей и карандашей.
Написать программу вычисления стоимости покупки, состоящей из
нескольких тетрадей и такого же количества обложек к ним.
Написать программу вычисления стоимости некоторого количества
(по весу) яблок.
Написать программу вычисления площади треугольника, если
известна длина основания и высота.
Написать программу вычисления площади треугольника, если
известны длины двух его сторон и величина угла между этими
сторонами.
Написать программу вычисления сопротивления электрической цепи,
состоящей из двух параллельно соединенных сопротивлений.
Написать программу вычисления сопротивления электрической цепи,
состоящей из двух последовательно соединенных сопротивлений.
15
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
Написать программу вычисления силы тока в электрической цепи.
Написать программу вычисления расстояния между населенными
пунктами, изображенными на карте.
Написать программу вычисления стоимости поездки на автомобиле
на дачу (туда и обратно). Исходными данными являются: расстояние
до дачи (в километрах); количество бензина которое потребляет
автомобиль на 100 км пробега; цена одного литра бензина.
Написать программу вычисления площади поверхности цилиндра.
Написать программу пересчета расстояния из верст в километры (1
верста равняется 1066,8 м).
Написать программу пересчета веса из фунтов в килограммы
(1 российский фунт равен 409,5 г).
Написать программу вычисления величины дохода по вкладу.
Процентная ставка (в процентах годовых) и время хранения (в днях)
задаются во время работы программы.
Написать программу пересчета величины временного интервала,
заданного в минутах, в величину, выраженную в часах и минутах.
Написать программу, которая преобразует введенное с клавиатуры
дробное число в денежный формат. Например, число 125 должно
быть преобразовано к виду 12 руб. 50 коп.
Написать программу, которая вычисляет площадь треугольника, если
известны координаты его углов.
Даны два действительных числа а и b. Получить их сумму, разность и
произведение.
Даны два действительных положительных числа. Найти среднее
арифметическое и среднее геометрическое этих чисел.
Даны два действительных числа. Найти среднее арифметическое
этих чисел и среднее геометрическое их модулей.
Даны катеты прямоугольного треугольника. Найти его гипотенузу и
площадь.
Смешано v1 литров воды температуры tt с v2 литрами воды
температуры t2. Найти объем и температуру образовавшейся смеси.
Определить периметр правильного n-угольника, описанного около
окружности радиуса r.
Три сопротивления R1, R2, R3 соединены параллельно. Найти
сопротивление соединения.
Дана сторона равностороннего треугольника. Найти площадь этого
треугольника.
Даны гипотенуза и катет прямоугольного треугольника. Найти
второй катет и радиус вписанной окружности.
Известна длина окружности. Найти площадь круга, ограниченного
этой окружностью.
16
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
Определить время, через которое встретятся два тела,
равноускоренно движущиеся навстречу друг другу, если известны их
начальные скорости, ускорения и начальное расстояние между ними.
Треугольник задан длинами сторон. Найти длины высот.
Треугольник задан длинами сторон. Найти длины медиан.
Треугольник задан длинами сторон. Найти длины биссектрис.
Треугольник задан длинами сторон. Найти радиусы вписанной и
описанной окружностей.
Найти площадь сектора, радиус которого равен 13.7, а дуга
содержит заданное число радиан р.
Дано действительное число х. Не пользуясь никакими другими
арифметическими операциями, кроме умножения, сложения и
вычитания, вычислить
2x4— 3х3 + 4х2— 5x +6.
Разрешается использовать не более четырех умножений и четырех
сложений и вычитаний.
Определить, является ли данное целое число четным.
Определить, верно ли, что при делении неотрицательного целого
числа а на положительное целое число b получается остаток, равный
одному из двух заданных чисел r или s.
Найти площадь кольца, внутренний радиус которого равен 20, а
внешний—заданному числу r (r > 20).
Определить силу притяжения F между телами массы m1 и m2,
находящимися на расстоянии r друг от друга.
Вычислить:
при
x=1.426
2 cos(x   / 6)
a
2
y=-1.22
1 / 2  sin y
z=3.5
2
b  1
45.
z
3  z2 / 5
Вычислить:
  x
y/x
3 y/x
  ( y  x)
46.
при
x=1.825
y=18.225
z=-3.298
y  z /( y  x)
1  ( y  x) 2
Вычислить:
при
2
3
4
x=0.335
y=0.025
x
x
x
 
2! 3! 4!
  x(sin x3  cos 2 y)
s  1 x 
47.
Вычислить:
ye
bt
при
sin( at  b)  bt  a
a=-0.5
b=1.7
t=0.44
s  b sin( at 2 cos 2t )  1
17
48.
Вычислить:
при
a=1.5
b=15.5
x=-2.9
  x  b  b sin ( x  a) / x
2
2
3
y  cos 2 x3  x / a 2  b2
49.
Вычислить:
при
s  x tg ( x  b)  a / x  b
3
Q
50.
2
a=16.5
b=3.4
x=0.61
2
bx 2  a
e ax  1
Вычислить:
при
R  x ( x  1) / b  sin ( x  a)
2
s
51.
2
xb / a  cos ( x  b)
2
a=0.7
b=0.05
x=0.5
3
Вычислить:
при
y  sin ( x  a)  x / b
3
z
52.
2
a=1.1
b=0.004
x=0.2
2
x2
 cos( x  b)3
a
Вычислить:
при
f  3 mctb  c sin t
m=2
c=-1
t=1.2
b=0.7
z  m cos(bt sin t )  c
53.
Вычислить:
при
a=3.2
b=17.5
x=-4.8
a
y  abx 2 
2
sin ( x / a)
d  ae
54.
 a
cos(bx / a)
Вычислить:
при
f  ln( a  x )  sin ( x / b)
2
z  e cx
55.
2
a=10.2
b=9.2
c=0.5
x=2.2
x xa
x
x b
Вычислить:
y
при
x
a  b cos( a  b) x
x 1
2x
a=0.3
b=0.9
x=0.61
R  x 2  b  b2 sin 3 ( x  a) / x
56.
Вычислить:
при
z  ax sin 2 x  e
2 x
a=0.5
b=3.1
x=1.4
( x  b)
  cos2 x3  x / a 2  b2
57.
Вычислить:
U
при
x
a x  e cos bx
bx  e x sin bx  1
2
a=0.5
b=2.9
18
f  e2 x ln( a  x)  b3 x ln( b  x)
58.
Вычислить:
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
при
sin x
m=0.7
c=2.1
m  sin x
 ax
 bx
x=1.7
se
x 1  e
x  1.5
a=0.5
b=1.08
Написать программу, которая вычисляет периметр и площадь
правильного 17-угольника, вписанного в окружность заданного
радиуса.
Написать программу для решения следующей задачи: вычислить
значение производной функции хх в заданной точке а (а>0).
Написать программу для решения следующей задачи: для заданного а
вычислить принадлежащий интервалу (  , 2  ) корень уравнения
ln(ctgx — 1)=а.
Написать программу для решения следующей задачи: вычислить
дробную часть среднего геометрического трех заданных
положительных чисел.
Написать программу для решения следующей задачи: по заданным
коэффициентам и правым частям уравнений системы a1x+b1y=c1,
a2x+b2y=c2 найти ее решение в предположении, что определитель
системы не равен нулю.
Написать программу для решения следующей задачи: вычислить
длину окружности, площадь круга и объем шара одного и того же
заданного радиуса.
Написать программу для решения следующей задачи: вычислить
периметр и площадь прямоугольного треугольника по длинам двух
катетов.
Написать программу для решения следующей задачи: по
координатам трех вершин некоторого треугольника найти его
площадь и периметр.
Написать программу для решения следующей задачи: по длинам двух
сторон некоторого треугольника и углу (в градусах) между ними
найти длину третьей стороны и площадь этого треугольника.
Написать программу для решения следующей задачи: найти
произведение цифр заданного четырехзначного числа.
Написать программу для решения следующей задачи: определить
число, полученное выписыванием в обратном порядке цифр
заданного трехзначного числа.
Для решения следующие задачи написать программу, который
печатает true или false в зависимости от того, выполняются или нет
указанное условие: для произвольных вещественных чисел а, b и с
z
59.
x=0.3
2
2
 cm ln mx
19
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
определить, имеет ли уравнение ax2 + bx + c = 0 хотя бы одно
вещественное решение.
Для решения следующие задачи написать программу, который
печатает true или false в зависимости от того, выполняются или нет
указанное условие: для заданных чисел р, а и b (a<,b) определить,
имеет ли уравнение arctg(2x—p) = 2 корень на отрезке [а, b].
Для решения следующие задачи написать программу, который
печатает true или false в зависимости от того, выполняются или нет
указанное условие: определить, равна ли сумма двух первых цифр
заданного четырехзначного числа сумме двух его последних цифр.
Для решения следующие задачи написать программу, который
печатает true или false в зависимости от того, выполняются или нет
указанное условие: определить, равен ли квадрат заданного
трехзначного числа кубу суммы цифр этого числа.
Для решения следующие задачи написать программу, который
печатает true или false в зависимости от того, выполняются или нет
указанное условие: определить, есть ли среди первых трех цифр из
дробной части заданного положительного вещественного числа
цифра 0.
Для решения следующие задачи написать программу, который
печатает true или false в зависимости от того, выполняются или нет
указанное условие: определить, есть ли среди цифр заданного
трехзначного числа одинаковые.
Для решения следующие задачи написать программу, который
печатает true или false в зависимости от того, выполняются или нет
указанное условие: даны три произвольных числа. Определить,
можно ли построить треугольник с такими длинами сторон.
Для решения следующие задачи написать программу, который
печатает true или false в зависимости от того, выполняются или нет
указанное условие: даны координаты (как целые от 1 до 8) двух полей
шахматной доски. Определить, может ли конь за один ход перейти с
одного из этих полей на другое.
Даны два числа. Найти среднее арифметическое кубов этих чисел и
среднее геометрическое модулей этих чисел.
Вычислить расстояние между двумя точками с данными
координатами x1, y1 и х2, у2.
По двум данным катетам найти гипотенузу и площадь
прямоугольного треугольника.
Даны числа х, у. Вычислить их сумму, разность и произведение.
Даны а, b, p. Найти площадь треугольника, две стороны которого
равны а и b, а угол между этими сторонами равен у. Считать, что p —
радианная мера угла.
20
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
Даны а, b, p. Найти площадь треугольника, две стороны которого
равны а и b, а угол между этими сторонами равен у. Считать, что p —
градусная мера угла.
Дано р. Найти площадь сектора, радиус которого равен 13.75, а
соответствующий центральный угол равен р. Считать, что p —
радианная мера угла.
Дано р. Найти площадь сектора, радиус которого равен 13.75, а
соответствующий центральный угол равен р. Считать, что p —
градусная мера угла.
Треугольник задан координатами x1, y1, х2, у2, х3, у3 своих вершин
найти периметр треугольника.
Треугольник задан координатами x1, y1, х2, у2, х3, у3 своих вершин
найти площадь треугольника.
Дано х. Получить значения 1—2x + 3x2 - 4x3 и 1+2x+3x2 + 4x3.
Позаботиться об экономии операций.
Дано а. Не используя никаких функций и никаких операций кроме
умножения, получить a8 за три операции.
Даны действительные числа x и y. Получить:
 x  y /1  xy .
Даны действительные числа x и y. Получить:
ctg ( x)  sin  y 
x
Даны действительные числа x и y. Получить:
32 x  e  x cos yx
4 x  e  x sin yx  1
Даны действительные числа x и y. Получить:
x 2  y  y 2 sin 3 ( x  y ) / x
Даны действительные числа x и y. Получить:
y
mxy  x sin y
Даны действительные числа x и y. Получить:
x2
 cos(y  b) 3
y
Даны действительные числа x и y. Получить:
e  yx sin( x  y )  xy  x
Даны действительные числа x и y. Получить:
y  z /( y  x)
( y  x)
1  ( y  x) 2
Даны действительные числа x и y. Получить:
21
y2
 y  x2 / 5
99. Даны действительные числа x и y. Получить:
x 2 ( x  1) / y  sin 2 ( x  y )
100. Даны действительные числа x и y. Получить:
y
yx 2 
2
sin ( x / y )
1
1.11 Примеры решения задач
Задание:
Разработать алгоритм и составить программу вычисления значения
выражения, соответствующего варианта. Ввести исходные данные и
результат с пояснительным текстом.
y    ctg
x5  a
e  x  e9
 1,65  e
 ax
x2  1
 0,33  ln 2
x 
Программа:
uses crt;
var
a, b, x, y: real;
begin
clrscr;
writeln('Введите значение Х ');
readln(x);
writeln('Введите значение A ');
readln(a);
a:=sin((sqrt(abs(exp(5*ln(x))+a))))/(exp(x)+exp(9))/cos(sqrt(abs(exp(5*ln(x))+a)))/(exp(-x)+exp(9));
y:=3.14*(a)-1.65*exp(-x*a)+0.33*ln((sqr(x)+1)/(sqr(x)+pi));
writeln('Значение Y ', y:3:3);
readkey;
end.
22
Блок-схема:
Начало
a, x
y :   ctg
x5  a
e x  e9
 1,65  e
 ax
 0,33  ln
y
Конец
Задание:
Найти площадь сегмента.
Расчетная формула:
Sсегм 
2
1
2 R  (  sin )
где Sсегм —площадь сегмента, см2;
R —радиус круга, см;
 —дуга сегмента, рад.
Исходные данные для расчета приведены в таблице.
Параметры
расчета
Числовые
значения
R

220,0
161,3
Ход программы
Program zadacha5_1;
Var r,a,s:real;
Begin
Write('ввудите радиус круга в см. r =');
Readln(r);
Write('введите дугу сегмента в рад а=');
Readln(a);
s:=1/(2*r*r*(a-sin(a)));
23
x2 1
x2  
Writeln('Площадь сегмента s=',s:17:13);
end.
Блок-схема
Начало
.
Ввод r,
a.
S=1/(2*r*r*(asina)
Вывод S
Конец
24
2 Циклы
Цикл является одной из важнейших алгоритмических структур и
представляет собой последовательность операторов, которая выполняется
неоднократно. В программах, связанных с обработкой данных или
вычислениями, часто приходится выполнять циклически повторяющиеся
действия. Циклы позволяют записать такие действия в компактной форме.
Циклы принадлежат к числу управляющих операторов.
Рассмотрим задачу на вычисление суммы большого числа слагаемых:
1 1
1
1    ... 
2 3
100
Можно заметить, что при вычислении суммы повторяются всего три
операции, причем в определенном порядке:
1. Разделить единицу на знаменатель.
2. Прибавить частное к ранее полученной сумме.
3. Увеличить на 1 значение знаменателя.
Следовательно, задачу можно решить, например, так:
1. Присвоить переменной Sum значение, равное 0 (Sum := 0).
2. Присвоить переменной i значение, равное 1 (i := 1).
3. Добавить к сумме значение 1 / i (Sum := Sum + 1 / i).
4. Увеличить i на 1 (i := i + 1).
5. Повторить шаги 3 и 4.
Повторив операции 3 и 4 99 раз, мы получим требуемую сумму. Это
пример алгоритмической конструкции «цикл».
В языке программирования Паскаль имеется три разновидности цикла:
 цикл со счетчиком (цикл «для» — for ... to / downto);
 цикл с предусловием (цикл «пока» — while);
 цикл с постусловием (цикл «до тех пор, пока» — repeat.until).
Каждая из трех разновидностей цикла имеет свои особенности, для
каждой из них есть свой круг задач, наиболее естественно решаемых
именно с ее помощью.
2.1 Цикл с предусловием
Цикл с предусловием имеет вид:
while условие do {Эта часть называется заголовком цикла}
оператор; {Эта часть называется телом цикла}
Телом цикла может быть и группа операторов, заключенная в
операторные скобки begin... end (то есть составной оператор).
Цикл с предусловием выполняется до тех пор, пока истинно условие в
заголовке цикла, причем оно проверяется вначале, потом исполняется
оператор. Переменным, входящим в условие, должны быть присвоены
определенные значения до входа в цикл.
25
В теле цикла должны быть операторы, которые в какой-то момент
изменят значение условия, сделав его ложным. Если этого не случится,
цикл будет бесконечным. При возникновении в программе бесконечного
цикла говорят, что программа «зациклилась». Зациклившуюся программу
приходится останавливать одновременным нажатием клавиш Ctrl+Break,
иначе она будет выполняться вечно (точнее, до первого отключения
компьютера).
Задача о вычислении суммы может быть решена с использованием
цикла while... do следующим образом:
program summa1;
const
n = 100; {Так объявляется именованная константа программы}
var i : Integer; sum : Real;
begin sum:= 0;
i := 1; {Присвоим переменной sum начальное значение 0, a i - начальное
значение 1}
while i <= n do begin
sum.:= sum + 1 / i ;
i := i + 1 {Переменная i меняется внутри цикла, и ее величина
определяет очередное повторение тела цикла}
end;
WriteLn('сумма ', n, ' элементов = ', sum:10:5);
end.
Цикл в этой программе работает следующим образом:
 вначале i =1, sum = 0;
 условие i <= 100 в заголовке - оператора while истинно, поэтому
начинается выполнение цикла;
 значение суммы увеличивается на единицу: sum = 0+1;
 i увеличивается на 1 i = 2;
 условие i <= 100 вновь истинно, поэтому тело цикла повторяется
очередной раз;
 значение суммы sum = 0 + 1 + 1/2,a переменной = 3;
 после
выполнения
данной
последовательности
действий
необходимое число раз получаем sum = ...+ 1 / 100 , i = 101;
 условие i <= 100 ложно, поэтому цикл завершается. Следующим
действием будет вывод результата.
Отметим, что в данном решении использовалась константа. Константа
может иметь имя, тогда она называется именованной константой.
Объявляется именованная константа в предложении описания констант,
которое размещается в разделе описаний программы и имеет вид:
const имя = значение;
Использование именованных констант преследует две цели:
26
 сделать программу более удобной для понимания. Если, допустим, в
программе часто используется число 12, то иногда удобнее один раз дать
ему имя, например dozen, а затем использовать это имя;
 облегчить изменение программы. Если, скажем, нужно изменить
количество элементов суммы, то лучше изменить одну строку в
предложении описания констант, чем вносить исправления по всей
программе.
Цикл с постусловием
Следующая разновидность цикла — цикл с постусловием. Рассмотрим
эту разновидность:
repeat
группа операторов
until условие;
Здесь вначале выполняется группа операторов, а потом производится
проверка, следует ли вновь повторить эту группу. Если условие ложно,
выполнение цикла повторяется, иначе — заканчивается.
Решение предыдущей задачи о суммировании с использованием цикла
repeat... until выглядит так:
program summa2; const
n = 100; var
i : Integer;
sum : Real;
begin
sum := 0;
i :=1;
repeat
sum := sum + 1 / i;
i := i + 1; {i управляет повторением цикла}
until i > n;
WriteLn('сумма ', n, ' элементов = ', sum:10:5);
end.
Здесь выполнение цикла происходит следующим образом:
 вначале i = 1 и sum = 0 + 1;
 i увеличивается на 1: i = 2;
 условие i > 100 ложно, поэтому выполнение цикла повторяется;
 значение суммы' изменяется: Siint = 1 + 1 / 2;
 i увеличивается на 1: i = 2 + 1;
 условие i > 100 ложно, цикл повторяется;
 цикл повторяется, пока не окажется i = 100 + 1, а значение суммы
sum = 1 + 1/2 +...+ 1 / 100;
 условие i > 100 истинно, цикл завершен.
27
Слова repeat и until являются зарезервированными, как, впрочем, и
слово while. В отличие от цикла while операторы внутри цикла repeat
выполняются хотя бы один раз, в то время как в цикле whilе они могут не
выполниться ни разу.
Цикл со счетчиком
Цикл со счетчиком имеет следующий вид:
for i := начальное_значение to конечное_значение do ... оператор;
Здесь переменная i, называемая управляющей переменной цикла for
(или его счетчиком), является произвольным идентификатором, который
объявляется как переменная целого (чаще всего) типа. Она может быть
также логической или символьной (о символьном типе речь пойдет
дальше). Допускаются и некоторые другие типы, но этот случай мы
рассматривать не будем.
При выполнении оператора for сначала вычисляется значение
выражения начальное значение, затем вычисляется значение выражения
конечное значение, далее управляющая переменная цикла последовательно
пробегает все значения от начального до конечного. В том случае, когда
начальное значение оказывается больше, конечного значения, тело цикла
не будет выполняться вовсе. Начальное и конечное значения остаются
неизменными в ходе выполнения всего цикла for.
Параметр цикла i, если он целого типа, пробегает все значения с
приращением 1, и его текущее значение не должно изменяться
операторами внутри цикла. Такое изменение не запрещено правилами
языка, но его последствия будут непредсказуемы. После завершения цикла
параметр i считается неопределенным.
В цикле:
for i := начальное_значение
downto конечное_значение do ... оператор;
параметр цикла меняется от начального значения до конечного с шагом
-1.
Программа вычисления суммы с использованием цикла со счетчиком
дана далее в двух вариантах (вариант с to и вариант с downto).
program summa3;
const
n = 100;
var
i : Integer; sum : Real;
begin
sum := 0;
for i := 1 to n do {При первом выполнении цикла i равняется 1, к sum
добавляется 1, затем i = 2, к sum добавляется 1/2}
28
sum := sum + 1 / i;
{Затем i = 3, к sum добавляется 1/3. и так продолжается до i = n}
WriteLn('сумма ', n,' элементов =sum:10:5); end .
Второй вариант:
program summa4;
const
n = 100;
var
i : Integer; sum : Real;
begin sum := 0;
for i := n downto 1 do sum := sum + 1 / i;
WriteLn('сумма’, n, ‘элементов =’, sum:10:5);
end.
2.2 Задачи
For
№
1.
2.
3.
4.
5.
6.
7.
8.
9.
Условие задачи
Написать программу, которая 10 раз выводит на экран имя и
фамилию.
Написать программу, которая выводит таблицу квадратов первых
десяти целых положительных чисел.
Написать программу, которая выводит таблицу квадратов первых
пяти целых положительных нечетных чисел.
Написать программу, которая вычисляет сумму первых n целых
положительных целых чисел. Количество суммируемых чисел
должно вводиться во время работы программы.
Написать программу, которая вычисляет сумму первых n целых
положительных четных чисел. Количество суммируемых чисел
должно вводиться во время работы программы.
Написать программу, которая вычисляет сумму первых n членов
ряда 1, 3, 5, 7, .... Количество суммируемых членов ряда задается
во время работы программы.
Написать программу, которая вычисляет сумму первых n членов
ряда 1 + 1/2+1/3 .... Количество суммируемых членов ряда задается
во время работы программы.
Написать программу, которая выводит таблицу степеней двойки
(от нулевой до десятой).
Написать программу, которая вычисляет факториал числа,
введенного с клавиатуры. (Факториалом числа n называется
произведение целых чисел от 1 до п. Например, факториал числа 1
равен 1, а числа 8 — 40320.)
29
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Написать программу, которая выводит таблицу значений функции
у = -2,4х2 + 5x — 3 в диапазоне от -2 до 2 с шагом 0,5.
Написать программу, которая вводит с клавиатуры 5 дробных
чисел и вычисляет их среднее арифметическое. Данные, введенные
пользователем, выделены полужирным шрифтом.
Написать программу, которая вычисляет среднее арифметическое
вводимой с клавиатуры последовательности дробных чисел.
Количество чисел должно задаваться во время работы программы.
Написать
программу,
которая
вводит
с
клавиатуры
последовательность из пяти дробных чисел и после ввода каждого
числа выводит среднее арифметическое полученной части
последовательности.
Написать программу, которая вычисляет среднее арифметическое
последовательности дробных чисел, вводимых с клавиатуры.
После того, как будет введено последнее число, программа должна
вывести минимальное и максимальное число последовательности.
Количество чисел должно задаваться во время работы программы.
Написать программу, которая генерирует 10 случайных чисел в
диапазоне от 1 до 10, выводит эти числа на экран и вычисляет их
среднее арифметическое.
Написать программу, которая генерирует три последовательности
из десяти случайных чисел в диапазоне от 1 до 10, выводит
каждую последовательность на экран и вычисляет среднее
арифметическое каждой последовательности.
Написать программу, которая выводит на экран таблицу
стоимости, например, яблок в диапазоне от 100 г до 1 кг с шагом
100.
Написать программу, которая выводит таблицу значений функции
у = x . Диапазон изменения аргумента — от -4 до 4, шаг
приращения аргумента — 0,5.
Написать программу, которая выводит таблицу значений функции
у = x  2 . Диапазон изменения аргумента — от -4 до 4, шаг
приращения аргумента — 0,5.
Написать программу, которая выводит таблицу значений функции
у = x  2  x  1 . Диапазон изменения аргумента — от -4 до 4, шаг
приращения аргумента — 0,5.
Написать программу, которая выводит на экран таблицу
умножения, например, на 7.
Написать программу, которая выводит двоичное представление
введенного с клавиатуры десятичного целого числа в диапазоне от
0 до 255.
Написать программу, которая выводит на экран квадрат Пифагора
30
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
— таблицу умножения.
Напишите программу, которая вычисляет частичную сумму ряда
1—1/3+1/5—1/7+1/9—... и сравнивает полученное значение с π/4
(при суммировании достаточно большого количества членов этого
ряда, величина частичной суммы приближается к π/4).
Напишите программу приближенного вычисления интеграла
функции f (х) = 5х2 — х + 2 методом прямоугольников.
Напишите программу приближенного вычисления интеграла
методом трапеций.
Напишите программу, которая выводит на экран изображение
шахматной доски. Черные клетки отображать "звездочкой", белые
— пробелом.
Написать
программу,
которая
преобразует
введенное
пользователем десятичное число в двоичное.
Написать программу проверки знания таблицы умножения.
Программа должна вывести 10 примеров и выставить оценку: за 10
правильных ответов — "отлично", за 9 и 8 —"хорошо", за 7 и 6 —
"удовлетворительно", за 6 и менее — "плохо".
Написать программу проверки умения складывать и вычитать
числа в пределах 100. Программа должна вывести 10 примеров,
причем в каждом примере уменьшаемое должно быть больше или
равно вычитаемому, т. е. не допускается предлагать испытуемому
примеры с отрицательным результатом. Оценка выставляется по
следующему правилу: за 10 правильных ответов — "отлично", за 9
и 8 — хорошо", за 7 и 6 — "удовлетворительно", за 6 и менее —
"плохо".
Написать программу, выводящую на экран "электронные часы",
которые работают в течение, например, трех минут или до тех пор,
пока пользователь не нажмет любую клавишу.
Дано натуральное число n. Вычислить 2n.
Дано
натуральное
число
n.
Вычислить
2
2
2
(1+1/1 )*(1+1/2 )*…*(1+1/n ).
Дано
натуральное
число
n.
Вычислить
1/sin1+1/(sin1+sin2)+…+1/(sin1+…sin n).
Дано натуральное число n. Вычислить 2  2  ...  2 n корней.
Дано
натуральное
число
n.
Вычислить
cos1/sin1*(cos1+sin2)/(cos1+sin2)*…*(cos1+…+sin n)/(sin1+…sin n).
Дано
натуральное
число
n.
Вычислить
3  6  ...  3(n  1)  3n .
38.
39.
Даны действительное число а, натуральное число n. Вычислить an.
Даны действительное число а, натуральное число n. Вычислить
31
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
a(a+1)…(a+n-1).
Даны действительное число а, натуральное число n. Вычислить
1
1
1
.

 ... 
a a(a  1)
a(a  1)...(a  n)
Даны действительное число а, натуральное число n. Вычислить
1 1
1
1
 2  4  ...  2 n .
a a
a
a
Даны действительное число а, натуральное число n. Вычислить
a(a-n)(a-2n)…(a-n2).
Вычислить (1 + sin 0.1)(1 + sin 0.2). ..(1 + sin 10).
Даны действительные числа х, а, натуральное число n. Вычислить
x 3 x 5 x 7 x 9 x 11 x 13
x





3!
5!
7!
9! 11! 13!
Даны действительные числа х, а, натуральное число n. Вычислить
((. ..((x + а)2 + а)2 + ... + а)2 + а)2 + а n скобок.
Дано
действительное
число
х.
Вычислить
( x  2)( x  4)( x  8)...(x  64)
.
( x  1)( x  3)( x  7)...(x  63)
1
Дано действительное число а. Найти среди чисел 1, 1  ,
2
1 1
1   ,.... первое большее а.
2 3
1
1
Дано действительное число а. Найти 1   ...   a .
2
n
Даны натуральное n, действительное х. Вычислить sinx +sin2х+... +
sinnх.
Даны натуральное n, действительное х. Вычислить sinx +sinх2+... +
sinхn.
Даны натуральное n, действительное х. Вычислить sinx+sinsinx +
… + sinsin…sinx, n членов.
Даны действительные числа a, h, натуральное число n. Вычислить
f(a)+2f(a+h)+2f(a+2h)+…+2f(a+(n-1)h)+f(a+nh), где f(x)=(x2+1)cos2x.
Дано натуральное число n. Определить сколько цифр в числе n.
Дано натуральное число n. Определить чему равна сумма его цифр.
Дано натуральное число n. Найти первую цифру числа n.
Дано натуральное число n. Найти знакочередующуюся сумму цифр
числа n (пусть запись n в десятичной системе есть akak-1…a0; найти
ak-ak-1+…(-1)ka0).
Даны натуральные числа n, m. Получить сумму m последних цифр
числа n.
32
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
Дано натуральное число n. Выяснить, входит ли цифра 3 в запись
числа n2.
Дано натуральное число n. Поменять порядок цифр числа n на
обратный.
Дано натуральное число n. Переставить первую и последнюю
цифры числа n.
Дано натуральное число n. Приписать по единице в начало и в
конец записи числа n.
Даны натуральные числа n, m. Используя алгоритм Евклида, найти
наибольший общий делитель n и m.
Даны натуральные числа n, m. Найти наименьшее общее кратное n
и m.
Даны натуральные числа n, m. Найти такие натуральные р и q, не
имеющие общих делителей, что p/q = m/n.
Пусть a0=1; ak = kak-1 + 1/k, k=1,2, ... Дано натуральное число n.
Получить аn.
i 1
Пусть a1=a2=0, a3=1.5, ai= 2
ai-1-ai-2ai-3, i=4,5,… Дано натуральное
i 1
число n (n  4) . Получить аn.
Пусть x0 = c; x1=d, xk=qxk-1 +rxk-2+b, k = 2, 3, ...
Даны действительные q, r, b, с, d, натуральное n (n  2) . Получить
хn.
a
Пусть a0=a1=1, ai=ai-2+ ii11
i = 2, 3, . . . Найти произведение
2
a0a1…a14.
С точностью 10-5 вычислить х — положительный наименьший
корень уравнения tgx=x, используя метод деления отрезка
пополам.
Подсчитать k — количество цифр в десятичной записи целого
неотрицательного числа n.
Дано 100 вещественных чисел. Вычислить
разность между
максимальным и минимальным из них.
Дана непустая последовательность различных натуральных чисел,
за которой следует 0. Определить порядковый номер наименьшего
из них.
Даны целое n>0 и последовательность из n вещественных чисел,
среди которых есть хотя бы одно отрицательное число. Найти
величину наибольшего среди отрицательных чисел этой
последовательности.
Напечатать таблицу значений функций sinx и cosx на отрезке [0,1]
с шагом 0.1.
Вычислить s—сумму квадратов всех целых чисел, попадающих в
33
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
интервал (lnx,ex), x>1.
Вычислить k—количество точек с целочисленными координатами,
попадающих в круг радиуса R (R>0) с центром в начале координат.
Логической переменной р присвоить значение true, если целое n
(n>1)—простое число, и значение false иначе.
Дано 100 вещественных чисел. Определить, образуют ли они
возрастающую последовательность.
Дана последовательность из 70 целых чисел. Определить, со
скольких отрицательных чисел она начинается.
Определить k—количество натуральных трехзначных чисел, сумма
цифр которых равна n (1 1  27). Операции деления (/, div и mod)
не использовать.
Напечатать в возрастающем порядке все трехзначные числа, в
десятичной записи которых нет одинаковых цифр (операции
деления не использовать).
Логической переменной t присвоить значение true или false в
зависимости от того, можно или нет натуральное число n
представить в виде суммы трех полных квадратов.
Напечатать таблицу истинности для логической функции F=(A and
В) or not(B or С).
Даны натуральное n и вещественные числа x1, y1, x2, y2, … xn, yn.
Рассматривая пары xi, уi, как координаты точек на плоскости,
определить радиус наименьшего круга (с центром в начале
координат), внутрь которого попадают все эти точки.
Дано 80 вещественных чисел. Найти порядковый номер того из
них, которое наиболее близко к какому-нибудь целому числу.
Дано 100 целых чисел. Определить, сколько из них принимает
наибольшее значение.
Даны целое n>1 и вещественные числа x1, x2, ..., хn. Вычислить:
( xi  M ) 2
xi
.
, D
n 1
n
Дана непустая последовательность положительных вещественных
чисел x1, x2, ..., хn (n заранее не известно), за которыми следует
отрицательное число. Вычислить величину
nх1+(n—1)х2+ . . . +2хn-1 +хn.
Дана последовательность из 100 целых чисел. Определить
количество чисел в наиболее длинной подпоследовательности из
подряд идущих нулей.
Дано не менее трех различных натуральных чисел, за которыми
следует 0. Определить три наибольших числа среди них.
Дано 200 вещественных чисел. Определить, сколько из них больше
своих «соседей», т. е. предыдущего и последующего чисел.
M
88.
89.
90.
91.
34
92.
93.
94.
95.
96.
97.
98.
99.
Дана непустая последовательность ненулевых целых чисел, за
которой следует 0. Определить, сколько раз в этой
последовательности
меняется
знак.
(Например,
в
последовательности 1, —34, 8, 14, —5 знак меняется 3 раза.)
Даны целое n>2 и вещественные числа x1, y1, x2, y2, … xn, yn (xi <уi).
Рассматривая пары xi и уi как левые и правые концы отрезков на
одной и той же прямой, определить концы отрезка, являющегося
пересечением всех этих отрезков. Если такого отрезка нет, то
сообщить об этом.
Протабулировать функцию в заданном интервале с шагом 0,1.
[0;1]
0.1
e x  e x  2  0
Протабулировать функцию в заданном интервале с шагом 0,1.
[2;3]
0.1
3sin x  0.35x  3.8  0
Протабулировать функцию в заданном интервале с шагом 0,1.
x  2  sin( 1 / x)
[1.2;2]
0.1
Протабулировать функцию в заданном интервале с шагом 0,1.
1-x+sinx-ln(1+x)=0
[0;1.5]
0.1
Протабулировать функцию в заданном интервале с шагом 0,1.
x2-ln(1+x)-3=0
[2;3]
0.1
Протабулировать функцию в заданном интервале с шагом 0,1.
1
[0;0.85]
0.1
x
0
3  sin 3.6 x
100.
Протабулировать функцию в заданном интервале с шагом 0,1.
lnx-x+1.8=0
[2;3]
0.1
35
Repeat
№
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Условие задачи
Написать программу, вычисляющую сумму и среднее
арифметическое последовательности положительных чисел,
которые вводятся с клавиатуры.
Написать программу, которая определяет максимальное число из
введенной с клавиатуры последовательности положительных
чисел (длина последовательности не ограничена).
Написать программу, которая проверяет, является ли целое число,
введенное пользователем, простым.
Написать программу приближенного вычисления интеграла
методом трапеций. После каждого цикла программа должна
выводить вычисленное значение, количество и величину интервалов.
Написать программу, которая "задумывает" число в диапазоне от
1 до 10 и предлагает пользователю угадать число за 5 попыток.
Написать программу-таймер, которая по истечении заданного
промежутка времени выдает звуковой сигнал. Величина
временного интервала вводится с клавиатуры во время работы
программы.
Найти сумму цифр заданного натурального числа.
Определить число, получаемое выписыванием в обратном
порядке цифр заданного натурального числа.
Определить, является ли заданное натуральное число
палиндромом, т. е. таким, десятичная запись которого читается
одинаково слева направо и справа налево.
Дано натуральное k. Напечатать k-ю цифру последовательности
12345678910111213..., в которой выписаны подряд все
натуральные числа.
Дано натуральное k. Напечатать k-ю цифру последовательности
149162536..., в которой выписаны подряд квадраты всех
натуральных чисел.
Дано натуральное число n. Вычислить 3n.
Дано
натуральное
число
n.
Вычислить
2
2
2
(1+n/1 )*(1+n/2 )*…*(1+n/n ).
Дано
натуральное
число
n.
Вычислить
n/sin1+n/(sin1+sin2)+…+n/(sin1+…sin n).
Дано натуральное число n. Вычислить 3  3  ...  3 n корней.
Дано
натуральное
число
n.
Вычислить
sin1/cos1*(sin1+sin2)/(cos1+sin2)*…*(cos1+…+sin n)/(sin1+…sin
n).
36
17.
Дано
натуральное
число
n.
Вычислить
2  2  ...  2(n  1)  2n .
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Даны действительное число а, натуральное число n. Вычислить
(a+n)n.
Даны действительное число а, натуральное число n. Вычислить
a(a+1)…(a+n+1).
Даны действительное число а, натуральное число n. Вычислить
1
1
1
.

 ... 
a a(a  1)
a(a  1)...(a  n)
Даны действительное число а, натуральное число n. Вычислить
1 1
1
1
 2  4  ...  2 n .
a a
a
a
Даны действительное число а, натуральное число n. Вычислить
a+(a-n)+(a-2n)+…+(a-n2).
Вычислить (1 -sin 0.1)(1 - sin 0.2). ..(1 - sin 10).
Даны действительные числа х, а, натуральное число n. Вычислить
x 3 x 5 x 7 x 9 x11 x13
x





3! 5! 7! 9! 11! 13!
Даны действительные числа х, а, натуральное число n. Вычислить
((. ..((x + а)4 + а)4 + ... + а)4 + а)4 + а n скобок.
Дано
действительное
число
х.
Вычислить
( x  1)( x  2)( x  3)...(x  6)
.
( x  1)( x  3)( x  7)...(x  63)
1
Дано действительное число а. Найти среди чисел 1, 1  ,
2
1 1
1   ,.... второе большее а.
2 3
1
1
Дано действительное число а. Найти 1   ... 
 a.
2
n3
Даны натуральное n, действительное х. Вычислить sin3x
+sin23х+... + sinn3х.
Даны натуральное n, действительное х. Вычислить sin3x
+sin3х2+... + sin3хn.
Даны натуральное n, действительное х. Вычислить sin3x+sinsin3x
+ … + sinsin…sin3x, n членов.
Даны действительные числа a, h, натуральное число n. Вычислить
f(a)+2f(a+h)+2f(a+2h)+…+2f(a+(n-1)h)+f(a+nh), где f(x)=(x2-1)sin2x.
Дано натуральное число n. Определить сколько цифр в числе n*n.
Дано натуральное число n. Определить чему равна разность его
37
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
цифр.
Дано натуральное число n. Найти вторую цифру числа n.
Дано натуральное число n. Найти знакочередующее произведение
цифр числа n (пусть запись n в десятичной системе есть akak-1…a0;
найти ak-ak-1+…(-1)ka0).
Даны натуральные числа n, m. Получить разность m последних
цифр числа n.
Дано натуральное число n. Выяснить, входит ли цифра 3 в запись
числа n3.
Дано натуральное число n. Поменять порядок цифр числа n3 на
обратный.
Дано натуральное число n. Переставить первую и последнюю
цифры числа n3.
Дано натуральное число n. Приписать по единице в начало и в
конец записи числа n3.
Даны натуральные числа n, m. Используя алгоритм Евклида,
найти наибольший общий делитель m и n.
Даны натуральные числа n, m. Найти наименьшее общее кратное
n и m*m.
Даны натуральные числа n, m. Найти такие натуральные р и q, не
имеющие общих делителей, что p/q = n/m.
Пусть a0=1; ak = kak-1 + 1/k, k=1,2, ... Дано натуральное число n.
Получить а3n.
i 1
Пусть a1=a2=0, a3=1.5, ai= 2
ai-1-ai-2ai-3, i=4,5,… Дано
i 1
натуральное число n (n  4) . Получить а3n.
Пусть x0 = c; x1=d, xk=qxk-1 +rxk-2+b, k = 2, 3, ...
Даны действительные q, r, b, с, d, натуральное n (n  2) . Получить
х3n.
a
Пусть a0=a1=1, ai=ai-2+ ii11
i = 2, 3, . . . Найти произведение
2
a0a1…a24.
Протабулировать функцию в заданном интервале с шагом 0,1.
0.1x2-xlnx=0
[1;2]
0.1
Протабулировать функцию в заданном интервале с шагом 0,05.
x+cos(x0.52+2)=0
[0.5;1]
0.05
Протабулировать функцию в заданном интервале с шагом 0,1.
[0;1]
0.01
1 0,4 x -arcsinx=0
Протабулировать функцию в заданном интервале с шагом 0,1.
x2+10x-10=0
[0;1]
0.1
Протабулировать функцию в заданном интервале с шагом 0,15.
38
54.
55.
56.
57.
3x-4lnx-5=0
[2;4]
0.15
Найти решение уравнения cos 3x  sin 2x на промежутке
75  x  150  .
Найти сумму всех натуральных трехзначных чисел, которые при
делении на 5 дают остаток, равный 1.
Найти решение уравнения
на
cos( 2 x  630 )  sin( 4 x  540 )


промежутке 90  x  180 .
Найти сумму всех целых чисел, каждое из которых делится без
остатка на 6 и удовлетворяет условию  36  n  138.
58.
Найти решение уравнения
59.
Найти сумму всех натуральных чисел, каждое из которых кратно
11 и не превосходит по величине 1000.
Найти сумму всех натуральных двузначных чисел, каждое из
которых при делении на 3 дает остаток, равный 2.
Найти сумму всех натуральных чисел, кратных 3 и
удовлетворяющих условию 27  n  183.
Найти сумму всех натуральных трехзначных чисел, каждое из
которых кратно 7 и не превосходит 353.
Найти сумму всех натуральных двузначных чисел, каждое из
которых при делении на 4 дает остаток, равный 3.
Найти сумму всех целых чисел, каждое из которых делится без
остатка на 7 и удовлетворяет условию 126  k  154.
Найти сумму всех натуральных трехзначных чисел, каждое из
которых делится без остатка на 12.
Решить уравнение sin 8x  cos 2x  0 при 0   x  45.
Найти сумму всех натуральных двузначных чисел, которые при
делении на 5 дают остаток, равный 2.
Найдите все пары натуральных чисел, отношение которых
60.
61.
62.
63.
64.
65.
66.
67.
68.
sin 6 x
 1 при 170   x  200 .
sin 4 x
6
7
равно , а наименьшее общее кратное их равно 252.
69.
70.
71.
72.
73.
Найти разность между наибольшим и наименьшим корнями
уравнения sin 3x  sin 2x  sin x на (90°; 180°].
Решить уравнение sin 4 x  cos180   2 x  и указать его решения,
входящие в  90  ; 0 .
Найти число решений на интервале (0,  ) уравнения:
3
 4сtgx  0.
cos2 x
Найти число решений на интервале (0,  ) уравнения:
sin 3 x  cos 3 x  1  0.
Найти число решений на интервале (0,  ) уравнения


39
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
cos5x cos x  cos7 x cos5x.
Найти число решений на интервале (0,  ) уравнения:
sin 2 x sin x  5 sin x  sin 2 x  1/ 2.
6
Найти наименьшее значение функции y  | x |  x 3 на отрезке
4
[-7;0].
4
Найти наибольшее значение функции y  7 x 3  | x | на отрезке
3
[-1;1].
5
Найти наименьшее значение функции y  3
на
x  6 x 2  9 x  20
отрезке
[-10;5].
4
Найти наибольшее значение функции
y
 2 x3  3x 2  12 x  8
на отрезке [-6;3].
Сделать программу для вывода таблицы соответствия между
температурными шкалами Цельсия и Фаренгейта в интервале
температур от точки замерзания воды до точки ее кипения.
Пусть программа «загадает» число, а пользователь введет
предполагаемое значение. Если число угадано, программа
поздравит победителя, а если нет — попросит его повторить
попытку еще раз. Каждая безуспешная попытка снижает призовые
баллы. В самом начале игроку назначается 10 призовых баллов.
Необходимо написать программу, которая рассчитывает величину
вклада и выводит эту величину для каждого года до тех пор, пока
величина вклада не удвоится.
Определить, является ли заданное число совершенным.
Вводится произвольная последовательность целых чисел,
заканчивающаяся нулем. Найти наибольшее из всех чисел,
кратных трем.
Вводится произвольная последовательность целых чисел,
заканчивающаяся
нулем.
Определить,
сколько
раз
последовательность меняет знак.
Вводится произвольная последовательность целых чисел,
заканчивающаяся нулем. Найти два наименьших числа.
Проверить тождество 1 + 2 + 3 +...+ n = n * (n + 1) / 2
Проверить тождество 1 + 3 + 5 +...+ (2 * n - 1) = п2
Проверить тождество 12+ 22 + 32 +...+ n2 = n * (n + 1) * (2 * n +1) /
6
Проверить тождество 13+ 23 + 33 +...+ n3 = n2 * (n + 1)2 / 4
Проверить тождество 12+ 32 + 52 +...+ (2 * n - 1)2 = n * (4 * n2 - 1) /3
40
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
Проверить тождество 13+ 33 + 53 +...+ (2 * n - 1)3 - n2 (2 * n2 - 1).
Вычислите приближенное значение указанной бесконечной
суммы, задав точность ее вычисления:
1 + 1 / 22 + 1 / 32 + 1 / 42 +... (стремится к n2 /6)
Вычислите приближенное значение указанной бесконечной
суммы, задав точность ее вычисления:
1 / (1 * 2) + 1 / (2 * 3) + 1 / (3 * 4) +... (стремится к 1)
Вычислите приближенное значение указанной бесконечной
суммы, задав точность ее вычисления:
1 / (1 * 2 * 3) + 1 / (2 * 3 * 4) + 1 / (3 * 4 * 5) +... (стремится к ?)
Определить, являются ли два заданных числа взаимно простыми
(взаимно простые числа не имеют общих делителей, кроме
единицы).
Пусть даны числа a, b (а > 1). Получить все члены
последовательности а, а2, а3, ... меньшие b.
Пусть даны числа a, b (а > 1). Получить первый элемент
последовательности а, а2, а3, ... больший числа b.
Протабулировать функцию в заданном интервале с шагом 0,1.
[1;2]
0.1
0.4+arctg x -x=0
Протабулировать функцию в заданном интервале с шагом 0,1.
[0;1]
0.1
arccos x  1  0.3x3  0
Протабулировать функцию в заданном интервале с шагом 0,1.
2x-3lnx-3=0
[0.5;0.6]
0.01
41
While
№
1.
2.
3.
4.
5.
6.
7.
8.
9.
Условие задачи
Напишите программу, которая вычисляет я с заданной
пользователем точностью. Для этого воспользуйтесь тем, что
значение частичной суммы ряда 1-1/3+1/5-1/7+1/9-... при
суммировании
достаточно большого количества членов
приближается к π/4.
Написать программу, которая вычисляет наибольший общий
делитель двух целых чисел.
Дано натуральное k. Напечатать k-ю цифру последовательности
1123581321..., в которой выписаны подряд все числа Фибоначчи.
Дано натуральное число n. Вычислить 4n.
Дано
натуральное
число
n.
Вычислить
2
2
2
(n+1/1 )*(n+1/2 )*…*(n+1/n ).
Дано
натуральное
число
n.
Вычислить
n+1/sin1+1/(sin1+sin2)+…+1/(sin1+…sin n).
Дано натуральное число n. Вычислить 5  5  ...  5 n корней.
Дано
натуральное
число
n.
Вычислить
cos1*sin1+(cos1+sin2)(cos1+sin2)+…+(cos1+…+sin n)(sin1+…sin n).
Дано
натуральное
число
n.
Вычислить
4  12  ...  4(n  1)  4n .
10.
11.
12.
13.
14.
15.
16.
17.
Даны действительное число а, натуральное число n. Вычислить
an+1.
Даны действительное число а, натуральное число n. Вычислить
a2(a+1)2…(a+n)2.
Даны действительное число а, натуральное число n. Вычислить
1
1
1
.
*
* ... *
a a(a  1)
a(a  1)...(a  n)
Даны действительное число а, натуральное число n. Вычислить
1 1 1
1
* 2 * 4 * ... * 2 n .
a a a
a
Даны действительное число а, натуральное число n. Вычислить a(a-n)-(a-2n)-…-(a-n2).
Вычислить (1 + sin 0.1)(1 - sin 0.2). ..(1 + sin 10).
Даны действительные числа х, а, натуральное число n. Вычислить
x 3 x 5 x 7 x 9 x11 x13





3! 5! 7! 9! 11! 13!
Даны действительные числа х, а, натуральное число n. Вычислить
((. ..((x + а)3 + а)3 + ... + а)3 + а)3 + а n скобок.
42
18.
Дано
действительное
( x  2)( x  4)( x  8)...(x  64)
.
( x  1)( x  3)( x  7)...(x  63)
19.
Дано действительное число а. Найти среди чисел 1, 1 
1
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
число
х.
Вычислить
1
,
2
1 1
 ,.... первое меньше а.
2 3
1
1
 ...   a .
2!
n!
Даны натуральное n, действительное х. Вычислить sin2x +sin22х+...
+ sinn2х.
Даны натуральное n, действительное х. Вычислить sin2x +sin2х2+...
+ sin2хn.
Даны натуральное n, действительное х. Вычислить sin2x+sinsin2x +
… + sinsin…sin2x, n членов.
Даны действительные числа a, h, натуральное число n. Вычислить
f(a)+2f(a+h)+2f(a+2h)+…+2f(a+(n-1)h)+f(a+nh), где f(x)=(x2-1)tg2x.
Дано натуральное число n. Определить сколько цифр в числе n3.
Дано натуральное число n. Определить чему равно произведение
его цифр.
Дано натуральное число n. Найти последнюю цифру числа n2.
Дано натуральное число n. Найти знакочередующуюся разность
цифр числа n (пусть запись n в десятичной системе есть akak-1…a0;
найти ak-ak-1+…(-1)ka0).
Даны натуральные числа n, m. Получить произведение m
последних цифр числа n.
Дано натуральное число n. Выяснить, входит ли цифра 3 в запись
числа n4.
Дано натуральное число n. Поменять порядок цифр числа n2 на
обратный.
Дано натуральное число n. Переставить первую и последнюю
цифры числа n2.
Дано натуральное число n. Приписать по единице в начало и в
конец записи числа n2.
Даны натуральные числа n, m. Используя алгоритм Евклида, найти
наибольший общий делитель n/3 и m.
Даны натуральные числа n, m. Найти наименьшее общее кратное
n*n и m.
Даны натуральные числа n, m. Найти такие натуральные р и q, не
имеющие общих делителей, что p/q = m*n.
Пусть a0=1; ak = kak-1 + 1/k, k=1,2, ... Дано натуральное число n.
Дано действительное число а. Найти 1 
43
Получить а2n.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
i 1
ai-1-ai-2ai-3, i=4,5,… Дано натуральное
i2  1
число n (n  4) . Получить а2n.
Пусть x0 = c; x1=d, xk=qxk-1 +rxk-2+b, k = 2, 3, ...
Даны действительные q, r, b, с, d, натуральное n (n  2) . Получить
х2n.
a
Пусть a0=a1=1, ai=ai-2+ ii11
i = 2, 3, . . . Найти произведение
2
a0a1…a16.
Найти все целые корни уравнения ах3+bх2+cx+d=0, где а, b, с и d—
заданные целые числа, причем a  0 и d  0. (Замечание: целыми
корнями могут быть только положительные и отрицательные
делители коэффициента d.)
Определить, является ли заданное натуральное число
совершенным, т. е. равным сумме всех своих (положительных)
делителей, кроме самого этого числа (например, число 6
совершенно: 6=1+2+3).
Дано 10 натуральных чисел. Найти их наибольший общий
делитель.
Дано целое n>2. Напечатать все простые числа из диапазона [2, n].
Напечатать все простые делители заданного натурального числа.
Дана последовательность из не менее чем двух натуральных чисел,
за которой следует 0. Вычислить сумму тех из них, порядковые
номера которых— простые числа.
Дана непустая последовательность натуральных чисел, за которой
следует 0. Вычислить сумму тех из них, порядковые номера
которых—числа Фибоначчи.
Пусть даны числа a, b (а > 1). Получить все члены
последовательности а2, а4, а6, ... меньшие b.
Пусть даны числа a, b (а > 1). Получить первый элемент
последовательности а2, а4, а6, ... больший числа b.
Решить уравнение на указанном промежутке cos 3x  sin 2 x,
150   x  300 .
Протабулировать функцию в заданном интервале с шагом 0,1.
x  x ln( x  0.5)  0.5  0
[0;1]
0.1
Протабулировать функцию в заданном интервале с шагом 0,1.
[0;1]
0.1
x2 x  1  0
Протабулировать функцию в заданном интервале с шагом 0,1.
[0;1]
0.1
x3  2x 2  x  3  0
Протабулировать функцию в заданном интервале с шагом 0,1.
Пусть a1=a2=0, a3=1.5, ai=
44
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
[0;1]
0.1
x 3  12 x  2  0
Протабулировать функцию в заданном интервале с шагом 0,1.
5x  8 ln( x)  8  0
[0;1]
0.1
Протабулировать функцию в заданном интервале с шагом 0,1.
0.1
x 4  0.5x 3  4 x 2  3x  0.5  0 [0;1]
Протабулировать функцию в заданном интервале с шагом 0,1.
x  sin( x)  0.25  0
[0;1]
0.1
Протабулировать функцию в заданном интервале с шагом 0,1.
[1;2]
0.1
x 3  6 x 2  20  0
Протабулировать функцию в заданном интервале с шагом 0,1.
[1;2]
0.1
5x 3  10 x 2  5 x  1  0
Протабулировать функцию в заданном интервале с шагом 0,1.
[1;2]
0.1
0.1x 2  x ln( x)  0
Протабулировать функцию в заданном интервале с шагом 0,1.
[1;2]
0.1
e x  ln( x)  10 x  0
Протабулировать функцию в заданном интервале с шагом 0,1.
[1;2]
0.1
3x  14  e x  e  x  0
Протабулировать функцию в заданном интервале с шагом 0,1.
3x  4 ln( x)  5  0
[1;2]
0.1
Протабулировать функцию в заданном интервале с шагом 0,1.
[1;2]
0.1
e x  ex  2  0
Протабулировать функцию в заданном интервале с шагом 0,1.
[1;2]
0.1
3 ln 2 x  6 ln x  5  0
4
3
Найти наибольшее значение функции y ( x)  x 3  | x | на отрезке
[ 1,1;1,1] .
67.
Найти
наибольшее
и
наименьшее
значения
функции
f ( x)   x  7 | x | 12 на отрезке [4;3] .
Найти промежутки возрастания функции y  6 x 3  3 | x  1 | .
Найти наибольшее значение функции y | x 2  x  6 |  x 3 на
промежутке [4;4] .
Решить уравнение на указанном промежутке cos 3x  sin 2 x,
2
68.
69.
70.
75  x  150 .
71.
Найти число корней уравнения cos 2x  2 sin x  1 на интервале [3,2].
72.
Найти
73.
интервале [0,  ].
Найти число корней уравнения sin 3x  sin x  sin 2x на интервале
сумму
корней
уравнения
45
1  sin 3x  (sin
x
x
 cos ) 2
2
2
на
75.
[-  /2,  /2].
Найти число корней уравнения sin x sin 3x  sin 4x sin 8x  0
интервале
[0,  /2].
Найти число решений на интервале (0,  ) уравнения
76.
Найти число решений на интервале (0,  ) уравнения
77.
Найти число решений на интервале (0,  ) уравнения
74.
на
2 sin x sin(  / 2  x)  1.
3tg (  x)  tg ( / 2  x).
sin x  sin 2x  cos x  2 cos 2 x  0.
78.
79.
Найти число корней уравнения sin x sin 3x  sin 4x sin 8x  0
интервале
[0,  /2].
Найти число решений на интервале (0,  ) уравнения
на
1  sin x  cos x  cos x sin x  0.
80.
Найти
число
решений
на
интервале
(0,
)
уравнения:
решений
на
интервале
(0,
)
уравнения:
3
 4tgx  0.
cos 2 x
81.
Найти
число
sin x  cos x  0.
3
82.
3
Найти число решений на интервале (0,  ) уравнения
cos 3x cos x  cos 7 x cos 5x.
83.
Найти число решений на интервале (0,  ) уравнения:
84.
85.
Найти число решений на интервале (0,  ) уравнения tg3x  tgx  0.
Найти количество всех натуральных трехзначных чисел,
делящихся
на 7.
Найти сумму наибольшего и наименьшего значения функции
f ( x )  9 x  3x 2  x 3 на отрезке [-2;2].
Вывести формулу суммы n членов геометрической прогрессии.
Найти сумму наименьшего и наибольшего значений функции
y  x 3  3x 2  3x  2 на промежутке [2;2] .
Сколько имеется натуральных чисел, не превосходящих 1000,
которые при делении на 3 дают в остатке 2?
Вывести формулу суммы n членов арифметической прогрессии.
86.
87.
88.
89.
90.
91.
92.
sin 2 x sin x  0,5 sin x  sin 2 x  1 / 2.
x
1 x2
Найти наименьшее значение функции
y
[-1;).
Найти наименьшее
принимаемое
f ( x)  x 
4
( x  2) 2
из
значений,
на отрезке [0;5].
46
на промежутке
функцией
93.
Найти наибольшее значение функции
отрезке [-5;5].
94.
Решить уравнение
y  x 3  3x 2  72 x  90
на

cos 2 x  cos 8x  cos 6x  1 на промежутке [0; ].
2
3
Найти наибольшее значение функции
на
y  x  2x | x  2 |
95.
отрезке [0;3].
96.
Найти наименьшее значение функции
y
3
| x | x3
4
на отрезке
4
|x|
3
на отрезке
[-0,7;0,7].
97.
Найти наибольшее значение функции
y  x3 
[-1,1;1,1].
98.
Найти наименьшее значение функции
отрезке
99.
1
x  6 x  9 x  20
y
3
2
на
[-1;5].
Найти наибольшее значение функции
1
 2 x  3x 2  12 x  8
на
1
 2 x  15 x 2  36 x  34
на
y
3
отрезке [-3;3].
100.
Найти наибольшее значение функции
y
3
отрезке [1;4].
2.3 Примеры
While
*Заданное натуральное число N представить в виде суммы различных
чисел Фибоначчи.
Program fibiwhile(input, output),
Var N,Fl2,Fl1,Fl:integer;
Begin read(N);
write(N);
while N>=1 do
Begin
Fl2:=1;
Fl:=0;
Fl1:=1;
While Fl2<=N do
Begin
Fl2:=Fl1+Fl;
Fl:=Fl1;
Fl1:=Fl2
47
End;
N:=N-Fl;
Write(Fl)
End;
Writeln
End.
For
*Назовем шестизначное число “счастливым”, если оно у него сумма
первых трех цифр равна сумме последних трех цифр. Подсчитать число
“счастливых”, шестизначных чисел, у которых суммы трех цифр равны 13.
Program happy(output);
Var I,J,K,N : integer;
Begin
N:=0;
For I:=0 to 9 do
For J:=0 to 9 do
For K:=0 to 9 do
If I+J+K=13
Then
N:=N+1;
N:=sqr(N);
Writeln(N);
End (*happy*).
Repeat
Ввести первоначальную сумму вклада, учетную ставку процента и год
помещения денег в банк. Рассчитать величину вклада. Вывести год и
величину вклада. Повторять шаги 2 и 3 до тех пор, пока величина вклада
не удвоится.
Program rockafeller;
Uses Crt;
Var
Balance, balance_initial, rate, interest: Real;
Year: Word;
Begin
Clrscr;
Writeln (‘введите год помещения денег в банк’);
Readln (year);
Writeln (‘введите величину вклада’);
48
Readln (balance);
Writeln (‘введите ставку процента (0-100)’);
Readln (rate);
Rate:=rate/100;
Balance_initial:=balance;
Writeln (‘год вклад’);
Writeln (‘========’);
Repeat
Interest:=rate*balance;
Balance:=balance+interest;
Inc(year);
writeln (year:6, ‘ ‘, balance)
until balance > 2*balance_initial:
wruteln (‘нажмите <enter>’);
readln;
end.
49
3 Немного об алгоритмах
Алгоритм Кнута - Морриса - Пратта
Алгоритм Кнута-Морриса-Пратта (КМП) получает на вход слово
X=x[1]x[2]... x[n]
и просматривает его слева направо буква за буквой, заполняя при этом
массив натуральных чисел l[1]... l[n], где
l[i]=длина слова l(x[1]...х[i])
(функция l определена в предыдущем пункте). Словами: l[i] есть длина
наибольшего начала слова x[1]...x[i], одновременно являющегося его
концом.
Какое отношение все это имеет к поиску подслова?
Другими словами, как использовать алгоритм КМП для определения
того, является ли слово A подсловом слова B?
Решение. Применим алгоритм КМП к слову A#B, где # - специальная
буква, не встречающаяся ни в A, ни в B. Слово A является подсловом
слова B тогда и только тогда, когда среди чисел в массиве l будет число,
равное длине слова A.
Описать алгоритм заполнения таблицы l[1]...l[n].
Решение. Предположим, что первые i значений l[1]...l[i] уже найдены.
Мы читаем очередную букву слова (т.е. x[i+1]) и должны вычислить l[i+1].
Другими словами, нас интересуют начала Z слова
x[1]...x[i+1,
одновременно являющиеся его концами -из них нам надо брать самое
длинное. Откуда берутся эти начала? Каждое из них (не считая пустого)
получается из некоторого слова Z' приписыванием буквы x[i+1] . Слово Z'
является началом и
концом слова x[1]...x[i]. Однако не любое слово, являющееся началом и
концом слова x[1]...x[i], годится - надо, чтобы за ним следовала буква
x[i+1].
Получаем такой рецепт отыскания слова Z. Рассмотрим все начала
слова x[1]...x[i], являющиеся одновременно его концами. Из них выберем
подходящие - те, за которыми идет буква x[i+1]. Из подходящих выберем
самое длинное. Приписав в его конец х[i+1], получим искомое слово Z.
Теперь пора воспользоваться сделанными нами приготовлениями и
вспомнить, что все слова, являющиеся одновременно началами и концами
данного слова, можно получить повторными применениями к нему
функции l из предыдущего раздела.
Вот что получается:
50
i:=1; 1[1]:=0;
{таблица l[1]..l[i] заполнена правильно}
while i <> n do begin
len:= l[i]
{len - длина начала слова x[1]..x[i], которое является
его концом; все более длинные начала оказались
неподходящими}
while (x[len+1]<>х[i+1]) and (len>0) do begin
{начало не подходит, применяем к нему функцию l}
len:=l[len];
end;
{нашли подходящее или убедились в отсутствии}
if x[len+1]=x[i+1] do begin
{х[1]..x[len] - самое длинное подходящее начало}
l[i+1]:=len+1;
end else begin
{подходящих нет}
l[i+1]:= 0;
end;
i:=i+1;
end;
Доказать, что число действий в приведенном только что алгоритме не
превосходит Cn для некоторой константы C.
Решение. Это не вполне очевидно: обработка каждой очередной буквы
может потребовать многих итераций во внутреннем цикле. Однако каждая
такая итерация уменьшает len по крайней мере на 1, и в этом случае l[i+1]
окажется заметно меньше l[i]. С другой стороны, при увеличении i на
единицу величина l[i] может возрасти не более чем на 1, так что часто и
сильно убывать она не может - иначе убывание не будет скомпенсировано
возрастанием.
Более точно, можно записать неравенство
l[i+1]<l [i] - (число итераций на i-м шаге)+1
или
(число итераций на i-м шаге)<= l[i]-l[i+1]+1
Остается сложить эти неравенства по всем i и получить оценку
сверху для общего числа итераций.
Будем использовать
этот алгоритм, чтобы выяснить, является ли
слово X длины n подсловом слова Y длины m. (Как это делать с помощью
специального разделителя #, описано выше.) При этом число действий
будет не более C(n+m}, и используемая память тоже. Придумать, как
обойтись памятью не более Cn (что может быть существенно меньше, если
искомый образец короткий, а слово, в котором его ищут - длинное).
51
Решение. Применяем алгоритм КМП к слову А#В. При этом:
вычисление значений l[1],...,l [n] проводим для слова X длины n и
запоминаем эти значения. Дальше мы помним только значение l[i] для
текущего i - кроме него и кроме таблицы
l[1]...l[n], нам для вычислений ничего не нужно.
На практике слова X и Y могут не находиться подряд, поэтому
просмотр слова X и затем слова Y удобно оформить в виде разных циклов.
Это избавляет также от хлопот с разделителем.
Написать соответствующий
алгоритм (проверяющий, является ли
слово X=x[1]...x[n] подсловом слова Y=y[1]...y[m]
Решение. Сначала вычисляем таблицу l[1]...l[n]как раньше. Затем
пишем такую программу:
j:=0; len:=0;
{len - длина максимального качала слова X, одновременно
являющегося концом слова y[1]..j[j]}
while (len<>n) and (j<>m) do begin
while (x[len+1]<>у[j+1]) and (len>0) do begin
{начало не подходит, применяем к нему функцию l}
len: = l[len];
end;
{нашли подходящее или убедились в отсутствии}
if x[len+1]=y[j+1] do begin
{x[1]..x[len] - самое длинное подходящее начало}
len:=len+1;
end else begin
{подходящих нет}
len:=0;
end;
j:=j+1;
end;
{если len=n, слово X встретилось; иначе мы дошли до конца
слова Y, так и не встретив X}
Алгоритм Бойера – Мура
Этот алгоритм делает то, что на первый взгляд кажется невозможным: в
типичной ситуации он читает лишь небольшую часть всех букв слова, в
котором ищется заданный образец. Как так может быть? Идея проста.
Пусть, например, мы ищем образец abcd. Посмотрим на четвертую букву
слова: если, к примеру, это буква e, то нет никакой необходимости читать
первые три буквы. (В самом деле, в образце буквы e нет, поэтому он может
начаться не раньше пятой буквы.)
52
Мы приведем самый простой вариант этого алгоритма, который не
гарантирует быстрой работы во всех случаях. Пусть x[1]...х[n] - образец,
который надо искать. Для каждого символа s найдем самое правое его
вхождение в слово X, то есть наибольшее k, при котором х[k]=s. Эти
сведения будем хранить в массиве pos[s]; если символ s вовсе не
встречается, то нам будет удобно положить pos[s]=0 (мы увидим дальше,
почему).
Как заполнить массив pos?
Решение.
положить все pos[s] равными 0
for i:=1 to n do begin
pos[x[i]]:=i;
end;
В процессе поиска мы будем хранить в переменной last номер буквы в
слове, против которой стоит последняя буква образца. Вначале last=n
(длина образца), затем last постепенно увеличивается.
last:=n;
{все предыдущие положения образца уже проверены}
while last<= m do begin {слово не кончилось}
if x[m]<>y[last] then begin {последние буквы разные}
last:=last+(n-pos[y[last]]);
{n - pos[y[last]] - это минимальный сдвиг образца,
при котором напротив y[last] встанет такая же
буква в образце. Если такой буквы нет вообще,
то сдвигаем на всю длину образца}
end else begin
если нынешнее положение подходит, т.е. если
x[i]..х[n]=y[last-n+1]..y[last],
то сообщить о совпадении;
last:=last+1;
end;
end;
Знатоки рекомендуют проверку совпадения проводить справа налево,
т.е. начиная с последней буквы образца (в которой совпадение заведомо
есть). Можно также немного сэкономить, произведя вычитание заранее и
храня не pos[s], а n-pos[s],
т.е. число букв в образце справа от последнего вхождения буквы
Возможны разные модификации этого алгоритма. Например, можно
строку
last:=last+i
заменить на
last:=last+(n-u),
53
где u - координата второго справа вхождения буквы x[n] в образец.
Как проще всего учесть это в программе
Решение. При построении таблицы pos написать
for i:=1 to n-1 do...
(далее как раньше), а в основной программе вместо
last:=last+1
написать
last:=last+n-pos[y[last]];
Приведенный упрощенный вариант алгоритма Бойера-Мура в
некоторых случаях требует существенно больше n действий (число
действий порядка mn), проигрывая алгоритму Кнута-Морриса-Пратта.
Пример ситуации, в которой образец не входит в слово, но алгоритму
требуется порядка mn действий, чтобы это установить.
Решение. Пусть образец имеет вид baaa... aa, а само слово состоит
только из букв а. Тогда на каждом шаге несоответствие выясняется лишь в
последний момент.
Настоящий (не упрощенный) алгоритм Бойера-Мура гарантирует, что
число действий не превосходит C(m+n) в худшем случае. Он использует
идеи, близкие к идеям алгоритма Кнута-Морриса-Пратта. Представим
себе, что мы сравнивали образец со входным словом, идя справа налево.
При этом некоторый кусок Z (являющийся концом образца) совпал, а
затем обнаружилось различие: перед Z в образце стоит не то, что во
входном слове. Что можно сказать в этот момент о
входном слове? В нем обнаружен фрагмент, равный Z, а перед ним
стоит не та буква, что в образце. Эта информация может позволить
сдвинуть образец на несколько позиций вправо без риска пропустить его
вхождение. Эти сдвиги следует вычислить заранее для каждого конца Z
нашего образца. Как говорят знатоки, все это (вычисление таблицы
сдвигов и ее использование) можно уложить в C(m+ n) действий.
Алгоритм Рабина
Этот алгоритм основан на простой идее. Представим себе, что в слове
длины m мы ищем образец длины n. Вырежем окошечко размера n и будем
двигать его по входному слову. Нас интересует, не совпадает ли слово в
окошечке с заданным
образцом. Сравнивать по буквам долго. Вместо этого фиксируем
некоторую функцию, определенную на словах длины n. Если значения
этой функции на слове в окошечке и на образце различны, то совпадения
нет. Только если значения одинаковы, нужно проверять совпадение по
буквам.
54
В чем выигрыш при таком подходе. Казалось бы, ничего - ведь чтобы
вычислить значение функции на слове в окошечке, все равно нужно
прочесть все буквы этого слова. Так уж лучше их сразу сравнить с
образцом. Тем не менее выигрыш возможен, и вот за счет чего. При сдвиге
окошечка слово не меняется полностью, а лишь добавляется буква в конце
и убирается в начале. Хорошо бы, чтобы по этим данным можно было
рассчитать, как меняется функция.
Привести пример удобной для вычисления функции.
Решение. Заменим все буквы в слове и образце их номерами,
представляющими собой целые числа. Тогда удобной функцией является
сумма цифр. (При сдвиге окошечка нужно добавить новое число и вычесть
пропавшее.)
Для каждой функции существуют слова, к которым она применима
плохо. Зато другая функция в этом случае может работать хорошо.
Возникает идея: надо запасти много функций и в начале работы алгоритма
выбирать из них случайную. (Тогда враг, желающий подгадить нашему
алгоритму, не будет знать, с какой именно функцией ему бороться.)
Привести пример семейства удобных функций.
Решение. Выберем некоторое число p (желательно простое, смотри
далее) и некоторый вычет x по модулю p. Каждое слово длины n будем
рассматривать как последовательность целых чисел (заменив буквы
кодами). Эти числа будем рассматривать как коэффициенты многочлена
степени n-1 и вычислим значение этого многочлена по модулю p в точке x.
Это и будет одна из функций семейства (для каждой пары p и x
получается, таким образом, своя функция). Сдвиг окошка на 1
соответствует вычитанию старшего члена (хn-1 следует вычислить заранее),
умножению на x и добавлению свободного члена.
Следующее соображение говорит в пользу того, что совпадения не
слишком вероятны. Пусть число p фиксировано и к тому же простое, а X и
Y - два различных слова длины n. Тогда им соответствуют различные
многочлены (мы предполагаем, что коды всех букв различны - это
возможно, если p больше числа букв алфавита). Совпадение значений
функции означает, что в точке x эти два различных многочлена совпадают,
то есть их разность обращается в 0. Разность есть многочлен степени n-1 и
имеет не более n-1 корней. Таким образом, если и много меньше p, то
случайному x мало шансов попасть в неудачную точку.
Алгоритмы сортировки
Проблема упорядочивания данных с практической точки зрения:
достоинства и недостатки пяти различных методов сортировки.
Сортировка применяется во всех без исключения областях
программирования, будь то базы данных или математические программы.
55
Практически каждый алгоритм сортировки можно разбить на три части:
- сравнение, определяющее упорядоченность пары элементов;
- перестановку, меняющую местами пару элементов;
- собственно сортирующий алгоритм, который осуществляет сравнение
и перестановку элементов до тех пор, сока все элементы множества не
будут упорядочены.
Подобными свойствами обладают и те пять алгоритмов сортировки,
которые
рассмотрены ниже. Они отобраны из множества алгоритмов, потому
что,
во-первых, наиболее часто используются, а во-вторых, потому что
большинство остальных алгоритмов является различными модификациями
описанных здесь.
Метод пузырька.
( метод назван также обменной сортировкой с выбором) .
Идея этого метода отражена в его названии. Самые легкие элементы
массива "всплывают" наверх, самые "тяжелые" - тонут. Алгоритмически
это можно реализовать следующим образом. Мы будем просматривать
весь массив "снизу вверх" и менять стоящие рядом элементы в там случае,
если "нижний" элемент меньше, чем "верхний". Таким образом, мы
вытолкнем наверх самый "легкий” элемент всего массива. Теперь
повторим всю оперно для оставшихся неотсортироваными N-1 элементов
(т.е. для тех, которые лежат "ниже" первого. Как видно, алгоритм
достаточно прост, но, как иногда замечают, он является непревзойденным
в своей неэффективности. Немного более эффективным, но таким
наглядным является второй метод.
Сортировка выбором
На этот раз при просмотре мaccива мы будем искать наименьший
элемент, Сравнивая его с первым. Если такой элемент найден, поменяем
его местами с первым. Затем повторим эту операцию, но начнем не с
первого элемента, а со второго. И будем продолжать подобным образом,
пока не рассортируем весь массив.
Метод Шелла
Этот метод был предложен автором Donald Lewis Shеll в 1959 г.
Основная идея этого алгоритма заключается в том, чтобы в начале
ycтpанить массовый беспорядок в массиве, сравнивая далеко стоящие друг
от друга элементы. Как видно, интервал между сравниваемыми
56
элементами (gap) постепенно уменьшается до единицы. Это означает, что
на поздних стадиях сортировка сводится просто к перестановкам соседних
элементов (если, конечно, такие перестановки являются необходимыми).
Метод Хoopа
Этот метод, называемый также быстрой сортировкой(QuickSort), был
Разработан в 1962 г. (его разработал Charles Antony Richard Hoare).
Суть метода заключается в том, чтобы найти такой элемент
множества, подлежащего сортировке, который разобьет его на два
подмножества: те элементы, что меньше делящего элемента, и те, что не
меньше его. Эту идею можно реализовать многими способами.
3.1 Разветвляющиеся алгоритмы
Задачи этой темы посвящены использованию условных операторов;
следует в решениях обойтись без циклов и массивов. Применение операторов
ветвления позволяет использовать простейшую защиту программы от сбоев:
контроль входных данных и промежуточных результатов.
Пример. Факультету выделен стипендиальный фонд в размере/р./мес.
Результаты сессии таковы: п1 -«отличников», п2 «хорошистов», и3
«троечников». Повышенная стипендия (для отличников) составляет st p.,
обычная — s2 p.; задолжники стипендии лишаются. Сколько студентов
каждой категории могут получать стипендию и каков будет остаток фонда на
материальную'помощь малоимущим?
Решение можно записать в виде следующей Паскаль-программы:
Program Stipen (Input. Output);
var nl. n2. n3. kl. k2. k3, s. si. s2.
fond: Integer; begin
Write ('Каков размер фонда? '):
ReadLn (fond);
Write ('Сколько в категориях '."отл."."хор.''.нудовл.н? ');
ReadLn (nl. n2. пЗ);
Write ('Размер повышенной и нормальной ',стипендий: ');
ReadLn (si. s2): if fond > sl*nl then kl :- nl else kl :- fond div si: fond :=
fond - sl*kl: {остаток для остальных категорий} if fond > s2*n2 then k2 := n2
else k2 := fond div s2: fond :- fond - s2*k2;
{остаток для троечников} if fond > s2*n3 then k3 :- n3
else k3 :■» fond div s2;
fond :- fond - s2*k3; {остаток - резерв}
WriteLn ('Выдавать стипендию:');
WriteLn (kl." отличникам:');
57
if k2 > 0 then
WriteLn (k2." хорошистам;');
if k3 > 0 then
WriteLn (k3.' троечникам:');
WriteLn ('Резерв фонда составит '. fond,' рублей');
end.
3.2 Задачи
Свойства и виды треугольников (задачи 1-4)
1 Заданы три числа: а, Ь, с. Определить, могут ли
они быть сторонами треугольника, и если да, то опре
делить
его
тип:
равносторонний,
равнобедренный,
раз
носторонний.
Замечание. Условия существования треугольника: a<b + c; b<a+c;
c<a+b.
Нельзя исключать экстремальных случаев, когда одна (или несколько)
сторон равны нулю либо когда одно из неравенств переходит в равенство
(треугольник нулевой площади).
2 Треугольник задан длинами своих сторон: а, Ь, с.
Определить,
является
ли
он
тупоугольным,
прямоуголь
ным или остроугольным.
Замечание. Достаточно, используя теорему косинусов, найти знаки
косинусов внутренних углов треугольника, не вычисляя самих углов (они
могут быть нулевыми или развернутыми).
3 Треугольник задан координатами своих вершин на плоскости: А(ха,уа),
В(хь,уь), С(хс,ус). Определить, является он прямо-, остро- или тупоугольным.
Замечание. Не следует отбрасывать экстремальные случаи, когда вершины
треугольника совпадают или лежат на одной прямой. Например, треугольник с
нулевой стороной обладает свойством прямоугольного и имеет два прямых
угла!
4 Числа а, Ь, с тогда и только тогда являются сторонами треугольника,
когда существуют такие положительные х, у, z, что
а = х + у;
Свойства и виды четырехугольников (задачи 5, 6)
5 Четырехугольник ABCD задан координатами своих вершин на
плоскости: А(ха,уа), B(xb,yb), C(xc,yc), А(ха,уа), D{xd,yd). Проверить, является
ли он выпуклым.
58
Замечание. Есть несколько способов проверки выпуклости: анализ
линейных неравенств, задаваемых сторонами; разбиение четырехугольника на
треугольники со сравнением сумм их площадей и другие.
6 Четырехугольник ABCD задан координатами своих вершин на
плоскости: А(ха,уа), В(хь,уь), С(хс,ус), А(ха->Уа\ D{xd,yd). Определить тип
четырехугольника:
прямоугольник,
параллелограмм,
трапеция,
произвольный четырехугольник. Учесть погрешность вычислений.
7 Треугольник и круги Лежит ли заданный на плоскости
треугольник
ABC
в
области
пересечения
заданных
2
2
2
2
2
2
кругов: (х-в,) +(у-\) £г, ; (х-а2) +(у-Ь2) <г 7
8 Кирпич. Пройдет ли кирпич со сторонами а, Ь и с
сквозь
прямоугольное
отверстие
со
сторонами
г
и
5?
Стороны
отверстия
должны
быть
параллельны
граням
кирпича.
9 Шар и ромб. Может ли шар радиуса г пройти через ромбообразное отверстие с диагоналями pnq?
10 Посылка.
Можно
ли
коробку
размером
axbxc
упаковать
в
посылку
размером
rxsxt?
-«Углом»
укладывать нельзя.
11 Задача
жестянщика.
Можно
ли
из
круглой
заготовки
радиуса
г
вырезать
две
прямоугольные
пластин
ки с размерами axb и cxd?
12 Планировка.
Можно
ли
на
прямоугольном
участке застройки размером а на Ь метров разместить два
дома
размером
в
плане
рнадигиав
метров?
Дома
можно располагать только параллельно сторонам участка.
13 Две
окружности.
Проверить,
лежит
ли
окруж2
2
2
ность
{х-a,)
+(y-bl)
=r,
целиком
внутри
окружно2
2
2
сти (х - а2 ) + (у - Ъ2 ) = г2 или наоборот.
14 Треугольник и точка. Лежит ли точка М\хт, ут)
внутри
треугольника,
заданного
координатами
своих
вершин А{хл,ул), В(хв,ув), С(хс,ус) на плоскости
15 Общая
точка.
Два
отрезка
на
плоскости
заданы
координатами
своих
концов.
Определить,
имеют
ли
эти
отрезки общие точки.
Замечание. Необходимо рассмотреть различные случаи взаимной
ориентации отрезков: на одной прямой, на параллельных или
пересекающихся прямых.
59
16 Кратные пары. Среди заданных целых чисел k, I,
т найти пары кратных.
Замечание. Для устранения дополнительных источников погрешности
рекомендуется использовать аппарат векторной алгебры: коллинеарность,
равенство и ортогональность векторов — сторон четырехугольника.
Тестирование должно предусмотреть все такие ситуации.
17 Деление на 3. Как известно, число делится на 3
тогда и только тогда, когда сумма его цифр делится на 3.
Проверить
этот
признак
на
примере
заданного
трехзнач
ного числа.
., .
.
Замечание. Теоретическое утверждение о признаке делимости
предлагается проверить на примере любого вводимого числа. Признак
считается доказанным, но не будет лишним поиск для него контрпримеров.
18 Ориентация. Заданы координаты вершин треугольника ЛВС на
плоскости. Вывести их в порядке обхода по часовой стрелке (для проверки
достаточно рассмотреть знаки внутренних углов).
19
Привал.
Путник
двигался
tt
часов
со
скоростью
vv затем t2 часов — со скоростью v2 и t3 часов — со
скоростью v3. За какое время он одолел первую полови
ну пути, после чего запланировал привал?
20 Как успеть подешевле? Можно ехать на такси со
скоростью о, км/ч и оплатой р{ р./км либо идти пешком
со
скоростью
v2
км/ч
бесплатно.
Как
с
наименьшими
затратами преодолеть путь s за время t, если это возмож
но? Каковы эти затраты?
Тестирование. Рекомендуется рассмотреть «запредельные» случаи: когда
времени слишком мало, чтобы успеть даже на такси, либо слишком много, так
что и пешком можно с запасом успеть до отхода поезда.
21 (Задача о смесях. Имеются три раствора полезного вещества с
концентрациямиpvp2 ир3 каждый и стоимостью sv s2 и s3 соответственно.
Можно ли смешать их так, чтобы получить раствор с заданной
концентрацией р наименьшей стоимости?
Указание. Пусть а,, а2, а3 — долевые содержания растворов в смеси.
Тогда для получения заданной концентрации р необходимо: рха.х + р2а2 +
р3а} = р.
Кроме того, нужно учесть условие -«комплектности» смеси:
= 1; а,>0; а2>0; а3>0.
При этих условиях необходимо найти наименьшее значение линейной
функции: s = s,a, + ,s2a2 + s3a3 ~> ™in .
60
С учетом ограничений задача сводится к минимизации! линейной
функции одного переменного на отрезке, од-1 нако искомые выражения и
условия получаются до-j статочно громоздкими. Можно показать, что в
реше-1 нии будут участвовать не более двух растворов. Тогда] достаточно
среди вариантов:
а)а, =0; б)а2 =0; в)а3 =0.
выбрать оптимальный, и затем провести необходимые; расчеты.
22 Голодная зима. Суточный рацион коровы состав- \
ляет и кг сена, v кг силоса и w кг комбикорма. В хозяй
стве, содержащем стадо из k голов, осталось 5 центнеров
сена,
£тонн
силоса
и/мешков
комбикорма
по
50
кг.
Сколько
еще
дней
хозяйство
сможет
кормить
коров
по
полному
рациону?
Какой
из
кормов
кончится
раньше
других?
23 Факультеты.
В
Алтайском
госуниверситете
при
нято,
что
старшая
цифра
номера
студенческой
группы
означает номер факультета, средняя
— последнюю цифру
года
поступления,
младшая
—
порядковый
номер
груп
пы на
курсе. Продолжительность обучения
—
не более
б
лет
(магистратура).
Дан
номер
группы
студента
АГУ
и текущий год. Напечатать, в каком году он поступил и на
каком
факультете
учится.
Например,
гр.
432,1996
г.
—
факультет
математический,
год
поступления
1993.
Для
справки приведены номера факультетов:
1. исторический;
2. экономический;
3. юридический;
4. математический;
5. физический;
6. химический;
7. биологический;
8. филологический;
9. географический;
10. социологический.
Тестирование. Предусмотреть невозможные ситуации,
например, гр. 521, год 2001.
Шахматы и шашки. В задачах 2.24-2.27 позицию каждой шахматной
фигуры или шашки можно задавать в обычной нотации (например, (Л) или
парой чисел — координат фигуры (например, 4;7). При тестировании
61
полезно проверить алгоритм на недопустимых ситуациях, когда несколько
фигур стоят на одном поде.
24 (На шахматной доске стоят черный король и три белые ладьи (ладья
бьет по горизонтали и вертикали). Проверить, не находится ли король под
боем, а если есть угроза, то от кого именно.
25 На
шахматной
доске
стоят
черный
король
и
бе
лые ладья и слон (ладья бьет по горизонтали и вертика
ли, слон — по диагоналям). Проверить, есть ли угроза
королю и если есть, то от кого именно. Учесть возмож
ность защиты (например, ладья не бьет через слона).
26 На шахматной доске стоят три ферзя (ферзь бьет
по
вертикали,
горизонтали
и
диагоналям).
Найти
те
пары из них, которые угрожают друг другу.
27 В
шашечном
эндшпиле
остались
белая
дамка
и две черных пешки, позиции которых известны. Ход белых. Сможет ли дамка срубить одну или сразу обе пешки?
28 Вклад.
Банк
предлагает
3
вида
срочных
вкладов:
на 3 месяца под рх %, на 6 месяцев под р2 % и на год под
ръ %. Какой из вкладов наиболее выгоден для вкладчика?
29 Мой возраст. Для заданного 0 < п < 200, рассмат
риваемого как возраст человека, вывести фразу вида: «Мне 21 год», «Мне
32 года», «Мне 12 лет».
30 Отрезки
на
плоскости.
Найти
расстояние
между
двумя
произвольно
заданными
на
плоскости
отрезка
ми.
31 Встреча. Из пункта А в пункт В выехал велосипедист со скоростью
v0 км/час. Одновременно навстречу ему из пункта В двинулся «автостопом»
другой путник, s, м он двигался со скоростью о, м/час, s2 м — со скоростью
v0 км/час, Sj м — со скоростью v3 км/час. Через сколько часов после старта
и в какой точке путники встретились?
32 Треугольник
из
круга.
Из
круга
какого
наимень
шего
радиуса
можно
вырезать
треугольник
со
сторона
ми а, Ь, с?
Указание. Пусть с — большая из сторон треугольника. Если угол С —
тупой, сторона с совпадает с диаметром круга, и его радиус: r = с/2. В
противном случае имеем описанную окружность:
аЪс
r = —.
,
Цр(р-а)(р-Ь)(р-с) где р=* (а + Ь + с)/2 — полупериметр
треугольника.
62
Задачи
Записать условный оператор вида:
(а<=b, а>b) (а<b,а=b)
для вычисления у по формуле.
1
а)у =
b)у =
2
а)у =
b)у =
3
а)y =
b)у =
4
а)y =
b)у =
х + 3,если (х > 0);
4*х-1,если (х < 0).
- 5если (х < -5);
х, если(-5 <= х < 0);
3*х,если (0 <- х < 4);
6,если (х >= 4)
х - 4,если (х > 2);
2 -11 х, если {х <= -2).
2, если {х < -9),
- 2 + х, если{-9 <= х < 0);
4*х , если(0<=х<10;
24, если(х >= 10).
2-5*х, если(х < -1);
4*х,если(х >= -1).
- х, если(х < 0);
2х, если(0 <= х < 4);
4*х + 8,если(4 <= х <36);
16 * х + 24, если(х >= 36).
1,если(д; < 0);
-1,если{х > 0).
-х/4,если(х < -6);
- 2, если(-6 <= х < -1);
0, если(-\ <= х < 5);
2*х,если(х >= 5).
2, если(х < -2);
-2, если(х > 2).
b)у = 1,если(х < 0);
0,если(х = 0);
1,если(л:>0).
5
a)y =
6
а)y =
- х, если(х <= -18);
2, если(х > 0).
0, если(х < О);
b)y = 0, если(х = 0);
63
7
8
-10,если(х > 0);
а)y = x*х + 1,если(х > 0);
- х * х -1, если{х < 0).
2*х,если(х <= -2);
b)y = х * х, если(-2 < х <- 0);
16*х*х,если(0 < х <= 4)
a)у= 2*х,если(х < -6);
х * х - 2 * х, если(х >= 0).
b) y=
9
a)y =
b)y =
10
a)y=
b)y =
<
11
a)y =
b)y=
12
a)y =
b)y =
13
a)y =
х*х, если(х < -2);
2*х, если(-2<=х<0);
х - 4,если(0 <= х < 2);
-х, если(х >= 2).
2 * х +11, если(х < -3);
х-3, если(х > -1);
2*х + 6, если(х < 0);
2*х-6, если(0 <= х < 2);
- х, если(х >~ 2).
1 - х * х, если(х <= -5);
1 + х * х, если(х >= 5).
-2, если(х <= -2);
0, если(-2 <= х < 0);
2, если(х >= 2).
х - 6, если(х < -1);
2 * х +1, если(х >= -1).
-10, если(х < -5);
х, если(-5 <= х < -1);
6* х, если{-\ <= х < 1);
6 * х +16, если(x >= 1).
б*х +12, если(х <= 1);
х-4, если(х > 1).
-2, если(х < -5);
2, если(-5 <= х < 0);
2-х, если(0 <= х < 5);
х, если(х >= 5).
7 х, если(х > -2);
0, если(х < 2).
-1, если(х < -5);
64
14
15
16
17
18
19
20
b)у = х, если(-5 <= х < 5);
х*х, если(х > 5).
a)y = 4 + х, если(х < -2);
4-х, если{х >= -2).
4, если{х < -4);
b)y = 0, если{-4 <= х < 0);
- 2 * х, если(х >= 0).
a)y = 1 + х, если(х < 3);
1, если(х >= 3).
-1, если{х < 0);
b)y = 0, если(х = 0);
<
1, если(х > 0).
a)y = 2*х, если(х < 0);
- 2 * х,, если(х >= 0);
-4,если(х < -2);
b)y= -1 + х, если(-2 <- х < 2);
1 + х, если(2 <= х < 4);
4, если(х >= 4).
a)y = х, если(х < 0);
- х, если{х >= 0).
10, если(х < -4);
b)y= 5, если(-4 <= х < -2);
- 5, если(-2 <= х < 4);
0, если(х >= 4).
a)y = х* х, если(х < -1);
0, если(х >= -1).
1, если{х < 0);
b)y = ,х, если(0 <- х < 10);
l, eсли(x>=10).
a)y = х + 1, если(х < -3);
х -1, если(х >= -3).
2 * х + 1, если(х < -2);
b)y = 2 / х, если(-2 <= х < 0);
- х, если(х >=0).
a)y = 2, если{х <= 0);
\-2, если(х>0).
65
b)y = - х, если(х < О);
0, если(0 <=x < 3);
х, если{3 <= x < 10);
x* х, если(х >= 10).
21
a)y = 2*х, если(х < -2);
-2*х, если(х > 0).
b)y = -1,если{х < -2);
х,если(-2 <= х < 2);
1,если(х >= 2).
22
a)y = . -1, если(х < 0);
8* х, если(х >= 0).
b)y- х* х, если(х < 100);
5*х, если(100<=х<1);
5*х-10, если(х <= 1).
23
ay=
24
a)y = г2 + х, если(х < -8);
х-2, если(х >= 8).
-2, если(х < 1);
х, если(х >= 1).
b)y = х-5, если(х < 0);
5, если(0 <= х < 1);
5 - х, если(х >= 1).
b)y = - х, если(х <= -9);
2*;с, если(-9<х<=0);
х*х, если/(х > 0).
25
a)y = б1 х, если(х < 0);
х/6, если(х >= 0);
b)y = 10 + х, если(х <= -1);
-х, если(-1 < х <= 1);
0, если(х >1).
26
a)y=
b)y=
27
4 / х + 2, если(х < 0);
х/3, если(х >= 0);
5 – х, если(х < 0);
х-1, если(0 <= х < 3);
б*х, если(х >= 3);
a)y = 2*х, если(х < 0);
2*х-1,если(х>=0).
66
b)у=
- 6 + х, если(х < -2);
- х + 3, если(-2 <= х < 0);
21 х, если{х >= 0).
28
а)у = -1, если{х < 0);
-1, если(х >- 0).
b)y= 2 * х + 5, если(х < -4);
5 - х, если(-4 <= х < 0);
х/2,если(х >= 0).
29
а)у = х* х, если(х < 0);
2*х, если(х >= 0).
b)y= 3, если(х < -1);
2*х, если(-1<= х < 1);
х + 2, если(х > 1).
30
а)у =
31
а)у=
32
а)у =
33
а)y=
.х+ 1, если(.х < 0);
х -\, если(х > 0).
b)у = х, если(х < -4);
2 * (х -1), если(-4 <= х < 4);
0, если(л; >= 4);
-5, если(х < 0);
5*(х+2), если(х>=0).
b)у = - х, если{х < -1);
11 х, если(-1 <= х<0);
х + 9, если(х >= 0).
11* х, если(х < 5);
х*х, если(х >= 5).
b)у = 6, если(х < 0);
2, если(0 <= х < 5);
-2, если(х >= 5).
b)у =
34
a)у =
2 - х * х, если{х < -1);
- х, если(х >= -1).
4-х, если(х < 0);
х - 4, если(0 <= х < 2);
2/ х, если(х >= 2);
-х, если(х < -2);
х, если(х > 2).
67
b)у = -2, если(х < -1);
3*х, если(1<= х < 1);
x * x -11, если(1<= x <0);
x*x*х, если(х >= 0).
35
a)y = х - 2, если(х < 3);
х + 2, если(х >= 3).
b)y = - 5,если(х < -1);
х, если{-1 <= х < 1);
5, если(х >= 1).
36
a)y = 2*х, если(х < -2);
х-6, если(х > -2);
b)y = -2,если{х < -1);
х, если(-1 <= х < 1);
2*х + 2, если(х>=1).
37
a)y = 2 + х, если(х < 0);
х-2, если(х >= 0).
b)y = - 3, если(х <-3);
х * 3, если(-3 <= х < 0);
х* х, если(х >=0).
38
a)y = -1, если(х <5);
1, если(х >=5).
b)y = 7, если(х < 1);
3, если(1 <= х < 3);
1 + х, если(х >=3).
39
a)y = '-1 + 2*х, если(х<0);
- х + 1, если{х >= 0).
b)y = 4x, если{х < -2);
9 + х, если(-2<=х<2);
9*х, если(х>=2).
40
a)y = х, если(х <0);
-х, если(х > 0).
b)y = 2*х, если(х<0);
х* х, если(х = 0);
2*х, если(х>0).
41
a)y = 2 * х, если(х <-1);
х, если(х > 1).
68
b)y = 3- х, если(х <0);
x - 3, если(О <= x < 5);
3 * x - 3, если(x >= 5).
42
a)y = - 2,если(х < -4);
2,если(х >4).
b)y = - х, если{х <0);
0, если(х = 0); ;
x,если(х>0).
43
a)y = 8 – х, если(х <-2);
8 + х, если(х > -2).
b)y = 1/ х, если(х < 0);
2*х-1, если (0<=x<4);
х* х, если(х >= 4).
44
a)y = х*х + 2, если(х<-1);
х * х - 2, если(х >= -1);
b)y = х + 2, если(х <-2);
х, если(х = -2);
х - 2, если(х < -2).
45
a)y = 4/х, если(х <-1);
х/4, если(х>=-1).
b)y = 1/х, если(х < 0);
1, если{х = 0);
х, если(х > 0).
46
a)y = 2 + х, если(х<-4);
2-х, если(х>=-4).
b)y = 2* х , если{х <-1);
2 * х, если{-1 <= х <1);
х * х, если(х > 1).
47
a)y = -х, если(х <0);
х + 2, если(х >= 0).
b)y = - х + 2, если{х <0);
-х*2, если(0<=х <5);
х*х, если(х>= 5).
48
a)y = 2 + х, если(х <4);
2 - х, если(х >= 4).
69
b)y = 2 * х - 1, если(х < -1);
2 * х, если(-1 <= х <1);
х* х, если(х > 1).
49
а)y=
50
a)y=
51
2 * x, если(х < -2);
x * x, если(х >= -2).
b)y= -4, если(х < -2);
4, если(-2 <=х< 2);
х, если(х >= 2).
1, если{х <-1);
0, если(х>=-1).
b)y= х , если(-5 <х < 3);
х + 2, если(х >=-2)
a)y= б + х, если(х<-1);
х-6, если(х >= -1).
b)y= х, если(х<1),
х * х, если(0 <=х< 4);
х * х + 2, если(х >= 4).
1, если(х<0);
-1, если(х > 0).
b)y= х + 1, если(х < 0);
х- х, если(0 <= х < 10);
х*х, если(х >=10).
52
a)y=
53
a)y=
b)y=
54
a)y=
55
b)y=
a)y=
b)y=
56
a)y=
57
а)у =
2, если(х < -12);
2, если(х>=-12).
- 2, если(х < -1);
2 + х, если(-1 < х <1);
7, если(х<0);
7, если(х >= 0).
x - 2, если(х < 3);
5 + х, если(х <1);
5 -х, если(х >=1).
0, если(х =0);
1, если(х>0).
7, если(х < 7);
7 * (х + 2), если(х > 7).
2, если(х <= 4);
- 2, если(х >=4).
70
b)y = х + 1, если(х < -1);
х -1, если{-1<= х < 1);
х, если(х >= 1).
58
а)у =
-2, если(х < -2);
2, если(х > 2).
b)y = 1, если(х < 0);
0, если(x = 0);
1, если(х > 0).
59
а)у =
6 + х, если(х < -1);
х - 6, если(х >= -1).
b)y = х, если(х < 0);
х * х, если(0 <= х <4);
х * х + 2, если(х >= 4).
60
а)у =
-х, если(х < 0);
х + 2, если(х>=0).
b)у = - х + 2, если(х <0);
- х * 2, если(0 <= х < 5);
х*х, если(х >= 5).
61
а)у = 2 * х +11, если{х < -3);
х-3, если(х > -1);
b)у = 2*х + 6, если(х < 0);
х-6, если(0<=х<2);
1 — х, если(х >= 2).
62
а)у = 2, если(х< -12);
-2, если(х >= -12).
b)у = -2, если(х <-1);
- 2 + х, если(-1 <= х < 1);
х, если(х >=1).
63
a)y = - х, если(х <0);
х, если{х >0).
b)y = 1-х, если(х < -3);
1 + х, если(-3 <= х < 0);
х*х, если(х >=0).
64
a)y =
2 * х +11, если(х < -3);
х-3, если(х > -1);
71
b)y = 2*х + 6, если(х < 0);
2*х-6, если(0<=х<2);
-х, если(х >= 2).
65
66
a)y = х, если(х < 0);
х + 2, если(х >0) .
b)y = 2 + х, если(х < 9);
2 - х, если(х > 9).
a)y = х - 5,если(х<-1);
[5 5*х + 1,если(х>-1).
b)y = -2,если(х <-1);
- 2 + х, если(-1 <= х <1);
х, если(х >= 1).
67
a)y = -2,если(х<0);
2, если(х>=0);
b)y = -х, если(х < -3);
х + 9, если(-3, = х < 3);
х *9, если(х >= 3)
68
а)у = х +1 ,если(х< 1);
х + 2/х, если{х > 1).
B)У= х - 2, если(х < 3);
х + 2, если(3 <= х < 9);
х*2, если(х>= 9).
69
а)у = х - 2,если{х < 3);
х + 2,если(х >- 3).
b)у = -5, если(х < -1);
х, если(-1 <= х < 1);
5, если(х >= 1).
70
а)у = 3 + х, если(х < -5);
3* х, если(х >= -5).
b)у = х, если(х < 0);
х + 2, если(0 <= х < 12);
х* 2+1, если(х>= 12).
71
а)у = 2*х, если(х < 0);
1, если{х = 0);
2*х-, если(х > 0).
b)у = х, если(х < 5);
х-6, если(х > 15).
72
72
а)у = 1, если{х < -1);
1-2/х, если(-1<=х<0);
х/9 + 2, если(х>=0).
b)у = 9, если(х < 2);
9*х, если(х>=2).
73
74
а)у =
2 + х, если(х < -1);
х-2, если(-1 < х < 1);
2 + 2/х, если(х>1).
b)y=
-1,если(х < 0);
х-1,если(х > 0).
2 - х, если(х < -11);
2*х, если(-11,= х < 3);
х* х, если(х >= -3).
a)y=
b)y = 7, если(х < 1);
7*х, если(1 <x <10);
7* x* х, если(х >= 10).
75
a)y = -3,если(х < -1);
3,если(х > 1).
b)y = х-5, если(х < -7);
х*х-5*х, если(-7 <= х < 7);
х*х + 15/х, если(х >= 7).
76
a)y = 1 + х, если(х < -25);
1 + х * х, если(х >= -25).
b)y = - х + 1, если(х < -1);
-х*х, если(-\ <= х < 1);
1 + х * х, если{х >= 1).
77
a)y = 1, если{х < 9);
х, если(х >=9).
b)y = 7-7/ х, если(х < -6);
х/7 + 7, если(-6 <= х < 6);
7 * х, если(х >= 6).
78
a)y =
-5, если(х < 4);
5* х, если(х >= 4).
b)y = х +1, если(х < 0);
100, если(х = 0);
х-1, если(х > 0).
73
79
a)y = 2, если(х<-9);
- 2 + х, если(х >= -9).
b)y = х*(1 — х), если{х <= 0);
1-х, если(0 < х < 15);
0, если(х >= 15).
80
a)y = 1, если(х < -1);
l - х * х, если(х >- 1).
b)y = 2 + х, если(х < 0);
2 + х*х, если(0<=х<10);
х*х*х, если(х >=10).
81
a)y = -5, если(х < -2);
5, если(х >= 2);
b) y= х + 2, если(х < -1);
х * х + 1,если(-1 <- х < 1);
2*х +1, если(х > 1).
Используя составной оператор , упростить фрагменты программ .
Задание №
1
2
3
4
Формулы
If a>b then c:=l;
If a>b then d:=2;
If a<=b then c:=3;
If a<=b then d: =4.
If a>b then c:=1;
If a>b then d:=2;
If a<b then c:=-3;
If a<=b then d:=4.
If a>b then c:=l;
If a>b then d:=2;
If a>b then c:=3;
If a<=b then d:4.
If a>b then c:=l;
If a>b then d:=2;
If a>b then c:=3;
If a<b then d:=4.
74
5
6
7
8
9
10
11
12
13
14
If a>b then c:=l;
If a>b then d:=2;
If a>-b then c:=3;
If a<b then d:=4.
If i>b then c:=l;
If a>b then d:=2;
If a<b then c:=3;
If a>b then d:=4.
If a>b then c: =1;
If a>b then d:=-2;
If a<b then c:=3;
If a>=b then d:=4.
Ifa>bthenc:=l;
Ifa>bthend:-2;
Ifa<=bthenc:=3;
Ifa>bthend:=4.
If a>b then c:=l;
If a>b then d:=2;
If a<=b then c: =3;
If a>b then d: =4.
If a>b then c:=1;
If a>b then d:=2;
If a<=b then c:=3;
If a<b then d:=4.
If a>b then c:=l;
If a>b then d:=2;
If a<b then c:=3;
If a<b then d:=4.
If a>b then c;=l;
If a<b then d:=2;
If a<=b then c:=3;
If a<=b then d:=4.
If a>=b then c:=l;
If a<b then d:=2;
If a<=b then c:=3;
If a<=b then d:=4.
If a>=b then c:=l;
If a<=b then d: =2;
If a<=b then c:=3;
If a<=b then d:=4.
75
15
16
17
18
19
20
21
22
23
24
If a>b then c:=l;
If a<=b then d:=2;
If a<=b then c:=3;
If a<=b then d: =4.
If a<b then c:=l;
If a>b then d:=2;
If a<=b then c:=3;
If a<=b then d:=4.
If a<b then c:=l;
If a>-b then d:=2;
If a<=b then c:=3;
If a<=b then d:=4.
If a<=b then c:=l;
If a>b then d:=2;
If a<=b then c:=3;
If a<=bt hen d:=4.
If a<=b then c:=l;
If a<=b then d:=2;
If a<=b then c:=3;
If a<=b then d: =4.
If a>b then c:=1;
If a<b then d:=2;
If a<=b then c:=3;
If a<b then d:=4.
If a>b then c:=1;
If a<b then d:=2;
If a<=b then c:=3;
If a>b then d:=4.
If a>b then c:=l;
If a<b then d:=2;
If a<=b then c:=3;
If a>=b then d:=4.
If a>b then c:=1;
If a<b then d:=2;
If a<b then c:=3;
If a>b then d:=4.
If a>b then c:=l;
If a<b then d:=2;
If a<b then c:=3;
If a>=b then d:=4.
76
25
26
27
28
29
32
33
34
35
36
If a>b then c: =1;
If a<b then d:=2;
If a<b then c:=3;
If a<=b then d: =4.
If a>b then c:=l;
If a<b then d:=2;
If a<b then c:=3;
If a<b then d:=4.
If a>b then c:=l;
If a<b then d:=2;
If a>b then c:=3;
If a<=b then d:=4.
If a>b then c: =1;
If a<b then d:=2;
If a>=b then c:=3;
If a<=b then d:=4.
If a>b then c:=l;
If a<b then d:=2;
If a>b then c:=3;
If a<b then d:=4.
If a>b then c:=l;
If a<b then d:=2;
If a>b then c:=3;
If a>b then d:=4.
If a>b then c:=l;
If a<b then d:=2;
If a>b then c:=3;
If a>=b then d: =4.
If a>b then c:=l;
If a<b then d:=2;
If a>=b then c:=3;
If a>b then d:=4.
If a<b then c:=l;
If a<b then d:=2;
If a<=b then c:=3;
If a<b then d:=4.
If a<b then c:=l;
If a<b then d:=2;
If a<=b then c:=3;
If a>b then d:=4.
77
37
38
39
40
41
42
43
44
45
46
If a<b then c:=l;
If a<b then d:=2;
If a<=b then c:=3;
If a>=b then d:=4.
If a<b then c:=l;
If a<b then d:=2;
If a<b then c:=3;
If a>b then d:=4.
If a<b then c:=l;
If a<b then d:=2;
If a<b then c:=3;
If a>=b then d:=4.
If a<b then c: =1;
If a<b then d:=2;
If a<b then c:=3;
If a<=b then d:=4.
If a<b then c:=l;
If a<b then d:=2;
If a<b then c:=3;
If a<b then d:=4.
If a<b then c:=l;
If a<b then d:=2;
If a>b then c:=3;
If a<=b then d:=4.
If a<b then c:=l;
If a<b then d:=2;
If a>=b then c:=3;
If a<=b then d:=4.
If a<b then c:=l;
If a<b then d:=2;
If a>b then c:=3;
If a<b then d:=4.
If a<b then c:=l;
If a<b then d:=2;
If a>=b then c:=3;
If a>=b then d:=4.
If a<b then c:=l;
If a<b then d:=2;
If a>=b then c:=3;
If a<b then d:=4.
78
47
48
49
50
51
52
53
54
55
56
If a<b then c:=l;
If a<b then d:=2;
If a>b then c:=3;
If a>b then d:=4.
If a<b then c:=l;
If a<b then d:-2;
If a>b then c:=3;
If a>=b then d:=4.
If a<b then c: =1;
If a<b then d:=2;
If a>=b then с: =3;
If a>b then d:=4.
If a<b then c:=l;
If a>b then d:=2;
If a<=b then c:=3;
If a<b then d:=4.
If a<b then c: =1;
If a>b then d:=2;
If a<=b then c:=3;
If a>b then d:=4.
If a<b then c: =1;
If a>b then d:=2;
If a<=b then c:-3;
If a>=b then d:=4.
If a<b then c:=l;
If a>b then d:=2;
If a<b then c:=3;
If a>=b then d:=4.
If a<b then c:=l;
If a>b then d:=2;
If a<b then c:=3;
If a<=b then d:=4.
If a<b then c:=l;
If a>b then d:=2;
If a<b then c:=3;
If a<b then d:=4.
If a<b then c:=l;
If a>b then d:=2;
If a>b then c:=3;
If a<=b then d:=4.
79
57
58
59
60
61
62
63
64
65
66
If a<b then c:=l;
If a>b then d:=2;
If a>=b then c:=3;
If a<=b then d:=4.
If a<b then c: =1;
If a>b then d:=2;
If a>b then c:=3;
If a<b then d:=4.
If a<b then c:=l;
If a>b then d:=2;
If a>=b then c:=3;
If a>=b then d:-4.
If a<b then c:=l;
If a>b then d: =2;
If a>=b then c:=3;
If a<b then d:=4.
If a<b then c:=l;
If a>b then d:=2;
If a>b then c:=3;
If a>b then d:=4.
If a<b then c: =1;
If a>b then d:=2;
If a>b then c: =3;
If a>=b then d:-4.
If a<b then c:=l;
If a>b then d:=2;
If a>=b then c:=3;
If a>b then d: =4.
If a<=b then c:=1;
If a<b then d:=2;
If a<=b then c:=3;
If a<b then d:=4.
If a<=b then c: =1;
If a<b then d: =2;
If a<=b then c:=3;
If a>b then d:=4.
If a<=b then c:=1;
If a<b then d:=2;
If a<=b then c:=3;
If a>=b then d:=4.
80
67
68
69
70
71
72
73
74
75
76
If a<=b then c:=l;
If a<b then d: -2;
If a<b then c:=3;
If a>b then d:=4.
If a<=b then c:=1;
If a<b then d:=2;
If a<b then c:=3;
If a>=b then d:=4.
If a<=b then c:=l;
If a<b then d:=2;
If a<b then c:=3;
If a<=b then d:=4.
If a<=bthen c:=1;
If a<b then d:=2;
If a<b then c:=3;
If a<b then d:=4.
If a<=b then c:=l;
If a<b then d:=2;
If a>b then c:=3;
If a<=b then d:=4.
If a<=b then c:=l;
If a<b then d:=2;
If a>=bthen c:=3;
If a<=b then d:=4.
If a<=b then c:=l;
If a<b then d:=2;
If a>b then c:=3;
If a<b then d:=4.
If a<=bthen c:=l;
If a<b then d:=2;
If a>=b then c:=3;
If a>=b thend: =4.
If a<=b then c:=l;
If a<b then d:=2;
If a>=b then c:=3;
If a<b then d:=4.
If a<=b then c:=l;
If a<b then d:=2;
If a>b then c:=3; If
a>b then d:=4.
81
77
78
79
80
81
82
83
84
85
86
If a<=b then c:=l;
If a<b then d:=2;
If a>b then c:=3; If
a>=b then d:=4.
If a<=b then c:=l;
If a<b then d:=2;
If a>=b then с:=3;
If a>b then d:=4.
Ifa<b then c:=1;
If a<=b then d:=2;
If a<=b then c:=3;
If a<b then d:=4.
If a<b then c:=l;
If a<=b then d:=2;
If a<=b then c:=3;
If a>b then d:=4.
If a<b then c:=l;
If a<=b then d:=2; If
a<=b then c:=3;
If a>=b then d:=4.
If a<b then c:=l;
If a<=b then d:=2; If
a<b then c:=3;
If a>b then d:=4.
If a<b then c:=l;
If a<=b then d:=2; If
a<b then c:=3;
If a>=b then d:=4.
If a<b then c:=l;
If a<=b then d:=2;
If a<b then c:=3;
If a<=b then d:=4.
If a<b then c:=1;
If a<=b then d:=2; If
a<b then c:=3;
If a<b then d:=4.
If a<b then c:=l;
If a<=b then d: =2;
If a>b then c:=3;
If a<=b then d:=4.
82
87
88
89
90
91
92
93
94
95
96
If a<b then c:=l;
If a<=b then d:=2;
If a>=b then c:=3;
If a<=b then d: =4.
If a<b then c:=l;
If a<=b then d:=2;
If a>b then c:=3;
If a<b then d:=4.
If a<b then c:=l;
If a<=b then d:=2;
If a>=b then c:=3;
If a>=b then d:=4.
If a<b then c:=l;
If a<=b then d:=2; If
a>b then c:=3;
If a<b then d:=4.
If a<b then c:=l;
If a<=b then d:=2; If
a>b then c:=3;
If a>b then d:=4.
If a<b then c:=l;
If a<=b then d:=2;
If a>b then с: =3;
If a>=b then d:=4.
If a<b then c:=l;
If a<=b then d:=2; If
a>=b then c:=3;
If a>b then d:=4.
If a>=b then c:=l;
If a<b then d:=2;
If a<=b then c:=3;
If a<bt hen d: =4.
If a>=b then c:=l;
If a<b then d:=2;
If a<=b then c:=3; If
a>b then d:=4.
If a>=b then c:=l;
If a<b then d:=2;
If a<=bt hen c:=3; If
a>=b then d:=4.
83
97
98
If a>=b then c:=l;
If a<b then d:=2;
If a<b then c:=3;
If a>b then d: =4.
If a>=b then c:=l;
If a<b then d:=2;
If a>b then c:=3;
If a>=b then d:=4.
Каким будет значение переменной а после выполнения фрагмента
программы с составным оператором?
Задание №
Формулы
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
а:=3 if a<4then begin a:=a+2; a:=a+3 end;
а:=1 if a<4 then begin a:=a+2;a:=a+3 end;
а:=2 if a<4 then begin a:=a+2;a:=a+3 end;
а:=-1 if a<4 then begin a:=a+2;a:=a+3 end;
а: = -2 if a<4 then begin a:=a+2;a:=a+3 end;
а:=-3 if a<4 then begin a:=a+2;a:=a+3 end;
а:=-4 if a<4 then begin a:=a+2;a:=a+3 end;
а:=-5 if a<4 then begin a:=a+2;a:=a+3 end;
а:=-б if a<6 then begin a:=a+2;a:=a+3 end;
a:=3 if a<6 then begin a:=a+2 ;a:=a+3 end;
a:=-3 if a<6 then begin a:=a+2;a:=a+3 end;
a:=-l if a<6 then begin a:=a+2;a:=a+3 end;
a:=l if a<6 then begin a:=a+2;a:=a+3 end;
a:=-2 if a<6 then begin a:=a+2;a:=a+3 end;
a:=2 if a<6 then begin a:=a+2;a:=a+3 end;
a:=-4 if a<6 then begin a:=a+2;a:=a+3 end;
a:=4 if a<6 then begin a:=a+2;a:=a+3 end;
a:=5 if a<6 then begin a:=a+2;a:=a+3 end;
a: =6 if a<6 then begin a:=a+2;a:=a+3 end;
a:=5 if a>4 then begin a:=a+2;a:=a+3 end;
a: =6 if a>4 then begin a:=a+2;a:=a+3 end;
a:=7 if a>4 then begin a:=a+2;a:=a+3 end;
a:=8 if a>4 then begin a:=a+2;a:=a+3 end;
a:=9 if a>4 then begin a:=a+2;a:=a+3 end;
a:=10 if a>4 then begin a:=a+2;a:=a+3 end;
84
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
a:=ll if a>4 then begin a:=a+2;a:=a+3 end;
a:=12 if a>4 then begin a:=a+2;a:=a+3 end;
a:=5 if a>4 then begin a:=a+l;a:=a+3 end;
a:=5 if a>4 then begin a:=a+3;a:=a+3 end;
a:=5 if a>4 then begin a:=a+2;a:=a+l end;
a:=5 if a>4 then begin a:=a+3;a:=a+2 end;
a:=5 if a>4 then begin a:=a+2;a:=a+2 end;
a:=5 if a>4 then begin a:=a+3;a:=a+l end;
a:=3 if a<4 then begin a:=a+3;a:=a+3 end;
a:=3 if a<4 then begin a:=a+l;a:=a+3 end;
a:=3 if a<4 then begin a:=a+3;a:=a+2 end;
a:=3 if a<4 then begin a:=a+3;a:=a+l end;
a:=3 if a<4 then begin a:=a+l;a:=a+l end;
a:=3 if a<4 then begin a:=a+l;a:=a+2 end;
a:=3 if a<4 then begin a:=a+4;a:=a+3 end;
a:=3 if a<4 then begin a:=a+4;a:=a+l end;
a: =3 if a<4 then begin a:=a+4;a:=a+2 end;
a:=3 if a<4 then begin a:=a+4;a:=a+4 end;
a:=3 if a<4 then begin a:=a+l;a:=a+4 end;
a: =3 if a<4 then begin a:=a+2;a:=a+4 end;
a:=3 if a<4 then begin a:=a+3;a:=a+4 end;
a:=3 if a<4 then begin a:=a+5;a:=a+l end;
a:=3 if a<4 then begin a:=a+5;a:=a+2 end;
a:=3 if a<4 then begin a:=a+5;a:=a+3 end;
a:=3 if a<4 then begin a:=a+5;a:=a+4 end;
a:=3 if a<4 then begin a:=a+5;a:=a+5 end;
a:=3 if a<4 then begin a:=a+l;a:=a+5 end;
a:=3 if a<4 then begin a:=a+2;a:=a+5 end;
a:=3 if a<4 then begin a:=a+3;a:=a+5 end;
a:=3 if a<4 then begin a:=a+4;a:=a+5 end;
a:=3 if a<4 then begin a:=a+5;a:=a+5 end;
a:=4 if a>3 then begin a:=a+2;a:=a+3 end;
a: =5 if a>3 then begin a:=a+2;a:=a+3 end;
a: =6 if a>3 then begin a:=a+2;a:=a+3 end;
a:=7 if a>3 then begin a:=a+2;a:=a+3 end;
a:=8 if a>3 then begin a:=a+2;a:=a+3 end;
a:=9 if a>3 then begin a:=a+2;a:=a+3 end;
a: =4 if a>3 then begin a:=a+l;a:=a+3 end;
a: =4 if a>3 then begin a:=a+2;a:=a+2 end;
85
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
a:=4 if a>3 then begin a:=a+2;a:=a+l end;
a:=4 if a>3 then begin a:=a+2;a:=a+4 end;
a:=4 if a>3 then begin a:=a+2;a:=a+5 end;
a:=4 if a>3 then begin a:=a+l;a:=a+2 end;
a:=4 if a>3 then begin a:=a+l;a:=a+4 end;
a: =4 if a>3 then begin a:=a+l;a:=a+5 end;
a:=5 if a>3 then begin a:=a+l;a:=a+l end;
a:=5 if a>3 then begin a:=a+l;a:=a+2 end;
a:=5 if a>3 then begin a:=a+l;a:=a+3 end;
a:=5 if a>3 then begin a:=a+l;a:=a+4 end;
a:=5 if a>3 then begin a:=a+l;a:=a+5 end;
a:=5 if a>3 then begin a:=a+2 ;a:=a+5 end;
a:=5 if a>3 then begin a:=a+3;a:=a+5 end;
a:=5 if a>3 then begin a:=a+4;a:=a+5 end;
a:=5 if a>3 then begin a:=a+5;a:=a+5 end;
a: =6 if a>3 then begin a:=a+2;a:=a+3 end;
a: =6 if a>3 then begin a:=a+l;a:=a+l end;
a: =6 if a>3 then begin a:=a+l;a:=a+2 end;
a: =6 if a>3 then begin a:=a+l;a:=a+3 end;
a: =6 if a>3 then begin a:=a+l;a:=a+4 end;
a: =6 if a>3 then begin a:=a+l;a:=a+5 end;
a: =6 if a>3 then begin a:=a+2; a:=a+5 end;
a: =6 if a>3 then begin a:=a+3; a:=a+5 end;
a: =6 if a>3 then begin a:=a+4; a:=a+5 end;
a: =6 if a>3 then begin a:=a+5; a:=a+5 end;
a: =6 if a>3 then begin a:=a+l; a:=a+1 end;
a:=7 if a<3 then begin a:=a+l; a:=a+2 end;
a:=7 if a<3 then begin a:=a+l; a:=a+3 end;
a:=7 if a<3 then begin a:=a+l; a:=a+4 end;
a:=7 if a<3 then begin a:=a+l; a:=a+5 end;
a:=7 if a<3 then begin a:=a+2; a:=a+5 end;
a:=7 if a<3 then begin a:=a+3; a:=a+5 end;
a:=7 if a<3 then begin a:=a+4; a:=a+5 end;
a:=7 if a<3 then begin a:=a+5; a:=a+5 end;
a:=1 if a<4 then begin a:=a+4; a:=a+5 end;
a:=1 if a<4 then begin a:=a+5; a:=a+3 end;
86
4 Массивы
Массив-это структура данных, которую можно рассматривать как набор
переменных одинакового типа, имеющих общее имя. Массивы удобно
использовать для хранения однородной по составу информации, например
элементов таблиц, коэффициентов уравнений, матриц.
4.1 Объявление массива
Перед использованием массив, как и любая переменная, должен быть
объявлен в разделе объявления переменных. В общем виде объявление
массива выглядит так:
Имя:array[нижний индекс..верхний индекс] of тип;
где
Имя-имя переменной-массива;
array- ключевое слово, обозначающее, что переменная является
массивом;
нижний индекс и верхний индекс- целые числа, определяющие
диапазон изменения индексов(номеров) элементов массива и, неявно,
количество элементов массива;
Тип-тип элементов массива.
Примеры объявления массивов:
Temper:array[1..31] of real;
Koef:array[0..2] of integer;
Name:array[1..30] of string;
При объявлении массива удобно использовать именованные
константы. Именованная константа объявляется в разделе описания
констант, который располагают перед разделом объявления переменных.
Начинается раздел объявления констант словом const.
Например, массив названий команд чемпионата по футболу можно
объявить так:
const
nt=18; (число команд)
sn=25; (предельная длина названия команды)
var team:array[1..nt] of string[sn];
Чтобы в программе использовать элемент массива надо указать имя
массива и номер элемента(индекс), заключив его в квадратные скобки.
Индекс может быть константой или выражением целого типа.
Например:
Team[1]:=zenit;
D:=koef[1]*koef[1]-4*koef[2]*koef[1]:
Readln(name[n+1]);
Writeln(temper[i]);
87
4.2 Действия над массивами
К типичным действиям над массивами относятся следующие:
 вывод массива;
 ввод массива;
 сортировка массива;
 поиск в массиве заданного злемента;
 поиск в массиве максимального или минимального элемента.
4.3 Вывод массива
Под выводом массива понимается вывод на экран значений элементов
массива. Если в программе необходимо вывести значения всех элементов
массива, то для этого удобно использовать инструкцию for, переменнаясчетчик, которой может быть использован как индекс элемента массива.
Пример:
program days:
var day: array[1..7] of string[11];
i: integer;
begin
day[1]:=’понедельник’;
day[2]:=’вторник’;
day[3]:=’среда’;
day[4]:=’четверг’;
day[5]:=’пятница’;
day[6]:=’суббота’;
day[7]:=’воскресенье’;
for i:=1 to 7 do
writeln (i ,’ ’,day[i]);
end.
4.4 Ввод массива
Под вводом массива понимается ввод значений элементов массива.
Как и вывод массива, ввод удобно реализовать при помощи инструкции
for. Чтобы пользователь программы знал, ввода какого элемента массива
ожидает программа, следует организовать вывод подсказок перед вводом
очередного элемента массива. В подсказке обычно указывают индекс
элемента массива.
Пример:
program midtemp;
var day: array[1..7] of string[11]; (название дней недели)
88
i: integer;
temper: array[1..7] of real; (температура)
sum: real; (сумма температур за неделю)
sredn:real; (средняя температура за неделю)
begin
day[1]:=’понедельник’;
day[2]:=’вторник’;
day[3]:=’среда’;
day[4]:=’четверг’;
day[5]:=’пятница’;
day[6]:=’суббота’;
day[7]:=’воскресенье’;
writeln(‘задайте температуру воздуха за неделю’);
for i:=1 to 7 do
begin
writeln (day[i],’->’);
readln(temper[i]);
end;
(вычисление средней температуры за неделю);
sum:=0;
for i:=1 to 7 do
sum:=sum+temper[i];
sredn:=sum/7;
writeln (‘средняя температура за неделю:’, sredn:6:2);
readln;
end.
4.5 Сортировка массива
Под сортировкой массива подразумевается процесс перестановки
элементов с целью упорядочивания их в соответствии с каким-либо
критерием. Например, если имеется массив целых а, то после сортировки
по возрастанию должно выполняться условие:
а[1]<a[2]<…<a[size], где
size- верхняя граница индекса массива.
Так как можно сравнивать переменные типов integer, real,char,string, то
можно сортировать массивы этих типов.
Задача сортировки распространена в информационных системах и
используется как предварительный этап задачи поиска, так как поиск в
упорядоченном массиве проводится намного быстрее, чем в
неупорядоченном.
Существует много методов(алгоритмов) сортировки массивов. Здесь мы
рассмотрим два метода:
89
 метод прямого выбора;
 метод прямого обмена.
Сортировка методом прямого выбора.
Алгоритм сортировки массива по возрастанию методом прямого выбора
может быть представлен так:
1.Просматривая массив от первого элемента, найти минимальный
элемент и поместить его на место первого элемента, а первый- на место
минимального.
2.Просматривая массив от второго элемента, найти минимальный
элемент и поместить его на место второго элемента, а второй- на место
минимального.
3.И так далее до последнего элемента.
Сортировка методом прямого обмена.
В основе алгоритма лежит обмен соседних элементов массива. Каждый
элемент массива, начиная с первого, сравнивается со следующим, и если
он больше следующего, то элементы меняются местами. Таким образом,
элементы
с
меньшим
значением
продвигаются
к
началу
массива(всплывают), а элементы с большим значением- к концу
массива(тонут), поэтому этот метод иногда называют методом ”пузырька”.
Этот процесс повторяется на единицу меньше раз, чем элементов в
массиве.
4.6 Поиск в массиве
При решении многих задач возникает необходимость установить,
содержит ли массив определенную информацию или нет. Например,
проверить, есть ли в массиве фамилий студентов фамилия Петров. Задача
такого типа называется поиском в массиве.
Для организации поиска в массиве могут быть использованы различные
алгоритмы. Наиболее простой- это алгоритм простого перебора. Поиск
осуществляется последовательным сравнением элементов массива с
образцом до тех пор, пока не будет найден элемент, равный образцу, или
не будут проверены все элементы. Алгоритм простого перебора
применяется, если элементы массива не упорядочены.
Очевидно, что чем больше элементов в массиве и чем дальше
расположен нужный элемент от начала массива, тем дольше будет
программа искать нужный элемент.
Так как операции сравнения применимы как к числам, так и к строкам,
то данный алгоритм может использоваться для поиска как в числовых, так
и в строковых массивах.
На практике довольно часто проводится поиск в массиве, элементы
которого упорядочены по некоторому критерию. Например, массив
90
фамилий, как правило, упорядочен по алфавиту, массив данных о погоде
упорядочен по датам наблюдений.
Для поиска в упорядоченных массивах применяют другие, более
эффективные по сравнению с методом простого перебора, алгоритмы,
один из которых- метод бинарного поиска.
Суть метода бинарного поиска заключается в следующем. Выбирается
средний (по номеру) элемент упорядоченного, например, по возрастанию
массива, и с этим элементом сравнивается образец. Если средний элемент
равен образцу, то задача решена. Если средний элемент меньше образца,
то искомый элемент расположен выше среднего элемента. Если средний
элемент больше образца, то искомый элемент расположен ниже среднего.
После того как определена часть массива, в которой может
располагаться искомый элемент, поиск проводят в этой части, выделяя
новый средний элемент. Номер среднего элемента вычисляется по
формуле
(niz-verh)/2+verh.
4.7 Поиск минимального (максимального) элемента массива
Алгоритм поиска минимального (максимального) элемента в
неупорядоченном массиве довольно очевиден: делается предположение,
что первый элемент массива является минимальным (максимальным),
затем остальные элементы массива последовательно сравниваются с этим
элементом. Если во время очередной проверки обнаруживается, что
проверяемый элемент меньше (больше) принятого за минимальный
(максимальный) , то этот элемент принимается за минимальный
(максимальный) и продолжается проверка оставшихся элементов.
Пример:
program minel:
const
granica=10;
var
a: array[1..granica] of integer; (массив целых)
min: integer; (номер минимального элемента массива)
i: integer; (номер элемента, сравниваемого с минимальным)
begin
min:=1;(пусть первый элемент минимальный)
for i:=1 to granica do
if a[i]<a[min] then min:=i;
writeln (‘минимальный элемент массива:’, min);
writeln(‘номер элемента:’, min);
readln;
end.
91
4.8 Многомерные массивы
Исходные данные для решения многих задач удобно представляются в
табличной форме.
Например, результат производственной деятельности сборочных
заводов некоторой фирмы можно представить в виде следующей таблицы.
Продукт1
Продукт2
Продукт3
Завод1
Завод2
Завод3
Колонки и строки таблицы, как правило, содержат однородную
информацию, если использовать терминологию Turbo Pascal – данные
одинакового типа. Поэтому в программе для хранения и обработки
табличных данных можно использовать совокупность одномерных
массивов. Так приведенная выше таблица может быть представлена как
совокупность одномерных массивов следующим образом:
Zavod1: array[1..3] of integer;
Zavod2: array[1..3] of integer;
Zavod3: array[1..3] of integer;
Каждый из приведенных массивов может хранить информацию о
количестве продукции, выпущенной одним заводом.
Помимо совокупности одномерных массивов, таблица может быть
представлена как двумерный массив.
В общем виде описание двумерного массива выглядит так:
Имя:array[нижняя граница индекса1..верхняя граница индекса1,
нижняя граница индекса2..верхняя граница индекса2] of тип.
Приведенная выше таблица может быть представлена в виде
двумерного массива так:
product: array[1..3,1..3] of integer;
Чтобы использовать элемент массива, нужно указать имя массива и
индексы элемента. Первый индекс обычно соответствует номеру строки
таблицы, второй- номеру колонки.
Значение элементов двумерных массивов выводят на экран и вводят с
клавиатуры, как правило, по строкам, то есть сначала все элементы первой
строки, затем второй и так далее. Это удобно выполнять при помощи
вложенных инструкций for. Следующий фрагмент программы выводит на
экран значения элементов массива по строкам:
for i:=1 to n do
begin
for j:=1 to m do
write(a[I,j]);
writeln;
readln;
92
end;
Каждый раз, когда внутренний цикл завершается, внешний цикл
увеличивает i на единицу, и внутренний цикл выполняется вновь.
При описании массивов в программе удобно использовать именованные
константы как значения верхних границ индексов массива.
4.9 Ошибки при использовании массивов
При использовании массивов наиболее распространенной ошибкой
является выход значения индексного выражения за допустимые границы,
указанные при объявлении массива.
Если в качестве индекса используется константа, и ее значение выходит
за допустимые границы, то такая ошибка обнаруживается на этапе
компиляции.
Например, во время компиляции программы
program p1;
var day: array[1..6] of string[11]:
begin
day[1]:=’понедельник’;
day[7]:=’воскресенье’;
end.
Для инструкции day[7]:=’воскресенье’; будет выведено сообщение об
ошибке: error 76: constant out of range.
Если при обращении к элементу массива в качестве индекса
используется переменная или выражение, то возможно возникновение
ошибки времени выполнения программы(runtime error).
4.10 Практические задачи
1.
№
1
2.
2
3.
3
4.
4
Условие задачи
Написать программу, которая вводит с клавиатуры одномерный
массив из 5 целых чисел и выводит количество ненулевых
элементов. Перед вводом каждого элемента на экране должна
появляться подсказка с его номером.
Написать программу, которая выводит минимальный элемент
введенного с клавиатуры массива целых чисел. Ниже представлен
рекомендуемый вид экрана во время работы программы.
Написать программу, которая вычисляет среднее арифметическое
ненулевых элементов введенного с клавиатуры массива целых
чисел.
Написать программу, которая вычисляет среднюю (за неделю)
температуру воздуха. Исходные данные должны вводиться во
время работы программы.
93
5.
5
6.
6
7.
7
8.
8
9.
9
10. 10
11. 11
12. 12
13. 13
14. 14
15. 15
16. 16
17. 17
18. 18
19. 19
20. 20
21. 21
Написать программу, которая проверяет, находится ли в массиве
введенное с клавиатуры число. Массив должен вводится во время
работы программы.
Написать программу, которая проверяет, представляют ли
элементы введенного с клавиатуры массива возрастающую
последовательность.
Написать программу, которая проверяет, образуют ли элементы
введенного
с
клавиатуры
массива
неубывающую
последовательность.
Написать программу, которая вычисляет, сколько раз введенное с
клавиатуры число встречается в массиве.
Написать программу, которая проверяет, есть ли во введенном с
клавиатуры массиве элементы с одинаковым значением.
Написать программу, которая методом прямого выбора сортирует
по убыванию введенный с клавиатуры одномерный массив.
Написать программу, которая методом обмена ("пузырька")
сортирует по убыванию введенный с клавиатуры одномерный
массив.
Написать программу, которая объединяет два упорядоченных по
возрастанию массива в один, также упорядоченный по
возрастанию массив.
Написать программу, которая, используя метод бинарного поиска,
выполняет поиск в упорядоченном по возрастанию массиве.
Написать программу, которая определяет количество учеников в
классе, чей рост превышает средний.
Написать программу, которая вводит по строкам с клавиатуры
двумерный массив и вычисляет сумму его элементов по столбцам.
Написать программу, которая вводит по строкам с клавиатуры
двумерный массив и вычисляет сумму его элементов по строкам.
Написать программу, которая вычисляет сумму диагональных
элементов квадратной матрицы.
Написать программу, которая вводит с клавиатуры двумерный
массив по строкам и вычисляет среднее арифметическое его
элементов.
Написать
программу,
которая
вычисляет
определитель
квадратной матрицы второго порядка.
Написать программу, которая проверяет, является ли введенная с
клавиатуры квадратная матрица магическим квадратом.
Магическим квадратом называется матрица, сумма элементов
которой в каждой строке, в каждом столбце и по каждой диагонали
одинакова.
Написать программу, которая вычисляет определитель квадратной
94
22. 22
23. 23
24. 24
25. 25
26. 26
27. 27
28. 28
29. 29
30. 30
31. 31
32. 32
33. 33
34. 34
35. 35
36. 36
матрицы третьего порядка.
Дан текст из 80 литер. Напечатать сначала все цифры, входящие в
него, а затем все остальные литеры, сохраняя при этом взаимное
расположение литер в каждой из этих двух групп.
Дан текст, содержащий от 1 до 70 букв, за которым следует точка.
Напечатать этот текст в обратном порядке.
Дан непустой текст из цифр, за которым следует точка. Напечатать
цифру, наиболее часто встречающуюся в этом тексте (если таких
цифр несколько, напечатать любую из них).
Дана последовательность из 100 различных целых чисел. Найти
сумму чисел этой последовательности, расположенных между
максимальным и минимальным числами (в сумму включить и оба
этих числа).
Программа. Даны координаты n точек на плоскости: x1, y1, … xn, yn
(n=20). Найти номера двух точек, расстояние между которыми
наибольшее (считать, что такая пара точек единственная).
Даны две последовательности по 30 целых чисел в каждой. Найти
наименьшее среди тех чисел первой последовательности, которые
не входят во вторую последовательность (считая, что хотя бы одно
такое число есть).
Дана последовательность из 20 целых чисел. Определить
количество инверсий в этой последовательности
Дан текст из строчных латинских букв, за которым следует точка.
Напечатать в алфавитном порядке все буквы, которые входят в
этот текст по одному разу.
Напечатать заданный текст из 100 литер, удалив из него повторные
вхождения каждой литеры.
Определить, сколько различных литер входит в заданный текст,
содержащий не более 100 литер и оканчивающийся точкой (в сам
текст точка не входит).
По заданным коэффициентам много члена 15-й степени и
многочлена 8-й степени определить коэффициенты произведения
этих многочленов.
Даны натуральное n и (построчно) элементы квадратной
вещественной матрицы А 5-го порядка. Вычислить n-ю степень
этой матрицы.
Дана (построчно) вещественная матрица размером 7x4.
Переставляя ее строки и столбцы, добиться того, чтобы
наибольший элемент (один из них) оказался в верхнем левом углу.
Дана вещественная матрица размером 20x30. Упорядочить ее
строки по неубыванию их первых элементов.
Дана вещественная матрица размером 20x30. Упорядочить ее
95
37. 37
38. 38
39. 39
40. 40
41. 41
42. 42
43. 43
44. 44
45. 45
46. 46
47. 47
48. 48
строки по неубыванию суммы их элементов.
Дана вещественная матрица размером 20x30. Упорядочить ее
строки по неубыванию их наибольших элементов.
Определить, является ли заданная целая квадратная матрица 9-го
порядка магическим квадратом, т. е. такой, в которой суммы
элементов во всех строках и столбцах одинаковы.
Определить, является ли заданная целая квадратная матрица 10-го
порядка симметричной (относительно главной диагонали).
Элемент матрицы назовем седловой точкой, если он является
наименьшим в своей строке и одновременно наибольшим в своем
столбце или, наоборот, является наибольшим в своей строке и
наименьшим в своем столбце. Для заданной целой матрицы
размером
10x15 напечатать индексы всех ее седловых точек.
Дана вещественная матрица размером 7x7, все элементы которой
различны. Найти скалярное произведение строки, в которой
находится наибольший элемент матрицы, на столбец с
наименьшим
элементом.
Определить, является ли заданная целая квадратная матрица 10-го
порядка ортонормированной, т. е. такой, в которой скалярное
произведение каждой пары различных строк равно 0, а скалярное
произведение каждой строки на себя равно 1.
Даны координаты n векторов n-мерного линейного пространства
(n=7). Определить, являются ли они линейно независимыми.
Дана квадратная матрица n-го порядка (n=6). Найти матрицу;
обратную ей, или установить, что такой не существует.
(Замечанием если линейными преобразованиями строк привести
заданную матрицу к единичной, то этими же преобразованиями
единичная матрица будет приведена к искомой обратной матрице.)
Даны натуральное число n, действительная матрица размера nх9.
Найти среднее арифметическое каждого из столбцов.
Даны натуральное число n, действительная матрица размера nх9.
Найти среднее арифметическое каждого из столбцов, имеющих
четные номера.
Дана действительная матрица размера nхm, в которой не все
элементы равны нулю. Получить новую матрицу путем деления
всех элементов данной матрицы на ее наибольший по модулю
элемент.
Даны натуральное число m, целые числа a1, ..., аm и целочисленная
квадратная матрица порядка m. Строку с номером i матрицы
назовем отмеченной, если ai > 0, и неотмеченной в противном
случае. Нужно все элементы, расположенные в отмеченных
96
49. 49
50. 50
51. 51
52. 52
53. 53
54. 54
55. 55
56. 56
57.
58. 57
59. 58
60. 59
61. 60
строках матрицы, преобразовать по правилу: отрицательные
элементы заменить на —1. положительные—на 1, а нулевые
оставить без изменения.
Даны натуральное число m, целые числа a1, ..., аm и целочисленная
квадратная матрица порядка m. Строку с номером i матрицы
назовем отмеченной, если ai > 0, и неотмеченной в противном
случае. Подсчитать число отрицательных элементов матрицы,
расположенных в отмеченных строках.
Дана действительная квадратная матрица порядка 12. Заменить
нулями все ее элементы, расположенные на главной диагонали и
выше нее.
Дана действительная матрица размера nхm. Определить числа bi,
..., bm, равные соответственно суммам элементов строк.
Дана действительная матрица размера nхm. Определить числа bi,
..., bm, равные соответственно
произведениям
элементов
строк.
Дана действительная матрица размера nхm. Определить числа bi,
..., bm, равные соответственно наименьшим значениям элементов
строк.
Дана действительная матрица размера nхm. Определить числа bi,
..., bm, равные соответственно значениям средних арифметических
элементов строк.
Дана действительная матрица размера nхm. Определить числа bi,
..., bm, равные соответственно разностям наибольших и
наименьших значений элементов строк.
Все элементы с наибольшим значением в данной целочисленной
квадратной матрице порядка 10 заменить нулями.
Дана действительная матрица размера 6x9. Найти среднее
арифметическое наибольшего и наименьшего значений ее
элементов.
Дана действительная матрица размера 18 x n. Найти значение
наибольшего по модулю элемента матрицы, а также индексы
какого-нибудь элемента с найденным значением модуля.
Дана действительная матрица размера mхn. Найти сумму
наибольших значений элементов ее строк.
В данной действительной квадратной матрице порядка n найти
сумму элементов строки, в которой расположен элемент с
наименьшим значением. Предполагается, что такой элемент
единственный.
В данной действительной матрице размера 6x9 поменять местами
строку, содержащую элемент с наибольшим значением, со
строкой, содержащей элемент с наименьшим значением.
Предполагается, что эти – элементы единственны.
97
62. 61
63. 62
64. 63
65. 64
66. 65
67. 66
68. 67
69. 68
70. 69
71. 70
72. 71
73. 72
74. 73
75. 74
В данной квадратной целочисленной матрице порядка 17 указать
индексы всех элементов с наибольшим значением.
Дана действительная матрица размера nхm, все элементы которой
различны. В каждой строке выбирается элемент с наименьшим
значением, затем среди этих чисел выбирается наибольшее.
Указать индексы элемента с найденным значением.
Дана целочисленная квадратная матрица порядка 8. Найти
наименьшее из значений элементов столбца, который обладает
наибольшей суммой модулей элементов. Если таких столбцов
несколько, то взять первый из них.
Даны натуральное число n, целочисленная квадратная матрица
порядка n. Получить b1,
.. ., bn, где bi— это наименьшее из
значений элементов, находящихся в начале i-й строки матрицы до
элемента, принадлежащего главной диагонали, включительно.
Даны натуральное число n, целочисленная квадратная матрица
порядка n. Получить b1, .. ., bn, где bi— это значение первого по
порядку положительного элемента i-й строки (если таких
элементов нет, то принять bi= 1).
Даны натуральное число n, целочисленная квадратная матрица
порядка n. Получить b1, .. ., bn, где bi— это сумма элементов,
расположенных за первым отрицательным элементом в i-й строке
(если все элементы строки неотрицательны, то принять bi =100).
Даны натуральное число n, целочисленная квадратная матрица
порядка n. Получить b1, .. ., bn, где bi— это сумма элементов,
предшествующих последнему отрицательному элементу i-й строки
(если все элементы строки неотрицательны, то принять bi = -1).
Дана целочисленная квадратная матрица порядка n. Найти номера
строк все элементы которых—нули.
Дана целочисленная квадратная матрица порядка n. Найти номера
строк элементы в каждой из которых одинаковы.
Дана целочисленная квадратная матрица порядка n. Найти номера
строк все элементы которых четны.
Дана целочисленная квадратная матрица порядка n. Найти номера
строк элементы каждой, из которых образуют монотонную
последовательность (монотонно убывающую или монотонно
возрастающую).
Дана целочисленная квадратная матрица порядка n. Найти номера
строк
элементы
которых
образуют
симметричные
последовательности (палиндромы).
Дана действительная квадратная матрица порядка 10. В строках
с отрицательным элементом на главной диагонали найти сумму
всех элементов.
Дана действительная квадратная матрица порядка 10. В строках
98
76. 75
77. 76
78. 77
79. 78
80. 79
81. 80
82. 81
83. 82
84. 83
85. 84
86. 85
с отрицательным элементом на главной диагонали найти
наибольший из всех элементов.
Дана действительная квадратная матрица порядка n. Рассмотрим
те элементы, которые расположены в строках, начинающихся с
отрицательного
элемента. Найти суммы тех из них, которые
расположены соответственно ниже, выше и на главной диагонали.
Дана действительная квадратная матрица порядка 9. Получить
целочисленную квадратную матрицу того же порядка, в которой
элемент равен единице, если соответствующий ему элемент
исходной матрицы больше элемента, расположенного в его строке
на главной диагонали, и равен нулю в противном случае.
Таблица футбольного чемпионата задана квадратной матрицей
порядка n, в которой все элементы, принадлежащие главной
диагонали, равны нулю, а каждый элемент, не принадлежащий
главной диагонали, равен 2, 1 или 0 (числу очков, набранных в
игре: 2—выигрыш, 1 — ничья, 0—проигрыш). Найти число
команд, имеющих больше побед, чем
поражений.
Таблица футбольного чемпионата задана квадратной матрицей
порядка n, в которой все элементы, принадлежащие главной
диагонали, равны нулю, а каждый элемент, не принадлежащий
главной диагонали, равен 2, 1 или 0 (числу очков, набранных в
игре: 2—выигрыш, 1 — ничья, 0—проигрыш). Определить номера
команд, прошедших чемпионат без поражений.
Таблица футбольного чемпионата задана квадратной матрицей
порядка n, в которой все элементы, принадлежащие главной
диагонали, равны нулю, а каждый элемент, не принадлежащий
главной диагонали, равен 2, 1 или 0 (числу очков, набранных в
игре: 2—выигрыш, 1 — ничья, 0—проигрыш). Выяснить, имеется
ли хотя бы одна команда, выигравшая более половины игр.
Дана символьная квадратная матрица порядка 10. Заменить буквой
а все ее элементы, расположенные выше главной диагонали.
Дана символьная матрица размера 13x18. Найти номер первой по
порядку строки, содержащий наибольшее число цифр.
Дана символьная матрица размера 13x18. Найти номер первого по
порядку столбца, содержащего наименьшее число пробелов на
пересечении со строками, номера которых четны.
Дана символьная матрица размера 13x18. Найти номер последней
по порядку строки, содержащей наибольшее количество букв ш, щ.
Дана символьная матрица размера 13x18. Найти номер последнего
по порядку столбца, в котором содержится
наибольшее
количество попарно различных символов.
Дана действительная квадратная матрица порядка n. Найти сумму
99
87. 86
88. 87
89. 88
90. 89
91. 90
92. 91
93. 92
94. 93
95. 94
96. 95
97. 96
98. 97
99. 98
элементов первого столбца.
Дана действительная квадратная матрица порядка n. Найти сумму
элементов главной и побочной диагоналей.
Дана действительная квадратная матрица порядка n. Найти
наибольшее из значений элементов первой и последней строк.
Дана действительная квадратная матрица порядка n. Найти
наименьшее из значений элементов побочной диагонали и двух
соседних с ней линий.
Дана действительная квадратная матрица порядка n. Для данного
натурального m (m  2n) найти сумму тех элементов матрицы,
сумма индексов которых равна m.
Дана действительная квадратная матрица порядка n. Выяснить,
верно ли, что наибольшее из значений элементов главной
диагонали больше, чем наименьшее из значений элементов
побочной диагонали.
Даны две целочисленные квадратные матрицы порядка 6. Найти
последовательность из нулей и единиц b1 ..., bn такую, что bi=1,
когда все элементы i-й строки первой матрицы больше
соответствующих элементов i-й строки второй матрицы.
Даны две целочисленные квадратные матрицы порядка 6. Найти
последовательность из нулей и единиц b1 ..., bn такую, что bi=1,
когда все элементы i-x строк первой и второй матриц
отрицательны;
Даны две целочисленные квадратные матрицы порядка 6. Найти
последовательность из нулей и единиц b1 ..., bn такую, что bi=1,
когда i-e строки первой и второй матриц содержат вместе не более
трех положительных элементов.
Даны две целочисленные квадратные матрицы порядка 6. Найти
последовательность из нулей и единиц b1 ..., bn такую, что bi=1,
когда количество отрицательных и неотрицательных элементов i-й
строки первой матрицы совпадает соответственно с количеством
отрицательных и неотрицательных элементов i-й строки второй
матрицы.
Дана действительная матрица
размера
nхm. Получить
последовательность b1 ..., bn, где bk — это наибольшее из значений
элементов k-й строки.
Дана действительная матрица
размера
nхm. Получить
последовательность b1 ..., bn, где bk — это сумма наибольшего и
наименьшего из значений элементов k-й строки.
Дана действительная матрица
размера
nхm. Получить
последовательность b1 ..., bn, где bk — это число отрицательных
элементов в k-й строке.
Дана действительная матрица
размера
nхm. Получить
100
100. 99
последовательность b1 ..., bn, где bk — это произведение квадратов
тех элементов k-й строки, модули которых принадлежат отрезку
[1, 1.5].
Даны натуральное число n, действительное число х,
действительная
матрица
размера
nх2n.
Получить
последовательность b1, ..., bn. из нулей и единиц, где bi= 1, если
элементы i-й строки матрицы не превосходят х, и bi =0 в
противном случае.
101
5 Множества
5.1 Описание типа множество
Множества- это структурированный тип данных, представляющий
собой набор взаимосвязанных по какому- либо признаку или группе
признаков объектов, которые можно рассматривать как единое целое.
Каждый отдельный объект в множестве называется элементом множества.
Все элементы множества должны принадлежать одному из скалярных
типов, кроме вещественного. Этот тип называется базовым типом
множества. Базовый тип задается диапазоном или перечислением. Область
значений типа множество- набор всевозможных подмножеств,
составленных из элементов базового типа. В выражениях на языке Паскаль
значения элементов множества указываются в квадратных скобках:
[1,2,3,4], ['а', 'b', 'c'], ['a'..'z'].Если множество не имеет элементов оно
называется пустым и обозначается как [ ]. Количество элементов
множества называется его мощностью.
Для описания множественного типа используется словосочетание set of
(множество из…). Синтаксическая диаграмма множественных типов имеет
следующий вид:
SET
ТИП
OF
Изображение множества:
[
выражение
..
выражение
]
'-
Исходя из синтаксической диаграммы, представим формат записи:
множественных типов:
Type
<имя типа>= set of <элемент1,…,элемент n>;
var
<идентификатор,…>: <имя типа>;
Можно задать множественный тип и без предварительного описания:
Var
<идентификатор, …>: set of <элемент1,…>;
Примеры:
1. TYPE
Simple= set of 'a'..'h';
102
Number= set of 1..31;
Var
Pr: Simply;
N: Number;
Letter: set of char;{Определение множества без предварительного
описания в разделе типов}.
В данном примере переменная Pr может принимать значения символов
латинского алфавита от 'a' до 'h'; N- любое значение в диапазоне 1..31;
Letter- любой символ. Попытка присвоить другие значения вызовет
программное прерывание.
2. TYPE
SetOfChar = Set Of Char;
{множество символов}
SetOfByte = Set Of Byte; {множество чисел}
SetOfDigit = Set of 0..9;
{множество чисел от 0 до 9}
SetOfDChar = Set of ’0’.. ’9’; {множество символов ’0’,’1’ ’2’.. ’9’}
Можно использовать не только базовые типы:
3. TYPE
ElemColor = (Red, Yellow, Blue); {круглые скобки!}
Color = Set of ElemColor;
Последнее описание можно записать короче:
Color = Set of (Red, Yellow, Blue);
Если же переменная описана:
VAR S: Set of (1,3,5);
то возможны следующие присваивания:
S := [];
S := [2];
S := [1,3];
S := [5,1,3];
Элементы множества записываются в квадратных скобках через
запятую. Возможно и указание диапазонов.
Sprost := [2,3,5,7,11];
Sdiap := [1..4, 6,8, 10..15];
Schar1 := [’a’, ’d’, ’n’, ’z’];
ScharRus := [’а’.. ’п’, ’р’.. ’я’];
Spusto := [];
{пустое множество}
Заметим, что порядок следования и число повторений не имеет
значения. Так следующие множества означают одно и то же.
[1,2,3]
[3,1,2]
[2,3,2,1,1,1]
Как элементы множества в квадратные скобки могут включаться
константы и переменные соответствующих базовых типов, а также
103
выражения, чьи результаты совпадают с базовым типом множества.
Например:
VAR
X: byte;
S : Set of Byte;
…
X:=7;
S:=[1,3,X];
S:=S+[X+1];
Количество элементов множества не должно превышать 256.
соответственно номера значений базового типа должны находиться в
диапазоне 0..255. Контроль диапазонов осуществляется включением
директивы {$R+}. Объем памяти, занимаемый одним элементом
множества, составляет 1 бит. Объем памяти для переменной типа
множество вычисляется по формуле:
Объем памяти =(Max DIV 8) - (Min DIV 8) + 1 , где Max и Min- верхняя
и нижняя границы базового типа.
5.2 Операции над множествами
При работе с множествами допускается использование операций
отношения ''='', ''<>'', ''<='', ''>='', объединения, пересечения, разности
множеств и операций in. Результатом выражений с применением этих
операций является значение True или False.
Операция 'равно'(=). Два множества A и B считаются равными, если
они состоят из одних и тех же элементов. Порядок следования элементов в
сравниваемых множествах значения не имеет.
Например:
Значение А
[1,2,3,4]
['a', 'b', 'c']
['a' .. 'z']
Значение В
[1,2,3,4]
['c', 'a']
['z' .. 'a']
Выражение
A=B
A=B
A=B
Результат
True
False
True
Операция ''не равно''(<>). Два множества А и В считаются не
равными, если они отличаются по мощности или по значению хотя бы
одного элемента.
Например:
Значение А
Значение В
Выражение
Результат
[1,2,3]
[3,1,2,4]
A<>B
True
['a' .. 'z']
['b' .. 'z']
A<>B
True
['c' ..'t']
['t' .. 'c']
A<>B
False
104
Операция ''больше или равно''(>=).Операция ''больше или равно''(>=)
используется для определения принадлежности множеств. Результат
операции А >= В равен True, если все элементы множества В содержатся в
множестве А.В противном случае результат равен False.
Например:
Значение А
[1,2,3,4]
['a' .. 'z']
['z', 'x', 'c']
Значение В
[2,3,4]
['b' .. 't']
['c', 'x']
Выражение
A>=B
A>=B
A>=B
Результат
True
True
True
Операция ''меньше или равно''(<=).Эта операция используется
аналогично предыдущей операции, но результат выражения А<= В равен
True, если все элементы множества А содержатся в множестве В. В
противном случае результат равен False.
Например:
Значение А
[1,2,3]
['d' .. 'h']
['a', 'v']
Значение В
[1,2,3,4]
['z' ..'a']
['a', 'n', 'v']
Выражение
A<=B
A<=B
A<=B
Результат
True
True
True
Операция in. Операция in используется для проверки принадлежности
какого-либо значения указанному множеству. Обычно применяется в
условных операторах.
Например:
Значение А
2
'v'
X1
Выражение
Результат
If A in [1,2,3] then…
True
If A in ['a' .. 'n'] then…
False
If A in [X0, X1, X2, X3] True
then…
При использовании операции in проверяемое на принадлежность
значение и множество в квадратных скобках не обязательно
предварительно описывать в разделе описаний. Операция in позволяет
эффективно и наглядно производить сложные проверки условий, заменяя
иногда десятки других операций. Например, выражение if (a=1) or (a=2) or
(a=3)or (a=4) or (a=5) or (a=6) then… можно заменить более коротким
выражением if a in [1 .. 6] then… .
Часто операцию in пытаются записать с отрицанием:
X NOT in M.
105
Такая запись является ошибочной, так как две операции следуют
подряд; правильная инструкция имеет вид NOT (X in M) .
Объединение множеств (+). Объединением двух множеств является
третье множество, содержащее элементы обоих множеств.
Например:
Значение А
[1,2,3]
['A' ..'D']
[]
Значение В
[1,4,5]
['E..'Z']
[]
Выражение
A+B
A+B
A+B
Результат
[1,2,3,4,5]
['A' ..'Z']
[]
Пересечение множеств (*). Пересечением двух множеств является
третье множество, которое содержит элементы, входящие одновременно в
оба множества.
Например:
Значени
е [1,2,3]
А
['А'..'Z']
[]
Значение Выражени Результат
В.
[1,4,2,5] е А*В
[1,2]
['В'..'R']
А*В
['В'..'R']
[]
А*В
[]
Разность множеств ( — ). Разностью двух множеств является третье
множество, которое содержит элементы первого множества, не входящие
во второе множество.
Например:
Значение А
Значение В Выражение Результат
[1,2,3,4]
[3,4,1]
А—В
[2]
['А'..'Z']
['D'..'Z']
А—В
['А'..'С]
[Х1,Х2,ХЗ,Х4] [Х4, Х1]
А—В
[Х2, ХЗ]
Результат операций над двумя множествами можно наглядно
представить с помощью закрашенных частей двух прямоугольников:
Объединение
Пересечение
Разность
Заметим, что в операциях могут участвовать только те множества,
которые строятся на одном базовом типе. Например, множества значений
типа Char и типа Byte не сопоставимы.
106
5.3 Группы операций
Все операции над множествами подразделяются на две группы.Первая
группа операций - операции сопоставления. Они близки операциям
сравнения (чисел, символов, строк). Рассмотрим ряд примеров:
ИСТИННО
[1, 3, 2] = [3, 2, 1]
[5, X] = [X, 5]
[] = []
[1, 2] <> [2]
[5, X] <> [5, X+1]
[’a’, ’k’] <= [’a’ .. ’m’]
[] <= [3]
[X, X+2] >= [X+2]
2 in [1..5]
[] in [1..5]
ЛОЖНО
[1] = [3, 2, 1]
[5, X] = [5, X+1]
[] = [3]
[1, 2, 3] <> [2, 3, 1]
[5, X] <> [X, 5]
[’a’… ’e’] <= [’m’ .. ’z’]
[] >= [3]
[1..10] >= [1..20]
X in [X-1, X+1]
X in []
Вторая группа операций реализует математические действия над
множествами. Рассмотрим примеры:
ДЕЙСТВИЕ
[1,2,3,3,4] + [2,4,4,6,5]
[’1’, ’3’] + [’5’, ’7’]
[X] + [X+1] + [X+2]
[1,2,3,3,4] – [2,4,5,6]
[’1’, ’3’] – [’5’, ’7’]
[X] – []
[1,2,3,3,4] * [2,4,4,6,5]
[X] * []
[a,b,c]*[a,b]*[a]
РЕЗУЛЬТАТ
[1,2,3,4,5,6] ([1..6])
[’1’, ’3’,’5’, ’7’]
[X..X+2]
[1,3]
[’1’, ’3’]
[X]
[2, 4]
[]
[a]
Пример1. Имеются три множества символьного типа, которые заданы
своими конструкторами: y1=[‘a’,’b’,’r’,’m’], y2=[‘r’,’a’,’d’], y3=[‘a’,’r’].
Сформировать новое множество x=(y1*y2)+(y1-y2). Проверить включено
ли множество y3 и x.
var y1,y2,y3,x:set of char;
c;char;
begin
y1:=[‘a’,’b’,’r’,’m’];
y2:=[‘r’,’a’,’d’];
y3:=[‘a’,’r’];
{формировать и печатать множества x}
107
x:=(y1*y2)+(y1-y2);
write(‘множество x=’);
for c:=’a’ to ‘r’ do
if c in x then write(c);
{проверка включения множества y3 в x}
if y3<=x
then write(‘y3 включено в x’)
else write(‘не включено в x’);
Пример2. Из множества целых чисел 1..20 выделить: множество чисел,
делящихся на 6; множество чисел, делящихся или на 2. или на 3(деление
нацело).
Const n=20;
Var n2,n3,n6,n23:set of integer;
K:integer;
begin n2:=[];n3=[];
for k:=1 to n do
begin
if k mod 2=0 then n2:=n2+[k];
if k mod 3=0 then n3:=n3+[k]
end;
n6:=n2*n3;
n23:=n2+n3;
writeln(‘на 6 делятся числа’);
for k:=1 to n do
if k in n6 then write(k);
writeln(‘на 2 или на 3 делятся’);
for k:=1 to n do
if k in n23 then write(k);
end.
Использование в программе данных типа set дает ряд преимуществ:
значительно упрощаются сложные операторы if, увеличивается степень
наглядности программы и понимания алгоритма решения задачи,
экономятся память, время компиляции и выполнения. Помимо ряда
достоинств, множества имеют и недостатки. Так множества невозможно
вывести на экран. Можно лишь убедиться в наличии элемента в
множестве. Ввод множеств осуществляется поэлементно.
program MN;
var C:char;
S: set of Char; begin
S:=[]; C:=#0; {обнуление значений}
writeln('Введите элементы множества через Enter.');
writeln('Для окончания введите точку');
108
while C<>'.' do {цикл до ввода точки}
begin readln(C); {чтение символа в С и}
S:=S+[C] {добавление его к S}
end;
S:=S-['.']; {выбросим точку}
writeln('поэлементный вывод:');
for C:=chr(1) to chr(255) do {для каждого символа}
if C in S then write(C:3); {если символ входит в множество S
напечатать его}
writeln;
end.
program MN; {Решето Эратосфена}
Const
N=255; {максимальное количество перебираемых нат. Чисел}
Var
S,
{исходное множество}
Rez : Set of Byte;
{результат}
Next: Byte; {рабочие переменные}
j: word;
BEGIN
{начальные присваивания}
S:=[2..N]; {все числа в заданном диапазоне}
Rez:=[];
{первоначально пустое множество}
Next:=2; {начинаем с минимального простого}
repeat
{поиск очередного простого числа}
while not(Next in S) do {ищем в S наименьшее число}
Next:=Next+1;
Rez:=Rez+[Next]; {помещаем его в Rez}
j:=Next;
while j<=N do
begin
{удаляем из S все числа, кратные Next}
S:=S-[j];
j:=j+Next
end;
until S=[]; {повторяем цикл до исчерпания S}
for j:=2 to N do {выводим на печать содержимое Rez}
if j in Rez then write(j:5)
end.
109
5.4 Упражнения
Упражнение 1. Иллюстрацией описания множеств и операций над
ними может служить программа Dem _ Mno, в которой описаны множества
чисел D, D1, D2, D3. Затем они заполнены следующим образом:
множество D1 — четными числами 2,4,6,8; множество D2 — числами
0,1,2,3,5; множество D3 — нечетными числами 1,3,5,7,9. После этого над
множествами выполнены операции объединения, разности и пересечения.
Program Dem _ Mno; {Демонстрация операций над множествами}
Type
Digits=set of 0... 9;
var
D1, D2, D3, D: Digits;
Begin
D1:= [2, 4, 6, 8];
{Заполнение множеств}
D2:= [0..3, 5];
D3= [1, 3, 5, 7, 9];
D: =D1+D2;
{Объединение множеств D1 и D2}
D: =D+D3;
{Объединение множеств D и D3}
D: =D -D2;
{Разность множеств D и D2}
D: =D*D1;
{Пересечение множеств D и D1}
End.
Как видно из текста программы, сначала описан тип Digits= set of 0..9,
затем описаны переменные D1, D2, D3, D этого типа. В первой части
программы осуществляется заполнение множеств, а затем над
множествами выполняются операции объединения, пересечения, разности.
Для проверки действия программы запустите интегрированную среду
программирования. Введите текст программы Dem_Mno и запишите файл
на диск под соответствующим именем, а затем откомпилируйте его. Так
как в Паскале отсутствуют средства ввода-вывода элементов множества,
то действие программы проверьте, исполняя ее по шагам и наблюдая ;
текущие значения переменных D1,D2,D3,D в окне просмотра.
Упражнение 2. Опишите множество М(1..50). Сделайте его пустым.
Ввода целые числа с клавиатуры, заполните множество 10 элементами.
В разделе описания переменных опишем множество целых чисел от 1
до 50, переменную Х целого типа будем использовать для считывания
числа-кандидата во множество, целую переменную I используем для
подсчета количества введенных чисел.
В начале программы применим операцию инициализации множества
М:= [ ], так как, но не имеет элементов и является пустым.
Заполнение множества элементами произведем с использованием
оператора повтора for, параметр которого I будет указывать порядковый
110
номер вводимого элемента. Операцию заполнения множества запишем
оператором присваивания М:=М+[Х]. Контроль заполнения множества
запишем с использованием операции проверки принадлежности in. Если
условие Х in М выполняется, выведем сообщение о том, что число Х
помещено во множество. Текст программы описания и заполнения
множества будет таким:
Program Inpu_ Mno;
var
M: set of 1..50;
X, I: integer;
Begin
M: = [ ];
For I: =1 to 10 do
Begin
Write ('Введите', I, ' -й элемент множества: ');
Readln(X);
If (X in M) then
{Если введенное число входит в множество М}
Begin
Writeln (X,' помещен в множество 1..50');
M: =M+[X];
End;
End;
Writeln;
End.
Для проверки действия программы запустите интегрированную среду
программирования. Введите текст программы Inpu_ Mno и запишите
файл на диск под соответствующим именем, а затем откомпилируйте его.
Так как в Паскале отсутствуют средства ввода-вывода элементов
множества, то действие программы проверьте, исполняя ее по шагам и
наблюдая текущие значения переменных I, Х и М в окне просмотра.
Попробуйте задать значения числа Х больше 50, повторно задавать
одинаковые значения Х и проанализировать значения множества М.
Упражнение 3. Описать множества гласных и согласных букв русского
языка, определить количество гласных и согласных букв в предложении,
введенном с клавиатуры.
Зададим тип Letters — множество букв русского языка, затем опишем
переменные этого типа: Glasn — множество гласных букв, Sogl —
множество согласных букв. Вводимое < клавиатуры предложение опишем
переменной Техt типа String. Для указания символа в строке Техt
применим переменную I типа byte. Для подсчета количества гласных и
согласных букв опишем переменные G и S. Блок описания программы
запишется следующим образом:
111
Type
Letters= set of 'A'....'я';
Var
Glasn, Sogl: Letters;
Text: string;
I: byte;
G, S: byte;
В начале программы запишем заполнение множеств гласных и
согласных букв:
Glasn:=['А' ,'а' ,'Е','е', 'И' ,'и','0' ,'o','У ,'у','Э' ,'э','Ю' , 'ю' ,'Я .,'я'];
Sogl: = ['Б'..'Д','б'..'д','Ж ', 'ж', 'З', 'з', 'К'..'Н','к'..'н','П', .. 'T', 'п'..'т',
'Ф'..'Щ', 'ф'..'щ', 'Ъ','ъ', 'Ь','ь'];
После этого запишем вывод приглашения на ввод предложения и
считывание этого предложения в переменную Техт.
Write ('Введите предложение ');
Readln (Техt);
Перед началом подсчета количества гласных и согласных букв в
предложении обнулим значения переменных G и S.
Проверку принадлежности символов, составляющих предложение
множествам гласных или согласных букв русского языка запишем с
использованием оператора повтора for, параметр I которого, изменяясь от
1 до значения длины предложения, будет указывать порядковый номер
символа в предложении. Принадлежность очередного символа
предложения множеству гласных или согласных букв запишем операцией
1п. Если условие Техt[I] in Glasn выполняется, то счетчик гласных букв G
увеличивается на 1. Если выполняется условие Техt[I] in Sogl, тогда
увеличивается на 1 счетчик согласных букв S. Если не выполняется ни
первое, ни второе условие, значит, очередной символ в предложении не
является гласной или согласной буквой русского языка. Данный фрагмент
программы запишется так:
For I: =1 to Lengt (Text) do
Begin
If text [I] in Glasn then G: = G+1;
If text [I] in Sogl then S: = S+1;
End;
В заключение программы запишем вывод сообщения о результатах
подсчета гласных и согласных букв русского языка в предложении.
В целом текст программы запишется таким образом:
112
Program Glasn_Sogl; {Подсчет гласных и согласных букв в
предложении}
Tуре
Letters = set of 'A'. .'я'
var
Glasn, Sogl: Letters;
Техt : String;
I : byte;
G, S : Ьуtе;
Ьеgin
Glasn:=['А' ,'а' ,'Е','е', 'И' ,'и','0' ,'o','У ,'у','Э' ,'э','Ю' , 'ю' ,'Я .,'я'];
Sogl: = ['Б'..'Д', 'б'..'д','Ж ', 'ж', 'З', 'з', 'К'..'Н','к'..'н','П', .. 'T', 'п'..'т',
'Ф'..'Щ', 'ф'..'щ', 'Ъ','ъ', 'Ь','ь'];
Write (' Введите предложение ');
Readln(Text);
G: =0;
S: =0;
For I: =1 to Length (Text) do
Begin
If text [I] in Glasn then G: = G+1;
If text [I] in Sogl then S: = S+1;
End;
Writeln (В предложении " ', Text, ' " ', G, ' гласных и ', S, ' согласных
букв');
End.
Запустите интегрированную среду программирования. Введите текст
программы Glasn_Sogl и запишите файл на диск под соответствующим
именем, а затем откомпилир. его. Проверьте действие программы, задавая
различные предложения.
Упражнение 4. Составить программу с контролем ввода данных,
обеспечив ввод фамилии, имени и отчества только на русском языке.
В разделе описания переменных опишем множество Litera,
включающее в себя всевозможные символы, переменную Name для хранения Ф.И.О., Ch для
посимвольного ввода Ф.И.О. Переменная логического типа Rus будет
указывать, принадлежит ли очередной вводимый символ множеству букв
русского языка. Для использования стандартной функции чтения кода
нажатой клавиши ReadKey подключим модуль Crt. Блок описания
запишется так:
Uses crt;
Var
Litera: set of char;
113
Name: string;
Ch: char;
Rus: Boolean;
В начале программы запишем заполнение множества букв русского
алфавита:
Litera: = [' ', 'А' .. 'п' , 'р' .. 'я'];
Затем запишем вывод запроса о вводе Ф.И.О.:
Write ('Введите фамилию, имя, отчество ');
Считывание всех символов, входящих в запись Ф.И.О., запишем с
применением от тора повтора гереаt. Завершение цикла проверим по
нажатии клавиши Епtег (код 13).
Считывание каждого символа вводимого текста Ф.И.О. запишем
оператором повтора гереаt, условием завершения которого зададим
значение Тгuе переменной Rus. В теле оператора повтора сначала считаем
в переменную ch код нажатой клавиши, затем проверим, входит ли
введенный символ во множество букв русского алфавита. Если условие ch
in Litera выполняется, то переменной Rus присваивается значение Тгuе,
данный символ приклеивается к строке Name и печатается в строке ввода,
после чего управление передается на оператор until. Так_как условие
завершения цикла ввода символа на русском языке выполняется,
осуществляется переход к считыванию кода нажатой клавиши.
Если очередной нажатой клавишей является Еnтег, то ReadКеу
возвращает код №#13. Если в операторе if ch<>#13 условие не
выполняется, то управление передастся за его пределы, т. е оператор until
ch=#13, и ввод строки name завершается, так как нажата клавиша enter.
Данный блок программы запишется так:
Repeat {Считать всю строку name}
Repeat {Считать один символ, входящий в множество Litera}
Ch: = ReadKey; {Считать в ch код нажатой клавиши}
If ch<>#13 then begin
Rus: =ch in Litera;
If Rus {Если символ входит в множество Litera }
Then
Begin
Name: =name+ch; {Приклеить введенный символ к name}
Write (ch); {Напечатать введенный символ в строке ввода}
end
е1sе {Код нажатой клавиши не входит в множество Litera}
Begin
Writeln (' Переключитесь в русский регистр');
Write ('и введите Ваше имя ');
End;
End;
114
Until rus; {Завершить ввод очередного символа на русском языке}
Until ch=#13 ;"{ Завершить ввод строки name, т.к. нажата клавиша
Enter}
В заключительной части программы выполняется перевод курсора на
следующую строку и вывод текста "Здравствуйте,", после чего печатается
значение переменной Name.
Полный текст программы будет записан следующим образом:
Program FOI; {Ввод Ф.И.О. только на русском языке}
Uses crt;
vаr
Litera: set of char;
Name: string;
Ch: char;
Rus: Boolean;
Begin
Litera: = [' ', 'А' ... 'п', 'р' ... 'я'];
Write ('Введите фамилию, имя, отчество ');
Repeat {Считать всю строку name}
гереаt: {Считать один символ, входящий в множество Litera}
ch:= readkey; {Считать .в ch код нажатой клавиши}
If ch<>#13 then begin
rus:=ch in Litera;
If Rus {Если символ входит в множество Litera};
Then
Begin
Name:=Name+Ch; {Приклеить введенный символ к Name};
Write (Ch); {Напечатать введенный символ в строке ввода}
End;
Else {Код нажатой клавиши не входит в множество Litera}
Begin
Writeln ('Переключитесь в русский регистр')
Write ('и введите ваше имя');
End;
End;
Until Rus; {Завершить ввод очередного символа на русском языке}
Until Ch=#13; {Завершить ввод строки Name т.к нажата клавиша
Enter}
Writeln;
Writeln ('Здравствуйте, ' ,Name);
End.
Запустите интегрированную среду программирования. Введите текст
программы FOI_RUS и запишите файл на диск под соответствующим
именем, а затем откомпилируйте его. Проверьте действие программы,
115
пытаясь ввести латинские и русские символы. Пронаблюдайте в
пошаговом исполнении значения переменных Ch, Name, Rus и выражений
Ch=#13, Ch in Litera.
5.5 Задачи
Тема: Множества
Вариант
1
2
3
4
Задания
1.Опишите множества М1(1..10) и М2(20..30).
2.Составить программу выделения из множества целых
чисел от 1 до 30 множества чисел, кратных 2.
3.Заданы имена девочек. Определить, какие из этих имен
встречаются во всех классах данной параллели, которые
есть только в некоторых классах и какие из этих имен не
встречаются ни в одном классе.
4.Дан текст из строчных латинских букв, за которыми
следует точка. Напечатать все буквы, входящие в текст по
одному разу.
1.Опишите множества М1(10..20) и М2(30..40).
2.Составить программу выделения из множества целых
чисел от 1 до 30 множества чисел, кратных 3.
3.Задан некоторый набор товаров. Определить для каждого
из товаров, какие из них имеются в каждом магазине и
каких товаров нет ни в одном магазине.
4.Дан текст, за которым следует точка. В алфавитном
порядке напечатать все строчные русские гласные буквы
(а, е, и, о, у, ы, э, ю, я), входящие в этот текст.
1.Опишите множества R и L, содержащие русские и
латинские буквы.
2.Составить программу выделения из множества целых
чисел от 1 до 30 множества чисел, кратных 6.
3.Имеется список класса (все имена различны). Определить,
есть ли в классе человек, который побывал в гостях у
всех. (Для каждого ученика составить множество
побывавших у него в гостях друзей, сам ученик в это
множество не входит.)
4.Дан текст из строчных латинских букв, за которыми
следует точка. Напечатать все буквы, входящие в текст
ровно три раза.
1.Опишите множество PR (1..20) и поместите в него все
простые числа в диапазоне 1..20.
2.Составить программу выделения из множества целых
116
5
6
7
чисел от 1 до 30 множества чисел, кратных 2 или 3.
3.Имеется множество, содержащее натуральные числа из
некоторого диапазона. Сформировать два множества,
первые из которых содержит все простые числа из
данного множества, а второе – все составные.
4.Известны марки машин, изготовляемых в данной стране и
импортируемых за рубеж. Даны некоторые К стран.
Определить для каждой из марок, какие из них были:1)
доставлены во все страны; 2) доставлены в некоторые из
стран; 3) не доставлены ни в одну страну.
1.Опишите множество Alf ('а'..'я') и поместите в него гласные
буквы.
2.Дана непустая последовательность символов. Построить и
напечатать множества, элементами которых являются
встречающиеся в последовательности цифры от '0' до '9' и
знаки арифметических операций.
3.На трех участках возделывают сельскохозяйственные
культуры. Известны виды культур, выращиваемых на
каждом из участков. Определить виды тех культур,
которые возделывают на каждом из участков;
возделывают хотя бы на одном из участков; не
возделывают ни на одном участке. (Культуры: картофель,
укроп, морковь, горох, капуста, редис.)
4.Задано некоторое множество М и множество Т того же
типа. Подсчитать количество элементов в Т и М, которые
не совпадают.
1.Опишите множества М1(1,2) и М2(2,1).Сравните
множества М1 и М2 на равенство.
2.Дана непустая последовательность символов. Построить и
напечатать множества, элементами которых являются
встречающиеся в последовательности буквы от 'A' до 'F' и
от 'X' до 'Z'.
3.В озере водится несколько видов рыб. Три рыбака поймали
рыб, представляющих некоторые из имеющихся видов.
Определить: какие рыбы есть в озере, но нет ни у одного
их рыбаков.
4.Дан текст из строчных латинских букв и цифр. Определить
чего – букв или цифр – больше в этом тексте.
1.Опишите множество Alf ('a'..'я') и поместите в него
согласные буквы.
2.Дана непустая последовательность символов. Построить и
напечатать множества, элементами которых являются
встречающиеся в последовательности знаки препинания и
117
8
9
10
11
буквы от 'E' до 'N'.
3.В N колхозах выращивают некоторые
сельскохозяйственные культуры из имеющегося перечня.
Определить культуры: возделываемые во всех колхозах;
возделываемые только в некоторых колхозах.
4.Подсчитать количество различных цифр в десятичной
записи натурального числа.
1.Опишите множества М1(6,7,8,9,) и М2(6,7,8).Сравните два
этих множества на неравенство.
2.Составить программу подсчета общего количества цифр и
знаков '+', '-', '*' в строке s, введенного с клавиатуры.
3.Есть список игрушек, некоторые из которых имеются в n
детских садах. Определить игрушки из списка: которых
нет ни в одном из детсадов.
4.Напечатать в порядке убывания все цифры , входящие в
запись данного натурального числа.
1.Опишите множества М1('а', 'b') и М2('b', 'a', c').Сравните
два этих множества на неравенство.
2.Составить программу формирования множества строчных
латинских букв, входящих в строку, введенную с
клавиатуры, и подсчета количества знаков препинания в
ней.
3.Составить программу, которая вычисляет сумму тех
элементов двумерного массива, номера строк и столбцов
которых принадлежат соответственно непустым
множествам S1 и S2.
4.Задан год рождения. Определить, сколько человек в списке
жильцов студенческого общежития родились в этот год.
1.Опишите множества М1('a', 'b', 'c') и М2('a', 'c').Сравните
два этих множества по операции >=.
2.Составить программу подсчета количества цифр в
заданной строке и печати их.
3.Задано некоторое множество М и множество Т того же
типа. Подсчитать, сколько элементов из множеств Т и М
совпадает.
4.Дан некоторый текст. Подсчитать количество запятых в
нем.
1.Опишите множества М1(1, 2, 3)и М2(1, 2, 3, 4).Сравните
два этих множества по операции <=.
2.Составить программу печати по одному разу в алфавитном
порядке всех строчных русских гласных букв, входящих в
заданный текст.
118
12
13
14
3.Из диапазона целых чисел m…n выделить множество
чисел, делящихся без остатка или на к, или на l (k, lпростые)
4.Известны сорта роз, выращиваемые тремя цветоводами:
«Анжелика», «Виктория», «Гагарин», «АвэМария»,
«Катарина», «Юбилейная». Определить те сорта, которые
имеются у каждого из цветоводов, которых нет ни у
одного из цветоводов.
1.Опишите множества М1(1,2)и М2(5,6). Получите
результирующее множество М3=М1+М2.
2.Составить программу печати в алфавитном порядке всех
букв текста(текст оканчивается точкой), входящих в него не
менее 2 раз.
3.Дан текст из цифр из строчных латинских букв, за
которыми следует точка. Определить каких букв - гласных
(a, e, I, o, u) или согласных - больше в этом тексте.
4.Определить те имена учеников, которые встречаются во
всех классах данной параллели.
1.Опишите множества М1(3,4 ) и М2(7, 8).Получите
результирующее множество М3=М1+М2.Определите,
имеется ли в М3 элемент 11.
2.Составить программу печати в алфавитном порядке всех
букв текста (текст оканчивается точкой), входящих в него
не более 3 раз.
3.Подсчитать количество одинаковых цифр в десятичной
записи натурального числа.
4.Дан текст из строчных латинских букв, за которыми
следует точка. Напечатать все буквы, входящие в текст
ровно 5 раз.
1.Опишите множества М1(1,2,3,4) и М2(3,4,1).Получите
результирующее множество М3=М1-М2.
2.Составить программу печати в алфавитном порядке всех
букв текста (текст оканчивается точкой), входящих в него
более 2 раз.
3.Напечатать в возрастающем порядке все цифры, не
входящие в запись данного натурального числа.
4.Задан некоторый набор товаров. Определить для каждого
из товаров, какие из них имеются только в некоторых из
магазинов.
119
15
1. Опишите множества М1(4,5,6,7) и М2(6,7,4).Получите
результирующее множество М3=М1-М2.Определите,
имеется ли в множестве М3 элемент 5.
2.Составить программу печати в возрастающем порядке всех
цифр, входящих в десятичную запись данного десятичного
числа.
3.Дан текст из строчных латинских букв, за которыми
следует точка. Напечатать все буквы, входящие в текст не
менее двух раз.
4.Есть список игрушек, некоторые из которых имеются в n
детских садах. Определить игрушки из списка, которые есть
в каждом из детсадов.
16
17
1.Опишите множества М1(1,2,3) и М2(1,4,2,5).Получите
результирующее множество М3=М1*М2.
2.Составить программу печати всех символов заданного
текста, входящих в него по одному разу.
3.Даны два множества A и B, состоящие из строчных и
заглавных букв латинского алфавита. Определить
количество различных подмножеств, включающих в себя
элементы, принадлежащие одновременно обоим
множествам. Пустое подмножество не учитывать.
4. Напечатать все согласные глухие буквы
(к,п,с,т,ф,х,ц,ч,ш,щ), которые есть во втором слове текста.
1.Опишите множества М1(5,6,7) и М2(5,8,6,9).Получите
результирующее множество
М3=М1*М2.Определите,имеется ли в множестве М3
элементы 5 и 6.
2.Составить программу, подсчитывающую число гласных и
согласных букв в заданном тексте и определяющую, каких
букв больше(гласных или согласных), учесть, что в строке
могут быть и другие символы, кроме букв.
3.Имеется информация о том, куклы с какими именами есть
у N девочек. Составить программу, которая выводит список
кукол, имеющихся у каждой из девочек;
4. В восточном календаре года носят названия животных:
крысы, быка, тигра, зайца, дракона, змеи, лошади, овцы,
обезьяны, петуха, собаки, свиньи. Кроме того, через каждые
два года меняется цвет в следующем порядке: синий,
красный, желтый, белый, черный. Таким образом, 1992-й год
- это год черной обезьяны, 1993-й – год чёрного петуха,
1994-й – год синей собаки и т.д. Написать программу,
120
18
19
20
которая переводит заданный год в его название по
восточному календарю.
1.Опишите множества R и L, содержащие русские и
латинские буквы. В цикле вводите русские и латинские
буквы и выводите соответствующее сообщение. Выход из
цикла- введенная буква Z.
2.Составить программу печати всех первых вхождений в
данный текст строчных латинских букв, сохраняя их
взаимный порядок.
3. Имеется информация о том, куклы с какими именами есть
у N девочек. Составить программу, которая выводит список
кукол, имеющихся хотя бы у одной из девочек.
4.Дан текст на русском языке. Напечатать в алфавитном
порядке
все глухие согласные буквы, которые не входят хотя бы в
одно слово.
1.Опишите множество Pr (1..20) и поместите в него все
простые числа в диапазоне 1..20. В цикле организуйте ввод
чисел в диапазоне 1..20 и определите, простые они или нет.
Выход из цикла- введенное значение, равное 99.
2.Составить программу поиска и печати в порядке убывания
всех простых чисел из промежутка[2...201], используя метод
''решета Эратосфена''
3.Имеется информация о том, куклы с какими именами есть
у N девочек. Составить программу, которая выводит список
кукол, которых нет ни у одной из девочек.
4. Дан текст на русском языке. Напечатать в алфавитном
порядке
все гласные буквы, которые не входят хотя бы в одно слово
1.Имеется множество Lat ('a'..'z').Придумайте простейший
способ для вывода на печать аналогов его содержимого.
2. Задано множество вычислительных машин. Известен
набор машин, имеющихся в каждом из 10 техникумов
города. Построить и распечатать множества, включающие в
себя вычислительные машины, которыми обеспечены все
техникумы.
3.Из множества целых чисел 1..N выделить множество
чисел, делящихся на 9 без остатка.
4.В алфавитном порядке вывести все звонкие согласные,
которые входят в каждое нечетное слово и не входят ни в
одно четное слово.
121
21
22
23
1.Составить программу вычисления суммы мест, на которых
в слове X стоят гласные буквы.
2.Задано множество вычислительных машин. Известен
набор машин, имеющихся в каждом из 10 техникумов
города. Построить и распечатать множества, включающие в
себя вычислительные машины, которые имеет хотя бы один
техникум.
3.Составить программу, которая вырабатывает и выводит на
экран дисплея наборы случайных чисел для игры в
"Спортлото 5 из 36". Для заполнения каждой карточки
спортлото необходимо получить набор из пяти
псевдослучайных чисел. К этим числам предъявляются два
требования:
числа должны находиться в диапазоне 1..36;
числа не должны повторяться.
4.При помощи генератора случайных чисел сформировать
множество с заданным количеством элементов.
1.Описать множество М(1..30).Сделать его пустым. Вводя
целые числа с клавиатуры, заполнить множество 5
элементами.
2.Задано множество вычислительных машин. Известен
набор машин, имеющихся в каждом из 10 техникумов
города. Построить и распечатать множества, включающие в
себя вычислительные машины, которых нет ни в одном
техникуме.
3.Из множества целых чисел 1..N выделить множество
чисел, делящихся на 3 без остатка.
4.В данной строке символов S найти различные символы.
1.Найти наименьший элемент во множестве.
2. Если взять то общее, что есть у боба с ложкой, добавить
кота и поместить в тепло, то получится муравей. Так ли это?
Состоит ли муравей из кота?
3.Из множества целых чисел 1..N выделить множество
чисел, делящихся на 6 без остатка.
4.Задать множество, элементы которого - случайные числа
из некоторого диапазона целых чисел; напечатать все
элементы это го множества и подсчитать их количество.
122
24
25
1.Найти наибольший элемент во множестве.
2. .Подсчитать в текстe отдельно число цифр и латинских
букв.
3.Из множества целых чисел 1..N выделить: множество
чисел, делящихся без остатка или на 2 или на 3.
4. Организовать ввод ФИО только на русском языке.
1.Описать множество Mn (1..50) и поместить в него все
числа из диапазона A..B, делящиеся без остатка на k.
2.Задано некоторое множество М и множество Т того же
типа. Подсчитать количество элементов в Т и М, которые
совпадают.
3.Из диапазона целых чисел m…n выделить множество
чисел, делящихся на k*l без остатка
4. Решить ребус СОЛЬ + СОЛЬ = ЛОСЬ.
123
6 Записи
6.1 Понятие записи
Во многих экономических и информационных задачах обрабатываются
ведомости, документы, каталоги, списки. При этом появляется
необходимость объединять данные различного типа в одну группу. Для
работы с группой данных в языке Паскаль введено понятие записи. Запись
- это структура данных, состоящая из фиксированного числа компонентов
разного типа. Составляющие запись компоненты называется полями
записи. В отличие от массива компоненты (поля) записи могут быть
различного типа. Чтобы можно было ссылаться на тот или иной компонент
записи, поля именуются. Записной тип еще называют комбинированным
типом.
Записный тип данных предоставляет программисту возможность
объединить в одну связанную структуру различные по типу и смыслу
элементы. Элементами записи могут быть и структурированные типы
данных, например массивы и другие подчиненные записи. Для обработки
доступна как вся запись целиком, так и отдельные ее поля.
Понятие записи рассмотрим на примере ведомости списка учащихся с
их оценками.
№
1
2
ФИО
Елисеев О.Д.
Кошкин О.А.
ОЦЕНКИ
5
3
Каждая строка в этой ведомости состоит из отдельных элементов
данных различного типа:
а) порядковый номер - целое десятичное число;
б) Фамилия И. О. - массив символов;
в) оценки - массив целых чисел.
Эти данные можно объединить в одну группу и считать записью.
Введем следующие обозначения: В - имя всей записи; п -, порядковый
номер; fio -фамилия, имя, отчество; mark - оценки.
Обращение к элементу записи в программе выполняется с помощью
уточненного (составного) имени. Уточненное имя содержит имя записи и
имя элемента и записывается в следующем виде:
имя записи имя элемента.
Записи, как и другие данные, объявляются в разделе описаний и
используются в разделе операторов.
Структура объявления типа записи такова:
<имя типа> = record <список полей> end
Здесь <имя типа> - правильный идентификатор; record, end зарезервированные слова (запись, конец); <список полей> - последователь124
ность разделов записи, между которыми ставится точка с запятой. Каждый
раздел записи состоит из одного или нескольких идентификаторов полей,
отделяемых
друг
от
друга
запятыми.
За
идентификатором
(идентификаторами) ставится двоеточие и описание типа поля (полей).
Общий вид описания типа Record
TYPE
T=Record
ID11, ID12, …, ID1n : Type1;
ID21, ID22, …, ID2n : Type2;
ID31, ID32, …, ID1n : Type3;
…
IDk1, IDk2, …, IDkn : Typek
End;
Где Idij – идентификаторы полей;
Type i – тип полей;
T – имя поля.
Для представленной ведомости объявление записи выглядит
следующим образом:
type list = record n : integer;
fio : array [1..'!0] of Char;
mark : array [1..3] of integer end;
var В : list;
Возможно объявление записи в разделе переменных:
var В : record n : integer;
fio : array [1..20] of char;
mark : array [1..3] of integer end;
Элемент записи используется в программе в том же самом смысле, как
и обычная переменная. Элемент записи можно указывать как в левой
части оператора присваивания, так и в выражениях. Над элементом
записи можно выполнять действия, допустимые для данных его типа.
Если тип элемента записи - целый, то выполняются все операции,
допустимые для целых данных. Для рассмотренной ведомости над
элементами записи можно произвести, например, следующие операции:
порядковому номеру n записи В присвоить значение 2:
В.п := 2;
найти сумму трех оценок:
s := B mark [1] + В.mark [2] + B mark [3];
ввести значения порядкового номера:
read (B.n).
Обращение к записи в целом, а не только к ее элементам, допускается
125
лишь в операторе присваивания. Слева и справа от знака присваивания
при этом должны использоваться имена записей одинакового типа.
Объявим тип birthday, содержащий три поля с именами day, month и
year;
переменные а и b содержат записи типа birthday; с - запись, содержащая
в качестве элемента подчиненную запись.
type
birthday = record
day.month : byte;
year : word
end;
var a,b : birthday;
с : record
name : string;
bd : birthday end;
В этом случае возможно а := b; a.day>:= 27; b.year := 1939; для
вложенных
полей необходимо продолжать уточнения: c.bd.year, c.bd.day,
с.bd.month.
6.2 Оператор присоединения With ... do
Обращение к конкретным полям записи связано с некоторыми
неудобствами. Составные идентификаторы получаются длинными.
При совместной
обработке ряда полей одной записи длину
идентификаторов
можно сократить.
Чтобы упростить доступ к полям записи, используется оператор
присоединения With:
with <переменная> do <оператор>
Здесь with, do - ключевые слова (с, делать); <переменная> - имя
переменной типа запись, за которым, возможно, следует список
вложенных полей; <оператор> - любой оператор Турбо Паскаля.
Оператор присоединения with ... do открывает запись. В поле его
действия имена полей записи сокращаются. Например:
with c.bd do month := 9;
Это эквивалентно
:
with с do with bd do month := 9;
или c.bd.month := 9.
В такой записи не чувствуется преимущество использования оператора
with. Когда обрабатываются все поля записи, оператор with ... do дает
существенную экономию в размере программы.
Задача. Составить программу формирования архива данных по
126
изданным книгам. Данные включают: автора, название, год издания,
город, где издана, и цену книги.
Предположим, что в архив необходимо занести данные о 50 книгах.
Данные будут представлять собой массив записей. Каждая запись состоит
из:
1) фамилии И. О. автора (author);
2) названия книги (title);
3) названия города, в котором книга выпущена, (city);
4) года издания (year);
5) цены (cost).
Данные author, title, city - символьного типа. Year - может быть
переменной интервального типа. Цена (cost) должна быть переменной
вещественного типа. Объявление нового типа данных entry как записного
будет выглядеть
следующим образом:
entry = record
author, title, city : string;
year : 1..9999;
cost: real;
end;
Далее следует объявить массив из 50 элементов, имеющих тип entry.
Ввод элементов записи (рис. 16) организуем в цикле, причем окончание
цикла зафиксируем вспомогательной переменной ch. Перед вводом
содержимого очередной записи сделаем запрос на продолжение
пополнения архива.
Для ввода компонентов записи используем оператор readln.
Компоненты записи в программе имеют составные
имена: m[i]. author, m[i]. title, m[i].city, m[i].year, m[i].cost.
Программа:
program archives;
uses crt;
label 10;
type
entry = record {Выходные данные по книге} author, title, city : string;
year : 1..9999;
cost : real;
end;
var m : array[1..50] of entry;
{Архив не превышает 50 книг}
{Массив, элементами которого являются записи}
i: integer;
ch : char;
127
begin i := 0;
{Блок формирования архива данных по книгам}
writein ('Пополняешь архив? - Да - [Y]');
ch := readkey;
if upcase(ch) = 'Y' then repeat i :=i+1;
writeln ('Автор книги '); readln(m[i].author);
writeln ('Название книги '); readln(m[i].title);
writeln ('Город издания '); readln(m[i].city);
writeln ('Год издания '); readln(m[i].year);
writeln ('Цена книги '); readtn(m[i].cost);
writeln ('Пополняешь архив? - Да - [Y]');
ch := readkey
until upcase(ch) <> 'Y'
else
begin write ('Вы передумали? До cвидания!');
goto 10 end;
repeat until keypressed;
10:end.
Задача. Усложним предыдущую задачу. Составить программу
подборки книг по указанному автору из сформированного массива
записей.
Для формирования архива используем предыдущую программу. Введем
переменную символьного типа ss - фамилию автора, список книг которого
необходимо вывести. Размер архива запомним в переменной k. Для более
компактного представления используемых переменных, воспользуемся
оператором присоединения with ... do. При этом имена полей записи могут
фигурировать как имена обычных переменных. Для возможности вывода
нескольких списков организуем внешний цикл с признаком окончания ch =
‘Y'.
Программа:
program archives2;
uses crt;
label 10;
type
entry = record {Выходные данные по книге}
author, title, city : string;
year : 1..9999;
cost : real;
end;
var m : array[1..50] of entry;
{Архив не превышает 50 книг}
{Массив, элементами которого являются записи}
i, i, k : integer;
128
ss : string; {Фамилия для поиска} ch : char;
begin i :=0;
{Блок формирования архива данных по книгам}
writein ('Пополняешь архив? - Да - [Y]');
ch := readkey;
if upcase(ch) = 'Y' then
repeat
i := i+1;
with m[i] do begin
writeln('Автор книги');readln(author);
writeln('Название книги'); readln(title);
writeIn(‘ Город издания'); readln(city);
writeln('Год издания '); readln(year);
writeln('Цена книги '); readln(cost);
end;
writein ('Пополняешь архив? - Да - [Y]);
ch := readkey
until upcase(ch) <> 'Y'
else
begin
write ('Вы передумали? До свидания!');
goto 10;
end;
k:=i;
{Блок подборки всех книг по указанному автору}
repeat writeln('Укажите фамилию автора'); readln(ss);
writeln('Cnиcoк книг, автор которых ', ss : 15);
for i := 1 to k do with m[i] do begin if ss = author then
begin
writeln(title);
writeln(‘Город '.city);
writeln(‘Год издания '.year);
writeln('Цена ",cost:8:2);
writein end end;
writeln( "Нужно еще выдавать авторский список? - Да -[Y]');
ch := readkey;
until upcase(ch) <> 'Y';
repeat until keypressed;
end.
После объявления в программе типа «запись» к каждому ее полю
можно обратиться, указав сначала идентификатор переменной-записи, а
затем через точку – имя поля.
129
Независимо от количества объявленных переменных данного типа, поля
каждой из них будут называться одинаково.
Переменная записи называется полной переменной, а поле для
переменной записи называется частичной переменной. Для присвоения
полной переменной конкретного значения надо определить значения всех
полей переменных. Для полных переменных существует единственная
операция – присвоение. Над полем переменной (если она сама не является
записью) можно производить все операции, которые возможны над
элементами типа этого поля.
Для облегчения работы с полями записей в языке вводится оператор
присоединения:
WITH Имя Переменной _Записи DO Оператор;
Внутри оператора (он может быть и составным) обращение к полям
записи производится без указания имени самой (полной) переменной.
program lec9_0;
Type complex=Record
re, im : Real
End;
Var x,y,u,v,v1: complex;
BEGIN
{ввод исходных данных}
write('x.re='); readln(x.re);
write('x.im='); readln(x.im);
write('y.re='); readln(y.re);
write('y.im='); readln(y.im);
{вычисление разности}
u.re:=x.re-y.re;
u.im:=x.im-y.im;
{вывод разности}
writeln('x-y=',u.re:6:2,'+',u.im:6:2,'*i');
{вычисление произведения}
v.re:=x.re*y.re-x.im*y.im;
v.im:=x.re*y.im+x.im*y.re;
{вывод произведения}
writeln('x*y=',v.re:6:2,'+',v.im:6:2,'*i');
{присвоения полной переменной}
v1:=v;
writeln('v1=',v1.re:6:2,'+',v1.im:6:2,'*i');
END.
Записи могут быть вложенными. Если поле В записи А есть в свою
очередь запись, то по отношению к этому полю А.В есть полная
переменная: если в этой записи есть поле С, то для ссылки на это поле
130
используют тот же прием: А.В.С. Если же некоторое поле С является
массивом, то для ссылки на компоненты этого массива используется
переменная с индексами А.В.С[i].
Если же элементами массива являются записи, то обозначение должно
быть следующим: R[i].Поле Записи.
6.3 Вариантные записи
Состав данных зависит от вида объекта, на который составлена запись.
Например, если выходные данные книги содержат ее название, год и место
издания, название издательства, то для журнальной статьи важно знать
название журнала, номер и год выпуска. Возникает необходимость
внесения в структуру записи некоторой вариантной части. С помощью
записей с вариантами можно одновременно сохранять различные
структуры данных, которые имеют общую часть, одинаковую во всех
структурах, и небольшие отличающиеся части в различных структурах.
Вариантный записной тип - это записной тип, содержащий несколько
вариантов структуры записи. Различие может касаться как числа
компонент, так и их типов.
Предположим, что есть, например, такое описание:
type status = (married, widowed, divorced, single),
что означает женатый, вдовец, разведенный, одинокий. В этом случае
человека можно описать с помощью данных следующего типа:
type person = record
{здесь поля общие для всех person} case status of
married: ( { поля только для семейных });
single: ({ поля только для одиноких });
end;
Каждому значению, относящемуся к типу, на основании которого идет
различение вариантов (типу признака), должен соответствовать один из
вариантов. Это означает, что перед вариантами должны появляться все
значения типа признака. В нашем примере, кроме констант married и
single, должны появиться и константы widowed и divorced.
Обычно некоторая компонента (поле) записи сама указывает, о каком
варианте идет речь. В приведенном описании типа следовало бы иметь
общее для всех вариантов поле ms : status. Описание определяющей
вариант компоненты можно включить в заголовок варианта. Такое
описание называется полем признака. Например:
case ms : status of
Прежде чем начать определять структуру записи с вариантами,
соответствующую, например, типу person, полезно бывает выписать всю
необходимую информацию.
1. Имя (name) - первое, последнее (first, last).
131
2. Рост (height) - целое число.
3. Пол (sex) - муж., жен. (male, female).
4. Дата рождения (date) - год, месяц, день (year, month, day).
5. Число иждивенцев (depds) - целое число.
6. Семейное положение (status):
Если в браке (married) или вдов (widowed):
а) дата свадьбы (mdate) - год, месяц, день (year, month, day). Если
разведен (divorced):
а) дата развода (ddate) - год, месяц, день (year, month, day),
б) первый развод (firstd) - нет, да (false, true). Если одинокий (single):
информации нет.
Определение записного типа person можно сформулировать так:
type status = (married, widowed, divorced, single);
date = record
year : 1900..2100;
то : (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec);
day : 1..31;
end;
natural = O.-max;
person = record
name : record first, last: string[15] end;
height: natural;
sex : (male, female);
birth : date;
depdts : natural case ms : status of
married, widowed : (mdate : date);
divorced : (ddate : date; firstd : boolean);
single: ()
end {person};
Задача. Составить программу формирования перечня сведений по
данным архива книг и журналов.
Данная задача отличается от задачи 19 тем, что состав данных в записи
различается для книги и для журнала. Введем перечисляемый тип данных
entrytype, определяющий варианты, type entrytype = (book, magazine).
Данные по каждому наименованию архива включают:
1) автора книги-или статьи (author) - переменная типа string;
2) наименование книги или статьи (title) - string;
3) год издания книги (журнала) - интервальный тип 1 ... 1999;
4) если книга (book):
а) издательство (publisher) - string;
б) город (city) - string. Если журнал (magazine):
а) наименование журнала (magname) - string;
132
б) номер журнала (vol) - integer;
в) количество страниц (page) - integer.
Программа:
program archives3;
uses crt;
label 10;
type entrytype = (book.magazine);
{Вводится специальный тип данных, определяющий варианты}
entry = record
author, title : string;
year : 1..9999;
case tag:entrytype of
{Поле tag определяет ветвь варианта}
book : (publisher,city : string);
magazine : (magname : string; vol, page : integer)
end;
var m : array[1..50] of entry;
i, j, k : integer;
ss : string;
ch : char;
begin i := 0;
{Блок формирования архива данных по книгам}
writeln (‘Пополняешь архив? - Да - [Y]');
ch := readkey;
if upcase(ch) = 'Y' then repeat i := i+1;
writeln(‘Ecли вводите данные по книге, нажмите Y ');
ch := readkey;
if upcase(ch) = 'Y' then
m[i].tag := book
{Переменной варианта присваивается признак книги - book} else
m[i].tag := magazine;
writeln('Автор '); readln(m[i].author);
writeln('Название '); readln(m[i].title);
writeln('год издания '); readln(m[i].year);
{Проверка условия принадлежности объекта к книге}
if m[i].tag = book then
{Ввод данных в поля, специфические для книги} begin
writeIn (‘ Город'); readln(m[i].city);
writeln('Издательство'); readln(m[i]. publisher);
end else
{Ввод данных в поля, специфические для журнала}
begin
133
write ('Название журнала'); readln(m[i].magname);
writeIn(‘ Номер '); readln(m[i].vol);
writeln( 'Страница '); readln(m[i].page);
end;
writein ('Пополняешь архив? - Да - [Y]');
. ch := readkey;
until upcase(ch) <> 'Y'
else
begin write ('Вы передумали? До свидания!');
goto 10 end;
{Блок подборки списка трудов указанного автора}
repeat
writeln('Укажите фамилию автора'); readln(ss);
writeln('Список трудов ', ss : 15);
for i := 1 to k do
begin
if ss = m[i].author then
begin
writeln(m[i].title);
writeln('Год издания ',m[i].year);
if m[i].tag = book then
begin
writeln('Гopoд ',m[i].city);
writeln('Издательство ',m[i]. publisher);
writein
end
else
begin
writeln('Haзвание журнала ',m[i].magname);
writeln('Hoмep ',m[i].vol);
writeln( "Страница ',m[i].page);
writein
end
end
end;
writeln('Нужно еще выдавать авторский список? - Да -[Y]');
ch := readkey;
until upcase(ch) <> 'Y';
repeat until keypressed;
10:end.
134
6.4 Работа с файлами записей
Чаще всего записи используются как элементы файлов, составляющих
компьютерные
информационные
системы.
Рассмотрим
пример
программы, работающих с файлами записей.
Пример
Сформировать файл FM. DAT, содержащий экзаменационную
ведомость одной студенческой группы. Записи файла состоят из
следующих элементов: фамилия, имя, отчество; номер зачетной книжки;
оценка.
Program Examen;
Type Stud= Record
Fio: String [30];
Nz: String [6];
Mark: 2..5
End;
Var Fstud: File Of Stud;
S: Stud;
N, I: Byte;
Begin
Assign (Fstud,’FM. DAT’); Rewrite (Fstud);
Write (‘Количество студентов в группе?’);
Readln (N);
For I:=1 To N Do
Begin
Write (I: 1,’-й, Фамилия И. О.’); Readln (S. FIO);
Write (‘номер зачетки:’); Readln (S.Nz);
Write (‘ оценка:’); Readln (S. Mark);
Write (Fstud, S)
End;
Writeln (‘формирование файла закончено!’);
Close (Fstud);
end.
6.5 Задачи
1 Составить программу, которая использует массив записей
следующей структуры
- Фамилия
- Имя
- Балл по 1 предмету
- Балл по 2 предмету
- Балл по 3 предмету
135
- Средний балл,
выводит данные в виде таблицы и определяет студентов, имеющих
самые лучшие результаты по 2-му предмету;
2. Распечатать список учеников, фамилии которых начинаются на
букву В, с указанием даты их рождения.
3. Составить программу назначения стипендии студентам по
результатам сессии, используя следующие правила:
1) если все оценки 5, назначается повышенная стипендия;
2) если все оценки 4 и 5, назначается обычная стипендия;
3) если есть оценка 3, то стипендия не назначается.
В результате работы программы должен быть напечатан список группы
с оценками и средним баллом каждого студента
4. Из данного списка спортсменов распечатать сведения о тех из них,
кто занимается плаванием. Указать возраст, сколько лет они занимаются
спортом.
5 В таблице хранятся следующие данные об учениках: фамилия, имя,
отчество, рост, масса. Вычислить, каковсредний рост учеников, рост
самого высокого и самого низкого учеников.
6. Вычислить средний балл учеников класса, если известны оценки
каждого ученика по математике, русскому языку и физике. Распечатать
список учеников, имеющих средний балл выше среднего в классе.
7. На аптечном складе хранятся лекарства. Сведения о лекарствах
содержатся в специальной ведомости: наименование лекарственного
препарата, количество, цена, срок хранения (в месяцах). Выяснить сколько
стоит самый дорогой и самый дешевый препарат; сколько препаратов
хранится на складе
8. Распечатать фамилии рабочих бригады, начинающиеся с букв А и С,
с указанием их месячной зарплаты.
9. Распечатать фамилии тех учеников класса, которые являются
троечниками по итогам года. Также указать, насколько их средний балл
отличается от среднего балла хорошиста с самым низким средним баллом
среди хорошистов.
10. Из ассортимента конфет, выпускаемых пермской кондитерской
фабрикой, выбрать те, стоимость которых от 30 до 55 руб.за 1 кг. Указать
срок их годности и номера магазинов, в которых они имеются в продаже.
11. Распечатать анкетные данные учеников, участвовавших в олимпиаде
по информатике и заработавших менее 30 баллов, а также список
победителей олимпиады
12. Распечатать список учеников музыкальной школы, которые учатся
играть на скрипке. Указать также, сколько лет они занимаются музыкой и
принимали ли участие в каких- либо конкурсах.
136
13. Распечатать список автомобилей, участвовавших в гонках (указать
марку, время прохождения трассы, фамилию гонщика). Кто пришел к
финишу первым и последним?
14. Среди работников данного предприятия найти тех, чья заработная
плата за месяц ниже средней по предприятию, а также распечатать список
тех, кто проработал на предприятии более 10 лет, с указанием их фамилии,
зарплаты, стажа работы и должности.
1 5. Из данного списка спортсменов распечатать сведения о тех из них,
кто занимается борьбой и указать сколько.
16. Распечатать фамилии тех учеников, которые не получили ни одной
тройки за последнюю четверть. В каких классах учатся эти ученики? Каков
их средний балл?
17. В таблице хранятся следующие данные об учениках: фамилия, имя,
отчество, рост, масса. Сколько учеников могут заниматься в баскетбольной
секции, если рост баскетболиста должен быть больше 170 см?
18. Распечатать список тех учителей школы, которые преподают
математику и информатику, указать стаж их работы и недельную нагрузку.
19. Даны результаты переписи населения, которые хранятся в памяти
ЭВМ. Напечатать фамилии, имена и подсчитать общее число жителей
женского пола, родившихся после 1990 г.
20. Распечатать фамилии детей данного детского сада, которые
родились в определенном месяце; указать их возраст и группу.
21. Распечатать список учеников, фамилии которых начинаются на
букву Х. Кто из этого списка имеют один и тот же цвет глаз и волос?
22. Распечатать анкетные данные учеников, участвовавших в олимпиаде
по информатике и заработавших не менее 30 баллов.
23. Распечатать список учеников музыкальной школы, которые учатся
играть на скрипке. Указать также, кто из них играет на каком либо другом
инструменте и владеет английским языком.
24. Распечатать фамилии тех учеников класса, которые являются
хорошистами и отличниками по итогам года.
Также указать, насколько их средний балл отличается от среднего
балла класса.
25. Составить программу назначения стипендии студентам по
результатам сессии, используя следующие правила:1) если все оценки 5,
назначается повышенная стипендия; 2) если все оценки 4 и 5, назначается
обычная стипендия; 3) если есть оценка 3, то стипендия не назначается. В
результате работы программы должны быть напечатаны два списка
фамилий (назначенных на повышенную и обычную стипендию)
26. По данным сведениям об учениках класса определить среднюю
массу мальчиков и средний рост девочек. Кто из учеников класса самый
высокий?
137
27. При поступлении в университет лица, получившие оценку
неудовлетворительно на первом экзамене, ко второму экзамену не
допускаются. Считая фамилии абитуриентов и их оценки после первого
экзамена исходными данными, составить список абитуриентов,
поступивших в университет, по итогам двух экзаменов, при условии что
набор составил К человек.
28. Даны результаты переписи населения, которые хранятся в памяти
ЭВМ. Напечатать фамилии, имена и подсчитать общее число жителей,
родившихся после 1990 г.
29. На аптечном складе хранятся лекарства. Сведения о лекарствах
содержатся в специальной ведомости: наименование лекарственного
препарата, количество, цена, срок хранения (в месяцах). Выяснить
наименование препарата, которого больше всего на складе и препарата с
самым маленьким сроком хранения.
30. Выяснить к празднованию нового года у кого из персонала фирмы
есть несовершеннолетние дети к получению подарка и вывести их имена.
31. При поступлении в университет лица, получившие оценку
неудовлетворительно на первом экзамене, ко второму экзамену не
допускаются. Считая фамилии абитуриентов и их оценки после первого
экзамена исходными данными, составить список абитуриентов,
допущенных ко второму экзамену.
32. Среди работников данного предприятия найти тех троих, чья
заработная плата за месяц самая высокая по предприятию, а также
распечатать список тех, кто проработал на предприятии менее 3 лет, с
указанием их фамилии, зарплаты, стажа работы и должности.
33.для каждого из двадцати пяти учеников класса известны фамилия и
оценки по пяти дисциплинам. Требуется вычислить среднюю оценку
каждого из учеников и выбрать человека, имеющего максимальный
средний балл.
34.Определить дату завтрашнего дня.
35.Написать программу, определяющую дату предыдущего дня.
36. Написать программу, определяющую дату, которая наступит через
m дней.
37. Написать программу, определяющую дату, которая была за m дней
до сегодня.
38. Написать программу, определяющую число суток, прошедших от
даты t1 до t2.
39. Написать программу, определяющую день недели, выпадающий на
дату t1 , если известно, что первый день нашей эры был понедельник.
40. Дан массив, содержащий информацию об учениках некоторой
школы, заполнить второй массив данными об учениках только девятых
классов.
138
41. Дан массив, содержащий информацию об учениках некоторой
школы, выяснить, на сколько человек в восьмых классах больше, чем в
девятых.
42. Багаж пассажира характеризуется количеством вещей и общим
весом вещей. Дан массив, содержащий сведения о багаже нескольких
пассажиров. Сведения о багаже каждого пассажира представляет собой
запись с двумя полями: одно поле целого типа (количество вещей) и однодействительное (вес в килограммах). Найти багаж, средний вес одной вещи
в котором отличается не более чем на 0.3 кг от общего среднего веса одной
вещи.
43. . Багаж пассажира характеризуется количеством вещей и общим
весом вещей. Дан массив, содержащий сведения о багаже нескольких
пассажиров. Сведения о багаже каждого пассажира представляет собой
запись с двумя полями: одно поле целого типа (количество вещей) и однодействительное (вес в килограммах). Найти число пассажиров, имеющих
более чем двух вещей и число пассажиров, количество вещей которых
превосходит среднее число вещей.
44. Багаж пассажира характеризуется количеством вещей и общим
весом вещей. Дан массив, содержащий сведения о багаже нескольких
пассажиров. Сведения о багаже каждого пассажира представляет собой
запись с двумя полями: одно поле целого типа (количество вещей) и однодействительное (вес в килограммах). Выяснить, имеется ли пассажир,
багаж которого состоит из одной вещи весом менее 30 кг.
45. Дан текстовый файл, в котором хранятся данные об учениках
класса: фамилия, имя, отчество, адрес (улица, дом, квартира) и домашний
телефон (если есть). Вывести на экран фамилию, имя и адрес тех учеников,
до кого нельзя дозвониться.
46. Дан массив данных о работающих в фирме: фамилия, имя, отчество,
адрес (улица, дом, квартира) и дата поступления на работу (месяц, год). Во
второй массив записать данные только тех из них, кто на сегодняшний
день проработал не менее 5 лет.
47. Опишите запись с именем типа Karta, содержащую следующие поля:
 номер измерения (тип integer)
 значение (тип real).
Переменную, определяющую запись, назовите Z.
48. Опишите запись с именем типа Doc, содержащую следующие поля
 номер строки документа (тип integer);
 текст строки (тип string).
Переменную, определяющую запись, назовите S.
49. . Распечатать фамилии детей данной школы, которые родились в
определенном году и указать их возраст и класс.
139
50. Опишите запись с именем типа Tovar, содержащую информацию о
хранящемся на складе товаре:
 код товара (тип integer);
 наименование товара (тип string);
 цену (тип real).
Переменную, определяющую запись, назовите Tov.
51. Из ассортимента макарон, выпускаемых
фабрикой, выбрать те,
стоимость которых от
20 до 30 рублей за кг. Указать срок их годности и
номера магазинов, в которых они имеются в продаже.
52.Опишите запись с именем типа Graf, содержащую данные,
необходимые для построения графика из 40 точек:
 название графика (тип string).
 40 значений (тип integer).
Переменную, определяющую запись, назовите Х.
53.Опишите запись с именем типа Baza, содержащую информацию для
школьной базы данных:
 личный номер ученика (тип integer);
 ФИО (тип string);
 Год рождения (тип integer);
 Адрес (тип string).
Переменную, определяющую запись, назовите Inf.
54. Опишите запись с именем типа Systema, содержащую информацию
о планетах солнечной системы:
 Номер планеты по удалению от Солнца (тип integer).
 Название планеты (тип string).
 Объем (тип real).
 Диаметр (тип real).
 Удаленность от Земли (тип real).
Переменную, определяющую запись, назовите Planeta.
55. Опишите запись с именем типа Sport, содержащую информацию о
лучших спортивных достижениях школы по легкой атлетике:
 Название вида (тип string).
 Фамилия рекордсмена (тип string).
 Дата установления рекорда (запись Dat,состоящая из полей Day,
Month, Year);
 Сообщение о результате (тип real).
Переменную, определяющую запись, назовите Rec.
56. Опишите запись с именем типа Geometr, содержащую информацию
об оценках учеников вашего класса по геометрии:
 ФИО (тип string);
 Оценка за 9 месяцев max по 20 оценок в месяц.
Переменную, определяющую запись, назовите Dig.
140
57. Опишите запись с именем типа Rasp, содержащую информацию о
движении электропоездов из вашего города:
 Направление (тип string);
 Время отправления электропоездов (тип real).
Переменную, определяющую запись, назовите R.
58. Из ассортимента конфет, выпускаемых Пермской кондитерской
фабрикой, выбрать те, стоимость которых от
30 до 55 рублей за кг.
Указать срок их годности и номера магазинов , в которых они имеются в
продаже.
59.Опишите запись с именем типа Post, содержащую информацию в
почтовой базе данных о подписчиках на газеты и журналы:
 ФИО (тип string);
 Адрес (тип string);
 10 строк с названиями газет и журналов.
Переменную, определяющую запись, назовите G.
60. Опишите запись с именем типа Boln, содержащую информацию в
больничной базе данных о стационарных больных:
 ФИО (тип string);
 Возраст (тип integer);
 Адрес (тип string);
 Дату поступления (тип string);
 Диагноз (тип string);
 ФИО лечащего врача (тип string);
Переменную, определяющую запись, назовите В.
61.Опишите запись с именем типа Tovar, содержащую информацию о
хранящемся на складе товаре:
 код товара (тип integer);
 наименование товара (тип string);
 цену (тип real).
Переменную, определяющую запись, назовите Tov. Без помощи with
присвойте записи начальное значение ( 10, "туфли женские ", 45200.00)
полям одной из записей.
62. Опишите запись с именем типа Data, содержащую информацию о
средней температуре в хранилище за 30 дней:
 номер месяца (тип integer);
 температура (тип real).
Переменную, определяющую запись, назовите Zamer. Без помощи with
присвойте записи начальное значение: месяц '' июль '' и температура для
первого дня 9,5.
63. Опишите запись с именем типа Graf, содержащую данные,
необходимые для построения графика из 40 точек:
 название графика (тип string).
 40 значений (тип integer).
141
Переменную, определяющую запись, назовите Х. С помощью with
присвойте полям записи следующие значения:
название графика
"Y:=f(T)", значения первых трех точек : 5, 7, 9.
64. Опишите запись с именем типа Post, содержащую информацию в
почтовой базе данных о подписчиках на газеты и журналы:
 ФИО (тип string);
 Адрес (тип string);
 10 строк с названиями газет и журналов.
Переменную, определяющую запись, назовите G. С помощью with
присвойте следующие значения полям : "Петров И. В.", "г. Москва , ул.
Горького, 5", "Московский комсомолец", "спорт".
65.Составьте программу,
которая описывает массив записей телефонный справочник одноклассников - и обеспечивает ввод данных ,
поиск номера телефона по фамилии , подсчет и вывод списка всех
абонентов по критерию "увлечение компьютерными играми ". В записи о
каждом однокласснике содержатся следующие сведения: фамилия, имя,
телефон, хобби.
66. Составьте программу, которая описывает таблицу химических
элементов, отображая следующую информацию : название ,
символическое обозначение, массу атома, заряд атомного ядра, перечень
основных химических свойств. Программа должна выполнять вывод
данных о химическом элементе по указанному символическому
обозначению , находить элемент с самой большой массой , с самым
маленьким зарядом ядра.
67. Составьте программу, которая описывает массив записей жильцов
дома, отображая в нем следующую информацию о каждом: номер
квартиры, фамилия, имя, возраст, для лиц старше 18 лет в зависимости от
рода занятий (учеба, работа, пенсия)- запись места учебы, места работы и
трудового стажа , для пенсионеров - год выхода на пенсию . Программа
должна обеспечивать ввод данных , поиск квартиры с максимальным
числом жильцов, поиск самого юного и самого пожилого жильца, поиск
студентов, пенсионеров.
68. Опишите, используя структуру записи, вступительные экзамены, на
которых абитуриенты сдавали 3 экзамена, а для поступления надо было
набрать 12 баллов. Составьте программу, считывающую с клавиатуры
результаты всех вступительных экзаменов и выводящую на экран
следующую информацию:
 список абитуриентов, сдавших все 3 экзамена на 5;
 список абитуриентов, потерпевших неудачу на экзаменах;
 список абитуриентов, зачисленных в институт.
69. Опишите, используя структуру записи, школьный журнал.
Предусмотрите в записи поля для хранения информации о фамилии
учащегося, предмете, оценке. Составьте программу, считывающую с
142
клавиатуры данные об успеваемости учащихся класса и выводящую на
экран сведения об отличниках класса, о средней успеваемости учащихся
класса.
70. Опишите, используя структуру записи, школьный класс (фамилия,
инициалы, месяц рождения , год рождения ).
Составьте программу, считывающую с клавиатуры данные об
учащихся класса и выводящую на экран данные о днях рождения
учащихся по месяцам, например:
Январь 12 Петров И. Н.
23 Камнев Е. Р.
25 Костин В. К.
Февраль 5 Демин В. Е.
11 Иванов Л. О.
71.Найти сумму и произведение двух комплексных чисел:
z1:=a1+ib1 и z2:= a2+ib2.
72. Заданы N точек на плоскости. Найдите точку, ближайшую к началу
координат.
73. Из данного списка спортсменов распечатать сведения о тех из них ,
кто занимается плаванием. Указать того, кто занимается спортом дольше
всех.
74. Составьте программу, выводящую на экран из списка закройщиц
фамилию той, которая получила заказов больше всех.
75. Из базы данных отдела кадров распечатать фамилии сотрудников, у
которых есть дети.
76. Составьте программу, выводящую на экран из списка участников
соревнования по стрельбе тех, которые в борьбе за первенство не сделали
ни одного промаха.
77. Из прайс-листа магазина детских игрушек распечатать названия и
цены тех, которые стоят от 100 до 200 рублей.
78. Составьте программу, выводящую на экран координату одной из
заданных точек, которая находится на одном расстоянии от обеих осей.
79. Из базы данных отдела кадров распечатать фамилии сотрудников, у
которых нет детей.
80. Составьте программу, выводящую на экран список музыкальных
инструментов, у которых более 3 струн и вывести их количество.
81. Из данного списка конкурсанток вывести на экран имена тех из
них, которые уже участвовали в прошлогоднем конкурсе.
82. На полях десяти колхозов посажены овощи. Вывести на печать 3
вида тех, которые наиболее часто встречаются.
83. Из предложенного фирмой списка вакансий на должности показать
те из них, в которых есть требования высшего образования и указать
какого.
143
84. Из списка студентов обучающихся на платной основе в
университете вывести на экран имена тех, которые еще не внесли плату за
следующее полугодие.
85. Из списка всех сотрудников фирмы распечатать фамилии тех, у
которых есть сотовые телефоны.
86. Из списка учеников средней школы распечатать данные о тех,
родители которых тоже учились в этой школе.
87. По данным прошедшего учебного года вывести на экран номера
школ, которые выпустили больше детей, закончивших с золотой медалью.
88. Составьте программу, выводящую на экран из списка участников
соревнования по стрельбе тех, которые вошли в десятку победителей и их
время.
89. По данным сведениям об учениках класса определить среднюю
рост мальчиков и средний вес девочек. Кто из учеников класса самый
маленький ростом?
90. Из базы данных обучающихся в автошколе вывести на экран имена
тех, кто сдал первый и второй этап экзамена по вождению с первого раза.
91.Из базы данных ЗАГСА вывести на экран фамилии и даты рождения
тех, которые были зарегистрированы с1990 по 2000 год.
92. По данным прошедшего учебного года вывести на экран номера
лицеев, которые выпустили больше студентов, окончивших на красные
дипломы.
93.Из книги регистрации поликлиники распечатать фамилии больных
жалующихся за последние 10 дней на сильную головную боль.
94. Выяснить, кто из выпускников школы сумел поступить в учебное
заведение, а также кто поступил в ВУЗ
95. Из списка учеников средней школы распечатать данные о тех,
которые учатся в этой школе не с первого класса, т. е. переведенных из
других школ.
96.По данным метеопрогноза вывести на экран города, в которых не
ожидается завтра дождь. Где будет град?
97. Из списка учеников средней школы распечатать данные о тех,
родители которых не учились в этой школе.
98. Распечатать фамилии рабочих строительной фирмы, начинающиеся
с букв К, с указанием их должности.
99. Вывести на экран по данным регистратуры фамилии женщин,
поставленных на учет и указать их даты рождения.
100. Выяснить, кто из учеников данного класса родился в мае, вывести
на экран их имена.
144
7 Файлы
7.1 Работа с файлами
В Паскале имеются три класса файлов: текстовый файл,
типизированный файл и нетипизированный файл. Начнем с текстовых
файлов.
7.2 Текстовые файлы
Текстовый
файл
содержит
последовательность
символов,
организованных в строки, причем каждая строка заканчивается
специальным символом возврата каретки CR#13 и перевода строки LF#10.
Заканчивается текстовый файл признаком конца файла. Специальные
символы обычно не отображаются программами просмотра текстовых
файлов, Работу с текстовыми файлами обеспечивает модуль System Турбо
Паскаля, не требующий использования оператора uses.
В Паскале имеется стандартный файловый тип text. Прежде чем
приступить к операциям над текстовыми файлами, необходимо ввести
переменные (одну или несколько) типа text:
var in_file: Text;
Переменная in_f1le сопоставляется внешнему файлу на диске или
какому-нибудь устройству процедурой Assign:
Assign(in_fi1e. 'C:\user\Newton\my_file'):
Assign(my_text. 'prn'):
Процедура Assign связывает имя внешнего файла
с файловой
переменной. Внешний файл может
быть обычным файлом,
расположенным на жестком диске, компьютера, но это может быть и файл,
связанный с каким-либо устройством, например, дисплеем или принтером.
Файловая переменная далее используется D программе в качестве
параметра процедур работы с файлами.
Следующий шаг заключается в том, что внешний файл надо открыть
для записи или чтения из него какой-то информации. При открытии файла
выполняются необходимые системные операции, подготавливающие файл
к записи или считыванию информации. Текстовый файл my file
открывается процедурой Reset(my_file) только для чтения и процедурой
Rewrite(my_file) — только дли записи.
При завершении обработки файла программой он должен закрываться.
После закрытия файла связанный с ним внешний файл обновляется. Затем
файловая переменная может быть связана с другим внешним файлом.
Закрывается файл с помощью процедуры Close(my_file).
После того как текстовый файл открыт, с ним можно выполнять
определенные действия, и прежде всего это запись в файл и чтение из него.
145
Доступ к текстовому файлу организуется последовательно — это означает,
что программа не может в любой момент времени считать из него
произвольную порцию информации или произвести запись в произвольное
место
файла.
Любой
файл
представляет
собой
линейную
последовательность элементов, каждый из которых имеет свой помер.
Можно считать, что имеется указатель, который при считывании
очередного элемента файла перемещается к следующему элементу (то есть
становится ближе к концу файла).
Для чтения из текстового файла или записи в текстовый файл можно
использовать процедуры Write, WriteLn, Read и ReadLn, но в качестве
первого параметра в этих процедурах должна быть указана файловая
переменная:
Read(in_file. а. х):
WriteLn(out file. 'Urgent message!'):
Первая процедура присваивает а и х значения очередных двух
элементов из in_file.
Опepaтop вывода допускает описание формата вывода. Если а является
выражением целого, булевого или строкового типа, то
WriteLn(a:n);
означает запись а в правые позиции поля размером в n позиций. Если
указанная длина поля n меньше, чем длина значения а, то заданная длина
игнорируется, например,
WrIteLn('12345', 3);
приведет к выводу всего символьного значения 12345. Значение n
может быть и отрицательным, в этом случае значение записывается в
левые n позиций. В том случае, когда а имеет вещественный тип, должны
быть описаны два поля формата:
Write(a:10:3);
Такое обращение к процедуре вывода означает запись а в форме с
фиксированной точкой, с тремя десятичными разрядами и выравниванием
по правой границе поля размером 10 позиций.
Мы уже знаем, что в Паскале имеются две стандартных файловых
переменных текстового типа — Input и Output. Стандартная файловая
переменная Input представляет собой доступный только для чтения файл,
связанный со стандартным файлом ввода операционной системы
(клавиатура). Вторая стандартная файловая переменная Output — это
доступный только для записи файл, связанный со стандартным файлом
вывода (дисплей). Перед началом выполнения программы DOS эти файлы
автоматически открываются. Имя файла в процедурах Read и Write не
указывается, если работа ведется со стандартным файлом. При
обращениях к стандартным функциям и процедурам ввода/вывода
автоматически производится проверка на наличие ошибок. При
обнаружении ошибки программа прекращает работу и выводит на экран
146
сообщение. Иногда это неудобно. С помощью директив компилятора {$I+}
и {$I-} автоматическую проверку ошибок ввода/вывода можно включить
или выключить. Если автоматическая проверка отключена, ошибки
ввода/вывода, возникающие при работе программы, не приводят к ее
останову. Стандартная функция IOResult возвращает код ошибки. Нулевое
значение кода ошибки означает нормальное завершение операции
ввода/вывода. В табл. 1 приведены процедуры и функции для работы с
файлами (не обязательно текстовыми).
Таблица Процедуры и функции для работы с файлами
Функция
procedure Append(var f: text)
procedure Assign(var f: String)
procedure BlockRead(var F: File; var
Buf; Count: Word)
procedure BlockWrite(var F: File; var
Buf; Count: Word)
procedure ChDir(S: String)
procedure Close(var F)
procedure Erase(var F)
function Eof(var F): boolean
Описание
Открывает существующий файл,
связанный с файловой переменной f,
для добавления в него новых
записей
Связывает внешний файл, имя
которого указано в _ строковой
константе String, с файловой
переменной f
Считывает из нетипизированного
файла, связанного с файловой
переменной f, одну или несколько
записей (их количество задается
целочисленным выражением Count)
в переменную Buf
Записывает в нетипизированный
файл, связанный с файловой
переменной f, одну или несколько
записей (их количество задается
целым выражением Count) из
переменной Buf
Выполняет
смену
текущего
каталога на каталог, маршрут к
которому указан в текстовой
переменной S
Закрывает
открытый
файл,
связанный с файловой переменной F
Стирает
внешний
файл,
связанный с файловой переменной F
Возвращает
для
файла,
связанного с файловой переменной
F, состояние End-of-file (конец
147
function FiTePos(var F): Longlnt
function FileSize(var F): Longlnt
procedure Flush(var F: text)
procedure GetDir(D: Byte: var S:
String);
function lOResult: Integer
procedure MkDir(S: String)
procedure Read(var F: text; v1, ...)
файла): True — если текущее
положение указателя находится в
конце файла или файл пустой; False
— во всех остальных случаях
Возвращает текущую позицию
для файла, связанного с файловой
переменной F. При положении
текущего указателя в начале файла
возвращает нулевое значение. Для
текстовых файлов не используется
Возвращает текущий размер
файла, связанного с файловой
переменной F. Если файл пустой,
возвращает нулевое значение. Для
текстовых файлов не используется
Сбрасывает буфер текстового
файла, связанного с файловой
переменной F и открытого для
вывода процедурами Rewrite или
Append. Это дает гарантию того, что
вся информация, записываемая в
файл, будет сохранена во внешнем
файле. Не влияет на файлы,
открытые для ввода
Возвращает текущий каталог на
заданном диске. Имя каталога
находится в строковой переменной
S, а диск задается значением
параметра D: 0 — текущий диск; 1
— диск А; 2 — диск В; 3 — диск С и
т. д. Если значение, заданное в
параметре
D,
неверное,
возвращается результат «X:\»
Возвращает целое значение,
являющееся состоянием последней
выполненной
операции
ввода/вывода. Нулевое значение
соответствует
нормальному
завершению операции
Создает подкаталог, имя для
которого
задается
строковой
переменной S
Считывает одно или несколько
148
procedure Readln(var F: text; v1, ...)
procedure Renane(var F, S)
procedure Reset(var F)
procedure Rewrite(var F)
procedure RMDir(S: String)
function SeekEof(var F: text):
Boolean
function SeekEoln(var F: text):
Boolean
procedure SetTextBuf(var F: Text
var Buf)
значений из файла, связанного с
файловой переменной F, в одну или
несколько переменных vl...
To же, что и Read, но выполняет
пропуск до начала следующей
строки текстового файла
Переименовывает внешний файл,
связанный с файловой переменной
F,
присваивая
ему
имя,
содержащееся
в
строковой
переменной S
Открывает существующий файл,
связанный с файловой переменной
F.
Текущий
указатель
устанавливается в начало файла.
Текстовый файл открывается только
для чтения
Создает и открывает новый файл,
связанный с файловой переменной
F. Если файл с указанным именем
уже существует, старый файл будет
стерт, а на его месте создается
новый пустой файл. Текущий
указатель устанавливается в начало
файла
Удаляет
пустой
подкаталог,
маршрут
которого
указан
в
строковой переменной S
Перемещает текущую позицию в
файле, связанном с файловой
переменной F, на заданный элемент.
Началу файла соответствует нулевое
значение N. Для текстовых файлов
не используется
Возвращает
для
текстового
файла, связанного с файловой
переменной F, состояние «конец
файла» Возвращает для текстового
файла, связанного с файловой
переменной F, состояние «конец
строки»
Назначает для текстового файла,
связанного с файловой переменной
149
procedure Truncate(var F)
procedure Write(var F: text, v1, ...)
Procedure Writeln(var F: text, v1, ...)
F, буфер ввода-вывода. Никогда не
применяется к открытым файлам,
поскольку в этом случае возможны
потери данных
Усекает
размер
файла,
связанного с файловой переменной
F, до текущей позиции. Вся
информация
после
текущего
положения указателя теряется. Для
текстовых файлов не используется
Записывает в файл, связанный с
файловой переменной F, одно или
несколько значений, хранящихся в
переменных
vl...
Файловая
переменная может быть связана не
только с текстовым файлом. В
случае текстового файла значения
могут иметь целый, вещественный,
строковый, символьный или булев
типы. В случае типизированного
файла
тип
значений
должен
совпадать с типом компонентов
файла
Делает то же, что Write, но затем
записывает в текстовый файл
признак конца строки
7.3 Типизированные файлы
Описание типизированного файла имеет вид
van ftable: file of type_ID;
где type_ID может быть любым типом за исключением файлового.
Элементами типизированного файла являются значения указанного типа.
При работе с типизированными файлами можно использовать уже
знакомые нам процедуры Assign, Reset и Rewrite. Следует заметить, что
текстовый файл, открытый процедурой Reset, доступен только для чтения,
а типизированный — еще и для записи. Процедуры Read и Write здесь
используются по-другому. Отличие заключается в там, что каждый из
параметров в рассматриваемом случае должен быть переменной типа type
ID, а выражения и константы недопустимы. Процедуры ReadLn и WriteLn
применяются только к текстовым файлам. Типизированные файлы
используются для хранения однородной (по типу) информации. Если речь
идет о хранении числовых данных, следует использовать типизированные
150
файлы. Почему? Рассмотрим программу, которая производит запись
числовых данных в текстовый и типизированный файлы.
Программа, демонстрирующая работу с текстовым и типизированным
файлами
program file_of_extended;
var
extfile: file of extended: textfile: text; x, y: extended: i: word;
begin
assign(textfile, 'table.txt');
rewrite(textfile);
x := 0.0;
for i := 1 to 1000 do
begin
у := sin(x); WriteLn ( textfile, y);
x := x + 0.001; end;
close(textfile);
assign(extfile. 'table.ext');
rewrite(extfile);
x := 0.0;
for i := 1 to 1000 do
begin
у := sin(x);
write(extfile, y);
x := x + 0.001: end;
close(extfile);
Write('Работа программы закончена, нажмите <Enter>:');
ReadLn;
end.
После выполнения этой программы на диске (в рабочем каталоге
программы) появятся два файла, table.txt и table.ext. Первый из них
является текстовым файлом, второй — типизированным. Несмотря на то,
что эти файлы содержат одинаковую информацию, между ними имеется
существенное различие. Если просмотреть содержимое обоих файлов, то в
первом случае (текстовый файл) мы увидим столбик цифр. Во втором
случае (типизированный файл) на экране отобразится хаотический набор
символов. Если мы сравним, кроме того, размер обоих файлов, то
обнаружим, что файл table.ext имеет длину 10 000 байт, а файл table.txt —
25 000 байт. Почему? Переменная типа Extended занимает 10 байт, поэтому
типизированный файл, содержащий 1000 чисел типа Extended, имеет
размер 10 000 байт. Но если переменная типа Extended хранится в виде
текстовой строки, то эта строка состоит из 23 символов, так как она
включает показатель степени «E+nnnn» или «Е—nnnns». Добавьте сюда
еще управляющие символы CR и LF, которыми оканчивается каждая
151
строка при вызове процедуры WriteLn, и вы получите 25 символов на
каждое значение типа Extended, записанное в текстовый файл. В итоге это
даст 25 000 байт. По этой причине для хранения числовых данных
экономнее использовать тип file of Extended.
7.4 Нетипизированные файлы
Для более эффективного выполнения операций ввода/вывода из
внешних файлов в Паскале имеются нетипизированные файлы. При работе
с ними можно использовать быстрые дисковые операции низкого уровня.
Нетипизированные файлы дают возможность прямого доступа к любому
файлу на диске независимо от его типа и структуры. Описание
нетипизированной файловой переменной имеет вид
var untypfile: file:
Такая файловая переменная связывается с внешним файлом обычным
образом. В числе параметров процедур Reset и Rewrite для
нетипизированных файлов кроме файловой переменной имеется
необязательный второй параметр типа Word:
Reset(untypfile. n); Rewhte(untypfile, n);
Дополнительный параметр n описывает размер индивидуальной записи
в файле (в байтах). Если параметр n отсутствует, его значение по
умолчанию принимается равным 128, однако рекомендуется явно
указывать значение 1. Это связано с тем, что при любом другом значении
величины записи в файле могут присутствовать неполные записи, а это не
всегда удобно.
Теоретического багажа и практических навыков программирования на
Паскале у нас уже достаточно для того, чтобы приступить к программе,
имеющей достаточно большое практическое значение. Проблема состоит в
том, чтобы прочитать текстовый файл, созданный в операционной системе
UNIX, и записать его в формате текстового файла операционной системы
MS-DOS. Можно представить себе ситуацию, когда некий файл был создан
на сервере, работающем под управлением UNIX, а затем скопирован на
компьютер пользователя, работающий под управлением MS-DOS. He
исключено также, что вы получали такой файл в UU-кодированном виде
по электронной почте. Разница между форматами хранения текстовых
файлов в упомянутых операционных системах состоит в том, что в UNIX
каждая строка текстового файла оканчивается одним управляющим
символом LF, а в DOS каждая строка оканчивается двумя
последовательными управляющими символами CR и LF. Таким образом,
входной файл имеет формат, отличный от текстового формата Паскаля.
Программа преобразования текстовых файлов из формата UNIX в
формат DOS
program Unix2Dos:
152
const
LF =#10; CR = #13;
var
word:
unix_file, dos_file: file;
buffer: array[1..4] of char: input_bytes, output_bytes, i: word;
begin
assign(unix_file, paramstr(1);
reset (unix_file. 1); assign(dos_file. paramstr(2));
rewrite(dos_file. 1);
WriteLn(Выполняется преобразование файла Unix', paramstr(1), в файл
DOS ', paramstr(2));
repeat
blockread(unix_file. buffer, SizeOf(buffer)-2, input_bytes);
for i := input_bytes downto 1 do
begin
if buffer[i] = LF then begin
inc(input_bytes);
move(buffer[i]. buffier[i + 1]. input_bytes - i);
buffer[i] := CR;
end;
end;
blockwrite(dos_file, Buffe, input_bytes, output_bytes);
until (input_bytes =0) or (output_bytes <> input_bytes);
close(dos_file); close(unix_file):
end.
Итак, задача заключается в том, чтобы считать файл UNIX и заменить в
нем каждый символ LF на пару символов CR и LF, не изменяя все
остальные символы. Программа вызывается в командной строке с двумя
параметрами, которыми являются имена входного и выходного файлов:
unix2dos fileunix filedos
Вначале открываются два файла — входной и тот, в который будет
производиться запись. Затем производится считывание «порции» данных
из входного файла. Процедурами для чтения нетипизированных файлов и
для записи в них являются BlockRead и BlockWrite. Программа выделяет в
качестве буфера область памяти, куда будет производиться запись и откуда
будет производиться чтение. Роль буфера играет символьный массив
buffer, размер которого 4 байта. В силу того что мы будем добавлять
символы CR, размер буфера должен быть больше, чем число считанных
байт. В переменной input_bytes содержится количество фактически
считанных байт. Это значение будет равно 2 до тех пор, пока процедура
BlockRead не будет вызвана последний раз. Замечу, что BlockRead имеет
четыре параметра — файловую переменную, переменную буфера,
153
количество байт, которые следует считать, и количество байт, считанных в
действительности. Обращение к BlockWrite имеет аналогичный вид.
Функция paramstr(i) возвращает значение i-гo параметра командной
строки.
7.5 Задачи
№
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Условие задачи
Дан файл f, компоненты которого являются действительными
числами. Найти сумму компонент файла f.
Дан файл b, компоненты которого являются действительными
числами. Найти произведение компонент файла b.
Дан файл t, компоненты которого являются действительными
числами. Найти сумму квадратов компонент файла t.
Дан файл q, компоненты которого являются действительными
числами. Найти модуль суммы и квадрат произведения компонент
файла q.
Дан файл r, компоненты которого являются действительными
числами. Найти последнюю компоненту файла r.
Дан файл k, компоненты которого являются действительными
числами. Найти наибольшее из значений компонент.
Дан файл j, компоненты которого являются действительными
числами. Найти наименьшее из значений компонент с четными но
мерами.
Дан файл y, компоненты которого являются действительными
числами. Найти наибольшее из значений модулей компонент с
нечетными номерами.
Дан файл e, компоненты которого являются действительными
числами. Найти сумму наибольшего и наименьшего из значений
компонент.
Дан файл r, компоненты которого являются действительными
числами. Найти разность первой и последней компонент файла.
Дан файл s, компоненты которого являются целыми числами.
Найти количество четных чисел среди компонент.
Дан файл p, компоненты которого являются целыми числами.
Найти количество удвоенных нечетных чисел среди компонент.
Дан файл u, компоненты которого являются целыми числами.
Найти количество квадратов нечетных чисел среди компонент.
14.
xi 
i  0.1
i  tg 2i
3
Последовательность x1, x2, ... образована по закону
(i=1,2,…). Дано действительное е > 0. Записать в файл h члены
последовательности x1, x2, ... , остановившись после первого члена,
154
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
для которого выполнено xi < е.
Дан символьный файл h. Получить копию файла в файле g.
Даны символьные файлы f1 и f2. Переписать с сохранением
порядка следования компоненты файла f1 в файл f2, а компоненты
файла f2—в файл f1. Использовать вспомогательный файл h.
Даны файлы f1, f2, f3, f4, f5, компоненты которых являются
действительными числами. Организовать обмен компонентами
между файлами в соответствии со следующей схемой;
f1  f 3
f2  f4
f3  f5
f4  f2
f 5  f1
Разрешается использовать только один вспомогательный файл h.
Дан символьный файл t. В файле t не менее двух компонент.
Определить, являются ли два первых символа файла цифрами. Если
да, то установить, является ли число, образованное этими цифрами,
четным.
Дан файл r, компоненты которого являются целыми числами.
Получить в файле g все компоненты файла r являющиеся четными
числами.
Дан файл t, компоненты которого являются целыми числами.
Получить в файле g все компоненты файла t делящиеся на 3 и не
делящиеся на 7.
Дан файл u, компоненты которого являются целыми
числами. Получить в файле g все компоненты файла u являющиеся
точными квадратами.
Дан файл b, компоненты u1, u2 ..., un которого являются
последовательными числами Фибоначчи. Получить в файле b
последовательные числа Фибоначчи u0, u1, ..., un+f.
Дан символьный файл r. Получить файл g, образованный из
файла r заменой всех его прописных (больших) букв одноименными
строчными (малыми).
Вычислить по схеме Горнера значение многочлена с
рациональными коэффициентами для данного рационального
значения переменной. Считать, что числители и знаменатели
коэффициентов записаны в файле l: вначале числитель и
знаменатель старшего коэффициента и т. д., в последнюю очередь
числитель
и
знаменатель
свободного
члена.
Дан файл f, компоненты которого являются целыми числами.
155
26.
27.
28.
29.
30.
31.
32.
33.
Записать в файл g все четные числа файла f, а в файл m — все
нечетные. Порядок следования чисел сохраняется.
Дан символьный файл f. Записать в файл g компоненты файла f в
обратном порядке.
Даны символьные файлы s и g. Записать в файл w сначала
компоненты файла s, затем—компоненты файла g с сохранением
порядка.
Дан файл f, компоненты которого являются целыми числами.
Получить файл g, образованный из файла f исключением повторных
вхождений одного и того же числа.
Дан файл k, компоненты которого являются целыми числами.
Никакая из компонент файла не равна нулю. Файл k содержит
столько же отрицательных чисел, сколько и положительных.
Используя вспомогательный файл t, переписать компоненты файла
k в файл g так, чтобы в файле g не было двух соседних чисел с
одним знаком.
Дан файл k, компоненты которого являются целыми числами.
Никакая из компонент файла не равна нулю. Файл k содержит
столько же отрицательных чисел, сколько и положительных.
Используя вспомогательный файл t, переписать компоненты файла
k в файл g так, чтобы в файле g сначала шли положительные, потом
отрицательные числа.
Дан файл k, компоненты которого являются целыми числами.
Никакая из компонент файла не равна нулю. Файл k содержит
столько же отрицательных чисел, сколько и положительных.
Используя вспомогательный файл t, переписать компоненты файла
k в файл g так, чтобы в файле g числа шли в следующем порядке:
два положительных, два отрицательных, два положительных, два
отрицательных и т. д. (предполагается, что число компонент в
файле k делится на 4).
Дан файл h, компоненты которого являются целыми числами.
Никакая из компонент файла h не равна нулю. Числа в файле идут в
следующем порядке: десять положительных, десять отрицательных,
десять положительных, десять отрицательных и т. д. Переписать
компоненты файла h в файл g так, чтобы в файле g числа шли в
следующем порядке: пять положительных, пять отрицательных,
пять положительных, пять отрицательных и т. д.
Дан файл h, компоненты которого являются целыми числами.
Никакая из компонент файла h не равна нулю. Числа в файле идут в
следующем порядке: десять положительных, десять отрицательных,
десять положительных, десять отрицательных и т. д. Переписать
компоненты файла h в файл g так, чтобы в файле g числа шли в
следующем
порядке:
двадцать
положительных,
двадцать
156
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
отрицательных, двадцать положительных, двадцать отрицательных
и т. д. (предполагается, что число компонент файла h делится на 40).
Дан файл f, компоненты которого являются целыми числами.
Число компонент файла делится на 100. Записать в файл g
наибольшее значение первых ста компонент файла f, затем—
следующих ста компонент и т. д.
Из условия предыдущей задачи удаляется предположение о том,
что число компонент файла f делится на 100. Если в последней
группе окажется менее ста компонент, то последняя компонента
файла g должна быть равна наибольшей из компонент файла f,
образующих последнюю (неполную) группу.
Дан символьный файл f. Добавить в его конец символы е, n, d
(если это необходимо, использовать дополнительный файл g).
Дан символьный файл f. Подсчитать число вхождений в файл
сочетаний ab.
Дан символьный файл f. Определить, входит ли в файл сочетание
abcdefgh.
Даны символьные файлы h и d. Определить, совпадаютли
компоненты файла h c компонентами файла d. Если нет, то
получить номер первой компоненты, в которой файлы h и d
отличаются между собой. В случае, когда один из файлов имеет n
компонент и повторяет начало другого (более длинного) файла,
ответом должно быть число n + 1.
Даны символьные файлы v и n. Записать в файл q все начальные
совпадающие компоненты файлов v и q .
Дан символьный файл h. Записать в файл g с сохранением
порядка следования те символы файла h:
а) которым в этом файле предшествует буква а;
б) вслед за которым в этом файле идет буква а.
Дан символьный файл p. Группы символов, разделенные
пробелами (одним или несколькими) и не содержащие пробелов
внутри себя, будем, называть словами. Удалить из файла все
однобуквенные слова и лишние пробелы. Результат записать в файл
o.
Дан символьный файл u. Найти самое длинное слово среди слов,
вторая буква которых есть е; если слов с наибольшей длиной
несколько, то найти последнее. Если таких слов нет вообще, то
сообщить об этом. Решить эту задачу, полагая, что слова состоят не
более чем из 10 символов.
Дан символьный файл u. Найти самое длинное слово среди слов,
вторая буква которых есть е; если слов с наибольшей длиной
несколько, то найти последнее. Если таких слов нет вообще, то
сообщить об этом. Решить эту задачу без ограничения на число
157
45.
46.
47.
48.
49.
50.
51.
52.
53.
символов в слове.
Дан символьный файл h. Считая, что количество символов в
слове не превосходит двадцати: определить, сколько в файле h
имеется слов, состоящих из одного, двух, трех и т. д. символов.
Дан символьный файл h. Считая, что количество символов в
слове не превосходит двадцати: получить гистограмму (столбчатую
диаграмму) длин всех слов файла h.
Дан символьный файл h. Считая, что количество символов в
слове не превосходит двадцати: определить количество слов в
файле h.
Дан символьный файл f. Предполагается, что длина одного
слова не превосходит десяти и что число слов делится на 100.
Подготовить файл для печати слов в две колонки по пятьдесят строк
на странице. Слова должны быть размещены в файле f1 в
следующем порядке:
1-е слово, 51-е слово, 2-е слово, 52-е слово, ..., 50-е слово, 100-е
слово, затем (следующая страница) 101-е слово, 151-е слово, ...,
150-е слово, 200-е слово и т. д.
Дан символьный файл f, содержащий сведения о сотрудниках
учреждения, записанные по следующему образцу: фамилия _имя
_отчество, фамилия_имя_отчество, ... Записать эти сведения в файле
g,
используя
образец
имя
_отчество_фамилия,
имя
_отчество_фамилия,…
Дан символьный файл k, содержащий произвольный текст
длиной более 5000 слов. Слова в тексте разделены пробелами и
знаками препинания. Получить 100 наиболее часто встречающихся
слов и число их появлений. Решить задачу без ограничения на
длины слов.
Дан символьный файл k, содержащий произвольный текст
длиной более 5000 слов. Слова в тексте разделены пробелами и
знаками препинания. Получить 100 наиболее часто встречающихся
слов и число их появлений. Решить задачу предполагая, что любое
слово текста состоит не более чем из 16 букв.
Даны два символьных файла f1 и f2. Файл f1 содержит
произвольный текст. Слова в тексте разделены пробелами и знаками
препинания. Файл f2 содержит не более 40 слов, которые разделены
запятыми. Эти слова образуют пары: каждое первое слово считается
заменяемым, каждое второе слово—заменяющим. Найти в файле f1
все заменяемые слова и заменить их на соответствующие за
меняющие. Результат поместить в файле h.
Прямая на плоскости задается уравнением ах+bу+с = 0, где а и b
одновременно не равны нулю. Будем рассматривать только прямые,
для которых коэффициенты а, b, с—целые числа. Пусть h—файл,
158
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
содержащий коэффициенты нескольких прямых (не менее трех).
Переписать из файла h в файл q коэффициенты тех прямых, которые
параллельны первой из прямых, заданной в файле h.
Прямая на плоскости задается уравнением ах+bу+с = 0, где а и b
одновременно не равны нулю. Будем рассматривать только прямые,
для которых коэффициенты а, b, с—целые числа. Пусть h—файл,
содержащий коэффициенты нескольких прямых (не менее трех).
Переписать из файла h в файл q коэффициенты тех прямых, которые
пересекают первую из прямых, заданных в файле h.
Условие предыдущей задачи сохраняется. Требуется получить в
файле g коэффициенты всех различных прямых файла f.
Багаж пассажира характеризуется количеством вещей и общим
весом вещей. Дан файл v, содержащий информацию о багаже
нескольких пассажиров, информация о багаже каждого отдельного
пассажира представляет собой соответствующую пару чисел .
Найти багаж, средний вес одной вещи в котором отличается не
более чем на 0,3 кг от общего среднего веса вещи.
Сведения об ученике состоят из его имени и фамилии и названия
класса (года обучения и буквы), в котором он учится. Дан файл f,
содержащий сведения об учениках школы. Выяснить, имеются ли в
школе однофамильцы.
Дан файл e, содержащий те же самые сведения об учениках
школы, что и в предыдущей задаче, и дополнительно отметки,
полученные учениками в последней четверти. Выяснить, сколько
учеников школы не имеют отметок ниже четырех.
Дан файл t, содержащий те же самые сведения об учениках
школы, что и в предыдущей задаче, и дополнительно отметки,
полученные учениками в последней четверти.
Собрать
в
файле g сведения о лучших учениках школы, т. е. об учениках, не
имеющих отметок ниже четырех и по сумме баллов не уступающих
другим ученикам своего и параллельных классов.
Сведения об автомобиле состоят из его марки, номера и фамилии
владельца. Дан файл k, содержащий сведения о нескольких
автомобилях. Найти фамилии владельцев и номера автомобилей
данной марки.
Сведения об автомобиле состоят из его марки, номера и фамилии
владельца. Дан файл u, содержащий сведения о нескольких
автомобилях. Найти количество автомобилей каждой марки.
Дан файл y, содержащий различные даты. Каждая дата—это
число, месяц и год. Найти год с наименьшим номером.
Дан файл t, содержащий различные даты. Каждая дата—это
число, месяц и год. Найти все весенние даты.
Дан файл p, содержащий различные даты. Каждая дата—это
159
65.
66.
67.
68.
69.
70.
число, месяц и год. Найти самую позднюю дату.
Дан файл h, содержащий сведения о книгах. Сведения о каждой
из книг — это фамилия автора, название и год издания. Найти
названия книг данного автора, изданных с 1960 г.
Дан файл l, содержащий сведения о книгах. Сведения о каждой
из книг — это фамилия автора, название и год издания. Определить,
имеется ли книга с названием «Информатика». Если да, то
сообщить фамилию автора и год издания. Если таких книг
несколько, то сообщить имеющиеся сведения обо всех этих книгах.
Дан файл y, который содержит номера телефонов сотрудников
учреждения: указывается фамилия сотрудника, его инициалы и
номер телефона. Найти телефон сотрудника по его фамилии и
инициалам.
Дан файл w, содержащий сведения о кубиках: размер каждого
кубика (длина ребра в сантиметрах), его цвет (красный, желтый,
зеленый или синий) и материал (деревянный, металлический,
картонный). Найти количество кубиков каждого из перечисленных
цветов и их суммарный объем.
Дан файл d, содержащий сведения о кубиках: размер каждого
кубика (длина ребра в сантиметрах), его цвет (красный, желтый,
зеленый или синий) и материал (деревянный, металлический,
картонный). Найти количество деревянных кубиков с ребром 3 см и
количество металлических кубиков с ребром, большим 5 см..
Дан файл r, содержащий сведения о веществах: указывается
название вещества, его удельный вес и проводимость (проводник,
полупроводник, изолятор). Найти удельные веса и названия всех
полупроводников.
Дан файл b, содержащий сведения о веществах: указывается
название вещества, его удельный вес и проводимость (проводник,
полупроводник, изолятор). Выбрать данные о проводниках и
упорядочить их по убыванию удельных весов.
72.
Дан файл z, содержащий сведения об экспортируемых товарах:
указывается наименование товара, страна, импортирующая товар, и
объем поставляемой партии в штуках. Найти страны, в которые
экспортируется данный товар, и общий объем его экспорта.
73.
Даны два файла t и p. Файл t—это инвентарный файл,
содержащий сведения о том, сколько изделий каких видов
продукции хранится на складе (вид продукции задается его
порядковым номером).
Файл p—это вспомогательный файл,
содержащий сведения о том, насколько уменьшилось или
увеличилось количество изделий по некоторым видам продукции.
Вспомогательный файл может содержать несколько сообщений по
71.
160
74.
75.
76.
77.
78.
79.
80.
81.
82.
продукции одного вида или не содержать ни одного такого
сообщения.
Обновить
инвентарный
файл
на
основе
вспомогательного, образовав новый файл g.
Дан файл g, содержащий сведения об игрушках: указывается
название игрушки (например, кукла, кубики, мяч, конструктор и т.
д.), ее стоимость в копейках и возрастные границы детей, для
которых игрушка предназначена (например, для детей от двух до
пяти лет). Получить названия игрушек, цена которых не превышает
4 руб. и которые подходят детям 5 лет.
Дан файл h, содержащий сведения об игрушках: указывается
название игрушки (например, кукла, кубики, мяч, конструктор и т.
д.), ее стоимость в копейках и возрастные границы детей, для
которых игрушка предназначена (например, для детей от двух до
пяти лет). Получить
цену самого дорогого конструктора,
оформленную по образцу ... руб. ... коп..
Дан файл l, содержащий сведения об игрушках: указывается
название игрушки (например, кукла, кубики, мяч, конструктор и т.
д.), ее стоимость в копейках и возрастные границы детей, для
которых игрушка предназначена (например, для детей от двух до
пяти лет). Получить названия наиболее дорогих игрушек (цена
которых отличается от цены самой дорогой игрушки не более чем
на 1 руб.).
Даны натуральное k, символьный файл r и текстовый файл h.
Файл r содержит 30 слов, каждое из которых будем называть
ключевым. Сформировать файл g, который содержит строки файла
h, циклически сдвинутые так, чтобы каждое ключевое слово, входящее в строку, начиналось с k-й позиции. Строки, не содержащие
ключевых слов, в файл g не включаются. Строки, которые содержат
n ключевых слов, записываются в файл g n раз.
Дан текстовый файл d, содержащий программу на языке паскаль.
Проверить эту программу на несоответствие числа открывающих и
закрывающих круглых скобок. Считать, что каждый оператор
программы занимает не более одной строки файла.
Дан текстовый файл j. Получить все его строки, содержащие
более 60 символов.
Дан текстовый файл s. Переписать в файл g все компоненты
файла s о заменой в них символа 0 на символ 1 и наоборот.
Дан текстовый файл h. Получить самую длинную строку файла.
Если в файле имеется несколько строк с наибольшей длиной, то
получить одну из них.
Дан текстовый файл h. Записать в перевернутом виде строки
файла h в файл g. Порядок строк в файле g должен совпадать
с
порядком исходных строк в файле h.
161
83.
84.
85.
86.
87.
88.
89.
90.
91.
Дан текстовый файл k. Записать в перевернутом виде строки
файла k в файл l. Порядок строк в файле l должен
быть обратным
по отношению к порядку строк исходного файла.
Дан текстовый файл f. Переписать компоненты файла f в файл g,
вставляя в начало каждой строки по одному пробелу. Порядок
компонент должен быть сохранен.
Даны текстовый файл, строка s. Получить все строки файла f,
содержащие в качестве фрагмента строку s
Дан текстовый файл r. Исключить пробелы, стоящие в концах
его строк. Результат поместить в файл h.
Даны два текстовых файла f и g. Определить, совпадают ли
компоненты файла f с компонентами файла g. Если нет, то получить
номер первой строки и позицию первого символа в этой строке, в
которых файлы f и g отличаются между собой.
Дан файл d, компоненты которого являются натуральными
числами. Количество чисел в файле кратно 4. Первые два числа из
каждых четырех задают координаты левого верхнего угла
прямоугольника, следующие два числа—координаты его правого
нижнего угла. Построить прямоугольники, заданные в файле d.
Дан текстовый файл k. Каждая строка файла содержит несколько
натуральных чисел в их символьном представлении. Числа
разделяются запятыми или пробелами и определяют вид некоторой
геометрической фигуры, ее размеры и положение на экране.
Приняты следующие соглашения:
1) отрезок прямой задается координатами своих концов, имеет
номер 1;
2) прямоугольник задается координатами левого верхнего и
правого нижнего угла, имеет номер 2;
3) окружность задается координатами центра и радиусом, имеет
номер 3;
4) ломаная задается количеством ее вершин, их координатами и
имеет номер 4. Так, например, строка 1, 10, 10, :30, 30 определяет
отрезок прямой с координатами концов (10, 10) и (30, 30), а строка
3, 100, 100, 50 — окружность с центром в точке (100, 100) и
радиусом 50.
Построить на экране все геометрические фигуры, заданные в
файле k.
Написать программу, которая на сменном диске компьютера (А:)
создает файл numbers.txt и записывает в него 5 введенных
пользователем целых чисел. Просмотрите при помощи редактора
текста, например, встроенного в Norton Commander, созданный
файл. Убедитесь, что каждое число находится в отдельной строке.
Напишите
программу,
которая
дописывает
в
файл
162
92.
93.
94.
95.
96.
97.
98.
99.
a:\numbers.txt 5 введенных пользователем целых чисел. Убедитесь
при помощи редактора текста, что в файле находятся 10 чисел.
Написать программу, которая выводит на экран содержимое
файла a:\numbers.txt.
Написать программу, которая позволяет просматривать
текстовые файлы (выводит на экран содержимое файла), например,
файлы исходных программ Turbo Pascal. Имя просматриваемого
файла должно вводиться во время работы программы.
Написать программу, которая дописывает в файл phone.txt,
находящийся на диске А:, фамилию и номер телефона, например,
вашего товарища. Если файла на диске нет, то программа должна
создать его. В файле каждый элемент данных (имя, фамилия,
телефон) должен находиться в отдельной строке.
Написать программу, используя которую можно за один сеанс
работы добавить информацию о нескольких людях в файл
a:\phone.txt.
Написать программу, которая позволяет найти нужные сведения
в телефонном справочнике (a:\phone.txt). Программа должна
запрашивать фамилию человека и выводить его телефон. Если в
справочнике есть одинаковые фамилии, то программа должна
вывести список всех людей, имеющих эти фамилии.
Написать универсальную программу тестирования. Тест,
последовательность вопросов и варианты ответов должны находиться в текстовом файле. Имя этого файла программа должна
получать из командной строки ее запуска. Количество вопросов
теста не ограничено. Однако предлагается ввести следующее
ограничение: текст вопроса и альтернативных ответов не должен
занимать более одной строки экрана.
Программа должна выставлять оценку по следующему правилу:
ОТЛИЧНО — за правильные ответы на все вопросы, ХОРОШО —
если испытуемый правильно ответил не менее, чем на 80% вопросов, УДОВЛЕТВОРИТЕЛЬНО — если правильных ответов
более 60%, и ПЛОХО — если правильных ответов меньше 60%.
Напишите программу, которая по желанию пользователя
выводит таблицу пересчета из дюймов в миллиметры на экран,
принтер или в файл.
Число компонент файла f, компонентами которого являются
целые числа, кратно десяти. Переписать компоненты файла f в файл
g, изменяя порядок чисел в каждой десятке так, чтобы
а) вначале шли отрицательные числа десятки, а за ними —
неотрицательные;
б) вначале шли числа, делящиеся на 3, затем числа, дающие при
делении на 3 остаток 1, затем числа, дающие при делении на 3
163
остаток 2.
Порядок самих десяток должен быть сохранен.
100. Пусть файлы а и b, компоненты которых являются целыми
числами, упорядочены по неубыванию. Получить в файле с все
числа файлов а и b без повторений. Файл с должен быть упорядочен
по возрастанию.
164
8 Графика
8.1 Графика в Турбо Паскале
Экран дисплея ПК представляет собой прямоугольное поле, состоящее
из большого количества точек. Дисплей может работать в текстовом и
графическом режимах. Но в отличие от текстового режима в графическом
режиме имеется возможность изменять цвет каждой точки.
Чтобы
сделать процесс графического программирования более
эффективным,
фирма
Borland
International
разработала
специализированную библиотеку Graph (в этом библиотечном модуле
содержится 79 графических процедур, функций, различных стандартных
констант и типов данных), набор драйверов, позволяющих работать с
разными типами мониторов, и набор шрифтов для вывода на графический
экран текстов разной величины и формы.
Аппаратная поддержка графики ПК обеспечивается двумя основными
модулями: видеомонитором и видеоадаптером. Какой бы адаптер ни был
установлен на компьютере, мы можем использовать один и тот же набор
графических процедур и функций Турбо Паскаля благодаря тому, что их
конечная
настройка
на
конкретный
адаптер
осуществляется
автоматически. Эту настройку выполняют графические драйверы.
Запуск и завершение работы в графической системе осуществляется
следующим образом:
1.
Подключить модуль Graph (библиотеку графических процедур):
normal">uses Graph;
2. Установить графический режим:
- описываем переменные, которые определяют графический драйвер и
монитор:
var gd, gm: integer;
- задаем команду ПК для самовыбора значений переменных:
gd:=Detect;(значение gm после команды gd:=detect; определяется
автоматически)
- инициализируем графический режим:
InitGraph( gd, gm,’ указывается путь к драйверу, чем подробнее, тем
лучше’)
С этого момента все графические средства доступны пользователю.
3. Завершить работу в графической системе: CloseGraph;
Графические функции
GetMaxX - определяет максимальный размер экрана по оси x.
GetMaxY - определяет максимальный размер экрана по оси y.
GetX - координата текущей позиции курсора по оси x.
GetY - координата текущей позиции курсора по оси y.
165
8.2 Базовые процедуры и функции
Для построения изображений на экране используется система
координат. Отсчет начинается от верхнего левого угла экрана, который
имеет координаты (0,0). Значение Х (столбец) увеличивается слева
направо, значение Y (строка) увеличивается сверху вниз. Чтобы строить
изображения, необходимо указывать точку начала вывода. В текстовых
режимах эту точку указывает курсор, который присутствует на экране. В
графических режимах видимого курсора нет, но есть невидимый текущий
указатель CP (Current Pointer). Фактически это тот же курсор, но он
невидим.
Процедуры модуля Graph
Процедура
SetColor
SetBkColor
SetFillStyle
SetLineStyle
SetTextStyle
SetFillPattern
ClearDivice
SetViewPort
Формат
SetColor (a: word);
Действие
Устанавливает
цвет,
которым
будет
осуществляться рисование
SetBkColor (a: word);
Устанавливает цвет фона
SetFillStyle (a,b: word);
Устанавливает стиль и
a – стиль закраски, b – цвет закраски
цвет
SetLineStyle
(a,b,c:
Устанавливает стиль и
word);
толщину линии
а – стиль линии, bобразец
построения
линии
(может
устанавливаться
пользователем),
столщина линии
SetTextStyle
(a,b,c:
Устанавливает
шрифт,
word);
стиль и размер текста
SetFillPattern (Pattern:
Выбирает
шаблон
FillpatternType;
заполнения, определенный
Color:word);
Pattern- пользователем
маска
ClearDivice
Очищает
экран
и
устанавливает
текущий
указатель в начало
SetViewPort (x1, y1 , x2,
Устанавливает текущее
y2
:
integer, окно
для
графического
Clip:boolean);
вывода
166
ClearViewPort
PutPixel
ClearViewPort
PutPixel (a,b,c :integer);
Line
Line(x1, y1 , x2,y2
:integer);
Rectangle (x1, y1 , x2,
y2:integer );
Rectangle
Bar
Bar3D
Circle
Arc
Ellipse
FillEllipse
MoveTo
MoveRel
OutText
OutTextxy
Sector
Bar (x1, y1 , x2,
y2:integer);
Bar3D (x1, y1 , x2,y2,
d:integer, a:boolean);
Circle (x,y,r: word);
Очищает окно
Рисует точку цветом с в
(x,y)
Рисует линию от (x1, y1) к
(x2,y2)
Рисует прямоугольник с
диагональю от (x1, y1) к (x2,
y2)
Рисует
закрашенный
прямоугольник
Рисует
трехмерную
полосу (параллелепипед)
Рисует
окружность
радиуса r с центром в точке
(x, y)
Рисует
дугу
из
начального
угла
к
конечному, используя (x,y)
как центр
Рисует
эллиптическую
дугу от начального угла к
конечному, используя (x, y)
как центр
Arc(x, y, , , R:integer);
, - начальный и
конечный
углы
в
градусах
Ellipse (x, y, , , Rx, Ry:
integer);
, - начальный и
конечный
углы
в
градусах
FillEllipse (x, y, Rx,
Рисует
закрашенный
Ry:integer);
эллипс
Rx, Ry – вертикальная и
горизонтальная оси
MoveTo (x, y:integer);
Передвигает
текущий
указатель в (x, y)
MoveRel(x, y : integer);
Передвигает
текущий
указатель
на
заданное
расстояние
от
текущей
позиции на x по горизонтали
и на y по вертикали
OutText (text: string);
Выводит
текст
от
текущего указателя
OutTextxy(x, y: integer,
Выводит текст из (x, y)
text: string);
Рисует
и
заполняет
Sector(x, y, , , Rx, Ry:
сектор эллипса
integer);
, - начальный и
167
конечный
углы
в
градусах
Функции модуля Graph
GetBkColor
GetColor
GetX
GetY
GetPixel
Возвращает текущий фоновый цвет
Возвращает текущий цвет
Возвращает координату X текущей
позиции
Возвращает координату Y текущей
позиции
Возвращает цвет точки в (x, y)
8.3 Экран и окно в графическом режиме
По аналогии с текстовыми режимами графический экран может
рассматриваться как одно большое или несколько меньших по размеру
окон. После установки окна вся остальная площадь экрана как бы не
существует, и весь ввод-вывод осуществляется только через окно. В
каждый отдельный момент может быть активным только одно окно. Если
окон несколько, за переключение ввода-вывода в нужное окно отвечает
программист.
По умолчанию окно занимает весь экран, значения координат его
левого верхнего и правого нижнего угла устанавливаются автоматически
процедурой инициализации InitGraph.
Если требуется создать окно, следует воспользоваться процедурой
SetViewPort (x1, y1, x2, y2 : integer, Clip:boolean) ; где x1, y1 – координаты
левого верхнего угла, x2, y2 –
координаты правого нижнего угла окна. Параметр Clip определяет,
будет ли рисунок отсекаться при выходе за границы окна (Clip:= True) или
нет (Clip:=False). После создания окна за точку отсчета принимается
верхний левый угол окна, имеющий координаты (0,0).
Координатную систему полного экрана можно восстановить, в
частности, с помощью ClearDevice или задав в процедуре установки окна
максимально возможные значения:
SetViewPort( 0, 0, GetMaxX, GetMaxY, true);
Необходимо помнить, что в отличие от текстовых окон графические
окна после команды установки фона SetBkColor и очистки с помощью
ClearViewPort меняют фон вместе с общим фоном экрана. Поэтому фон
(точнее «закраску») графического окна следует устанавливать с помощью
процедур SetFillStyle и SetFillPattern.
Машинные координаты
Начало машинной системы координат, направление осей, а также
максимальные значения координат монитора показаны на рисунке
168
На рисунке приведена также машинная (xm, ym) и физическая (x,y)
системы координат. Для изображения на экране точки с физическими
координатами (x,y) необходимо определить ее машинные координаты (x m,
ym). Расчетные формулы имеют следующий вид (попробуйте
самостоятельно получить эти формулы):
xm=x0+x*Mx ,
ym=y0-y*My,
где Mx, My-масштабы соответственно по осям x и y, которые
показывают число пикселей в одной физической единице,
x, y- физические координаты точки,
xm, ym- машинные координаты точки,
x0, y0- машинные координаты начала физической системы координат.
Пример. Нарисовать через весь экран горизонтальную и вертикальную
линии, пересекающиеся в центре монитора.
Этапы разработки программы сведены в таблицу.
Таблица
Этапы
N
Выполнение
программирования
Нарисовать
через
весь
экран
1
Постановка задачи горизонтальную и вертикальную линии,
.
пересекающиеся в центре монитора.
Изобразим вид экрана с указанием
координат
требуемых линий
2
.
Математическое
описание
169
3
.
4
Написание
программы
5
Отладка
получение
результатов
.
.
Разработка
структограммы
Program P5;
Uses graph; {подключение граф.модуля}
Var gd,gm:integer;
Begin
gd:=detect;{определение граф. драйвера}
InitGraph(gd,gm,’ ‘);{инициализация
графики}
Line(0, round(GetMaxY/2), GetMaxX,
Round(GetMaxY/2));{гориз. лин.}
Line(round(GetMaxX/2), 0,
Round(GetMaxX/2), GetMaxY);
{вертик. лин.}
Readln; {пустой ввод}
CloseGraph; {закрытие графики}
End.
и
Выполнить самостоятельно
8.4 Вывод простейших фигур
Вывод точки
Какие бы изображения не выводились на экран, все они построены из
точек, теоретически можно создать любое изображение путем построения
точек определенного цвета в нужном месте экрана. В библиотеке Graph
вывод точки осуществляется процедурой
PutPixel (x, y: integer, color:word);
где x, y: координаты расположения точки, color – цвет.
Возможные значения Color приведены в таблице:
Цветовая шкала
таблица 1
Цвет
Black – черный
Blue – синий
Код
0
1
Цвет
DarkGray – темно-серый
LightBlue – голубой
170
Код
8
9
Green - зеленый
Gyan – бирюзовый
2
3
Red – красный
Magenta – малиновый
4
5
Brown – коричневый
LightGray – светло-серый
6
7
LightGreen – ярко-зеленый
LightGyan
–
яркобирюзовый
LightRed – ярко-красный
LightMagenta
–
яркомалиновый
Yellow – желтый
White – белый
10
11
12
13
14
15
Пример.
PutPixel(320, 240, 4);

- выводит в центре экрана точку красного цвета
PutPixel(320,240, Red);
Вывод линии
Из точек строятся линии (отрезки прямых). Это можно сделать с
помощью процедуры
Line (x1, y1 , x2,y2 :integer);
где x1, y1 – координаты начала, x2,y2 - координаты конца линии,
например Line(1,1,600,1);
В процедуре Line нет параметра для установки цвета. В этом случае
цвет задается процедурой SetColor (цвет: word); где цвет из таблицы 1.
Пример.
SetColor(Gyan);
Line(1,1,600,1);
Для черчения линий применяются еще две процедуры: LineTo и
LineRel. Процедура LineTo (x,y: integer) строит линию из точки текущего
положения указателя в точку с координатами x,y. Процедура LineRel
(dx,dy: integer) проводит линию от точки текущего расположения
указателя (x, y) в точку x+dx, y+dy.
Турбо Паскаль позволяет вычерчивать линии самого различного
стиля: тонкие, широкие, штриховые, пунктирные и т.д. Установка стиля
производится процедурой SetLineStyle(a,b,c: word), где a устанавливает тип
строки, возможные значения которого приведены в таблице 2; b – образец,
с – толщина линии, определяемая константами, указанными в таблице 3.
Если применяется один из стандартных стилей, то значение b равно 0.
Если пользователь хочет активизировать собственный стиль, то значение b
=4. В этом случае пользователь сам указывает примитив (образец), из
которого строится линия.
Например:
SetLineStyle(1,0,1);
Line(15,15, 150,130);
или
171
SetLineStyle(UserBitLn,$5555,ThickWidth);
Line(15,15, 150,130);
таблица 2
Константа
SolidLn
DottedLn
CenterLn
DashedLn
UserBitLn
Значение
0
1
2
3
4
таблица 3
Константа
Значение
Описание
1
3
Нормальная толщина (1 пиксель)
Жирная линия (3 пикселя)
NormWidth
ThickWidth
Описание
Непрерывная линия
Линия из точек
Линия из точек и тире
Штриховая линия
Тип пользователя
Пример: Написать программу, которая вычерчивает треугольник
красной линией в центре экрана.
Program treug;
uses graph; { подключение библиотеки графических процедур}
var gd,gm: integer; {описание переменных, определяющих графический
драйвер и монитор}
begin
gd:=detect; {определение значений переменных по выбору ПК}
initgraph(gd, gm, ‘ c/bp’); {инициализация графического режима}
SetColor(4); {задание цвета линии}
SetLineStyle(1,0,3); {задание стиля линии}
Line(320, 240, 320, 180);
Line(320, 240, 390, 240);
Line(390, 240, 320, 180);
end.
8.5 Графические процедуры
Arc(x,y:integer;St,En,R:word); {рисование дуги, где x,y - коорд. центра
дуги, R - радиус, St, En - нач. и конечный углы.}
ClearDevice; {очистка экрана}
172
Circle(x,y:integer;R:word); {окружность радиуса R
cцентром в точке (x,y)}
CloseGraph; {закрытие графики}
InitGraph(gd,gm:integer;Path:string); {инициализация графики, где
gd - графический драйвер,
gm - графический режим,
Path - путь размещения файла
с расширением .bgi.}
Line(x1,y1,x2,y2:integer); {рисование линии, проходящей через две
точки:
с координатами (x1,y1) и (x2,y2) }
LineRel(dx,dy:integer); {рисование линии: dx, dy – приращения
координат к координатам текущей
позиции курсора}
LineTo(x,y:integer); {рисование линии, проходящую через текущую
позицию курсора и точку с координатами (x,y)}
Moveto(x,y:integer); {задание координат текущей точки}
OutText(T:string); {вывод текста в текущую точку}
OutTextXY(x,y:integer;T:string);{вывод текста в точку с координатами
х,у}
Rectangle(x1,y1,x2,y2:integer); {рисование прямоугольника: (x1,y1) и
(x2,y2) - координаты противоположных вершин}
PutPixel(x,y:integer;c:word); {выводит точку с координатами (х,у)
цветом с}
173
8.6 Построение прямоугольников
Для построения прямоугольных фигур имеется несколько процедур.
Первая из них – вычерчивание одномерного прямоугольника: Rectangle (x1,
y1 , x2, y2:integer ), где x1, y1 – координаты левого верхнего угла, x2, y2координаты правого нижнего угла прямоугольника. Область внутри
прямоугольника не закрашена и совпадает по цвету с фоном.
Более эффектные для восприятия прямоугольники можно строить с
помощью процедуры Bar (x1, y1 , x2,
y2:integer), которая рисует
закрашенный прямоугольник. Цвет закраски устанавливается с помощью
SetFillStyle. Еще одна эффектная процедура: Bar3D (x1, y1 , x2,y2, d: integer,
a:boolean) вычерчивает трехмерный закрашенный прямоугольник
(параллелепипед). При этом используются тип и цвет закраски,
установленные с помощью SetFillStyle. Параметр d представляет собой
число пикселей, задающих глубину трехмерного контура. Чаще всего его
значение равно четверти ширины прямоугольника ( d:= (x2 - x1) div 4 ).
Параметр a определяет, строить над прямоугольником вершину (а:=True)
или нет (a:=False).
Примеры использования:
1. SetColor(Green);
Rectangle (200, 100, 250,300);
2. SetFillStyle(1,3);
Bar(10,10,50,100);
3. SetFillStyle(1,3);
Bar3D(10,10,50,100,10,True);
8.7 Построение многоугольников
Многоугольники можно рисовать самыми различными способами,
например с помощью процедуры Line. Однако в Турбо Паскале имеется
процедура DrawPoly, которая позволяет строить любые многоугольники
линией текущего цвета, стиля и толщины. Она имеет формат DrawPoly( a:
word, var PolyPoints)
Параметр PolyPoints является нетипизированным параметром, который
содержит координаты каждого пересечения в многоугольнике. Параметр а
задает число координат в PolyPoints. Необходимо помнить, что для
вычерчивания замкнутой фигуры с N вершинами нужно передать при
обращении к процедуре DrawPoly N+1 координату, где координата
вершины с номером N будет равна координате вершины с номером 1.
Проиллюстрируем на примере:
program tr; {Программа вычерчивает в центре экрана треугольник
красной линией}
174
uses crt, graph;
var gd, gm: integer;
pp: array[1..4] of PointType;
xm, ym, xmaxD4, ymaxD4:word;
begin
gd:= detect;
Initgraph(gd, gm, ‘ c/bp’);
xm:=GetmaxX; ym:=GetmaxY;
xmaxD4:=xm div 4;
ymaxD4:= ym div 4;
{определение координат вершин}
pp[1].x := xmaxD4;
pp[1].y := ymaxD4;
pp[2].x := xm - xmaxD4;
pp[2].y := ymaxD4;
pp[3].x := xm div 2;
pp[3].y := ym - ymaxD4;
pp[4] :=pp[1];
SetColor(4); {цвет для вычерчивания}
DrawPoly(4,pp); {4 – количество пересечений +1}
readln;
CloseGraph
end.
В результате работы программы на экране появится красный
треугольник на черном фоне. Изменить фон внутри треугольника можно с
помощью процедуры FillPoly(a: word, var PolyPoints). Значения параметров
те же, что и в процедуре DrawPоly. Действие тоже аналогично, но фон
внутри многоугольника закрашивается. В качестве примера нарисуем в
левой верхней части экрана четырехугольную звезду зеленого цвета:
program g;
uses crt, graph;
const
Star: array[1..18] of integer = (75, 0, 100, 50, 150, 75, 100, 100, 75, 150, 50,
100, 0, 75, 50, 50, 75, 0);
var
gd, gm: integer;
begin
gd:= detect;
initgraph(gd, gm, ‘ c/bp’);
SetFillStyle(1,2);
FillPoly(9,Star); {9 – количество пересечений + 1}
CloseGraph;
end.
175
8.8 Построение дуг и окружностей
Процедура вычерчивания окружности текущим цветом имеет
следующий формат:
Cicrle(x, y, r: word), где x, y – координаты центра окружности, r – ее
радиус.
Например, фрагмент программы обеспечит вывод ярко-зеленой
окружности с радиусом 50 пикселей и центром в точке (450, 100):
SetColor(LightGreen);
Circle(450, 100, 50);
Дуги можно вычертить с помощью процедуры Arc(x, y: integer, , ,
R:integer), где x, y- центр окружности, , - начальный и конечный углы в
градусах, R – радиус. Для задания углов используется полярная система
координат.
Цвет для вычерчивания устанавливается процедурой SetColor. В случае
=0 и =360, вычерчивается полная окружность.
Например, выведем дугу красного цвета от 0 до 90 в уже вычерченной
с помощью Circle(450, 100, 50) окружности:
SetColor(Red);
Arc(450, 100, 0, 90,50);
Для построения эллиптических дуг предназначена процедура Ellipse
(x, y: integer, , , Rx, Ry: integer), где x, y – центр эллипса, Rx, Ry:
горизонтальная и вертикальная оси. В случае =0 и =360 вычерчивается
полный эллипс. Например, построим голубой эллипс:
SetColor(9);
Ellipse(100, 100, 0, 360, 50,50);
Фон внутри эллипса совпадает с фоном экрана. Чтобы создать
закрашенный эллипс, используется специальная процедура FillEllipse (x, y:
integer, Rx, Ry: integer). Закраска эллипса осуществляется с помощью
процедуры SetFillStyle (a, b: word), где а – стиль закраски (таблица 4), b –
цвет закраски (таблица 1). Например, нарисуем ярко-красный эллипс,
заполненный редкими точками зеленого цвета:
SetFillStyle(WideDotFill, Green); { установка стиля заполнения}
SetColor(12); {цвет вычерчивания эллипса}
FillEllipse(300, 150, 50, 50);
Стандартные стили заполнения
таблица 4
Константа
EmptyFill
SolidFill
Значение
0
1
Маска
Заполнение цветом фона
Заполнение текущим цветом
176
LineFill
2
LtslashFill
3
SlashFill
4
BkslashFill
5
LtbkSlahFill
6
HatchFill
7
XhatchFill
8
InterLeaveFill
9
WideDotFill
10
CloseDotFill
11
UserFill
12
Заполнение символами --, цвет
– color
Заполнение
символами
//
нормальной толщины, цвет –
color
Заполнение
символами
//
удвоенной толщины, цвет –
color
Заполнение
символами
\\
удвоенной толщины, цвет –
color
Заполнение
символами
\\
нормальной толщины, цвет –
color
Заполнение
вертикальногоризонтальной штриховкой
тонкими линиями, цвет – color
Заполнение штриховкой крестнакрест
по
диагонали
«редкими» тонкими линиями,
цвет – color
Заполнение штриховкой крестнакрест
по
диагонали
«частыми» тонкими линиями,
цвет – color
Заполнение
«редкими»
точками
Заполнение
«частыми»
точками
Заполнение по определенной
пользователем
маске
заполнения, цвет – color
Для построения секторов можно использовать следующие процедуры:
PieSlice (x, y: integer, , , R: word), которая рисует и заполняет сектор
круга. Координаты x, y – центр окружности, сектор рисуется от начального
угла  до конечного угла , а закрашивание происходит при
использовании специальных процедур;
Sector (x, y: integer, , , Rx, Ry: word), которая создает и заполняет
сектор в эллипсе. Координаты x, y – центр, , Rx, Ry – горизонтальный и
вертикальный радиусы, и сектор вычерчивается от начального угла  до
конечного угла .
177
Пример использования PieSlice:
SetFillStyle(10, 10); {установка стиля}
SetColor(12); {цвет вычерчивания}
PieSlice(100, 100, 0, 90, 50);
Пример использования Sector:
SetFillStyle(11, 9); {установка стиля}
SetColor(LightMagenta); {цвет вычерчивания}
Sector(300, 150, 180, 135, 60, 70);
8.9 Работа с текстом
Вывод текста
Выводимые на экран изображения лучше всего сопровождать
пояснительным текстом. В графическом режиме для этого используются
процедуры OutText и OutTextXY.
Процедура OutText(Textst: string) выводит строку текста, начиная с
текущего положения указателя. Например, OutText(‘нажмите любую
клавишу’); Недостаток этой процедуры – нельзя указать произвольную
точку начала вывода.
В этом случае удобнее пользоваться процедурой OutTextXY(x, y:
integer, Textst: string), где x, y – координаты точки начала вывода текста,
Textst – константа или переменная типа String. Например, OutTextXY(60,
100, ‘Нажмите любую клавишу’)
Вывод численных значений
В модуле Graph нет процедур, предназначенных для вывода
численных данных. Поэтому для вывода чисел сначала нужно
преобразовать их в строку с помощью процедуры Str, а затем подключить
посредством ‘+’ к выводимой строке.
Например: Max:=34.56;
Str(Max : 6 : 2, Smax);{результат преобразования находится в
Smax}
OutTextXY(400, 40, ‘Максимум=’ + Smax);
Для удобства преобразование целочисленных и вещественных типов
данных
в
строку лучше
осуществлять
специализированными
пользовательскими функциями IntSt и RealSt:
function IntSt(Int: integer) : string;
var Buf : string[10];
begin
Str(Int, Buf);
IntSt := Buf;
end;
178
function RealSt(R : real, Dig, Dec : integer) : string;
var Buf: string[20];
begin
Str(R : Dig : Dec, Buf);
RealSt := Buf;
end;
Эти функции указываются как параметры в процедурах OutText и
OutTextXY. Например: x:= 5.295643871;
OutTextXY(20, 20, ‘x=’+RealSt(x,11,9));
В результате на экране появится x=5.29564443871
Шрифты
Вывод текста в графическом режиме может осуществляться
различными стандартными (таблица 5) и пользовательскими шрифтами.
Различают два типа шрифтов: растровые и векторные. Растровый шрифт
задается матрицей точек, а векторный – рядом векторов, составляющих
символ.
По умолчанию после инициализации графического режима
устанавливается растровый шрифт DefaultFont, который, как правило,
является шрифтом, используемым драйвером клавиатуры.
таблица 5 Стандартные шрифты
Шрифт
Файл
TriplexFont
Trip.chr
SmallFont
Litt.chr
SansSerifFont
Sans.chr
GothicFont
Goth.chr
Большинство стандартных шрифтом не содержат русских символов.
Разработка же собственных шрифтов – довольно сложный и трудоемкий
процесс.
Он
может
быть
ускорен,
если
воспользоваться
специализированными пакетами TurboFont, BgiToolKit.
Установить
нужный
шрифт
можно
процедурой
SetTextStyle(Font,d,c:word), где Font – выбранный шрифт, d – направление
( горизонтальное или вертикальное), с – размер выводимых символов.
Возможные значения двух первых параметров представлены в таблице 5.
При организации вертикального вывода необходимо учитывать, что если
не установить точку начала вывода с помощью MoveTo, то текст
начинается с нижней строки экрана и продолжается вверх. Величина
символов устанавливается коэффициентом с. Если с=1, то символ строится
в матрице 88, если с= 2, то матрица 1616 и т.д. до 10-кратного
увеличения.
179
Например выведем 2 строки (вертикальную и горизонтальную)
шрифтом DefaultFont разной величины:
SetTextStyle(0,11); {буквы стандартной величины}
OutTextXY(200,200, ‘Вертикальная строка’);
SetTextStyle(0,0,2); {размер букв увеличен}
OutTextXY(200,220, ‘Горизонтальная строка’);
Выравнивание текста
В некоторых случаях требуется в пределах одной строки выводить
символы выше или ниже друг друга. Выравнивание текста выполняется с
помощью процедуры SetTextJustify(Horiz, Vert : word) как по вертикали,
так и по горизонтали посредством задания параметров Horiz и Vert
(возможные значения в таблице 6).
таблица 6 Параметры выравнивания
Параметр
Значение
Горизонтальное выравнивание
LeftText
0
CenterText
1
RightText
2
Вертикальное выравнивание
BottomText
0
CenterText
1
TopText
2
Комментарий
Выровнять влево
Центрировать
Выровнять вправо
Переместить вниз
Центрировать
Переместить вверх
В качестве примера выведем x2:
SetTextJustify(1, 1);
OutTextXY(100,100, ‘X’);
SetTextJustify(1, 0);
OutTextXY(108,100, ‘2’);
8.10 Построение графиков функций
Для построения графиков функций при помощи графического режима
предполагается свободное владение учениками понятием функции, ее
графическим и аналитическим представлением. Необходимо также
использовать операторы цикла, которые помогут избежать однообразного
труда по вычислению ординаты каждой точки.
До сих пор при создании рисунков использовали только первый
квадрант системы координат. Для построения большинства функций в
требуемом интервале изменения необходимо работать хотя бы в двух
квадрантах. В общем случае полезно изображать систему координат в
любой части плоскости, но наиболее наглядно располагать ее в центре
180
экрана. В таких случаях, установив начало координат в точке (x0, y0) на
экране, можно координаты (x, y) произвольной точки кривой определять
разностью (x-x0, y-y0). После этого в программе можно употреблять не
только положительные, но и отрицательные значения.
Рисунок получается маленьким, поэтому требуется увеличить масштаб
изображения. Если для функции будет использован весь экран, надо
увеличить рисунок по x и по y в зависимости от выбранного экрана.
Выбрать масштаб увеличения можно следующим образом:
-определить горизонтальный и вертикальный размеры графика (для
этого вводятся границы области значений и определяются максимальное и
минимальное значение функции на заданной области определения, затем
вычисляются разности максимального и минимального значений
аргументов и функции, которые и являются горизонтальным и
вертикальным размерами графика соответственно);
-определить масштаб (сначала определяются масштабы изображения по
горизонтали и вертикали с учетом размеров выбранного экрана по
формуле:
масштаб(г/в) = размер экрана (по г/в) / размер графика (по г/в), затем из
них выбирается меньший, который и принимается за необходимый
масштаб. В нашем случае графический экран имеет размеры 640 на 480.
В любом случае, чтобы высветить на экране точку, надо взять x,
вычислить по данной абсциссе y и выполнить рисование точки. Так как на
экране можно получить лишь ограниченное количество значений х, то их
перебираем с помощью цикла.
Пример. Построить график функции y=x2
Вариант 1
program f;
uses graph;
var gd, gm: integer;
x, y: real;
begin
gd:= detect;
initgraph( gd, gm, ‘c/ bp’);
SetColor(5);
Line(0, 240, 640, 240);
Line(320, 0, 320, 480);
x:= -20;
While x<=20 do
begin
y:= -Sqr(x);
PutPixel( x *5 + 320, y*5 +240, 15);
x:=x + 0.01;
end;
181
end.
Вариант 2
program f;
uses graph, crt;
var gd, gm: integer;
x, y, mx, my, m,x1, x2, y1, y2,h: real;
function f(x:real): real;
begin
f:= Sqr(x);
end;
clrscr;
Write(‘Введите границы отрезка’);
Read(x1, x2);
y1:=f(x1); y2:=f(x2);
mx:=640 /(x2 –x1);
my:=480 / (y2 – y1);
If mx< my Then m:=mx
else m:= my;
h:= 1/m; x:=x1;
gd:= detect;
initgraph(gd, gm, ‘c/ bp’);
SetColor (5);
Line(0, 240, 640, 240);
Line(320, 0, 320, 480);
While x<= x2 do
begin
y:= -f(x);
PutPixel(x *m +320, y*m +240, 15);
x:= x+ h;
end;
end.
Рассмотрим построение графика функции, заданной параметрически.
В отличие от функции, заданной в явном виде y=f(x), параметр х в этом
случае также является функцией, зависящей от некоторого значения.
Пример.
Построить график функции (кардиоида)
x = a cos t ( 1+ cost), y = a sin t( 1+cost), a > 0, t  [0, 2 )
Приведем фрагмент программы:
SetColor (5);
Line(0, 240, 640, 240);
182
Line(320, 0, 320, 480);
t:=0; a:=3;
While t<= 3.1415 do
begin
x:=a*cos(t)*(1+cos(t));
y:= - a sin(t)*(1+cos(t));
PutPixel(x*5 +320, y*5 +240, 15);
x:= x+ 0.01;
end;
Пример. Написать программу построения графика функции y=x2 для
x∈[-1;1].
Этапы разработки программы сведены в таблицу.
Таблица
N
Этапы
программирования
Выполнение
1.
Постановка задачи
Построить график функции y=x2 для x∈[-1;1].
Изобразим вид экрана, который мы хотели бы
получить после выполнения программы.
2.
Математическое
описание
3.
Разработка
структограммы
4. Написание
Program P6;
183
программы
5.
Uses graph;
Var gd,gm:integer;
x,y:real;
x0,y0,xm,ym,Mx,My:integer;
begin
gd:=detect;
InitGraph(gd,gm,’ ‘);
Mx:=300; x0:=320; My:=440; y0:=460;
{выбраны для монитора 640×480 пикс.}
For xm:=20 to 620 do
Begin
x:=(xm-x0)/Mx;
y:=sqr(x);
ym:=round(y0-y*My);
PutPixel(xm,ym,1);
End;
Readln;
CloseGraph;
End.
Отладка и получение
Выполнить самостоятельно
результатов
8.11 Циклы в графике. Построение случайных процессов
Для того, чтобы картинки не были монотонными и регулярными,
можно задавать фигурам случайные размеры, цвет, координаты. Для этого
имеется специальная функция Random. Она генерирует случайные числа
из [0, 1). Для расширения первоначального промежутка используется
функция Random(I: word), которая выдает число из диапазона 0… I. На
самом деле эти функции генерируют некоторую последовательность
псевдослучайных чисел, и чтобы добиться иллюзии полной «случайности»
используют команду Randomize, которая изменяет базу датчика случайных
чисел.
Пример. Нарисовать в случайном месте экрана точку случайного цвета
Фрагмент программы:
Randomize
x:=random(640); y:=Random(480); c:=Random(15);
PutPixel(x, y, c);
Пример. Нарисовать 5000 точек случайного цвета в случайном месте.
Фрагмент программы:
For i:=1 to 5000 do
184
begin
x:=Random(640); y:=Random(480); c:=Random(15);
PutPixel(x, y, c);
end;
8.12 Создание иллюзии движения
Создать видимость движения изображения на экране можно
несколькими способами. Рассмотрим два из них.
I способ. Имитация движения объекта на экране за счет
многократного выполнения программой набора действий: нарисовать –
пауза – стереть (нарисовать в том же месте цветом фона) – изменить
координаты положения рисунка.
Перед началом составления программы надо продумать описание
«двигающегося» объекта, характер изменения координат, определяющих
текущее положение объекта, диапазон изменения и шаг.
Упражнение 1. Изучить текст программы, которая рисует модель
атома. Проверить ее действие.
program Model_At;
uses Crt, Graph;
const
Ra=100;{радиус атома}
Rc=10; {радиус ядра}
Re=4; {радиус электрона}
k=0.5; {коэффициент сжатия орбит электронов}
Dr=30; {параметр изменения координат электрона}
Step1=0.2; {шаг изменения положения электрона}
Step=100; {время задержки – скорость движения электронов}
var
cx, cy, y, y1, y2, x, x1, x2, x3, y3:integer;
I, I1, I2, I3: real; gd, gm: integer;
begin
clrscr;
gd:=detect; initgraph(gd, gm, ‘путь к драйверу’);
SetTextStyle(0, 0, 2); OutTextXY(200, 30, ‘Модель атома’);
cx:= GetMaxX div 2; {определить центр экрана- положение ядра}
cy:= GetMaxY div 2;
PieSlice(cx, cy, 0, 360, Rc);{нарисовать ядро атома}
SetColor(Red); SetLineStyle(0, 0, 3);
Line(cx-7, cy, cx+7, cy); Line(cx, cy-5, cx, cy+5);
SetLineStyle(0,0,1); SetFillStyle(1, 1);
I:=Pi/4; {задать начальное положение 4 электронов}
I1:= - Pi/4; I2:= - Pi/2; I3:= Pi/2;
185
SetTextStyle(0, 0, 1);SetColor(jellow);
OutTextXY(180, 420,’Для отмены нажмите любую клавишу’);
While not KeyPressed do {повторять, пока не нажата любая клавиша }
begin
{ определить координаты электронов}
x:=Round (Ra*cos(I)) +cx; Y:= Round (k+Ra*sin(I)) +cy;
x1:= Round((Ra+Dr)*cos(I1)) +cx; y1:= Round (k*(Ra+Dr)*sin(I1)) +cy;
x2:= Round((Ra-Dr)*cos(I2)) +cx; y2:= Round (k*(Ra-Dr)*sin(I2)) +cy;
x3:= Round((Ra-Dr)*cos(I3)*2.3) +cx; y3:= Round (k*(Ra-Dr)*sin(I3)*2.3)
+cy;
{установить синий цвет и нарисовать электроны}
SetColor(1);
Circle (x, y, Re); PutPixel(x, y, 2);
Circle (x1, y1, Re); PutPixel(x1, y1, 2);
Circle (x2, y2, Re); PutPixel(x2, y2, 2);
Circle (x3, y3, Re); PutPixel(x3, y3, 2);
Delay(Step);
{нарисовать электроны цветом фона}
SetColor(0);
Circle (x, y, Re); PutPixel(x, y, 2);
Circle (x1, y1, Re); PutPixel(x1, y1, 2);
Circle (x2, y2, Re); PutPixel(x2, y2, 2);
Circle (x3, y3, Re); PutPixel(x3, y3, 2);
{задать изменение положения электронов}
I:=I + Step1; I1:=I1 – Step1; I2:=I2 + Step1; I3:=I3 + Step1;
end; {конец цикла}
CloseGraph;
end.
II способ. Иллюзия движения создается при помощи специальных
процедур и функций.
Функция ImageSize(x1, y1, x2, y2: integer):word возвращает размер
памяти в байтах, необходимый для размещения прямоугольного фрагмента
изображения, где x1,y1 – координаты левого верхнего и x2, y2 – правого
нижнего углов фрагмента изображения.
Процедура GetImage(x1, y1, x2, y2:integer, var Buf) помещает в
память копию прямоугольного фрагмента изображения, где x1, ..,y2 –
координаты углов фрагмента изображения, Buf – специальная переменная,
куда будет помещена копия видеопамяти с фрагментом изображения. Buf
должна быть не меньше значения, возвращаемого функцией ImageSize с
теми же координатами.
Процедура PutImage(x1, y1, x2, y2:integer, var Buf, Mode:word)
выводит в заданное место экрана копию фрагмента изображения, ранее
186
помещенную в память процедурой GetImage. X, Y – координаты левого
верхнего угла того места на экране, куда будет скопирован фрагмент
изображения; Buf –специальная переменная, откуда берется изображение,
Mode – способ копирования. Координаты правого нижнего угла не
указываются, так как они полностью определяются размерами выводимой
на экран копии изображения. Координаты левого верхнего угла могут быть
любыми, лишь бы только копия уместилась в пределах экрана (если копия
не размещается на экране, то она не выводится , и экран остается без
изменений). Параметр Mode определяет способ взаимодействия
размещаемой с уже имеющимся на экране изображением ( табл. 7)
Таблица 7
Константа
Значени
Операция
Пояснения
е
NormalPut
0
XorPut
1
OrPut
2
AndPut
3
NotPut
4
Замена
Стирает
часть
существующего на экрана и на это место
копию
помещает копию
Исключительно
Рисует
е или
сохраненный
образ
или стирает ранее
нарисованный,
сохраняя фон
Объединительн
Накладывает
ое или
сохраненный образ на
существующий
Логическое и
Объединяет
сохраненный образ и
уже существующий на
экране
Инверсия
То же самое, что и
изображения
0,
только
копия
выводится
в
инверсном виде
Упражнение 2. Изучить программу, которая рисует звездное небо и
перемещает на его фоне рисунок НЛО. Проверить действие программы.
program NLO;
uses crt, graph;const
k=20; Pause=50;
var
gd, gm, xmin, xm, ymin, ym, x, y, tx, ty, rx, ry, size, i, dx, dy, width, height:
integer;
sauser:Pointer;
187
begin
Randomize;
gd:= detect; initgraph(gd, gm, ‘путь к драйверу’);
SetTextStyle(0, 0, 2); OutTextXY(50, 10, ‘Демонстрация движения
НЛО’);
{Рисуем НЛО}
x:=R*5; y:=R*2; xm:=GetmaxX- 5; ym:=GetmaxY-25;
Ellipse(x, y, 0, 360, R, R div 3+2);
Ellipse(x, y-4, 190, 357, R, R div 3);
Line(x + 7, y - 6, x + 10, y - 12);
Line(x -7, y - 6, x + 10, y - 12);
Circle(x + 10, y - 10, 2);
Circle(x -10, y - 10, 2);
FloodFill(x+1, y+4, White);
{определяем габариты НЛО и помещаем в специальную динамическую
переменную}
Tx:= x-R; Ty:=y-14; Rx:;=x+R; Ry:=y+R div3 +3;
Width:=Rx-Tx+1; Size:=ImageSize(Tx, Ty, Rx, Ry);
GetMem(sauser, Size);
GetImage(Tx, Ty, Rx, Ry, sauser^);
{стираем построенное изображение}
PutImage(Tx, Ty, sauser^, XorPut);
{рисуем звездное небо}
SetStyle(1, blue); {установить стиль и цвет закраски голубое небо}
SetColor(White);
{начертить прямоугольник и открыть окно}
Rectangle(xmin, ymin, GetmaxX, GetmaxY);
SetViewPort(xmin, ymin, GetmaxX, GetmaxY, ClipOn);
FloodFill(xmin+1, ymin+1, White);
For i:=1 to 500 do {нарисовать 500 звезд белого цвета}
PutPixel(Random(GetmaxX), Random(GetmaxY- ymin), 15);
{задаем начальное положение НЛО}
x:=xm div 3 – xmin; y:=ym div 3 – ymin; dx:=6; dy:=6;
Repeat {цикл: повторять, пока не нажата любая клавиша}
PutImage(x, y, sauser^, XorPut); {изображаем объект}
Delay (Pause);{ задержка}
PutImage(x, y, sauser^, XorPut); {после паузы стираем объект}
{перемещаем объект}
If (x<xmin) Or (y<ymin) Or (x+Width +1> xm) Or (y+Height +1> ym) Then
begin {если объект смещается влево-вверх за границы окна, изменить
координаты так, чтобы он оставался в окне}
If (x- Dx< xmin) then x:= xmin else x := x- Dx;
If (y- Dy< ymin) then y:= ymin else y := y- Dy;
188
Dx:= GetmaxX div 10 - Random(GetmaxX div 4);
Dy:= GetmaxY div 10 - Random(GetmaxY div 4);
end
else
begin { если объект смещается вправо-вниз за границы окна, изменить
координаты так, чтобы он оставался в окне}
If (x + Dx< xm) then x:= x + Dx else x:= Random(GetmaxX) Random(GetmaxX div 4);
If (y + Dy< ym) then y:= y + Dy else y:= Random(GetmaxY) Random(GetmaxY div 3);
end;
until KeyPressed; {завершить, как только будет нажата клавиша }
FreeMem (sauser, Size);
Closegraph;
end;
end.
189
Задания
В любую из этих программ добавить свой «движущийся» объект.
Задание 1. Изображение простых объектов.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Нарисовать в центре экрана точку красного цвета.
Нарисовать в случайном месте экрана точку случайного цвета.
Нарисовать в одном из углов экрана точку случайного цвета.
Написать программу, которая выводит на экран звездное небо.
Нарисовать 5000 точек случайного цвета в случайном месте.
Написать программу, которая вычерчивает треугольник красной
линией в центре экрана.
Написать программу, которая вычерчивает окружность зеленой
линией в центре экрана.
Написать программу, которая вычерчивает квадрат линией
случайного цвета в центре экрана.
Написать программу, которая вычерчивает прямоугольник (не
квадрат) синей линией в центре экрана.
Написать программу, которая вычерчивает шестиугольник линией
случайного цвета в центре экрана.
Написать программу, которая вычерчивает восьмиугольник
линией желтого цвета в центре экрана.
Написать программу, которая вычерчивает параллелепипед
линией случайного цвета в центре экрана.
Написать программу, которая вычерчивает трапецию линией
случайного цвета в центре экрана.
Написать программу, которая выводит на экран пятиконечную
звезду.
Написать программу, которая выводит на экран шестиконечную
звезду.
Написать программу, которая выводит на экран четырехконечную
звезду.
Задание 2. Изображение сложных объектов.
1.
2.
3.
4.
5.
6.
Написать программу, которая вычерчивает на экране домик.
Написать программу, которая вычерчивает на экране кораблик.
Написать программу, которая вычерчивает на экране ракету.
Написать программу, которая рисует на экране паровоз.
Написать программу, которая вычерчивает на экране самолет.
Написать программу, которая вычерчивает на экране танк.
190
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Написать программу, которая рисует на экране автомобиль.
Написать программу, которая рисует на экране трактор.
Написать программу, которая вычерчивает на экране узор из 100
окружностей случайного диаметра и цвета.
Написать программу, которая выводит на экран флаг олимпийских
игр.
Написать программу, которая вычерчивает на экране ломаную
линию, состоящую из 200 звеньев, окрашенных в разные цвета,
выбираемые случайным образом, причем координаты звеньев тоже
выбираются случайно.
Написать программу, которая рисует на экране веселую рожицу.
Написать программу, которая рисует на экране грустную рожицу.
Написать программу, которая рисует на экране Государственный
флаг России.
Написать программу, которая рисует на экране Государственный
флаг Башкортостана.
Написать программу, которая рисует на экране Государственный
флаг США.
Написать программу, которая рисует на экране цветное
изображение радуги.
Написать программу, которая выводит на экран изображение
шахматной доски.
Написать программу, которая выводит на экран изображение
баскетбольной корзины.
Написать программу, которая выводит на экран изображение
волейбольной сетки.
Написать программу, которая выводит на экран оцифрованную
координатную сетку.
Задание 3. Изображение графиков функций.
1.
2.
3.
Написать программу, которая выводит на экран точечный график
функции у = 4x + 2. Диапазон изменения аргумента — от -0 до 15, шаг
аргумента — 0,1. График вывести на фоне координатных осей, точка
пересечения которых должна находиться в центре экрана.
Написать программу, которая выводит на экран точечный график
функции у = 0,5х2 + 4х - 3. Диапазон изменения аргумента — от -15 до
5, шаг аргумента — 0,1. График вывести на фоне координатных осей,
точка пересечения которых должна находиться в центре экрана.
Написать программу, которая выводит на экран точечный график
функции у = cos x. Диапазон изменения аргумента — от -5 до 5, шаг
аргумента — 0,01. График вывести на фоне координатных осей, точка
191
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
пересечения которых должна находиться в центре экрана.
Написать программу, которая выводит на экран точечный график
функции у = sin x. Диапазон изменения аргумента — от -5 до 5, шаг
аргумента — 0,01. График вывести на фоне координатных осей, точка
пересечения которых должна находиться в центре экрана.
Написать программу, которая выводит на экран точечный график
функции у = sin x + cos x. Диапазон изменения аргумента — от -10 до
10, шаг аргумента — 0,1. График вывести на фоне координатных осей,
точка пересечения которых должна находиться в центре экрана.
Написать программу, которая выводит на экран точечный график
функции у =tg3 x. Диапазон изменения аргумента — от -5 до 5, шаг
аргумента — 0,1. График вывести на фоне координатных осей, точка
пересечения которых должна находиться в центре экрана.
Написать программу, которая выводит на экран точечный график
функции у =ctg7 x. Диапазон изменения аргумента — от -3 до 6, шаг
аргумента — 0,1. График вывести на фоне координатных осей, точка
пересечения которых должна находиться в центре экрана.
Написать программу, которая выводит на экран точечный график
функции у =x4. Диапазон изменения аргумента — от -5 до 10, шаг
аргумента — 0,1. График вывести на фоне координатных осей, точка
пересечения которых должна находиться в центре экрана.
Написать программу, которая выводит на экран точечный график
функции у = 1/x. Диапазон изменения аргумента — от -5 до 5, шаг
аргумента — 0,1. График вывести на фоне координатных осей, точка
пересечения которых должна находиться в центре экрана.
Написать программу, которая выводит на экран точечный график
функции у = x3 + х2 - 1. Диапазон изменения аргумента — от -7 до 10,
шаг аргумента — 0,1. График вывести на фоне координатных осей,
точка пересечения которых должна находиться в центре экрана.
Написать программу, которая выводит на экран точечный график
функции у =ln(3x+6). Диапазон изменения аргумента — от -7 до 7,
шаг аргумента — 0,1. График вывести на фоне координатных осей,
точка пересечения которых должна находиться в центре экрана.
Написать программу, которая выводит на экран точечный график
функции у2 =3x + 4. Диапазон изменения аргумента — от 0 до 10, шаг
аргумента — 0,1. График вывести на фоне координатных осей, точка
пересечения которых должна находиться в центре экрана.
Написать программу, которая выводит на экран график функции
у=2 Sin(x)* ex/5.
Задание 4. Движение простых объектов.
1.
Написать программу, которая рисует треугольник, движущийся по
192
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
экрану.
Написать программу, которая рисует окружность, движущуюся по
экрану.
Написать программу, которая рисует квадрат, движущийся по
экрану.
Написать программу, которая рисует шестиугольник, движущийся
по экрану.
Написать программу, которая рисует прямоугольник, движущийся
по экрану.
Написать программу, которая рисует параллелепипед, движущийся
по экрану.
Написать программу, которая рисует восьмиугольник, движущийся
по экрану.
Написать программу, которая рисует движущийся по экрану
кораблик.
Написать программу, которая рисует взлетающую ракету.
Написать программу, которая рисует летящий самолет.
Написать программу, которая рисует движущийся по экрану танк.
Написать программу, которая рисует движущийся по экрану
паровоз.
Написать программу, которая рисует движущийся по экрану
автомобиль.
Написать программу, которая рисует движущийся по экрану
трактор.
Задание 5. Сложное движение объектов.
1.
2.
3.
4.
5.
6.
7.
8.
Написать программу, которая выводит на экран солнце, которое,
попеременно, то улыбается, то хмурится.
Написать программу, которая выводит на экран изображение
идущих часов, имеющих секундную и минутную стрелки.
Написать программу, которая выводит на экран изображение
вращающегося велосипедного колеса.
Написать программу, которая выводит на экран изображение
ветряной мельницы с крутящимся колесом.
Напишите программу, обеспечивающую управление с помощью
клавиатуры положением выведенного на экран треугольника.
Напишите программу, обеспечивающую управление с помощью
клавиатуры положением выведенной на экран окружности.
Напишите программу, обеспечивающую управление с помощью
клавиатуры положением выведенного на экран квадрата.
Напишите программу, обеспечивающую управление с помощью
193
9.
10.
11.
12.
13.
клавиатуры положением выведенного на экран прямоугольника.
Напишите программу, обеспечивающую управление с помощью
клавиатуры положением выведенного на экран шестиугольника.
Напишите программу, обеспечивающую управление с помощью
клавиатуры положением выведенного на экран восьмиугольника.
Напишите программу, обеспечивающую управление с помощью
клавиатуры положением выведенного на экран параллелепипеда.
Напишите программу, обеспечивающую управление с помощью
клавиатуры положением выведенной на экран трапеции.
Напишите программу, обеспечивающую управление с помощью
клавиатуры положением выведенной на экран пятиконечной звезды.
Задание 6. Анимированное движение.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Написать программу, которая выводит на экран человека,
делающего зарядку.
Написать программу, которая выводит на экран человека,
поднимающего штангу.
Написать программу, которая выводит на экран человека,
поднимающегося по канату.
Написать программу, которая выводит на экран человека,
прыгающего через козла.
Написать программу, которая выводит на экран человека,
забрасывающего мяч в баскетбольную корзину.
Написать программу, которая выводит на экран человека,
стреляющего из лука по мишени.
Написать программу, которая выводит на экран
бегущего
человека.
Написать программу, которая выводит на экран изображение
работающего светофора. Алгоритм работы светофора: красный –
красный + желтый – зеленый – мигающий зеленый.
Нарисовать фигуру - "снежинку" по следующему алгоритму: из
одной точки-центра вырастают k кристалликов-отрезков длины r;
свободный конец каждого из них служит центром новой "снежинки" с
длиной кристаллика-отрезка в 3 раза меньшей r; указанный процесс
продолжается n раз.
Написать программу, которая выводит на экран алгоритм
построения дома.
Написать программу, которая выводит на экран песочные часы.
Написать программу, которая выводит на экран звездное небо и
движущуюся по экрану луну.
Написать программу, которая выводит на экран небо с плывущими
194
14.
15.
16.
17.
18.
19.
облаками.
Написать программу, которая выводит на экран восход солнца.
Написать программу, которая выводит на экран солнце с
движущимися отбрасываемыми ею лучами.
Написать программу, которая выводит на экран дождь с грозой.
Написать программу, которая выводит на экран изображение
космодрома и взлетающую с него ракету.
Написать программу, которая выводит на экран изображение
поляны с качающимся деревом.
Написать программу, которая выводит на экран взлетающую с
ветки дерева птицу.
Написать программу, которая выводит на экран солнечную
систему с движущимися вокруг солнца планетами.
21.
Написать программу, которая имитирует погоню волка за зайцем.
22.
Написать программу, которая выводит на экран аэродром и
взлетающий с него самолет.
23.
Написать программу, которая выводит на экран прыгающего из
летящего самолета парашютиста.
20.
195
КОНТРОЛЬНЫЕ ТЕСТЫ
1. Программирование алгоритмов линейных структур
1.Для решения относительно простых задач, в которых не предусмотрен
выбор из нескольких возможных альтернатив или циклическое повторение
каких-либо операций, предназначены…
а) алгоритмы разветвляющейся структуры;
б) линейные алгоритмы и линейные программы;
в) оба ответа верны.
2. Простейшей алгоритмической структурой является…
а) линейная последовательность операций, которые выполняются по
очереди и именно в том порядке, в котором они записаны;
б) последовательность операций, которая состоит из простейших
операторов;
в) линейная последовательность операций, в которой возможно только
одно разветвление.
3. Из каких блоков состоит алгоритм решения задач линейного
программирования?
а) из блока ввода данных, блока вычислений и блока вывода
результатов работы программы;
б) из заголовка, за которым следуют раздел объявления переменных и
вывод результатов;
в) нет правильного ответа.
4. Какая инструкция ввода коэффициентов квадратного уравнения в
переменные a,b и c верна, при условии, что во время работы программы
коэффициенты выводились в одной строке?
а) readln(a,b,c);
б) read(a,b,c);
в) оба ответа верны.
5.Найдите ошибку в тексте следующей программы:
i:integer;
begin
write(‘задайте целое число.’);
readln(i);
write(i);
end.
а) перед end нельзя ставить точку с запятой;
б) отсутствует слово var в начале;
в) не соответствие типов переменных.
6. Найдите ошибку в тексте следующей программы:
var i:integer;
begin
196
write(‘задайте целое число.’);
readln(i);
write(j);
end.
а) вместо read набрано readln слово;
б) в операторе write используется имя необъявленной переменной j;
в) оба ответа верны.
7. Найдите ошибку в тексте следующей программы:
var
i:real;
begin
i:=1;
wirteln(‘i=’,i);
end
а) вместо writeln набрано wirteln;
б) нет точки после слова end в конце программы;
в) оба ответа верны.
8. Пусть в программе объявлены переменные:
h,l,p:integer;
d,v:real;
Является ли инструкция d:=5.9*h правильной?
а) инструкция верная;
б) ошибка, переменной типа real присваивается значение переменной
integer;
в) ошибка, переменной типа integer присваивается значение переменной
real.
9. Какие элементы данных могут изменять свое значение в ходе
выполнения программы?
а) переменные;
б) константы;
в) комментарии.
10. Как называются слова begin и end в следующей конструкции:
begin
оператор 1;
оператор 2;
…
оператор n-1;
оператор n
end
а) начало и конец программы;
б) операторные скобки;
в) составной оператор.
197
2. Программирование алгоритмов разветвляющейся структуры
1. Условный оператор и оператор выбора реализуют одну из основных
алгоритмических структур, а именно
а) процедуры;
б) ветвления;
в) циклы.
2. Какое значение может принимать логическое выражение типа
Boolean?
а) True (“истина”);
б) False (“ложь”);
в) оба ответа верны.
3. В списках значений оператора case допустимыми являются
а) скалярные типы переменных, включая вещественные и исключая
целые типы;
б) скалярные типы переменных, включая целые и исключая
вещественные типы;
в) вещественные типы переменных, включая целые и исключая
скалярные типы.
4. Определите значение следующего выражения
(summa>120) and (summa<=2 00), если summa=120
а) False;
б) True;
в) 120.
5. При каких значениях переменной А
значение следующего
выражения равно True?
(A=5) or ((A>10) and (A<1))
а) 5;
б) 1;
в) 10.
6. При каких значениях переменной А
значение следующего
выражения равно True?
(A=5.37) and (A=-10.0)
а) -5.37;
б) -10.0;
в) нет таких значений.
7. Какое из условий того, что значение переменной А находится в
диапазоне от L до M, при условии, что L<M, верно?
а) (A>=L) or (A<=M) and (L<M);
б) (A>=L) and (A>=M) and (L<M);
в) (A>=L) and (A<=M).
198
8. Зимние каникулы начинаются 29 декабря и заканчиваются 10 января.
Выберите правильную инструкцию if, выводящую “Каникулы!”, если дата
(число и номер месяца) попадают в этот промежуток.
а) if ((month=12) and (month=1)) or ((day>29) and (day<10));
б) if ((month=12) and (day>=29)) or ((month=1) and (day<=10));
в) оба ответа верны.
9. Какое из условий того, что месяц не зимний, верно?
а) (month=12) or (month=1) or (month=2);
б) (month=3) or (month=4) or (month=5);
в) (month<=2) and (month=12);
10. Какое из условий, что месяц является летним, верно?
а) (month>=6) and (month<=8);
б) (month>5) and (month<9);
в) оба ответа верны.
3. Программирование алгоритмов циклических структур
1.Затраты процессорного времени на выполнение какого из следующих
вложенных циклов со счетчиком больше?
а) for j:=1 to 100000 do
for k:=1 to 1000 do a:=1
б) for j:=1 to 1000 do
for k:=1 to 100000 do a:=1
в) затраты времени одинаковы.
2. Последовательность операторов, которая выполняется неоднократно.
а) функции;
б) ветвления;
в) циклы.
3. Если число повторений цикла известно и задано наибольшее
допустимое значение n, то лучше использовать
а) цикл с предусловием;
б) цикл с постусловием;
в) цикл со счетчиком.
4. Чуму будет равно значение переменной n после выполнения
инструкций?
n:=0
while n<5 do
n:=n+1
а) 1;
б) 5;
в) 6.
5. Что будет выводиться на экране во время выполнения инструкции
n:=1;
199
while n<=10 do
begin
x:=n*n;
writeln(n:6,’ ’,x:6);
end;
а) бесконечное число строк “1 1”;
б) 10;
в) программа не будет выполняться.
6. Что делают следующие инструкции?
n:=0
repeat
write(‘*’);
n:=n+1;
until n<5
а) выводят одну звездочку;
б) выводят пять звездочек;
в) выводят шесть звездочек.
7. Для инструкций
n:=0
repeat
write(‘->’);
readln(a);
n:=n+1;
until Условие;
какой из следующих условий окончания цикла верно, если
выполняется, что цикл завершается, если введено 10 чисел или введено
число 0.
а) (n=10) and (a=0);
б) (a=10) or (n=0);
в) (n=10) or (a=0).
8. Сколько раз будут выполняться инструкции между begin и end?
k:=0
for i:=2 downto k do
begin
…
end;
а) 3;
б) 2;
в) 1.
9. Чему будет равно значение переменной
инструкций?
x:=0
200
х
после выполнения
for i:=-5 to 0 do
n:=i*i;
x:=x+n
а) 0;
б) -5;
в) 5.
10. Сколько звездочек будет выведено на экран в результате
выполнения инструкций?
for i:=1 to 5 do
for j:=1 to 5 do write(‘*’);
а) 5;
б) 15;
в) 25.
4. Массивы
1.Набор однотипных данных, имеющий общее для всех своих
элементов имя.
а) множества;
б) массивы;
в) записи.
2. К массивам в целом применяются
а) логические отношения равенства (=) и неравенства (<>);
б) другие операции отношения (+, -, *, /);
в) оба ответа верны.
3. Тип “массив” относится к группе
а) порядковых типов;
б) структурных типов;
в) вещественных типов.
4. Как называется процесс перестановки элементов массива с целью
упорядочивания их в соответствии с каким-либо критерием?
а) поиск;
б) перебор;
в) сортировка.
5. Как называется последовательное сравнение элементов массива с
образцом до тех пор, пока не будет найден элемент, равный образцу, или
не будут проверены все элементы?
а) прямой выбор;
б) прямой обмен;
в) простой перебор.
6. Если элементы массива не упорядочены, то какой алгоритм
применяется?
а) прямой обмен;
201
б) простой перебор;
в) вывод массива.
7. В основе какого метода сортировки лежит обмен соседних элементов
массива?
а) прямой обмен;
б) прямой выбор;
в) оба ответа верны.
8. Какой алгоритм может использоваться для поиска как в числовых,
так и в строковых массивах?
а) бинарный поиск;
б) прямой выбор;
в) перебор элементов.
9. Какой метод применяется для поиска в упорядоченных массивах?
а) бинарный поиск;
б) прямой выбор;
в) прямой обмен.
10. Как называется процесс, в котором выбирается средний (по номеру)
элемент упорядоченного массива, и с этим элементом сравнивается
образец?
а) бинарный поиск;
б) прямой обмен;
в) перебор элементов.
5. Множества
1.Совокупность однотипных элементов, рассматриваемых как единое
целое.
а) массивы;
б) записи;
в) множества.
2. Какое максимальное число элементов содержат множества?
а) 236;
б) 256;
в) 286.
3. Какие действия могут выполняться с элементами множества?
а) сравнения;
б) пересечения, объединения и разности;
в) действия могут выполняться только над множеством в целом.
4. Можно ли вводить значения во множественную переменную
оператором ввода и выводить оператором вывода?
а) да;
б) нет;
в) это зависит от выполняемой задачи.
202
5. Как называется тип элементов, входящих в множество?
а) базовым;
б) действительным;
в) логическим.
6. Верно ли утверждение, что элементы множества не
упорядочены?
а) да;
б) нет;
в) программист сам решает: упорядочить их или нет.
7. Что означает следующая запись?
C=A V B
а) Каждый элемент множества С является элементом либо множества А,
либо множества B;
б) Каждый элемент множества С является элементом множества А и В
одновременно;
в) Каждый элемент множества С является элементом множества А, но
не является элементом множества В.
8. Что означает следующая запись?
C=A ^ B
а) Каждый элемент множества С является элементом либо множества А,
либо множества B;
б) Каждый элемент множества С является элементом множества А и В
одновременно;
в) Каждый элемент множества С является элементом множества А, но
не является элементом множества В.
9. Что означает следующая запись?
C=A \ B
а) Каждый элемент множества С является элементом либо множества А,
либо множества B;
б) Каждый элемент множества С является элементом множества А и В
одновременно;
в) Каждый элемент множества С является элементом множества А, но
не является элементом множества В.
10. Как организовать вывод элементов множества?
а) для вывода на экран элементов множества применяется оператор
write;
б) для вывода на экран элементов множества применяется оператор
цикла for;
в) через принтер.
203
6. Записи
1.Структурный тип данных, который содержит определенное число
элементов (полей) и является смесью разных типов.
а) файлы;
б) записи;
в) множества.
2. Какие операции могут выполняться над записями?
а) операции сравнения;
б) операции отношения;
в) нет правильного ответа.
3. Записей с фиксированными частями называют так потому, что
а) в различных ситуациях имеют одинаковую структуру;
б) имеют одинаковую структуру только в одинаковых ситуациях;
в) могут иметь разную структуру в различных ситуациях.
4. Как называются записи, которые в различных ситуациях могут иметь
разную структуру?
а) записи с вариантами;
б) переменные записи;
в) записи с фиксированными частями.
5. Что нужно указать, чтобы использовать в программе элемент (поле)
переменной записи?
а) имя переменной и имя поля, отделяя имя поля от имени переменной
точкой с запятой;
б) имя переменной и имя поля, отделяя имя поля от имени переменной
точкой;
в) имя поля и имя переменной, отделяя имя поля от имени переменной
точкой с запятой.
6. Какая инструкция позволяет использовать в тексте программы имена
полей без указания имени переменной-записи?
а) while;
б) if … then;
в) with.
7. Какие действия необходимо выполнять, чтобы сохранить запись в
файле?
а) надо записать в файл имя переменной-записи;
б) надо каждое поле как отдельную переменную записать в файл;
в) запись автоматически сохраняется в файле, если указать к нему путь.
8. Какой тип могут иметь поля записи?
а) могут быть только записями;
б) любой, кроме записей;
в) любой, в частности сами могут быть записями.
204
9. Каким образом объявляются записи?
а) в разделе переменных var;
б) с использованием раздела типов type;
в) оба ответа верны.
10. Для чего предназначено уточненное имя?
а) с помощью уточненного имени в программе выполняется обращение
к элементу записи;
б) при использовании уточненного имени увеличивается скорость
выполнения программы;
в) нет правильного ответа.
7. Файлы
1.Сколько видов файлов имеются в Turbo Pascal?
а) 2;
б) 3;
в) 4.
2. Какой вид файлов содержит последовательность символов,
организованных в строки?
а) вещественный;
б) литерный;
в) текстовый.
3. Количество элементов, хранящихся в данный момент в файле.
а) общая длина;
б) текущая длина;
4. Выберите процедуры, которые применяются только к текстовым
файлам.
а) Readln Writeln;
б) Read Write;
в) Reset Rewrite.
5. Файл с точки зрения программирования на языке Pascal.
а) именованная структура данных, представляющая
собой
последовательность элементов одного типа;
б) совокупность однотипных элементов, рассматриваемых как единое
целое;
в) структурный тип данных, который содержит определенное число
элементов.
6. Что делает процедура Assign?
а) открывает файл в режиме замещения существующего;
б) связывает файловую переменную с конкретным файлом;
в) открывает файл в режиме перезаписи.
7. В чем заключается принцип последовательного доступа?
205
а) для того, чтобы прочитать n-ю запись файла, сначала
прочитать (n+1)-ю запись;
б) для того, чтобы прочитать n-ю запись файла, сначала
прочитать все предыдущие записи с 1-й по (n-1)-ю запись;
в) для того, чтобы прочитать n-ю запись файла, сначала
прочитать (n-1)-ю запись.
8. Какая функция является признаком конца файла?
а) Closе(имя файла);
б) Reset(имя файла);
в) Eof (имя файла).
9. Специальная ячейка памяти, которая хранит адрес элементов
предназначенного для текущей обработки.
а) указатель файла;
б) окно файла;
в) оба ответа верны.
10. Какая из приведенных конструкций записи файла верна?
а) Rewrite(имя)
…
write(имя)
…
Close(имя)
б) Reset(имя)
…
write(имя)
…
Close(имя)
в) оба ответа верны.
нужно
нужно
нужно
файла,
8. Графика
1.Что делает процедура MoveRel(dx,dy)?
а) перемещает указатель в нужную точку экрана;
б) меняет текущий цвет в указанной области экрана;
в) перемещает указатель относительно текущего положения на
указанное число точек.
2. Вызовом какой процедуры задается тип линии?
а) SetLineStyle;
б) LineTo;
в) SetFillStyle.
3. Какие координаты имеет левый верхний пиксель?
а) (0,0);
б) (310,240);
в) (639,479).
206
4. Как выглядит инструкция вызова процедуры, позволяющей начертить
прямоугольник внутри рабочей области экрана?
а) Rectangle(0,0,GetMaxX,GetMaxY);
б) Rectangle(x1,y1,x2,y2);
в) Bar(x1,y1,x2,y2).
5. К какому типу относится параметр ВерхняяГраница процедуры
Bar3D(x1,y1,x2,y2,Глубина,ВрехняяГраница)?
а) real;
б) char;
в) Boolean.
6. Какая из следующих процедур вычерчивает эллиптический сектор?
а) Sector(x,y,угол1,угол2,РадиусХ,радиусY);
б) Ellopse(x,y,УголНачала,УголКонца,РадиусХ,РадиусY);
в) PieSlice(x,y,Угол1,Угол2,Радиус).
7. Как называются изображения, которые получаются следующим
образом: выводится изображение, через некоторое время оно стирается,
затем выводится это же изображение на новом месте?
а) иллюстрации;
б) мультипликации;
в) графики функций.
8. Какая процедура используется для вывода текстовой информации?
а) OutTextXY;
б) OutText;
в) оба ответа верны.
9. С помощью какой процедуры задаются характеристики шрифта?
а) SetTextStyle;
б) SetFillStyle;
в) SetLineStyle.
10. Для чего нужна процедура CloseGraph ?
а) чтобы программа могла выводить на экран графику, нужно
инициализировать графический режим работы;
б) перед завершением работы программа, установившая графический
режим, должна восстановить алфавитно-цифровой режим работы
видеосистемы компьютера;
в) нет правильного ответа.
207
ОТВЕТЫ
Тест1.
Тем Программирование алгоритмов линейных структур
а
Воп
рос
Отв
ет
1
2
3
4
5
6
7
8
9
1
0
б
а
а
в
б
б
в
а
а
б
Тест2.
Тем Программирование алгоритмов разветвляющейся структуры
а
Воп
рос
Отв
ет
1
2
3
4
5
6
7
8
9
10
б
в
б
а
а
в
в
б
б
а
Тест3.
Тем Программирование алгоритмов циклических структур
а
Воп
рос
Отв
ет
Тест4.
Тем
1
2
3
4
5
6
7
8
9
10
а
в
в
б
а
а
в
б
а
б
Массивы
а
Воп
рос
Отв
ет
Тест5.
Тем
1 2 3 4 5 6 7 8 9 1
0
б а б в в б а в а а
Множества
а
Воп
рос
Отв
ет
1 2 3 4 5 6 7 8 9 1
0
в б в Б а а а б в б
208
Тест6.
Тем
Записи
а
Воп
рос
Отв
ет
Тест7.
Тем
1 2 3 4 5 6 7 8 9 1
0
б в а а б в б в в а
Файлы
а
Воп
рос
Отв
ет
Тест8.
Тем
1 2 3 4 5 6 7 8 9 1
0
б в б а а б б в в а
Графика
а
Воп
рос
Отв
ет
1 2 3 4 5 6 7 8 9 1
0
в а а б в а б в а б
209
Скачать