Деклариране на едномерен масив. Какво е масив? Пример за решаване на задача с използване на масиви на Pascal

20.12.2023 Компютри

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

Деклариране на променливи тип масив

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

вар<идентификатор>:масив[<тип индекса>] на<тип компонент>

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

Var T: масив от реални;

Описанието на масива определя, първо, разположението на масива в паметта и второ, правилата за по-нататъшното му използване в програмата. Последователните елементи на масива се намират в последователни клетки на паметта (T, T и т.н.), като стойностите на индекса не трябва да излизат извън диапазона 1...12. Всеки израз от подходящ тип може да се използва като индекс. Например:

Т, Т

Типът индекс може да бъде произволен скаларен порядъчен тип, с изключение на цяло число (в изпълнението на Turbo Pascal). Например, програмата може да съдържа следните описания:

Var Cod: масив от 1..100; L: масив от Char;

В такава програма са приемливи следните обозначения за елементи на масива:

Код["x"]; L; треска; L;

В някои случаи може да е удобно да използвате изброен тип като индекс. Например данните за броя на учениците в четири десети класа на едно училище могат да се съхраняват в следния масив:

Тип индекс=(A, B, C, D); Var Class_10: масив от байтове;

И ако например елементът Клас_10[A]е равно на 35, това означава, че в клас 10 „А“ има 35 души. Това индексиране подобрява видимостта на програмата.

Често на структуриран тип се дава име в секцията тип, което след това се използва в секцията за деклариране на променливи.

Тип Mas1 = масив от цели числа; Mas2 = масив [-10..10] от char; var Num: Mas1; SIM: Mas2;

Многомерни масиви

Многомерният масив в Pascal се третира като едномерен масив, чийто тип елемент също е масив (масив от масиви). Например средната месечна температура за 10 години може да бъде съхранена в масив, описан по следния начин:

Var H: масив от масив от real;

Ето примери за обозначаване на някои елементи от този масив:

Н; Н; Н;

Въпреки това, по-често се използва друга, еквивалентна форма за обозначаване на елементите на двумерен масив:

Н; Н; Н;

Променливата H означава целия първи ред на таблицата, т.е. целият набор от температури за 1981 г. Друг вариант, еквивалентен на горното описание, е следният:

Тип Месец = масив от реални; Година = масив от месец; var H:Година;

Най-краткият начин да се опише този масив е както следва:

Var H: масив от реални;

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

Var A: масив от цели числа;

Това е масив, състоящ се от 10x20x30 = 6000 цели числа и заема 6000x2 = 12000 байта в паметта. В Pascal няма горна граница за размера на масива. Въпреки това, всяка конкретна реализация на Pascal ограничава количеството памет, разпределено за масиви.

По аналогия с математиката, едномерните числови масиви често се наричат ​​вектори, а двумерните – матрици. Масивите не могат да се преоразмеряват по време на изпълнение. Промяната на размера на масива става чрез промяна в програмния текст и повторно компилиране. За да се опростят такива промени, е удобно да се дефинират параметри на индекса в раздела за константи:

Const Imax=10; Jmax=20; var Mas: масив от цели числа;

Сега, за да промените размерите на масива Mas и всички програмни изрази, свързани с тези размери, е достатъчно да редактирате само един ред в програмата - секцията с константи.

Операции с масиви

Действия върху масив като цяло. Такива действия са допустими само в два случая:

  • присвояване на стойности от един масив към друг;
  • релационни операции „равно“ и „не е равно“.

И в двата случая масивите трябва да имат еднакви типове (тип индекс и тип елемент). Пример:

Var P, Q: Реален масив;

Когато се извърши операцията за присвояване P:= Q, всички елементи на масива P ще станат равни на съответните елементи на масива Q.

В многомерните масиви променлива с индекс може да представлява целия масив. Например, ако в таблица H искате данните за 1989 г. да бъдат същите като за 1981 г. (деветият ред е зададен на стойността на първия ред), тогава това може да се направи по следния начин:

N := N;

И ако трябва да размените стойностите на тези редове, това става чрез трета променлива от същия тип:

P:= N; N := N; N := P;

където P се описва така:

Var P: Реален масив;

Обработка на масиви

Обработката на масиви в програмите се извършва компонент по компонент. Ето примери за въвеждане на стойности в масиви:

За I:= 1 до 12 направете readln(T[I]); за I:= 1 към IMax направете за J:= 1 към JMax направете readln(Mas);

Тук всяка следваща стойност ще се въвежда на нов ред. За въвеждане ред по ред се използва операторът read. По същия начин, в цикъл, използващ индексна променлива, се организира изходът на стойностите на масива. Например:

За I:= 1 до 12 направете write(T[I]:8:4);

Следният програмен фрагмент организира ред по ред показване на матрицата на екрана:

За I:= 1 до IMax направете начало за J:= l до JMax направете запис (Mas:6); writeln; край;

След отпечатване на следващия ред от матрицата, операторът writeln без параметри ще премести курсора в началото на новия ред. Трябва да се отбележи, че в последния пример матрицата на екрана ще се получи в естествената форма на правоъгълна таблица, ако JMax не надвишава 12.

Динамични масиви

Във FreePascal и Delphi е добавена интересна функция за описване на масиви без посочване на размери и съответно ограничения за промяна на индексите:

Var IntArray: масив от цели числа;

Такива масиви са динамични и първоначално имат нулева дължина. Задаването на размера на масива и определянето му по време на изпълнение на програмата се извършва по същия начин, както при низовете, с помощта на функции SetLengthИ Дължина, съответно. Елементите в този случай се номерират от нула.

Програма UsingDynamicArrays1; var A, B: Масив от цели числа; (Описание на две променливи - динамични масиви от цели елементи) begin SetLength(A, 5); (Задаване на размера на масив A (5 елемента)) A := 1; (Присвояване на стойност 1 на елемент от масива A с номер 0) край.

Променливите на динамичния масив са указатели и операциите с тях се извършват като с указатели. Например, при присвояване на един масив на друг, елементите на единия масив не се копират във втория, но се копира адресът на масива. Съответно сравнението на два масива в логически изрази от типа „равно - не е равно“ се извършва чрез сравняване на адреси. Пример за присвояване на един масив към друг:

Програма UsingDynamicArrays2; var A, B: масив от цели числа; (Описание на две променливи - динамични масиви от цели елементи) begin SetLength(A, 5); ( Задаване на размера на масив A (5 елемента) ) A := 14; (Присвояване на стойност 14 на нулевия елемент от масив A) B:= A; (Присвояване на масив A на масив B, сега променливите A и B сочат към един и същи масив) B := 2; (Присвояване на нулевия елемент от масив B на стойност 2, сега нулевият елемент от масив A също има стойност 2) край.

Нека отбележим значителна разлика в работата с низове и динамични масиви, които имат едно и също вътрешно представяне, базирано на указатели, но различни работни методи. Два различни низа, съдържащи един и същ набор от символи, се считат за равни, но два различни масива, съдържащи едни и същи елементи, не са равни.

Описанието на масива ви позволява да използвате всеки от неговите елементи в програмата. Индексираните променливи се използват за обозначаване на елементи от масив в C.

Индексирана променлива (индексен израз)– обозначение на клетката за съхраняване на елемент от масива. Нарича се определящ идентификатора на масива и индекса(ите) на елемента.

ü Внимание! Особеност на обозначаването на елементите на масива в C е номерирането на индексите, започващи от 0, а не от 1. Следователно индексите в C са с един по-малко от тези, определени математически. Това обстоятелство трябва да се вземе предвид в програмата, особено при формиране на условието за повторение (излизане) от цикъла.

Схемата за разпределение на паметта за съхраняване на едномерен масив е следната:

Дължината на клетката за съхраняване на всеки елемент се определя от типа на масива:

· символ – 1 байт;

· цяло число – 2 байта;

· реален – 4 байта;

· двойна точност – 8 байта.

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

име [индекс]

Където име е идентификаторът на масива;

индекс – операнд от целочислен тип, който определя номера на елемент сред останалите, съставляващи масива;

– ограничители на индекса.

Например, в масива D(16), описан по-рано, първият елемент се обозначава с индексния израз d, вторият с d, текущият с d[i], предпоследният с d и последният с d.

Ако е необходимо, индексът може да бъде зададен с аритметичен израз. Например d или d. Във всеки случай, когато се използва променливата, индексът трябва да бъде дефиниран (изчислен) и получената стойност трябва да попада в диапазона, определен от дескриптора.

Разгледаният пример за идентифициране на елементи от масив D е приложим за всеки от описаните едномерни масиви.

Индексираните променливи позволяват софтуерна реализация на алгоритми, използващи елементи от масив. Освен това, за едномерен масив, индексирана променлива ви позволява да определите конкретния адрес на всеки елемент.

Адресът на всяка променлива се определя от операцията &. Следователно адресът на елемент d е &d, този на d[i] е &d[i], т.е. всички елементи на масива са разположени линейно в RAM, започвайки от адрес &d.

В езика C идентификаторът на едномерен масив еднозначно определя адреса на неговия първи елемент. Например c º & c, d º & d.

Адресът на всеки елемент от едномерен масив се изразява чрез зависимостта име+индекс (индексът определя изместването на елемента спрямо първия с броя на елементите, посочени от него). Например &c[i] (адресът на i-тия елемент от масив C) се изчислява като c+i.

По този начин изразът на индекса напълно определя конкретното място за съхранение на съответния елемент.

>> Статии

Какво представляват масивите в програмирането?

Масивът е променлива, която е колекция от компоненти от един и същи тип. За да използвате масиви в програмирането, ще ви е необходимо предварително описание на определен тип и указание за достъп до елементите. Елементите на масива в програмирането се обединяват от общо име. Ако имате нужда от достъп до конкретен елемент от масива, просто посочете името и индекса. В математиката има ясен пример за масив - това са вектори и поредици от числа, в които група числа могат да бъдат обозначени с едно име. При позоваване на конкретно число се използват различни индекси.

Видове масиви: едномерни и двумерни

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

Когато се използват два индекса, масивът ще бъде двумерен. Ако масивът е представен в идея за таблица, тогава номерът на реда ще съответства на първия индекс, а номерът на колоната или клетката ще съответства на втория.

Как да попълним масив?

Един от начините за попълване на масив е с оператора за присвояване. Когато елементите са свързани периодично и имат определена зависимост, този метод на попълване е подходящ. Можете също да попълните хомогенен масивхомогенни елементи или стойности, които се получават чрез сензор за случайни числа..

Какви действия се извършват върху елементите на масива?

Сортиране на елементи в определен ред - низходящ или възходящ

Намиране на ценности

Преброяване на броя на елементите в масив, които отговарят на определено условие

Когато два масива са еквивалентни, е възможно да се присвои името на единия масив на другия. Всички компоненти се копират в масива, на който се присвоява стойност.

Как да декларирам масив

За да декларирате масив и да разпределите място в паметта за съхраняване на елементи, трябва да посочите измерението и името. Ключовата дума е масив. Например A 20 означава, че едномерният масив се състои от двадесет елемента. K 6.5 означава, че е двумерен масив, която е представена като таблица от шест реда и пет клетки. Ако говорим за ограниченията на едномерния масив в програмирането, то той е хиляда елемента. За двумерни масиви максималната допустима стойност би била таблица от хиляда реда и хиляда клетки.

Масивите в програмирането: работа с тях

Когато се декларира масив, всеки елемент се обработва с име и индекс в квадратни скоби. За разграничаване на едномерен масив от двумерен масив се използват два индекса. Елементите на масива, на които е присвоен индекс, се наричат ​​индексирани променливи, но могат да се използват и като прости променливи. Например да бъдеш спор в екип.

Видове имена, елементи, индекси

Как да измисля име за масив? Всеки идентификатор ще свърши работа. Според стиловите правила името трябва да започва с буквата Т с голям шрифт. По този начин можете да различите идентификатора от другите. Следващата част от името може да бъде измислена в съответствие с конкретните данни, които да се съхраняват в масива. Второ име компонентсъщо трябва да започва с главна буква. T Vector може да съхранява информация за координатите на абстрактен вектор.

Що се отнася до вида на елементите в масива, той може да бъде предварително въведен или стандартен. Целите числа се използват за създаване на индекси, а типът ще бъде диапазон. Да кажем, че типът 1...20 означава, че масивът се състои от двадесет елемента, всеки от които съответства на цяло число от едно до двадесет.

Масивът е сложен (съставен, структуриран) тип данни, който се характеризира със следното:

· елементите на масива имат един и същи тип, за разлика от структурите, така че всеки елемент на масива заема еднакво количество памет;

· масивът се намира в RAM, а не на външно устройство, както файловете (2-ри семестър);

· елементите на масива заемат последователни клетки, за разлика например от списъците (2-ри семестър).

Елементите на масива са достъпни по два начина в C++.

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

Освен това C++ има способността да обработва масиви с помощта на указатели (адреси) , тъй като в C++ има връзка между масиви и указатели. Въпреки факта, че в първия метод програмата няма специален тип за работа с адреси, все още се използват указатели.

Масивите могат да имат едно или повече измерения. Този раздел обсъжда едномерен масив, понякога наричан вектор , предполагащ вектор в н-измерно пространство. Работа с двумерни масиви ( матрици) обсъдени в гл. 5. Три или повече измерения рядко се използват на практика, тъй като такива масиви заемат голямо количество RAM.

Навсякъде в това, което следва, под думата „масив“ имаме предвид едномерен масив.

От гледна точка на времето (етапа), когато се заделя памет за масива, има два вида. Памет за динамичен Масивът се заделя по време на изпълнение на програмата и ако масивът не е необходим, паметта за него може да бъде освободена. Такива масиви се разглеждат през втори семестър.

Едномерен масив с фиксирано измерение (да го наречем статичен ) се декларира най-общо, както следва:

име на тип [N];

Тук Тип- вид на елементите на масива. Нека първо разгледаме простите типове (int, float, char), но можете да използвате и сложни структури, например. Имесе записва според правилата на идентификаторите. Всеки елемент от масива има едно и също име, променя се само индексът или номерът на елемента. н- измерение (или размер) на масива под формата на целочислена константа или константен израз. Тази стойност определя броя на RAM клетките, запазени за масива. Например:

поплавък А;или const n=10; float A[n];

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

За разлика от динамичен масив, за статичен масив паметта е запазена на етапа на компилация за поставяне нчисла от посочения тип (10 реални числа). Масивът изисква памет за k*Nбайт (4*10 ), Където к- необходимия брой байтове за настаняване на един елемент от посочения тип (един номер от тип плавам). Тази памет се запазва за цялото изпълнение на програмата или по-точно на функцията или блока, където е описан масивът. Необходимото количество памет се определя програмно с помощта на операцията размер напо следния начин:

M=sizeof (тип)*N; или M= sizeof (име); или M= размер на името;

Където М- променлива от целочислен тип, която определя размера на масива в байтове. Типът трябва да се изпише в скоби, но името може да се изпише и без скоби. Следната програма ще отпечата числото 40 два пъти.

поплавък А; int M1, M2;

M1=sizeof(float)*10; //Но M1=sizeof float *10;-грешка!

M2=sizeof(A); //или M2=размер на A;

cout<

В много съвременни системи за програмиране, включително C++, номерирането на елементите на масива започва от 0. След това А- последният елемент от масива. Това се дължи на използването на указатели при работа с масиви (виж 2-ри семестър). Следователно в нашия пример индексът се променя от 0 до 9 включително, т.е индексът на последния елемент от масива е с единица по-малък от неговото измерение. Декларираните 10 елемента на масива са обозначени, както следва: А, А, А,…, А. C++ няма проверка на границите на масива. Можете да отидете извън неговата граница и да запишете стойността в някаква променлива или дори в програмния код. Програмистът трябва да се грижи за такъв контрол.

При използване на статични масиви възникват проблеми, ако не знаем размера на масива предварително. В този случай ние декларираме масив с максимална размерност, която обикновено е известна. Ние въвеждаме реалното измерение и го използваме допълнително, например в цикли и за други цели:

const nmax=100; float X;

int n; cout<<”Input the size of array ”; cin>>n;

/* Дние също работим с н(не с nмакс) елементи от масива, например, въведете ги.* /

за (int i=0; i

{ // Този ред може да бъде пропуснат заедно с фигурните скоби.

cout<<”X[“<

cin>>X[i];

Този метод е по-прост, но неефективен от гледна точка на разпределението на паметта, тъй като ние „поръчваме“ повече памет, отколкото всъщност използваме. В такива случаи професионално се използват по-ефективни динамични масиви (виж 2-ри семестър).

Масив (програмиране)

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

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

общо описание

Масив - Подреден набор от данни за съхраняване на данни от един тип, идентифициран с един или повече индекси. В най-простия случай масивът има постоянна дължина и съхранява единици данни от един и същи тип.

Броят на използваните индекси на масив може да варира. Масивите с един индекс се извикват едноизмерен, с две - двуизмерени т.н. Едномерен масив съответства в общи линии на вектор в математиката, двумерен масив не съответства точно на матрица. Най-често се използват масиви с един или два индекса, по-рядко - с три и дори повече индекси са изключително редки.

Пример за статичен масив в Pascal -

WordArray: масив [ Дума ] от цяло число; // Статично, размер = High(Word) + 1 multiArray: масив [Байт, 1 ..5] от Char; // Статичен масив, 2 измерения rangeArray: масив [ 5 ..20 ] от String ; // Статичен масив, размер = 16

Пример за статичен масив в C -

Int Array[ 10 ] ; // Статично, размер 10, базов тип данни - intдвоен масив[ 12 ] [ 15 ] ; // Статичен масив, 2 измерения, базов тип данни - число // с дробна част (двойно)

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

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

Деклариране на типа "масив" в Pascal -

Тип TArrayType = масив [0 ..9] от цяло число; (* Декларации от тип "масив" *) var arr1, arr2, arr3: TArrayType; (* Декларация на три масивни променливи от един и същи тип *)

Специфични типове масиви

Динамични масиви

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

Пример за динамичен масив в Delphi

ByteArray: масив от байтове; // Едномерен масив multiArray: масив от масив от низ; // Многоизмерен масив

Пример за динамичен масив в C

Float *масив1; // Едномерен масив int **масив2; // Многоизмерен масив array1=(float *) malloc (10 *sizeof (float)) ; // заделяне на 10 блока от sizeof(float) байта всеки array2=(int **) malloc (16 *sizeof (int ) ) ; // разпределение на 16*8 блока от sizeof(int) байта всекиза (i=0;i<16 ;i++) array2[ i] =(int *) malloc (8 *sizeof (int ) ) ;

Разнородни масиви

Разнородние масив, в който различни елементи могат да бъдат директно записани в стойности, принадлежащи към различни типове данни. Масив, който съхранява указатели към стойности от различни типове, не е хетерогенен, тъй като самите данни, съхранявани в масива, принадлежат към един тип - типът „указател“. Хетерогенните масиви са удобни като универсална структура за съхраняване на набори от данни от произволен тип. Липсата на тяхната поддръжка в езика за програмиране води до необходимостта от внедряване на по-сложни схеми за съхранение на данни. От друга страна, прилагането на хетерогенност изисква по-сложен механизъм за поддръжка на масиви в езиковия преводач.

Масиви от масиви

Многомерните масиви обикновено се изпълняват като едномерни масиви, всеки елемент от които е препратка към друг едномерен масив.

Внедряване

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

  1. За масива се разпределя непрекъснат блок памет с обем S*m 1 *m 2 *m 3 …m n, където S е размерът на един елемент, а m 1 …m n са размерите на индексните диапазони (т.е. , броят на стойностите, които съответният индекс може да приеме).
  2. При достъп до елемент на масив A, адресът на съответния елемент се изчислява като B+S*(i 1p *m 1 +i 2p *m 2 +…+i (n-1)p *m n-1 +i np ), където B - основа (адрес на началото на блока памет на масива), i kp е стойността на k-тия индекс, намалена до цяло число с нулево начално отместване.

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

Първият елемент от масива, в зависимост от езика за програмиране, може да има различен индекс. Има три основни типа масиви: базирани на нула (базирани на нула), базирани на единица (базирани на едно) и базирани на конкретна стойност, зададена от програмиста (базирани на n). Преброяването на индекса на елемент от масив от нула е по-характерно за езиците на ниско ниво, но този метод е популяризиран в езиците на по-високо ниво от езика за програмиране C.

По-сложните типове масиви – динамични и разнородни – са по-трудни за изпълнение.

Предимства

  • лекота на изчисляване на адреса на елемент по неговия индекс (тъй като елементите на масива са разположени един след друг)
  • еднакво време за достъп до всички елементи
  • малък размер на елементите: те се състоят само от информационно поле

недостатъци

  • за статичен масив - липса на динамика, невъзможност за премахване или добавяне на елемент без преместване на други
  • за динамичен и/или хетерогенен масив - по-ниска (в сравнение с обикновена статична) производителност и допълнителни разходи за поддържане на динамични свойства и/или хетерогенност.
  • при работа с масив в стил C (с указатели) и при липса на допълнителни контроли - заплахата от излизане извън границите на масива и повреждане на данни