53. Динамикалық бағдарламалау. Сараң алгоритмдер.
Деректердің динамикалық структурасы өлшемі айнымалы, жадыдан алдын ала орын босатылмайтын, программаны орындаған сайын мәндері, мәндерінің саны өзгеріп отыратын деректер.
Динамикалық деректердің элементтерінің арасында байланыс орнату үшін көрсеткіштер қолданылады. Олар әр динамикалық элементтің жадыдағы адресін көрсетіп тұрады. Динамикалық деректер структурасының элементтері екі өрістен тұрады:
1. деректер өрісі - ақпараттық өріс, ол массив, жазу, вектор т.б. бола алады.
2. байланыс өрісі - белгілі бір элементті басқа структураның элементімен байланыстыратын бір немесе бірнеше көрсеткіштер бола алады.
Деректердің байланыстырылып көрінуінің жетістігі – структураларды барынша өзгерту мүмкіндігінде:
структуралардың мөлшері машиналық жадының қолдануға болатын көлемімен шектеледі;
структура элементтері логикалық тізбегін өзгерткенде жадыдағы деректерді ауыстырудың қажеті жоқ, оның орнына көрсеткіштер жылжиды, түзетіледі.
Деректердің байланыстырылып көрінуінің кемшілігі:
көрсеткіштермен жұмыс жасау үшін программисттің квалификациясы жоғары болуы керек;
байланыс қрістеріне қосымша жады бөлінеді;
уақытты үнемдемейді;
Сызықты байланыстырылған тізімдер.
Тізім дегеніміз элементтерінің саны өзгермелі, енгізу, шығару операцияларын қолдануға болатын реттелген жиын.
Элементтерінің арасында көршілік қатынасты бейнелейтін тізімді сызықты тізім дейді.
Бірбайланысты тізімді өңдеу тиімді емес, себебі қарама қарсы бағытта қозғалу мүмкіндігі жоқ. Ондай мүмкіндіктер екі байланысты тізімдерде бар, оларда екі көрсеткіш болады, біреуі алдыңғы біреуі келесі элементті көрсетіп тұрады. Сызықты байланысты тізімде NEXT өрісі бар – ол тізімдегі келесі элементті көрсеткіш деп аталады. PREV өрісі бар – ол тізімдегі алдыңғы элементті көрсеткіш деп аталады. Тізімдегі соңғы элементті көрсеткіш те қолданылады, ол NIL болады. Екі көрсеткішті анықтау, оларды жылжыту арқылы элементтерді өңдеу көп уақытты алады, бірақ тізімге қолданылатын кейбір операцияларға оларды қолдану тиімді.
Сызықты емес тармақталған тізімдер.
Сызықты емес тармақталған тізімдер деп элементтері тізім болатын тізімдерді айтады. Егер екі байланысты тізімде көрсеткіштердің біреуі басқа көрсеткіш ретіне кері ретпен берілсе, ондай тізім сызықты тізім болады, егер көрсеткіштің біреуі кез келген ретпен берілсе, онда тізім сызықты емес тізім деп аталады.
Тармақталған тізім үш ұғыммен сипатталады: реті, тереңдігі, ұзындығы.
Реті. Тізім ішінде элементтер пайда болатын тізбекпен анықталатын тізім элементіне транзитивті қатынас берілген. (x,y,z) тізімінде х атомы у-тің алдыңғысы, ал у атомы z-тің алдыңғысы, сонда х атомы z-тің алдыңғысы болатыны білінеді. Берілген тізім (y,z,x) тізіміне эквивалентті болмайды.
Тізімді графикалық схема көмегімен бергенде тізім реті горизонтальды стрелкамен анықталады: элементтен стрелка шығып тұрса,онда ол көрсетіп тұрған элементтің алдыңғысы екенін білдіреді.
Тереңдігі. Тізім ішіне сиятын элементтердің максималды деңгейі тереңдігін білдіреді. Тізім ішінде ішкі тізім болса, олар кірістірілген тізімдер болады және дөңгелек жақшаға алынады.
18.С++ тілінде return, break, және continue операторларының қолданылуы.
Басқаруды беру операторы:
С++ тілінде программа операторларының бекітілген табиғи орындалу реттілігін өзгертетін төрт оператор бар. Олар:
- goto – шартсыз көшу операторы;
- break – циклден шығу операторы;
- continue – циклдің келесi итерациясына көшу операторы;
- return – функциядан негізгі программаға қайту оралу операторы.
break операторы
break операторы цикл тұлғасынан немесе if, switch операторларының iшiнен программаның одан кейінгі бөлігіне бірден көшуді жүзеге асыру үшін қолданылады. break операторы switch, do, for, while операторларының орындалуын тоқтатуды қамтамасыз етеді. break операторы орындалғаннан кейін басқару тоқтатылғаннан кейінгі операторға беріледі.
Мысал. Программа нақты х аргументі бар синус функциясының мəнін оны шексіз қатарға жіктеу арқылы берілген eps дəлдігімен есептейдi.
sin х = x - х3/3! + х5/5! - х7/7! +...
Қажетті дəлдікке |Rn| < eps болғанда қол жеткізуге болады, мұндағы Rn – қатардың қалдық мүшесі, оны осы қатардың біртіндеп қосылып отыратын кезекті келесі мүшесімен алмастыруға болады.
#include #
include
int main(){
const int MaxIter = 500; // итерация санының
// шектеуіші
double x, eps;
cout << "\nАргумент пен дəлдікті енгізіңіз: ";
cin >> x >> eps;
bool ok = true; // есептеу сəттілігі көрсеткіші
double y = x, ch = x; // қатар қосындысы жəне
// оның алғашқы мүшесі
for (int n = 0; fabs(ch) > eps; n++) {
ch *= - x * x /(2 * n + 2)/(2 * n + 3); // қатардың кезекті мүшесі
y += ch; if (n > MaxIter){
ok = false; break; }
}
if (ok) cout << "\nФункцияның мəні: " << y;
else cout << "\nҚатар жинақталмайды!"; return 0;
}
for операторын қолданудың басқа формасы болып шексіз цикл саналады. Мұндай циклды ұйымдастыру үшін бос шарт өрнегін қолдануға болады, ал циклдан шығу үшін әдетте қосымша шарттар мен break операторы қолданылады. Мысалы:
for (;;)
{ ...
... break;
...
}
Кейбір кезде цикл орындалу шартын тексермей цикл денесінен шығу қажет болады. Ол үшін break операторын қолданады, бұл оператор барлық операторларды жіберіп (сонымен қатар жабатын бейнелік жақшаны да) циклдан шығуды орындайды.
3.5 мысалы – 60-тан аспайтын y мәндерін экранға шығарыңыз.
Достарыңызбен бөлісу: |