Java в примерах и упражнениях.                     Т.В. Гурьянова

Основу данного учебного пособия составили теория и задания 30-часового курса по основам Java, который читался Т.В. Гурьяновой школьникам
6-8 классов «Юни-центра XXI» ФПМИ БГУ в 2015/2016 учебном году и учебник по Java Павла Вейника.
Параллельно с решением задач из данной книги ребятам предлагалось чтение книги «Java: быстрый старт».

Введение

Язык Java
Появился в 1990 как язык для программирования бытовых приборов.
У Java есть особенность – для него нужен и компилятор, и интерпретатор.
Чтобы написать, скомпилировать и запустить программу на языке Java, вам нужно скачать JDK 8
Java Developmen Kit — инструментарий разработчика Java).
Скачивается с сайта Oracle бесплатно.

http://www.oracle.com/technetwork/java/javase/downloads/index.htm

Вам нужно запустить скачанный файл и со всем согласиться.
JDK будет установлено в папку C:/Program Files/Java.
Там должна быть подпапка bin, а в ней javac.exe и java.exe – это компилятор и интерпретатор.

Теоретически теперь вы уже можете компилировать и запускать java-программы из этой папки. Но лучше
добавить в переменную окружения PATH путь к папке bin — тем самым обеспечить возможность компилировать
и итерпретировать java-программы из других папок.

Эти видео помогут скачать программу и настроить систему на вашем компьютере:
скачиваем jdk
настраиваем систему для работы с Java

Если у ваc Linux, то разделителем в PATH служит не символ точки с запятой, а двоеточие.

Первая программа

Для того чтобы написать первую программу на Java, скопируйте следующий код в любой текстовый редактор и сохраните в файл с именем HelloWorld.java:

public class HelloWorld {

public static void main(String args[]) {

System.out.println(«Hello, World!»);

}

}

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

Затем:

1. Откройте командную строку (Держа клавишу Shift,  клик правой кнопкой мыши на рабочем пространстве папки, в которой находится файл — в открывшимся меню выбрать «Открыть окно команд»; для более старый версий Windows:  Win+R,набрать в открывшемся окошке сmd, нажать клавишу «ввод»).
2. Перейдите в ту папку, в которой находится ваш файл с исходным кодом (сd имя_папки — перейти в папку, cd .. подняться
по иерархии папок на уровень вверх, d: — перейти на диск d)
3. Запустите команду javac HelloWorld.java. В случае успешной компиляции не будет никаких сообщений, а будет создан файл с именем HelloWorld.class.
Это скомпилированная программа (байт-код).
4. Введите команду java HelloWorld — в консоли появится фраза, которая в команде

System.out.println(«Hello, World!»);

была ограничена двойными кавычками «: Hello, World!

См. видео: первая программа на Java часть I
первая программа на Java часть II

Упражнения.
1. Выведите в консоль (командную строку) какую-нибудь пословицу или поговорку. Для этого замените фразу Hello, World!
на какое-нибудь другое предложение, сохраните файл. Перекомпилируйте и запустите
на выполнение.
2. Выведите в консоль слово Java высотой 8 строк.
Вариант вполнения:

class LargeJava {
public static void main(String[] args){

System.out.println(» JJJJJJJ         AA         VV                    VV         AA «);
System.out.println(» JJ     JJ         AAAA        VV                 VV        AAAA «);
System.out.println(»          JJ         AA     AA       VV            VV       AA      AA «);
System.out.println(»          JJ        AA         AA      VV         VV      AA            AA «);
System.out.println(»          JJ     AAAAAAAAAA     VV      VV     AAAAAAAAAA «);
System.out.println(»          JJ    AA                 AA     VV     VV     AA                  AA «);
System.out.println(» JJ    JJ    AA                    AA     VVVV     AA                     AA «);
System.out.println(»     JJ       AA                         AA     VV     AA                        AA «);
}

}

3. Что будет в консоли в результате выполнения этой программы:

class Аb {
public static void main(String[] args) {
int a, b;
a=3;
b=5;
System.out.println(a+b);
}
}

Если мы хотим вывести с помощью команды System.out.println() несколько значений разных
типов: число, строку,…, то эти значения соединяются +:

System.out.println(«a=»+a+» b=»+b);

Если написать эту программу последней в предыдущей программе, то в консоль
будет выведена еще строка a=3 b=5

Упражнения. (Изменение значений a и b (например, а=200, b=-5) не должны менять написанный вами код)
1. Как поменять код предыдущей программы, чтобы в командной строке после ее выполнения было 35, 3 5?
2. Поменяйте значение переменных a и b местами:
— воспользовавшись третьей переменной с для временного храниния данных;
— не используя третью переменную.

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

byte От -128 до 127
short От -32768 до 32767
int От -2^31до 2^31-1
long От -2^63 до 2^63-1

Для представления дробных чисел предназначены два типа, которые отличаются точностью представления значений
(^ — означает возведение в степень):

float От 1,7 * 10^-38 до 1,7*10^38
double От 3,4 * 10^-308 до 1,7*10^308

Для представления букв, цифр, знаком препинания и других символов использует тип char. Это число от 0 до 215-1, которое является номером символа по таблице Unicode (это унифицированный и общепринятый способ нумерации символов, который используется не только в Java).
Для представления логических значений презназначен тип boolean,
который содержит всего два значения – true и false, истина или ложь, “да” или “нет” в русском языке.
true и false представляются внутри процессора единицами и нулями, как и все остальные типы.

В выражениях могут быть использованы разные знаки, или операции. Для числовых типов это +, -, *, /, % (остаток от деления).
Возможные операции для типа boolean перечислены в таблице вместе с их результатами:

значение значение операция

A B A || B A && B !A
false false false false true
true false true false false
false true true false –
true true true true –

Допустим, нам нужно вывести в консоль максимальное из значений a и b.
Сравнивать числа можно с помощью операторов сравнения: >, <, == (равно), != (не равно).
(Не путайте оператор присваивания = и оператор сравнения ==.)

Результат сравнения двух чисел — логический:

2

3==5 — false (нет)

(3<7)&&(3<8) — true (да)

(3<7)||(13<12) — true (да), поскольку выражение в первой скобке true, во второй false, а

true||false=true (cм. таблицу выше)

Проверьте значения указанных выше выражений, выведя эти выражение в консоль
(Например, последнее выражение можно вывести в консоль так: System.out.println(3<7||13<12) ) В Java есть оператор выбора if: if (условие ) {команды} если условие в круглых скобках true, то выполняются команды в фигурных скобках {}, а если условие false, то команды в фигурных скобках не выполняются. Используя оператор if, задачу нахождения максимального из двух чисел можно решить так: class Max_ab { public static void main(String[] args) { int a, b, max; a = 3; b = 5; max = a; if (b > a) { max = b;}
System.out.println(«Большее из двух чисел» +max);
}
}

Как найти максимальное из трех чисел? Из 5? из 10, … ?

Первое, что приходит в голову — ввести десять переменных: a, b, c, d, e, f,… нет, лучше: a1, a2, a3, a4, … , a10
А если переменных будет гораздо больше?А если переменных будет гораздо больше? (Это лучше всего сделать при помощи массивов — см. дальше.)

Ввод целого числа из консоли осуществляется так:

import java.util.Scanner;

public class In_Example{

public static void main(String[] args)

throws java.io.IOException {

int x;

// Вводим целое число из командной строки

Scanner in = new Scanner(System.in);

x = in.nextInt();

}}

Программа подсчитывает среднее арифметическое четырех оценок,введенных с клавиатуры:
import java.util.Scanner;
public class Points{
public static void main(String[] args)throws java.io.IOException{
Scanner in=new Scanner(System.in);
int N=4;
int a=in.nextInt();
int b=in.nextInt();
int c=in.nextInt();
int d=in.nextInt();
float sum=a+b+c+d;
float average=sum/N;
System.out.println(average);
}
}

Вот ваиант этой программы, выполненный Махдияром Бахреманом в 7 классе

Y_jaBCB42Qk

Как переписать программу,  для произвольного числа оценок (N — любое целое число)?

Циклы
В java всего 3 оператора циклов:

for

while

do … while

Операторы циклов обеспечивают повторяющееся, циклическое выполнение участка кода. Если мы хотим сделать что-то много раз подряд, например, вывести строку “Hello, World!” 100 раз, то у нас есть 2 способа:

написать оператор вывода 100 раз

использовать цикл

Цикл while

Самый простой цикл java – это цикл while. Он выглядит следующим образом:

while (<условие продолжения>) {

<список операторов>

}

(В переводе с английского “while” обозначает “до тех пор, пока”, или ”пока”.) Список операторов иначе называется телом цикла.

Вернёмся к нашем примеру с выводом “Hello, World!” в консоль. Цикл будет выглядеть следующим образом:

while (100 раз не выведено) {

System.out.println(“Hello, World!”);

}

строка 1: int i = 0;
строка 2: while (i < 100) {
строка 3: System.out.println(“Hello, World!”);
строка 4: i++;
строка 5: }

Рассмотрим, как выполняются эти 5 строк кода, по шагам:

шаг 1: строка 1: Создаётся переменная i, на этом этапе она равна 0.
шаг 2: строка 2: Вычисляется значение выражения i < 100 условие продолжения цикла. Значение равно true, поэтому выполняется тело цикла – список операторов, указанный в { } скобках после условия.
шаг 3: строка 3: Вывод строки “Hello, World!”
шаг 4: строка 4: Вывели строку и тут же увеличиваем значение i. Теперь мы можем быть уверены, что мы вывели строку ровно 1 раз, так как i содержит значение 1.
шаг 5: строка 2: Управление снова переходит на строку 2 и снова проверяется условие i < 100. Оно снова истинно, поэтому список операторов внутри цикла будет выполнено ещё раз.
шаг 6: строка 3: Вывод строки “Hello, World!”
шаг 7: строка 4: Снова увеличиваем переменную i. Теперь она равна 2, и мы можем быть уверены, что мы вывели строку ровно 2 раза.
шаг 8: строка 2: Управление снова переходит к проверке условия i < 100. 2 меньше 100, поэтому цикл продолжается, управление переходит к списку операторов внутри цикла – к строке 3.
шаг 10: строка 3: Вывод строки “Hello, World!”
шаг 11: строка 4: Снова увеличиваем переменную-счётчик i. Теперь она равна 3, и мы знаем, что строка “Hello, World!” выведена ровно 3 раза.
Каждый раз после окончания тела цикла мы уверены, что строка “Hello, World!” была выведена ровно i раз. Чтобы не описывать ещё 97 одинаковых повторений, или итераций, цикла, перейдем сразу к последнему повторению. Перед последним повторением i равно 99.
шаг: строка 2: Проверяется условие продолжения цикла, i все ещё меньше 100, поэтому управление переходит в тело цикла.
шаг: строка 3: Вывод строки “Hello, World!”
шаг: строка 4: Переменная i увеличивается на 1 и становится равной 100.
шаг: строка 2: Проверяется условие продолжения цикла, i, равное 100, уже не меньше 100. Значение выражения i < 100 ложно, поэтому управление не переходит в тело цикла. Цикл завершается, и управление переходит к оператору, следующему за } скобкой после цикла. В нашем примере этот оператор не указан.

Пример программы, использующий цикл while

public class WhileSample {
public static void main(String[] args) {
int n=10;
while (n>0){
System.out.println(“тик “ + n);
n—;
}
}
}

Программа при выполнении “тикнет” ровно десять раз:

тик 10
тик 9
тик 8

тик 1

Примеры программ, использующих цикл for

1. Программа находит сумму всех целых чисел от 1 до N

import java.util.Scanner;
public class Sum{
public static void main(String[] args)throws java.io.IOException{
System.out.println(«Vvedite chislo»);
Scanner in=new Scanner(System.in);
int N=in.nextInt();
int sum=0;
int b=1;
for(int i=1; i<=N; i++){
sum=sum+i;
}
System.out.println(sum);
}
}

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

переменная1=переменная2;

переменная=число;

переменная=переменная+1.

(Оператор переменная=переменная1+переменная2; использовать нельзя!)

a_plus_b

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

a_multiple_b

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

Массивы

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

Массив напоминает очередь в банке, в которой никто не знает , как зовут другого, но у каждого есть талончик, на котором написан порядковый номер, соответствующий расположению этого человека в очереди. Все элементы массива имеют одно имя и различаются между собой, как люди в очереди, порядковыми номерами или (что тоже самое) индексами.Возможные следующие варианты объявления массива:тип[] имя;тип имя[];Где тип — это тип элементов массива, а имя — уникальный (незанятый другими переменными или объектами в этой части программы) идентификатор, начинающийся с буквы.Примеры:int[] a;double[] arr1;double arr2[];
Если имя массива a, то первый элемент массива может быть записан, как
a[0], a[1] — второй, пятый — как a[4] и так далее.

Вот пример нахождения максимального из 5 положительных целых числел массива:
class Max {
public static void main(String[] args) {
int[] chisla = new int[5];

chisla[0] = 2;
chisla[1] = 25;
chisla[2] = 234;
chisla[3] = 32;
chisla[4] = 6;

int max = 0;
//если у нас в массиве есть отрицательные числа, то
// в качестве первоначального значения переменной max нужно указать минимальное целое
// число: int max = int.low;

for(int i = 0; i <chisla.length; i++) //chisla.length размер массива (количество элементов), в этом случае равное 5 { if(chisla[i]>max) max = chisla[i];
}
System.out.println(«Большее » +max);
}
}

В этой программе нам впервые встретился оператор for.
Этот оператор повторяет команды, записанные после него в фигурных скобках, пока
истинно условие i <chisla.length; первый раз команда if(chisla[i]>max) max = chisla[i]; выполнится со значением i=0 (поскольку int i = 0; — см. первое выражение
в круглх скобках for), затем значение i увеличится на 1 ( i++ выполняет то же, что и оператор
i=i+1;), проверится условие i <chisla.length; и если ответ «да», то
команда i <chisla.length; выполнится.

в нашем примере команда i <chisla.length; выполняется 5 раз с разными значениями i (0,1,2,3,4)

код
for(int i = 0; i <chisla.length; i++) { if(chisla[i]>max) max = chisla[i];
}

делает то же, что и последовательность

if(chisla[0]>max) max = chisla[0];
if(chisla[1]>max) max = chisla[1];
if(chisla[2]>max) max = chisla[2];
if(chisla[3]>max) max = chisla[3];
if(chisla[4]>max) max = chisla[4];
с той лишь разницей, что код, содержащий for короче и универсальнее.

Мы задавали значение элементов массива в программе с помощью операторов присваивания:
chisla[0] = 2;
chisla[1] = 25;
chisla[2] = 234;
chisla[3] = 32;
chisla[4] = 6;

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

Ввод целого числа из консоли осуществляется так:

import java.util.Scanner;

public class In_Example{

public static void main(String[] args)

throws java.io.IOException {

int x;

// Вводим целое число из командной строки

Scanner in = new Scanner(System.in);

x = in.nextInt();

}}

Зная это, можно переписать ввод элементов массива в предыдущей программе:

Scanner in = new Scanner(System.in);
for(int i=0;i<5;++i){ a[i]= in.nextInt(); }

Упражнение. Перепешите программу нахождения среднего арифметического элементов массива,
сделав ввод значений элементов массива с кавиатуры:

public class ArrayExample{
public static void main(String[] args){
int a[]=new int[10];
//инициализируем массив числами от 0 до 9
for(int i=0;i<10;++i){ a[i]=i; }
float sum=0; //находим сумму элементов массива
for(int i=0;i<10;++i){ sum=sum+a[i]; }
System.out.println(“average=”+sum/10);
}
}

Упражнения с массивами
1. Подсчитайте произведение элементов массива.
2. Вычислите значения функции Y=X*X для X=2,4,6,8,…,28 и разместите их в одномерном массиве Y.
3. Измените порядок следования значений элементов массива на обратный.
4. “Сожмите”’ числовой массив, выбросив из него отрицательные числа.
(Сдвиньте все элементы массива после удаления отрицательных чисел,
пустые места в конце массива заполните нулями.)
5. Определите, является ли заданный массив упорядоченным.
(Упорядоченным (по неубыванию) считается тот массив, у которого каждый следующий элемент не меньше
предыдущего.)
6. Задан массив и некоторое число. Найти, на каком месте расположено число в массиве.
7. В массиве целых чисел найдите самую длинную неубывающую последовательность.
8. Поверните квадратный (количество строк равно количеству столбцов) массив на 90, 180, 270
градусов по часовой стрелке.
(В этой задаче требуется не положить все цифры “на бок” или поставить на голову,
а передвинуть элементы в указанном порядке.)
9. Выясните, есть ли одинаковые числа:
(a) в одномерном массиве;
(b) в двумерном массиве;
10. Подсчитайте количество уникальных (неповторяющихся) чисел в массиве.
11. В массиве содержатся числа 0, 1, 2 и ничего кроме них. Упорядочить массив по неубыванию.
12. Взяв за основу предыдущую задачу, упорядочить массив по убыванию.
Можно менять местами лишь соседние элементы.
13. Задан массив чисел. Заменить каждое число суммой предыдущих:(a) включая заменяемое(b) исключая заменяемое.

Упражнения без массивов

1. a и b — натуральные числа. Найти a*b, используя арифметические операции
вида +,-,=,<>.

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

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

3. a и b — натуральные числа. Вычислить частное q и остаток r
при делении a на b, не используя операцию % и функцию Math.round().

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

5. Сделайте то же, разбив число на три слагаемых.

6. Распечатайте квадраты чисел от 1 до n, используя из арифметических
операций лишь сложение.

7. Напишите программу для вычисления суммы s квадратов чисел от 1 до n.

8. Вычислите произведение чисел от n до m, где n<m; n, m — натуральные числа, пользуясь
циклом for.

9. Напишите программу, которая находит и печатает все совершенные
числа от 2 до x. Совершенное число — это число, равное сумме
всех своих делителей, включая единицу, но исключая само число. (Например,
28=1+2+4+7+14, 6=1+2+3 — совершенные числа.)

10. Напишите программу для вычисления суммы кубов четных чисел и
квадратов нечетных чисел от 1 до n, результаты записать в переменные
s_kvadr, s_kub.

11. Вычислите сумму чисел от 1 до n, возведенных в степень m.

12. Найдите все пифагоровы числа a, b и c, т.е. такие a, b, c — натуральные числа, что
a<=20, b<=20 и a^2+b^2=c^2. (^ — означает возведение в степень)

13. Введите число и определите, простое оно или составное.

14. Распечатайте первую сотню простых чисел.

15. Составьте программу, печатающую разложение на простые множители заданного
натурального числа, большего нуля. (Другими словами, требуется напечатать только простые
числа и произведение напечатанных чисел должно быть равно n; если n=1,
печатать ничего не надо.

16. Найдите наибольший общий делитель (НОД) двух целых чисел a и b:
(a) используя нахождение делителей;
(b) с помощью алгоритма Евклида (a>b):
НОД(a,b)=НОД(a-b,b)=…=НОД(c,0)=c;

17. Найдите НОК(a,b) — наименьшее общее кратное; тот факт, что
НОД(a,b)*НОК(a,b)=a*b использовать нельзя.

 

Упражнения

1. Даны величины трех углов четырехугольника АВСD: <A=a градусов, <B=b, <C=c градусов. Является ли этот четрехугольник параллелограммом, трапецией или не является ни параллелограммом, ни трапецией?

2. Найдите сумму S и произведение P чисел, кратных 3 от 1 до n.

3. Найдите числовые значения функций y, соответствующие произвольно взятому значению аргумента x. Функции заданы графиком:

4. Определите, лежит ли точка A(a,b) над прямой y=kx+l, над ней или под ней. 5. Лежат ли точки A(x1,y1), B(x2,y2), C(x3,y3) на одной прямой? 6. Решите линейное неравенство: ax>=b.

7. Решите квадратное уравнение ax^2+bx+c=0. (^ — значок возведения в степень)

8. Принадлежит ли точка A(x,y) заштрихованной фигуре:

9. Найдите k-е простое число в арифметической прогрессии 11, 21, 31, 41,… Приведите ответы для k=1, 10, 100, 1000 и т.д.

10. Среди первых 1000 членов последовательности an найдите номер и значение первого отрицательного члена,
если an=100+n-n^3

11. Найдите номер первого члена последовательности x=(n^2+n-)/(n^2+n+1), который отличается от 1 меньше, чем на е.

12. Найдите наименьшее натуральное число x, удовлетворяющее условию x^3-x^2=100.

13. Найдите наибольшее двузначное натуральное число x, удовлетворяющее условию x^3+10x^2=810000.

14. Разбейте заданное число
(a) на два слагаемых
(b) на три слагаемых
всеми различными способами. Разбиения, отличающиеся лишь порядком слагаемых,
разными не считать.

15. Два натуральных числа называются дружественными, если каждое из них равно сумме всех делителей другого, кроме самого
этого числа. Найти все пары дружественных чисел от n до k.

16. Разложить дробь p/q на сумму дробей вида 1/n: 3/7=1/3+1/11+1/231.
Замечание. Программа производит приближенные вычисления.

17. Любую целочисленную денежную сумму больше 7 р. можно выплатить без сдачи трешками и пятерками (докажите).
Для данного n найти все такие неотрицательные a и b,что 3а+5b=n.
Замечание. Эту задачу можно решить несколькими способами, но быстрее будет работать та программа, в которой всего
один цикл.

18. Сообщество роботов живет по следующим законам:
— один раз в год они объединяются в группы по 3 или по 5 роботов;
— за год группа из 3 роботов собирает 5 новых, а группа из 5 роботов собирает 9 новых;
— роботы объединяются в группы так, чтобы собрать за год наибольшее количество;
— каждый робот живет 3 года после сборки.

Известно начальное количество роботов. Все они только что собраны. Сколько роботов будет через N лет?

Алгоритм:
1. Число роботов разбиваем на 3*x+5*y, причем из всех вариантов к условию задачи подходит тот, в котором y-наибольший
(групп по 5 роботов должно быть насколько возможно больше, поскольку в группе из 3-х роботов каждый робот ‘работает’ со скоростью
5/3 робота в год, а в группе из 5 — 9/5, a 5/3<9/5, и в группе по 5 роботов один робот произведет за год больше); наибольший y можно найти,
вычитая из первоначального числа роботов 3 до тех пор, пока разностьне будет делиться на 5;
2. В одномерном массиве a[3] будем хранить количества роботов за текущие три года; после окончания очередного года a[2]=a[2]-a[0],
поскольку робот живет три года после сборки, а a[0]=a[1]; a[1]=a[2]; a[2]=количество роботов, произведенных в новом году.

Замечание. Первоначальное количество роботов может быть 3,5, или любое натуральное число больше 8 — имеет смысл проверять, правильно ли
введены данные, если нет — просить повторить ввод.

19. Дано натуральное n. Выяснить, имеются ли среди чисел n, n+1,… , 2n числа-близнецы, то есть, простые числа, разность между которыми равна 2.

20. Ввести период дроби. Напечатать числитель и знаменатель.

21. Натуральное число из n цифр является числом Армстронга, если сумма его цифр, возведенных в n-ю степень, равна самому числу: 153=1^3+5^3+3^3.
Получить все числа Армстронга для n=2, 3, 4.

22. Образуем числовую последовательность следующим образом:
— начальный элемент — произвольное натуральное число, кратное трем;
— за любым элементом последовательности следует число, равное сумме кубов всех цифр данного элемента.

Теорема. Любая такая последовательность становится (начиная с некоторого места) постоянной равной 153.

Пример. Начнем с 33: 3^3+3^3=54

5^3+4^3=189
1^3+8^3+9^3=1242
1^3+2^3+4^3+2^3=81
8^3+1=153
1^3+5^3+3^3=153
1^3+5^3+3^3=153
Используйте свой компьютер для доказательства этой теоремы.

23. Дано натуральное число n. Выбросить из записи числа все четные цифры. Порядок оставшихся цифр оставить прежним.
Например, из 1283234 нужно получить 133.

24. Дано натуральное число n. Определить, является ли оно палиндромом (читается одинаково
сначала и с конца — 12321).

25. Найти остаток от деления числа, записанного с помощью k семерок на число a.

26. Cреди простых чисел, не превосходящих N, найти такое, в двоичной записи которого максимальное число единиц.

27. Найти двоичное представление для (a) чисел Ферма, которые представимы в следующем виде: 2^(2^t)+1;
(b) четных совершенных чисел вида 2^(p-1)*(2^p-1).

28. Вывести на экран картинку, изображающую умножение «столбиком» двух заданных целых чисел.
29. Написать программу, вычисляющую 1- 1\2+1\3-…-(-1)в n степени , представить ответ в виде p/q, p,q несократимые.
public class P_q {
public static void main(String[] args) {

long b,d,i,n,f,i1,b2,d2,d1,a1;
n=10;
b=1;
d=1;
for(i =2 ; i<=n;i++){
if(i%2==0)a1= -1;
else a1=1;
long[] taken = func(d,i);
d1=taken[0];
i1=taken[1];
f=taken[2];
b2=b* i1+a1*d1;
d2=f*i1*d1;
taken = func(b2,d2);
b=taken[0];
d=taken[1];
f=taken[2];
System.out.println(b+»/»+d);
}
}

static long[] func(long a, long b){
long c,d,i;
long[] ret = new long[3]; i
if ((a-b)>=0){c=b; d=a;}
else {c=a;d=b; }
for(i=1; i<=c;i++){
if ((a%i==0)&((b%i)==0)){ret[2]=i;}
}
ret[0]=Math.round((double)a/(double)ret[2]);
ret[1]=Math.round((double)b/(double)ret[2]);
return ret;
}
}

 

Списки

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

Односвязным списком (singly-linked list) называется последовательность элементов, каждый из которых содержит данные и указатель на следующий элемент.

Головой (head) списка является указатель на первый элемент, а конец (tail) помечен нулевым указателем.

Двусвязный список (doubly-linked list) выглядит так:

null

Элементы списка (item), как и элементы массива, имеют один и тот же тип. В Java массивы имеют фиксированную длину. Список может менять свой размер во время исполнения программы, при этом не обязательно указывать размерность при его создании.

Список ограничивается лишь последовательным доступом: мы можем просматривать элементы списка от одного к строго следующему, формировать список добавлением элементов в его конец. В массиве мы от a[10] элемента можем перейти сразу к a[3], в списке, мы можем от s10 перейти либо к s11, либо s9 (в случае двусвязного списка) и чтобы добраться до s3, нужно либо вернуться в начало списка, перейти к s1, s2, а уж только после этого к s3 (в случае двусвязного списка можно еще «пропутешествовать» по s8, s7, s6, s5 и s4).

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

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

Будем обозначать список S из n элементов s=<s0,s1,s2,… ,sn-1=»»>, где n — длина последовательности. Длина в процессе работы со списком может меняться, но в любой заданный момент времени определенна и конечна.

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

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

Довольно часто в списках допускаются послабления в строгой дисциплине последовательного доступа. В частности, с помощью специальной встроенной функции (метода) допускают рассмотрение любого элемента последовательности. Подобно тому, как выключив видеоплеер, а затем снова загрузив в него фильм (фильм начнется при этом с самого начала), для списка можно описать функцию Reset, а эквивалентом такой функции может быть функция SetPosition(s,0), которая устанавливает порядок рассмотрения элементов списка в начало, а использование этой функции с параметром k SetPosition(s,k) подразумевает позиционирование списка в любое место k (0<=k<длины списка).

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

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

Упражнение.

1. Опишите список в виде класса. Элементы его — целые числа.

Методы класса:

— инициализация пустого списка,

— добавление и удаление элемента в список

— геттер и сеттер (принято не обращаться напрямую к свойствам объекта (считывать и перезаписывать значения), которые, как правило private, а через специальные функции: object.get(5); object.set(3); ),

— проверка, есть ли еще элементы в списке

— восстановления (reset)

— организации прохода по списку (Iterator)

— …

Например, можно начать так:

class ListElement{

class Iterator{

}

}

public class List{

private int head; //голова списка

int tail; // хвост списка

}

  1. Поищите описание класса, реализующего список на Java в интернете.
  2. Попробуйте с помощью написанного вами списка решить какую-нибудь практическую задачу (например, создать список имеющихся у вас учебников по Java и отсортировать его).

Коллекции – это объекты, в которых можно хранить другие объекты. Коллекция – это такой ящик, в который можно класть и вынимать разные объекты. Внутри ящика объекты организуются специальными образом для ускорения поиска, добавления новых объектов и вынимания объектов из ящика (удаления объектов из коллекции). Классы коллекций поставляются вместе с JDK.

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

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

Интерфейс List (список) предсталяет список объектов. Объекты можно добавлять в список (метод add()), заменять в списке (метод set() или add(индекс,объект)), удалять из списка (метод remove()), получать объект коллекции по его номеру (метод get(<номер объекта>)). Классы ArrayList и LinkedList – самые часто используемые реализации инерфейса List.

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

класса коллекций ArrayList могут менять свой размер во время исполнения программы, при этом не обязательно указывать

размерность при создании объекта.

Рассмотрим код программы:

import java.util.ArrayList;

public class My_List{

public static void main(String[] args){

 

ArrayList list = new ArrayList();

System.out.println(«Initial size of list : « + list.size());

list.add(«CAT»);

list.add(«DOG»);

list.add(«MEN»);

list.add(«TREE»);

list.add(33);

list.add(3,»FlOWER»);//inserts objects «FlOWER» into array at index 4

System.out.println(«The size of list is: « + list.size());

System.out.print(«The list is: « + list);

list.remove(«CAT»);

list.remove(4);

System.out.println(«The size of list is: « + list.size());

System.out.print(«The list is: « + list);

}

}

Элементы объекта ArrayList могут быть любых типов (в предыдущем примере

вместе с однотипными строковыми данными мы ввели число 33 и программа его добавила в объект класса ArrayList нисколько не усомнившись

в правильности). На практике нецелесообразно позволять такие вольности, поэтому лучше всего при создании объекта класса ArrayList, фиксировать

тип данных, которые будут хранится в списке:

import java.util.ArrayList;

public class My_List2{

public static void main(String[] args){

ArrayList<String> l = new ArrayList<>();

l.add(«One»);

l.add(«Two»);

l.add(«Three»);

System.out.println(l.get(l.size()-1));

for (int i = 0; i < l.size(); i++)

{

System.out.println(l.get(j));

}

}}

Помимо интерфейса List есть еще другие часто используемые интерфейсы, реализующие такие структуры данных, как множество (Set),

отображение или ассоциативный массив (Map),… (о них мы расскажем позже).

По элементам коллекции можно пробежать с помощью циклов, как это показано в последнем примере, но не всегда (например, в Set нельзя).

Когда нужно пробежать по элементам коллекции вместо привычного int i правильнее использовать специально созданный для этого объект —

итератор — Iterator:

import java.util.ArrayList;

import java.util.Iterator;

public class My_List{

public static void main(String[] args){

ArrayList list = new ArrayList();

list.add(«DOG»);

list.add(«MEN»);

list.add(«TREE»);

list.add(3,»FlOWER»);

Iterator<Integer> i =list.iterator();

System.out.println(«распечатка с помощью итератора list.iterator()»);

while (i.hasNext()) {

System.out.println(i.next());

}

}

Вот листинг выполнения приведенного в этой главе кода программ:

results_of_My_List

Очередь — последовательный список, в котором включение элементов производится на одном конце, а исключение на другом: см. http://csc.minsk.by/beta/?p=101

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

Для написания приложений на Java, работающих на смартфонах под андроид, нужно установить Android Studio. Один из вариантов компиляции проектов — подключить смартфон к компьютеру через USB, включить на нем «режим отладки» в настройках, скачать adb драйвер, соответствующей марке телефона. При компиляции проекта выбрать «Choose a running device».

Продолжение следует…

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

методические материалы по информатике