
- •19.0. Введение
- •19.1. Моделирование как метод познания
- •20.1. Формы представления моделей
- •20.2. Классификация математических моделей
- •21.1. Математическая модель системы (объекта)
- •21.2. Методы математического моделирования
- •21.3. Технология математического моделирования системы (объекта)
- •1 Этап. Формулирование целей и задач моделирования, выявление проблем, описание объекта исследования.
- •2 Этап. Изучение априорной информации об объекте исследования.
- •3 Этап. Формализация постановки задачи: формальное описание целей и задач моделирования, формулировка требований.
- •4 Этап. Стратегическое и тактическое планирование эксперимента с объектом.
- •5 Этап. Экспериментирование с объектом.
- •6 Этап. Идентификация объекта.
- •7 Этап. Оценка адекватности модели, ее свойств, устойчивости, областей применения.
- •8 Этап. Решение задач моделирования, подведение итогов.
- •21.4. Контрольные вопросы и задания
- •22.1. Понятие информационной модели
- •22.2. Этапы моделирования
- •22.3. Типовые информационные модели
- •Графы, сети, деревья
- •23.1. Понятие алгоритма
- •23.2. Свойства алгоритма
- •23.3. Данные алгоритмов
- •23.4. Элементарные алгоритмические действия
- •23.5. Способы записи алгоритмов
- •24.0. Введение
- •25.0. Введение
- •26.0. Введение
- •27.0. Введение
- •28.1. Вычисление конечных и бесконечных сумм и произведений
- •28.2. Решение уравнений итерационными методами
- •28.3. Расчет таблиц функциональных зависимостей
- •28.4. Подсчет числа положительных, отрицательных и нулевых элементов массивов
- •28.5. Расчет модуля вектора и нормы матрицы
- •28.6. Расчет среднего и дисперсии элементов в массивах
- •28.7. Поиск минимальных или максимальных значений в массивах
- •28.8. Алгоритмы упорядочивания элементов в массивах
- •28.9. Умножение матрицы на вектор и матрицы на матрицу
- •28.10. Возведение квадратной матрицы в целую степень
- •28.11. Исключение элементов массивов
- •28.12. Расчет определителя квадратной матрицы
- •28.13. Транспонирование матриц
- •29.1. Что такое язык программирования?
- •29.2. Низкоуровневые языки программирования
- •29.3. Языки высокого уровня
- •Навигация по разделам:
- •29.3.1. Процедурные языки программирования
- •29.3.2. Функциональные языки программирования
- •29.3.3. Логические языки программирования
- •30.0. Введение
- •31.0. Введение
- •31.1. Постановка и формализация задачи
- •31.2. Разработка алгоритмов решения задачи
- •31.2. Разработка алгоритмов решения задачи
- •31.4. Анализ результатов
- •31.5. Сопровождение программ
- •32.0. Введение
- •33.1. Технология структурного программирования
- •33.2. Структурные методы анализа и проектирования по
- •33.3. Модульное программирование
- •Навигация по разделу
- •33.3.1. Hipo - диаграмма
- •33.3.2. Метод нисходящего проектирования
- •33.3.3. Метод расширения ядра
- •33.3.4. Метод восходящего проектирования
- •33.4. Базовые управляющие структуры структурного программирования
- •33.5. Проектирование и тестирование программы
- •33.6. Подпрограммы, процедуры и функции
- •Навигация по разделу:
- •33.6.1. Основные понятия и терминология
- •33.6.2. Локальность
- •33.6.3. Параметры процедуры
- •34.1. Методология объектно-ориентированного программирования
- •34.2. Объектно-ориентированные методы анализа и проектирования по
- •34.3. Основные принципы построения объектной модели
- •34.4. Основные элементы объектной модели
- •34.5. Пример разработки консольного приложения в технологии объектно-ориентированного подхода
- •Навигация по разделу:
- •34.5.1. Диаграмма прецендентов uml
- •34.5.2. Диаграмма последовательности uml для прецедента
- •34.5.3. Диаграмма классов uml для прецендента «перевести р-ичную строку в число»
- •34.5.4. Текст приложения на языке Object Pascal
- •35.0. Введение
- •35.1. История развития бд
- •35.2. Классификация бд
- •Навигация по разделу:
- •35.2.1. Основные функции субд
- •36.1. Основные понятия бд
- •36.2. Основные понятия реляционной модели бд
- •36.3. Предпроектное обследование предметной области. Связи таблиц
- •36.4. Нормализация отношений
- •36.5. Общие сведения о ms Access
- •36.6. Приложение
- •36.6. Приложение
- •37.2. Связь между таблицами и целостность данных
- •37.3. Создание запросов в ms access
- •Навигация по разделу:
- •37.3.1. Запросы на выборку
- •37.3.2. Запросы с параметрами
- •37.2.3. Запросы с вычислениями
- •37.2.4. Итоговые запросы
- •37.2.5. Перекрестные запросы
- •37.4. Формы
- •37.5. Отчеты
- •38.0. Введение
- •38.1. Различные подходы к построению систем ии
- •38.2. Экспертные системы
- •Методы, основанные на правилах.
- •Методы, основанные на фреймах.
27.0. Введение
← 26.0. Введение |
28.1. Вычисление конечных и бесконечных сумм и... → |
Примеры операторов, поддерживающих описанные выше структурные конструкции алгоритмов приведем на примере языков паскаль и С (С++).
Бинарное ветвление на языке паскаль реализуется оператором if-then-else. Его конструкция имеет следующий вид:
if <логическое выражение > then <оператор 1> else <оператор 2>
Если ветвь реализуется более чем одним оператором, то они объединяются операторными скобками begin ... end. Перед else разделитель «точка с запятой» не ставится.
В качестве примера приведем запись этого оператора для вычисления корней квадратного уравнения по алгоритму рис. 23.3.
... if D>=0 then begin x1:=re+im; x2:=re-im; key:=0; end else begin x1:=re; x2:=im; key:=1; end; ...
Обход на языке паскаль реализуется оператором if-then, представляющим упрощен-ную форму предыдущего без блока else:
if <логическое выражение > then <оператор>
Например,
... if x<0 then begin x:=-x; y:=sin(x)+exp(x); end; ...
На языке С++ аналогичные операторы if-else и if имеют следующую форму:
if (<логическое выражение >) <оператор 1> else <оператор 2>;
if (<логическое выражение >) < оператор >;
Примеры их записи:
... if (x<0) { x=-x; y=sin(x)+exp(x); } ...
... if (D>=0) { x1=re+im; x2=re-im; key=0; } else { x1=re; x2=im; key=1; } ...
Множественное ветвление на паскале реализуется оператором case-of:
case <s> of a:<Ветвь A>; b:<Ветвь B>; c:<Ветвь C>; … else <Ветвь X>; end;
В этом операторе S представляет собой выражение любого порядкового типа (целое, символьное и пр.). Оно вычисляется и затем выбирается ветвь с совпадающей по значению меткой (a, b, c в данной записи). После ее исполнения происходит выход из оператора. В качестве меток используются константы того же типа, что и S. Если это значение не совпало ни с одной из меток, то выполняется ветвь, стоящая после служебного слова else. Если действия в ветви требуют несколько операторов, то их следует объединить операторными скобками begin ... end. В конкретном примере применения этого оператора переменным x, y и z присваивается различный набор значений, зависящий от значения переменной-селектора key, которая имеет символьный тип:
... case key of 'a': begin x:=1; y:=2; z:=3; end; 'b': begin x:=2; y:=3; z:=4; end; 'c': begin x:=3; y:=4; z:=5; end; else begin x:=0; y:=0; z:=0; end; end; ...
На C++ множественное ветвление реализуется оператором switch:
switch (<s>) { case a:<Ветвь A>; break; case b:<Ветвь B>; break; case c:<Ветвь C>; break; ... default <Ветвь X>; }
Выражение-селектор S в этом операторе записывается в круглых скобках. Операторы каждой ветви можно не объединять операторными скобками {...}. Но каждая ветвь обычно заканчивается оператором break. Он не является обязательным, но при его отсутствии после текущей ветви будет выполняться следующая. Это расширяет возможности оператора. Например, если break отсутствует в первой ветви и S = a, то после выполнения ветви A будет выполнена ветвь B. При S = b будет выполнена только ветвь B.
Приведенный выше для паскаля пример на языке С++ выглядит следующим образом:
... switch (key) { case 'a': x=1; y=2; z=3; break; case 'b': x=2; y=3; z=4; break; case 'c': x=3; y=4; z=5; break; default: x=0; y=0; z=0; } ...
Цикл с послеусловием на языке паскаль реализуется оператором repeat-until:
repeat <тело цикла> until <логическое выражение >;
Тело цикла окаймляется служебными словами repeat и until. Цикл повторяется до тех пор, пока логическое выражение, следующее после until, не примет значение истина. Даже если в тело цикла входит несколько операторов, то операторные скобки begin ... end использовать не нужно. Пример использования этого оператора для нахождения суммы чисел от 1 до n:
... Sum:=0; i:=1; repeat Sum:=Sum+i; i:=i+1; until i>n; ...
На языке С++ цикл с послеусловием реализуется оператором do-while:
do <оператор тела цикла> while (<логическое выражение >);
В отличие от паскаля, возврат на начало цикла будет происходить, пока логическое выражение имеет значение истина. Когда логическое выражение примет значение ложь, оператор тела цикла выполнится последний раз и цикл завершится. Логическое выражение записывается в круглых скобках. Тело цикла, состоящее из некоторых операторов, объединяется в составной операторными скобками {...}. Пример оператора do-while выглядит следующим образом:
... Sum=0; i=1; do { Sum=Sum+i; i++; } while (i<=n); ...
Цикл с предусловием на паскале представлен оператором while:
while <логическое выражение > do <оператор тела цикла>;
Оператор тела цикла исполняется, пока логическое выражение имеет значение истина. Тело цикла, состоящее из нескольких операторов, требует операторных скобок begin ... end. Пример записи этого цикла для расчета суммы предыдущего примера выглядит следующим образом:
... Sum:=0; i:=1; while i<=n do begin Sum:=Sum+i; i:=i+1; end; ...
На языке C++ цикл с предусловием представлен аналогичным оператором while:
while (<логическое выражение >) <тело цикла>;
Различие с паскалем только в наличии скобок у логического выражения и в отсутствии служебного слова do. Тело цикла, состоящее из некоторых операторов, объединяется в составной операторными скобками {...}. Пример:
... Sum=0; i=1; while (i<=n) { Sum=Sum+i; i++; } ...
Цикл по переменной на языке паскаль возможен только по переменной целого типа и с шагом, равным единице. Он реализуется операторами for-to-do (прямой цикл) и for-downto-do (обратный цикл):
for var:=<b> to <e> do <оператор тела цикла>
for var:=<b> downto <e> do <оператор тела цикла>
В этих конструкциях
var – управляющая переменная цикла целого типа;
B – выражение, задающее ее начальное значение;
E – выражение, задающее ее конечное значение.
В прямом цикле должно выполняться условие E > B, а в обратном, наоборот, E < B. Если это не выполняется, тело цикла не будет исполняться ни разу. Если тело цикла реализуется не-сколькими операторами, то они должны объединяться операторными скобками begin ... end.
Использование этих циклов для расчета суммы приведенных выше примеров выглядит следующим образом:
... Sum:=0; for i:=1 to n do Sum:=Sum+i; ... ... Sum:=0; for i:=n downto 1 do Sum:=Sum+i; ...
Удобно использовать эти циклы для работы с массивами, например, для расчета среднего значения Xmean элементов одномерного массива X:
... Sum:=0; for i:=1 to n do Sum:=Sum+X[i]; Xmean:=Sum/n; ...
Для вывода на дисплей элементов матрицы A, состоящей из m строк и n столбцов, ис-пользуется двойной цикл по индексу строки i и индексу столбца j:
... for i:=1 to m do begin for j:=1 to n do write(A[i,j]:6:2,’ ‘); writeln; end; ...
Ограничение, связанное с целым (порядковым) типом управляющей переменной в этих циклах создает небольшие неудобства при осуществлении цикла по вещественной переменной, например, при расчете таблицы значений вещественной функции y(x) вещественного аргумента x в пределах от Xmin до Xmax с шагом Xstp. Но они легко преодолеваются, особенно, если результаты нужно записывать в массивы:
... n:=round((Xmax-Xmin)/Xstp)+1; for i:=1 to n do begin X[i]:=Xmin+(i-1)*Xstp; Y[i]:=f(X[i]); end; ...
В этом фрагменте сначала вычисляется число точек зависимости n. Функция round() превращает вещественный результат деления в целый тип, используя правила округления. В цикле по очевидной формуле рассчитывается и записывается в соответствующий элемент массива X[] текущее значение аргумента. Затем рассчитывается и присваивается соответствующему элементу массива Y[] значение функции f() от этого аргумента.
На языке С++ цикл по переменной реализуется оператором for:
for (var = <ИВ >; <ЛВ>; <МВ> ) <оператор тела цикла>
где
ИВ – инициирующее выражение, присваивающее начальное значение управляю-щей переменной цикла var;
ЛВ – логическое выражение – условие повторения цикла;
МВ – модифицирующее выражение, изменяющее значение управляющей переменной цикла.
Цикл повторяется, пока ЛВ имеет значение истина. Тело цикла представляет собой либо про-стой, либо составной оператор со скобками {...}. Переменная цикла может быть вещественной.
Язык С++, в отличие от паскаля, позволяет внутри тела цикла изменять значение управ-ляющей переменной, но делать это не рекомендуется.
Приведенные выше примеры цикла по переменной на языке С++ выглядят следующим образом.
Расчет суммы:
... Sum=0; for (i=1; i<=n; i++) Sum=Sum+i; ...
Расчет среднего значения элементов массива:
... Sum=0; for (i=1; i<=n; i++) Sum=Sum+X[i]; Xmean=Sum/n; ...
Вывод на дисплей матрицы A:
... for (i:=1; i<=m; i++) { for (j=1; j<=n; j++) printf(“%6.2f ”,A[i][j]); printf(“\n”); } ...
Расчет таблицы вещественной функции:
... n=round((Xmax-Xmin)/Xstp)+1; for (i=1; i<=n; i++) { X[i]=Xmin+(i-1)*Xstp; Y[i]=f(X[i]); } ...
Для округления здесь также используется функция round(), которой в стандартном С++ нет, но она легко может быть разработана. Текст ее не приводим, т.к. для примера записи цикла это не имеет существенного значения.
← 26.0. Введение |
28.1. Вычисление конечных и бесконечных сумм и... → |