IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   задача по сортировке.помогите (http://www.imho.ws/showthread.php?t=143912)

1000tur 09.06.2010 11:46

задача по сортировке.помогите
 
Вложений: 1
доброго времени суток. помогите пожалуйста мне, дурачку, решить задачу. суть: имеется 5-ти ступенчатый карданный вал и картер к нему. между картером и валом 5 пар вкладышей-верхних и нижних. нужно автоматизировать подбор этих вкладышей, чтобы износ был минимальный (грубо говоря-чтобы в размер зазора между картером и валом идеально вписывался вкладыш). [если по рисунку-чтобы (для 1-й опоры вала) 3 и 4 идеально вписывались в зазор]. верхний и нижний - разные массивы. размеры все вводим с клавы. в с++ или паскале. очень прошу,-выручите. обещаю выучить как сдам. чес слово
ps:для того чтобы было понятно-есть куча вкладышей. как подобрать именно тот, чтобы он идеально подходил куда нужно.размеры брать примерные,исходя из чертежа. мне главное понять сам алгоритм сортировки(вводим все данные и программа выбирает именно тот вкладыш, который подходит в зазор).заранее благодарен

BorLase 10.06.2010 13:18

сортировки там и близко нет... короче, лови код (на Java, правда, но перевести в С++ проблем не будет), разбирайся...

Код:

package test;

public class Task {
        final int SIZE = 5;

        float[] karters = { 100, 102, 103, 101, 105 };
        float[] vals = { 95, 92, 90, 98, 90 };
        float[] vtulkaV = { 2, 5, 3, 7, 1 };
        float[] vtulkaN = { 4, 2, 3, 6, 1 };

        float[][] matrix = new float[SIZE][SIZE];

        public static void main(String[] args) {
                Task t = new Task();

                t.init();

                float min;
                int minV, minN;
                for (int i = 0; i < t.SIZE; i++) {
                        min = Float.MAX_VALUE;
                        minV = minN = -1;

                        float zazor = t.karters[i] - t.vals[i];

                        for (int iV = 0; iV < t.SIZE; iV++)
                                for (int iN = 0; iN < t.SIZE; iN++)
                                        if (zazor - t.matrix[iV][iN] >= 0 && zazor - t.matrix[iV][iN] < min) {
                                                min = zazor - t.matrix[iV][iN];
                                                minV = iV;
                                                minN = iN;
                                        }

                        if (min != Float.MAX_VALUE) {
                                System.out.println(
                                        i +
                                        ". Картер = " + t.karters[i] +
                                        ", вал = " + t.vals[i] +
                                        ", лучшая пара (В/Н): " + minV + "/" + minN + "(" + t.vtulkaV[minV] + "+" + t.vtulkaN[minN] + ")" +
                                        ", зазор = " + min);
                        }
                }
        }

        public void init() {
                for (int iV = 0; iV < SIZE; iV++)
                        for (int iN = 0; iN < SIZE; iN++)
                                matrix[iV][iN] = vtulkaV[iV] + vtulkaN[iN];
        }
}

Результат:
Код:

0. Картер = 100.0, вал = 95.0, лучшая пара (В/Н): 0/2(2.0+3.0), зазор = 0.0
1. Картер = 102.0, вал = 92.0, лучшая пара (В/Н): 3/2(7.0+3.0), зазор = 0.0
2. Картер = 103.0, вал = 90.0, лучшая пара (В/Н): 3/3(7.0+6.0), зазор = 0.0
3. Картер = 101.0, вал = 98.0, лучшая пара (В/Н): 0/4(2.0+1.0), зазор = 0.0
4. Картер = 105.0, вал = 90.0, лучшая пара (В/Н): 3/3(7.0+6.0), зазор = 2.0


1000tur 10.06.2010 17:00

BorLase, большое человеческое спасибо. единственный вопрос-если я вкладышей введу не 5, а больше-программа работать будет?

добавлено через 1 минуту
а вот еще-когда выдает ответ по лучшей паре, как учесть что один вкладыш можно только один раз использовать, т.е. как исключить повторения? и почему при расчете зазора мы суммируем верхний и нижний вкладыши,один же устанавливается наверх, другой вниз, т.е. если зазор 13 то при установке вкладыша верхнего 7 и ниженего 6,-зазор будет 6 и 7 сответственно? заранее благодарен

BorLase 10.06.2010 19:12

Цитата:

Сообщение от 1000tur (Сообщение 1712414)
если я вкладышей введу не 5, а больше-программа работать будет?

работать будет, но оперировать будет только первыми пятью ;)

т.е. если количество вкладышей будет произвольным - тогда тебе понадобятся отдельные константы для циклов и таблицы matrix (а не единая t.SIZE).
Код:

for (int iV = 0; iV < t.SIZE; iV++)
    for (int iN = 0; iN < t.SIZE; iN++)

в принципе, ничто не мешает тебе иметь 20 верхних и 50 нижних, к примеру

Цитата:

а вот еще-когда выдает ответ по лучшей паре, как учесть что один вкладыш можно только один раз использовать, т.е. как исключить повторения?
самый простой способ - после нахождения наилучшего сочетания использованным вкладышам присвоить размер Float.MAX_VALUE - этим ты гарантированно исключишь их из дальнейшего использования

Цитата:

и почему при расчете зазора мы суммируем верхний и нижний вкладыши,один же устанавливается наверх, другой вниз, т.е. если зазор 13 то при установке вкладыша верхнего 7 и ниженего 6,-зазор будет 6 и 7 сответственно? заранее благодарен
или я как-то не так понял начальную задачу, или одно из двух :)

1000tur 11.06.2010 11:26

проблема в том что установливаем вкладыш вверх и вниз, почему их зазор суммируется как будто они установлены вместе

BorLase 11.06.2010 11:53

Цитата:

Сообщение от 1000tur (Сообщение 1712481)
почему их зазор суммируется

почему суммируется "их зазор"? суммируется их толщина

===============

насколько я понимаю - есть картер с дыркой, к примеру, 15; вал - 10.

вкладыши устанавливаются вокруг вала - один сверху, другой снизу

мы должны подобрать пару вкладышей так, чтобы зазор был нулевым - т.е. толщина верхнего + нижнего должны давать в сумме 5

собственно, именно это задача и делает

EvroStandart 11.06.2010 12:02

Если сверху и снизу только по одному вкладышу, тогда
void init() тебе вообще ненужен.

этот код убери
for (int iV = 0; iV < t.SIZE; iV++)
...
minV = iV;
minN = iN;
}

заместо него поставь этот :
for (int iV = 0; iV < t.SIZE; iV++)
if (zazor - t.vtulkaV[iV] >= 0 && zazor - t.vtulkaV[iV] < min) {
min = zazor - t.vtulkaV[iV];
minV = iV;
}

for (int iN = 0; iN < t.SIZE; iN++)
if (zazor - t.vtulkaN[iN] >= 0 && zazor - t.vtulkaN[iN] < min2) {
min2 = zazor - t.vtulkaN[iN];
minN = iN;
}

min2 определить также как min. Код не проверял но должно получиться примерно так.

Это если суммировать ненужно.

BorLase 11.06.2010 12:09

EvroStandart, ты забыл добавить еще выбор меньшего из min и min2

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


Часовой пояс GMT +4, время: 11:50.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.