Читать книгу «Основы программирования с Java» онлайн полностью📖 — Тимура Машнина — MyBook.
image

Демонстрация примера

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


Откроем файл CourseGrade в редакторе исходного кода.

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

И эта программа еще не скомпилирована.

Попробуем скомпилировать программу с помощью меню Build Project.



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



Давайте попробуем запустить программу с помощью кнопки Run.



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

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



Обратите внимание, что мы вводим с десятичной запятой, 100,0, для каждой из оценок.

И в результате, по какой-то причине, итоговая оценка вернулась программой как 0.0.

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

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

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

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



Для этого просто нажмем на соответствующее место вдоль правого столбца в окне редактора.

Вы можете нажимать в этих местах, чтобы установить или очистить точки останова.

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

Давайте начнем выполнение снова, нажав кнопку Debug.



И введем ту же оценку, 100,0, для экзаменационной оценки, 100,0 для лабораторной.



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

Когда вы нажмете return, вы увидете, что окно редактора появляется с выражением, выделенным в точке останова.

Что еще более важно, при этом выскочило окно отладчика.

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

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



Вы можете видеть, что значения весов определены при инициализации, и examScore, labScore и hwScore, все получили значение 100,0.

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

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

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

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


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



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

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

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

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

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

Обратите внимание, что вес экзаменов со значением 70 имеет тип int. Когда он делится на 100, что также является целым числом, результат деления 0,7 будет урезан и возвращает 0 в результате.

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

Та же проблема возникает в labScore и hwScore.

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

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

Теперь также нет ошибки синтаксиса.

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

Давайте попробуем выполнить программу, нажав кнопку Run.



Если ввести те же баллы 100, 100 и 100, вычисляется окончательная оценка 100 и все сейчас должны быть счастливы.

Вопросы

Задача

Каким вы думаете будет значение переменной result после выполнения следующего сегмента Java кода?

int i = 1234567890;

float f = i;

int result = i – (int)f;


1. 0

2. nonzero

3. an error

Ответ: 2.

Оба int и float 32-битные типы.

Все 32-битные int используются для представления целой части числового значения.

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

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

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

Вы можете проверить код, указанный выше, в программе Java.

Обсуждение отладки

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

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

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


Ответ:

Простой IO

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

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



В Java, стандартные методы для вывода текста в консоль являются System.out.println и System.out.print.

System представляет собой класс Java.

Вы видели println в программе HelloWorld.

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

Технически, println и print являются методами класса PrintStream.

Обратите внимание, что они разделены точкой или оператором точка.

Я вернусь к этому, когда будем обсуждать классы, объекты и методы позже.

Есть аналогичные стандартные методы для ввода на основе класса Scanner, но он немного неуклюжий, поэтому здесь создан свой пользовательский класс ввода-вывода I/O с именем IO в качестве оболочки, который будет сочетать как ввод, так и вывод и, надеюсь, предоставляет более простой в использовании интерфейс ввода / вывода для вас.

Методы обертки очень часто используются в Java.

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

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

Я вернусь к классу Scanner, когда мы будем обсуждать файловый ввод/вывод.

Методами вывода являются IO.outputln и IO.output.

Вы видели их обоих в программе CourseGrade.

Разница между ними состоит в том, что IO.outputln будет перемещаться на новую строку, в то время как IO.output останется на той же строке.

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

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

Методы ввода – это IO.inputInteger для целых чисел и IO.inputDouble для double.

Вы видели IO.inputDouble, когда программа просила пользователя ввести examScore, labScore и hwScore.

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

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

Вам нужно импортировать пакет comp102x, который предоставлен в виде библиотеки.

В частности, необходимо будет включить выражение «import comp102x.IO;» в начало программы.

Где import является зарезервированным словом Java.

Вы увидите много примеров по использованию import и этих методов ввода-вывода далее.

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

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

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

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

Альтернативные интерфейсы ввода необходимы.

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

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

Например, в супермаркетах, библиотеках и на почте.

В последнее время появляются и новые технологии для распознавания голоса.

Например, Siri, который iPhone использует для голосового ввода, Google поиск, и у многих из вас, вероятно, есть опыт разговоров с компьютером, когда вы делали телефонные звонки.

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

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

Я покажу вам пример манипулирования со штрих-кодом в программе.

Штрих-код является машиночитаемым представлением данных в виде изображения.

Я буду говорить об одномерных штрихкодах.

2D штрих-коды, такие как QR-коды, также набирают популярность.

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



Здесь показаны некоторые примеры штрих-кодов.

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

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

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

Как это на самом деле сделано или реализовано – не важно для пользователя.

Можно рассматривать его таким же образом, как номера на клавиатуре.

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



Программа начинается с импорта класса IO из пакета comp102x.

В дополнение к выполнению операций ввода/вывода от стандартных устройств ввода и вывода, класс IO может также принимать входные и выходные данные как штрих-код.

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

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

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