Переменные и типы - как учить начинающих
В этой статье мы расскажем, как менялись наши представления о том, как надо рассказывать про переменные и их типы при обучении начинающих. И как менялся сам язык PascalABC.NET, позволяя использовать современные методики преподавания.
Ужасы старого Паскаля
В стародавние времена старый Паскаль предусматривал описание всех переменных до блока begin .. end. Первые программы, которые давались начинающим, были примерно такими:
var a,b: integer; c: real; begin a := 10; b := 3; c := Sqrt(a * a + b * b); end.
Однако свалка описания переменных в начале программы противоречила принципам описания переменных в других языках программирования: в месте своего первого использования.
В этом смысле наиболее показателен Python, где переменные вводятся в месте своего первого присваивания и упоминаний о типах нет вообще:
from math import * a = 10 b = 3 s = sqrt(a * a + b * b)
Описание с присваиванием в PascalABC.NET
Методика преподавания темы "Переменные" резко упрощается когда вначале мы рассказываем о переменных, не упоминая типы явно. И совмещаем описание с инициализацией. Поэтому в PascalABC.NET мы начинаем обучение вот с такого кода, который мало отличается от кода на Python:
begin var a := 10; var b := 3; var c := Sqrt(a * a + b * b); end.
О типах мы будем говорить немного позже - когда начинающие научатся решать простые задачи. Здесь мы можем лишь упомянуть, что переменным a и b присваиваются целые значения и не акцентировать внимание на том, что переменная c имеет вещественный тип.
Подход, в котором тип переменной не упоминается при ее описании, сочетается с новыми функциями ввода: ReadInteger, ReadReal, которые возвращают введенное значение. Сравним: вот та же программа с вводом данных с клавиатуры:
begin var a := ReadInteger; var b := ReadInteger; var c := Sqrt(a * a + b * b); end.
Здесь упоминание вводимого типа зашито в имени функции ReadInteger, но не более того. И по-прежнему описание совмещено с инициализацией. Можно даже совместить описание и ввод двух переменных, да еще и указать приглашение к вводу:
begin var (a,b) := ReadInteger2('Введите катеты:'); var c := Sqrt(a * a + b * b); end.
Сравнение со старым Паскалем и с Python
Подобный код на старом Паскале выглядит удручающе:
var a,b: integer; c: real; begin Write('Введите катеты: '); Read(a,b); c := Sqrt(a * a + b * b); end.
Да и на Python он тоже выглядит сложнее:
from math import * a = int(input("Введите a: ")) b = int(input("Введите b: ")) s = sqrt(a * a + b * b)
Когда надо рассказывать о явных типах
Рассказывать о типах в языках со статической типизацией, таких как PascalABC.NET, бесспорно надо. Но сделать это можно позже - когда начинающие уже освоят простейшие программы, связанные с вводом-вычислениями-выводом.
Вот первая программа, где типы приходится вводить явно, преподаватель должен рассказывать о типах и мы описываем переменную, указывая её тип:
begin var (a,b) := ReadReal2; var min: real; if a < b then min := a else min := b; end.
Заключение
var a := 5
упрощает преподавание начальных тем. Питон здесь теряет своё преимущество как языка, лёгкого для освоения в начале.
Переход к описанию с явным указанием типа
var a: integer;
может быть осуществлен в любой момент и зависит от методики, используемой преподавателем.