прог. Программалау жне программа, программалау тілдері. Программалау тілдеріні трлері. Программаны тзету (отладка), тестілеу
Скачать 102.98 Kb.
|
Арттыру/кеміту операцияларын өрнек ішінде де орындау мүмкіндігі бар. Мысалы: sum=a+b++;/*алдымен a,b қосылады, сонан соң b 1-ге артады */ sum=a+ ++b;/*алдымен b 1-ге артады, сосын барып a,b қосылады */ Арттыру/кеміту операцияларының приоритеттері өте жоғары, тек жақша ішіндегі операциялардың приоритеті олардан жоғары болады. Құрама оператор бірнеше операторды жүйелік жақшаға алып біріктіру үшін қолданылады. Ол шартты жəне циклдік операторларда жиі қолданылады. Функция — это последовательность операций и других функций, к которой можно обращаться из любой части кода. Например стандартные функции max() и min(). Если посмотреть на языки программирования в общем, то помимо функций есть и процедуры. Они отличаются от функций тем, что не возвращают никакого значения. Т.е к ним нельзя приравнивать переменные. В C++ таких различий нет, так что мы будем называть процедуры функциями. Ішкі бағдарлама - көлемі жағынан орташа болып келетін бағдарламаларды (бірнеше мың жолды код) құрастырғанда құрылымды бағдарламалау қолданылады. Бағдарламаның құрылымы шығарылып жатқан есептің құрылымын көрсету керек, сонда бағдарлама мәтінінен есепті шығару алгоритмі түсінікті болады. Ол үшін қарапайым операторлар жеткіліксіз, алгоритмнің нақты құрылымын дәлірек көрсететін құралдар қажет. Сондықтан бағдарламалауға жаңа ұғым – ішкі бағдарламалар енгізілді Қазіргі кезде программалау технологиясы жоғарыдан төмен қарай орындалатын әрекеттерді біртіндеп айқындау тәсілін кең пайдаланады. Осы технологияға сәйкес күрделі есептің белгілі бір бөлігі тәуелсіз қарастыруға болатын блок – қосалқы программа ретінде құрылуы мүмкін сондықтан ішкі программаның ролі орасан зор. Белгілі бір атпен жеке программа түрінде бөлек жазылған, қажет кезінде оны қайталанып отыруға болатын негізгі программаның арнайы бөлігі ішкі прорамма деп аталады. Ішкі (көмекші) программаның екі түрі бар. Паскальда біріншісін процедура деп, екіншісін функция деп атайды. Көмекші программа толық программа түрінде құрылып, негізгі программаның VAR бөлімінен соң орналастырады. Олардың саны бірнеше болуы да мүмкін. Белгілі бір әрекеттерді орындау мақсатында алдын ала бекітілген аты бойынша шақырылып орындалатын прорамманың тәуелсіз бөлігі процедура деп аталады. Процедурада жұмыс нәтижесі бірнеше мәнге ие болуы мүмкін. Процедура тақырыбы көмекші программаны анықтаушы PROCEDURE қызметші сөзінен басталып, оның оң жағына процедураның атауы енгізіледі. Одан әрі жай жақшалар ішінде формальды параметрлер сипатталады да, тақырыптың соңына нүктелі үтір символы қойылады. Ол – процедура тақырыбын өзінің басқа бөлімдерінен ажырату белгісі. Тақырыптан соң негізгі программадағы сияқты сипаттау бөлімдері енгізілуі мүмкін. Бұдан әрі BEGIN, END қызметші сөздерімен шектелген операторлар бөлімі жазылады да, END-тен соң нүктелі үтір таңбасы қойылады: Бір ғана функция мәнін есептейтін көмекші программаны Паскальда функция деп атайды. Функция тақырыбының процедура тақырыбынан айырмашылықтары: - тізім соңындағы жабу жақшасынан соң қос нүкте қойылып, одан әрі функция типі жазылады; - формальды параметрлер – нақты параметрлер меншіктелетін параметр-мәндер. Мұнда анықталушы функция (өрнек) мәнін есептеу операторының жазылуында да өзгешелік бар: өрнек меншіктелетін айнымалының атауы – function тақырыбындағы атаумен бірдей болуы тиіс. Негізгі программаға енгізілетін функцияны шақыру командасы да жеке оператор түрінде емес, sin, cos, т.б. стандартты функциялар сияқты, өрнекке енгізіліп жазылады. Ішкі бағдарламалар түрлері Қандай да бір алгоритм бойынша жұмыс жасайтын және өзіне негізгі бағдарламаның кез келген бөлігінен қатысуға болатын бағдарламаның жекелеме бөлігін ішкі бағдарлама деп атайды. Ішкі бағдарламалар негізгі бағдарламының ішіндегі кіретін және шығатын орындары бар тұйықталған бөлігі болып табылады. Негізгі бағдарлама мен ішкі бағдарламадағы айнымалылар бір-біріне бағынышты емес. Ішкі бағдарламаның екі түрі болады – процедуралар және функциялар. Олардың айырмашылығы: процедура белгілі бір операторлар тобын орындаса, функция осыған қоса қандай да бір нәтижені есептеп, оны негізгі бағдарламаға қайта жібереді. Бұл нәтиженің өзіне тән типі болады. Си++ бағдарламалау тілінде «процедура» деген ұғым жоқ, онда тек қана функция қолданылады. Егер функция ешбір нәтиже есептемесе, онда ол «ешқандай» (void) типін қайтарады. Кез келген бағдарламада бірнеше процедура немесе функция қолданылуы мүмкін. Процедура мен функция сипаттау бөлігінде айнымалылар бөлігінен кейін жарияланады. Бағдарламаның орындалуы негізгі бағдарламаның операторларынан басталады. Қажет жағдайда ішкі бағдарлама шақырылып, оның операторлары орындалады. Содан соң басқару қайтадан негізгі бағдарламаға беріліп, бағдарламаның орындалуы жалғасады. Ішкі бағдарлама негізгі бағдарлама сияқты құрылады, яғни бағдарлама атауынан, операторлар бөлігінен және аяқталуынан құрылады. Параметрдің екі түрі болады: формальды шын мәніндегі параметрлер Шын мәніндегі параметр деп процедураны шақырар кездегі негізгі бағдарламадағы параметрлерді айтамыз. Ал формальды параметрлер ішкі бағдарламаның атауынан кейін көрсетіледі. Формальды параметрлер тізімінде айнымалылар аталып, олардың типтері көрсетіледі. Формальды параметрлерді екіге бөлуге болады: параметр-аргументтер, яғни процедура үшін кіретін мәліметтер; параметр-нәтижелер, осы параметр-нәтижелер арқылы процедураның жұмысының нәтижесін негізгі бағдарламаға қайтарады. Параметр - нәтижелер тізімдерінің алдында var сөзі жазылады. (Паскаль). Процедуралар Процедура – белгілі ретпен іске асырылатын іс-әрекеттер жиыны, жалпы бағдарламаның бір бөлігі.
Шартты оператор. Шартты оператордың орындалу схемасы (3.1 сурет) мен жалпы жазылу түрі мынадай: if (шарт) 1-оператор; else 2-оператор; Мұнда жақшадағы шарт түріндегі өрнек ақи- қат болса, 1-оператор орындалады, əйтпесе 2-оператор атқарылады. Операторлар қара-пайым немесе құрама болып жазыла береді. if (шарт) 1-оператор; Кейде қабаттасқан шартты операторлар кездеседі (3.3 сурет), мысалы: if (1-шарт) 1-оператор; else if (2-шарт) 2-оператор; else 3-оператор; Мұнда егер 1-шарт ақиқат болса, 1-оператор орындалады, егер 1-шарт жалған болып, 2-шарт ақиқат болса, 2-оператор орындалады, ал 1-шарт жəне 2-шарт жалған болса, 3-оператор атқарылады. Ондағы кез келген else түйінді cөзі (keyword) оның алдында ең жақын тұрған if операторына қатысты болып саналады. Мысалы, берілген х, у – екі санның үлкенін анықтау үшін жазылған шартты операторды былай жазуға болады: if (x>y) max=x; else max=y; Ал х, y, z сияқты үш санның үлкенін табу үшін, қабаттасқан шартты операторлар жазы-лады (3.4 сурет). if (x>y) {if (x>z) max=x; else max=z;} else if (y>z) max=y; else max=z; Логикалық ЖƏНЕ операциясын пайдалана оты-рып, бұл есепті мынадай түрде де жаза аламыз. if ((x>y)&&(x>z)) max=x; else if ((y>z)&&(y>x)) max=y; else max=z; Таңдау операторы Switch көп нұсқалы таңдау операторы Программада кездесетін бірнеше нұсқаның бірін таңдап алу керек болған жағдайда, switch ауыстырғыш операторы қолданылады. Оператордың орындалу схемасы төмендегі 3.6 суретте келтірілген. Оның жалпы жазылуы: switch <бүтін типті өрнек>; { case белгі1: операторлар; case белгі2: операторлар; ................ [default: операторлар;] } #include int main() { int m; cout<<" m- ді енгіз :"; cin>>m; switch(m); { case 1: cout<<"Yanvar'"; break; case 2: cout<<"Fevral'"; break; case 3: cout<<"Mart"; break; case 4: cout<<"April"; break; case 5: cout<<"May"; break; case 6: cout<<"June"; break; case 7: cout<<"Jule"; break; case 8: cout<<"Avgust"; break; case 9: cout<<"Sentyabr'"; break; case 10: cout<<"Oktybr'"; break; case 11: cout<<"November"; break; case 12: cout<<"Desember"; break; default: cout("Сан 1..12диапазонындаболуыкерек") } return 0; } Switch орындалуы кезінде цикл аяқталмай-ақ одан шығып, қалған оператор-ларды аттап өтіп, осы цикл параметрінің келесі мəніне көшу үшін continue операторықолданылады, яғнициклдіңкелесіитерациясына – қадамынабасынанбастапауысужүзегеасырылады. Мысал: #include main() { int i; printf("\nБүтін сан енгіз: )"; scanf(“%i”,&i); switch(i) {case 1: printf("\nСан бірге тең!"); case 2: printf("\n2*2=%d",i*i); case 3: printf("\n3*3=%d",i*i);break; case 4: printf("\n Сан төртке тең!"; default: printf("\nАяқталды"; }}
For операторы айнымалы ретінде берілген цикл параметрінің алғашқы, соңғы мәні мен өзгеру қадамы белгілі болғанда, соған сәйкес бір немесе бірнеше операторларды қайталап орындау кезінде қолданылады. Бұл оператор параметрлі цикл операторы немесе арифметикалық цикл деп аталады. While,_Do_..._while_цикл_операторы'>While, Do ... while цикл операторы Орындалу саны алдын ала белгісіз болатын циклдер құру кезінде шарттары алдын ала немесе соңынан тексерілетін екі цикл түрі бар. Оның жазылуы: while (шарт-өрнек) оператор; Мұнда шарт ретінде шартты өрнек немесе кез келген типтегі өрнек пайдаланылуы мүмкін. Оператор қарапайым немесе құрама болуы мүмкін. Ол құрама оператор болса, онда операторлар жиыны жүйелі жақшаға алынып жазылады. While операторы орындалғанда, алдымен жақша ішіндегі өрнек есептеліп тексеріледі. Егер өрнек мәні ақиқат болса немесе жалпы жағдайда 0-ге тең болмаса, онда оператор атқарылады. Содан соң жақшадағы өрнек тағы да есептеледі. Егер өрнек мәні жалған болса (немесе жалпы жағдайда 0-ге тең болса), онда while цикл операторы өз жұмысын аяқтайды. Do ... while цикл операторы Шарты соңынан тексерілетін do … while циклінің оператордың жалпы жазылу түрі: do { 1-оператор; 2-оператор; … … … n-оператор; } while (өрнек); Цикл тұлғасы ретінде қарапайым немесе құрама оператор қолданылуы мүмкін. Жақшадағы өрнек цикл тұлғасынан кейін тексеріледі. Сондықтан do while цикл тұлғасы ең болмағанда бір рет орындалады. Цикл тұлғасынан кейін жазылған өрнек ақиқат болса (немесе жалған жағдайда ол 0-ге тең болмаса), цикл тұлғасы қайтадан орындалады. Ал өрнек жалған болса (немесе 0-ге тең болса), цикл аяқталады. #include int main() {inti; intsum = 0; for (i = 1; i<= 1000; i++) { sum = sum + i; } cout<< "Сумма чисел от 1 до 1000 = " < 7. Функция. Оның программада қолдану ерекшеліктері. Функцияны сипаттау және анықтау. Прототип. Рекурсия. Рекурсия механизмі. Рекурсивтік функция. Оны қолданудың артықшылығы. Функцияны сипаттау (Описание функции; function declaration) — міндетгі анықтайтын жоғары деңгейдегі программалау тілінің конструкциясы. Функцияға атау беруге (егер қажет болса), оның формальдық параметрлерін көрсетуге және алгоритмнің жүзеге асырылатын міндетін анықтауға қызмет етеді. Функцияны сипаттау программадағы сипаттамалар бөлімінде (мысалы, Паскальда) немесе программалық модуль түрінде әзірленген бас программадан (мысалы, Фортранда) кейін орналасады. Функцияны сипаттау формасы нақтылы тілдің синтаксисімен тағайындалады. Әдетте, Функциялық сипаттау денесі мен функцияның бас тақырыбынан тұрады. Тақырыпта функцияның атауы көрсетіледі және формальдық параметрлері көрсетілуі мүмкін. Ал міндеттің денесінде орындалатын алгоритм міндеттері программаланады. Рекурсивті алгоритм қаншалықты тиімді? Оның тиімділігін есептей аламыз ба, егер тікелей есептеу алгоритмі квадратты, кіру мәліметтерінің бөліктеуі логарифмді, барлық шешімдердің бірігуі сызықты (кіру мәліметтерінің мөлшеріне байланысты), ал әрқайсысының мөлшері бастапқының төрттен біріне тең болатын барлық кіру мәліметтері 8 бөлікке бөлінетінін білетін болсақ? Бұл есепті шеші оңай емес, оған қалай кірісу керек екендігі де түсініксіз. Дегенмен, «бөл де басқар» түріндегі алгоритмдерді талдау оңай екені анықталды, егер сіздің алгоритміңіздің қадамдары жоғарыда келтірілген жалпы түрдегі алгоритмнің қадамдарына сәйкес қойылса: тура есептеу, кіруді бөлу, бірнеше рекурсивті шақырулар саны және алынған шешімдердің біріктірілуі. Егер осы қадамдар бір-бірімен қалайша біріктірілетінін және әр қадамның күрделілігін білетін болсақ, онда «бөл де басқар» түріндегі алгоритм күрделілігін анықтау үшін келесі формуланы қолдануға болады: мұндағы DAC —DivideAndConquer алгоритмінің күрделілігі, DIR — Direct Solution алгоритмінің күрделілігі, DIV — Divide Input алгоритмінің күрделілігі, COM — CombineSolutions алгоритмінің күрделілігі. Осы жалпы формула арқылы алдындағы абзац басында қойылған сұрақ өте қарапайым болып қалады. Тек әр бөліктің белгілі күрделіліктерін формулаға қойсақ болғаны. Нәтижесінде: немесе кіші жиындар шамасы бірдей болғандықтан, одан да оңай формула: Мұндай түрдегі теңдіктер рекурренті деп аталады, өйткені функция мәні өз терминдері арқылы беріледі. Сол функцияның басқа шақыруларынан тәуелсіз, тек N-нан тәуелді болатын күрделілік үшін өрнекті тапқымыз келеді. Факториал мысалына қайтып оралсақ. Факториалды есептеу алгоритмінің барлық кезеңдерін жалпы DivideAndConquer алгоритмімен сәйкес қоялық. Енді осы сәйкестікті пайдаланып, жоғарыда келтірілген жалпы формулаға қою керек мәндерді анықтаймыз. Factorial функциясындағы тура есептеулер ешқандай әрекеттерді қажет етпейді, кіру мәліметтерін бөлу және нәтижелерді біріктіру алгоритмінің әрқайсысы тек бір әрекетті қажет етеді, ал рекурсивті шақыру бастапқы мөлшерден 1-ге кем болатын тек бір есепті шығарады. Нәтижесінде Factorial функциясын есептеу санына келесі рекурентті қатынасты аламыз: 8. Массивтерді сұрыптау алгоритмдері.Таңдау әдісі. Массивте екілік іздеу. Орын алмастыру әдісі. Орнына қою әдісі (метод вставок). Айырмашылықтары. Алгоритмдерді әдетте сандық (есептеу) және сандық емес (есептеусіз) деп бөледі. Сандық алгоритмдер сандармен математикалық есептеулер жүргізуге арналған, ал сандық емес алгоритмдер әртүрлі құрылымданған мәліметтермен жұмыс істейді. Ең маңызды есептеусіз алгоритмдердің бірі болып сұрыптау және іздеу табылады. Объектілердің берілген тізбегін қандай да бір анықталған ретпен қайта топтастыратын үрдісті сұрыптау деп атайды. Сұрыптаудың мақсаты – сұрыпталған тізбекте қажетті элементтерді іздестіруді жеңілдету. Сұрыптау алгоритмдері мәліметтер құрылымын таңдауға тәуелді, сондықтан сұрыптау әдістерін екі түрге бөледі: ішкі сұрыптау алгоритмдері(массивтерді сұрыптау) және сыртқы сұрыптау алгоритмдері(файлдарды сұрыптау). Сандық емес алгоритмдер үшін жазбалар массивтерін сұрыптау тән. Кілттік өріс – сызықтық тәртіптегі қатынаспен анықталатындай мәлімет типімен берілген өріс. Егер бірдей кілтті элементтердің салыстырмалы реті сұрыптауда өзгермесе, онда сұрыптау әдісі орнықты деп аталады. Ішкі сұрыптаулар алгоритмдері – бұл ішкі жадтағы мәліметтерді сұрыптау алгоритмдері, бұл жағдайда қолайлы құрылым – массив. Массивтерді сұрыптау алгоритмдеріне қойылатын басты талап – жадтың экономды пайдаланылуы. Элементтерді in situ (яғни элементтерді қайта топтастыруды жадтың сол жерінде жүргізеді) сұрыптайтын қарапайым сұрыптау алгоритмдері бар: кірулермен сұрыптау, таңдаумен сұрыптау, алмасумен сұрыптау («көбікше» әдісі). Сұрыптаудың жетілдірілген қарапайым әдістері: кемімелі өсімшелі кіру бойынша сұрыптау (Шелл сұрыптауы), ағаш көмегімен сұрыптау (пирамидалық сұрыптау), бөліктеу арқылы сұрыптау (жылдам сұрыптау). Кірулермен сұрыптау – элементтер шартты түрде дайын тізбекке a1,…, ai-1 және кіретін тізбекке ai,…, an бөлінеді, содан кейін әрбір қадамда, i=2 бастап және i-ді бірлікке арттыра отырып, кіретін тізбектің i-ші элементін алып дайын тізбектің тиісті орнына кіргізе береді. Таңдаумен сұрыптау – ең кіші кілтті элемент таңдалады, содан кейін ол бірінші a1 элементімен орын ауыстырылады. Алмасумен сұрыптау – барлық элементтер қажетінше сұрыпталғанша көрші элементтер өзара салыстырылып және орын ауыстырылады. Қарапайым таңдаумен сұрыптау әдісі қарапайым әдістердің ішіндегі ең жақсысы, алмасумен сұрыптау – ең жаманы, ал жылдам сұрыптау ең тезі және ең жақсысы болып табылады. Орын ауыстырып сұрыптаудың негізгі идеясы сұрыпталған тізімге жаңа элементті қосар кезде оны кез келген орынға емес бірден қажетті орынға қою керек, сосын барлық тізімді қайтадан сұрыптау керек. Орын ауыстырып сұрыптау l өлшемді кез келген сұрыпталған тізімнің бірінші элементін оқиды. Екіэлементті сұрыпталған тізім бірэлементті тізімнің қажетті орнына алдыңғы берілген тізімнен екінші элементті қосқаннан құрылады. Енді алдыңғы берілген тізімнен сұрыпталған екіэлементті тізімге үшінші элемент қоюға болады. Бұл процесс алдыңғы берілген тізімнің барлық элементтері тізімнің кеңейтілген сұрыпталған бөлігіне қойылғанға дейін қайталана береді. Енді көпіршікті сұрыптауға өтейік. Оның негізгі принципі кіші мәндерді тізім басына ығыстыру, ал үлкен мәндерді төмен түсіреді. Көпіршікті сұрыптаудың көптеген әртүрлі нұсқалар бар. Бұл параграфта олардың біреуін сипаттаймз, сонымен бірге, кейбіреуі жаттығуларда қарастырылады. Көпіршікті әдіс алгоритмі тізім бойынша бірнеше рет өтеді. Әрбір өткенде көрші элементтерді салыстырады. Егер көрші элементтердің тізімі дұрыс емес болса, онда олар орын ауыстырады. Әрбір тәсіл тізім басынан басталады. Алдымен бірінші мен екінші элементтер, сосын екінші мен үшінші, содан кейін үшінші мен төртінші және т.с.с.; жұпта ретсіз тұрған элементтердің орны ауыстырылады. Тізімнің ең үлкен элементін бірінші өткенде тапқан кезде ол тізімнің соңына жеткенге дейін барлық кезекті элементтермен орын ауыстыра береді. Сондықтан екінші рет өткенде соңғы элементпен салыстыру қажет емес. Екінші рет өткенде тізімнің екінші элементі соңғы позициядан бастап екіншіге түседі. Процесті жалғастыра берсек әрбір өткен сайын ең болмағанда кезекті бір элемент өзінің орнында қалады. Бұл кезде ең кіші мәндер жоғары қарай жиналады. Егер қандай да бір өткен кезде ешқандай элементтердің орны ауыспаса, онда олардың барлығы қажетті ретпен тұр, және алгоритмнің орындалуын тоқтатуға болады. Әрбір өткенде бірден бірнеше элемент өзінің орнына жақындай түседі, тек біреуі ғана нақты орнында келеді. Көпіршіктік сүрыптау (көпіршік әдісімен сүрыптау) (Пузырьковая сортировка (сортировка методом пузырька); bublle sorting) — реттелетін жиымның көрші элементтерін тізбектік орын ауыстырудан тұратын сұрыптау тәсілі. Тоғыстыру арқылы сүрыптау (Сортировка слиянием; merge sorting) — бірінші кезеңде жазбалар тобы жедел жадта сүрыпталатын өрі бірнеше таспаға жазылатын, ал екінші кезенде реттелген топтар бірнеше таспадан бір таспаға жинақталатын сыртқы сүрыптау 9. Құрылымдық типті айнымалылар. Екі өлшемді массивтер. Матрицаны өңдеу тəсілдері. С позволяет создавать многомерные массивы. Простейшим видом многомерного массива является двумерный массив. Двумерный массив - это массив одномерных массивов. Двумерный массив объявляется следующим образом:тип имя_массива[размер второго измерения][размер первого измерения]; Следовательно, для объявления двумерного массива целых с размером 10 на 20 следует написать: int d[10] [20] ; Двумерные массивы сохраняются в виде матрицы, где первый индекс отвечает за строку, а второй -за столбец. Это означает, что правый индекс изменяется быстрее левого, если двигаться по массиву в порядке расположения элементов в памяти. На рис. показано графическое представление двумерного массива в памяти. Левый индекс можно рассматривать как указатель на строку. Число байт в памяти, требуемых для размещения двумерного массива, вычисляется следующим образом: число байт = размер второго измерения * размер первого измерения * sizeof (базовый тип) Предполагая наличие в системе 2-байтных целых, целочисленный массив с размерностями 10 на 5 будет занимать 10 * 5 * 2, то есть 100 байт. Когда двумерный массив используется как аргумент функции, передается указатель на первый элемент. Функция, получающая двумерный массив, должна, как минимум, определять размер первого измерения, поскольку компилятору необходимо знать длину каждой строки для корректной индексации массива. 10. Статикалық және динамикалық массивтер. Айырмашылықтары. Мысал келтіріңіз Массивтер. Массив өте қарапайым және өте керекті зат. Қарапайым мысал келтірейік: сен директориядан 50 файлдың аттын оқыдың, саған оларды зердеге орналастыру керек, олармен кейін жұмыс істеу үшін. Массивті қолданбасаң, сен 50 айнымалы жариялап, әр қайсына файл атын жазу керек. Бұл ойға сыймайтын зат. Бірақ ойға ең сыймайтыны осы айнымалылармен жұмыс істеу, олардың ішінде саған керекті керек мәліметтерді іздеу. Массив мүлдем басқаша. Массив көмегімен бір атпен сенің 50 файл атын бір атпен сақтауға болады. Оларды сансыз рет кез-келген циклде ақтаруға болады, тек қана массив мүшесінің индексін өзгерте отырып. Массив – бір атпен біріккен, сансыз мәндер. Массивті қолданбас бұрын жариялау керек. Ол тура айнымалы сияқты жарияланады. Егер сен оны процедурада локальды жарияласаң, ол осы процедурада қолайлы болады, басқа еш жерде емес, егер (General)-(Daclarations) бөлім формасында жарияланса – онда барлық пішінде, ал егер саған оны глабольды түрде жариялау керек болса, яғни барлық проектіде қолайлы болу үшін, онда оны Public кілтті сөзімен стандартты модульде жариялау керек. Массивтер статистикалық және динамикалық болады. Статистикалық массивтер. Статистикалық массив – бұл сен алдын-ала оған қанша айнымалыны жазатынды білесің, яғни егер сен 10 мүшеге массив жарияласаң, онда оған 11 мүшені мүлдем кіргізе алмайсың. Пішінде ол былай жарияланады: Dim Chislo(9) As Long Dim – оператор, ол айнымалыны жариялаған сияқты, массивті жариялап және оған зердеден орын бөледі. Chislo – бұл тек ат, айнымалыға сияқты ойдан шығарылады, және сол талаптарға лайықты. (9) – массивтегі элемент саны – олар 10. Неге олай. Массив элемент саны нолден бастап белгіленеді , сондықтан массивте он элемент, 0, 1, 2, 3, 4, 5, 6, 7, 9, нөмірлерімен. Егер саған бұл тәртіп ұнамаса, онда Option Base 1 операторы қолданылады, ол Declarations бөлімінде тіркеледі және барлық элеметтердің бірінші массивін бағдарламада бірге байлайды. As Long– массив мәндерінің типін анықтау жай айнымалының типі сияқты. Әркезде массивтің барлық элементтері бір типті болады. Егер олай болмаса немесе қай типті мәлімет екенін білмесең, Variant типін беруге болады, бірақ ол керегі жоқ, бұл тип зерденің көп көлемін алады, әсіресе егер массив көлемді болса. Динамикалық массивтер. Массивте қанша элемент бар екенін алдын ала білмейтін жағдайлар болады. Сондықтан өлшемі шексіз екенін жариялау керек, мысалы Dim Mass () as String Оны қолданбас бұрын, оның өлшемін көрстеіп қайта жариялау керек. Redim операторы арқылы жасалады. Redim Mass (5) as String Динамикалық массивті қолданудың екі түрі бар. Бірінші жол, бұл қанша массив элементтері бар екенін санаймыз, содан кейін өлшемін жариялаймыз. Бұл жол ыңғайсыз, өйткені екі цикл құру керек: біреуі қанша элемен барын, ал екіншісі массив айнымалысына элемент енгізеді. Екінші жол, бұл циклде массив элементерінің саны көбейгенін қайтадан жариялап отыру керек. Peserve кілттік сөзін қолдану керек: RedimPreserve Mass (5) as String 11. Минимумды табу арқылы сұрыптау және қарапайым орын ауыстырып сұрыптау алгоритмдерінің айырмашылықтары.Сортировка поиском минимума Итак, мы придумали алгоритм для упорядочения любого набора чисел. на каждом шаге наш алгоритм находит наименьшее число в исходном наборе, удаляет его оттуда и записывает в конец набора, представляющего результат. Такой способ называют сортировкой поиском минимума. Реализация алгоритма Пусть нам дан массив из N чисел. Заметим, что количество чисел, которые мы храним, по ходу работы алгоритма не изменяется: на каждом шаге мы просто переносим одно из чисел из исходного набора в результирующий. Поэтому нам нет надобности заводить новый массив для хранения результата: мы сможем хранить его в освободившихся ячейках старого массива. После k-го хода результат содержит k чисел, а исходный набор — N-k. Договоримся, что текущий результат мы будем хранить в первых k элементах массива. Разберем подробнее, как это можно реализовать. Для этого вновь обратимся к нашему примеру:3, 6, 1, 2, 9, 5. На первом шаге мы находим наименьшее число — 1 — и должны переместить его на первое место. Но там уже записано число 3, куда же его деть? Ответ прост: на место числа 1. Таким образом, мы просто меняем местами два элемента массива:1 | 6, 3, 2, 9, 5. Мы условно разделили массив на две части: в левой части хранится уже отсортированная часть - текущий результат, в правой - оставшиеся элементы исходного набора. На втором шаге мы находим минмиальное число в правой части — среди элементов массива со 2-го по 6-й (в общем случае — по N-й) — и меняем его местами с числом, стоящим на втором месте:1, 2 | 3, 6, 9, 5. Далее нам следует поставить следующее минимальное число — 3 — на третье место, но оно уже и так там стоит. Впрочем, мы не будем обращать на это внимание, и просто как бы поменяем его само с собой:1, 2, 3 | 6, 9, 5. Попробуем записать действия, которые нам предстоит проделать на шаге с номером k. Сначала нам нужно найти наименьшее среди чисел, записанных в k, k+1, ..., N позициях массива. После этого нам нужно поменять этот элемент с k-м. Сколько таких шагов нужно сделать, чтобы полностью отсортировать массив? Напрашивается ответ "N", но не будем торопиться. Пусть сделан N-1 шаг. Тогда в правой, неотсортированной части массива останется одно число. Какое это число? Ясно, что это самое большое число в массиве. Где оно в итоге должно оказаться? На последнем месте в массиве. Но оно уже и так там! Поэтому N-й шаг алгоритма выполнять не нужно. Сортировка методом простого включения (сдвиг-вставка, вставками, вставка и сдвиг) Хотя этот метод сортировки намного менее эффективен, чем сложные алгоритмы (такие как быстрая сортировка), у него есть ряд преимуществ: - прост в реализации; -эффективен на небольших наборах данных, на наборах данных до десятков элементов может оказаться лучшим; - эффективен на наборах данных, которые уже частично отсортированы; - это устойчивый алгоритм сортировки (не меняет порядок элементов, которые уже отсортированы); - ожет сортировать массив по мере его получения; - не требует временной памяти, даже под стек. 12. Көпіршікті әдіс. Енді көпіршікті сұрыптауға өтейік. Оның негізгі принципі кіші мәндерді тізім басына ығыстыру, ал үлкен мәндерді төмен түсіреді. Көпіршікті сұрыптаудың көптеген әртүрлі нұсқалар бар. Көпіршікті әдіс алгоритмі тізім бойынша бірнеше рет өтеді. Әрбір өткенде көрші элементтерді салыстырады. Егер көрші элементтердің тізімі дұрыс емес болса, онда олар орын ауыстырады. Әрбір тәсіл тізім басынан басталады. Алдымен бірінші мен екінші элементтер, сосын екінші мен үшінші, содан кейін үшінші мен төртінші және т.с.с.; жұпта ретсіз тұрған элементтердің орны ауыстырылады. Тізімнің ең үлкен элементін бірінші өткенде тапқан кезде ол тізімнің соңына жеткенге дейін барлық кезекті элементтермен орын ауыстыра береді. Сондықтан екінші рет өткенде соңғы элементпен салыстыру қажет емес. Екінші рет өткенде тізімнің екінші элементі соңғы позициядан бастап екіншіге түседі. Процесті жалғастыра берсек әрбір өткен сайын ең болмағанда кезекті бір элемент өзінің орнында қалады. Бұл кезде ең кіші мәндер жоғары қарай жиналады. Егер қандай да бір өткен кезде ешқандай элементтердің орны ауыспаса, онда олардың барлығы қажетті ретпен тұр, және алгоритмнің орындалуын тоқтатуға болады. Әрбір өткенде бірден бірнеше элемент өзінің орнына жақындай түседі, тек біреуі ғана нақты орнында келеді Біз қысқаша түрде ең жақсы жағдайды қарастырамыз, swappedElements туының дұрыс емес интерпретациясын ескерту үшін, орындалатын жұмыс көлемі қандай жағдайда минималды. for циклі бірінші өткенде толығымен орындалу керек, және сондықтан алгоритмге ең болмағанда N — 1 салыстыру талап етіледі. Екі мүмкіндікті қарастыру керек: бір өткенде ең болмағанда бір орын ауыстыру болды және ауыстырулар болған жоқ. Бірінші жағдайда орын ауыстыру swappedElements жалауының мәнін true-ға ауыстырады, ендеше while циклі қайтадан орындалады және N — 2 салыстыруды талап етеді. Екінші жағдайда swappedElements жалауы false мәнін сақтайды және алгоритмнің орындалуы тоқтайды.Сондықтан жақсы жағдайда N — 1 салыстыру орындалады, және бірінші өткенде орын ауыстыру болмаған кезде орындалады. Бұл деректердің жақсы жиыны талап етліген реттегі элементтер тізімін береді. Ең жақсы мүмкін болатын тізімдегі элементтер талап теліген ретпен жүргендіктен элементтердің кері реті ең жаман жағдайды бере ме, соны қарау керек. Егер ең үлкен сан бірінші тұрса, онда ол тізімнің соңына дейін барлық элементтермен орын ауыстырады. Бірінші рет өтер алдында шамасы бойынша екінші элемент екінші позициядан орын алса, бірақ бірінші салыстыру және бірінші орын ауыстыру нәтижесінде ол бірінші орынға қойылады. Алдымен екінші рет өткенде бірінші позицияда шамасы бойынша екінші элемент орналасады, және ол тізімнің соңының алдына дейін барлық элементтермен орын ауыстырады. Бұл процесс қалған барлық элементтер үшін қайталанады, сондықтан for циклі N—1 рет қайталанады. Сондықтан кіріс деректерінің кері реті ең жаман жағдайға әкеледі. |