Scientific journal
Modern high technologies
ISSN 1812-7320
"Перечень" ВАК
ИФ РИНЦ = 0,940

DECOMPOSITION AND STRUCTURING OF C++ ALGORITHMS AND PROGRAMS IN HIGHER SCHOOL COMPUTER SCIENCE

Fokin R.R. 1
1 Military Space Academy named after A.F. Mozhaiskiy
Topics related to improving the quality of teaching mathematics and computer science in modern higher education have been repeatedly considered by this author. This article is about teaching C++. Algorithmization and programming have 3 fundamental principles: branching, Cycling, and structuring algorithms and programs. In training, algorithm structuring is usually considered last, moving on to data structuring and object-oriented technologies. The author suggests studying branching and Cycling in parallel with structuring the algorithm. Then a complex algorithm can be divided into several simple ones. This is the decomposition. As a result, complex branches and loops after splitting into simple ones are easier for students to understand. Another idea of the author is that the knowledge of the rules of the programming language in General and C++ in particular, obtained at lectures, does not follow the skills of developing algorithms and programs – they need to be formed in practical classes preceding laboratory work. The author also suggests that modern students should be taught visual programming as much as possible and classical programming as little as possible. Most modern students belong to the right-hemisphere psychological type. For them, imaginative thinking will prevail over conceptual thinking.
C++
programming
branching
structuring
decomposition
learning imagery
brain asymmetry

Актуальность рассматриваемой темы обусловлена большими трудностями обучения студентов программированию на языке С++ при изучении дисциплин области знаний «Информатика» в высшей школе. Знания и умения (компетенции), получаемые студентом при изучении С++, позволяют на следующем этапе легко освоить наиболее популярные языки современного профессионального программирования Java и C#. Изучение программирования на основе других языков делает перспективу освоения студентом компетенций профессионального программиста более отдаленной и проблемной.

Главная цель исследования автора статьи – выяснить причины отмеченного выше явления. Зная причины, можно предлагать пути решения соответствующих проблем. Эти причины многочисленны и разнообразны.

Материалы и методы исследования

В настоящее время указанное выше явление широко обсуждается вместе с другими проблемами обучения современному программированию. Данная статья является продолжением других наших статей. Также она развивает некоторые идеи автора и его коллег [1–3] по преподаванию математики и информатики. Для анализа используется опыт преподавания автором С++ в некоторых вузах Санкт-Петербурга. На основе анализа предлагаются некоторые новые методы и приемы обучения программированию на языке С++. Эти методы и приемы сравниваются с теми, что используются традиционно. Результаты обучения обобщаются и делаются практические выводы. Используются как индуктивные, так и дедуктивные методы исследования.

Результаты исследования и их обсуждение

При обучении программированию на С++ традиционно студенты слушают лекции по языку С++ и выполняют лабораторные работы по вариантам с использованием какой-нибудь системы программирования, включающей С++. На лабораторной работе студент по индивидуальному заданию разрабатывает алгоритм в виде блок-схемы [4], а затем – программу на С++, которую и реализует на компьютере.

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

Вторая идея автора – раннее использование в курсе С++ декомпозиции и структурирования алгоритмов (блок-схем) и программ С++. Это способствует улучшению их понимания студентом. Традиционно декомпозиция и структурирование изучаются в середине курса С++ после операторов ветвления и цикла. Автор предлагает это изучать почти с самого начала курса – параллельно с ветвлениями и циклами. В качестве доказательства, что это возможно, приводим фрагмент нашего практикума – образца выполнения задания на ветвления с использованием декомпозиции и структурирования.

Задание для изучения ветвлений

Ввести с клавиатуры значения a, b, y, z и последовательно вычислить:

1) fokin01.wmf;

2) fokin02.wmf;

3) fokin03.wmf.

Вывести на экран значение F.

Блок-схема

Единую блок-схему на одном рисунке нарисовать и понять было бы трудно, необходима ее декомпозиция – разбиение на кусочки (рис. 1–5). Внутри главной блок-схемы (рис. 1) мы видим вызовы блок-схем «Начальные действия», «Условные действия», «Конечные действия». Соответствующий значок [4] означает предопределенный процесс (подпрограмму, модуль). Блок-схема «Условные действия» (рис. 3) содержит вызов блок-схемы «Внутренние условные действия».

Fok1.wmf

Рис. 1. Главная блок-схема

Fok2.wmf

Рис. 2. Блок-схема «Начальные действия»

Fok3.wmf

Рис. 3. Блок-схема «Условные действия»

Fok4.wmf

Рис. 4. Блок-схема «Внутренние условные действия»

Fok5.wmf

Рис. 5. Блок-схема «Конечные действия»

Конструкция программы

#include <iostream> // разрешение ввода и вывода

#include <locale> // разрешение национальных алфавитов

#include <cmath> // разрешение математических функций

#include <string> // разрешение работы со строками

using namespace std; // разрешение стандартного пространства имен

Cоздание глобальных переменных

Прототипы пользовательских функций

void main() // заголовок main

{ // между { и } – тело main

setlocale(LC_ALL, "rus"); // разрешение русского алфавита при выводе

Операторы

}

Описание пользовательских функций

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

Cоздание глобальных переменных

double a, b, y, z, d, Z, F; // создание ГЛОБАЛЬНЫХ действительных переменных

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

Прототипы пользовательских функций

void InitialActions();

void ConditionActions();

void InternalСonditionActions();

void FinalActions();

Программу нужно разбить на отдельные подпрограммы, соответствующие блок-схемам на рис. 1–5. Подпрограммы в С++ называются функциями. Имена функций InitialActions, ConditionActions, InternalСonditionActions, FinalActions соответствуют блок-схемам с именами «Начальные действия», «Условные действия», «Внутренние условные действия», «Конечные действия». Эти функции – пользовательские, поскольку их имена и соответствующие им алгоритмы придумывает пользователь (мы).

Операторы

InitialActions(); // вызов InitialActions

ConditionActions(); // вызов ConditionActions

FinalActions();// вызов FinalActions

system(«pause»); // пауза перед завершением программы

Это операторы функции main. Главной блок-схеме соответствует функция main – главная в переводе с английского. Запуск программы – это ее вызов. Остальные функции вызываются операторами вызова этих функций внутри программы.

Описания пользовательских функций

void InitialActions() // заголовок InitialActions

{ // между { и } – тело InitialActions

cout << "Изучение ветвлений\n" << "Введите в следующем порядке\n"

<< "значения a, b, y, z:\n";

cin >> a >> b >> y >> z; // ввод 4 чисел в столбик или в строчку

}

void ConditionActions() // заголовок ConditionActions

{ // между { и } – тело ConditionActions

if (y<a*a) // если y<a*a

d = z*z*(y+1); // вычисление d способом для y<a*a

else // иначе

InternalСonditionActions(); // вызов InternalСonditionActions

}

void InternalСonditionActions() // заголовок InternalСonditionActions

{ // между { и } - тело InternalСonditionActions

if (y>b*b) // если y>b*b

d = z*z*(y+3); // вычисление d способом для y > b*b

else // иначе

d = z*z*(y+2); // вычисление d способом для a<= x < = b

}

void FinalActions() // заголовок FinalActions

{ // между { и } - тело FinalActions

Z = a*a-a*b+b*b; // вычисление Z

F = sqrt(d*d+Z*Z); // вычисление F

cout << "F=" << F << endl; // вывод строки "F =", значения F, строки endl

}

Заметим, что описание пользовательской функции ConditionActions содержит оператор вызова пользовательской функции InternalСonditionActions, а описание пользовательской функции FinalActions – вызов встроенной функции sqrt, она вычисляет квадратный корень.

Пример работы программы

Изучение ветвлений

Введите в следующем порядке

значения a, b, y, z:

2.5 3.4 4.3 5.2 Enter

F = 143.614

Для продолжения нажмите любую клавишу... Enter

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

В вузах России обычно используются системы программирования семейства Microsoft Visual Studio, которые так называются, поскольку допускают визуальное программирование. В них встроены языки Visual C++, Visual C#, Visual Basic и другие. Однако визуальное программирование «почти везде» в вузах России почему-то «традиционно» не используется вовсе. Третья идея автора предлагает визуальное программирование как можно более широко использовать в обучении, а использование «традиционного» программирования при этом – минимизировать. Такая методика используется, например, в учебниках [5, 6] В.В. Зиборова. Автор с успехом их использовал на занятиях со студентами.

Имеются другие статьи [1–3] автора и его коллег, связанные с проблемами изучения математики и программирования современными студентами. Там приводится статистика [2], свидетельствующая о резком росте доли правополушарных студентов за последние три десятка лет. Сейчас даже на математических и технических факультетах более половины студентов – правополушарные. У этих студентов [7], как правило, интуиция развита больше, чем логика, образное мышление преобладает над понятийным, действенное – над абстрактным. Отсюда актуальность применения образных технологий обучения вообще и визуального программирования в частности.

Выводы

Сложность изучения С++ можно существенно снизить: 1) если лекции по С++ и лабораторные работы дополнить обучением практическим навыкам разработки алгоритмов и программ; 2) благодаря раннему использованию методов декомпозиции и структурирования алгоритмов и программ параллельно с изучением ветвлений и циклов; 3) если при обучении широко использовать визуальное программирование.