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

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

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

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

k *= 2;

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

}

static void Main(string[] args)

{

int x = 5;

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

Func(ref x);

Console.WriteLine("\nПосле функции!");

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

}

}

}

Результат.

Для переменных, используемых в качестве параметров типа ref, имеются два ограничения. Вопервых, поскольку существует вероятность, что в результате вызова функции значение вызываемого по ссылке параметра будет изменено, то при вызове функции запрещается использовать переменные типа const. Отсюда следует, что следующий вызов является недопустимым:

const int x = 5;

Func(ref x);

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

131

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

int x;

Func(ref x);

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

Пример.

using System;

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

namespace ConsoleApplication1

{

class Program

{

static void Func(int[] a,int k)

{

for(int i=0;i<k;i++)

a[i]+=2;

}

static void Vivod(int[] a, int n)

{

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

Console.Write("{0}\t", a[i]);

Console.WriteLine();

}

static void Main(string[] args)

{

int x=5;

int[] a = new int[x];

132

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

Vivod(a, x);

Func(a,x);

Console.WriteLine("\nПосле функции!");

Vivod(a, x);

}

}

}

Результат.

Замечание. Массивы передаются в функцию по ссылке.

Рассмотрим пример передачи в функцию структуры.

using System;

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

namespace ConsoleApplication1

{

class Program

{

struct my

{

public int[] mas; public int g; public double s;

133

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

}

static void Vivod(my a)

{

for(int i=0;i<a.g;i++)

Console.Write("{0}\t", a.mas[i]);

Console.WriteLine();

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

}

static void Mena(my c)

{

for (int i = 0; i < c.g; i++) c.mas[i] *= 5;

c.s *= 3;

}

static void Main(string[] args)

{

my s1; s1.g = 5;

s1.mas = new int[s1.g];

for(int i=0;i<s1.g;i++)

s1.mas[i]=i;

s1.s = 9.0;

Vivod(s1);

Mena(s1);

Vivod(s1);

}

}

}

Результат.

134

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

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

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

using System;

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

namespace ConsoleApplication1

{

class Program

{

struct my

{

public int[] mas; public int g; public double s;

}

static void Vivod(my a)

{

for(int i=0;i<a.g;i++)

Console.Write("{0}\t", a.mas[i]);

Console.WriteLine();

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

}

static void Mena(ref my c)

135

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

{

for (int i = 0; i < c.g; i++) c.mas[i] *= 5;

c.s *= 3;

}

static void Main(string[] args)

{

my s1; s1.g = 5;

s1.mas = new int[s1.g];

for(int i=0;i<s1.g;i++)

s1.mas[i]=i;

s1.s = 9.0;

Vivod(s1);

Mena(ref s1);

Vivod(s1);

}

}

}

Результат.

136

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

Лекция №20.

Возвращаемые значения.

Из предыдущих лекций известно, что функция может возвращать только одно значение того типа, которое прописано в сигнатуре функции. Выход из функции и возврат значения происходит по выполнению оператора return. Функция может возвращать любые типы. Например,

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

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

namespace ConsoleApplication1

{

class Program

{

static int [] Postroen(int k)

{

int[] a = new int[k];

for (int i = 0; i < k; i++)

{

int s = 0;

for (int j = 1; j <= i; j++) s = s + j;

a[i] = s;

}

return a;

}

static void Vivod(int[] a, int n)

{

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

137

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

Console.Write("{0}\t", a[i]);

Console.WriteLine();

}

static void Main(string[] args)

{

int[] myMas;

Console.WriteLine("Введите размер массива");

int k = Convert.ToInt32(Console.ReadLine());

myMas = Postroen(k);

Vivod(myMas, k);

}

}

}

Результат.

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

Пример№2. Рассмотрим пример программы, содержащей функцию решения квадратного уравнения.

using System;

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

namespace ConsoleApplication1

{

class Program

138

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

{

struct resh

{

public double x1; public double x2; public bool fl;

}

static resh Urav(double a, double b, double c)

{

resh rez;

rez.x1=0;

rez.x2=0;

rez.fl=false;

double D = b * b - 4 * a * c; if (D < 0) return rez;

rez.x1 = (-b + Math.Sqrt(D)) / 2 / a; rez.x2 = (-b - Math.Sqrt(D)) / 2 / a; rez.fl = true;

return rez;

}

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=");

139

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

c = Convert.ToInt32(Console.ReadLine());

if (a == 0)

{

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

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

return;

}

resh otvet = Urav(a, b, c); if (otvet.fl == true)

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

otvet.x2);

else

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

}

}

}

Результат.

140