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

methodichkaA5

.pdf
Скачиваний:
17
Добавлен:
02.02.2015
Размер:
801.83 Кб
Скачать

Точка на плоскости обладает двумя координатами. Поэтому объявляем два свойства (переменных) типа float.

float x;

float y;

Описываем конструктор, функцию, которая имеет такое же название, как и класс и выполняется во время инициализации экземпляра класса.

Point() {

x=0;

y=0;

}

Данный конструктор не имеет входящих параметров и выполняет обнуление переменных x и y. Конструкторов в классе может быть несколько,

но все они должны отличаться списком входящих параметров.

Point(float x, float y){

this.x=x;

this.y=y;

}

Другой конструктор класса, который имеет два входящих параметра float x, float y. Он получает пару чисел с плавающей запятой x и y и записывает ее в соответствующие переменные this.x и this.y. Ключевое this слово означает, что обращение происходит к глобальной переменной класса, описанной как свойство класса, а не к входящему параметру функции. Другими словами, this

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

void setx(float x){

this.x=x;

}

Метод setx реализует инкапсуляцию, записывает новое значение в свойство класса x, из входящей переменной x. Аналогичная функция реализуется и для второй координаты.

void sety(float y){

this.y=y;

}

Далее необходимо создать новый класс для описания свойств и методов треугольника. Назовем его T3angl. Для в проект добавляем новый класс, т.е. в

проекте создается новый файл T3angl.java.

61

package pname; import java.lang.*; class T3angl { Point p1, p2, p3; T3angl() {

p1 = new Point(0, 0);

p2 = new Point(0, 0);

p3 = new Point(0, 0);

}

void setp1(Point p) { this.p1 = p;

}

void setp2(Point g) { this.p2 = g;

}

void setp3(Point e) { this.p3 = e;

}

float Dealta(Point S, Point H) { float D = 0;

D = (float) Math.sqrt( (float) (Math.pow( (S.x - H.x), 2) +

Math.pow( (S.y - H.y), 2)));

return D;

}

float EstimateP() { float P = 0;

P=Dealta(p1,p2)+Dealta(p2,p3)+Dealta(p3,p1); return P;

}

float EstimateS() { float S = 0;

S=(float)Math.sqrt(( EstimateP()/(float)2.0)*( EstimateP()/(float)2.0-Dealta(p1,p2))*

( EstimateP()/(float)2.0-Dealta(p2,p3))*

( EstimateP()/(float)2.0-Dealta(p3,p1)));

return S;

}

}

Сначала объявляется три переменных типа Point. Они будут хранить информацию о точках треугольника.

Point p1, p2, p3;

Далее опишем конструктор класса.

62

T3angl() {

p1 = new Point(0, 0);

p2 = new Point(0, 0);

p3 = new Point(0, 0);

}

Конструктор T3angl вызывает для каждой точки конструктор класса Point с двумя входящими параметрами. Оператор new выделяет место в памяти для хранения точки, а конструктор Point(0, 0) записывает в свойства x и y значение 0. Таким образом, после того, как отработает функция T3angl() все три точки будет иметь координаты (0,0).

void setp1(Point p) {

this.p1 = p;

}

Данная функция записывает значение входящего параметра p в переменную класса p1. Опишем подобную функцию для каждой точки треугольника. Назовем их setp2 иsetp3 соответственно.

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

float Dealta(Point S, Point H) {

float D = 0;

D = (float) Math.sqrt( (float) (Math.pow( (S.x - H.x), 2) +

Math.pow( (S.y - H.y), 2)));

return D;

}

Если подставить в такую функцию две точки, вершины треугольника (переменные типа Point), то она вычислит длину стороны, соединяющей эти точки.

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

float EstimateP() {

float P = 0;

P=Dealta(p1,p2)+Dealta(p2,p3)+Dealta(p3,p1);

return P;

}

Вызвав функцию Dealta с входными параметрами p1 иp2, вычислим длину одной стороны. Dealta(p2,p3) – вычисляет длину второй стороны, а Dealta(p3,p1) – третьей. Сложив результаты, получим периметр P.

И, наконец, разработаем функцию для нахождения площади треугольника EstimateS(). В реализации функции используется формула Герона для нахождения площади треугольника по трем сторонам.

63

float EstimateS() {

float S = 0;

S=(float)Math.sqrt(( EstimateP()/(float)2.0)*( EstimateP()/(float)2.0-Dealta(p1,p2))*

( EstimateP()/(float)2.0-Dealta(p2,p3))*

( EstimateP()/(float)2.0-Dealta(p3,p1)));

return S;

}

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

package pname; public class MainClass {

public static void main(String[] args) { T3angl TR1 = new T3angl();

Point M = new Point( (float) 2, (float) 3);

TR1.setp1(M);

Point N = new Point( (float) 4, (float) 5);

TR1.setp2(N);

Point F = new Point( (float) 1, (float) 6);

TR1.setp3(F);

T3angl TR2 = new T3angl();

Point A = new Point( (float) 2, (float) 3.0);

TR2.setp1(A);

Point B = new Point( (float) 4.7, (float) 5.7);

TR2.setp2(B);

Point C = new Point( (float) 1.2, (float) 6.5);

TR2.setp3(C);

if (TR1.EstimateS() > TR2.EstimateS()) { System.out.println("TR1>TR2");

}else { System.out.println("TR2>=TR1");

}

}

}

Опишем работу главной функции.

T3angl TR1 = new T3angl();

Создается экземпляр класса T3angl. Переменная получает название TR1. Оператор new выделяет место в памяти для экземпляра класса T3angl, затем вызывается пустой конструктор T3angl() Если посмотреть реализацию конструктора T3angl(), то внутри него три раза вызывается конструктор класса

64

точек Point(0,0), задающий точке координаты (0,0). Таким образом, выполнение одной строки иницализирует треугольник, у которого все три точки находятся в начале координат.

Создадим какую-то точку с координатами (2,3).

Point M = new Point( (float) 2, (float) 3);

Запишем эту точку в треугольник, используя метод setp1.

TR1.setp1(M);

Таким образом, у треугольника TR1 в свойстве p1 будет записана точка с координатами (2,3). Или, другими словами, у свойства p1 в полях x и y будут храниться значения 2 и 3 соответственно.

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

Point N = new Point( (float) 4, (float) 5);

TR1.setp2(N);

Point F = new Point( (float) 1, (float) 6);

TR1.setp3(F);

Заполним параметры второго треугольника.

T3angl TR2 = new T3angl();

Point A = new Point( (float) 2, (float) 3.0);

TR2.setp1(A);

Point B = new Point( (float) 4.7, (float) 5.7);

TR2.setp2(B);

Point C = new Point( (float) 1.2, (float) 6.5);

TR2.setp3(C);

Затем, необходимо определить, какой из треугольников занимает большую площадь, вызвав у обоих функцию EstimateS().

if (TR1.EstimateS() > TR2.EstimateS()) {

System.out.println("TR1>TR2");

}else { System.out.println("TR2>=TR1");

}

Таким образом, был рассмотрен пример разработки объектно-

ориентированного приложения.

Рассмотрим следующий пример.

Пример.

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

Необходимо разработать систему классов для реализации программы. Для хранения информации о студенте построим класс Stud.

65

package uni; public class Stud { String FIO;

int year, m1, m2, m3; Stud() {

FIO = " ";

year = m1 = m2 = m3 = 0;

}

Stud(String FIO) {

this.FIO = FIO;

year = m1 = m2 = m3 = 0;

}

Stud(String FIO, int year, int m1, int m2, int m3) { this.FIO = FIO;

this.m1 = m1; this.m2 = m2; this.m3 = m3; this.year = year;

}

float Sredn() {

int Sum = m1 + m2 + m3; return (float) Sum / 3;

}

void PrintSt() {

System.out.println(FIO + "\t" + year + "\t" +

m1 + " " + m2 + " " + m3 + "\t" + Sredn());

}

void setMarks(int m1, int m2, int m3) { this.m1 = m1;

this.m2 = m2; this.m3 = m3;

}

}

Рассмотрим подробнее реализацию этого класса.

String FIO;

int year, m1, m2, m3;

Объявляем поля (методы) класса – фамилию, год рождения и три оценки

соответственно.

Stud() {

FIO = " ";

year = m1 = m2 = m3 = 0;

}

66

Данный пустой конструктор ницализирует поля по умолчанию. В FIO

записывает пробел, а значение года и оценок делает равным 0.

Stud(String FIO) {

this.FIO = FIO;

year = m1 = m2 = m3 = 0;

}

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

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

Stud(String FIO, int year, int m1, int m2, int m3) { this.FIO = FIO;

this.m1 = m1; this.m2 = m2; this.m3 = m3; this.year = year;

}

Далее напишем функцию для расчета среднего бала студента.

float Sredn() {

int Sum = m1 + m2 + m3;

return (float) Sum / 3;

}

Эта функция не имеет входных параметров, а использует глобальные переменные класса Stud – m1, m2 и m3. Т.е. эта функция рассчитывает средний бал для конкретного студента, фамилия которого равна FIO.

void PrintSt() {

System.out.println(FIO + "\t" + year + "\t" +

m1 + " " + m2 + " " + m3 + "\t" + Sredn());

}

Функция выводит на консоль информацию об одном студенте, указывает в строчку его фамилию FIO, год рождения year, три оценкиm1, m2, m3 и средний бал, который рассчитывает функция Sredn().

void setMarks(int m1, int m2, int m3) {

this.m1 = m1;

this.m2 = m2;

this.m3 = m3;

}

67

Вызов этой функции произведет запись в поля оценок тех значений,

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

Разобравшись со студентом, перейдем к реализации класса,

описывающего группу студентов. Известно, что группа – это класс,

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

package uni; import java.lang.*; public class Group { String grName; Stud[]Student; Group() {

grName=" "; Student=new Stud[5]; for(int i=0;i<5;i++){ Student[i]=new Stud();

}

}

void setName(String grName){ this.grName=grName;

}

void printGR1(){ System.out.println(grName);

for (int i = 0; i < Student.length; i++) { System.out.print(Student[i].FIO+

"\t"+Student[i].year+

"\t"+Student[i].m1+

""+Student[i].m2+

""+Student[i].m3+" "); System.out.println(Student[i].Sredn());

}

}

void printGR2(){ System.out.print(grName); for(int i=0;i < Student.length; i++){ Student[i].PrintSt();

}

}

}

68

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

String grName;

Stud[]Student;

Далее опишем пустой конструктор.

Group() {

grName=" ";

Student=new Stud[5];

for(int i=0;i<5;i++){

Student[i]=new Stud();

}

В нем по умолчанию присваивается имени группы grName пустая строка.

Student=new Stud[5];

Выделяется место под массив из пяти элементов.

for(int i=0;i<5;i++){

Student[i]=new Stud();

В цикле, для всех пяти студентов вызывается конструктор Stud(), выполняющий инициализацию по умолчанию.

void setName(String grName){

this.grName=grName;

}

Функция setName задает новое значение параметруgrName.

Далее опишем функцию печати списка группы. Она реализована двумя способами. Рассмотрим первый способ – функцию printGR1().

void printGR1(){

System.out.println(grName);

for (int i = 0; i < Student.length; i++) {

System.out.print(Student[i].FIO+

"\t"+Student[i].year+

"\t"+Student[i].m1+

""+Student[i].m2+

""+Student[i].m3+" "); System.out.println(Student[i].Sredn());

}

Сначала в отдельной строке выводится название группы.

System.out.println(grName);

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

Здесь Student.length – длина массиваStudent.

69

printGR2().

Student[i].year – обращение к студенту под номером i и к его полю year. Вообще, для того, чтобы вытянуть значение некоторого поля объекта, необходимо указать название переменной – экземпляра класса и через точку задать название поля. Аналогично обращаемся к функции Student[i].Sredn(), которая считает средний бал для студента под номеромi.

Следующий способ реализации функции печати показывает

void printGR2(){

System.out.print(grName);

for(int i=0;i < Student.length; i++){

Student[i].PrintSt();

}

}

Здесь, обращение к полям экземпляра класса Stud не происходит, но для каждого студента вызывается своя функция печати Student[i].PrintSt().

Далее реализуем главный класс MainUniclass с функцией main.

package uni;

public class MainUniclass {

public static void main(String[] St) { Group G = new Group(); G.setName("KIT-76"); G.Student[0].FIO = "Иванов И.И."; G.Student[0].year = 1990; G.Student[0].setMarks(2, 3, 4); G.Student[1].FIO = "Петров П.П."; G.Student[1].year = 1989; G.Student[1].setMarks(3, 3, 4); G.Student[2].FIO = "Сидоров С.С."; G.Student[2].year = 1988; G.Student[2].setMarks(4, 4, 4); G.Student[3].FIO = "Никитин Н.Н."; G.Student[3].year = 1991; G.Student[3].setMarks(2, 3, 2); G.Student[4].FIO = "Сергеев С.С."; G.Student[4].year = 1990; G.Student[4].setMarks(2, 2, 4); G.printGR1();

G.printGR2();

}

}

Сначала зададим переменную – экземпляр класса Group.

Group G = new Group();

70

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