Программирование циклических процессов. Циклические вычислительные процессы Программирование циклических вычислительных процессов в access

Цель работы:

Изучить циклические операторы for, while, do – while, научиться составлять и программировать циклические алгоритмы.

Краткие теоретические сведения

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

Оператор цикла for

Основная форма оператора цикла for имеет вид

for (выражение_1; выражение_2; выражение_3)

оператор;

где выражение_1 – начальное значения параметра цикла;

выражение_2 – проверка условия на продолжение цикла;

выражение_3 – изменение параметра цикла (коррекция);

оператор – простой или составной оператор языка С.

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

Например: for (k=1; k<5; k++)

printf(“\n %d”, k);

В результате выполнения этого оператора печатаются в столбик цифры от 1 до 4.

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

Например:

for(ch=’a’; ch<=’z’; ch++) // Вывод на экран букв

printf(“ %c”,ch); // латинского алфавита

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

Например :

for(k=10; k>6;k++)

printf(“бесконечный цикл \n”);

Выйти из цикла досрочно можно следующими способами:

По дополнительному условию;

Используя следующие операторы:

break; - выход из цикла, в котором находится break, управление передается на первый после цикла выполняемый оператор;

exit(int Kod); - выход из программы;

return; - выход из функции;

С помощью оператора безусловного перехода goto <метка>;

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

Передавать управление извне внутрь цикла запрещается.

Любое из выражений цикла for в круглых скобках может отсутствовать, но символ «;» опускать нельзя.

Например :

for(; i<3; i++)

puts(“Hello!”);

Циклические операторы while и do–while

Основная форма циклического оператора while :

While (условие)

оператор;

где оператор

Цикл выполняется до тех пор, пока условие принимает значение «истина», т.е. выражение в скобках возвращает ненулевой результат. Это цикл с предусловием – сначала проверяется условие, затем выполняется оператор. Поэтому цикл while не выполнится ни разу, если изначально результат вычисления условия будет равен 0.

Основная форма оператора do – while :

оператор;

while (условие);

где оператор – это простой, составной или пустой оператор.

Оператор do while – оператор цикла с постусловием, т.е. сначала выполняется оператор, а затем проверяется условие на истинность. Так как в цикле do–while условие проверяется в конце цикла, то цикл будет выполнен хотя бы один раз.

В циклах типа while и do–while допустимы те же способы досрочного выхода из цикла и досрочное завершение текущего шага цикла, как и в операторе for, но в последнем случае в отличие от цикла for управление передается на проверку условия. Для предотвращения бесконечного цикла внутри циклов while и do–while нужно предусмотреть изменение переменных, входящих в условие.

Например:

for (i=1;i<=300;i++) // Печать целых чисел, кратных 5

if (i%5!=0) continue;

printf(“%5d”,i);

Примеры бесконечных циклов:

оператор;

2) while(число_не_0) // Всегда истинно!

оператор;

оператор;

while(число_не_0); // Всегда истинно!

Среди операторов цикла обязательно должно быть условие выхода.

Вложенные циклы

В случае вложенных циклов один цикл находится внутри другого, например:

for(i=nn;i

for(j=mn;j

оператор;

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

Пример:

for(i=1;i<10;i++) // Печать таблицы умножения

for(j=1;j<4;j++)

printf(“\n %d*%d=%2d”, i, j, i*j);

printf(“\n”);

Пример использования оператора for

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

Текст программы может иметь вид

#include

#include

puts(“ Введите N”);

scanf(“%d”,&N);

for (s=0, k=1; k<=N; k++) // В заголовке цикла можно выпол-

{ // нять и двойное присваивание

printf(" \n k=%d s=%f ", k, s);

printf("\n ОТВЕТ: s=%f, Press any key...",s);

Варианты индивидуальных заданий

Составить программу для определения таблицы значений функции у в произвольном диапазоне [a ,b ] изменения аргумента х с произвольным шагом h . Значения a, b, h вводятся с клавиатуры. Таблица должна содержать следующие столбцы: порядковый номер, значение аргумента x , значение функции, сообщение о возрастании или убывании функции, разность двух соседних значений функции.

Определить максимальное и минимальное значения функции.

1. a=-p; b=p; h=0,4.

2. a=0,7; b=1,8; h=0,1.

3. a=-0,5; b=2,5; h=0,2.

4. a=-0,9; b=2,7; h=0,3.

5. a=-2; b=0,8; h=0,2.

6. a=-1,9; b=2,7; h=0,3.

7. a=-0,4p; b=0,4p; h=0,5.

8. a=-0,3p; b=1,3p; h= p/10.

9. a=-p/2; b= p/2; h=p/10.

10. a=-3; b=3; h=0,5.

Лабораторная работа № 2

«Программирование циклических вычислительных процессов»

Цель работы

Изучение операторов цикла в языке С++.

Теоретическая часть

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

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

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

Различают следующие виды циклов.


1. Безусловные циклы. Циклы, выход из которых не предусмотрен логикой программы. Специальных синтаксических средств для создания бесконечных циклов, ввиду их нетипичности, языки программирования не предусматривают, поэтому такие циклы создаются с помощью конструкций, предназначенных для создания обычных (или условных ) циклов. Например, В языке С используется цикл for(;;) с незаполненными секциями.

2. Условные циклы. Это циклы, выполнение которых управляется некоторым условием, проверяемым в начале или конце тела цикла. Соответственно, условные циклы бывают с предусловием и с постусловием. Цикл с предусловием - цикл, который выполняется пока истинно некоторое условие, указанное перед его началом. Это условие проверяется до выполнения тела цикла, поэтому тело может быть не выполнено ни разу (если условие с самого начала ложно). В большинстве процедурных языков программирования реализуется оператором while , отсюда его второе название - while-цикл. На языке С++ такой цикл имеет вид:

while(<условие>)

<тело цикла>

Цикл с постусловием - цикл, в котором условие проверяется после выполнения тела цикла. Отсюда следует, что цикл всегда выполняется хотя бы один раз. В языке Паскаль этот цикл реализует оператор repeat..until , в Си - do…while , например:

<тело цикла>

while(<условие продолжения цикла>);

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

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

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

Цикл со счётчиком - цикл, в котором некоторая переменная изменяет своё значение от заданного начального значения до конечного значения с некоторым шагом, и для каждого значения этой переменной тело цикла выполняется один раз. В большинстве процедурных языков программирования реализуется оператором for , в котором указывается счётчик (так называемая «переменная цикла»), требуемое количество проходов (или граничное значение счётчика) и, возможно, шаг, с которым изменяется счётчик.

В некоторых языках, например, Си и других, произошедших от него, цикл for , несмотря на синтаксическую форму цикла со счётчиком, в действительности является циклом с предусловием. То есть в Си конструкция цикла:


for (i = 0; i < 10; ++i)

Тело цикла

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

while (i < 10)

Тело цикла

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

Организация циклов в языке Си++

1. Цикл for.

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

for (действие до начала цикла;

условие продолжения цикла;

действия в конце каждой итерации цикла) {

инструкция цикла;

инструкция цикла 2;

инструкция цикла N;

Существует частный случай этой записи (со счетчиком):

for (счетчик = значение; счетчик < значение; шаг цикла)

тело цикла;

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

Пример: подсчет суммы всех числе от 1 до 1000.

#include

using namespace std;

int i; // счетчик цикла

int sum = 0; // сумма чисел от 1 до 1000.

setlocale(0, "");

for (i = 1; i <= 1000; i++) // задаем начальное значение 1, конечное 1000 и задаем шаг цикла - 1.

cout << "Сумма чисел от 1 до 1000 = " << sum << endl;

2. Цикл while.

Организацию циклов while или do...while удобно использовать, когда требуемое число итераций заранее неизвестно . Синтаксис цикла while в C++ выглядит следующим образом.

while (Условие) {

Тело цикла;

Данный цикл будет выполняться, пока условие, указанное в круглых скобках истинно. Пример реализации суммирования чисел от 1 до 1000 с помощью цикла while:

#include

using namespace std;

setlocale(0, "");

while (i < 1000)

cout << "Сумма чисел от 1 до 1000 = " << sum << endl;

3. Цикл do while

Цикл do while отличается от while тем, что при его выполнении цикла один проход цикла будет выполнен независимо от условия. Программа для решения задачи на поиск суммы чисел от 1 до 1000 с применением цикла do while :

#include

using namespace std;

setlocale(0, "");

int i = 0; // инициализируем счетчик цикла.

int sum = 0; // инициализируем счетчик суммы.

do {// выполняем цикл.

} while (i < 1000); // пока выполняется условие.

cout << "Сумма чисел от 1 до 1000 = " << sum << endl;

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

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

1. Блок-схема алгоритма программы.

2. Листинг программы с комментариями.

3. Результаты контрольных прогонов.

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

1. Дайте определение цикла, тела цикла, итерации.

2. Что такое условие выхода из цикла, счётчик итераций?

3. Какие этапы включает выполнение любого цикла?

4. Как работает цикл с постусловием?

5. Как работает цикл с предусловием?

6. Как работает цикл со счетчиком?

7. Как реализуется цикл с помощью оператора for?

8. Как реализуется цикл с помощью оператора while?

9. Как реализуется цикл с помощью оператора do while?

1. Вывести на экран следующую последовательность символов

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

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

4. Вводится последовательность целых чисел, 0 – конец последовательности. Определить, содержит ли последовательность хотя бы два числа, кратных 3, 5 и 7.

5. Вводится последовательность из N целых чисел. Определить наибольшее число среди кратных 11.

6. Вводится последовательность целых чисел, 0 – конец последовательности. Определить, содержит ли последовательность хотя бы три отрицательных четных числа.

7. Вводится последовательность из N вещественных чисел. Определить наименьшее число, среди чисел больших 20.

8. Вводится последовательность целых чисел, 0 – конец последовательности. Вычислить количество положительных чисел, кратных 7 и не кратных 5, и сумму отрицательных элементов последовательности.

9. Вводится последовательность из N вещественных чисел. Определить среднее арифметическое среди элементов последовательности, кратных 7.

10. Вводится последовательность чисел, 0 – конец последовательности. Определить является ли последовательность строго убывающей.

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

13. Вводится последовательность из N вещественных чисел. Определить, является ли последовательность знакочередующейся.

14. Вводится последовательность из N вещественных чисел. Определить разницу между минимальным положительным и максимальным отрицательным элементами последовательности.

15. Найти последние три числа кратные четырем в диапазоне от 1 до N. Вычислить сумму этих чисел.

16. Вывести на экран следующую последовательность символов

18. Вычислить произведение последних трех чисел не кратных 5 в диапазоне от N1 до N2.

19. Вычислить среднее арифметическое четных чисел, некратных четырем в диапазоне от 1 до K.

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

Чтобы скачать архив с документом, в поле, расположенное ниже, впишите пятизначное число и нажмите кнопку "Скачать архив"

Подобные документы

    Составление отчетной ведомости "Магазины" в Excel 2013. Работа с таблицами семейства Microsoft Office. Построение круговой диаграммы и гистограммы, графиков. Разработка процедур для табулирования функций. Программирование функций пользователя на VBA.

    курсовая работа , добавлен 03.04.2014

    Пакет Microsoft Office. Электронная таблица MS Excel. Создание экранной формы и ввод данных. Формулы и функции. Пояснение пользовательских функций MS Excel. Физическая постановка задач. Задание граничных условий для допустимых значений переменных.

    курсовая работа , добавлен 07.06.2015

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

    курсовая работа , добавлен 25.04.2013

    Организация файлов и доступ к ним. Файловые операции. Программирование с использованием встроенных функций ввода-вывода; линейных, разветвляющихся и циклических вычислительных процессов с использованием If-else, оператора выбора Case; массивов и матриц.

    курсовая работа , добавлен 24.05.2014

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

    реферат , добавлен 03.02.2013

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

    курсовая работа , добавлен 30.05.2014

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

    дипломная работа , добавлен 16.02.2016

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

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

Для организации циклов во всех системах программирования существуют специализированные операторы циклов , применение которых избавляет программиста от необходимости программировать циклы "вручную". MathCAD поддерживает два вида таких операторов – цикл с предопределением For (называемый также циклом со счетчиком ) и цикл с предусловием While . Описание структуры этих операторов приведено в таблице 5.

5.4.1 Оператор For

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

Заголовок цикла этого оператора (правый операнд) содержит переменную, называемую параметром (или счетчиком) цикла , и список значений этого параметра. Число элементов списка определяет и количество итераций – при выполнении каждой итерации параметр цикла получает очередное значение из списка, заданного в заголовке.

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

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

По завершению последней итерации будет выполняться оператор программы, следующий после оператора цикла. При этом переменная, использованная в качестве параметра завершенного цикла, сохраняет значение, которое она имела в последней реально выполненной итерации[*]. Заметим, что это значение не всегда совпадает с последним значением из списка, заданного в заголовке цикла, так как возможен "досрочный" выход из цикла при срабатывании оператора Break , включенного в тело цикла.

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

Три программы, приведенные на рисунке 21, иллюстрируют различные варианты использования оператора For .

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

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

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

Рисунок 21 – Примеры программирования циклов For


Рисунок 22 иллюстрирует использование операторов Break и Continue в теле цикла. Как правило, эти операторы сами являются операндами условных операторов If или Otherwise .

Оператор Break ("прервать") прерывает выполнение цикла и передает управление оператору, следующему после прерванного оператора цикла. Заметим, что если оператором Break прерван вложенный цикл , выполнение внешнего цикла будет продолжено.

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

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

Рисунок 22 – Примеры использования операторов Break и Continue

Функция SumN(V) суммирует только те элементы вектора, которые содержат скалярные данные числового типа, а остальные элементы пропускаются. Функция Inverse(V) формирует вектор, элементы которого – значения, обратные значениям соответствующих элементов исходного вектора. При этом, если очередной элемент содержит число "0" или не является скаляром числового типа, цикл прерывается . Заметим, что оператор Break в последнем примере не прерывает работы программы, а передает управление оператору Return , следующему непосредственно после оператора For .

5.4.3 Оператор While

В отличие от оператора For , заголовок оператора While (в переводе - "пока ") не содержит явных указаний на количество итераций – он содержит логическое выражение , значение которого автоматически вычисляется перед началом выполнения каждой очередной итерации[†]. Пока это выражение "истинно", итерации цикла будут продолжаться; как только после завершения очередной итерации выражение станет "ложным", следующая итерация цикла выполнена не будет, и управление получит оператор программы, следующий после оператора While .

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

Примеры использования оператора While приведены на рисунке 23. Приведены три варианта решения одной и той же задачи: каждая из программ F0 , F1 и F2 возвращает индекс первого из элементов исходного вектора V , превосходящего заданное значение z .

Первая программа (пример а ) прибавляет единицу к счетчику k в теле цикла While до тех пор, пока очередной k -й элемент исходного вектора не превысит заданного значения z . После этого цикл завершается, и программа возвращает последнее измененное значение переменной k , которое и является решением задачи. Отметим, что в отличие от цикла For , счетчик k здесь необходимо обрабатывать отдельными операторами: инициализировать (то есть присваивать ему начальное значение) перед оператором цикла и изменять его значение в теле цикла.

Нетрудно заметить, что вариант а ) программы имеет существенный недостаток: он не предотвращает зацикливания программы в случае, когда задача не имеет решения, то есть когда параметр z превышает значение самого большого элемента вектора V . В этом примере зацикливания в такой ситуации реально не произойдет – но это заслуга не нашей программы, а системы MathCAD, которая проконтролирует выход индекса вектора V за пределы допустимых значений и выдаст сообщение об ошибке.

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

Возможно, наиболее эффективным вариантом решения этой задачи является вариант в ), который вообще не использует оператор While . В этой программе переменная k использована только для соблюдения "чистоты стиля" – чтобы исключить обработку параметра цикла i вне оператора For .

Рисунок 23 – Примеры программирования циклов While

ПРОГРАММИРОВАНИЕ ЦИКЛИЧЕСКИХ ВЫЧИСЛИТЕЛЬНЫХ ПРОЦЕССОВ

Основные сведения

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

оператор цикла с параметром For – Next , конструкция которого используется, если заранее известно, сколько раз должно повториться тело цикла:

For счетчик = начальное_значение То конечное_значение Step шаг блок_операторов

Next с четчик

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

Конструкция цикла

Конструкция цикла

с предусловием имеет вид:

с постусловием имеет вид:

Do While условие

блок_операторов

блок_операторов

Loop While условие

Do Until условие

блок_операторов

блок_операторов

Loop Until условие

While условие

блок_операторов

Разработаем пользовательскую форму и составим программу для определения индекса рентабельности предлагаемого инвестиционного проекта обновления оборудования, если сумма первоначальных вложений (ПВ) составляет 10 000 тыс. р., ставкадисконтированияr = 10 %, апредполагаемые денежныепотокиследующие:

Денежный поток (ДПk B ),B тыс. р.

Пусть пользовательская форма будет иметь вид (рис. 1), а значения величин денежных потоков в 1-м – 5- х годах считываются из ячеек рабочего листа «Пример 1» (рис. 2).

Свойства объектов формы представлены в таблице 1.

Рис. 1. Форма «Индекс рентабельности

рентабельности

инвестиционного проекта»

рассчитывается по формуле

∑n

ДПk

ИР =

k = 1 (1+ r )

где n – количество лет, в течение которых будут приходить денежные поступления.

Рис. 2. Таблица распределения денежных потоков

Таблица 1

Свойство

Свойство

Caption = Индекс рента-

Caption = Размер первоначаль-

бельности инвестиционно-

ных вложений

го проекта

Caption = Ставка дисконтирова-

Caption = Индекс рентабельности

Caption = Очистить

Caption = Выход

Для обработки события нажатия кнопки «Рассчитать» введем следующий

Private Sub calc_Click()

‘задание типа переменных

Dim pv, dp, i, n As Integer

Dim r, s As Single

‘считывание значений переменных

pv = Val(txtPV.Text)

r = Val(txtSD.Text) / 100

n = Val(InputBox("Введите количество лет, в течение которых будут

приходить

денежные

поступления ", "Ввод данных"))

‘считывание значений денежных потоков

dp = Cells(2, i + 2)

‘суммирование

txtIR.Text = Round(s / pv, 2) ‘округление и вывод результата

Функция Round (N, k) округляет число N до k знаков после запятой.

Далее с помощью элемента Кнопка панели инструментов Элементы управления разместим ниже таблицы кнопку «Открыть форму» для запуска процедуры «ФормаИндексРентабельности» (рис. 3). Код данной процедуры имеет вид:

Private Sub ФормаИндексРентабельности_Click ()

Рис. 3. Определение индекса рентабельности инвестиционного проекта

С помощью созданной кнопки «Открыть форму» запустим форму и рассчитаем индекс рентабельности инвестиционного проекта (рис. 3).

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

Для создания данной пользовательской формы перейдем в редактор VB (останемся в той же рабочей книге MS Excel, что и в примере 1) и добавим еще одну форму (рис. 4).

Свойства объектов формы представлены в таблице 2.

Для обработки событий нажатия кнопок

следующий код:

Private Sub calc_Click()

Рис. 4. Форма для примера 2

Label2.Caption = ""

‘определение первой цифры двузначного числа

‘определение второй цифры двузначного числа

If (i1^2+i2^2) Mod 13=0 Then Label2.Caption = Label2.Caption+Str(i)+" "

Private Sub clean_Click()

Label2.Caption = ""

Private Sub exitForm_Click()

Таблица 2

Свойство

Caption = Пример 2

Caption = Двузначные числа, сумма

квадратов цифр которых делится на 13

TextAlign = 2-fmTextAlignCenter

Caption = “ ”

AutoSize = False

Свойство

Caption = Очистить

Caption = Выход

На рабочем листе «Пример 2» разместим

кнопку «Открыть форму» для вызова формы

«Пример 2» и запустим данную форму (рис.

Разработаем

пользовательский

интерфейс

и составим

программу для вы-

суммы ряда:

числения с точностью ε = 10P

k + 2

S = ∑

(− 1)

k = 1

Останемся в той же рабочей книге Excel,

что и в примерах 1 и 2. С помощью инстру-

Рис. 5. Двузначные числа, сумма квад-

ментов «Надпись», « Поле» и «Кнопка» па-

ратов цифр которых делится на 13

нели инструментов

Элементы

управления

разместим на рабочем листе «Пример 3» соответствующие объекты (рис. 6).

Свойства объектов листа «Пример 3» представлены в таблице 3.

Таблица 3

Свойство

Свойство

Caption = Сумма ряда

Caption = Очистить

Для обработки событий нажатия кнопок «Рассчитать» и «Очистить» введем в модуле «Лист3(Пример 3)» следующий программный код:

eps = Val(InputBox("Задайте точность", "Ввод данных"))

a = (-1) ^ (k + 2) / (f * 2 ^ k) s = s + a

Loop txtS.Text = s

Private Sub clean_Click() txtS.Text = ""

Здесь тело цикла Do While – Loop будет

выполняться,

слагаемое

абсолютной

k + 2

n− 1

k + 2

n+ 2

величине (т.

(− 1)

−∑

(− 1)

(− 1)

) будет

Рис. 6. Вычисление суммы

k = 1

k = 1

превышать заданную точность 10 P

Проверим работу программы (рис. 7).

Разработаем

пользовательскую

составим программу для решения следующей задачи.

При анализе хозяйственной деятельности пред-

установлена

следующая

закономерность: в январе 2004 г. прибыль данного

предприятия составила 573 тыс. р. и в течение

следующих 5 лет ежемесячно увеличивалась на i %,

где i – номер месяца (т. е. в феврале – на 2 %, в марте

– на 3 % и т. д.), по сравнению с суммой прибыли в

Рис. 7. Результат вычисления

предыдущем месяце.

Определить полученные пред-

суммы ряда

приятием суммы прибыли за 2004 г., 2005 г., …, 2008 г., а также общую сумму прибыли за эти 5 лет.

Для создания данной пользовательской формы перейдем в редактор VB (останемся в той же рабочей книге MS Excel, что и в примерах 1–3) и добавим еще одну форму (рис. 8). Вывод вычисленных значений прибыли предприятия будет осуществляться как в поле объекта список (ListBox ), размещенного на форме, так и в ячейки рабочего листа «Пример 4» (рис. 9).

Рис. 8. Форма «Прибыль предприятия» Рис. 9. Таблица к примеру 4

Свойства объектов формы представлены в таблице 4.

Таблица 4

Свойство

Свойство

Caption = Прибыль предприятия

Caption = Очистить

Caption = Выход

Примечание. Свойство ColumnCount задает количество колонок объекта ListBox.

Для обработки событий нажатия кнопок «Рассчитать», «Очистить» и «Вы-

ход» введем следующий код:

Private Sub calc_Click() Dim i, j As Integer

Dim PrM, prG, sPr As Single

PrM = Val(InputBox("Введите прибыль, полученную в январе 2004 г.", "Ввод данных"))

ListBox используется метод AddItem , предназначенный для добавления элементов в список

ИмяСписка.AddItem Выражение , Индекс

где Выражение – элемент списка, который надо добавить; Индекс – порядковый номер элемента в списке (нумерация элементов списка начинается с 0).

А свойство List (НомерСтроки, НомерСтолбца) объекта ListBox возвращает (присваивает) элемент списка, стоящий на пересечении указанных строки и столбца.

На рабочем листе «Пример 4» разместим кнопку «Открыть форму» для вызова формы «Прибыль предприятия» и запустим данную форму (рис. 10).

Теперь можно добавить в рабочую книгу MS Excel еще один лист с именем «Оглавление», на котором, например, с помощью инструмента Кнопка панели инструментов Формы создадим четыре кнопки: «Индекс рентабельности», «Двузначные числа», «Сумма ряда», «Прибыль предприятия».

В редакторе VB добавим новый модуль (Insert → Module ), в котором введем следующий код:

Public Sub ЛистПример1()

Worksheets("Пример 1").Activate

ListPr.AddItem "Год", 0

‘задание начальных подписей и данных

ListPr.List(0, 1) = "Прибыль, тыс. р."

‘цикл по годам

‘цикл по месяцам каждого года

If (i = 4) And (j = 1) Then

PrM = PrM * (1 + j / 100)