Давайте рассмотрим несколько примеров циклов.
Помните, мы написали программу Java для перемещения автомобиля на холсте вдоль ориентации автомобиля.
Вместо того чтобы автомобиль двигался постоянно вперед, то, что вы увидите, это автомобиль будет прыгать с одного места на другое.
Давайте попробуем запустить программу, чтобы увидеть эффект.
Таким образом, мы можем создать новый автомобиль, просто используя конструктор по умолчанию.
Вызовите метод сar2Demo для отображения автомобиля на холсте.
Скажем, если мы хотим переместить автомобиль вперед на определенное расстояние, скажем 400, Вы увидите, что автомобиль просто прыгнет с начального положения в положение конечное.
Если вы хотите, чтобы автомобиль перемещался постоянно, вы должны обновлять его положение шаг за шагом.
Внесем изменения в программу.
В этой программе, вы можете видеть, что здесь есть цикл.
И здесь я упростил программу, просто перемещая автомобиль вперед горизонтально.
Вы можете изменить программу, чтобы попытаться перемещать автомобиль в любом направлении.
В этом модифицированном коде moveForward, я ввел цикл, в этом случае for цикл.
Для заданного расстояния, заданного в качестве параметра, вместо обновления положения изображения на параметр dist, цикл здесь будет двигать автомобиль пиксель за пикселем.
Таким образом, вы увидите, что автомобиль движется вперед на один пиксель за один цикл, на общее количество циклов dist.
Так, в конце, автомобиль переместится вперед на dist пикселей.
Вы можете подумать о том, что сделать, если dist будет отрицательным, то есть для перемещения автомобиля назад.
А также, вы можете рассмотреть перемещение автомобиля по его ориентации.
Рассмотрим эту простую реализацию.
Снова создадим экземпляр класса по умолчанию и отобразим автомобиль на холсте.
Давайте посмотрим, что произойдет, если мы попытаемся переместить автомобиль вперед, скажем, на 400 пикселей.
Это все еще выглядит, как будто он прыгнул с одного места на другое.
Это потому, что наш компьютер так быстро работает.
Хотя автомобиль фактически двигался пиксель за пикселем, экран обновлялся так быстро, что вы действительно не видели этого движения.
Для того чтобы увидеть, как автомобиль движется непрерывно, шаг за шагом, вы должны замедлить обработку.
Здесь я создал метод с именем pause, вызывающий системный метод sleep.
Вы не должны беспокоиться о try-catch блоке здесь.
Это в основном для обработки ошибок, в случае если системный вызов создает некоторые ошибки.
Так что с помощью этого метода можно замедлить обработку.
Что вы можете сделать, это ввести выражение pause в цикле, единица здесь миллисекунды.
Так что каждый раз цикл будет останавливаться на 10 миллисекунд.
Давайте скомпилируем программу, и создадим экземпляр автомобиля еще раз, используя конструктор по умолчанию.
Отобразим автомобиль на холсте. Попробуйте переместить его снова на 400 пикселей.
Таким образом, вы можете увидеть, что автомобиль на самом деле движется непрерывно вперед.
Вы можете изменить скорость автомобиля.
Скажем, если мы хотим замедлить его, сделайте паузу 30 миллисекунд.
Запустите еще раз, и вы увидите, что это намного медленнее.
Мы также создали простую демонстрационную программу для вас.
Вместо того чтобы двигать автомобиль, здесь вы будете двигать футбольный мяч.
Хотя чемпионат мира уже закончился, вы можете создать свой собственный чемпионат мира.
Здесь можно увидеть, что создается футбольное поле, и есть различные опции.
Первая опция просто забросить мяч вперед.
Это похоже на перемещение автомобиля вперед, как то, что мы только что видели. И здесь можно увидеть, как мяч движется вперед.
Но здесь это не выглядит слишком естественно, потому что обычно, когда вы бьете по мячу, мяч вращается.
Но здесь этого нет.
Вы можете изменить программу, введя там вращение.
Здесь есть два метода.
Метод shoot просто забрасывает мяч вперед без кругового движения.
И метод spinningShoot забрасывает мяч вперед с круговым движением.
Чтобы запустить программу, Вы можете сделать следующие шаги.
1. Открыть проект.
2. Завершить методы shoot() и spinningShoot() в соответствии с инструкциями, написанными в классе Shooter.
3. Запустите программу, щелкнув правой кнопкой на классе WorldCup, а затем выполнив метод main.
4. Затем можно проверить вашу программу, нажимая на кнопки управления, расположенные в верхней части окна программы.
Последнее время мы обсуждали различные структуры управления.
И я хочу обратить ваше внимание опять на то, что отступы кода игнорируются в Java, и ключевое слово else соотносится с ближайшим if.
Если вы хотите соотнести else с другим if, вы должны использовать фигурные скобки.
Использование фигурных скобок также улучшает читаемость кода.
Однако другие языки программирования могут следовать другому синтаксису, например, в языке Python отступы кода могут использоваться для связывания if и else.
Теперь давайте теперь обсудим новую тему – массивы.
Циклы используются часто вместе с массивами.
Во-первых, давайте поговорим о том, почему нам нужны массивы.
До этого, мы использовали переменные, которые представляли только один объект данных. Поэтому каждое имя, которое мы использовали, могло представлять только одну порцию примитивных данных или один экземпляр объекта.
Хотя у объекта могло быть несколько полей, вам нужно было давать различным экземплярам объектов различные имена.
При этом возникают трудности, когда у вас есть большое число объектов одного типа.
Например, когда у вас есть большое число студентов, скажем 100 студентов в классе, и для хранения экзаменационных оценок каждого студента, вы должны создать имена переменных Score1, Score2, Score3, и так далее до Score100.
Сделайте объявление 100 различных переменных и представьте, что вам нужно сделать что-нибудь с оценками, скажем, добавить бонус к каждой оценке, для этого вам нужно будет написать 100 выражений в форме Score1=Score1 + 1, Score2 =Score2 + 1, и так далее.
И даже если вы используете оператор инкремента, вы все равно должны написать Score1++, Score2++, и до Score100++.
И нет таких программистов, которые бы пожелали выполнять такую утомительную работу.
Поэтому большинство высокоуровневых языков программирования включают в себя встроенные структуры данных, называемые массивами.
Использование массива упрощает выполнение таких утомительных задач, как, например, определение средней оценки, максимальной и минимальной оценки, вывод списка оценок, сортировка списка, когда список имен выстраивается в алфавитном порядке.
В реальной жизни иногда вам нужно обрабатывать даже многомерные данные, например, работать с 2-х мерными цифровыми изображениями. И вы найдете, что массивы будут полезны для таких приложений.
Массив – это коллекция однородных объектов данных, при этом данные должны быть одного типа.
Синтаксис объявления массива – это, во-первых, определить тип данных, затем идут квадратные скобки.
Здесь тип данных – это тип данных, которые должны храниться в массиве.
Это может быть примитивный тип данных, int, double, или пользовательский тип – класс, как мы рассматривали раньше, СourseGrade или Сar.
И помним, что здесь используются квадратные скобки, а не круглые или фигурные скобки.
Имя массива, как и имя переменной, может быть любым действительным именем для переменной.
На слайде показаны примеры оформления массивов.
Первый пример, это объявление массива double типа с именем testScores.
Второй пример, это массив целых чисел с именем studentID.
И последний пример, это double массив с именем stockIndex.
Эти объявления на самом деле не создают массив. Они только создают ссылочную переменную массива.
Для того чтобы реально создать массив, вы можете использовать оператор new и определить размер массива в квадратных скобах, который вы хотите создать.
И в этом случае вы создаете массив с именем testScores, типа double, с 100 элементами.
Во втором примере создается массив studentID типа int, с 50 элементами.
И последний пример немного отличается. В нем объявляется и сразу создается массив в одном выражении. В этом выражении создается массив с именем stockIndex, типа double, с 365 элементами.
Нужно отметить, что размер массива не может быть отрицательным.
Java позволяет создавать массивы с нулевым размером, но такой пустой массив не может что-либо хранить.
Java также позволяет объявлять массивы, создавать их и инициализировать в одном выражении.
В этом примере создается массив с именем testScore, типа double.
Четыре числа внутри фигурных скобок затем используются для инициализации четырех элементов массива.
И результат проиллюстрирован здесь диаграммой.
Заметьте, что размер testScore определяется, когда массив создается, используя 4 числа при инициализации.
Я хочу указать, что такая короткая инициализация должна быть сделана в одном выражении.
Например, если массив уже объявлен, вы не можете инициализировать массив с помощью списка начальных значений в фигурных скобках. Java выдаст вам ошибку в этом случае.
Java инициализирует элементы массива в их значения по умолчанию. Но хорошая практика программирования не полагаться на это.
Отдельные элементы массива могут быть доступны с помощью индекса.
Рассматривая последний пример, действительные индексы находятся в диапазоне от 0 до 3 для массива размером 4.
Важно помнить, что индекс массива начинается с 0, а не с 1. Общая ошибка, индексировать первый элемент, используя 1, вместо 0.
Поэтому, действительные индексы в этом примере 0, 1, 2, 3.
Сослаться на отдельный элемент массива можно, указав имя массива, а затем индекс в квадратных скобках.
В этом примере первый элемент testScore с 0 индексом имеет значение 100.
testScore с индексом 1 даст значение 90.
testScore с индексом 2 имеет значение 85.
Последний элемент массива с индексом 3 имеет значение 72.
В этом примере определяется класс Scores.
Внутри класса объявляется переменная экземпляра scoreArray double типа, но она еще не создается.
Конструктор определяется с 1 параметром, который дает размер массива.
Надо заметить, что в Java размер массива может быть определен динамически, т.е. во время выполнения.
Когда вызывается конструктор, создается массив.
Предположим, размер имеет значение 4, и диаграмма здесь иллюстрирует создание массива.
Ссылочная переменная scoreArray даст адрес памяти, где расположен первый элемент массива scoreArray.
Как я упомянул, Java будет инициализировать элементы массива значениями по умолчанию. В случае целых чисел, эти значения будут 0.
Но рекомендовано самостоятельно инициализировать массив перед его использованием.
Заметьте, что первый элемент массива имеет индекс 0, а последний индекс имеет значение 3, которое меньше чем размер массива.