Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_2_2 Конструирование классов.doc
Скачиваний:
0
Добавлен:
17.11.2019
Размер:
163.33 Кб
Скачать

2.1 Рекомендации по планированию и пример выполнения работы

Рассмотрим пример решения такого задания:

Задание:

Создать базовый класс «кольцо», такой, что:

    1. его экземпляр содержит радиус внутренней окружности (не менее 1.0 мм) и площадь (не менее 10.0 мм2).

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

    3. его методы позволяют получать и присваивать значения радиусов и площади, выполняя при этом соответствующие преобразования.

    4. функция print() выводит на экран сообщение о радиусах и площади кольца.

    5. операция «+» перегружена: для колец возвращает кольцо с наименьшим из двух внутренних радиусов и суммарной площадью; при сложении кольца с числом, увеличивается значение площади этого кольца, и возвращается значение новой площади.

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

Решение:

План разработки:

  1. Создаем новый класс с названием Ring. При этом в текст программы автоматически включаются объявления библиотек и пространства имен.

  2. В соответствии с п. a) задания вводим в класс две переменные r и s - радиус и площадь кольца.

  3. Поскольку в п. a) задания указаны ограничения на переменные класса, вводим в него константы r_min и s_min - минимальный радиус и максимальная площадь.

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

  5. В соответствии с п. b) создаем конструктор без параметров. Поскольку С# проинициализирует поля r и s нулевыми значениями, достаточно вызвать функцию MinimRS(), чтобы реализовать такой конструктор.

  6. В п. b) указана необходимость еще двух перегруженных конструкторов: конструктор с двумя аргументами-радиусами и конструктор с одним аргументом-площадью. Программируем их вычисления, не забывая вызывать функцию MinimRS().

  7. В соответствии с п. с) создаем методы-свойства R_in, R_out и S. Чтобы не дублировать вычисления, отдельно программируем закрытые статические функции R1 и R2 для определения одного из радиусов по заданной площади и другому радиусу. В разделах set не забываем вызывать функцию MinimRS().

  8. В соответствии с п. d) программируем функцию print()для выполнения в консольном режиме.

  9. В соответствии с п. e) дважды перегружаем операцию «+»: с двумя одинаковыми аргументами типа Ring и с двумя разными аргументами типа Ring и double. Программируем арифметику этих операций.

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

Ниже приведен возможный вариант реализации этого плана:

// 1.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Lek_1_08

{

class Ring // Кольцо

{ // 3.

const double r_min=1.0; // Ограничение на внутренний радиус (мм)

const double s_min=10.0; // Ограничение на площадь (кв.мм)

// 4.

void MinimRS()

{ // Приводит неправильные значения полей

// в соответствие с условием задачи

r = Math.Max(r, r_min);

s = Math.Max(s, s_min);

}

// 7-Б.

static double R2(double r1, double s)

{// Вычисляет радиус внешней окружности

double s1 = Math.PI * r1 * r1;

double s2 = s1 + Math.Max(s,0.0);

return Math.Sqrt(s2 / Math.PI);

}

static double R1(double r2, double s)

{// Вычисляет радиус внутренней окружности

double s2 = Math.PI * r2 * r2;

double s1= Math.Max(s2-s,0.0);

return Math.Sqrt(s1 / Math.PI);

}

// 2.

private double r=0; // радиус внутренней окружности (мм)

private double s=0; // площадь кольца (кв.мм)

// 5.

public Ring()

{// Конструктор по умолчанию

MinimRS();

}

// 6.

public Ring(double s1)

{// Конструктор по заданной площади

s = s1;

MinimRS();

}

public Ring(double r1, double r2)

{// Конструктор по заданным радиусам

r = Math.Min(r1, r2);

s = Math.PI * Math.Abs((r1*r1 - r2*r2));

MinimRS();

}

// 7.

public double R_in

{// Свойство - внутренний радиус

get { return r; }

set { r = value; MinimRS(); }

}

public double R_out

{// Свойство - внешний радиус

get { return R2(r,s); }

set { r = R1(value,s); MinimRS(); }

}

public double S

{// Свойство - площадь

get { return s; }

set { s = value; MinimRS(); }

}

// 8.

public void print()

{ // Вывод параметров кольца на экран

Console.WriteLine("Кольцо: R1={0:F}, R2={1:F}, S={2:F}; ",

r,R2(r,s),s);

}

// 9.

static public Ring operator +(Ring Q1, Ring Q2)

{ // Операция сложения двух колец

double r1 = Math.Min(Q1.R_in, Q2.R_in);

double s1 = Q1.S + Q2.S;

double r2 = Ring.R2(r1, s1);

return new Ring(r1,r2);

}

static public double operator +(Ring Q1, double s1)

{// Операция сложения кольца с числом

Q1.S += s1;

return Q1.S;

}

}

class Program

{

static void Main(string[] args)

{ // 10.

// Проверка работы конструкторов

Ring a1=new Ring();

a1.print();

Ring a2=new Ring(22);

a2.print();

Ring a3=new Ring(0.5,15);

a3.print();

// Проверка методов-свойств

a3.R_in =10;

a3.print();

a3.R_out =10;

a3.print();

// Проверка сложения колец

Ring a4 = a1+a2+a3;

a4.print();

// Проверка прибавления площади кольца

double x = a4 + 100;

a4.print();

Console.ReadKey();

}

}

}

Результат выполнения:

11