Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 16.04.2015
Сообщений: 4
1

Не могу составить структуру программы

17.09.2015, 08:25. Показов 1439. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, уважаемые форумчане!

Есть у меня условие задачи. Звучит оно вот так:

Имеется набор емкостей, в которые заливают жидкости. В одну емкость можно залить только одну жидкость, т.е. смешивать жидкости запрещается. Емкость заполняется на 95% от максимального объема.
Описание емкостей:
– стенки емкостей прямые или наклонные с одинаковым углом наклона во всех направлениях;
– у наклонных емкостей основание меньшей площади всегда находится внизу;
– в основании прямых емкостей могут быть следующие фигуры: квадрат, прямоугольник, равнобедренная трапеция, правильный шестиугольник, круг, овал (эллипс);
– в основании наклонных емкостей могут быть следующие фигуры: квадрат, равнобедренная трапеция, правильный шестиугольник, круг;
– высота у всех емкостей одинаковая.
Список имеющихся жидкостей (в скобках указана плотность, кг/м3): бензин (740), керосин (820), машинное масло (910).
Создать консольное приложение, в котором последовательно выполнить следующие задания:
– залить произвольным образом жидкости в набор емкостей (не менее 10);
– отсортировать емкости по убыванию массы залитой в них жидкости;
– вывести на консоль в табличном виде (можно без границ) набор емкостей (полный состав атрибутов) и их содержимого;
– найти наименьшую массу бензина, залитого в емкость.
Требования:
– Использовать объектно-ориентированный подход для описания сущностей предметной области.
– Набор емкостей инициализировать в коде с помощью конструктора или метода. Как следствие, не использовать внешние источники данных: консоль (т.е. ввод с клавиатуры), файлы, СУБД и т.п.
– Инициализацию выполнить без датчика случайных чисел. Передавать в конструктор константные значения. Например, залить керосин в прямую емкость, в основании которой прямоугольник со сторонами 45 см и 30 см.
– Приложение должно быть консольным. Не использовать графический интерфейс! Таким образом, приложение ничего не должно вводить, а только выводить результаты на консоль.
Предпочтения по выбору:
– языка программирования: 1) Java; 2) C++; 3) другой ООП язык.
– реализации сортировки и поиска: 1) интерфейс внешних библиотек (н-р, метод sort() подходящего класса); 2) собственный код.

Я понимаю, что задачка университетского уровня, и далеко не самая сложная. Но я - новичок. И не прошу помогать кодом. Прошу подсказать кто что может. В идеале - как структурировать программу, поскольку я потонул в пространстве идей, как это все красиво реализовать.

Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2015, 08:25
Ответы с готовыми решениями:

Не могу составить код программы
В каждой строке текста записана (без ошибок) такая последовательность символов: a # b, де a i b -...

Составить структуру БД
Всем привет , у меня проблема , не могу составить правильно БД сделать связи прочее . мб кто нибудь...

Не могу придумать структуру БД
Бд для тестов и опросов. Основная сложность - разные типы вопросов. 3 таблицы думаю точно нужны:...

Не могу сформировать структуру
Привет Всем! ребята нужна ваша помощь по разбору шаблона в PHP. Есть макет в атаче, а так же...

8
Эксперт Java
2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
17.09.2015, 09:56 2
Noegon, для начала определитесь какие сущности будут у вас в программе. Затем напишите (лучше на листочке) какие методы будут у каждой сущности. После подумайте как можно сгруппировать сущности с похожими свойствами (наследования, интерфейсы и.т.д)

После того как это все будет написано на бумаге, все станет намного понятнее.
0
0 / 0 / 0
Регистрация: 16.04.2015
Сообщений: 4
22.09.2015, 15:32  [ТС] 3
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Noegon, для начала определитесь какие сущности будут у вас в программе. Затем напишите (лучше на листочке) какие методы будут у каждой сущности. После подумайте как можно сгруппировать сущности с похожими свойствами (наследования, интерфейсы и.т.д)
После того как это все будет написано на бумаге, все станет намного понятнее
Спасибо! На бумаге все действительно стало несколько яснее. Запомню совет на будущее. Я даже почти решил задачу! Правда, скорее всего, решение далеко от идеала)

Добавлено через 22 часа 7 минут
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Noegon, для начала определитесь какие сущности будут у вас в программе. Затем напишите (лучше на листочке) какие методы будут у каждой сущности. После подумайте как можно сгруппировать сущности с похожими свойствами (наследования, интерфейсы и.т.д)
После того как это все будет написано на бумаге, все станет намного понятнее.
Я выполнил задание, и, если не сложно, прошу посмотреть одним опытным глазом... Исполняемый класс - Execute.
Класс Liquors можно было и не делать, забив все в Vessel, но, на это пока прошу закрыть глаза. И... Прошу не говорить в духе: "пальцы поотламывать" - это мой первый более-менее серьезный код, все остальное - задачки из Эккеля "Thinking in java".

Класс Vessel
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
package MyTask;
 
public abstract class Vessel implements Comparable<Object> {
    
    final double height = 0.3;
    final double filling = 0.95;
    double a;
    double b;
    double h;
    double a1;
    double b1;
    double h1;
    double vol;
    double squareTop;
    double squareBottom;
    String sideType;
    String liqType;
    String crossSectionType;
    
    Vessel (double a, double b, double h, double a1, double b1, double h1,
            String crossSectionType,String liqType)
    {
        this.a = a;
        this.b = b;
        this.h = h;
        this.a1 = a1;
        this.b1 = b1;
        this.h1 = h1;
        this.crossSectionType = crossSectionType;
        this.liqType = liqType;
    }
    
    public abstract String sideType_ID();
    
    public abstract double Square_bottom();
    
    public abstract  double Square_top();
    
    public abstract double Volume ();
    
    public double mass()
    {
        int density;
        if (liqType == "gasoline"){
            Liquors gasoline = new Liquors();
            density = gasoline.liqourDensity(gasoline.licquors[0]);
        }else if(liqType == "kerosene"){
            Liquors kerosene = new Liquors();
            density = kerosene.liqourDensity(kerosene.licquors[1]);
        }else if(liqType == "oil"){
            Liquors oil = new Liquors();
            density = oil.liqourDensity(oil.licquors[2]);
        }else{
            density = 0;
        }
        double m = vol * density * filling;
        return m;       
    }
    
    // Создадим метод для сравнения объектов класса Vessel и производных по убыванию
    //результата, возвращаемого методом mass()
    
      public int compareTo(Object obj)
      {
        Vessel tmp = (Vessel)obj;
        if(this.mass() > tmp.mass())
        {
          /* текущее больше полученного */
          return -1;
        }   
        else if(this.mass() < tmp.mass())
        {
          /* текущее vtymit полученного */
          return 1;
        }
        /* текущее равно полученному */
        return 0;  
      }
      
}
Добавлено через 4 минуты
Класс Vessel_straight (сосуд с прямыми стенками)

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
package MyTask;
 
public class Vessel_straight extends Vessel {
    
    String sideType = "straight";
        
    Vessel_straight(double a, double b, double h, double a1, double b1, double h1,
            String crossSectionType, String liqType){
        super(a, b, h, a1, b1, h1, crossSectionType, liqType);
    }
    
    public double Square_bottom()
    {
            if (crossSectionType == "circle"){
                squareBottom = a * a * Math.PI;
            }else if (crossSectionType == "ellipse"){
                squareBottom = a * b * Math.PI;
            }else if (crossSectionType == "foursquare"){
                squareBottom = a * a;
            }else if (crossSectionType == "rectangle"){
                squareBottom = a * b;
            }else if (crossSectionType == "trapezium"){
                squareBottom = (a + b) * (h/2);
            }else if (crossSectionType == "hexagon"){
                squareBottom = a * a * Math.sqrt(27)/2;
            }else{
                squareBottom = -1;
            }   
            return squareBottom;    
        }
                
    public double Square_top()
    {
        squareTop = squareBottom;
        return squareTop;
        }               
    
    public double Volume ()
    {
        if (squareBottom == -1 || squareTop == -1){
            vol = -1;
        }else
            vol = squareBottom * height;
        return vol;     
    }
 
    @Override
    public String sideType_ID()
    {
        String sideType_ID = sideType;
        return sideType_ID;
    }
    
}
Класс Vessel_slope (сосуд с наклонными стенками)

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
package MyTask;
 
public class Vessel_slope extends Vessel {
    
    String sideType = "slope";
 
    Vessel_slope(double a, double b, double h, double a1, double b1, double h1, String crossSectionType,
            String liqType)
    {
        super(a, b, h, a1, b1, h1, crossSectionType, liqType);
        }
 
    @Override
    public double Square_bottom() {
            if (crossSectionType != "ellipse" && crossSectionType != "rectangle")
            {
                if (crossSectionType == "circle"){
                    squareBottom = a * a * Math.PI;
                }else if (crossSectionType == "ellipse"){
                    squareBottom = a * b * Math.PI;
                }else if (crossSectionType == "foursquare"){
                    squareBottom = a * a;
                }else if (crossSectionType == "rectangle"){
                    squareBottom = a * b;
                }else if (crossSectionType == "trapezium"){
                    squareBottom = (a + b) * (h/2);
                }else if (crossSectionType == "hexagon"){
                    squareBottom = a * a * Math.sqrt(27)/2;
                }   
            }else{
                squareBottom = -1;
            }
            return squareBottom;
        }
 
    @Override
    public double Square_top()
    {
            if (crossSectionType != "ellipse" && crossSectionType != "rectangle")
            {
                if (crossSectionType == "circle"){
                    squareTop = a1 * a1 * Math.PI;
                }else if (crossSectionType == "ellipse"){
                    squareTop = a1 * b1 * Math.PI;
                }else if (crossSectionType == "foursquare"){
                    squareTop = a1 * a1;
                }else if (crossSectionType == "rectangle"){
                    squareTop = a1 * b1;
                }else if (crossSectionType == "trapezium"){
                    squareTop = (a1 + b1) * (h1/2);
                }else if (crossSectionType == "hexagon"){
                    squareTop = a1 * a1 * Math.sqrt(27)/2;
                }
            }
            else
            {
                squareTop = -1;
            }
            if (squareBottom > squareTop){
                squareTop = -1;
            }
            return squareTop;
        }
 
    @Override
    public double Volume()
    {
        if (squareBottom == -1 || squareTop == -1)
        {
            vol = -1;
            }
        else
                vol = ((squareBottom + Math.sqrt(squareBottom * squareTop) + squareTop) * height/3);
        return vol;     
    }
 
    @Override
    public String sideType_ID()
    {
        String sideType_ID = sideType;
        return sideType_ID;     
    }
 
}
Класс Liquors (набор жидкостей, вернее их плотностей)

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
package MyTask;
 
public class Liquors {
    
    String liqType;
    int den;
    
    String licquors[] = {"gasoline",
                        "kerosene",
                        "oil"};
    
    public int liqourDensity(String liqType){
        
        for(int i=0; i<licquors.length; i++){
            
            if (liqType == licquors[0]){
                den = 740;
                }
            else if (liqType == licquors[1]){
                den = 820;
                }
            else if (liqType == licquors[2]){
                den = 910;
                }
            }
        return den;
    }
    
}
Исполняемый класс Execute (по-сути, в нем исполняется задание по заполнению сосудов, поиску и сортировке)

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
package MyTask;
 
import java.util.Arrays;
 
public class Execute {
        
    public static void main(String[] args) {
        
        // Создадим набор емкостей, инициализировав исходные данные
        // через конструкторы соответствующих классов
        
        Vessel_straight V1 = new Vessel_straight(0.3, 0, 0, 0, 0, 0, "circle", "gasoline");
        Vessel_straight V2 = new Vessel_straight(0.5, 0.3, 0, 0, 0, 0, "ellipse", "kerosene");
        Vessel_straight V3 = new Vessel_straight(0.4, 0, 0, 0, 0, 0, "foursquare", "oil");
        Vessel_straight V4 = new Vessel_straight(0.3, 0.2, 0, 0, 0, 0, "rectangle", "gasoline");
        Vessel_straight V5 = new Vessel_straight(0.5, 0.3, 0.2, 0, 0, 0, "trapezium", "kerosene");
        Vessel_straight V6 = new Vessel_straight(0.4, 0, 0, 0, 0, 0, "hexagon", "oil");
        Vessel_slope V7 = new Vessel_slope(0.2, 0, 0, 0.3, 0, 0, "circle", "gasoline");
        Vessel_slope V8 = new Vessel_slope(0.3, 0, 0, 0.4, 0, 0, "foursquare", "kerosene");
        Vessel_slope V9 = new Vessel_slope(0.4, 0.3, 0.3, 0.5, 0.3, 0.4, "trapezium", "oil");
        Vessel_slope V10 = new Vessel_slope(0.3, 0, 0, 0.4, 0, 0, "hexagon", "gasoline");
 
        // Поместим имеющийся набор емкостей в массив
        
        int size = 10;
        Vessel Vessel_set[] = new Vessel[size];
 
        Vessel_set[0] = V1;
        Vessel_set[1] = V2;
        Vessel_set[2] = V3;
        Vessel_set[3] = V4;
        Vessel_set[4] = V5;
        Vessel_set[5] = V6;
        Vessel_set[6] = V7;
        Vessel_set[7] = V8;
        Vessel_set[8] = V9;
        Vessel_set[9] = V10;
    
        // Участок кода, скрытый под примечанием, позволяет вывести на консоль исходный
        // массив (т.е. таблицу параметров сосудов в том порядке, в котором они
        // расположены в исходном массиве). Не реализован, поскольку нет задания на вывод
        // в консоль исходных параметров
        
        //System.out.println("Original list:");
        //for (int i=0; i<Vessel_set.length; i++)
        //{
        //  double S1 = Math.ceil(Vessel_set[i].Square_bottom()*100)/100;
        //  double S2 = Math.ceil(Vessel_set[i].Square_top()*100)/100;
        //  double V = Math.ceil(Vessel_set[i].Volume()*100)/100;
        //  double m = Math.ceil(Vessel_set[i].mass()*100)/100;
        //  System.out.println((i+1) + " "
        //                           + "Cross-section type: " + Vessel_set[i].crossSectionType
        //                           + "; parameters (m): a = " + Vessel_set[i].a
        //                           + "; b = " + Vessel_set[i].b + "; h = " + Vessel_set[i].h
        //                           + "; a1 = " + Vessel_set[i].a1
        //                           + "; b1 = " + Vessel_set[i].b1 + "; h1 = " + Vessel_set[i].h1
        //                           + "; side type: " + Vessel_set[i].sideType_ID()
        //                           + "; bottom square (m2) = " + S1
        //                           + "; top square (m2) = " + S2
        //                           + "; volume (m3) = " + V
        //                           + "; liquor type: " + Vessel_set[i].liqType
        //                           + "; liquor mass (kg) = " + m);
        //}
        
        //System.out.println(" ");
        
        // Отсортируем массив по убыванию массы жидкости, залитой в емкость      
        Arrays.sort(Vessel_set);
        
        // Распечатаем сортированный список        
        System.out.println("Sorted (by mass) list:");
          for(int i = 0; i < Vessel_set.length; i++)
          {
                double S1 = Math.ceil(Vessel_set[i].Square_bottom()*100)/100;
                double S2 = Math.ceil(Vessel_set[i].Square_top()*100)/100;
                double V = Math.ceil(Vessel_set[i].Volume()*100)/100;
                double m = Math.ceil(Vessel_set[i].mass()*100)/100;
                System.out.println((i+1) + " "
                                         + "Cross-section type: " + Vessel_set[i].crossSectionType
                                         + "; parameters (m): a = " + Vessel_set[i].a
                                         + "; b = " + Vessel_set[i].b + "; h = " + Vessel_set[i].h
                                         + "; a1 = " + Vessel_set[i].a1
                                         + "; b1 = " + Vessel_set[i].b1 + "; h1 = " + Vessel_set[i].h1
                                         + "; side type: " + Vessel_set[i].sideType_ID()
                                         + "; bottom square (m2) = " + S1
                                         + "; top square (m2) = " + S2
                                         + "; volume (m3) = " + V
                                         + "; liquor type: " + Vessel_set[i].liqType
                                         + "; liquor mass (kg) = " + m);
            }
          
          System.out.println(" ");
          
          double additional_m = Vessel_set[0].mass(); // Добавим дополнительную переменную,
                                                      // начальное значение которой приравняем
                                                      // к массе 1-го элемента массива вне зависимости
                                                      // от жидкости, залитой в данный сосуд
          for (int i = 0; i<Vessel_set.length; i++)
          {
               if (Vessel_set[i].liqType == "gasoline" && Vessel_set[i].mass() < additional_m)
               {
                   additional_m = Math.ceil(Vessel_set[i].mass()*100)/100;
               }
               else
                   continue;
               }              
          System.out.println(additional_m + " kg is the minimal mass of gasoline in current vessel set");
          
    }
        
}
Заранее спасибо за рецензию.

Добавлено через 2 минуты
Есть такая ссылка на решение этой задачи: http://javatalks.ru/topics/33966.
Но мне кажется, что там не реализована полностью вся задача, и, кроме того, нельзя самому задать габариты сосудов.
0
Эксперт Java
2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
22.09.2015, 16:01 4
Цитата Сообщение от Noegon Посмотреть сообщение
рошу посмотреть одним опытным глазом
читать много кода лень поэтому внимательно не смотрел

Почитайте про Java naming conventions
У вас есть одинаковый код в некоторых местах. Этого недолжно быть
Давайте переменным осмысленные имена
Используйте перечисления где это уместно вместо строк

Насчет логики и функционала ничего не скажу т.к не запускал.

Добавлено через 1 минуту
Цитата Сообщение от Noegon Посмотреть сообщение
Есть такая ссылка на решение этой задачи: http://javatalks.ru/topics/33966.
там решение намного ближе к ООП чем у вас. Посмотрите что можно оттуда перенять в вашу программу.
0
0 / 0 / 0
Регистрация: 16.04.2015
Сообщений: 4
22.09.2015, 16:10  [ТС] 5
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
У вас есть одинаковый код в некоторых местах. Этого недолжно быть
Спасибо... Хм. Ладно, буду копать дальше. Т.е., я так понимаю, что участки кода, выполняющие одну и ту же функцию, следует организовывать в методы, и вызывать впоследствии код из метода?

Добавлено через 56 секунд
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Используйте перечисления где это уместно вместо строк
Не совсем понял смысл фразы. Если можете - поясните на примере, или дайте ссылку, где можно почитать.

Добавлено через 1 минуту
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
там решение намного ближе к ООП чем у вас. Посмотрите что можно оттуда перенять в вашу программу.
Похоже, я пока далек от понимания, как правильно применять ООП на практике, поскольку тот код выглядит для меня малопонятным. Но спасибо, буду знать куда двигаться.
0
Эксперт Java
2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
22.09.2015, 16:14 6
Цитата Сообщение от Noegon Посмотреть сообщение
Если можете - поясните на примере
Java
1
2
3
    String licquors[] = {"gasoline",
                        "kerosene",
                        "oil"};
должен быть не массивом а enum

circle, ellipse и.т.д тоже лучше сделать enum, а если у них есть свой функционал, то может и отдельным классом.
0
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
24.09.2015, 11:13 7
Цитата Сообщение от Noegon Посмотреть сообщение
даже почти решил задачу!
тем более, Вам будет интересно глянуть на мою реализацию Вашей задачи, для прямых стенок.
Исключения и защиту от "дурака", т.е. различные проверки не делал.
Проект сделан в NetBeans. Некоторые, не тривиальные моменты содержат комменты)).
Вложения
Тип файла: zip CybForumOopValumTanks.zip (31.3 Кб, 17 просмотров)
0
0 / 0 / 0
Регистрация: 16.04.2015
Сообщений: 4
24.09.2015, 13:19  [ТС] 8
Цитата Сообщение от Aviz__ Посмотреть сообщение
тем более, Вам будет интересно глянуть на мою реализацию Вашей задачи, для прямых стенок.
Исключения и защиту от "дурака", т.е. различные проверки не делал.
Проект сделан в NetBeans. Некоторые, не тривиальные моменты содержат комменты)).
Спасибо, гляну. Хотя я уже решил, и отправил преподу). Но все равно благодарю!
0
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
24.09.2015, 13:38 9
Наверное я вас огорчу, но это я делал не для вас, а потому, что мне было интересно
И вам спасибо.
0
24.09.2015, 13:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2015, 13:38
Помогаю со студенческими работами здесь

Не могу прочитать структуру с файла
Доброго времени суток. Записываю структуру так template&lt;typename T&gt; bool SaveStruct(T mys,char...

Не могу присоединить структуру к функции
#include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;windows.h&gt; #include &lt;ctime&gt; #include &lt;istream&gt;...

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

структуру классов! не могу разобраться!!!
вопрос такой: _-Можно ли создавать, рисовать и удалять объекты не зная их конкретный тип и что для...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru