Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Конспект лекций - 2012 1-18

.pdf
Скачиваний:
6
Добавлен:
07.02.2016
Размер:
301.93 Кб
Скачать

1

Тема 1. Введение в алгоритмизацию и программирование

Программирование и алгоритмы

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

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

Понятие «программирование» тесно связано с понятием

алгоритма.

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

2

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

Виды алгоритмов

Все имеющиеся алгоритмы можно разделить на три вида:

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

алгоритмы ветвления. Например, Для того, чтобы выйли из аудитории, нужно сначала подойти к двери. Если дверь открыта,

то выйти из аудитории. Если же дверь закрыта, то нужно сразу открыть дверь, а затем выйти из аудитории;

циклические алгоритмы. Например, посещение лекций студентом продолжается до тех пор, пока студент не окончит ВУЗ.

Алгоритм, который содержит несколько конструкций

одновременно, называется комбинированным.

Теорема Дейкстра. Алгоритм любой сложности можно реализовать, используя только три конструкции: линейные, ветвления и циклические.1

1 Э"дсгер Ви́бе Де́йкстра- нидерландский учёный, идеи которого оказали влияние на развитие компьютерной индустрии. Известность Дейкстре принесли его работы в области применения математической логики при разработке компьютерных программ. Он активно участвовал в разработке языка программирования Алгол и написал первый компилятор Алгол-60. Будучи одним из авторов концепции структурного программирования, он «проповедовал» отказ от использования инструкции GOTO. Также ему принадлежит идея применения «семафоров» для синхронизации процессов в многозадачных системах.

3

Основные свойства алгоритмов

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

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

Понятность — алгоритм для исполнителя должен включать только те команды, которые ему (исполнителю) доступны,

которые входят в его систему команд.

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

Массовость (универсальность). Алгоритм должен быть применим к разным наборам исходных данных. Алгоритм служит, как правило, для решения не одной конкретной задачи, а некоторого класса задач. Например, алгоритм сложения применим к любой паре натуральных чисел. В этом выражается его свойство массовости, то есть возможности применять многократно один и тот же алгоритм для любой задачи одного класса.

4

Результативность — завершение алгоритма определёнными результатами.

Алгоритм может содержать ошибки.

Алгоритм содержит ошибки, содержит ошибки, если для некоторых исходных данных он даёт неправильные результаты,

сбои, отказы или не даёт никаких результатов вообще.

Алгоритм не содержит ошибок, если он даёт правильные

(физически правдоподобные) результаты для любых допустимых исходных данных.

Для каждого алгоритма существует некоторое множество объектов, допустимых в качестве исходных данных. Например, в

алгоритме деления вещественных чисел делимое может быть любым, а

делитель не может быть равен нулю.

Способы описания алгоритма

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

применяются различные способы описания алгоритма.

Алгоритм может быть записан словами и изображён

схематически.

5

Пример блок-схемы вычисления факториала числа

Алгоритм так же может быть описан при помощи псевдокода.

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

Пример описания алгоритма с использованием псевдокода:

Program FirstProgram

begin

2 Процедурное программи́рование— это парадигма программирования, которая описывает процесс вычисления в виде инструкций, изменяющих состояние программы. Императивная программа очень похожа на приказы, выражаемые повелительным наклонением в естественных языках , то есть это последовательность команд, которые должен выполнить компьютер.

6

WriteText ("Welcome to the programming Universe")

end FirstProgram

Эффективность алгоритма

Для каждой задачи может существовать множество алгоритмов,

приводящих к цели. Одни алгоритмы могут быть более эффективны в конкретных условиях, другие – менее. В качестве критерия эффективности может выступать:

требуемое количество вычислительных ресурсов, необходимое выполнения алгоритма (процессорное время, объём ОЗУ и т.д.);

сложность реализации;

точность получаемого решения;

Надёжность - способность сохранять работоспособность в процессе эксплуатации при изменении внешних факторов

(например, нечувствительность к переполнению буфера);

Устойчивость – чувствительность получаемого решения алгоритма решения к (малым изменениям) входных данных;

Критерий эффективности может быть простым либо составным и выбирается, в зависимости от постановки задачи.

Увеличение эффективности алгоритмов составляет одну из задач современной информатики.

Классификация языков программирования. Языки программирования высокого уровня

Под языком программирования понимают набор лексических,

семантических и синтаксических правил, задающих внешний вид

7

компьютерной программы и действия, которые выполнит исполнитель под её управлением.

Компьютерная программа – последовательность инструкций,

описывающая процессы обработки данных на компьютере.

Данные – представление фактов и идей в формализованном виде, пригодном для их непосредственной обработки.

Обработка данных – выполнение систематизированной последовательности действий над данными.

По наиболее распространенной классификации все языки программирования делят на языки:

низкого уровня - машинные языки и языки символического кодирования: (Автокод, Ассемблер). Операторы этого языка – это те же машинные команды, но записанные мнемоническими кодами, а в качестве операндов используются не конкретные адреса, а

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

Машинно-ориентированные языки – это языки, наборы операторов и изобразительные средства которых существенно зависят от особенностей ЭВМ (внутреннего языка, структуры памяти и т.д.);

высокого уровня - машинно - независимые языки ,

ориентированные не на систему команд той или иной ЭВМ, а на систему операндов, характерных для записи определенного класса алгоритмов.

8

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

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

(например, скриптовые языки). Как правило, сверхвысокоуровневые языки программирования имеют узкую специализацию.

Примечание. Хотя Язык Си относится к языкам программирования высокого уровня, его часто называют языком программирования среднего уровня учитывая то, как близко он работает к физическим устройствам.

В рамках курса "Основы программирования" мы будем иметь дело с языками программирования высокого уровня. Остановимся на них подробнее.

Язык программирования высокого уровня — язык,

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

9

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

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

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

достаточно сложно создать платформо - независимые простые и точные инструкции к используемому оборудованию. Программы,

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

Языки же высокого уровня имитируют естественные языки,

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

Языки высокого уровня делятся на:

процедурные (алгоритмические) (Basic, Pascal, C и др.),

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

10

декларативные (Prolog, Lisp и др.), которые ориентированы не на разработку алгоритма решения задачи, а на систематическое и формализованное описание задачи с тем, чтобы решение следовало из составленного описания;

объектно-ориентированные (Object Pascal, C++, Java и др.), в

основе которых лежит понятие объекта, сочетающего в себе данные

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

относящуюся к этой задаче. Описание действительности в форме системы взаимодействующих объектов естественнее, чем в форме взаимодействующих процедур.

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

Перейдём непосредственно к процессу программирования.

Рассмотрим простую программу на языке программирования С++.

Пример программы на языке программирования С++

//Пример программы на языка С++ #include <iostream>

int main()

{

Tstd::cout<< "Hello! Welcome to the programming Universe" << std::endl;

Treturn 0;

}