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

lec

.pdf
Скачиваний:
41
Добавлен:
24.03.2015
Размер:
3.43 Mб
Скачать

//установка начального положения смещенной системы координат

Точка.x0=1; Точка.y0=2;

//сдвиг координат всех точек Точка.СдвигСистемы(); //посмотреть координаты в смещенной системе a.КоорСм(); // (3,4)

b.КоорСм(); // (4,3) a.КоорИсх(); // (5,7) b.КоорИсх(); // (6,6) // сдвинуть точку А а.СдвигТочки(); a.КоорСм(); // (4,5) b.КоорСм(); // (4,3) a.КоорИсх(); // (6,8) b.КоорИсх(); // (6,6)

}

}

3. Обмен данными между методами

При рассмотрении данного вопроса взаимодействие между методами упрощено – рассматриваем вариант, когда все методы расположены в одном классе.

Существует 3 способа обмена данными:

1.Использование общих полей класса (рассмотренный ранее вариант)

2.Обмен данными через параметры методов

3.Возврат данных из метода

Обмен данными через параметры методов При определении метода указываются параметры, для каждого па-

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

Виды параметров:

1.Входные (прием данных) – при вызове снимается копия аргумента

ипередается в метод на место параметра. Метод не имеет возможности изменить аргумент. По умолчанию все параметры считаются входными.

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

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

101

При использовании выходных параметров аргумент должен быть именем объекта.

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

объекта. Возврат значения выполняется оператором return Объект; Оператор прекращает выполнение метода и производит возврат в

точку выова метод и возвращает в вызвавший метод на место вызова – выражение.

Выражение может определить выражение любого типа, т.е. из метода можно вернуть:

1.Значение стандартного типа (целые, вещественные и т.д.)

2.Массив

3.Объект определенного класса

Последние два варианта позволяют добиться возврата из метода множества значений.

Пример:

Определить метод, выполняющий сдвиг координат точки на заданное расстояние.

class_Example

{

public_static_void_Mov (ref int x, ref int y, int d)

{

x=x+d;

y=y+d;

}

public_static_void_Main()

{

int a=4, b=3, d=10; Move (ref a, ref b, d);

}

}

4 Параметры метода Main()

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

– возвращаться значение.

 

 

программа

 

аргументы

 

аргументы

аргументы

 

 

 

 

 

вызов

 

запуск

Main

 

Метод

 

 

возврат

значение

 

 

значение

 

 

 

С другой стороны сама программа может быть запущена из другой программы и может запускать другую программу.

102

В рамках данного вопроса рассмотрим вариант, когда программа запускается из среды исполнения. Поскольку метод Main() выполняется первым при запуске программы, то именно через этот метод производится прием аргументов.

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

 

 

С:

 

PR

PR

BIN

DEBUG

pr.sln

 

(решение)

pr.exe

 

C:\PR\PR\BIN\DEBUG\pr.exe_аргумент1_ аргумент2_... _аргументN

Состав параметров метода Main фиксирован: Main (string[] args)

Метод принимает параметры из команды в виде массива строк. Каждая строка хранит символьное представление одного аргумента.

Пример

Разработать программу, предназначенную для хранения в виде массива цен на товары и их изменения на заданную сумму. Изменение выполняется методами

Plus – увеличение

Minus – уменьшение Исполняемый файл хранится в файле pr.exe. Соглашение об аргументах в команде

1.Сумма

2.Вид операции

Плюс (в любом регистре) или +

Минус (в любом регистре) или

3.Фамилия оператора (ключ)

Пример команды

C:\PR\PR\BIN\DEBUG\pr.exe_50_Плюс_Иванов

Массив args в Main()

0

«50»

 

1

 

 

«Плюс»

 

2

 

 

«Иванов»

 

 

 

public static void Plus(double[] p, double s) // массив цен, сумма, на которую увеличиваем

{

for (int i = 0; i < p.Length; i++) p[i] += s;

}

public static void Minus(double[] p, double s)

103

{

for (int i = 0; i < p.Length; i++) p[i] -= s;

}

public static Main(string[] args)

{

double[] pr; //массив с ценами double delta; //сумма

string key = "Иванов"; //ключ

pr = new double[] { 100.0, 200.0, 300.0 };

//проверяем сколько аргументов нам передали if (args.Length != 3) return;

//завершение программы - ошибка1

//проверка фамилии

if (args[2] != key) return; //завершение программы - ошибка2

//пересчет цен

delta = double.Parse(args[0]);

//чтение операции

switch (args[1].ToUpper())

{

case "ПЛЮС":

case "+": Plus(pr, delta); break; case "МИНУС":

case "-": Minus(pr, delta); break;

}

//вывод новых цен

return;

}

5.Перегруженные методы

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

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

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

1.Вызывающий метод – это тот метод, который совпадает с вызовом по имени, количеству и типу параметров.

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

3.Если такого метода нет, фиксируется ошибка.

104

Пример

Определить класс, описывающий понятие точка, методы, реализующие операции:

-Установка точки на числовой оси

-Установка точки на плоскости

-Установка точки в трехмерном пространстве

-Вычисление расстояния от точки до начала координат

class Точка

{

private double x, y, h;

//установка точки на прямой public void Set(double xp)

{

x = xp; y = 0; h = 0;

}

//установка точки на плоскости public void Set(double xp, double yp)

{

x = xp; y = yp; h = 0;

}

//установка точки в пространстве

public void Set(double xp, double yp, double hp)

{

x = xp; y = yp; h = hp;

}

//вычисление расстояния public double Dist()

{

return Math.Sqrt(x * x + y * y + h * h);

}

}

class Program

{

public static void Main()

{

double d; //расстояние Точка тчк = new Точка();

тчк.Set(2.0); //будет вызван первый Set() d=тчк.Dist(); // d=2.0

тчк.Set(3.0,4.0); //будет вызван второй Set() d=тчк.Dist(); // d=5.0

тчк.Set(2,3,6); //будет вызван третий Set

105

d=тчк.Dist(); // d=7.0

}

}

Перегруженные методы не различаются по типу возвращаемого значения.

6. Конструкторы

Представляют собой специфический метод класса. Специфика заключается:

в назначении – конструктор автоматически вызывается при создании объекта и в силу этого используется, как правило, для инициализации полей объекта.

в оформлении (т.е. в синтаксисе) – конструктор должен иметь имя, совпадающее с именем класса, конструктор не имеет возвращаемого значения.

Конструкторы могут быть перегружены, вызов соответствующего конструктора выполняется при создании объекта

106

МАССИВЫ ОБЪЕКТОВ СОБСТВЕННЫХ КЛАССОВ

1. Способы описания структуры предметной области

Любая программа – модель предметной области, некоторой части реальности. Предметная область состоит из элементов, которые в свою очередь состоят из более простых элементов.

Современные языки программирования содержат механизмы, позволяющие отразить структуру элементов. Два самых распространенных механизма:

1.Массив

2.Объект

Взаимодействие этих механизмов приведено на рис.1.

рис.1

Массив может содержать элемент, представляющий собой объект какого-то класса. В свою очередь, полем класса может быть массив. Комбинируя эти механизмы, можно определять сложные типы данных.

2. Массив объектов одного класса

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

Следствие:

Объект, на который указывает элемент массива, должен быть созданным явным образом с использованием операции new.

Массив значимых типов

Массив объектов

107

int[] a;

Тип[] b;

a=new int[2];

b=new Тип [2];

 

 

a[0]= 15;

 

a[1]= 25;

 

Объект создаем в явном виде: b[0]=new Тип();

b[1]= new Тип();

В каждом классе по умолчанию определен конструктор без параметров. При создании объекта вызывается конструктор, в задачу которого входит начальная установка полей объектов: поля значимого типа – 0, поля ссылочного типа – null.

Пример:

Определить класс «Студент» с полями: фамилия, Номер зачетной книжки, оценки за последнюю сессию и методом вывода данных о студенте на экран.

class Студент

{

public string Фам; public int Зач; public int[] Оц;

public void Показать()

{

int i;

Console.Write(Фам + Зач); for (i = 0; i < Оц.Length; i++)

Console.Write(Оц[i]); Console.WriteLine();

}

}

Создадим объект класса Студент:

Студент ст;

ст = new Студент();

108

Фам

Зач

Оц

«»

0

0

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

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

Различают два вида конструкторов копирования:

1.Поверхностное копирование (с полей значений снимается копия значений, с полей ссылок – копия ссылок)

2.Конструктор полного копирования (с полей значений снимается копия значений, для полей ссылок создается объект и в него копируются данные, на которые указывает ссылочное поле оригинала)

Конструктор с параметрами

public Студент (string Фам, int зач, int[] оц)

{ this.Фам = Фам; //this – ссылка на активный объект this.Зач=Зач;

this.Оц=Оц;

}

Конструктор поверхностного копирования

public Студент (Студент ст) { Фам = ст.Фам;

Зач = ст.Зач; Оц= ст.Оц;

}

Основная программа

Студент ст1; Студент ст2; int[] Оц;

Оц=new int[]{10,10};

ст1=new Студент («Петров», 777, Оц); ст2=new Студент (ст1);

При изменении массива оценок изменятся данные и в объекте ст1, и в объекте ст2.

Конструктор полного копирования

109

public Студент (string Фам, int зач, int[] оц) { this.Фам = Фам;

this.Зач=Зач;

this.Оц=new int[Оц.Length]; Array.Copy(Оц,0,this. Оц,0, Оц.Length);

}

public Студент (Студент ст) { Фам = ст.Фам;

Зач = ст.Зач;

Оц= new int[Оц.Length]; Array.Copy(Оц,0,this. Оц,0, Оц.Length);

}

У каждого объекта при копировании создается свой собственный массив оценок.

3. Массив объектов разных типов

Часто возникает необходимость хранить в одном массиве объекты разных типов.

Пример:

Сформировать массив сотрудников факультета: студенты и преподаватели. Класс Студент аналогичен рассмотренному. Класс Преподаватель имеет поля: фамилия, название кафедры. Метод – вывод фамилии и названия кафедры.

Проблема:

1.Требуется массив объектов разных типов

2.Разрешается массив объектов одного типа

Решение проблемы:

Все классы (типы) являются наследниками класса Object. Объект этого класса представляет собой ссылку, которой может быть присвоена ссылка любого типа.

Object ob;

Студент ст; Преподаватель пр;

ob = ст; ob = пр;

110

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]