Программирование на Java
Задачник к онлайн курсу и учебнику
Блок 1. Раздел 3. Циклы
Задачник для самостоятельной практики
На онлайн занятиях решаем задачи, разбираем трудные места
Преподают опытные программисты, с нуля до мобильных приложений

Программирование на Java

Задачник
к онлайн курсу и учебнику
Блок 1. Раздел 3. Циклы

Задачник для самостоятельной практики
На онлайн занятиях решаем задачи, разбираем трудные места
Преподают опытные программисты, с нуля до мобильных приложений
На этой странице приведены задачи к разделу 3. В скобках указано, для какой темы та или иная задача. Для части задач дано решение, разобранное в учебнике, для других решения нет - его должны найти вы.
Совет. Для самопроверки задач на вычисления очень удобно использовать какой-либо инженерный калькулятор. В том числе есть варианты онлайн, например, wolframaplha - там нужно просто написать выражение в окно ввода, и сразу будет ответ. Например, для задачи "посчитать 1-2+3-4+5-6" можно ввести этот же текст в окно ввода и получить ответ -3, см. https://www.wolframalpha.com/input/?i=1-2%2B3-4%2B5-6 Программа не только всё посчитает, но ещё и покажет результат расчета по шагам, что тоже может помочь.

Кстати, если вдруг вам сложно установить Eclipse, Netbeans или IntelliJIdea, то можно сразу пробовать программировать в компиляторах онлайн. Вот например, https://www.jdoodle.com/online-java-compiler/.
Задача 1.3.1 (есть в учебнике, тема 1). Как сделать так, чтобы этот код печатал числа не от 0 до 99, а от 50 до 201?
//	Заведем переменную i целого типа и равную нулю
	int i = 0;

//	знак цикла while означает 
//	«повторяй блок кода { … } пока верно условие внутри скобок», то есть  (i < 100)
	while (i < 100) {
		System.out.println (i);  // распечатать текущее значение i
		i = i + 1; 	// увеличить i на 1
	}
Решение
В первой строчке объявлена переменная счётчик, которую мы будем постоянно печатать в цикле. Раз уж нам нужны числа от 50, то придадим переменной i новое начальное значение:

int i = 50;
while (i <= 201) // условие поменяем, чтобы дойти до 201 включительно
{
System.out.println (i); // сама печать
i ++;
}


Задача 1.3.2 (есть в учебнике, тема 2). Что будет напечатано по итогу выполнения этого кода и почему?
int x = 10;
int y = 100;

for ( ; x < y; x += 20, y --) ;

System.out.println ("x равен " + x + " ; y равен " + y);
Правильный вывод программы
x равен 110 ; y равен 95
Объяснение
Сначала x = 10, y = 100. В цикле x каждый раз увеличивается на 20, в то же время y уменьшается на 1. Рассмотрим значения переменных на каждом обороте цикла:
1) x равен 10 ; y равен 100
2) x равен 30 ; y равен 99
3) x равен 50 ; y равен 98
4) x равен 70 ; y равен 97
5) x равен 90 ; y равен 96
В последний раз выполнена операция, условие стало неверным и после цикла на печати будет выведено: x равен 110 ; y равен 95 .
Пример 1.3.3 (есть в учебнике, тема 3) Посчитаем сумму чисел 1, 2, …, 9.
Решение
int i = 1; 
//заведем переменную, в которой будем накапливать результат: 
int sum = 0; 
while (i < 10) {  
     sum += i; // увеличить значение суммы на величину i=1,2,…9 
     i ++;  
} 
System.out.println ("Сумма равна" + sum);
В этом примере мы использовали базовый приём - кроме переменной счётчика, которая позволяет сделать последовательность 1,2,3,..., мы ввели отдельную переменную для хранения результата. Сейчас это сумма всех чисел, и мы назвали эту переменную sum. В начале она равна нулю. На первом обороте к ней прибавляется i=1, на втором i=2, и так постепенно накапливается результат суммирования всех нужных чисел 1+2+3+4+5+6+7+8+9.

В последующих примерах мы часто будем вводить свою переменную для хранения результата, и другие переменные для хранения всех промежуточных расчетов. Так что делайте переменных, сколько вам нужно, под каждый расчёт.
Пример 1.3.4 (есть в учебнике, тема 3). Посчитаем сумму нескольких чётных чисел 8+10+12+14.
Правильный вывод программы
44
Решение
//заведем переменную, в которой будем накапливать результат: 
int sum = 0; 
// ясно, что нужно добавить каждое второе число, пишем i += 2 
for (int i = 8; i <= 14; i +=2)   
     sum += i;

// После цикла программа продолжает выполнять код. 
// Например, можно распечатать результат всех вычислений:
System.out.println (sum);
Пример 1.3.5 (есть в учебнике, тема 3). Посчитаем произведение 4*8*12*16*20. То есть нужно все эти числа перемножить между собой.
Правильный вывод программы
122880
Решение
// заведем переменную, в которой будем накапливать результат: 
// product по-английски «произведение» 
int prod = 1; // начальное значение 1, а не 0, иначе 0 умножить на любое число опять 0.
// ясно, что нужно добавить каждое четвертое число, пишем i += 4 
for (int i = 4; i <= 20; i +=4)
     prod *= i;  
// имейте в виду, что перемножая такие числа, мы будем получать очень большой результат
// проверяйте, что вы не выходите за максимальное значение для целых int
// если что используйте double или long
// подробнее о максимальных числах для разных типов раздел 1 тема 5.

System.out.println (prod);
Пример 1.3.6 (есть в учебнике, тема 3). Посчитаем выражение 1-2+3-4+5-6.
Правильный вывод программы
-3
Решение
// заведем переменную, в которой будем накапливать результат: 
int sum = 0; 
int znak = 1;
// чтобы получить смену знака будем умножать znak  на -1 
for (int i = 1; i <= 6; i ++)  { 
    sum += znak*i;  
    znak *= -1; // меняем знак, с -1 на 1 и обратно каждый оборот цикла
}

System.out.println (sum); 
Пример 1.3.7 (есть в учебнике, тема 3). Посчитаем значения последовательности чисел по такому правилу:
a1 = 5,
a2 = a1*3 + 1,
a3 = a2*3 + 1,

a100 = a99*3 + 1.

Если a100 больше 2000000000000000000l, то вывести на экран фразу «до фига получилось!» :) Также вывести количество пройденных оборотов цикла.
Такие последовательности будут нужны, если вас интересует набор чисел, заданных любым соотношением и следующее вычисляется из предыдущего по известному правилу. В коде это выглядит так же, как и в задании:
Правильный вывод программы
До фига получилось!
Оборотов цикла было 100
Решение
// Заведем переменную, чтобы хранить очередное число a 
long a = 5; // именно long, а не int, иначе будет превышен лимит типа данных
int i = 1; 
while (i <= 100) { 
// Рассчитать следующее из предыдущего по правилу: 
    a = 3*a + 1;  
    i++; 
} 
// Переменные живут дальше после цикла, 
// можно анализировать работу цикла по их значениям
// l в конце числа указывает на тип long, иначе число слишком большое для int
if (a > 2000000000000000000l) { 
    System.out.println ("До фига получилось!"); 

System.out.println ("Оборотов цикла было " + (i-1)); // (i-1) так как последний i++ уже лишний
// Сейчас будет 100 оборотов, но если в будущем обрывать цикл с помощью break,
// то уже будет неизвестно заранее, сколько на самом деле прошло оборотов.
Пример 1.3.8 (есть в учебнике, тема 3). Распечатайте на экран вопрос, "Сколько будет 4*5?". Введите число с ответом клавиатуры. Если пользователь ответил правильно, то поздравьте его и завершите программу. Если же пользователь ответил неверно, то переспросите его, введите новое число, снова проверьте на правильность ответ и так далее, пока не ответит правильно.

Важно понимать – вы можете заставить программу повторить любой набор действий много раз, а не только вычислять что-либо в цикле.
Решение
// заведем объект scan класса Scanner для работы с клавиатурой 
Scanner scan = new Scanner (System.in); 
//спросим 
System.out.println ("Сколько будет 4*5?"); 
int ans = 0; // ans от слова answer - ответ пользователя
do { 
    ans = scan.nextInt (); 
    if (ans == 20) { 
        System.out.println ("Снимаю шляпу :) пока!"); 
        break; // завершить цикл, если человек угадал 
    }
    // продолжить спрашивать до бесконечности
    System.out.println ("Неверно, попробуйте ещё");
} while (true); // true всегда равно правде, поэтому цикл вечный 
Пример 1.3.9 (есть в учебнике, тема 3). Напишите калькулятор. Предложите пользователю ввести число, затем знак одной из арифметических операций +,-,*,/ . Введите ещё число, выполните операцию, распечатайте результат и предложите ввести новую. Если пользователь введёт q, то остановите программу.

Вариант работы программы:
Остановка программы буквой q
Введите число
10
Введите операцию
-
Введите число
100
Результат -90
Введите операцию
*
Введите число
2
Результат -180
Введите число
q
Окончательный результат -180
Пример 1.3.10 (есть в учебнике, тема 4). Распечатайте в программе таблицу умножения чисел от 1 до 10. На экране должно получиться:

1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
Решение
System.out.println  ("Это таблица умножения!"); 
for (int a = 1; a < 10; a ++) {  
//внутри первого цикла можно сделать 2ой 
    for (int b = 1; b < 10; b ++) 
        System.out.print (" " + a*b); //печатаем числа через пробел 
    System.out.println (); //поставить enter для новой строчки
}
Пример 1.3.11 (есть в учебнике, тема 4). Распечатать символ a, так что в первой строке всего один символ, во второй - два, в третьей - три, и так далее до 5.

Будет вот так:
a
aa
aaa
aaaa
aaaaa
Решение
for (int i = 1; i <= 5; i ++) { // переменная i отсчитывает строки 
    for (int j = 0; j < i; j ++) { // печатаем букву i раз 
        System.out.print ('a'); // печатаем 'a' без пробелов 
    } 
    System.out.println (); // поставить enter для новой строчки 
} 
Пример 1.3.12 (есть в учебнике, тема 4). Распечатать символ a, так что в первой строке всего один символ, во второй - два, в третьей - три, и так далее до 5. Распечатать последовательно три таких "пирамидки".

Будет вот так:
a
aa
aaa
aaaa
aaaaa
a
aa
aaa
aaaa
aaaaa
a
aa
aaa
aaaa
aaaaa
Решение
int k = 0; 
while (k < 3) { 
    //внутренние циклы те же, что и выше 
    for (int i = 1; i <= 5; i ++) { // переменная i отсчитывает строки 
        for (int j = 0; j < i; j ++) { // печатаем букву i раз 
            System.out.print ('a'); // печатаем 'a' без пробелов 
        } 
        System.out.println (); //поставить enter для новой строчки 
    } 
    k ++; 
} 
Пример 1.3.13 (есть в учебнике, тема 4). Аналогично предыдущему примеру 1.3.11 распечатать контур пирамидки. То есть должно получиться:

a 
 a 
  a 
   a 
    a
Решение
for (int i = 1; i <= 5; i++) { // переменная i отсчитывает строки
    for (int j = 0; j < i-1; j++) { // печатаем букву i-1 раз
        System.out.print(' '); // печатаем пробелы вместо старых 'a'
    }
    System.out.println('a'); //поставить 'a' и enter для новой строчки
}
Пример 1.3.14 (Тема 1-3). С помощью цикла вычислите:

а) 1+2+3+4
б) 1+2+3+4+5+6+...+100
в) 2+4+6+8
г) 2+4+6+8 + ... + 100
д) 3+4+5+6+7+8+9+...+100
е) (2+4+8+16+32+64+128)*100
Вывод программы
а) 10
б) 5050
в) 20
г) 2550
д) 5047
е) 25400

Пример 1.3.15 (Тема 1-3). С помощью цикла рассчитайте значение выражений:
а) 10+20+30+40 (ответ равен 100) 
б) 10+20+30+40+...+100 (ответ равен 550) 
в) 30+40+...+100 (ответ равен 520) 
г) 3+6+9+12+15+18 (ответ равен 63) 
д) 2 + 4 + 8 + 16 + 32 + 64 + 128 //каждый раз умножаем слагаемое на 2 
е) 4 + 9 + 16 + 25 + 36 + 49 + 64 (ответ равен 89439.0) //каждый раз возводим слагаемое в квадрат 
ж) 10 -20 +30 - 40 +50 - 60 + 70 //то плюс, то минус 
з) 100 - 99 -98 -97 - 96 -... - 3 -2 -1 //не всё здесь нужно пихать в цикл и можно использовать прошлые задачи как готовые блоки 
Вывод программы
а) 100
б) 550
в) 520
г) 63
д) 254
е) 89439.0
ж) 40.0
з) -4850
Пример 1.3.16 (Тема 1-3). Вычислить последовательно числа и все вывести на экран:
a1 = 10
a2 = 10 + a1
a3 = 10 + a2
....
a100 = 10 + a99
Вывод программы
В консоли это будет выглядеть примерно так:
Это a1 и она равна 10
Это a2 и она равна 20
Это a3 и она равна 30
...
Решение
int a = 10;
int i = 1; // это просто счетчик

while(i<=100){
a=a+10;
System.out.println("Это a"+i + " и она равна " + a);
i++;
}
Пример 1.3.17 (Тема 1-3). Вычислите последовательно числа (даны ниже) и выведите их на экран, и также посчитайте их сумму. То есть конкретно посчитайте a1+a2+a3+...+a10

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

Имейте в виду, что a1, a2, a3 нужно не только вычислить по отдельности, но ещё и сложить их всех между собой в какой-то отдельной переменной, чтобы посчитать сумму. Значение результата может не поместиться в double - оцените, начиная с какого номера a становится Infinity. Infinity обозначает бесконечность и это уже не обычное число, это значит, что программа работает не нормально. Старайтесь исправлять ситуации в боевых ситуациях, чтобы не приходилось иметь дело с такими огромными числами, а пока просто познакомимся с ними.
a1 = 5
a2 = sqrt ( 10+ a1*a1*a1/1000000 ) + 2* a1*a1
a3 = sqrt ( 10+ a2*a2*a2/1000000 ) + 2* a2*a2
...
a10 = sqrt ( 10+ a99*a99*a99/1000000 ) + 2* a99*a99
Вывод программы
В консоли это выглядит так:

Это a1 и оно равно 53.16229742434199
При этом сумма равна 53.16229742434199
Это a2 и оно равно 5655.645680390971
При этом сумма равна 5708.807977815313
Это a3 и оно равно 6.397308146333617E7
При этом сумма равна 6.397879027131399E7
Это a4 и оно равно 8.185110815506304E15
При этом сумма равна 8.185110879485094E15
Это a5 и оно равно 1.3399207812497706E32
При этом сумма равна 1.3399207812497706E32
Это a6 и оно равно 3.590775400049991E64
При этом сумма равна 3.590775400049991E64
Это a7 и оно равно 2.5787335947208342E129
При этом сумма равна 2.5787335947208342E129
Это a8 и оно равно Infinity
При этом сумма равна Infinity
Это a9 и оно равно Infinity
При этом сумма равна Infinity
Это a10 и оно равно Infinity
При этом сумма равна Infinity
Решение
double a = 5;
double sum = 0;
int i = 1; // это просто счетчик
while (i <= 10) {
a = Math.sqrt(10 + a * a * a / 1000000) + 2 * a * a;
sum = sum + a;
System.out.println("Это a" + i + " и оно равно " + a);
System.out.println("При этом сумма равна" + sum);
i++;
}
Пример 1.3.18 (Тема 4). Выведите на экран последовательность строк (можно посимвольно, но и можно как строки):
a
aa
aaa
aaaa
aaaaa
....
aaaaaaaaaaaaaaaaaaaa  //20 символов a
Пример 1.3.19 (Тема 4). Выведите на экран номера полей из морского боя:
а1 б1 в1 г1 д1 е1 ж1 з1 и1 к1
а2 б2 в2 г2 д2 е2 ж2 з2 и2 к2
а3 б3 в3 г3 д3 е3 ж3 з3 и3 к3
…
а10 б10 в10 г10 д10 е10 ж10 з10 и10 к10
Пояснение
Можно прибавлять к переменным типа char единицу, чтобы получить следующую букву алфавита. char c = 'a'; c += 1; так происходит, потому что char хранит коды букв и все коды идут по алфавиту. Так что увеличив код на 1, мы получаем следующую букву алфавита.
Пример 1.3.20 (Тема 1-3). Рассчитайте, используя циклы:

а) 5 + 10+ 15+ 20+ … +1000 (будет 100500)
б) 5*7+10*14+15*21+20*28+…+1000*1400 (будет 94034500)
в) 5*7-10*14+15*21-20*28+…+1000*1400 (будет -703500)
г) 1*2*3*4*5*…*10 (будет 3628800)
д) 5 + 10+ 15+ 20+ … +1000 - 1*2*3*4*5*…*10 (будет -3528300)
е) 5500 – 5400 – 5300 – 5200 – 5100 – 5000 – 4900 - … - 100 (будет -154000)
// 3^10 читается как 3 в степени 10
ж) 3 + 3*3 + 3*3*3 + 3^4 + …. + 3^10 (будет 88572)
з) 3 - 3*3 + 3*3*3 - 3^4 + …. - 3^10 (будет -44286)

Создайте мобильные приложения и изучите Java с преподавателем
Самый востребованный язык на рынке труда
Группы до 15 человек, преподают опытные программисты
Проверим каждую строчку вашего кода
Cертификат и портфолио - своя мобильная игра и магазин
Создайте мобильные приложения и изучите Java с преподавателем
Самый востребованный язык на рынке труда
Группы до 15 человек, преподают опытные программисты
Проверим каждую строчку вашего кода
Cертификат и портфолио - своя мобильная игра и магазин