In the present chapter we will get familiar with how to repeat blocks of commands, known in software development as "loops". We will write several loops using the for
operator in its symplest form. Finally, we will solve some practical problems that require repeating series of actions, using loops.
Often in programming we have to execute a block of code multiple times. In order to do that we use the so called loops. Let us look at an example of a for
loop that passes sequentially through the numbers from 1 to 10 and prints them:
The loop starts with the operator for
and passes through all values for a particular variable in a given range, for example the numbers from 1 to 10 (included), and for each value it performs a series of commands.
Upon declaring the loop, you can specify a start value and an end value. The body of the loop is enclosed in curly brackets { }
and represents a block of one or multiple commands. The figure below shows the structure of a for
loop:
In most cases a for
loop is run from 1
to n
times(for example from 1 to 10). The purpose of the loop is to pass sequentially through the numbers 1, 2, 3, …, n and for each of them to perform a particular action. In the example above, the i
variable is assigned values from 1 to 10 and the current value is printed in the body of the loop. The loop repeats 10 times and each of these repetitions is called an "iteration".
Write a program that prints the numbers from 1 to 100. The program does not accept input and prints the numbers from 1 to 100 sequentially, each on a separate line.
We can solve the problem using a for
loop , which will assign values from 1 to 100 to the variable i
and print the numbers in the body of the loop:
Start the program with [Shift+F10] and test it:
Test your solution here: https://judge.softuni.bg/Contests/Practice/Index/655#0.
You should get 100 точки (fully accurate solution).
In software development, we regularly need to write loops, dozens of times a day. That is why in most integrated development environments (IDE) there are code snippets for writing loops. One such exapmle is the snippet for for
loop in IntelliJ IDEA. Write down fori
in the Java code editor in IntelliJ IDEA and press [Enter]. IntelliJ IDEA will run the snippet and you will see the entire for
loop written down. All you have to do now is to add the values.
Try it yourself, in order to master using the code snippet for for
loop в IntelliJ IDEA.
Write a program that finds all numbers within the range [1 … 1000], that end with 7.
We can solve the problem by combining a for
loop which will go through the numbers from 1 to 1000 and a condition to check if they end with 7. There are other solutions too, but let's solve the problem using a loop + condition:
Test your solution here: https://judge.softuni.bg/Contests/Practice/Index/655#1.
Write a program which prints the letters from the latin alphabet: a, b, c, …, z.
It is useful to know that the for
loops don't work only with numbers. We can solve the problem by running a for
loop that passes sequentially through all letters in the latin alphabet:
Test your solution here: https://judge.softuni.bg/Contests/Practice/Index/655#2.
Write a program that reads n
whole numbers from the console and calculates the sum.
- The first line of the input is an integer
n
denoting the number of integers which will be summed. - The following
n
lines consist of one integer. - Calculate the sum and print the result.
Input | Output |
---|---|
2 10 20 |
30 |
3 -10 -20 -30 |
-60 |
4 45 -20 7 11 |
43 |
1 999 |
999 |
0 | 0 |
We can solve the problem by calculating the sum of numbers the following way:
- We read the input number
n
. - Initially we start with
sum = 0
. - We run a loop from 1 to
n
. On each step of the loop, we read the input numbernum
and add it to thesum
. - Finally we print the calculated result
sum
.
Below you can find the source code for the solution:
Test your solution here: https://judge.softuni.bg/Contests/Practice/Index/655#3.
Write a program that reads n whole numbers (n > 0) and finds the the Max Number (the smallest number) among them. The first line of the input, specifies the number of integers n. The following n
lines consist of one integer. Examples:
Input | Output |
---|---|
2 100 99 |
100 |
3 -10 20 -30 |
20 |
4 45 -20 7 99 |
99 |
1 999 |
999 |
2 -1 -2 |
-1 |
We enter the first number n
(the number of integers that are goint to be entered). We assign the current maximum max
an initial neutral value, for example -10000000000000 (or Integer.MIN_VALUE
). Using a for
loop that is iterated n-1 times, we read one integer num
on each iteration. If the read number num
is higher than the current maximum max
, we assign the value of num
to the variable max
. Finally max
will contain the highest number and we print it on the console.
Test your solution here: https://judge.softuni.bg/Contests/Practice/Index/655#4.
Write a program that reads n whole numbers (n > 0) and finds the Min Number among them. The first line of the input, specifies the number of integers n. The following n
lines consist of one integer. Exapmles:
Input | Output |
---|---|
2 100 99 |
99 |
3 -10 20 -30 |
-30 |
4 45 -20 7 99 |
-20 |
The problem is completely identical to the previous one but this time we will start with another neutral starting value 10000000000000 (or Integer.MAX_VALUE
).
Test your solution here: https://judge.softuni.bg/Contests/Practice/Index/655#5.
Write a program that reads 2 * n whole numbers and checks if the sum of the first n numbers (left sum) is equal to the sum of the second n numbers (right sum). If the sums are equal, print "Yes" + sum, if not, print "No" + difference. The difference is calculated as a positive number (absolute value). The format of the output must be identical to the examples below.
Input | Output | Input | Output |
---|---|---|---|
2 10 90 60 40 |
Yes, sum = 100 | 2 90 9 50 50 |
No, diff = 1 |
Input the number n, after that the first n numbers (left half) and sum them up. Input the second n numbers (right half) and find their sum. We calculate the difference between the sums by absolute value: Math.abs(leftSum - rightSum)
. If the difference is 0, print "Yes" + sum, otherwise print "No" + difference.
Test your solution here: https://judge.softuni.bg/Contests/Practice/Index/655#6.
Write a program that reads n цели числа and checks is the sum of numbers on even positions is equal to the sum of numbers on odd positions. If the sums are equal, print "Yes" + sum, otherwise print "No" + difference. The difference is calculated as a positive number (absolute value). The format of the output must be identical to the examples below.
Input | Output |
---|---|
4 10 50 60 20 |
Yes Sum = 70 |
4 3 5 1 -2 |
No Diff = 1 |
3 5 8 1 |
No Diff = 2 |
We input the numbers one by one and calculate the two sums (of the numbers on even positions and the numbers on odd positions). Identically to the previous problem, we calculate the absolute value of the difference and print the result ("Yes" + sum if the difference equals 0 or "No" + difference in every other case).
+=
е често използван комбиниран оператор за присвояване, добавя стойността на десния операнд към левия операнд и присвоява крайния резултат на левия операнд.
C += A е еквивалентно на C = C + A.
Тествайте решението си тук: https://judge.softuni.bg/Contests/Practice/Index/655#7.
Да се напише програма, която въвежда текст (стринг), изчислява и отпечатва сумата от стойностите на гласните букви според таблицата по-долу:
a | e | i | o | u |
---|---|---|---|---|
1 | 2 | 3 | 4 | 5 |
Вход | Изход | Вход | Изход |
---|---|---|---|
hello | 6 (e+o = 2+4 = 6) |
bamboo | 9 (a+o+o = 1+4+4 = 9) |
hi | 3 (i = 3) |
beer | 4 (e+e = 2+2 = 4) |
Прочитаме входния текст s
, зануляваме сумата и завъртаме цикъл от 0 до s.length() - 1
(дължината на текста -1). Проверяваме всяка буква s.charAt(i)
дали е гласна и съответно добавяме към сумата стойността ѝ.
Тествайте решението си тук: https://judge.softuni.bg/Contests/Practice/Index/655#8.
Можем да повтаряме блок код с for
цикъл:
Можем да четем поредица от n
числа от конзолата:
След като се запознахме с циклите, идва време да затвърдим знанията си на практика, а както знаете, това става с много писане на код. Да решим няколко задачи за упражнение.
Създаваме нов проект в IntelliJ IDEA, за да организираме по-добре решенията на задачите за упражнение, като за всяка задача трябва да създадем по един отделен клас.
Стартираме IntelliJ IDEA, избираме: [Create New Project].
след това в лявото поле избираме Java, ако не сме посочили **PROJECT SDK: ** избираме пътя до инсталираната Java JDK директор след което натискаме [Next].
На следващия прозорец отново избираме [Next].
Наименуваме проекта (Project name:) Loops и избираме директория където да го запазим (Project location:). След което натискаме [Finish].
На следващият прозорец избираме [OK] за да създадем Project location, ако не сме създали предварително.
Така създадохме нов проект. Ако в левият прозорец натиснем триъгълника пред Loops, ще се отвори и самата структура на проекта.
За да създадем в нашият проект пакет, който да съдържа всички класове с решенията на задачите за упражнение, натискаме десен бутон на мишката върху src, избираме New -> Package и наименуваме пакета tasks (с малка първа буква).
За да създадем нов клас за първото упражнение, натискаме десен бутон на мишката върху tasks, избираме New -> Java Class и наименуваме класа Task_01 (с главна първа буква).
След тези промени структурата на проекта ще изглежда по следния начин:
Като за всяко следващо упражнение създадем нов клас, по описания по-горе начин за създаване на клас.
Да се напише програма, която въвежда n цели числа и проверява дали сред тях съществува число, което е равно на сумата на всички останали. Ако има такъв елемент, се отпечатва "Yes" + неговата стойност, в противен случай - "No" + разликата между най-големия елемент и сумата на останалите (по абсолютна стойност).
Вход | Изход | Коментар |
---|---|---|
7 3 4 1 1 2 12 1 |
Yes Sum = 12 |
3 + 4 + 1 + 2 + 1 + 1 = 12 |
4 6 1 2 3 |
Yes Sum = 6 |
1 + 2 + 3 = 6 |
3 1 1 10 |
No Diff = 8 |
|10 - (1 + 1)| = 8 |
3 5 5 1 |
No Diff = 1 |
|5 - (5 + 1)| = 1 |
3 1 1 1 |
No Diff = 1 |
- |
Трябва да изчислим сумата на всички елементи, да намерим най-големия от тях и да проверим търсеното условие.
Тествайте решението си тук: https://judge.softuni.bg/Contests/Practice/Index/655#9.
Напишете програма, която чете n числа и пресмята сумата, минимума и максимума на числата на четни и нечетни позиции (броим от 1). Когато няма минимален / максимален елемент, отпечатайте "No".
Вход | Изход | Вход | Изход |
---|---|---|---|
6 2 3 5 4 2 1 |
OddSum=9, OddMin=2, OddMax=5, EvenSum=8, EvenMin=1, EvenMax=4 |
2 1.5 -2.5 |
OddSum=1.5, OddMin=1.5, OddMax=1.5, EvenSum=-2.5, EvenMin=-2.5, EvenMax=-2.5 |
1 1 |
OddSum=1, OddMin=1, OddMax=1, EvenSum=0, EvenMin=No, EvenMax=No |
0 | OddSum=0, OddMin=No, OddMax=No, EvenSum=0, EvenMin=No, EvenMax=No |
5 3 -2 8 11 -3 |
OddSum=8, OddMin=-3, OddMax=8, EvenSum=9, EvenMin=-2, EvenMax=11 |
4 1.5 1.75 1.5 1.75 |
OddSum=3, OddMin=1.5, OddMax=1.5, EvenSum=3.5, EvenMin=1.75, EvenMax=1.75 |
1 -5 |
OddSum=-5, OddMin=-5, OddMax=-5, EvenSum=0, EvenMin=No, EvenMax=No |
3 -1 -2 -3 |
OddSum=-4, OddMin=-3, OddMax=-1, EvenSum=-2, EvenMin=-2, EvenMax=-2 |
Задачата обединява няколко предходни задачи: намиране на минимум, максимум и сума, както и обработка на елементите от четни и нечетни позиции. Припомнете си ги.
В тази задача е по-добре да се работи с дробни числа (не цели). Сумата, минимумът и максимумът също са дробни числа. Трябва да използваме неутрална начална стойност при намиране на минимум / максимум, например 1000000000.0 и -1000000000.0. Ако получим накрая неутралната стойност, печатаме “No”.
Тествайте решението си тук: https://judge.softuni.bg/Contests/Practice/Index/655#10.
Дадени са 2 * n числа. Първото и второто формират двойка, третото и четвъртото също и т.н. Всяка двойка има стойност – сумата от съставящите я числа. Напишете програма, която проверява дали всички двойки имат еднаква стойност.
В случай, че е еднаква отпечатайте "Yes, value=…" + стойността, в противен случай отпечатайте максималната разлика между две последователни двойки в следния формат - "No, maxdiff=…" + максималната разлика.
Входът се състои от число n, следвано от 2*n цели числа, всички по едно на ред.
Вход | Изход | Коментар |
---|---|---|
3 1 2 0 3 4 -1 |
Yes, value=3 | стойности = {3, 3, 3} еднакви стойности |
2 1 2 2 2 |
No, maxdiff=1 | стойности = {3, 4} разлики = {1} макс. разлика = 1 |
4 1 1 3 1 2 2 0 0 |
No, maxdiff=4 | стойности = {2, 4, 4, 0} разлики = {2, 0, 4} макс. разлика = 4 |
1 5 5 |
Yes, value=10 | стойности = {10} една стойност еднакви стойности |
2 -1 0 0 -1 |
Yes, value=-1 | стойности = {-1, -1} еднакви стойности |
2 -1 2 0 -1 |
No, maxdiff=2 | стойности = {1, -1} разлики = {2} макс. разлика = 2 |
Прочитаме входните числа по двойки. За всяка двойка пресмятаме сумата ѝ. Докато четем входните двойки, за всяка двойка, без първата, трябва да пресметнем разликата с предходната. За целта е необходимо да пазим в отделна променлива сумата на предходната двойка. Накрая намираме най-голямата разлика между две двойки. Ако е 0, печатаме “Yes” + стойността, в противен случай - “No” + разликата.
Тествайте решението си тук: https://judge.softuni.bg/Contests/Practice/Index/655#11.
В настоящата глава се запознахме с циклите като конструкция в програмирането, която ни позволява да повтаряме многократно дадено действие или група от действия. Сега нека си поиграем с тях. За целта ще начертаем няколко фигурки, които се състоят от голям брой повтарящи се графични елементи, но този път не на конзолата, а в графична среда, използвайки "графика с костенурка". Ще е интересно. И никак не е сложно. Опитайте!
Целта на следващото упражнение е да си поиграем с една библиотека за рисуване, известна като “графика с костенурка” (turtle graphics). Ще изградим графично приложение, в което ще рисуваме различни фигури, придвижвайки нашата “костенурка” по екрана чрез операции от типа “отиди напред 100 позиции”, “завърти се надясно на 30 градуса”, “отиди напред още 50 позиции”. Приложението ще изглежда приблизително така:
Нека първо се запознаем с концепцията за рисуване “Turtle Graphics”. Може да разгледаме следните източници:
- Дефиниция на понятието “turtle graphics”: http://c2.com/cgi/wiki?TurtleGraphics
- Статия за “turtle graphics” в Wikipedia – https://en.wikipedia.org/wiki/Turtle_graphics
- Интерактивен онлайн инструмент за чертане с костенурка – https://blockly-games.appspot.com/turtle
Започваме, като създаваме нов Java проект в IntelliJ IDEA. След това, добавяме нов пакет app
(описано е как се прави по-рано в тази глава). Сваляме MyTurtle.java
и jturtle-0.1.1.jar
от https://github.com/SoftUni/Programming-Basics-Book-Java-BG/tree/master/assets/chapter-5-1-assets. MyTurtle.java
е предварително написан клас, който ще ни помогне по-бързо да се запознаем с библиотеката jturtle-0.1.1.jar
, която управлява костенурката. Като използваме файл навигатор, копираме MyTurtle.java
в директорията app
на създадения проект. След това трябва да добавим външната библиотека jturtle-0.1.1.jar
в нашия проект. Това става по следния начин:
- Избираме от File менюто Project Structure (CTRL + SHIFT + ALT + S).
- Натискаме Select Modules в левия панел.
- Натискаме Dependencies таба.
- Натискаме '+' → JARs or directories.
На следващия прозорец задаваме пътя до jturtle-0.1.1.jar, след това натискаме [ОК].
На следващия прозорец маркираме само classes кутийката, след това натискаме [ОК].
На следващия прозорец избираме [ОК] и сме готови да отворим MyTurtle.java
.
Това е основните действия в класа Turtle
, с които чертаем:
Връщана стойност |
Метод и неговото описание |
---|---|
Turtle | back(double distance) – мести костенурката назад |
Turtle | bk(double distance) – работи като back(double distance) |
Turtle | forward(double distance) – мести костенурката напред |
Turtle | fd(double distance) – работи като forward(double distance) |
Turtle | hideTurtle() – скрива костенурката |
Turtle | ht() – действието е същото като hideTurtle() |
Turtle | home() – измества костенурката обратно до началната й позиция, обърната на север |
Turtle | left(double degrees) – завърта костенурката на ляво(в градуси) |
Turtle | lt(double degrees) – действа като left(double degrees) |
Turtle | penDown() – закача писалка за костенурката, която оставя линия, когато костенурката се движи |
Turtle | pd() – работи като penDown() |
Turtle | penUp() – откача писалката от костенурката |
Turtle | penWidth(int newWidth) – задава широчина на писалката |
Turtle | right(double degrees) – завърта костенурката на дясно (в градуси) |
Turtle | rt(double degrees) – работи като right(double degrees) |
Turtle | setColor(Color color) – задава цвят на писалката |
Turtle | setLineWidth(double lineWidth) – задава дебелина на линията |
Turtle | setPenColor(Color color) – задава цвят на писалката за чертане |
Turtle | setPos(double x, double y) – измества костенурката на нова позиция с координати(x, y) |
Turtle | showTurtle() – показва костенурката |
Turtle | st() – работи като showTurtle() |
Turtle | speed(double newSpeed) – задава скорост на костенурката |
За да създадем метод който чертае триъгълник, в MyTurtle.java
намираме празния метода drawTriangle()
и написваме следния код:
Този код мести и върти костенурката, която в началото е в центъра на екрана (в средата на формата), и чертае равностранен триъгълник. Може да го редактирате и да си поиграете с него.
Стартираме приложението с [Shift + F10]. Тестваме го дали работи (натискаме [Draw] бутона няколко пъти):
Сега може да променим и усложним кода на костенурката, като добавим следния код към нашия метод drawTriangle()
:
Отново стартираме приложението с [Shift + F10]. Тестваме дали работи новата програма за костенурката:
Вече нашата костенурката чертае по-сложни фигури.
Нека напишем кода и за останалите два бутона: целта на бутона [Reset] е да изтрие начертаната графика и да позиционира костенурката в нейната начална позиция, допълваме метода resetTurtle()
със следния код:
Целта на бутона [Hide / Show Turtle] е да показва или скрива костенурката, допълваме метода showTurtle()
със следния код::
Отново стартираме приложението с [Shift + F10] и тестваме, дали двата бутона работят коректно.
Добавете бутон [Hexagon], който чертае правилен шестоъгълник:
Подсказка:
В цикъл повторете 6 пъти следното:
- Ротация на 60 градуса.
- Движение напред 100.
За добавяне нов бутон за чертане на нова фигура, може да проследим логиката в MyTurtle.java
за бутона [Draw] и да създадем нов бутон за чертане на шестоъгълник Hexagon.
Първо добавяме новата фигура в enum Shape
:
Създаваме нов бутон и му добавяме ActionListener
, който присвоява на shape
новата enum
стойност:
След това добавяме новия бутон в bList
:
Създаваме нов метод drawHex()
, чрез който костенурката чертае шестоъгълник.
Задължително в края на метода shape = ""
, този ред предотвратява многократното изпълнение на нашия метод!
В Thread t
добавяме case "Hexagon
", който да извиква метода drawHex()
:
Добавете бутон [Star], който чертае звезда с 5 върха (петолъчка), като на фигурата по-долу:
Подсказка:
Сменете цвета: turtle.setPenColor(Color.green);
.
В цикъл повторете 5 пъти следното:
- Движение напред 200.
- Ротация на 144 градуса.
Добавете бутон [Spiral], който чертае спирала с 20 върха като на фигурата по-долу:
Подсказка:
Чертайте в цикъл, като движите напред и завъртате. С всяка стъпка увеличавайте постепенно дължината на движението напред и завъртайте на 60 градуса.
Добавете бутон [Sun], който чертае слънце с 36 върха като на фигурата по-долу:
Добавете бутон [Triangle], който чертае три триъгълника с по 22 върха като на фигурата по-долу:
Подсказка:
Чертайте в цикъл като движите напред и завъртате. С всяка стъпка увеличавайте с 10 дължината на движението напред и завъртайте на 120 градуса. Повторете 3 пъти за трите триъгълника.
Ако имате проблеми с примерния проект по-горе попитайте във форума на СофтУни: https://softuni.bg/forum.