Адрес: ул. Б. Очаковская 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 »

3. Оператор If с EndIf

Эта форма не самая краткая и не самая простая, но она вовсе не сложная. Она наиболее часто используется, и на самом деле не обязательно применять короткую форму, даже если момент позволяет. Эта форма всегда применима. Синтаксис следующий, и я использую пример из предыдущего пункта, который был невозможен в сокращённой форме.

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

If edad >= 18 Then
    Print "совершеннолетний"
    Contador = Contador + 1: Total = Suma: r$ = ""
    Beep
EndIf
Вопрос (условие) тот же, что и в предыдущих примерах: edad >= 18.
Теперь появляется Then (переводится как «тогда»).

Мы видим три строки с инструкциями, которые выполняются, если условие истинно:
  • вывести фразу «совершеннолетний»;
  • увеличить переменную Contador на 1, присвоить Total значение Suma и сделать r$ пустой строкой;
  • издать короткий звуковой сигнал (оператор Beep).
Во второй строке теперь можно использовать возможность, которая есть практически во всех Basic: помещать две и более инструкций в одну строку, разделяя их двоеточием :. Возможно, в этом примере это не обязательно, но я показываю для наглядности. Лично я предпочитаю разворачивать код на несколько строк — так он для меня читабельнее, хотя в случае двух-трёх очень коротких инструкций иногда использую :.

Теперь обязательно закрыть If с помощью EndIf, чтобы программа знала, где заканчиваются инструкции, выполняемые при истинном условии. Если забыть EndIf, программа поведёт себя странно, и, скорее всего, мы получим ошибку сразу при запуске.

Важно чётко понимать: многострочный If всегда должен закрываться EndIf.

Ещё один корректный пример If с EndIf:

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

If Llave = 16 Then
    Codigo$ = "correcto"
EndIf
Несмотря на то что здесь только одна инструкция, это не короткая однострочная форма, поэтому в первой строке должен быть Then, а в конце — EndIf. EndIf должен стоять на отдельной строке.
Аватара пользователя
Anton
Site Admin
Сообщения: 239
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

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

Сообщение Anton »

4. Оператор If с Else (и EndIf)

Если условие If истинно, мы выполняем одну или несколько инструкций. Верно.

Но бывают случаи, когда нужно выполнить ДРУГУЮ последовательность инструкций, если условие НЕ выполняется. Для этого используется Else, что по-английски означает «в противном случае» или «иначе». То есть Else выполняется, когда УСЛОВИЕ не истинно.

Пример с Else:

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

If (Mes >= 6) And (Mes <= 8) Then
    Temporada$ = "Calor"
    SalinasCaseras = True
Else
    Temporada$ = "Frío"
    SalinasCaseras = False
EndIf
Если месяц — июнь, июль или август, это считается тёплым сезоном, и проект домашней солеварни (выпаривание морской воды для получения соли) жизнеспособен.

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

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

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

Сообщение Anton »

5. Оператор If с ElseIf (и EndIf)
В предыдущем пункте мы видели, что Else позволяет задать одну или несколько инструкций на случай, если условие не выполняется. Но оператору If всё ещё не хватает гибкости. Не хватает клаузулы ElseIf, которая фактически является Else, но с условием.

Благодаря ElseIf можно принимать решения на основе не одного, а множества условий — столько, сколько задано ElseIf. Посмотрим на пример:

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

If Nota < 3 Then
    Calif$ = "Очень плохо"
ElseIf (Nota >= 3) And (Nota < 5) Then
    Calif$ = "Плохо"
ElseIf (Nota = 5) Then
    Calif$ = "Удовлетворительно"
ElseIf (Nota = 6) Then
    Calif$ = "Хорошо"
ElseIf (Nota >= 7) And (Nota <= 8) Then
    Calif$ = "Отлично"
Else
    Calif$ = "Превосходно"
EndIf
Комментарии к коду выше:
  1. Можно ставить сколько угодно ElseIf.
  2. Настоятельно рекомендуется делать отступы вправо для инструкций (примерно 3–4 символа).
  3. Только один EndIf, в самом конце.
  4. У каждого ElseIf есть свой Then.
  5. Финальный Else можно было бы заменить на ElseIf, но поскольку остаются только две возможные оценки (9 и 10), без вариантов, ставится Else. Подразумевается, что в программе есть фильтр, не допускающий оценку меньше 0 и больше 10.
Аватара пользователя
Anton
Site Admin
Сообщения: 239
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

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

Сообщение Anton »

6. Условия. And и Or, больше >, меньше <, равно =, не равно <>

В операторах If часто используются логические операторы (And, Or, Not) и операторы отношения (>, >=, <, <=, =, <>), а также их сочетания.

Примеры операторов отношения:

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

a > b
edad < 65
Codigo$ = "2N3055"
Tecla$ <> "esc"
Операторы отношения:
  • > больше
  • < меньше
  • >= больше или равно
  • <= меньше или равно
  • = равно
  • <> не равно
Эти операторы мы уже знаем и многократно использовали. Кстати, логика таких выражений почти всегда допускает несколько вариантов записи, например эквивалентны:

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

>= 20
> 19
Операторы отношения очень полезны, но во многих случаях требуются логические операторы, чтобы связать два или более условия. Например, нужно узнать, попадает ли число в диапазон от 10 до 100 включительно.

Как записать такое условие? Способов несколько, например:

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

If (num >= 10) And (num <= 100) Then…
Читается: «Если num больше или равно 10 И num меньше или равно 100, то…»

And (логическое «И») требует, чтобы ОБА сравнения были истинными. Можно составить таблицу из четырёх возможностей:
num >= 10num <= 100РЕЗУЛЬТАТ С AND
ложьложьЛОЖЬ
ложьистинаЛОЖЬ
истиналожьЛОЖЬ
истинаистинаИСТИНА
С And должны выполняться ВСЕ условия (в данном случае два), чтобы всё условие было истинным. Совсем иначе получается с OR. Когда использовать AND, а когда OR? Подскажут здравый смысл и опыт. Рассмотрим пример с OR.

Продолжаем с числами. Предположим, мы читаем файл и хотим включить те записи, у которых поле «Вес» меньше 125 или больше 500. Это требование само подсказывает решение: число не может быть одновременно меньше 125 и больше 500 — либо одно, либо другое. Поэтому использование OR очевидно.

Составное условие из двух подусловий, соединённых OR:

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

If (Peso < 125) Or (Peso > 500) Then…
Читается: «Если Вес меньше 125 ИЛИ Вес больше 500, то…»

С точки зрения обратной логики, это исключает из выборки все записи, у которых поле «Вес» больше или равно 125 И меньше или равно 500.

Таблица истинности для этого If:
Peso<125Peso>500РЕЗУЛЬТАТ С OR
ложьложьЛОЖЬ, вес между 125 и 500
ложьистинаИСТИНА, вес > 500, не может быть < 125
истиналожьИСТИНА, вес < 125, не может быть > 500
истинаистинаИСТИНА, но этот случай невозможен: число не может быть одновременно < 125 и > 500, эта комбинация никогда не встретится, её игнорируем.
Аватара пользователя
Anton
Site Admin
Сообщения: 239
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

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

Сообщение Anton »

7. Вложенные операторы If

Как и циклы, операторы If можно вкладывать друг в друга (один If внутри другого).

При завершении сначала закрывается самый внутренний If:

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

If условие-1 Then          < Первый If (внешний)
    If условие-2 Then      < Второй If (вложенный, внутренний)
        Инструкция-2.1     < Инструкция внутреннего If
        Инструкция-2.2     < Инструкция внутреннего If
    EndIf                  < Конец внутреннего If
    Инструкция-1.1         < Инструкция внешнего If
    Инструкция-1.2         < Инструкция внешнего If
    Инструкция-1.3         < Инструкция внешнего If
Else                       < Else внешнего If
    Инструкция_1.4         < Инструкция Else внешнего If
EndIf                      < Конец внешнего If
Важно подчеркнуть:
  • Есть два If и два EndIf.
  • У первого (внешнего) If есть Else (но могло и не быть).
  • У второго (внутреннего) If нет Else (но могло быть).
  • Нет ElseIf ни в одном If (но мог быть в одном, в другом или в обоих).
Здесь вложено два If, но может быть 5, 6, 7 и более уровней вложенности, хотя на практике редко используют больше 3–4 уровней.

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

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

If TeclaFuncion = True Then          < Первый If
    If Tecla$ = "up" Then            < Второй If (вложенный)
        y = y - 1
        If y < Miny y = Miny         < Третий If (вложенный, короткая форма)
    ElseIf Tecla$ = "down" Then
        y = y + 1
        If y > Maxy y = Maxy
    ElseIf Tecla$ = "left" Then
        x = x - 1
        If x < Minx x = Minx
    ElseIf Tecla$ = "right" Then
        x = x + 1
        If x > Maxx x = Maxx
    EndIf                            < Этот EndIf закрывает второй If
EndIf                                < Этот EndIf закрывает первый If
Остальные If не имеют EndIf, потому что это короткие однострочные формы.
Аватара пользователя
Anton
Site Admin
Сообщения: 239
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

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

Сообщение Anton »

8. Другой способ использования If

Мы видели, что клаузула ElseIf позволяет проверять несколько условий внутри одного If (пункт 5). Но можно также использовать простые If без ElseIf. Это работает, но не совсем то же самое, что мы увидим в пункте 11 «Уголок теории».

Сначала с ElseIf:

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

If Tecla$ = "enter" Then
    PideDatos()
ElseIf Tecla$ = "esc" Then
    r$ = ""
ElseIf Tecla$ = "f1" Then
    MostrarAyuda()
ElseIf Tecla$ = "f3" Then
    Calculadora()
ElseIf Tecla$ = "f5" Then
    MostrarAgenda
EndIf
В этом коде сначала проверяется первое условие If Tecla$ = "enter". Если оно истинно, выполняется процедура PideDatos(), и на этом If завершается — остальные ElseIf уже не проверяются. Указатель программы переходит к инструкции после финального EndIf.

Если выполняется не первое, а второе условие, то выполнится r$ = "", и программа также перейдёт к инструкции после финального EndIf.

Как видим, время не тратится впустую на проверку всех условий, если одно уже оказалось истинным. Это экономит время и ускоряет выполнение.

Ту же работу можно сделать следующим кодом:

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

If Tecla$ = "enter" PideDatos()
If Tecla$ = "esc" r$ = ""
If Tecla$ = "f1" MostrarAyuda()
If Tecla$ = "f3" Calculadora()
If Tecla$ = "f5" MostrarAgenda
На первый взгляд этот код лучше: меньше текста, занимает меньше места (короткая форма If). Но у него есть недостаток, небольшой и незаметный в маленьких программах, но очень существенный в критичных и требовательных программах: независимо от того, какое условие истинно, проверяются ВСЕ If. Предположим, нажата клавиша «enter». Тогда будут проверены и четыре последующих If, хотя в этом нет необходимости, а это требует машинного времени, времени CPU. В первом примере с ElseIf такого не происходит: если условие истинно, выполняются связанные инструкции и происходит выход из If, время на остальные не тратится.

В пункте 11 я выполню практический тест с несколькими миллионами итераций обоих вариантов кода, чтобы увидеть разницу во времени. Для точного измерения времени используем оператор Basic Time$, который показывает время… и кое-что ещё.
Аватара пользователя
Anton
Site Admin
Сообщения: 239
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

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

Сообщение Anton »

9. Частые ошибки при использовании If

Рассмотрим самые частые ошибки в операторах If. Эти ошибки неизбежно будут совершаться, пока не появится опыт.

Начнём с короткой формы If. Типичная ошибка — поставить Then, хотя в короткой форме его быть не должно.

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

a = 100
If a > 50 Then c = c + 1        << Ошибка, лишний Then
Ошибка, которую мы получим:

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

---Error: if-clause starting at line 4 has seen no 'fi' at end of program
---Error: Couldn't parse program
---Error: Program not executed
---Program done, press RETURN---
Первая строка ошибки говорит: «Оператор 'If' в строке 4 не нашёл 'fi' во всей программе».

Пояснение: говорится, что не найден «fi». Это слово — альтернатива «EndIf», они равнозначны и дают одинаковый эффект. Я предпочитаю «EndIf». Возвращаясь к ошибке: вместо того чтобы предложить убрать Then, сообщается, что нужно поставить EndIf.

Другая довольно частая ошибка — забыть EndIf в If с Then.

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

a = 100
If a > 50 Then
    Print "a больше 50 и равно: ", a
    Print
    Print "Нажмите клавишу для продолжения"
    Sonido()
    Inkey$
                          // << Здесь должен быть EndIf

Sub Sonido()
    Beep
End Sub // sonido

End // программы
Вот какую ошибку выдаёт YaBasic:

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

---Error: do not define a function in a loop or an if-statement
   Sub Sonido()
   ^~~
---Error: if-statement starting at line 4 has seen no 'endif' yet
---Error: Couldn't parse program
---Error: Program not executed
---Program done, press RETURN---
Первая строка ошибки несколько запутанна, но вторая говорит ясно: «Оператор в строке 4 не находит EndIf». Если поставить EndIf на место и сохранить исходник, программа заработает.
Аватара пользователя
Anton
Site Admin
Сообщения: 239
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

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

Сообщение Anton »

10. Оператор Switch (Case или Select в других языках)

Этот оператор также является инструментом принятия решений и присутствует почти во всех языках. Разница между If и Switch:
  • В If проверяется условие (простое или составное).
  • В Switch проверяется значение переменной.
Структура:

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

'Программа для примера Switch
Clear Screen
Input "Введите число сторон многоугольника (3-7) " lados
While lados >= 3 And lados <= 7
    Switch lados
        case 3:     print "сторон: ", lados
                    print "название: Треугольник"
                    print "альтернативное название: Тригон"
                    Break
        case 4:     print "сторон: ", lados
                    print "название: Четырёхугольник"
                    print "альтернативное название: Тетрагон"
                    Break
        case 5:     print "сторон: ", lados
                    print "название: Пятиугольник"
                    print
                    Break
        case 6:     print "сторон: ", lados
                    print "название: Шестиугольник"
                    print
                    Break 
        case 7:     print "сторон: ", lados
                    print "название: Семиугольник"
                    print
                    Break
        End Switch
    print
    Input "Введите число сторон многоугольника (3-15) " lados          
    Wend
End
В этой программе оператор Switch начинается со слова Switch, за которым следует анализируемая переменная (lados). Далее перечисляются возможные случаи, начиная со значения 3 (case 3:), и инструкции, которые нужно выполнить для этого случая, заканчивая Break (в других языках используется End).

В примере пять case.

Всегда нужно завершать End Switch.

Советую использовать отступы для улучшения читаемости: case находятся на 3–4 пробела правее Switch и End Switch. Инструкции для каждого case сдвинуты ещё правее.

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

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

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

Сообщение Anton »

11. Уголок теории: эффективное программирование

Вернёмся к пункту 8, где были представлены два способа сделать одно и то же. Для задач малого масштаба (немного операций) не важно, какой метод использовать, но при больших объёмах (миллионы операций) это начинает иметь значение.

Я подготовлю программу, которую назову «быстрая», и другую, делающую то же самое (но не тем же способом), которую назову «не такая быстрая». В быстрой я использую ElseIf: как только условие проверено и оказалось истинным, остальные ElseIf уже не проверяются (до следующего цикла, разумеется). В этом и заключается экономия времени.

В программе «не такая быстрая» пять If стоят независимо, без ElseIf, поэтому все пять проверяются ВСЕГДА, независимо от того, какое условие истинно, а это требует больше времени. Код обеих программ:

'Программа БЫСТРАЯ                'Программа НЕ ТАКАЯ БЫСТРАЯ
Clear Screen                      Clear Screen
Print time$                       Print time$
For i = 1 to 41000000             For i = 1 to 41000000
    a = Int(ran(5))+1                 a = Int(ran(5))+1
    If a = 1 Then                     If a = 1 unos = unos + 1
        unos = unos + 1               If a = 2 doses = doses + 1
    ElseIf a = 2 Then                 If a = 3 treses = treses + 1
        doses = doses + 1             If a = 4 cuatros = cuatros + 1
    ElseIf a = 3 Then                 If a = 5 cincos = cincos + 1
        treses = treses + 1           Next i
    ElseIf a = 4 Then                 print time$
        cuatros = cuatros + 1         print "процесс завершён"
    ElseIf a = 5 Then                 End.
        cincos = cincos + 1
    EndIf
Next i
print time$
print "процесс завершён"
End
Функция time$ возвращает строку с текущим временем в формате: hh-mm-ss-t.
  • hh — часы, с ведущим нулём.
  • mm — минуты, с ведущим нулём.
  • ss — секунды, с ведущим нулём.
Четвёртое и последнее поле очень интересно, и мы его используем: это время (в секундах), прошедшее с момента запуска программы до её завершения. То есть это своеобразный секундомер, позволяющий узнать длительность процесса без ручных вычислений разницы между временем начала и конца программы.

После многократного запуска обеих программ получаем следующий результат (1):
Быстрая программа: 14 секунд;
Не такая быстрая: 17 секунд.

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

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

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

Сообщение Anton »

У вас нет необходимых прав для просмотра вложений в этом сообщении.