
Laboratornyy_praktikum_Programmirovanie_na_C
.pdf
Для упрощения программы из неѐ исключена конструкция ожидания нажатия клавиши, используйте вариант запуска без отладки (Ctrl+F5), который сам добавляет ожидание нажатия клавиши в конце консольной программы. В программе P05_2 сначала инициализируется счѐтчик цикла i (присваивается стартовое значение), затем с метки Start начинается тело цикла с предусловием, в котором производится проверка условия. Затем, в случае истинности условия, выводится значение счѐтчика цикла на консоль оператором WriteLine, затем производится увеличение значение переменной i на единицу оператором ++ и переход к началу цикла. Ниже приведѐн пример программы P05_3, в которой реализован цикл с постусловием (соответствует Рис. 5.1г). В программе сначала инициализируется счѐтчик цикла i, затем производится вывод значения счѐтчика цикла на консоль с последующим увеличением значения на единицу (т.к. используется постфиксный оператор i++). Совместное использование оператора безусловного перехода с условным оператором называют оператором условного перехода.
using System; class P05_3
{
static void Main()
{
int i = 0; //Инициализация счётчика цикла Start: //начало тела цикла
//вывод значения с последующим приращением счётчика цикла
Console.WriteLine(i++); if (i<=9) goto Start;
}
}
Программы P05_2 и P05_3 приводят к аналогичным результатам, но циклы с предусловием и постусловием имеют свою специфику. Тело цикла с предусловием может быть ни разу не выполнено, т.к. на входе цикла может оказаться условие с ложным результатом. Тело цикла с постусловием выполняется хотя бы один раз, и в конце производится проверка, нужно ли его повторить.
5.2. ОПЕРАТОР ЦИКЛА FOR
При написании программ часто используется оператор цикла for, который имеет следующий синтаксис:
for (инициализация; условие; итерация) оператор;
В данном случае оператор является телом цикла. При необходимости выполнения нескольких операторов в теле цикла, вместо оператора записывается блок операторов, заключѐнных в фигурные скобки. Оператор for является оператором цикла с предусловием. Оператор цикла for применяется в случаях, когда заранее известны количество итераций (границы значений и шаг изменения счѐтчика цикла). Ниже приведѐн пример программы P05_4, аналогичной P05_2.
using System;
61
class P05_4
{
static void Main()
{
for (int i = 0; i <= 9; i++) Console.WriteLine(i);
}
}
Как видно из синтаксиса, такой метод записи гораздо проще и понятнее. После ключевого слова for идѐт перечень параметров, первый из которых задаѐт начальное значение счѐтчику цикла (i = 0), второй задаѐт условие выполнение цикла (i <= 9), т.е. цикл выполняется, пока это значение этого условия истинно. Последний параметр (i++) – выражение изменения счѐтчика цикла, в данном случае – увеличение на единицу. Параметры цикла for разделяются точкой с запятой.
Описать словами цикл программы P05_4 можно так: выводить на консоль значение счѐтчика цикла, который начинается с нуля и в каждой итерации увеличивается на единицу, пока меньше или равен девяти. Когда условие принимает ложное значение, цикл заканчивается и управление передаѐтся операторам, следующим за ним.
Счѐтчик цикла может как увеличиваться, так и уменьшаться. Тогда в условии указывается значение меньшее, чем при инициализации, и итерация выполняется в сторону уменьшения: for(i = 9; i >= 0; i--) {}.
В операторе for разрешается использовать несколько счѐтчиков цикла, разделяемых запятыми:
using System; class P05_5
{
static void Main()
{
for (int i = 0, j = 9; i <= j; i++, j--) Console.WriteLine("i="+i+" j="+j);
}
}
Необходимо отметить, что в условии цикла не обязательно должны участвовать счѐтчики цикла. Также необязательны все параметры инициализации цикла. Так, программу P05_4 можно записать:
using System; class P05_4
{
static void Main()
{
int i = 0;
for (; i <= 9; )
{
Console.WriteLine(i);
62
i++;
}
}
}
В приведѐнной версии записи программы инициализация счѐтчика произведена до начала цикла, а итерация перенесена в тело цикла. Если в параметрах цикла не указывать никаких выражений, а только две точки с запятой, получится бесконечный цикл. Бесконечный цикл может получиться также в результате ошибки использования переменных счѐтчика или условия выполнения цикла. Цикл может не содержать тела, тогда все вычисления производятся в параметрах цикла:
using System; class P05_6
{
static void Main()
{
int f = 1, n = 7;
for (int i = 2; i <= n; f *= i, i++) ; Console.WriteLine("Факториал "+n+"= "+f);
}
}
В программе P05_6 производится вычисление факториала f рядом с итерацией счѐтчика цикла, тело цикла пусто и заканчивается точкой с запятой, а затем после окончания цикла значение f выводится на консоль. Счѐтчик цикла, объявленный внутри оператора for, имеет область действия только внутри этого оператора.
Для п р бор с х эл м нто списков или коллекций можно использовать оператор foreach-in (повторить для каждого элемента набора), который будет описан в разделе изучения соответствующих структур.
5.3. ОПЕРАТОРЫ ЦИКЛА WHILE И DO-WHILE
Операторы цикла взаимозаменяемы, но операторы while удобно использовать в тех случаях, когда р н н стно кол ч ст о т р ц й, но стно усло
по тор н я. Например, оператор while удобно использовать для вычислений до заданной точности.
Рассмотрите ниже примеры программ P05_7 и P05_8, работающие аналогично
P05_2 (P05_4) и P05_3.
using System; class P05_7
{
static void Main()
{
int i = 0;
while (i <= 9) //Цикл с предусловием
63

Console.WriteLine(i++);
}
}
В программе P05_7 инициализируется счѐтчик цикла (к слову сказать, что аналогично работала бы запись int i;, т.к. по умолчанию при описании численные типы инициализируются в ноль). Затем проверятся, выполняется ли условие, разрешающее выполнить тело цикла. В теле цикла выводится результат, и счѐтчик увеличивает своѐ значение на единицу.
using System; class P05_8
{
static void Main()
{
int i = 0;
do // Цикл с постусловием
{
Console.WriteLine(i); } while (++i <= 9);
}
}
Между операторами do и while находится тело цикла, которое принято помещать в фигурные скобки даже в том случае, когда в теле цикла находится всего один оператор, для исключения путаницы с оператором цикла с предусловием while. В программе P05_8 после инициализации счѐтчика цикла выполняется тело цикла, в котором производится вывод результата, а затем уже производится приращение значения счѐтчика на единицу и проверка, нужно ли повторить цикл ещѐ раз.
5.4.ОПЕРАТОРЫ BREAK И CONTINUE
Вслучае необходимости цикл можно прервать оператором break, помещѐнным в тело цикла (обычно внутри условного оператора). В теле цикла также можно использовать оператор continue (англ. продолжить), который переходит к следующей итерации в начало тела цикла и пропускает операторы тела цикла, следующие за ним.
using System; class P05_9
{
static void Main()
{
double y, x = 0.0; const double h = 0.5; int i = 0;
for (;;)
{
if (++i > 20)
64
{
Console.WriteLine("Выход из цикла"); break;
}
y = Math.Sin(x); x += h;
if (y >= 0.0)
{
Console.WriteLine(y); continue;
}
Console.WriteLine("Пропущено отрицательное число");
}
}
}
В программе P05_9 продемонстрировано использование операторов break и continue для управления работой циклом. В начале программы описаны вещественные переменные x и y. Переменная x явно инициализирована в 0.0, т.к. еѐ значение используется в качестве операнда в выражении (присвоение нуля происходит автоматически, но в учебных целях желательно записывать значения явно для лучшего понимания). Переменная y не инициализирована явно потому, что ниже в неѐ записывается результат вычисления. Константой h задан шаг. Целая переменная i используется в качестве счѐтчика количества максимальных итераций (например, условие выхода из цикла, если решение не сходится). Ниже задан чный ц кл, т.к. у оператора for нет параметров. В цикле производится проверка условия достижения счѐтчиком итераций конечного значения 20 оператором if, и если условие выполняется, то после вывода сообщения происходит выход из цикла оператором break. Ниже вычисляется значение y и значение x увеличивается на величину шага. Далее, при истинности проверки y на положительное значение еѐ значение выводится на экран и оператор continue переводит цикл к выполнению следующей итерации, игнорируя нижестоящие операторы. Если условие ложно, что выполняются операторы, следующие за ним (выводится сообщение, что число отрицательно). Эта программа для демонстрации операторов break и continue может быть записана более компактно:
using System; class P05_9
{
static void Main()
{
const double h = 0.5; double x, y; int i;
for (i = 0, x = 0.0; i < 20; i++, x += h)
{
Console.WriteLine((y = Math.Sin(x))>= 0.0 ?
65
Convert.ToString(y):"Пропущено отрицательное число");
}
Console.WriteLine("Выход из цикла");
}
}
5.5. ПРОГРАММИРОВАНИЕ
5.5.1. Задача. Сумма последовательности
Написать программу P05_10: С клавиатуры ввести целое положительное число n. На консоль вывести сумму всех целых чисел от 0 до n.
5.5.2. Задача. Произведение последовательности
Написать программу P05_11: С клавиатуры ввести два целых положительных числа n1 и n2. На консоль вывести произведение всех целых чисел от n1 до n2 включительно.
5.5.3. Задача. Сумма последовательности
Написать программу P05_12: С клавиатуры ввести вещественное положительное число x с точностью до 0,1. На консоль вывести сумму всех чисел от 0 до x с шагом 0,1. Задачу решить двумя способами – с использованием операторов for и while.
5.5.4. Задача. Сумма последовательности
Написать программу P05_13: С клавиатуры ввести целое положительное число n. Из числа n получить число m – логической операцией установить флаг нечѐтности (если число нечѐтное, оно не меняется, если число чѐтное, то оно увеличивается на единицу). На консоль вывести сумму всех нечѐтных чисел диапазона от m до m×2.
5.5.5. Задача. Максимальный делитель
Написать программу P05_14: С клавиатуры ввести целое положительное число n (в диапазоне 100..300). Найти и вывести на экран наибольший целый делитель, который меньше числа n.
5.5.6. Задача. Шахматная доска
Написать программу P05_15: С клавиатуры ввести целое число n (в диапазоне 3..15). На консоль вывести квадратную матрицу с количеством строк и столбцов n, заполненную нулями и единицами в шахматном порядке.
Подсказка: на листе в клетку нарисуйте матицу 5×5, заполненную нулями и единицами в шахматном порядке. Пронумеруйте строки и столбцы. Найдите закономерность. Используйте проверку на нечѐтность.
Покажите результаты работы преподавателю, закройте Visual Studio, а затем
уд л т с со д нны м о р мя р боты ф йлы п пк в папке
D:\Program\VS.
66
Вопросы к под ото к :
1.Что такое циклы, для чего они нужны?
2.Как циклы обозначаются на блок-схемах?
3.Какие типы циклов бывают?
4.Какими операторами, и в каких случаях организуют циклы?
5.Что такое счѐтчик цикла?
6.Как перейти к следующей итерации, пропустив оставшиеся операторы тела цикла?
7.Как прервать цикл?
67
ЛАБОРАТОРНАЯ РАБОТА 6. ПОДПРОГРАММЫ (МЕТОДЫ)
Цель работы: Разобраться в назначении, правилах записи и вызова подпрограмм (методов). Программы лабораторной работы записать (вклеить распечатку) с пояснениями в лабораторный журнал.
6.1. МЕТОДЫ
Упрощение программ с многократным использованием кода привело к использованию подпрограмм. Подпрограмма (англ. subroutine) – поименованная или иным образом идентифицированная часть компьютерной программы, содержащая описание определѐнного набора действий. Подпрограмма может быть многократно вызвана из разных частей программы. В различных языках программирования подпрограммы могут разделяться на процедуры и функции. Процедура выполняет действие, но не возвращает значение, функция также возвращает значение. В C# все подпрограммы являются функциями, но использование типа void (англ. – пусто) позволяет не возвращать никаких значений. Т.к. функции принадлежат классам, эти функции называются методами. Форма определения метода:
доступ возвращаемый_тип имя(список_параметров)
{
// Тело метода
}
где доступ – необязательный модификатор доступа. Отсутствие подразумевает private, определяет закрытый метод, доступный только внутри класса. Открытый модификатор public позволяет вызывать метод из любой другой части программы. Программы текущей работы выполняются внутри одного класса, поэтому этот модификатор будет пропущен. Использование модификатора public будет продемонстрировано в следующих работах.
Возвращаемый_тип обозначает тип данных, возвращаемых методом, как было указано выше, тип void позволяет не возвращать данных.
Список_параметров – последовательность пар, состоящих из типа и идентификатора и разделѐнных запятыми. При отсутствии параметров список остаѐтся пустым. Параметры, задаваемые в описании метода, также называются формальными параметрами (или просто параметрами). Параметры, используемые при вызове метода, называются фактическими параметрами или аргументами.
При вызове подпрограммы сохраняется адрес оператора, следующего за еѐ вызовом, и управление передаѐтся операторам подпрограммы. Значения формальных параметров, как поля бланка, заполняются значениями аргументов. После завершения выполнения подпрограммы управление переходит к оператору, адрес которого был сохранѐн перед вызовом. Если тип метода отличен от void и метод вызывается внутри выражения, то в место вызова метода подставляется возвращаемое значение. Если метод вызывается не в выражении, то возвращаемое значение игнорируется.
Константы и переменные, заданные вне методов в классе доступны во всех методах класса (и из экземпляров других классов, если описаны с модификатором public) и являются для методов класса глобальными. Переменные (и параметры)
68

внутри методов являются локальными и теряются при выходе из метода. Более того, переменные могут быть локальными внутри программного блока {} в теле метода.
Рассмотрите программу P06_1, в которой вычисляется средняя скорость (м/с) истечения жидкости заданного объема (1; 1,5; 0,8 м3) через патрубок заданного радиуса (24 мм) из аппарата за указанное время (720; 800; 650 с):
using System; class P06_1
{
static void Main()
{
double v, Radius = 24e-3; //м
v = 1 / (Math.PI * Math.Pow(Radius, 2D)) / 720; Console.WriteLine(v);
v = 1.5 / (Math.PI * Math.Pow(Radius, 2D)) / 800; Console.WriteLine(v);
v = 0.8 / (Math.PI * Math.Pow(Radius, 2D)) / 650; Console.WriteLine(v);
}
}
Т.к. у выбранного аппарата радиус патрубка не меняется, радиус задаѐтся в виде значения переменной Radius. Скорость v можно вычислить по формуле v = V / S / t, где V – объѐм (м3), S – площадь сечения (м2), t – время (с). Площадь сечения патрубка (приваренного к баку отрезка трубы круглого сечения) можно записать как S = π · R2, что даѐт вид формулы скорости v = V / (π · R2) / t. В программе не учитывается изменение скорости в зависимости от уровня и давления, т.к. вычисляется средняя скорость. Как видно из программы, при проведении нескольких вычислений загромождают программу. Кроме того, использование числовых констант скрывает назначение операндов, что снижает уровень восприятия программы. Для упрощения записи удобно использовать методы (подпрограммы-функции). Выделите формулу как отдельный метод Velocity(), которому в качестве аргументов передаются значения объѐма (формальный параметр Volume) и времени (формальный параметр Time). При вызове метода в аргументы (фактические параметры) записываются конкретные значения, которые присваиваются формальным параметрам метода во время вычисления.
using System; class P06_1
{
static double Radius;
static double Velocity(double Volume, double Time)
{
return Volume / (Math.PI * Math.Pow(Radius,2D)) / Time;
}
static void Main()
69

{
Radius = 24e-3; //м
Console.WriteLine("" + Velocity(1,720) + "\n" +
Velocity(1.5,800) + "\n" + Velocity(0.8,650));
}
}
Для того, чтобы метод Velocity() имел доступ к вещественной переменной Radius, эта переменная записывается перед методом в классе, при этом она воспринимается как глобальная, т.е. общая и доступная по отношению ко всем методам класса. Оператор return не только завершает работу метода, но и возвращает результат идущего за ним выражения, который подставляется в место вызова и его тип должен соответствовать возвращаемому_типу метода. При использовании операторов return необходимо следить, чтобы не оставалось кода, не выполняемого в методе ни при каких обстоятельствах. Подобный неисполняемый код называется недоступным и его наличие является ошибкой, о чѐм выдаѐтся предупреждение компилятором. В методах типа void указание выражения после оператора return не требуется. Для вызова public метода из других классов, перед именем метода указывается имя класса с точкой.
6.1.1. Задача. Использование вычислений для любых значений
Измените программу P06_1 для ввода значения объѐма V и времени t с
клавиатуры в методе Main() вместо использования констант и в операторе вывода используйте всего один вызов метода Velocity().
6.1.2. Задача. Технологические вычисления
При расчѐте технологического оборудования необходимо использовать значения удельной теплоѐмкости для воздуха при определѐнных температурах. По справочным данным были получены коэффициенты полинома четвѐртой степени
(нумеруются с нуля, слева направо), описывающего эту зависимость:
(1,005; –1,829·10–5; 7,882·10–7; –1,044·10–9; 4,779·10–13).
Напишите программу P06_2, в которой производится вычисление теплоѐмкости воздуха для введѐнной в Main() с клавиатуры температуры в диапазоне 0..800 (при вводе в цикле с постусловием проверять принадлежность значения заданному диапазону, иначе повторить ввод). Вычисление теплоѐмкости оформите в виде метода HeatCapacity(), параметром которого является значение температуры. Полученные результаты вывести на консоль.
Перед написанием программы в лабораторный журнал запишите общий вид полинома четвѐртой степени, затем вид полинома с заданными коэффициентами (в программе используйте экспоненциальную форму записи вещественных значений).
6.2. ПРИМЕР ЭЛЕМЕНТОВ ИНТЕРАКТИВНОЙ ИГРЫ
Ниже представлена программа Snake, которая может являться основой для написания игры Змейка. Программа демонстрирует применение на практике элементов ранее изученных тем – различных типов данных, условных операторов, операторов выбора и циклов. Для создания более понятного кода блоки операторов,
70