Основы алгоритмизации и программирования на баз..

Негосударственное образовательное учреждение
Абаканский техникум прикладной информатики







Сакерин В. А.







Методическое пособие для студентов специальности
«Программное обеспечение персонального компьютера»










Основы алгоритмизации и программирования
(на базе Pascal ABC)















Абакан, 2006 г.

Оглавление:
13 TOC \o "1-3" \h \z \u 14
13 LINK \l "_Toc237699344" 14Языки и системы программирования 13 PAGEREF _Toc237699344 \h 1431515
13 LINK \l "_Toc237699345" 14Алгоритмы 13 PAGEREF _Toc237699345 \h 1431515
13 LINK \l "_Toc237699346" 14Языки программирования 13 PAGEREF _Toc237699346 \h 1431515
13 LINK \l "_Toc237699347" 14Трансляторы 13 PAGEREF _Toc237699347 \h 1431515
13 LINK \l "_Toc237699348" 14Характеристика с/п Pascal ABC 13 PAGEREF _Toc237699348 \h 1441515
13 LINK \l "_Toc237699349" 14Используемые в с/п Pascal ABC «горячие клавиши» 13 PAGEREF _Toc237699349 \h 1451515
13 LINK \l "_Toc237699350" 14Структура программы на Паскале 13 PAGEREF _Toc237699350 \h 1461515
13 LINK \l "_Toc237699351" 14Сообщения об ошибках. Отладка программы. 13 PAGEREF _Toc237699351 \h 1461515
13 LINK \l "_Toc237699352" 14Система подсказок. 13 PAGEREF _Toc237699352 \h 1461515
13 LINK \l "_Toc237699353" 14Команды вывода данных на экран 13 PAGEREF _Toc237699353 \h 1471515
13 LINK \l "_Toc237699354" 14Константы 13 PAGEREF _Toc237699354 \h 1471515
13 LINK \l "_Toc237699355" 14Переменные 13 PAGEREF _Toc237699355 \h 1471515
13 LINK \l "_Toc237699356" 14Арифметические выражения. Приоритет арифметических операций 13 PAGEREF _Toc237699356 \h 1481515
13 LINK \l "_Toc237699357" 14Стандартные арифметические функции 13 PAGEREF _Toc237699357 \h 1491515
13 LINK \l "_Toc237699358" 14Процедуры инкремента и декремента 13 PAGEREF _Toc237699358 \h 1491515
13 LINK \l "_Toc237699359" 14Примеры решения линейных задач 13 PAGEREF _Toc237699359 \h 1491515
13 LINK \l "_Toc237699360" 14Ввод данных с клавиатуры 13 PAGEREF _Toc237699360 \h 14101515
13 LINK \l "_Toc237699361" 14Примеры решения диалоговых задач 13 PAGEREF _Toc237699361 \h 14111515
13 LINK \l "_Toc237699362" 14Линейные задачи для самостоятельной работы 13 PAGEREF _Toc237699362 \h 14111515
13 LINK \l "_Toc237699363" 14Лаб. 1. Линеаризовать выражение: 13 PAGEREF _Toc237699363 \h 14121515
13 LINK \l "_Toc237699364" 14Лаб. 2. Линейные диалоговые задачи (на одно действие) 13 PAGEREF _Toc237699364 \h 14121515
13 LINK \l "_Toc237699365" 14Лаб. 3. Диалоговые задачи на несколько действий 13 PAGEREF _Toc237699365 \h 14131515
13 LINK \l "_Toc237699366" 14Ветвление 13 PAGEREF _Toc237699366 \h 14141515
13 LINK \l "_Toc237699367" 14Логические выражения 13 PAGEREF _Toc237699367 \h 14141515
13 LINK \l "_Toc237699368" 14Вложенное ветвление 13 PAGEREF _Toc237699368 \h 14161515
13 LINK \l "_Toc237699369" 14Лаб. 4. Задачи на ветвление: 13 PAGEREF _Toc237699369 \h 14171515
13 LINK \l "_Toc237699370" 14Лаб. 5. Задачи на ветвление с вычислениями: 13 PAGEREF _Toc237699370 \h 14181515
13 LINK \l "_Toc237699371" 14Выбор варианта 13 PAGEREF _Toc237699371 \h 14191515
13 LINK \l "_Toc237699372" 14Лаб. 6. Задачи на выбор варианта: 13 PAGEREF _Toc237699372 \h 14211515
13 LINK \l "_Toc237699373" 14Циклы 13 PAGEREF _Toc237699373 \h 14221515
13 LINK \l "_Toc237699374" 14Как выбрать цикл? 13 PAGEREF _Toc237699374 \h 14231515
13 LINK \l "_Toc237699375" 14Экстренные события в теле цикла 13 PAGEREF _Toc237699375 \h 14241515
13 LINK \l "_Toc237699376" 14Лаб. 7. Числовые задачи с циклом For 13 PAGEREF _Toc237699376 \h 14251515
13 LINK \l "_Toc237699377" 14Лаб. 8. Сюжетные задачи с циклом For 13 PAGEREF _Toc237699377 \h 14251515
13 LINK \l "_Toc237699378" 14Лаб. 9. Задачи с условными циклами 13 PAGEREF _Toc237699378 \h 14271515
13 LINK \l "_Toc237699379" 14Библиотека CRT 13 PAGEREF _Toc237699379 \h 14291515
13 LINK \l "_Toc237699380" 14Библиотека SOUNDS 13 PAGEREF _Toc237699380 \h 14311515
13 LINK \l "_Toc237699381" 14Лаб. 10. Задачи с использованием циклов и библиотек CRT и SOUNDS 13 PAGEREF _Toc237699381 \h 14321515
13 LINK \l "_Toc237699382" 14Порядковые типы данных 13 PAGEREF _Toc237699382 \h 14331515
13 LINK \l "_Toc237699383" 14Перечислимый тип данных 13 PAGEREF _Toc237699383 \h 14331515
13 LINK \l "_Toc237699384" 14Символьный тип данных 13 PAGEREF _Toc237699384 \h 14341515
13 LINK \l "_Toc237699385" 14Ограниченный (интервальный) тип данных 13 PAGEREF _Toc237699385 \h 14351515
13 LINK \l "_Toc237699386" 14Строки 13 PAGEREF _Toc237699386 \h 14351515
13 LINK \l "_Toc237699387" 14Лаб. 11. Задачи со строками 13 PAGEREF _Toc237699387 \h 14371515
13 LINK \l "_Toc237699388" 14Массивы 13 PAGEREF _Toc237699388 \h 14381515
13 LINK \l "_Toc237699389" 14Решение задач с массивами 13 PAGEREF _Toc237699389 \h 14391515
13 LINK \l "_Toc237699390" 14Поиск минимального (максимального) элемента массива 13 PAGEREF _Toc237699390 \h 14401515
13 LINK \l "_Toc237699391" 14Сортировка массива. 13 PAGEREF _Toc237699391 \h 14401515
13 LINK \l "_Toc237699392" 14Двумерные и многомерные массивы 13 PAGEREF _Toc237699392 \h 14411515
13 LINK \l "_Toc237699393" 14Лаб. 12. Задачи с одномерными массивами 13 PAGEREF _Toc237699393 \h 14421515
13 LINK \l "_Toc237699394" 14Лаб. 13. Задачи с двумерными массивами 13 PAGEREF _Toc237699394 \h 14431515
13 LINK \l "_Toc237699395" 14Множества 13 PAGEREF _Toc237699395 \h 14441515
13 LINK \l "_Toc237699396" 14Файлы данных 13 PAGEREF _Toc237699396 \h 14451515
13 LINK \l "_Toc237699397" 14Записи и базы данных 13 PAGEREF _Toc237699397 \h 14471515
13 LINK \l "_Toc237699398" 14Библиотека GraphABC 13 PAGEREF _Toc237699398 \h 14491515
13 LINK \l "_Toc237699399" 14Действия с графическим окном: 13 PAGEREF _Toc237699399 \h 14491515
13 LINK \l "_Toc237699400" 14Точечная графика 13 PAGEREF _Toc237699400 \h 14491515
13 LINK \l "_Toc237699401" 14Графические примитивы 13 PAGEREF _Toc237699401 \h 14501515
13 LINK \l "_Toc237699402" 14Вспомогательные алгоритмы 13 PAGEREF _Toc237699402 \h 14541515
13 LINK \l "_Toc237699403" 14Рекурсия 13 PAGEREF _Toc237699403 \h 14551515
13 LINK \l "_Toc237699404" 14Событийное программирование 13 PAGEREF _Toc237699404 \h 14561515
13 LINK \l "_Toc237699405" 14Использование таймеров 13 PAGEREF _Toc237699405 \h 14571515
13 LINK \l "_Toc237699406" 14Использование сторонней библиотеки UKEYB 13 PAGEREF _Toc237699406 \h 14581515
15
Языки и системы программирования
Алгоритмы
Алгоритмом называется формальное описание последовательности действий, выполнение которой приводит к решению поставленной задачи.
Основные свойства алгоритма:
Результативность: В результате работы алгоритма будет получен и выведен результат.
Дискретность: Ход решения разбит на элементарные шаги - команды или инструкции, понятные исполнителю.
Конечность: решение задачи будет получено за конечное число шагов.
Массовость: Алгоритм решает не одну единственную задачу, а некоторый класс задач с различными исходными данными и настройками.
Интерактивность: Исходные данные для работы алгоритма задаются человеком в ходе его выполнения или вводятся из датчиков или других внешних устройств.
Однозначность: Для одних и тех же исходных данных всегда будет получен один и тот же результат.
Корректность: Алгоритм должен для любых допустимых исходных данных давать правильный результат. При вводе недопустимых исходных данных требуется сообщить об этом.
Эффективность: При выполнении алгоритма должны использоваться ограниченные ресурсы компьютера (время, объём оперативной памяти и т.д.)
Алгоритм может быть записан на естественном языке или в виде схемы (если его исполнитель – человек) или на одном из языков программирования (если исполнитель – компьютер).
Языки программирования
Алгоритм на естественном языке компьютеру анализировать очень сложно, т. к. они являются недостаточно строгими. Одно и то же слово может обозначать разные понятия в зависимости от контекста. Поэтому для создания программ (инструкций компьютеру) используются специально разработанные языки программирования (или алгоритмические языки).
Уровни языков программирования
Языки низкого уровня (ЯНУ) – машинный язык, ассемблер, - предназначены для обращения к процессору и др. устройствам. Для человека неудобны. Переносимости на другие аппаратные платформы нет. По быстродействию и экономности использования ресурсов ЯНУ являются наиболее эффективными.
Языки высокого уровня (ЯВУ) – ближе к человеку. Используют термины решаемых задач и не требуют знания устройства компьютера. Одна команда ЯВУ выполняет множество команд ЯНУ. Есть переносимость на другие аппаратные и программные платформы. К ЯВУ относятся: Pascal, Delphi, Basic, Fortran, Prolog, Lisp, Java
Языки среднего уровня (ЯСУ) – сочетают возможности ЯВУ и ЯНУ. Более эффективные, чем ЯВУ, для программиста проще, чем ЯНУ, но сложнее, чем ЯВУ. К ЯСУ относятся: C, C++
Область применения языков программирования
Специализированные языки высокоэффективно решают узкий класс задач. Например, язык Dolog – для программирования промышленных роботов. Универсальные языки решают любые задачи, но менее эффективно. К ним относится Паскаль.
Сложность и эффективность языков программирования
Профессиональные – наиболее мощные, но сложные в освоении. Учебные – простые в освоении, приспособленные для обучения, но недостаточно эффективные. Учебно-профес-сиональные – простые, но имеющие высокую эффективность. Кроме и использования в учебных целях их можно использовать для решения практических задач. К ним относится Паскаль.
Трансляторы
Трансляторы – программы, переводящие исходный текст программы с символьных языков (команды которых записываются словами) на машинный язык. Различают такие виды трансляторов:
Интерпретаторы – После запуска анализируют исходный текст построчно. Выделив отдельную команду, сразу выполняют её или сообщают об ошибке. Позволяют выполнить отдельную команду, не связывая её с другими. Удобны при отладке программы, но неэффективны при работе с готовой программой, так как тратят время на перевод. (К ним относится, например, Pascal ABC)
Компиляторы – После запуска анализируют весь исходный текст и записывают на диск готовый перевод в машинных кодах (независимую от с/п исполняемую программу), либо сообщают обо всех обнаруженных ошибках. Полученная исполняемая программа работает эффективно, но для отладки такой транслятор менее удобен.
Турбо-компиляторы (IDE – Integrated Development Environment – интегрированная среда разработки) – сочетание удобной среды для набора и редактирования исходного текста, системы подсказки, возможности работать в режиме компиляции или интерпретации по своему выбору. (К ним относится, например, TurboPascal)
Характеристика с/п Pascal ABC
Система программирования (с/п) Pascal ABC, которую мы рекомендуем для изучения начального курса основ программирования на я/п Паскаль, отличается удобным Windows-совместимым интерфейсом, подробной и простой в использовании системой подсказок на русском языке, хорошими графическими возможностями. Сообщения об ошибках более конкретные, чем в Turbo Pascal.
К сожалению, система программирования Pascal ABC располагает только интерпретатором, что не позволяет создавать независимые от с/п программы. Но для учебных целей все указанные выше преимущества перевешивают, что и склонило нас в пользу этой с/п.


















Рассмотрим назначение кнопок на панели инструментов:





















Для отладки программы (поиска ошибок) используются такие кнопки на панели инструментов:










Используемые в с/п Pascal ABC «горячие клавиши»
Все действия с программой можно выполнять с помощью главного меню или панели инструментов. Но использование «горячих клавиш» позволяет ускорить работу программиста.
- контекстная подсказка;
, - сохранить программу в файл;
- сохранить файл под новым именем;
, - загрузить файла с текстом программы;
- создать новый пустой файл;
- запуск программы;
- прервать работу программы;
- показать/скрыть окно результатов;
- очистить окно вывода результатов;
Блочные команды:
- выделить блок
(или протяжкой мыши);
- удаление блока.
- сдвиг блока вправо;
- сдвиг блока влево;
, - копировать блок в буфер обмена;
, - вырезать блок (удаление с запоминанием в буфер обмена);
, - вставить в текущей позиции блок из буфера обмена;
Можно перемещать блок мышкой. Если при этом удерживать , то происходит копирование блока;
Перемещение по тексту:
- на слово влево;
- на слово вправо;
<Ноте> - в начало строки;
- в конец строки;
- на страницу вверх;
- на страницу вниз;
- в начало текста;
- в конец текста;
Команды редактирования:
- стирает символ слева от курсора;
- стирает символ, справа от курсора;
- стирает строку с курсором;
- вставляет новую строку, разрезает старую.

Структура программы на Паскале

Заголовок программы.

Раздел описаний. В нём объясняются все неизвестные Паскалю слова (идентификаторы), использованные программистом ниже.

Раздел команд. В нём описывается алгоритм решения задачи. Этот раздел заключён между словами begin и end. После end (последнего в программе) обязательно ставится точка.

Заголовок, все команды и описания Паскаля заканчиваются точкой с запятой. Исключение - некоторые слова, которые являются не командой (например, begin), а ключевым словом, помогающим в переводе программы транслятором. Не требует в конце точки с запятой также часть составной команды, продолжение которой – на следующей строке.
Идентификатором считается любая последовательность латинских букв или цифр, начинающаяся с буквы. Буквой считается также символ подчеркивания "_".
Кроме команд в программе может встретиться некоторый текст, заключённый с двух сторон в фигурные скобки {}. Это комментарий. Он позволяет программисту писать прямо в тексте программы пояснения о том, зачем нужен этот участок программы, как он работает. При трансляции программы комментарии игнорируются. Это даёт возможность отключить какой-либо участок программы (например, при поиске ошибок), заключив его в фигурные скобки. Комментарием также является правая часть строки после двойной наклонной черты: //

Сообщения об ошибках. Отладка программы.

В с/п Pascal ABC реализована богатая система сообщений об ошибках. Различают два вида ошибок: ошибки времени компиляции (не выполнены правила синтаксиса языка Паскаль) и ошибки времени выполнения (команда, написанная правильно, получает данные, с которыми её работа не предусмотрена. Например, выражение в знаменателе равно 0).
Сообщение об ошибке появляется в нижней части окна, а в строку, где эта ошибка находится, перемещается курсор. Если ошибок несколько, с/п Pascal ABC реагирует только на первую из них, а следующую заметит после исправления предыдущей.
Существуют также логические ошибки. (Например, мы вместо вычитания написали сложение.) С точки зрения Паскаля они ошибками не являются (и сообщений об ошибках не будет). Но благодаря ним программа выдаёт неправильный результат. Найти такую ошибку в большой программе бывает непросто. Поэтому в с/п Pascal ABC предусмотрен режим отладки. Нажатием можно включить окно отладки. В него можно с помощью поместить любые переменные или выражения. Кроме того, в самом тексте программы можно выделить нужное выражение и клавишей поместить его в пустую строчку окна отладки. В ходе работы программы в этом окне показываются текущие значения этих переменных и выражений. Удобнее следить за ними тогда, когда программа выполняется не целиком, а в пошаговом режиме. Для этого используют клавишу (шаг с заходом в подпрограмму) или (шаг без захода в подпрограмму). Если стать курсором в какую-либо строку программы и нажать , то программа выполнится до этого места. Дальше можно продолжить выполнять пошагово. Нажав мы выполним программу с данного места до конца.
Система подсказок.

В с/п Pascal ABC имеется развитая система подсказок. Чтобы получить информацию о команде, нужно поместить в неё курсор и нажать F1. Если при нажатии F1 курсор находится не на команде, будет предложено тематическое содержание, в котором можно отыскать нужную информацию.

Команды вывода данных на экран

write(сообщение); и writeln(сообщение); - печатают информацию, содержащуюся в скобках, в окне вывода. Отличие в том, что writeln переносит курсор на новую строку, и следующая команда печати будет выводит данные с начала новой строки. Если же мы используем write, то следующее сообщение будет выведено в той же строке, после данного. Если после команды writeln нет скобок, она ничего не печатает, но курсор на новую строку переводит.
В качестве сообщения в скобках может быть текст, заключённый в одинарные кавычки или число: writeln(’Привет!’); writeln(125);
Вместо числа может быть выражение, результат которого будет выведен на экран:
writeln(2+3*4);
Одна команда write или writeln может вывести несколько сообщений. Для этого их надо перечислить через запятую. Обычно это нужно для формирования полного ответа:
writeln(’Коровы съедят ’,12*13-25,’ ц. сена.’);
Здесь пробелы в конце первого и в начале второго текстов нужны для отделения текстов от числа.
Для очистки окна вывода используется команда cls;.
Для задержки между командами на заданное время используется команда sleep(время); Время задаётся целым числом в миллисекундах.

Константы

Числовые константы используются в арифметических выражениях. Например, в выражении 2+3*4 содержатся три числовые константы. Кроме целых, константы могут быть вещественными (представленными в виде десятичной дроби). Такие числа могут быть записаны в форме числа с плавающей точкой, например, 2573.11, или в форме числа с фиксированной точкой: 2.57311E+03. Это - то же самое число, только перед буквой E стоит мантисса (число с одной целой цифрой), а после E – ордината (степень десяти, на которую нужно умножить мантиссу).
Кроме числовых констант в программе могут использоваться именованные константы. Их значение указано не в самой программе, а в разделе описаний после ключевого слова CONST. Для этого после имени константы указывают знак равенства и значение константы. Тип константы (целая или вещественная) Паскаль определяет по её записи. В самой программе используется имя константы, вместо которого Паскаль подставляет при компиляции её значение.
В качестве имени не обязательно должна использоваться одна буква. Имя константы может состоять из нескольких (латинских) букв и цифр (на первом месте буква).
Некоторые именованные константы Паскаль знает заранее, без нашего объяснения. Например, число
·, которое хранится под именем Pi и содержит 20 знаков: 3.1415926535897932385.

Переменные

В отличие от констант, которые задаются только один раз, в Паскале существуют также переменные, значение которых можно изменять в ходе решения задачи. Процесс задания переменной значения называется присваиванием и записывается, например, так:
a:=(b+4)*25.13;
Слева находится переменная, куда нужно занести значение. Справа – выражение, результат которого нужно запомнить в переменную. Между ними – знак присваивания, состоящий из двоеточия и знака равенства. Если в выражении справа используется переменная (как в нашем случае b), значение которого вычислено заранее, вместо неё в выражение будет подставлено соответствующее значение. Если эта переменная не вычислена, будет (скорее всего) подставлен 0, но разработчики Паскаля этого не гарантируют. Вместо ноля может быть подставлен любой «мусор», находящийся в памяти в том месте, которое Паскаль отведёт для данной переменной. Поэтому рекомендуется инициализировать такие переменные (задавать начальное значение, например, обнулять).
Как и любое не известное Паскалю слово, переменные должны быть объявлены в разделе описаний. Для указания, что это переменные, перед их объявлением должно стоять ключевое слово VAR.


Значения переменным в этом месте не задаются, а только указывается, какого типа переменная. Это нужно, чтобы Паскаль «знал», сколько байт памяти оставить этой переменной, и какие действия над ней являются допустимыми. Например:
Переменные одного типа перечисляются через запятую. После этого списка ставится двоеточие и указывается идентификатор типа. В данном примере имеются два идентификатора: integer и real. Первый обозначает целые переменные в диапазоне от -2147483648 до +2147483647 и занимает в памяти 4 байта. Второй – вещественные (дробные). Диапазон его значений от ± 5.0
·10-324 до ± 1.7
·10308. Число типа real содержит 15-16 значащих цифр и занимает в памяти 8 байт.
Если в задаче используются целые положительные числа в пределах от 0 до 255, то можно сэкономить память и ускорить вычисления, использую тип переменных byte (короткое беззнаковое целое).
Что получится, если в одном выражении использовать числа разного типа? Результат выражения будет приведён к самому памятеёмкому из данных типов. Например, при использовании integer и byte результат будет типа integer. При использовании integer, byte и real результат будет real. Однако есть некоторые операции и функции, которые могут быть использованы только с integer или только с real.
Примечание: работая в других диалектах Паскаля, не нужно рассчитывать, что там такие же типы будут занимать столько же памяти и находиться в таких же диапазонах. В каждом из них нужно выяснить эту информацию в технической документации или справочной системе.



Арифметические выражения. Приоритет арифметических операций

И в команде присваивания, и в команде writeln мы использовали арифметические выражения, вместо которых Паскаль подставлял результаты их вычислений. Арифметическое выражение состоит из констант, переменных и функций, соединённых знаками арифметических операций.
Арифметические операции имеют различный приоритет (старшинство). Если в выражении имеются операции разного приоритета, то в первую очередь выполняются более приоритетные операции. Операции одного приоритета выполняются подряд, слева направо.

Приоритет
Операции
Название

1
( )
группировка

2
+,
·
знаковые операции

3
*
умножение
мультипликативные операции


/
дробное деление



div
целочисленное деление



mod
остаток от деления


4
+
сложение
аддитивные операции



·
вычитание



Обычный знак деления ( / ) в Паскале используется как дробное деление, то есть, делит вещественные числа, и результат деления – вещественное число. Даже если поделить 6 на 3, результат будет не 2, а 2.0, то есть, вещественное число. Кроме дробного деления есть ещё деление без остатка div. Оно работает только с целыми числами, и результат деления – целое число. Остаток игнорируется. Если же, наоборот, нужен остаток от деления, используется операция mod. Например, выражение 20 div 6 даёт 3, а результат выражения 20 mod 6 равен 2. Пробелы в этих выражениях пропускать нельзя. Операция mod будет полезна при определении, делится ли одна величина на другую. Если остаток от деления равен нулю, - значит, делится без остатка.

Стандартные арифметические функции

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

На Паскале
В математике
тип
пояснение

1
abs(x)
|x|
ц, в
модуль x

2
exp(x)
e x
в
экспонента x

3
ln(x)
ln(x)
в
натуральный логарифм x

4
sqr(x)
x 2
ц, в
квадрат x

5
sqrt(x)
13 EMBED Equation.3 1415
в
квадратный корень из x

6
sin(x)
sin(x)
в
синус x

7
cos(x)
cos(x)
в
косинус x

8
arctan(x)
arctg(x)
в
арктангенс x

9
int(x)

в
целая часть числа x

10
trunc(x)

ц
целая часть x, преобразованная к целому типу

11
round(x)

ц
округлённое до ближайшего целого значение x

12
frac(x)

в
дробная часть числа x

13
random

в
случайное число в интервале [0; 1)

14
random(x)

ц
случайное целое число в интервале [0; x)

15
power(a,b)
ab
в
степень



















Некоторые из этих функций требуют пояснений.
Функции int и trunc делают одно и то же: отбрасывают дробную часть числа. Только int оставляет его вещественным (например, 13.0), а trunc делает целым.
Функция random(x) даёт целое случайное число от 0 до x (не включая x). Пока программа работает, каждое следующее обращение к random даст новое число в этом интервале. Но при следующем запуске программы набор случайных чисел повторится. Чтобы этого избежать, нужно в начале программы поставить команду randomize. Чтобы получить случайные числа не от 0 до x, а в произвольном диапазоне от a до b, нужно использовать формулу:
Простейший пример использования функции в выражении:
y:=2*sin(x/2+0.7);
Аргумент функции может содержать и другие функции. Например:
c:=trunc(sqrt(sqr(a)+sqr(b))) ;

Процедуры инкремента и декремента

Кроме функций над целочисленными переменными можно выполнять процедуры увеличения и уменьшения:

Процедура
Что делает
Как сделать это же

1
inc(x)
увеличивает x на 1
x := x + 1;

2
inc(x,12)
увеличивает x на 12
x := x + 12;

3
dec(x)
уменьшает x на 1
x := x – 1;

4
dec(x,12)
уменьшает x на 12
x := x – 12;






По сравнению с присваиванием процедуры inc и dec работают значительно быстрее, но применимы только для переменных целого типа. Кроме того, при больших именах переменных эти процедуры записываются компактнее. Сравните:
inc(wozrast); или wozrast:=wozrast+1;

Примеры решения линейных задач

Пример 1. Каждый пиксел рисунка занимает 3 байт. Сколько килобайт ( 1 Кбайт = 1024 байт ) требуется для хранения картинки размерами 500х300 пикселов?
В команде writeln после переменной V стоят две цифры, отделённые двоеточиями. Это – формат числа. Если его не указывать, вещественное число (типа real) будет выведено в формате с фиксированной точкой. В этой записи первое число обозначает точность, то есть, общее количество цифр, оставляемых в числе. Вторая цифра показывает число знаков после десятичной точки (все остальные знаки округляются). В данном случае ответ будет состоять из 3-х цифр, одна из которых будет стоять после точки. Если целая часть числа будет больше, чем две цифры, она, несмотря на формат, выведется полностью. Если меньше, чем число цифр, указанное в формате, перед числом будут добавлены пробелы. Формат числа можно указывать не только для вещественных, но и для целых чисел (у целых указывается только одна цифра – длина числа). Если число длиннее, чем указано, то формат никак на его вывод не повлияет. Но если число короче, то формат добавит пробелы вместо недостающих знаков. Это удобно использовать при выводе нескольких чисел, чтобы расстояние между ними было одинаково.
Обратите внимание, также, на оформление программы – отступы. Старайтесь придерживаться такого стиля оформления. Это нужно для лучшей читаемости программы.

Пример 2. Корова съедает в сутки около 70 кг. травы. Пастбищный сезон длится в среднем 150 суток. Примерная урожайность пастбищных культур 250 ц/га. Какова площадь пастбища, необходимого одной корове на пастбищный сезон? Сколько гектаров понадобится, если в стаде 65 коров?








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

Пример 3. Новое колесо выдерживает в среднем 100000 оборотов. Радиус колеса 0,5 м. Сколько км. пробежит автомобиль с новыми шинами?









Ввод данных с клавиатуры

Обычно программист и пользователь – это разные люди. Не всегда программисту заранее известно, с какими числами придётся работать пользователю. Поэтому вместо присваивания часто используют другой способ занесения чисел в переменные: ввод с клавиатуры. Программист с помощью команды write (или writeln) задаёт пользователю вопрос, а его ответ ожидает с помощью команды readln. После этой команды в скобках указывается переменная, куда должен попасть ответ, введённый с клавиатуры пользователем.
Одной командой readln можно ввести и несколько значений. Переменные для этих значений нужно перечислить после readln в скобках через запятую. Пользователь, отвечая на вопрос, должен после каждого числа ставить пробел или нажимать клавишу .

Примеры решения диалоговых задач

Пример 1. Какой процент составляет число a от числа b?







Пример 2. Проводится соревнование по поеданию пирожков. За 10 минут Вася съел a пирожков, а Коля b пирожков. На командном первенстве они составили одну команду. За сколько минут эта команда съест с пирожков?












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














Пример 4. К введённому двузначному числу n дописать цифру k в начало и в конец и, прибавив к результату 100, напечатать получившееся число.










Линейные задачи для самостоятельной работы

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

Отчёт по работе (в печатном виде) состоит из таких частей:
1. заголовок (группа, Фио студента, тема, № варианта /задачи/, место для оценки, даты и подписи преподавателя); 2. условие; 3. объяснение решения; 4. схема алгоритма; 5. исходный текст программы; 6. результат работы программы (скопировать из окна вывода).


Лаб. 1. Линеаризовать выражение:
Расположить выражение в одну строку.

13 EMBED Equation.3 1415

13 EMBED Equation.3 1415
13 EMBED Equation.3 1415

13 EMBED Equation.3 1415

13 EMBED Equation.3 14
1513 EMBED Equation.3 1415
13 EMBED Equation.3 1415

Лаб. 2. Линейные диалоговые задачи (на одно действие)
Решить задачи, введя величины, значения которых не заданы по условию, с клавиатуры.

Известны периметр и длины двух сторон треугольника. Найти третью.
Известны площадь и одна из сторон прямоугольника. Найти вторую.
Известна площадь круга. Найти его радиус.
Буханку хлеба массой m граммов разделили на одинаковые ломти массой m1. На всю буханку имеется 200 г. масла. По сколько граммов масла придётся на каждый ломоть хлеба?
Известна длина окружности. Найти её радиус.
Начальная температура t1 градусов. Каждую минуту она вырастает на a градусов. За сколько минут она достигнет t2 градусов?
Известны координаты двух точек. Найти расстояние между ними.
Известны площадь трапеции и оба её основания. Найти высоту.
В каждом стакане (200 мл) компота должно быть n граммов сахара. Сколько г. сахара нужно засыпать в трёхлитровую банку?
Известна высота трапеции и оба её основания. Найти площадь.
Известны скорость и время равномерного движения. Найти путь.
Известны плотность шоколада и объём плитки. Найти её массу.
Температура воздуха уменьшается с высотой примерно на 6° на каждый километр. Какова будет температура на высоте h км, если у поверхности Земли 20°?
Известны скорость, ускорение и время движения. Найти путь.
Прочность лианы на разрыв – a кг. Сколько обезьян массой b кг могут одновременно повиснуть на лиане?
Известны путь и скорость равномерного движения. Найти время.
Известны плотность жидкости и глубина. Найти давление.
Известны плотность жидкости и объём тела. Найти выталкивающую силу.
Известна масса 100 метров шерстяной нити. В клубке a метров. Найти массу клубка.
Радиус бочки R см, высота h см. Сколько литров она вмещает?

Лаб. 3. Диалоговые задачи на несколько действий
В некотором городе a одинаковых домов. В каждом b квартир. В 3-х из 5-ти квартир стоит живая новогодняя ёлка. До нужных размеров ёлка растёт в среднем 10 лет. На одном гектаре лесопосадок выращивается 200000 ёлок. Сколько гектаров елового леса нужно для города?
Клубок шерсти массой 100 граммов позволяет связать полотно площадью 0,25 м2. Стоимость клубка 80 рублей. Площадь полотна кофты составляет a м2. Сколько будет стоить шерсть для кофты, и сколько она будет весить?
a евро можно обменять на b рублей. с франков – на d рублей. Сколько франков можно получить за e евро?
С площади 1 гектар собрали a тонн картофеля. В среднем с одного куста собирают 0,7 кг. Расстояние между рядами 80 см. Найти среднее расстояние между кустами в ряду. (Напомним: гектар – участок 100м х 100м)
Известна температура t по шкале Цельсия. Найти соответствующие температуры по шкалам Фаренгейта и Кельвина. Один градус по Кельвину равен одному градусу по Цельсию, но значение 0о К соответствует -273,15о С. Один градус по Фаренгейту в 1,8 раза больше, чем один градус по Цельсию. Начало шкалы по Фаренгейту соответствует 32о C.
Для изготовления 1 кг. медного купороса требуется около 425 г. меди. Сколько купороса можно изготовить из m кг. меди?
В бочке радиусом r и высотой h находится смесь веществ. 40% объёма занимает вещество плотностью
·1, 32% - вещество плотностью
·2, а остальной объём – вещество плотностью
·3. Найти массу всего содержимого бочки.
На кирпичном заводе тратят t1 минут на загрузку 500 кирпичей в печь, t2 – на прогрев печи до нужной температуры, t3 – на обжиг кирпичей, t4 - на остывание печи и t5 – на выгрузку кирпичей. Сколько кирпичей может выдать завод за 30 дней, если печь работает круглые сутки?
За a дней b куриц снесли c яиц. За сколько дней снесёт одна курица d яиц?
В деревне a домов. Для отопления зимой одного дома тратится 4 ведра угля. (В ведре – примерно 8 кг. угля). При сгорании угля образуются вредные для человека и окружающей среды соединения, масса которых составляет около 5% массы угля. За выброс в воздух одной тонны вредных соединений поселковая администрация платит в экологический надзор штраф 15000 рублей. Высчитать сумму штрафа за весь отопительный сезон (200 дней в году).
Первый будильник отстаёт за сутки на a минут, а второй – на b минут (a>b). На сколько минут отстанет первый будильник от второго за 10 часов?
Заданы сумма S двух целых чисел и их произведение P. Найти эти числа.
Полезная площадь автостоянки 200 м3. Средняя площадь, занимаемая автомобилем, 5 м2. Плата за стоянку одного автомобиля в течение суток 100 рублей. Какова выручка владельца за месяц, если все места всегда заняты? Арендная плата за землю – 20000 руб. в месяц. Какова прибыль владельца (превышение выручки над затратами)? Налог составляет 18% прибыли. Сколько остаётся владельцу чистого дохода?
Взяв ссуду в банке (a руб.), предприниматель закупил на все деньги некоторый товар, который продал на 60% дороже. Из полученной выручки он вернул ссуду банку, погасил все расходы, потратив на это 10% прибыли. Налоги составили 18% от прибыли. Кроме того, 10% от ссуды пришлось отдать банку. Сколько рублей осталось предпринимателю чистого дохода?
Положив S рублей в сбербанк, через год Вы получите на 3% больше. Если не снимать процент, в конце второго года новая сумма возрастёт на 3%... Какую сумму Вы получите через 3 года?
По первой накладной со склада было выдано 70% имевшегося кирпича, а по второй – 40% остатка, после чего на складе осталось k штук. Сколько штук кирпича было на складе первоначально?
Штукатур работал 8 дней, а его помощник 5 дней. Дневной заработок штукатура на 40% больше, чем у помощника. За всю работу они получили S рублей. Сколько денег заработал каждый из них?
В раствор для укладки кирпича входит цемент, песок и вода. На два ведра цемента берётся четыре ведра песка и три ведра воды. Сколько цемента и песка пошло на раствор, в который было залито a вёдер воды?
Для перевозки нефти нужно было a цистерн ёмкостью 60 м3 (a>10). Но нашлось только 10 таких цистерн, а остальную нефть пришлось перевозить цистернами ёмкостью 50 м3 и 70 м3, взяв их одинаковое количество. Сколько всего было цистерн?
Продано k килограммов фруктов: яблок и груш. Определить, сколько кг продано каждого вида фруктов, если известно, что груши дороже яблок в 2.4 раза, и за все груши выручено столько же денег, сколько за яблоки.

Ветвление

Программы, в которых каждое следующее действие выполняется после предыдущего, называются линейными. Однако часто встречаются нелинейные программы, в которых порядок действия отличается от порядка расположения команд.

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














Существует также неполное ветвление, в котором группа команд исполняется только при истинности условия. Ложное условие не вызывает никаких действий.





Если в правой или левой ветви всего одна команда, то использовать слова begin и end не обязательно. Но, даже если в полном ветвлении в первой части не использовать begin и end, перед else точку с запятой не ставят.

Пример: Вася собирает древние монеты. Он приобрёл a динариев и b сестерциев разного достоинства и года выпуска. Хватит ли ему места в альбоме, если там всего с ячеек для монет?












Логические выражения
Условие в ветвлении представляет собой логическое выражение. Оно может содержать арифметические (или другие, например, текстовые) выражения и операции сравнения между ними: < (меньше), > (больше), = (равно), < > (не равно), <= (меньше или равно), >= (больше или равно).
Результат логического выражения – истина (true) или ложь (false). Например, значение выражения 2 > 3 равно false, а выражения 2 <= 3 - true. Для хранения в памяти логических значений существуют логические (булевские) переменные. Их описывают в разделе VAR словом boolean. Например, a:=b>c;

Иногда требуется составить сложное логическое выражение, содержащее несколько сравнений. В этом случае каждое сравнение помещают в скобки, а между ними используют логические операции and, or или xor. Операция and (И) обозначает одновременность выполнения двух условий. Операция or (ИЛИ) обозначает достаточность выполнения одного из двух условий. Операция xor (Исключающее ИЛИ) обозначает неодновременность выполнения двух условий (только одно из двух условий верно). Кроме того, существует операция отрицания not. Если она стоит перед истинным выражением, в результате получается ложь, а применённая к ложному, даёт истину. Ниже приведены таблицы истинности логических операций.





Если в одном выражении используется несколько логических операций, последовательность их выполнения определяется приоритетом: 1) NOT; 2) AND; 3) OR; 4) XOR. Все арифметические операции – более приоритетны, а все операции сравнения – менее приоритетны, чем логические операции. Нужная последовательность операций может быть достигнута применением скобок.
Примеры:
(2=3) or (2< >3) – результат true
((5+5> =10) or (1=2)) and ((2< 3)=(2+2< >5)) – результат true
(2<3) and not (2*2=4) – результат false

Пример задачи с составным условием: Ввести температуру морской воды и определить, можно ли купаться. Благоприятная для купания температура – от 19 до 26 градусов.











Ещё пример: Так как поворот Земли вокруг своей оси занимает несколько больше, чем 24 часа, то за 4 года накапливается опережение на одни сутки. Поэтому каждый год, кратный 4, является високосным (на 1 день больше). Но эти расчёты тоже неточны: за каждые 100 лет накапливается отставание почти на 1 сутки, поэтому годы, кратные 100 не являются високосными. Но отставание за 100 лет на четверть меньше одних суток, поэтому каждый четырехсотый год увеличивают на день, и годы, кратные 400 являются все же високосными. Программа должна ввести с клавиатуры год и определить, является ли он високосным. Напомню: «a делится на b без остатка» обозначает, что при делении a на b остаток равен 0.














Вложенное ветвление

Любая ветвь может не быть линейным участком программы, а сама содержать ветвление. Такое ветвление называется вложенным (или множественным) ветвлением. Чаще вторично разветвляется ветка «нет». В качестве примера разберём простую задачу:
В первом магазине хозяйка приобрела a кг. огурцов. Их оказалось b штук. Во втором магазине на c кг. получилось d штук. В каком магазине огурцы крупнее?
Находим массу одного огурца в каждом магазине и сравниваем их.



























Обратите внимание, что каждый else пишется под своим if. Ступенчатое расположение структур (особенно хорошо это видно в следующей задаче) очень рекомендуется для лучшей читаемости программы. Если пренебрегать этим правилом, большие программы становятся запутанными и неясно, какой else к какому if относится.
Не забывайте также, что любой else относится к последнему незакрытому if. Например, в показанном справа фрагменте else стоит под первым if, но относится ко второму. Это может привести к ошибкам. Исправит положение только правильное использование пары команд begin и end (так называемых «операторных скобок»), как показано во втором фрагменте.
Рисунок, изображённый над программой, на котором специальными значками и стрелками изображена последовательность действий (алгоритм) в программе, называется блок-схемой алгоритма. Программисты используют такие схемы для обсуждения алгоритма с непрограммистами или специалистами, использующими другие алгоритмические языки, а также для того, чтобы лучше продумать алгоритм, не отвлекаясь на мелкие детали и особенности языка программирования.

Вторая задача: Определить, является ли одно из двух введённых чисел делителем другого.













Эта программа работает с ошибкой, если одно из введённых чисел равно 0 (деление на 0 запрещено). Измените программу, сделав в начале дополнительную проверку этого случая.

Лаб. 4. Задачи на ветвление:
Программа вычисляет модуль введенного числа, не пользуясь стандартной функцией abs()
В 1 л тёплой воды можно растворить до 120 г поваренной соли. Растворится ли a кг соли в b л воды при тех же условиях?
Определить, является ли введённое число чётным
Определить, лежит ли точка (x, y) внутри круга с центром в начале координат и радиусом 5.
На вывод одного пиксела видеоадаптер тратит 0,00000003 секунды. Разрешение экрана – a х b пикселов. Сколько времени понадобится для вывода всего кадра? Будет ли при этом хорошее качество мультипликации? (Если частота смены кадров меньше 50 кадров в секунду, качество плохое)
Даны координаты двух точек. Определить, какая ближе к началу координат.
Определить, является ли целое число N точным квадратом.
Поместится ли a кг апельсинов в b ящиков (вместимость ящика – c кг)?
Возможно ли разместить два файла (объёмом a и b Кбайт) на одной дискете (объёмом 1440 Кбайт)?
Хватит ли на просмотр фильма одного часа, если он состоит из k кадров, а в секунду показывается 25 кадров?
Первая цветочница продала R роз по 50 рублей за цветок, а вторая T тюльпанов по 30 рублей. У кого выручка больше?
Из банка на выплату зарплаты привезли a рублей. Хватит ли этой суммы, если на предприятии n работников, их средняя зарплата s рублей, а в кассе ещё имеется остаток k рублей?
Для ремонта проколотой шины после нанесения на место прокола каучуковой смеси её нужно выдерживать 50-60 минут при температуре 70-80 °С. Вулканизатор поддерживал температуру t °С в течение m минут. Процесс вулканизации прошёл нормально?
Для полноценного питания коровы требуется 10 кг сена и 4 кг комбикорма в день. В наличии a кг сена и b кг комбикорма. На сколько дней этого хватит?
Первый абитуриент решил a упражнений по b задач в каждом, а второй – c упражнений по d задач. Кто из них лучше подготовился к поступлению в ВУЗ?
Сможет ли покупатель, располагающий суммой S рублей, приобрести a граммов конфет по цене b рублей за 1 кг?
Больному нужно ввести a см3 первого лекарства и b см3 второго. Хватит ли шприца ёмкостью 10 см3 для смеси этих лекарств?
Первое блюдо - 300 г борща. Второе блюдо – 250 г плова. В столовой приготовлено a кг борща и b кг плова. Сколько людей сможет накормить столовая полным обедом?
Войдёт ли в конверт размерами NxM открытка размерами RxP?
В секцию по баскетболу берут юношей не ниже 180 см. В прошлом году у Васи был рост h см, а за этот год он подрос на d см. Возьмут ли Васю теперь на баскетбол?

Лаб. 5. Задачи на ветвление с вычислениями:
Одна коробка с яйцами содержит 10 ячеек по 30 яиц в каждой. Поместятся ли a яиц в b коробок (уже имеющих пустые ячейки)? Если не поместятся, сообщить, сколько ещё требуется ячеек и коробок. Если останутся лишние коробки, сообщить, сколько осталось.
Определить, являются ли три введённых числа длинами сторон прямоугольного треугольника.
В котёл с 20 л воды всыпали m граммов соли. Норма для супа составляет от 10 до 12 г/литр. Определить, нормально ли посолена вода. Если недосолена, сообщить, сколько граммов соли нужно добавить до нормы. Если пересолена, – сколько литров воды нужно долить до нормальной концентрации.
После промывки шерсть сушат. Нормальная плотность шерсти, соответствующей требуемой влажности, составляет около 280 кг/м3. На текстильный завод поступило m тонн шерсти, объём которой составляет V м3. Определить соответствие сырья требуемой влажности.
Определить, лежит ли точка (x, y) внутри кольца с центром в начале координат, внутренним радиусом r1 и внешним радиусом r2
Врач прописал больному первого лекарства всего a таблеток, по b таблеток в день и второго лекарства c таблеток по d таблеток в день. На следующий день после того, как все лекарства будет приняты, больной должен прийти на приём. Через сколько дней больной попадёт на приём к врачу?
За первые 30 минут в Internet-клубе нужно платить по 80 копеек в минуту, а дальше по 60 копеек. Но если клиент работает без перерыва 5 часов, ему снижается дальнейшая оплата до 50 копеек в минуту. Сидоров работал a часов и b минут. Сколько ему нужно заплатить?
Поезд выехал в h1 часов и m1 минут. Поездка заняла h2 часов и m2 минут (меньше 1 суток). Во сколько часов и минут поезд приехал на станцию назначения? Не забыть, что в 24.00 время обнуляется. Часовые пояса не учитывать (счёт идёт по московскому времени).
1 конфета «Мишка на севере» весит 26-30 граммов. «Ласточка» - 15-19 г. «Грильяж» - 20-25 г. Вася съел a одинаковых конфет, общий вес которых – b граммов. Что это были за конфеты? (не исключено, что не из этих трёх видов, а какие-либо другие).
Два треугольника заданы своими сторонами. Программа определяет, равны ли эти треугольники.
Работа светофора запрограммирована следующим образом: Начиная с полуночи, 3 минуты горит зелёный свет, 1 минуту – жёлтый, 3 минуты – красный, 1 минуту – жёлтый. Затем всё начинается сначала. Дано вещественное число t, означающее время в минутах, прошедшее от полуночи. Определить, сигнал какого цвета горит в это время на светофоре.
Заданы координаты X1,Y1 левого верхнего угла и размеры A1 и B1 первого прямоугольника и координаты X2,Y2 и размеры A2 и B2 второго прямоугольника. Определить, помещается ли один из них целиком в другом (Стороны прямоугольников параллельны осям координат).
Время прибытия поезда на станцию h1 ч. и m1 м. Время отправления h2 ч. и m2 м. Человек пришёл на станцию в h3 ч. и m3 м. Попал ли он на этот поезд (или пришёл раньше или опоздал)?
Имеется два куска холста: 60х80 см и 70х70 см. Художник должен натянуть один из них на раму размером a x b см. Какой из них взять выгоднее, чтобы меньше холста пришлось отрезать? На подгиб берётся не менее 3 см. с каждой стороны. Если никакой холст не подходит, сообщить об этом.
Имеется три файла, размерами a, b и c Кбайт. На одной дискете помещается 1440 Кбайт. Войдут ли на неё все три файла? Если не войдут, проверить, можно ли разместить эти файлы на двух дискетах (Файлы не делить на части, а записывать только целиком).
Программа определяет, поместится ли круг, площадью S1 в квадрате, площадью S2.
Заданы даты рождения двух человек (число, месяц, год). Определить, кто из них старше.
Дано натуральное число n (n
· 9999). Верно ли, что все четыре цифры числа различны?
Заданы 4 числа. Проверить, являются ли они длинами сторон ромба, параллелограмма или четырёхугольника другого вида (считать, что стороны перечислены подряд).
Найти координаты точек пересечения прямой y = ax + b и окружности радиуса R с центром в точке (X, Y). Если точка одна или пересечений нет, сообщить об этом.

Выбор варианта
Вложенное ветвление – очень удобная программная структура. Но при большой глубине вложенности множественное ветвление становится громоздким. В некоторых случаях его можно значительно сократить, заменив конструкцией выбора варианта. Для этого должны выполняться такие условия:
все ветвления вкладываются в ветвь «нет»;
все они проверяют значения одной и той же переменной (или выражения);
проверяемое значение должно быть целого типа.

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

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

















То же, с применением новой команды:












Как видите, программа выиграла в размере и простоте.
Если в каком-либо из вариантов нужно выполнить не одно, а два и более действия, их заключают в операторные скобки begin и end:










Более сложные задачи с применением выбора вариантов:
1) С клавиатуры вводят число летящих ворон. Напечатать это число со словом «ворон», взятом с нужным окончанием.
В большинстве случаев окончание зависит от последней цифры: 2181 ворона, 851 ворона, 342(343, 344) вороны, 765 (766, 767, 768, 769, 770) ворон. Но имеется исключение: Если предпоследняя цифра – единица (например, 3211, 412), то независимо от последней цифры будет «ворон». Поэтому в этой задаче выбор варианта применяется совместно с ветвлением:

2) Ввести с клавиатуры число от 1 до 999 и назвать его словами (например, «семьсот сорок восемь»).
Число разделим на сотни, десятки и единицы и будем эти части называть словом по очереди, например, «пятьсот двадцать три». Проблема опять возникает, когда предпоследняя цифра «1». В этом случае две последних цифры называются одним словом, например, «пятьсот тринадцать».
































Лаб. 6. Задачи на выбор варианта:
В каждой из ниже перечисленных задач использовать выбор не менее чем из 5 вариантов (если условие явно не задаёт конкретное число вариантов).

Колдун должен сделать очередной ход. По нажатию на любую клавишу генерируется случайное число от 1 до 10, и программа печатает, какое заклинание произнёс колдун. Например, 1- удар молнии; 2 – огненный шар
На экране печатается прайс-лист, в котором перечислено оборудование и цены. Нужно ввести номер требуемого оборудования, затем указать количество, и программа должна выдать стоимость покупки.
Покупатель вводит имеющуюся у него сумму и количество порций мороженого, а программа называет, какое мороженное можно приобрести на такую сумму (цены выражаются целым числом). Если по указанной цене мороженого нет, программа сообщает об этом.
Разведчик получает закодированное числами сообщение. Каждое число обозначает какое-либо слово. Нужна программа-декодер, которая получает число и выдаёт слово.
Микки-Маус подходит к стене с отверстиями. Над каждым отверстием стоит номер. Некоторые ходы ведут в ловушку, некоторые – к запасам зерна, сыра, муки и т. д. Нужна программа, которая по введённому номеру сообщает, куда попадёт Микки-Маус.
Предлагается список авиарейсов. По введённому номеру рейса программа сообщает пункт назначения и цену билета.
Составить программу «Рабочее место заведующего хлебопекарней», которая выдаёт ассортимент производимой продукции, и при выборе нужного номера сообщает, сколько и какой муки, дрожжей, соли, воды и т.д. нужно для выпечки одной буханки данного вида хлеба.
Программа выводит пронумерованный список различных носителей информации: дискета, жёсткий диск, компакт-диск и т.д. Если ввести номер какого-либо из них, программа сообщает подробности: ёмкость, размеры, разновидности и т.д.
На экран выдаётся список наиболее распространённых программ. При выборе номера какой-либо из них программа сообщает дополнительную информацию: назначение, фирма-производитель, есть ли русифицированная версия, требуемый объём дисковой памяти и т.д.
На экране перечисляются названия домашних цветов. При выборе одного из них программа указывает страну, откуда происходит цветок и некоторые подробности по уходу за ним (любит ли свет, часто ли поливать, какая должна быть почва).
Программа должна напоминать хозяину, какой праздник (в том числе – семейные) приходится на интересующую его дату. Для этого с клавиатуры вводятся отдельно дата и месяц, объединяются в целое число и выводится описание праздника. Например, вводятся числа 23 и 02, из них составляется число 2302, по которому программа выводит «День защитника Отечества».
В горисполкоме имеется очередь льготников на квартиры. При вводе номера очередника программа сообщает его фамилию, имя, отчество, причину постановки в очередь (льготу) и количество комнат (по числу членов семьи), на которые претендует очередник.
Каждое поколение компьютеров характеризовалось электронной базой, размерами, объёмом памяти, быстродействием и другими характеристиками процессоров Программа запрашивает, какое поколение компьютеров нас интересует, и при вводе номера выдаёт отличительные особенности компьютеров данного поколения: электронную базу, размеры, объём памяти, быстродействие и другие характеристики.
В поликлинике при вводе номера кабинета программа сообщает, какой специалист принимает в этом кабинете (специальность и фамилию). Если работают два врача, сообщить, кто до обеда, а кто после.
Перечислить названия животных, имеющихся в зоопарке. При вводе номера животного программа сообщает кличку животного, чем его кормят служащие зоопарка, и что ему могут давать посетители.
Программа вводит номер компакт-диска из домашней коллекции и выводит описание: что есть на этом диске. Если игра, указывает её жанр.
Выдаётся список различных Intel-совместимых процессоров. При вводе номера одного из них программа сообщает основные характеристики данного процессора.
Программа работает как телефонная книга наоборот: при вводе 6-значного номера телефона (простым числом без чёрточек и пробелов) она выдаёт фамилию и адрес абонента.
Программа предназначена для процедурного кабинета. На экране печатается список лекарств для инъекций. При выборе нужного номера программа выдаёт информацию, сколько миллилитров («кубиков») растворителя нужно использовать, и какой взять: воду, физраствор, раствор новокаина или раствор глюкозы.
Программа для библиотеки просит ввести номер книги по каталогу и выдаёт сведения об этой книге: автора, название и год издания.

Циклы

Для многократного повторения участка программы используется цикл. В зависимости от способа, которым задаётся количество повторений, различают три вида циклов:
Цикл с предусловием (с условием перед телом цикла). В этом цикле перед началом «тела цикла» (повторяющегося участка программы) проверяется условие, которое определяет, нужно ли продолжать повторение. Если условие выполняется, тело цикла повторяется. Если условие перестало выполняться, цикл заканчивается. На Паскале этот цикл записывается так:







Если в теле цикла только одна команда, то begin и end не обязательны.

Пример использования цикла while: Известна сумма S1, положенная в банк и годовая процентная ставка P. Через сколько лет накопится сумма S2 ?













Цикл с постусловием (с условием после тела цикла). В этом цикле после тела цикла проверяется условие, которое определяет, нужно ли закончить цикл. Если условие выполняется, цикл заканчивается. Если условие ещё не выполнилось, цикл повторяется.

На Паскале этот цикл записывается так:






Пример использования такого цикла: Найти сумму чисел, первое из которых R (R>1) задано с клавиатуры, а каждое следующее в 1.5 раза меньше. Последнее из этих чисел (которое не входит в сумму) – меньше 0.001.











Цикл с параметром (счётчиком). В этом цикле используется целая переменная – счётчик (или параметр цикла), которая автоматически при каждом повторении изменяется на 1 от начального значения до конечного. Если начальное значение меньше конечного, то на Паскале он записывается так:






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


Пример использования цикла for: Найти сумму первых 30 натуральных чисел. Слово «первых» обозначает, что начинаем с 1. Сумма в цикле увеличивается, но чтобы было к чему прибавить самое первое число, до начала цикла сумму обнуляем (присваиваем ей начальное значение 0).


















Как выбрать цикл?
Если в задаче повторяются одинаковые (или похожие) действия, нужно использовать цикл. Но какие из 3-х видов цикла в каких задачах лучше применить? Для выбора цикла рассуждайте так:
Так как чаще всего встречается цикл FOR, в первую очередь попробуем его. FOR годится, если число повторов точно известно до начала цикла. Если число повторов заранее неизвестно, а проясняется только по ходу выполнения цикла, используется один из условных циклов: WHILE или REPEAT.
Если возможно придумать такие исходные данные к задаче, при которых тело цикла не должно выполниться ни разу, то нужно использовать WHILE.
Если первый раз тело цикла обязательно требуется выполнить при любых условиях, и только в ходе выполнения вводятся или вычисляются данные, позволяющие принять решение об окончании цикла, то нужно использовать REPEAT.
Во всех остальных случаях WHILE или REPEAT являются одинаково пригодными.

Экстренные события в теле цикла
Иногда, при выполнении в теле цикла какого-либо условия, нужно экстренно прервать цикл, не доводя до конца очередной повтор. В таких случаях используется команда break.





Иногда, при выполнении в теле цикла какого-либо условия, нужно экстренно перейти к следующему повтору, не доводя до конца очередной повтор. В таких случаях используется команда continue. (Если это происходит в цикле FOR, то счётчик получает при этом следующее значение.)

Команды break и continue могут применяться в любом из видов циклов. Вне цикла их использование запрещено.
В некоторых задачах используется вложенный цикл (цикл в цикле). Например, каждый месяц в течение года больному нужно сделать десять уколов. Здесь внешний цикл (For) считает месяцы, а внутренний (тоже For) считает уколы в каждом месяце.
При выходе с помощью break из вложенного цикла мы попадаем во внешний (аналогично тому, как это происходит по окончании внутреннего цикла). А если нужно при каком-либо событии выйти сразу из двух или более вложенных циклов? Это можно сделать так:

В разделе описаний после слова Label указать метку (любое слово кроме служебных, составленное по тем же правилам, что и имена переменных).
В том месте (после конца последнего из циклов), куда нужно выскочить, поставить эту метку с левого края экрана и после неё поставить двоеточие.
В том месте (во внутреннем цикле), откуда нужно выскочить при выполнении какого-либо условия, поставить команду goto и после неё эту метку.

Многие специалисты (в том числе и автор Паскаля) не рекомендуют использовать команду goto, считая её потенциально опасной (источником логических ошибок). Поэтому в некоторых реализациях Паскаля (в том числе и Pascal ABC) эта команда отсутствует. Вместо неё можно завести специальную «флаговую» переменную, которая приобретает определённое значение перед прерыванием внутреннего цикла. Тогда во внешнем цикле можно проверить эту переменную, и если «флаг установлен», прервать и внешний цикл.







Лаб. 7. Числовые задачи с циклом For

Распечатать синусы всех углов от a° до b° с промежутком 0,01°. Результат представить с 4 десятичными знаками. Все целые значения градусов выделить жирным шрифтом.
Сколько из целых чисел от a до b попадают в промежуток от e до d?
Вводят число k. Напечатать 10 чисел до k и 10 после k.
Среди всех трёхзначных чисел напечатать те, у которых одна из цифр равна сумме двух других.
Напечатать в одну строку все числа от 1 до 200, пропуская числа, оканчивающиеся нулём.
Найти сумму всех нечётных чисел от a до b.
Напечатать таблицу квадратов и кубов первых a натуральных чисел.
Последовательно вводятся с клавиатуры n целых чисел. Найти суммы всех отрицательных и всех положительных и определить, какая из них по модулю больше.
Найти произведение 5 введённых с клавиатуры целых чисел. Числа, кратные 11, пропускать.
Напечатать в одну строку все числа от a до b, пропуская числа, кратные 5.
Ввести с клавиатуры 10 целых чисел и распечатать их в одну строку. При печати пропускать числа, большие 99.
Напечатать все двузначные числа, сумма цифр которых делится на 7. Посчитать их количество.
Ввести a и b (<100) и напечатать все числа от 1 до 100, кроме кратных a или b.
Найти, сколько чисел от a до b делятся на 7 или 9 (но не на 7 и 9 одновременно).
C клавиатуры вводятся 10 целых чисел. Определить, каких чисел больше: положительных или отрицательных.
Напечатать в одну строку все числа от a до b, дважды повторяя числа, кратные 3 или 7.
Найти двухзначные числа, равные сумме куба числа единиц и квадрата числа десятков.
Найти сумму всех чисел от a до b, кратных 3, но не кратных 7.
Ввести x с клавиатуры и определить, сколько чисел в промежутке от 1 до 100 делятся без остатка на x, x-1 или x+1.
Ввести 5 двузначных чисел и напечатать для каждого из них перевёртыш (в котором цифры поменялись местами).
Лаб. 8. Сюжетные задачи с циклом For

Первоначальная стоимость оборудования мастерской составляет R0 рублей. Каждый год остаточная стоимость оборудования уменьшается на p% («амортизация», то есть, учёт износа) по отношению к стоимости предыдущего года. Кроме того, каждый год закупается новое оборудование на D рублей. Вычислить остаточную стоимость оборудования мастерской через n лет.
На продуктовый склад привезли в понедельник продукции на сумму 1000 р. Каждый следующий день недели кроме воскресенья привозят продукции на 10% больше. Со следующего понедельника опять начинают с 1000 руб. Когда на складе накапливается продукции не менее, чем на 10000 руб, со склада увозят потребителям партию стоимостью ровно 10000 руб. На какую сумму будет иметься на складе продукция через a дней после начала его работы?
Пойманную мышь посадили в клетку. За первый день она съела s граммов сыра. Каждый следующий день ей давали на 10% больше, чем в предыдущий. Но каждый 5-й день сыра давали меньше, чем в предыдущий день на 1 грамм. Сколько сыра съела мышь за d дней?
Агент 007 узнал, что в секретном сейфе трёхзначный код, в котором все три цифры разные. При этом средняя цифра равна разности крайних цифр. Составить программу, которая напечатает для него все такие числа
Богатая тётушка из ЮАР каждый год, начиная с рождения, дарит племяннику на именины 1 алмаз. Исключение составляют круглые даты (кратные 10), а также 17 и 25 лет, когда подарки другие. Сколько алмазов накопилось, когда племяннику исполнилось a лет?
Семья сдаёт комнату в аренду и тратит полученные деньги на оплату учёбы сына. Начальная сумма аренды a рублей в месяц. Каждый месяц она увеличивается на 3%. Начальная оплата учёбы – c рублей в месяц, и растёт она на 2% каждый месяц. Хватит ли этих денег на учебный год (10 месяцев), при условии, что остатки ни на что другое не тратятся, а приберегаются для тех же целей? Если не хватит, то какой суммы? Если деньги останутся, то сколько?
Полив саженца зависит от его высоты. Вначале на полив саженца высотой 2 см тратится 0,6 л воды. Каждый раз при достижении высоты, кратной 10 см, расход воды увеличивается на 0,3 л. Каждый день высота саженца увеличивается на 1 см. Сколько всего литров воды будет израсходовано за сезон (60 дней)?
Исследователи насчитали на одном из островов Тихого Океана в сезон откладки яиц a черепах. Самок и самцов среди них поровну. Каждая черепаха-самка откладывает в среднем 10 яиц. Около половины этих яиц поедаются животными. Из оставшихся 20% не смогут проклюнуться. Из вылупившихся черепашек до следующего года доживает 40%. Но и из взрослых черепах только 80% доживают до следующего сезона. Сколько черепах окажется на острове через 5 лет? Будет ли их больше, чем вначале и если да, то насколько?
На фабрику поступило a кг промытой шерсти, b% веса которой составляет вода. При сушке за каждый час испаряется 30% имеющейся влаги. Сколько процентов от веса шерсти будет составлять вода после 5 часов сушки?
На картонную бобину внешним диаметром a мм намотана лента скотча, толщиной 0,02 мм. Всего намотано b слоёв. Какова длина ленты? (Не забудьте, что длина одного витка зависит от радиуса.)
Известно, что некоторые бактерии размножаются каждые три минуты, разделяясь на две. Однако не все бактерии доживают до трехминутного возраста. Каждую минуту четверть всех бактерий погибает. Составить программу, которая печатает число бактерий через n минут, если в начале было k только что родившихся бактерий (n и k - целые числа).
Первый год своей работы «хорошо раскрученный» композитор Траляляхин создал a песен. Каждый следующий год – на одну песню больше. В среднем 5% его песен – 1-го уровня (дают 10000$ в год, держатся 3 года), 10% - 2-го уровня (дают 2000$ в год, держатся 2 года), а остальные – 3-го уровня (дают 500$ в год, держатся 1 год). Каков весь доход Траляляхина за b лет его творчества?
На каждом квадратном метре скалистого берега вблизи поверхности прилепилось 100 мидий. С увеличением глубины на каждый метр количество мидий увеличивается на 10% по сравнению с предыдущим метром. Сколько всего мидий на прямоугольном участке скалы шириной a и глубиной h (a и h – целые числа)?
Про новый парикмахерский салон узнали a человек. Каждый из них каждый день сообщает об этом в среднем 2-м знакомым. На следующий день они тоже сообщают 2-м своим знакомым и т.д. Каждый седьмой день – выходной, когда удаётся рассказать новость только одному знакомому. Сколько человек будет знать о салоне через b дней?
В первый год засеяли ячменём участок в 100 гектаров. Средняя урожайность составила 20 центнеров с гектара. После этого каждый год средняя урожайность уменьшалась на 2%, а засеянная площадь увеличивалась на 5%. Сколько ячменя собрали за a лет?
Археологи раскопали 10 древних сооружений в форме параллелепипеда. Высота первого 2 м, а каждого следующего на 20 см больше. Длина первого 6 м, а каждого следующего на 30 см. короче. Ширина первого 2 м, а каждого следующего – на 30 см больше. Найти суммарный объём всех этих сооружений и их вес, если принять, что вес одного кубометра материала, из которого они построены, равен 4,5 т.
Сопротивление первого резистора – R Ом. Каждый следующий имеет сопротивление на 1 Ом больше. Каково сопротивление участка цепи, в который включены параллельно 10 таких резисторов?
В области 12 районов. Площадь первого S км2, а каждого следующего – на 10% больше. Плотность населения первого района – p тыс. чел./км2, а каждого следующего – на 5% меньше. Сколько всего человек проживает в области?
В первый год наблюдения за погодой острова Аквар выпало 300 мм осадков. В течение первых 10 лет каждый год количество осадков увеличивалось на 12%, а следующие 10 лет ежегодно уменьшалось на 12%. Какой уровень осадков выпал на n-ый год от начала наблюдений? А сколько их выпало всего за эти годы?
На тополе выросло 2037 листьев. Но 1 сентября один лист упал. Каждый следующий день листьев опадало в 2 раза больше, чем в предыдущий, и ещё один лист. Сколько листьев осталось после 10 сентября?
Лаб. 9. Задачи с условными циклами
Осёл может перенести груз, равный половине своего веса. Вес осла – m кг. В первый день на осла нагрузили a кг, а каждый следующий день увеличивали вес груза на 1 кг. Сколько дней сможет работать осёл, и какой суммарный груз он перевезёт за это время?
Леспромхоз ведёт заготовку древесины. Её первоначальный объём на территории леспромхоза был a м3. Ежегодный прирост составляет p % от объёма на начало года. Годовой план заготовки древесины – b м3. Определить, происходит ли убыль, и если происходит, то через сколько лет объём древесины составит менее половины от начального?
В первый год пребывания на необитаемом острове Робинзон посадил Z зёрен. Он решил не есть хлеб до тех пор, пока урожай не составит более 1 миллиона зёрен. Каждый год 10% посаженных зёрен съедали грызуны ещё до их прорастания. Из каждого оставшегося зерна вырастает колос с 16 зёрнами. Но ещё до сбора урожая 10% его успевали разворовать птицы, как ни боролся с ними Робинзон. Сколько же лет пришлось ему ждать первого хлеба?
Клиент взял в банке ссуду S рублей. В конце каждого месяца он выплачивает A рублей (кроме последнего месяца, когда он выплатит остаток, меньший A). Перед каждой выплатой долг увеличивается на 1% от суммы остающегося долга. Через сколько месяцев клиент погасит всю ссуду?
На картонную бобину наружным диаметром a мм намотана лента скотча, толщиной 0,02 мм и длиной 600 м. Сколько витков на бобине? (Не забудьте, что длина одного витка зависит от радиуса.)
Ввести число и сообщить, сколько в нем нечетных цифр.
Покупатель имеет в неограниченном количестве купюры достоинством 1, 2, 5, 10, 50, 100 и 500 рублей. Сколько купюр разного достоинства должен отдать в кассу покупатель, чтобы заплатить сумму S, если он стремится платить самыми крупными купюрами?
В первом году засеяли ячменём участок в 30 гектаров. Средняя урожайность составила 20 центнеров с гектара. После этого каждый год средняя урожайность увеличивалась на 2%, а засеянная площадь увеличивалась на 5%. За сколько лет собрали a тонн ячменя?
В небольшой отгороженной от моря бухте учёные поселили семейство китов. Вначале в бухте было a тонн планктона. Каждый день масса планктона увеличивается на b%. Но киты съедают с центнеров планктона в день. Если планктона в бухте станет меньше d тонн, его будет трудно добывать, и киты будут голодать. Будет ли масса планктона в бухте уменьшаться, и если да, то через сколько дней китов придётся выпускать из бухты?
Предприниматель взял в долг d рублей. Каждый месяц он возвращает 1000 рублей и 3% от оставшейся суммы. Если осталось меньше 1000, он выплачивает весь остаток без процентов. Какая сумма будет выплачена за всё это время?
Пленник, которого держали в охраняемой землянке, делал подземный ход. В первую ночь он прокопал ход длиной 1 м. Каждую следующую ночь из-за потери сил он делал ход на 5% короче. Через сколько дней он сможет сбежать, если до свободы путь 13 м?
Некий посёлок проездом посетил колдун Агрикулюс. По просьбе жителей он заколдовал поле на урожай. Но сказал так: «Каждый третий год вы должны растить бобы, каждый пятый – капусту, а каждый седьмой – кукурузу. Все остальные годы – пшеницу. А если годы совпадают, вы можете, например, растить полосами кукурузу и бобы. Если послушаетесь и ничего не перепутаете, будет вам хороший урожай». Составить программу, которая вычислит, через сколько лет после посещения колдуна на поле росли три года по очереди кукуруза, бобы и капуста.
На необитаемый остров для эксперимента завезли 100 тушканчиков. Пищи хватает всем, экология не нарушена, жизни ничто не угрожает. Численность тушканчиков зависит только от естественной рождаемости и смертности. Коэффициент рождаемости за год равен 50% , коэффициент смертности 20%. Определите, когда (на какой год) численность популяции увеличится вдвое.
Хорошая консистенция теста – это когда на 1 кг муки приходится 0,32 – 0,36 л воды. Была отвешена порция a кг муки и b л воды. Если получилось слишком жидко, придётся досыпать муки, если слишком сухо – долить воды. Но для муки имеется мерка только на 0,5 кг, а для воды мерка только на 0,2 л. Пользуясь по очереди этими мерками, программа должна довести тесто до кондиции, сообщая при этом о производимых действиях и результатах.
На открытой поляне выросла берёза. Первый год у неё было 5 серёжек. Каждый следующий – в 2 раза больше, пока не достигнет N. После этого количество серёжек стабилизируется. Из одной серёжки разлетается 100 семян, из которых в среднем 1/15 часть прорастает. Каждая берёза, достигшая M лет, погибает от старости. Через сколько лет на этом месте возникнет берёзовая рощица из K деревьев?
Группа туристов отправилась в поход. Скорость движения группы 4 км/ч. Через 10 часов после этого отставший турист отправился по тому же маршруту со скоростью 5 км/ч. На каком часу от начала своего движения турист нагонит группу, если он делает часовой перерыв через каждые 4 часа, а группа – через каждые 3 часа. Считать, что длительного отдыха (в том числе, ночного) туристы не делают.
Рассеянный профессор, обдумывая новую теорему, подошёл к тротуару, вымощенному плитками. Пройдя 20 плиток вперёд, он решил вернуться и прошёл 5 плиток назад. Затем опять повернулся вперёд и т.д Каждый путь вперёд был на 1 плитку короче предыдущего пути вперёд, а путь назад – на 2 плитки длиннее предыдущего пути назад. Через сколько поворотов профессор вернётся к началу тротуара?
Из воздуха в питательный бульон попала бактерия и начала размножаться. Каждую минуту каждая бактерия рождает ещё одну. Но каждые 5 минут третья часть бактерий погибает. Кроме того, каждые 7 минут в бульон попадает из воздуха ещё одна бактерия. Через сколько минут в бульоне будет 1000 бактерий? Сколько бактерий к тому времени погибнет?
Разогнавшись с пригорка, велосипедист набрал скорость a м/с и едет по инерции по ровному горизонтальному асфальту с ускорением -0,3 м/с2. Через каждые 5 секунд он нажимает на педали, добавляя своей скорости 1 м/с. За какое время велосипедист проедет 100 м? Если он остановится раньше, чем достигнет 100 м, то сообщить, через какое время.
Начиная от села Еськово, река Рыпа течёт по ровному каменистому руслу с одинаковой глубиной 2,5 м по всему ложу. Вблизи Еськово ширина реки 5 м. Дальше по течению в Рыпу вливается в среднем по одному притоку на каждый километр. Средняя глубина притока 0,7 м, средняя ширина вблизи устья 2 м. Скорость течения притоков примерно совпадает со скоростью течения реки. Из-за вливания притоков ширина Рыпы постепенно увеличивается при неизменной глубине. Рассчитать ширину реки на расстоянии a км вниз по течению от Еськово.

Библиотека CRT
Паскаль содержит небольшое число встроенных команд, но зато может расширять свои возможности за счёт создания новых команд. Не обязательно описывать новые команды прямо в тексте программы. Можно подключить описания, хранящиеся в отдельных файлах – модулях. Универсальные модули, пригодные для подключения ко многим программам называются библиотеками. Библиотеки группируют команды по темам, например, библиотека, отвечающая за мультипликацию, библиотека, организующая вывод музыки и т.д Некоторые библиотеки входят в поставку PascalABC. Они называются стандартными библиотеками. К ним относится и библиотека CRT. При её подключении возникает специальное текстовое окно для ввода и вывода. Большинство команд из CRT относятся к управлению выводом текста в это окно. Но в CRT входят также команды управления клавиатурой.
Для подключения к программе библиотеки используется команда USES, после которой указывается одна или (через запятую) несколько библиотек (например, uses crt; ). Эта команда располагается в следующей после заголовка строке, до других описаний.
При включении в программу библиотеки CRT, можно использовать такие новые команды:

TextSize(высота); Устанавливает размер символов в пунктах (по умолчанию 10 пунктов). Пункт - отрезок 1/3 мм.
CRTWindowSize(ширина,высота); Устанавливает размер текстового окна в символах.
Window(x1,y1,x2,y2); Определяет на экране текущее окно (в котором в дальнейшем будет происходить весь ввод-вывод). Устанавливает курсор в левый верхний угол текущего окна. Координаты задаются в символах текущего размера.
ClrScr; Очищает цветом фона все текстовое окно (или текущее окно, установленное процедурой window). Устанавливает курсор в левый верхний угол очищенного окна.
ClrEol; Очищает все символы с позиции курсора до конца строки без перемещения курсора.
DelLine; Удаляет строку, содержащую курсор.
InsLine; Вставляет пустую строку в позиции курсора.
HideCursor; Скрывает текстовый курсор.
ShowCursor; Делает текстовый курсор видимым.
TextBold; Устанавливает жирный стиль символов.
TextNormal; Устанавливает нормальный стиль символов.
TextColor(цвет); Устанавливает цвет текста, печатаемого после этой команды. Цвета, используемые в этой и следующей команде, указываются либо числом, либо английским словом-константой:
основные цвета их светлые оттенки
0 Black
чёрный

8 DarkGray
тёмно-серый

1 Blue
синий

9 LightBlue
светло-синий

2 Green
зелёный

10 LightGreen
светло-зелёный

3 Cyan
бирюзовый

11 LightCyan
голубой

4 Red
красный

12 LightRed
светло-красный

5 Magenta
малиновый

13 LightMagenta
сиреневый

6 Brown
коричневый

14 Yellow
жёлтый

7 LightGray
серый

15 White
белый

TextBackGround(цвет); Устанавливает цвет фона позади печатаемых после этой команды символов. Если после этой команды применить ClrScr, то поменяется цвет всего окна.
GotoXY(x,y); Перемещает курсор в позицию (x,y). Ближайший ввод или вывод начнётся с этой позиции.
ScrollingOff; / ScrollingOn; Отключает / включает прокрутку при выводе.

Кроме перечисленных команд для управления текстовым выводом, библиотека CRT содержит ещё две функции, помогающие при вводе отдельных символов с клавиатуры.
Ожидание нажатия одного символа: readkey; В разделе VAR объявляется переменная типа char для хранения одного символа. Используется она так: kl:=readkey;
В некоторых случаях нужно посмотреть нажатую клавишу, не ожидая её нажатия (не нажато, ну что ж, пойдём дальше). В этих случаях удобно использовать функцию keypressed; булевского типа. Она даёт true, если нажата хоть какая-нибудь клавиша и false, если ничего не нажато.
Обычно readkey и keypressed используют совместно: если нажато, посмотрим, что нажато. Например, if keypressed then kl:=readkey;


Рассмотрим пример задачи с использованием библиотеки CRT. Нужно организовать заставку к игре «Смертельная битва». Пусть слово «Смертельная» движется слева направо, а «битва» - немного ниже справа налево. Дойдя до середины, слова должны остановиться.
Движение организуем так: в цикле верхнее слово ставим каждый раз правее, а нижнее – левее. Чтобы за словами не оставался след, мы верхнее слово начинаем с пробела (который затирает предыдущую букву), а нижнее слово оканчиваем пробелом. Начальные и конечные координаты подбираем так, чтобы слова в последний раз стали ровно посередине экрана. Чтобы при движении курсор не моргал около слова, мы отключаем его.












Команда sleep(50); позволяет замедлить движение.
Второй пример: Пусть слово «МЯЧИК» летает по экрану, отражаясь от его краёв. При каждом отражении слово меняет цвет. Остановка движения – по нажатию любой клавиши. Движение организуем так. Ставим слово в текущих координатах, делаем паузу и стираем слово (написав на его месте пробелы). Затем меняем координаты и ставим его на новом месте.





















Следующая задача – более сложная, уже целый проект: Написать программу – клавиатурный тренажёр. В пустом окне сверху вниз движется случайно выбранная русская заглавная буква случайного цвета (след не затирается). Если нажать клавишу с этой буквой, новая буква начнёт падать в новом столбце. Если нажать неправильный символ, увеличивается счётчик ошибок, а буква продолжает падение. Если буква доходит до конца столбца, новая буква появляется в соседнем столбце. Когда заканчивается последний столбец, окно очищается, и выводятся результаты. Чем раньше мы нажимаем правильную букву, тем больше пустой остаток в данном столбце. Сумма таких остатков и будет нашим результатом – очками.
Для выбора случайной буквы мы придумаем случайный номер буквы (в пределах от 1 до 33) и возьмём её под этим номером из алфавита, который хранится в строковой переменной. (Подробности о работе со строками - при изучении этой темы).






























Библиотека SOUNDS

Для использования в программе мелодий и звуков нужно подключить библиотеку sounds. Она содержит такие процедуры и функции для работы со звуками:
LoadSound(’имя файла’); Функция загружает звук из файла в оперативную память и возвращает описатель звука (звуковой файл должен иметь формат .wav). Для описателя звука заводят переменную типа integer, куда и присваивают возвращаемое значение. Например: muz:=LoadSound(’Hi_ho.wav’);
PlaySound(muz); Начинает проигрывание звука с описателем muz. При запуске новой мелодии с другим описателем прежняя не отключается. Таким образом, можно одновременно с фоновой музыкой озвучивать эффекты.
RewindSound(muz); "Перематывает" звук с описателем muz на начало.
StopSound(muz); Прекращает проигрывание звука с описателем muz.
DestroySound(muz); Удаляет звук с описателем muz из оперативной памяти, описатель звука при этом становится недействительным.
SoundIsPlaying(muz); Функция. Возвращает True если звук с описателем muz проигрывается и False в противном случае.
SoundTime(muz); Функция. Возвращает длительность звука с описателем muz в миллисекундах.

Лаб. 10. Задачи с использованием циклов и библиотек CRT и SOUNDS
В окне 40х20 на зелёном фоне сверху вниз одновременно спускаются (след не остаётся) 10 белых букв «А» (с интервалом в 3 знакоместа). Дойдя до низа окна, буквы отражаются и движутся вверх (при этом издаётся звук). От верхнего края тоже отражаются. Это продолжается до нажатия любой клавиши.
В окне слева направо движется колонка букв. Дойдя до края, колонка отражается. При движении слышна музыка, а цвет букв и сами буквы случайно меняются. При отражении от правого и левого края музыка меняется.
Буква движется вправо. Через случайное число шагов она меняет направление на случайное вверх или вниз. Затем снова влево или вправо и т.д. На границах окна буква отражается. При каждом изменении направления раздаётся один звук, а при отражении другой. При изменении направления меняется цвет, а при отражении меняется буква.
В окне по самому краю рисуется прямоугольник из одинаковых букв. После небольшой задержки – прямоугольник другого цвета из других букв, внутри первого и т.д. Всё это происходит со звуковыми эффектами.
Одинаковыми буквами медленно рисуется наклонная решётка: каждая следующая буква ниже и правее. Между «прутьями решётки» расстояние в 3 буквы. Когда все «прутья» дойдут до низа, начинается следующая серия прутьев другого цвета, на 1 букву правее первых прутьев. И т.д. Заканчивается это, когда всё окно заполнено буквами. Процесс рисования сопроводить музыкой, которая сменяется для каждой новой решётки.
Сверху в середине окна (30х20) появляется слово «влево» или «вправо» (порядок их появления случаен) крупными буквами (каждый раз другого цвета) и начинает падать вниз. Во время падения нужно клавишами «л» или «п» перемещать слово в нужную сторону. Если успел довести до нужного края, добавляются очки. Через 20 слов выдаётся сообщение о набранных очках.
Буква движется по кругу по часовой стрелке. При нажатии любой клавиши начинает двигаться против часовой стрелки (и т.д.). При этом по часовой стрелке звучит одна музыка, а против – другая.
Буква движется вдоль границ окна по часовой стрелке. При нажатии любой клавиши начинает двигаться против часовой стрелки и т.д. При этом по часовой стрелке звучит одна музыка, а против – другая. Буква при каждом нажатии меняется на случайную.
В центре окна буквами «Ш» заполнена квадратная область размером 5х5. По окну летает буква, отражаясь от краёв. Каждый раз, когда буква попадает в квадрат (но не всё время, пока она пролетает квадрат) раздаётся звук, и квадрат меняет цвет на случайный.
В окне буквами «Ш» нарисованы два квадрата. На левом краю окна стоит буква «о», которую нужно клавишами-стрелками (можно буквами или клавишами цифрового блока) перевести (при движении след остаётся) на правый край окна к стоящей там букве «П», при этом, не задев квадраты и не зайдя за границу экрана. При задевании всё начинается сначала.
В окне рисуется таблица умножения. Левый и верхний заголовки одного цвета, а сами числа другого. Одно из чисел (место выбирается случайно) пропущено, там моргает курсор. Под таблицей указывается число правильных и неправильных ответов. При вводе правильного ответа увеличивается первый счётчик, и затирается число на новом месте. При вводе неправильного ответа увеличивается второй счётчик, и затирается число на прежнем месте.
Из центра окна наружу по часовой стрелке разворачивается спираль прямоугольной формы, составленная из букв «о». Расстояние между горизонтальными витками – 1 знакоместо, а между вертикальными – 2 знакоместа. Использовать цикл.
Слева направо буквами рисуется волна, состоящая из горизонтальных и вертикальных участков. Использовать цикл.
Нарисовать буквами ёлочку. Каждая ветка длиной 3 буквы «ш». Ствол состоит из букв «о». Использовать цикл.
В цикле нарисовать пилу, состоящую из букв «А».
Нарисовать «размножившуюся» букву «ш», состоящую из букв «Ш». Использовать цикл.
Буква находится в левом верхнем углу и начинает двигаться по диагонали (ширина окна равна его высоте). Дойдя до середины, буква случайным образом меняет направление и движется к какому-либо из углов. Оттуда - обратно к центру и т.д., до нажатия пробела. В центре при изменении направления раздаётся короткий звук. Если направление осталось прежним, звука нет.
Вдоль границ окна белыми буквами «Ш» нарисована рамка. По экрану летает красная «О», отражаясь от стенки (не заходя внутрь неё). В месте отражения буква «Ш» стенки меняет свой цвет на красный. При этом раздаётся звук удара.
Нарисовать в цикле буквами «П» лестницу из левого верхнего угла окна в правый нижний. Количество ступенек (не меньше 2) и размеры окна ввести с клавиатуры.
Программа ожидает нажатия буквы, и этой буквой рисует большое изображение этой же буквы. (Пусть программа понимает 5 самых простых для рисования букв, а нажатие других символов игнорирует.)

Порядковые типы данных
В программировании (как и в математике) используются два набора чисел: непрерывный и дискретный.
К непрерывному набору относятся вещественные (дробные) числа. Смысл непрерывности заключается в том, что для двух любых, сколь угодно близких друг другу неравных чисел найдётся промежуточное число. Например, возьмём A=0.000001 и B=0.000002. Для них существует промежуточное число C=0.0000015. При использовании компьютера понятие непрерывности нарушается. Дело в том, что для дробного числа в компьютере выделяется определённое количество байт. Например, в Pascal ABC для числа типа Real резервируется 8 байт. Такое число содержит 16 значащих цифр и по модулю не может превосходить величины 1.7
·10308. Самое маленькое положительное число типа Real равно 5.0
·10-324. Следовательно, если A и B отличаются на 1 только в 16-ой цифре, то найти между ними промежуточное значение C невозможно.
Надо иметь в виду, что в других реализациях Паскаля тип Real может отличаться по количеству байт, верхнему и нижнему пределам, числу значащих цифр. Кроме того, многие реализации Паскаля имеют и другие вещественные типы данных (single, double, cardinal), которые отличаются от Real количеством байт, верхним и нижним пределами, числом значащих цифр. Поэтому, приступая к работе с какой-либо реализацией Паскаля, следует изучить используемые в ней вещественные типы данных или, если очень высокая точность расчётов не требуется, ограничиться типом Real, который имеется в любой реализации Паскаля.
К дискретному набору (порядковые типы данных) относятся целые числа. Кроме уже известного Вам типа Integer, существуют и другие. Сравним их с помощью таблицы:

Тип
Байт
Значащих цифр
Нижний предел
Верхний предел

Integer
2
5
-32768
32767

Byte
1
3
0
255

ChortInt
1
3
-128
127

Word
2
5
0
65535

LongInt
4
9
-2147483648
2147483647


К порядковым типам данных относятся не только числовые, но ещё перечислимые, символьные и ограниченные типы данных. Рассмотрим их подробнее:
Перечислимый тип данных
Перечислимый тип определяется упорядоченным набором идентификаторов. Задаётся этот набор в разделе type (он находится до раздела var), а в разделе var описываются переменные такого типа. Например:













С данными перечислимого типа возможны такие операции:
Найти порядковый номер величины в наборе: k:=ord(Zavtra);
Найти следующее значение в наборе: Zavtra:=succ(Segodnya);
Найти предыдущее значение в наборе: Vchera:=pred(Segodnya);
Переменную перечислимого типа можно использовать в качестве счётчика в цикле for и в качестве проверяемого выражения в команде выбора варианта case. Например:








Символьный тип данных

0
1
2
3
4
5
6
7
8
9

30



!
"
#
$
%
&
'

40
(
)
*
+
,
-
.
/
0
1

50
2
3
4
5
6
7
8
9
:
;

60
<
=
>
?
@
A
B
C
D
E

70
F
G
H
I
J
K
L
M
N
O

80
P
Q
R
S
T
U
V
W
X
Y

90
Z
[
\
]
^
_
`
a
b
с

100
d
e
f
g
h
i
j
k
l
m

110
n
o
p
q
r
s
t
u
v
w

120
x
y
z
{
|
}
~

І
і

130











140
є
ј
»
ї







150











160

ѕ

ё
¤
Ґ
¦
§
Ё
©

170
Є
«
¬
­
®
Ї
°
±
І
і

180
ґ
µ

·
ё

є
»

µ

190

Ї
А
Б
В
Г
Д
Е
Ж
З

200
И
Й
К
Л
М
Н
О
П
Р
С

210
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы

220
Ь
Э
Ю
Я
а
б
в
г
д
е

230
ж
з
и
й
к
л
м
н
о
п

240
р
с
т
у
ф
х
ц
ч
ш
щ

250
ъ
ы
ь
э
ю
я





Символами называются буквы, цифры и другие знаки, имеющиеся на клавиатуре. Символ, непосредственно используемый в программе, называется символьной константой и заключается в одинарные кавычки (апострофы). Например: c:=’A’;. Для хранения одного символа в памяти используется символьная переменная, объявляемая в разделе VAR так: c:char; . С клавиатуры один символ можно вводить с помощью readln (readln(c);), а при подключении библиотеки CRT - с помощью readkey (c:=readkey;).
Кроме символов, вводимых с клавиатуры, имеются псевдографические символы, например, градус °’, символ авторского права ©’, знак Евро
· и т.п. Их нет на клавишах, но можно получить программно, по их коду, поставив перед ним знак #. Например, #153 соответствует символу ™’. Коды символов можно посмотреть в таблице.

Клавиша
Код 1
Код 2

ENTER
13


BackSpace
8


Пробел
32


TAB
9


ESC
27


INSERT
0
82

DELETE
0
83

F1
0
59

F2
0
60





F10
0
68

Стрелка вправо
0
75

Стрелка влево
0
77

Стрелка вверх
0
72

Стрелка вниз
0
80

Home
0
71

End
0
79

Page Up
0
73

Page Down
0
81











Пустые клетки этой таблицы показывают служебные символы, не имеющие печатного варианта. При вводе символов с клавиатуры служебные клавиши дают коды, указанные в следующей таблице (некоторые клавиши генерируют два символа).

С отдельными символами можно выполнять такие действия:
Находить код символа: k:=ord(c);
Находить символ по его коду: c:=chr(k); ( chr(65) даёт тот же символ, что и #65. К числам проще применять операцию #. Но к переменным или выражениям # неприменима, а только chr ).
Находить следующий по кодовой таблице символ: c1:=succ(c);
Находить предыдущий по кодовой таблице символ: c1:=pred(c);
Переводить строчную букву в заглавную: c1:=upcase(c); (Другие символы оставляет без изменений).
Переводить заглавную букву в строчную: c1:=lowcase(c); (Другие символы эта функция оставляет без изменений).
Символьную переменную можно использовать как счётчик в цикле for. Например:
for c := ’a’ to ’z’ do
Кроме того, по символьной переменной можно сделать проверку с помощью case:

Увы, буквы «ёЁ» будут отнесены к другим символам, так как по кодовой таблице видно, что они не лежат между «Аа» и «Яя».




Ограниченный (интервальный) тип данных

В некоторых задачах использование порядковых типов данных требуется ограничить. Например, для возраста ученика из типа Integer или Byte используется только промежуток от 3 лет (для вундеркинда) до 20 лет (для второгодника). Если мы вместо стандартного типа введём интервал, то Паскаль будет помогать нам следить за его нарушением (выходом за границы интервала).


или




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








Над данными интервального типа можно делать все те же операции, что и над базовым типом, из которого он был создан.

Строки

Кроме отдельных символов в программах используют символьные строки. Символьная строка, находящаяся непосредственно в программе, называется строковой константой и заключается в одинарные кавычки (апострофы). Например: ’Жили у бабуси два весёлых гуся’. Длина строки – не более 255 символов. Строковые переменные для хранения символьных строк описываются так:
var
s:string;
b:string[30];
При первом способе переменной s отводится место для 255 символов. Даже если в переменную s поместили коротенькую строку, всё равно зарезервировано место для 255 символов, из которых б
·льшая часть не используется. Второй способ более экономный. Переменной b отводится место для 30 символов. Если попытаемся в b занести более длинную строку, из неё запишутся первые 30 символов, остальные будут потеряны. Попытка использовать строку длиннее, чем 255 символов приводит к сообщению об ошибке «Переполнение строки».
Строки можно присваивать, вводить с клавиатуры. Например:
fam:=’Петров’;
write(’Введите Ваше имя ’); readln(nam);
Над строковыми переменными и константами можно выполнять такие действия:
Определять длину строки: dl:=length(a);. Имеется в виду не место, отведённое для строки при объявлении, а сколько в ней на самом деле содержится символов.
Склеивать две строки (с помощью знака «+» ). Например, склеив строки a:=’за’; и b:=’мок’;, мы получим c:=a+b; - слово «замок».
Выделять из строки один символ (с помощью квадратных скобок). Например, a:=’Семафор’; c:=a[5]; - получим символ ф’.
Выделять часть строки (копировать подстроку). Например, s:=’Информатика’; s1:=copy(s,3,5); . В переменную s1 из строки s скопируется 5 символов, начиная с 3-го, то есть, слово «форма».
Удалять часть строки: a:=’королева’; delete(a,5,2); . Удалятся 2 символа, начиная с 5-го. Получим в переменной a слово «корова».
Вставлять одну строку внутрь другой: a:=’кус’; b:=’акт’; insert(b,a,2); . Получим в переменной a слово «кактус».
Искать одну строку внутри другой (позицию, начиная с которой подстрока входит в строку): b:=’Я шёл рядом с папой по пути домой’; a:=’дом’; m:=pos(a,b); Хотя слово «дом» есть и в слове «рядом», и в слове «домой», найдено будет только первое вхождение. В переменную m будет занесено число 9. Если функция POS не обнаружила одну строку внутри другой, будет выдан 0. Поэтому в задачах, если нас не интересует, с какой позиции найдена подстрока, а только факт её вхождения, можно проверять так: if pos(a,b)>0 then ...
Если число записано в кавычках, то это не число, а строка, состоящая из символов-цифр. Например, из строки ’Длина удава – 38 попугаев’ можно выделить подстроку 38’, но с ней нельзя будет производить вычислений, пока не превратим её в настоящее число. Сделать это можно так: a:=’38’; val(a,x,k); , где x – числовая переменная для результата, а k – переменная для кода ошибки. Если в текстовой строке число записано правильно, то код ошибки будет равен 0. Если неправильно (например, содержит буквы или другие символы, не используемые в числах, или, к примеру, тип этого числа не совпадает с типом переменной x), то k будет содержать номер первого символа с ошибкой. Для нас важно, что k>0, что легко проверить. Аналогично работают функции x:=strtoint(a); (строку – в целое число) и x:=strtofloat(a); (строку – в дробное число). Они более просты в использовании, но при ошибке, в отличие от val, программа прерывается.
Наоборот, если мы вычислили какое-либо число, то его можно преобразовать в строку, чтобы выполнять с ним строковые операции (например, склейку). Сделать это можно так: x:=3*d+15; str(x,a); s:=’Длина удава ’+a+’ см.’;. Здесь a – строка, полученная из числа x. Некоторое неудобство доставляют дробные (вещественные) числа. Как и при печати эти числа записываются в строку в формате с фиксированной точкой. Чтобы указать другой формат, можно написать так: str(x:5:2,a); . Здесь 5 – точность числа (количество оставляемых значащих цифр. Остальные округляются), а 2 – количество десятичных знаков (после точки). Для этих же целей можно воспользоваться функциями a:=inttostr(x); (целое число – в строку) и a:=floattostr(x); (дробное число – в строку).
С помощью функции uppercase(s); можно преобразовать все строчные буквы в строке s в заглавные (на остальные символы эта функция не действует), а с помощью lowercase(s); - заглавные в строчные.
Строки можно сравнивать с помощью знаков ’>’,’>=’,’<’,’<=’,’=’,’<>’. При этом строки сравниваются посимвольно до первого же несовпадающего символа. Бульшей считается строка, у которой этот несовпадающий символ имеет бульший код (вне зависимости от того, какие символы в этих строках находятся дальше и сколько их).

В качестве примера использования символов и строк рассмотрим такие задачи:
Определить, сколько раз во введённой строке a содержится введённое слово b.







Определить, каких букв во введённой строке больше, русских заглавных или русских маленьких (строчных).


Лаб. 11. Задачи со строками
Во всех задачах со строками, где требуется работать с отдельными словами, считать, что между всеми словами имеется ровно один пробел. Запятую или другой знак, стоящий после слова, считать частью этого слова (переносить или удалять вместе с ним).
Во введённой строке удалить в каждом предложении первое слово, а у второго сделать первую букву заглавной.
Вводится текст. Программа должна определить, используется ли в тексте только русский шрифт, только латинский или смешанный. Небуквенные символы при проверке игнорировать.
«Перекодировать» клавиатуру, т.е., сделать так, чтобы при вводе русского текста показывались не те буквы, которые нажимаются. Ввод заканчивается по «enter». После этого печатается неперекодированная строка.
Зашифровать введенную с клавиатуры строку, поменяв местами первый символ с третьим, второй с четвертым и т. д. Провести дешифровку.
Перевернуть введённое предложение, поменяв слова местами. Например, было «мама мыла раму», стало «раму мыла мама».
Некий человек ввёл текст со старой клавиатуры, на которой некоторые клавиши западают и печатают несколько одинаковых букв подряд. Известно, что в исходном тексте встречались слова, содержащие двойные буквы «с», «н» и «м», как раз те, которые на клавиатуре не западают. Восстановить правильный текст, устранив последствия западания клавиш.
Ввести текст и напечатать его, выделив цветом буквосочетания «жи», «ши», «ча», «ща», в которых допущены «ошыбки».
Вводится текст, содержащий форматные символы: @ - с красной строки; # - выделить жирным; $ - отменить жирный; & - печатать с разрядкой (после каждого символа вставлять пробел); ^ - отменить разрядку. Напечатать текст в соответствии с форматом.
Дан текст и дано слово. Нужно проверить, можно ли из букв текста составить это слово. Буквы из текста запрещается использовать дважды.
Найти самое длинное слово во введённом тексте.
Найти во введённом тексте слова-палиндромы (симметричные слова, вроде «шалаш»).
Найти во введённом тексте слова, встречающиеся 2 и более раза. Указать, сколько раз они встречаются.
Ввести два предложения и проверить, все ли слова первого встречаются во втором.
Вводится текст и два слова. Программа находит в тексте первое слово (сколько бы раз оно не встретилось) и заменяет его вторым.
Ввести два предложения и найти такую (максимально большую) часть первого предложения, которая входит во второе предложение.
Введённый текст распечатать столбиком шириной 20 символов. Если в конце строки слово оказывается разорванным, поставить знак переноса «-» (не обращая внимания на правила переноса). Если же с концом строки заканчивается и очередное слово (в том числе и на 1-3 символа раньше конца строки), то новое слово начать печатать с новой строки, пропустив пробел.
Во введённом тексте найти все слова, начинающиеся с заглавной буквы и содержащие не менее 2-х гласных букв.
Ввести текст и длину строки. За счёт добавления пробелов между словами довести длину текста до заданной. Если длина текста больше, разделить текст на строки нужной длины, чтобы в каждой строке были только целые слова, а затем каждую такую строку подровнять с помощью пробелов до заданной длины.
Программа вводит текст и номер слова, а затем удаляет в тексте слово с таким номером, либо сообщает, что слова с таким номером нет в тексте.
Во введённом тексте обменять местами первое и последнее предложения.

Массивы

Большинство программ работают не с одним числом, а с несколькими числами. Например, программа бухгалтерского учёта хранит и обрабатывает информацию о зарплате многих работников. Леталка-стрелялка помнит координаты многих врагов, пуль и т.д. Простая переменная для этого не годится. Нужна такая переменная, которая одна хранит несколько чисел. Для этого используется индексированная переменная или массив. (В массиве можно хранить не только числа. Классный журнал – массив строк. Изображения всех противников в игре – массив картинок. )
Чтобы получить одно из нескольких чисел, хранящихся в массиве, после имени переменной указывается индекс – номер этого числа в квадратных скобках. Например, a[5].
Если нужно одинаковым образом обработать несколько чисел в массиве, в качестве индекса берётся переменная-счётчик, которая меняется в цикле, пробегая по очереди все числа в массиве. Например, в задаче требуется сложить все числа, кратные 3, из массива a, содержащего 20 целых чисел.




В разделе VAR массив объявляется с помощью слова array, после которого в квадратных скобках указывают пределы, в которых изменяется индекс. Например, описание a:array[1..20] of integer; говорит о том, что в массиве 20 чисел, нумерация начинается с 1, и все числа – целые. Нумеровать не обязательно с единицы. Возможны и другие описания:
Нарушать указанные в описании пределы нельзя. В приведенном примере попытка использовать элемент массива b[6] или b[-1] приведёт к ошибке.

Каким образом занести исходные данные в массив? Приведём несколько способов:

1. Заполнение массива с клавиатуры:







2. Заполнение массива случайными числами. Например, заполним массив a двадцатью случайными числами в пределах от 10 до 40:






3. Заполнение массива по формулам. Например, занесём координаты двадцати точек окружности в массивы X и Y.






4. А если программисту заранее известны конкретные числа, которые нужно занести в массив? Простой, но скучный способ – занести присваиванием: Вместо этого можно воспользоваться констант-массивом. Он объявляется не в разделе VAR, а в разделе CONST и заполняется числами в момент объявления: Хотя этот массив и объявлен в разделе констант, но, так как его тип указан явным образом, то это – типизованный констант-массив, который можно изменять, как и обычный массив.

5. Если один массив уже заполнен числами, и его нужно скопировать без изменений в другой массив (описанный точно так же), то это можно выполнить простым присваиванием: b:=a;. Например, это может понадобиться, если массив a будет изменяться, но позже понадобится снова с прежними числами. Для этого сначала сделаем резервную копию, а после того, как поработали с массивом, восстановим его из копии тоже присваиванием a:=b;.

Решение задач с массивами
Заполнить массив двадцатью случайными числами в пределах от 1 до 99, распечатать их в одну строку, а на следующей строке распечатать тот же массив в обратном порядке, выделив цветом числа, кратные трём.

















Следующая программа вводит с клавиатуры десять чисел, располагает их в одну строку и печатает на следующей строке, каких чисел больше, чётных или нечётных, и на сколько.
Перед циклом проверки и распечатки переменные kc и kn (количество чётных и количество нечётных) обнулим. Чётным элемент массива является в том случае, если делится на два без остатка, то есть, остаток (mod) при делении на 2 равен 0. В этом случае мы увеличиваем (inc) счётчик чётных чисел на 1. Если это не так, увеличиваем на 1 счётчик нечётных чисел.























Два массива заполнены двадцатью случайными числами в пределах от 1 до 5. Программа заполняет третий массив элементами, совпадающими в первых двух массивах, а на месте остальных ставит нули.















В этой программе при распечатке массивов мы не использовали, как раньше, пробел для разделения чисел, а указали после двоеточия, сколько знаков предоставить для числа. Это удобно, когда массивы располагаются на нескольких строках: числа будут столбиком друг под другом.

Поиск минимального (максимального) элемента массива
Чтобы найти максимальный элемент массива, заводим переменную max, в которую помещаем сначала первый элемент. Каждый следующий сравниваем с max, и если он больше, то его запоминаем в max вместо хранящегося там числа. После просмотра всех элементов в max остаётся наибольшее число.













Минимальный элемент находят так же, только ищут число, меньшее, чем min.

Иногда кроме самого значения максимального элемента нужно найти и место, где он располагается. Для этого в цикле поиска, найдя число большее, чем было найдено раньше, нужно запомнить не только его само, но и его номер, как показано в следующем фрагменте:








Сортировка массива.
Существует много способов сортировки массива по возрастанию. Самый понятный и простой (но далеко не самый быстрый!) – сортировка обменом. Суть его в следующем: Программа ищет наименьший элемент и обменивает его с первым. Затем ищет наименьший из оставшихся и обменивает со вторым Для обмена мы пользуемся тем, что, кроме массива, наименьшее число находится ещё в переменной min, поэтому на его место в массиве мы копируем число из начальных элементов массива, а туда копируем число из переменной min.






















Второй по простоте (и тоже медленный) способ – сортировка методом пузырька. Суть её в том, что при первом проходе каждый элемент сравнивается со следующим, и если порядок неправильный, они обмениваются. Для обмена используется переменная b, в которой временно сохраняется число. После первого прохода наибольший элемент уже на своём месте (в конце массива), поэтому второй проход делается до предпоследнего элемента, и т.д. В приведенном фрагменте программы, сортирующем массив a по возрастанию методом пузырька, первый цикл считает проходы, а его счётчик i указывает, до какого элемента делать проверку (поэтому i уменьшается).







Двумерные и многомерные массивы
Иногда данные имеют табличный вид. Можно, конечно, расположить их подряд (строка за строкой) в обычном (он называется одномерным или линейным) массиве, но будет неудобно обращаться к таким элементам: их номер придётся высчитывать с помощью формулы N=(НомерСтроки-1)*ДлинуСтроки+Номер Столбца. Это (кроме неудобства) ещё и замедлит работу с массивом. Вместо этого можно использовать двумерный массив (массив из одномерных массивов). Фактически в памяти элементы массива тоже расположены подряд, но поиск элемента массива берёт на себя сам Паскаль, а мы ему указываем два индекса: номер строки и номер столбца. Например: a[5,4]. При описании такого массива указывают два диапазона – для каждого индекса:
a:array[1..20,1..10] of integer;. (Примечание: Для Паскаля несущественно, что мы указываем первым - строку или столбец. Просто в первом случае в памяти элементы массива укладываются подряд, построчно, строка за строкой, а во втором «постолбцово», столбец за столбцом)
В качестве примера приведём программу, которая заполняет двумерный массив таблицей умножения и распечатывает его:











Иногда набор данных представляет собой несколько таблиц одинаковой размерности. Тогда требуется третий индекс, чтобы задать номер таблицы. В таких случаях используются трёхмерные массивы (массив из двумерных массивов). Пример трёхмерного массива – классный журнал. Первый индекс – номер предмета, второй – номер ученика и третий – номер урока. А содержимое такого массива – оценки учеников. Описание и использование трёхмерных массивов – аналогично двумерным.
Точно так же существуют четырёхмерные (стопка журналов), пятимерные (несколько стопок на полке), шестимерные (несколько полок в шкафу) и т.д. массивы. Паскаль позволяет использовать до 255 индексов, хотя это никому не нужно: 10-мерного массива достаточно, чтобы охватить оценки всех учеников во Вселенной. В реальности чаще всего обходятся 1–3-мерными массивами.

Лаб. 12. Задачи с одномерными массивами
Заполнить массив 20-ю случайными числами в пределах от 1 до 100, так чтобы ни один элемент не делился на предыдущий и чтобы подряд не шли одинаковые числа. Найти сумму всех элементов.
Ввести с клавиатуры 10 чисел, не допуская ввода чисел, кратных трём. Определить, что больше: сумма чисел с чётными номерами или с нечётными.
Заполнить массив 20-ю случайными числами в пределах от 10 до 50, так чтобы все числа были разными. Найти самое большое число.
Занести в массив 20 чисел, начиная от 4, в порядке возрастания, так чтобы среди них не было простых чисел.
Ввести с клавиатуры 10 чисел, не допуская ввода числа, равного предыдущему. Найти минимальное и максимальное. Если они повторяются, определить, какое из них повторяется больше раз.
Заполнить массив 20-ю случайными числами в пределах от 1 до 30, так чтобы все числа были разными. Найти все числа из заданного промежутка, которые не вошли в этот массив.
Массив заполнен 20-ю случайными числами в пределах от 1 до 10. Оставить в нём только неповторяющиеся числа в том порядке, в каком они встречаются в первый раз. Остальные места заполнить нулями.
Заполнить массив 20-ю случайными числами в пределах от 1 до 50, так чтобы ни один элемент не был кратным трём. Любое число должно отличаться от полусуммы его соседей слева и справа.
Ввести с клавиатуры 10 чисел, не допуская ввода числа, равного среднего арифметического ранее введённых (или его целой части).
В массиве, заполненном 20-ю случайными нечётными двузначными числами, найти все числа, сумма цифр которых больше 10 и вычислить их сумму.
Заполнить массив 20-ю случайными чётными числами в пределах от 10 до 99, у которых вторая цифра больше первой. Найти среднее арифметическое всех элементов массива.
Дан массив из случайных чисел. Нужно переписать элементы, большие среднего арифметического, в начало, а остальные - в конец массива. Выполнить с использованием второго вспомогательного массива.
В одном массиве – рост 20-ти человек, в другом – их вес. Найти номер самого стройного (отношение роста к весу – максимальное).
Каждый элемент массива на единицу больше, чем квадратный корень из предыдущего. Первый = 1. Найти сумму всех элементов такого массива из 10 чисел.
В массиве, заполненном 20-ю случайными чётными числами в пределах от 1 до 30, найти все числа, вторая цифра которых больше первой и вычислить сумму всех чётных из них.
Ввести с клавиатуры 12 чисел, допуская только ввод чисел, не больших 20. Найти сумму тех из них, которые встречаются в массиве только один раз.
Массив заполнен 20-ю случайными числами в пределах от 0 до 50. Сколько в нём содержится различных чисел?
В массиве, заполненном 20-ю случайными числами в пределах от 1 до 100, найти количество пар рядом стоящих чисел, кратных друг другу.
Заполнить с клавиатуры массив из 10 чисел и найти общий делитель для всех чисел (или сообщить о его отсутствии).
Массив содержит 20 случайных чисел в пределах от 1 до 10. Найти в нём самую длинную последовательность одинаковых чисел.

Лаб. 13. Задачи с двумерными массивами
Заполнить массив [10,10] случайными двузначными числами и напечатать его в табличном виде, выделив цветом чётные числа, стоящие в нечётных строках.
Заполнить массив [10,10] случайными двузначными числами, распечатать в табличном виде, а затем транспонировать (строки сделать столбцами, а столбцы строками) и распечатать рядом с первым массивом.
Заполнить массив [10,10] случайными двузначными числами, напечатать в табличном виде. Заменить все совпадающие числа нулями и напечатать рядом с предыдущим массивом.
Заполнить массив [5,5] случайными неповторяющимися двузначными числами.
Заполнить массив [10,10] случайными двузначными числами. В конце каждой строки напечатать сумму элементов этой строки.
Заполнить массив [10,10] случайными числами в пределах от 1 до 99. В конце каждой строки напечатать количество чётных элементов в этой строке.
Заполнить массив [10,10] случайными двузначными числами так, чтобы каждая строка была неубывающей последовательностью. В конце каждой строки напечатать среднее арифметическое значение элементов этой строки.
Массив [10,10] заполнен числами таким способом. В первой строке стоит единица и 9 нулей. Каждая следующая строка начинается с 1, а остальные её элементы равны сумме двух элементов из предыдущей строки: с таким же номером и предыдущего. Напечатать этот массив в виде таблицы.
В первой строке массива [10,10] находятся случайные двузначные числа. В каждой следующей строке находятся эти же числа, переставленные в случайном порядке.
В трёх первых столбцах массива [10,10] находятся случайные двузначные числа. Все остальные элементы массива представляют собой сумму трёх чисел: из 1-го, 2-го и 3-го столбцов со случайными номерами.
Массив [10,10] заполнен случайными двузначными числами. Найти среднее арифметическое элементов главной диагонали и заменить нулями все остальные элементы массива, которые меньше этого среднего.
Массив [10,10] заполнен таблицей умножения от 1 до 10. Напечатать его, выделив другим цветом элементы, являющиеся целым квадратом числа. Найти сумму всех элементов массива и напечатать отдельно после массива.
Массив [10,10] заполнить случайными числами и распечатать. Сдвинуть массив вправо на N столбцов (последние N столбцов становятся первыми, а остальные перемещаются вправо). Распечатать получившийся массив рядом с исходным.
Ввести числа X и Y (
·10) и заполнить массив [10,10] целыми числами так, чтобы элемент с координатами [x,y] был равен 1, все его ближайшие соседи – 2 и т.д., то есть, чем дальше число от этого элемента, тем оно больше.
Массив [11,11] заполнить случайными числами и распечатать в виде таблицы квадратной формы. После нажатия любой клавиши занести в массив нули так, чтобы они образовали окружность максимального радиуса.
Массив [10,10] заполнить нулями и единицами так, чтобы они располагались в шахматном порядке (в левом верхнем углу – единица) и распечатать в виде таблицы. После нажатия любой клавиши заполнить все ненулевые элементы случайными числами и распечатать вместо исходного массива.
Массив [10,10] заполнен случайными числами. После нажатия клавиши изменить расположение чисел так, чтобы чётные числа были сгруппированы в левой части массива, а нечётные – в правой. Новый массив показать рядом со старым.
Заполнить массив [9,9] возрастающей подряд (от 0) последовательностью чисел так, чтобы числа шли по прямоугольной спирали, разворачивающейся из центра против часовой стрелки.
Массив [10,10] заполнить возрастающей подряд (от 0) последовательностью чисел так, чтобы числа располагались зигзагом: в первой строке слева направо, во второй – справа налево и т.д
Заполнить массив [10,10] случайными двузначными числами, напечатать в табличном виде. В строке, содержащей минимальное число, найти максимальное число. Напечатать его координаты.

Множества

Множество - это набор однотипных логически связанных друг с другом объектов. Порядок следования элементов в множестве безразличен. Количество элементов, входящих в множество, может в Паскале меняться в пределах от 0 (пустое множество) до 255. Паскаль позволяет программно менять состав множества, включая в него и исключая из него элементы. Именно непостоянством количества своих элементов множество отличается от массива. При включении во множество уже имеющегося там элемента, множество не изменяется (то есть, каждый элемент может входить во множество только один раз). У элементов множества нет индексов, поэтому выражение «пятый элемент множества» не имеет смысла.
Два множества считаются эквивалентными тогда и только тогда, когда все их элементы одинаковы. Если все элементы одного множества входят в другое, говорят о включении первого множества во второе. Пустое множество включается в любое другое.
Константное множество заключается в квадратные скобки. Например, множество [5,3,7]. В качестве элементов множества могут использоваться данные любого порядкового типа с количеством значений не более 256 (т.е., Word, Integer, Longint не могут быть базовыми типами для множества).
Переменная, содержащая множество объявляется в разделе VAR с помощью описателя Set Of, после которого указывается базовый тип. Например:










Над множествами можно выполнять такие действия:
Присваивать переменной-множеству константное множество: m:=[1,2,5]; Если в правой части присваивания содержатся элементы, не входящие в базовый тип переменной (но удовлетворяющие требованиям к элементам множества), сообщения об ошибке не будет, они просто будут проигнорированы.
Включать в множество новый элемент: Include(m,15); Элемент, не входящий в базовый тип, включён в множество не будет.
Исключать из множества отдельный элемент: Exclude(m,15); Если исключаемого элемента в множестве и так нет, ошибки не будет.
Находить объединение двух множеств: m3:=m1+m2; (Множество m3 содержит все элементы множеств m1 и m2)
Находить пересечение двух множеств: m3:=m1*m2; (Множество m3 содержит все элементы, входящие одновременно в множества m1 и m2)
Разность множеств m3:=m1-m2; (Результат содержит элементы из первого множества, которые не принадлежат второму)
Проверка эквивалентности; m1=m2 возвращает TRUE, если оба множества эквивалентны;
Проверка неэквивалентности; m1<>m2 возвращает TRUE, если оба множества неэквивалентны;
Проверка вхождения; m1<=m2 возвращает TRUE, если первое множество включено во второе;
Проверка вхождения; m1>=m2 возвращает TRUE, если второе множество включено в первое;
Проверка принадлежности; a IN b В этой операции первый элемент - выражение, а второй - множество одного и того же типа. Проверка возвращает TRUE , если выражение a имеет значение, принадлежащее множеству b.



Файлы данных

Вся информация, содержащаяся в переменных и массивах, исчезает по окончании работы программы. Если она может понадобиться в дальнейшем, то эту информацию сохраняют на жёстком диске, дискете или другом носителе, а при следующем запуске программы обратно загружают с внешнего носителя в массивы или переменные. Такая запись на диске или другом носителе называется файлом данных. Кроме файлов данных существуют также исполняемые файлы (программы в машинных кодах с расширением .exe или .com). Некоторые языки и системы программирования (в том числе из диалектов Паскаля – Borland Pascal и Delphi) позволяют из собственной программы запустить такой файл. Pascal ABC такой возможностью не располагает.
Файлы объединены в группы (каталоги или папки). Чтобы определить, с каким файлом предстоит работать, указывают его полное имя. Оно состоит из нескольких частей, например:



Тот каталог, в котором находится наша программа, является рабочим (текущим) каталогом. Это обозначает, что при обращении к файлу данных, находящемуся в таком каталоге, указывать путь не обязательно.
Для использования файла данных в программе нужно в разделе VAR описать файловую переменную (ф/п), в которой будет храниться информация об этом файле (полное имя, длина, дата и время создания и т.д.). Это описание различно для разных типов файлов. Например:






В файлах, описанных как типовые, все данные имеют один и тот же тип (указанный при описании), так же как и в массивах. Поэтому в таких файлах обычно сохраняют содержимое массивов. Хранить в типовом файле текст неудобно, так как все строки должны быть одинаковой длины. Для хранения текста со строками различной длины используется текстовый файл. Для отделения одной строки от другой, в таком файле каждая строка заканчивается символом, соответствующим клавише ENTER. Кроме строк в текстовом файле можно хранить и числа (но это менее экономно, чем в типовом файле, где они хранятся в двоичном коде, а не посимвольно).
Чтобы занести в файловую переменную имя файла, используется команда
assign(ф/п , ’полное имя файла’);
В этой команде можно не указывать путь для файла, находящегося в рабочем каталоге (там же, где и сама программа).
Чтобы в файловую переменную попала вся остальная информация о файле, его нужно открыть с помощью одной из следующих команд:
reset(ф/п); - открывает уже существующий файл и устанавливает указатель на его начало (обычно так открывают файл для чтения, но в типовый файл можно и записывать. Запись происходит вместо имеющихся в файле данных).
append(ф/п); - открывает уже существующий файл и устанавливает указатель на его конец (для добавления информации после конца файла).
rewrite(ф/п); - создаёт новый файл (если файл уже существует, он очищается).
Указатель файла хранит место в файле, откуда мы можем прочесть (или куда записать) информацию. Каждая операция чтения или записи перемещает указатель к следующей записи.
Чтобы прочесть информацию из файла, поместив её в переменную, используются команды:
read(ф/п , список переменных); - читает из типового и текстового файла.
readln(ф/п , список переменных); - читает из текстового файла.
Если из текстового файла читаются не отдельные слова или числа, а вся строка, то используется только одна строковая переменная.
Чтобы сохранить информацию в файл из одной или нескольких переменных, используются команды:
write(ф/п , список переменных); - записывает в типовый и текстовый файл.
writeln(ф/п , список переменных); - записывает в текстовый файл с переводом строки.

Для перемещения по файлу (только типовому!) используется команда seek(ф/п, номер записи); . Нумерация записей в файле ведётся с нуля. Чтобы попасть в конец файла для добавления новой записи, в качестве номера в этой команде используется функция filesize(ф/п), определяющая размер файла (не в байтах, а в записях данного типа).
При чтении из файла неизвестной длины, можно перед чтением проверять, не кончился ли ещё файл, с помощью функции eof(ф/п), которая даёт true, если указатель находится после последней записи. Например:








По окончании работы с файлом его нужно закрыть командой close(ф/п); . Если не сделать этого, Pascal не сохранит изменения файла на диске. Но и если не было изменений, закрыть файл рекомендуется. После этого файловая переменная и файловые буферы (область памяти, которую Pascal использует при работе с памятью) освобождаются.
Команда rename(ф/п,’новое_имя’)переименовывает файл, связанный с файловой переменной. Файл должен быть закрыт.
Команда erase(ф/п)удаляет файл, связанный с файловой переменной. Файл должен быть закрыт.
Не всегда файловые операции проходят успешно. Например, при попытке прочесть с дискеты, которую забыли вставить в дисковод, появляется сообщение об ошибке, и происходит аварийное завершение программы. Подобные ошибки лучше предупредить. Функция FileExists(’имя’) возвращает True, если на диске имеется файл с данным именем (и путём), в противном случае возвращает False. Её нужно использовать перед попыткой обращения к уже существующему файлу. Если нужно создать новый файл, перед этим используется функция CanCreateFile(’имя’). Если имя файла или путь указаны неправильно, или на диске нет места, или по другим причинам невозможно создать файл с таким именем, она возвращает False.

Записи и базы данных

В массиве могут содержаться данные только одного и того же типа, например, все целые числа. Однако иногда существует необходимость держать в переменной несколько данных разного типа. Например, в переменной «человек» держать фамилию, имя, рост, возраст, фотографию и т.д Но даже если все данные одного типа, они могут иметь разный смысл, по-разному обрабатываться. Например, рост, возраст, количество детей, зарплата Хранение их в одном массиве под разными номерами не даёт преимуществ перед хранением в отдельных переменных. Приходится помнить, какой номер какому данному соответствует.
Для хранения таких разнородных данных об одном объекте существует специальный вид переменных – запись. Части записи называются полями. Каждое поле имеет имя и содержимое. Например, поле с именем Name имеет содержимое ’Иван’. Имя всей записи от имени отдельного поля отделяется точкой. Например, Man.Name:=’Иван’;.
В разделе var запись можно объявить так:






Однако, это не единственный (и не лучший) способ. Если таких записей в программе несколько, более удобен следующий способ. В разделе type (раньше раздела var) создаётся шаблон (образец) для нужной записи. Затем в разделе var этот шаблон используется как новый тип для объявления переменных:










В предпоследней строчке примера показано объявление массива записей. Такую структуру данных принято называть базой данных (БД). (Но надо помнить, что понятие современной БД гораздо шире, чем просто массив из записей). Можно представить такой массив как таблицу, каждая строка которой – одна запись, а каждый столбец – одно поле:

N
Name
Vozrast
Rost
Ves

1
Александров А.Б.
16
172
53

2
Борисов В. Г.
15
173
54

3
Васильев Д. Е.
16
174
55

4
Григорьев Ж. З.
14
175
56


Для использования одного данного из БД применяются и квадратные скобки (для указания конкретной записи в массиве) и точка (для указания имени поля). Например:
kl8a[1].name:=’Александров’;
Иногда приходится выполнять подряд множество действий с одной и той же записью. Чтобы не указывать каждый раз имя записи и имя поля, можно воспользоваться оператором принадлежности к записи with:









Запись может иметь вариантную часть. Это означает, что одно и то же поле можно объявить одновременно несколькими способами, а непосредственный выбор будет определяться специальным ("сигнальным") значением (селектором) с помощью оператора case. Различают два вида селекторов:
1. безымянный селектор. В качестве селектора указывают его тип, например, integer. Может быть использован любой перечислимый тип (boolean, byte, char, ) лишь бы количество его значений было не меньше, чем количество вариантов поля. В качестве примера записи с безымянным селектором рассмотрим запись, содержащую название устройства и его числовую характеристику мощность. При этом мощность будет рассматриваться либо как дробное число, либо как два целых, одно из которых хранит целую часть мощности, а другое – дробную:







2. селектор-поле. В качестве селектора используется одно из полей записи (перечислимого типа). Оно является полноценным полем, в нём можно хранить информацию. Но, в то же время, оно определяет, какой из случаев вариантной части будет использоваться. Сам программист тоже может анализировать поле-селектор, чтобы определить, как именно в данном случае нужно использовать вариантное поле.















При работе с БД удобно накопленную информацию сохранять в файле. Если использовать текстовый файл, каждое поле нужно будет сохранять отдельно. Более оправдано применение типового файла, так как это позволяет сохранять всю запись как одно целое. Посмотрим, как это делается, на примере:
Написать программу «Справочник рыболова». Она использует базу данных «рыбы» и может дополнять её и искать нужную рыбу. По окончании работы вся накопленная информация сохраняется в файле «рыбы.db» в текущем каталоге. При запуске программы файл базы данных (если он уже создан) загружается в массив, и введённую в прошлом сеансе информацию можно использовать.



















































































Библиотека GraphABC

В системе программирования PascalABC кроме текстового окна можно использовать графическое окно, в котором можно рисовать. Рисунок состоит из пикселов – маленьких одноцветных квадратиков («точек»).
Действия с графическим окном:

1. ClearWindow; - очищает графическое окно белым цветом;
2. ClearWindow(c); - очищает графическое окно цветом c;
3. FillWindow(n); - заполняет окно рисунком с описателем n;
3. SetWindowSize(w,h); - задаёт размеры графического окна;
4. SetWindowPos(l,t); - задаёт отступ графического окна от левого верхнего угла экрана;
5. SetWindowCaption(s); - задаёт заголовок окна;
6. CloseWindow; - закрывает графическое окно;
7. ScreenWidth - возвращает ширину экрана;
8. ScreenHeight: - возвращает высоту экрана;
9. CenterWindow; - центрирует графическое окно на экране;
10. MaximizeWindow; - разворачивает графическое окно на весь экран, оставляя видимой лишь панель задач;
11. NormalizeWindow – восстанавливает размер графического окна.
Точечная графика

Рисовать отдельными точками, конечно, неудобно. Но, если применять цикл, в котором координаты и цвета точек рассчитываются по каким-либо формулам, можно получить графики функций и другие красивые рисунки.
Поставить в окне один пиксел цвета c можно командой SetPixel(x,y,c); Функция GetPixel(x,y) позволяет узнать цвет пиксела с координатами (x,y).
Библиотека GraphABC использует 24-битную цветовую палитру. Цвета имеют числовые значения от 0 (чёрный) до 16 777 215 (белый). Любой оттенок цвета можно вычислить по его красной (r), зелёной (g) и синей (b) составляющим с помощью функции RGB(r,g,b);, где r, g и b принимают значения от 0 до 255. 0 соответствует минимальной яркости, 255 – максимальной.
Библиотека GraphABC имеет константы для обозначения стандартных цветов: clBlack – черный; clPurple – фиолетовый; clWhite – белый; clMaroon – темно-красный; clRed – красный; clNavy – темно-синий; clGreen – зеленый; clBrown – коричневый; clBlue – синий; clSkyBlue – голубой; clYellow – желтый; clCream – кремовый; clAqua – бирюзовый; clOlive – оливковый; clFuchsia – сиреневый; clTeal – сине-зеленый; clGray – темно-серый; clLime – ярко-зеленый; clMoneyGreen – цвет зеленых денег; clLtGray – светло-серый; clDkGray – темно-серый; clMedGray – серый; clSilver – серебряный.


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















Графические примитивы

Более удобным способом является рисование не отдельными точками, а отрезками, дугами и замкнутыми фигурами. В таких командах цвет линии и заливки не указывают для каждой фигуры, а задают заранее.
Линия определяется характеристиками пера:
SetPenColor(c); - задаёт цвет пера;
SetPenWidth(w); - задаёт толщину пера в пикселах;
SetPenStyle(s); - задаёт стиль пера.
Стили пера задаются следующими константами: psSolid – сплошная линия; psClear -  прозрачная линия; psDash -  штриховая линия (- - - - - ); psDot -  пунктирная линия (······); psDashDot - штрихпунктир (
··
··
··
··); psDashDotDot-  штрих и двойной пунктир (
···
···
···
···);

Заливка определяется характеристиками кисти:
SetbrushColor(c); - задаёт цвет кисти;
SetBrushPicture(fname); - загружает из графического файла рисунок - образец для заливки;
ClearBrushPicture; - отключает рисунок-образец;
SetBrushStyle(s); - задаёт стиль заливки:











После настройки пера и кисти можно рисовать, используя такие команды: (все параметры – целые числа)
1. Line(x1,y1,x2,y2); - рисует отрезок с началом в точке (x1,y1) и концом в точке (x2,y2);
2. MoveTo(x,y); - передвигает невидимое перо к точке с координатами (x,y); Эта функция работает в паре с функцией LineTo(x,y)., которая рисует отрезок от текущего положения пера до точки (x,y); координаты пера при этом также становятся равными (x,y).
3. Circle(x,y,r); - рисует окружность с центром в точке (x,y) и радиусом r.
4. Ellipse(x1,y1,x2,y2); - рисует эллипс, заданный описанным вокруг него прямоугольником с координатами противоположных вершин (x1,y1) и (x2,y2).
5. Rectangle(x1,y1,x2,y2); - рисует прямоугольник, заданный координатами противоположных вершин (x1,y1) и (x2,y2).



6. RoundRect(x1,y1,x2,y2,w,h); - рисует прямоугольник со скругленными углами; (x1,y1) и (x2,y2) задают пару противоположных вершин, а w и h – ширину и высоту эллипса, используемого для скругления углов.
6. Arc(x,y,r,a1,a2); - рисует дугу окружности с центром в точке (x,y) и радиусом r, заключенной между двумя лучами, образующими углы a1 и a2 с осью OX (a1 и a2 – вещественные, задаются в градусах и отсчитываются против часовой стрелки).
7. Pie(x,y,r,a1,a2); - рисует сектор окружности, ограниченный дугой (параметры процедуры имеют тот же смысл, что и в процедуре Arc).
8. Chord(x,y,r,a1,a2); - рисует фигуру, ограниченную дугой окружности и отрезком, соединяющим ее концы (параметры процедуры имеют тот же смысл, что и в процедуре Arc).
9. FillRect(x1,y1,x2,y2); - заливает прямоугольник, заданный координатами противоположных вершин (x1,y1) и (x2,y2), цветом текущей кисти.
10. Polygon(a,n); - строит ломаную по n точкам, координаты которых заданы в массиве a элементов типа Point.
11. Polyline(a,n); - строит замкнутую ломаную по n точкам, координаты которых заданы в массиве a элементов типа Point.

Замкнутые фигуры заливаются цветом кисти. Можно также нарисовать замкнутую область отрезками, дугами и другими примитивами и залить внутреннюю область цветом c, начиная с точки (x,y), с помощью команды FloodFill(x,y,c);

Текст в графическом окне

В графическое окно можно выводить и текст. Команда TextOut(x,y,s) выводит строку s в позицию (x,y) (точка (x,y) задает верхний левый угол прямоугольника, который будет содержать текст из строки s). Если нужно вывести число, его предварительно превращают в строку с помощью str, inttostr или floattostr.

Перед выводом текста нужно настроить шрифт:

1. SetFontColor(color); - устанавливает цвет шрифта.
2. SetFontSize(sz); - устанавливает размер шрифта в пунктах
3. SetFontName(name); - устанавливает наименование шрифта. По умолчанию установлен шрифт, имеющий наименование MS Sans Serif. Наиболее распространенные шрифты – это Times, Arial и Courier New (наименование шрифта можно набирать без учета регистра).
4. SetFontStyle(fs); - устанавливает стиль шрифта. Стили шрифта задаются следующими именованными константами: fsNormal – обычный; fsBold – жирный; fsItalic – наклонный; fsBoldItalic – жирный наклонный; fsUnderline – подчеркнутый; fsBoldUnderline – жирный подчеркнутый; fsItalicUnderline – наклонный подчеркнутый; fsBoldItalicUnderline – жирный наклонный подчеркнутый.
5. Функции TextWidth(s); и TextHeight(s); возвращают ширину и высоту строки s в пикселях при текущих настройках шрифта. Это может понадобиться, например, чтобы подогнать размеры текста к рисунку (или наоборот).

Использование готовых точечных рисунков

При разработке профессиональных (особенно игровых) программ более реалистичная графика получается, если не программировать рисунки графическими примитивами, а подгружать из файлов готовые, созданные в графических редакторах в формате «.bmp», «.jpg» или «.gif».
Для загрузки изображения из файла используется функция LoadPicture(’имя файла’); Она возвращает адрес в памяти, куда загружается этот рисунок. Для хранения этого адреса используется переменная-описатель целого типа. Например:

dom:= LoadPicture(’domik.bmp’);

Функции PictureWidth(n) и PictureHeight(n) возвращают ширину и высоту рисунка с описателем n.
Функция CreatePicture (w,h)создаёт в памяти пустой рисунок размеров w,h и возвращает его адрес в описатель. Чтобы при создании рисунка сразу скопировать в него часть графического окна, нужно создавать его командой CreatePictureFromRect(RectF(x1,y1,x2,y2)), в которой заданы координаты двух диагонально противоположных углов прямоугольного участка окна. (Для использования Rectf нужно подключить библиотеку PointRect)


Команда DestroyPicture(n); удаляет рисунок с описателем n из оперативной памяти, описатель рисунка при этом становится недействительным.
Изменить размеры рисунка можно командой SetPictureSize(n,w,h).
Прямоугольный участок из одного рисунка в другой можно скопировать командой CopyRect(kuda,RectF(x1,y1,x2,y2), otkuda,RectF(x3,y3,x4,y4)); . Если при этом конечные размеры не совпадают с исходными, то происходит масштабирование рисунка.
Вывести рисунок из переменной в графическое окно можно командой DrawPicture несколькими способами:
а) DrawPicture(n,x,y); - выводит рисунок с описателем n в позицию (x,y) графического окна.
б) DrawPicture(n,x,y,w,h); - выводит рисунок с описателем n в позицию (x,y), масштабируя его размеры к ширине w и высоте h. Если w<0, то рисунок зеркально отражается относительно вертикальной прямой, проходящей через x, если же h<0, то рисунок зеркально отражается относительно горизонтальной прямой, проходящей через y.
в) DrawPicture(n,x,y, RectF(x1,y1,x2,y2)); - выводит часть рисунка с описателем n, заключенную в прямоугольнике (x1,y1,x2,y2), в позицию (x,y) графического окна.
г) DrawPicture(n,x,y,w,h, RectF(x1,y1,x2,y2)); - выводит часть рисунка, масштабируя его размеры.
Команда SetPictureTransparent(n,b); устанавливает (b=True) или отключает (b=False) режим прозрачности при рисовании рисунка с описателем n. Если b=True и рисунок имеет  белый фон, то при его рисовании фон не отображается.
Команда SavePicture(n,fname); сохраняет рисунок с описателем n в файл с именем fname. Рисунки можно сохранять в формате .bmp, .jpg или .gif .
Команды FlipPictureHorizontal(n); и FlipPictureVertical(n); позволяют зеркально отображать рисунок с описателем n горизонтально и вертикально.
Очень полезная функция ImageIntersect(n1,n2) типа boolean определяет, пересекаются ли изображения на рисунках с описателями n1 и n2. Рисунки должны иметь одинаковый размер. Белый цвет на рисунке считается прозрачным. Изображения на рисунках считаются пересекающимися, если имеется хотя бы один пиксел, который не прозрачен и имеет одни и те же координаты для обоих рисунков.

При создании анимации требуется поочерёдно показывать кадры. Каждый кадр представляет собой фоновую картинку, на которую наложены предметы и персонажи – каждый в своих координатах. Перерисовывать кадр прямо в видимом окне нельзя, так как будет виден процесс перерисовки. Поэтому поступают одним из таких способов:
1. Создают переменную (экранный буфер) для хранения кадра размером с окно. Переключают на неё процесс рисования. Во время движения в этой переменной создают очередной кадр, а затем копируют его в окно.
Команда SetDrawingSurface(buf); устанавливает рисунок с описателем buf в качестве поверхности рисования. С этого момента все команды рисования работают не в графическом окне, а в данном рисунке.
Команда RestoreDrawingSurface; восстанавливает в качестве поверхности рисования графическое окно.
Рассмотрим эту технологию на примере:
Создать анимацию: снежный шар катится по заснеженной поверхности земли. Уровень поверхности отслеживать по чёрной линии. За пределами окна (x<0 или x>=600) оставить y как в предыдущих точках.
Сначала создадим рисунки и поместим их в тот же каталог, куда сохраним нашу программу:












Двигаться вправо будем в цикле по x. Значение y в данной точке будем определять так: в цикле просмотрим полоску с данным x сверху донизу. Как только встретим белую точку, остановим поиск – это и есть поверхность.


















2. Второй способ создания анимации заключается в следующем: на время подготовки кадра отключают режим прорисовки окна командой LockDrawing; . Пока действует эта команда, всё рисование происходит в невидимой копии окна. Когда кадр подготовлен, его можно проявить в окне командой Redraw;. Чтобы отменить данный режим и всё рисование вновь происходило прямо в графическом окне, используется команда UnLockDrawing;. Та же программа (катящийся шар) с применением второй технологии получается короче и работает немного быстрее:





















Вспомогательные алгоритмы

Если в нескольких местах программы встречаются участки с одинаковыми действиями, то можно вынести такой участок из раздела команд в раздел описаний и дать ему имя, а в тех местах, где он встречался в программе, оставить только вызов по имени. Такой, вынесенный отдельно, участок программы, имеющий имя, называется вспомогательным алгоритмом или подпрограммой. Подпрограмму можно вызывать не только из основной программы, но и из других подпрограмм, описанных ниже данной подпрограммы. Выносить в подпрограмму нужно не просто любую последовательность команд, а такой участок программы, который выполняет осмысленное действие. Название подпрограммы должно информировать об этом действии. Правила составления имён подпрограмм – такие же, как и для имён переменных.
Различают два вида подпрограмм: процедуры и функции. Процедура – это синоним слова «команда». Она вызывается по имени Имя функции нужно использовать в выражении, как переменную. Паскаль вместо имени функции подставляет результат её вычислений. Например: x:=2*gipotenuza(10,18)+y;
Чтобы уточнить, каким образом должна работать подпрограмма, нужно при вызове передать ей информацию. Для этого после имени подпрограммы в скобках перечисляют конкретные значения, которые нужно передать – фактические параметры. Например, если мы разработали процедуру, которая рисует домик, мы при вызове должны указать в качестве параметра базовые координаты и размеры домика: domik(100,400,150,180);
В предыдущем примере мы передавали через параметры катеты треугольника, а функция вычисляла по ним гипотенузу. Вместо чисел в качестве фактических параметров можно поместить переменные или выражения: domik(x,y,a,1.5*a); . Необходимо, чтобы к моменту вызова эти переменные уже были вычислены.
В описании подпрограммы в скобках после имени нужно описать переменные, в которые будут помещены данные, передаваемые при вызове, – формальные параметры.
Кроме параметров, в подпрограммах могут использоваться и другие переменные. Они создаются в момент вызова подпрограммы и уничтожаются при выходе из неё, поэтому в основной программе и в других подпрограммах они неизвестны (так же, как и параметры). Такие переменные называются локальными (местными). Их описание находится после заголовка подпрограммы. Те же переменные, которые объявлены в разделе var самой программы, называются глобальными. Они могут быть использованы как в любой подпрограмме, описанной ниже этого объявления, так и в основной программе. Если в подпрограмме имеется локальная переменная, чьё имя совпадает с именем глобальной переменной, то на время работы подпрограммы глобальная переменная будет забыта, и подпрограмма работает со своей локальной переменной.
Рассмотрим два примера:
Процедура рисует цветок по заданным координатам и радиусу.

Функция получает два катета и вычисляет гипотенузу прямоугольного треугольника









Обратите внимание на слово real, стоящее в конце заголовка функции. Таким способом указывается тип результата, возвращаемого функцией.

Кроме того, обратите внимание на имя функции gipotenuza, которому присваивается результат расчётов. Именно так указывают, какая именно величина возвращается в качестве результата работы функции.
Кстати, использование переменной c в данном примере излишне. Можно было сразу использовать имя функции:
gipotenuza:=sqrt(sqr(a)+sqr(b));
Если необходимо завершить процедуру, не дойдя до её конца, используется команда exit.


Рекурсия
Встречаются задачи, в которых подпрограмма вызывает саму себя. Это называется рекурсией. Таким образом можно организовать хитрые циклы, которые иным способом либо очень трудно, либо невозможно сделать. Например, процедура KRUG рисует круг, состоящий из кругов, которые в свою очередь состоят из кругов и т.д Ёлочка – это большая ветка, состоящая из веток, которые состоят из веточек Любые самоповторяющиеся рисунки (фракталы) создаются с помощью рекурсии. Но не только рисунки. С помощью рекурсии работает процедура закраски (в начальной позиции ставится точка, которая ставит точки вокруг себя, а те в свою очередь ставят точки вокруг них и т.д., пока не будет достигнута граница). С помощью рекурсии можно найти кратчайший путь к выходу из лабиринта, экономно раскроить заготовку на детали и т.д. Одним словом, если встречается сложная задача, которую вроде бы решить нужно циклом, но непонятно, как его организовать – попробуйте рекурсию! Приведём пример:
Нарисовать с использованием рекурсии ёлочку.





















Находим координаты (xk, yk) конца веточки и проводим отрезок из начала в конец. Затем делим ветку на 8 частей (находим шаги dx и dy) и в этих точках рекурсивно вызываем процедуру «ветка», задавая ей другие углы (влево и вправо от ветки на
·*0.35) и уменьшенную длину.
Должно получиться нечто следующее:
Использование рекурсии опасно зависанием. В примере с ёлочкой каждая следующая веточка вызывается меньших размеров. Но так может продолжаться до бесконечности (а точнее, до переполнения памяти), если процесс уменьшения не остановить. В данном примере мы прекращаем рекурсивный вызов, если длина очередной веточки становится меньше 15 пикселов. (Можно сделать ограничение в 1 пиксел, но тогда иголки будут короткими). На этом примере можно сформулировать правило безопасной рекурсии: В рекурсивной процедуре проверку условия окончания рекурсии нужно выполнять ДО рекурсивного вызова.
Кроме прямой рекурсии, о которой рассказано выше, существует ещё косвенная рекурсия: подпрограмма A вызывает подпрограмму B, которая в свою очередь вызывает A Например, круг, который состоит из квадратов, которые состоят из кругов Здесь возникает такая проблема: одна из этих подпрограмм, например, A, описана выше и не знает о существовании подпрограммы B, которая описана ниже, следовательно, не может к ней обратиться. Для решения такой проблемы в Паскале предусмотрен механизм предварительного описания. Заголовок (только!) подпрограммы B копируют до подпрограммы A, а в конце этого заголовка после точки с запятой добавляют слово forward. Это слово показывает Паскалю, что это ещё не описание подпрограммы, а только прототип, предварительное оповещение.

Событийное программирование
Модуль Events предназначен для создания программ, управляемых событиями. Он работает только в паре с модулем GraphABC. При одновременном подключении модулей GraphABC и Events программа после запуска и выполнения своего основного блока (begin/end.) не завершается, а продолжает выполняться, отслеживая возникающие события. Все события связаны с графическим окном: это события, приходящие от мыши, клавиатуры, события изменения размеров графического окна и событие его закрытия. После закрытия графического окна (closewindow) программа завершается.
Каждому событию соответствует своя процедурная переменная:
Событие Переменная
нажатие мыши OnMouseDown
отпускание мыши OnMouseUp
перемещение мыши OnMouseMove
нажатие клавиши OnKeyDown
отпускание клавиши OnKeyUp
нажатие символьной клавиши OnKeyPress
изменение размеров графического окна OnResize
закрытие графического окна OnClose

До начала работы программы эти переменные имеют нулевые значения.
Чтобы при возникновении некоторого события выполнить определенное действие, необходимо в программе присвоить процедурной переменной конкретную процедуру, выступающую в роли обработчика события. При возникновении одного из перечисленных выше событий проверяется, содержит ли соответствующая процедурная переменная ссылку на процедуру-обработчик, и если да, то данная процедура-обработчик вызывается.
Процедуры-обработчики имеют такие параметры:
OnMouseDown, OnMouseUp, OnMouseMove: - (x,y,mousebutton: integer);
OnKeyDown, OnKeyUp: - (key: integer);
OnKeyPress: - (ch: char);
OnResize, OnClose: - без параметров
Параметры x и y в обработчиках OnMouseDown, OnMouseUp и OnMouseMove определяют координаты курсора мыши в момент наступления события, параметр mousebutton равен 0, если кнопка мыши не нажата, 1, если нажата левая кнопка мыши, и 2, если нажата правая кнопка мыши. Параметр key в обработчиках OnKeyDownи OnKeyUp определяет виртуальный код нажатой клавиши. Параметр ch в обработчике OnKeyPress определяет нажатый символ. Если переменная-событие OnKeyPress имеет обработчик, то графическое окно не закрывается по нажатию клавиши Esc.
Например, если определена следующая процедура-обработчик, и в основной программе она привязана к соответствующей переменной-событию: OnMouseDown:=MouseDown; , то всякий раз при щелчке мышью в графическом окне в окно вывода будет выводиться 1.
Пример: Программа, осуществляющая движение графического окна с помощью клавиатуры.
uses GraphABC,Events;

Использование таймеров
Таймеры позволяют выполнять указанное действие периодически через равные промежутки времени. Процедуры и функции для управления таймерами содержатся в модуле Timers.
Функция CreateTimer(ms,TimerProc) создает таймер, выполняющий каждые ms миллисекунд действие, содержащееся в процедуре без параметров TimerProc, и возвращает его целочисленный описатель. Созданный таймер сразу же запускается.
Процедура StartTimer(n) запускает таймер с описателем n.
Процедура StopTimer(n) останавливает таймер с описателем n.
Процедура SetTimerInterval(n,ms) устанавливает у таймера с описателем n интервал в ms миллисекунд.
Функция TimerInterval(n) возвращает интервал у таймера с описателем n.
Функция TimerEnabled(n) возвращает True, если таймер запущен, и False в противном случае.
Процедура DestroyTimer(n) разрушает таймер с описателем n.
Для периодического вызова процедуры таймера необходимо после его создания продолжить выполнение приложения. Это можно сделать, подключив модуль Events.
Пример:



















Использование сторонней библиотеки UKEYB

Для плавного управления клавиатурой при создании игры недостаточно средств модуля CRT или использования событий клавиатуры. Можно использовать стороннюю библиотеку UKEYB. Она несовместима с CRT, поэтому при её подключении CRT нужно исключить из списка модулей, и все подпрограммы из CRT заменить аналогами из UKEYB.

UKEYB содержит такие функции для работы с клавиатурой:
Функция ispressed(key:integer):boolean; проверяет, нажата ли клавиша, заданная параметром.
Функция is_any_key:boolean; проверяет, нажата ли хоть какая-нибудь клавиша.
Функция arrow_dir:byte; проверяет, куда нажаты клавиши-стрелки. (0-не нажаты, 1-8 - от вертикали по часовой стрелке)
При вызове ispressed удобно вместо кода клавиши использовать перечисленные ниже константы:

F1_key=112; F2_key=113; F3_key=114;
F4_key=115; F5_key=116; F6_key=117;
F7_key=118; F8_key=119; F9_key=120;
F10_key=121; F11_key=122; F12_key=123;
pgup_key=33; pgdn_key=34; caps_key=20;
Lctrl_key=162; Rctrl_key=163;
Lalt_key=164; Ralt_key=165;
Lshift_key=160; Rshift_key=161;

esc_key=27; tab_key=9;
space_key=32; enter_key=13;
up_key=38; down_key=40;
left_key=37; right_key=39;
ins_key=45;del_key=46; home_key=36;
end_key=35;



A_key=65; B_key=66; C_key=67; D_key=68; E_key=69; F_key=70; G_key=71;
H_key=72; I_key=73; J_key=74; K_key=75; L_key=76; M_key=77; N_key=78;
O_key=79; P_key=80; Q_key=81; R_key=82; S_key=83; T_key=84; U_key=85;
V_key=86; W_key=87; X_key=88; Y_key=89; Z_key=90;


Библиотека UKEYB содержит также средства для работы с мышью:

Функция mousebutton возвращает 0, если кнопки мыши не нажаты, 1 – левая, 2 – правая кнопки мыши и 4 – нажато колёсико.
Функция SetMouseCursorOff убирает курсор мыши из окна, а SetMouseCursorOn восстанавливает его.
Функции MouseX и MouseY дают координаты левой верхней точки курсора.
В качестве примера рассмотрим программу, которая перемещает кружок по движению мыши, а нажатие левой кнопки мыши меняет цвет кружка:
 Однако, работы в этом направлении (искусственный интеллект) ведутся.









13PAGE 15


13PAGE 141915



Главное меню

Панель инструментов

Ярлыки программ

Окно редактора программы

Окно вывода результатов

Строка состояния

Создать новую программу

Открыть программу

Сохранить программу

Сохранить все программы

Вырезать

Копировать

Вставить

Отмена действия

Возврат действия

Запуск программы

Завершение работы программы

Окно вывода

Отдельное окно

Очистка вывода

Добавить в окно отладки проверяемое выражение

Выполнить шаг программы со входом в подпрограмму

Выполнить шаг без входа в подпрограмму

Выполнить программу до курсора

Показать окно отладки

Program название;
описание;
описание;
описание;
begin
команда;
команда;
команда;
команда;
команда;
end.



program Lesson2;
const
g=9.81; e=2.781;
begin
writeln(2*g+5);





program Lesson3;
var
a,b,c:integer;
x,y:real;
begin
b:=6;
a:=b+15;



a+random(b-a+1)

program risunok;
var
a,b,v : real;
begin
a:=500;
b:=300;
v:=a*b*3/1024;
writeln(’Потребуется ’,v:3:1,’ Кбайт памяти’);
end.




program stado;
var
m,t,u,s1,ss,k : real;
begin
m:=70; t:=150; u:=250; k:=65;
s1:=u/m*t; {площадь для одной коровы}
ss:=s1*k; {площадь для всего стада }
writeln(’Корове нужно ’,s1:4:1,’ Га пастбища’);
writeln(’Стаду нужно ’,ss:4:1,’ Га пастбища’);
end.

program koleso;
var
maxob,r,km,l : real;
begin
maxob:=100000; r:=0.5;
l:=2*pi*r; {длина окружности колеса}
km:=l*maxob; {путь в метрах}
km:=km/1000; {путь в километрах}
writeln(’Автомобиль пройдёт ’,km:6:2,’ км.’);
end.


write(’Сколько Вам лет? ’);
readln(wozr);

write(’Введите размеры вагона ’);
readln(a,b,c);

program procent;
var
a,b,p:real;
begin
write(’Введите a и b ’); readln(a,b);
p:=a/b*100;
writeln(a:3:1,’ составляет ’,p:3:1,’% от ’,b:3:1);
end.

program edoki;
var
a,b,c,t,vv,vk,v:real;
begin
write(’Сколько пирожков съел Вася? ’); readln(a);
write(’Сколько пирожков съел Коля? ’); readln(b);
write(’Сколько пирожков должна съесть команда? ’);
readln(с);
vv:=a/10; {скорость Васи}
vk:=b/10; {скорость Коли}
v:=vv+vk; {общая скорость}
t:=c/v;
writeln(’Команда справится за ’,t:3:1,’ минут’);
end.

program cena;
var
cr,ck,n,sr,sk:integer;
c,s:real;
begin
writeln(’Введите цену 1 кг. пшеницы:’);
write(’- Рубли: ’); readln(cr);
write(’- Копейки: ’); readln(ck);
write(’Ск. кг. пш-цы надо купить? ’); readln(n);
c:=cr+ck/100; //Переводим копейки в доли рубля.
s:=c*n; //Стоимость всей пшеницы
sr:=trunc(s); //Целая часть стоимости - рубли
sk:=trunc(frac(s)*100); //Дробн.часть – доли рубля
writeln(’Вся пш. стоит ’,sr,’ руб. и ’,sk,’ коп.’);
end.

program dopisyvaem;
var
n,k,r:integer;
begin
write(’Введите двузначное число: ’); readln(n);
write(’Введите одну цифру: ’); readln(k);
r:=k*1000+k+n*10 + 100;
writeln(’Получилось ’,r);
readln;
end.

13 EMBED Equation.3 1415
13 EMBED Equation.3 1415
13 EMBED Equation.3 1415
13 EMBED Equation.3 1415
13 EMBED Equation.3 1415
13 EMBED Equation.3 1415
13 EMBED Equation.3 1415
13 EMBED Equation.3 1415





13 EMBED Equation.3 1415
13 EMBED Equation.3 1415
13 EMBED Equation.3 1415
13 EMBED Equation.3 1415

13 EMBED Equation.3 1415

По-английски:
if – если
then – то (тогда)
else - иначе

а так – на Паскале



if x > y then
begin
z:=x-y;
writeln(’x = ’,x);
end
else
begin
z:=x-y;
writeln(’y = ’,y);
end;




if x > y then
begin
z := x - y;
writeln(’x = ’,x);
end;

program money;
var
a,b,c:integer;
begin
write(’Сколько динариев купил Вася? ’); readln(a);
write(’Сколько сестерциев купил Вася? ’); readln(b);
write(’Сколько свободных ячеек в альбоме? ’); readln(c);
if a + b <= c then
writeln(’Места в альбоме хватит’)
else
writeln(’Места в альбоме не хватит’);
end.

program water;
var
t:real;
begin
write(’Введите температуру воды у пляжа ’);
readln(t);
if (t>=19) and (t<=26) then
writeln(’Можно купаться’)
else
writeln(’Купаться нельзя’);
end.

program year;
var
y:integer;
begin
write(’Введите год ’); readln(y);
if (y mod 4=0) and ((y mod 100<>0)
or (y mod 400=0)) then
writeln(’Високосный год’)
else
writeln(’Не високосный год’);
end.

program ogur;
var
a,b,c,d,m1,m2:real;
begin
write(’Введите массу и к-во огурцов из 1 магазина ’);
readln(a,b); m1:=a/b;
write(’Введите массу и к-во огурцов из 2 магазина ’);
readln(c,d); m2:=c/d;
if m1>m2 then
writeln(’В первом магазине – крупнее.’)
else
if m1 writeln(’Во втором магазине – крупнее.’)
else
writeln(’Одинаковые’);
end.





if a > b then
if x > 0 then
writeln(’***’)
else
writeln(’ooo’);


if a > b then
begin
if x > 0 then
writeln(’***’);
end
else
writeln(’ooo’);


program deliteli;
var
a,b:integer;
begin
write(’Введите два целых числа: ’); readln(a,b);
if a=b then
writeln(’Числа равны’)
else
if (a mod b=0) then
writeln(a,’ делится на ’,b)
else
if (b mod a=0) then
writeln(b,’ делится на ’,a)
else
writeln(’Эти числа не делятся друг на друга’);
end.

program money;
var
p:integer;
begin
write(’Какая полка Вас интересует? ’); readln(p);
if p=1 then
writeln(’Сапоги’)
else
if (p=2) or (p=4) then
writeln(’Мужские туфли’)
else
if (p>=5) and (p<=8) then
writeln(’Женские туфли’)
else
if (p=3) or (p>=9) and (p<=12) then
writeln(’Кроссовки’)
else
writeln(’Полки с таким номером у нас нет’);
readln;
end.

program money;
var
p:integer;
begin
write(’Какая полка Вас интересует? ’); readln(p);
case p of
1: writeln(’Сапоги’);
2,4: writeln(’Мужские туфли’);
5..8: writeln(’Женские туфли’)
3,9..12: writeln(’Кроссовки’)
else writeln(’Полки с таким номером у нас нет’);
end;
readln;
end.

case p of
1: writeln(’Сапоги’);
2,4: writeln(’Мужские туфли’);
5..8: begin
writeln(’Женские туфли’);
writeln(’Но там ничего нет: всё продано!’);
end;
3,9..12: writeln(’Кроссовки’)
else writeln(’Полки с таким номером у нас нет’);
end;


program vorony;
var
v,p,pp:integer;
begin
write(’Сколько летит ворон? ’); readln(v);
p:=v mod 10; {находим последнюю цифру}
pp:=v mod 100 div 10; {находим предпоследнюю цифру}
if pp=1 then
writeln(’Летит ’,v,’ ворон’)
else
case p of
1: writeln(’Летит ’,v,’ ворона’);
2..4: writeln(’Летит ’,v,’ вороны’);
else writeln(’Летит ’,v,’ ворон’);
end;
readln;
end.

program number;
var
n,s,d,e:integer;
begin
write(’Введите число от 1 до 999 ’); readln(n);
if (n<1) or (n>999) then
begin
writeln(’Число не соответствует условию задачи’);
readln; halt;
end;
e:=n mod 10; {находим единицы}
s:=n div 100; {находим сотни}
d:=n mod 100 div 10; {находим десятки}

case s of {назовём отдельно сотни}
1: write(’Сто ’);
2: write(’Двести ’);
3: write(’Триста ’);
4: write(’Четыреста ’);
5: write(’Пятьсот ’);
6: write(’Шестьсот ’);
7: write(’Семьсот ’);
8: write(’Восемьсот ’);
9: write(’Девятьсот ’);
end;

if d=1 then
case e of {назовём десятки с единицами}
0: writeln(’десять’);
1: writeln(’одиннадцать’);
2: writeln(’двенадцать’);
3: writeln(’тринадцать’);
4: writeln(’четырнадцать’);
5: writeln(’пятнадцать’);
6: writeln(’шестнадцать’);
7: writeln(’семнадцать’);
8: writeln(’восемнадцать’);
9: writeln(’девятнадцать’);
end
else
begin
case d of {назовём отдельно десятки}
2: write(’двадцать ’);
3: write(’тридцать ’);
4: write(’сорок ’);
5: write(’пятьдесят ’);
6: write(’шестьдесят ’);
7: write(’семьдесят ’);
8: write(’восемьдесят ’);
9: write(’девяносто ’);
end;
case e of {назовём отдельно единицы}
0: writeln; {для переноса строки}
1: writeln(’один’);
2: writeln(’два’);
3: writeln(’три’);
4: writeln(’четыре’);
5: writeln(’пять’);
6: writeln(’шесть’);
7: writeln(’семь’);
8: writeln(’восемь’);
9: writeln(’девять’);
end;
end;
end.


н е т



a < b



while abegin
команда;
команда;
........
end;

program bank;
var
s1,s2,p:real;
g:integer;
begin
write(’Введите начальную сумму ’); readln(s1);
write(’Введите конечную сумму ’); readln(s2);
write(’Введите процентную ставку ’); readln(p);
g:=0;
while s1 begin
s1:=s1 + s1 * p / 100;
g:=g + 1;
end;
writeln(’До накопления суммы пройдёт ’,g,’ лет’);
end.



a
·b

н е т

д а

repeat
команда;
команда;
........
until a >= b;


program summa;
var
s,r: real;
begin
write(’Введите число R (> 1) ’); readln(r);
s:=0;
repeat
s:=s+r ;
r:=r/1.5 ;
until r<0.001;
writeln (’Сумма чисел равна ’,s:7:4);
end.

для счётчик от нач до кон

for i:=1 to 20 do
begin
команда;
команда;
........
end;


for i:=20 downto 1 do
begin
команда;
команда;
........
end;


program summa;
var
s,i: integer;
begin
s := 0;
for i:=1 to 30 do
s:= s + i ;
writeln (’Сумма 30-ти чисел равна ’,s);
readln;
end.

По-английски:

for – для to – до (по направлению к)
downto – до (вниз к) do - выполнить
while – пока repeat – повторять
until – до (до тех пор, пока)

команда
команда
команда

команда
команда
команда
if a<3 then break;
команда
команда
команда
команда
команда

команда
команда





команда
команда
команда

команда
команда
команда
if a>=3 then continue;
команда
команда
команда
команда
команда

команда
команда





program perehod ;
label met1;
var
команда
команда
begin
команда
команда

команда
команда

команда
if a<3 then goto met1;
команда
команда
команда
команда
команда

команда
команда

met1:
команда
команда
end.




команда;
команда;
vihod:=false;
for i:=1 to 47 do
begin
for k:=1 to 15 do
begin
команда;
команда;
if (k+i) mod 17=0 then
begin
vihod:=true; break;
end;
команда;
команда;
end;

if vihod then break;
end;

команда;
команда;

program zastavka;
uses crt;
var
x1,x2:integer;
begin
TextSize(12); //Зададим размер символов
CRTWindowSize(80,25); //Зададим размер экрана
Textbackground(0); clrscr; //Затемним и очистим экран
textcolor(12); //Зададим красный цвет текста
x1:=1; x2:=69; //Задаём начальные координаты слов
HideCursor; //Отключим курсор
repeat
gotoxy(x1,12); write(' СМЕРТЕЛЬНАЯ'); //Верхнее слово
gotoxy(x2,14); write('БИТВА '); //Нижнее слово
sleep(50); //Делаем задержку
x1:=x1+1; x2:=x2-1; //Перемещаем слова
until x1>33;
end.

program letun;
uses crt;
var
x,y,vx,vy:integer;
begin
//Настроим размер,цвет символов и экрана
TextSize(16); CRTWindowSize(60,20);
Textbackground(0); clrscr; textcolor(15);
HideCursor; //Отключим курсор
ScrollingOff; //Чтобы окно не сдвигалось
x:=17; y:=11; //Зададим начальные координаты слова
vx:=1; vy:=1; //Направление движения вправо - вниз
repeat
gotoxy(x,y); write('МЯЧИК'); //Ставим слово
sleep(30); //Задержка
gotoxy(x,y); write(' '); //Стираем слово

x:=x+vx; //Перемещаем горизонтально-------------
if (x=1) or (x=56) then //Проверяем левый и
begin //правый края окна
vx:=-vx; //Скорость меняется на противоположную
textcolor(1+random(15)); //Случайный цвет
end;

y:=y+vy; //Перемещаем вертикально---------------
if (y=1) or (y=20) then //Проверяем верх и низ
begin
vy:=-vy; //Скорость меняется на противоположную
textcolor(1+random(15)); //Случайный цвет
end;
until keypressed;//Конец цикла по нажатию клавиши
end.

program trenager;
uses crt;
var
x,y,nbuk,score,mist:integer;
buk,klav:char; //Перем-е для падающей и нажатой букв
alf:string; //Строковая переменная для алфавита
begin
randomize; //Обновл. генератор сл. чисел
//Настроим размер символов и экрана
TextSize(20); TextBold; CRTWindowSize(60,20);
Textbackground(0); clrscr; HideCursor;
//При печати в нижней строке окно не должно сдвигаться
ScrollingOff;
//Занесём в перем. alf алфавит
alf:='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ';
score:=0; mist:=0; //Вначале обнуляем очки и ошибки
for x:=1 to 60 do //Цикл по столбцам слева направо
begin
nbuk:=1+random(33); //Случайный номер буквы
buk:=alf[nbuk]; //Берём букву с этим номером
textcolor(9+random(7)); //Случайный цвет буквы
for y:=1 to 20 do //Цикл вдоль столбца
begin
gotoxy(x,y); write(buk); //Ставим букву
sleep(200); //Слегка притормозим её
if keypressed then //Клавиша нажата?
begin
klav:=readkey; //Посмотрим, какая нажата
if klav=buk then //Если правильная, то
begin
score:=score+(20-y); //В очки остаток столбца
break; //Уходим в след. столбец
end
else //Если нажата неправильная,
mist:=mist+1; //считаем ошибку
end;
end;
end;
clrscr; //Чистим экран для результата}
gotoxy(20,9); write('Вы набрали ',score,' баллов!');
gotoxy(20,11); write('Допущено ',mist,' ошибок!');
end.

type   DayOfWeek = (Mon,Tue,Wed,Thi,Thr,Sat,Sun);
var   Segodnya, Zavtra: DayOfWeek;
begin Segodnya:=Wed;
Zavtra:=succ(Segodnya);
writeln('Завтра будет ',ord(Zavtra));
end.


. . .
for day:=Mon to Sun do
case day of
Mon..Thr: writeln(’Будний день’);
else writeln(’Выходной’);
end;

case c of
’a’..’Z’,’A’..’Z’: writeln(’Латинская буква’);
’а’..’я’,’А’..’Я ’: writeln(’Русская буква’);
else writeln(’Другой символ’);
end;

type
Shkolnik = 3..20;
var
vozr: Shkolnik;

var
vozr:3..20;


type
  DayOfWeek = (Mon,Tue,Wed,Thi,Thr,Sat,Sun);
Budni = Mon .. Thr;
eng = ’a’..’z’;


program word_in_string;
var
a,b:string;
m,k,d:integer;
begin
write(’Введите строку ’); readln(a);
write(’Введите слово ’); readln(b);
k:=0; d:=length(b);
repeat
m:=pos(b,a);
if m>0 then
begin
k:=k+1;
delete(a,m,d);
end;
until m=0;
writeln('Слово встречается ',k,' раз');
end.

program letters;
var
s,z,m:string;
kz,km,i:integer;
c:char;
begin
write(’Введите строку ’); readln(s);
z:=’ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ’;
m:=’ёйцукенгшщзхъфывапролджэячсмитьбю’;
kz:=0; km:=0;
for i:=1 to length(s) do
begin
c:=s[i];
if pos(c,z)>0 then
kz:=kz+1
else
if pos(c,m)>0 then
km:=km+1;
end;
if kz>km then
writeln('Заглавных букв больше')
else
if kz writeln('Строчных букв больше')
else
writeln('Заглавных и строчных букв поровну');
end.

s:=0;
for i:=1 to 20 do
if a[i] mod 3=0 then
s:=s+a[i];

var
b:array[0..5] of real;
c:array[-10..10] of byte;

for i:=1 to 20 do
begin
write(’Введите ’,i,’-ое число: ’); readln(a[i]);
end;

randomize;
for i:=1 to 20 do
begin
a[i]:=10+random(31); write(a[i],’ ’);
end;

for i:=1 to 20 do
begin
alf:=i*2*pi/20;
x[i]:=320+100*sin(alf); y[i]:=320+100*sin(alf);
end;


const
a:array[0..5] of integer=(15,24,3,8,-3,2);

a[1]:=15; a[2]:=24; a[3]:=-8;

program massiv1;
uses crt;
var
a:array[1..20] of integer;
i:integer;
begin
randomize; clrscr;
for i:=1 to 20 do
begin
a[i]:=1+random(99); write(a[i],’ ’);
end;
writeln;
for i:=20 downto 1 do
begin
if a[i] mod 3=0 then
textcolor(12)
else
textcolor(15);
write(a[i],’ ’);
end;
end.

program massiv2;
var
n:array[1..10] of integer;
i,kc,kn:integer;
begin
for i:=1 to 10 do
begin
write(’N[’,i,’]=’); readln(n[i]);
end;
writeln;
kc:=0; kn:=0;
for i:= 1 to 10 do
begin
write(n[i],’ ’);
if n[i] mod 2=0 then inc(kc) else inc(kn);
end;
if kc>kn then
writeln(’Чётных больше на ’,kc-kn)
else
if kn>kc then
writeln(’Нечётных больше на ’,kn-kc)
else
writeln(’Чётных и нечётных поровну’);
end.

program massiv3;
var
a,b,c:array[1..20] of integer;
i:integer;
begin
randomize;
for i:=1 to 20 do
begin
a[i]:=1+random(5); write(a[i]:3);
end; writeln;
for i:=1 to 20 do
begin
b[i]:=1+random(5); write(b[i]:3);
end; writeln;
for i:=1 to 20 do
begin
if a[i]=b[i] then c[i]:=a[i] else c[i]:=0;
write(c[i]:3);
end;
end.

program poisk_max;
var
a:array[1..20] of integer;
i,max:integer;
begin
randomize;
for i:=1 to 20 do
begin
a[i]:=1+random(99); write(a[i],’ ’);
end; writeln;
max:=a[1];
for i:=2 to 20 do
if a[i]>max then max:=a[i];
writeln(’Наибольший элемент массива = ’,max);
readln;
end.

max:=a[1]; Nmax:=1;
for i:=2 to 20 do
if a[i]>max then
begin
max:=a[i]; Nmax:=i;
end;
writeln(’Наиб. элем.=’,max,’. Его номер = ’,Nmax);

program sortirovka_obmenom;
var
a:array[1..20] of integer;
i,k,min,Nmin:integer;
begin
randomize; {Сначала заполним массив}
for i:=1 to 20 do
begin
a[i]:=1+random(99); write(a[i]:3);
end; writeln;
{Отсортируем по возраст. методом обмена}
for i:=1 to 19 do
begin {i показывает начало поиска}
min:=a[i]; Nmin:=i;
{просмотрим все остальные (после i)}
for k:=i+1 to 20 do
if a[k] begin
min:=a[k]; Nmin:=k;
end;
{Нашли минимальное число. Обменяем его с i-м}
a[Nmin]:=a[i]; a[i]:=min;
end;
{Теперь распечатаем отсортированный массив}
for i:=1 to 20 do
write(a[i]:3);
end.

for i:=19 downto 1 do {i - конец поиска}
for k:=1 to i do {очередной i–ый проход}
if a[k]>a[k+1] then
begin {не по возрастанию - обменяем}
b:=a[k]; a[k]:=a[k+1]; a[k+1]:=b;
end;


program Tab_Umn;
uses crt;
var
x,y:integer;
p:array[1..9,1..9] of byte;
begin
clrscr;
for x:=1 to 9 do
for y:=1 to 9 do
begin
p[x,y]:=x*y;
gotoxy(x*4; y*2);
write(p[x,y]);
end;
end.



type
rainbow=(krasny, orangevy, gelty, zeleny, goluboy, siny, fioletovy);
group=1..20;
var
a: set of char;
b: set of byte;
c: set of rainbow;
d: set of group;
digit: set of 0..9;


c:\prog\bp\bin\info.txt

Путь Имя Расширение

var
f1,f2:file of integer;
f3:file of real;
f4:file of string[40];
f5:text;

типовые файлы

текстовый файл

...
k:=0;
while not eof(f) do
begin
k:=k+1; read(f,a[k]);
end;
...



program people;
var
man:record
name:string;
rost,ves:integer;
end;


program people;
type
man=record
name:string;
vozrast,rost,ves:integer;
end;
var
student,pupil:man;
kl8a:array[1..20] of man;
f:file of man;

for i:=1 to 20 do
with kl8a[i] do
begin
writeln(’Ученик: ’,name);
writeln(’Возраст: ’,vozr);
end;


Type
device = Record
nam: string; {наименование прибора}
Case byte of {Безымянный селектор}
1: (Pi,Pf: integer); {или два значения типа Integer}
2: (P: real); {или одно значение типа Real}
end;

Type
device = Record
nam: string; {наименование прибора}
Case sposob:integer of {Безымянный селектор}
1: (Pi,Pf: integer); {или два значения типа Integer}
2: (P: real); {или одно значение типа Real}
end;
{- - - - - - - - - - - - - - - - - - - - - - - - - -
Теперь в программе это можно использовать так:
- - - - - - - - - - - - - - - - - - - - - - - - - - }
If sposob=1 then
begin
pi:=23; pf:=7;
end
else
p:=23.7;

program fisher;
type
onefish=record
name,eda:string[15];
dlina:integer;
ves:real;
end;
var
fish:array[1..100] of onefish; {база данных - справочник}
f:file of onefish;
isk:string[15]; {переменная для имени искомой рыбы}
i,n,kz:integer;
found:boolean;
begin
kz:=0; {Если базы нет, количество записей останется =0}
{----- Сначала загрузим базу из файла -----}
assign(f,'рыболов.dat');
if fileexists('рыболов.dat') then {файл существует}
begin
reset(f); {открываем его}
while not eof(f) do {цикл до конца файла}
begin
inc(kz); {кол-во записей увеличиваем на 1}
read(f,fish[kz]); {прочтём очередную рыбку}
end;
close(f);
end;
{-----------------------------------------}
repeat {============ Цикл возврата в меню =============}
cls;
writeln(' Режимы работы:');
writeln('-------------------------------------');
writeln('1. Добавить новую рыбу');
writeln('2. Удалить рыбу');
writeln('3. Найти рыбу');
writeln('0. Конец работы со справочником');
writeln('-------------------------------------');
write('Введите номер выбранного вида работы: '); readln(n);
cls;
case n of
0: break;
1: begin {------- добавление новой рыбы --------}
if kz=100 then
writeln('База переполнена!')
else
begin
inc(kz);
write('Введите название рыбы: '); readln(fish[kz].name);
write('Введите средний вес (в кг): '); readln(fish[kz].ves);
write('Введите среднюю длину (в см): '); readln(fish[kz].dlina);
write('Введите любимую наживку: '); readln(fish[kz].eda);
end;
end; {--------------------------------------}
2: begin {------- удаление рыбы --------}
write('Введите название удаляемой рыбы: '); readln(isk);
found:=false; {ещё не находили}
for i:=1 to kz do
if fish[i].name=isk then
begin
found:=true;
for n:=i to kz-1 do {передвинем все следующие записи}
begin {на место стираемой}
fish[n].name := fish[n+1].name;
fish[n].ves := fish[n+1].ves;
fish[n].dlina := fish[n+1].dlina;
fish[n].eda := fish[n+1].eda;
end;
dec(kz); {уменьшим количество занятых записей}
end;
if found then
writeln('Удаление произведено')
else
writeln('Такой рыбы нет в справочнике');
end; {------------------------------}

3: begin {------- поиск рыбы --------}
write('Введите название искомой рыбы: '); readln(isk);
found:=false; {ещё не находили}
for i:=1 to kz do
if fish[i].name=isk then
begin
found:=true;
writeln('Вес: ',fish[i].ves);
writeln('Длина: ',fish[i].dlina);
writeln('Любимая наживка: ',fish[i].eda);
writeln;
end;
if not found then
writeln('Такой рыбы нет в справочнике');
end; {---------------------------}
end;
writeln; writeln; writeln('Нажмите для возврата в меню');
readln;
until false; {===========================================}
{===== Сохраним в файле =====}
if cancreatefile('рыболов.dat') then {файл создать можно}
begin
rewrite(f);
for i:=1 to kz do
write(f,fish[i]);
close(f);
end;
end.

program starsky;
uses GraphABC;
var
i,x,y,c: integer;
begin
randomize;
SetWindowSize(600,500); CenterWindow; ClearWindow(clblack);
for i:=1 to 1000 do {В цикле рисуем 1000 звёзд}
begin
x:=random(600); {Случайный x в пределах окна}
y:=random(500); {Случайный y в пределах окна}
c:=1+random(clwhite); {Сл. цвет точки от 1 до белого}
SetPixel(x,y,c); {Ставим точку}
end;
end.

150

400

600

150

program shar_katitsa;
uses graphABC;
var
x,y,yy:integer;
kadr,fon,shar:integer;
begin
SetWindowSize(600,400); CenterWindow;
fon:= LoadPicture('фон.bmp');
shar:= LoadPicture('шар.bmp');
SetPictureTransparent(shar,true);
kadr:= LoadPicture('фон.bmp');
SetDrawingSurface(kadr);
y:=150; //начальное положение поверхности
for x:=-80 to 680 do
begin
SetDrawingSurface(kadr); DrawPicture(fon,0,0);
for yy:=0 to 399 do
if (x>=0)and (x<600) and (getpixel(x,yy)=clblack) then
begin
y:=yy; break;
end;
DrawPicture(shar,x-75,y-148);
RestoreDrawingSurface; DrawPicture(kadr,0,0);
end;
end.

program shar_katitsa;
uses graphABC;
var
x,y,yy:integer;
fon,shar:integer;
begin
SetWindowSize(600,400); CenterWindow;
fon:= LoadPicture('фон.bmp');
shar:= LoadPicture('шар.bmp');
SetPictureTransparent(shar,true);
LockDrawing;
y:=150; //начальное положение поверхности
for x:=-80 to 680 do
begin
DrawPicture(fon,0,0);
for yy:=0 to 399 do
if (x>=0)and (x<600) and (getpixel(x,yy)=clblack) then
begin
y:=yy; break;
end;
DrawPicture(shar,x-75,y-148);
Redraw;
end;
end.

. . .
procedure flower(xc,yc,r: integer);
var
n,x,y:integer;
alf:real;
begin
setbrushcolor(clyellow);
circle(xc,yc,r div 2);
setbrushcolor(claqua);
for n:=1 to 6 do
begin
alf:=2*pi/6*n;
x:=round(xc+3*r/4*sin(alf));
y:=round(yc-3*r/4*cos(alf));
circle(x,y,r div 4);
end;
end;
. . .


. . .
function gipotenuza(a,b: real): real;
var
c: real;
begin
c:=sqrt(sqr(a)+sqr(b));
gipotenuza:=c;
end;
. . .

program elka;
uses graphabc;
var
gd,gm:integer;
procedure vetka(x,y,alf,dl:real);
var
xk,yk,dx,dy:real;
i:integer;
begin
xk:=x+dl*sin(alf); yk:=y-dl*cos(alf);
line(round(x),round(y),round(xk),round(yk));
if dl<15 then exit; {Условие окончания рекурсии}
dx:=(xk-x)/8; dy:=(yk-y)/8;
for i:=1 to 8 do
begin
vetka(x+i*dx,y+i*dy,alf-pi*0.35,dl*(0.5-i*0.06));
vetka(x+i*dx,y+i*dy,alf+pi*0.35,dl*(0.5-i*0.06));
end;
end;
begin
setwindowsize(700,500);
vetka(320,450,0,400);
end.


procedure MouseDown(x,y,mb: integer);
begin
write(1);
end;

procedure KeyDown(Key: integer);
begin
case Key of
VK_Left: SetWindowLeft(WindowLeft-2);
VK_Right: SetWindowLeft(WindowLeft+2);
VK_Up: SetWindowTop (WindowTop-2);
VK_Down: SetWindowTop (WindowTop+2);
end;
end;
begin
OnKeyDown:=KeyDown;
end.


uses Timers,Events;
procedure TimerProc1;
begin
write(1);
end;
procedure TimerProc2;
begin
write(2);
end;
var
t1,t2: integer;
begin
t1:=CreateTimer(200,TimerProc1);
t2:=CreateTimer(300,TimerProc2);
end.

program krugok;
uses graphabc,ukeyb;
begin
randomize;
setmousecursoroff;
lockdrawing;
setbrushcolor(clred);
repeat
clearwindow(clblack);
circle(mousex,mousey,20);
redraw;
if mousebutton=1 then
begin
setbrushcolor(random(clwhite));
sleep(50);
end;
until is_any_key;
end.



Root EntryEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation Native

Приложенные файлы

  • doc 8820751
    Размер файла: 971 kB Загрузок: 0

Добавить комментарий