Масивите в гр практика

Както се вижда, в началото на енкодери има много въпроси, когато решението на тема "решетки" задачи. Тази статия докосна по въпроси, отнасящи се само до масиви в класическия смисъл на думата. Работа с контейнери STL - е отделен въпрос.







Като правило, задачите са както следва: запълване на масива да се направят някои операции с елементите на масив, отпечатате резултата. Още при формулирането на проблема различаваме логически блокове, за да го реши. Следваща аз ще се опитам да покажа типичните "тухли", които могат да се сгъват от разтвора - .. т.е. програмата.

организация масив

Памет за масива може да бъде избран автоматично или динамично.

Автоматично разпределение използвана памет, когато размерът на съоръженията е известно, по време на компилация (т. Е. При писане код).

разпределение Dynamic памет се използва, когато размерът на масива не е известно по време на компилация (например, поискана от потребителя).

И двата типа масиви могат да бъдат както глобални (на някои функции) и местно (в рамките на определена функция или единица). Тук за автоматични масиви, има една тънкост. Памет за автоматично местно масив разпределени в стека. Следователно, размерът на масива трябва да бъде малка. В противен случай, можете да получите преливане стека и в резултат на това ненормално прекратяване на програмата. Stack преливане също може да бъде получена на малки размери и местната автоматична ред по време на множество рекурсивни извиквания на функции. Ето защо, когато дефинирате функция в автоматичен масив, трябва да знаете точно какво правите.

За масиви с помощта на динамичния разпределението на паметта, паметта се разпределя от "купчина» (купчина). Куп - е паметта, отпуснато от програмата на операционната система за използване на тази програма. Heap размер обикновено е значително по-голям стак и OS, които поддържат виртуална памет парадигма, размера на свободната памет на теория може да се ограничава само битови приложения.

Използването на автоматични масиви

Автоматични масиви използват, когато размерът на масива е известно, по време на компилация.

размер на масива в кода е силно препоръчително да се посочи, като се използва името постоянна. Това е полезно, поради няколко причини:

  1. име на константа трябва да сочи към областта на прилагането му - самостоятелно документиране код;
  2. ако е необходимо, промяна на размера на код на масив трябва да направите промени на едно място;
  3. размер масив, който обикновено се използва в циклите на границата проверка на преминаване масив и така нататък. Затова се използва символично име да премахне необходимостта от внимателна проверка и изправяне на целия код при смяна на размера на масива.

Въведете константен израз за определяне на размера (брой елементи) на масива да бъдат автоматично число: Чар. вътр. неподписан вътр. дълго. и т.н.

Memory размер е определен в автоматични масиви освободени, когато са извън обхват променлива масив. За локално масив е функция или блокира. Глобални масиви са унищожени, когато програмата излиза.

Пример за определяне на световния автоматично дължина масив от 10 елемента от тип Int:

Пример автоматично определяне на дължината на местно масив от 10 елемента от тип междинно съединение:

Използване на масиви с динамично разпределение на паметта

Масивите с разпределение динамична памет се използват, когато размерът на масива не е известно по време на компилация. Действителният размер на масива може да бъде изчислена в програмата или въведен от потребителя - това няма значение.

масива на паметта се разпределя от новия оператор под формата на нов тип [NUMITEMS].

тип експресия определяне на размера (брой елементи) на масива трябва да е цяло число. Също така, този израз може да бъде постоянен.

Когато се работи с масив е завършена, заделена памет за масива трябва да бъде освободен. Това се извършва чрез изтриване оператор под формата на изтриване [] variable_name. След като паметта се освобождава, не може да работи с множество.







Пример на масива с динамично разпределение памет:

Пълнене масив от стойности

При решаването обикновено се изискват проблемите на образованието, за да завършите масив от стойности или се вписват от клавиатурата, или произволни стойности от определен диапазон. Нека започнем с втория случай като обикновен (парадокс? Не, истината на живота).

Попълване масив от случайни числа

За да започнете да Генераторът на случайни числа се изисква. По-долу е кода на един от най-простите реализации:

Въпреки това, без допълнителни движения стандартна функция ранд () ще бъде всеки път, когато стартирате програмата за генериране на една и съща последователност на случайни числа (между другото, е много полезна при отстраняване на грешки!). За да бъде всеки път, когато стартирате програмата получавате уникален поредица от случайни числа, ранд () функция е необходимо да се "диск" първоначалната случайна стойност. Това се прави с помощта на Srand () и времето ().

Попълване масив от стойности, разбира се, ние правим на ринга. Помнете, че елементи масив в C / C ++ са номерирани 0. елемент Следователно последната масив има индекс единица по-малък от размера на масива.

Примерът показва как една глобална автоматична масив от 10 елемента от тип INT произволни стойности в диапазона от -100 до 100, включително:

Обърнете внимание на включването на файлове заглавни!

Попълване на масив от числа, въведена от потребителя

Странното е, че това е по-сложен случай. Факт е, че на първо място, наличието на човек винаги може да доведе до неправилно въвеждане на данни (грешка), и второ, е необходимо лицето да предостави няма интерфейс, и трето, STL системата стрийминг IO има своите неприятни черти ,

Така че, с помощта на предишния пример, нека да напише фрагмент, който е отговорен за пускането на масива от стойности от клавиатурата. Добавете код в горната част на #include заглавния файл . и вместо да се инициализира масива с произволни стойности, които пишем нещо като:

Той не изглежда да работи, но ако се опитате, тъй като броят на (случайно, разбира се!) За да въведете 1111111111111111111111111111111111 или 11 q. След това, в зависимост от компилатора, ще можете да видите някои интересни ефекти на вашата програма.

Така че трябва да пиша по-сложен код:

Подробен анализ на фрагмента излиза извън обхвата на тази статия. Но интересува може да го разглоби, въоръжени с, например, най-известните от книгата Shildt.

Конзолата изходни стойности от масив

Изходна масив от стойности на конзола продадени мозък. В светлината на гореизложеното, имам не много да се добави:

Работа с ценности от масив

Всичко, което е написано по-горе, това е като че ли най-спомагателни елементи на програмата. Допълнителна Нека разгледаме някои примери за обработка на масив.

Търсене максимална / максимални стойности в масива

По-долу е пълна програма за изследвания код минимална стойност в масива и неговия индекс. Програмата използва глобалната автоматична масив. Array стойности се получават чрез генератор на случайни числа.

Този код може да бъде оптимизирана, но аз не съм направил, че те са по-добре се вижда на тези "тухли", от който е събрана.

Определя се от две променливи, една от които ще съдържат минимална стойност, а втората - индексът на минималната стойност. Тези променливи се инициализират от първия (нула) елемента в масива и нула, съответно. Освен това, при всеки цикъл, следващата стойност на елемент на масива се сравнява с вече са намерили най-ниската стойност, а ако текущата стойност е по-малка от складират, съхраняват текущата стойност и индекс.

Ясно е, че търсенето на максималната стойност се извършва напълно аналогичен до знаците "повече" / "по-малко", изходяща поредица на потребителя, както и името на променливите.

Търсене на определена стойност в масива

Търсене на определена стойност в неподредена масив се извършва чрез използване на линеен алгоритъм за търсене. Това е най-простият алгоритъм повтаряне сериен масив и сравняването им с желаната стойност.

Задача да намерите в масива може да бъде в две форми:

  1. Тя намира на първия (последен) поява на стойността
  2. за да намерите всички събития

Търсене за първия случай:

последно влизане Търсене:

Обърнете внимание на следните точки.

Аз линия променлива е описано преди цикъла. По този начин, тази променлива продължава да съществува след цикъла на затваряне, и може да се използва стойността си.

Ако не се намери желаната опция, след което цикълът завършва преждевременно пробие изявление. видите останалата част на масива няма смисъл - задачата е направено.

Търсене за всички срещания на:

Тук, на цикъла не се прекъсва. Масивът е напълно видими.

Сума / продукт на отрицателни елементи на масива

Размер на масив с елементи дори / нечетни индекси

Работа с масиви използвайки функции

Почти всички части на код, дадени по-горе, могат да бъдат подредени като функция, и набор от параметри, за да преминават през. Като пример, една програма да намерите сумата от масив елементи с дори индекси, която използва (за многообразие) динамичен масив.

Имайте предвид, че разпределението на памет за масива и освобождението се извършва в една функция (в този случай, в главната ()). Разпределяне на паметта в една функция, както и да се освободят от друга - лоша идея, изпълнен с грешки.

заключение

Тази статия разглежда само най-основните техники за работа с масиви, които ще (надявам се!) Новини енкодер да разберат как се работи с масиви.

За да пребъдва с вас, светите апостоли и Бярне него! ;-)