С помощью уже изученного материала по программированию можно решать очень много задач, но есть ещё одно очень важное новшество. Давайте решим такую задачу.
Компьютер запрашивает два числа, нужно определить и вывести большее из них.
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 лучший из диалектов бейсика
✅
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
cats, spinner, ianboil, mishka, sergiy, vako, andrvik, max-max, kanenakat, oleg257, zoss, dimarss, tristamoff, kilobucks, ohlamoon, shuler, rusalka, zlody, dr-boo, arsar, volv, turkish-r, renat242, markvial, vict0r, lira, gryph0n, voltash, ladynazgool, karusel1, sharps, cepera, francesco, exan, retoldname, stranniksenya, alikssandra, gapel, galerina, acidgarry, aivanouski, oagalakova, borisss, candy777, virt, optimist, yurchello, bammbuss, dmitrijv, manavendra, mr-nikola, ondantr, nerengot, dim447, mirgais, varja, upper, student61, prifix, abloud, dignityinside, foxycat, ksantoprotein, process, chugoi, nikulinsb, shafarevich, d0z4t0r, tulencha, kito-boy, vsebudethorosho, nikitosuna, izbushka, astramar, cryptovisitor, zelivsky, html, vredinka2345, carpe-diem, makcl, marina-spring, azarovskiy, funt33, samael27, kalter, maksh, mister-omortson, nightinga1e, apnigrich, siddxa, cryptobandera, doublingseason, necrogenesis, lologom, prezza, akva22, esperos, elcpa, karabum, sevaev, dobrotanya, boliwar, veta-less, irkinmick, archual, automedia, alexxela, vitalist, burger-knig, cryptenthusiast
Поэтому я тоже проголосовал за него!
dobryj.kit теперь стал Делегатом! Ваш голос важен для всего сообщества!!!
Поддержите нас:
Сюда приплывал Моби Дик
✅🤙 🚀