Уроки по Java. Гурьянова Т.В.

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

Версия книги в pdf-формате

1-4 урок

Выполняем первые 10 уроков курса по Java с сайта JAVARUSH:  http://javarush.ru/login.html


5 урок

Решить задачи (каждую несколькими способами), оформить на
Java:

1. Найти сумму a и b, используя только операторы
присваивания вида:

переменная1=переменная2
переменная=число;
переменная=переменная+1.

(не используя оператор a+b)

a_plus_b

2. a и b числа. Найти a* b, используя арифметические
операции    вида +,-,=,<>.  (не используя оператор *). Сделать это упражнение для типов  int и float.

a_multiple_b

3. a и b числа. Вычислить частное  и остаток   при делении a на b,
не используя операции %. Сделать упражнение для типов  int и float .

a_percent_b

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

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

Y_jaBCB42Qk

Урок 6

Понятие, описание и использование массива.

srednee_otmetok_part2_d_z

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

 Упражнение. Возведите заданное число А в пятую степень, в шестнадцатую степень.
Как возвести на Java a в степень b? Есть два варианта решения этой задачи: 1) можно написать возведение в степень с помощью умножения числа а на себя b раз; 2) воспользоваться функцией, которую написали разработчики Java. Мы советуем сделать это двумя этими способами и затем сравнить способ 1) с исходниками функции в способе 2).

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

pow_a_b.jpg

Упражнения. Возведение a в степень b  будем обозначать a^b. Найти значение выражений: 1) 3*a^3+2*b^2 и
2) 5*a^5+4*a^3+8*b^2+37 при заданных значениях a и b

Если вы правильно выполнили это упражнение, при a=5, b=10 ответ

1)20375

2)15625500424)

Очень полезно на каждом уроке выделять хотя бы 5-10 минут решению математических задач.
Возьмем, к примеру, книгу по математической логике Рэймонда М Смаллиана «как же называется эта книга?»
Примеры решения некоторых задач из этой книги

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

28 задача:

A-лжец B-лжец: высказывания не возможны
A-лжец B-рыцарь: высказывания не возможны
A-рыцарь B-рыцарь: высказывания не возможны
A-рыцарь B-лжец: высказывания возможны!!! (ответ)

A-лжец B-лжец: высказывания не возможны
A-лжец B-лжец: высказывания не возможны
A-лжец B-лжец: высказывания не возможны

34 задача:
Вот возможные ситуации:
A  B  C
л  р  л
р  л  л
В обоих случаях С — лжец (ответ).

37 задача

A B | ответы
=============
л р |  NO NO
л л |  YES YES
р л |  NO NO
р р |  YES YES

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

Задача 39:

task39_smalian

Урок 7

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

 

1) способ: » пробегаем» все числа от 0 до N, если они в сумме дают N, выводим на экран:

for(int a=0;a<N;a++){

for(int b=0;b<N;b++){

if ((a+b)==N) {System.out.println(a+»+»+b+»=»+N)}

}

}

У такого решения есть недостаток: повторяющиеся пары. Так 5=2+3 и 5=3+2. Чтобы вывести только одну из них, можно либо уменьшить количество итераций в цикле, либо добавить еще одну проверку:

if (((a+b)==N)&&(a<=b))

2) способ более изящный. Если внимательно рассмотреть частные случаи разбиения 5, 7, 8, 9, 10, то можно выявить следующую закономерность и обойтись одним циклом и одной дополнительной переменной a:

for(int a=1;a<=N/2;a++){

System.out.println(a+»+»+(N-a)+»=»+N)

}

 

 Урок 8

Разложить число на три слагаемых различными способами

image001

Найти сумму всех натуральных чисел от 1 до введенного с клавиатуры

screen2_07

Упражнение. Исправить код программы так, чтобы не печатался последний знак «+» перед «=» в ответе.

Урок 9

Понятие факториала натурального числа n: n!=1*2*3*4*…*(n-1)*n

Упражнение. Переделайте  предыдущу задачу  (нахождение суммы всех натуральных чисел до чисила, введенного с клавиатуры) на нахождение факториала натурального числа (нужно найти произведение всех чисел до чисила, введенного с клавиатуры).
Упражнение. Выполнить первую лабораторную по Java Swing, используя видео (научиться создавать форму  JFrame, содержащую компоненты JLabel, JButton,…, уметь менять их свойства).

Имеет смысл обсудить решение задачи с туристом, рыцарем и лжецом (Турист подходит к перекрестку. Одна дорога идет у озеру, другая — нет. На перекрестке рыцарь и лжец. (Турист не знает, кто из них кто). Турист задает один вопрос,  получает от каждого ответ «да» или «нет» и по этому узнает, какая дорога идет  к озеру. Какой вопрос  задал турист?).

Урок 10

Сделать заготовку калькулятора на Swing (сложение и умножение). Для этого разместить на форме два текстовых поля, кнопку  Button и Label. В рбработчик кнопки дописать код:

String str1 = jTextField1.getText();
String str2 = jTextField2.getText();
double a = Double.parseDouble(str1);
double b = Double.parseDouble(str2);
double sum=a+b;
jLabel1.setText(“Сумма чисел равна“+sum);

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

String str1 = jTextField1.getText();
int a = Integer.parseInt(str1);
int b= h/10;//1 цифра числа a
h=h-b*100;//h без сотых
int c=h/10;//2 цифра числа a
int d=h-c*10;//3 цифра числа a
int sum=b+c +d;
jLabel1.setText(» сумма цифр равна » +sum);

Урок 11

Модернизируем калькулятор.

Задание. Улучшить дизайн и функционал

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

Делаем окошко для отображения чисел и результатов (схожее со стандартным калькулятором Windows), применяем для отображения значений метод Display:

zaniatie11

Дополнительное задание *.

a) Добавить кнопки работы с памятью. (Исходники варианта выполнения тут: https://drive.google.com/folderview?id=0B4icNOfw8DwUfjF3dDF5czNERHNqYXRSLU1QSXA1S0EwWFg0UDh1c290amVhSGJHNGRLcXM&usp=sharing )

b) сделать и вставить 3-мерные кнопки, используя профессиональный графический редактор и/или найденные в интернете или библиотеках образцы. Свойства кнопок в Java Swing. Возможности анимирования кнопок (через Adobe Flash, Photoshop, создания анимированных картинок). Объяснение основных принципов анимации, создания 3D изображений.

Урок 12

Вставка анимированных gif’ов на кнопки в Java Swing .

ыфпцрныфкцшув

Подготовка анимированных gif-изображений. Создайте мультфильм с помощью какой-либо из программ (например, с помощью Flash), эспортируйте в анимированный gif

Урок 13

Делаем игру «крестики-нолики».  Смотри соответствующую лабораторную:

Усовершенствуем игру, используя книгу Я. Файна «Программирование на Java для детей, родителей, дедушек и бабушек».

 

Урок 14

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

Создаем JFrame, перетягиваем на него компоненты JTextField1, JButton1, JLabel1, JLabel2, JLabel3, в обработчик кнопки пишем код:
String str1 = jTextField1.getText();
int i = Integer.parseInt(str1);

int h=i*24;
int m=h*60;
int s=m*60;

jLabel1.setText(«ЧАСОВ » +h);
jLabel2.setText(«МИНУТ » +m);
jLabel3.setText(«СЕКУНД » +s);

Улучшаем внешний вид программы. Должно получиться что-то на подобие:

screen14

В программу добавлена анимированная картинка, иллюстрирующая выражение «время — деньги»: песочные часы переходят в знак $.

Урок 15

Задача.  Исходное данное — стоимость товара, выраженная в рублях. Результаты — наименьшее количество банкнот по 25 руб., 10 руб. и 1 руб., которыми можно заплатить за товар.

Начало, как в предыдущей задаче: создаем JFrame, перетягиваем на него компоненты JTextField1, JButton1, JLabel1, JLabel2, JLabel3.

Объявляем переменные, в которые будем заносить стоимость товара и количества банкнот:

int sum=0;
int r25=0;
int  r10=0;
int r1=0;

В обработчик кнопки («Рассчитать») пишем код:

String str1 = jTextField1.getText();
sum = Integer.parseInt(str1);
r25=sum/25;
r10=(sum-r25*25)/10;
r1=sum-r25*25-r10*10;

jLabel1.setText(«банкнот по 25 руб. » +r25);
jLabel2.setText(«банкнот по 10 руб. » +r10);
jLabel3.setText(«банкнот по 1 руб.» +r1);

Усовершенствуем программу: добавляем textField2, в которую будем заносить цену, которую оплатил покупатель, а также JLabel4 и JLabel5, в которые будем заносить количество купюр, которыми выдается сдача (разница между стоимостью товара и оплатой). Делаем проверку, хватит ли того, что заплатили  чтобы рассчитаться за товар. Например, если товар стоит 250 рублей, а за него оплатили 100, то вывести сообщение «Пожалуйста, доплатите!» с указанием суммы доплаты.

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

Урок 16

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

Решим сначала подзадачу: разница между промежутками времени примерно час и вводятся только минуты. Например,  если промежутки времени 19 часов 5 минут и 19 часов 58 минут, то вводятся 5 и 58, 11-08 и 12-15 — вводятся 8 и 15. В результате должно получиться что-то вроде:

29_07_5

Создаем JFrame, перетягиваем на него компоненты JTextField1, JButton1, JLabel1, JLabel2.

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

29_07
 Сделайте этот код рабочим.

Один из вариантов решения:

29_07_4

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

 

Урок 17

Начнем изучать графику.

Рассмотрим  пример программы, которая строит прямые по двум точкам. Эти точки и цвет линий выбираются случайным образом.  Попробуйте откомпилировать его и запустить на выполнение. (см. http://stackoverflow.com/questions/5801734/how-to-draw-lines-in-java)

(файл назовите LinesComponent.java)

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.LinkedList;

import java.*;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class LinesComponent extends JComponent{

private static class Line{
final int x1;
final int y1;
final int x2;
final int y2;
final Color color;

public Line(int x1, int y1, int x2, int y2, Color color) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
this.color = color;
}
}

private final LinkedList<Line> lines = new LinkedList<Line>();

public void addLine(int x1, int x2, int x3, int x4) {
addLine(x1, x2, x3, x4, Color.black);
}

public void addLine(int x1, int x2, int x3, int x4, Color color) {
lines.add(new Line(x1,x2,x3,x4, color));
repaint();
}

public void clearLines() {
lines.clear();
repaint();
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (Line line : lines) {
g.setColor(line.color);
g.drawLine(line.x1, line.y1, line.x2, line.y2);
}
}

public static void main(String[] args) {
JFrame testFrame = new JFrame();
testFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
final LinesComponent comp = new LinesComponent();
comp.setPreferredSize(new Dimension(350, 200));
testFrame.getContentPane().add(comp, BorderLayout.CENTER);
JPanel buttonsPanel = new JPanel();
JButton newLineButton = new JButton(«New Line»);
JButton clearButton = new JButton(«Clear»);
buttonsPanel.add(newLineButton);
buttonsPanel.add(clearButton);
testFrame.getContentPane().add(buttonsPanel, BorderLayout.SOUTH);
newLineButton.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
int x1 = (int) (Math.random()*320);
int x2 = (int) (Math.random()*320);
int y1 = (int) (Math.random()*200);
int y2 = (int) (Math.random()*200);
Color randomColor = new Color((float)Math.random(), (float)Math.random(), (float)Math.random());
comp.addLine(x1, y1, x2, y2, randomColor);
}
});
clearButton.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
comp.clearLines();
}
});

testFrame.pack();
testFrame.setVisible(true);
}

}

Как начертить прямую линию?

(см. http://www.sbp-program.ru/java/sbp-graphics.htm)

Метод drawLine класса Graphics начертит прямую линию:

g.drawLine(20, 30, 360, 30);

здесь 20, 30 — это координаты x, y начала линии,
360, 30 — координаты конца линии.

«Заливка»

Метод setColor класса Graphics сделает текущим новый цвет:

// Запоминаем исходный цвет;
Color oldColor = g.getColor();
// Создаём синий цвет;
Color newColor = new Color(0, 0, 255);
// Устанавливаем синий цвет;
g.setColor(newColor);
// Чертим линию синим цветом;
g.drawLine(20, 30, 360, 30);
// Восстанавливаем исходный цвет;
g.setColor(oldColor);

Аргументы конструктора new Color(0, 0, 255) — это красный, зелёный и синий цвета соответственно (rgb).

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

Color newColor = new Color(255, 0, 0);

А это чисто зеленый цвет:

Color newColor = new Color(0, 255, 0);

Значения составляющих цвета изменяются от 0 до 255.

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

newColor = new Color(0, 215, 255);

Цвет фона

Задать цвет фона можно методом setBackground:

mainFrame.setBackground(Color.white);

Нарисовать прямоугольник

можно с помощью метода drawRect класса Graphics:

g.drawRect(20, 40, 340, 20);

20, 40 — это координаты верхнего левого угла прямоугольника;
340 — длина;
20 — высота прямоугольника.

Залить прямоугольник цветом

можно с помощью метода fillRect класса Graphics:

newColor = new Color(0, 215, 255);
g.setColor(newColor);
g.fillRect(21, 41, 339, 19);
g.setColor(oldColor);

Нарисовать прямоугольник с закругленными углами

можно с помощью метода drawRoundRect класса Graphics.

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

g.drawRoundRect(20, 70, 340, 30, 20, 15);

первые 4 аргумента как у обычного прямоугольника. Пятый аргумент — 20 — это ширина прямоугольника, в который вписана часть овала сопряжения. Шестой аргумент — 15 — это высота прямоугольника, в который вписана часть овала сопряжения.

Нарисовать овал

можно с помощью метода drawOval класса Graphics:

g.drawOval(20, 110, 150, 60);

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

Нарисовать окружность

можно с помощью метода drawOval класса Graphics:

g.drawOval(200, 110, 60, 60);

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

Нарисовать дугу

можно с помощью метода drawArc класса Graphics:
g.drawArc(280, 110, 80, 60, 0, 180);
первые 4 аргумента как у обычного прямоугольника. Пятый аргумент — 0 — это угол, от которого отсчитывается угол самой дуги. 180 — это угол дуги. Углы отсчитывают от горизонтальной оси: по часовой стрелке отрицательное направление, протв — положительное. В примере 180 градусов (величина дуги) отсчитываем от горизонтальной линии.

Вывести строку

можно с помощью метода drawString класса Graphics:

g.drawString(«Yes», 50, 190);

строка «Yes» будет выведена от точки с координатами 50, 190.

Как задать цвет текста

Чтоб задать цвет текста создадим и установим в графический контекст новый цвет:
newColor = new Color(0, 0, 255);
g.setColor(newColor);
Здесь мы создали чисто синий цвет. А теперь выводим строку синим цветом:
g.drawString(«SBP», 270, 220);

Как начертить график

Сначала начертим координатные оси:
// Draw axes;
g.drawLine(20, 220, 20, 350);
g.drawLine(20, 350, 360, 350);
g.drawString(«Y», 25, 230);
g.drawString(«X», 350, 346);

https://habrahabr.ru/company/alee/blog/117430/
Попробуйте реализовать эти функции в примере:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class Paint8 extends JComponent{

public void paint(Graphics g){
g.drawLine(20, 20, 360, 20);
Color oldColor = g.getColor();
Color newColor = new Color(0, 0, 255);
g.setColor(newColor);
g.drawLine(20, 30, 360, 30);
g.setColor(oldColor);
g.drawRect(20, 40, 340, 20);
newColor = new Color(0, 215, 255);
g.setColor(newColor);
g.fillRect(21, 41, 339, 19);
g.setColor(oldColor);
g.drawRoundRect(20, 70, 340, 30, 20, 15);
g.drawOval(20, 110, 150, 60);
g.drawOval(200, 110, 60, 60);
g.drawArc(280, 110, 80, 60, 0, 180);
int[] arrayX = {20, 100, 100, 250, 250, 20, 20, 50};
int[] arrayY = {180, 180, 200, 200, 220, 200, 200, 190};

g.drawString(«SPB», 270, 220);

g.setColor(oldColor);

g.drawLine(20, 220, 20, 350);
g.drawLine(20, 350, 360, 350);
g.drawString(«Y», 25, 230);
g.drawString(«X», 350, 346);

int[] xArray = {20, 40, 60, 80, 100, 120, 130, 140, 280, 332};
int[] yArray = {350, 345, 340, 310, 290, 280, 275, 273, 271, 269};
int nPoint = 10;
g.setColor(newColor);
g.drawPolyline(xArray, yArray, nPoint);
g.setColor(oldColor);
g.drawString(«y = f(x)», 180, 267);
}

public static void main(String[] args) {
JFrame testFrame = new JFrame();
testFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
final LinesComponent comp = new LinesComponent();
comp.setPreferredSize(new Dimension(400, 400));
testFrame.getContentPane().add(comp, BorderLayout.CENTER);

testFrame.pack();
testFrame.setVisible(true);
}

}

screan_paint2