Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 25.07.2014
Сообщений: 32

Почему не прошло тестовое задание на работу?

27.03.2015, 11:03. Показов 4819. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно было выполнить следующее тестовое задание:
Необходимо описать задачу с применением принципов ООП.
Дано объекты-фигуры следующих видов: квадрат, треугольник, круг, трапеция. Каждую фигуру можно нарисовать, получить ее площадь и цвет. Также фигуры имеют уникальные методы, например: вернуть радиус, длину гипотенузы, длину стороны и т. д.
Нам необходимо сгенерировать случайный набор фигур, количество объектов в наборе также заранее неизвестно.
После генерации массива нужно вывести весь список объектов, которые у нас имеются, например:
Фигура: квадрат, площадь: 25 кв. ед., длина стороны: 5 ед., цвет: синий
Фигура: треугольник, площадь: 12,5 кв.ед., гипотенуза: 7.1 ед., цвет: желтый

Мое решение им не подошло, хотя, казалось бы, задачка - проще некуда. Ткните меня, пожалуйста, носом - что не так.

вот мое решение:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
/* 
 для упрощения мат. вычислений принимаем, что треугольники - прямоугольные равнобедренные,
    трапеции - равнобедренные, соотношение высоты и средней линии - 1 к 2
 */
public class Test {
    public static void main(String[] args){
        try {
            System.out.println(generateFigures());
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
    
    public static RandomFigureFactory fac=new RandomFigureFactory();
    static Random rand=new Random();
    
    public static List<Figure> generateFigures() throws IOException {
        List<Figure> arr=new ArrayList<Figure>();
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter the number of figures (from 1 to 10):");
        int n=sc.nextInt();
        if(n>0) {
            for(int i=0; i<n; i++) {
                arr.add(fac.next()); }
        } else {
            System.out.println("Wrong number!");
            System.exit(1);
        }
        sc.close();
        return arr;
    }
} 
 
abstract class Figure {
    public String[] Colors={"transparent","white", "black", "yellow", "green", "blue", "red"};
    protected String color;
    protected double area;
    public Figure() {
        color=Colors[0];
        area=1.0;
    }
    public Figure(int c, double a) {
        color=Colors[c];
        area=a;
    }
    public void setColor(int c){
        color=Colors[c];
    }
    public void setArea(double a){
        area=a;
    }
    public String getColor(){
        return color;
        
    }
    public double getArea(){
        return area;
    }
    abstract double getParameter();
    abstract void draw();
    public String toString(){
        return "Figure: "+this.getClass().getSimpleName()+", color: "+
                color+", area: "+area+", ";
    }
}
 
class Square extends Figure{
    public Square() {
        super();
    }
    public Square(int c, double a){
        super(c, a);
    }
    public double getParameter() {
        return Math.round(Math.sqrt(area)*100)/100.0;
    }
    public void draw() {
        System.out.println("Draw square: color: "+color+", area: "+area);
    }
    public String toString(){
        return super.toString()+"side length:"+getParameter();
    }
}
 
class Triangle extends Figure{
    public Triangle() {
        super();
    }
    public Triangle(int c, double a){
        super(c, a);
    }
    public double getParameter() {
        return Math.round(Math.sqrt(area*4)*100)/100.0;
    }
    public void draw() {
        System.out.println("Draw triangle: color: "+color+", area: "+area);
    }
    public String toString(){
        return super.toString()+"hypotenuse length:"+getParameter();
    }
}
 
class Sircle extends Figure{
    public Sircle() {
        super();
    }
    public Sircle(int c, double a){
        super(c, a);
    }
    public double getParameter() {
        return Math.round(Math.sqrt(area/Math.PI)*100)/100.0;
    }
    public void draw() {
        System.out.println("Draw circle: color: "+color+", area: "+area);
    }
    public String toString(){
        return super.toString()+"diameter:"+getParameter();
    }
}
 
class Trapeze extends Figure{
    public Trapeze() {
        super();
    }
    public Trapeze(int c, double a){
        super(c, a);
    }
    public double getParameter() {
        return Math.round(Math.sqrt(area/2)*100)/100.0;
    }
    public void draw() {
        System.out.println("Draw trapeze: color: "+color+", area: "+area);
    }
    public String toString(){
        return super.toString()+"height:"+getParameter();
    }
}
 
class RandomFigureFactory {
    private Random rand=new Random();
    public Figure next() {
        int n=rand.nextInt(4);
        switch(n) {
        case 0: return new Square(rand.nextInt(7), Math.round(rand.nextDouble()*10000)/100.0 );
        case 1: return new Sircle(rand.nextInt(7), Math.round(rand.nextDouble()*10000)/100.00 );
        case 2: return new Triangle(rand.nextInt(7), Math.round(rand.nextDouble()*10000)/100.0 );
        case 3: return new Trapeze(rand.nextInt(7), Math.round(rand.nextDouble()*10000)/100.0 );
        }
        return new Square();
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.03.2015, 11:03
Ответы с готовыми решениями:

Тестовое задание при приеме на работу
Друг искал работу. В одной из контор предложили тестовое задание: ----- Разработать на VC векторный графический редактор, с...

О том как я провалил тестовое задание при приеме на работу
Привет всем! На днях мне поступило предложение поработать программистом на шарпе в некой фирме. Но для начала мне нужно было выполнить...

Поиск файлов в папках (не тривиальное тестовое задание для приема на работу)
Доброе время суток . Был не давно на собеседовании в одной фирме . Задали задание на дом . Вот сижу ломаю голову как его сделать. В...

19
Mobile Software Engineer
Эксперт С++
 Аватар для Ev[G]eN
5381 / 1585 / 956
Регистрация: 23.01.2011
Сообщений: 3,214
27.03.2015, 11:16
Hbadger, не в QA ли часом пробовались?
0
23 / 23 / 12
Регистрация: 25.03.2015
Сообщений: 98
27.03.2015, 11:16
у вас ведь программа ни чего не рисует)
Судя по заданию, от вас хотели увидеть (кроме понимания ООП) умение работать с GUI, с потоками... на крайний случай посмотреть на ваши дизайнерские способности.

P.S. А может просто уже место заняли, и они решили не говорить причины, а просто отвергнуть задание. Спросите у того, кто не принял.
0
0 / 0 / 0
Регистрация: 25.07.2014
Сообщений: 32
27.03.2015, 11:31  [ТС]
Ev[G]eN, именно туда) знакомо?)

Добавлено через 4 минуты
BleStaR, ну вот я тоже подумала, что может хотели функцию рисования полностью реализованной увидеть. Я просто решила, что раз в задании акцентируется внимание на ООП, то на неё упор и него упор и нужно делать, а рисование представить формально.
Ещё сейчас внимательно перечитала условия - "Также фигуры имеют уникальные методы, например: вернуть радиус, длину гипотенузы, длину стороны и т. д." - наверное, нужно было не выпендриваться с абстрактным методом в классе Figure, а реально для каждой фигуры прописать персональный метод с разными именами типа getGiponenuse(), getDiameter() etc.?
0
Mobile Software Engineer
Эксперт С++
 Аватар для Ev[G]eN
5381 / 1585 / 956
Регистрация: 23.01.2011
Сообщений: 3,214
27.03.2015, 11:35
Hbadger, знакомо
мое тоже не приняли без объяснения причины
BleStaR, я уточнял на счет рисования, им это не нужно..там задание только на принципы ООП
0
0 / 0 / 0
Регистрация: 25.07.2014
Сообщений: 32
27.03.2015, 11:46  [ТС]
Ev[G]eN, ну, я набралась наглости и попросила указать мне на ошибки посмотрим, что ответят) просто для меня это первое тестовое задание в принципе, только-только решила, что готова таки попробовать искать работу в этой сфере и поэтому особенно интересно что не так. потому что, когда я это задание увидела я подумала "хм, надо же, какая легкотня" и очень озадачилась, когда его не приняли ))
0
1 / 1 / 1
Регистрация: 27.03.2015
Сообщений: 7
27.03.2015, 11:46
Я заметил только что rand объявляется 2 раза: в RandomFigureFactory и Test.
В остальном нормально вроде все
0
Mobile Software Engineer
Эксперт С++
 Аватар для Ev[G]eN
5381 / 1585 / 956
Регистрация: 23.01.2011
Сообщений: 3,214
27.03.2015, 11:48
Hbadger, ставлю 10 грн на то, что они Вам даже не ответят
0
0 / 0 / 0
Регистрация: 25.07.2014
Сообщений: 32
27.03.2015, 11:52  [ТС]
Ev[G]eN, вынуждена присоединиться к вашей ставке))) осталось найти того, кто на противоположное поставит и будет хоть какой-то профит.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
27.03.2015, 12:32
Hbadger, главное, что бросилось в глаза: почему фигура описывается своей площадью? Площадь должна быть расчётной характеристикой. Описываться фигура должна специфичными для неё параметрами: круг - радиусом; квадрат - длиной стороны; треугольник и трапеция - длинами всех сторон. Понятно, что если основной характеристикой будет площадь, работать будет куда проще. Но у вас в фабрике всё равно switch, так что генерировать нужное количество параметров для каждой фигуры не проблема.
Кроме того, конечно, метод getParameter - спорное архитектурное решение. А если специфичных параметров у фигуры несколько? Например, у круга есть только радиус (диаметр можно опустить), а у эллипса - ещё куча свойств: директриса, эксцентриситет... Опять же, вы getParameter в базовом классе никак не используете, он используется только в методах toString произвольных классов. Так почему было бы не объявить в каждом производном классе методы с нормальными названиями и не вызывать их в toString также, как вы вызываете в нём getParameter? Понятно, что через ссылку на родителя специфичные параметры уже не получить, но это и правильно, родитель ничего не знает о специфике своих детей.
Вообще, меня удивляет, что это тестовое задание при приёме на работу. Либо оно слишком простое и реализуется так, как я описал (хотя стоит сказать, что ваша реализация, в принципе, не далека от этого), либо они ждут чего-то виртуозного, но вот чего они ждут, известно, к сожалению, только им. Во втором случае они могли бы хотя бы намекнуть, добавив в задание ограничения или рекомендации.
2
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
27.03.2015, 12:48
Hbadger, код призван продемонстрировать знание ООП. У вас написанно не все что просили в задании, а то что написанно частично неверно.

Как вы уже сами написали выше, в задании было сказанно имплементировать уникальные методы для каждой фигуры а так же некоторые общие методы для всех фигур.

У вас уникальных методов нет, а есть какой то неясный abstract double getParameter(); который к тому же обязательный для всех наследников класса фигур. Это пример нечитаемого кода.

Метод подсчета площади должен быть абстрактным. Параметр area излишен

Теперь насчет метода draw(). Так как он написан, говорит о том что его написал человек, слабо представляющий суть ООП. В нашем случае метод draw() выводит на экран информацию о фигуре. Посути он должен вызывать .toString() а .toString() каждой фигуры должен выводить сначала .toString() базового объекта с общей информацией а затем свой собственный .toString() с уникальными полями. В этом суть наследования. У вас же оба метода реализованны неверно.


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


Это насчет ООП.
Теперь о композиции

Java
1
2
public String[] Colors={"transparent","white", "black", "yellow", "green", "blue", "red"};
    protected String color;
Это так же пример неочень хорошего кода. Для таких целей существуют перечисления (enum) и тут должно быть что-то вроде

Java
1
protected ColorEnum color;
Так же вы засунули всю программу в метод generateFigures() однако это неверно. Этот метод отвечает нетолько за генерацию фигур, но и за прием ввода от пользователя. Неговоря уже о том что вы просто выводите результат в консоль неявно используя метод .toString() вместо написанного вами draw() который подразумевает отрисовку фигур.


Вобщем смотря на этот код, я бы точно не взял вас писать код. Насчет QA зависит от требований к кандидату однако ваше решение показывает что принципы ООП вы понимаете довольно слабо видимо это и стало причиной отказа
3
18 / 18 / 12
Регистрация: 27.03.2015
Сообщений: 72
27.03.2015, 13:37
Я бы такой код тоже не принял.

А такой принял бы

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Square extends Figure {
  private double side;
 
  Square(double side) {
    this.side = side;
  }
 
  @Override
  public double getArea() {
    return side*side;
  }
 
  @Override
  public String toString() {
    System.out.println("Квадрат. Длина стороны - "+side+", площадь - "+getArea());
  }
}
0
1 / 1 / 1
Регистрация: 27.03.2015
Сообщений: 7
27.03.2015, 13:41
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
сам паттерн реализован неверно
Метод фабрики должен получать аргумент по которому будет возвращаться экземпляр?
Вы это имели ввиду?
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
27.03.2015, 13:45
Artem2000, есть несколько вариантов реализации. Один из них это получение аргумента.

Добавлено через 50 секунд
javafx, ваш код во-первых неполный, во-вторых неверный.
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
27.03.2015, 13:46
Java
1
@Override public String toString() { System.out.println("Квадрат. Длина стороны - "+side+", площадь - "+getArea()); }
садись - два
1
18 / 18 / 12
Регистрация: 27.03.2015
Сообщений: 72
27.03.2015, 14:00
javafx, ваш код во-первых неполный, во-вторых неверный.
Понятно, что это только фрагмент - показать сам принцип.
А то что в методе toString накосячил - так это от спешки
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
27.03.2015, 16:03
javafx, принцип тоже неверный. У вашего квадрата есть цвет, а вы его не показываете.
0
0 / 0 / 0
Регистрация: 25.07.2014
Сообщений: 32
27.03.2015, 19:24  [ТС]
KEKCoGEN, спасибо за развернутый ответ. это было то, что нужно. Прелести самообучения - налицо: то, что мне казалось, я понимаю достаточно ясно, наделе совсем не так.
По поводу enum - изначально с ним и написала, потом почему-то решила, что "нужно быть проще" и заменила на массив.
По поводу generateFigures() - да, накосячила, при чем ведь сколько раз в умных книжках мне писали "одна функция выполняет одно действие, избегайте объемных, многозадачных методов"

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

Добавлено через 1 час 54 минуты
KEKCoGEN, По поводу методов draw() и toString(). Мне кажется, здесь у меня главный "затык":
(массив на перечисление не заменяла, остальное пока не трогала, интересуют именно эти методы)

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
abstract class Figure {
    //здесь все осталось по прежнему, только убрала getParameter() и добавила абстрактный getArea();
           
    public void draw() {
        System.out.print(this);
    }
            public String toString(){
        return "Figure: "+this.getClass().getSimpleName()+", color: "+color;
    }
}
 
class Square extends Figure{
    private double side;
    public Square() {
        super();
        side=1.0;
    }
    public Square(int c, double a){
        super(c);
        side=a;
    }
    public double getArea() {
        return Math.round(side*side*100)/100.0;
    }
   
    public void draw() {
        System.out.println(this);
    }
           /* Метод вызывает сначала toString() родительского класса и дополняет его уникальными полями. Так оно
              должно быть или я опять недопоняла? */
    public String toString(){
        return super.toString()+"side length:"+side+"; area: "+getArea();
    }
}
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
27.03.2015, 19:38
Hbadger, а теперь уберите метод draw из производных классов и посмотрите, что получится.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
27.03.2015, 19:43
Hbadger, вывод площади можно убрать в toString родительского класса. В остальном норм.

Добавлено через 3 минуты
да, draw() должна быть только в родительском классе.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.03.2015, 19:43
Помогаю со студенческими работами здесь

Написать ответы на тестовое задание при приёме на работу (исключения, sizeof, mutex)
Добрый день! Ходил недавно на собеседование. Имеется список вопросов, на некоторые ответил правильно на какие-то - нет. Хотелось бы...

Тестовое задание
Здравствуйте, форумчане! Я решил заняться программированием и в частности веб-разработкой. Ситуация такова, что я знаю всего по чуть: html,...

Тестовое задание
Ребят, подскажите пожалуйста, кто с опытом, есть компания, хорошие условия работы и т.п. Я сразу понимаю что не волоку, но хочу подтянуть...

Тестовое задание
Добрый вечер. Мне пришло тестовое задание : &quot; Требуется реализовать вывод списка новостей и детальную страницу новости. Добавить...

Тестовое задание
Помогите пройти тест. Очень надо :) Введите пропущенный оператор в функцию вставки нового элемента в существующий список. 1. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru