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

Курс лекций CS (первый семестр)

.pdf
Скачиваний:
7
Добавлен:
20.05.2015
Размер:
2.69 Mб
Скачать

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

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

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

Пример№3. using System;

using System.Collections.Generic; using System.Text;

namespace ConsoleApplication1

{

class Program

{

static void Func(out int k)

{

k = 3;

}

static void Main(string[] args)

{

int h;

Func(out h);

141

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

Console.WriteLine("h={0}", h);

}

}

}

Результат.

Если в функцию добавить строку:

using System;

using System.Collections.Generic; using System.Text;

namespace ConsoleApplication1

{

class Program

{

static void Func(out int k)

{

Console.WriteLine("k={0}", k);

k = 3;

}

static void Main(string[] args)

{

int h;

Func(out h);

Console.WriteLine("h={0}", h);

}

}

142

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

}

Результат.

Программа не компилируется и выдается сообщение об ошибке

Рассмотрим пример приложения с функцией решения квадратного уравнения с использованием модификатора out.

Пример№4. using System;

using System.Collections.Generic; using System.Text;

namespace ConsoleApplication1

{

class Program

{

static

bool

Urav(double a, double b, double c, out double x1,out double x2)

{

 

 

 

 

x1

= 0;

 

 

 

x2

= 0;

 

 

 

double D =

b * b - 4 * a * c;

 

if

(D <

0)

return false;

 

x1

= (-b +

Math.Sqrt(D)) / 2

/ a;

x2

= (-b -

Math.Sqrt(D)) / 2

/ a;

return true;

}

143

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

static void Main(string[] args)

{

double a, b, c;

Console.WriteLine("Введите коэффициенты квадратного уравнения"); Console.Write("a=");

a= Convert.ToInt32(Console.ReadLine()); Console.Write("b=");

b= Convert.ToInt32(Console.ReadLine()); Console.Write("c=");

c= Convert.ToInt32(Console.ReadLine()); if (a == 0)

{

Console.WriteLine("Это программа решения только квадратного

урванения");

return;

}

double x1 = 0, x2 = 0;

if (Urav(a,b,c,out x1, out x2))

Console.WriteLine("Корни уравнения x1={0}, x2={1}", x1, x2);

else

Console.WriteLine("Уравнение не имеет корней");

}

}

}

Результат работы приложения совпадает с результатом примера №2.

144

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

Лекция №21.

Область действия переменных.

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

Пример№1. using System;

using System.Collections.Generic; using System.Text;

namespace ConsoleApplication1

{

class Program

{

static void myFunc()

{

int x=8;

Console.WriteLine("В myFunc() локальное x:{0}",x);

x++;

}

static void Main(string[] args)

{

myFunc();

Console.WriteLine("Теперь в main() x ={0}",x);

}

}}

Результат компиляции:

145

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

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

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

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

Пример№2. using System;

using System.Collections.Generic; using System.Text;

namespace ConsoleApplication1

{

class Program

{

static void myFunc()

{

int x=8;

Console.WriteLine("В myFunc() локальное x:{0}",x);

x++;

}

static void Main(string[] args)

{

146

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

int x=5;

Console.WriteLine("В main() x ={0}",x);

myFunc();

Console.WriteLine("Теперь в main() x ={0}",x);

}} }

Результат.

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

Пример№3. using System;

using System.Collections.Generic; using System.Text;

namespace ConsoleApplication1

{

class Program

{

static void myFunc()

{

Console.WriteLine("Мы в функции");

{

int x=9;

Console.WriteLine("Самое локальное x:{0}",x);

}

Console.WriteLine("Вне блока в myFunc() x:{0}",x);

}

147

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

static void Main(string[] args)

{

myFunc();

}} }

Результат: ошибка компиляции, как в примере №1.

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

static <тип> <имя_переменной>;

В случае необходимости она может быть инициализирона некоторым значением.

Пример№4. using System;

using System.Collections.Generic; using System.Text;

namespace ConsoleApplication1

{

class Program

{

static int a=9;

static void myFunc()

{

Console.WriteLine("В myFunc() a:{0}",a);

148

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

}

static void Main(string[] args)

{

Console.WriteLine("В main() a ={0}",a);

myFunc();

}} }

Результат.

Имя глобальной переменной может совпадать с именем локальной переменной. Тогда обращение к глобальной переменной происходит с указанием класса, которому она принадлежит.

Пример№5. using System;

using System.Collections.Generic; using System.Text;

namespace ConsoleApplication1

{class Program

{

static int a=9;

static void myFunc()

{

int a = 1;

Console.WriteLine("В myFunc() локальная a:{0}",a);

Console.WriteLine("В myFunc() глобальная a:{0}", Program.a);

}

149

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

static void Main(string[] args)

{

Console.WriteLine("В main() a ={0}",a);

myFunc();

}}}

Результат.

150