Основы программирования с Java

Размер шрифта:   13
Основы программирования с Java

Введение. Что такое хорошо определенные задачи

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

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

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

Что мы подразумеваем под четко определенной задачей.

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

Рис.43 Основы программирования с Java

Например, если вас попросили найти решение арифметического выражения "1 умножить на 2 плюс 3", вы бы знали, что мы должны сначала умножить 1 на 2, что дает промежуточный результат 2, и тогда результат умножения будет добавлен к 3, и 5 будет в качестве окончательного ответа.

Но если я попрошу вас решить задачу "1 плюс 2 умножить 3", я хочу, чтобы вы подумали о том, каким может быть ответ.

Разные люди могут давать различные ответы, потому что некоторые могут подумать, что умножение должно быть выполнено до прибавления, что во первых надо умножить 2 на 3, что дает 6 в качестве промежуточного результата, а затем добавить 6 к 1, и это дает 7 в качестве окончательного ответа, но некоторые могут просто следовать порядку операторов в арифметическом выражении, в этом случае мы сначала добавим 1 к 2, и это дает 3 в качестве промежуточного результата, и затем умножим 3 на 3, и получим 9 как конечный результат.

Так какой из этих двух ответов является правильным ответом?

Это зависит от того, какие правила должны быть использованы при определении порядка операций.

И мы вернемся к этому вопросу позднее.

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

И вы можете реализовать решения задач с помощью Java в интегрированной среде разработки (IDE).

Есть много доступных языков программирования, и Java является лишь одним из них.

Язык Java является объектно-ориентированным языком. И вы должны научиться основам абстракции данных с помощью объектно-ориентированного программирования.

Поговорим немного о том, что такое абстракции данных.

Рис.54 Основы программирования с Java

Абстракция данных отделяет существенные свойства объектов данных от деталей того, как они реализуются, то есть, детали реализации объектов данных скрыты от пользователей.

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

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

На человеческом языке, наиболее часто используемая система чисел – это арабские цифры 0, 1, … 9, но есть и римские цифры, обратите внимание, что только три символа, вертикальная черточка, V и крест используются для представления чисел от 1 до 10, и нет никакой специальной римской цифры для нуля.

Есть также китайские цифры и многие другие. И в компьютерах, числа представляются нулем и 1.

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

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

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

Но при этом мы не заботимся о механике, как это работает.

При использовании приложений на смартфонах, скажем iPhone, все, что вам нужно знать, это только то, что приложения должны делать, но вам действительно все равно, как они были фактически реализованы.

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

С помощью этого подхода, даже если реализация изменяется через некоторое время, поведение объекта данных или программы, как ожидается, останется прежним.

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

Информатика является дисциплиной, изучающей теорию, дизайн и применения вычислительных систем.

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

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

Изучение программного обеспечения включает в себя рассмотрение поведения алгоритмов, компьютерных программ, чтобы определить, работают ли они правильно и эффективно.

В центре внимания данной книги – программное обеспечение компьютерных систем.

В конце концов, основное использование компьютеров, это решение реальных задач.

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

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

И вы сможете применить эти понятия для решения реальных задач.

Аппаратные средства

Давайте начнем рассмотрение основных компонентов компьютерных систем. И начнем мы с аппаратных средств.

В общем и целом, есть два основных компонента в компьютере, а именно аппаратные и программные компоненты.

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

Он назывался ENIAC. ENIAC означает электронный цифровой интегратор и компьютер.

Рис.73 Основы программирования с Java

Как вы можете видеть на этом слайде, ENIAC был большой машиной, которая весила более 30 тонн, содержала приблизительно 18000 вакуумных трубок, и размещалась в большой комнате 180 квадратных метров.

Если сравнивать с сегодняшним компьютером, вы увидите, что компьютерный чип, который используется в вашем мобильном телефоне, во много-много раз более мощный, чем ENIAC.

Существует важное наблюдение, сделанное Гордоном Муром, сооснователем Intel, он предсказал в 1965 году, что мощность компьютерного чипа удваивается примерно каждые 18 месяцев.

Это наблюдение еще работает и сегодня.

Это имеет некоторые очень важные последствия, потому что задача, которая требует одну минуту времени обработки, используя сегодняшнюю машину, потребовала бы более 40 лет времени обработки с помощью компьютера, разработанного 40 лет назад, то есть, машина все равно бы не выполнила задачу после 40 лет.

В общем и целом, компьютер представляет собой электронное устройство, которое работает под управлением команд (или программ), хранящихся в запоминающем устройстве.

Рис.25 Основы программирования с Java

Диаграмма здесь иллюстрирует поток данных с помощью различных аппаратных компонентов.

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

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

Эту модель вычислений часто называют хранимой программой компьютера.

Основным компонентом компьютера является центральный процессор, который считается мозгом компьютера.

Рис.11 Основы программирования с Java

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

Центральный процессор получает инструкции из памяти и выполняет вычисление данных.

И ЦП, как правило, состоит из двух частей, а именно, это арифметико-логическое устройство и блок управления.

Рис.39 Основы программирования с Java

Арифметико-логическое устройство ALU отвечает за вычисления, в том числе основных арифметических операций, таких как сложение, вычитание, умножение и деление, и логической оценки данных, в том числе логических сравнений, таких как "равно", "больше чем" или "меньше чем".

Блок управления контролирует и координирует общие операции внутри компьютера.

Основные функции блока управления включают в себя:

Управление доступом к главной памяти хранения.

Управление последовательностью, в которой команды выполняются.

Регулирование времени всех операций, осуществляемых в CPU.

Отправка и прием сигналов управления в и из периферийных устройств, таких как клавиатура и принтер.

Управление потоком данных между АЛУ и основной памятью.

Существует три вида памяти для работы компьютера.

Рис.49 Основы программирования с Java

Это память, которая находится внутри процессора, и которая известна как «регистр».

Регистры, это быстрая память для хранения данных, которые процессор в настоящее время обрабатывает.

Все данные должны быть сохранены в регистре, прежде чем они могут быть обработаны.

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

Это основная память, которая также известна как оперативное запоминающее устройство (ОЗУ), которая содержит инструкции программы и данные для программы.

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

Устройства ввода несут ответственность за получение информации от пользователей.

Самым распространенным устройством ввода является клавиатура, которая стала стандартным устройством для большинства компьютеров.

Кроме того, существуют и другие устройства ввода, которые помогают улучшить пользовательский интерфейс, например, мышь.

Некоторые устройства ввода разработаны с конкретной целью.

Например, микрофон для записи звука, считыватель штрих-кода для считывания штрих-кодов, сканер для сканирования документов и цифровой фотоаппарат для съемки.

Я уверен, что вы можете придумать и другие примеры.

Устройства вывода отвечают за представление информации для пользователей.

Два основные типы устройств вывода, это мониторы и принтеры.

Мониторы отображают информацию на экране.

Тем не менее, информация, представленная таким образом, является энергозависимой и не-портативный.

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

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

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

Опять же, вы можете придумать и другие примеры.

Кроме того, существуют внешние запоминающие устройства, такие как CD, DVD и жесткие диски.

Емкость жесткого диска в настоящее время может легко держать несколько сотен гигабайт данных.

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

В общем и целом, они медленнее и менее эффективны, чем основная память.

В течение последних 10 лет, такой вид носителей, становится очень популярным, как USB или карты памяти.

USB накопители в настоящее время могут легко хранить 10-ки и даже более 100 Гбайт данных.

Одним из последних направлений является развитие облачных систем хранения данных, которые позволяют хранить большое количество данных, которые хранятся в центрах обработки данных, доступных через Интернет.

Программное обеспечение

Давайте продолжим обсуждение основных компонентов компьютерных систем и рассмотрим программное обеспечение компьютера.

Компьютерная техника сама по себе не была бы очень полезна.

Это как после строительства здания для библиотеки. До того, как книги помещаются на книжные полки, здание не будет являться библиотекой.

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

Этот вид инструкций можно назвать программным обеспечением.

Рис.77 Основы программирования с Java

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

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

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

В центре внимания этого курса – разработка прикладного программного обеспечения.

Системное программное обеспечение, это программы, которые поддерживают выполнение и разработку других программ.

Некоторые примеры системного программного обеспечения, это операционные системы и компиляторы для языков программирования, таких как Java, Python и C + +.

Другой тип системного программного обеспечения называется утилитами.

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

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

Рис.48 Основы программирования с Java

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

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

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

Эти пользователи могут быть прикладными программистами, которые разрабатывают программы, или пользователями приложений.

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

Давайте также взглянем на то, что мы подразумеваем под пользовательским интерфейсом.

В общем и целом, пользовательский интерфейс обеспечивает взаимодействие между человеком и компьютером.

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

Важной частью ОС является обеспечение пользовательского интерфейса между операционной системой и пользователем.

Например, файловая система является частью операционной системы.

Хороший интерфейс для системы управления файлами позволит пользователям поддерживать и манипулировать своими файлами эффективно и результативно.

В существующих компьютерах есть в основном два вида пользовательских интерфейсов, а именно интерфейс командной строки и графический интерфейс пользователя (или GUI).

С интерфейсом командной строки можно ввести определенные ключевые слова или команды, чтобы инструктировать ОС для выполнения определенных действий.

Рис.101 Основы программирования с Java

Примером командной строки является программа cmd, которую вы найдете в системе Microsoft Windows.

Для этого вида интерфейса необходимо помнить набор команд для того, чтобы взаимодействовать с системой.

Например, команда "cd ..", чтобы изменить текущий рабочий каталог на один уровень вверх, и "dir", чтобы вывести список файлов в текущем каталоге.

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

Я уверен, что все из вас знакомы с каким-нибудь графическим интерфейсом пользователя (GUI). В GUI вы можете найти на экране графические объекты, такие как значки, выпадающие меню и окна.

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

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

Например, в окне каталога файловой системы, вы можете легко манипулировать файлами с помощью перетаскивания.

Рис.55 Основы программирования с Java

Я не думаю, что здесь необходимы дополнительные объяснения, так как вы все должны быть знакомы с такими операциями.

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

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

Прикладное программное обеспечение и операционная система

Давайте теперь обсудим прикладное программное обеспечение.

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

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

И цель состоит в том, чтобы увеличить производительность труда и качество нашей жизни.

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

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

Некоторое широко используемое программное обеспечение может быть сгруппировано в следующие категории.

Рис.61 Основы программирования с Java

Первая категория, это производительное программное обеспечение, например, MS Word для подготовки документов, Excel Access для создания баз данных и PPT для подготовки презентаций.

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

Я думаю, большинство из вас, вероятно, никогда использовали или даже не видели пишущую машинку раньше.

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

Здесь вы можете использовать интернет-браузеры, такие как Internet Explorer, Safari, Chrome или Firefox для поиска информации в WWW.

Многие из вас общаются с друзьями по электронной почте или через социальные сети.

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

На самом деле, много бумажных носителей были заменены на электронные средства массовой информации, включая газеты и журналы.

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

Есть мобильные приложения для игр и для общения с другими людьми, развлекательные приложения для прослушивания музыки или просмотра фильмов, навигационные приложения, такие как Google Maps для путешествий, и многое другое.

Хорошая новость состоит в том, что многие из этих приложений написаны на Java, так что вы можете применить свои навыки программирования на Java после этой книги.

Давайте теперь посмотрим на операционные системы.

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

Некоторые популярные ОС предназначены для компьютеров, например Apple, это Mac OS, другие для мобильных устройств, например IOS для iPhone и IPad.

Компания Microsoft начала продавать MS DOS в начале 1980-х и операционную систему Windows в середине 80-х.

Последняя версия – Windows 10, которая обеспечивает пользовательский интерфейс для мобильных устройств.

Другие ОС включают UNIX и Linux, которая также является UNIX-подобной ОС.

Другая популярная ОС для мобильных устройств – Android, разработанная Google.

Android разработан на основе ядра Linux и имеет сейчас самую большую долю рынка среди всех мобильных ОС.

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

Рис.70 Основы программирования с Java

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

Как упоминалось ранее, ОС позволяет вам манипулировать файловой системы легко с помощью графического интерфейса пользователя, чтобы копировать и удалять файлы или перемещать файлы с помощью перетаскивания файлов в разные папки.

Операционная система также несет ответственность за управление устройствами ввода и вывода.

Когда программа выдает команду для получения некоторой информации из устройства ввода или написать что-то на устройство вывода, ОС берет это на себя.

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

И многочисленные окна, которые вы открываете, управляются ОС.

Языки программирования

Давайте теперь обсудим языки программирования.

Перед этим мы говорили о прикладном программном обеспечении и системном программном обеспечении.

Это на самом деле программы, которые были написаны на определенных языках программирования.

Например, операционная система UNIX, которая является системным программным обеспечением, написана в основном на языке С.

Когда компьютеры общего назначения впервые появились в 1940 году, программы должны были быть написаны на машинном языке или языке ассемблер, который, как правило, называется языком низкоуровневого программирования, потому что программы должны были быть написаны на основе примитивных машинных инструкций для конкретной компьютерной архитектуры.

То есть, программа должна была быть переписана полностью, когда она переносилась в другую машину.

В настоящее время, большинство программ написано на языках программирования высокого уровня.

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

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

Вот некоторые примеры из языков программирования высокого уровня:

Рис.59 Основы программирования с Java

Fortran рассматривается как один из первых языков программирования высокого уровня. Он был разработан в 1950-х годах.

Fortran особенно подходит для научных приложений, так как есть обширная коллекция научных пакетов, написанных на языке Fortran за всю его долгую историю существования.

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

Cobol является вторым старейшим языком программирования высокого уровня и используется в основном для бизнес-приложений.

Вы до сих пор можете найти, что многие системы банков и финансовых учреждений написаны на Cobol.

Basic является одним из самых простых в изучении языков.

VBA Microsoft или Visual Basic for Applications является реализацией Visual Basic вместе со своей интегрированной средой разработки.

«С» – это язык программирования общего назначения, разработанный в AT&T Bell Labs в начале 1970-х.

Многие черты C были приняты многими более поздними языками, включая C++, который является объектно-ориентированной версией С.

Другой язык программирования, который приобрел популярность в последнее время, это Python, который появился в 1990-х годах.

Он поддерживает несколько парадигм программирования, в том числе императивное, объектно-ориентированное и функциональное программирование.

Java это язык программирования, который мы собираемся использовать здесь, был разработан в 1990-х годах Sun Microsystems, которая была приобретена Oracle.

Он особенно популярен для веб-приложений и мобильных приложений.

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

Это потому, что программы Java компилируются в форме, называемой байт-кодом, который может быть запущен на виртуальной машине Java (JVM), установленной на другом компьютере.

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

Есть еще очень много, которые были созданы в прошлом, а новые, безусловно, будут созданы в будущем.

Следующий список дает основные мероприятия в цикле разработки программного обеспечения.

Рис.17 Основы программирования с Java

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

Это может быть простой текстовый редактор, такой как блокнот, или более сложный редактор, предоставляемый средой разработки.

В настоящее время большинство популярных языков программирования оснащены специально разработанными редакторами для языка.

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

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

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

Этот процесс называют компиляцией.

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

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

Это очень важно при разработке программ, потому что мы можем использовать то, что было написано раньше и не должны разрабатывать все с нуля.

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

Процесс связывания создает компьютерный исполняемый код, который обычно хранится в .exe файле или .jar файле.

Чтобы действительно выполнить программу, исполняемый код должен быть перемещен оттуда, где он хранится, например, на жестком диске, в основную память, где может быть осуществлено выполнение программы, и этот процесс называется загрузка.

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

Если обнаружена ошибка, программу нужно пересмотреть и провести через последовательность шагов разработки снова.

В настоящее время, все эти процессы могут осуществляться в интегрированной среде разработки (IDE).

Интегрированная среда разработки (IDE) является программным приложением, которое обеспечивает интерактивные инструменты для программистов, чтобы упростить цикл разработки программного обеспечения и таким образом, улучшить производительность.

Далее приведем общие компоненты IDE.

Рис.46 Основы программирования с Java

Они в основном соответствуют шагам в цикле разработки программного обеспечения, о которых мы только что говорили.

Редактор в IDE часто предоставляет инструменты, которые помогут вам отформатировать и документировать программы.

Некоторые могут даже помочь вам сделать некоторую первоначальную проверку на синтаксис.

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

Часто существуют ошибки в программах, даже для программ, написанных опытными программистами.

Отладчик может помочь в выявлении и локализации ошибок.

Он позволяет программисту проследить шаг за шагом выполнение программы.

В отладке программы, есть два распространенных типа ошибок, а именно синтаксические ошибки и семантические ошибки.

Синтаксис языка программирования представляет собой набор правил, которые определяют комбинацию символов, которые могут быть правильно использованы вместе в языке.

Это похоже на грамматику в естественном языке, таком как русский или английский язык.

Семантика относится к значению программы, то есть, что программа должна выполнить.

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

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

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

Например, инструкция может быть "казнить нельзя помиловать".

Таким образом, это предложение являются синтаксически или грамматически правильным, но семантически неоднозначным.

Для компьютера, он всегда даст каждой программе ровно одну интерпретацию.

Мы будем использовать в основном IntelliJ IDEA как нашу интегрированную среду разработки или IDE здесь, и вы будете иметь лучшее представление о каждом из этих компонентов.

Как решать задачи?

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

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

Рис.93 Основы программирования с Java

1-й шаг должен определить и проанализировать задачу, которую вы пытаетесь решить, чтобы мы могли получить хорошее понимание задачи.

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

Компьютер не может читать ваши мысли, вы должны дать компьютеру точные инструкции о шагах выполнения.

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

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

Во многих задачах может быть несколько решений.

Итак, вы хотите разработать решение, которое наилучшим образом соответствует текущей ситуации или ограничениям.

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

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

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

Это очень важно, потому что ваше решение может оказаться не в состоянии обработать все проблемные случаи.

Этот шаг часто является повторяющимся процессом, и возможно, придется пересмотреть решение или улучшить его, чтобы удовлетворить всем ограничениям и условиям.

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

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

Используем пример поиска способа путешествовать из Москвы в Лондон.

Предположим, что вы турагент, и определение задачи может быть что-то вроде "Найти лучший способ для вашего клиента, чтобы проехать из центра Москвы в Лондон в Великобритании".

Анализируя эту задачу, вам придется узнать у клиента, что он или она имеет в виду под самым лучшим способом, это кратчайшее расстояние или лучшее время или дешевая стоимость.

Эскизный проект может начаться с рассмотрения всех возможных маршрутов и видов транспорта, возможно, с помощью Google Maps или других сайтов туристических услуг.

И чтобы уточнить решение, нужно оценить различные маршруты и виды транспорта, а затем выбрать маршрут, который наилучшим образом соответствует вашей цели, например, самый короткий маршрут или самый дешевый по стоимости.

Как только вы создали решение, тестирование может быть трудным для этой конкретной задачи, если вы не можете фактически проделать это путешествие.

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

Или опросить кого-нибудь с предыдущим опытом создания подобной поездки.

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

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

И это эквивалентные шаги при попытке запрограммировать компьютер как процесс решения задач.

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

И одним из распространенных подходов, является придумать спецификацию для начального состояния или входную спецификацию и итоговую спецификацию для конечного состояния или выходную спецификацию для задачи.

Рис.32 Основы программирования с Java

Это полезно, потому что путь пользователя для взаимодействия с компьютером часто лежит через устройства ввода/вывода.

Вам также необходимо определить, какая дополнительная информация нужна для решения задачи.

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

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

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

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

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

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

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

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

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

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

Если возникают ошибки, или если программа не работает, как задумано, нужно отследить ошибки. Этот шаг часто называют шагом отладки.

Для исторической справки. Термин отладки (debugging) используется, потому что первая известная компьютерная ошибка была найдена в 1947 году, когда мотылек (насекомое – bug) был пойман в ловушку в реле компьютера.

Насекомое было записано на пленку в журнале учета Грейс Хоппер и в настоящее время хранится в Смитсоновском музее.

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

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

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

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

Игра

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

В представлении пространства состояний, задача представляется в виде множества состояний.

И я буду использовать примеры для иллюстрации того, что я имею в виду под состояниями.

Пространство состояний, это множество всех возможных состояний, в которых задача может находиться.

Рис.12 Основы программирования с Java

В частности, есть множество начальных состояний, то есть там, где начинается задача, и набор конечных состояний, в том числе всех возможных решений задачи.

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

Давайте рассмотрим несколько примеров, чтобы получить более полное понимание представления пространства состояний.

Это простой пример, и задача заключается в том, чтобы включить смартфон.

Рис.88 Основы программирования с Java

Здесь есть два состояния "сон" и "работа" и они соединены операцией нажатия на кнопку питания.

Первоначально, смартфон находится в «спящем» состоянии.

Для перехода к состоянию "работать", пользователь нажимает на кнопку питания.

И смартфон переключается из состояния "сна" в состояние "работать".

Пользователь может переключиться на «спящее» состояние смартфона снова, нажав на кнопку питания.

В этом примере, вероятно, нельзя сказать много о полезности представления пространства состояний.

Давайте теперь рассмотрим более интересный пример – игру крестики-нолики.

В этой игре, два игрока ставят "крестик" или "кружок" в таблице 3x3.

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

Рис.20 Основы программирования с Java

Здесь показывается, как два компьютера играют в крестики-нолики друг с другом.

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

Это своего рода задача, изучаемая в области искусственного интеллекта.

Рис.10 Основы программирования с Java

На этой диаграмме видно, что игра начинается с пустой сетки 3x3, мы назовем это начальным состоянием.

Пусть игрок, который ставит крестик, начнет первым.

Есть 9 возможных мест, где 1-й игрок может разместить крестик, но из-за симметрии, график показывает только три варианта, в том числе средний из которых является уникальным, а два других представляет 4 случая.

2-й шаг мог бы быть сделан игроком, который ставит кружок.

Здесь все возможные ходы для 2-го игрока после удаления симметричных случаев.

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

Угадайте, сколько возможных состояний есть? Если вы достаточно терпеливы, чтобы проследить все возможности, вы увидите, что есть более чем 250000 возможных последовательностей. Вместо того чтобы идти через все случаи, давайте дальше расширять только один конкретный случай.

Здесь все возможные размещения 2-го крестика после этого конкретного выбранного состояния, и все возможные места размещения 2-го кружка.

3-я шаг со стороны игрока с крестиком приведет к первому возможному состоянию выигрыша.

Кроме того, 3-й шаг для кружка приведет ко второму возможному состоянию выигрыша.

Также есть состояние ничьей.

Эти результаты состояния победы вместе с состоянием ничьей образуют множество конечных состояний.

Есть много больше конечных состояний, которые не показаны здесь.

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

Пример задачи

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

Как и в игре крестики-нолики, задача здесь начинается с матрицы 3х3, но в этой задаче, клетки занимают квадратные яблоки.

Рис.86 Основы программирования с Java

Давайте назовем это задачей квадратных яблок.

Люди на самом деле могут вырастить квадратные яблоки или даже квадратные арбузы.

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

Вопрос в том, может ли червь съесть все яблоки, выполнив следующие два правила.

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

То есть, червь может двигаться только в ячейку, где есть еще несъеденное яблоко внутри.

Рисунок показывает, что червь начинает с середины. После того, как заканчивается среднее яблоко, он может двигаться в одну из четырех клеток на стороне, но не в углу. Таким образом, червь может двигаться вправо, двигаться вниз, двигаться влево и двигаться вверх.

Я хочу, чтобы вы подумали, есть ли решение этой задачи.

То есть, может ли червь съесть все 9 яблок.

Это должно быть совершенно очевидно.

Продолжить чтение