Министерство науки и высшего образования Российской Федерации ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ПРОМЫШЛЕННЫХ ТЕХНОЛОГИЙ И ДИЗАЙНА» Кафедра информационных технологий АЛГОРИТМИЗАЦИЯ И ПРОГРАММИРОВАНИЕ Контрольная работа Методические указания к выполнению практических заданий для бакалавров направления подготовки 09.03.03 – «Прикладная информатика в экономике» заочной формы обучения Составители: И. А. Небаев Е. С. Кокорин Санкт-Петербург 2020 УТВЕРЖДЕНО на заседании кафедры ИТ протокол № _ от _._.20_ г. Рецензент А. Б. Кикин Методические указания предназначены для выполнения контрольных заданий по темам общей алгоритмизации и программирования на языке высокого уровня. Материал пособия содержит краткие теоретические сведения по указанным темам и практические примеры. Особое внимание уделено примерам решения практических прикладных задач с использованием современных программных инструментов актуальных версий. Методические указания разработаны для студентов заочной формы обучения, по направлению подготовки 09.03.03 – «Прикладная информатика в экономике» Учебное электронное издание сетевого распространения Издано в авторской редакции Системные требования: электронное устройство с программным обеспечением для воспроизведения файлов формата PDF Режим доступа: http://publish.sutd.ru/tp_get_file.php?id=___, по паролю. – Загл. с экрана. Дата подписания к использованию _._.20_ г. Рег. № ___/__ ФГБОУВО «СПбГУПТД» Юридический и почтовый адрес: 191186, Санкт-Петербург, ул. Большая Морская, 18. http://sutd.ru 2 Оглавление Введение ..................................................................................................... 4 Основы алгоритмизации............................................................................. 5 Базовые структуры и виды алгоритмов .................................................. 8 Введение в язык программирования Java ..................................................11 Платформа и среда разработки для языка Java ......................................11 Инсталляция пакета разработчика приложений на языке Java (JDK)....11 Введение в интегрированную среду разработки Apache NetBeans........15 Создание проекта в среде Apache NetBeans...........................................21 Он-лайн инструменты для программирования на языке Java................30 Типы данных и переменные языка Java.................................................31 Объявление переменных .......................................................................31 Объявление констант .............................................................................32 Символы и строки..................................................................................32 Основные операторы .............................................................................34 Условные инструкции ...........................................................................38 Инструкции циклов ...............................................................................42 Массивы.................................................................................................44 Перехват и обработка ошибок ...............................................................46 Контрольное задание .................................................................................48 Список задач для самостоятельной разработки.....................................48 Правила оформления отчета ..................................................................50 3 Введение Контрольная работа состоит из набора практических заданий, для успешного выполнения которых, необходимо внимательно ознакомиться с теоретическим материалом, приведенным в начале каждого нового раздела, а также практическим примером работы с определенным программным инструментом. После этого можно приступать к выполнению и оформлению итоговых контрольных заданий. 4 Основы алгоритмизации Алгоритм – конечная совокупность точно заданных правил решения произвольного класса задач или набор инструкций, описывающих порядок действий исполнителя для решения некоторой задачи. Другими словами алгоритм – последовательность инструкций исполнителю для решения поставленной задачи. Алгоритм, как аналитическая модель, обладает некоторыми характерными свойствами: Дискретность – решение задачи сводится к последовательному выполнению простых шагов. При этом для выполнения каждого шага алгоритма требуется конечный отрезок времени, то есть преобразование исходных данных в результат осуществляется во времени дискретно; Детерминированность (определенность) – в каждый момент времени следующий шаг работы однозначно определяется состоянием системы. Алгоритм выдаѐт один и тот же результат (ответ) для одних и тех же исходных данных. Исполнение алгоритма носит машинный характер, который не требует дополнительных указаний или сведений о решаемой задаче; Понятность — алгоритм должен включать только те команды, которые доступны исполнителю и входят в его систему (набор) команд; Завершаемость (конечность) – при правильно заданных начальных данных алгоритм должен завершать работу и выдавать результат за определѐнное число шагов; Массовость – означает, что алгоритм решения задачи, разработанный в общем виде, должен быть применим для решения некоторого класса задач в целом, различающихся лишь исходными данными. Алгоритм должен быть применим к разным наборам начальных данных; Результативность – завершение алгоритма определѐнными результатами. Существуют разные способы задания алгоритмов, наиболее распространенными среди которых являются: словесный (вербальный), запись на естественном языке, позволяет описать алгоритм с помощью слов и предложений; псевдокод, язык неформального описания алгоритма, условный алгоритмический язык, который может включать в себя как элементы языка программирования, так и фразы естественного языка, общепринятые математические обозначения и т.д. Предназначен для представления алгоритма человеку, а не для компьютерной трансляции; программный, фактическая запись алгоритма в формализованной форме определенного искусственного языка программирования; 5 графический, разделяемый на непосредственно на: блок-схемный, описание с помощью блок-схем, в котором используются символы для отображения данных, потока, оборудования и т.д. Отдельные шаги изображаются в виде блоков различной формы (табл. 1), соединенных между собой линиями, указывающими направление последовательности. Правила выполнения регламентируются ГОСТ 19.701-90 «Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения». Стандарт регулирует способы построения схем и внешний вид их элементов; структурограммный, используемый для записи структурированных алгоритмов с отсутствием безусловных переходов. Алгоритм, заданный любым из перечисленных способов (например, блоксхемой UML), может быть обработан с помощью вычислительной системы только в том случае, если он переведен (транслирован) на какой-либо язык программирования. Выбор языка зависит от многих факторов — как объективных, так и субъективных: поддержки операционной системы, программного обеспечения, наличия фреймворка (программной платформы) и т.д. Выражение (имплементация, фактическая реализация) алгоритма на языке программирования принято называть программой. Т а б л и ц а 1. Условные графические обозначения алгоритмических элементов Название Описание Действие Символ отображает функцию обработки данных любого вида (выполнение определенной операции или группы операций, приводящее к изменению значения, формы или размещения информации или к определению, по которому из нескольких направлений потока следует двигаться). Данные (ввод/вывод) Символ отображает данные, носитель данных не определен. 6 Начертание Предопределе нный процесс (функция, подпрограмм а) Вопрос (условие или решение) Ограничитель Цикл Соединитель Символ отображает предопределенный процесс, состоящий из одной или нескольких операций или шагов программы, которые определены в другом месте (в подпрограмме, модуле). Вызов процедуры или функции. Символ отображает решение или функцию переключательного типа, имеющую один вход и ряд альтернативных выходов, один и только один из которых может быть активизирован после вычисления условий, определенных внутри этого символа. Соответствующие результаты вычисления могут быть записаны по соседству с линиями, отображающими эти пути. Символ отображает вход из внешней среды и выход во внешнюю среду (начало или конец схемы программы, внешнее использование и источник или пункт назначения данных). Начало/конец, запуск/останов, перезапуск, ошибка, исключение. Символ, состоящий из двух частей, отображает начало и конец цикла. Обе части символа имеют один и тот же идентификатор. Условия для инициализации, приращения, завершения и т. д. помещаются внутри символа в начале или в конце в зависимости от расположения операции, проверяющей условие. Символ отображает выход в часть схемы и вход из другой части этой схемы и используется для обрыва линии и продолжения ее в другом месте. Соответствующие символысоединители должны содержать одно и то же уникальное обозначение. 7 Комментарий Символ используют для добавления описательных комментариев или пояснительных записей в целях объяснения или примечаний. Базовые структуры и виды алгоритмов Алгоритм любой задачи можно описать, используя несколько базовых типов управляющих структур: Линейной; Разветвляющейся; Циклической; Предопределенный процесс. Алгоритм линейной структуры – это объединение нескольких, следующих друг за другом блоков «процесс», блоков «ввода/вывода» и т.д., в котором каждое последующее действие выполняется строго за предыдущим (рис. 1). Инструкция 1 Инструкция 2 Инструкция n Рис. 1. Алгоритм линейной структуры В алгоритме разветвляющейся структуры (рис. 2) данные влияют на ход выполнения алгоритма. В зависимости от результата проверки условия, выполняются только действия ветви «Истина» или ветви «Ложь». Такая структура разветвления носит название «полный выбор» (или «полная альтернатива»). В альтернативном варианте, в зависимости от результата проверки условия, либо выполняются действия ветви «Истина», либо пропускаются, образуя «неполный выбор» (или «неполную альтернативу»). 8 Истин а Условие Лож ь Инструкция 1 Инструкция 1 Инструкция n Инструкция m Рис. 2. Алгоритм разветвляющейся структуры Алгоритмы циклических структур обеспечивают выполнение отдельных фрагментов алгоритма заданное число повторений до получения результата при выполнении некоторого условия. В циклах с предусловием (рис. 3), если условие выполняется, то выполняется тело цикла ветви «Истина», иначе тело цикла не выполнится ни разу. В альтернативном варианте (цикл с постусловием, рис. 4), выполняется хотя бы один раз. Истин а Условие Лож ь Инструкция 1 Инструкция n Рис. 3. Алгоритм циклической структуры (предусловие) 9 Инструкция 1 Инструкция 2 Инструкция n Ложь Условие Истина Рис. 4. Алгоритм циклической структуры (постусловие) 10 Введение в язык программирования Java Язык Java широко используется при создании мобильных приложений, а также разработке программного обеспечения для предоставления различного рода услуг, включающих разработку корпоративных распределенных приложений, всевозможных порталов, систем управления бизнесом и др. Java задумывался как универсальный язык программирования и к настоящему времени проделал большой путь, который превратил язык в целую платформу и экосистему, которая объединяет различные технологии. Кроме практического применения Java выгодно отличается своей простой объектно-ориентированной моделью, из-за этого его часто используют в качестве первого ООП языка при изучении основ программирования студентами младших курсов. Актуальность необходимости знакомства начинающего программиста с языком Java не вызывает сомнений. Платформа и среда разработки для языка Java Для работы программ на языке Java на целевой машине должна быть установлена JRE (Java Runtime Environment). JRE представляет минимальную реализацию виртуальной машины JVM (Java Virtual Machine), а также библиотеку классов. Для каждой конкретной платформы имеется своя версия JRE. Так как JRE необходима только для запуска программы, потребуется установить специальный комплект непосредственно для разработки самого кода, включающий в себя JDK (Java Development Kit) и IDE (Integrated Development Environment). JDK уже содержит JRE, а также включает ряд дополнительных программ и утилит, в частности компилятор Java – javac. Есть несколько типов платформ Java. Базовую функциональность обеспечивает стандартная версия языка Java SE (Standard Edition). Она предназначена для создания небольших приложений в масштабах малого предприятия. Кроме того, существует платформа Java EE (Enterprise Edition), которая нацелена на создание более сложных приложений. В рамках заданий контрольной работы достаточно установить Java SE. Официальный сайт Oracle предлагает для загрузки пакет JDK (включающий Java SE), доступный по ссылке [1]. Инсталляция пакета разработчика приложений на языке Java (JDK) Пакет разработчика JDK распространяется компанией Oracle Corporation (ранее Sun Microsystems) бесплатно, и включает в себя компилятор javac, стандартные библиотеки классов Java, примеры, документацию, различные утилиты и среду исполнения JRE. Следует отметить, что в сети Интернет достаточно давно существует проект OpenJDK1, нацеленный на создание полностью совместимого пакета JRE, состоящего исключительно из свободного и открытого исходного кода. Проект активно развивается сообществом 1 Сайт проекта в сети Интернет: https://openjdk.java.net/ 11 независимых разработчиков, при поддержке компаний Oracle, входящей в нее Sun Microsystems, Red Hat, некоммерческим фондом GNU и Apache. Наибольшей популярностью и распространением пакет OpenJDK пользуется в мире программного обеспечения, построенного вокруг инфраструктуры ОС на базе UNIX – все современные дистрибутивы GNU/Linux и системы на основе BSD (в т. ч Mac OS), а также Solaris, по–умолчанию используют версию с открытыми исходными кодами – OpenJDK. Поскольку в состав JDK не входит интегрированная среда разработки, разработчик, использующий только JDK (без IDE), вынужден использовать внешний текстовый редактор и компилировать свои программы, используя утилиты командной строки (компилятор javac). Следует подчеркнуть, что все современные интегрированные среды разработки приложений на Java, такие, как JDeveloper, Apache NetBeans, Sun Java Studio Creator, IntelliJ IDEA, Borland JBuilder, Eclipse, опираются на сервисы, предоставляемые JDK. Большинство из них для компиляции Java–программ используют компилятор из комплекта JDK. Поэтому эти среды разработки либо включают в комплект поставки одну из версий JDK, либо требуют для своей работы предварительной инсталляции JDK на машине разработчика. Современные версии Java, JRE и JDK поддерживают только 64– разрядные операционные системы (т. н. «Certified system configurations», от англ. «Сертифицированные (поддерживаемые) конфигурации систем»). Последняя версия, обеспечивающая поддержку 32–битных систем – JDK 8 (u251). В связи с этим использование актуальных версий JDK возможно только в 64–разрядных операционных системах, список которых доступен на веб– странице сайта официальной документации Java2. Например, последний релиз JDK 14 (на момент написания данного материала) поддерживает 3 64–разрядные ОС (x64): Семейства Windows версий 8, 10, Server 2012–2019; Операционные системы на базе ядра GNU/Linux: Oracle Linux 6–8, RHEL 6–8, SLED версий 12 и 15, Ubuntu Linux 18.04 и 19.10; Операционную систему Apple macOS x64 начиная с версии 10.13. В качестве примера, продемонстрируем инсталляцию дистрибутива JDK версии 11.0.7 на ОС Windows 10 (x64). Процесс инсталляции начинается с окна приветствия программы установщика Java SE Development Kit (рис. 4). Для начала установки необходимо нажать кнопку «Next». 2 3 https://www.oracle.com/java/technologies/javase-subscription/documentation.html#sysconfig https://www.oracle.com/java/technologies/javase/products -doc-jdk14certconfig.html 12 Рис. 4. Окно приветствия программы установщика JDK В открывшемся окне «Custom Setup» можно выбрать устанавливаемые компоненты (рис. 5). По–умолчанию дистрибутив устанавливается полностью, включая некоторые исходные коды. Для начала копирования файлов следует использовать кнопку «Next». Рис. 5. Инсталлируемые компоненты JDK Процесс инсталляция сопровождается полосой прогресса, на которой отображается статус текущей установки (рис. 6). 13 Рис. 6. Окно прогресса инсталляции JDK По завершении инсталляции пакета разработчика, откроется окно «Complete» с информацией об успешном окончании установки (рис. 7). Некоторые дополнительные ресурсы (документация, обучающие курсы и т. д.) доступны на официальном сайте Oracle (кнопка «Next Steps»). Для закрытия окна следует нажать кнопку «Close». Рис. 7. Завершение инсталляции пакета JDK 14 Введение в интегрированную среду разработки Apache NetBeans После установки пакета разработки JDK можно приступить к инсталляции IDE Apache NetBeans. Установочные файлы и архивы с исходными кодами IDE для различных ОС доступны на странице загрузки4 официального сайта проекта Apache в сети Интернет. Следует отметить, что среда разработки Apache NetBeans выбрана в качестве инструмента разработки (в рамках данного пособия) не случайно, поскольку обладает рядом преимуществ, особенно ценных для введения в курс программирования: среда разрабатывается независимым сообществом разработчиков, при этом инфраструктура проекта обеспечивается некоммерческим фондом Apache; является проектом с открытым исходным кодом и свободным доступом; среда разработки полностью кроссплатформенна и поддерживает высокую степень переносимость проектов между различными системами; помимо языка программирования Java, средств Oracle JDK, а также OpenJDK, поддерживает разработку проектов на языках PHP, JavaScript и HTML, позволяя, тем самым, создавать замкнутые программные проекты в циклах разработки ПО. С помощью системы плагинов IDE обеспечивает работу с проектами C/C++, Python и т. д.; относительно простой и эргономичный пользовательский интерфейс не требует длительного процесса адаптации разработчика к инструменту разработки ПО; IDE поддерживает популярные форматы и инструменты разработки ПО – Git, профилирование, рефакторинг и пр. Как уже было указано ранее, существуют альтернативные средства разработки для языка Java, наиболее предпочтительным из которых (на взгляд авторов) можно считать среду Eclipse5. Как и ранее, в качестве примера, продемонстрируем инсталляцию дистрибутива Apache NetBeans версии 11.3 на ОС Windows 10 (x64).Процесс инсталляции среды начинается с запуска программы автоматического конфигурирования установщика (рис. 8), который проверяет версию JDK установленной в данной ОС, переменные среды и пр. 4 5 https://netbeans.apache.org/download/index.html https://www.eclipse.org/ 15 Рис. 8. Окно автоконфигурирования установщика IDE Если процедура автоконфигурирования завершается успешно, то установщик открывает окно «Installer», и предлагает выбрать компоненты устанавливаемые вместе со средой (рис. 9). По–умолчанию устанавливается базовые элементы IDE, поддержка пакетов Java SE и EE, интерпретаторы JavaScript, PHP и HTML (кнопка «Customize»). В случае возникновения ошибок, на экране появится диалоговое окно с сообщением об ошибке и процесс инсталляции прервется. Для перехода к следующему этапу необходимо нажать кнопку «Next». Рис. 9. Окно выбора компонентов установки IDE На следующей странице окна программы–установщика необходимо выбрать пункт «I accept the terms in the license agreement», подтвердив т. о. свое согласие с правилами соблюдения лицензии, затем нажать кнопку «Next» (рис. 10). 16 Рис. 10. Лицензионное соглашение Далее программа–установщик предложит выбрать путь и целевой каталог, в который будет инсталлирована среда (например, для версии IDE 11.3, по–умолчанию установка производится в каталог «C:\Program Files\NetBeans11.3»). При необходимости целевой каталог и диск можно изменить, использовав кнопку «Browse» (рис. 11). Следует обратить особое внимание на путь указанный в текстовом поле «JDK for the Apache NetBeans IDE», поскольку путь должен указывать на каталог, в который ранее был инсталлирован пакет JDK (OpenJDK). Например, если при инсталляции пакета JDK версии 11.0.7 использовался каталог предлагаемый системой по–умолчанию, то в текстовом поле будет автоматически указан каталог «C:\Program Files\Java\jdk-11.0.7». Для перехода к следующему этапу необходимо нажать кнопку «Next». 17 Рис. 11. Каталог установки среды и целевая версия JDK На странице «Summary» представлена окончательная конфигурация среды перед процессом копирования файлов (рис. 12). Для получения автоматических обновлений необходимо установить флажок напротив пункта «Check for Updates» (выбран по–умолчанию). Для начала копирования файлов следует нажать кнопку «Install», после чего начнется непосредственный процесс установки (рис. 13). 18 Рис. 12. Страница «Summary» главного окна инсталлятора Рис. 13. Страница прогресса установки Страница «Setup Complete» (рис. 14) программы–установщика завершает процесс инсталляции IDE. Для закрытия окна необходимо использовать кнопку «Finish». 19 Рис. 14. Завершение процесса инсталляции IDE 20 Создание проекта в среде Apache NetBeans Для создания нового проекта Java в главном окне среды Apache NetBeans необходимо выбрать пункт панели меню «File» «New Project» (рис. 15). Рис. 15. Главное окно IDE В открывшемся окне «New Project» (рис. 16), в списке «Categories» выбрать «Java with Maven»6, а в правом списке «Projects» «Java Application». Подтвердить выбор нажатием кнопки «Next». 6 Apache Maven – фреймворк для автоматизации сборки проектов на основе XML (POM). 21 Рис. 16. Окно «New Project» Если в новоустановленной среде создается первый проект, то система может потребовать загрузки из сети Интернет некоторых компонентов (например, программных библиотек и т.д.), необходимых для сборки программного проекта. Компоненты оформлены в виде отдельных динамически подгружаемых модулей, т. н. плагинов (от англ. «plug–in», подключать). Для загрузки плагинов необходимо нажать кнопку «Download and Activate…» (рис. 17). При создании последующих проектов (с тем же составом компонентов проекта) загрузка больше не потребуется. Рис. 17. Загрузка дополнительных компонентов IDE В открывшемся окне «NetBeans IDE Plugin Installer» будет представлен список автоматически загружаемых плагинов (рис. 18). Практически каждый из 22 загружаемых плагинов предлагает ознакомиться с лицензионным соглашением (рис. 19), после соглашения с которым (пункт «I accept the terms in all of the license agreements.»), выполняется установка плагинов из списка (кнопка «Install»). Рис. 18. Список загружаемых плагинов 23 Рис. 19. Лицензионное соглашение для установки плагина Процесс загрузки (рис. 20) завершается окном с сообщением об успешной установке (рис. 21). Рис. 20. Прогресс загрузки плагинов 24 Рис. 21. Сообщение о завершении установки плагина После загрузки всех необходимых для создания первого проекта плагинов, открывается окно «New Java Application» (рис. 22), в котором можно указать имя нового проекта, путь до каталога сохранения и т. д. Для продолжения следует использовать кнопку «Finish» – будет создан новый проект, при этом структура нового проекта появится во вкладке «Projects», в левой части главного окна (рис. 23). Рис. 22. Окно «New Java Application» 25 Рис. 23. Структура нового проекта В созданный проект необходимо добавить рабочие файлы. Для этого следует использовать пункты меню «File» «New File». В открывшемся окне «New File», в списке «Categories» выбрать «Java», а в правом списке «File Types» «Java Class». Подтвердить выбор нажатием кнопки «Next» (рис. 24). Рис. 24. Создание нового файла в проекте В окне «New Java Class» задать имя нового класса (например, HelloWorld), убедиться в корректности названия проекта, к которому добавляется файл, и нажать кнопку «Finish» (рис. 25). 26 Рис. 25. Создание нового класса Java Двойным нажатием левой клавишей мыши в структуре проекта, выбрать созданный класс (HelloWorld.java), после чего, в главном окне IDE откроется текстовый редактор. Отредактировать класс, добавив в него следующий код: public static void main(String[] args) { System.out.println(“Hello world!”); } Окно редактора с реализацией класса продемонстрировано на рис. 26 27 Рис. 26. Класс HelloWorld Используя клавишу F11 или пункты меню «Run» «Build Project» выполнить предварительную сборку проекта. Успешное завершение сборки проекта будет отражено в текстовом поле «Output» надписью «BUILD SUCCESS». Затем, клавишей F6 или пунктами меню «Run» «Run Project», выполнить запуск приложения. Если приложение запускается в первый раз, необходимо указать главный класс и подтвердить выбор кнопкой «Select Main Class» (рис. 27). В данном примере, главным классом является класс HelloWorld. 28 Рис. 27. Выбор главного класса приложения Java Выполнение приложения приведет к появлению текстового сообщения «Hello world!» в окне «Output» (рис. 28). Рис. 28. Результат исполнения приложения HelloWorld 29 Он-лайн инструменты для программирования на языке Java В сети Интернет существует ряд он-лайн сервисов предоставляющих доступ к компилятору Java через интерфейс веб-браузера. В этом случае компилятор и среда исполнения языка Java размещаются на удаленном вебсервере, а отображение результатов компиляции (и работа самого приложения) происходит в рамках интерфейса веб-браузера. При этом необходимо подчеркнуть, что создать полноценный проект, подобный среде Apache NetBeans, в данном окружении или существенно затруднен, или не представляется возможным в целом, по ряду объективных причин и ограничений. Однако для разработки простых (например, текстовых) программ–приложений на языке Java, средства он-лайн компиляторов допустимы. В качестве примера, можно привести Интернет–службу он–лайн компиляторов и интерпретаторов CodingGround, предназначенную для дистанционного обучения различным языкам программирования. В частности компилятор javac и простейший текстовый он–лайн редактор доступен по гиперссылке https://www.tutorialspoint.com/compile_java_online.php На рис. 29 продемонстрирован интерфейс текстового редактора и окно вывода компилятора javac. Рис. 29. Текстовый редактор он-лайн компилятора Java Веб–страница разделена на две части. В левой части размещается текстовый редактор для набора исходного текста программы. В правой части – окно вывода компилятора. Для запуска программы на исполнение следует использовать кнопку «Execute». В качестве примера, на рис. 30 приведен исходный код и результат работы программы «HelloWorld», рассматриваемой ранее при создании проекта в полноценной среде Apache NetBeans. Рис. 29. Результат работы программы Следует еще раз подчеркнуть, что для разработки полноценных программ и приложений на языке Java, инструменты сервисов он–лайн компиляции не применимы. Данные инструменты предназначены в первую очередь для использования в процессе обучения и демонстрации. 30 Типы данных и переменные языка Java Java является строго типизированным языком программирования. Это означает, что переменная описывается строго определенным типом данных. В табл. 2 продемонстрированы простые типы данных, интегрированные в Java. Т а б л и ц а 2. Простые типы данных Тип Разрядность, Занимаемый данных бит объем памяти, байт byte 8 1 hort 16 2 int 32 4 long 64 8 float 32 4 double 4 8 boolean - - char 6 2 Диапазон допустимых значений –128 до 127 Краткое описание 8-разрядное целое число Короткое целое число -32.768 до 32.767 –2.147.483.648 до Целое число 2.147.483.647 –9.223.372.036.854.775.808 Длинное целое число до 9.223.372.036.854.775.807 Хранит число с –3.4*10^38 до 3.4*10^38 плавающей точкой одинарной точности Хранит число с – +4.9*10^324 до + – плавающей точкой 1.8*10^308 двойной точности Представляет true/false логические значения Хранит одиночный 0 до 65536 символ в кодировке Unicode Первые четыре типа данных (byte, short, int и long) – это целочисленные типы данных, т. е. они хранят целые числа. Объявление переменных Переменные объявляются следующим образом: тип_данных, затем имя_переменной. Например, int x, int y, double z и т. д. В качестве имени переменной может выступать любое произвольное название, которое удовлетворяет следующим требованиям: имя может содержать любые алфавитно-цифровые символы, а также знак подчеркивания, при этом первый символ в имени не должен быть цифрой; в имени не должно быть знаков пунктуации и пробелов; имя не может быть ключевым (зарезервированным) словом языка Java. Помимо этого, Java является регистрозависимым языком. Поэтому если объявить переменную как int rest и int REST, то это будут две разные переменные. Объявив переменную, мы можем тут же присвоить ее значение или инициализировать ее. Инициализация переменных представляет присвоение переменной начального значения, например: int x=5. Знак равенства, в 31 данном случае, читается как ―Икс имеет значение 5‖. Если мы не проинициализируем переменную до ее использования, то мы можем получить ошибку: int test; System.out.print(test); В данном случае переменная test не инициализирована и, соответственно, никакое значение переменной не будет выведено на экран. Объявление констант Значение всех переменных можно менять сколько угодно раз, по мере необходимости. Чтобы избежать возможных нежелательных изменений, прибегают к объявлению констант. Константы в Java объявляются с помощью ключевого слова final. Пример: final int z = 5; После этого, мы уже не сможем изменить значение переменной z в другом участке кода, так как z – константа. Символы и строки В качестве значения переменная символьного типа получает одиночный символ, заключенный в одинарные кавычки: char m='r'. Кроме того, переменной символьного типа также можно присвоить целочисленное значение от 0 до 65536. В этом случае переменная опять же будет хранить символ, а целочисленное значение будет указывать на номер символа в таблице символов Unicode. Одинарные и двойные кавычки имеют существенные отличия. Нельзя заключить переменную символьного типа в двойные кавычки, так как это уже будет переменная строкового типа String. Грубо говоря, „r‟ не идентично “r”. Переменные строкового типа не относятся к примитивным (простым) типам данных. Контрольные вопросы и практические задания: 1) Какое основное практическое отличие типов данных с плавающей точкой Double и Float? Почему на практике чаще используется тип данных Int нежели Long? 2) Какой будет результат выполнения двух следующих фрагментов и в чем их основное отличие? class Test1 { public static void main(String[] args) { byte a = 15; byte b = a; System.out.println(b); } } class Test2 { public static void main(String[] args) { 32 byte a = 15; int b = a; System.out.println(b); } } 3) Решите задачу: «Определить Ваш вес на Марсе, зная что сила тяжести на нем примерно 3,711 м/с2». 4) Решите задачу: «Вы стоите в поле и вдруг увидели вспышку молнии. Через 8 с. раздался раскат грома. Необходимо написать программу, которая рассчитывает расстояние от вашего местоположения до грозы». Реализуйте программу, используя пример решения следующий далее. Пусть t =8 с, а скорость звука в воздухе V =340.29 м/c. Тогда, зная время и скорость, найдем расстояние S по формуле S = V * t. Реализуем данную задачу программным методом. Для начала откроем главный класс, назовем его Rest_1. Public class Rest_1 { //создаем класс } Следующим шагом создадим метод, который будет служить точкой входа в программу для компилятора. public static void main (String args []) { } Далее определимся с типами данных и переменными, которые мы будем использовать. Обозначим время как int t и передадим ей значение 8 с. Для скорости определим тип double – так как скорость задана с точностью до сотых, чтобы обеспечитьточность расчетов, используем соответствующий тип данных. Также необходимо определить тип данных и выделить переменную под дистанцию. Определим ее как double (см. выше) и дадим ей имя dist. int t = 8; double v = 340.29, dist; Зададим в программе ее вычисление по формуле: dist = v * t; Выведем полученный результат на экран, с помощью соответствующего метода. System.out.println метров”); (“Расстояние равно = ” + dist + “ Не забывайте конкатенировать значения и закрывать методы и классы. Ниже полностью приведен исходный код программы. public class Rest_1 {//создаем класс public static void main(String[] args) { int t = 8;//инициализируем переменную double v = 340.29, dist; dist = v * t; 33 System.out.println ("Расстояние равно метров"); //Выводим результат на экран } } = " + dist + " Результатом работы данной программы будет: «Расстояние равно = 2722.32 метров». Основные операторы Арифметические операции языка Java во многом идентичны операциям в других языках программирования. По типу они подразделяются на следующие: унарные − операции с одним операндом; бинарные − операции с двумя операндами; тернарные − операции с тремя операндами. Синтаксис основных арифметических операторов приведен в табл. 3. Т а б л и ц а 3. Арифметические операторы Оператор + – * / Пример z=x+y z=x-y z=x*y z=x/y Описание Сложение Вычитание Умножение Деление % z=x%y Остаток от деления Увеличение переменной на единицу; сначала z = ++x переменная x Префиксный инкремент увеличивается на единицу, а затем присваивается z ++ Увеличение переменной на единицу; сначала z =x++ переменная x Постфиксный инкремент присваивается z, а затем увеличивается на единицу. –– z = --x Обратно префиксному Префиксный декремент инкременту z = x-Постфиксный декремент Обратно постфиксному инкременту Синтаксис операторов арифметического сравнения приведен в табл. 4. 34 Оператор Т а б л и ц а 4. Операторы арифметического сравнения Пример == z=x==y != z = x != y < z = x<y > z = x>y <= z = x<= y >= z = x>= y Описание Переменная z имеет значение true, если x и y равны, иначе false Переменная z имеет значение true, если x и y не равны, иначе false Переменная z имеет значение true, если x меньше y, иначе false Переменная z имеет значение true, если x больше y, иначе false Переменная z имеет значение true, если x меньше или равно y, иначе false Переменная z имеет значение true, если x больше или равно y, иначе false Синтаксис операторов логического сравнения приведен в табл. 5. Т а б л и ц а 5 . Операторы логического сравнения Оператор Пример | z=x|y & z=x&y ^ z=x^y ! z != x || z = x || y && z = x && y Описание Переменная z имеет значение true, если x или y, или они одновременно имеют значение true, иначе false Переменная z имеет значение true, если x и y одновременно имеют значение true, иначе false Переменная z имеет значение true, если x или y (но не одновременно) имеют значение true, иначе false Переменная z имеет значение true, если x имеет значение false, иначе false Переменная z имеет значение true, если x или y, или они одновременно имеют значение true, иначе false Переменная z имеет значение true, если x и y одновременно имеют значение true, иначе false 35 Представленные операции z = x | y и z = x || y (z = x&y и z = x&&y) выполняют одни и те же действия, приводят к одному и тому же результату, но имеют совершенно разный подход. Исходя из условия, операция z = x | y передаст переменной z значение true, если x или y, или они одновременно имеют значение true, в противном случае false. Данная операция проверит каждый операнд и выдаст конечный результат. А операция z = x || y проверит до первого удовлетворяющего (или неудовлетворяющего значения). Сперва вычисляется значение x, и если оно имеется значение true, то вычисление y уже не имеет смысла, исходя из условия, и переменной z будет передано значение true. Аналогичный принцип и для операций z = x&y и z = x&&y. Синтаксис операторов присваивания приведен в табл. 6. Т а б л и ц а 6 . Операторы присваивания Оператор Пример += z += x -= z -= x *= z *= x /= z /= x %= z %= x Описание Переменной z присваивается значение сложения z и x Переменной z присваивается значение вычитания z и x Переменной z присваивается значение произведения z и x Переменной z присваивается значение деления z и x Переменной z присваивается остаток от деления z на x Контрольные вопросы и практические задания: 1) Одинаковы ли следующие логические операции: c = a | b и c = a || b? Ответ обоснуйте. 2) Что выведет следующая программа? Дайте пояснения к своему ответу. public class Main { public static void main(String[] args) { String s = "ОДИН" + 1 + 14 + "ДВА" + 4 +"ТРИ" + 7 + 3 + "ЧЕТЫРЕ" + "ПЯТЬ" + 6 + 3 + 2 + "ШЕСТЬ"; System.out.println (s); }} 3) Что выведет ответу. следующая i = 5; i = i++ + ++i; System.out.println(i); 36 программа? Дайте пояснения к своему 5) Напишите программу, которая вычисляет гипотенузу прямоугольного треугольника по двум катетам. Необходимо разрешить пользователю самостоятельный ввод значений. Реализуйте программу, используя пример решения следующий далее. Известно, что гипотенуза определяется по следующему правилу: «Квадрат длины гипотенузы равен сумме квадратов длин катетов». Пусть a, b– катеты, а c – гипотенуза. Реализуем данное правило в программе. Импортируем метод Scanner из библиотеки util для того, чтобы реализовать функцию считывания данных с клавиатуры (методы импортируются до создания класса). import java.util.Scanner; Затем, создадим класс с именем, например, Pifagor и сразу же создадим метод, который будет служить точкой входа в программу для компилятора. public class Pifagor { public static void main(String[] args) { } } Следующим шагом выделим память под объект Scanner, который использует метод System.in (поток на вход). Scanner in = new Scanner (System.in); Далее выведем информативное сообщение для пользователя с предложением ввести значения катетов по средствам System.out (поток вывода) и считываем все введенные значения с помощью метода in.nextDouble(); (double, потому что мы используем соответствующий тип данных; к примеру, если бы мы использовали int, то было бы in.nextInt();). Существует также метод hasNextDouble(), применѐнный к объекту класса Scanner, он проверяет, можно ли считать с потока ввода вещественное число типа double, а метод nextDouble() — считывает его. Если попытаться считать значение без предварительной проверки, то во время исполнения программы можно получить ошибку (отладчик заранее такую ошибку не обнаружит). System.out.println("Введите значение длины катета"); double a = in.nextDouble(); System.out.println("Введите значение длины второго катета"); double b = in.nextDouble(); первого Теперь можно найти значение гипотенузы. Для того чтобы возвести число в степень, мы используем функцию Math.pow (x, y);, где x – число, которое мы должны возвести в степень, а y–степень, в которую необходимо возвести число. Для квадратного корня существует функция Math.sqrt ();, где в круглых скобках указывается значение, из которого нужно извлечь квадратный корень. double c = Math.pow(a, 2) + Math.pow(b, 2); 37 System.out.println("Гипотенуза равна = " + Math.sqrt (c)); Ниже полностью приведен исходный код программы. import java.util.Scanner;//подключаем библиотеку public class Pifagor { public static void main(String[] args) { Scanner in = new Scanner (System.in); System.out.println("Введите значение длины первого катета"); double a = in.nextDouble();//считываем значение а System.out.println("Введите значение длины второго катета"); double b = in.nextDouble();//считываем значение b double c = Math.pow(a, 2) + Math.pow(b, 2); System.out.println("Гипотенуза равна = " + Math.sqrt (c)); } } Данную программу можно упростить, к примеру, можно не выделять отдельную переменную для гипотенузы и не использовать функцию Math.pow (x, y);. import java.util.Scanner; public class Pifagor { public static void main(String[] args) { Scanner in = new Scanner (System.in); System.out.println ("Введите значение длины первого катета"); double a = in.nextDouble(); System.out.println ("Введите значение длины второго катета"); double b = in.nextDouble(); System.out.println("Гипотенуза равна = " + Math.sqrt (a*a + b*b)); } } Исходя из определения, что квадрат числа – это исходное число, умноженное само на себя, имеем право записать a*a, что никак не повлияет на результат выполнения программы. Условные инструкции Условные инструкции – важный инструментарий языка Java. Условные инструкции позволяют направить программу по определенному пути развития, в зависимости от условий. Условные инструкции бывают двух типов: if/else; switch/case. Данные инструкции идентичны друг другу, за одним исключением – в отличие от инструкции if/else, инструкции switch/case может обрабатывать сразу несколько условий. 38 Рассмотрим первую условную инструкции if/else. Она имеет следующий синтаксис: if(условие){ код, выполняющийся при удовлетворении условия; } else{ «запасной выход»; Если условие, которое содержит в себе блок if, истинно, то выполняется код, который хранит данный блок. В этом случае, блок else не выполняется! Равно и обратное. Пример: int chn = 2; int chz = 5; if(chn>chz){ System.out.println(chn + “больше, чем” + chz); } else if(chn<chz){ System.out.println(chn + “меньше, меньше” +chz);} else{ System.out.println(chn + “и” + chz + “равны”);} В данном примере, мы рассматриваем сравнение двух чисел между собой. Вначале присваиваем значения переменным и задаем различные пути развития с помощью if/else. Обратите внимание, что здесь мы использовали оператор else if. Он может применяться, если у нас существует более двух условий. Хотя для обработки нескольких условий иногда целесообразнее использовать конструкцию switch/case. Инструкция switch/case, как уже говорилось ранее, предназначена для обработки сразу нескольких условий. Пример: int chn = 2; switch(chn){ case 4: System.out.println("Ответ#1"); break; case 5: System.out.println("Ответ#2"); break; case 2: System.out.println("Ответ#3"); break; case 3: System.out.println("Ответ#4"); break; default: System.out.println("Нечего отвечать"); } В данном примере после switch идет сравниваемое значение. Значение последовательно сравнивается со значениями блока case. Если есть совпадение, то выполняется код, помещенный в соответствующий блок case. 39 Контрольные вопросы и практические задания: 1) Что выведет этот код при a = 5, b = 5 и c = 1? Ответ обоснуйте. if (a + b > c) { if (a < c) System.out.println(a); } else if (b < c) { System.out.println(b); } else { System.out.println(c); } 2) Напишите программу: если переменная a больше 2-х и меньше 11-ти, или переменная b больше или равна 6-ти и меньше 14-ти, то выведите 'Верно', в противном случае выведите 'Неверно'. 3) Напишите программу, которая решает квадратные уравнения вида, ax2 + bx + c = 0. При отрицательном дискриминанте решением можно пренебречь и вывести соответствующее сообщение. Необходимо разрешить пользователю вводить свои значения с клавиатуры. Реализуйте программу, используя пример решения следующий далее. При решении квадратных уравнений могут возникнуть три состояния: дискриминант больше нуля. В таком случае, корни квадратного уравнения определяются по известной формуле: дискриминант равен нулю. В этом случае имеется два одинаковых вещественных корня квадратного уравнения, которые определяются по аналогичной формуле, указанной выше; дискриминант меньше нуля. Если дискриминант меньше нуля, значит, квадратное уравнение не имеет вещественных корней и они комплексные. Так как в условии сказано, что данным путем развития можно пренебречь, для него выведем соответствующее информативное сообщение. Импортируем метод Scanner из библиотеки util для того, чтобы реализовать функцию считывания данных с клавиатуры. import java.util.Scanner; Затем создадим класс с именем RKU и метод, который будет служить точкой входа в программу для компилятора, выделим память под объект Scanner, который использует метод System.in (поток на вход) и инициализируем переменные. public class RKU { public static void main(String[] args) { Scanner in = new Scanner(System.in); int a, b, c, d; double x1, x2; } 40 } Далее выведем информационное сообщение о формате решаемых уравнений и сообщение для пользователя с предложением ввести значения коэффициентов уравнения посредством System.out (поток вывода) и считываем все введенные значения с помощью метода in.nextInt(); System.out.println("Данная программа решает уравнения вида: ax^2 + bx + c = 0"); System.out.println("Введите а: "); a = in.nextInt(); System.out.println("Введите b: "); b = in.nextInt(); System.out.println("Введите c: "); c = in.nextInt(); System.out.println("Ваше уравнение имеет вид: " +'\n'+ a + "x^2" + "+" + b + "x" + "+" + c + " =0"); В конце мы вывели на экран уравнение, которое ввел пользователь. Определим формулы расчета дискриминанта и корней квадратного уравнения (в зависимости от значения дискриминанта). d = (int) (Math.pow(b, 2) (4 * a * c)); System.out.println("Дискриминант равен = " + d); if (d > 0){ x1 = ((-1) * b + Math.sqrt(d)) / 2 * a; x2 = ((-1) * b Math.sqrt(d)) / 2 * a; System.out.println("Корни квадратного уравнения: " + '\n' + "x1 = " + x1 + '\n' + "x2 = " + x2); } else if (d==0) { x1 = ((-1) * b / 2 * a; System.out.println("Так как d = 0, у нас одинаковых вещественных корня уравнения: " + '\n' + + '\n' + "x2 = " + x2); } else System.out.println("Квадратное уравнения не вещественных корней"); имеется два "x1 = " + x1 имеет Полный исходный код данной программы приведен ниже. import java.util.Scanner; public class RKU { public static void main(String[] args) { Scanner in = new Scanner(System.in); int a, b, c, d; double x1, x2; System.out.println("Данная программа решает уравнения вида: ax^2 + bx + c = 0"); System.out.println("Введите а: "); a = in.nextInt(); System.out.println("Введите b: "); 41 b = in.nextInt(); System.out.println("Введите c: "); c = in.nextInt(); System.out.println("Ваше уравнение имеет вид: " +'\n'+ a + "x^2" + "+" + b + "x" + "+" + c + "+" + " =0"); d = (int) (Math.pow(b, 2) - (4 * a * c)); System.out.println("Дискриминант равен = " + d); if (d > 0){ x1 = ((-1) * b + Math.sqrt(d)) / 2 * a; x2 = ((-1) * b - Math.sqrt(d)) / 2 * a; System.out.println("Корни квадратного уравнения: " + '\n' + "x1 = " + x1 + '\n' + "x2 = " + x2); } else if (d==0) { x1 = ((-1) * b / 2 * a; System.out.println("Так как d = 0, у нас имеется два одинаковых вещественных корня уравнения: " + '\n' + "x1 = " + x1);// „\n‟ – оператор переноса строки } else System.out.println("Квадратное уравнения не имеет вещественных корней"); } } Инструкции циклов Цикл for выполняет роль счетчика. Задается цикл следующим образом: for ([инициализация счетчика]) { //любые действия } счетчика]; [условие]; [изменение Как мы видим, цикл поделен на три составляющие: инициализация, условие и изменение. Рассмотрим данный цикл на примере for (int i = 1; i < 7; i++){ //любые действия } В инициализации у нас указана int i = 1, т. е. создание счетчика. Значение i будет равно 1 перед началом цикла. Тип данных может быть любой и необязательно integer, что зависит от требований к точности вычислений. Условие – цикл будет выполняться, пока счетчик не достигнет значение «7». И, наконец, изменение – при работе цикла, значение счетчика будет постоянно увеличиваться на 1 (инкремент). Цикл do сначала выполняет код тела цикла, а потом проверяет условие в инструкции while. И пока это условие истинно, цикл повторяется. Например: int x = 14; do{ System.out.println(x); 42 x--; } while (x > 0); В данном случае код цикла сработает 14 раз, пока x не окажется равным нулю. Важно отметить, что цикл do гарантирует хотя бы однократное выполнение действий, даже если условие в инструкции while не будет истинно. Цикл While сначала проверяет истинность условия. Если оно истинно, то код выполняется. int x = 14; while (x > 0){ System.out.println(x); x--; } В качестве примера попробуем вывести последовательность чисел от 1 до 100 с помощью цикла while: public class Use { public static void main(String[] args) { // Ниже объявляем переменную и задаем цикл int ch = 1; while (ch <= 100){ System.out.println(ch); ch++; } } } Контрольные вопросы и практические задания: 1) Какие действия выполняет оператор break? 2) Необходимо вывести на экран таблицу умножения на выбранное пользователем число используя возможности цикла while и библиотеку Scanner. 6) Дан одномерный массив целых чисел, например {14, 27, 8, 16, 59, 121, 256, 45, 89, 1024}. Напишите программу, которая отсортирует данный массив по убыванию, исключив все те значения, которые больше некоторого значения, например, «98». Реализуйте программу, используя пример решения следующий далее. public class Test { public static void main(String[] args) { int a [] = {14, 27, 8, 16, 59, 121, 256, 45, 89, 1024}; for (int i=0; i<10; i++){ for (int j = 9; j>i; j--){ if (a[i]<a[j]){ int b = a[i]; a[i] = a[j]; a[j] = b; } } if (a[i]<98) System.out.println(a[i]); } 43 } Массивы Массивы – набор однотипных значений, в то время как переменная – одиночное значение. Массивы подразделяются на одномерные и многомерные. Одномерный массив представляет собой фиксированное число однотипных элементов, которые объединены под одним именем. Инициализируются массивы практически так же, как и переменные – указывается тип данных и наименование массива. Единственное, что используется ключевое слово new – оно выделяет память для соответствующих элементов, идущих после ключевого слова. Пример: int [] test = new int [6]; В данном примере мы инициализировали массив с шестью элементами. Важно понимать, что в квадратных скобках указывается количество элементов массива, а не конкретное значение. Также мы можем присвоить конкретному элементу свое значение: int [] test = new int [6]; test [0] = 51; test [1] = 52; test [2] = 132; test [3] = 5; test [4] = 18; test [5] = 9; Следует учесть, что нумерация элементов массива начинается с 0, а не с 1. Поэтому, чтобы обратиться к пятому элементу массива, нам нужно указать test[4]. В примере одномерного массива видно, что для того, чтоб обратиться ко всем элементам массива, нам приходится повторять однотипные действия. Соответственно, мы могли бы заполнить массив нужными элементами с помощью цикла: for(int i=0; i<=5; i++){ test[i] = (i+1) * 10; } Длину любого созданного массива не обязательно запоминать, потому что имеется свойство, которое его хранит. Обратиться к этому свойству можно дописав .length к имени массива. Например: int size = test.length; Это свойство нельзя изменять (т. е. ему нельзя ничего присваивать), можно только читать. Используя это свойство можно писать программный код для обработки массива даже не зная его конкретного размера. Для обработки массивов всегда используются циклы типа «n–раз» (for) потому, что нам заранее известно сколько раз должен повториться цикл (столько же раз, сколько элементов в массиве). 44 Еще одним вариантом заполнения массива значениями является метод Math.random, который в Java используется для генерации случайного числа в диапазоне от 0.0 до 1.0. Различные диапазоны могут быть достигнуты с помощью арифметических операций. Пример заполнения массива случайными значениями в диапазоне [15; 30) (30 – не входит в данный диапазон, максимальное значение: 29): int[] array = new int[12]; for (int i = 0; i < array.length; i++) { array[i] = (int) ((Math.random() * 15) + 15); System.out.println(array[i]);} Многомерный массив – это таблица, состоящая из m строк и n столбцов, также известный в математике как матрица. Инициализируется такой массив следующим образом: //Первый вариант инициализации int [][] test = new int [6] [6]; //Второй вариант инициализации int [][] test = {{0,1,2,3,4,5}, {6,7,8,9,10,11}}; Оба варианта инициализации абсолютно равнозначны. В первом варианте инициализации мы создаем массив размером 6×6 элементов, значения которых будут равны 0. Во втором случае мы создаем массив размером 6×6 элементов, но уже с конкретными значениями. Контрольные вопросы и практические задания: 1) Напишите программу, в которой необходимо найти максимальный элемент в массиве из случайно сгенерированных чисел. 2) Напишите программу, в которой реализуется алгоритм «пузырьковой сортировки». Реализуйте программу, используя пример решения следующий далее. public static void bubbleSort(int[] arr){ /* Внешний цикл каждый раз сокращает фрагмент массива, так как внутренний цикл каждый раз ставит в конец фрагмента максимальный элемент. */ for(int i = arr.length-1 ; i > 0 ; i--){ for(int j = 0 ; j < i ; j++){ /* Сравниваем элементы попарно, если они имеют неправильный порядок, то меняем местами. */ if( arr[j] > arr[j+1] ){ int tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } 45 } } } Перехват и обработка ошибок Иногда в процессе выполнения программы, могут возникнуть различного рода ошибки. Они могут «всплыть» как по вине разработчика, так и без его участия. Данные ошибки называются исключениями. В языке Java предусмотрены специальные инструменты для обработки подобных ситуаций. Одним из таких инструментов является конструкция try/catch/finally. При возникновении исключения в блоке try управление переходит в блок catch, который может обработать данное исключение. Блок finally является независимым. Он выполняется в любом случае – возникло исключение или же нет. Оператор throw позволяет разработчику создавать и обрабатывать собственные исключения. Для примера напишем программу, которая «перехватит» и обработает исключение, возникающее при выходе за границы массива: int[] numbers = new int[4]; try{ numbers[5]=12; } catch(ArrayIndexOutOfBoundsException ex){ System.out.println("Выход за границы массива"); } finally{ System.out.println("Выведется в любом случае"); } Контрольные вопросы и практические задания: 1) Написать программу для ввода пароля. Защитить программу от ввода неправильных данных. Например, пароль может содержать только тип данных integer. 2) Какие практические примеры исключений вы знаете? (Например, из математики). 3) Напишите программу, которая считывает данные из файла и выводит их на экран. В случае если файла нет, то программа должна «перехватить» и обработать данное исключение. Реализуйте программу, используя пример решения следующий далее. import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; public class tr { public static void main( String[] 46 args ) throws FileNotFoundException, IOException { File file = new File( "C:\\test.txt" ); String name = file.getPath(); System.out.println(name); BufferedReader br = new BufferedReader ( new InputStreamReader( new FileInputStream( file ), "UTF-8" ) ); String line = null; while ((line = br.readLine()) != null) { System.out.println( line ); } br.close(); } } 47 Контрольное задание 1) Для закрепления теоретического материала, с помощью интегрированной среды разработки Apache NetBeans (или среды онлайн компилятора), выполнить практические задания и примеры, приведенные в конце каждого раздела пособия. 2) Используя список задач для самостоятельной разработки (см. далее), реализовать набор программ соответствующих заданным условиям. Решение каждой задачи должно включать в себя: блок–схему алгоритма решения задачи; исходный текст программы на языке Java; экранный снимок результата работы (вычисления) программы. 3) Согласно требованиям, изложенным в разделе «Правила оформления отчета», оформить отчет по результатам выполнения работы. К отчету приложить файлы с исходными текстами программ или проект среды Apache NetBeans. Список задач для самостоятельной разработки 1) Создать массив случайных чисел длиной n. Определить индексы тех элементов, значения которых превосходят некоторый порог x, введенный пользователем. Размер массива и значение порога определяется пользователем при выполнении подпрограммы. Учесть проверку корректности данных вводимых пользователем. 2) Создать двумерный массив (матрица) размерностью n×m, содержащий случайные целые числа. Определить максимальное и минимальное значение элементов массива. Вычислить сумму элементов для каждой строки и столбца. Вывести исходную матрицу и результат вычислений в диалоговом окне. Размер матрицы определяется пользователем при выполнении подпрограммы. Учесть проверку корректности данных вводимых пользователем. 3) Создать одномерный массив случайных чисел длиной n, и обратить порядок следования элементов (элемент с индексом 0 записать в ячейку n, элемент с индексом 1 записать в ячейку n-1 и т.д.). Вывести оба массива в диалоговом окне построчно. Размер массива определяется пользователем при выполнении подпрограммы. Учесть проверку корректности данных вводимых пользователем. 4) Задан одномерный массив вещественных чисел длиной n. Значение элементов массива генерируется случайным образом в диапазоне от ±x до ±y. Вычислить сумму элементов массива, и рассчитать среднее арифметическое значение массива. Размер массива и диапазон генерирования случайных значений определяется пользователем при выполнении подпрограммы. Учесть проверку корректности данных вводимых пользователем. 48 5) Заданы два одномерных массива вещественных чисел длиной n. Значение элементов массивов генерируется случайным образом в диапазоне от ±x до ±y. Рассчитать сумму попарных элементов массивов и записать результат в новый массив. Вывести значение трех массивов в диалоговом окне. Размер массивов и диапазон генерирования случайных значений определяется пользователем при выполнении подпрограммы. Учесть проверку корректности данных вводимых пользователем. 6) Заданы два двумерных массива вещественных чисел размерность n×n, представляющие собой квадратные матрицы. Значение элементов матриц генерируется случайным образом в диапазоне от ±x до ±y. Рассчитать произведение матриц и вывести исходные матрицы и результат в диалоговом окне. Размер матриц и диапазон генерирования случайных значений определяется пользователем при выполнении подпрограммы. Учесть проверку корректности данных вводимых пользователем. 7) Разработать подпрограмму для расчета значений площади и длины окружности заданного радиуса. Выбор цели расчета (площадь или длина) и значение радиуса определяется пользователем при исполнении подпрограммы. Учесть проверку корректности данных вводимых пользователем. 8) Реализовать подпрограмму для воспроизведения игры «Угадай число». Пользователь должен угадать число, выбранное программой случайным образом, используя подсказки программы («больше» или «меньше»). Диапазон загадываемых чисел определяется пользователем при исполнении программы. Программа выполняется в цикле до тех пор, пока либо пользователь не угадает число, либо не откажется от игры (например, с помощью ввода ключевого слова «Сдаюсь!»). 9) Разработать программу генерирующую календарь дней заданного пользователем месяца и года. Значение месяца может вводиться в виде числа (1–12) или в виде сокращенной строки («Янв.»–«Дек.»). Значение года вводится в виде числа в диапазоне 1900–2100. Дни месяца должны выводиться в диалоговом окне в виде таблицы по неделям, т.е. максимум 7 столбцов в строке. 10) Разработать программу расчета стоимости товарных запасов на складе, для заданного пользователем товара рассчитать стоимость остатка на складе (стоимость_за_шт × кол–во). Создать три одномерных массива: Массив строк с названием товара (например, «оптоэлемент»); Массив целых чисел со значением количества данного товара; Массив вещественных чисел со значением стоимости данного товара. 49 Правила оформления отчета Отчет по контрольным заданиям формируется в электронном виде. В результате выполнения контрольных заданий должен быть создан архив (рекомендуемый формат zip или 7z), содержащий файлы с исходными текстами разработанных программ (или проект среды Apache NetBeans) и отчет в формате PDF (см. шаблон далее). Файл отчета включает в себя титульный лист, исходные тексты разработанных программ, блок-схемы алгоритмов работы программ и экранные снимки результата исполнения данных программ. Требования к форматированию текстового документа: поля страницы 2 см., гарнитура – Times New Roman, размер шрифта – 14 pt. Экранные снимки вставляются в отчет в виде иллюстраций (рисунков) с подписью в форме краткого комментария демонстрируемого процесса. Отчеты, оформление или содержание которых не соответствует требованиям данного раздела и пунктам практических заданий не принимаются. Предпочтительно придерживаться следующего шаблона именования файлов отчета: «Группа_Фамилия_ИО». 50 Отчет к контрольной работе «Введение в алгоритмизацию и программирование на языке Java» дисциплина «Алгоритмизация и программирование» Номер группы, Фамилия И.О. 1) Исходный текст программы №1 «Сортировка элементов массива» public static void MySort(int[] arr){ for(int i = arr.length-1 ; i > 0 ; i--){ for(int j = 0 ; j < i ; j++){ /* Исходный текст программы */ … … } } Рис.2. Алгоритм работы программы и результат вычислений 2) Исходный текст программы №2 … 51 Литература 1. Официальный сайт Oracle [Электронный ресурс]: https://www.oracle.com/java/ technologies/javase-downloads.html 2. Сеттер, Р. В. Изучаем Java на примерах и задачах [Электронный ресурс]/ Р. В. Сеттер. – СПб.: Наука и Техника, 2016. – 240 c. – Режим доступа: http://www.iprbookshop.ru/44025, по паролю. 3. Герберт, Шилдт. Java 8: The Complete Reference/ Шилдт Герберт. – М.: Вильямс, 2015. – 1376 с. 4. Брюс, Эккель. Философия Java/ Эккель Брюс. – СПб.: Питер, 2015. – 1168 c. 5. Роберт, Седжвик. Алгоритмы на Java / Седжвик Роберт, Уэйн Кевин. – М.: Вильямс, 2013. – 848 с. 6. Роберт, Лафоре. Структуры и алгоритмы Java/ Лафоре Роберт. – СПб: Питер, 2013. – 714 с. 7. Небаев, И. А. Экономическая информатика: методические указания для выполнения контрольной работы — СПб: ГУПТД, 2020. — 137 с. 52