Роли переменных в программе и почему будет полезно рассказать о них ученикам

образовательный процесс
программирование
Программирование это ремесло или творчество? Ответить на этот вопрос не так уж и просто. С одной стороны, программа - это текст, у которого есть автор, код - это результат интеллектуального труда, как и художественное произведение. С другой стороны этот текст должен следовать строгим правилам и содержит паттерны - повторяющиеся из программы в программу шаблоны программирования.
Дата публикации

14 июня 2024 г.

Такой подход напоминает ремесленный труд, состоящий из набора отточенных до автоматизма действий. Трудно изобрести новый способ обхода элементов массива или поиска максимального значение в наборе данных. Для решения типовых задач используются такие же типовые фрагменты кода из которых, как из конструктора, создаётся код решения.

Изучение программирования состоит из следующих этапов:

Изучение ролей переменных относится к последнему пункту. Переменные в исходном коде программы поддаются классификации по назначению. Типичная ситуация для человека только начинающего изучать программирование - проблема “чистого листа”. С чего начать решение задачи? На какие подзадачи разбить крупную задачу? Классификация переменных даёт начинающему программисту некий каркас, основу для рассуждений. Из назначения переменных следуют и алгоритмы их обработки. Если для решения понадобится переменная-аккумулятор, значит появится цикл и некое выражение для накапливания подходящих значений и так далее.

Список ролей

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

Фиксированное значение (Fixed value)

Значение переменной присваивается сразу после запуска программы или единожды после ввода значения с клавиатуры. В примере на вычисление площади круга, переменные pii и r считаются фиксированными.

pii = 3.14
r = float(input("Введите радиус круга: "))
print("Площадь круга равна ", pii*r*r)

Счётчик (Stepper)

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

multiplier = 1                                  
while multiplier <= 10 :                        
    print (multiplier, "* 3 =", multiplier*3)   
    multiplier += 1                              

Переменная multiplier будет счётчиком, так как последовательно принимает значения от 1 до 10.

Последнее обрабатываемое значение (Most-recent holder)

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

В следующем примере переменная s хранит последнее введённое с клавиатуры значение.

s = 0                                                                
while s <= 0 :                                                      
    s = float(input("Введите длину стороны квадрата: "))   
print ("The area of the square is", s*s)                             

Во втором примере удвоим каждый элемент списка. Переменная num на каждом шаге цикла хранит последнее обрабатываемое значение из списка.

lst = [1, 2, 3, 4, 5]
for num in lst:
    print(num * 2)

Наиболее подходящее значение (Most-wanted holder)

Такая переменная хранит последнее найденное значение, подходящее под определённое условие.

В следующем примере находим наименьшее значение из 10 введённых с клавиатуры. Переменная smallest хранит наиболее подходящее значение.

smallest = int(input("Введите число: "))       
for i in range(9) :                             
    number = int(input("Введите число: "))     
        if number < smallest :
                smallest = number     
print ("Минимальное число ", smallest)    

Аккумулятор (Gatherer)

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

В примере найдём сумму чётных чисел в списке. Переменная sum_ch будет накапливать чётные значения из списка.

lst = [4, 2, 5, 19, 3, 6]
sum_ch = 0
for num in lst:
    if num % 2 == 0:
            sum_ch += num
print("Сумма чётных чисел ", sum_ch)

Последователь (Follower)

Переменная-последователь сохраняет последнее значение какой-либо другой переменной. В следующей задаче вычисляем числа последовательности Фибоначчи. Для этого понадобится хранить два предыдущих значения последовательности. Переменные f1 и f2 будут последователями, так как сохраняют предыдущие значения других переменных.

f1 = 1
f2 = 1
for i in range(10):
    f = f1 + f2
    f2 = f1
    f1 = f
    print(f)

Флажок (One-way flag)

Флажок - это логическая переменная, которая может поменять своё значение на противоположное только один раз. В следующей программе определим, было ли хотя бы одно отрицательное число среди введённых с клавиатуры. Переменная-флажок в данном примере - is_negative .

is_negative = False
for i in range(5):
    inp_num = float(input("Введите число: "))
    if inp_num < 0:
        is_negative = True
if is_negative:
    print("Было отрицательное число")
else:
      print("Все числа были положительными")

Временное значение (Temporary)

Переменная считается временной, если её значение необходимо в течении короткого промежутка времени. Найдем значение следующей суммы: \[ sum=1+\frac{1}{2}+\frac{1}{3}+...+\frac{1}{n} \]

n = int(input("Количество слагаемых: "))
sum = 0
for i in range(1, n + 1):
    a = 1 / i
    sum += a
print("Значение суммы: ", sum)

Переменная a - временная, так как нужна только для хранения очередного слагаемого.

Органайзер (Organizer)

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

Контейнер (Container)

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


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

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

Думаю что в следующих заметках стоит уделить внимание алгоритмическим шаблонам, тем более, что ресурсы на эту тему есть.