Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lab01_2010

.pdf
Скачиваний:
33
Добавлен:
07.06.2015
Размер:
523.66 Кб
Скачать

Рис. 15. Ввод данных был некорректным, но приложение не содержит ошибок

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

§ 2. Как организовать ввод последовательности целых чисел и выполнить ее

суммирование.

Суммирование последовательности чисел, вероятно, наиболее понятный «процесс» из перечисленных в условии задачи. До начала суммирования потребуется объявить переменную (назовем ее, например, sum), в которой искомая сумма будет накапливаться. Поскольку суммироваться будут целые числа, переменная sum также будет целой.

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

В цикле должно происходить следующее.

Во-первых, запрашивается очередное число – с помощью метода print() стандартного потока ввода System.out

Во-вторых, происходит чтение этого числа (предполагается, что пользователь его ввел, притом корректно) – с помощью метода nextInt() объекта con класса Scanner.

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

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

Затем все эти действия повторяются – пока не будут введены N чисел.

Таким образом, потребуется еще одна переменная для хранения очередного

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

Будем использовать цикл с предусловием в форме while, условие продолжения цикла – количество введенных чисел остается меньше N (рис. 16).

11

Рис. 16. Цикл по подсчету суммы N чисел, вводимых с клавиатуры

Для вывода результата – вычисленной суммы – воспользуемся методом println() стандартного потока ввода, а также тем, что при прибавлении числа к строке выполняется преобразование числа в строковую форму (т.е., например, "ab"+8 приведет к получению строки "ab8") (рис. 17). Метод println() отличается от метода print() лишь тем, что добавляет перевод строки после выведенной информации. Обратите внимание, что к строке прибавляется значение переменной sum

Рис. 17. Вывод суммы чисел

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

Так, для N = 1 и последовательности, состоящей из единственного числа –8, должна получиться сумма –8. Для N = 2 и последовательности 5, 14 должна получиться сумма 19. Пример для N = 5 приведен на рис. 18.

Рис. 18. Подсчет суммы пяти чисел

12

Конечно, при небольших значениях N легко оценить, сколько чисел уже введено и сколько еще осталось ввести. Однако было бы удобнее, если бы сообщение «Введите очередное число» содержало бы и номер вводимого числа. Будем считать, что числа в последовательности нумеруются с единицы.

Для этого в тело цикла потребуется внести некоторые изменения. Во-первых, понадобится переместить оператор j = j+1 в самое начало тела цикла – перед запросом очередного числа, чтобы сформировать его номер. Во-вторых, нужно будет добавить в сам запрос номер числа – значение переменной j – таким же образом, как в вывод результата было добавлено значение суммы sum (рис. 19).

Рис. 19. Такой запрос будет выводить номер числа

Вновь сохраните и запустите приложение на выполнение. Пример работы приложения для N = 7 приведен на рис. 20.

Рис. 20. Вывод для N = 7 (в запросе есть номер числа).

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

§ 3. Как организовать поиск максимального значения в последовательности

чисел

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

13

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

Технически это выглдят так: объявляется переменная (для определенности назовем ее maxi), в которой будет храниться максимум. До прочтения первого элемента ее значение нельзя считать определенным. Когда первый элемент будет прочитан, его значение следует поместить в эту переменную.

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

Во-первых, запрашивается очередное число.

Во-вторых, происходит чтение этого числа.

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

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

Затем все эти действия повторяются.

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

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

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

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

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

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

14

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

Сохраните и запустите на выполнение приложение. Пример работы приложения при N = 6 приведен на рис. 22.

Рис. 22. Вывод приложения для N = 6

Заметим, что запись кода до цикла можно сделать более краткой. Так, можно сначала запросить у пользователя ввод первого числа. Затем объявить переменную d, совместив объявление с инициализацией ее прочитанным с клавиатуры значением. После этого объявить переменные sum и maxi и инициализировать каждую из них значением d (в которой хранится первое число последовательности). И, наконец, объявить переменную j,

15

инициализировав ее значением 1 (поскольку одно – первое – число уже прочитано). Выглядеть код будет так (рис. 23):

Рис. 23. Более короткая запись кода до цикла

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

§ 4. Как организовать поиск минимального значения в последовательности

чисел

Алгоритм поиска минимального значения мало чем отличается от поиска значения максимального: разница состоит в том, что переменная (пусть она называется mini), хранящая минимум, обновляется в случае, если очередное число оказалось меньше ее значения. Приведем фрагмент изменненого кода (рис. 24).

Рис. 24. Внесенные добавления позволяют получить и минимальное значение среди введенных чисел.

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

16

§ 5. Как вычислить среднее арифметическое чисел

Ввычислении среднего значения нет ничего сложного: по окончании цикла нам известна сумма всех чисел и их количество, и среднее арифметическое (оно будет храниться в вещественной переменной ave) определяется как результат деления первго числа на второе. Единственное, о чем следует позаботиться, – о выполнении вещественного деления. Для этого вполне достаточно умножить числитель дроби на «вещественную единицу» (1.0).

Для вывода вновь воспользуемся методом println() стандартного потока вывода.

Витоге получится следующее (рис. 25):

Рис. 25. Строки 46 и 47 отвечают за вычисление и вывод среднего арифметического введенных чисел.

Сохраните приложение и запустите его на выполнение. Пример работы приложения при N = 6 показан на рис. 26.

Рис. 26. Вывод результатов работы приложения (N = 6)

§ 6. Как запустить приложение независимо от среды NetBeans

Теперь можно посмотреть, как работает приложение вне среды NetBeans. Выполните команду Clean and Build Main project из меню Run (очистка и построение проекта), и среда сформирует «командную строку», с помощью которой приложение можно будет запустить в консоли. В Вашем случае (если все делалось согласно инструкции) командная строка будет иметь вид:

java –jar "W:\JavaProject\LR01_01\lab_01_gp_01\dist\lab_01_gp_01.jar"

Чтобы получить консоль, нужно в меню Пуск | Выполнить напечатать cmd и нажать кнопку ОК. После этого приведенную выше строку следует скопировать в консоль с помощью системного меню Изменить | Вставить (оно показано на рис. 27).

17

Рис. 27. Меню вставки в консоли

Если Вы видите вместо русских букв «кракозябры», то проблема, скорее всего, исправится следующим образом:

java -Dfile.encoding=Cp866 -jar "W:\JavaProject\...\lab_01_gp_01.jar"

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

Результаты работы приложения при N = 5 приведены на рис. 28.

Рис. 28. Работа приложения в консоли (N = 5)

Общие задания по доработке проекта.

1.Дополните приложение так, чтобы в нем отыскивалось максимальное по абсолютной величине число.

2.Дополните приложение так, чтобы оно вычисляло сумму всех четных чисел

3.Дополните приложение так, чтобы оно вычисляло сумму всех чисел с четными номерами

Внимание! Для выполнения индивидуальных заданий следует создать новый проект. В проекте обязательно должны присутствовать комментарии. Также следует разработать комплект тестов (не менее 5, создайте для их записи отдельный текстовый файл), который нужно будет предъявить и использовать при сдаче задания.

18

Рекомендации

Имя проекта для выполнения индивидуального задания можете придумать сами. Предпочтительно использовать латинские буквы – например, lab_01_mp_01 (mp – сокращение от my project) и избегать пробелов. Для размещения проекта установите

Project Location как W:\JavaProjects\LR01_02 (эту папку нужно создать).

Остальные настройки при создании проекта оставьте без изменений. В результате после нажатия кнопки Finish окно проектов будет выглядеть следующим образом (рис. 29):

Рис. 29. Окно проектов после создания второго проекта – lab_01_mp_01

Выделение имени проекта жирным шрифтом означает, что этот проект сейчас является «главным» (Main Project), и именно он будет компилироваться и запускаться на выполнение соответствующими командами из меню Run. Если Вам потребуется запустить на выполнение в среде другой проект, то его нужно выбрать в окне проектов и в контекстном меню (вызываемом щелчком по нему правой клавиши мыши) выбрать Set as Main Project.

Обратите внимание, что теперь в окне редактирования теперь две вкладки

Main.java (рис. 30)

Рис. 30. И в первом, и во втором проекте есть файл, называющийся Main.java

19

Переключаясь между ними, Вы можете, например, посмотреть, как объявлялась переменная класса Scanner или же как осуществлялся вывод результата в первом проекте. Однако нельзя не заметить, что одинаковые названия файлов способствуют возможности запутаться (конечно, нет ничего плохого в том, чтобы давать одинаковые названия файлам в разных проектах – в случае, если Вы не будете использовать их одновременно). Этого можно было избежать, изменив имя главного класса (Main Class) во втором диалоговом окне при создании проекта. Но и сейчас это тоже можно сделать.

Имя файла в проекте java определяется именем (единственного) общедоступного класса, содержащегося в этом проекте. Таким классом является класс Main. Чтобы переименовать его, в окне редактора (щелкнув по имени класса Main) вызовите контекстное меню Refactor | Rename (рис. 31):

Рис. 31. Переименование класса в окне редактора

Появится диалоговое окно, в котором можно будет изменить имя класса (рис. 32):

Рис. 32. Диалоговое окно переименования класса

20

Соседние файлы в предмете Программирование на Java