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

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

Пример 1.
Составить схему алгоритма вычисления
значения :

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

  • начало

  • ввод
    чисел a,b

  • вычисление
    х

  • вычисление
    z

  • вывод
    результата

  • конец

Исходя из этого
составляем блок-схему алгоритма согласно
ГОСТ, используя соответствующие блоки.

Пример
2.
Составить
схему алгоритма вычисления значения:
x=a+b
при a>b,
x=a*b,
при a<=b.

Пример 3. Составить схему алгоритма вычисления значения:

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

Исходя из этого
составляем блок-схему алгоритма согласно
ГОСТ, используя соответствующие блоки.

Порядок выполнения работы

  1. Изучить
    теоретические сведения по теме
    ”Построение блок-схем алгоритмов”.

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

  3. Ответить
    на контрольные вопросы.

  4. Сформулировать
    выводы.

Контрольные вопросы

  1. Основные
    этапы решения задач на компьютере.

  2. Свойства алгоритма.
    Типы вычислительных процессов.

  3. Блок схемы. Понятие
    и правила построения.

  4. Примеры построения
    блок-схем алгоритмов.

Задание
№1:
 Разработайте
алгоритм и представьте его в графическом
виде (блок-схемы) для следующих задач:

Задание 1.1
Вычислить значение выражения при
заданных исходных данных.

Указание.
Для упрощения выражений введите
промежуточные переменные.

Сравнить полученное
значение с указанным правильным
результатом.

1.

При
x = 14.26;
y = – 1.22;
z = 3.5ответs
= 0.749155.

2.

При
x = –4.5; y = 0.75;
z = –0.845ответs
= –3.23765.

3.

При
x = 3.74;
y=–0.825; z = 0.16ответs
= 1.05534.

4.

При
x = 0.4;
y = –0.875; z = –0.475ответ
s = 1.98727.

5.

При
x = –15.246; y = 4.642;
z = 21 ответ
s = –182.038.

6.

При
x = 16.55;
y = –2.75; z = 0.15
ответ s
= –40.6307.

7.

При
x = 0.1722; y = 6.33; z = 3.25ответ
s = –205.306.

8.

При
x = –2.235;
y = 2.23; z = 15.221
ответ s
= 39.3741.

9.

При
x = 1.825;
y = 18.225; z = –3.298ответ
s = 1.21308.

10.

При
x = 3.981;
y = –1.625;
z = 0.512
ответ s
= 1.26185.

11.

При
x = 6.251; y = 0.827; z = 25.001
ответ
s = 0.712122.

12.

При
x
= 3.251; y
= 0.325; z
= 0.466
ответ s
= 4.23655.

13.

.

При
x
= 17.421; y
= 10.365;
z
= 0.828
ответ s
= 0.330564.

14.
.

При
x
= 12.3;
y
= 15.4; z
= 0.252
ответ s
= 82.8256.

15.

.

При
x
= 2.444; y
= 0.869;
z
= –0.13
ответ s
= –0.498707.

Задание
1.2
Вычислить
значение выражения при заданных исходных
данных. Предусмотреть вывод информации
о выбранной ветви вычислений.

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

Задание
1.3
Вывести
на экран таблицу значений функции Y(x)
и ее разложения в ряд S(x)
для x,
изменяющегося от a
до b
с шагом h
= (b
a)/10,
табл. 1.

Таблица 1.

a

b

S(x)

n

Y(x)

1

0.1

1

160

2

0.1

1

100

1

2

3

4

5

6

3

0.1

1

120

4

0.1

1

80

5

0.1

1

140

6

0.1

1

80

7

0.1

1

120

8

0.1

1

100

9

0.1

1

140

10

0.1

0.5

150

11

0.1

1

100

12

0.1

1

80

13

–2

–0.1

160

14

0.2

0.8

120

15

0.1

0.8

180

Задание
№2:

Решите представленные ниже задачи,
указав номер задачи и полученный ответ. 

Задача
2.1
Определите
результаты работы блок-схемы алгоритма
при

Задача
2.
2
Какие
значения примут t и k в
результате работы фрагмента блок-схемы
алгоритма?

Задача
2.3.
Определите
значения
элементов
массива А2,
А4,
А6,
А8
при N=8
в результате работы фрагмента алгоритма

Как обозначается функция в блок схеме

Содержание

  • Справочник
  • Правила оформления блок-схем
  • Назначение блоков
  • Содержание
  • Основные элементы схем алгоритма [ править | править код ]
  • Действие [ править | править код ]
  • Данные (ввод/вывод) [ править | править код ]
  • Предопределенный процесс (функция) [ править | править код ]
  • Вопрос (условие или решение) [ править | править код ]
  • Ограничитель [ править | править код ]
  • Цикл [ править | править код ]
  • Пример блок-схемы расчета факториала с использованием цикла [ править | править код ]
  • Пример вложенных циклов [ править | править код ]
  • Соединитель [ править | править код ]
  • Разделение алгоритма на две части с использованием соединителей [ править | править код ]
  • Комментарий [ править | править код ]
  • Параллельные действия [ править | править код ]
  • Представление алгоритмов в виде графов [ править | править код ]
  • Критика [ править | править код ]

Справочник

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

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

В блок-схемах нельзя использовать элементы языка программирования.

  • в качестве оператора присваивания в блок-схемах используется двухсимвольный знак “:=”
  • в качестве оператора логического сравнения на равенство в блок-схемах используется одинарный символ знак “=”
  • в качестве оператора логического сравнения “больше или равно” (“меньше или равно”) в блок-схемах используется одинарный символ ” ≥ ” ( ” ≤ ” )
  • в качестве логических операторов используются слова AND , OR
  • индексы у элементов массива указываются также, как в математических выражениях: aij .
  • математические выражения записываются согласно всем правилам математики. Особенно это касается выражений с дробями, то есть формула должна записываться следующим образом , а не x1=(-b-sqrt(b*b-4*a*c))/(2*a).

Назначение блоков

Наименование Обозначение Функция
Терминатор Элемент отображает выход во внешнюю среду и вход из внешней среды (наиболее частое применение − начало и конец программы). Внутри фигуры записывается соответствующее действие.
Процесс Выполнение одной или нескольких операций, обработка данных любого вида (изменение значения данных, формы представления, расположения). Внутри фигуры записывают непосредственно сами операции, например, операцию: a := 10 b + c

Для вычисления суммы ряда в программе необходимо выполнить следующие действия:

  1. Описать переменные, которые будут использоваться для хранения текущего значения суммы, текущего значения счетчика элементов цикла, а также общего количества суммируемых элементов.
    Примечание: это действие необходимо только для определения количества переменных, которые потребуются алгоритму и потому в блок-схеме эти действия никак не учитываются.
  2. Получить у пользователя число элементов ряда, которые следует просуммировать, то есть ввести данные в программу.
  3. Обнулить переменную, которая будет хранить сумму ряда.
  4. Инициализировать счетчик цикла начальным значением.
  5. Рассчитать значение элемента ряда с номером, равным текущему значению счетчика и прибавить получившееся значение к значению переменной-суммы.
  6. увеличить значение счетчика на единицу.
  7. Если значение счетчика меньше количества суммируемых элементов, которое задано пользователем, то перейти к выполнению пункта 5.
  8. Вывести значение суммы.

Это текстовая запись алгоритма. Теперь реализуем ее в виде графической схемы (блок-схемы).

Если вы не занете при помощи чего создавать блок-схемы, то рекомендуем ознакомиться со следующей статьей:
6 сервисов для работы с блок-схемами

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

Вызов подпрограммы в основной программе изображается на блок-схеме в виде блока «Предопределенный процесс»:

1.3 Пример составления алгоритма и программы на языке Pascal для обработки одномерных массивов с использованием подпрограмм.

Задание: Даны два массива вещественных чисел A(20) и F(30). Найти средние арифметические значения положительных элементов в каждом массиве и вывести на экран отношение этих значений.

Для объявления массивов A и F опишем в разделе Type тип массива из 30 вещественных чисел. Для обозначения количества элементов массива A введем переменную Na, количества элементов массива F – переменную Nf, средних арифметических значений положительных элементов массивов – переменные SrA и SrF.

Для каждого массива необходимо повторить одни и те же операции:

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

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

Процедуру ввода элементов массива назовем EnterMassiv, в списке формальных параметров укажем следующие переменные: массив X и количество элементов в массиве Nx. При этом в списке формальных параметров массив должен быть указан со служебным словом var, поскольку значения элементов массива изменяются в процедуре и возвращаются в основную программу. Внутри процедуры формирование элементов массива выполним с помощью генератора случайных чисел random.

Процедуру вывода элементов массива назовем PrintMassiv, и будем в нее передавать те же переменные: массив X и количество элементов в массиве Nx. При этом в списке формальных параметров перед массивом служебное слово var можно не указывать, поскольку значения элементов массива в процедуре не изменяются, а только выводятся на экран.

Функцию поиска среднего значения среди положительных элементов массива назовем MiddlePositive, и будем в нее также передавать массив X и количество элементов в массиве Nx. Поскольку среднее арифметическое является вещественным числом, тип функции должен быть real. Внутри функции будем использовать локальную переменную K для подсчета количества положительных элементов массива, переменную M для расчета суммы всех положительных элементов массива и их среднего значения.

1.3.1 Блок-схема алгоритма решения данной задачи выглядит следующим образом:

Блок схема подпрограммы EnterMassiv

Блок схема подпрограммы PrintMassiv

Блок схема подпрограммы MiddlePositive

Блок-схема основной программы

1.3.2 Текст программы на языке Pascal выглядит следующим образом:

Схе́ма — графическое представление определения, анализа или метода решения задачи, в котором используются символы для отображения данных, потока, оборудования и т. д. [1]

Блок-схема — распространенный тип схем (графических моделей), описывающих алгоритмы или процессы, в которых отдельные шаги изображаются в виде блоков различной формы, соединенных между собой линиями, указывающими направление последовательности. Правила выполнения регламентируются ГОСТ 19.701-90 «Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения» [1] . Стандарт в частности регулирует способы построения схем и внешний вид их элементов.

Содержание

Основные элементы схем алгоритма [ править | править код ]

При начертании элементов рекомендуется придерживаться строгих размеров, определяемых двумя значениями a и b. Значение a выбирается из ряда 15, 20, 25.. мм, b рассчитывается из соотношения 2a = 3b. Определение размеров несет рекомендательный характер, однако, стоит отметить, что при соблюдении выполнения размеров блок-схемы имеют более аккуратный вид.

Действие [ править | править код ]

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

Данные (ввод/вывод) [ править | править код ]

Символ отображает данные, носитель данных не определен.

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

Предопределенный процесс (функция) [ править | править код ]

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

Вопрос (условие или решение) [ править | править код ]

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

Отображает решение или функцию переключательного типа с одним входом и двумя или более альтернативными выходами, из которых только один может быть выбран после вычисления условий, определенных внутри этого элемента. Вход в элемент обозначается линией, входящей обычно в верхнюю вершину элемента. Если выходов два или три, то обычно каждый выход обозначается линией, выходящей из оставшихся вершин (боковых и нижней). Если выходов больше трех, то их следует показывать одной линией, выходящей из вершины (чаще нижней) элемента, которая затем разветвляется. Соответствующие результаты вычислений могут записываться рядом с линиями, отображающими эти пути. Примеры решения: в общем случае − сравнение (три выхода: > , , = ); в программировании − условные операторы if (два выхода: true , false ) и case (множество выходов).

Ограничитель [ править | править код ]

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

На практике имеют смысл следующие описания ограничителей: начало/конец, запуск/останов, перезапуск (подразумевает перезапуск данной блок-схемы), ошибка (подразумевает завершение алгоритма с ошибкой), исключение (подразумевает исполнение программного исключения)

Цикл [ править | править код ]

Символ, состоящий из двух частей, отображает начало и конец цикла. Обе части символа имеют один и тот же идентификатор. Условия для инициализации, приращения, завершения и т. д. помещаются внутри символа в начале или в конце в зависимости от расположения операции, проверяющей условие.

Пример блок-схемы расчета факториала с использованием цикла [ править | править код ]

Пример вложенных циклов [ править | править код ]

Соединитель [ править | править код ]

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

Разделение алгоритма на две части с использованием соединителей [ править | править код ]

Комментарий [ править | править код ]

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

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

Параллельные действия [ править | править код ]

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

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

Описание других элементов схем можно найти в соответствующих ГОСТ [1] . Среди элементов существуют:

  • Запоминаемые данные
  • Документ
  • Ручной ввод
  • Карта
  • Дисплей
  • Ручная операция
  • Передача управления
  • Альтернативная связь между двумя или более символами
  • и др.

Представление алгоритмов в виде графов [ править | править код ]

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

Критика [ править | править код ]

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

Ответ. 0,25(11–(3) 1/2 ) 1/2 ), b=3,5.

Пример 2. При каких значениях параметра p уравнение 5–4sin 2 x–8cos 2 (x/2)=3p имеет корни?

Решение. Преобразуем заданное уравнение:

5– 4sin 2 x–8cos 2 (x/2)=3p => 5–4(1–cos2x)–4(1+cosx)=3p => 4cos 2 x–4cosx–3p–3=0.

Сделаем замену cosx=t. Тогда заданная задача равносильна следующей: при каких значениях p система

4t2–4t–3p–3=0, (1)
-1 2 –4t–3p–3; t0–вершина этой параболы. В силу схемы IX случаи 1, 2 и 3 описываются следующей совокупностью:

Как создать блок схему для уравнения

Данный материал представляет собой справочное руководство по составлении алгоритмов, которые являются необходимой составной частью контрольной и курсовой работы по дисциплине “Информатика”.

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

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

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

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

1. Алгоритм и алгоритмизация

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

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

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

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

На практике получили известность два способа изображения алгоритмов:

в виде пошагового словесного описания;

в виде блок-схем.

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

2. Блок-схема и ее элементы

Блок-схема – это последовательность блоков, предписывающих выполнение определенных операций, и связей между этими блоками. Внутри блоков указывается информация об операциях, подлежащих выполнению. Конфигурация и размеры блоков, а также порядок графического оформления блок-схем регламентированы ГОСТ 19002-80 и ГОСТ 19003-80 “Схемы алгоритмов и программ”.

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

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

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

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

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

Линии потоков должны быть параллельны линиям внешней рамки или границам листа

Название

Элемент

Комментарий

Вычислительное действие или последовательность вычислительных действий

Обращение к процедуре

Вывод данных, печать данных

Разрыв линии потока

Начало, конец, пуск, останов, вход и выход во вспомогательных алгоритмах

Используется для размещения надписей

Горизонтальные и вертикальные потоки

Линии связей между блоками, направление потоков

Слияние линий потоков

Расстояние между параллельными линиями потоков должно быть не менее 3 мм , между остальными элементами схемы – не менее 5 мм .

Горизонтальный и вертикальный размеры блока должны быть кратны 5 мм (делиться на 5 нацело). Отношение горизонтального и вертикального размеров блока b/а = 1.5 является основным. При ручном выполнении блока допустимо отношение b/а = 2.

Блоки “Начало”, “Конец” и “Соединитель” имеют высоту а/2, т. е. вдвое меньше основной высоты блоков.

Для размещения блоков рекомендуется поле листа разбивать на горизонтальные и вертикальные (для разветвлявшихся схем) зоны.

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

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

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

3. Константы, переменные и ячейки памяти

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

В состав такого автомата входят:

память, состоящая из отдельных ячеек;

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

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

В простейшем случае константой является любое арифметическое число. Например, 12, 0.78, 0, –45.33 и т. д. ( Константами могут быть такие строки символов, структуры данных и др.).

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

Переменные имеют буквенно-символьное обозначение. Например, 1, n, a, a1, b , H2 – переменные. Одновременно обозначение переменной является индексом ячейки, в которую будут записываться константы. Любая из таких констант называется значением переменной . Например, Z является переменной и адресом ячейки Z одновременно. С алгоритмической точки зрения понятия “переменная” и “адрес ячейки” памяти являются идентичными.

Запись вида Y = 5.5 следует понимать так: записать константу 5.5 в ячейку с адресом Y (если до этой операции в ячейку была записана константа, то она будет затерта, а на ее место будет помещена константа 5.5). Произносить эту запись следует так: “переменной Y присвоить значение 5.5” .

Запись вида L = M следует понимать так: прочитать константу, расположенную по адресу M и скопировать эту константу в ячейку с адресом L (при этом константа из ячейки M не удаляется, а остается такой, какой она была до чтения). Произносить эту запись нужно так: “переменной L присвоить значение переменной M (или просто: L присвоить M)”.

4. Массивы

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

Одномерный массив – это последовательность ячеек, расположенных в одну линию. На рис. 1 приведен пример такого массива.

Массив имеет имя q. Для того чтобы можно было отличить одну ячейку массива от другой ячейки этого же массива, их нумеруют. Нумерация ячеек обычно начинается с 1. Номер ячейки массива называется его индексом , а константа в ячейке – элементом массива. Теперь становится возможной работа с отдельной ячейкой такого массива. Например, команда q 7 = 8.2 означает, что в 7-ю ячейку массива q надлежит записать константу 8.2. Команда r 41 = q 2 + q 5 означает, что нужно сложить константы, записанные во 2-ю и 5-ю ячейки массива q, и результат записать в 41-ю ячейку одномерного массива r. Эту же операцию можно описать другими словами: 41-му элементу массива r присвоить значение суммы 2-го и 5-го элементов массива q.

Двумерный массив по расположению ячеек напоминает математическую матрицу ( рис. 2 ). Элемент такого массива характеризуется двумя индексами: первый показывает строку, в которой расположена ячейка, второй – ее столбец. Например, команда d 2, 5 = 43 означает, что в ячейку, размещенную на пересечении 2-й строки и 5-го столбца двумерного массива d, нужно записать константу 43.

Аналогично устроена структура массивов трех- и большей размерности.

5. Линейные алгоритмы

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

На рис. 3 приведен пример блок-схемы алгоритма вычисления периметра Р и площади S квадрата со стороной длины A.

Рис. 3. Линейный алгоритм

Блок-схема алгоритма состоит из шести блоков. Выполнение алгоритма начинается с блока 1 “Начало”. Этот блок символизирует включение автомата, настройку его на выполнение алгоритма и выделение памяти под все переменные, которые задействованы в алгоритме. В алгоритме рис. 3 таких переменных три: A, Р, S. Следовательно, под каждую из них алгоритмом будет выделено по одной ячейке памяти. На этом блок 1 будет отработан.

Как видно из рис.3, блок 1 связан вертикальной линией потока с блоком 2. Эта линия не имеет стрелки, указывавшей направление потока. Следовательно, этот поток направлен вниз. Таким образом, после выполнения блока 1 управление будет передано на блок 2. Блок 2 “Перфокарта” ( см. табл. 1) показывает, что переменной A следует присвоить значение. Это означает, что в ячейку, отведенную автоматом под эту переменную, нужно поместить константу. На реальной компьютере эта константа может быть введена самыми разными способами. Способ зависит от того, как запрограммирован данный фрагмент. Можно, например, потребовать ввод константы с клавиатура или получить его из заранее подготовленного файла. Возможно эта константа будет получена через внешние источники данных, например, от физической установки, подключенной к компьютеру.

Для данного примера способ передачи константы не имеет значения, важно лишь то, что при выполнении блока 2 в ячейку с адресом А будет занесена конкретная константа. Пусть такой константой является число 5.

Далее управление по линии потока передается к блоку 3 “Процесс”. В этом блоке при выполнении размещенной в ней команды число 4 умножается на константу, помещенную в ячейку А (т. е. 5), и результат (т. е. 20) присваивается переменной Р (т. е. константа 20 записывается в ячейку по адресу Р). После выполнения этих операций управление передается к блоку 4.

В блоке 4 аналогичным образом производится умножение значений переменной А и результат (константа 25) присваивается переменной S (в ячейку по адресу S будет занесена константа 25). После этого выполняется переход к блоку 5.

При выполнении команд блока 5 выводятся (например, на экран, бумагу, во внешний файл и т. д.) значения переменных А, Р, S, которые сохранились в соответствующих ячейках к этому моменту. Понятно, что для конкретного примера А = 5 будут выведена константы 5, 20, 25, т. е. длина сторона квадрата, его периметр и площадь. Далее управление передается последнему блоку 6.

В блоке б “Конец” производится освобождение ячеек памяти, которые были зарезервированы под переменные А, P, S, и алгоритм заканчивает работу.

Понятно, что при новом запуске этого же алгоритма можно получить совсем другие числа. Так, если в блоке 2 переменной А присвоить значение 20, то алгоритм выдаст в блоке 5 константы 20, 80, 400.

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

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

6. Разветвляющиеся алгоритмы

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

В блок-схемах ветвление начинается на выходах элемента “Решение”, с помощью которого в алгоритме выполняется проверка какого-либо условия. Количество ветвей тем больше, чем больше проверяемых условий.

Для пояснения рассмотрим решение задачи нахождения значения функции z = y/x.

На первый взгляд представляется, что алгоритм решения этой задачи имеет линейную структуру. Однако, если учесть, что делить на нуль нельзя из-за переполнения ячейки, то, во-первых, нужно из вычислений исключить вариант х = 0 и, во-вторых, проинформировать пользователя алгоритма о возникшей ошибке. Если этого не сделать, то при вычислениях может возникнуть аварийный выход до получения результата. В профессиональной практике аварийные завершения крайне нежелательны. т. к. к этому моменту уже может быть накоплено определенное количество результатов, которые окажутся необработанными и попросту пропадут. Можно привести другие примеры, когда аварийный останов компьютера может повлечь куда более серьезные последствия.

Решение задачи представлено блок-схемой рис. 4.

Рис. 4. Разветвляющийся алгоритм

Она состоит из 7 блоков. После начала работы алгоритм в блоке 2 требует ввода аргументов X и Y. Затем в блоке 3 производится проверка условия X = 0. Здесь автомат проверяет равна ли нули константа, введенная в ячейку с адресом X. Результатом такой проверки является ответ “Да” или “Нет”. В зависимости от этого ответа выполнение алгоритма пойдет по одной или другой ветви. Если результат проверки окажется отрицательным, то на х можно делить и управление передается блоку 4.

В блоке 4 будет получен результат Z, затем в блоке б значения всех трех переменных будут отпечатаны и в блоке 7 алгоритм закончит работу. Если же ответ окажется положительным, то управление будет передано блоку 4. Выполняя команду блока 4, автомат выведет сообщение “Ошибка” и затем закончит работу в том же блоке 7.

7. Циклические алгоритмы

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

Различают циклы с наперед известным и наперед неизвестным количеством проходов.

Пример 1. Рассмотрим пример алгоритма с циклом, имеющим наперед неизвестное количество проходов. Для этого решим следующую задачу. Указать наименьшее количество членов ряда натуральных чисел 1, 2, 3, . сумма которых больше числа К.

Рис. 5. Разветвляющийся алгоритм

Блок-схема алгоритма решения этой задачи приведена на рис. 5. Она состоит из восьми блоков.

После начала работы в блоке 2 вводится значение числа К. Далее в блоке 3 переменная i получает значение 1, т. е. значение, с которого начнется отсчет натуральных чисел. Переменная S, предназначенная для накопления сумма этих чисел, перед началом суммирования получает значение 0. После этого управление передается блоку 5.

В нем при выполнении команды S = S + i производится сложение содержимого ячеек S и i, а результат записывается в ячейку S. Поскольку до операции сложения было S = 0, i = 1, то после операции будет S = 1. При записи нового значения старое содержимое ячейки S (нуль) стирается, а на его место записывается число 1.

Нужно обратить внимание на то, что если бы до этой операции в блоке 3 не была выполнена команда S = 0 (записать нуль в ячейку S ), то при нахождении суммы S + 1 возникла бы ошибка, поскольку из ячейки S была бы извлечена константа, которая оказалась там после распределения памяти.

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

Если условие 6 не выполнится, то производится переход к блоку 4, где при выполнении операции значение переменной увеличивается на 1 и становится равным 2. Теперь алгоритм вновь вернется к блоку 5 и к старому значении суммы добавит новый член 2. После этого сумма станет равной 3. В блоке б вновь проверяется условие получения требуемой суммы и т. д. Цепочка блоков 5-4 будет обрабатываться вновь и вновь до того момента, когда однажды при определенном значении переменной i, наконец, выполнится условие S > К, т. е. когда накапливаемая в таком цикле сумма впервые превысит заданное значение К. Переменная i, значение которой при очередном проходе цепочки этих блоков увеличивается на 1, играет роль счетчика этого цикла.

Далее производится переход к блоку 7, где отпечатается значение количества членов ряда (извлечено и отпечатано число из ячейки i, которое там хранится в момент выполнения условия), суммы S и в блоке 8 алгоритм закончит работу.

Пример 2. Теперь приведем пример алгоритма, содержащего цикл с наперед известным количеством проходов (повторений). Алгоритм решает задачу накопления суммы положительных элементов одномерного массива Z длины N ( под длиной массива понимается количество его элементов ). Блок-схема алгоритма дана на рис. 6.

Рис. 6. Циклический алгоритм

Вначале в блоке 2 производится ввод двух переменных N и Z. Первая из них представляет одну ячейку. В нее записывается одна константа – число, равное количеству элементов массива Z. Именно такое количество ячеек объединяет другая переменная – Z.

Следует подчеркнуть, что если бы ввод этих переменных в блоке 2 производился в противоположном порядке, то это привело бы к ошибке. Действительно, невозможно заполнить N ячеек массива Z, когда самое N еще не известно (оно будет введено позже Z). Далее в блоке 3 переменной S присвоено начальное значение 0. Это сделано для того, чтобы приготовить ячейку к дальнейшему накоплению необходимой суммы.

Блоки 4-6 представляет собой сам цикл, в котором накапливается сумма.

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

Как видно из рис. 7, цикл состоит из заголовка и тела. Всякий цикл обязательно имеет свой счетчик.

На рис. 8, где показана структура и параметры заголовка цикла, роль такого счетчика выполняет переменная i. Внутри заголовка после счетчика и символа “=” через запятую указывает начальное и конечное значения счетчика и шаг его изменения (на рис. 8 их роль выполняют переменные j, k, l соответственно). Если значение шага l = l, то его можно не указывать.

Сначала производится вход в цикл. После этого начинается его выполнение.

Рис. 7. Структура цикла Рис. 8. Структура заголовка цикла

Внутри заголовка счетчику первоначально присваивается значение i = j. Затем выполняется блоки, образующие тело цикла. Обработка блоков внутри цикла производится по часовой стрелке. В результате после первого выполнения тела цикла управление вновь передается заголовку. Здесь к текущему значению счетчика добавится шаг. Теперь, если новое значение счетчика не вышло за свои пределы (т. е. не стало больше своего конечного значения при положительном шаге или меньше конечного значения – при отрицательном шаге), то снова выполняется тело цикла, вновь после возврата к заголовку к счетчику добавляется шаг. Так цикл будет выполняться до тех пор, пока значение счетчика однажды не выйдет за предписанный предел. Как только такой предел будет преодолен, произойдет выход из цикла и управление будет передано блоку, который следует сразу за циклом.

Вернемся к блок-схеме рис. 6. Заголовок ее цикла представлен блоком 4. Роль счетчика цикла играет переменная i, которая должна в цикле изменяться от 1 до N. Поскольку шаг явно не указан, то по умолчанию он подразумевается равным 1. Тело цикла образуют блоки 5 и 6.

Сразу после входа в цикл переменная i примет начальное значение i = 1. Далее в блоке 5 выполняется проверка положительности первого элемента массива Z (т. к. i = 1). Если этот элемент действительно положителен, то в блоке б он будет добавлен к переменной S, после чего выполняется возврат к заголовку цикла. Если этот элемент не положителен (т. е. нуль или отрицательный), то будет выполнен переход сразу к заголовку цикла, минуя блок суммирования 6.

На втором круге цикла счетчик i в заголовке увеличится на 1 и станет равным 2. Теперь, при новом выполнении тела цикла, в блоке 5 проверяется на положительность второй элемент массива Z и, если он положителен, то добавляется в сумму и т. д. Последний раз тело цикла выполнится при i = N. При этом значении счетчика проверяется последний элемент массива. Наконец, в заголовке цикла i примет значение N+1. Это значение выходит за предписанный предел, следовательно, произойдет выход из цикла и управление перейдет блоку 7. В этом блоке выводится накопленная сумма и алгоритм закончит работу.

8. Алгоритмы со структурами вложенных циклов

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

Рис. 9. Алгоритм сортировки массива

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

Пример 1. Рассмотрим задачу сортировки одномерного массива Z длины N. Отсортировать массив – значит расположить его элементы в порядке роста или убывания.

Опишем метод сортировки массива в порядке роста. Сначала выполняется проход по массиву с целью определения в нем наименьшего элемента. Затем производится перестановка этого элемента с первым. Далее совершается второй проход по массиву, начиная со второго элемента. Найденный наименьший элемент переставляется со вторым и т. д. После (N-1)-го прохода с выполнением названных операций массив окажется отсортированным.

Блок-схема этого алгоритма сортировки показана на рис. 9. Она включает 12 блоков. После начала работы в блоке 2 переменная N и массив Z заполняются константами. Затем в блоке 3 проверяется условие о том, нужно ли сортировать массив.

Это сводится к установлению факта наличия в массиве нескольких элементов, т. к. массив из одного элемента всегда отсортирован. Если этот факт установлен, то алгоритм приступает к сортировке. Процедура сортировки выполняется в цикле, объединяющем блоки 4-10. В теле этого цикла содержится другой цикл, который образован блоками 6-8. Его назначение станет ясно из дальнейшего разбора алгоритма.

После входа в наружный цикл его счетчик i примет значение 1, что в рамках нашего метода подразумевает первый проход по массиву.

Далее будут выполнены блоки 5-10, составляющие тело наружного цикла. В блоке 5 размещены две вспомогательные переменные V и L. Первая из них предназначена для фиксирования наименьшего элемента, а вторая – для запоминания его индекса. Так как i = 1, то при первом проходе в блоке 5 V примет значение первого элемента, а L значение 1. Затем во внутреннем цикле, образованном блоками 6-8, где его счетчик j будет изменяться от 2 до N, последовательно проводится сравнение соответствующих элементов массива Z со значением переменной V. При этом всякий раз, как будет найден меньший чем v элемент, значение V будет заменено на значение этого элемента, а в переменной L будет зафиксирован его индекс. Понятно, что после выполнения внутреннего цикла в переменной V будет содержаться значение, равное наименьшему элементу, а в L – индекс этого элемента. В блоке 9 далее проверяется, не является ли наименьший элемент первым элементом массива. Если это не так, то в блоке 10 на место наименьшего элемента (его номер L) запишется первый (т. к. при первом проходе L =1 ), а на место первого элемента – наименьший (он равен V). После этого произойдет возврат управления к заголовку наружного цикла блоку 4. В нем значение счетчика станет равным i = 2.

Затем вновь выполняется его тело, но уже для нового значения счетчика i. Теперь с помощью блоков 5-10 отыскивается наименьший элемент массива начиная с номера 2. Затем в блоках 9-10 он займет второе место в массиве и т. д. Когда тело наружного цикла выполнится (N-1), раз массив будет отсортирован.

В блоке 12 отсортированный массив будет выведен и в блоке 13 алгоритм окончит работу.

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

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

Рис. 10. Блок-схема алгоритма

Блок-схема алгоритма показана на рис. 10. Она состоит из 13 блоков. В блоке 2 переменная N и весь массив Z заполняются константами. В блоке 3 рабочие переменные S и К получает значение нуль. Переменная S сначала будет играть роль сумматора отрицательных элементов массива, затем после накопления суммы она примет значение среднего арифметического. Переменная К нужна для подсчета количества отрицательных элементов массива.

В блоках 4-7 выполняется накопление суммы отрицательных элементов массива.

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

После входа в наружный цикл в блоке 4 переменная i примет значение i = 1. Далее будет выполнено его тело ( блоки 5-7 ), которое, в свою очередь, также является циклом. После входа во внутренний цикл в блоке 5 переменная j примет значение j = 1. Затем в блоке 6 проверяется на отрицательность элемент массива Z, расположенный в первой строке и первом столбце, т. к. i = 1 и j = 1.

Если он окажется отрицательным, то в блоке 7 переменная К увеличится на 1, а к S добавляется значение этого элемента. После этого выполняется возврат к блоку 5, т. е. к заголовку внутреннего цикла. Здесь j увеличится на 1, станет равной j = 2 и управление перейдет к блоку 6. В нем проверяется элемент, стоящий все в той же первой строке, но во втором столбце (i = 1, j = 2). Если он окажется отрицательным, то К снова увеличится на 1, а к накопленному к этому времени S добавляется значение этого элемента и т.д. Когда полностью выполнится внутренний цикл, т. е. переменная j “пробежит” от 1 до N, в переменную S накопится сумма всех отрицательных элементов первой строки массива, а в К – их количество. Теперь управление передается к блоку 4 заголовка наружного цикла, где i станет равной i = 2. Снова будет отработано его тело, т. е. цикл 5-7. При этом будет найдена уже сумма отрицательных элементов первых двух строк массива, а в К сохранится количество этих элементов. Когда выполнится весь наружный цикл, в S будет константа, равная сумме отрицательных элементов всего массива, а в К – их количество. Теперь управление перейдет к блоку 8. Если окажется, что в массиве есть отрицательные элементы (К>0), то в блоке 9 вычисляется среднее арифметическое как отношение суммы элементов к их количеству. Результат помещается а ту же переменную S. Отметим, что если бы блок 8 проверки отсутствовал, то при К = 0 (в массиве нет ни одного отрицательного элемента) в блоке 9 из-за деления на нуль возникла бы ошибка. Эта ошибка повлекла бы аварийное завершение вычислений до окончания работы алгоритма.

Далее выполняется блоки 10-11, которые также образует цикл. В нем производится замена элементов побочной диагонали на среднее арифметическое S (побочной диагональю является прямолинейная цепочка ячеек в диапазоне от нижнего левого угла до верхнего правого угла массива). Обратите внимание, на то что переменная i, которая использовалась ранее, в целях экономии памяти применяется вновь.

Проследим работу этого цикла. После входа в блок 10 счетчик примет значение i = 1. Затем в блоке 11 при этом значении будет вычислен индекс столбца элемента N – 1 + i = N. Таким образом, элемент с индексами (1, N) станет равным S. На втором круге цикла i увеличится на 1 и станет i = 2. Нетрудно видеть, что теперь элемент (2, N-1) станет равным S и т. д. На последнем круге цикла элемент (N, 1) получит значение S, что завершит изменение значений всех элементов побочной диагонали на среднее арифметическое S.

Наконец, в блоке 12 измененный массив будет выведен и в блоке 13 алгоритм закончит работу.

9. Вспомогательные алгоритмы

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

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

Среди вспомогательных алгоритмов различают процедуры и функции .

Рис. 11. Процедура Warn

Первый блок схемы рис. 11 в отличие от ранее рассмотренных примеров, где этот блок имел наименование “Начало”, включает имя процедуры Warn и один формальный параметр i. С помощью этого имени в алгоритме рис. 12 выполняется обращение именно к этой процедуре.

Из схемы видно, что если на вход процедуры Warn подать i = 0, то она в блоке 3 выдаст сообщение “Введите данные”. При любом другом i будет выведено сообщение “Конец расчетов”. Этим исчерпываются возможности процедура Warn.

На рис. 12 дана схема головного алгоритма ( первый блок имеет наименование “Начало” ). Этот алгоритм в блоках 2 и 8 обращается к процедуре Warn.

Опишем последовательность и механизм обработки данных, которые предписаны алгоритмами рис. 11 и 12.

Рис. 12. Головной алгоритм

Выполнение алгоритмических действий всегда начинаются с головного алгоритма. Поэтому сначала будет выполнен блок 1 схемы рис. 12. Далее в блоке 2 головной алгоритм выполняет обращение к процедуре Warn при конкретном значении ее аргумента (0). Это конкретное значение называется фактическим параметром процедуры.

Теперь управление временно переходит в алгоритм рис. 11 процедуры Warn. Здесь и далее по всей процедуре Warn формальный параметр i заменяется на фактический параметр 0 (нуль) всюду, где он встречается.

Далее обрабатывается блок 2 процедуры, где с учетом сказанного проверяется условие 0 = 0. Результатом проверки станет перевод управления к блоку 3, в котором выводится сообщение “Введите данные”. На этом процедура заканчивается и управление вновь передается в головной алгоритм к блоку 3.

Далее в блоках 3-5 алгоритма рис. 12 выполняются уже понятные действия по вводу, суммированию и выводу переменных. Затем управление передается в блок б, который содержит новое обращение к процедуре Warn с фактическим параметром 1.

Снова управление переключается на схему рис. 11, где вместо формального параметра i всюду записывается фактический параметр – константа 1. Поскольку в блоке 2 условие 1 = 0 не выполнится, то будет выполнен блок 4 и алгоритм выведет сообщение “Конец расчетов”. После этого управление возвращается в головной алгоритм к блоку 7, где и будет окончательно завершен алгоритмический процесс.

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

10. Декомпозиция алгоритма

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

Метод, при помощи которого обычно выполняется декомпозиция, достаточно прост. Сначала вычленяют основные этапы предстоящей работы. Наиболее сложные этапы оформляет в процедуры или функции верхнего уровня. Затем, если необходимо, такие этапы делят на этапы более низкого уровня. Наиболее сложные из них также оформляют процедурами или функциями и т. д. Следуя методу “от сложного к простому”, в конечном итоге достигают решения поставленной задачи. Приведем пример декомпозиции для решения задачи сортировки массива. Эта задача была решена ранее в разд. 8 (рис. 9) без использования вспомогательных алгоритмов. Решение задачи декомпозиции состоит из трех основных этапов: 1) ввода данных, 2) сортировки массива и 3) вывода отсортированного массива. Первый и третий этапы вследствие их простоты не нуждаются в дальнейшей декомпозиции, поэтому выполняются в головном алгоритме. Второй этап представляет достаточно сложный и самостоятельный фрагмент вычислений, поэтому его целесообразно выделить в отдельную процедуру, которой можно дать имя Sort.

Этап сортировки, в свои очередь, состоит из двух этапов: 1) установления необходимости сортировки и (N–1) – кратного прохода по массиву и 2) нахождения наименьшего элемента во фрагменте массива и перестановки этого элемента с начальным элементом фрагмента. Поскольку последний этап многократно повторяется при выполнении первого этапа, то его можно оформить в отдельную процедуру. Этой процедуре можно дать имя Tra (от английского transposition – перестановка). Блок-схемы головного алгоритма, процедуры Sort и процедуры Тrа показаны на рис. 13-15 соответственно.

Рис. 13. Головной алгоритм Рис. 14. Процедура Sort

Дадим краткое, описание взаимодействия этих алгоритмов в ходе решения задачи сортировки.

Рис. 15. Процедура Tra

Выполнение начинается с головного алгоритма (рис. 13). В блоке 2 вводятся исходные данные, затем в блоке 3 выполняется сортировка массива. В блоке 4 отсортированный массив выводится и алгоритм заканчивает работу. Сортировка массива в блоке 3 головного алгоритма выполняется обращением к процедуре Sort, показанной на рис. 14. Переменные A и N являются фактическими параметрами, Переменные А и N, которые использованы в блок-схеме алгоритма Sort, является формальными параметрами.

При обращении к процедуре Sort на вход подаются параметры A и N. В результате в теле процедуры производится замена формального параметра R на фактический параметр A, аналогично формальный K заменяется на фактический N.

Далее в блоке 2 проверяется необходимость сортировки массива R. Затем, если такая необходимость будет установлена, в цикле 3-4 будет выполняется сортировка массива. При всяком значении счетчика цикла в его теле производится нахождение наименьшего элемента фрагмента и его перестановка с начальным элементом этого фрагмента. Эти операции выполняются отдельно с помощью процедуры Tra. Как видно из рис. 15, на вход процедуры Tra нужно подать имя массива (A), количество элементов (N) и номер элемента (i), которым начинается фрагмент. В теле процедуры в блоках 2-5 отыскивается наименьший элемент фрагмента (v) и его номер (k). Затем в блоке 6 выполняется вышеназванная перестановка элементов.

Таким образом, весь процесс управляется головным алгоритмом, который выполняет сортировку посредством обращения к вспомогательному алгоритму – процедуре Sort.

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

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

Рассмотрим задачу вычисления факториала числа N! = 1 . 2 . 3 . . . N. Результатом будет одно число, поэтому лучше алгоритм оформить в виде функции.

Рис. 16. Функция Fact

Ее блок-схема показана на рис. 16. Переменная К используется для накопления произведения и, поскольку 0! = 1 и1! = 1, то в блоке 2 ей сразу присваивается значение 1. Далее, если N>1, то в цикле, образованном блоками 4-5, накапливается искомое произведение и помещается в переменную К. В блоке 6 имя Fact функции получает значение вычисленного произведения из ячейки К. Для процедур действия, размещенного в блоке 6, не может быть, а для функций оно должно быть обязательно, поскольку иначе значение функции на выходе окажется неопределенным.

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

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

Пример использования функции Fact показан на рис. 17. В операторе присваивания используется обращение к функции для N = 6. После передачи этого значения в алгоритм рис. 16 и вычислений внутри него результат будет сначала присвоен имени функции, т. е. переменной Fact, а затем в операторе присваивания – переменной L.

[spoiler title=”источники:”]

http://urok.1sept.ru/articles/103091

http://koi.tspu.ru/vav/vav_umk_inf/algoritmiz/algorithm8.htm

[/spoiler]

Занятие 2. Программная реализация разветвляющегося алгоритма

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

Будут приведены примеры вычисления функций, заданных на разных промежутках кусочно. Также приведены принцип и примеры расчетов для кусочных функций, заданных на двух промежутках и на трех промежутках.

Пример 5. Даны числа a=2, b=7. Вычислить сумму S и разность R чисел a и b. Сравнить полученные значения S и R и указать большее из них.

Блок-схема представлена на рис. 4.5.

Блок-схема для примера 5

Рис.
4.5.
Блок-схема для примера 5

Код программы (Visual Studio):

// proga14.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
	double a, b, S, R;
	a=2;
	b=7;
	S=a+b;
	R=a-b;
	cout<<"S="<<S<<" R="<<R<<endl;
	if(S>R) cout<<"Max S"<<endl;
	else cout<<"Max R"<<endl;
	return 0;
}

Результат выполнения программы (Visual Studio):

Код программы (Borland C++):

#include <iostream.h>
int main(){
	double a, b, S, R;
	a=2;
	b=7;
	S=a+b;
	R=a-b;
	cout<<"S="<<S<<" R="<<R<<endl;
	if(S>R) cout<<"Max S"<<endl;
	else cout<<"Max R"<<endl;
	return 0;
}

Результат выполнения программы:

Пример 6. Составить блок-схему и программу для вычисления значений функций y=sin x и z=ln x при различных значениях аргумента. Учесть область определения функций.

Решение. Рассмотрим области определения функций y и z. Синус имеет неограниченную область определения, т.е. считается при любом действительном х. Поэтому на расчет функции y не будет никаких условий. Логарифм же существует при положительном значении аргумента, т.е. считается при x>0. Поэтому, прежде чем считать функцию z, необходимо проверить условие “x>0“. Если условие верно, то можно считать z. Если ложно, то z считать нельзя, и в этом случае мы напишем в ответ, что z не существует фразой “z net“.

Блок-схема представлена на рис. 4.6.

Блок-схема для примера 6

Рис.
4.6.
Блок-схема для примера 6

Код программы (Visual Studio):

// proga15.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
	double x, y, z;
	cout<<"vvedi x=";
	cin>>x;
	y=sin(x);
	cout<<"y="<<y;
	if(x>0){
		z=log(x);
		cout<<" z="<<z<<endl;
	}
	else cout<<" z net"<<endl;
	return 0;
}

Результат выполнения программы:

Код программы (Borland C++):

#include <iostream.h>
#include <math.h>
int main(){
	double x, y, z;
	cout<<"vvedi x=";
	cin>>x;
	y=sin(x);
	cout<<"y="<<y;
	if(x>0){
		z=log(x);
		cout<<" z="<<z<<endl;
	}
	else cout<<" z net"<<endl;
	return 0;
}

Результат выполнения программы:

Пример 7. Вычислить значение функции Z=begin{cases}x+3,&x<1\4x,&xge 1end{cases} при различных значениях аргумента х (аргумент х считать с клавиатуры).

Решение: Функция Z задана как кусочная функция, т.е. при разных значениях х она считается по-разному. Следует отметить, что при одном значении аргумента функция будет иметь лишь одно значение, т.е. функция однозначная. График функции Z представлен на рис. 4.7.

График кусочной функции

Рис.
4.7.
График кусочной функции

Посчитаем значение функции Z при х=0. Прежде всего необходимо проверить, какое условие верно: “х<1” или “хge 1“. Условие для первой ветки функции верно, значит считаем Z=x+3=0+3=3.

Посчитаем значение функции Z при х=4. Прежде всего необходимо проверить, какое условие верно: “х<1” или “хge 1“. Условие для второй ветки функции верно, значит считаем Z=4x=4cdot 4=16.

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

Примечание. Функция Z – это функция, которая имеет один аргумент. Не следует путать запись кусочной функции с системой уравнений или системой неравенств, уравнения или неравенства которых также объединены фигурной скобкой. При расчете кусочной функции не решается никакая система уравнений, система неравенств, а просто подставляется конкретное значение аргумента и вычисляется значение функции.

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

Блок-схема для примера 7 представлена на рис. 4.8.

Блок-схема для примера 7

Рис.
4.8.
Блок-схема для примера 7

Код программы (Visual Studio):

// proga16.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
int main(){
	double x, Z;
	cout<<"x=";
	cin>>x;
	if(x<1){
		Z=x+3;
	}
	else {
		Z=4*x;
	}
	cout<<"Z="<<Z<<endl;
	return 0;
}

Результат выполнения программы:

Код программы (Borland C++):

#include <iostream.h>
int main(){
	double x, Z;
	cout<<"x=";
	cin>>x;
	if(x<1){
		Z=x+3;
	}
	else { Z=4*x;
	}
	cout<<"Z="<<Z<<endl;
	return 0;
}

Результат выполнения программы:

Пример 8. Вычислить значение функции Z=begin{cases}x^2,&text{если} x<0\|x|,&text{если} 0le xle 5\5,&text{если} x> 5end{cases} при различных значениях аргумента х (аргумент х считать с клавиатуры).

Решение: Функция Z задана как кусочная функция, определенная на трех промежутках. График функции Z представлен на рис. 4.9.

График кусочной функции

Рис.
4.9.
График кусочной функции

В данной задаче будем использовать два условия для определения нужной ветви функции. Первое условие “x<0” определяет, следует ли рассчитывать по первой ветви функции. Второе условие “xle 5” определяет, следует ли рассчитывать по второй ветви. Если и первое, и второе условия оказались ложными (не выполнились), то следует рассчитывать по третьей ветви. Следовательно, в блок-схеме будем использовать два блока разветвления, а в программе два оператора условия if.

Например, нужно вычислить Z при х=-2. Первое условие “x<0” выполняется верно, т.к. -2<0. Следовательно, считать следует по первой ветви, а именно: Z=x^2=(-2)^2=4.

Например, нужно вычислить Z при х=2,5. Первое условие “x<0” выполняется неверно, т.к. 2,5>0. Проверяем второе условие “xle5“: 2,5≤5 – верно. Следовательно, считать следует по второй ветви, а именно: Z=|x|=|2,5|=2,5.

Например, нужно вычислить Z при х=10. Первое условие “x<0” выполняется неверно, т.к. 10>0. Проверяем второе условие “xle 5“: 10≤5 – неверно. Следовательно, ни первое, ни второе условия не выполнились, и считать следует по третьей ветви, а именно: Z=5.

Блок-схема представлена на рис. 4.10.

Блок-схема для примера 8

Рис.
4.10.
Блок-схема для примера 8

Код программы (Visual Studio):

// proga17.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
int main(){
	double x,Z;
	cout<<"x=";
	cin>>x;
	if(x<0){ Z=pow(x, 2.0);
	}
	else {if(x<=5){
			Z=fabs(x);}
		else {
			Z=5.0;}
	}
	cout<<"Z="<<Z<<endl;
	return 0;
}

Результат выполнения программы (Visual Studio):

Код программы (Borland C++):

#include <iostream.h>
#include <math.h>
int main(){
	double x, Z;
	cout<<"x=";
	cin>>x;
	if(x<0){
		Z=pow(x, 2.0);
	}
	else {
		if(x<=5){
			Z=fabs(x);
	}
	else {
		Z=5.0;
		}
	}
	cout<<"Z="<<Z<<endl;
	return 0;
}

Результат выполнения программы (Borland C++):

Примечание. В качестве второго условия можно, конечно, взять “0le xle 5“. Но при проверке первого условия мы уже знаем, будет ли x<0. Поэтому можно пропустить повторную проверку на положительность переменной x. Также в качестве второго условия можно взять условие “x>5“. Если оно выполнится верно, то считать следует по третьей ветви, если неверно – то по второй.

Пример 9. Вычислить значение функции Z=begin{cases}x+y,&xy<1\x-y,&xyge 1end{cases} при различных значениях аргументов х и у (аргументы х и у считать с клавиатуры).

Решение: Данный Пример аналогичен Примеру 7. Отличие состоит в том, что сейчас функция Z зависит от двух переменных x и y. Для реализации алгоритма разницы нет, поэтому за основу возьмем блок-схему и программу из Примера 7.

Блок-схема представлена на рис. 4.11.

Блок-схема для примера 9

Рис.
4.11.
Блок-схема для примера 9

Код программы (Visual Studio):

// proga18.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
int main(){
	double x, y, Z;
	cout<<"x=";
	cin>>x;
	cout<<"y=";
	cin>>y;
	if(x*y<1){ Z=x+y;
	}
	else {Z=x-y;
	}
	cout<<"Z="<<Z<<endl;
	return 0;}

Результат выполнения программы (Visual Studio):

Код программы (Borland C++):

#include <iostream.h>
int main(){
	double x, y, Z;
	cout<<"x=";
	cin>>x;
	cout<<"y=";
	cin>>y;
	if(x*y<1){
		Z=x+y;
	}
	else {
		Z=x-y;
	}
	cout<<"Z="<<Z<<endl;
	return 0;
}

Результат выполнения программы (Borland C++):

Ручной счет.

при х=-3; у=0,5 ху=-3·0,5=-1,5 <1 Z=x+y=-3+0,5=-2,5.
при x=0,8; y=2 xy=0,8·2=1,6≥1 Z=x-y=0,8-2=-1,2.

Пример 10. Вычислить значение функции Z(x,y)=begin{cases}x+y,&text{если} xy<0\x-y,&text{если} 0le xyle 5\y,&text{если} xy>5end{cases} при различных значениях аргументов х и у (аргументы х и у считать с клавиатуры).

Решение. В данном примере функция Z определена на трех промежутках, как в Примере 8. Отличие состоит в том, что Z зависит от двух переменных x и y. Для реализации алгоритма разницы нет, поэтому за основу возьмем блок-схему и программу из Примера 8.

Блок-схема представлена на рис. 4.12.

Блок-схема для примера 10

Рис.
4.12.
Блок-схема для примера 10

Код программы (Visual Studio):

// proga19.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
int main(){
	double x, y, Z;
	cout<<"x=";
	cin>>x;
	cout<<"y=";
	cin>>y;
	if(x*y<0){ Z=x+y;}
	else {
		if(x*y<=5){
			Z=x-y;
		}
		else {
			Z=y;
		}
	}
	cout<<"Z="<<Z<<endl;
	return 0;
}

Результат выполнения программы (Visual Studio):

Код программы (Borland C++):

#include <iostream.h>
int main(){
	double x, y, Z;
	cout<<"x=";
	cin>>x;
	cout<<"y=";
	cin>>y;
	if(x*y<0){
		Z=x+y;
	}
	else {
		if(x*y<=5){
			Z=x-y;
	}
	else {
		Z=y;
		}
	}
	cout<<"Z="<<Z<<endl;
	return 0;
}

Результат выполнения программы (Borland C++):

Ручной счет:

при х=-1,5; у=2   ху=-1,5·2=-3 <0   Z={по первой ветви}=x+y=-1,5+2=0,5.
при x=1,2; y=2   xy=1,2·2=2,4≤5   Z={по второй ветви}=x-y=1,2-2=-0,8.
при x=3; y=7   xy=3·7=21 >5   Z={по третьей ветви}=y=7.

Пример 11. Найти наибольшее (максимальное) из трех чисел.

Решение. Обозначим три числа буквами a, b, c. Числа a, b, c будем считывать с клавиатуры. Для нахождения наибольшего из трех чисел введем еще одну переменную max, которая будет хранить наибольшее значение. Принцип нахождения наибольшего значения заключается в следующем. Сначала принимаем max как первое число а. Потом поочередно сравниваем с оставшимися числами b и c. Если окажется, что b больше уже запомненного max, то следует перезаписать max, изменив его значение на значение b. Если же b<max, то max изменять не нужно, поэтому ветвь “нет” будет пустой. Аналогично сравниваем с и max. После двух сравнений в переменной max будет лежать наибольшее из трех чисел.

Примечание. Если чисел будет больше трех, например, пять чисел, то следует сделать четыре сравнения.

Примечание. Если нужно определить наименьшее из трех чисел, то вводят переменную min, приравнивают к первому числу. Затем поочередно сравнивают оставшиеся числа: “b<min“, “c<min“.

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

Блок-схема представлена на рис. 4.13.

Блок-схема для примера 11

Рис.
4.13.
Блок-схема для примера 11

Выполнение блок-схемы (при вводимых значениях чисел 23,7; -0,4; 34,28)

Начало
ввод данных a=23,7; b=-0,4; c=34,28
max=a=23,7
b>max   -0,4>23,7  нет
c>max   34,28>23,7  да
max=c=34,28
вывод max
Экран
a=23,7
b=-0,4
c=34,28
max=34,28

Код программы (Visual Studio):

// proga20.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
	double a, b, c, max;
	cout<<"a=";
	cin>>a;
	cout<<"b=";
	cin>>b;
	cout<<"c=";
	cin>>c;
	max=a;
	if(b>max){
		max=b;
	}
	if(c>max){
		max=c;
	}
	cout<<"max="<<max<<endl;
	return 0;
}

Результат выполнения программы (Visual Studio):

Код программы (Borland C++):

#include <iostream.h>
int main(){
	double a, b, c, max;
	cout<<"a=";
	cin>>a;
	cout<<"b=";
	cin>>b;
	cout<<"c=";
	cin>>c;
	max=a;
	if(b>max){
		max=b;
	}
	if(c>max){
		max=c;
	}
	cout<<"max="<<max<<endl;
	return 0;
}

Результат выполнения программы (Borland C++):

Пример 12. Найти значение функции Z(x)=max{3x; 10-x; |x|} при различных значениях аргумента х (аргумент х считать с клавиатуры).

Решение. Функция Z считается как наибольшее из трех выражений. Задача схожа с Примером 11. Введем обозначения: a=3x, b=10-x, c=|x|. Тогда наша задача максимально будет похожа на Пример 11.

Блок-схема представлена на рис. 4.14.

Блок-схема для примера 12

Рис.
4.14.
Блок-схема для примера 12

Выполнение блок-схемы (при вводимом x=1)

a=3x=3·1=3
b=10-x=10-1=9
c=|x|=|1|=1
Z=a=3
b>Z   9>3  да
Z=b=9
c>Z   1>9  нет
вывод Z

Код программы (Visual Studio):

// proga21.cpp: определяет точку входа для консольного приложения.
//	
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
int main(){
	double x, a, b, c, Z;
	cout<<"x=";
	cin>>x;
	a=3.0*x;
	b=10.0-x;
	c=fabs(x);
	Z=a;
	if(b>Z){Z=b;}
	if(c>Z){Z=c;}
	cout<<"Z="<<Z<<endl;
	return 0;
}

Результат выполнения программы (Visual Studio):

Код программы (Borland C++):

#include <iostream.h>
#include <math.h>
int main(){
	double x, a, b, c, Z;
	cout<<"x=";
	cin>>x;
	a=3.0*x;
	b=10.0-x;
	c=fabs(x);
	Z=a;
	if(b>Z){
		Z=b;
	}
	if(c>Z){
		Z=c;
	}
	cout<<"Z="<<Z<<endl;
	return 0;
}

Результат выполнения программы (Borland C++):

Пример 13. Найти значение функции, заданной по формуле Z(x,y)=max{x+y, x-y, xy} при различных значениях аргументов х и у (аргументы х и у считать с клавиатуры).

Блок-схема представлена на рис. 4.15.

Блок-схема для примера 13

Рис.
4.15.
Блок-схема для примера 13

Код программы (Visual Studio):

// proga22.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
	double x, y, a, b, c, Z;
	cout<<"x=";
	cin>>x;
	cout<<"y=";
	cin>>y;
	a=x+y;
	b=x-y;
	c=x*y;
	Z=a;
	if(b>Z){
		Z=b;
	}
	if(c>Z){
		Z=c;
	}
	cout<<"Z="<<Z<<endl;
	return 0;
}

Результат выполнения программы (Visual Studio):

Код программы (Borland C++):

#include <iostream.h>
int main(){
	double x, y, a, b, c, Z;
	cout<<"x=";
	cin>>x;
	cout<<"y=";
	cin>>y;
	a=x+y;
	b=x-y;
	c=x*y;
	Z=a;
	if(b>Z){
		Z=b;
	}
	if(c>Z){
		Z=c;
	}
	cout<<"Z="<<Z<<endl;
	return 0;
}

Результат выполнения программы (Borland C++):

Краткие итоги

Одна и та же блок-схема может быть использована при написании разных программ С++. Результат выполнения программы из-за этого не должен меняться.

Упражнения

  1. Составьте блок-схему и программу для вычисления значений функций z1=arccos^3(2,5x-0,6y), z2=0,45|x^3-y^2|+2lg^{2,5}y при различных значениях аргументов x и y.
  2. Составьте блок-схему и программу по нахождению корней квадратного уравнения через дискриминант. Коэффициенты квадратного уравнения считывайте с клавиатуры.
  3. Составьте блок-схему и программу, которая спрашивает у пользователя возраст и в соответствии с возрастной группой (“дошкольник”, “школьник”, “взрослый”, “пожилой”) выдает соответствующую фразу на экран.
  4. Составьте блок-схему и программу для вычисления значения функции Z(x,y)=begin{cases}sin^{0.4}(4^{4y})+lgsqrt{y-frac{x}{y-0.8}},&text{если} x+y<-2\2.3,&text{если} -2le x+yle 0\frac{sqrt[3]{x}-sqrt[3]{y}}{x}-y,&text{если} x+y>0end{cases} при разных значениях аргументов x и y.
  5. Составьте блок-схему и программу для вычисления значений функции Z(x,y)=min{max{sin x, sin y},x,y} при разных значениях аргументов x и y.

“результат работы кода в виде скриншота окна программы с отображением кода и полученного результата.” – это уже немного загнул(а) препод. Ибо в Turbo Pascal это невозможно, т.к. программа выполняется в отдельном окне, текст кода выполняющаяся программа закрывает. Вот в Pascal ABC, например – да, возможно, но Pascal ABC – не полноценный Pascal, а несколько урезанный (более того, даже не совсем Pascal, а сильно переработанный C#, если мне память не изменяет).

Ладно, не будем придираться к заданию, тем более, что смысл понятен, да и толку от этих придирок чуть. Вот код программы:

 Program F1; 
uses crt;
var x: real;
begin
clrscr;
writeln ('Введите с клавиатуры значение переменной x (число), после чего нажмите клавишу Enter. При вводе дробных значений, целую часть от дробной отделяйте точкой, а не запятой.');
write ('x=');
readln (x);
writeln ('Ответ: y(', x, ') = ', 3-7.5*x+sqr (x)-((sqr (x)+2*x-8)/3));
write ('Программа завершена. Для выхода нажмите клавишу Enter');
readkey;
end.

А вот блок-схема (вместо “y=” в прямоугольник перепишите формулу из задания вместе с этой дробью (дополните, т.е. y=3-7,5x…)- просто иначе может слишком мелким текст у меня получиться, трудночитаемым):

Добавить комментарий