3-кесте – Шартты операторларға арналған ақиқаттық кестесі
b
|
T
|
T
|
F
|
F
|
T
|
F
|
U
|
U
|
U
|
c
|
T
|
F
|
T
|
F
|
U
|
U
|
T
|
F
|
U
|
|
T
|
T
|
T
|
F
|
T
|
U
|
U
|
U
|
U
|
|
T
|
F
|
F
|
F
|
U
|
F
|
U
|
U
|
U
|
4-кесте – предикатының ақиқаттық кестесі
a
|
b
|
|
|
|
F
|
F
|
F
|
F
|
T
|
T
|
F
|
T
|
T
|
T
|
F
|
T
|
T
|
T
|
T
|
T
|
T
|
T
|
T
|
T
|
Көптеген предикаттардың ішінде ақиқат мәнге ие болатын предикаттар маңызды роль атқарады, мәселен, предикаты.
Анықтама 3. Коммутативтілік заңы:
Анықтама 4. Ассоциативтілік заңы:
Анықтама 5. Дистрибутивтілік заңы:
Анықтама 6 Де Морган заңы:
Анықтама 7. Теріске шығару заңы:
Анықтама 8. Үшіншінің болмауы заңы:
, егер анықталған болса.
Анықтама 9. Қарама-қайшылық заңы:
, егер анықталған болса.
Анықтама 10. Импликация заңы:
Анықтама 11. Тепе-теңдік заңы:
Анықтама 12. Дизъюнкцияны ықшамдау заңы:
Анықтама 13. Конъюнкцияны ықшамдау заңы:
Анықтама 14. Шартты Немесе ықшамдау заңы:
, егер анықталған болса,
Анықтама 15. Шартты Және ықшамдау заңы:
, егер анықталған болса,
Анықтама 16. Бара-барлық заңы:
Тапсырмалар
1. р(х)=" х саны 4 бөлінеді", x∈[1;10] предикатының ақиқат жиынтығын анықтау. Осы предикаттың ақиқат және жалған жиынтықтарын салу. Нұсқау: бөліну шарты осы аралықтағы натурал сандарды ғана қарастыру керектігін білдіреді, сондықтан предикатты анықтау облысы - X={1,2,3,4,5,6,7,8,9,10}.
2. p(x,y)= "х саны у санына тең", x, y∈[3;6] предикатының ақиқат жиынтығын анықтау. Осы предикаттың ақиқат және жалған жиынтықтарын салу. Нұсқау: жиын қос сандардан тұрады; бөліну шарты осы аралықтағы натурал сандарды ғана қарастыру керектігін білдіреді, яғни x, y=3, 4, 5, 6.
3. Ортасы координата басы болатын және радиустары сәйкесінше 3 және 5-ке тең шеңберлер облысының предикатын (шарты күрделі болуы мүмкін) жазыңыз. Нұсқау: алдымен суретін салыңыз.
4. ақиқат кестесін құрыңыз. Функцияны ықшамдап ақиқат кестесін құрыңыз. Нұсқау: кестенің «басы» x, y, x∨y, x∧y,, , , z бағандардан тұрады.
5. берілген. Функцияны ықшамдап ақиқат кестесін құрыңыз. Нұсқау: де Морган аксиомасын екі рет қолданыңыз.
6. берілген. Функцияны ықшамдап ақиқат кестесін құрыңыз. Нұсқау: бірінші көбейтілетін жақшалардың қосылғыштары тең.
7. функциясына балама аз операция мен операциядадан тұратын екі функция келтіріңіз. Нұсқау: ішкітерістеутаңбасындаішкіқолдануаксиомасынқолданыңыз.
8. Төменде келтірілген функциялардың ішінен өзара эквивалентті (негіздей отыра) функцияны белгілеңіз:
Нұсқау: ықшамдап салыстыру
9. Төменде келтірілген функциялардың ішінен өзара эквивалентті (негіздей отыра) функцияны белгілеңіз:
Нұсқау: ықшамдап салыстыру
10. Осыған дейінгі есептердің функцияларына ақиқат кестесін құрыңыз.
3-4 практикалық жұмыс. Пікірлер алгебрасы
константалы предикатты қарастырайық. Жоғарыдан төмен үстіне қарай тұжырым ағашын келтірейік және операция нәтижелерін ақиқаттық кестеге сәйкес алмастыра отыра, ағаштың тамырына дейін жетеміз. Осы кездегі соңғы нәтиже предикаттың мәні болып есептеледі (1-сурет).
1-сурет – предикатының ақиқаттылығын анықтау
Мысалы,
Бұл тұжырымының предикат екендігін көрсетеді. Предикаттың басқа да шығару жолын көрсетуге болады:
Эквивалентті тізімнің жиынтығы аталған предикаттың шығару ағашын көрсетеді, 2-сурет.
2-сурет – предикатының шығару ағашы
Тапсырмалар
1. предикат екенін дәлелдеңіз.
2. предикат емес екенін дәлелдеңіз.
3. Эквиваленттілік заңының әр біреуіне қорытындылау ағашын бейнелеңіз.
4. Эквиваленттілік заңының бар екенін тавтология екенін көрсетіңіз.
5. Кофе дәні бар банка туралы есепті шешіңіз: Ыдыста бірнеше ақ және қара кофе дәндері бар. Келесі үрдісті мүмкін болғанша қайталау керек:
- ыдыстан кез-келген екі дәнді суырып алыңыз және егер олар бір түсті болса, онда оларды алып тастаңыз, бірақ ыдысқа бір қара дәне салыңыз (ол үшін қара дәндер жеткілікті болу керек);
- егер олар әр түсті болса, онда ақ түсті дәнді қайта салыңыз, ал қара түстіні алып тастаңыз.
Бұл үрдіс ыдыстағы дәндер санын бір дәнге азайтып отырады. Ыдыста бір дән қалғанда үрдіс аяқталады, себебі екі дәнді таңдауға мүмкіндік болмайды. Алдын-ала қанша қара түсті және қанша ақ түсті дән салынғаны белгілі болса, соңында қалған бір дән туралы не айтуға болады.
5 практикалық жұмыс. Предикаттар алгебрасы
Программаның құрамында барлық айнымалылар логикалық типті бола бермейді, осыдан олардың барлығын предикат түрінде сипаттауға болмайды.
және
предикаттарының мәнін
жағдайында есептеу.
Шешуі. Егер осы предикаттағы жетіспейтін жақшалармен толықтырсақ онда сәйкес предикаттарды аламыз:
және . жағдайында жалған болып табылады, себебі , алболады (анықталмаған). Сәйкестік кестесіндегі және операцияларына сәйкес келесі қорытынды шығаруға болады ал
Анықтама 17. @ операторы сол жақты ассоциативті болып табылады, егер a @ b @ c өрнегі (a @ b) @ c арқылы есептелсе; оң жақты ассоциативті болып табылады, егер ол эквивалентті болса a @ (b @ c); ассоциативті емес, егер a @ b @ c жазуының мағынасы болмаса. Бұл жердегі @ символы тілдің кез-келген бинарлы операторын білдіреді.
Есептеу кезінде дөңгелек жақшаларды қолданған кезде есептеу реттілігін өзгертуге мүмкіндік береді, себебі жақшаның ішіндегі өрнек бірінші орында есептеледі. Формальды түрде жазылған артық жақшалар да артық болмайды, себебі олар есепті дұрыс қабылдауға мүмкіндік береді.
Төменде келтірілген кестеде Java тілінің операторлары бірдей приоритетті топтарға бөлінген (1 приоритетті операторлар бірінші орында орындалады), сол жақты ассоциативтілік символымен, ал оң жақты ассоциативтілік символымен белгіленген (5 кесте).
5-кесте – Операторлардың артықшылықтары мен приоритеттері
Пр-р
|
Оператор
|
Оператордың типі
|
Асс-тілік
|
Операция
|
1
|
2
|
3
|
4
|
5
|
1
|
++
|
сандық
|
|
пре- және постинкремент
|
|
--
|
сандық
|
|
пре- және постинкремент
|
|
+, -
|
сандық
|
|
унарлы плюс және минус
|
|
~
|
бүтін
|
|
биттық толықтыру
|
|
!
|
логикалық
|
|
логикалық теріске шығару
|
|
(type)
|
кез-келген
|
|
типтің ауысуы
|
2
|
*, /, %
|
сандық
|
|
көбейту, бөлу және қалдық
|
3
|
+, -
|
сандық
|
|
қосу және азайту
|
|
+
|
жолдық
|
|
жолдардың конкатенациясы
|
4
|
<<
|
бүтін
|
|
солға қарай жылжыту
|
5.1 кестенің жалғасы
1
|
2
|
3
|
4
|
5
|
|
>>
|
бүтін
|
|
оңға қарай биттердің өсуіне қарай жылжыту
|
|
>>>
|
бүтін
|
|
оңға қарай нөлдердің өсуіне қарай жылжыту
|
5
|
<, <=
|
сандық
|
|
кем, кем немесе тең
|
|
>, >=
|
сандық
|
|
артық, артық немесе тең
|
|
instanceof
|
объект,
|
|
типтерді салыстыру
|
6
|
==
|
қарапайым
|
|
қарапайым типтердің тепе-теңдігі
|
|
!=
|
қарапайым
|
|
қарапайым типтердің тепе-теңдігі емес
|
|
==
|
объект
|
|
объектілерге сілтеме тепе-теңдігі
|
|
!=
|
объект
|
|
объектілерге сілтеме тепе-теңдігі емес
|
7
|
&
|
бүтін
|
|
биттікЖәне
|
|
&
|
логикалық
|
|
логикалықЖәне
|
8
|
^
|
бүтін
|
|
биттік алып тастайтын Немесе
|
|
^
|
логикалық
|
|
логикалық алып тастайтын Немесе
|
9
|
|
|
бүтін
|
|
биттік Немесе
|
|
|
|
логикалық
|
|
логикалық Немесе
|
10
|
&&
|
логикалық
|
|
шартты Және
|
11
|
||
|
логикалық
|
|
шартты Немесе
|
12
|
?:
|
логикалық
|
|
шарттық оператор
|
13
|
=
|
кез-келген
|
|
меншіктеу
|
|
*=, /=, %=,
|
|
|
операциялар
|
Мысал Программалық код берілген. «а» неге тең болады?
-
Java
|
Visual C++
|
package decrement_1;
publicclass Decrement_1 {
publicstaticvoid main(String[] args) {
int a=5;
a=++a+++a;
System.out.println("Сіздің саныңыз тең болады " + a);
}
}
|
#include
using namespace std;
float main( )
{
int a=5;
a = ++a + ++a;
cout<<"a = "<
cout<<" "<
system ("PAUSE >> VOID");
return 0;
}
|
а=13
|
а=14
|
Инкременттер мен декременттердің кейбір мәндеріне мысал келтірейік
Инкременттер
-
Мысал
(а=5 болған жағдайда)
|
Java тіліндегі шығарылуы
|
C++ тіліндегі шығарылуы
|
a = ++a + ++a;
|
13
|
14
|
a = a++ + a++;
|
11
|
12
|
a = ++a + a++;
|
12
|
13
|
a = ++a;
|
6
|
6
|
а = a++;
|
5
|
6
|
Декременты
-
Мысал (а=5 болған жағдайда)
|
Java тіліндегі шығарылуы
|
C++ тіліндегі шығарылуы
|
a = --a + --a;
|
7
|
6
|
a = --a;
|
4
|
4
|
a = a--;
|
5
|
4
|
a = --a + a--;
|
8
|
7
|
a = a-- + a--;
|
9
|
8
|
a = a-- + --a;
|
8
|
7
|
a = --a + --a+ --a;
|
9
|
6
|
С (және C++) инкременттің префиксты және постфиксттың реттілігі анықталмаған. Бір код қолданылатын компиляторға қарай әр түрлі нәтиже беруі мүмкін.
Мысал Жоғарыда келтірілген Java тіліндегі программалық кодтың санды клавиатурадан енгізілетін мысалын келтірейік:
package decrement_1;
publicclass Decrement_1 {
publicstaticvoid main(String[] args) {
int b;
Scanner scan = new Scanner (System.in);
System.out.println( "Санды енгізіңіз " );
int a = scan.nextInt();
b=++a;
System.out.println("Сіздің саныңы тең " + b);
}
}
Тапсырмалар
1. Натурал сандар жиынында үш орынды предикаттар берілген S(x,y,z) ⇔ x+y = z, P(x,y,z) ⇔ x·y = z. Бірінші реттік тілде S, P предикат символдары арқылы жазыңыз:
- a=0, a=1, a =2, a — жұп сан, a — тақ сан жағдайында а бос айнымалысы ақиқат және тек сол кезде ғана ақиқат болатын формулалар;
- a = b, a ≤ b, a бөледі b жағдайында а және b бос екі айнымалысы ақиқат және тек сол кезде ғана ақиқат болатын формулалар;
- a — b және c сандарының ең кіші ортақ еселігі, a — b және c сандарының ең үлкен ортақ еселігі жағдайында а, b және с бос үш айнымалысы ақиқат және тек сол кезде ғана ақиқат болатын формулалар;
2. ∀x∃yP(x,y) ∧∀x∀y(P(x,y) →¬P(y,x))∧∀x∀y∀z(P(x, y) → (P(y,z) → P(x, z)))формуласы орындалатындығын, бірақ кез-келген соңғы модельде орындалмайтындығын дәлелдеу.
3. ¬∀x∀yP(x,y) ∨∀x∃yQ(x,y) формуласын алғашқы формулаға келтіру.
4. Келтірілген интерпретицияда предикаттар орынды ма?
- a = b, a =0, a =1, a =2в (N,x:y),
- a = b, b = a +1, c = a + b в (Z,<),
- a =0, a
- a = b, |a − b| =2в (R,|a − b| =1).
5. int a = 6;
a += ++a + a++;
System.out.println(a);
коды орындалғанда нәтиждесінде не шығады?
6. a=2
b=a++ + (--a * ++a)
//Неліктен b-ға тең?
коды орындалғанда нәтиждесінде не шығады?
7. int a = 7;
a = --a + --a;
System.out.println(a);
коды орындалғанда нәтиждесінде не шығады?
8. int a = 8;
a = --a;
System.out.println(a);
коды орындалғанда нәтиждесінде не шығады?
9. int a = 9;
a = a--;
System.out.println(a);
коды орындалғанда нәтиждесінде не шығады?
10. int a = 10;
a = --a + a--;
System.out.println(a);
коды орындалғанда нәтиждесінде не шығады?
11. int a = 11;
a = a-- + a--;
System.out.println(a);
коды орындалғанда нәтиждесінде не шығады?
12. int a = 12;
a = a-- + --a;
System.out.println(a);
коды орындалғанда нәтиждесінде не шығады?
13. int a = 13;
a = --a + --a+ --a;
System.out.println(a);
коды орындалғанда нәтиждесінде не шығады?
6 практикалық жұмыс. Гомоморфизмдер және изоморфизмдер
Анықтама 18. Рекурсия – программа өз-өзін немесе басқа программалар арқылы шақыруды айтады
Анықтама 19. Итерация – программаны рекурсивті жолмен емес көп ретті орындауды ұйымдастырады.
Рекурсияның математикалық моделінің міндеті программа айнымалыларының жиынының негізінде рекурсивты есептеу болып табылады. Мысал ретінде санның факториалын және Фибоначчи сандарын қарастыруға болады.
Санның факториалы келесі қатынас арқылы анықталады:
Фибоначчи сандары 0, 1, 1, 2, 3, 5, 8, , сандар тізбегінің төмендегі теңдік арқылы анықталуы:
Әдетте, рекурсивті бағдарламманы талдау барысында екі сұрақ туындайды:
а. Неге бағдарламма өз жұмысын аяқтайды?
б.Егер де жұмысын аяқтаған кезде ол неге дұрыс жұмыс істейді?
(б) үшін шақырылып отырған бір атты бағдарламма дұрыс жұмыс атқаратындығын болжап бағдарламманың (рекурсивті шақыруы бар) дұрыс жұмыс істейтіндігін тексеру ғана жеткілікті. Негізінде, бұл жағдайда рекурсивті шақырылып отырған бағдарламма тізбегінде барлық бағдарламма дұрыс жұмыс атқарады (тібек соңынан басына қарай жүретіндігіне көз жеткіземіз).
(а)- ны дәлелдеу үшін әдетте әрбір рекурсивті шақыруымен қандайда бір параметрдің мағынасы өзгеретіндігін тексереді және бұл шексіз болуы мүмкін емес. Итерацияның математикалық моделі жиынтық айнымалы бағдарламаларда бірнеше қайталанғантүрлендіруге (кескін) алып келеді. Бағдарламалық итерацияны жүзеге асырылуы әдетте денесі өзгеретін кейбір цикл болып табылады.
Мысал ретінде санның басқа да анықтамаларымен сәйкес факториалды есептеу сызбасын қарастыруға болады. Бағдарламманы жазу барысында сәйкесінше екі шамалы бүтін типпен жұмыс жасау керек : счетчик ролін атқаратын және 1- ден - ға дейін өзгеретін санмен, және шамада 1-ден -ға дейін сандардың көбейтіндісі жиналады.
Бұл жағдайда кеңістік , бұл кеңістікте бастапқы нүкте ретінде нүктесін (1,1) алайық (сәйкес келетін ), ал түрлендіру мына түрге ие болады T=(i,k)=(i+k,k*i). Бұл жағдайда, мысалы, 3 санын факториалды есептеуді қамтамасыз ететін үш мәрте түрлендіруді қолдануын аламыз Т(Т(Т((1,1)))=Т(Т(2,1))=Т(3,2)=6.
Рекурсия және итерация бір-бірін алмастыра алады, яғни рекурсиялық арқылы жасалған кез-келген программа итерация арқылы көрсете аламыз және керісінше.
Мысал : Жолдың ең ұзын сөзін анықтаңыз. Жол программада беріледі.
Бағдарлама мәтіні
package triangle_figure;
importjava.util.*;
publicclass Arifmetic_8 {
publicstaticvoid main(String[] args) {
classLongestWord{
String str = "Жолдың ең ұзын сөзін анықтайтын алгоритм";
String stringArray[] = str.split("\\s");
public String compare(String st1, String st2) {
if (st1.length() > st2.length()) {
return st1;
} else {
return st2;
}
}
LongestWord() {
String word = "";
for (int i = 0; i < stringArray.length; i++) {
if (i == 0) {
word = stringArray[0];
}
word = compare(word, stringArray[i]);
}
System.out.println("Longest word = " + word);
}
}
}}
Мысал циклды қолданбай n және m аралығындағы сандардың қосындысын есептеңіз.
Бағдарлама мәтіні
package triangle_figure;
import java.util.Scanner;
publicclass Arifmetics_2 {
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
System.out.println("m енгізіңіз");
int m = scan.nextInt();
System.out.println("n енгізіңіз");
int n = scan.nextInt();
System.out.println( m + " нен " + n + "ге дейінгі сандардың қосындысы = " + sum(m, n));
}
staticint sum(float m, float n) {
float sumM = 0;
if (m > 1) {
sumM = m / 2 * (m - 1);
}
float sumN = (1 + n) / 2 * n;
return (int) (sumN - sumM);
}
}
Тапсырмалар
1. Итерация мен рекурсияны қолданбай енгізілген санның факториалын есептейтін бағдарлама құрыңыз (күрделігі
Нұсқау. Факториал өте тез өсетін функция болғандықтан, алжиыны – шектеулі, int өлшем бірлігімен жұмыс істейтін кез-келген бағдарлама аса үлкен емес сандардың факториалын есептей алатындығын ескеріңіз.
2. Көбейту амалын қолданбай екі натурал санның көбейтіндісін есептейтін бағдарлама құр.
3. Көбейту амалын қолданбай екі натурал санның көбейтіндісін есептейтін және логарифмдік жағынан күрделі бағдарлама құр.
Нұсқау. Логарифмдік уақыт аралығында квадрат матрица дәрежеге келтіріледі.
4. Көбейту кестесін басын шығарыңыз.
5. a және b сандарының ең үлкен ортақ бөлгішін анықтаңыз.
6. Қолданушы енгізген сандардың квадратын есептейтін бағдарлама құрыңыз (System.in.read() функциясын қолданыңыз).
7. Жұлдызшалардан құралған ('*') және боялған ромбтың суретін шығарыңыз. System.out.print() әдісін қолданыңыз
8. Жолда бос орындарды есептейтін бағдарлама құрыңыз.
9. Экранға сіз өмір сүрген сағат санын көрсететін бағдарлама құрыңыз.
7 практикалық жұмыс. Формальды тілдердің синтаксистық құрамының алгебралық құрылымы
Рекурсиялы алгоритм өз-өзін шақырады.
Мысал Санның факториалын есептейтін рекурсивты бағдарламаны құрыңыз.
Бағдарлама мәтіні
package kz;
import java.util.Scanner;
public class Fact {
public static void main(String[] args) {
Scanner Scan=new Scanner(System.in);
int n, i, fac;
System.out.println("Vvedite n");
n = Scan.nextInt();
i = k = 1;
while (i <= n) {
k *= i;
i += 1;
}
System.out.println("" + n + "! = " + k);
}
}
Мысал Фибоначчи санын анықтайтын бағдарламаны құрыңыз.
Бағдарлама мәтіні
public class FibR {
static int fib(int x) {
return (x > 1) ? fib(x-2) + fib(x-1) : (x == 1) ? 1 : 0;
}
public static void main(String[] args) throws Exception {
int n;
Scanner scan = new Scanner(System.in);
System.out.print("n енгізіңіз -> ");
System.out.print ("fib(" + n + ") = " + fib(n));
}
}
Java тілінде циклдық оператордың үш түрі бар: while, do-while және for. Бірінші түрі цикл денесін нөл немес одан да көп жағдайда орындау керек болғанда қолданады, екінші түрі цикл денесін кем деген де бір рет орындалу керек болған жағдайда қолданылады.Үшінші түрі әмбебап болып табылады және кез-келген жағдайда қолданылады. Циклдық операторларды қолдану барысында қосымша break және continue құралдары қолданылады. Вreak циклдың жұмысын тоқтатады, ал continue ағымдағы итерацияның белгілі бір операторларының орындалуын қажет етпей келесі итерацияның орындалуын қамтамасыз етеді. Javaтілінде goto операторы қолданылмайды.
Мысал Енгізілген санның факториалын есептейтін бағдарлама құрыңыз.
Бағдарлама мәтіні
import java.util.Scanner;
public class factorial {
public static void main(String[] args) throws Exception {
int n, i, k;
Scanner scan = new Scanner(System.in);
System.out.print("n енгізіңіз -> ");
n= scan.nextInt();
i = k = 1;
while (i <= n) {
k *= i;
i += 1;
}
System.out.println("" + n + "! = " + k);
}
}
while конструкциясын do-while алмастыруға болады:
do {
k *= i;
i += 1;
} while (i <= n);
for циклын қолданған тиімді:
for (i = k = 1; i <= n; i++)
k *= i;
System.out.print("" + n + "! = " + k);
Тапсырмалар
1. Итерация мен рекурсияны қолданбай 1-ден клавиатурадан енгізілген натурал санына дейінгі сандардың квадраттарының қосындысын есептейтін бағдарлама құр.
2. Пернетақтадан енгізілген сан жай сан болса Yes басқа жағдайда No шығаратын бағдарлама құрыңыз.
3. f= 10! үш әдіспен шығарыңыз (while/for/do-while циклдық операторларын қолдану арқылы)
4. Логикалық t айнымалысына true немесе false екендігін анықтаңыз, сәйкесінше k саны 3 санының дәрежесі боласа.
5. Экранға жұлдызшадан тұратын боялған тіктөртбұрыш шығарыңыз ('*'). System.out.print() әдісін қолданыңыз.
6. Экранға жұлдызшадан тұратын боялмаған тіктөртбұрыш шығарыңыз ('*'). System.out.print() әдісін қолданыңыз.
8 практикалық жұмыс. Бағдарламалау тілдерінің семантикалық анализ технологиясы
бағдараманың енгізу берілімдері (n параметріне) қатысты тиімді болуы қажет.
Бағдарлама барысында нақты тәуелділігін анықтау – күрделі мәселе болып табылады. Осыған байланысты осы функцияның асимптотикалық бағалауымен шектеледі, яғни параметрінің үлкен мәндеріне қатысты қолданылуын айтады. Кейде асимптотикалық бағалауға екі функция арасындағы (<<О артық>> деп оқылады) қатынасы қолданылады.
Мысал ретінде санның факториалын анықтайтын бағдарламаны қарастырайық. Циклдың қайталану саны (итерациясы) –ге тең. Осы жағдайда бағдарлама (немесе алгоритм) сызықты түрде күрделі деп айтуға болады ( немесе күрделілігі).
Факториалды итерацияны да, рекурсияны на қолданбай аз уақытта есептеуге болады. Оның күрделілігі болады. Осыған сәйкес Фибоначчи сандарын да есептеуге болады. Оның күрделілігі экспоненциалды болып табылады және тең болады.
Мысал Сызықтық күрделілікті пайдаланып Фибоначчидың санын басып шығаратын бағдарлама құрыңыз.
Бағдарлама мәтіні
package kz;
import java.util.Scanner;
public class FibIv1 {
public static void main(String[] args) throws Exception {
Scanner Scan=new Scanner(System.in);
System.out.println("n енгізіңіз -> ");
int n = Scan.nextInt();
System.out.println("f(" + n + ")");
if (n < 0) {
System.out.println(" анықталмаған\n");
} else if (n < 2) {
System.out.println(" = " + n);
} else {
long i = 0;
long j = 1;
long k;
int m = n;
while (--m > 0) {
k = j;
j += i;
i = k;
}
System.out.println(" = " + j);
}
Мысал Логарифмдік күрделілікті пайдалана Фибоначчидың санын басып шығаратын бағдарлама құрыңыз.
Бағдарлама мәтіні
package kz;
import java.util.Scanner;
public class FibIv3 {
public static void main(String[] args)throws Exception {
Scanner Scan=new Scanner(System.in);
System.out.println("n енгізіңіз -> ");
int n = Scan.nextInt();
System.out.println("f(" + n + ")");
if (n < 0) {
System.out.println(" анықталмаған");
} else if (n < 2) {
System.out.println(" = " + n);
} else {
Matrix b = new Matrix(1, 0, 0, 1);
Matrix c = new Matrix(1, 1, 1, 0);
while (n>0) {
if ((n&1) == 0) {
n >>>= 1; c.square();
} else {
n -= 1; b.mul(c);
}
}
System.out.println(" = " + b.fib());
}
}
}
class Matrix {
private long a, b, c, d;
Фибоначчидың онмиллиондық санын осы және одан жоғары келтірілген бағдарлама арқылы есептейтін болсақ, онда есептеуге жұмсалған уақыттың арасындағы айырмашылықты бақылауға болады. Өкінішке орай нәтижесі қате болады, себебі long типінің шектелуіне байланысты.
Бір есептің , , және күрделілігін қолданатын төрт алгоритмдік шешуін қарастырайық. Алгоритмдердің орындалуына жұмсалатын уақыт кесте 2 көрсетілген.
6-кесте – Алгоритмнің орындалу уақытының салыстырмалы кестесі
Алгоритмнің күрделілігі
|
|
|
|
|
.
|
.
|
1.2 сек.
|
|
|
мин
|
16.6 сағ.
|
|
|
сағ
|
1902 жыл
|
|
.
|
жыл
|
10300000 жыл
|
Java тілі басқа тілдер сияқты әртүрлі типті жиым элементтерімен жұмыс істеуге мүмкіндік береді. Жиым (array) бірнеше бір типті мәліметтерді сақтауға, мысалы, 50 бүтін санды, 100 кітаптың атауын сақтау керек боса.
Мысал Клавиатурадан енгізілетін бос емес бүтін сандар жиымын басып шығаратын және оның бірінші және соңғы элементерінің орнын ауыстырып т.с.с. басып шығаратын бағдарлама құрыңыз.
Бағдарлама мәтіні
package kz;
import java.util.Scanner;
public class InvArr {
public static void main(String[] args)throws Exception {
Scanner Scan=new Scanner(System.in);
System.out.println("n жиымының ұзындығын енгізіңіз -> ");
int n, i, a[];
n = Scan.nextInt();
a = new int[n];
for (i=0; i
System.out.println ("aенгізіңіз[" + i + "] -> ");
a[i] =Scan.nextInt();
}
System.out.println("Енгізілген a жиымы =");
for (i=0; i
System.out.println(" " + a[i]);
System.out.println("\Орын ауыстырылған a жиымы =");
for (i=0; i
int j = a[i]; a[i] = a[n-1-i]; a[n-1-i] = j;
}
for (i=0; i
System.out.println(" " + a[i]);
System.out.println("\n");
}
}
Көріп отырғанымыздай жиымды ұйымдастыру үшін ең алдымен оның элементтеріне new опреаторы арқылы орын белгілеп аламыз. Бастапқыда оның мәні 0-ге тең болады.
3, 7 және 11 бүтін сандарынан тұратын жиымды ұйымдастыру үшін:
int a[] = {3, 7, 11};
Жиым элементтерінің номері 0-ден басталады, ал элементін a[i] белгілейді. Орын ауыстыру алгоритмі жиымның ортасына жеткенде тоқтайды.
Мысал Бос емес жиымның максимал элементін басып шығаратын бағдарлама құрыңыз.
Бағдарлама мәтіні
package kz;
import java.util.Scanner;
public class MaxArr {
public static void main(String[] args) {
Scanner Scan=new Scanner(System.in);
int n, i, a[];
n = Scan.nextInt();
System.out.println("n жиымының ұзындығын енгізіңіз-> ");
a = new int[n];
for (i=0; i
System.out.println("a енгізіңіз[" + i + "] -> ");
int max = a[0];
for (i=1; i
if (a[i] > max)
max = a[i];
System.out.println("Жиымның максимал элементі = " + max);
}
}
Мысал Бос емес жиымның максимал элементтерінің санын басып шығаратын және циклді бір рет қолданатын бағдарлама құрыңыз.
Бағдарлама мәтіні
package kz;
import java.util.Scanner;
public class MaxArr {
public static void main(String[] args) {
Scanner Scan=new Scanner(System.in);
int n, i, a[];
n = Scan.nextInt();
System.out.println("n жиымының ұзындығын енгізіңіз-> ");
a = new int[n];
for (i=0; i
System.out.println("a енгізіңіз[" + i + "] -> ");
int max = a[0];
for (i=1; i
if (a[i] > max)
max = a[i];
System.out.println("Жиымның максимал элементі= " + max);
}
}
Integer.MIN_VALUE жүйесі max айнымалысына нөлдік орында тұрған элементтің мәнін меншіктеуге мүмкіндік бермейді. Көріп отырғанымыздай бағдарламада жиымды қолданбауға да болады. Жиымның орнына бүтін a айнымалысын қолданып, a[i] –ды a ауыстырсақ, онда бағдарлама жұмыс істейді.
Мысал Клавиатурадан енгізілген бос емес жиынның элементтерін өсу ретімен сұрыптаңыз.
Бағдарлама мәтіні
package kz;
import java.util.Scanner;
public class Sort {
private static void sort(int[] a, int n) {
int i, j, t;
for (i=0; i
for (j=n-1; j>i; j-=1)
if (a[j] < a[j-1]) {
t=a[j]; a[j]=a[j-1]; a[j-1]=t;
}
}
public static void main(String[] args) throws Exception {
Scanner Scan=new Scanner(System.in);
System.out.println("n жиымыныңұзындығыненгізіңіз -> ");
int n, i, a[];
n = Scan.nextInt();
a = new int[n];
for (i=0; i
a[i] = Scan.nextInt();
System.out.println("a енгізіңіз[" + i + "] -> ");
System.out.println("Бастапқыжиым\n");
for (i=0; i
System.out.println(" " + a[i]);
System.out.println("\n");
sort(a, n);
System.out.println("Сұрыпталғанжиым\n");
for (i=0; i
System.out.println(" " + a[i]);
System.out.println("\n");
}
}
Достарыңызбен бөлісу: |