Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
sergiy
6 лет назад

12 FreeBASIC - массивы

С помощью уже изученного материала по программированию можно решать очень много задач, но есть ещё одно очень важное новшество. Давайте решим такую задачу.

Компьютер запрашивает два числа, нужно определить и вывести большее из них.

input "введите два числа";a,b
if a>b then print "Больше первое число"; a
if b>a then print "Больше второе число"; b
if a=b then print "Эти числа равны";

Хорошо, это мы быстро решили, а если будет три числа...

input "введите два числа";a,b,c
if a>b and a>c then print "Больше первое число"; a
if b>a and b>c then print "Больше второе число"; b
if c>a and c>b then print "Больше третье число"; c
if a=b and a=c then print "Эти числа равны";

Отлично, пришлось добавить строку и в каждый оператор if дополнительную проверку.

А если нужно найти большее из четырех, пяти чесел? А из тысячи чисел?

Неудобство в том, что имя переменных у этих данных различно. Вот если бы можно было обращаться к данным не по имени, а по номеру - тогда можно было бы в цикле их все просмотреть, хоть тысячу, хоть миллион чисел.

И тогда придумали МАССИВЫ

Массив - это пронумерованная последовательность данных, одного типа, обозначаемых одной переменной. Доступ к элементам последовательности осуществляется по порядковому номеру(индексу) Если индекс один - такой массив одномерный, это просто список пронумерованых значений. Если у массива два индекса - такой массив двухмерный, по сути это таблица значений. Бывают массивы и больших размерностей. Двухмерный массив можно рассматривать как массив массивов - однмерный массив одномерных массивов.

Dim As Integer a(5)
в этой строке определён массив на 5 элементов - a(1),a(2),a(3),a(4),a(5). Но на самом деле их ШЕСТЬ - в компьютере всё начинается с нуля. Так и здесь a(0) - первый элемент масива, a(1) - второй, a(2) - третий, a(3) - четвёртый, a(4) - пятый, и шестой a(5)

Новичку легко запутаться, поэтму на первых порах можете объявить Dim As Integer b(10) массив на десять эламентов и использовать b(1),b(2),...,b(10). Но в других языках такой поблажки нет и b(10) уже не будет элементом массива. А попробуйте теперь вывести на экран содержимое массива, только что созданного. Но цикл откроем не от 1 до 10, а, скажем, от 1 до 15.

Dim As Integer b(10)
Dim i As Integer
for i=1 to 15
print b(i);
next i

Теперь давайте переставим первую и вторую строки местами

Если нам не нужно в массиве хранить большие числа, массив можно было объявить не Integer, который занимает в памяти 4 байта, а Byte - элемент этого типа в памяти занимает ровно один байт, и может хранить значения от 0 до 255.

Почему же print выводит сначала нули, а потом печатает произвольные числа. Когда мы объявляем массив - для него в памяти отводится место размермассива*количествоэлементов, а далее в памяти за массивом идут другие даные, возможно это другие переменные, код программы, или непонятно что(мусор). Имя же переменной массива выступает как адрес этой области(начала массива), а индекс элемента массива, как смещение относительно начала размещения массива в памяти. И обращаясь к элементам b(11)-b(15) - мы лезем на чужую территорию. А если попытаемся изменить.... b(12)=56 - это может испортить работу программы, да и компьютера.

Эта вольность(отсутствие проверки) пришла во FreeBASIC из С/С++ и/или других языков, чистый BASIC выдал бы ошибку - "индекс вне диапазона".
Поэтому следить чтобы индекс не вышел за рамки разумного следует программисту. Так просто экономится время и программа работает быстрее.

Если значения массива известны заранее, на момент составления программы, (а не в момент исполнения), то массив можно инициализировать при объявлении.

Dim As Byte a(8)={7,3,2,0,1,66,8,4}
ещё может встретится такой вариант
Dim As Byte a(8)=>{7,3,2,0,1,66,8,4}

Для удобства массив можно объявлять не только от 1 - можно например так: Dim As Integer b(100 to 200) это объявит массив на 100 элементов, но с индексами от 100 до 200.

Если вдруг прийдется узнать каковы же пределы индексов массива есть две функции для этого: Ubound (Array) - возвращает верхний предел массива, Lbound (Array) - нижний предел массива.

Если массив многомерный, то вторым параметром в функциях выступает Ubound, Lbound указывают для чего определяется предел индексов.

Например,
Dim As Byte m(10,10)
Print Lbound(m,1);Ubound(m,1)
Print Lbound(m,2);Ubound(m,2)
здесь Print выведет пределы индекса для первой и второй размерности массива.

Часто бывает что массив необходимо "расширить", "увеличить"
В прежних диалектах Бейсика такой возможности не было. Я например создавал массив побольше, с запасом, чтоб хватило))). Здесь же есть оператор переобъявления массива -

dim As Integer k(5)
k(1)=4:k(2)=9
Redim As Integer k(30)

правда прежние значения в массиве потеряются. Для того чтоб сохранить прежние значения redim следует исспользовать так:

dim As Integer k(5)
k(1)=4:k(2)=9
Redim Preserve As Integer k(30)

Есть ещё одна команда для работы с массивом - его очистка - Erase. Команда не удаляет, а очищает массив от прежних значений.

PS

В других языках для указания элемента массив индекс берётся не в круглые скобки. Мне так даже больше нравится - Kolobok(23,11) - то ли это обращение к элементу массива Kolobok с координатами(индексами) 23 и 11 или это вызов функции(подпрограммы) с параметрами (23,11). В C/C++ обращение к упомянутому элементу выглядело бы так - Kolobok[23][11]

12 FreeBASIC - массивы
11 FreeBASIC - задачки
10 FreeBASIC - Игра угадай число
09 FreeBASIC - случайные числа, RND
08 FreeBASIC - случайные числа, RND
07 FreeBASIC - циклы
06 FreeBASIC - условный оператор
05 FreeBASIC - первые простые задачки
04 FreeBasic - графика
03 FreeBASIC. Текстовые переменные и операции с ними
02 FreeBASIC Переменные в Бейсике
01 Начинаем изучать FreeBasic
00 FreeBASIC лучший из диалектов бейсика

@sergiy

6
492.396 GOLOS
На Golos с October 2016
Комментарии (4)
Сортировать по:
Сначала старые