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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2010, 02:19   #1
ksenechka
 
Аватар для ksenechka
 
Регистрация: 13.05.2010
Сообщений: 5
По умолчанию VBA, массивы

помогите-плиз(
как в дремучем лесу:

1.У прилавка магазина выстроилась очередь из n покупателей. Время обслуживания i-того покупателя равно Ti (i =1, ...., n). Определить время Ci пребывания i-го покупателя в очереди.
2.В одномерном массиве с четным количеством элементов (2N) находятся координаты N точек плоскости. Они располагаются в следующем порядке: x1, y1, x2, y2, x3, y3 и т.д. Найти номера самых удаленных друг от друга точек и наименее удаленных друг от друга точек.
ksenechka вне форума Ответить с цитированием
Старый 21.05.2010, 05:56   #2
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Плутал 2 ч 15 мин... Вроде вышло.
Код:
Option Base 1 'начинает нумерацию массивов с 1 (а не с нуля, как по умолчанию)'
Option Explicit
Sub NearAndFar()
'выдаёт номера точек плоскости, которые: 1) наиболее близки; 2) наиболее далеки'

Dim max, min, x, y, x1, y1, N, K, Nmin, Kmin, Nmax, Kmax, tochka() As Variant, dlina As Double
max = 0: min = 2000000000000# 'берём для начала нулевой максимум и "нереальный" минимум'
tochka = Array( _
0, 0, _
-8, 0, _
0, 8, _
0, 0) 'массив координат (можно менять, добавлять новые)'
    
    N = (1 + UBound(tochka) - LBound(tochka)) \ 2 'количество точек на плоскости'
    K = 2 * N - 1 'номер последней в массиве абсциссы (соответственно, 2*N - номер последней ординаты)'
    
    For x = 1 To 2 * N - 3 Step 2
        y = x + 1                       'взяли энную точку'
        
            For x1 = x + 2 To K Step 2
                y1 = x1 + 1             'взяли координаты следующей (K-й) точки (из массива координат)'
                
                dlina = Sqr((tochka(x) - tochka(x1)) ^ 2 + (tochka(y) - tochka(y1)) ^ 2)
                'расстояние между точками, соответствующими парам элементов массива (x; y) и (x1; y1)'
                
                If dlina < min Then min = dlina: Nmin = (x + 1) / 2: Kmin = y1 / 2
                If dlina > max Then max = dlina: Nmax = (x + 1) / 2: Kmax = y1 / 2
            Next
    Next
    
MsgBox "1) номера точек с наименьшим удалением: " & Nmin & " и " & Kmin & ";" & vbCr & _
vbCr & "2) номера точек с наибольшим удалением: " & Nmax & " и " & Kmax & ".", vbInformation
End Sub
Ну вот, начёл недочёт! Искомые номера (Nmin, Kmin, Nmax, Kmax) надо бы объявить как массивы:
Код:
Dim Nmin(), Kmin(), Nmax(), Kmax()
и в них накапливать номера точек, удалённых друг от друга так же, как уже найденные.

Т. е. по-хорошему, в идеале, ответ звучал бы так:
...2) номера точек с наибольшим удалением: 1 и 5, 1 и 6, 4 и 6, 9 и 199.
Но это щас не потяну!

Последний раз редактировалось Sasha_Smirnov; 21.05.2010 в 07:19. Причина: стремление к идеалу...
Sasha_Smirnov вне форума Ответить с цитированием
Старый 21.05.2010, 11:52   #3
ksenechka
 
Аватар для ksenechka
 
Регистрация: 13.05.2010
Сообщений: 5
По умолчанию

О, боже, спасибо огромнейшее))))!!!!!))))
ksenechka вне форума Ответить с цитированием
Старый 21.05.2010, 20:13   #4
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Есть!

Ещё 4 ч — и мы у цели! (Помнится, в институте на ТАКОЕ месяца два убивалось...)
Код:
Option Base 1
Option Explicit
Sub NearAndFar() 'выдаёт номера точек плоскости: 1) наиболее близких... 2) наиболее далеких друг от друга'
Dim max As Single, min As Single, x As Byte, y As Byte, x1 As Byte, y1 As Byte, MiNpairs As String, MaXpairs As String
'x, y, x1, y1 не координаты точек! - а их номера в заданном (испытателем программы) массиве Tochka'
Dim N As Byte, K As Byte, i As Byte, j As Byte, КоличествоБлизкихПар As Byte, КоличествоДалекихПар As Byte
Dim Tochka(), dlina As Single

min = 2000000000: max = -1 'берём для начала "нереальный" минимум и нереальный максимум (-1)'

Tochka = Array( _
0, 0, _
-1, -2, _
-8, 0, _
-1, -2, _
8, 0, _
0, 0, _
8, 0) 'массив координат (можно менять, добавлять новые, удалять (попарно))'

If UBound(Tochka) < 4 Then MsgBox "Массив мал!": Exit Sub

ReDim Nmin(1 To UBound(Tochka)) As Byte, Kmin(1 To UBound(Tochka)) As Byte 'вспомогательные массивы'
ReDim Nmax(1 To UBound(Tochka)) As Byte, Kmax(1 To UBound(Tochka)) As Byte '(для удобства вывода ответа)'
i = 1: j = 1 'их начальные индексы'
    
N = (1 + UBound(Tochka) - LBound(Tochka)) \ 2 'количество точек, представленных в массиве'
K = 2 * N - 1 'номер последней в массиве абсциссы (соответственно, 2N - номер последней ординаты)'

For x = 1 To 2 * N - 3 Step 2
    y = x + 1                       'взяли точку с номером (x + 1) / 2'
    
        For x1 = x + 2 To K Step 2
            y1 = x1 + 1             'взяли координаты следующей точки (из массива координат)'
            
            dlina = Sqr((Tochka(x) - Tochka(x1)) ^ 2 + (Tochka(y) - Tochka(y1)) ^ 2)
            'расстояние между точками, соответствующими парам элементов массива (x; y) и (x1; y1)'
            
            If dlina = min Then i = i + 1: Nmin(i) = (x + 1) / 2: Kmin(i) = (x1 + 1) / 2
            If dlina < min Then i = 1: min = dlina: Nmin(1) = (x + 1) / 2: Kmin(i) = (x1 + 1) / 2
            
            If dlina = max Then j = j + 1: Nmax(j) = (x + 1) / 2: Kmax(j) = (x1 + 1) / 2
            If dlina > max Then j = 1: max = dlina: Nmax(1) = (x + 1) / 2: Kmax(j) = (x1 + 1) / 2
        Next
Next

КоличествоБлизкихПар = i
КоличествоДалекихПар = j

        MiNpairs = Nmin(1) & " и " & Kmin(1)
            For i = 2 To КоличествоБлизкихПар
            MiNpairs = MiNpairs & ", " & Nmin(i) & " и " & Kmin(i)
            Next
        
        MaXpairs = Nmax(1) & " и " & Kmax(1)
            For j = 2 To КоличествоДалекихПар
            MaXpairs = MaXpairs & ", " & Nmax(j) & " и " & Kmax(j)
            Next
        
        MsgBox "1) номера точек с наименьшим удалением: " & MiNpairs & ".", vbInformation
        
        MsgBox "2) номера точек с наибольшим удалением: " & MaXpairs & ".", vbInformation
End Sub
Изображения
Тип файла: png НаРаз!.png (6.0 Кб, 84 просмотров)

Последний раз редактировалось Sasha_Smirnov; 22.05.2010 в 20:12.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 22.05.2010, 20:14   #5
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Благие пожелания

А ещё здóрово было бы увидеть испытать это на Си! Или в Паскале...
Sasha_Smirnov вне форума Ответить с цитированием
Старый 23.05.2010, 11:24   #6
ksenechka
 
Аватар для ksenechka
 
Регистрация: 13.05.2010
Сообщений: 5
По умолчанию

еще раз спасибо, спасибо, что удилили такое кол-во времени)))))
ksenechka вне форума Ответить с цитированием
Старый 24.05.2010, 16:47   #7
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Цитата:
Сообщение от Sasha_Smirnov Посмотреть сообщение
...Или в Паскале...
Например, декартовы координаты
Код:
Tochka = Array(-1, 0, 4, 0, 3, -1, 3, 0, 0, 3, 0, -1)
должны давать следующий результат (см. приложенные рисунки). Текст сообщения желательно не упрощать.
Изображения
Тип файла: png ((-1,0),(4,0),(3,-1),(3,0),(0,3),(0,-1))_msg1.png (6.0 Кб, 67 просмотров)
Тип файла: png ((-1,0),(4,0),(3,-1),(3,0),(0,3),(0,-1))_msg2.png (6.2 Кб, 70 просмотров)
Sasha_Smirnov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
МАССИВЫ В VBA ACCESS ALYSA Microsoft Office Access 1 27.04.2010 06:10
МАССИВЫ В VBA ACCESS ALYSA Помощь студентам 0 20.04.2010 17:15
массивы в VBA ALYSA Помощь студентам 0 19.04.2010 18:49
VBA массивы jerniko Помощь студентам 4 26.01.2010 19:46
Двухмерные массивы VBA Nataly1992 Помощь студентам 26 30.12.2009 05:00