Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2012, 20:03   #1
mas_stm
Новичок
Джуниор
 
Регистрация: 27.05.2012
Сообщений: 6
По умолчанию Поиск числа в массиве, операции с минимально отличающимися от заданного числами

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

Имеется два массива. Один состоит из двух столбцов, длинной в 51, где каждому значению поставлено в соответствие то значение, что находится на этой же строке.
Второй массив состоит так же из двух столбцов с такими же соответствиями левого значения правому, но количество этих значений 1000 и для удобства они расположены в столбцах по 100 значений, разделенных между каждой парой соответствующих значений пустым столбцом.

Из первого массива берется одно число, по выбору пользователя и во втором массиве ищется число, совпадающее с выбранным. Если таковое найдено - выводится окно с сообщением значения этого числа и значением, поставленным ему в соответствие.

Если такое число не найдено, то во всем массиве разыскиваются два числа максимально приближенных к заданному сверху и снизу (т.е минимально отличающееся в большую сторону и минимально отличающееся в меньшую сторону). Для удобства обозначим их a и b, а значения, поставленные им в соответствие k и m.

Из а вычитается b, обозначим с, из k вычитается m, обозначим d, затем с делится на d, обозначим как v

Вновь берется или a или b, в зависимости от того, какое максимально близко к первоначальному значению, выбранному пользователем. Вне зависимости от того, близко сверху или снизу.

Находится разница между выбранным числом и исходным, заданным пользователем. Эта разница умножается на v. Полученное число обозначим h

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

Полученное число выводится на экран.


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

Если возможно написать такой макрос - буду премного благодарен.
Заранее спасибо.
mas_stm вне форума Ответить с цитированием
Старый 27.05.2012, 20:06   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

небось интерполировать чего-то задумали?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 27.05.2012, 20:09   #3
mas_stm
Новичок
Джуниор
 
Регистрация: 27.05.2012
Сообщений: 6
По умолчанию

Нет, это система, рассчитывающая зависимость между сложностью вопросов в тесте, процентом правильных ответов и оценкой учащегося. Но коэффициенты, полученные при расчете теста, имеющего пятьдесят вопросов имеют небольшую погрешность, отсутствующую в таблице с тысячей значений. Вот и требуется эту погрешность устранить.
mas_stm вне форума Ответить с цитированием
Старый 27.05.2012, 20:21   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

обьяснено хорошо, но пример бы... что бы не париться потом, как то что тут напишут к своим данным прикрутить
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 27.05.2012, 20:47   #5
mas_stm
Новичок
Джуниор
 
Регистрация: 27.05.2012
Сообщений: 6
По умолчанию

Хорошо, завтра постараюсь достать реальный образец, над которым можно будет провести опыты))
mas_stm вне форума Ответить с цитированием
Старый 28.05.2012, 20:24   #6
mas_stm
Новичок
Джуниор
 
Регистрация: 27.05.2012
Сообщений: 6
По умолчанию Небольшие исправления и файлик

Результаты сравнения.

Действия программы.
1. На листе 2 прикрепленного файла пользователь выбирает ячейку, расположенную в ряду Н с 5 по 54 значения, запускает макрос. Значение выбранной ячейки, для удобства пояснения принципа работы программы, обозначим как P.
2. Программа ищет на листе 6, в ряду G с 3 по 52 строки значение, совпадающее с P, и, если такое найдено, то создается лист 7, на котором располагаются значения: A1 = «Pj» A2 = «βj(1505)» B1 = значению P, B2 = значению ячейки, располагающейся на листе 6 в той же строке, что и найденное значение P, но в столбце K. Иными словами ставящееся в соответствие с найденным значением.
3. Выводится текстовое сообщение: Искомое значение найдено. Расчет не проводился.
4. Если же значения, абсолютно соответствующего значению P на листе 6,в ряду G не найдено, то программа ищет в этом же ряду два значения, минимально отличающиеся от P. Одно значение, отличающееся в большую сторону, его обозначим как a, второе, минимально отличающееся из всех значений в меньшую сторону, его обозначим как b. Значение ячейки, находящейся в той же строке, что и а, но в столбце К, обозначим как k, значение ячейки, расположенной в той же строке, что и b, но в столбце K, обозначим как m.
5. Затем производится расчет: (a - b)/(k – m) = v
6. Вновь берется или a или b, в зависимости от того, какое ближе к P, исходному числу, вне зависимости от того, сверху или снизу. Допустим, это число а, тогда из а вычитается P и эта разница умножается на v. Обозначим как h.
7. Затем к числу, соответствующему числу a (если оно было максимально близко к искомому), или же к числу, соответствующему числу b (если оно было максимально близко к искомому) соответственно k и m прибавляется h. Обозначим за B.
8. Создается лист 7. Значения ячеек: A1 = «Pj» A2 = «βj(1505)» B1 = значению P, B2 = значению В. Выводится текстовое сообщение: « Был произведен расчет. Найденное значение βj(1505) = «значение В»

На этом программа завершает свою работу.


Можно ли вообще рассчитать такое? Если да - буду премного благодарен)
Вложения
Тип файла: rar Результаты сравнения.rar (357.6 Кб, 16 просмотров)
mas_stm вне форума Ответить с цитированием
Старый 28.05.2012, 23:31   #7
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Все по вашему алгоритму
Код:
Sub Start()
        Dim a As Double, b As Double, k As Double, m As Double, v As Double
        Dim XX, X() As Double, Y As Double, G As Double, H As Double
        Dim Sh As Worksheet
        G = ActiveCell
        XX = Sheets("Лист6").Range("G3:K52")
        ReDim X(0 To UBound(XX), 1 To 2)
        For n = 1 To UBound(X)
                X(n, 1) = XX(n, 1)
                X(n, 2) = XX(n, 5)
        Next
        SortArray X
        Set Sh = Sheets.Add(After:=Sheets(Sheets.Count))
        With Sh
                For n = 1 To UBound(X)
                        If X(n, 1) = G Then
                                .Range("A1") = "«Pj»"
                                .Range("A2") = "«bj(1505)»"
                                .Range("B1") = G
                                .Range("B2") = X(n, 2)
                                MsgBox " Искомое значение найдено. Расчет не проводился"
                                 Exit Sub
                        Else
                                If X(n - 1, 1) < G Then
                                        b = X(n - 1, 1)
                                        m = X(n - 1, 2)
                                End If
                                If X(n, 1) > G Then
                                        a = X(n, 1)
                                        k = X(n - 1, 2)
                                        If (k - m) = 0 Then m = m + 0.00000001
                                        v = (a - b) / (k - m)
                                        If Math.Abs(a - G) < Math.Abs(b - G) Then
                                                H = m + (a - G) * v
                                                .Range("A1") = "«Pj»"
                                                .Range("A2") = "«bj(1505)»"
                                                .Range("B1") = G
                                                .Range("B2") = H
                                               MsgBox "Был произведен расчет. Найденное значение βj(1505) =" & H
                                                 Exit Sub
                                        Else
                                                H = k + (G - b) * v
                                                .Range("A1") = "«Pj»"
                                                .Range("A2") = "«bj(1505)»"
                                                .Range("B1") = G
                                                .Range("B2") = H
                                                         MsgBox " Был произведен расчет. Найденное значение βj(1505) = " & H
                                                 Exit Sub
                                        End If
                                End If
                        End If
                Next
        End With
End Sub
Private Sub SortArray(ByRef a As Variant)
        Dim i As Long, j As Long
        Dim t As  Double, tt As Double

        For i = LBound(a) + 1 To UBound(a) - 1
                For j = i + 2 To UBound(a)
                        If a(i, 1) > a(j, 1) Then
                                t = a(i, 1): tt = a(i, 2)
                                a(i, 1) = a(j, 1): a(i, 2) = a(j, 2)
                                a(j, 1) = t: a(j, 2) = tt
                        End If
                Next j
        Next i
End Sub
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 30.05.2012, 16:22   #8
mas_stm
Новичок
Джуниор
 
Регистрация: 27.05.2012
Сообщений: 6
По умолчанию Спасибо!

Огромное спасибо! Ваш код себя полностью оправдал!
Скажите, на какой из Ваших кошельков Вам будет удобнее получить от меня небольшой подарок, за быстрое и своевременное решение?
mas_stm вне форума Ответить с цитированием
Старый 30.05.2012, 16:39   #9
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

На любой,который в подписи,на какой вам удобно.Если проживаете на Украине,то и на карту привата подойдет.
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 30.05.2012, 18:43   #10
mas_stm
Новичок
Джуниор
 
Регистрация: 27.05.2012
Сообщений: 6
По умолчанию

Хорошо, для меня самым удобным способом будет рублевый кошелек))
mas_stm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C + Assembler: Поиск наибольшего числа в массиве Arnezami Помощь студентам 1 05.02.2012 10:10
Поиск максимального по модулю числа в массиве ( Assembler ) Forversc Помощь студентам 3 30.01.2012 15:05
Операции с большими числами mrChester Общие вопросы C/C++ 4 08.12.2010 15:22
поиск определенного числа, в отсортированном массиве (с++) askerpro Общие вопросы C/C++ 7 29.04.2010 23:26
Поиск числа, большего заданного pirozho4ek Паскаль, Turbo Pascal, PascalABC.NET 5 21.05.2007 21:39