
Курс лекций CS (первый семестр)
.pdf
Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова
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