Адрес: ул. Б. Очаковская 32 Москва Россия
Наши официальные канал и чат в telegram, группа в ВКонтакте

Авторский курс программирования на yabasic от @Terrazocultor

Подробный курс по программированию для начинающих программистов и просто любопытных людей

История разработки, новости релизов и документация
Аватара пользователя
Anton
Site Admin
Сообщения: 239
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

Авторский курс программирования на yabasic от @Terrazocultor

Сообщение Anton »

Авторский курс программирования на yabasic от @Terrazocultor
Канал YouTube @Terrazocultor

Глава 1. ВВОДНАЯ ИНФОРМАЦИЯ, ПЕРВЫЕ ШАГИ
Показать
  1. Представление курса
  2. Скачивание и установка YaBasic
  3. Интерпретируемые и компилируемые языки
  4. Термины и концепции ИТ, которые полезно знать
  5. Ограничения памяти. Проверяем доступные объемы
  6. Контроверсийные номера строк (уже устарели)
  7. Скорость вычислений. Сколько времени займёт расчёт одного миллиона квадратных корней?
  8. Бонус: Программа игры «Четыре в ряд», против компьютера, создана мной в течение двух месяцев. Содержит более 3000 строк кода.
  9. Видеоматериал
Глава 2. ТЕКСТОВЫЙ РЕЖИМ. Print, Chr$,…
Показать
Глава 3. ГРАФИЧЕСКИЙ РЕЖИМ
Показать
  1. Графический режим. Пиксель
  2. Вход в графический режим. Open window
  3. Системные переменные WinWidth и WinHeight (ширина и высота в пикселях)
  4. Рисование отдельных пикселей. Команда Dot
  5. Установка цвета рисования и фона: Color и Backcolor
  6. Проведение прямой линии между двумя точками. Команда Line
  7. Рисование окружности. Circle
  8. Рисование прямоугольника. Rectangle
  9. Рисование треугольника. Triangle
  10. Вывод текста в графическое окно. Команда Text
  11. Очистка содержимого графического экрана. Clear window
  12. Вернуть всё как было: закрыть графическое окно. Close window
  13. Уголок ТЕОРИИ: Важность документирования программы. Оператор REM
  14. Видео
Глава 4. ПЕРЕМЕННЫЕ
Показать
  1. Определение переменной
  2. Идентификаторы или имена переменных
  3. Типы переменных
  4. Присваивание значений переменным
  5. Глобальные и локальные переменные
  6. Счётчик или накопитель и его кажущийся парадокс: A = A + 1
  7. Сравнение переменных. Операторы отношения >, <, =
  8. Уголок ТЕОРИИ
    8.1 Строго типизированные языки против языков без строгой типизации
    8.2 Чувствительность к регистру. YaBasic чувствителен к регистру
    8.3 Константы в противоположность переменным
  9. Видео
Глава 5. ЦИКЛЫ
Показать
Глава 6. Операторы IF и SWITCH (CASE)
Показать
Глава 7. Примеры программ на YaBasic: база данных транзисторов и квинела
Показать
Глава 8. СЛУЧАЙНЫЕ ЧИСЛА
Показать
Глава 09. Числовые функции и функции преобразования
Показать
Глава 10. Диаграммы потоков и диаграммы Насси-Шнейдермана (Chapin)
Показать
Аватара пользователя
Anton
Site Admin
Сообщения: 239
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

Re: Авторский курс программирования на yabasic от @Terrazocultor

Сообщение Anton »

2.2 Цикл While – Wend

Перевод «While» — «пока». Здесь мы заранее не знаем, сколько будет итераций. Справа от While ставится условие. Если оно истинно, цикл выполняется. Если ложно, программа переходит к инструкции, следующей за циклом.

Важная деталь: этот цикл может не выполниться ни разу, если условие с самого начала ложно. Структура:

Код: Выделить всё

While (Условие)
   Инструкция(и)
Wend
Пока условие истинно, выполняются инструкции внутри цикла. Предположим, условие — (x < 100). Пока x меньше 100, цикл повторяется. Подразумевается, что внутри цикла должно быть что-то, изменяющее значение x, чтобы рано или поздно оно стало равным или большим 100, и цикл завершился. Иначе цикл никогда не закончится, станет бесконечным, и компьютер «зависнет». Это считается ошибкой программирования. У цикла ВСЕГДА должен быть конец, даже если он наступит через часы или дни вычислений.

Пример цикла с конкретным условием:

Код: Выделить всё

Lee_Un_Dato(x)
While x < 100
   Инструкция_1
   Инструкция_2
   Lee_Un_Dato(x)
Wend
Здесь из гипотетического файла читается переменная x; если она меньше 100, цикл продолжается: выполняются инструкции 1 и 2, снова читается x, и условие проверяется заново. Если условие выполняется — ещё одна итерация, если нет — программа идёт дальше после Wend.

Более надёжный вариант учитывает возможность достичь конца файла, не найдя значения, равного или большего 100. В этом случае цикл тоже должен завершиться, так как читать дальше конца файла нельзя:

Код: Выделить всё

Lee_Un_Dato(x)
While (x < 100) And Not(Eof)
   Инструкция_1
   Инструкция_2
   Lee_Un_Dato(x)
Wend
Типичная логическая переменная во многих языках для определения конца файла — EOF (End Of File). Мы рассмотрим её в главе о файлах.

Я соединил условия x < 100 и Not(EOF) оператором AND, потому что для продолжения цикла нужно, чтобы x был меньше 100 И не был достигнут конец файла.

Первое условие я заключил в скобки (x < 100), поскольку математические и логические операции в информатике имеют приоритеты, которые можно менять скобками. Я посвящу отдельную главу этой тонкой, но важной теме: приоритеты логических и математических операторов.
Аватара пользователя
Anton
Site Admin
Сообщения: 239
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

Re: Авторский курс программирования на yabasic от @Terrazocultor

Сообщение Anton »

2.3 Цикл Repeat – Until

В некоторых языках называется Do – While.

Типичная структура:

Код: Выделить всё

Repeat
   Инструкция(и)
Until Условие
Здесь есть важный нюанс: условие проверяется в конце цикла, после Until. Это значит, что цикл всегда выполнится хотя бы один раз, а затем, если условие истинно, цикл завершится. В этом большое отличие от WhileWend, который может не выполниться ни разу, потому что условие проверяется в начале.

Условие, как и в While-Wend, может быть простым или сложным. Примеры:

Код: Выделить всё

Until x > 100
Until Contador = 0
Until (Contador = 0) Or (Tecla$ = "F")
Рассмотрим конкретный пример: в цикле мы принимаем нажатие клавиши, сохраняем его в строковую переменную, и если нажата клавиша esc, цикл завершается; иначе нажатая клавиша выводится на экран, и цикл продолжается.

Код: Выделить всё

Clear Screen
Repeat
    Tecla$ = Inkey$
    Print "Нажата клавиша: ", Tecla$
Until Tecla$ = "esc"
End
Если запустить эту программу, при каждом нажатии клавиши на экран будет выводиться строка с текстом «Нажата клавиша: » и названием клавиши. Обратите внимание: для функциональных или специальных клавиш печатается их название (или сокращение), а не просто символ. Например, для Enter выводится enter, для F4 — F4, для Escape — esc.
Аватара пользователя
Anton
Site Admin
Сообщения: 239
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

Re: Авторский курс программирования на yabasic от @Terrazocultor

Сообщение Anton »

2.4 Цикл Do – Loop

Этот четвёртый тип цикла не имеет конца, это бесконечный цикл. Поэтому мы сами должны реализовать внутри него какой-то алгоритм выхода. Иначе программа будет «с изъяном». Хорошо написанная программа НИКОГДА не должна зависать.

Такой тип цикла поддерживается не во всех языках программирования. Он действительно один из наименее используемых, но он существует.

Структура:

Код: Выделить всё

Do
   Инструкция(и)
Loop
В теле цикла, между Do и Loop, должно быть что-то, позволяющее выйти из цикла в нужный момент. Есть несколько способов:
  • Оператор Break (рассмотрим в пункте 4)
  • Оператор Goto (не рекомендуется, это «страшилка» программирования, но мы его тоже рассмотрим)
Пример цикла Do – Loop:

Код: Выделить всё

x = 20
Do
   If x = 0 Break
   Print x
   x = x - 1
Loop
  • В примере x изначально равен 20.
  • Начинается цикл, проверяется, равен ли x нулю; если да, выполняется Break, который немедленно выводит из цикла (программа продолжается после Loop).
  • Если x не равен нулю, цикл продолжается, и выводится значение x.
  • Затем значение x уменьшается на 1.
В результате на экран будут выведены числа от 20 до 1. Ноль не выводится, потому что перед Print стоит Break, вызывающий выход из цикла.
Аватара пользователя
Anton
Site Admin
Сообщения: 239
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

Re: Авторский курс программирования на yabasic от @Terrazocultor

Сообщение Anton »

3. Вложенные циклы

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

Примеры:
  • Годы, в каждом году 12 месяцев, в каждом месяце 28, 29, 30 или 31 день в зависимости от месяца. Здесь три вложенных цикла: год, месяц, день.
  • Часы, в каждом часе 60 минут, в каждой минуте 60 секунд. Тоже три вложенных цикла: часы, минуты, секунды.
  • В спортивных ставках (футбольные матчи) есть купон, внутри купона — ставка (8 на момент написания), внутри ставки — 15 матчей, в каждом матче три возможных исхода: 1, X и 2. Программа, генерирующая комбинации, должна использовать ЧЕТЫРЕ вложенных цикла: купон, ставка, матч, исход.
  • Ещё один пример, который мы сделаем как практическое задание (я упоминал его в пункте 1): нужно вывести таблицу умножения от 1 до 10. Есть как минимум три способа, от худшего к лучшему:
    1. «В лоб»: 100 строк с одной командой PRINT в каждой.
    2. С обычными циклами: 10 циклов For – Next, и дело сделано. Потребуется 30 строк — на 70 меньше, чем в первом случае.
    3. С вложенными циклами мы не только экономим строки (всего меньше 10 строк), но и само решение гораздо элегантнее.
Посмотрим:

Код: Выделить всё

' ТАБЛИЦА_УМНОЖЕНИЯ
Clear Screen
For Tabla = 1 To 10
     For Linea = 1 To 10
          Print Tabla, " x ", Linea, " = ", Tabla * Linea
     Next Linea
     Print "Нажмите клавишу для продолжения"
     Inkey$
Next Tabla
End
Также можно использовать три вложенных цикла для имитации часов с секундами, минутами и часами. Самый внутренний цикл (который завершается первым) — секунды. Затем минуты, и наконец часы.

Сделаем такой вложенный цикл и выведем результат на экран, используя продвинутые возможности PRINT с ключевым словом USING и функцией AT.

Код: Выделить всё

Clear Screen
For Horas = 0 To 23
     For Minutos = 0 To 59
          For Segundos = 0 To 59
               Print At(30,12) Horas Using "##", ":"
               Print At(33,12) Minutos Using "##", ":"
               Print At(36,12) Segundos Using "##"
               Wait(0.0001)
          Next Segundos
     Next Minutos
Next Horas
End
Глядя на этот код, снова подчеркну важность отступов для мгновенного понимания структуры.

Замечу, что строить собственные часы не обязательно: в системе уже есть часы, и YaBasic использует их через Time$ (время) и Date$ (дата).

Код: Выделить всё

Print Time$
Print Date$
Итак: мы будем использовать вложенные циклы всякий раз, когда структура задачи напоминает русские матрёшки: каждая кукла находится внутри большей, и так далее. Иногда вложенных циклов будет всего два (минимум), иногда больше… или значительно больше. Мне приходилось вкладывать более пятнадцати циклов для решения одной задачи.
Аватара пользователя
Anton
Site Admin
Сообщения: 239
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

Re: Авторский курс программирования на yabasic от @Terrazocultor

Сообщение Anton »

4. Как выйти из цикла досрочно: оператор Break

Обычный способ выхода из цикла — его естественное завершение:
  • В цикле For-Next: когда индексная переменная достигает конечного значения.
  • В циклах While: когда условие перестаёт выполняться.
  • В циклах Repeat: когда условие становится истинным.
Однако можно выйти досрочно с помощью оператора Break (по-английски «разрыв»). Когда внутри цикла выполняется Break, выход из цикла происходит немедленно и безусловно.

Проверим Break в цикле For – Next:

Код: Выделить всё

For x = 1 To 20
   If x = 10 Break
   Print "x равен ", x
Next x
End
Цикл должен был бы идти от 1 до 20, но внутри проверяется, не равен ли x десяти; если да, выполняется Break, выход из цикла и завершение программы. Если x ещё не равен 10, цикл продолжается, и Print выводит значение на экран.

В соответствующей программе Break проверяется со всеми типами циклов.
Аватара пользователя
Anton
Site Admin
Сообщения: 239
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

Re: Авторский курс программирования на yabasic от @Terrazocultor

Сообщение Anton »

5. Когда цикл «зависает»…

Если у цикла нет конца, говорят о бесконечном цикле. Бесконечный цикл нежелателен, это ненормальный процесс. Можно считать бесконечный цикл ошибкой программирования. Программист должен следить, чтобы такого не случалось.

На самом деле «зависает» не столько цикл, сколько компьютер. Выражение «компьютер завис» может показаться просторечным, но оно корректно и употребимо даже в формальной, академической и профессиональной среде.

Зависший компьютер легко узнать: он не реагирует на клавиатуру, мышь, функциональные клавиши; накопители недоступны; экран ничего не показывает или показывает статичную картинку. Всё в компьютере замирает, будто заморожено. Цикл поглощает всё «внимание» компьютера и не делает ничего, кроме повторения.

Конечно, бесконечный цикл — не единственная причина зависания. Есть и другие:
  • нехватка памяти;
  • повреждение отдельных областей памяти;
  • выполнение некорректной инструкции.
Иногда для выхода из зависания можно использовать комбинацию клавиш, например Ctrl + C, доступную в YaBasic и некоторых других языках, но порой не остаётся ничего, кроме перезагрузки ПК.
Аватара пользователя
Anton
Site Admin
Сообщения: 239
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

Re: Авторский курс программирования на yabasic от @Terrazocultor

Сообщение Anton »

6. Циклы и структурное программирование

Программа, особенно большая и сложная, будет выполняться вверх и вниз, возвращаться, делать переходы, вызывать подпрограммы (и возвращаться) и т. д.

Тут-то и вспоминается злополучная инструкция Goto («перейти к»), которая как раз и служит для перехода в любую точку программы, если поставить там метку.

Однако Goto, особенно при злоупотреблении, создаёт «спагетти-структуру», превращающую программу в кашу, в настоящий хаос, который очень трудно читать любому программисту.

Здесь вступает в силу теорема о структурном программировании, которой я буду придерживаться на протяжении всего курса. Она направлена на хорошую читаемость программ и утверждает, что любую программу, какой бы длинной и сложной она ни была, можно написать без единого Goto, используя три вида конструкций:
  1. Последовательный код — часть программы без особенностей: одна инструкция за другой. Любая программа содержит один или несколько последовательных фрагментов.
  2. Ветвления или выбор — принятие решений. Есть несколько операторов, один из важнейших — If, который мы рассмотрим в следующей главе. В зависимости от языка есть и другие операторы выбора, например Switch или Case.
  3. Циклы, рассмотренные в этой главе.
С помощью этих трёх структур можно построить любую программу и решить любую задачу, особенно если использовать блок-схемы, которым будет посвящена отдельная глава. Помимо обычных блок-схем мы рассмотрим ещё один, менее известный вид, который не просто «позволяет» писать структурно, а «заставляет» программировать структурно.
Аватара пользователя
Anton
Site Admin
Сообщения: 239
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

Re: Авторский курс программирования на yabasic от @Terrazocultor

Сообщение Anton »

У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Anton
Site Admin
Сообщения: 239
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

Re: Авторский курс программирования на yabasic от @Terrazocultor

Сообщение Anton »

1. Оператор If

Эта «груда металлолома» (не самый изящный способ описать компьютер) может заставить нас проиграть в «интеллектуальных» играх, таких как шахматы. И во многом другом тоже. Оператор If, который мы рассмотрим в этой главе, имеет прямое отношение к тому превосходящему интеллекту, который мы приписываем компьютеру.

Оператор If — это средство принятия решений в языке программирования. Практически все языки имеют его, с той или иной синтаксической формой. Как и в случае с циклами: язык без If был бы почти бесполезен.

«If» по-английски означает «если», но не утвердительное «да», а условное «если». Примеры:

Если идёт дождь (или скоро может пойти), то → беру зонт.
Если цена больше 50, то → не могу себе позволить купить.
Если температура < 19°, то → включаю отопление.

Оператор If (по крайней мере, в Yabasic) довольно универсален и имеет несколько форм — от самой короткой и простой до более развёрнутых. Рассмотрим их далее.
Аватара пользователя
Anton
Site Admin
Сообщения: 239
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

Re: Авторский курс программирования на yabasic от @Terrazocultor

Сообщение Anton »

2. Короткая и простая форма If

Самая короткая и простая форма занимает одну строку, но не всегда она уместна.

Синтаксис:

Код: Выделить всё

If Условие Инструкция
Практический пример:

Код: Выделить всё

If edad >= 18 Print "Совершеннолетний"
В этом примере:
  • УСЛОВИЕ: edad >= 18
  • ИНСТРУКЦИЯ: Print "Совершеннолетний"
Обратите внимание: в короткой форме нет частицы Then. Это не ошибка; наоборот, если поставить Then, возникнет ошибка. Следующая строка ошибочна из-за Then:

Код: Выделить всё

If edad >= 18 Then Print "Совершеннолетний"
Ещё одна особенность (это так и есть): нельзя поставить две или более инструкций, даже разделённых двоеточием :, типичным для Basic. Следующая строка вызовет ошибку или программа поведёт себя непредсказуемо:

Код: Выделить всё

If edad >= 18 Print "Совершеннолетний": Contador = Contador + 1: Beep
Такое не допускается синтаксисом YaBasic. Нельзя поместить две или более инструкций даже через двоеточие. Для этого нужно использовать не сокращённую форму, которую рассмотрим в следующем пункте.