пр 11. 08.11.2021 Практическая работа №11. Лабораторная работа циклические алгоритмы
Скачать 355.35 Kb.
|
39 ЛАБОРАТОРНАЯ РАБОТА № 4. ЦИКЛИЧЕСКИЕ АЛГОРИТМЫ Цель лабораторной работы: изучить простейшие средства отлад- ки программ в среде Visual Studio. Составить и отладить программу циклического алгоритма. 4.1. Операторы организации циклов Под циклом понимается многократное выполнение одних и тех же операторов при различных значениях промежуточных данных. Число повторений может быть задано в явной или неявной форме. К операторам цикла относятся: цикл с предусловием while , цикл с постусловием do while , цикл с параметром for и цикл перебора foreach . Рассмотрим некоторые из них. 4.2. Цикл с предусловием Оператор цикла while организует выполнение одного оператора (про- стого или составного) неизвестное заранее число раз. Формат цикла while : while (B) S; где B – выражение, истинность которого проверяется (условие заверше- ния цикла); S – тело цикла – оператор (простой или составной). Перед каждым выполнением тела цикла анализируется значение выражения В : если оно истинно, то выполняется тело цикла, и управле- ние передается на повторную проверку условия В ; если значение В лож- но – цикл завершается и управление передается на оператор, следую- щий за оператором S Если результат выражения B окажется ложным при первой провер- ке, то тело цикла не выполнится ни разу. Отметим, что если условие B во время работы цикла не будет изменяться, то возможна ситуация за- цикливания, то есть невозможность выхода из цикла. Поэтому внутри тела должны находиться операторы, приводящие к изменению значения выражения B так, чтобы цикл мог корректно завершиться. В качестве иллюстрации выполнения цикла while рассмотрим про- грамму вывода целых чисел от 1 до n по нажатию кнопки на форме: private void button1_Click( object sender, EventArgs e) { 40 int n = 10; // Количество повторений цикла int i = 1; // Начальное значение while (i <= n) // Пока i меньше или равно n { MessageBox .Show(i.ToString()); // Показываем i i++; // Увеличиваем i на 1 } } 4.3. Цикл с постусловием Оператор цикла do while также организует выполнение одного оператора (простого или составного) неизвестное заранее число раз. Однако в отличие от цикла while условие завершения цикла проверяет- ся после выполнения тела цикла. Формат цикла do while : do S while (B); где В – выражение, истинность которого проверяется (условие заверше- ния цикла); S – тело цикла – оператор (простой или блок). Сначала выполняется оператор S , а затем анализируется значение вы- ражения В : если оно истинно, то управление передается оператору S , если ложно – цикл завершается, и управление передается на оператор, следую- щий за условием B . Так как условие В проверяется после выполнения тела цикла, то в любом случае тело цикла выполнится хотя бы один раз. В операторе do while , так же как и в операторе while , возможна ситуация зацикливания в случае, если условие В всегда будет оставаться истинным. 4.4. Цикл с параметром Цикл с параметром имеет следующую структуру: for (<инициализация>; <выражение>; <модификация>) <оператор>; Инициализация используется для объявления и/или присвоения на- чальных значений величинам, используемым в цикле в качестве пара- метров (счетчиков). В этой части можно записать несколько операторов, разделенных запятой. Областью действия переменных, объявленных в части инициализации цикла, является цикл и вложенные блоки. Ини- циализация выполняется один раз в начале исполнения цикла. Выражение определяет условие выполнения цикла: если его ре- зультат истинен, цикл выполняется. Истинность выражения проверяется перед каждым выполнением тела цикла, таким образом, цикл с пара- 41 метром реализован как цикл с предусловием. В блоке выражение через запятую можно записать несколько логических выражений, тогда запя- тая равносильна операции логическое И (&&). Модификация выполняется после каждой итерации цикла и служит обычно для изменения параметров цикла. В части модификация можно записать несколько операторов через запятую. Оператор (простой или составной) представляет собой тело цикла. Любая из частей оператора for (инициализация, выражение, моди- фикация, оператор) может отсутствовать, но точку с запятой, опреде- ляющую позицию пропускаемой части, надо оставить. Пример формирования строки, состоящей из чисел от 0 до 9, разде- ленных пробелами: string s = "" ; // Инициализация строки for ( int i = 0; i <= 9; i++) // Перечисление всех чисел s += i.ToString() + " " ; // Добавляем число и пробел MessageBox .Show(s.ToString()); // Показываем результат Данный пример работает следующим образом. Сначала вычисляет- ся начальное значение переменной i . Затем, пока значение i меньше или равно 9, выполняется тело цикла, и затем повторно вычисляется значение i . Когда значение i становится больше 9, условие – ложно и управление передается за пределы цикла. 4.5. Средства отладки программ Практически в каждой вновь написанной программе после запуска обнаруживаются ошибки. Ошибки первого уровня (ошибки компиляции) связаны с непра- вильной записью операторов (орфографические, синтаксические). При обнаружении ошибок компилятор формирует список, который отобра- жается по завершению компиляции (рис. 4.1). При этом возможен толь- ко запуск программы, которая была успешно скомпилирована для пре- дыдущей версии программы. Рис. 4.1. Окно со списком ошибок компиляции 42 При выявлении ошибок компиляции в нижней части экрана появляет- ся текстовое окно (см. рис. 4.1), содержащее сведения обо всех ошибках, найденных в проекте. Каждая строка этого окна содержит имя файла, в ко- тором найдена ошибка, номер строки с ошибкой и характер ошибки. Для быстрого перехода к интересующей ошибке необходимо дважды щелкнуть на строке с ее описанием. Следует обратить внимание на то, что одна ошибка может повлечь за собой другие, которые исчезнут при ее исправле- нии. Поэтому необходимо исправлять их последовательно, сверху вниз и, после исправления каждой – компилировать программу снова. Ошибки второго уровня (ошибки выполнения) связаны с ошибками выбранного алгоритма решения или с неправильной программной реа- лизацией алгоритма. Эти ошибки проявляются в том, что результат рас- чета оказывается неверным либо происходит переполнение, деление на ноль и др. Поэтому перед использованием отлаженной программы ее надо протестировать, т. е. сделать просчеты при таких комбинациях ис- ходных данных, для которых заранее известен результат. Если тестовые расчеты указывают на ошибку, то для ее поиска следует использовать встроенные средства отладки среды программирования. В простейшем случае для локализации места ошибки рекомендуется поступать следующим образом. В окне редактирования текста устано- вить точку останова перед подозрительным участком, которая позволит остановить выполнение программы и далее более детально следить за ходом работы операторов и изменением значений переменных. Для этого достаточно в окне редактирования кода щелкнуть слева от нужной стро- ки. В результате чего данная строка будет выделена красным (рис. 4.2). Рис. 4.2. Фрагмент кода с точкой останова При выполнении программы и достижения установленной точки программа будет остановлена, и далее можно выполнять код по шагам с помощью команд Отладка → Шаг с обходом (без захода в методы) или Отладка → Шаг с заходом (с заходом в методы) (рис. 4.3). 43 Рис. 4.3. Отладка программы Желтым цветом выделяется оператор, который будет выполнен. Значение переменных во время выполнения можно увидеть, наведя на них курсор. Для прекращения отладки и остановки программы нужно выполнить команду меню Отладка → Остановить отладку. Для поиска алгоритмических ошибок можно контролировать значе- ния промежуточных переменных на каждом шаге выполнения подозри- тельного кода и сравнивать их с результатами, полученными вручную. 4.6. Порядок выполнения задания З а д а н и е : Вычислить и вывести на экран таблицу значений функ- ции y = a·ln(x) при x, изменяющемся от x 0 до x k с шагом dx, a – константа. Панель диалога представлена на рис. 4.4. Текст обработчика нажа- тия кнопки Вычислить приведен ниже. private void button1_Click( object sender, EventArgs e) { // Считывание начальных данных double x0 = Convert .ToDouble(textBox1.Text); double xk = Convert .ToDouble(textBox2.Text); double dx = Convert .ToDouble(textBox3.Text); double a = Convert .ToDouble(textBox4.Text); textBox5.Text = "Работу выполнил ст. Иванов М.А." + Environment .NewLine; // Цикл для табулирования функции double x = x0; while (x <= (xk + dx / 2)) { double y = a * Math .Log(x); textBox5.Text += "x=" + Convert .ToString(x) + "; y=" + Convert .ToString(y) + Environment .NewLine; x = x + dx; } } 44 После отладки программы следует проверить правильность работы программы с помощью контрольного примера (см. рис. 4.4). Установите точку останова на оператор перед циклом и запустите программу. После попадания на точку остановки, выполните пошагово программу и про- следите, как меняются все переменные в процессе выполнения. Рис. 4.4. Окно программы для табулирования функции Индивидуальные задания Составьте программу табулирования функции y(x), выведите на экран значения x и y(x). Нужный вариант задания выберите из нижеприведенного списка по указанию преподавателя. Откоррек- тируйте элементы управления в форме в соответствии со своим ва- риантом задания. -2 3 0 1) y 10 / cos , 1.5; 3.5; 0.5; 1.25; 1.5; 0.75; k bc x a x x x dx a b c 2 3 0 2) y 1.2(a-b) , 0.75; 1.5; 0.05; 1.5; 1.2; x k e x x x dx a b 45 ; 25 1 b ; 2 10 a ; 05 0 dx ; 5 2 x ; 5 0 x ), bx a ( tg ax 10 y 3) k 0 3 -1 ; 25 6 b ; 35 1 a ; 25 0 dx ; 3 10 x ; 3 5 x ), b x ( cos ax y 4) k 0 3 2 3 ; 3 1 d ; 2 0 dx ; 8 5 x ; 6 4 x ), d x 2 cos( x y 5) k 0 3 4 ; 8 0 b ; 5 0 dx ; 5 2 x ; 5 1 x ), x / b x 5 ( tg x y 6) k 0 2 ; 5 2 b ; 2 0 dx ; 1 x ; 4 2 x ), b x 15 9(x y 7) k 0 3 3 4 0 8) y 9x sin(57.2 ), 0.75; 2.05; 0.2; k x x x dx ; 3 2 b ; 5 0 dx ; 4 x ; 1 x , e x 0.0025bx y 9) k 0 82 0 3 ; 4 3 b ; 2 0 dx ; 05 3 x ; 05 2 x ), 0.0084 - b x sin( x y 10) k 0 ; 1 0 a ; 2 0 dx ; 2 6 x ; 4 x , be a x x y 11) k 0 x 3 ; 2 3 b ; 2 0 dx ; 2 2 x ; 1 x , tgx ) b 9(x y 12) k 0 3 3 ; 2 b ; 1 0 dx ; 73 1 x ; 73 0 x , b x ln x b / b x y 13) k 0 2 / 3 3 3 2 / 1 ; 8 0 b ; 3 0 dx ; 2 5 x ; 25 0 x ), 7 12 x ln( ) b (x y 14) k 0 2 5/2 ; 4 35 b ; 25 0 dx ; 5 2 x ; 75 1 x , b x ln x 10 y 15) k 0 2 / 5 3 ; 6 12 b ; 3 0 dx ; 4 2 x ; 23 1 x ), b x cos(ln x 15.28 y 16) k 0 2 / 3 ; 2 74 b ; 05 0 dx ; 2 x ; 35 2 x ), 82 3 x /( ) b x (ln 00084 0 y 17) k 0 2 4 / 5 ; 74 6 b ; 01 0 dx ; 15 0 x ; 05 0 x , ) b x ( 10 0.8 y 18) k 0 6 / 7 3 3 -5 3 3/2 3 0 19) y (ln(sin( 0.0025))) 0.8 10 , 0.12; 0.64; 0.2; k x x x dx 2/3 0 20) y a x cos( ), 5.62; 15.62; 0.5; 0.41 x k x e x x dx a |