Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Объектно-ориентированное программирование. Учебник для СПО
.pdf
Аналогичным образом операция | используется, если необходимо
вычислить оба операнда, участвующих в операции ИЛИ, а операция || —
если после получения результата операции вычисление значения второго операнда может быть прекращено (если первый операнд равен true,
то и результат равен true).
Выражение a && b с условным И равно b, только если a = true.
Выражение a || b с условным ИЛИ равно b, только если a = false. Вы-
ражение a ?? b равно b, только если a = null, иначе оно равно a.
Побитовые операции И, ИЛИ также используют операторы &, |, но при-
менимы к целым числам. Например, 66&19 = 2, а 66|19 = 81.
В двоичной системе счисления 6610 = 10000102 а 1910 = 00100112. Поэтому двоичный результат побитовой операции И равен 10, т.е. равен 2 в десятичной системе счисления. Двоичный результат побитовой операции
ИЛИ равен 1010001
= 26 + 24 + 20 = 8110. Здесь индекс обозначает основание
2
системы счисления.
Унарные операторы логического отрицания обозначаются символом!. При выполнении логического отрицания логическое значение изменяется на противоположное. Например, в результате выполнения фрагмента bool x = true; bool b = !x; переменная b примет значение false.
В отличие от операции логического отрицания ! операции побитового отрицания ~ применяются только к выражениям типа int, uint,
long, ulong, а их результатом является операнд, в котором каждый бит
заменен его дополнением.
Операторами отношения (проверки эквивалентности) являются операторы: == — равно (двойной знак равенства используется для
того, чтобы отличить операцию отношения от операции присваивания), != — не равно, < — меньше, <= — меньше или равно, > — больше,
>= — больше или равно. Операторы отношения используются для сравне-
ния значений между собой. Их результатом является значение true или
же false. Приоритет у операций отношения выше, чем у операций И, ИЛИ.
Отметим составные логические операторы. К ним относятся:
&= — для логического И и присваивания;
|= — для логического ИЛИ и присваивания;
^= — для логического исключающего ИЛИ и присваивания.
Необходимо различать сравнение на равенство значений и на равенство ссылок. Для проверки на равенство значений можно использовать
оператор ==, например:
if( x == y)
{
…}
-131-

Если классы и структуры имеют несколько полей или свойств, то равенство значений обычно определяется как равенство значений всех полей и свойств в объектах.
При проверке равенства значений с плавающей запятой (float или
double) результат может быть неверным из-за неточности арифметиче-
ских операций с плавающей запятой. В этом случае обоснована проверка
на вхождение результата в интервал.
Равенство ссылок означает, что две объектные ссылки ссылаются
на один и тот же объект. Для проверки того, относятся ли две ссылки к одному и тому же объекту, используется метод ReferenceEquals.
Вопросыизадания
?
1. Каким логическим операциям соответствуют операторы !, &&, ||?
2. В чем состоит отличие операции & от операции &&, а также опера-
ции | от операции ||?
3. Указать, чему равны выражения: а) t && u; б) alpha||beta; в)g??f.
4. Как производятся побитовые операции логического сложения и ум-
ножения?
5. Какие логические операции обладают наибольшим и наименьшим
приоритетом?
6. Какие операции выполняют логические операторы отношения?
7. С помощью какого оператора производится проверка на равенст-
во двух значений?
8. Какая проблема может возникнуть при проверке равенства чисел
с плавающей запятой?
Упражнения
1. Указать результат вычисления:
а) 75&18;
б) 15&32;
в) 75|18;
г) 15|32.
2. Указать результат вычисления bool x = false; bool s = !x;
5.4.ФУНКЦИИИПРОЦЕДУРЫ
Методы — это члены класса, определяющие его поведение. Они
представляют собой подпрограммы-процедуры и подпрограммы-функ-
-132-

ции в обычном понимании, которые выполняются над объектами класса. Методы задают внутреннюю логику поведения объектов класса, и вне
класса они не существуют.
Простой пример выражения для вызова метода:
MyMethod(); {…} .
Тело метода — это программный блок, поэтому он заключен в фигурные скобки. В скобках после имени метода указываются параметры метода (если они есть). Круглые скобки при указании метода нужны обязательно, даже если они пустые.
Создание процедур и функций — это способ структурирования
программ, возникший в процедурных языках и ставший обычной технологией программирования. Такая технология позволяет упрощать программы, повторно использовать созданные подпрограммы, а также создавать библиотеки программ.
Подпрограмма-функция вызывается в выражениях и вычисляет
некоторое значение определенного типа, которое возвращается в качестве результата. Обычно метод реализуют в виде функции, когда он имеет
только один результат вычисления. Если функция возвращает значение
после ее вызова, то в ее теле должен быть хотя бы один оператор перехода return.
Подпрограмма-процедура возвращает формальный результат void,
указывающий на то, что метод не возвращает никакого значения, не передает результаты в другие места программы. Процедуру нельзя вызвать
в выражении, а можно вызвать только как оператор. После своего выполнения она возвращается к месту вызова.
Таким образом, подпрограмма со словом void указывает на процедуру, а отсутствие void указывает на функцию.
Описание подпрограмм (функций или процедур) состоит из двух частей: заголовка (идентификатор подпрограммы) и тела метода (последовательность инструкций). Описание методов имеет следующую синтаксическую структуру:
[Модификаторы] void или ТипРезультатаФункции ИмяМетода
([ФормальныеПараметры]) {ТелоМетода}
Любая подпрограмма может использоваться лишь в пределах указанной области действия. Все внешние описания по отношению к подпрограмме носят глобальный характер. Объявления внутри подпро-
-133-

граммы локализованы. Модификаторы public, private, protected или
in ternal определяют область видимости подпрограммы, доступности
для вызова и возможности использования методов. К методам можно
обращаться из других мест программы и обеспечивать повторяемость
использования.
Модификатор static для методов, как и для полей, указывает, что
метод принадлежит всему классу, а не его экземпляру.
Если метод должен вернуть значение определенного типа, то перед
его именем должно располагаться ключевое слово с указанием этого типа
данных (например, int, bool и т.д.).
После имени метода ставятся круглые скобки, в которых указывают
параметры метода. Список формальных аргументов, если в нем больше
одного аргумента, разделяют запятой. Список формальных аргументов
может быть пустым.
Формальные параметры — это идентификаторы данных для подпрограммы. Формальные параметры получают конкретные значения, которые называются фактическими параметрами. Формальные параметры могут получить значения только в той программе, где производится
обращение к модулю-подпрограмме. Тип и порядок записи фактических
параметров должны быть такими же, как и для формальных параметров.
Фактические параметры используются при обращении к подпрограмме
из основной программы, а формальные параметры — только в самой подпрограмме.
В языке C# запрещено иметь локальные переменные, имена которых
совпадают с именами формальных аргументов.
Примеры объявления методов-функций:
int A() {…}; // закрытая целочисленная функция
public double Omega(int x, bool f) {
ная функция
gamma = Math.Pow(x,3); // библиотечная функция
…} // открытая веществен-
Под сигнатурой метода понимают имя метода и список формальных аргументов. Сигнатура любого метода-функции задает тип для каждого входного параметра и для возвращаемого значения. Например, метод public string MyMethod(int x) использует входной параметр типа
int, а результат типа string.
Теперь рассмотрим, как метод можно вызвать. Вызов метода производится из самого класса, где он описан, или из другого класса (если
-134-

это разрешено модификатором доступа). Вызов имеет следующую синтаксическую конструкцию:
ИмяОбъекта.ИмяМетода([СписокАргументов])
Для вызова статических методов используется синтаксическая конструкция вида:
ИмяТипа.ИмяМетода([СписокАргументов])
Часто для доступа методов к данным применяется ключевое слово
this. Оно используется для того, чтобы избежать возможных совпадений
имен данных.
При вызове метода тип, количество, порядок следования и статус
(входной, выходной, ссылочный) фактических и формальных параметров
должны полностью совпадать. Выполнение метода начинается с вычисления фактических аргументов, заданных выражениями. В теле метода
происходит замена формальных аргументов фактическими аргументами.
Пусть необходимо, чтобы на экран выводилось сообщение "Кис-
лотный
раствор", а затем следовала формула одной из требуемых кислот. Описание метода для вывода на консоль требуемого сообщения
имеет вид:
public void WriteAcid(string acid)
{
Console.WriteLine("Кислотный раствор" + acid);
}
Вызов самого метода производится следующим образом: Write-
Acid("H2S04");
acid — это входной параметр метода, он принимает требуемые значения
WriteAcid("HCl"); и т.д. Переменная строкового типа
(формулы кислот). Возвращать результат по этому методу не предусмотрено, так как присутствует ключевое слово void.
Аналогичным образом описан следующий метод:
void SayMe(string someDay)
{
Console.WriteLine("Добрый день! Сегодня " +someDay+ ". ")
}
SayMe(" четверг ") // Вызов метода
-135-

Параметром метода SayMe является строковая переменная someDay.
После вызова метода в него передается параметр со значением "чет-
. В результате выполнения метода будет выведено сообщение "До-
верг"
день! Сегодня четверг".
брый
Если же метод-функция должен возвращать целое число, а его входными параметрами являются строковое значение и целое число, то он может определяться следующим образом:
int MyMethod(string x, int m)
{
…
return
…}
Описание метода включает его имя и тип, имена двух аргументов
и их тип.
Отсутствие слова void означает, что метод возвращает результирующее значение в точку, где он был вызван. Результат работы возвращается с помощью оператора return. Вызов этого метода может быть произведен, например, так:
int k = MyMethod(" sigma ", 15) .
Рассмотрим еще один пример, в котором метод вычисления площади треугольника по формуле Герона оформлен в виде следующей программы:
using System;
class Triangular // Класс треугольников
{
public static double Square(double a,b,c) //Метод
{
double p =(a+b+c)/2; // Полупериметр
return Math.Sqrt (p*(p-a)*(p-b)*(p-c)); // Корень квадратный
}
public static void Main()
{
double s = Square(5.5, 7.7, 9.9); //Обращение к методу
Square (
Console.WriteLine(" Площадь = {0, 0:f3}.", s)
}
}
…)
-136-

Вначале в статическом методе-функции Square(…) записаны формулы вычисления площади треугольника в зависимости от входных формальных параметров (длин сторон a, b, c). Обращение к методу производится в самом классе Triangular, где он описан. Когда компилятор
встречает имя метода, он обращается к его описанию, подставляя вместо
формальных параметров фактические параметры a = 5.5, b = 7.7, c = 9.9.
Слово return возвращает вычисленный результат типа double (только
один). Здесь используется библиотечная функция вычисления квадратного корня Math.Sqrt(…).
На консоль будет выведено сообщение: "Площадь = 21,069". Обращение к методу Square (…) может быть произведено в самом консольном методе:
public static void Main()
{
Console.WriteLine(" Площадь = {0, 0:f3} ", Square(5.5, 7.7,
9.9) + ".")
}
В приведенном примере фактические параметры устанавливаются
непосредственно в виде чисел. При вызове метода можно использовать
переменные, но их значения должны быть известны до вызова (инициализированы, введены с клавиатуры или вычислены).
Если параметр a должен быть введен с клавиатуры, а остальные параметры устанавливаются в программе, то перед оператором вызова метода программа дополняется операторами:
Console.WriteLine(" Ввести длину стороны a треугольника ");
double a = Convert.ToDouble(Console.ReadLine()); // Ввод вещест-
венного числа a
В этом случае фактические параметры метода указываются так:
Square(a, 7.7, 9.9).
Важно, что переменные, присутствующие в полях класса, где описан
метод, не нужно объявлять как аргументы методов, так как они доступны
методам по определению. Методу не нужно использовать входные (выходные) аргументы для передачи информации, содержащейся в полях.
Поэтому число аргументов у методов ООП обычно меньше, чем у подпро-
-137-

грамм на языках программирования, не являющихся объектно-ориентированными. По этой же причине многие методы могут вообще не иметь
аргументов, так как вся информация передается через поля класса.
В качестве примера приведем класс с описанием двух методов без
передачи аргументов, использующих поля класса.
public class SimpleSample
{
public static int a;
public int b;
public static void X()
{ a *= 5; }
public void Y()
{ b = -a; }
}
Теперь на примере вычисления площади треугольника рассмотрим
случай, когда вызов метода производится из другого класса.
using System;
class Triangular //класс треугольник
{
public void Square(double a,b,c) //метод Square
{
double p =(a+b+c)/2; // Полупериметр
double s = Math.Sqrt (p*(p-a)*(p-b)*(p-c)); // Корень
квадратный
Console.WriteLine("Площадь = {0, 0:f3}", s + ".");
}
}
class Applic // Применение
{
double a = 5.5;
static void Main()
{
double b=7.7;
Triangular Representative = new Triangular (); //созда-
ние экземпляра класса
Representative.Square(a, b, 9.9); //обращение к методу
}
}
-138-

В классе, вызывающем метод расчета, вначале создан экземпляр
класса Triangular с именем Representative, используя слово new. Затем к этому экземпляру применен метод вычисления Square. Такой вызов метода называется экземплярным.
Для вызова экземплярного метода в программе нужно указать имя
переменной, содержащей ссылку на объект, а затем через точку — имя вызываемого метода с круглыми скобками за ним (в скобках указываются
параметры метода, если они есть). Один и тот же метод можно применить
к разным объектам.
Примеры вызова методов:
myObject1.myMethod();
val1. myMethod();
myObject1.Hermes(5);
myObject1.Hermes(10);
Если метод возвращает результат, то он может быть присвоен переменной, например:
int n = myObject1.myMethod();
byte v = myObject1.Hermes(10);
В общем виде вызов метода F в объектных вычислениях имеет следующий синтаксис:
x.F(arg1, arg2, …, argN);
В скобках указаны фактические параметры метода. Здесь x — это
цель вызова. Целью вызова может быть:
- имя класса, и тогда F должен быть статическим методом класса,
объявленным с атрибутом static. Статические методы не используют
информацию о свойствах конкретных объектов класса. Их задача — обрабатывать общую для класса информацию в его статических полях;
- имя объекта или объектного выражения, и тогда F должен быть обыч-
ным, нестатическим методом. Это экземплярный метод, так как он вызывается экземпляром класса (объектом). Основной способ инициализации
вычислений — это вызов метода для объекта-цели или вызов обработчика
события. Объекты одного класса имеют один и тот же набор методов;
- цель не указана, т.е. задана по умолчанию. Такой вызов метода называется неквалифицированным. Целью является текущий объект или
-139-

для статических методов текущий класс. Текущий объект имеет зарезервированное имя this.
Выполнение методов может также инициироваться событиями. Например, вычисление площади треугольника может производиться после
нажатия на одну клавишу, а площади трапеции — на другую.
Выше была рассмотрена передача параметров в методы по значению. При изменении этих параметров в теле метода они остаются неизменными вне методов, так как в метод передаются их копии. В качестве
параметров, передаваемых по значению, могут использоваться сами значения, имена констант, имена переменных или выражения.
В метод могут передаваться не только значащие типы, но и ссылочные типы (например, элементы массива). Ниже описан класс с методом
MyMethod, в котором параметры являются ссылочным типом (массивом
arrayM), но передаются по значению:
class Example
{
public void MyMethod(double[] arrayM) //Метод
}
Здесь инициализация массива производится по умолчанию. Использование этого класса осуществляется с помощью вызова метода из следующего класса:
class Applic
{
static void Main()
{
double[] M = new double[5]; //Объявление одномерного мас-
сива M с 5 элементами
Example S = new Example(); //Создание экземпляра S класса
S.MyMethod(M); // Вызов метода для экземпляра S
for (int i=0; i<5; i++) Console.WriteLine(M[i]); // Пере-
бор элементов массива с номером i
}
}
В этом примере использованы новые понятия языка (массив, создание экземпляра, оператор for), которые более подробно будут рассмотрены в последующих разделах.
-140-
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
