Sign in Join
Wiki copytemporary

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

Revision 2 to 3. 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-`aa, ab, ac, ad, ... aaa, aab, ... aba, ...`
9+```
10+aa, ab, ac, ad, ... aaa, aab, ... aba, ...
11+```
1012
1113Но това би станало досадно (след като декларирате тези променливи, трябва да прочетете стойности във всяка от тези променливи).
1214
1315Един масив съдържа няколко места за съхранение, всички от един и същи тип. Вие се отнасяте към всяко отделно място за съхранение с името на масива и с допълнителен индекс. Дефиницията на типа е:
1416
1517``` pascal
1618type
1719 typename = array [enumerated_type] of data_type;
1820```
1921
2022Типът данни *data_type* може да е всякакъв, в това число и друг масив. За *enumerated_type* се записва изброим тип, може директно да се зададе в квадратните скоби или да се изпише името на вече дефиниран тип. С други думи:
2123
2224``` pascal
2325type
2426 enum_type = 1..50;
2527 arraytype = array [enum_type] of integer;
2628```
2729
2830е същото като:
2931
3032``` pascal
3133type
3234 arraytype = array [1..50] of integer;
3335```
3436
3537Бележка: Ето как низовете всъщност се управляват вътрешно - като масиви. Преди съвременните компилатори на Pascal да добавят собствена поддръжка за низове, програмиста е трябвало сам да се справя с това, като декларира:
3638
3739``` pascal
3840type
3941 String = packed array [0..255] of char;
4042```
4143
4244след което да използва някакъв вид символ, за да укаже края на низа. В повечето случаи това е т.н. символ *null* (числото 0 или ord(0)). Служебната дума *packed* означава, че масива трябва да се уплътни по такъв начин, че да заема най-малко място в паметта.
4345
4446Масивите от символи често се наричат *буфери*. Грешки в обработката на тези буфери в езиците C и C++ могат да доведат до препълването им. Препълване се получава, когато се опитаме да поставим символен низ с дължина 200 в буфер с дължина само от 150 символа. Ако в паметта след буфера е разположена част от кода на програмата, тогава нападателят току-що е успял да инжектира произволен код във вашата система. По този начин работи известния червей Slammer, който вилня в Интернет в продължение на няколко дни. Опитайте го в Pascal и вижте какво ще се случи.
4547
4648Масивите са полезни когато искате да съхранявате големи количества данни и да ги използвате по-късно в програмата. Те работят изключително удачно с цикли *for* защото управляващата променлива на цикъла може да се използва и като индекс в масива. Ако предположим следните дефиниции:
4749
4850``` pascal
4951type
5052 arraytype = array[1..50] of integer;
5153
5254var
5355 myarray : arraytype;
5456```
5557
5658тогава за да прочетете 50 числа може да използвате следния *for* цикъл:
5759
5860``` pascal
5961for count := 1 to 50 do
6062 read (myarray[count]);
6163```
6264
6365Квадратните скоби `[ ]` ограждат индекса когато се обръщаме към определен елемент от масива.
6466
6567``` pascal
6668myarray[5] := 6;
6769```
6870
6971---
7072*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