Вы находитесь на странице: 1из 37

ОСНОВЫ ТЕХНОЛОГИИ

ПРОГРАММИРОВАНИЯ
Ученые проанализировали паттерны мозговых волн детей и
молодежи, пока они писали от руки или набирали текст на
клавиатуре, и обнаружили, что эти действия мозг
воспринимает по-разному. Результат показал, что обучение
более эффективно, когда пишешь от руки.
что теряют взрослые, которые забросили ручку и бумагу и перешли
на гаджеты? Как говорит эксперт, письмо от руки не только
поддерживает хороший уровень работы многих функций коры, но и
благотворно действует на глубинные механизмы мозга. Известно,
что мелкая моторика оказывает позитивный эффект на
ретикулярную формацию мозга, а это своеобразная
батарейка, которая поддерживает работоспособность всего мозга.
Технология программирования - это последовательность
процессов, исполняемых программистами в целях разработки
алгоритма решения задачи, ее кодирования на языке
программирования, последующего тестирования программ,
начинающаяся с постановки задачи и заканчивается сдачей
программного продукта в эксплуатацию.
Технологическая цепочка программирования содержит
следующие этапы:
 
1. Неформальная постановка задачи;
2. Формальная постановка задачи;
3. Разработка или поиск алгоритма решения
задачи;
4. Спецификация исходных данных программы;
5. Спецификация функций программы;
6. Проектирование программы;
7. Программирование ( в узком смысле);
8. Отладка программы;
9. Тестирование программы;
10.Опытная эксплуатация.
Рассмотрим этот процесс на примере следующей задачи:
Выбрать три разные точки заданного на плоскости множества
точек, образующих треугольник с наибольшим периметром.
Неформальная постановка задачи.

Диалог с целью выяснить,


 
ЗАКАЗЧИК РАЗРАБОТЧИК
одинаково ли они понимают
ставит задачу задачу? принимает задачу

На этом этапе происходит анализ постановки задачи, ее


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

Формальная постановка задачи


Необязательный этап, если на первом этапе ясно как решать
поставленную задачу. Но в более серьезных ситуациях
необходимо формализовать на языке математики.
ФОРМАЛЬНАЯ ПОСТАНОВКА ЗАДАЧИ – описание
(формализация) задачи на языке математики и
формальной логики.
 
1. Область исходных данных( область определения
данных);
2. Область решения задачи;
3. Связи(формулы, уравнения), связывающие между
собой исходные данные и результаты.
В нашем примере множество исходных данных задачи:
Х={(x i,yi)| (x i,yi) ⸦ R2, i=1, ...,n, n  3 }.
Множество результатов:
Y={ y| y ⸦ R, R={z| z ⸦ max p()}} и |Y| =1, где p() = l12 +l23+l 13 и
l12 = ( xi1  xi 2 ) 2  ( yi1  yi 2 ) 2
l23 = ( xi 2  xi 3 ) 2  ( yi 2  yi 3 ) 2
l13 = ( xi1  xi 3 ) 2  ( yi1  yi 3 ) 2
и три вершины (xi1,yi1) , (xi2,yi2), (xi3,yi3) не лежат на одной прямой
l12 + l13  l23 и
l13 + l23  l12 и
l23 + l12  l23
Текст после фразы “где” и до конца и есть формулировка
связи между X и Y.
Эта формулировка необходима для анализа задания на
предмет: существует или нет решение задачи. Очевидно, что
если условие связи справедливы, то возможны два ответа:
треугольник существует и треугольник не существует, тем
самым доказывается факт решения поставленной задачи.
Разработка или поиск алгоритма.
Разрабатывают алгоритм, если задача новая, если же она
когда ни будь решалась, то м. б. имеет смысл найти решение.
Разберем нашу задачу. Предположим, что Х не содержит
совпадающих точек, т.е. Х - множество в его строгом
определении.
Проект алгоритма.
1. Положим Рмах = 0;
2. Для каждой тройки точек множества Х
2.1. Выяснить образуют ли они вершины треугольника;
2.2. Если да то
2.2.1. Найти периметр треугольника Р(  );
2.2.2. Если Рмах <Р ( ), то
2.2.2.1. Рмах = Р( ) и запоминать вершины треугольника
иначе;
иначе;
3. Найдена единственная тройка координат, т.к. один перебор позволяет найти
только первый набор.
Если Рмах = 0 то треугольник не существует , иначе треугольник
существует.
Полученный алгоритм может быть положен в основу проекта программы,
который рассмотрим чуть позже.
Разработка (или поиск) алгоритма

Данный этап необходим для перехода от формальной постановки к


написанию программы.

Сначала определим понятие АЛГОРИТМ. Что же это такое?

В 825 г. н. э. арабский математик Мухаммад аль-Хорифми (аль-Хваризми)


изобрел известный всем способ вычисления «столбиком» и сформулировал
правила выполнения четырех арифметических действий (+, –, *, / ) над
многозначными числами. Как следствие, эти правила стали называть
альхорифмами. Позже этот термин стали применять для любой четко
описанной пошаговой последовательности действий, следуя которой (четко и
чисто механически) можно получить желаемый результат.

DEF АЛГОРИТМ – набор четко определенных правил для решения задачи за


конечное число шагов (наиболее удачное определение, на мой взгляд,
пригодное для любых алгоритмов)
Кроме указанного, существует множество других определений понятия
АЛГОРИМ. Например, для вычислительных алгоритмов в Толковом словаре
по Информатике (1991): «Точное предписание, определяющее
вычислительный процесс, ведущий от варьируемых начальных данных к
искомому результату».
DEF Последовательность действий алгоритма – АЛГОРИТМИЧЕСКИЙ
ПРОЦЕСС
DEF Отдельное действие алгоритмического процесса – ШАГ
DEF Каждое правило в алгоритме – КОМАНДА
DEF АЛГОРИТМИЗАЦИЯ – процесс разработки алгоритма решения
задачи.
Алгоритм выполняется ИСПОЛНИТЕЛЕМ: неформальным (человек) или
формальным (компьютер, робот, язык программирования). При составлении
алгоритма вам необходимо знать СИСТЕМУ КОМАНД ИСПОЛНИТЕЛЯ
(СКИ), т.е. перечень элементарных действий, которые понимает и умеет
делать исполнитель.

ВАЖНО: от исполнителя не требуется понимание способа решения задачи


в глобальном смысле. Все, что от него требуется – понимание инструкций ( =
команд) и умение их выполнять.
СВОЙСТВА АЛГОРИТМОВ

1. Дискретность – процесс решения задачи, определяемый алгоритмом,


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

2. Определенность (детерминированность) – строгая определенность


(однозначность) каждого действия алгоритма. Каждая команда должна
абсолютно однозначно трактоваться и выполняться исполнителем.

3. Результативность и конечность – свойства алгоритма обеспечить


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

4. Понятность – соответствие команд алгоритма Системе команд


исполнителя.

5. Массовость – алгоритм решения задачи должен разрабатываться так,


чтобы его можно было применить для решения других задач такого же
типа при всех допустимых значениях исходных данных.
СПОСОБЫ ЗАПИСИ АЛГОРИТМОВ

1. На естественном языке (инструкции к приборам, кулинарные рецепты и


даже стихи!)

ПРИМЕР 1.2:
У Лукоморья – дуб зеленый,
Златая цепь на дубе том. Исходные данные
И днем, и ночью кот ученый
Все ходит по цепи кругом.
Пойдет направо – песнь Действия, описывающие
заводит, ветвящийся процесс
Налево – сказку говорит… (выбор)
2. С помощью рисунка (например, схема подключения факса к компьютеру и
в телефонную линию)

3. С помощью псевдокода. Псевдокод занимает промежуточное значение


между естественным и формальным языками. Единого определения
псевдокода не существует (например, есть PDL - Program Design Language
- язык проектирования программ, набор команд которого практически
совпадает с базовыми операторами языка программирования высокого
уровня Pascal). В язык проектирования можно включать наиболее удачные
конструкции существующих языков программирования, и при его создании
можно использовать все современные достижения структурного
программирования, основанного на идее: один вход – один выход.
Вернемся к ПРИМЕРУ . Предположим, что множество А не содержит
совпадающих точек, т.е. А – множество в его строгом определении.
Разработаем ПРОЕКТ АЛГОРИТМА.

1. ПОЛОЖИМ Рмах = 0;
2. ДЛЯ КАЖДОЙ ТРОЙКИ ТОЧЕК МНОЖЕСТВА А
2.1. ВЫЯСНИТЬ, образуют ли они вершины треугольника;
2.2. ЕСЛИ да, ТО
2.2.1. НАЙТИ периметр треугольника Р(∴);
2.2.2. ЕСЛИ Рmах < Р (∴), ТО
2.2.2.1. Рmах = Р(∴) и запомнить вершины
треугольника
ИНАЧЕ
ИНАЧЕ;
3. НАЙДЕНА единственная тройка координат, т.к. один перебор
позволяет найти только первый набор.

Полученный алгоритм построен по принципу нисходящего проектирования


(принцип поэтапной детализации, «сверху вниз», «от общего к частному»):
глобальная задача разбивается на более мелкие подзадачи. Каждую из
подзадач можно разбить на еще более мелкие действия. Хотя этот алгоритм
еще не доведен до элементарных вычислительных действий, его уже можно
положить в основу проекта программы.
1. Графическое представление – БЛОК-СХЕМА

ОСНОВНЫЕ ФУНКЦИОНАЛЬНЫЕ ЭЛЕМЕНТЫ БЛОК -СХЕМ


Обозначение и пример
Название символа Пояснение
заполнения
выполнение
определенной
Процесс x=(a-b)/sin(1) операции или группы
операций, приводящее
к изменению значения
Проверка условия
Решение TRUE
A<B (один вход, два
FALSE

выхода)

Модификация i=1,2,3 Начало цикла

Вычисление по
Предопределенный Solve
подпрограмме,
процесс стандартной
подпрограмме
Ввод-вывод в общем
Ввод-вывод DATA
виде
Начало-конец
BEGIN алгоритмического
Пуск-остановка
процесса. вход-выход
подпрограммы
Вывод результатов на
Документ PRINT A,B,C

печать
Определим при помощи блок-схем и псевдокодов основные алгоритмические
конструкции структурного программирования.
5.С помощью языка программирования, который может быть
любым, рассчитанный на работу в определенной области.
Любой язык программирования характеризуется множеством
данных и действий(операций, операторов), допустимых в нем.
В языках программирования выделяют : арифметические
типы – вещественные, целые (real, integer) , логический тип с
двумя значениями истина и ложь (boolean), упорядоченное
множество литер(char). По определению множество Y линейно
упорядочено , если для любых x1 и x2 можно сказать , что x1<
x2, x1>x2 или x1 =x2. На множестве char эти отношения -
отношения лексикографического порядка, т. е. литера x1,
следует в алфавите раньше литеры x2 по порядку, или что
еще проще номер литеры x1 меньше номера литеры x2. Потому
можно ли ввести символ с клавиатуры и отобразить на экране,
различают видимые и невидимые символы.
Если определение типа дано в языке, а не в программе на этом
языке, то такие типы называют предопределенными, т. е.
известными до написания программы Предопределенные
типы, для того чтобы иметь возможность ссылаться на них,
имеют зарезервированные имена. Типы, определяемые
программистом , по тому указано ли для них имя или нет ,
делятся на два подкласса: анонимный и именованный, но
должно быть обеспечено правило: имя не может быть
использовано прежде, чем оно определено.
Определение:
Тип данных называется скалярным, если одно значение
соответствует одному элементу типа, иначе составным.
По признаку уникальности элементов множества(типы)
называют базовыми типами, эти множества нельзя построить
из элементов других множеств, только из собственных.

Если для скалярного типа введено отношения порядка (=,<>, <


, >, <=, >=) упорядоченным(порядковым), иначе не
упорядоченным .
Рассмотрим вектор точек: (x1,y1), (x2,y2), .... , (xn,yn) , когда
точка - представлена двумя действительными координатами .
Поэтому мы можем рассмотреть два вектора: <x1 ,x2 , ... , xn>
и <y1,y2, ... , yn> для которых установлено неявное
соответствие по номеру элемента вектора.
В каждом векторе его компонента - скалярная величина.
Каждая компонента принадлежит одному и тому же типу. В
языках программирования такие структуры данных
называются массивами - это совокупность однородных
(однотипных) элементов. Массив не скалярное данное, это
составное данное имеющее определенную организацию.
Любая строка символов (string) - это массив символов и
только. Для массива характерно , что все его компоненты
однотипны. Во многих задачах однотипность элементов
естественна.
Но в природе есть объекты, которые имеют неоднородные
свойства, и описать их однотипной матрицей невозможно.
Пример:
Анкета сотрудника:
1) порядковый номер N - число;
2) ФИО - фамилия - строка;
имя - строка;
отчество - строка;
3) дата рождения - день - число от 1 до 31,
месяц - число от 1 до 12,
год - число от 1920 до 2000;
4) пол - 0 или 1.
В теории данных для моделирования объектов с
различными по виду свойствами используют понятие
структуры данных (или агрегат данных).
К сожалению, термин структура данных имеет два
смысла: широкий - он означает строение данного,
отношение между компонентами данного и узкий
-данное обладает структурой.
Так, например, в широком смысле массив имеет
двухмерную структуру, его данные расположены и по
вертикале и по горизонтали.
Анкета - сотрудник имеет иерархическую структуру:
АНКЕТА - 0 уровень
1 уровень

N -порядковый ФИО дата пол

имя фамилия отчество день месяц год

2 уровень
Каждая компонента анкеты называется полем. Некоторые
поля могут быть составными, тогда возникает следующий
уровень.
Очевидно, что если поле i - уровня составное то его
компоненты расположены на  i + 1 уровне, а скалярное
поле -i -го уровня не имеет компонентов и, следовательно,
для него отсутствует i + 1 уровень. Важно понять, что
данные последних скалярных уровней образуют
совокупность данных, которое рассматривается как
единое целое.
Конструкторы
В языках программирования есть конструкторы, которые
позволяют из линейных последовательностей утверждений
группировать составные утверждения. Семантика
конструкторов типовая : в зависимости от условия составному
утверждению передается управление или нет при выполнении
программы. Первым простым конструктором является
конструктор ветвлений полный:
Если условие
то серия1
иначе серия2
Все
или не полный
 
Если условие
то серия
Все
Подчеркнем , что это не оператор языка
программирования в том смысле, что он
непосредственно оперирует с данными, это оператор
над утверждениями. В любом языке
программирования присутствует конструктор
ветвлений. Его семантика не зависит от синтаксиса.
КОНСТРУКТОРЫ ЦИКЛОВ

Циклы называются арифметическими в тех задачах, где


число повторений выполнения тела цикла заранее
известно.
Пример:
Вычислить и напечатать первые 100 чисел Фибоначчи -
0,1,1,2,3,5, ... , где
F0=0, F1=1, FN+2=FN+1 + FN - числа Фибоначчи.
Во многих задачах количество повторений действий
может быть неизвестным, оно может изменяться от 0
до некоторого наперед неизвестного числа. Такие
циклы называются итерационными.
Пример:
Найти сумму гармонического ряда 1+1/2 +1/3 +1/4 + ...
+1/N + ... для всех членов ряда больше Е, где 0<Е<1.
Как решаются такие задачи?
SN:= 1/к , SN+1= SN +1/(N+1);
SN+1 -SN= 1/(N+1) и 1/(N+1) <=Е , то не включать, а
т. к. 1/N -> 0 при n ->  , то 1/(N+2) , 1/(N+3) ...<E.
ЗАДАЧА.

С терминала вводится несколько чисел xi до тех пор пока не будет


введено 0.0. Каждое число возводится в i степень и суммируются. Из
полученной суммы последовательно извлекается квадратный корень
до тех пор пока 1<=S <=2. Напечатать количество извлечений.
Program exampl( );
VAR
s,a,b,x : real;
r,i: integer;
  begin
s:=0; n:=1; k:=0;
writeln( ‘ Введите действительные числа,
последнее должно быть 0’);
readln(x);
if abs(x) > 1/0E-7 then
begin
repeat
a:=1;
for i:=1 to n do
a:=a*x;
s:=s+a; n:=n+1;
readln(x)
until abs(x)<1.0E-7;
b:=abs(s);
while(b>2.0) do
begin
b:=sqrt(b); k:=k+1;
end;
  end;
writeln(’ Число извлечений корня’,k);
end.
В этом примере были использованы все три вида
циклов вложенных друг в друга.
КОНСТРУКТОР ВАРИАНТОВ.
Характерной чертой многих алгоритмов является
широкая разветвляемость задаваемых ими
вычислительных процессов . С одним из средств для
задания разветвлений мы уже знакомы - это условный
оператор, предписывающий в зависимости от условия
выбрать тот или иной оператор .
На практике довольно часто встречаются случаи, когда
вычислительный процесс надо разветвить не по двум, а
по k (k>2) возможным путям. Это можно сделать и с
помощью условного оператора , учитывая
рекурсивность(вложенность) его определения. Однако в
этом случае запись условного оператора может
оказаться весьма громоздкой и не наглядной.
Вложенность, если она больше семи, усложняет
восприятие логики программы. Линейная
последовательность предпочтительнее, чем вложенная ,
в тех случаях когда уровень вложения глубок. Для таких
случаев в ЯП и существует конструктор выбора(CASE).
Пример
case litera of
‘0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’: chislo:= ord(litera) -
ord(‘0’);
‘A’,’B’,’C’,’D’,’E’,’F’: chislo:= 10 + ord(litera) - ord(‘A’)
end;