Студопедия — Задания для самостоятельного выполнения. Выполнить задания п. 4.1 с использованием классов, используя наследование по указанию преподавателя
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Задания для самостоятельного выполнения. Выполнить задания п. 4.1 с использованием классов, используя наследование по указанию преподавателя






Выполнить задания п. 4.1 с использованием классов, используя наследование по указанию преподавателя.

 

 

Методы

Метод – это последовательность инструкций (операторов) для решения какой-либо более или менее самостоятельной задачи (подзадачи), оформленная специальным образом. Методы в C# являются членами классов или структур. Первое знакомство с методами у вас уже состоялось при изучении структур. В этом параграфе методы будут рассмотрены более последовательно и подробно.

Общие положения. Способы передачи параметров

Рассмотрим простейший пример.

using System;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

int a = 2, c = 3;

Console.WriteLine(p(a, c));

Console.ReadKey();

}

 

static int p(int a1, int c1)

{

int s = a1 + c1;

return s;

}

 

}

}

В примере, в приведенной программе в классе Program определены методы Main и p. В методе p вычисляется сумма двух переменных целого типа. Метод возвращает одно значение s, которое вычисляется в этом методе. Если метод возвращает значение, то имя переменной, в которую помещается возвращаемое значение, указывается после ключевого слова return, присутствие которого в данном случае обязательно. Если метод возвращает значение, то необходимо указывать тип возвращаемого значения, в данном примере int. Таким образом, заголовок метода p включает: ключевое слово static (значение которого обсудим позже), тип возвращаемого значения int, имя метода и в скобках параметры метода с указанием их типов. Все вместе эти элементы образуют подпись метода.

Вызов метода, возвращающего значение, осуществляется указанием имени метода и в скобках аргументов метода, которые заменяют параметры метода перед его выполнением. Обращение к методу записывается в том месте кода, где требуется получить значение, возвращаемое методом. В нашем примере обращение к методу p: p(a, c) записано в операторе вывода. Аргументы, указываемые при вызове метода, должны иметь тот же тип, что и параметры метода в описании метода и должны получить значения к моменту обращения к методу.

C# имеет две разновидности типов: типы значений и ссылочные типы (см. п. 1.1). В приведенном примере переменные a и c являются экземплярами структуры int и относятся к типу значения.

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

Так в данном примере при обращении к методу p в ячейку для параметра a1 пересылается значение a т.е. 2, в ячейку для параметра c1 – значение c, т.е. 3, и переменная s получает значение 5, которое и выводится в окно экрана.

Рассмотрим второй вариант решения той же задачи.

using System;

namespace ConsoleApplication1

{

class Program

{

static void Main()

{

int a = 2, c = 3, x;

ps(a, c, out x);

Console.WriteLine(x);

Console.ReadKey();

}

 

static void ps(int a1, int c1, out int s)

{

s = a1 + c1;

 

}

}

}

Те же вычисления выполняются в методе, не возвращающем значения. Если метод не возвращает значения, он имеет тип void. В списке параметров метода перечислены входные (a1, c1) и выходной (s) параметры. Ключевое слово out перед выходным параметром, имеющим тип значения, означает передачу параметра по ссылке, т.е. при обращении к методу на место выходного параметра передается адрес аргумента, фигурирующего в обращении к методу. В примере передается не значение переменной x, а адрес переменной x. Параметр s не является типом int; он является ссылкой на тип int, в данном случае ссылкой на переменную x. Поэтому после вызова метода значение переменной x изменяется.

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

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

Третий вариант

using System;

class Program

{

static void Main()

{

int a = 2, c = 3, x = 0;

//x присвоено фиктивное значение 0

p(a, c, ref x);

Console.WriteLine(x);

Console.ReadKey();

}

static void p(int a1, int c1, ref int s)

{

s = a1 + c1;

}

}

Замечание. Взаимное расположение методов в пределах одного класса не имеет значения. Управление всегда вначале передается методу Main.

Пример 5.1. Разработать (определить) метод для решения квадратного уравнения Вызвать метод для решения уравнения 3.2 +4.6 t –5 = 0 и, если уравнение имеет решение, вывести на печать больший из корней. Если решения нет, вывести соответствующее сообщение.

Вариант 1. Метод root статический, методы root и Main в одном классе. Передача параметров с помощью ref.

using System;

class Program

{

static void root(double a, double b, double c, ref double x1, ref double x2, ref bool l)

{

double d;

d = b * b - 4 * a * c;

if (d > = 0)

{

x1 = (-b + Math.Sqrt(d)) / (2 * a);

x2 = (-b - Math.Sqrt(d)) / (2 * a);

l =! l;

}

}

static void Main()

{

bool q = false;

double t1 = 0, t2 = 0, u = 0;

root(3.2, 4.6, -5.0, ref t1, ref t2, ref q);

if (q)

{

u = t1;

if (t2 > u) u = t2;

Console.WriteLine(" {0} {1: f3}", q, u);

}

else

Console.WriteLine(" решения нет");

Console.ReadKey();

}

}

 

Замечания. 1. Если два метода находятся в одном и том же классе и один из них статический (метод Main статический по определению) и из него вызывается другой метод, то вызываемый метод должен быть статическим. Существует только одна копия статического метода. Ниже приводится варианты (вариант 3 и вариант 4) решения этой же задачи, где использован нестатический метод (Instance – экземплярный). Нестатический метод связан с экземпляром типа. Из нестатического метода можно обращаться к экземплярным полям и методам, а также к статическим полям и методам.

 

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

 

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

 

Вариант 2. Метод root статический, методы root и Main в одном классе. Передача параметров с помощью out. В вариантах 2, 3, 4 возможность отсутствия решения уравнения не учитывается.

 

 

using System;

class Program

{

static void root(double a, double b, double c, out double x1, out double x2, out bool l)

{

double d;

l = false;

d = b * b - 4 * a * c;

x1 = 0;

x2 = 0;

if (d > = 0)

{

x1 = (-b + Math.Sqrt(d)) / (2 * a);

x2 = (-b - Math.Sqrt(d)) / (2 * a);

l =! l;

}

}

static void Main()

{

bool q;

double t1, t2, u =0;

root(3.2, 4.6, -5.0, out t1, out t2, out q);

if (q)

{

u = t1;

if (t2 > u) u = t2;

Console.WriteLine(" {0} {1: f3}", q, u);

}

else

Console.WriteLine(" решения нет");

Console.ReadKey();

}

}

 

Вариант 3. Метод root не статический и метод Main (статический) в одном классе Program.

 

using System;

class Program

{

void root(double a, double b, double c, ref double x1, ref double x2, ref bool l)

{

double d;

d = b * b - 4 * a * c;

if (d > = 0)

{

x1 = (-b + Math.Sqrt(d)) / (2 * a);

x2 = (-b - Math.Sqrt(d)) / (2 * a);

l =! l;

}

}

static void Main()

{

bool q = false;

double t1 = 0, t2 = 0, u = 0;

Program pr = new Program(); //создается экземпляр класса, pr – переменная //типа Program

//метод root экземпляра pr класса Program

pr.root(3.2, 4.6, -5.0, ref t1, ref t2, ref q);

if (q)

{

u = t1;

if (t2 > u) u = t2;

Console.WriteLine(" {0} {1: f3}", q, u);

}

else

Console.WriteLine(" решения нет");

Console.ReadKey();

}

}

 

Вариант 4. Методы root и Main в разных классах

using System;

class test

{

public void root (double a, double b, double c, ref double x1, ref double x2, ref bool l)

{

double d;

d = b * b - 4 * a * c;

if (d > = 0)

{

x1 = (-b + Math.Sqrt(d)) / (2 * a);

x2 = (-b - Math.Sqrt(d)) / (2 * a);

l =! l;

}

}

 

}

class Program

{

static void Main ()

{

bool q = false;

double t1 = 0, t2 = 0, u =0;

test pr = new test(); //pr – экземпляр класса test

//вызывается метод root экземпляра pr класса test

pr.root(3.2, 4.6, -5.0, ref t1, ref t2, ref q);

if (q)

{

u = t1;

if (t2 > u) u = t2;

Console.WriteLine(" {0} {1: f3}", q, u);

}

else

Console.WriteLine(" решения нет");

Console.ReadKey();

}

}

 

В последнем варианте метод root имеет модификатор доступа public (открытый), обеспечивающий доступ к этому методу из другого класса.

Пример 5.2. Вычислить число сочетаний из n по m: C = n! /(m! (nm)!).

Вычисление факториала оформить в виде метода, возвращающего значение.

Вариант 1. Методы Main и fact для вычисления факториала в разных классах.

using System;

class test

{

public int fact (int n)

{

int f = 1;

for (int i = 2; i < = n; i++)

{

f = f * i;

}

return f;

}

}

class Program

{

static void Main()

{

int n = 4, m = 3;

int cnm;

test pr = new test();

cnm = pr.fact(n) / (pr.fact(m)*pr.fact(n - m));

Console.WriteLine(" {0}", cnm);

}

}

Вариант 2. Методы Main и fact для вычисления факториала в одном классе.

using System;

class Program

{

static int fact(int n)

{

int f = 1;

for (int i = 2; i < = n; i++)

{

f = f * i;

}

return f;

}

static void Main()

{

int n = 5, m = 3;

int cnm;

cnm = fact(n)/ (fact(m) * fact(n - m));

Console.WriteLine(" {0}", cnm)

Console.ReadKey();

}

}

 







Дата добавления: 2014-12-06; просмотров: 1003. Нарушение авторских прав; Мы поможем в написании вашей работы!



Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

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

Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

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

Характерные черты официально-делового стиля Наиболее характерными чертами официально-делового стиля являются: • лаконичность...

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

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

Постинъекционные осложнения, оказать необходимую помощь пациенту I.ОСЛОЖНЕНИЕ: Инфильтрат (уплотнение). II.ПРИЗНАКИ ОСЛОЖНЕНИЯ: Уплотнение...

Приготовление дезинфицирующего рабочего раствора хлорамина Задача: рассчитать необходимое количество порошка хлорамина для приготовления 5-ти литров 3% раствора...

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

Studopedia.info - Студопедия - 2014-2024 год . (0.009 сек.) русская версия | украинская версия