Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_П.doc
Скачиваний:
3
Добавлен:
31.08.2019
Размер:
3.43 Mб
Скачать

6. Алгоритмизация и программирование

"Алгоритм" является базовым основополагающим понятием информатики, а алгоритмизация (программирование) – основным разделом курса информатики.

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

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

  • конечность. Алгоритм всегда должен заканчиваться после выполнения конечного числа шагов;

  • определенность. Каждый шаг алгоритма должен быть однозначно определен;

  • ввод. Алгоритм имеет некоторое (возможно, равное нулю) число входных данных, т.е. величин, которые задаются до начала его работы или определяются динамически во время его работы;

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

  • эффективность. Алгоритм обычно считается эффективным, если все его операторы достаточно просты для того, чтобы их можно было точно выполнить в течение конечного промежутка времени.

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

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

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

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

Рис. 6.1. Структура алгоритмического обеспечения

Основные формы использования алгоритмов – автономное, библиотечное, пакетное.

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

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

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

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

Порядок выполнения операций (старшинство операций – по убыванию) в языке С++:

  1. Вычисление выражений в скобках;

  2. Вычисление стандартных функций;

  3. Умножение и деление (обозначаются "*" и "/");

  4. Сложение и вычитание (обозначаются "+" и "–").

Рассмотрим базовые простые команды языка С++ [8-9].

  1. Команда описания главной функции:

< тип > main ()

{

}

2. Команда описания неглавной функции:

< тип > <имя функции > ( < передаваемые параметры>)

{

}

  1. Ввод – команда ввода в рассмотрение (в тело алгоритма) тех или иных входных параметров:

cin>>вводимый параметр;

  1. Вывод – команда вывода на экран тех или иных входных или выходных параметров алгоритма:

cout<<выводимый параметр;

  1. Присваивание – команда изменения текущего значения переменной вида:

<идентификатор> = <выражение>;

где <идентификатор> соответствует имени переменной, <выражение> – корректно записанное выражение. Знак "=" означает последовательное выполнение двух действий: определение текущего значения <выражения> и замена текущего значения переменной, имя которой задано <идентификатором>, на новое значение, равное значению <выражения>.

  1. Символ начала блока {.

  2. Символ конца блока }.

  3. Команда вставки комментариев в текст алгоритма имеет вид:

/* комментарий в несколько строк */

// комментарий в одну строку

Комментировать можно любой объект программы. Обычно комментируют переменную, структуру данных, команду, группу команд.

Различают три базовые алгоритмические структуры: следование, ветвление, повторение.

  1. Действие следования состоит из двух команд с указанной очередностью их выполнения и имеет вид:

<команда – предшественник>;

<команда – преемник>.

  1. Структура типа ветвления в полной форме состоит из некоторого условия, проверяемого на истинность при выполнении структуры, команды, выполняемой при выполнении проверяемого условия, и команды, выполняемой при невыполнении условия. Условный оператор имеет вид

if <условие> <команда, выполняемая при выполнении условия>;

else <команда, выполняемая при невыполнении условия>;

Пример. Команда вида

if (х>y) ( если текущее значение х больше текущего значения y )

у = х ; (текущее значение у полагаем равным текущему значению х)

else x= y; (иначе (при х <= y) текущее значение x заменяем на текущее значение y )

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

Структура повторения типа "пока (while)" записывается в виде:

while <условие продолжения повторения>

<повторяемая команда>;

или

while <условие продолжения повторения>

{

<повторяемая команда номер 1>;

<повторяемая команда номер 2>;

. . .

<повторяемая команда номер N>;

}

Следующим оператором цикла в языке С++ является оператор for

for(<присваивание начального значения счетчику цикла>; <условие проверки выхода из цикла>; <изменение счетчика цикла>)

{

< операторы цикла>

}

Данный цикл выполняется по правилу: если условие повторения для текущих его параметров не выполнено, то повторение команд (тела) цикла на этом завершается; если же оно выполнено, то выполняется тело цикла и опять проверяется условие повторения команд тела цикла.

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

Функция (программа) имеет вид:

int main()

{

int i=1,n,summa=0;

cout<<"Input n= \n";

cin>>n;

while (summa<=n)

{

summa=summa+i;

i++;

}

summa=summa+i;

cout<<" Summa = "<<summa;

return 0;

}

Пример. Найти наименьшее общее кратное любых двух целых чисел m, n, найти наибольший их делитель. Программа, содержащая все необходимые подключения к операционной системе Microsoft Visual Studio 2008 C++, будет иметь вид:

#include "stdafx.h"

#include <iostream>

using namespace std;

#include <conio.h>

int main()

{

int n,m,max,min,nok,nod=1,i;

cout<<"Enter n = ";

cin>>n;

cout<<"\n Enter m = ";

cin>>m;

max=n>m?n:m; // выделение наибольшего числа

min=n<m?n:m; // выделение наименьшего числа

// Поиск НОД

for(i=1;i<=min;i++)

// сравнение остатков от деления на ноль

if((m%i==0)&&(n%i==0))nod=i;

cout<<" \n NOD = "<<nod<<"\n";

// Поиск НОK

for(i=max;i<=m*n;i++)

// сравнение на ноль остатков от деления

if((i%m==0)&&(i%n==0))

{

nok=i;

break; // оператор выхода из цикла

}

cout<<" \n NOK = "<<nok<<"\n";

_getch(); /* функция не закрытия экрана после окончания

программы */

return 0; // оператор возврата в вызывающую программу

}

Рассмотрим примеры алгоритмизации (программирования) задач на языке C++.

Пример. Составим алгоритм и программу вычисления факториала заданного натурального числа n, то есть произведения n! = 1 • 2 • 3 • … • (n – 1)•n c использованием рекуррентной формулы n! = (n – 1)! • n.

Приведем алгоритм решения:

1. Инициализация: n, i=1, fact = 1.

2. fact=fact*i

3. i=i+1

4. Если i <= n переход к п. 2.

5. Печать fact.

6.Конец алгоритма.

Рис. 6.2. Блок – схема алгоритма

Алгоритм, представленный программным кодом имеет вид:

#include "stdafx.h"

#include <iostream>

using namespace std;

#include <conio.h>

int main()

{

int n,i=1,fact=1;

cout<<"Enter n = ";

cin>>n;

for(i=1;i<=n;i++) fact=fact*i;

cout<<" \n n! = "<<fact<<"\n";

_getch();

return 0;

}