Professional Documents
Culture Documents
ВОЕНА АКАДЕМИЈА
„ГЕНЕРАЛ МИХАИЛО АПОСТОЛСКИ“ –
СКОПЈЕ
-ПРИДРУЖНА ЧЛЕНКА-
Ментор: Изработиле:
потполк. Југослав Ачкоски пит. Магдалена
Димчевска
пит. Павел Божиновски
Скопје 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.
1 бајт = 8 бита
1 килобајт (KB) = 1024 бајти
1 мегабајт (MB) = 1024 KB
512 MB * 1024 KB/MB * 1024 бајти/KB * 8 бита/бајт = 512 * 1024 * 1024 * 8 бита
512 * 1024 * 1024 * 8 = 4.294.967.296 бита
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 }
______________________________________________
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
Одговор:
______________________________________________________________________________
6. Променете го кодот најмалку што можете со цел да добиете програма која успешно
ќе се компајлира.
Одговор:
12
______________________________________________________________________________
7. Покажете како се користи методот print() со цел да се испечати следната порака на
екранот.
He called Clancy at headquarters and said:
“There’s a family of ducks walkin’ down the street!”
Одговор:
13
X-Ray -Невалиден, содржи цртичка
!alert_sign -Невалиден, содржи посебен знак '!' што не е дозволено.
entry point -Невалиден, содржи празно место
public -Невалиден, тоа е клучен збор во Java.
main -Невалиден, тоа е клучен збор во Java.
Class -Невалиден, тоа е клучен збор во Java.
“Gorilla” -Невалиден, содржи наводници.
_____________________________________________________________________________________________
_________________________________
Одговор:
Клучни зборови:
public: Модификатор за пристап што покажува дека класата е достапна за сите
други класи.
class: Клучен збор што се користи за дефинирање на класа.
static: Клучен збор што покажува дека методот main припаѓа на самата класа,
наместо на примерок од класата.
void: Покажува дека методот main не враќа вредност.
String: Предефинирана класа што претставува низи во Јава.
double: Тип на податоци со повеќе децимали.
System.out.println: Изјава за печатење на излезот во конзолата.
Идентификатори:
AverageDemo: Името на класата.
main: Името на методот.
args: Името на низата со параметри се пренесува на главниот метод.
avg: Променлива што го претставува просекот на броевите.
14
sum: Променлива што го претставува збирот на броевите.
__________________________________________________________
10. Изменете го изворниот код на класата AverageDemo за да може програмата да ги
покажува збирот и просекот на целите броеви од 1 до 5 како што е претставено
подолу. Исто така нацртајте алгоритам за програмата.
Одговор:
______________________________________________________________________________________
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. Одреди ги вредностите на х и у во следниот код
Одговор:
Се иницијализираат променливите 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;
_____________________________________________________________________________________
20
3 public static void main(String[] args)
4 {
5 int x, y, z =3;
6 y = x;
7 z = y;
8 }
9}
_____________________________________________________________________________________
21
2 2
|−(6.5) +(3.7) |
Б. ⅇ
3
В. sin 𝑠𝑖𝑛 (1, 2)
8
Г. Резултат со подвижна точка од 1+10
22
10 // Прикажи го резултатот
11 System.out.println("8 / (1 + 10) = " + резултат);
12 }
13 }
3
(𝑖+1)
Е. ∑ 𝑖
𝑖=0
23
12 }
13 }
______________________________________________________________________________
8. Напишете JAVA програма која ја покажува на екранот точната вредност за секој од
следниве искази за секоја можна комбинација за p и q. (пр. (точно, точно), (точно,
неточно), (неточно, точно) и (неточно, неточно))
Одговор:
А. p и q
Еве како ќе изгледа кодот:
Б. 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
25
Г. Или p или нејзината негација
каде 𝑤𝑥 = 0. 5, 𝑤𝑦 = 0. 3, 𝑤𝑧 = 0. 2
26
Одговор:
______________________________________________________________________________
10. Напишете JAVA програма која ги претставува следниве чекори
А. Декларира две int променливи именувани како х и у.
Б. Доделете вредност 3 на х.
В. Доделете двојно поголема вредност од х на у.
Г. Направете замена на вредностите на х и у (без експлицитно доделување на
вредноста 3 на у).
Д. Испечатете ја вредноста на двете варијабли на екранот.
27
Одговор:
______________________________________________________________________________
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
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 во кратка и испечатете ја на екранот.
Одговор:
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.
Одговор:
32
15 }
16 }
17
______________________________________________________________________________
8. Одредете што ќе се покаже на екранот ако се извршат следниве искази.
Одговор:
● Печатењето на 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).
_____________________________________________________________________________
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
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 }
}
int x;
1
(x++)++;
2
Одговор:
Оваа код сегмента предизвикува грешка при компајлирање поради несоодветната
употреба на операторот ++.
Во Java, операторот ++ може да се користи само за инкрементирање на вредноста
на променливата по што може да се изврши изразот. Во изразот (x++)++, прво се
извршува операторот x++ кој инкрементира вредноста на x, но враќа старата
вредност на x. Потоа, се обидува да се инкрементира вредноста што е вратена од
x++, што не е дозволено.
Операторот ++ може да се користи само на променлива, а не на вредност која не
може да се менува. Затоа оваа употреба на ++ операторот е несоодветна и
предизвикува грешка при компајлирање.
_____________________________________________________________________________________________
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
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
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!"
на стандардниот излез.
_____________________________________________________________________________________
Одговор:
А. 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
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.
_____________________________________________________________________________________
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".
_____________________________________________________________________________________
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 во нашата програма.
Одговор:
43
На другата страна, класата BufferedReader е дел од java.io пакетот, кој не е дел од
java.lang. За да ја користиме оваа класа, треба да ја импортираме во нашата
програма со исказот import java.io.BufferedReader;. Бидејќи не е дел од основната
Java библиотека, треба да ја вклучиме експлицитно со import исказот за да биде
достапна во нашата програма. Ова се прави за да се овозможи користење на класата
BufferedReader и други класи од java.io пакетот во програмата.
______________________________________________________________________________
12. Напишете JAVA програма која ќе прифаќа текстуална порака која корисникот ја
внел преку тастатура и ќе ја прикаже истата на екранот.
Одговор:
44
Одговор:
45
Одговор:
______________________________________________________________________________
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
______________________________________________
6. Одлуки
_____________________________________________________________________________________
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".
_____________________________________________________________________________________
Одговор:
Што ќе се прикаже на екранот ако:
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".
52
Одговор:
Одговор:
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 }
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 }
2) Switch исказ
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 е парен број
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 наредбата.
Одговор:
Кога ќе се изврши кодот со различни вредности на 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.
_____________________________________________________________________________
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 }
Одговор:
Кодот напишан со ?: оператор:
Ова го прави истото нешто како и претходниот 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 }
Одговор:
Овој код е еквивалентен на оригиналниот, каде 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".
________________________________________________________________
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 }
Одговор:
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 пати.
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
1 int n = 1, i = 100;
2 while(n++<i--);
Одговор :
n ќе биде 101.
4. Кои се вредностите на n и m по извршување на следниот код ?
64
Одговор :
n = 300m = 299
1 int n = 0;
2 for(int i = 1;i<=100;i++)
3 for(int j = 1;j<=100;j++)
4 n++;
Одговор :
10000
1 int n = 0;
2 for(int i = 50;i>0;i--)
3 for(int j = 40;j>0;j--)
4 n++;
Одговор :
2000
1 int k=0;
2 for(int i=100;i>1;i/=2,k++);
3 System.out.println(k);
Одговор :
6
65
самата циклус. За да го поправите ова, променливата i треба да се дефинира надвор
од циклусот.
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 }
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
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
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) се
дефинира како:
Одговор:
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 }
Одговор:
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
74
Одговор:
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.”
Одговор:
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() ?
Одговор :
A
AA
Објаснете зошто не може да се компајлира следниот сегмент на кодови успешно.
Одговор : Програмата во Java која ќе се изврши со овој код ќе фрли грешка. Проблемот
е во типот на враќање на методот f(). Math.pow() методот враќа резултат од тип double,
а методот f() е деклариран да врати цел број (int). Ова ќе предизвика грешка во Java.
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. Дали следната програма може успешно да се компајлира? Ако така, што ќе се прикаже
на излезот од програмата?
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. Определете го излезот на следниот сегмент на кодови.
Одговор : 6
81
Одговор :
3. Напишете метод наречен cube() што го враќа својот double параметар подигната на
третата моќ.
82
Одговор:
Oдговор :
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 }
Според табелата, ако приходот на една личност е 550.000 Г., таму нема данок за
првите 100.000 Г., 10% од приходот во опсегот 100.001-500.000, што е еднакво на
40.000 Г., Последниот 50 000 Г. се оданочува со стапка од 20% што резултира 10 000 Г.
Затоа, вкупниот данок за ова лице е 60.000 Г.
84
Одговор:
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 е
влез во методот како сам влезен аргумент.
Одговор:
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. Определете го излезот од следниов код.
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() чиј метод гласи:
Одговор:
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 низа(т.е. елементите на влезната низа ги
подредува и не користи друга низа.). Мора да има друг параметар кој одредува дали низата
ке се сортира растечки или опаѓачки.
Одговор:
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 во спротивно.
Одговор:
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 }}
96
Одговор : 30
Одговор:
Ако 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.
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; // Цртањето е успешно извршено}
Одговор:
99
6. Во програма за резервација на седишта во авиокомпанија , табелата е претставена
со помош на дводимензионална низа. Низата seats[i][j] го содржи името на патникот
кој го резервирал седиштето со број ј во i-тиот ред каде што ј е 0 за седиштето со
број А, ј е 1 за седиштето со број Б итн. Seats[i][j] складира нула ако седиштето е
празно. Имајте предвид дека авионите може да имаат различен број на редови.
Сепак, да претпоставиме дека бројот на места во секој ред на истиот авион е
константа. Напишете методи кои имаат еден од нивните влезни аргументи е низата
seats, за извршување на задачите со приложените променливи. Одлучете за
иминјата, нивните влезни аргументи и нивните повратни вредности соодветно.
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 . . . . . . . . . . . .
101
Oдговор :
A) Meтод за прикажување на табелата за седење
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()?
Одговор : 15
3. Спореди го следниов метод користејки рекурзивен пристап.
Одговор:
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}
Одговор:
104
9}
10 return a;
11 }
Одговор:
Одговор:
105
7 }
8}
Одговор:
𝑛 𝑛−1
1 1 𝑘
𝑓(𝑛) = { ∑ 𝑘 2
𝑓(− 1) + 2
𝑓(𝑛 − 3) ∑ (𝑓(𝑘) − (− 1) 𝑓(𝑘 − 1))
𝑘=0 𝑘=𝑛−3
; 𝑛 = 0, 1, 2; 3 ≤< 10; ≥ 10
106
Одговор :
107
9. Напишете ракурзивен Java метод кој го пресметува збирот на секој int елемент во
влезна низа од int.
Одговор:
10. Напишете ракурзивен Java метод кој ја наоѓа најмалата вредност во влезна низа од
int.
Одговор:
108
18 System.out.println("Најмалата вредност во низата е: " + min);
19 }}
11. Напишете рекурзивен Java метод кој го враќа индексот на најмалата вредност во
влезна низа од int.
Одговор:
∞
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!.
Одговор :
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 .
Одговор :
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
113
a. Класа: Во програмирањето, класата е шаблон или модел од кој може да се креираат
објекти. Таа дефинира состојба и поведение за објектите кои се креирани од неа. Класата
опишува атрибути (податоци) и методи (функции) кои ги дефинираат објектите што
припаѓаат на неа.
b. Објект: Објектот е конкретна инстанца на класа. Тоа е конкретен примерок од класата,
кој има состојба (атрибути) и поведение (методи) дефинирани од класата. Објектите се
користат за работа со податоците и извршување на операции дефинирани од класата.
c. Атрибут: Атрибутот е променлива дефинирана во класа која го чува состојбата на
објектите создадени од таа класа. Атрибутите се користат за опишување на состојбата на
објектите и за чување на различни податоци.
d. Однесување: Однесувањето на еден објект се однесува на неговото поведение или
начинот на кој објектот реагира на различни акции или операции. Однесувањето е
дефинирано преку методите кои се имплементирани во класата и може да вклучува
различни активности и операции кои објектот може да ги изврши.
e. Инстанца променлива: Инстанцата променлива е променлива која е дефинирана во
објект од класата. Тоа значи дека секој објект има своја копија на променливата, независно
од другите објекти креирани од истата класа. Инстанцата променлива чува информации за
состојбата на секој поединечен објект.
f. Конструктор: Конструкторот е посебен метод во класата кој се користи за
иницијализација на нови објекти. Кога се креира нов објект од класата, конструкторот
автоматски се повикува за да се иницијализираат атрибутите на објектот. Конструкторите
можат да прифаќаат параметри за иницијализација на објектите или да бидат без
параметри, во зависност од потребите на програмата.
g. Пристапен метод: Пристапниот метод е метод во класата кој овозможува пристап до
приватните атрибути или методи на објектите создадени од класата. Тие се користат за
читање или поставување на вредностите на приватните атрибути, како и за извршување на
одредени операции или функционалности дефинирани во класата.
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.
115
Oдговор :
Статични членови:
● Статичните членови се споделуваат помеѓу сите инстанци на класата. Тие се
пристапуваат преку името на класата, а не преку инстанцата на објектот.
● Овие членови се креираат на ниво на класата и постојат само една копија од нив во
меморијата.
● Статичните членови се иницијализираат при вчитување на класата и може да бидат
пристапени и користени без креирање на инстанца од класата.
Нестатични (инстанчни) членови:
● Нестатичните членови се поврзани со инстанците (објектите) на класата. Секоја
инстанца од класата има своја копија од нестатичните членови.
● За пристапување до нестатичните членови потребно е да се креира инстанца од
класата.
● Овие членови се креираат кога се креираат инстанците од класата и постојат
посебни копии од нив за секоја инстанца.
Одговор :
Статични методи:
116
Нестатичните методи се користат за операции кои зависат од состојбата на
конкретните инстанци од класата.
Одговор :
● 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 }}
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
Одговор :
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 }
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 }}
125
чекори, со вредноста на моќта на секој борач пстанува онаква каква што
е на крајот на рундата.
Ако мечот е завршен, борачот со позитивна powе победник. Ако нема
победник мечот е нерешен.
Сега креирај класа наречена FightingRule која се состои од не статичен
метод потребен за започнување на боречки натпревар според чекорите
погоре. Овие методи вклучуваат:
void exhaust(Wrestler w)
boolean isKO(Wrestler w)
Одговор :
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. Објект во оваа класа претставува борење
меѓу двајца борачи. Податочни членови на оваа класа се:
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
130
● Поставете ги борачите “Tiger Mask” и “Nightmare” во меч. Ако некој од
борачите е дисквалификуван поради нивните атрибути, пријавете го на
екранот. Симулирајте го мечот на победникот.
● Поставете ги борачите во “The Clown” и “Lightspeed” меч. Ако некој од
борачите е дисквалификуван поради нивните атрибути, пријавете го на
екранот. Симулирајте го мечот на победникот.
● Одморете ги победниците од двата нетпревари со користење rest()
дефинирани како Wrestler.
● Симулирајте натпервар помеѓу победниците од двата натпревари.
Одговор : ????????????????????????????????????
13. Објаснете што треба да се направи во симулацијата со бореше доколку во
формулите употребени во чекор 1 до чекор 4 во проблем 12 се менуваат. Наведете
ги имињата на датотеките чија содржина треба да се измени според промената.
Одговор : ????????????????????????????????????
131
12. НАСЛЕДУВАЊЕ
1. Зошто ни е потребна способностa да создаваме нови класи од друга база класи?
Oдговор :
Способноста да создаваме нови класи од други базни класи, што се нарекува наследување,
е од суштинско значење во објектно-ориентираното програмирање поради неколку
причини:
● Преупотребливост на кодот: Наследувањето овозможува повторна употреба на
кодот. Ако имате повеќе класи кои имаат слични функционалности, можете да ги
издвоите заедничките делови во базна класа, а потоа да наследите тие
функционалности во другите класи.
● Издржливост и пристапност: Наследувањето овозможува класите да наследуваат
методи и својства од базната класа, што овозможува пристап до тие методи и
својства во наследните класи. Ова спречува повторно пишување на истиот код во
повеќе класи.
● Флексибилност: Наследувањето овозможува измена на постоечки функционалности
или додавање на нови функционалности во класите на базната класа без промена на
кодот во сите наследници. Ова прави програмата по-флексибилна и подобро
организирана.
● Јасност и разбирливост: Користењето на наследување може да ги подобри јасноста
и разбирливоста на кодот. Кога класата наследува од базната класа, тоа може да го
истакне врската помеѓу класите и да ги олесни примарните цели и
функционалности на програмата.
● Одржливост и модификација: Ако треба да се направи промена во постоечката
функционалност, тоа може да се направи во базната класа, а промените автоматски
ќе се применат во сите наследници. Ова овозможува лесно и брзо одржување на
кодот.
132
3. Размислете за следниве дефиниции за класи:
Одговор :
Во овие дефиниции на класи, имаме две класи, Ex12_3 и Ex12_3sub.
● Ex12_3 класата има две променливи x и y, кои се јавни (public), што значи
дека можат да се пристапат од било каде во програмата.
Во овој случај, класата Ex12_3sub има своја променлива y, но има истоимен член
како и Ex12_3. Кога ќе се креира објект од Ex12_3sub, ќе има пристап до
променливата y од Ex12_3sub, но исто така ќе може да ја пристапи и променливата
y од Ex12_3 со користење на super ключот. За разлика од y, променливата z е само
дел од Ex12_3sub класата и не е видлива во Ex12_3 класата.
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. Размислете за дефиницијата за следната класа.
Како и ,
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.
Одговор :????????????????????
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