Файл: Технологии программирования.docx

Добавлен: 23.10.2018

Просмотров: 2544

Скачиваний: 30

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ

Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования

Московский технический университет связи и информатики

Кафедра математической кибернетики и информационных технологий





















УЧЕБНО-МЕТОДИЧЕСКОЕ ПОСОБИЕ

по дисциплине

Технологии программирования

(для направлений 09.03.01, 27.03.04)















Москва 2017

План УМД на 2016/17 уч. г.




















УЧЕБНО-МЕТОДИЧЕСКОЕ ПОСОБИЕ

по дисциплине

Технологии программирования

(для студентов направлений подготовки 09.03.01, 27.03.04)



Составители: М.Г. Городничев, к.т.н., доцент

М.М. Волков, ст. преподаватель







Издание утверждено советом факультета ИТ.

Протокол № 11 от 23.05.2017 г.




Рецензент: А.Г. Таташев, д.ф.-м.н., профессор










Задание № 0: Java-Разминка

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

Простые числа

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

1. Создайте файл с именем Primes.java, в этом файле опишите следующий класс:

      * TODO:  Комментарий, описывающий класс

     public class Primes {

          * TODO:  Комментарий, описывающий метод

         public static void main(String[] args) {

             // TODO:  Реализация программы

         }

}

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

2. Внутри этого класса, после метода Main (), опишите функцию IsPrime (Int n), которая сообщает, является аргумент простым числом или нет. Можно предположить, что входное значение n всегда будет больше 2. Полное описание функции будет выглядеть так:

  public static boolean isPrime(int n)

{

         // TODO:  Реализация

}

Вы можете применять этот метод по вашему усмотрению, однако простой подход заключается в написании цикла for. Данный цикл перебирает числа, начиная с 2 до (но не включая) n, проверяя существует ли какое-либо значение, делящееся на n без остатка. Это можно протестировать с помощью оператора остатка “%”. Например, 17%7 равняется 3, и 16%4 равно 0. Если какая-либо переменная полностью делится на аргумент, сработает оператор return false. Если же значение не делится на аргумент без остатка, то это простое число, и оператор покажет return true. (Оператор Return в Java используется для возврата данных из функции, таким способом закрывается метод.)

3. После того как этот участок отработает, приступайте к заполнению основного метода main() другим циклом, который перебирает числа в диапазоне от 2 до 100 включительно. Необходимо вывести на печать те значения, которые ваш помощник IsPrime () посчитал простыми.


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

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

Палиндромы

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

  1. Для этой программы вы создадите класс с именем Palindrome в файле под названием Palindrome.java. На этот раз вы можете воспользоваться следующим кодом:



        /**

      * TODO:  Описание класса

      */

     public class Palindrome {

         /**

          * TODO:  Описание метода

          */

         public static void main(String[] args) {

             for (int i = 0; i < args.length; i++) {

                 String s = args[i];

} }

}

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

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

public static String reverseString(String s)

Вы можете реализовать этот метод путем создания локальной переменной, которая начинается со строки "", а затем добавлять символы из входной строки в выходные данные, в обратном порядке. Используйте метод length(), который сообщает длину строки, и метод charAt(int index), который возвращает символ по указанному индексу. Индексы начинаются с 0 и увеличиваются на 1. Например

  String s = "pizzeria";

  System.out.println(s.length());   //Выводим 8

  System.out.println(s.charAt(5));  //Выводим r

Для этого вы можете использовать оператор конкатенации (соединения) строк + , или же можете использовать оператор +=, если предпочитаете.

3. После того как вы применили метод reverseString (), можете создать еще один метод public static boolean isPalindrome(String s). Все, что этому методу нужно сделать, это создать обратную версию s, а затем сравнить с первоначальными входными данными. С помощью String (и со всеми объектами Java), используйте метод Equals (Object) для проверки значения равенства.

Например:

  String s1 = "hello";

  String s2 = "Hello";

  String s3 = "hello";

  s1.equals(s2);  // Истина

  s1.equals(s3);  // Ложь

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

4. После того как вы закончили писать свой код, скомпилируйте и протестируйте программу! На этот раз, вы будете давать вашей программе входные данные в качестве аргументов командной строки, например:

    java Palindrome madam racecar apple kayak song noon

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


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

Все готово!

















Задача № 1: Java - Сразу к делу

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


/ **

* двумерный класс точки.

**/

общедоступный класс Point2d {


/ ** X координат точки **/

частный двойной xCoord;


/ ** Y координата точки **/

частный двойной yCoord;


/ ** Конструктор, чтобы инициализировать точку к (x, y) значение. **/

общедоступный Point2d (удваивают x, дважды y) {

xCoord = x;

yCoord = y;

}

/ ** Конструктор без параметров: значения по умолчанию к точке в источнике. **/

общедоступный Point2d () {

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

это (0, 0);

}


/ ** Верните X координат точки. **/

общественность удваивает getX () {

верните xCoord;

}


/ ** Возвратите координату Y точки. **/

общественность удваивает getY () {

верните yCoord;

}


/ ** Набор X координат точки. **/

общественность освобождает setX (удвойте val) {

xCoord = val;

}


/ ** Набор координата Y точки. **/

общественность освобождает setY (удвойте val) {

yCoord = val;

}

}


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


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


Point2d myPoint = новый Point2d ();//создает точку в (0,0)

Point2d myOtherPoint = новый Point2d (5,3);//создает точку в (5,3)

Point2d aThirdPoint = новый Point2d ();


Будьте осторожны: myPoint! = aThirdPoint, даже при том, что их значения - те же. Это вызвано тем, что оператор равенства == (и его инверсия, оператор неравенства ! =) это две ссылки объекта на предмет равенства. Другими словами, == верните true, если эти две ссылки указывают на тот же объект. В этом коде myPoint и aThirdPoint каждый обращается к различному экземпляру класса Point2d, таким образом, myPoint == aThirdPoint возвращает false, даже при том, что их значения - те же!


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


Прежде чем вы начнете «кодить»


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



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


Ваша задача


  1. Создайте новый класс Point3d чтобы представить, что эти точки представлены в трехмерном Евклидовом пространстве. Должно быть возможно:


  • создание нового Point3d, описанного любыми тремя тосками, с плавающей запятой (тип double) значениями,


  • создание нового Point3d в (0.0, 0.0, 0.0) по умолчанию,


  • получение доступа и видоизменение всех трех значений индивидуально,


  • сравнение двух Point3ds для равенства значения с использованием соответствующего эквивалентного метода.


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


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


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


  • ввод трех упорядоченных последовательностей утраивается от пользователя, каждый представляя координаты одной точки с тремя пространствами. Генерируйте три объекта Point3d от этих данных. (На данный момент вы можете принять, что пользователь не вводит недопустимые данные.)


Если вы не знаете, как получить ввод пользователя, вы можете использовать функцию в этом файле. Поместите его как статический метод в ваш класс Lab1. Обратите внимание на то, что этот метод использует классы в комплекс java.io, который не видим вашему коду по умолчанию. Чтобы сделать его видимым, добавьте его к очень главному из вашего файла:


импорт java.io.*;


Это делает все классы в комплексе java.io видимыми вашему коду Lab1. (Вы не должны делать этого с классами комплекса java.lang , так как те сделаны доступными для ваших классов по умолчанию.)


  • Запишите второй статический метод computeArea, который берет три Point3d и вычисляет область в треугольнике, ограниченном ими. (Можно использовать формулу Heron's.) Верните эту область как двойную.


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


Прежде чем вы вызовете computeArea, проверьте равенство значения между всеми тремя Point3d. Если какая-либо пара точек "равна", сообщите об этом пользователю и не вычисляйте область.



  1. Соберите оба свои исходные файлы вместе:


javac Point3d.java Lab1.java


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


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












Задача № 3: Java-Я-звезда!

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


Один очень широко используемый алгоритм для этого вида проблемы называют А* (произносится "Я-звезда"), и это - очень эффективный алгоритм для новаторства в компьютерной программе. Алгоритм концептуально довольно прост. Запускаясь с начального расположения, алгоритм постепенно создает путь от источника до места назначения, всегда используя "до сих пор лучший путь ", чтобы сделать следующий шаг. Это гарантирует, что завершающий путь также будет оптимальным. (Если вы хотите узнать больше о А* новаторский алгоритм, вы можете открыть статьи Wikipedia на А* и следовать по ссылкам, которые дает статья.)


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




Вы можете щелкнуть по различным квадратам, чтобы превратить их в барьеры (красные) или проходимые клетки (белые). Синие клетки обозначают запуск и конец пути. Нажатие на кнопку "Find Path" вычислит путь, используя А*, и затем выведет на экран его в зеленом, или, если не будет никакого пути от запуска, чтобы завершиться, программа просто не покажет пути.


A* алгоритм имеет много информации, чтобы отслеживать путь, и набор классов Java (идеально подходит для такого рода задач). Есть два основных вида информации, которыми A* должно осуществлять управление:


Локации – это просто наборы координат конкретных клеток на двухмерной карте. A* алгоритм должен иметь возможность ссылаться на определенные места на карте. Путевые точки - это отдельные шаги на пути, которые А* алгоритм генерирует. Например, вышеперечисленные шаги зеленого пути -это просто последовательность точек через карту. Каждая точка содержит несколько элементов информации, связанны с ней:

  • расположение ячейке как точка пути;

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

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

  • эвристическая оценка (предположение, другими словами) оставшейся стоимости передвижения от этого места до конечного пункта назначения.