Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
прог.docx
Скачиваний:
117
Добавлен:
24.03.2015
Размер:
105.45 Кб
Скачать

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 рет қайталанады. Сондықтан кіріс деректерінің кері реті ең жаман жағдайға әкеледі.