biketrials.ru

biketrials.ru (http://biketrials.ru/live/index.php)
-   Забор (http://biketrials.ru/live/forumdisplay.php?f=13)
-   -   Помогите решить задачу используя Excell (http://biketrials.ru/live/showthread.php?t=30788)

Grisha_T34 04.06.2010 12:18

Помогите решить задачу используя Excell
 
Суть такая: Нужно посчитать число зубьев на 4 зубчатых колесах исходя из того что мы знаем их передаточное соотношение. Другими словами (извесное число)=(a/b)*(c/d) числа a b c d могут выбираться из ряда данных 23 24 25 30 35 36 37......45.....72.....79.......(если нужно могу написать весь ряд чисел) одно условие a
например известно чило 0,2927 нужно подобрать a b c d (45/72)*(37/79)=0,2927

rastayak 04.06.2010 12:59

Для станка с ПУ что-ли?

Grisha_T34 04.06.2010 13:18

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

rastayak 04.06.2010 13:28

В общем там такая тема может быть, что там два вала на станке - один делает за весь цикл один оборот(на нем вешаются разные инструменты и операции(подача, отрезание и так далее)), другой - "много" оборотов, так вот и там есть какой-то редуктор, он передачу понижает или повышает в два раза, я уже не помню точно. В общем с расчетом количества зубцов там не так все просто, как на первый взгляд кажется, ты лучше подробнее узнай на всякий случай.
Не револьверный станок случаем?
Про ПУ - он без компа может быть.

Grisha_T34 04.06.2010 13:45

Я же написал что нужно получить. все условия даны остальное не колышит.
нужно подобрать числа чтобы получилось заданное число.

Отбросим то что это будет станок, пусть это просто задачка

egblob 04.06.2010 14:24

Могу на сях полным перебором быстренько решить, если весь ряд чисел дашь.
В экселе хз, может быть скрипт писать надо. Ваще, эту задачу легко можно было бы свести к задаче целочисленного программирования, если бы в ряде все числа шли с разницей в 1.
Про целочисленное программирование смотреть симплекс-метод и метод Гомори.

Grisha_T34 04.06.2010 14:31

ммм. а то что ты на си сделаешь как потом можно будет использовать??? (извесное число бывает разным)=(a/b)*(c/d)

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

вот числа 23 24 25(2шт) 30 35 36 37 40 41 43 45 47 48 50 53 54(2шт) 55 58 59 60 61 62 65 66 67 70 71 72 73 74 75 78 79 80 81 83 84 85 86 89 90 92 94 97 99 100

числа не доджны повторяться в одном выражении за исключением тех которых подписано что 2 шт

ну и a

Grisha_T34 04.06.2010 14:35

если напряг то не делай

egblob 04.06.2010 15:07

Цитата:

Сообщение от Grisha_T34 (Сообщение 474865)
ммм. а то что ты на си сделаешь как потом можно будет использовать??? (извесное число бывает разным)=(a/b)*(c/d)

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

вот числа 23 24 25(2шт) 30 35 36 37 40 41 43 45 47 48 50 53 54(2шт) 55 58 59 60 61 62 65 66 67 70 71 72 73 74 75 78 79 80 81 83 84 85 86 89 90 92 94 97 99 100

числа не доджны повторяться в одном выражении за исключением тех которых подписано что 2 шт

ну и a
Ну прога будет, задаешь туда число, она тебе лучший вариант. 5-й знак не проблема, если такое сочетание в принципе возможно. Будет выбираться самое близкое значение.
Щас наколбашу.)

egblob 04.06.2010 16:50

Вот такой код. Без особых хитростей. Любой компилятор должен собрать.
Gear gears[] = {{23, 1}, {24, 1},...} - это, как можно догадаться, число зубов и количество таких колес. Если захочешь добавить еще элементов, следи, чтобы числа зубов шли по возрастанию, это важно.
Различия с твоим примером в 7 знаке после запятой вылезли из-за ошибок округления похоже, быстро победить не получилось че-то.
Особо не тестил, но вроде как работает.

Код:

#include
#include
#include

struct Gear
{
    int teeth;
    int amount;
};


int main(int argc, char *argv[])
{
    Gear gears[] =
    {{23, 1}, {24, 1}, {25, 2}, {30, 1}, {35, 1}, {36, 1}, {37, 1}, {40, 1}, {41, 1}, {43, 1},
    {45, 1}, {47, 1}, {48, 1}, {50, 1}, {53, 1}, {54, 2}, {55, 1}, {58, 1}, {59, 1}, {60, 1},
    {61, 1}, {62, 1}, {65, 1}, {66, 1}, {67, 1}, {70, 1}, {71, 1}, {72, 1}, {73, 1}, {74, 1},
    {75, 1}, {78, 1}, {79, 1}, {80, 1}, {81, 1}, {83, 1}, {84, 1}, {85, 1}, {86, 1}, {89, 1},
    {90, 1}, {92, 1}, {94, 1}, {97, 1}, {99, 1}, {100, 1}};

    double dif = 100.0;
    double val;
    int res[4];

    std::cout << "Enter value ";
    std::cin >> val;

    for (int a = 0; a < sizeof(gears)/sizeof(Gear); a++)
    {
        gears[a].amount--;
        for (int b = a + 1; b < sizeof(gears)/sizeof(Gear); b++)
        {
            if(!gears[b].amount)
                continue;
            gears[b].amount--;
            for (int c = 0; c < sizeof(gears)/sizeof(Gear); c++)
            {
                if(!gears[c].amount)
                    continue;
                gears[c].amount--;
                for (int d =  c + 1; d < sizeof(gears)/sizeof(Gear); d++)
                {
                    if(!gears[d].amount)
                        continue;
                    double buf = fabs((double)gears[a].teeth / gears[b].teeth * gears[c].teeth / gears[d].teeth - val);
                    if(dif > buf)
                    {
                        dif = buf;
                        res[0] = gears[a].teeth;
                        res[1] = gears[b].teeth;
                        res[2] = gears[c].teeth;
                        res[3] = gears[d].teeth;
                    }
                }
                gears[c].amount++;
            }
            gears[b].amount++;
        }
        gears[a].amount++;
    }

    std::cout << "a = " << res[0] << "; b = " << res[1] << "; c = " << res[2] << "; d = " << res[3] << "; Ratio = " << (double)res[0]/res[1]*res[2]/res[3] << ".";

    getch();
}


Grisha_T34 04.06.2010 18:47

Ну респектище тебе огроменное!!!!
а можно по-подробнее как юзать этот код, а то я ни бум бум даже где компилятор брать

egblob 04.06.2010 19:03

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

Kефир 04.06.2010 20:12

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

egblob 04.06.2010 20:45

Вложений: 1
=) Да вспоминать надо, с ходу не напишу. Мож кто возьмется тут переделать. ;)

Вот. Попробуй запусти, оно может еще каких-нить дллок попросить, но вроде и так должно работать.

Grisha_T34 05.06.2010 21:19

заработало...
только вот похоже ты меня не правильно понял.
например известно чило 0,2927 нужно подобрать a b c d (45/72)*(37/79)=0,2927

чило 0,2927 назовем его Х меняется, это входное условие задачи, а у тебя оно в

Enter value 0,2927 (я ввел)
a = 23; b = 99; c = 24; d = 100; Ratio = 0.0557576. (a/b)*(c/d) = 0.0557576 а должно равняться 0,2927

egblob 05.06.2010 22:53

Очень странно, у меня выдает 35, 83, 59, 85. Может ты в качестве десятичного разделителя запятую используешь? Попробуй точку. С запятой вводится 0, а остальное считается как другое число.

Grisha_T34 06.06.2010 03:29

Цитата:

Сообщение от egblob (Сообщение 475111)
Очень странно, у меня выдает 35, 83, 59, 85. Может ты в качестве десятичного разделителя запятую используешь? Попробуй точку. С запятой вводится 0, а остальное считается как другое число.

да, точняк мой косяк, с точкой все супер!!!!

Мэн реально тебе респект!!!
даже не знаю как благодарить

Grisha_T34 06.06.2010 04:20

еще просьба. можешь добавить копирайт в программу свою
мол
программа написано твое ФИО по просьбе Киптикова Григория Владимировича

egblob 06.06.2010 10:36

Цитата:

Сообщение от Grisha_T34 (Сообщение 475214)
еще просьба. можешь добавить копирайт в программу свою
мол
программа написано твое ФИО по просьбе Киптикова Григория Владимировича

Не вопрос.) Вечером сделаю тебе такую версию. =)

Grisha_T34 06.06.2010 22:25

ну ваще будет суперско!!!


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

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot