Изучение шаблонов программ ведет к опыту программирования

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

Я обсуждал четыре шаблона: Input-Process-Output; Подскажите, затем прочтите; Делайте что-то определенное количество раз; и Прочтите один, первый обработайте. В этой статье я собираюсь обсудить еще четыре шаблона: Выбрать из альтернатив; Ввод и обработка до завершения; Процесс в циклах; и Накапливать значения до завершения.

Я нашел эти шаблоны, наряду со многими другими, которые подробно обсуждались в книге Майка Клэнси и Марсии Линн Designing Pascal Solutions. Помимо изучения языка Паскаль, основанного на изучении и использовании шаблонов программ, книга основана на проектах, где каждая глава представляет собой отдельный подробный проект, который студент должен выполнить. Проектное обучение не играет достаточно большой роли во вводном компьютерном программировании, и я планирую создать новый учебный материал, следуя проектам и шаблонам программ, представленным в этой книге.

Выберите из альтернатив

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

Псевдокод этого шаблона программы выглядит так:

если значение1, выберите альтернативу1
если значение2, выберите альтернативу2
если значение, выберите альтернативу-n
иначе, выполните другое действие

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

putstr("Enter a number: ";
number = parseInt(readline());
switch (number) {
  case 1: 
    print("I");
    break;
  case 2:
    print("II");
    break;
  case 3: 
    print("III");
    break;
  case 4:
    print("IV");
    break; 
  case 5:
    print("V");
    break;
  default:
    print("Did not recognize that input.");
}

В следующем примере показано, как использовать шаблон Выбрать из альтернативы, когда значения являются диапазонами (в C ++):

int temp;
if (temp > 70 && temp <= 90) {
  cout << "Go hiking";
}
else if (temp > 50 && temp <= 70) {
  cout << "Play golf";
}
else if (temp > 28 && temp <= 49) {
  cout << "Bundle up then go hiking.";
}
else {
  cout << "Build a fire and stay inside." << endl;
}

Ввод и обработка до завершения

Этот программный шаблон используется для обучения как циклу while, так и циклу do while, особенно при обучении студентов тому, как писать циклы с контрольным управлением, которые останавливаются, когда пользователь вводит специальное значение.

Для этого шаблона есть два примера псевдокода. Первый - для циклов while:

пока не закончили, сделайте следующее:
прочтите значение,
обработайте

Следующий - для циклов do-while:

повторяйте следующее, пока не закончите:
прочтите значение,
обработайте

Вот проблема, для решения которой требуется первая версия этого шаблона: напишите цикл, в котором пользователь вводит оценки, добавляя их к общей сумме. Остановитесь, когда пользователь вводит -1. Вот программа на Python:

grade = 0
total = 0
while grade != -1:
  total = total + grade
  grade = int(input("Enter a grade: "))
print(total)

Для цикла do-while требуется условный оператор внизу цикла, поэтому он используется в разных ситуациях. Вот пример проблемы: напишите программу, предлагающую пользователю ввести пароль, пока он не введет его правильно. Вот решение для JavaScript:

let password = "letmein";
let login = "";
do {
  putstr("Enter your password: ");
  login = readline();
} while (login != password);
print("You're in!");

Процесс в циклах

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

Вот псевдокод этого шаблона:

указанное количество раз или пока условие истинно:
проверка условия:
выполнить действие, если истинно

else:
выполнить действие, если ложь

Тест не обязательно должен включать предложение else, но я включил его в псевдокод для полноты.

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

evens = 0
odds = 0
number = int(input("Enter a number: "))
while number != -1:
  if number % 2 == 0:
    evens = evens + 1
  else:
    odds = odds + 1
  number = int(input("Enter a number: "))
print("Evens:",evens)
print("Odds:", odds)

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

Вот решение на JavaScript:

let sentence = "now is the time for all good people";
let count = 0;
for (let i = 0; i < sentence.length; i++) {
  if (sentence[i] == " ") {
    count++;
  }
}
print("Number of spaces:",count);

Накапливать, пока не сделано

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

Псевдокод этого шаблона:

инициализировать переменную или набор переменных для хранения «накопленных» значений
повторять для каждого значения во введенной последовательности:
накапливать значение

Этот шаблон не нужно просто использовать для поиска промежуточной суммы или продукта. Как я предложил в первом абзаце, вы также можете использовать его, чтобы найти минимальное или максимальное значение. Я продемонстрирую это в одном из примеров программ ниже.

Вот первая проблема, с которой соответствует этот шаблон: попросите пользователя ввести 10 оценок. Суммируйте оценки и отобразите среднее значение. Вот решение этой программы на C ++:

int main()
{
    int total = 0;
    int grade;
    const int NUM_GRADES = 10;
    for (int i = 1; i <= NUM_GRADES; i++) {
        cout << "Enter a grade: ";
        cin >> grade;
        total += grade;
    }
    double average = static_cast<double>(total) / NUM_GRADES;
    cout << "The average is: " << average << endl;
    return 0;
}

Этот шаблон программы также можно использовать с контрольным циклом, который накапливает значения до тех пор, пока пользователь не остановит программу, введя контрольное значение, такое как -1. Вот эта программа на C ++:

int main()
{
    int total = 0;
    int grade;
    int count = 0;
    cout << "Enter a grade (-1 to stop): ";
    cin >> grade;
    while (grade != -1) {
        total += grade;
        count++;
        cout << "Enter a grade (-1 to stop): ";
        cin >> grade;
    }
    double average = static_cast<double>(total) / count;
    cout << "The average is: " << average << endl;
    return 0;
}

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

number = int(input("Enter a number: "))
minimum = number
maximum = number
for i in range(1,5):
  number = int(input("Enter a number: "))
  if number < minimum:
    minimum = number
  if number > maximum:
    maximum = number
print("Minimum:",minimum)
print("Maximum:",maximum)

Эта программа «накапливает» минимальное и максимальное значение, непрерывно сравнивая следующее введенное число с текущими минимальным и максимальным значениями, при необходимости меняя значения.

Обучение с использованием шаблонов

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

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

Разделение на части ведет к экспертизе

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