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

10. Вывод текста в графическое окно. Команда Text

Нельзя использовать Print для вывода текста в графическое окно. Если применить Print, вывод произойдёт в текстовом окне, которое, напомню, остаётся открытым (если только мы его не закроем, но тогда закроется и графическое окно, и программа завершится). Возможно, текстовое окно спрятано за графическим, но оно существует.

Чтобы вывести текст в графическое окно, используется инструкция Text:

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

Text x,y,"Введите вариант"
Эта команда размещает строку «Введите вариант» в координатах x,y.

Есть и дополнительные необязательные параметры.

Можно указать шрифт (то же самое, что и в инструкции Open window), но я пробовал несколько известных названий шрифтов и не смог его изменить. Возможно, это стоит исследовать. Ясно одно: шрифт по умолчанию, по крайней мере на моём ПК, — swiss.

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

Text x,y,"Привет","Arial"
Эта команда выводит слово «Привет» в точке x,y и теоретически должна активировать шрифт Arial, но, как я уже сказал, это не так. Возникает ошибка: этот широко известный шрифт не распознаётся.

Я отправил письмо команде Yabasic, чтобы узнать, является ли это ошибкой или, по крайней мере, недостатком документации. А пока продолжим использовать шрифт swiss.

Ещё один параметр, который можно указать в команде Text, — комбинация из двух букв для выравнивания текста:
  • Горизонтальное выравнивание: слева, по центру, справа: l, c, r (left, center, right)
  • Вертикальное выравнивание: сверху, по центру, снизу: t, c, b (top, center, bottom)
Пример: "lt" (left, top) — выравнивание по левому краю, сверху.

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

Clear Screen
Open window 300,300
Text 20,50,"Hola, Esto es un comentario"
Text 70,80,"Y esto es otro comentario"
Magenta$="255,0,255"
Color Magenta$
Text 70,110,"He cambiado el color a Magenta"
Inkey$
Close window
End
На следующем скриншоте видны три строки, размещённые в графическом окне; у последней изменён цвет на пурпурный. Слева — код программы.
text.jpg
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Anton
Site Admin
Сообщения: 239
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

Re: Авторский курс yabasic от @Terrazocultor

Сообщение Anton »

11. Очистка содержимого графического экрана. Clear window

Подобно тому как существует команда очистки текстового экрана, есть команда и для очистки графического экрана:

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

Clear window
У неё нет параметров или аргументов, используется как есть. Эта команда стирает любой текст или графику. Если ранее был задан другой цвет фона (с помощью BackColor), графический экран теперь будет окрашен этим цветом.
Аватара пользователя
Anton
Site Admin
Сообщения: 239
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

Re: Авторский курс yabasic от @Terrazocultor

Сообщение Anton »

12. Вернуть всё как было: закрыть графическое окно. Close window

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

Эта команда не имеет параметров:

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

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

Re: Авторский курс yabasic от @Terrazocultor

Сообщение Anton »

13. УГОЛОК ТЕОРИИ. Важность документирования программы. Оператор REM

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

Речь идёт о команде Rem — сокращение от Remark, что означает «комментарий».

Часто (слишком часто) не придаётся значения усилиям, направленным на повышение читаемости программ, причём не только для самого программиста, но, прежде всего, для других программистов. Есть несколько инструментов и привычек, повышающих читаемость, и один из них — команда Rem, позволяющая вставлять комментарии в программу.

Когда в программе встречается Rem, при выполнении программа игнорирует всё, что написано в этой строке: это не исполняемый код, а комментарии, предназначенные для документирования программы для тех, кто её читает. Из этого следуют некоторые выводы:
  • Строка с Rem никогда не вызовет ошибку: в ней можно писать что угодно.
  • Строк с Rem может быть сколько угодно, ограничений нет.
Пример небольшой программы с несколькими блоками комментариев:

Первые две строки — комментарии с Rem, поясняющие, что делает программа и кто её автор. Можно было бы прокомментировать и другое: дату создания и т. д.

У оператора Rem есть синонимы, например строки 3–7 начинаются с // — это ещё один допустимый способ вставить комментарий, очень похожий на язык C, где для комментариев используется тот же символ //.

Ниже мы видим строку, начинающуюся с одинарной кавычки ' — это ещё один допустимый способ сделать комментарий, но с ограничением: её можно ставить только в первой колонке строки, то есть в начале. Если поставить этот апостроф в любом другом месте, возникнет ошибка. Этот апостроф использовался в Pascal для комментариев, причём в любой позиции, даже в одной строке с кодом.
rem.jpg
Наконец, знак решётки # также служит для начала комментария, и, как и ', его можно использовать только в начале строки.

Итак, есть четыре варианта Rem:
  • Сам Rem
  • Двойной «слэш» //
  • Одинарная кавычка '
  • Решётка #
Последние два — только в начале строки.

Пустые строки, разделяющие функциональные части программы, не являются комментариями, но тоже помогают сделать её более читаемой. Они не увеличивают размер итоговой программы и не наносят никакого вреда. Использовать и комментарии, и пустые строки — хорошая привычка программирования. Когда спустя месяцы вам придётся разбираться со своим собственным творением, вы будете благодарны.

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

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

Rem Programa para simular un dado
Rem Autor: Perico de los palotes
// Inicializamos Tecla$ a carácter nulo ""
// para que el bucle Repeat-Until se cumpla
// al menos una vez. Sería una casualidad,
// pero podría ocurrir que Tecla$ tuviese de
// partida el calor "esc" por no haberla
// inicializado.
Tecla$=""

Clear Screen
' Repite el siguiente ciclo hasta que pulsemos tecla Escape
Repeat
   Numero = Int(Ran(6)) + 1
   Print "El numero es: ",Numero
   Print "Pulsa una tecla para otro numero"
   Tecla$ = Inkey$
Until Tecla$ = "esc"

# Hemos salido del bucle Repeat-Until porque se ha pulsado Esc
Print
Print "Hasta luego!"
Wait(3)
Clear Screen
End
rem2.jpg
Первая пустая строка отделяет верхнюю часть программы (инициализацию) от основной части. Вторая пустая строка отделяет основную часть от завершающей части — окончания программы.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
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. Определение переменной

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

Переменную можно представить как ящик в памяти компьютера, предназначенный для хранения одного значения. И это значение можно менять/обновлять так часто, как требуется.
memoria.jpg
На рис. 1 очень упрощённо изображена память компьютера, а в ней — четыре переменные, каждая своего размера, подходящего для данных, которые она может содержать. Видно, что только две переменные (edad и direccion) содержат данные. Две другие (Nombre и NIF) пусты, но место зарезервировано: переменная не имеет значения, но существует.

Переменные начинают существовать в момент их определения или объявления (в строго типизированных языках) или в момент первого упоминания (в языках со слабой типизацией, как Basic). Эти переменные существуют всё время выполнения программы. Их содержимое можно стереть: числовая станет равной 0, строковая — пустой строке "", но переменная продолжит существовать до завершения программы.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Anton
Site Admin
Сообщения: 239
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

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

Сообщение Anton »

2. Идентификаторы или имена переменных

Чтобы использовать переменные, им нужно дать имя.
Имя должно соответствовать нескольким простым правилам:
  • Имя может состоять из одной буквы, например: A, I, J, Z.
  • Может состоять из двух или более букв и/или цифр, то есть слова (осмысленного или нет):
    • Saldo1
    • Asereje
    • Maximo
  • Может состоять из фразы или нескольких слов, но пробелы не допускаются, всё пишется слитно. Чтобы назвать переменную «максимальное значение оси X», можно сделать так:
    • Valor_Maximo_Eje_X
    • ValorMaximoEjeX
    • VMEX
В первом варианте использован символ подчёркивания _. Обычный дефис - использовать нельзя: он зарезервирован для операции вычитания и вызовет ошибку.

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

В третьем варианте взяты только первые буквы каждого слова — вполне допустимо, но такое имя даёт мало информации о содержимом переменной, если только нет комментария. Я бы такого избегал.

Нельзя использовать в качестве имени переменной зарезервированные слова Basic, то есть имена команд или операторов. Например, следующая строка вызовет ошибку:

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

Print = 7
Здесь мы пытаемся присвоить число 7 переменной Print, но Print не может быть именем переменной, потому что это инструкция Basic, зарезервированное слово. При выполнении программы возникнет ошибка. Это правило есть во всех языках.

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

Как правило, мы будем использовать понятные имена переменных, отражающие их содержимое или назначение. Бессмысленное или противоречивое имя будет работать, но мы окажем себе плохую услугу (или тому, кто потом будет модифицировать или дополнять программу) с точки зрения читаемости.

Лучше напечатать чуть больше символов и иметь ясные имена, чем печатать мало, но иметь загадочные и нерасшифровываемые имена.

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

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

Сообщение Anton »

3. Типы переменных

Было бы просто, если бы существовал только один тип переменных, но это было бы неэффективно.

Есть много типов данных и переменных; другой вопрос, поддерживает ли их наш язык. Не все языки включают все типы, и Basic — не самый полный, по крайней мере та версия, которую мы рассматриваем. Но всё же в YaBasic можно делать много интересного.

Сначала краткий обзор наиболее распространённых типов переменных в информатике в целом; по мере рассмотрения будем отмечать, поддерживается ли тип в YaBasic.
  • 3.1 Числовые
    • 3.1.1 Целые
      • 3.1.1.1 Short (1 байт)
      • 3.1.1.2 Int (2 байта)
      • 3.1.1.3 Long (4 байта)
    • 3.1.2 Вещественные
      • 3.1.2.1 Single (4 байта)
      • 3.1.2.2 Double (8 байт)
  • 3.2 Строковые (алфавитно-цифровые)
  • 3.3 Char
  • 3.4 Логические (Boolean)
  • 3.5 Record
  • 3.6 Множество (Set)
  • 3.7 Указатели
Аватара пользователя
Anton
Site Admin
Сообщения: 239
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

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

Сообщение Anton »

3.1 Числовые переменные

Это переменные, предназначенные для хранения чисел. В информатике различают целые и вещественные числа, поэтому есть два подтипа:

3.1.1 Целые числа
Название говорит само за себя. Это числа без десятичной запятой и дробной части. Во многих языках есть разные форматы, использующие разное количество байт, что позволяет хранить целые числа разного размера. Есть три подтипа: Short, Int и Long.

В YaBasic есть только длинное целое (4 байта, 32 бита) со знаком, которое позволяет представлять числа от -2147483648 до +2147483647.

3.1.1.1 Short (короткое целое)
С одним байтом (8 бит, 256 комбинаций) можно выразить числа:
  • со знаком: от -128 до +127
  • без знака: от 0 до 255
3.1.1.2 Int или Integer
Целое из двух байт, 16 бит, позволяет числа:
  • со знаком: от -32768 до +32767
  • без знака: от 0 до 65535
3.1.1.3 Long (длинное целое)
Этот тип поддерживается в YaBasic. По крайней мере, мы можем быть уверены, что можем хранить довольно большие целые числа, ведь 4 байта (32 бита) дают диапазон:
  • со знаком: от -2 147 483 648 до +2 147 483 647
  • без знака: от 0 до 4 294 967 295
Замечание по поводу целых типов: можно спросить, зачем нужны Short и Int, если Long позволяет гораздо больше? Верно, но если обрабатываемые числа не превышают 127 (например, возраст людей), можно использовать Short, занимающий 1 байт, а не 2 или 4. Это даёт два преимущества: меньше расход памяти и выше скорость (обрабатывать 1 байт быстрее, чем 4).

В критическом или продвинутом программировании такие тонкости важны.

Однако в YaBasic выбора нет: нет типа Short (1 байт) и обычного целого (2 байта), есть только Long (4 байта).

3.1.2 Вещественные числа
Вещественные числа позволяют выразить число с целой и дробной частью. Например: 23.546
Для отделения десятичных знаков, как правило, используется англосаксонская нотация: точка . для десятичных.

Существуют разные форматы и точности для вещественных чисел, но наиболее употребительны:
  • Float (одинарная точность)
  • Double (двойная точность)
3.1.2.1 Float или одинарная точность

Используется 4 байта. Диапазон чисел: от 1.5 × 10^-45 до 3.4 × 10^38.
Значащих цифр 7–8.
Символ ^ означает «возвести в степень».
Можно выражать большие числа, но с не очень высокой точностью.

3.1.2.2 Double или двойная точность

Похоже, YaBasic поддерживает именно этот тип. Я говорю «похоже», потому что YaBasic работает с вещественными числами, но в обширном руководстве ничего не сказано о вещественном типе, поэтому мне пришлось исследовать это самому с помощью множества тестов.

Тип Double использует 8 байт и может представлять по-настоящему большие числа в диапазоне:
от 5.0 × 10^-324 до 1.7 × 10^308.
Значащих цифр теоретически 15–16, но в моих тестах получается только 6; остальное — экспонента, которая может достигать e308 для положительных чисел и e-324 для отрицательных.

Примечание о целых и вещественных числах в YaBasic:

Эта сторона данного варианта Basic мне не нравится. Типизация отсутствует: можно назвать переменную целой, присвоить ей целое число, а затем присвоить той же переменной вещественное число, и Basic не «возразит», ошибки не будет. Так быть не должно: в надёжном языке целая переменная предназначена для целых чисел, вещественная — для вещественных. Будем учитывать это, чтобы избегать ошибок. Подчеркну, что даже другие варианты Basic имеют более строгую типизацию, чем мы только что видели.
Аватара пользователя
Anton
Site Admin
Сообщения: 239
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

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

Сообщение Anton »

3.2 Строковые или алфавитно-цифровые переменные

Эти переменные служат для хранения любых данных или их смеси. Им можно присваивать: буквы, цифры, знаки препинания, математические символы, специальные символы — всё.

В числовой переменной любое значение, не являющееся цифрой, знаком +/- или десятичной точкой, теоретически вызовет ошибку. В алфавитно-цифровом поле принимается любой символ.

Имена строковых переменных подчиняются тем же правилам, что и числовых, но обязательно должны заканчиваться символом $, показывающим, что переменная строковая.

Пример:

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

Cuenta   ← числовая переменная
Cuenta$  ← строковая переменная, отличная от предыдущей
Если строковой переменной присвоить число, это допустимо, но с ним нельзя выполнять математические операции, потому что число воспринимается как «строка» — набор символов, и цифры здесь не числа, а символы. Если нужно выполнить математические операции с данными из строковой переменной, их следует преобразовать в числовую переменную с помощью функции VAL(), которую мы рассмотрим позже.

Многие данные выглядят как числа, но на самом деле их можно обрабатывать как строки, потому что с ними никогда не выполняются математические операции. Бессмысленно пытаться выполнять арифметические действия с ИНН (которые к тому же содержат букву и не могут быть числовыми). Также не имеет смысла выполнять математические операции с номером дома в адресе, поэтому такие данные я бы обрабатывал как строковые, а не числовые.

Содержимое строковой переменной почти во всех языках, не только в YaBasic, присваивается в кавычках.

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

NOMBRE$ = "Jacinto"    ← правильно
NOMBRE$ = Jacinto      ← неправильно
В первой строке переменной NOMBRE$ присваивается имя «Jacinto», и это правильно.

Во второй строке кавычки опущены. YaBasic считает, что Jacinto (без кавычек) — это числовая переменная, а строковой переменной нельзя напрямую присвоить число; потребовалась бы функция STR$(), преобразующая число в строку (обратная к VAL()), но это позже. Результат второй строки — ошибка, останавливающая программу (или не дающая ей запуститься).

Примеры строковых переменных с правильными именами и содержимым:

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

Nombre$ = "Paloma"
Pais$ = "Colombia"
Contrasena$ = "wxOp12/&%aabcc"
Dato$ = "22"
Nick$ = "Isa 33"
Обо всём этом будут практические примеры с мини-программами на YaBasic.

Что такое длина строки?

На всякий случай: строка — это содержимое строковой переменной.

Длина строки — количество символов в ней. Может быть 0, что означает, что переменная ничего не содержит; такая строка называется нулевой или пустой и обозначается двумя кавычками "".

В YaBasic максимальная длина строковых данных практически ограничена только доступной памятью, то есть огромна. Ещё не так давно строки были ограничены 255 символами не только в Basic, но и в других языках. 255 символов — не так уж много, и редко когда этого не хватало, но если не хватало, всегда были уловки для решения проблемы.

В примере выше длины строковых полей:

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

Nombre$ = "Paloma "          длина: 7 (пробел в конце) *
Pais$ = "Colombia"           длина: 8
Contrasena$ = "wxOp12/&%aabcc" длина: 14
Dato$ = "22"                 длина: 2
Nick$ = "Isa 33"             длина: 6 (пробел тоже считается)
* К таким тонкостям с пробелами в строках нужно привыкнуть. Пробелы считаются символами, будь они в начале, в середине или в конце строки. Так во всех языках программирования.