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

07 FreeBASIC - циклы

Давайте расмотрим такую задачку - вывести на экран числа от 1 до 10. Скажете нет ничего проще -

print 1;2;3;4;5;6;7;8;9;10

А если от 1 до 100, а до 1000?

В предыдущем уроке вы увидели, что программа может некоторые действия выполнять, а некоторые нет, в зависимости от условий(оператор IF). А бывает так, что некоторые действия порой приходится выполнять многократно.

Есть один оператор, который присутствует во многих языках программирования, но которым категорически не советуют пользоваться - это GOTO. Я также воспользуюсь им лишь здесь.

В старых версиях бейсика, где строки нумеровались - 10, 20, 30, 40... оператор GOTO 20 говорил программе что нужно изменить последовательный ход выполнения программы и перейти на команду что записана в строке 20 и далее исполнять все последующие команды.

В последующих версиях, когда строки перестали нумеровать, чтобы воспользоваться оператором GOTO следует в начале строки, куда должен быть осуществлён переход, написать метку и завершить метку двоеточием(:). Метки присутствуют и в других языках - Pascal, C/C++... но их использование считается дурным тоном(ведь за ними последует goto), и их стараются избегать.

Давайте посмотрим как быдет выглядеть решение печати чисел от 1 до 100

m1 это метка, куда условный оператор будет перенаправлять ход выполнения программы при выполнении условия что k<=100

Такая конструкция называется цикл

Циклы используются очень часто в программах и для них придумали специальные операторы.

Посмотрим как запишется пердыдущий пример с помощью оператора цикла FOR...

Dim as integer k
FOR K=1 TO 100
PRINT k;
NEXT K
SLEEP

оператор FOR - это цикл со счётчиком

в K=1 задаётся начальное значение и цикл крутится до 100 ('TO 100')

Цикл прекратится если K>100, но как же оно станет больше ста, если оно, K, нигде не увеличивается?

А увеличивет его NEXT. NEXT служит как бы концом оператора цикла, а всё что между FOR и NEXT называется телом цикла.

В бейсике можно задать шаг изменения переменной цикла, в нашем случае K. Строка инициализации цикла тогда запишется так: FOR K=1 TO 100 STEP 2

Здесь мы задали шаг приращения переменой цикла равный двум. Оператор NEXT K неявно выглядит так K=K+2

Шаг может быть и не целым, и даже отрицательным.

Например

FOR K=100 TO 1 STEP -1
PRINT k;
NEXT K
SLEEP

напечатает числа от 100 до 1

Изменять переменную цикла внутри цикла нельзя!!! Считается дурным тоном, как и использование GOTO.

Но не всегда заранее известно сколько раз будет выполняться цикл - здесь вместо цикла со счётчиком есть цикл с условием.

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

Do While условие

тело цикла

Loop

Есть цикл с постусловием - условие стоит в конце цикла, после тела цикла. Такой цикл выполнится как минимум один раз.

Do

тело цикла

Loop While условие

один проход(шаг) цикла называется итерацией.

Есть ещё два оператора для управления циклами.

Exit прерывает цикл и передаёт управление на команду что идёт за циклом(досрочный выход из цикла)

Continue прерывает текущую итерацию и передаёт управление на начало цикла(переход к следующей итерации)

Рассмотрим несколько примеров - задач на циклы

Найти сумму первых N чисел

Нам понадобятся три переменные: k-переменная цикла, N-количество чисел суммы которых мы будем искать, s-для вычисления суммы - строка 4

справиваем количество чисел которые нужно просуммировать и заносим это число в переменую N - строка 5

подготоваливаем переменную для накопления суммы - обнуляем. В данном случае в переменой s и так будет 0, но в других языках, в другом месте, в другое время это может быть и не так. Поэтому переменные нужно обнулять перед использованием - строка 6

начинаем цикл с 1 до N - строка 7

к имеющемуся значению переменной s добавляем очередное число k. На первой итерации у нас s=0, k=1 получим s=0+1. На втором проходе цикла у нас s=1, k=2 получим s=1+2.
На третьем - s=3, k=3 получим s=3+3, и т.д. - строка 8

Конец тела цикла - оператор NEXT - строка 9 здесь при каждой итерации переменная цикла (k) уеличивается на шаг цикла (сейчас 1) и проверяется условие для изменившегося k... и при k=101 условие строки 7 не выполняется - текущее значение k(101) больше конечного значения(100). Цикл прекращается и программа переходит к исполнению строки 10

строка 10 выводит на экран вычисленную сумму

Напечатать чётные числа от 1 до 100

решение можно записать одной строкой
FOR i=2 to 100 step 2:PRINT i;:NEXT i

но я хочу продемонстрировать работу continue

Dim as integer i
For i=1 to 100
if (i mod 2)<>0 then continue for
print i;
next i
sleep

как видите для continueEXIT) нужно указывать какой цикл прервать - continue for
А если циклы вложенные и нужно прервать оба - continue for, for

переменнная i пробегает в цикле все значения от 1 до 100, но условием если остаток от деления числа i на 2 не равен нолю то мы это значение пропускаем и переходим к следующему значению переменной цикла, к следующей итерации.

Обратите внимание как записывется "не равно" - <> или так ><

Напечатать таблицу умножения 10х10

dim as integer i,j

for i=1 to 10
for j=1 to 10
locate j,i3
print i
j
next j
next i

Во первых вспомните оператор locate он принудительно задаёт позицию для последующего вывода симола на экран.
Вначале указываем строку, а затем отступ от левого края. Так как числа в таблице одно-двухциферные плюс ещё один символ на отступ то для вычисления отступа слева мы i*3.
Цикл с переменной j - внутренний, а с i - внешний.
Два

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

@sergiy

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