You are on page 1of 136

УНИВЕРЗИТЕТ „ГОЦЕ ДЕЛЧЕВ“ – ШТИП

ВОЕНА АКАДЕМИЈА
„ГЕНЕРАЛ МИХАИЛО АПОСТОЛСКИ“ –
СКОПЈЕ
-ПРИДРУЖНА ЧЛЕНКА-

ПРЕДМЕТ: ИНФОРМАТИКА И ДИГИТАЛНИ КОМУНИКАЦИИ


ТЕМА: ЈАVA
-проектна задача-

Ментор: Изработиле:
потполк. Југослав Ачкоски пит. Магдалена
Димчевска
пит. Павел Божиновски
Скопје 2024

Содржина
1. Вовед во компјутерски систем 3
2. Програмски концепт 10
3. Работа со податоци 18
4. Проблеми при манипулација со податоци 27
5. Употреба на објекти 34
6. Одлуки 46
7.Повторувања 59
8. Методи 76
9. Низи 89
11.Решавање рекурзивни проблеми 96
11. Креирање класи. 106
12. НАСЛЕДУВАЊЕ 124

2
1. Вовед во компјутерски систем
______________________________________________________________________________
1. За секое од следниве полиња, дадете пример како може да се искористи компјутерот
за да помогне во работата на човекот. (Бидете креативни!)
• Автомобилска индустрија
• Образование
• Здравство
• Домашна безбедност
• Новинарство
• Трговија на мало
Одговор:
● Автомобилска индустрија: Компјутерите можат да се искористат за
автоматизација на производството на автомобили, преку роботизирани
системи за монтажа и тестирање. Исто така, компјутерските симулации и
моделирања можат да помогнат во дизајнирањето на автомобили за
подобра ефикасност и безбедност.
● Образование: Компјутерите можат да се искористат за персонализирано
учење преку адаптивни образовни платформи кои ги пратат напредокот
на студентите и им обезбедуваат материјали според нивните потреби и
способности. Исто така, виртуелните лаборатории и симулации можат да
донесат концептите во живот и да ги олеснат учењето на комплексни
науки како што се физика и хемија.
● Здравство: Компјутерите можат да помогнат во дијагностицирањето и
третманот на болести преку развој на алгоритми за анализа на
медицински слики, прогнозирање на здравствени состојби и препораки
за лекување на база на податоци зa пациентите.
● Домашна безбедност: Компјутерите можат да се искористат за
интегрирање на системи за видеонабљудување, сензори за дим и камини,
како и паметни заклучувања за подобра заштита на домот. Во случај на
неправилности, автоматски системи можат да предизвикаат аларми и да
го известат сопственикот или надлежните служби.
● Новинарство: Компјутерите можат да помогнат во анализирање на
големи количини на информации од различни извори за да се откријат
важни приказни и трендови. Исто така, алгоритми за генерирање на текст
можат да помогнат во автоматско создавање на извештаи или чланоци
врз основа на податоци.

3
● Трговија на мало: Компјутерските системи за управување со залихи и
продажби можат да помогнат во автоматизација на процесот на
управување со продавницата. Исто така, аналитичките софтвери можат
да анализираат купувачките навики и предвидат трендови за да се
подобри менаџментот на продажбите и понудата на производи.
______________________________________________________________________________
2. За кои делови од компјутерот сметате дека имаат карактеристики најблиски до
човечкиот мозок?
Одговор:
Кога се зборува за делови од компјутерот кои имаат карактеристики најблиски до
човечкиот мозок, најчестите технологии и делови што би можеле да се споменат се:
● Невронски мрежи (Neural Networks): Оваа технологија е инспирирана од
структурата и функционирањето на невроните во човечкиот мозок.
Невронските мрежи се користат за машинско учење, каде што компјутерите
можат да учат и да прават одлуки според податоците.
● Мемориски системи (Memory Systems): Човечкиот мозок e сложен систем,
вклучувајќи краткорочна и долгорочна меморија, како и процеси за
складирање и повикување на информации. Некои компјутерски мемориски
системи, особено оние што вклучуваат вештачка интелигенција, се
обидуваат да ги емулираат овие карактеристики.
● Обработка на природен јазик (Natural Language Processing - NLP):
Човечкиот мозок е способен да разбере и произведе јазик на комплексен
начин. Технологиите за обработка на природен јазик се обидуваат да го
имитираат овој процес, со цел компјутерите да можат да разбираат,
генерираат и комуницираат со човечки јазик.
Сите овие делови и технологии имаат за цел да емулираат некои од
карактеристиките на човечкиот мозок за подобрување на перформансите на
компјутерите во области како што се машинско учење, обработка на податоци и
интеракција со човекот.
______________________________________________________________________________
3. Како се мери брзината на процесорот?
Одговор:
Брзината на процесорот се мери преку:
● Брзина на тактови (Clock Speed): Оваа метрика го мери бројот на циклуси
на такт на процесорот во единица време. Секој од повеќето процесори бара
такт-сигнал кој ги синхронизира процесите на процесорот, како и другите
хардверски уреди. Општо земено, колку е побрз сигналот на часовникот,
толку повеќе чекори во процесите треба да се извршат во одредени
временски интервали. Брзината на часовникот/тактовите се мерат во
единица херци (Hz). Колку е поголем Clock Speed, толку повеќе чекори
процесорот може да изврши за една секунда.

4
______________________________________________________________________________
4. Наведете два уреди кои истовремено можат да вршат функција и како влезни и како
излезни уреди.
Одговор:
1)

Слика 1.Wiimote, уред способен да испорачува многу форми на влез и излез, како
што се притискање на копчињата, положбата и забрзувањето на уредот, сигналите
на ламбата, вибрациите како и аудио излезот.
2)

Слика 2. Тouch screen, уред кој работи и како влезен и како излезен уред. Ги
гледате опциите што ви се достапни на екранот (излез) и потоа со прстот ја
допирате опцијата што сте ја избрале (влез).
______________________________________________________________________________
5. Колку битови се потребни за да ја зачуваат децималната вредност 5,000?
Одговор:
За да се одреди бројот на битови потребни за складирање на децималната вредност
5 000, прво треба да се најде бинарното претставување на бројот.

5
5.000 во бинарно е 1001110001000.

За да се претстави овој број, се брои бројот на користени битови, што е 13.


Затоа, потребни се 13 бита за да се зачува децималната вредност 5.000.
______________________________________________________________________________
6. Компјутер има 512 мегабајти РАМ меморија. Колку битови може да се зачуваат
наеднаш во неговата РАМ меморија?
Одговор:
За да се пресмета бројот на битови што може да се складираат во RAM меморијата
на компјутерот, треба да се конвертира капацитетот на RAM меморијата од
мегабајти (MB) во битови.

1 бајт = 8 бита
1 килобајт (KB) = 1024 бајти
1 мегабајт (MB) = 1024 KB

Значи, за да се конвертира 512 MB во битови:

512 MB * 1024 KB/MB * 1024 бајти/KB * 8 бита/бајт = 512 * 1024 * 1024 * 8 бита
512 * 1024 * 1024 * 8 = 4.294.967.296 бита

Затоа, компјутер со 512 MB RAM може да складира 4,294,967,296 бита одеднаш во


својата RAM меморија.
______________________________________________________________________________
7. Колку мегабајти содржи еден гигабајт?
Одговор:
1 гигабајт (GB) = 1024 мегабајти (MB).
______________________________________________________________________________
8. Одреди кои од наведените се апликативни софтвери, а кои се системски софтвери.
• Антивирус
• Игри
• Калкулатор
• Instant messenger
• Java runtime environment
• Оперативен систем
Одговор:
Aпликативни софтвери: Игри, Калкулатор, Instant messenger, Java runtime
environment

6
Системски софтвери: Оперативен систем, Антивирус

______________________________________________________________________________
9. Накратко објаснете што прават следниве апликации.
Одговор:
• Web browser - софтверска апликација која им овозможува на корисниците
пристап и навигација низ World Wide Web (WWW) или интернет. Обезбедува
графички интерфејс за корисниците да гледаат веб-страници, да
комуницираат со веб-содржини и да пристапуваат до различни онлајн
ресурси како што се веб-локации, слики, видеа и документи.
• Word processor- апликативен софтвер кој се користи за креирање,
уредување, форматирање и печатење документи базирани на текст. На
корисниците им обезбедува широк спектар на функции и алатки за
манипулирање со текст и распоред, што го прави алатка за различни задачи
за пишување.
• Media player- апликативен софтвер кој се користи за репродукција на
мултимедијални датотеки како што се аудио и видео на компјутер или други
компатибилни уреди. Тоа им овозможува на корисниците пристап и уживање
во содржината на дигиталните медиуми складирани локално на нивниот
уред или до кои се пристапува од надворешни извори како што е интернет.
• Instant messaging program- тип на апликативен софтвер кој овозможува
текстуална комуникација во реално време помеѓу корисниците преку
интернет или во локална мрежа и им овозможуваат на корисниците да
разменуваат пораки, да споделуваат датотеки и да се вклучат во групни
разговори или видео повици.
______________________________________________________________________________
10. Анализирајте и креирајте компјутерска програма која ќе пронајде просек од пет
броеви внесени од корисникот на програмата.
Одговор:
● Прво, треба да се креира Scanner објект за внес на податоци од тастатура
● Потоа, следува внесувањето на петте броеви
● Пресметка на просекот така што се собираат сите броеви и збирот се дели со
бројот на броеви односно 5.
● Следно се прикажува просекот
1 import java.util.Scanner;
2
3 public class Prosek {
4 public static void main(String[] args) {
5 // Креирање на Scanner објект за внес на податоци од тастатура
6 Scanner scanner = new Scanner(System.in);
7

7
8 // Внесување на петте броеви
9 System.out.println("Внесете ги петте броеви:");
10 double num1 = scanner.nextDouble();
11 double num2 = scanner.nextDouble();
12 double num3 = scanner.nextDouble();
13 double num4 = scanner.nextDouble();
14 double num5 = scanner.nextDouble();
15
16 // Пресметка на просекот
17 double prosek = (num1 + num2 + num3 + num4 + num5) / 5;
18
19 // Прикажување на просекот
20 System.out.println("Прoсекот на внесените броеви е: " + prosek);
21
22 // Затварање на Scanner објектот
23 scanner.close();
24 }
25 }

______________________________________________________________________________
11. Да претпоставиме дека треба да напишете програма која ќе може да конвертира
сума на пари помеѓу Бахт, Американски долар и Евро. Опишете како ќе го
анализирате проблемот и креирајте програма.
Одговор:
За да се дизајнира програма за конвертирање на валута која може да го конвертира
износот на пари меѓу бат, американски долар и евро, потребно е да се следат
следните чекори за анализа:

Анализа на проблемот:
● Разбирање на зафатените валути: Бат, американски долар и евро.
● Идентификација на начините на конверзија меѓу овие валути. На пример,
може да се користат тековните валутни курсеви за конверзија.
● Разбирање на барањата и очекувањата на корисниците за користење на
програмата, како што се внесување на износот на пари и избор на валута за
конверзија.

1 import java.util.Scanner;
2 public class CurrencyConverter {
3 public static void main(String[] args) {
4 Scanner scanner = new Scanner(System.in);
5 // Курсни стапки за конверзија
6 final double THB_to_USD = 0.031;
7 final double THB_to_EUR = 0.028;
8 final double USD_to_EUR = 0.903;
9 System.out.println("Добредојдовте во валутниот конвертер!");
10 // Внесете износ и валута за конверзија

8
11 System.out.print("Внесете износ: ");
12 double amount = scanner.nextDouble();
13 System.out.print("Внесете валута (THB, USD, EUR): ");
14 String currency = scanner.next().toUpperCase()
15 // Изврши конверзија според избраната валута
16 double result = 0;
17 switch (currency) {
18 case "THB":
19 result = amount * THB_to_USD;
20 System.out.println(amount + " THB е еднакво на " +
21 result + " USD");
22 result = amount * THB_to_EUR;
23 System.out.println(amount + " THB е еднакво на " +
24 result + " EUR");
25 break;
26 case "USD":
27 result = amount / THB_to_USD;
28 System.out.println(amount + " USD е еднакво на " +
29 result + " THB");
30 result = amount * USD_to_EUR;
31 System.out.println(amount + " USD е еднакво на " +
32 result + " EUR");
33 break;
34 case "EUR":
35 result = amount / THB_to_EUR;
36 System.out.println(amount + " EUR е еднакво на " +
37 result + " THB");
38 result = amount / USD_to_EUR;
39 System.out.println(amount + " EUR е еднакво на " +
40 result + " USD");
41 break;
42 default:
43 System.out.println("Внесена е невалидна валута.");
44 }
45
46 scanner.close();
47 }
48 }

Оваа програма овозможува на корисникот да внесе износ и валута за конверзија, и


потоа ќе го конвертира износот во сите други валути (THB, USD, EUR) во
зависност од избраната валута. Курсните стапки се земени како константи во
програмата.

______________________________________________

9
2. Програмски концепт
______________________________________________________________________________
1. Кои се разликите помеѓу машински јазик и виш програмски јазик?
Одговор:
Разликите помеѓу машинскиот јазик и виш програмски јазик се:
● Ниво на апстракција: Вишите програмски јазици се повеќе читливи од
човекот и апстрахиран од хардверот, додека машинскиот јазик е на ниско
ниво, кој се состои од бинарни инструкции директно разбирливи од
процесорот.
● Леснотија на програмирање: Вишиот програмски јазик е полесен за
програмерите за пишување и разбирање, додека машинскиот јазик е
подложен на грешки поради неговата бинарна природа.
● Извршување: Вишиот програмски јазик има потреба од превод на машински
јазик пред да се изврши, додека инструкциите за машински јазик се
извршуваат директно од процесорот.
● Процес на преведување: Вишиот програмски јазик се преведува од
компајлер на машински јазик, додека инструкциите за машински јазик не се
преведуваат.
______________________________________________________________________________
2. Објаснете зошто се вели дека JAVA е јазик независен од платформата.
Одговор:
JAVA е независна од платформата бидејќи е компајлирана во бајтекод што може да
се изврши на кој било уред што има Java виртуелна машина (JVM). Ова значи дека
може да се напише Java програма на една платформа (како што е Windows), а потоа
да се стартува на друга платформа (како macOS или Linux) без да се прават никакви
промени во кодот.
______________________________________________________________________________
3. Опишете ги придобивките од користење правилно вгнездување.
Одговор:
Правилното вгнездување нуди бројни придобивки:
Ја подобрува читливоста на кодот со јасно структурирање на логичките блокови,
помагајќи во одржување и дебагирање. Исто така, служи како имплицитна
документација, што го олеснува разбирањето за програмерите. За време на
прегледите на кодот, добро вгнездениот код го олеснува ефикасното испитување и
дискусијата за промените, придонесувајќи за севкупниот квалитет и кохерентност
на кодот.

10
_________________________________________________________________
4. Напишете целосна програма која на екранот ќе го покажува вашето име и презиме.
Одговор:

1
import java.util.Scanner;
2
public class ImePrezime {
3
public static void main(String[] args) {
4
// Kreiranje objekt od tip Scanner за внес на податоци од тастатура
5
Scanner tastatura = new Scanner(System.in);
6
7
// Внеси го името од тастатура
8
System.out.print("Внесете го вашето име: ");
9
String ime = tastatura.nextLine();
10
11
// Внеси го презимето од тастатура
12
System.out.print("Внесете го вашето презиме: ");
13
String prezime = tastatura.nextLine();
14
15
// Прикажи ги името и презимето на екран
16
System.out.println("Моето име е: " + ime);
17
System.out.println("Моето презиме е: " + prezime);
18
19
// Затвори го Scanner објектот
20
tastatura.close();
21
}
22
}
23

______________________________________________________________________________
5. Напишете целосна програма која на екранот ќе покажува шара слична на следната.

******* *******
* * *
******* *******

11
Одговор:

1 public class PatternDisplay {


2 public static void main(String[] args) {
3 // Прикажи горниот дел на шарата
4
5 System.out.println("*******\t\t*******");
6
7 // Прикажи средниот дел на шарата
8
9 System.out.println("\t*\t*\t*\t");
10
11 // Прикажи долнитиот дел на шарата
12
13 System.out.println("\t*******\t\t*******");
14 }
15 }

______________________________________________________________________________
6. Променете го кодот најмалку што можете со цел да добиете програма која успешно
ќе се компајлира.
Одговор:

1 public class Ex2_6


2 {
3 public static void main(String [] args)
4 System.out.println("What’s wrong with me?)
5 }}

● Додадена е отворена заграда { после декларацијата на методот main.


● Додадени се наводници на крајот од заградата и додадени се точка запирка на
крајот од System.out.println("What’s wrong with me?");.

1 public class Ex2_6


2 {
3 public static void main(String [] args) {
4 System.out.println("What’s wrong with me?");
5 }}

12
______________________________________________________________________________
7. Покажете како се користи методот print() со цел да се испечати следната порака на
екранот.
He called Clancy at headquarters and said:
“There’s a family of ducks walkin’ down the street!”

Одговор:

1 public class PrintExample {


2 public static void main(String[] args) {
3 System.out.print("He called Clancy at headquarters and said:\n");
4 System.out.print("\"There’s a family of ducks walkin’ down the
5 street!\"");
6 }}

Оваа програма користи две повици на методот print(), една за да го испечати


почетниот дел од текстот и друга за да го испечати вториот дел од текстот.
Резултатот ќе биде истиот како и претходно, со текстот испечатен на екран во точно
истиот формат.
_________________________________________________________________________________________________

8. Кој од следниве идентификатори е невалиден?


google $money company_motto java.org
12inches money$ X-ray CC
Item3 $$money !alert_sign entry point
public main Class _piece
JavaApplet fillForms “Gorilla” _1234
Одговор:
Валидните Java идентификатори мора да се придржуваат до одредени правила:
● Тие не можат да започнат со цифра.
● Тие можат да содржат само букви, цифри, долни црти или знаци за долар.
● Тие не можат да бидат клучни зборови во Java.

java.org -Невалиден, содржи точка, која не е дозволена во идентификаторите.


12inches -Невалиден, започнува со цифра.

13
X-Ray -Невалиден, содржи цртичка
!alert_sign -Невалиден, содржи посебен знак '!' што не е дозволено.
entry point -Невалиден, содржи празно место
public -Невалиден, тоа е клучен збор во Java.
main -Невалиден, тоа е клучен збор во Java.
Class -Невалиден, тоа е клучен збор во Java.
“Gorilla” -Невалиден, содржи наводници.
_____________________________________________________________________________________________
_________________________________

9. Набројте ги сите клучни зборови и идентификатори кои се појавуваат во класата


definition of AverageDemo.

Одговор:

1 public class AverageDemo {


2 public static void main(String[] args) {
3 double avg, sum;
4 sum = 1.0+2.0+3.0+4.0+5.0+6.0+7.0+8.0+9.0+10.0;
5 avg = sum/10;
6 System.out.println(avg);
7 }
8 }

Клучни зборови:
public: Модификатор за пристап што покажува дека класата е достапна за сите
други класи.
class: Клучен збор што се користи за дефинирање на класа.
static: Клучен збор што покажува дека методот main припаѓа на самата класа,
наместо на примерок од класата.
void: Покажува дека методот main не враќа вредност.
String: Предефинирана класа што претставува низи во Јава.
double: Тип на податоци со повеќе децимали.
System.out.println: Изјава за печатење на излезот во конзолата.

Идентификатори:
AverageDemo: Името на класата.
main: Името на методот.
args: Името на низата со параметри се пренесува на главниот метод.
avg: Променлива што го претставува просекот на броевите.

14
sum: Променлива што го претставува збирот на броевите.

__________________________________________________________
10. Изменете го изворниот код на класата AverageDemo за да може програмата да ги
покажува збирот и просекот на целите броеви од 1 до 5 како што е претставено
подолу. Исто така нацртајте алгоритам за програмата.

The sum of 1 to 5 is 15.0


The average of 1 to 5 is 3.0

Одговор:

1 public class AverageDemo {


2 public static void main(String[] args) {
3 int zbir = 0;
4 double prosek = 0.0;
5
6 for (int i = 1; i <= 5; i++) {
7 zbir += i;
8 }
9
10 prosek = (double) zbir / 5;
11
12 System.out.println("Збирот на броевите од 1 до 5 е " + zbir);
13 System.out.println("Просекот на броевите од 1 до 5 е " +
14 prosek);
15 }}

Оваа програма ќе го изврши следниот пресметков за збирот и просекот на броевите од 1 до


5, и потоа ќе ги испечати резултатите на екран како што е барано. Збирот ќе биде 15, а
просекот ќе биде 3.

______________________________________________________________________________________

11. Нацртајте алгоритам со кој ќе го опишете процесот со кој клиент може да повлече
пари од банкомат.

15
Одговор:

16
12. Прочитајте го следниот рецепт и нацртајте соодветен алгоритам.
Одговор:

17
______________________________________________

3. Работа со податоци
______________________________________________________________________________
1. Кои се разликите помеѓу примитивни видови на податоци и класа?
Одговор:
Примитивните типови на податоци во Јава се основни и непроменливи типови како
цели броеви, броеви со подвижна запирка, знаци и boolean вредности,
предефинирани од јазикот. Тие немаат методи или однесување и не можат да бидат
изменети откако ќе се создадат. Спротивно на тоа, класите се посложени типови на
податоци во Јава, инкапсулираат и податоци и однесување. Тие вклучуваат
стандардни класи како String и Rectangle, како и сопствени класи дефинирани од
програмерите. За разлика од примитивните типови, класите можат да бидат
променливи и да овозможат дефинирање методи и операции на објекти.
______________________________________________________________________________
2. Колку различни работи можат да се претстават користејќи n бајтови?

Oдговор :
Бројот на различни работи кои можат да се претстават користејќи n бајтови зависи
од бројот на различни комбинации од 0 и 1 кои можат да се направат со n битови.
Формулата за пресметување на ова зависи од тоа дали се дозволени повторувања на
истите бајтови или не, како и дали редоследот има значење или не.
Ако дозволени се повторувањата и редоследот има значење, формулата за
пресметување на бројот на различни комбинации е 2^n.
● Ако не се дозволени повторувања и редоследот има значење, формулата за
пресметување е n!, каде што ! означува факторијел.

18
● Ако се дозволени повторувања, но редоследот нема значење, формулата е
(n+k-1) choose (k), каде k е бројот на различни вредности кои можат да се
претстават.
● Ако не се дозволени повторувања и редоследот нема значење, формулата е (n
choose k), каде k е бројот на различни вредности кои можат да се претстават.
______________________________________________________________________________
3. Кој од осумте видови примитивни податоци може да складира нумеричката
вредност 236
Одговор:
Примитивните типови на податоци кои можат да ја зачуваат нумеричката вредност
36
2 се long, int, short.
______________________________________________________________________________
4. Одреди ги boolean вредностите на следните искази.

Одговор:
a) 01<2e-1
Одговор:
Во овој израз, 01 е еквивалентно на цел број 1, а 2e-1 е еквивалентно на 0.2.
1 < 0.2 е неточно бидејќи 1 не е помал од 0.2.
Boolean вредност: неточна
b) 8+0.0 >= 8.0
Одговор:
8 + 0.0 е еднакво на 8.0.
8.0 >= 8.0 е точно бидејќи 8.0 е еднакво на 8.0.
Boolean вредност: точна
c) ‘a’>’b’
Одговор:
Овој израз ги споредува ASCII вредностите на знаците.
ASCII вредноста на 'a' е 97, а ASCII вредноста на 'b' е 98.
97 не е поголемо од 98.
Boolean вредност: неточна
d) 2+3*2-6 == ((2+3)*2)-6
Одговор:
Левата страна: 2 + 3 * 2 - 6 е еднаква на 2 + 6 - 6, што е еднакво на 2.
Десната страна: ((2 + 3) * 2) - 6 е еднаква на (5 * 2) - 6, што е еднакво на 4.
2 не е еднакво на 4.
Boolean вредност: неточна
e) ‘a’>’$’||’b’<’$’
Одговор:
Првиот дел 'a' > '$' е точен бидејќи ASCII вредноста на 'a' (97) е поголема од
ASCII вредноста на '$' (36).

19
Вториот дел 'b' < '$' е неточен бидејќи ASCII вредноста на 'b' (98) не е помала од
ASCII вредноста на '$' (36).
Изразот станува точно || (или) неточно, што е точно.
Boolean вредност: точна
f) !(true||'6'>'#')&&!false
Одговор:
true || '6' > '#' е точно бидејќи '6' има поголема ASCII вредност од '#'.
!true е неточно.
!false е точно.
Затоа, изразот станува неточно && точно, што е неточно.
Boolean вредноста: неточна
______________________________________________________________________________
5. Одреди ги вредностите на х и у во следниот код

Одговор:

1 public class Ex3_5


2{
3 public static void main(String[] args)
4 {
5 int x=0,y=0;
6 x = y + 1;
7 y = x + 1;
8 }
9}

Се иницијализираат променливите x и y на 0.
Се доделува вредноста на y + 1 на x:
Во овој момент, y = 0, па x = 0 + 1 = 1.
Се доделува вредноста на x + 1 на y:
Во овој момент, x = 1, значи y = 1 + 1 = 2.
По извршувањето на кодот, добиените вредности на променливите x и y се:
x = 1; y = 2;
_____________________________________________________________________________________

6. Наведи ја причината поради која следниот код нема успешно да се искомпелира.


Одговор:

1 public class Ex3_6


2{

20
3 public static void main(String[] args)
4 {
5 int x, y, z =3;
6 y = x;
7 z = y;
8 }
9}

Еве го проблематичниот дел од кодот:


Бидејќи на x не му е доделена вредност пред да се користи, компајлерот ќе
предизвика грешка што покажува дека променливата x можеби не е
иницијализирана.
За да го решите овој проблем, треба да го иницијализирате x со вредност пред да ја
користите, x=0, на овој начин, x е правилно иницијализирана пред да биде доделен
на y.

_____________________________________________________________________________________

7. Напишете програма во JAVA која ќе ги пресметува и на екран ќе ги прикажува


следниве вредности
Одговор:
А. (6+5)(7-3)

1 public class ExpressionCalculator {


2 public static void main(String[] args) {
3 // Дефинирај ги компонентите на изразот
4 int првБрој = 6;
5 int вторБрој = 5;
6 int третБрој = 7;
7 int четвртБрој = 3;
8
9 // Пресметај го изразот
10 int резултат = (првБрој + вторБрој) * (третБрој -
11 четвртБрој);
12 // Прикажи го резултатот
13 System.out.println("(6 + 5) * (7 - 3) = " + резултат);
14 }
15 }

21
2 2
|−(6.5) +(3.7) |
Б. ⅇ

public class ExpressionCalculator {


1
public static void main(String[] args) {
2
// Дефинирај ги компонентите на изразот
3
double првБрој = 6.5;
4
double вторБрој = 3.7;
5
// Пресметај го изразот
6
double резултат =
7
Math.exp(Math.sqrt(Math.abs(-(Math.pow(првБрој, 2)) +
8
Math.pow(вторБрој, 2))));
9
// Прикажи го резултатот
10
System.out.println("e^(sqrt(|-(6.5)^2+(3.7)^2|)) = " +
11
резултат);
12
}
13
}

3
В. sin 𝑠𝑖𝑛 (1, 2)

1 public class ExpressionCalculator {


2 public static void main(String[] args) {
3 // Дефинирај го аргументот за sin функцијата
4 double аргумент = 1.2;
5
6 // Пресметај го изразот
7 double резултат = Math.cbrt(Math.sin(аргумент));
8
9 // Прикажи го резултатот
10 System.out.println("∛(sin(1.2)) = " + резултат);
11 }
12 }

8
Г. Резултат со подвижна точка од 1+10

1 public class ExpressionCalculator {


2 public static void main(String[] args) {
3 // Дефинирај ги операндите
4 float п= (float) 8.0;
5 float в = (float) (1.0 + 10.0);
6
7 // Пресметај го изразот
8 float резултат = п / в;
9

22
10 // Прикажи го резултатот
11 System.out.println("8 / (1 + 10) = " + резултат);
12 }
13 }

Д. Најголемиот цел број што е помал од 3,75

1 public class Main {


2 public static void main(String[] args) {
3 double number = 3.75;
4 int result = (int) Math.floor(number);
5 System.out.println("Најголемиот цел број помал од 3.75 е: " +
6 result);
7 }
8}

Ѓ. Најмалиот цел број што е поголем од 3,75

1 public class Main {


2 public static void main(String[] args) {
3 double number = 3.75;
4 int result = (int) Math.ceil(number);
5 System.out.println("Најмалиот цел број поголем од 3.75 е: " +
6 result);
7 }
8}

3
(𝑖+1)
Е. ∑ 𝑖
𝑖=0

1 public class Main {


2 public static void main(String[] args) {
3 // Иницијализација на збирот
4 int sum = 0;
5 // Пресметка на збирот
6 for (int i = 0; i <= 3; i++) {
7 sum += Math.pow(i, i + 1);
8 }
9 // Прикажување на збирот
10 System.out.println("Збирот на изразот ∑_(i=0)^(3) i^(i+1) е:
11 " + sum);

23
12 }
13 }

______________________________________________________________________________
8. Напишете JAVA програма која ја покажува на екранот точната вредност за секој од
следниве искази за секоја можна комбинација за p и q. (пр. (точно, точно), (точно,
неточно), (неточно, точно) и (неточно, неточно))
Одговор:
А. p и q
Еве како ќе изгледа кодот:

1 public class TruthValues {


2 public static void main(String[] args) {
3 // Можни вредности за p и q
4 boolean[] vrednosti = { true, false };
5 // За секоја комбинација на p и q, испечати p и q
6 System.out.println("Вистинските вредности на p и q:");
7 for (boolean p : vrednosti) {
8 for (boolean q : vrednosti) {
9 System.out.println(p + " и " + q + " = " + (p &&
10 q));
11 }
12 }
13 }
14 }

Б. p или q

24
1 public class TruthValues {
2 public static void main(String[] args) {
3 // Можни вредности за p и q
4 boolean[] vrednosti = { true, false };
5 // За секоја комбинација на p и q, испечати p или q
6 System.out.println("Вистинските вредности на p или q:");
7 for (boolean p : vrednosti) {
8 for (boolean q : vrednosti) {
9 System.out.println(p + " или " + q + " = " + (p ||
10 q));
11 }
12 }
13 }
14 }

В. Или p или q

1 public class TruthValues {


2 public static void main(String[] args) {
3 // Можни вредности за p и q
4 boolean[] vrednosti = { true, false };
5 // За секоја комбинација на p и q, испечати "или p или q"
6 System.out.println("Вистинските вредности на either p или
7 q:");
8 for (boolean p : vrednosti) {
9 for (boolean q : vrednosti) {
10 System.out.println("или" + p + " или " + q + " = " +
11 (p ^ q));
12 }
13 }
14 }
15 }

25
Г. Или p или нејзината негација

1 public class TruthValues {


2 public static void main(String[] args) {
3 // Можни вредности за p
4 boolean[] vrednosti = { true, false };
5
6 // За секоја вредност на p, испечати “или p или нејзината
7 негација”
8 System.out.println("Вистинските вредности на или p или
9 нејзината негација:");
10 for (boolean p : vrednosti) {
11 System.out.println("или " + p + " или " + !p + " = " +
12 (p ^ !p));
13 }
14 }
15 }

Овие програми ги проверуваат сите можни комбинации на вредности за


променливите p и q, и за секоја комбинација ги испечатуваат вистинските
вредности за изразите А,Б,В и Г.
______________________________________________________________________________
9. Изменете ја програмата Distance3D.java така што растојанието d ќе се пресметува
од следнава формула:
2 2 2 2 2 2
𝑤𝑥(𝑥1−𝑥2) +𝑤𝑦(𝑦1−𝑦2) +𝑤𝑧 (𝑧1−𝑧2)
d=
2 2 2
𝑤𝑥+𝑤𝑦+𝑤𝑧

каде 𝑤𝑥 = 0. 5, 𝑤𝑦 = 0. 3, 𝑤𝑧 = 0. 2

26
Одговор:

1 public class Distance3D {


2 public static void main(String[] args) {
3 // Координати на точка 1
4 double x1 = 3;
5 double y1 = 2;
6 double z1 = 1;
7 // Координати на точка 2
8 double x2 = 6;
9 double y2 = 5;
10 double z2 = 4;
11 // Тежински вектори
12 double wx = 0.5;
13 double wy = 0.3;
14 double wz = 0.2;
15 // Пресметка на дистанцата
16 double distance = Math.sqrt(
17 Math.pow(wx * (x1 - x2), 2) +
18 Math.pow(wy * (y1 - y2), 2) +
19 Math.pow(wz * (z1 - z2), 2)
20 ) / Math.sqrt(Math.pow(wx, 2) + Math.pow(wy, 2) +
21 Math.pow(wz, 2));
22 // Печатење на дистанцата
23 System.out.println("Дистанцата меѓу точките е: " +
24 distance);
25 }}

______________________________________________________________________________
10. Напишете JAVA програма која ги претставува следниве чекори
А. Декларира две int променливи именувани како х и у.
Б. Доделете вредност 3 на х.
В. Доделете двојно поголема вредност од х на у.
Г. Направете замена на вредностите на х и у (без експлицитно доделување на
вредноста 3 на у).
Д. Испечатете ја вредноста на двете варијабли на екранот.

27
Одговор:

1 public class Main {


2 public static void main(String[] args) {
3 // Декларација на две int променливи x и y
4 int x, y;
5
6 // Доделување на вредноста 3 на x
7 x = 3;
8
9 // Доделување на двојната вредност на x на y
10 y = 2 * x;
11
12 // Замена на вредностите на x и y
13 x = x + y;
14 y = x - y;
15 x = x - y;
16
17 // Печатење на вредностите на x и y
18 System.out.println("Вредноста на x е: " + x);
19 System.out.println("Вредноста на y е: " + y);
20 }
21 }

______________________________________________________________________________

4. Проблеми при манипулација со податоци


_____________________________________________________________________________________

1. Наведете го типот на податоци на следниве вредности.


9.0 8 15d 900F 258234
‘8’ “888” “16.0d” 15L “8”
0x99 (int)9.1 1e1 256f 900L

28
1.0e10

Одговор:
9.0 - double (децимален број)
8 - int (цел број)
15d - double (децимален број)
900F - float (децимален број)
258234 - int (цел број)
'8' - char (знака)
"888" - String (низа на знаци)
"16.0d" - String (низа на знаци)
15L - long (цел број)
"8" - String (низа на знаци)
0x99 - int (цел број, хексадецимален формат)
(int)9.1 - int (цел број)
1e1 - double (децимален број, експоненцијален запис)
256f - float (децимален број)
900L - long (цел број)
1.0e10 - double (децимален број, експоненцијален запис)
______________________________________________________________________________
2. Наведете го типот на податоци на вредностите кои произлегуваат од следниве
операции.
½ 9F+3D (int)(5+5.0)
6.0%9 1.0*1/1 9+(double)4
1.5f+3 (int)5.0+5.0 (double)5+”6”
Одговор:
1/2 - int (целобројно делење резултира во цел број)

29
9F+3D - double (F и D означуваат литерали со покретни точки)
(int)(5+5.0) - int (резултатот е експлицитно претворен во цел број)
6.0%9 - double (остатокот оператор (%) работи со броеви со покретни точки)
1.0*1/1 - double (множење и делење со броеви со покретни точки)
9+(double)4 - double (еден од операндите е експлицитно претворен во double)
1.5f+3 - float (резултатот е промовиран во float за да се спари со операндот float)
(int)5.0+5.0 - double (еден од операндите е експлицитно претворен во int)
(double)5+"6" - String (спојувањето со String го претвора double во String)
______________________________________________________________________________
3. Објаснете го проширувањето и стеснувањето во контекст на JAVA програмирањето.

Одговор:
Проширувачките конверзии се вршат автоматски од Java кога нема ризик од загуба
на податоци, додека стеснувањето на конверзии бара експлицитно кастинг и може
да резултира со загуба на податоци. Kонверзијата од поширок тип на податоци во
потесен тип на податоци се нарекува стеснување, додека спротивното се нарекува
проширување.
______________________________________________________________________________
4. Објаснете зошто следниов код прикажува грешка при компилација. компајлирање

1 int x1,x2;
2 double y = 1.0;
3 x1 = (int)y;
4 x2 = 1L;

Одговор:
Грешката во компилацијата во следниот дел од кодот е поради обидот за
доделување на вредност од различен тип на променливата.
● x1 = (int)y; Оваа линија е во ред. Тука y е double променлива која се
претвора во int преку експлицитно кастирање (casting) со (int). Ова е
пример за narrowing conversion , каде што се губи дел од информацијата.
● x2 = 1L; Овде настанува грешка. 1L е long литерал, кој не може да се
додели директно на int променлива без кастирање. Во Java, долгите
литерали (long literals) се обележани со L на крајот. За да се избегне
грешката, може да се изврши кастирање на 1L во int, како x2 = (int)1L;.
За да се корегира грешката, линијата треба да изгледа вака:

30
x2 = (int)1L;
1

Со оваа промена, 1L (long) ќе биде кастиран во int и се доделува на x2.


_____________________________________________________________________________________________
5. Одредете ја крајната вредност на варијаблата х во следниот код.

double x;
1
int y = 90;
2
x = y/100;
3
System.out.println("x="+x);
4

Одговор:
Вредноста на y е 90, а 100 е int литерал. Кога ќе се изврши делењето помеѓу два int
броеви во Java, резултатот ќе биде цел број. Во овој случај, 90 / 100 дава резултат
0.9, но бидејќи се оперира со int, резултатот ќе биде 0.
Откако резултатот ќе биде пресметан како цел број, тогаш ќе се додели на double
променливата x. Цело бројниот резултат 0 ќе биде претворен во double, па
резултатот ќе биде 0.0.

_________________________________________________________________________
6. Напишете JAVA програма која ќе ги извршува следниве чекори.
А. Декларирајте float варијабла наречена f;
Б. Декларирајте int варијабла наречена k;
В. Доделете вредност 22,5 на f;
Г. Доделете ја вредноста од f на k;
Д. Конвертирајте ја тековната вредност на f во кратка и испечатете ја на екранот.

Одговор:

1 public class Main {


2 public static void main(String[] args) {
3 // Чекор a: Декларација на float променлива f
4 float f;
5 // Чекор б: Декларација на int променлива k
6 int k;
7 // Чекор в: Доделување на вредноста 22.5 на f
8 f = 22.5f; // Потребно е да се додели литералот со 'f' на
9 крајот за да се нагласи дека вредноста е float.

31
10 // Чекор г: Доделување на вредноста на f на k со претворба
11 на типот
12 k = (int) f;
13 // Чекор д: Претворање на тековната вредност на f во short и
14 печатење на екран
15 short s = (short) f;
16 System.out.println("Претворената вредност на f во short е: "
17 + s);
18 }
19 }

______________________________________________________________________________
7. Напишете JAVA програма која ќе ги извршува следниве чекори.
А. Декларирајте int варијабла наречена k;
Б. Декларирајте double варијабла наречена pi и иницијализирајте ја на вредноста на
∏;
В. Пресметајте го најмалиот цел број кој е поголем од вредноста на пи на квадрат, и
доделете ја добиената вредност на k.

Одговор:

1 public class Main {


2 public static void main(String[] args) {
3 // Чекор a: Декларација на int променлива k
4 int k;
5 // Чекор b: Декларација на double променлива pi и
6 иницијализација на нејзината вредност со вредноста на пи
7 double pi = Math.PI;
8 // Чекор c: Пресметување на најмалиот цел број кој е поголем
9 од квадратот на вредноста на pi, и доделување на резултантот на k
10 k = (int) Math.ceil(pi * pi);
11
12 // Печатење на вредноста на k
13 System.out.println("Најмалиот цел број поголем од квадратот
14 на вредноста на pi е: " + k);

32
15 }
16 }
17

______________________________________________________________________________
8. Одредете што ќе се покаже на екранот ако се извршат следниве искази.

float f = 500F, g = 500F;


1
System.out.println(f/0);
2
System.out.println(-f/0);
3
System.out.println((f-500)/(f-g));
4
System.out.println(-(f-500)/(f-g));
5

Одговор:
● Печатењето на f/0 ќе даде резултат Infinity. Делењето на било кој број со 0
во Java резултира со Infinity.
● Печатењето на -f/0 ќе даде резултат -Infinity. Исто како и претходниот
случај, само што сега резултатот е негативен бесконечност.
● Печатењето на (f-500)/(f-g) ќе даде резултат NaN (Not a Number). Ова се
случува кога операцијата не може да се дефинира како резултат откако ќе
се пресмета.
● Печатењето на -(f-500)/(f-g) пак, исто како и претходниот случај, дава
резултат NaN (Not a Number).
_____________________________________________________________________________

9. Одредете ја вредноста на х кога ќе се извршат следниве искази.

1 double x = 1;
2 x += 3;
3 x *= 10;
4 x -= 10;
5 x /= 5;
6 x %= 5;

33
Одговор:
Кога ќе се изврши горниот дел од кодот, вредноста на променливата x ќе се
промени според операциите кои се извршуваат.
Прво, x е иницијализирана на 1.
x += 3; ќе го зголеми x за 3. Во моментов x е 4.
x *= 10; ќе го умножи x со 10. Во моментов x е 40.
x -= 10; ќе го намали x за 10. Во моментов x е 30.
x /= 5; ќе го подели x со 5. Во моментов x е 6.
x %= 5; ќе го пресмета остатокот при делење на x со 5.
Откако сите операции ќе бидат извршени, вредноста на x ќе биде 1.

_____________________________________________________________________________
10. Во еден точен исказ во JAVA, на у доделете и вредност двојно поголема од
вредноста на х, а потоа зголемете ја х за еден. Претпоставете дека х и у се
варијабли од типот int кои се точно декларирани и иницијализирани.
Одговор:

1 public class Main {


2 public static void main(String[] args) {
3 // Претпоставка: x и y се веќе декларирани и иницијализирани
4 int променливи
5 int x = 5; // Пример вредност за x
6 int y
7 y = 2 * x++; // На y му се доделуваат двојната вредност на x,
8 а потоа x се зголемува за 1
9 // Печатење на вредноста на y за проверка
10 System.out.println("Вредноста на y е: " + y);
11 }
12 }

Оваа програма ја користи наредбата y = 2 * x++; за да ја додели на y двојната


вредност на x, а потоа x се зголемува за 1 и на крај ја испечатува вредноста на y за
проверка.
______________________________________________________________________________
11. Во еден JAVA исказ, направете ја вредноста на х двојно поголема од дотогашната, а
потоа доделете ја вредноста на у. Претпоставете дека х и у се варијабли од типот int
кои се точно декларирани и иницијализирани.
Одговор:

1
public class Main {
2
public static void main(String[] args) {
3

34
4 // Претпоставка: x и y се веќе декларирани и иницијализирани
5 int променливи
6 int x = 6; // Пример вредност за x
7 int y;
8 y = 2 * x; // На y му се доделува двојната вредност на x
9 // Печатење на вредноста y за проверка
10 System.out.println("Вредноста на y е: " + y);
11 }
}

Оваа програма ја користи наредбата y = 2 * x; за да ја додели на y двојната вредност


на x, а потоа ја испечатува вредноста на y за проверка.
______________________________________________________________________________
12. Објаснете зошто следниот код прикажува грешка при компилација.

int x;
1
(x++)++;
2

Одговор:
Оваа код сегмента предизвикува грешка при компајлирање поради несоодветната
употреба на операторот ++.
Во Java, операторот ++ може да се користи само за инкрементирање на вредноста
на променливата по што може да се изврши изразот. Во изразот (x++)++, прво се
извршува операторот x++ кој инкрементира вредноста на x, но враќа старата
вредност на x. Потоа, се обидува да се инкрементира вредноста што е вратена од
x++, што не е дозволено.
Операторот ++ може да се користи само на променлива, а не на вредност која не
може да се менува. Затоа оваа употреба на ++ операторот е несоодветна и
предизвикува грешка при компајлирање.
_____________________________________________________________________________________________

13. Одредете што ќе се прикаже на екранот ако се изврши следниов исказ.

int x=1,y=5;
1
System.out.print(++x+”,”+y++);
2

Одговор:
Ќе произлезе следниот излез:

35
++x: Инкрементирање на x (префиксно) пред извршување на изразот, па x станува
2.
y++: Ќе го отпечати тековното y (што е 5) пред инкрементирањето, па y станува 6.
На излез ќе се добие 2,5.
Вредноста на x е инкрементирана пред да се отпечати, а вредноста на y е
отпечатена пред да се инкрементира.

_______________________________________________________________________
14. Одредете што ќе се прикаже на екранот ако се изврши следниов исказ.

int x=1;
1
System.out.print(x+(x++)+(x++));
2

Одговор:
Прво се прочитува вредноста на x, која е 1.
Потоа се извршува изразот x++, x се зголемува за еден, но вредноста во изразот сè
уште е 1.
Следниот x++ го зголемува x за уште еден, но вредноста во изразот е сè уште 1.
Следователно, изразот ќе биде пресметан како 1 + 1 + 1 + 1, што резултира во 4.
_____________________________________________________________________________________________
15. Одредете што ќе се прикаже на екранот ако се изврши следниов исказ.

int x=1;
1
System.out.print(x+(++x)+(++x));
2

Одговор:
Во овој израз x + (++x) + (++x), прво ќе се изврши првото инкрементирање на x
кој ќе го зголеми x од 1 на 2. Потоа, второто и третото инкрементирање.
Сега, изразот ќе биде пресметан како 1 + 2 + 3, што резултира во 6.
_____________________________________________________________________________
16. Одредете што ќе се прикаже на екранот ако се изврши следниов исказ.

int x=1,y;
1
System.out.print(y=x++ +x);
2

Одговор:

36
Во овој израз, x++ се користи за инкрементирање на вредноста на x по
користењето на нејзината почетна вредност за пресметка. Со други зборови, прво
се користи вредноста на x (која е 1), а потоа се зголемува x за еден.
Со примената на операторот x++, вредноста на x во изразот станува 2.
Следователно, изразот y = x++ + x; се преведува како y = 1 + 2;, бидејќи почетната
вредност на x се користи прво, а потоа x се зголемува за еден.
Резултатот ќе биде 3. Печатењето на y на екран ќе даде резултатот 3.
______________________________________________

5. Употреба на објекти
_____________________________________________________________________________________

1. Напишете JAVA искази кои ќе ги следат следниве чекори.


А. Декларирајте променлива која ќе се зачува како String. Дадете и име ѕ1.
Б. Нека ѕ1 упатува на нов String објект чија содржина е „JAVA“.
В. Декларирајте друга променлива наречена ѕ2 која ќе упатува на нов String објект
чија содржина е „Programming“.
Г. Прикажете ја вредноста на ѕ1 и ѕ2 на екранот.
Одговор:

1
public class Main {
2
public static void main(String[] args) {
3
// Чекор а: Декларација на променлива за складирање на
4
String. Имејте ја s1.
5
String s1;
6
// Чекор b: Нека s1 се однесува на нов објект String чиј
7
содржини се "Java".
8
s1 = new String("Java");
9
// Чекор c: Декларација на уште една променлива наречена s2
10
и нека се однесува на нов објект String чиј содржини се
11
"Programming".
12
String s2 = new String("Programming");
13
// Чекор d: Печатење на конкатенацијата на s1 и s2 на екран.
14
System.out.println(s1 + s2);
15
}
16
}
17

Оваа програма ќе испечати на екран:


JavaProgramming
______________________________________________________________________________
2. Објаснете ја со свои зборови функционалноста на две точки операторот во исказот

37
1 System.out.print(“I love eating!”);

Одговор:
Во примерот кој e наведен, System.out.print("I love eating!");, точката оператор (.)
има две функции:
System.out: Овој дел од исказот се однесува на out ,кој се користи за стандарден
излез. Оваа точка оператор овозможува пристап до членовите или методите на објектот
out, како што е методот print().
print(): Оваа функција е дел од објектот out и служи за печатење на текст или
вредности на стандардниот излез. Во конкретниот случај, print("I love eating!") го печати
текстот "I love eating!" на стандардниот излез.
Така, точката оператор во дадениот исказ го овозможува пристапот до методот
print() од објектот out, кој е дел од класата System, за да се испечати текстот "I love eating!"
на стандардниот излез.
_____________________________________________________________________________________

3. Дадено е дека Calendar е класа во JAVA а с е променлива која припаѓа на класата


Calendar. Кој од наредниве искази вклучува повикување на метод во класата
Calendar. А кои пристапуваат до одредени податоци во класата Calendar.
(Игнорирајте го нивното значење)

Одговор:
А. Calendar.DECEMBER- Ова е константа која пристапува до податоци
(променливи) во класата Calendar. Таа пристапува до константата
DECEMBER која претставува еден од месеците во календарот, но не
вклучува повикување на метод.
B. Calendar.getInstance()-Оваа функција се повикува на класата Calendar
и враќа инстанца (објект) од класата Calendar. Ова е метод кој се
повикува за да се добие инстанца на календарот, така што вклучува
повикување на метод.
C. Calendar.getAvailableLocales()-Оваа функција се повикува на класата
Calendar и враќа список од достапните локали за календарот. Таа
вклучува повикување на метод.
D. c.isTimeSet- Ова е пристап до податоци (променлива) во објектот c од
класата Calendar, која ги проверува дали времето е поставено. Не
вклучува повикување на метод.
E. Calendar.MILLISECOND- Ова е константа која пристапува до
податоци (променливи) во класата Calendar. Таа пристапува до
константата MILLISECOND која претставува дел од времето во
милисекунди, но не вклучува повикување на метод.
F. c.clear()-Оваа функција се повикува на објектот c од класата Calendar и

38
ја прочитува содржината на календарот. Таа вклучува повикување на
метод.
G. c.get(1)-Оваа функција се повикува на објектот c од класата Calendar и
враќа вредноста за одреден аспект на календарот (во овој случај, за
годината). Таа вклучува повикување на метод.
______________________________________________________________________________
4. Напишете JAVA програма која ќе ги пресметува и покажува периметарот и
плоштината на три круга кои имаат радиуси 3, 100 и 8.75 центиметри.

Одговор:

1
public class CircleCalculations {
2
public static void main(String[] args) {
3
// Променливи за радиусите на круговите
4
double radius1 = 3; // радиус на првиот круг
5
double radius2 = 100; // радиус на вториот круг
6
double radius3 = 8.75;// радиус на третиот круг
7
// Пресметка на плоштината на круговите
8
double area1 = Math.PI * radius1 * radius1;
9
double area2 = Math.PI * radius2 * radius2;
10
double area3 = Math.PI * radius3 * radius3;
11
// Пресметка на периметарот на круговите
12
double circumference1 = 2 * Math.PI * radius1;
13
double circumference2 = 2 * Math.PI * radius2;
14
double circumference3 = 2 * Math.PI * radius3;
15
// Прикажување на резултатите
16
System.out.println("Круг со радиус " + radius1 + " cm
17
има:");
18
System.out.println("Плоштина: " + area1 + " cm^2");
19
System.out.println("Периметар: " + circumference1 + " cm");
20
System.out.println();
21

39
22 System.out.println("Круг со радиус " + radius2 + " cm
23 има:");
24 System.out.println("Плоштина: " + area2 + " cm^2");
25 System.out.println("Периметар: " + circumference2 + " cm");
26 System.out.println();
27 System.out.println("Круг со радиус " + radius3 + " cm
28 има:");
29 System.out.println("Плоштина: " + area3 + " cm^2");
30 System.out.println("Периметар: " + circumference3 + " cm");
31 }
32 }
33
34

Оваа програма ги пресметува плоштината и периметарот на круговите со радиуси


3, 100 и 8.75 центиметри, и ги прикажува резултатите на стандардниот излез.
_____________________________________________________________________________________

5. Што ќе се прикаже на екранот ако се искомпелира следнив код.

String s = “tachygraphometry”;
1
System.out.println(s.charAt(1));
2
System.out.println(s.charAt(5));
3
System.out.println(s.charAt(12));
4
System.out.println(s.charAt(s.length()-1));
5

Одговор:
● s.charAt(1) враќа знакот на индекс 1 од стрингот, кој е 'a'.
● s.charAt(5) враќа знакот на индекс 5 од стрингот, кој е 'y'.
● s.charAt(12) враќа знакот на индекс 12 од стрингот, кој е 'o'.
● s.charAt(s.length()-1) враќа знакот на последниот индекс од стрингот,
кој е 'y'.
● Ќе се испечатат буквите a,y,o,y.
● Бидејќи должината на стрингот е 17 и индексирањето започнува од 0,
последниот знак е на индекс 16.
_____________________________________________________________________________________

6. Што ќе се прикаже на екранот ако се искомпелира следниов код.

1 String s1 = "macaroni penguin";

40
2 String s2 = s1.substring(
3 s1.indexOf(' ')+1,s1.length()).toUpperCase();
4 System.out.println(s1);
5 System.out.println(s2);

Одговор:
Излезот од дадениот код е macaroni penguin, PENGUIN
Објаснување:
● s1 е иницијализиран со стрингот "macaroni penguin".
● s2 е иницијализиран со подстринг од s1 кој започнува по првото
празно место до крајот на стрингот (s1.length()), а потоа е
конвертиран во големи букви со методот toUpperCase().
● Се испечатува s1, кој останува непроменет и печати "macaroni
penguin".
● Се испечатува s2, кој е подстрингот "penguin" конвертиран во големи
букви, резултирајќи во "PENGUIN".
_____________________________________________________________________________
7. Што ќе се прикаже на екранот ако се искомпелира следниов код.

String s1 = "Houston";
1
String s2 = "Dallas".concat(s1);
2
s1 = s2.substring(2,4);
3
System.out.println(s1.length());
4
System.out.println(s2.length());
5

Одговор:
Излезот од дадениот код е 2, 13
Објаснување:
● Прво, s1 е иницијализиран со стрингот "Houston".
● Потоа, на стрингот "Dallas" му се додава s1 со concat(), што резултира
во стрингот s2 кој станува "DallasHouston".

41
● Потоа, s1 се доделува како подстринг на s2 кој започнува од индекс 2
и завршува на индекс 4 (исклучително), што ја прави подстрингот
"lla".
● Се печати должината на s1, која е 2.
● Се печати должината на s2, која е 13.

______________________________________________________________________________
8. Што ќе се прикаже на екранот ако се искомпелира следниов код.

String s = "Jacobian";
1
System.out.println(s.indexOf('J'));
2
System.out.println(s.indexOf('c'));
3
System.out.println(s.indexOf('a'));
4
System.out.println(s.indexOf('j'));
5
System.out.println(s.indexOf('c'-1));
6

Одговор:
Излезот од дадениот код е 0,4,1,-1,2
Објаснување:
● s.indexOf('J') ја враќа првата појава на знакот 'J' во стрингот, која е на
индекс 0.
● s.indexOf('c') ја враќа првата појава на знакот 'c' во стрингот, која е на
индекс 4.
● s.indexOf('a') ја враќа првата појава на знакот 'a' во стрингот, која е на
индекс 1.
● s.indexOf('j') ќе врати -1 бидејќи нема мала 'j' во стрингот.
● s.indexOf('c'-1) се пресметува како s.indexOf(99-1), односно
s.indexOf(98), што е индексот на втората појава на знакот 'b' во
стрингот, кој е на индекс 2.

_____________________________________________________________________________
9. Што ќе се прикаже на екранот ако се искомпелира следниов код.

String s1 = "A";
1
String s2 = s1+1;
2
char c = 'A';
3
String s3 = c+1+"A";
4
System.out.println(s2.concat(s3).concat(s1));
5

42
Одговор:
Излезот од дадениот код е 2АВАА
Објаснување:
● s1 е иницијализиран со стрингот "A".
● s2 е конкатенирано со s1 и бројот 1, што резултира во стрингот s2 кој
станува "A1".
● Променливата c е иницијализирана со карактерот 'A'.
● s3 е конкатенирано со c, 1 и буквата "A". За збор со c е претставен
како ASCII код, кој е 65, па резултатот е 65+1 или "66" и потоа
буквата "A" се додава на крајот, резултирајќи во стрингот s3 кој
станува "66A".
● s2.concat(s3).concat(s1) конкатенира s2, s3 и s1, резултирајќи во "A1" +
"66A" + "A", што е "2ABAA".
_____________________________________________________________________________________

10. Што ќе се прикаже на екранот ако се искомпелира следниов код.

1 String s = "1999";
2 System.out.println(String.valueOf(s));
3 System.out.println(String.valueOf(s)+1);
4 System.out.println(String.valueOf(s+1));

Одговор:
Излезот од дадениот код е 1999,19991,19991
Објаснување:
● String.valueOf(s) ќе врати истиот стринг s, кој веќе е "1999".
● String.valueOf(s)+1 ќе конкатенира стрингот s со бројот 1,
резултирајќи во "1999" + "1", што е "19991".
● String.valueOf(s+1) го конкатенира стрингот s со бројот 1,
резултирајќи во "1999" + "1", што е "19991".
_____________________________________________________________________________________

11. Објаснете зошто класата String е достапна за нашата програма без користење на
исказот import, а зошто исказот important е потребен кога сакаме да ја користиме
класата BufferedReader во нашата програма.

Одговор:

Класата String е дел од основната Java SDK библиотека (java.lang), која се


автоматски вчитува во секоја Java програма. Затоа, не е потребен исказот import за
да ја користиме класата String. Оваа класа е основна и се користи многу често во
Java програми, па затоа е вклучена во стандардната библиотека.

43
На другата страна, класата BufferedReader е дел од java.io пакетот, кој не е дел од
java.lang. За да ја користиме оваа класа, треба да ја импортираме во нашата
програма со исказот import java.io.BufferedReader;. Бидејќи не е дел од основната
Java библиотека, треба да ја вклучиме експлицитно со import исказот за да биде
достапна во нашата програма. Ова се прави за да се овозможи користење на класата
BufferedReader и други класи од java.io пакетот во програмата.
______________________________________________________________________________
12. Напишете JAVA програма која ќе прифаќа текстуална порака која корисникот ја
внел преку тастатура и ќе ја прикаже истата на екранот.

Одговор:

1 import java.util.Scanner; // Импортирање на класата Scanner


2 public class Main {
3 public static void main(String[] args) {
4 // Креирање на објект од класата Scanner за внес од
5 тастатура
6 Scanner scanner = new Scanner(System.in);
7
8 // Печатење на порака за внес од корисникот
9 System.out.print("Внесете текстуална порака: ");
10
11 // Читање на внесот од корисникот
12 String message = scanner.nextLine();
13
14 // Печатење на внесената порака
15 System.out.println("Вашата порака е: " + message);
16
17 // Затварање на Scanner објектот
18 scanner.close();
19 }
20 }

Оваа програма ќе го печати внесениот текст од корисникот на екран.


______________________________________________________________________________
13. Напишете JAVA програма која ќе прифаќа две текстуални пораки кои корисникот ги
внел од тастатура, истите ќе ги спои и ќе ги прикаже на екранот.

44
Одговор:

1 import java.util.Scanner; // Импортирање на класата Scanner


2 public class Main {
3 public static void main(String[] args) {
4 // Креирање на објект од класата Scanner за внес од
5 тастатура
6 Scanner scanner = new Scanner(System.in);
7
8 // Првата порака од корисникот
9 System.out.print("Внесете првата текстуална порака: ");
10 String firstMessage = scanner.nextLine();
11
12 // Втората порака од корисникот
13 System.out.print("Внесете втората текстуална порака: ");
14 String secondMessage = scanner.nextLine();
15
16 // Спојување на две пораки
17 String result = firstMessage + secondMessage;
18
19 // Печатење на резултатот
20 System.out.println("Резултатот откако ќе се спојат двете
21 пораки е: " + result);
22 // Затворање на Scanner објектот
23 scanner.close();
24 }
25 }

Оваа програма ќе ги спои внесените текстуални пораки од корисникот и ќе го


печати резултатот на екран.
______________________________________________________________________________
14. Напишете JAVA програма која ќе прифаќа телефонски број во форма хх-ххх-хххх
каде секој х е број (пр. 02-123-9999), а на екранот ќе ја прикаже во следнава форма:
х-хххх-хххх (пр. 0-2123-9999).

45
Одговор:

1 import java.util.Scanner; // Импортирање на класата Scanner


2 public class Main {
3 public static void main(String[] args) {
4 // Креирање на објект од класата Scanner за внес од
5 тастатура
6 Scanner scanner = new Scanner(System.in);
7 // Прашање за внес на телефонски број
8 System.out.print("Внесете телефонски број во формат
9 xx-xxx-xxxx: ");
10 String phoneNumber = scanner.nextLine();
11 // Отстранување на цртичките од внесениот број
12 String formattedNumber = phoneNumber.replace("-", "");
13 // Форматирање на телефонскиот број во x-xxxx-xxxx
14 String result = formattedNumber.charAt(0) + "-" +
15 formattedNumber.substring(1, 5) + "-" +
16 formattedNumber.substring(5);
17 // Печатење на форматираниот број
18 System.out.println("Телефонскиот број во формат x-xxxx-xxxx
19 е: " + result);
20
21 // Затварање на Scanner објектот
22 scanner.close();
23 }
24 }

______________________________________________________________________________
15. Напишете JAVA програма која ќе прифаќа емаил адреса, а на екранот ќе ги прикаже
името на корисникот и називот на е-поштата во две посевни редици. Пр.,
me@somemail.com да биде прикажано на следниов начин:

me
somemail.com

46
Одговор:

1
import java.util.Scanner; // Импортирање на класата Scanner
2
public class Main {
3
public static void main(String[] args) {
4
// Креирање на објект од класата Scanner за внес од
5
тастатура
6
Scanner scanner = new Scanner(System.in);
7
// Прашање за внес на е-поштената адреса
8
System.out.print("Внесете ја Вашата е-поштената адреса: ");
9
String email = scanner.nextLine();
10
11
// Пронаоѓање на индексот на @ за да ги одделиме името на
12
сметката и доменот
13
int atIndex = email.indexOf('@');
14
15
// Име на сметката
16
String username = email.substring(0, atIndex);
17
18
// Домен на е-поштата
19
String domain = email.substring(atIndex + 1);
20
21
// Печатење на името на сметката и доменот
22
System.out.println("Името на сметката е: " + username);
23
System.out.println("Доменот на е-поштата е: " + domain);
24
// Затварање на Scanner објектот
25
scanner.close();
26
}
27
}
28

Оваа програма ќе ја прифати е-поштата од корисникот, ќе ги одделат името на


сметката и доменот и ќе ги печати на две посебни линии.

____________________________________________________________________________________________

47
16. Напишете JAVA програма која ќе прифаќа два броја a и b внесени од корисникот, а
на екранот ќе го брикаже резултатот на следнава математички равенки:
𝑎 𝑏 𝑏
a+b,axb, 𝑏
, 𝑎 и 𝑎.

Одговор:

1
2
import java.util.Scanner; // Импортирање на класата Scanner
3
import java.lang.Math; // Импортирање на Math класата за коренување
4
public class Main {
5
public static void main(String[] args) {
6
// Креирање на објект од класата Scanner за внес од тастатура
7
Scanner scanner = new Scanner(System.in);
8
// Прашање за внес на првиот број a
9
System.out.print("Внесете го првиот број a: ");
10
double a = scanner.nextDouble();
11
// Прашање за внес на вториот број b
12
System.out.print("Внесете го вториот број b: ");
13
double b = scanner.nextDouble();
14
// Пресметка и печатење на резултатите
15
System.out.println("Собирање (a + b): " + (a + b));
16
System.out.println("Множење (a * b): " + (a * b));
17
// Проверка за делење со нула пред да се направи пресметката
18
if (b != 0) {
19
System.out.println("Делење (a / b): " + (a / b));
20
System.out.println("Степенување (a^b): " + Math.pow(a,
21
b));
22
double rootBofA = Math.pow(a, 1.0 / b);
23
System.out.println("Коренот од бројот a со основа b е: "
24
+ rootBofA);
25
} else {
26
System.out.println("Делењето со нула не е дозволено.");
27
}
28
// Затварање на Scanner објектот
29
scanner.close();
30
}
31
}
32
33

48
34

Оваа програма ќе ги прифати двата броеви од корисникот, ќе ги изврши


нумеричките пресметки и ќе ги испечати резултатите. Важно е да се провери
за делење со нула пред да се изврши делењето за да се избегнат грешки. За
коренувањето и степенувањето се користи класата Math од Java API.

______________________________________________

6. Одлуки
_____________________________________________________________________________________

1. Претпоставете дека х и у се int варијабли. Разгледајте го следниов код:

1 if(x!=y){
2 System.out.println("1");
3 }
4 if(x>y){
5 System.out.println("2");
6 }
7 if(x%y == 0){
8 System.out.println("3");
9 }

Одговор:
Што ќе се прикаже на екранот ако:
1) x = 2, y = 6
За x = 2 и y = 6, ќе се прегледа секоја if-наредба посебно:
● if(x!=y) - Оваа наредба ќе се изврши бидејќи x не е еднакво на y, па ќе
се испечати "1".
● if(x>y) - Оваа наредба нема да се изврши бидејќи x не е поголемо од
y.
● if(x%y == 0) - Оваа наредба нема да се изврши бидејќи x не е деливо
со y.
● Следователно, само ќе се испечати "1".
2) x = 1, y = 1
За x = 1 и y = 1, ќе се прегледа секоја if-наредба посебно:

49
● if(x!=y) - Оваа наредба нема да се изврши бидејќи x е еднакво на y.
● if(x>y) - Оваа наредба нема да се изврши бидејќи x не е поголемо од
y.
● if(x%y == 0) - Оваа наредба ќе се изврши бидејќи x е дел од y,
односно 1 е дел од 1.
● Следователно, ќе се испечати "3".
3) x = 9, y = 4
За x = 9 и y = 4, ќе се прегледа секоја if-наредба посебно:
● if(x!=y) - Оваа наредба ќе се изврши бидејќи x не е еднакво на y, па ќе
се испечати "1".
● if(x>y) - Оваа наредба ќе се изврши бидејќи x е поголемо од y, па ќе
се испечати "2".
● if(x%y == 0) - Оваа наредба нема да се изврши бидејќи x не е деливо
со y.
● Следователно, ќе се испечати "1" и "2".
4) x = 10, y = 5
За x = 10 и y = 5, ќе се прегледа секоја if-наредба посебно:
● if(x!=y) - Оваа наредба ќе се изврши бидејќи x не е еднакво на y, па ќе
се испечати "1".
● if(x>y) - Оваа наредба ќе се изврши бидејќи x е поголемо од y, па ќе
се испечати "2".
● if(x%y == 0) - Оваа наредба ќе се изврши бидејќи x е деливо со y,
односно 10 / 5 има остаток 0, па ќе се испечати "3".
● Следователно, ќе се испечати "1", "2" и "3".
_____________________________________________________________________________________

2. Претпоставете дека p и q се Boolean променливи. Разгледајте го следниов код:

1 if(p && q){


2 q = false;
3 }else{
4 if(!q)
5 System.out.println(p);
6 if(p == q)
7 System.out.println(p||q);
8 }
9 System.out.println(q);

Одговор:
Што ќе се прикаже на екранот ако:
1) p = точно, q = точно

50
За p = точно и q = точно, ќе се прегледа секоја if-наредба посебно:
● Првата if-наредба if(p && q) ќе се изврши бидејќи и p и q се true.
Поради тоа, q ќе се постави на false.
● Првиот else дел од контролната структура нема да се изврши бидејќи
веќе е извршена претходната if-наредба.
● Вториот else дел од контролната структура нема да се изврши бидејќи
q веќе е false.
● Следователно, ќе се испечати само false на екран.
2) p = точно, q = неточно
За p = точно и q = неточно, ќе се прегледа секоја if-наредба посебно:
● Првата if-наредба if(p && q) нема да се изврши бидејќи q е false.
● Првиот else дел од контролната структура ќе се изврши бидејќи
претходната if-наредба не се изврши. Во него, if(!q) ќе се изврши
бидејќи q е false и ќе се испечати вредноста на p, која е точно.
● Вториот else дел од контролната структура нема да се изврши бидејќи
p и q не се еднакви.
● Следователно, на екран ќе се испечати точно.
3) p = неточно, q = точно
За p = неточно и q = точно, ќе се прегледа секоја if-наредба посебно:
● Првата if-наредба if(p && q) нема да се изврши бидејќи p е false.
● Првиот else дел од контролната структура ќе се изврши бидејќи
претходната if-наредба не се изврши. Во него, if(!q) нема да се
изврши бидејќи q е true.
● Следователно, ниедна од if-наредбите во вториот else дел нема да се
изврши.
● Следователно, на екран ќе се испечати вредноста на q, која е точно
4) p = неточно, q = неточно
За p = неточно и q = неточно, ќе се прегледа секоја if-наредба посебно:
● Првата if-наредба if(p && q) нема да се изврши бидејќи p е false.
● Првиот else дел од контролната структура ќе се изврши бидејќи
претходната if-наредба не се изврши. Во него, if(!q) ќе се изврши
бидејќи q е false и ќе се испечати вредноста на p, која е false.
● Вториот else дел од контролната структура нема да се изврши бидејќи
p и q не се еднакви.
● Следователно, на екран ќе се испечати вредноста на p, која е false.
______________________________________________________________________________
3. Претпоставете дека x, y и z се int варијабли. Разгледајте го следниов код:

1 if(x>y||z>y)
2 System.out.println("1");

51
3 else
4 System.out.println("2");
5 if(Math.abs(x-y)>=z)
6 if(x>y)
7 System.out.println("3");
8 else
9 System.out.println("4");
10 else
11 System.out.println("5");

Одговор:
Што ќе се прикаже на екранот ако:
1) x = 1, y = 1, z = 1
Ако x = 1, y = 1, и z = 1, ќе се прегледа секоја if-наредба посебно:
● Првата if-наредба if(x>y||z>y) ќе се изврши бидејќи изразот x >
y || z > y е true. Ова значи дека ќе се испечати "1".

● Втората if-наредба if(Math.abs(x-y)>=z) ќе се изврши бидејќи


изразот Math.abs(x-y) >= z станува true, бидејќи Math.abs(1-1)
= 0, што е поголемо или еднакво на 1. Во истата гранка на if, x
> y не е исполнето, па нема да се испечати "3", туку "4".
2) x = 2, y = 1, z = 0
Ако x = 2, y = 1, и z = 0, ќе се прегледа секоја if-наредба посебно:
● Првата if-наредба if(x>y||z>y) ќе се изврши бидејќи изразот x >
y || z > y е true. Ова значи дека ќе се испечати "1".
● Втората if-наредба if(Math.abs(x-y)>=z) ќе се изврши бидејќи
изразот Math.abs(x-y) >= z станува true, бидејќи Math.abs(2-1)
= 1, што е поголемо или еднакво на 0. Во истата гранка на if, x
> y е исполнето, па ќе се испечати "3".
3) x = 3, y = 5, z = 4
Ако x = 3, y = 5, и z = 4, ќе се прегледа секоја if-наредба посебно:
● Првата if-наредба if(x>y||z>y) нема да се изврши бидејќи
изразот x > y || z > y е false.
● Втората if-наредба if(Math.abs(x-y)>=z) ќе се изврши бидејќи
изразот Math.abs(x-y) >= z станува true, бидејќи Math.abs(3-5)
= 2, што е поголемо или еднакво на 4. Во истата гранка на if, x
> y не е исполнето, па нема да се испечати "3", туку "4".
______________________________________________________________________________
4. Напишете сегмент на код кој ќе ја прикаже на екранот вредноста на променливата
int k освен ако нејзината вредност е помала од 6.

52
Одговор:

1 int k = 10; // Пример вредност за k


2
3 // Проверка дали вредноста на k е поголема или еднаква на 6
4 if (k >= 6) {
5 System.out.println("Вредноста на k е: " + k);
6 }

Овој код ќе ја испечати вредноста на променливата k бидејќи вредноста не е помала


од 6. Ако вредноста е 6 или поголема, ќе се испечати вредноста на k. Ако е помала
од 6, ништо нема да се испечати.
______________________________________________________________________________
5. Напишете сегмент на код со која ќе доделите вредност 1 на променливата целиот
број k, ако целиот број а е помал или еднаков на 5, додека пак целиот број b не е
поголем од разликата помеѓу а и друг цел број с. Во спротивно, доделете вредност 0
на d ако с е 0.

Одговор:

1 int a = 3; // Пример вредност за a


2 int b = 4; // Пример вредност за b
3 int c = 2; // Пример вредност за c
4 int d; // Променлива за резултатот
5 // Проверка дали a е помало или еднакво на 5 И b не е поголемо од
6 разликата помеѓу a и c
7 if (a <= 5 && b <= (a - c)) {
8 d = 1; // Постави d на 1
9 } else {
10 // Во спротивно, ако c е 0, постави d на 0, инаку остави d
11 непроменето
12 d = (c == 0) ? 0 : d;
13 }
14 System.out.println("Вредноста на d е: " + d);

Овој код го поставува d на 1 ако a е помало или еднакво на 5 и b не е поголемо од


разликата помеѓу a и c. Во спротивно, ако c е 0, поставува d на 0.

6. Кога а и b се две променливи, разгледајте го следниов код:

53
1 double tol = 1e-25;
2 double x = (a*b)/(b-a);
3 double y = Math.sqrt(a/b);
4 boolean p = Math.abs(a-b)/Math.max(a,b)>tol;
5 boolean q = (a>b)||(b>x);
6 if(p||q == y>x){
7 System.out.println("BLUE");
8 }else{
9 System.out.println("RED");
10 }

Кој е опсегот на вредности на а и b во претходниот код доведуваат на екранот да се појават


истовремено “BLUE” и “RED”.
Одговор:
● Треба да се исполнети истите услови за двете состојби, што е невозможно. Поради
тоа, нема опсег на вредности за a и b за кои кодот ќе испечати и "BLUE" и "RED".
● Главната причина зошто кодот нема да испечати и "BLUE" и "RED" заедно е во
начинот на кој е дефиниран условот со операторот ==. Овој оператор не го има
очекуваниот ефект, бидејќи не ги проверува искажувањата p || q и y > x како
посебни услови.
______________________________________________________________________________
7. Напишете го следниов код со помош на switch исказ, кога k има вредност на цел
број.

1 String cmd;
2 if(k==1){
3 cmd = "Edit";
4 }else if(k==2){
5 cmd = "Add";
6 }else if(k==3){
7 cmd = "Quit";
8 }else{
9 cmd = "Invalid";
10 }

Одговор:
Кодот напишан со помош на switch исказ е:

1 String cmd;
2 switch(k) {

54
3 case 1:
4 cmd = "Edit";
5 break;
6 case 2:
7 cmd = "Add";
8 break;
9 case 3:
10 cmd = "Quit";
11 break;
12 default:
13 cmd = "Invalid";
14 }

Оваа switch наредба ќе го исполни истиот услов како и оригиналниот if-else, но е


почитлив и погоден за читање. Она што прави е ја проверува вредноста на k и во
зависност од неа, ја поставува вредноста на cmd. Ако k е 1, cmd станува "Edit", ако
k е 2, cmd станува "Add", ако k е 3, cmd станува "Quit", а во сите останати случаи,
cmd станува "Invalid".
______________________________________________________________________________
8. Напишете програма со која ќе поставите String s со содржина „Непарен“ доколку
цел број k е непарен број и ѕ со содржина „Парен“ доколку k e парен број.
Користете:
Одговор:
1) If – else исказ

1 int k = 5; // Пример вредност за k


2 String s;
3
4 if (k % 2 == 0) {
5 s = "Even";
6 } else {
7 s = "Odd";
8 }
9 System.out.println("The value of s is: " + s); // Ќе испечати "Odd",
10 бидејќи 5 е нечетен број

2) Switch исказ

1 int k = 6; // Пример вредност за k


2 String s;
3
4 switch (k % 2) {
5 case 0:

55
6 s = "Even";
7 break;
8 default:
9 s = "Odd";
10 }
11 System.out.println("The value of s is: " + s); // Ќе испечати "Even",
12 бидејќи 6 е парен број

Во првиот случај, ако k е парен број, s се поставува на "Even", ако k е


непарен број, s се поставува на "Odd".
Во вториот случај, се користи switch наредбата за да се провери остатокот
при делење на 2 за да се одреди дали бројот е парен или непарен. Ако
остатокот е 0, бројот е парен и s се поставува на "Even", во спротивно, s се
поставува на "Odd".
______________________________________________________________________________
9. Напиши го следниов код со switch исказ, доколку k има вредност на цел број.

1 int p;
2 if(k==1||k==3){
3 p = 1;
4 }else if(k==2||k==4){
5 p = 2;
6 }else if(k==5){
7 p = 3;
8 }else{
9 p = 4;
10 }

Одговор:
Кодот напишан со switch исказ е:

1 int p;
2 switch(k) {
3 case 1:
4 case 3:
5 p = 1;

56
6 break;
7 case 2:
8 case 4:
9 p = 2;
10 break;
11 case 5:
12 p = 3;
13 break;
14 default:
15 p = 4;
16 }

Оваа switch наредба ќе го исполни истиот услов како и оригиналниот if-else блок. Се
забелешува дека case 1: и case 3: се обработуваат на истиот начин и сите наредби под нив
ќе се извршат. Истото важи и за case 2: и case 4:.
За вредностите на k кои не се специфицирани во ниеден case, ќе се изврши наредбата под
default. Ова гарантира дека исцртувањето на p ќе биде исто како и со if-else наредбата.

10. Што ќе се прикаже на екранот доколку k = 0, 1, 2, 3, 4.

Одговор:
Кога ќе се изврши кодот со различни вредности на k, ќе се добиат следните излези:

1) Кога k = 0:
● Ќе се испечати "D", бидејќи не се совпаѓа со било кој case.
2) Кога k = 1:
● Ќе се испечати "A", бидејќи k се совпаѓа со case 1.
● Потоа, ќе се испечати "B", бидејќи нема break наредба по case 1, па
продолжува со следните наредби сè до break.
3) Кога k = 2:
● Ќе се испечати "B", бидејќи k се совпаѓа со case 2.
● Потоа, ќе се испечати "B", бидејќи нема break наредба по case 2, па
продолжува со следните наредби сè до break.

4) Кога k = 3:
● Ќе се испечати "B", бидејќи k се совпаѓа со case 3.
● Потоа, ќе се испечати "B", бидејќи нема break наредба по case 3, па
продолжува со следните наредби сè до break.
5) Кога k = 4:

57
● Ќе се испечати "C", бидејќи k се совпаѓа со case 4.
● Потоа, ќе се испечати "D", бидејќи нема break наредба по case 4, па
продолжува со следните наредби сè до break.

Така, излезите за различни вредности на k се:

Кога k = 0, излезот е "D".


Кога k = 1, излезот е "A" и "B".
Кога k = 2, излезот е "B".
Кога k = 3, излезот е "B".
Кога k = 4, излезот е "C" и "D".

_____________________________________________________________________________
11. Што ќе се прикаже на екранот доколку се изврши следниов код?

int a = 1, b = 2;
1
System.out.println(a>b?a:b);
2

Одговор:
Овој код користи оператор (?:) за да ја испечати поголемата вредност помеѓу
променливите a и b. Ако a е поголемо од b, ќе се испечати вредноста на a, инаку ќе
се испечати вредноста на b.
Затоа што во овој случај, b е поголемо од a, ќе се испечати вредноста на b, која е 2.
______________________________________________________________________________
12. Која е Boolean вредноста на p и q со која следниов исказ ќе биде точен?

System.out.println(p!=q&&!p?p:q);
1

Одговор:
За да биде излезот од следниот код true, потребно е вредностите на p и q да се:
1) p и q се различни (поради p != q)
2) p е лажно (поради !p)

58
Според изразот p!=q&&!p, ако p и q се различни и p е лажно, тогаш изразот ќе биде
q.
Така што, q треба да биде true, бидејќи ако q е true, а p е false и p и q се различни.
Поради ова, комбинацијата на вредности за p и q за кои излезот ќе биде точен е:

● p = false
● q = true
______________________________________________________________________________
13. Препишете го следниов код користејќи ?: оператори. Доделете и char вредност на
променливата с.

1 boolean p;
2 if(c=='a'){
3 p = true;
4 }else{
5 p = false;
6 }

Одговор:
Кодот напишан со ?: оператор:

boolean p = (c == 'a') ? true : false;


1

Ова го прави истото нешто како и претходниот if-else. Ако c е еднаков на 'a',
p ќе биде true, инаку ќе биде false.
______________________________________________________________________________
14. Препишете го кодот од претходната задача, без притоа да користите искази за
услов.
Одговор:
Во овој случај, може да се користи преобразување на boolean израз во цело бројна
вредност. Користејќи Java, true се претставува со 1, а false со 0. Така што, може да
се напише кодот без користење на било какви условни конструкции како:

boolean p = (c == 'a') + 0;
1

Оваа наредба ќе постави p на true (што е 1) доколку c има вредност 'a', а на false
(што е 0) во секој друг случај. Ова е можно поради автоматско преобразување на
boolean вредности во цели броеви во Java.

59
______________________________________________________________________________
15. Препишете го следниов код користејќи ?: оператори. Доделете и int вредност на
променливата n.

1 if(n==0){
2 System.out.println("Zero");
3 }else if(n%2==0){
4 System.out.println("Even");
5 }else{
6 System.out.println("Odd");
7 }

Одговор:

int n = 10; // Пример вредност за n


1
2
String result = (n % 2 == 0) ? "Even" : "Odd";
3
System.out.println(result); // Ќе испечати "Even" за дадената
4
вредност на n
5

Овој код е еквивалентен на оригиналниот, каде result ќе биде "Even" ако n е парен
број, инаку ќе биде "Odd". Потоа, вредноста на result се печати на екран.
_____________________________________________________________________________________________
16. Што ќе се прикаже на екранот доколку се изврши следниов код?

String s1 = "Bahamas";
1
String s2 = "BAHAMAS";
2
if(s1.toUpperCase() == s2)
3
System.out.println("1");
4
if(s1.toUpperCase().equals(s2))
5
System.out.println("2");
6

Одговор:

60
Овој код ќе испечати само "2".

● Во првиот if услов, s1.toUpperCase() ќе го претвори стрингот s1 во големи


букви, така што ќе биде "BAHAMAS". Поради тоа што според условот s2
веќе е "BAHAMAS", програмата ќе се обиде да ги спореди овие два стринга.
Сепак, ова нема да биде вистинито бидејќи == операторот проверува
референци на објекти, а не нивната содржина. Иако содржината е иста,
објектите се различни.
● Во вториот if услов, s1.toUpperCase().equals(s2) ќе врати true бидејќи методот
equals() споредува содржина на стринговите, а не референци на објекти.
Така што, овој услов ќе биде исполнет и "2" ќе биде испечатено.

________________________________________________________________
17. Напишете JAVA програма која ќе прикажува на екран текст кој го внел корисникот
преку тастатура само доколку текстот е со должина од 6 до 10 карактери.
Одговор:

1 import java.util.Scanner;
2
3 public class Main {
4 public static void main(String[] args) {
5 Scanner scanner = new Scanner(System.in);
6
7 System.out.println("Внесете текстуална порака:");
8 String poraka = scanner.nextLine();
9
10 int dolzina = poraka.length();
11 if (dolzina >= 6 && dolzina <= 10) {
12 System.out.println("Внесената порака е: " + poraka);
13 } else {
14 System.out.println("Должината на внесената порака не е
15 помеѓу 6 и 10 знаци.");
16 }
17 scanner.close();
18 }
19 }

Овој програм ќе провери дали должината на текстот е помеѓу 6 и 10 знаци. Ако е,


ќе го испечати текстот, во спротивно ќе испечати порака дека должината на текстот
согласно не е помеѓу 6 и 10 знаци.
61
______________________________________________________________________________
18. Напишете JAVA програма која ќе му дозволува на корисникот ад го избере своето
корисничко име и лозинка. Програмата потврдува дали внесиното корисничко име
и лозинка се правилни. Доколку едно од нив не е точно, го известува корисникот и
ја објаснува причината за неправилноста. Правилата за избор на правилно
корисничко име и лозинка се следниве:

А. Корисничкот име мора да има должина од 6 до 15 карактери.


Б. Корисничкото име мора да започнува со голема латинична буква.
В. Лозинката не смее да биде пократка од 8 карактери, но не смее да биде подолга
од 256.
Г. Корисничкото име и лозинката не смеат да содржат било какви загради или
празни места.
Д. Лозинката не смее да биде иста или слична со корисничкото име.

Одговор:

1 import java.util.Scanner;
2 public class Main {
3 public static void main(String[] args) {
4 Scanner scanner = new Scanner(System.in);
5 // Внеси корисничко име
6 System.out.println("Внесете корисничко име:");
7 String username = scanner.nextLine();
8 // Внеси лозинка
9 System.out.println("Внесете лозинка:");
10 String password = scanner.nextLine();
11 // Проверка на валидноста на корисничкото име и лозинката
12 if (!isValidUsername(username)) {
13 System.out.println("Корисничкото име не е валидно.");
14 System.out.println("Причина: " +
15 getInvalidUsernameReason(username));
16 } else if (!isValidPassword(password, username)) {
17 System.out.println("Лозинката не е валидна.");
18 System.out.println("Причина: " +
19 getInvalidPasswordReason(password, username));
20 } else {
21 System.out.println("Корисничкото име и лозинката се
22 валидни.");
23 }
24 scanner.close();
25 }
26 // Метод за проверка на валидноста на корисничкото име
27 public static boolean isValidUsername(String username) {
28 return username.length() >= 6 && username.length() <= 15 &&

62
29 Character.isUpperCase(username.charAt(0)) &&
30 username.matches("[A-Za-z0-9]+");
31 }
32 // Метод за добивање причина за невалидно корисничко име
33 public static String getInvalidUsernameReason(String username) {
34 if (username.length() < 6 || username.length() > 15) {
35 return "Должината треба да биде помеѓу 6 и 15 знаци.";
36 } else if (!Character.isUpperCase(username.charAt(0))) {
37 return "Треба да почнува со голема буква.";
38 } else if (!username.matches("[A-Za-z0-9]+")) {
39 return "Може да содржи само букви и цифри.";
40 } else {
41 return "Непозната причина.";
42 }
43 }
44 // Метод за проверка на валидноста на лозинката
45 public static boolean isValidPassword(String password, String
46 username) {
47 return password.length() >= 8 && password.length() <= 256 &&
48 !password.contains("(") && !password.contains(")") &&
49 !password.contains(" ") &&
50 !password.equals(username);
51 }
52 // Метод за добивање причина за невалидна лозинка
53 public static String getInvalidPasswordReason(String password,
54 String username) {
55 if (password.length() < 8 || password.length() > 256) {
56 return "Должината треба да биде помеѓу 8 и 256 знаци.";
57 } else if (password.contains("(") || password.contains(")")
58 || password.contains(" ")) {
59 return "Не смее да содржи загради или празни места.";
60 } else if (password.equals(username)) {
61 return "Не смее да биде иста како корисничкото име.";
62 } else {
63 return "Непозната причина.";
64 }}}
65
66
67
68
69
70

Овој програм ќе побара од корисникот да го внесе корисничкото име и лозинката.


Потоа, ќе ги провери дали се валидни според дадените правила. Ако не се валидни,
ќе му објасни зашто и ќе му покаже како може да ги исправи.

63
7.Повторувања
1. Ако n е цел број поголем од 0, колку пати е boohoo () извршена во следниот сегмент
на кодови?

1 int i = 0;
2 do{
3 i++;
4 booHoo();
5 }while(i<=n);

Одговор :
Ако n е цел број поголем од 0, тогаш booHoo() функцијата ќе се повика n пати. Ова е
бидејќи booHoo() се повикува во do-while циклусот, каде што i се инкрементира за 1 при
секое завршување на циклусот. Циклусот продолжува да се извршува додека i е помало
или еднакво на n. Следователно, booHoo() функцијата ќе се повика точно n пати.

2. Кој е излезот од следниот код сегмент?

1 int k = 0, m = 6;
2 while(k<=3 && m>=4){
3 System.out.println(k+","+m);
4 k++;
5 m--;
6 };

Oдговор :
1. 0.6
2. 1.5
3. 2.4
4. 3.3

3. Која е вредноста на n по извршување на следниот код ?

1 int n = 1, i = 100;
2 while(n++<i--);

Одговор :
n ќе биде 101.
4. Кои се вредностите на n и m по извршување на следниот код ?

1 int n=0, m=0, i=0,maxItt=300;


2 while(i++<maxItt) n++;
3 i=0;
4 while(++i<maxItt) m++;

64
Одговор :
n = 300m = 299

5. Која е вредноста на n по извршување на следниот код ?

1 int n = 0;
2 for(int i = 1;i<=100;i++)
3 for(int j = 1;j<=100;j++)
4 n++;
Одговор :
10000

6. Која е вредноста на n по извршување на следниот код ?

1 int n = 0;
2 for(int i = 50;i>0;i--)
3 for(int j = 40;j>0;j--)
4 n++;

Одговор :
2000

7. Кој е излезот од следниот код ?

1 int k=0;
2 for(int i=100;i>1;i/=2,k++);
3 System.out.println(k);
Одговор :
6

8. Објаснете зошто следнава програма не може да се компајлира успешно

1 public class Ex7Test


2 {
3 public static void main(String[] args)
4 {
5 int n = 10, k = 0;
6 for(int i=0;i<n;i++){
7 k++;
8 }
9 System.out.println(“i=”+i+”, k=”+k);
10 }
11 }
Одговор :
Проблемот со кодот е што променливата i се пристапува надвор од својата област
на важење, што предизвикува грешка при компилација. Во Јава, променливите
дефинирани во иницијализацијата на for циклусот се видливи само во рамките на

65
самата циклус. За да го поправите ова, променливата i треба да се дефинира надвор
од циклусот.

9. Користете исказ for да напишете Java програма за да пресметате вредност од 8!


Одговор:

1 public class FactorialCalculator {


2 public static void main(String[] args) {
3 int n = 8;
4 int factorial = 1;
5 for (int i = 1; i <= n; i++) {
6 factorial *= i;
7 }
8 System.out.println("Факториелот на " + n + " е: " +
9 factorial);
10 }}

10. Повторете го претходниот проблем наместо тоа користејќи исказ while.


Одговор:

1 public class FactorialCalculator {


2 public static void main(String[] args) {
3 int n = 8;
4 int factorial = 1;
5 int i = 1;
6 while (i <= n) {
7 factorial *= i;
8 i++;
9 }
10 System.out.println("Факториелот на " + n + " е: " +
11 factorial);
12 }}

11. Напишете Java програма што пресметува n! од цел број n добиен од тастатура. Ако
вредноста на влезот n предизвикува прелевање, пријавете го на корисникот. Во
спротивно, покажете го вредност на n! на екранот.
Одговор:

1 import java.util.Scanner;
2 public class FactorialCalculator {
3 public static void main(String[] args) {
4 Scanner scanner = new Scanner(System.in);

66
5 System.out.print("Внесете цел број n за пресметка на n!: ");
6 int n = scanner.nextInt();
7 if (n < 0) {
8 System.out.println("Невалиден влез! n мора да биде
9 позитивен број.");
10 return;
11 }
12 long factorial = 1;
13 for (int i = 1; i <= n; i++) {
14 if (factorial > Long.MAX_VALUE / i) {
15 System.out.println("Прелев на пресметката! Пробајте
16 со помал број.");
17 return;
18 }
19 factorial *= i;}
20 System.out.println(n + "! = " + factorial);
21 }
22 }
23

12. Напишете Java програма што случајно избира буква англиската азбука (A-Z) и
постојано го прашува корисникот да ја погоди буквата додека тој / таа не ја погоди.
Исто така, испишете го бројот на испитувања.

Одговор:

1 import java.util.Random;
2 import java.util.Scanner;
3 public class GuessLetter {
4 public static void main(String[] args) {
5 Random random = new Random();
6 Scanner scanner = new Scanner(System.in);
7 char targetLetter = (char) (random.nextInt(26) + 'A');
8 int attempts = 0;
9
10 System.out.println("Пробајте да го погодите случајно
11 избраната буква од A до Z:");
12
13 while (true) {
14 System.out.print("Внесете ја вашата претпоставка: ");
15 char guess = scanner.next().toUpperCase().charAt(0);
16 attempts++;
17
18 if (guess == targetLetter) {
19 System.out.println("Браво! Го погодивте буквата " +
20 targetLetter + " со " + attempts + " испитувања.");
21 break;

67
22 } else {
23 System.out.println("Обидете се повторно.");
24 }
25 }
26 }
27 }

13. Определете го излезот на следниот код.

1 int i,j;
2 for(i=0,j=0;i<=100;i++){
3 if(i%2==0)
4 i++;
5 else
6 j++;
7 }
8 System.out.println(j);

Одговор : 51
14. Определете го излезот на следниот код.

int i=0,a=0,n=0;
1
while((i=a+=2)<=100){
2
n++;
3
};
4
System.out.println(i+","+a+","+n);
5

Одговор : 102 102 51

15. Која е вредноста на k по следниот код?

1 int k=0, j=0;


2 while(true){
3 if(j<20){
4 k++; j++;
5 }else{
6 break;
7 }
8 if(k>5){
9 continue;
10 }else{
11 j++;
12 }
13 }

68
Одговор : k = 6, j = 20
16. Користете вгнездени јамки за да напишете Java програма што генерира табела за
множење како што е прикажано подолу.
Одговор:
| 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

1 public class MultiplicationTable {


2 public static void main(String[] args) {
3 int size = 8; // Големина на табелата за множење
4
5 // Печатење на првиот ред од заглавјето
6 System.out.print(" |");
7 for (int i = 2; i <= size + 1; i++) {
8 System.out.printf("%4d", i);
9 }
10 System.out.println();
11
12 // Печатење на првиот ред од линиите под заглавјето

69
13 System.out.print("----");
14 for (int i = 2; i <= size + 1; i++) {
15 System.out.print("----");
16 }
17 System.out.println();
18 // Генерирање на табелата за множење
19 for (int i = 2; i <= size + 1; i++) {
20 System.out.printf("%2d|", i); // Печатење на левата
21 страна од редицата
22 for (int j = 2; j <= size + 1; j++) {
23 System.out.printf("%4d", i * j); // Печатење на
24 вредностите за множење
25 }
26 System.out.println(); // Нов ред за следната редица
27 }
28 }
29 }

17. Напишете Java програма што го менува редоследот на знаците во влезот на низата
од тастатурата и прикажете ги на екранот.
Одговор:

1 import java.util.Scanner;
2
3 public class ReverseString {
4 public static void main(String[] args) {
5 Scanner scanner = new Scanner(System.in);
6
7 System.out.print("Внесете ја низата: ");
8 String input = scanner.nextLine();
9 // Преобразување на низата во знакови (char array)
10 char[] characters = input.toCharArray();
11

70
12 // Менување на редоследот на знаците во низата
13 reverseString(characters);
14
15 // Печатење на резултатот
16 System.out.println("Низата по менувањето на редоследот: " +
17 new String(characters));
18 }
19
20 // Метод за менување на редоследот на знаците во низата
21 private static void reverseString(char[] s) {
22 int left = 0;
23 int right = s.length - 1;

18. Напишете Java програма што ја наоѓа вредноста на f (x, n), каде x може да биде
каква било вистинска вредност, n може да биде само негативен цел број и f (x, n) се
дефинира како:

Одговор:

1 public class FunctionCalculator {


2 public static void main(String[] args) {
3 double x = 2.5; // Пример вредност за x
4 int n = -3; // Пример вредност за n
5
6 double result = calculateFunction(x, n);
7 System.out.println("f(x, n) = " + result);
8 }
9
10 // Метод за пресметка на функцијата f(x, n)
11 private static double calculateFunction(double x, int n) {
12 // Базен случај: ако n е 0, врати 1
13 if (n == 0) {
14 return 1;
15 }
16 // Рекурзивно повикување на функцијата за n+1 и му множи x
17 return calculateFunction(x, n + 1) * x;
18 }
19 }

19. Напишете Java програма што пресметува и покажува збир од сите цели броеви од 0
до n, каде n е наведено од корисникот преку тастатура. Да претпоставиме дека n е
цел број поголем од 0.
Одговор:

71
1 import java.util.Scanner;
2
3 public class SumCalculator {
4 public static void main(String[] args) {
5 Scanner scanner = new Scanner(System.in);
6
7 // Читање на влезот од корисникот
8 System.out.print("Внесете цел број n: ");
9 int n = scanner.nextInt();
10
11 // Пресметување на збирот од 0 до n
12 int sum = calculateSum(n);
13 // Прикажување на збирот
14 System.out.println("Збирот на сите цели броеви од 0 до " + n
15 + " е: " + sum);
16 }

20. Имагинарна услуга за електронска пошта наречена „veryhotmail.com“ е доволно


љубезен за да им дозволи на своите корисници да изберат свои лозинки. Сепак,
важечката лозинка мора да биде во согласност со следново (донекаде чудни)
правила:
● Должината мора да биде од 6 до 15 карактери, вклучително.
● Секој карактер мора да биде или еден од 26-те англиски букви. И големи и
мали букви се дозволени.
● Разликата помеѓу бројот на големи букви букви и малите букви не можат да
бидат поголеми од 20% од должината на лозинката.

Напишете код што може да ја потврди лозинката зачувана во референца String.

Одговор:

72
1
2 public class PasswordValidator {
3 public static void main(String[] args) {
4 String password = "MyPassw0rd"; // Пример на лозинка за
5 проверка
6
7 if (isValidPassword(password)) {
8 System.out.println("Лозинката е валидна.");
9 } else {
10 System.out.println("Лозинката не е валидна.");
11 }
12 }
13
14 // Метод за проверка на валидноста на лозинката
15 private static boolean isValidPassword(String password) {
16 // Проверка за должината на лозинката
17 if (password.length() < 6 || password.length() > 15) {
18 return false;
19 }
20 int upperCaseCount = 0;
21 int lowerCaseCount = 0;
22 // Пребарување на големи и мали букви и броење на нивниот
23 број
24 for (char ch : password.toCharArray()) {
25 if (Character.isUpperCase(ch)) {
26 upperCaseCount++;
27 } else if (Character.isLowerCase(ch)) {
28 lowerCaseCount++;
29 }
30 }
31 // Проверка за разликата помеѓу бројот на големи и мали букви
32 double difference = Math.abs(upperCaseCount -
33 lowerCaseCount);
34 double maxLength = Math.max(upperCaseCount, lowerCaseCount);
35 if (difference > 0.2 * maxLength) {
36 return false;
37 }
38 // Лозинката е валидна
39 return true;
40 }
41 }
42

21. Напишете Java програма за да ја покажете вредноста на a0, a1, …, an што одговара
на односот на повторувањето ak = k2ak-1-ak-2+3k каде k = 2, 3, 4 ,… Вредностите
на n и почетните услови (a0 и a1) корисникот ги специфицира преку тастатура.

73
Одговор:

1
2 import java.util.Scanner;
3
4 public class SeriesCalculator {
5 public static void main(String[] args) {
6 Scanner scanner = new Scanner(System.in);
7
8 // Читање на влезните податоци од корисникот
9 System.out.print("Внесете го бројот на членови на серијата (n): ");
10 int n = scanner.nextInt();
11
12 System.out.print("Внесете го првиот член на серијата (a0): ");
13 int a0 = scanner.nextInt();
14
15 System.out.print("Внесете го вториот член на серијата (a1): ");
16 int a1 = scanner.nextInt();
17
18 // Пресметување и прикажување на вредностите на членовите на
19 серијата
20 calculateSeries(n, a0, a1);
21 }
22
23 // Метод за пресметување на вредностите на членовите на серијата
24 private static void calculateSeries(int n, int a0, int a1) {
25 int akMinus2 = a0; // a(k-2)
26 int akMinus1 = a1; // a(k-1)
27 System.out.println("Вредности на членовите на серијата:");
28 // Пресметување и печатење на вредностите на членовите на серијата
29 for (int k = 2; k <= n; k++) {
30 int ak = k * k * akMinus1 - akMinus2 + 3 * k;
31 System.out.println("a" + k + " = " + ak);
32 // Ажурирање на променливите за следната итерација
33 akMinus2 = akMinus1;
34 akMinus1 = ak;
35 }
36 }
37 }
38

22. Напишете Java програма за да пронајдете број на решенија за равенка x + y + z = 30


каде x, y и z не се негативни цели броеви.

74
Одговор:

1 public class EquationSolver {


2 public static void main(String[] args) {
3 int targetSum = 30; // Целта за сумата
4
5 int solutions = findSolutions(targetSum);
6 System.out.println("Број на решенија за равенката x + y + z
7 = 30: " + solutions);
8 }
9
10 // Метод за пронаоѓање на решенијата за равенката
11 private static int findSolutions(int targetSum) {
12 int solutions = 0;
13 // Проверка за секоја можна комбинација на x, y и z
14 for (int x = 0; x <= targetSum; x++) {
15 for (int y = 0; y <= targetSum; y++) {
16 int z = targetSum - x - y;
17 // Проверка дали z е ненегативен
18 if (z >= 0) {
19 solutions++;
20 }
21 }
22 }
23 return solutions;
24 }
25 }

23. Напишете Java програма за да пронајдете број на решенија за равенка x + y + z = n


каде n е постојан цел број обезбеден од корисникот на програмата и x, y и z се цели
броеви помеѓу - b и b. Исто така, b е цел број дефиниран од корисникот.

75
Одговор:

1 import java.util.Scanner;
2
3 public class EquationSolver {
4 public static void main(String[] args) {
5 Scanner scanner = new Scanner(System.in);
6
7 // Читање на влезните податоци од корисникот
8 System.out.print("Внесете го бројот n: ");
9 int n = scanner.nextInt();
10
11 System.out.print("Внесете го бројот b: ");
12 int b = scanner.nextInt();
13
14 int solutions = findSolutions(n, b);
15 System.out.println("Број на решенија за равенката x + y + z
16 = " + n + " е: " + solutions);
17 }
18
19 // Метод за пронаоѓање на решенијата за равенката
20 private static int findSolutions(int n, int b) {
21 int solutions = 0;
22 // Проверка за секоја можна комбинација на x, y и z
23 for (int x = -b; x <= b; x++) {
24 for (int y = -b; y <= b; y++) {
25 int z = n - x - y;
26 // Проверка дали z е во границите [-b, b]
27 if (z >= -b && z <= b) {
28 solutions++;
29 }
30 }
31 }
32 return solutions;
33 }
34 }

24. Напишете Java програма што прима англиска реченица од тастатура. Програмата ја
кодира реченицата со пресврт на редослед на букви во секој збор што се појавува во
таа реченица додека водење на оригиналниот редослед на зборови и го покажува
резултатот екран. Под претпоставка дека зборовите се секогаш одделени со еден
единствен простор и не може да има празни места на почетокот и на крајот на
реченицата. На пример, “We are the champions.” Е кодирани како “eW era eht
.snoipmahc”.

76
Одговор:

1 import java.util.Scanner;
2
3 public class SentenceEncoder {
4 public static void main(String[] args) {
5 Scanner scanner = new Scanner(System.in);
6
7 // Читање на реченицата од корисникот
8 System.out.print("Внесете ја реченицата: ");
9 String sentence = scanner.nextLine();
10
11 // Примена на кодирањето
12 String encodedSentence = encodeSentence(sentence);
13
14 // Прикажување на резултатот
15 System.out.println("Кодираната реченица: " +
16 encodedSentence);
17 }
18
19 // Метод за кодирање на реченицата
20 private static String encodeSentence(String sentence) {
21 // Разделување на реченицата на зборови
22 String[] words = sentence.split(" ");
23
24 // Изградба на кодираната реченица
25 StringBuilder encodedSentence = new StringBuilder();
26 for (String word : words) {
27 // Пресвртување на редоследот на буквите во зборот
28 String reversedWord = reverseString(word);
29 encodedSentence.append(reversedWord).append(" ");
30 }
31 // Избришување на последниот празен простор
32 encodedSentence.deleteCharAt(encodedSentence.length() - 1);
33
34 return encodedSentence.toString();
35 }
36 // Метод за пресвртување на редоследот на буквите во збор
37 private static String reverseString(String word) {
38 // Претворање на зборот во низа од знаци
39 char[] characters = word.toCharArray();
40
41 // Пресвртување на редоследот на буквите
42 for (int i = 0; i < characters.length / 2; i++) {
43 char temp = characters[i];
44 characters[i] = characters[characters.length - 1 - i];
45 characters[characters.length - 1 - i] = temp;

77
46 }
47 // Враќање на пресвртениот збор како низа
48 return new String(characters);
49 }
50 }
51

25. Напишете сегмент со кодови што заменува кој било број на множители празни
места поврзани заедно во String референца s со единечни простори.
На пример, ако s содржи:
“This does not contain multiple spaces.”,
треба да се смени во:
“This does not contain multiple spaces.”

Одговор:

1 s = s.replaceAll("\\s+", " ");

26. Цел број n е главен ако неговите единствени фактори се 1 и самото. Напиши код за
проверка дали е вредноста на int n е главен. Да претпоставиме дека n е позитивен
цел број поголем од 1.
Одговор:

1
public class PrimeChecker {
2
public static void main(String[] args) {
3
int n = 17; // Пример за проверка
4
5
if (isPrime(n)) {
6
System.out.println(n + " е главен број.");
7
} else {
8
System.out.println(n + " не е главен број.");
9
}
10
}
11
// Метод за проверка дали бројот е главен
12
private static boolean isPrime(int n) {
13
// Проверка дали n е делив со било кој број од 2 до sqrt(n)
14
for (int i = 2; i <= Math.sqrt(n); i++) {
15
if (n % i == 0) {
16
return false; // Не е прост број
17
}
18
}
19
return true; // Е прост број
20
}
21
}
22

78
27. Кој е излезот кога е извршен во main() ?

1 public static void main(String[] args)


2 {
3 System.out.println(g("A"));
4 }
5 public static String f(){
6 System.out.println("A");
7 return "A";
8 }
9 public static String g(String s){
10 return f()+s;
11 }

Одговор :
A
AA
Објаснете зошто не може да се компајлира следниот сегмент на кодови успешно.

1 public static void main(String[] args)


2 {
3 int i = f(2,3);
4 }
5 public static int f(int a, int b){
6 return Math.pow(a,b)+Math.pow(b,a);
7 }

Одговор : Програмата во Java која ќе се изврши со овој код ќе фрли грешка. Проблемот
е во типот на враќање на методот f(). Math.pow() методот враќа резултат од тип double,
а методот f() е деклариран да врати цел број (int). Ова ќе предизвика грешка во Java.

За да го поправите проблемот, може да го промените типот на враќање на методот f()


на double, како и типот на променливата i во методот main да биде double. Овде е
исправениот код:

1 public static void main(String[] args) {

79
2 double i = f(2, 3);
3}
4
5 public static double f(int a, int b) {
6 return Math.pow(a, b) + Math.pow(b, a);
7}

28. Дали следната програма може успешно да се компајлира? Ако така, што ќе се прикаже
на излезот од програмата?

1 public class Ex8_5 {


2 public static void main(String[] args) {
3 f(5);
4 System.out.println("k=" + k);
5 }
6
7 public static void f(int n) {
8 int k = 0;
9 for (int i = 0; i < n - 1; i++) {
10 k += k * i;
11 }
12 }
13 }

Одговор : Во овој код ќе настане грешка при компајлирањето. Главниот проблем е во


тоа што обидот за печатење на променливата k во методот main() е невозможен поради
тоа што k е локална променлива во методот f(). Таа не е достапна во контекстот на
методот main(), па ќе добиете грешка.

Ако сакате да го испечатите резултатот на k, потребно е тој да биде дефиниран како


глобална променлива во рамките на класата. Еве како би изгледал исправениот код:

1 public class Ex8_5 {


2 static int k = 0;
3
4 public static void main(String[] args) {
5 f(5);
6 System.out.println("k=" + k);
7 }
8

80
9 public static void f(int n) {
10 for (int i = 0; i < n - 1; i++) {
11 k += k * i;
12 }
13 }
14 }

8. Методи
1. Определете го излезот на следниот сегмент на кодови.

1 public static void main(String[] args) {


2 int n = 0;
3 for (int i = 0; i < 5; i++) {
4 n = f(++n);
5 }
6 System.out.println(n);
7 }
8
9 public static int f(int n) {
10 return ++n;
11 }

Одговор : 6

2. Дадена е дефиницијата за a() како следново:

1 public static double a(double d)


2 {
3 return 3*d+1;
4}

Користете а () за да ја пронајдете вредноста на kn за n = 4,каде kn = 3kn-1 + 1 и k0 = 0;

81
Одговор :

1 public static void main(String[] args) {


2 int n = 4; // Дадена вредност за n
3 double k0 = 0; // k0 = 0
4
5 double result = findK(n, k0);
6 System.out.println("k" + n + " = " + result);
7 }
8
9 public static double findK(int n, double k) {
10 if (n == 0) {
11 return k; // Ако n = 0, врати к
12 } else {
13 // Пресметај k_n-1 рекурзивно
14 double previousK = findK(n - 1, k);
15 // Користи го методот a() за да го пресметаш k_n
16 return a(previousK);
17 }
18 }
19
20 public static double a(double d) {
21 return 3 * d + 1; // Дефиниција на методот a()
22 }

3. Напишете метод наречен cube() што го враќа својот double параметар подигната на
третата моќ.

82
Одговор:

1 public class Main {


2 public static void main(String[] args) {
3 double number = 5.0;
4 double result = cube(number);
5 System.out.println("Кубот на " + number + " е: " + result);
6 }
7
8 public static double cube(double num) {
9 return Math.pow(num, 3);
10 }
11 }

4. Напишете метод наречен blankLine () што се користи за вметнување празна линија до


порака. Затоа, "Прва линија \ nВтора линија"+ blankLine () +"Третa линија. " ќе се
појави како:
Прва линија
Втор линија
Трета линија.

Oдговор :

1 public class Main {


2 public static void main(String[] args) {
3 String message = "Прва линија\nВтора линија" + blankLine() +
4 "Трета линија.";
5 System.out.println(message);
6 }
7 public static String blankLine() {
8 return "\n ";
9 }
10 }

5. Напишете метод наречен readDigitString () што враќа нов String чија секвенца на
карактери се состоеше од влез обезбеден од корисникот преку тастатура ако влезот е
валидна цифра string од која било должина. Инаку, методот се враќа нула. На методот
зема String како свој влезен параметар. Методот го поттикнува корисникот за
внесување тастатура со прикажување на порака во тој string.
Одговор:

1 import java.util.Scanner;
2

83
3 public class Main {
4 public static void main(String[] args) {
5 Scanner scanner = new Scanner(System.in);
6 System.out.println("Внесете го вашиот влез: ");
7 String input = scanner.nextLine();
8
9 String result = readDigitString(input);
10 if (result != null) {
11 System.out.println("Влезот е валиден: " + result);
12 } else {
13 System.out.println("Влезот не е валиден.");
14 }
15 }
16 public static String readDigitString(String input) {
17 if (input.matches("\\d+")) { // Проверка дали влезот е составен
18 само од цифри
19 return input;
20 } else {
21 return null; // Влезот не е валиден
22 }
23 }
24 }

6. Даночните стапки во одредена земја може да се пресметаат од приходот на поединецот


(во Г.) добиен во текот на изминатата даночна година според следната табела.

Приход на поединец(G.) Данок(%)


1-100,000 0
100,001-500,000 10
500,001-1,000,000 20
1,000,001-4,000,000 30
Над 4,000,000 37

Според табелата, ако приходот на една личност е 550.000 Г., таму нема данок за
првите 100.000 Г., 10% од приходот во опсегот 100.001-500.000, што е еднакво на
40.000 Г., Последниот 50 000 Г. се оданочува со стапка од 20% што резултира 10 000 Г.
Затоа, вкупниот данок за ова лице е 60.000 Г.

Напишете метод наречен tax() кој го враќа износот на данокот поврзани со


испорачаниот приход како единствен влез во метод. Да претпоставиме дека во ниту
една нема децимални точки приходи.

84
Одговор:

1 public class Main {


2 public static void main(String[] args) {
3 int income = 550000; // Пример за приход од 550,000 Г.
4 int taxAmount = tax(income);
5 System.out.println("Данокот за приходот од " + income + " Г. е:
6 " + taxAmount + " Г.");
7 }
8
9 public static int tax(int income) {
10 int taxAmount = 0;
11
12 if (income <= 100000) {
13 // Нема данок за приход до 100,000 Г.
14 taxAmount = 0;
15 } else if (income <= 500000) {
16 // 10% данок за приход меѓу 100,001 и 500,000 Г.
17 taxAmount = (income - 100000) * 10 / 100;
18 } else if (income <= 1000000) {
19 // 10% данок за првите 500,000 Г. и 20% за остатокот до
20 1,000,000 Г.

85
21 taxAmount = (500000 - 100000) * 10 / 100 + (income -
22 500000) * 20 / 100;
23 } else if (income <= 4000000) {
24 // 10% данок за првите 500,000 Г., 20% за остатокот до
25 1,000,000 Г., и 30% за остатокот до 4,000,000 Г.
26 taxAmount = (500000 - 100000) * 10 / 100 + (1000000 -
27 500000) * 20 / 100 + (income - 1000000) * 30 / 100;
28 } else {
29 // 10% данок за првите 500,000 Г., 20% за остатокот до
30 1,000,000 Г., 30% за остатокот до 4,000,000 Г., и 37% за остатокот над
31 4,000,000 Г.
32 taxAmount = (500000 - 100000) * 10 / 100 + (1000000 -
33 500000) * 20 / 100 + (4000000 - 1000000) * 30 / 100 + (income -
34 4000000) * 37 / 100;
35 }
36
37 return taxAmount;
38 }
39 }

7. Напишете метод наречен nBits () кој го пресметува минимумот број на битови (во цел
број) потребни за употреба на бинарен код да претставуваат n различни симболи. n е
влез во методот како сам влезен аргумент.

Одговор:

1 public class Main {


2 public static void main(String[] args) {
3 int n = 5; // Пример за бројот на различни симболи
4 int minBits = nBits(n);
5 System.out.println("Минималниот број на битови потребни за " + n
6 + " различни симболи е: " + minBits);
7 }
8 public static int nBits(int n) {
9 // Пресметување на минималниот број на битови користејќи го
10 формулата: log2(n) + 1
11 return (int) Math.ceil(Math.log(n) / Math.log(2));
12 }}

8.Определете го излезот од следниов код.

86
1 int [] a = new int[10];
2 a[1] = 2;
3 a[a.length-1]=8;
4 for(int i=0;i<a.length;i++){
5 System.out.print(a[i]+"\t");
6 }

Одговор : 0 2 0 0 0 0 0 0 0 8
9. Определете го излезот од следниов код.

1 int [] a = new int[10];


2 for(int i=0;i<a.length-1;i++){
3 a[i] = a[++i]+i;
4 }
5 for(int i=0;i<a.length;i++){
6 System.out.print(a[i]+"\t");
7 }

Одговор : Ништо нема да се испринта на екранот ( ќе остане празно ).

10.Определете го излезот откако ке се изврши main().

1 int [] a = new int[10];


2 for(int i=0;i<a.length-1;i++){
3 a[i] = a[++i]+i;
4 }
5 for(int i=0;i<a.length;i++){
6 System.out.print(a[i]+"\t");
7 }

1 public static void f(int k,int [] b){


2 if (k >= b.length) return;
3 for(int i=k;i<b.length;i++){
4 b[i]=b[b.length-i];
5 }
6 k = 0;
7 }

87
1 public static void showArrayContent(int [] a){
2 for(int i=0;i<a.length;i++)
3 System.out.println(a[i]);
4 }

Одговор :
1
10
14
13
12
14
11.Напиши код кој при внесена низа од тип int враќа збир на сите еленемти од внесената
низа.
Одговор:

1
public class Main {
2
public static void main(String[] args) {
3
int[] array = {1, 2, 3, 4, 5}; // Пример на низа
4
int sum = arraySum(array);
5
System.out.println("Збирот на сите елементи во низата е: " + sum);
6
}
7
public static int arraySum(int[] array) {
8
int sum = 0;
9
for (int i = 0; i < array.length; i++) {
10
sum += array[i];
11
}
12
return sum;
13
}
14
}
15

12.Напиши код кој ја пресметува полиномната функција p(x) при дадени вредности на х.
Функцијата е . Методот е даден како:

88
public static double [] p(double [] x, double [] coeff)
1

Одговор:

1
public class Main {
2
public static void main(String[] args) {
3
int[] array = {1, 2, 3, 4, 5}; // Пример на низа
4
int sum = arraySum(array);
5
System.out.println("Збирот на сите елементи во низата е: " + sum);
6
}
7
public static int arraySum(int[] array) {
8
int sum = 0;
9
for (int i = 0; i < array.length; i++) {
10
sum += array[i];
11
}
12
return sum;
13
}
14
}
15

К-тиот елемент во coeff одговара на . Секој елемент во вратената низа од тип double е
вредност на p(x) оценет на х како вредност на елементот х во истиот индекс.
13.Напиши метод наречен findRep() чиј метод гласи:

public static int findRep(int [] a, int target, int nRep)


1

Одговор:

1 public class Main {


2 public static void main(String[] args) {
3 int[] array = {1, 2, 3, 4, 5, 2, 6, 2}; // Пример на низа
4 int target = 2; // Цел на пребарувањето
5 int nRep = 2; // Број на повторувања
6 int result = findRep(array, target, nRep);
7 // Испечати резултатот
8 System.out.println("Бројот " + target + " се појавува " + nRep + "
9 пати: " + result);

89
10 }
11 public static int findRep(int[] array, int target, int nRep) {
12 int count = 0;
13 for (int i = 0; i < array.length; i++) {
14 if (array[i] == target) {
15 count++;
16 if (count == nRep) {
17 return i; // Врати го индексот на последното
18 појавување на target
19 }
20 }
21 }
22 return -1; // Ако не е пронајден target со nRep повторувања, врати
23 -1
24 }
25 }

Методот наоѓа дали а содржи nRep последователни елементи чии вредности се еднакви
на target или не. Ако е така, ја враќа позицијата на првиот елемент чија вредност е еднаква
на target. Во спротивно враќа -1. На пример ако а содржи 6,8,9,9,9,3,9,2,0, findRep(a,9,2) и
findRep(a,9,2) враќа 2, додека findRep(a,9,4) и findRep(a,10,1) враќа -1.

1
public class Main {
2
public static void main(String[] args) {
3
int[] array = {4, 2, 7, 1, 9, 5};
4
// Сортирање во растечки редослед
5
sortArray(array, true);
6
System.out.println("Низата во растечки редослед: " +
7
Arrays.toString(array));
8
// Сортирање во опаѓачки редослед
9
sortArray(array, false);
10
System.out.println("Низата во опаѓачки редослед: " +
11
Arrays.toString(array));
12
}
13
public static void sortArray(int[] array, boolean ascending) {
14
int temp;
15
for (int i = 0; i < array.length; i++) {
16
for (int j = i + 1; j < array.length; j++) {
17
if (ascending ? array[i] > array[j] : array[i] < array[j])
18
{
19
temp = array[i];
20
array[i] = array[j];
21
array[j] = temp;
22
}
23
}
24
}
25
}}
26

90
14.Напишете метод кој подредува влезна int низа(т.е. елементите на влезната низа ги
подредува и не користи друга низа.). Мора да има друг параметар кој одредува дали низата
ке се сортира растечки или опаѓачки.

Одговор:

1 public class Main {


2 public static void main(String[] args) {
3 int[] array = {4, 2, 7, 1, 9, 5};
4
5 // Сортирање во растечки редослед
6 sortArray(array, true);
7 System.out.println("Низата во растечки редослед: " +
8 Arrays.toString(array));
9
10 // Сортирање во опаѓачки редослед
11 sortArray(array, false);
12 System.out.println("Низата во опаѓачки редослед: " +
13 Arrays.toString(array));
14 }
15
16 public static void sortArray(int[] array, boolean ascending) {
17 int n = array.length;
18 int temp;
19 for (int i = 0; i < n - 1; i++) {
20 for (int j = 0; j < n - i - 1; j++) {
21 if (ascending ? array[j] > array[j + 1] : array[j] <
22 array[j + 1]) {
23 temp = array[j];
24 array[j] = array[j + 1];
25 array[j + 1] = temp;
26 }
27 }}}}

15. Секој метод во овој проблем добива 2 низи од int како влезни параметри.
а. Напиши combine() која вракја нова низа чии елементи се земени од двете влезни
низи и редоследот се зема оделементите од првата низа проследена со оние од втората.
б. Напиши union() која враќа нова низа чии елементи се единствени земени од двете
низи. Елементите на излезната низа треба да бидат подредени по големина растечки.

91
г. Напиши intersect() која враќа новаа низа каде секој елемент во низата мора да
биде единствен и да се појавува во двете влезни низи. Елементите на излезната низа треба
да се подредуваат по големина растечки.
д. Напиши subtract() која враќа нова низа чии елементи се единствени и се
појавуваат во првата влезна низа но не и во втората. Елементите на излезната низа треба да
се подредат по големина растечки.
ѓ. Напиши xor() која враќа нова низа чии елементи се единственни и се појавуваат
во било која од влените низи но не и во двете истовремено. Елементите треба да се
подредат по големина растечки.
Одговор:

1 import java.util.Arrays;
2 public class ArrayOperations {
3 public static void main(String[] args) {
4 int[] array1 = {1, 3, 5, 7, 9};
5 int[] array2 = {2, 4, 6, 8, 10};
6
7 // а. Комбинирање на низи
8 int[] combinedArray = combine(array1, array2);
9 System.out.println("Комбинираната низа: " +
10 Arrays.toString(combinedArray));
11
12 // б. Обединување на низи
13 int[] unionArray = union(array1, array2);
14 System.out.println("Обединетата низа: " +
15 Arrays.toString(unionArray));
16
17 // г. Пресек на низи
18 int[] intersectArray = intersect(array1, array2);
19 System.out.println("Пресечната низа: " +
20 Arrays.toString(intersectArray));
21 // д. Разлика на низи
22 int[] subtractArray = subtract(array1, array2);
23 System.out.println("Разликата на низите: " +
24 Arrays.toString(subtractArray));
25 // ѓ. Ексклузивна сума на низи
26 int[] xorArray = xor(array1, array2);
27 System.out.println("Ексклузивната сума на низите: " +
28 Arrays.toString(xorArray));
29 }
30 // а. Комбинирање на низи
31 public static int[] combine(int[] array1, int[] array2) {
32 int[] combinedArray = new int[array1.length + array2.length];
33 System.arraycopy(array1, 0, combinedArray, 0, array1.length);
34 System.arraycopy(array2, 0, combinedArray, array1.length,
35 array2.length);
36 return combinedArray;
37 }

92
38 // б. Обединување на низи
39 public static int[] union(int[] array1, int[] array2) {
40 int[] combinedArray = combine(array1, array2);
41 Arrays.sort(combinedArray);
42 return combinedArray;
43 }
44 // г. Пресек на низи
45 public static int[] intersect(int[] array1, int[] array2) {
46 int[] tempArray = new int[Math.min(array1.length, array2.length)];
47 int index = 0;
48 for (int value : array1) {
49 if (contains(array2, value) && !contains(tempArray, value)) {
50 tempArray[index++] = value;
51 }
52 }
53 return Arrays.copyOf(tempArray, index);
54 }
55 // д. Разлика на низи
56 public static int[] subtract(int[] array1, int[] array2) {
57 int[] tempArray = new int[array1.length];
58 int index = 0;
59 for (int value : array1) {
60 if (!contains(array2, value)) {
61 tempArray[index++] = value;
62 }
63 }
64 return Arrays.copyOf(tempArray, index);
65 }
66 // ѓ. Ексклузивна сума на низи
67 public static int[] xor(int[] array1, int[] array2) {
68 int[] tempArray1 = subtract(array1, array2);
69 int[] tempArray2 = subtract(array2, array1);
70 return union(tempArray1, tempArray2);
71 }
72 // Помошна метода за проверка дали низата содржи одреден елемент
73 public static boolean contains(int[] array, int element) {
74 for (int value : array) {
75 if (value == element) {
76 return true;
77 }
78 }
79 return false;
80 }
81 }
82
83
84

16.Да претпоставиме дека две нови низи од int тип се вели дека се еднакви ако имаат
слични должини и секој елемент на двете низи е на иста позиција во днете низи и се

93
еднакви. Напиши метод isEqual() кој враќа true ако неговите две влезни низи се еднакви и
false во спротивно.

Одговор:

1 public class Main {


2 public static void main(String[] args) {
3 int[] array1 = {1, 2, 3, 4, 5};
4 int[] array2 = {1, 2, 3, 4, 5};
5 int[] array3 = {1, 2, 3, 4, 6};
6 System.out.println("Низите array1 и array2 се еднакви: " +
7 isEqual(array1, array2));
8 System.out.println("Низите array1 и array3 се еднакви: " +
9 isEqual(array1, array3));
10 }
11
12 public static boolean isEqual(int[] array1, int[] array2) {
13 if (array1.length != array2.length) {
14 return false;
15 }
16 for (int i = 0; i < array1.length; i++) {
17 if (array1[i] != array2[i]) {
18 return false;
19 }
20 }
21 return true;
22 }}

17. Повторете го претходниот проблем во случај кога позициите немаат занчење, т.е.
двете низи се еднакви ако нивните елементи формираат множества со слични
членови.

94
Одговор:

1 import java.util.Arrays;
2 public class Main {
3 public static void main(String[] args) {
4 int[] array1 = {1, 2, 3, 4, 5};
5 int[] array2 = {5, 4, 3, 2, 1};
6 int[] array3 = {1, 2, 3, 4, 6};
7
8 System.out.println("Низите array1 и array2 се еднакви: " +
9 isEqual(array1, array2));
10 System.out.println("Низите array1 и array3 се еднакви: " +
11 isEqual(array1, array3));
12 }
13 public static boolean isEqual(int[] array1, int[] array2) {
14 if (array1.length != array2.length) {
15 return false;
16 }
17 Arrays.sort(array1);
18 Arrays.sort(array2);
19 return Arrays.equals(array1, array2);
20 }
21 }

9. Низи
1. . Напиши метод кој прима низа од тип String и враќа true ако има барем еден
елемент од велзната низа што го содржи или е еднаков на другиот String излез. Во
спротивно се враќа false.
Одговор:

95
1 public class Main {
2 public static void main(String[] args) {
3 String[] array = {"apple", "banana", "orange", "grape"};
4 String target = "banana";
5
6 System.out.println("Низата содржи елемент што е ист на '" +
7 target + "': " + containsString(array, target));
8 }
9 public static boolean containsString(String[] array, String
10 target) {
11 for (String str : array) {
12 if (str.equals(target)) {
13 return true;
14 }
15 }
16 return false;
17 }}

2. Објасни зошто следниот код немоше да се компајлира.

1 final double RANGE = 200;


2 int step = 12, k=6;
3 int [][] a = new int[(int)(RANGE/step)][k];
4 for(int i=0;i<a.length;i++)
5 a[i] = new int[2][2];

Oдговор : Низата a треба да биде декларирана како int[][] a = new


int[(int)(RANGE/step)][2];, бидејќи секој ред треба да има ист број на колони.
Не може да се асигнира дво-димензионален низ на едно-димензионален низ.
Грешките се:
Декларацијата на низата a: Треба да биде декларирана како int[][] a = new
int[(int)(RANGE/step)][2]; за да има ист број на колони во секој ред.
Асигнирањето на вредноста на a[i]: Не може да се асигнира дво-димензионален низ на
едно-димензионален низ.
3. Што е излезот на следниот код?

String [][][] x = new String[5][6][7];


1
System.out.println(x.length*x[2].length);
2

96
Одговор : 30

4. Еден начин да претставите црно-бела слика е да складирате вредности во


дводемензионална низа, p.p[i][j] е точно ако пикселот во и-тиот ред и ј-та колона е
црн. Слично на тоа ако е неточно пикселот е бел. Напишете метод:

1 public static boolean drawRect(boolean p, int x, int y,


2 int width, int height, int ink)

Одговор:
Ако ink е еднакво на 0 методот црта бел правоаголникк чиј горен лев агол има
локација p[x][y]. Неговата ширина и висина се вредности на ширина и висина
соодветно. Ако ink е еднакво на 1, на тоа место методот црта црн правоаголник. Ако
ink е еднакво на -1, се црта на начин што секој пиксел од правоаголникот нацртани
со методот се префрлаат од црни во бели и од бели во црни.Следната низа покажува
пример од p по извршувањето drawRect(p,2,2,3,4,1) на целосно бела низа чија p
големина е 10x10.

97
Методот враќа true доколку цртежот се изврши успешно. Враќа лажно и не
извршува цртање во една од следниве ситуации:
● Вредноста на ink не е -1, 0, 1.
● Наведениот горен лев агол не е во близина на p, т.е. вредноста на х , y или и двете
не е во опсег на низата.
● Правоаголникот ја надминува близината на p.

1 public static boolean drawRect(boolean[][] p, int x, int y, int width,


2 int height, int ink) {
3 // Проверка на вредноста на ink
4 if (ink != -1 && ink != 0 && ink != 1) {
5 return false;
6 }
7
8 // Проверка дали (x, y) е во границите на низата p
9 if (x < 0 || y < 0 || x >= p.length || y >= p[0].length) {
10 return false;
11 }
12
13 // Проверка дали правоаголникот ја надминува границата на низата p
14 if (x + width > p.length || y + height > p[0].length) {
15 return false;
16 }
17

98
18 // Цртање на бел правоаголник
19 if (ink == 0) {
20 for (int i = x; i < x + width; i++) {
21 for (int j = y; j < y + height; j++) {
22 p[i][j] = false; // Бел пиксел
23 }
24 }
25 }
26 // Цртање на црн правоаголник
27 else if (ink == 1) {
28 for (int i = x; i < x + width; i++) {
29 for (int j = y; j < y + height; j++) {
30 p[i][j] = true; // Црн пиксел
31 }
32 }
33 }
34 // Префрлање на пикселите
35 else if (ink == -1) {
36 for (int i = x; i < x + width; i++) {
37 for (int j = y; j < y + height; j++) {
38 p[i][j] = !p[i][j]; // Префрлање на бојата
39 }
40 }
41 }
42 return true; // Цртањето е успешно извршено}

5. Повторете го претходниот проблем. Меѓутоа овој пат методот треба да се обиде да


го нацрта наведениот правоаголник иако горниот лев агол не е во близина на p или
целиот правоаголник не одговара на p. На пример, ако p и q се со големина 8х8 и
првично сите се 0, drawRect(p,5,5,2,5,1) и drawRect(q,-2,-2,4,4,1) ке резултира со
следниве низи.

Одговор:

99
6. Во програма за резервација на седишта во авиокомпанија , табелата е претставена
со помош на дводимензионална низа. Низата seats[i][j] го содржи името на патникот
кој го резервирал седиштето со број ј во i-тиот ред каде што ј е 0 за седиштето со
број А, ј е 1 за седиштето со број Б итн. Seats[i][j] складира нула ако седиштето е
празно. Имајте предвид дека авионите може да имаат различен број на редови.
Сепак, да претпоставиме дека бројот на места во секој ред на истиот авион е
константа. Напишете методи кои имаат еден од нивните влезни аргументи е низата
seats, за извршување на задачите со приложените променливи. Одлучете за
иминјата, нивните влезни аргументи и нивните повратни вредности соодветно.

a. Се прикажува табела за седење, ознашена со ред и број на седиште,


со користење на ,, . “ за претставување на празно место и ,, Х “ да
претставува резервирано место. Пример за седење може да биде
следниот графикон.

A B C D E F G H I J K L
1 x x x . . . . . . x x x
2 . x x . . . . . . . . .
3 . x x . . . . . . . . .
4 x . . . . . . x x x . .
5 . . . . . . . . . . . .
6 . . . . . . . . . . . .

100
7 . . . . x x x x . . . .
8 . . . . . . . . . . . .
9 . . . . . . . . . . . .
10 . . . . . . . . . . . .
11 . . . . . . . . . . . .
12 . . . . . . . . . . . .

Ако повикувачот на методот не сака да види седење од сите редови,


повикувачот може да го означи опсегот на редовите што сакаат да се
прикажат со број на ред и последниот ред што треба да се прикаже.
b. Додавање име на патник на избрано седиште. Се враќа true ако
операцијата е успешна и false ако избраното седиште не е празно. Со
оглед на тоа што избраното седиште е наведено во форма String во
формата:
“[број на ред]-[број на седиште]“ како “1-А“,“25-Е“ или “36-К“.
Методот исто така проверува дали седиштето е во важечки опсег.
Освен ако не е наведено седиштето припаѓа воопсегот на низата,
методот го прави тоа или враќа false.
c. Преместување патник на одредено седиште.
d. Пребарувањето на седиштето резервирано од патник од
неговото/нејзиното име. Методот ја враќа низата што ја претставува
локацијата на седиштето или нула ако нема патник на даденото име.
Претпоставете дека секој може да заземе само едно седиште во исто
време.
e. Броење на бројот на достапни места во секој ред. Методот враќа низа
од int каде вредноста на и-тиот индекс го содржи бројот на достапни
места во i+1виот ред.

f. Пребарување на достапни n последователни места во истиот ред.


Методот го враќа String што го претставува левото место на
седиштата од достап ните n последователни седишта во првиот ред
што има таква достапност. Ако нема таква достапност, методот враќа
нула.
g. Случајно преместување на патниците во табела за седење. На секој
патник мора да му се додели седипте што не е конфликтно со други
патници. Методот го враќа рандомизирано седење како негов излез
додека влезот за седење останува непроменет.(Овој метод нема да
биде корисно за сите функционално за сите авиокомпании!)

101
Oдговор :
A) Meтод за прикажување на табелата за седење

1 public static void displaySeats(String[][] seats, int startRow, int


2 endRow) {
3 for (int i = startRow - 1; i < endRow; i++) {
4 for (int j = 0; j < seats[i].length; j++) {
5 if (seats[i][j] == null) {
6 System.out.print(". ");
7 } else {
8 System.out.print("X ");
9 }
10 }
11 System.out.println();
12 }}

Б ) Метод за додавање на име на патник за избрано седиште :

1 public static boolean reserveSeat(String[][] seats, String seat) {


2 String[] parts = seat.split("-");
3 int row = Integer.parseInt(parts[0]) - 1;
4 int column = seat.charAt(seat.length() - 1) - 'A';
5
6 if (row >= 0 && row < seats.length && column >= 0 && column <
7 seats[row].length) {
8 if (seats[row][column] == null) {
9 seats[row][column] = "X";
10 return true; // Успешно резервирано седиште
11 } }
12 return false; // Седиштето е веќе резервирано
13 }

11.Решавање рекурзивни проблеми


1. Кој е излезот кога се извршува main()?

1 public static void main(String[] args)


2 {
3 System.out.println(f(5));
4 }

102
5 public static int f(int n){
6 if(n<=0) return 1;
7 return f(n-1)+2*f(n-2);
8 }

Одговор : 33
2. Кој е излезот кога се извршува main()?

1 public static void main(String[] args)


2 {
3 System.out.println(g(4));
4 }
5 public static int g(int n)
6 {
7 if(n<=0) return 1;
8 return 2*g(n-1)+ f(n+1);
9 }
10 public static int f(int n)
11 {
12 if(n<=0) return 1;
13 if(n==1) return 2;
14 return f(n-1)-f(n-2);
15 }

Одговор : 15
3. Спореди го следниов метод користејки рекурзивен пристап.

1 public static int f(int n)


2 {
3 int a = 0;
4 for(int i=1;i<=n;i++){
5 a += 2*i;
6 }
7 return a;
8 }

Одговор:

103
1 public static int f(int n) {
2 if (n == 0) {
3 return 0;
4 } else {
5 return f(n - 1) + 2 * n;
6 }
7}

4. Спореди го следниов метод користејки рекурзивен пристап.

1 public static int f(int n)


2 {
3 int a = 1;
4 int b = 1;
5 for(int i=1;i<=n;i++){
6 a += ++b;
7 b = a;
8 }
9 return a;
10 }

Одговор:

1 public static int f(int n) {


2 if (n <= 1) {
3 return 1;
4 } else {
5 return f(n - 1) + f(n - 2);
6 }
7}

5. Спореди го следниов метод користејки рекурзивен пристап.

1 public static int f(int n)


2 {
3 int a=0,b=1,c=0;
4 if(n==1) return b;
5 for(int i=2;i<=n;i++){
6 a = b+c;
7 c = b;
8 b = a;

104
9}
10 return a;
11 }

Одговор:

1 public static int f(int n) {


2 if (n == 0) {
3 return 0;
4 } else if (n == 1) {
5 return 1;
6 } else {
7 return f(n - 1) + f(n - 2);
8 }
9}

6. Спореди го следниов метод користејки рекурзивен пристап.

1 public static double f(int n)


2 {
3 double a=2.0,b=2.0,c=2.0;
4 if(n==1) return b;
5 for(int i=2;i<=n;i++){
6 a = b+0.5*c+i;
7 c = b;
8 b = a;
9 }
10 return a;
11 }

Одговор:

1 public static double f(int n) {


2 if (n == 1) {
3 return 2.0;
4 } else {
5 double a = f(n - 1) + 0.5 * f(n - 1) + n;
6 return a;

105
7 }
8}

7. Напишете јава метод за пресметување на следнава функција на даден ненегативен


цел број n. Врз основа на вашата имплементација, испишете го бројот на
повикување на метод во функција на n кои се движат од 0 до 10.

Одговор:

1 public class FunctionCalculator {


2 // Метод за пресметување на функцијата за даден цел број n
3 public static int calculateFunction(int n) {
4 if (n == 0) {
5 return 1;
6 } else {
7 return 2 * calculateFunction(n - 1) + 1;
8 }
9 }
10
11 public static void main(String[] args) {
12 for (int i = 0; i <= 10; i++) {
13 int result = calculateFunction(i);
14 System.out.println("За n = " + i + ", функцијата има
15 вредност " + result);
16 }
17 }}

8. Напиши метод за пресметување на следнава функција со дадени не негативни цели


броеви n.

𝑛 𝑛−1
1 1 𝑘
𝑓(𝑛) = { ∑ 𝑘 2
𝑓(− 1) + 2
𝑓(𝑛 − 3) ∑ (𝑓(𝑘) − (− 1) 𝑓(𝑘 − 1))
𝑘=0 𝑘=𝑛−3

; 𝑛 = 0, 1, 2; 3 ≤< 10; ≥ 10
106
Одговор :

1 public class Main {


2 public static void main(String[] args) {
3 int n = 10; // Пример влезен број
4 System.out.println("f(" + n + ") = " +
5 calculateFunction(n));
6 }
7 public static int calculateFunction(int n) {
8 if (n == 0 || n == 1 || n == 2) {
9 return calculateSum(n);
10 } else if (n >= 3 && n < 10) {
11 return calculateSum(n - 3, n - 1);
12 } else {
13 // Останатата имплементација за n >= 10 треба да се
14 додаде овде
15 // Не е јасно дефинирана во претходниот текст
16 return 0; // Заменете го ова со вистинската
17 имплементација
18 }
19 }
20 public static int calculateSum(int start, int end) {
21 int sum = 0;
22 for (int k = start; k <= end; k++) {
23 sum += calculateFunction(k) - ((int) Math.pow(-1, k) *
24 calculateFunction(k - 1));
25 }
26 return sum;
27 }
28 public static int calculateSum(int n) {
29 return n * (n + 1) / 2;
30 }}

107
9. Напишете ракурзивен Java метод кој го пресметува збирот на секој int елемент во
влезна низа од int.
Одговор:

1 public class ArraySumCalculator {


2 // Рекурзивен метод за пресметување на збирот на сите
3 елементи во низата
4 public static int arraySum(int[] arr, int index) {
5 // Базен случај: кога индексот ќе биде надвор од
6 границите на низата
7 if (index >= arr.length) {
8 return 0;
9 }
10 // Рекурзивен повик за пресметување на збирот на
11 преостанатите елементи во низата
12 // и додавање на тековниот елемент на збирот
13 return arr[index] + arraySum(arr, index + 1);
14 }
15 public static void main(String[] args) {
16 int[] array = {1, 2, 3, 4, 5};
17 int sum = arraySum(array, 0);
18 System.out.println("Збирот на сите елементи во низата е:
19 " + sum);}}

10. Напишете ракурзивен Java метод кој ја наоѓа најмалата вредност во влезна низа од
int.
Одговор:

1 public class MinValueFinder {


2 // Рекурзивен метод за наоѓање на најмалата вредност во низата
3 public static int findMin(int[] arr, int index) {
4 // Базен случај: кога индексот ќе биде надвор од границите на
5 низата
6 if (index >= arr.length - 1) {
7 return arr[index];}
8 // Рекурзивен повик за наоѓање на најмалата вредност во
9 преостанатата низа
10 int minRest = findMin(arr, index + 1);
11 // Враќање на помалиот од тековниот елемент и минимумот во
12 преостанатата низа
13 return Math.min(arr[index], minRest);
14 }
15 public static void main(String[] args) {
16 int[] array = {5, 3, 7, 2, 8};
17 int min = findMin(array, 0);

108
18 System.out.println("Најмалата вредност во низата е: " + min);
19 }}

11. Напишете рекурзивен Java метод кој го враќа индексот на најмалата вредност во
влезна низа од int.
Одговор:

1 public class MinIndexFinder {


2 // Рекурзивен метод за наоѓање на индексот на најмалата вредност
3 во низата
4 public static int findMinIndex(int[] arr, int index) {
5 // Базен случај: кога индексот ќе биде надвор од границите
6 на низата
7 if (index >= arr.length - 1) {
8 return index;
9 }
10 // Рекурзивен повик за наоѓање на индексот на најмалата
11 вредност во преостанатите елементи во низата
12 int minIndex = findMinIndex(arr, index + 1);
13 // Проверка дали тековниот елемент е помал од елементот на
14 најмал индекс
15 if (arr[index] < arr[minIndex]) {
16 return index; // Ако е така, врати го тековниот индекс
17 } else {
18 return minIndex; // Врати го индексот на најмалата
19 вредност во преостанатите елементи
20 }
21
22 public static void main(String[] args) {
23 int[] array = {5, 3, 8, 1, 7};
24 int minIndex = findMinIndex(array, 0);
25 System.out.println("Индексот на најмалата вредност во низата
26 е: " + minIndex);
27 }}

12. Математичка константа е основа на природниот логаритам. Се нарекува Ојлеров


број или Напиерова константа. Оваа константа е збир од бесконечна серија
дефинирана подолу.


1 1 1 1 1
𝑒= ∑ 𝑛!
= 0!
+ 1!
+ 2!
+ 3!
+...
𝑛=0

109
Напишете метод за приближна вредност на а e коритејки ја горенаведената
формула, но со конечен број членови. Со друѓи зворови, наместо да рабори до n да
работи до , таа работи до int вредност, N , внесувања на методот. Користете го
рекурзивниот пристап како соодветен. Потоа, напишете java програма за да ги
споредите произлегувањата од приближувањето на N = 5, 10, 15 и 20 со вредноста
на Math.exp(1). Забележете дека 0! Е еднакво на 1. Исто така, можете да го
користите следниов метод да се најде вредноста на n!.

1 public static double factorial(int n)


2 {
3 if(n<=0) return 1;
4 return n*factorial(n-1);
5 }

Одговор :

1 public class Main {


2 public static void main(String[] args) {
3 int[] вредностиНаН = {5, 10, 15, 20};
4 for (int n : вредностиНаН) {
5 double резултат = апроксимирајЕ(n);
6 System.out.println("Апроксимација на е за N = " + n + ":
7 " + резултат);
8 }
9 System.out.println("Вистинската вредност на е користејќи
10 Math.exp(1): " + Math.exp(1));
11 }
12
13 public static double апроксимирајЕ(int N) {
14 return апроксимирајЕСума(N, 0);
15 }
16 public static double апроксимирајЕСума(int N, int n) {
17 if (n > N) {
18 return 0;
19 }
20 return 1.0 / факториел(n) + апроксимирајЕСума(N, n + 1);
21 }
22 public static int факториел(int n) {
23 if (n == 0) {

110
24 return 1;
25 }
26 int резултат = 1;
27 for (int i = 1; i <= n; i++) {
28 резултат *= i;
29 }
30 return резултат;
31 }
32 }

13. Напишете рекурзивен метод наречен printInt() кој прима int вредност како негов
влез и ги печати поврзаните цифри на екранот, една цифра на секоја линија,
почнувајки од лево. Не ти е дозволено да се конвертира влезната int вредност во
String. Да претпоставиме дека влезната вредност е секогаш позитивна. Исто така
нацртајте слика која го прикажува методните повикувања кои се случиле кога
printlnt(1942) е повикана.

Одговор :

1
public class Main {
2
public static void main(String[] args) {
3
int number = 1942;
4
printInt(number);
5
}
6
7
public static void printInt(int n) {
8
if (n < 10) {
9
System.out.println(n);
10
} else {
11
printInt(n / 10); // Рекурзивно повикување за да го
12
испечатиме делот од цифрите без најмалата
13
System.out.println(n % 10); // Печатење на најмалата цифра
14
}}}
15

14. Најголем заеднички делител на два цели броеви е најголемиот број кој ги дели и
двата броја. На пример НЗД од 74 и 111 е 37.

111
А. Напишете метод кој го наоѓа нзд од два влеза цели броеви користејки
интеретивен пристап.
Б. Повторете ја точката а користејки рекурзувен пристап заснован на :
gcd 𝑔𝑐𝑑 ( 𝑎, 𝑏) = {𝑏 gcd 𝑔𝑐𝑑 ( 𝑏, 𝑎%𝑏)
𝑖𝑓𝑎%𝑏 = 0𝑜𝑡ℎ𝑒𝑟𝑤𝑖𝑠𝑒

Oдговор :

1
public class Main {
2
public static void main(String[] args) {
3
int a = 74;
4
int b = 111;
5
int gcd = findGCDIterative(a, b);
6
System.out.println("НЗД на " + a + " и " + b + " е " + gcd);
7
}
8
9
public static int findGCDIterative(int a, int b) {
10
while (b != 0) {
11
int temp = b;
12
b = a % b;
13
a = temp;
14
}
15
return a;
16
} }
17

15. Палиндром е збор, фраза, број или друга од единици(како влакно на ДНК) што има
својство на читајки го истото во која било насока каде што интерпункциските занци
се игнорираат. На пример, “civic” “level”, “Was it a cat I saw?”, и “A man, a plan, a
canal: Panama” се полиндроми.
Напишете рекурзивен јава метод кој враќа true ако стрингот предаден на методот е
палиндром. Во спротивно, се враќа false .

Одговор :

1 public class Main {


2 public static void main(String[] args) {
3 String str1 = "civic";
4 String str2 = "level";
5 String str3 = "Was it a cat I saw?";
6 String str4 = "A man, a plan, a canal: Panama";
7 System.out.println(isPalindrome(str1)); // true

112
8 System.out.println(isPalindrome(str2)); // true
9 System.out.println(isPalindrome(str3)); // true
10 System.out.println(isPalindrome(str4)); // true
11 }
12 public static boolean isPalindrome(String str) {
13 // Игнорирање на интерпункциските знаци и превртеност на
14 стрингот
15 String cleanStr = str.replaceAll("[^a-zA-Z0-9]",
16 "").toLowerCase();
17 return isPalindromeHelper(cleanStr);
18 }
19 private static boolean isPalindromeHelper(String str) {
20 if (str.length() <= 1) {
21 return true;
22 } else if (str.charAt(0) == str.charAt(str.length() - 1)) {
23 // Ако првиот и последниот знак се исти, рекурзивно
24 проверувајте ги останатите подстрингови
25 return isPalindromeHelper(str.substring(1, str.length()
26 - 1));
27 } else {
28 return false;
29 }}}
30

11. Креирање класи.


1. Објасни ги следните зборови:
a. Класа
b. Објект
c. Атрибут
d. Однесување
e. Инстанца променлива
f. Конструктор
g. Пристапен метод
h. Метод на мутатор
Одговор :

113
a. Класа: Во програмирањето, класата е шаблон или модел од кој може да се креираат
објекти. Таа дефинира состојба и поведение за објектите кои се креирани од неа. Класата
опишува атрибути (податоци) и методи (функции) кои ги дефинираат објектите што
припаѓаат на неа.
b. Објект: Објектот е конкретна инстанца на класа. Тоа е конкретен примерок од класата,
кој има состојба (атрибути) и поведение (методи) дефинирани од класата. Објектите се
користат за работа со податоците и извршување на операции дефинирани од класата.
c. Атрибут: Атрибутот е променлива дефинирана во класа која го чува состојбата на
објектите создадени од таа класа. Атрибутите се користат за опишување на состојбата на
објектите и за чување на различни податоци.
d. Однесување: Однесувањето на еден објект се однесува на неговото поведение или
начинот на кој објектот реагира на различни акции или операции. Однесувањето е
дефинирано преку методите кои се имплементирани во класата и може да вклучува
различни активности и операции кои објектот може да ги изврши.
e. Инстанца променлива: Инстанцата променлива е променлива која е дефинирана во
објект од класата. Тоа значи дека секој објект има своја копија на променливата, независно
од другите објекти креирани од истата класа. Инстанцата променлива чува информации за
состојбата на секој поединечен објект.
f. Конструктор: Конструкторот е посебен метод во класата кој се користи за
иницијализација на нови објекти. Кога се креира нов објект од класата, конструкторот
автоматски се повикува за да се иницијализираат атрибутите на објектот. Конструкторите
можат да прифаќаат параметри за иницијализација на објектите или да бидат без
параметри, во зависност од потребите на програмата.
g. Пристапен метод: Пристапниот метод е метод во класата кој овозможува пристап до
приватните атрибути или методи на објектите создадени од класата. Тие се користат за
читање или поставување на вредностите на приватните атрибути, како и за извршување на
одредени операции или функционалности дефинирани во класата.

h. Метод на мутатор: Методот на мутатор е специјален тип на метод во класата кој се


користи за поставување на вредностите на атрибутите на објектот. Овие методи се
користат за поставување на в
2. Идентификувајте членови на податоци и методи од следната класа.

1 public class Ex11_2{


2 public double d;
3 public Color k;
4 public void makeItem(){
5 }
6 public String describe(){

114
7 return “Ex11_2:”+d+”,”+k;
8}
9}

Одговор :
Членовите на податоци (атрибути) во класата Ex11_2 се:
d - приватен член од тип double.
k - приватен член од тип Color.
Методите во класата Ex11_2 се:
makeItem() - јавен метод кој не враќа ништо (void). Овој метод не прифаќа никакви
аргументи и се користи за создавање на предмет.
describe() - јавен метод кој враќа String. Овој метод не прифаќа никакви аргументи и се
користи за враќање на текстуална репрезентација на објектот од тип Ex11_2, која вклучува
вредностите на атрибутите d и k.

3. Дали со следните прикажани податоци може успешно да се состави класа? Доколку


не, објасни зошто тоа не е возможно.

1 public class Ex11_3{


2 public d;
3 public k;
4 }

Oдговор : Не е можно успешно да се состави класа со прикажаните податоци. Проблемот


е во тоа што не се наведени типовите на променливите d и k. Во Java, секоја променлива
мора да има дефиниран тип. Променливите d и k треба да бидат декларирани со нивните
одговарајуќи типови, како што се int, double, String, или друг тип податоци. Недостатокот
на дефиниција на типови предизвикува грешка во компајлација.

1 public class Ex11_3 {


2 public int d;
3 public String k;
4}

4. Објаснете ја разликата помеѓу статични и нестстични членови.

115
Oдговор :
Статични членови:
● Статичните членови се споделуваат помеѓу сите инстанци на класата. Тие се
пристапуваат преку името на класата, а не преку инстанцата на објектот.
● Овие членови се креираат на ниво на класата и постојат само една копија од нив во
меморијата.
● Статичните членови се иницијализираат при вчитување на класата и може да бидат
пристапени и користени без креирање на инстанца од класата.
Нестатични (инстанчни) членови:
● Нестатичните членови се поврзани со инстанците (објектите) на класата. Секоја
инстанца од класата има своја копија од нестатичните членови.
● За пристапување до нестатичните членови потребно е да се креира инстанца од
класата.
● Овие членови се креираат кога се креираат инстанците од класата и постојат
посебни копии од нив за секоја инстанца.

5. Објаснете ја разликата помеѓу статични и нестстични методи.

Одговор :

Статични методи:

Статичните методи припаѓаат на класата, а не на инстанците од неа. Тие се


дефинираат како static и може да се повикуваат директно преку името на класата,
без потреба од креирање на објект (инстанца).
Овие методи не може да пристапуваат до нестатични (инстанчни) променливи или
методи, бидејќи не се поврзани со инстанците на класата.
Статичните методи често се користат за општи операции кои не зависат од
состојбата на поединечните инстанци на класата.

Нестатични (инстанчни) методи:

Нестатичните методи припаѓаат на инстанците на класата и се поврзани со нив. Тие


се дефинираат без static ключната зборот и може да се повикуваат само преку
инстанцата на класата.
Овие методи имаат пристап до нестатичните (инстанчни) променливи и методи на
класата.

116
Нестатичните методи се користат за операции кои зависат од состојбата на
конкретните инстанци од класата.

6. Кои се вредностите на a,b,c,x на примерот А и инстанцата В откако ке се изврши


следнава програма?

1 public class Ex11_6Test


2 {
3 public static void main(String[] args)
4 {
5 Ex11_6 instanceA = new Ex11_6();
6 Ex11_6 instanceB = new Ex11_6();
7 instanceA.a = 8;
8 instanceB.b = instanceA.x;
9 instanceA.x++;
10 instanceB.a = 10;
11 instanceB.c = 90;
12 instanceB.x++;
13 }
14 }

Одговор :
● instanceA.a = 8
● instanceA.b = 0
● instanceA.c = 0
● instanceA.x = 1
● instanceB.a = 10
● instanceB.b = 0
● instanceB.c = 90
● instanceB.x = 1

7. Изменете ја класата MyIntArrayUtil за да содржи друг ststic метод кој зема влезна
низа од int и ја подредува со зголемувачки редослед. Потоа напишете java програма
која ги извршува следниве чекори:
a. Создадете низа од десет int вредности, каде што секоја вредност по
случаен избор од 1 до 100 се избира.
b. Прикажи ги елементите на низата на екранот.
c. Сортирајте ги елементите на низата по зголемување.
d. Повторно прикажете ги елементите на низата на екран.

117
1 import java.util.Arrays;
2
3 public class MyIntArrayUtil {
4
5 public static void sortAscending(int[] array) {
6 Arrays.sort(array);
7 }
8
9 public static void printArray(int[] array) {
10 for (int num : array) {
11 System.out.print(num + " ");
12 }
13 System.out.println();
14 }
15 }

Одговор:

1 import java.util.Random;
2
3 public class Main {
4 public static void main(String[] args) {

118
5 // Создадете низа од десет случајни цели броеви од 1 до 100
6 int[] array = generateRandomArray(10, 1, 100);
7
8 // Прикажи ги елементите на низата на екранот
9 System.out.println("Несортирана низа:");
10 MyIntArrayUtil.printArray(array);
11
12 // Сортирајте ги елементите на низата по зголемување
13 MyIntArrayUtil.sortAscending(array);
14
15 // Повторно прикажи ги елементите на низата на екранот
16 System.out.println("Сортирана низа по зголемување:");
17 MyIntArrayUtil.printArray(array);
18 }
19
20 // Метод за генерирање на случајна низа од цели броеви
21 public static int[] generateRandomArray(int length, int min, int max)
22 {
23 Random rand = new Random();
24 int[] array = new int[length];
25 for (int i = 0; i < length; i++) {
26 array[i] = rand.nextInt(max - min + 1) + min;
27 }
28 return array;
29 }}

8. Создадете класа наречена Wrestler за претставување на борач во програма за


симулација на борење, која го симулира резултатот од боречки натпревар со двајца
борачи врз основа на нивното борење. Борачот ги има следните атрибути:

119
Име на атрубут Објаснување вредност
Име Име на борач Текст
Моќ (pow) Бројачот неможе да се натпреварува Број помал од максималната
кога неговата моќ е 0 моќ
Максимална моќ Моќта на почеток на мечот 100
Сила (str) Боречката сила на борачот Цел број од 1 до 20
Цврстина (tou) Способноста да одземе сила Цел број од 1 до 20
Издржливост (sta) Борачот со голема издржливост може Цел број од 1 до 20
да се бори повеке
Брзина (spd) Агилноста на борачот Цел број од 1 до 20
Среќа (lck) Среќата казува колку среќа има Цел број од 1 до 20
борачот
Храброст (cou) Борачот со голема храброст се Цел број од 1 до 20
зајакнува почесто
Вештина (skl) Борачот со голема вештина може да Цел број од 1 до 20
претвори одбрана во напад

Wrestler мора да има конструктор кој го дава името со даден String. Сите
податоци за членовите во класата мора да бидат private. Исто така обезбедете и
соодветни методи за мутатор и пристап. Сите пристапни методи се public.
Меѓутоа, за str, sta, tou, spd, lck, cou и skl нивните методи на мутатор се private и
секој од нив да се провери дали неговата влезна вредност е во валиден
опсег(1-20). Методи на мутатори чии влезови не се во важечкиот опсег мора да
се врати неточно. Во спротивно мора да врати true. Напишете public метод rest()
кој го ресетира pow на вредност на максимална моќ. Напишете public метод
reducePow() кој го намалува тековниот pow со double вредност земена како
единствен влезен аргумент. Понатаму, обезбедете public метод наречен setAttr()
кој ги зема 7-те целобројни вредности што треба да се доделат на str, tou, sta,
spd, lck, cou, и skl,и ги користи сите private мутатори методи за соодветно
поставување на вредностите. Овој метод мора да врати false ако некој од private
мутаторите врати false. Во спротивно ке врати true.

120
Одговор :

1 public class Wrestler {


2 private String name;
3 private int pow;
4 private final int maxPow = 100;
5 private int str;
6 private int tou;
7 private int sta;
8 private int spd;
9 private int lck;
10 private int cou;
11 private int skl;
12 public Wrestler(String name) {
13 this.name = name;
14 this.pow = maxPow;
15 }
16 public String getName() {
17 return name;
18 }
19 public int getPow() {
20 return pow;
21 }
22 public int getStr() {
23 return str;
24 }
25 public int getTou() {
26 return tou;
27 }
28 public int getSta() {
29 return sta;
30 }
31 public int getSpd() {
32 return spd;
33 }
34 public int getLck() {
35 return lck;
36 }
37 public int getCou() {
38 return cou;
39 }
40 public int getSkl() {
41 return skl;
42 }
43 private boolean isValidAttribute(int attribute) {
44 return attribute >= 1 && attribute <= 20;
45 }
46 private boolean setStr(int str) {
47 if (isValidAttribute(str)) {
48 this.str = str;

121
49 return true;
50 }
51 return false;
52 }
53 private boolean setTou(int tou) {
54 if (isValidAttribute(tou)) {
55 this.tou = tou;
56 return true;
57 }
58 return false;
59 }
60 private boolean setSta(int sta) {
61 if (isValidAttribute(sta)) {
62 this.sta = sta;
63 return true;
64 }
65 return false;
66 }

9. Додај toString() на Wrestler во претходниот проблем така што враќа низа во


следниот формат:
Wrestler: [name]
На пример, System.out.print(x) би испечатил Wrestler: Hulk Hogan ако х се
однесува на Wrestler објект со променлива инстанца именувана “Hulk Hogan”
.
Oдговор :

1 public class Wrestler {


2 private String name;
3 private int pow;
4 private final int maxPow = 100;
5 private int str;
6 private int tou;
7 private int sta;
8 private int spd;
9 private int lck;
10 private int cou;
11 private int skl;
12
13 public Wrestler(String name) {
14 this.name = name;
15 this.pow = maxPow;
16 }
17
18 public String getName() {
19 return name;
20 }

122
21
22 public int getPow() {
23 return pow;
24 }
25
26 public int getStr() {
27 return str;
28 }
29
30 public int getTou() {
31 return tou;
32 }
33
34 public int getSta() {
35 return sta;
36 }
37
38 public int getSpd() {
39 return spd;
40 }
41
42 public int getLck() {
43 return lck;
44 }
45
46 public int getCou() {
47 return cou;
48 }
49
50 public int getSkl() {
51 return skl;
52 }
53
54 private boolean isValidAttribute(int attribute) {
55 return attribute >= 1 && attribute <= 20;
56 }
57
58 private boolean setStr(int str) {
59 if (isValidAttribute(str)) {
60 this.str = str;
61 return true;
62 }
63 return false;
64 }
65
66 private boolean setTou(int tou) {
67 if (isValidAttribute(tou)) {
68 this.tou = tou;
69 return true;
70 }
71 return false;
72 }
73

123
74 private boolean setSta(int sta) {
75 if (isValidAttribute(sta)) {
76 this.sta = sta;
77 return true;
78 }
79 return false;
80 }
81
82 private boolean setSpd(int spd) {
83 if (isValidAttribute(spd)) {
84 this.spd = spd;
85 return true;
86 }
87 return false;
88 }
89
90 private boolean setLck(int lck) {
91 if (isValidAttribute(lck)) {
92 this.lck = lck;
93 return true;
94 }
95 return false;
96 }
97
98 private boolean setCou(int cou) {
99 if (isValidAttribute(cou)) {
100 this.cou = cou;
101 return true;
102 }
103 return false;
104 }
105
106 private boolean setSkl(int skl) {
107 if (isValidAttribute(skl)) {
108 this.skl = skl;
109 return true;
110 }
111 return false;
112 }
113
114 public boolean setAttr(int str, int tou, int sta, int spd, int lck,
115 int cou, int skl) {
116 return setStr(str) && setTou(tou) && setSta(sta) && setSpd(spd)
117 && setLck(lck) && setCou(cou) && setSkl(skl);
118 }
119
120 public void rest() {
121 this.pow = maxPow;
122 }
123
124 public void reducePow(double value) {
125 this.pow -= value;
126 if (this.pow < 0) {

124
127 this.pow = 0;
128 }
129 }
130 @Override
131 public String toString() {
132 return "Wrestler: " + name;
133 }}

10. Борбата помеѓу двајцата борачи на натпреварот во нашиот симулатор за борење е


симулиран во рунди. Секоја рунда ги следи следниве чекори.
1) Одреди кој го иницира нападот.
Секоја рунда почнува со одредување кој борач напаѓа прв. За секој
борач случаен рационален број d е рамномерно изберен од 0 до (spd на
борачот)+(lck на борачот+cou на борачот)/8.0. Борачот со поголемо d ја
има шансата за напад. Повторете го истото ако двајцата борачи имаат
иста вредност(Нерешено во вредностите од двата случајно избрани
борачи е рееткост.)
2) Контранапад.
Пред да се случи вистинскиот напад, напаѓачот може да ја изгуби
својата шанса за напад ако одбранбениот играч успешно изведе
контранапад.за секој борач случаен рационален број с еподеднакво
извлечен од 0 до (skl на борачот) + ( lck на борачот )/ 8.0. успешен
контранапад се изведува ако одбранбениот играч има поголемо с од
напаѓачот. Кога ке се случи контранападот оригиналниот дефанзивец ја
зема шансата за напад од напаѓачот.
3) Справи се со штетата.
Борачот со шанса за напад(w1) сега може да се справи со некои
оштетувања од другиот борач(c2). Double број dmg е пресметан од.
Dmg=(str од w1+10)-(tou од w2)+e
Каде е е рандом рационален број неформално земен од 0 до (cou од
w1)/4.0+(skl од w1)/4.0-(skl од w2)/4.0+(lck од w1)/8.0-(lck од w2)/8.0
Ако dmg е помалку од 0, dmg е сетирана на 0. Тогаш, dmg е едземена од
w2 моменталната моќ.
4) Обем на замор.
По чекорот за справување со штетата, и двајцата борачи добиваат малку
намалување на нивните моќни вредности. Намалувањето r во моќност е
double вредност и се пресметува со:
−1
r=(моментална pow/Max.Power)x20x(𝑠𝑡𝑎 + 1)
5) Проверете дали моќта е исцрпена.
Боречкиот натпревар е завршен ако, по завршувањето на рундата,
вредностите на pow на кој било од двајцата борачи се еднакви или
помали од 0. Во спротивно, следната рунда се извршува по слични

125
чекори, со вредноста на моќта на секој борач пстанува онаква каква што
е на крајот на рундата.
Ако мечот е завршен, борачот со позитивна powе победник. Ако нема
победник мечот е нерешен.
Сега креирај класа наречена FightingRule која се состои од не статичен
метод потребен за започнување на боречки натпревар според чекорите
погоре. Овие методи вклучуваат:

int determineAttacker(Wrestler w1, Wrestler w2)

Методот враќа 1 ако w1 ја земе шансата за напад како резултат од чекор


1. Враќа 2 ако w2 ја земе шансата за напад.

Boolean canCounter(wrestler w1, wrestler w2)

Методот претпоставува дека w1 е напаѓачот, а w2 е бранител. Се враќа


true ако се случи контранапад како резултат на чекор 2. Во спротивно се
враќа false.

double dealDamage(Wrestler w1, Wrestler w2)

методот претпоставува дека по чекор 2 во тековниот пресврт w1 има


шанса за напад. Ја враќа вредноста на нанесената штета според
правилото објаснето во чекор 3. Овој метод исто така ја намапува моќта
на w2 според нанесената штета.

void exhaust(Wrestler w)

Методот ја намалува вредноста на моќта на борачот според заморот


објаснет во чекор 4.

boolean isKO(Wrestler w)

Методот враќа true ако моќта на борачот е помала или еднаква на 0.

Одговор :

1 import java.util.Random;
2 public class FightingRule {

126
3 private static Random random = new Random();
4 public static int determineAttacker(Wrestler w1, Wrestler w2) {
5 double d1 = random.nextDouble() * (w1.getSpd() + (w1.getLck() +
6 w1.getCou()) / 8.0);
7 double d2 = random.nextDouble() * (w2.getSpd() + (w2.getLck() +
8 w2.getCou()) / 8.0);
9 if (d1 > d2) {
10 return 1;
11 } else if (d1 < d2) {
12 return 2;
13 } else {
14 // Repeat if both wrestlers have the same d value
15 return determineAttacker(w1, w2);
16 }
17 }
18 public static boolean canCounter(Wrestler w1, Wrestler w2) {
19 double c1 = random.nextDouble() * (w1.getSkl() + w1.getLck() /
20 8.0);
21 double c2 = random.nextDouble() * (w2.getSkl() + w2.getLck() /
22 8.0);
23 return c2 > c1;
24 }
25 public static double dealDamage(Wrestler w1, Wrestler w2) {
26 double e = random.nextDouble() * (w1.getCou() / 4.0) +
27 (w1.getSkl() / 4.0) - (w2.getSkl() / 4.0) + (w1.getLck() / 8.0) -
28 (w2.getLck() / 8.0);
29 double dmg = (w1.getStr() + 10) - w2.getTou() + e;
30 if (dmg < 0) {
31 dmg = 0;
32 }
33 double remainingPower = w2.getPow() - dmg;
34 if (remainingPower < 0) {
35 remainingPower = 0;
36 }
37 w2.setPow(remainingPower);
38 return dmg;
39 }
40 public static void exhaust(Wrestler w) {
41 double r = (w.getPow() / w.getMaxPow()) * 20 * Math.pow(w.getSta()
42 + 1, -1);
43 double remainingPower = w.getPow() - r;
44 if (remainingPower < 0) {
45 remainingPower = 0;
46 }
47 w.setPow(remainingPower);
48 }
49 public static boolean isKO(Wrestler w) {
50 return w.getPow() <= 0;
51 }}

127
11. Направете класа наречена WrestlingMatch. Објект во оваа класа претставува борење
меѓу двајца борачи. Податочни членови на оваа класа се:

private Wrestler red;


1
private Wrestler blue;
2
private int maxStat;
3
private FightingRule rule;
4

Двете примени променливи црвена и цина се однесуваат на бројачите вклучени


во овој натпревар. Променливата maxStat ја одредува максималната вредност
што str, tou, sta, spd, lck, cou, и skl на секој борач може да се сумира. Ако борач
има таква сума што ја надминува maxStat, тој борач е дисквалификуван од
натпреварот. Правилото на променливата е FightingRule објрктот усвоен од
натпреварот.

Напишете конструктор кој зема целобројна вредност и референца на


FightingRule објект. Напишете метод:

public boolean isQualified(Wrestler w)

кој враќа true ако борачот е квалификуван во тековниот натпревар. Во спротивно


враќа false.
Напишете метод :

public boolean setWrestlers(Wrestler w1,Wrestler w2)


кој го доделува борачот наведен од w1 на црвено и борачот наведен од w2 на
сино. Методот мора да врати false ако еден од борачите е дисквалификуван. Во
спротивно, се враќа true. Напишете метод:

public Wrestler commence()

кој го симулира тековниот боречки натпревар базиран на двата објекти на


wrestler наведени со црвена и сина боја според правилата дефинирани во
правиното. Методот мора да ги користи петте дадени метоси во правилото. Во
основа, меотодт воведува јамка во која секој пресврт од натпреварот се
симулира врз основа на методите предвидени во објектот FightingRule.
Проблемот е решен кога се испишува има победник на натпреварот или
натпреварот е нерешен. Тоа враќа референца за објектот Wrestler кој ке го добие
натпреварот или ке врати нула ако натпреварот е нерешен. Внатре во методот
println() треба да се користи за да се повтори коментарот од она што се случило
на мечот на екран. Дизајнирајте свој стил на коментар на натпреварот.
128
Одговор :

1 public class WrestlingMatch {


2 private Wrestler crven;
3 private Wrestler син;
4 private int maksStat;
5 private FightingRule правило;
6
7 public WrestlingMatch(int maksStat, FightingRule правило) {
8 this.maksStat = maksStat;
9 this.правило = правило;
10 }
11
12 public boolean еКвалифициран(Wrestler w) {
13 int сума = w.getStr() + w.getTou() + w.getSta() +
14 w.getSpd() + w.getLck() + w.getCou() + w.getSkl();
15 return сума <= maksStat;
16 }
17 public boolean поставиБорци(Wrestler w1, Wrestler w2) {
18 if (!еКвалифициран(w1) || !еКвалифициран(w2)) {
19 return false;
20 }
21 crven = w1;
22 син = w2;
23 return true;
24 }
25 public Wrestler започни() {
26 if (crven == null || син == null) {
27 System.out.println("Борбата не може да започне без
28 два квалифицирани борци.");
29 return null;
30 }
31 System.out.println("Борбата помеѓу " + crven.getName() +
32 " и " + син.getName() + " започнува!");
33 int рунда = 1;
34 while (true) {
35 System.out.println("Рунда " + рунда + " започнува!");
36 int напаѓач = правило.одредиНапаѓач(crven, син);
37 Wrestler напаѓачБорец = напаѓач == 1 ? crven : син;
38 Wrestler одбранбенБорец = напаѓач == 1 ? син : crven;
39 if (правило.можеКонтратак(напаѓачБорец,
40 одбранбенБорец)) {
41 System.out.println(одбранбенБорец.getName() + "
42 го контрира нападот!");
43 напаѓач = напаѓач == 1 ? 2 : 1; // Промена на
44 напаѓачот ако контратакот успее
45 напаѓачБорец = напаѓач == 1 ? crven : син;
46 одбранбенБорец = напаѓач == 1 ? син : crven;
47 }

129
48 double штета = правило.нанесиШтета(напаѓачБорец,
49 одбранбенБорец);
50 System.out.println(напаѓачБорец.getName() + "
51 нанесува " + штета + " штета на " + одбранбенБорец.getName());
52 правило.истроши(напаѓачБорец);
53 правило.истроши(одбранбенБорец);
54 if (правило.еИзненадување(одбранбенБорец)) {
55 System.out.println(одбранбенБорец.getName() + " е
56 исклучен!");
57 return напаѓачБорец;
58 }
59 рунда++;
60 }}}
61
62

12. Напишете програма наречена ManualSimulation.java која ги извршува следните


чекори:
● Креирај инстанца од FightingRule и нека биде упатена до променливата
currentRule.
● Креирај инстанца од WrestlingMatch и нека биде наведена со софпаѓања
на променливата. Овој натпревар треба да има свое maxStat на 70.
Примени ја инстанцата на FightingRule создадена во претходниот чекор.
Користете го конструкторот WrestlingMatch.
● Создадете ги следните борачи со наведените атрибути.

130
● Поставете ги борачите “Tiger Mask” и “Nightmare” во меч. Ако некој од
борачите е дисквалификуван поради нивните атрибути, пријавете го на
екранот. Симулирајте го мечот на победникот.
● Поставете ги борачите во “The Clown” и “Lightspeed” меч. Ако некој од
борачите е дисквалификуван поради нивните атрибути, пријавете го на
екранот. Симулирајте го мечот на победникот.
● Одморете ги победниците од двата нетпревари со користење rest()
дефинирани како Wrestler.
● Симулирајте натпервар помеѓу победниците од двата натпревари.
Одговор : ????????????????????????????????????
13. Објаснете што треба да се направи во симулацијата со бореше доколку во
формулите употребени во чекор 1 до чекор 4 во проблем 12 се менуваат. Наведете
ги имињата на датотеките чија содржина треба да се измени според промената.

Одговор : ????????????????????????????????????

131
12. НАСЛЕДУВАЊЕ
1. Зошто ни е потребна способностa да создаваме нови класи од друга база класи?
Oдговор :
Способноста да создаваме нови класи од други базни класи, што се нарекува наследување,
е од суштинско значење во објектно-ориентираното програмирање поради неколку
причини:
● Преупотребливост на кодот: Наследувањето овозможува повторна употреба на
кодот. Ако имате повеќе класи кои имаат слични функционалности, можете да ги
издвоите заедничките делови во базна класа, а потоа да наследите тие
функционалности во другите класи.
● Издржливост и пристапност: Наследувањето овозможува класите да наследуваат
методи и својства од базната класа, што овозможува пристап до тие методи и
својства во наследните класи. Ова спречува повторно пишување на истиот код во
повеќе класи.
● Флексибилност: Наследувањето овозможува измена на постоечки функционалности
или додавање на нови функционалности во класите на базната класа без промена на
кодот во сите наследници. Ова прави програмата по-флексибилна и подобро
организирана.
● Јасност и разбирливост: Користењето на наследување може да ги подобри јасноста
и разбирливоста на кодот. Кога класата наследува од базната класа, тоа може да го
истакне врската помеѓу класите и да ги олесни примарните цели и
функционалности на програмата.
● Одржливост и модификација: Ако треба да се направи промена во постоечката
функционалност, тоа може да се направи во базната класа, а промените автоматски
ќе се применат во сите наследници. Ова овозможува лесно и брзо одржување на
кодот.

2. Дали е можно да се создаде нова класа наречена SmartString која наследува од


класата String?
Одговор : Во Java, не е можно да наследите од вградената класа String, бидејќи String
класата е финална класа. Финалните класи не можат да бидат наследени.

132
3. Размислете за следниве дефиниции за класи:

1 public class Ex12_3


2 {
3 public int x;
4 public int y;
5 }
6 public class Ex12_3sub
7 extends Ex12_3
8 {
9 public int y = 1;
10 public int z = 1;
11 }

Одговор :
Во овие дефиниции на класи, имаме две класи, Ex12_3 и Ex12_3sub.

● Ex12_3 класата има две променливи x и y, кои се јавни (public), што значи
дека можат да се пристапат од било каде во програмата.

● Ex12_3sub класата наследува од Ex12_3 класата, што значи дека ја примаат


функционалноста и состојбата на Ex12_3 класата. Дополнително, има двете
дополнителни променливи y и z.

Во овој случај, класата Ex12_3sub има своја променлива y, но има истоимен член
како и Ex12_3. Кога ќе се креира објект од Ex12_3sub, ќе има пристап до
променливата y од Ex12_3sub, но исто така ќе може да ја пристапи и променливата
y од Ex12_3 со користење на super ключот. За разлика од y, променливата z е само
дел од Ex12_3sub класата и не е видлива во Ex12_3 класата.

Што е излез на следната програма?

1 public class Ex12_3run


2{
3 public static void main(String[] args)

133
4 {
5 Ex12_3 a = new Ex12_3();
6 Ex12_3sub b = new Ex12_3sub();
7 System.out.println(a.x+","+a.y);
8 System.out.println(b.x+","+b.y+","+b.z);
9 }
10 }

Одговор :
0,0
0,1,1
4. Размислете за дефиницијата за следната класа.

1 public class Ex12_4


2 {
3 public String s;
4 public Ex12_4(String s){
5 this.s = s;
6 }
7 }

Како и ,

1 public class Ex12_4a extends Ex12_4


2 {
3 public String s;
4 public Ex12_4a(String s){
5 super(s);
6 this.s = revert(s);
7 }
8 public String revert(String s){
9 if(s.length()<=1) return s;
10 return s.charAt(s.length()-1)+
11 revert(s.substring(0,s.length()-1));
12 }
13 public void printS(){
14 System.out.println(s);
15 System.out.println(super.s);
16 }
17 }

134
Одговор :
Во дефинициите на класите Ex12_4 и Ex12_4a, имаме следниве карактеристики:
● Ex12_4 класата има променлива s тип String која е јавна (public), и конструктор кој
прима String како влезен аргумент и го поставува s на влезниот аргумент.
● Ex12_4a класата наследува од Ex12_4 класата. Исто така, има променлива s тип
String, но оваа променлива е локална кон класата и не го наследува s од
родителската класа. Во конструкторот, вредноста на s се превртува (revert) со
користење на методот revert(), кој е рекурзивен метод кој ги превртува карактерите
на влезната стринга. Методот printS() ги печати локалната s променлива и s
променливата од родителската класа користејќи super.s.

Што е излез на следнава програма?

1 public class Ex12_4run


2 {
3 public static void main(String[] args)
4 { Ex12_4a a = new Ex12_4a("What?");
5 System.out.println(a.s);
6 a.printS();
7 }
8 }

Одговор :????????????????????
11. Следниот дијаграм за наследување на класите го дефинира односот меѓу A, B, C и
D.

135
Кој од следниве искаци ке биде компајлиран успешно?
a. Statement: A a1 = new B();
b. Statement: B b1 = new C();
c. Statement: B b2 = new D();
d. Statement: C c1 = new D();
e. Statement: C c2 = new A();
f. Statement: A a2 = new D();
Одговор :
a. Statement: A a1 = new B();
d. Statement: C c1 = new D();
12. Колку непосредни базни класи може една класа да има?

Одговор :
Во Java, една класа може да има само една непосредна базна класа. Ова се однесува на
концептот на јаваскриптова единственост на наследството, каде што класата може да
наследува свои атрибути и методи само од една друга класа. Ова ограничува јаваскриптово
наследство на едно ниво и е познато како единствена наследба. Во други програмски
јазици, како што се C++, може да постојат концепции на множествена наследба, каде што
една класа може да има повеќе непосредни базни класи. Ова може да биде корисно, но
може да предизвикаат и замршенија во дизајнот и извршувањето на програмата. Во Java,
изборот за единствена наследба беше направен за да се намали сложеноста и да се олесни
разбирателноста и одржливоста на кодот.

136

You might also like