Sign in Join
Wiki copytemporary

Basic Pascal Tutorial/Chapter 5/1-dimensional arrays/bg: what changed

Revision 3 to 4. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## 5C - Едноразмерни масиви
22
33*(author: Tao Yue, state: unchanged)*
44
55Да предположим, че искате да прочетете 5000 цели числа и да направите нещо с тях. Как бихте съхранявали числата?
66
77Може да използвате 5000 променливи, получавайки нещо като:
88
9-```
9+```text
1010aa, ab, ac, ad, ... aaa, aab, ... aba, ...
1111```
1212
1313Но това би станало досадно (след като декларирате тези променливи, трябва да прочетете стойности във всяка от тези променливи).
1414
1515Един масив съдържа няколко места за съхранение, всички от един и същи тип. Вие се отнасяте към всяко отделно място за съхранение с името на масива и с допълнителен индекс. Дефиницията на типа е:
1616
1717``` pascal
1818type
1919 typename = array [enumerated_type] of data_type;
2020```
2121
2222Типът данни *data_type* може да е всякакъв, в това число и друг масив. За *enumerated_type* се записва изброим тип, може директно да се зададе в квадратните скоби или да се изпише името на вече дефиниран тип. С други думи:
2323
2424``` pascal
2525type
2626 enum_type = 1..50;
2727 arraytype = array [enum_type] of integer;
2828```
2929
3030е същото като:
3131
3232``` pascal
3333type
3434 arraytype = array [1..50] of integer;
3535```
3636
3737Бележка: Ето как низовете всъщност се управляват вътрешно - като масиви. Преди съвременните компилатори на Pascal да добавят собствена поддръжка за низове, програмиста е трябвало сам да се справя с това, като декларира:
3838
3939``` pascal
4040type
4141 String = packed array [0..255] of char;
4242```
4343
4444след което да използва някакъв вид символ, за да укаже края на низа. В повечето случаи това е т.н. символ *null* (числото 0 или ord(0)). Служебната дума *packed* означава, че масива трябва да се уплътни по такъв начин, че да заема най-малко място в паметта.
4545
4646Масивите от символи често се наричат *буфери*. Грешки в обработката на тези буфери в езиците C и C++ могат да доведат до препълването им. Препълване се получава, когато се опитаме да поставим символен низ с дължина 200 в буфер с дължина само от 150 символа. Ако в паметта след буфера е разположена част от кода на програмата, тогава нападателят току-що е успял да инжектира произволен код във вашата система. По този начин работи известния червей Slammer, който вилня в Интернет в продължение на няколко дни. Опитайте го в Pascal и вижте какво ще се случи.
4747
4848Масивите са полезни когато искате да съхранявате големи количества данни и да ги използвате по-късно в програмата. Те работят изключително удачно с цикли *for* защото управляващата променлива на цикъла може да се използва и като индекс в масива. Ако предположим следните дефиниции:
4949
5050``` pascal
5151type
5252 arraytype = array[1..50] of integer;
5353
5454var
5555 myarray : arraytype;
5656```
5757
5858тогава за да прочетете 50 числа може да използвате следния *for* цикъл:
5959
6060``` pascal
6161for count := 1 to 50 do
6262 read (myarray[count]);
6363```
6464
6565Квадратните скоби `[ ]` ограждат индекса когато се обръщаме към определен елемент от масива.
6666
6767``` pascal
6868myarray[5] := 6;
6969```
7070
7171---
7272*From the Free Pascal wiki, page "Basic Pascal Tutorial/Chapter 5/1-dimensional arrays/bg", as it stood on 2023-01-03 after a change by Alpinistbg, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history