Обучение
October 3, 2022

Переменные и типы - как учить начинающих

В этой статье мы расскажем, как менялись наши представления о том, как надо рассказывать про переменные и их типы при обучении начинающих. И как менялся сам язык 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;

может быть осуществлен в любой момент и зависит от методики, используемой преподавателем.