Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Объектно-ориентированное программирование. Учебник для СПО

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать

Аналогичным образом операция | используется, если необходимо вычислить оба операнда, участвующих в операции ИЛИ, а операция || — если после получения результата операции вычисление значения второ­го операнда может быть прекращено (если первый операнд равен 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-
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]