Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 1
Регистрация: 09.05.2012
Сообщений: 33
1

Нахождение максимального элемента массива, исправить код

02.06.2012, 22:03. Показов 2425. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Visual Basic
1
2
3
4
5
6
7
Public Sub Макс_элемент(A() As Single, n As Integer, m As Integer)
    Dim i As Integer
    m = 1
    For i = 1 To n
        If A(i) > A(m) Then m = i
    Next
End Sub

Помогите понять для чего мне нужны переменные i и m. и если можно написать комментарий к каждой строке
Вложения
Тип файла: xls Массивы.xls (98.0 Кб, 23 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2012, 22:03
Ответы с готовыми решениями:

Нахождение максимального элемента массива
Помогите, пожалуйста, составить программу на языке VBA, которая выводит максимальный ...

Нахождение максимального и минимального элемента массива
Нахождение максимального и минимального элемента массива. Найдите максимальный и минимальный...

Нахождение максимального элемента массива с определением его номера
Нахождение максимального элемента массива с определением его номера.Объясните пожалуйста как это...

Нахождение максимального элемента массива, исправить код
Должен показываться максимальный элемент массива, но не работает,проверил все,все правильно же...

6
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
02.06.2012, 22:36 2
Процедура определяет индекс наибольшего значения массива.

где A() передаваемый массив, n - конечный проверяемый индекс, m - результат.
i - цикл перечисления индексов.

Индексы проверяются, начиная с 1. Хотя массивы часто заполняются с 0-го элемента.

Имхо, правильнее переписать в функцию, а можно и без переменной "I":
Visual Basic
1
2
3
4
5
6
Public Function Ìàêñ_ýëåìåíò(A() As Single, ByVal n As Integer) As Integer
Ìàêñ_ýëåìåíò = LBound(A)
For n = Ìàêñ_ýëåìåíò To n
    If A(n) > A(Ìàêñ_ýëåìåíò) Then Ìàêñ_ýëåìåíò = n
Next
End Function
Только не спрашивайте меня, как это может нормально работать.
2
2 / 2 / 0
Регистрация: 04.06.2012
Сообщений: 27
04.06.2012, 23:31 3
Судя по задаче, использовать LBound не рекомендую. Мой преподаватель такой функции не знал и отправил перепечатывать РГР
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
05.06.2012, 02:08 4
Цитата Сообщение от SoLLeR Посмотреть сообщение
Мой преподаватель такой функции не знал
+


А если я захочу передать в функцию массив, определенный как:
Visual Basic
1
Dim Ar(-10 to -5)
Какими средствами, кроме функции:
Visual Basic
1
LBound()
я получу нижнюю границу для разбора?
0
призрак
3262 / 890 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
05.06.2012, 02:20 5
я не преподаватель SoLLeR-а, но, кажется, я знаю ответ.
определяешь функцию как
Visual Basic
1
Public Function Макс_элемент(A() As Single, otkudova As Integer, dokudova As Integer) As Integer
и скармливаешь ей и нижнюю, и верхнюю, а хочешь - северную и южную тоже.
а "машина - железяка. нельзя ей доверять мыслить самостоятельно"
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
05.06.2012, 02:39 6
Нет, я придумал лучший вариант.

СПЕЦИАЛЬНО для преподавателя, который не знает функции LBound (пусть изучает эту):
Функции для определения границ массива SafeLBound, SafeUBound; определения размерности массива ArrayDims
Visual Basic
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
Option Explicit
 
Declare Function VarPtrArray Lib "msvbvm50.dll" Alias "VarPtr" (Ptr() As Any) As Long
 
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
 
Public Function SafeUBound(ByVal lpArray As Long, Optional Dimension As Long = 1) As Long
Dim lAddress&, cElements&, lLbound&, cDims%
 
If Dimension < 1 Then
SafeUBound = -1
Exit Function
End If
CopyMemory lAddress, ByVal lpArray, 4
 
If lAddress = 0 Then
' The array isn't initilized
SafeUBound = -1
Exit Function
End If
' Calculate the dimensions
CopyMemory cDims, ByVal lAddress, 2
Dimension = cDims - Dimension + 1
' Obtain the needed data
CopyMemory cElements, ByVal (lAddress + 16 + ((Dimension - 1) * 8)), 4
CopyMemory lLbound, ByVal (lAddress + 20 + ((Dimension - 1) * 8)), 4
SafeUBound = cElements + lLbound - 1
End Function
 
Public Function SafeLBound(ByVal lpArray As Long, Optional Dimension As Long = 1) As Long
Dim lAddress&, cElements&, lLbound&, cDims%
 
If Dimension < 1 Then
SafeLBound = -1
Exit Function
End If
CopyMemory lAddress, ByVal lpArray, 4
 
If lAddress = 0 Then
' The array isn't initilized
SafeLBound = -1
Exit Function
End If
' Calculate the dimensions
CopyMemory cDims, ByVal lAddress, 2
Dimension = cDims - Dimension + 1
' Obtain the needed data
CopyMemory lLbound, ByVal (lAddress + 20 + ((Dimension - 1) * 8)), 4
SafeLBound = lLbound
End Function
 
Public Function ArrayDims(ByVal lpArray As Long) As Integer
Dim lAddress As Long
CopyMemory lAddress, ByVal lpArray, 4
If lAddress = 0 Then
' The array isn't initilized
ArrayDims = -1
Exit Function
End If
CopyMemory ArrayDims, ByVal lAddress, 2
End Function
 
Sub Test_Array()
Dim lHighBound#, lLowBound#, iDimensions#
'Dim aTmp()
Dim aTmp(-10 To -5, 2, 3)
lLowBound = SafeLBound(VarPtrArray(aTmp))
lHighBound = SafeUBound(VarPtrArray(aTmp))
iDimensions = ArrayDims(VarPtrArray(aTmp))
'When dealing With String arrays that isn't allocated at design time,
'you *must* add the value 4 To the lpArray-paramenter
'Хотя у меня и так нормально работает: при +4 - Excel вылетает, лучше не проверять :)
'lLowBound = SafeLBound(VarPtrArray(aTmp) + 4) 'для массивов типа String
'lHighBound = SafeUBound(VarPtrArray(aTmp) + 4) 'для массивов типа String
 
MsgBox "Lbound = " & SafeLBound(VarPtrArray(aTmp)) & vbLf & _
       "Ubound = " & lHighBound & vbLf & _
       "Dimensions = " & iDimensions
End Sub


Ей даже неинициализированный массив не страшен.

Для работы функции VarPtrArray может потребоваться библиотека Msvbvm50.dll (VB Runtime).
(подсобрал, проверил, все работает верно).

Не по теме:

Вот уж заставили меня покопаться на буржуйских сайтах :D

1
2 / 2 / 0
Регистрация: 04.06.2012
Сообщений: 27
05.06.2012, 08:24 7
Я прошу прощения, если кому–то мой пост показался критикой. Просто хотел предупредить, что есть преподаватели, которые кроме массивов и переменных вообще ни одной функции не знают. Вроде как делился горьким опытом. Мне тогда всю курсовую исчеркали за использование функций со словами: «А это что такое? Ни разу такого не видел! И почему у вас программа такая простая и короткая? Она не будет работать!» Вот так то. Всякое бывает...
1
05.06.2012, 08:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.06.2012, 08:24
Помогаю со студенческими работами здесь

Перевести код из C++ в Си (нахождение максимального элемента массива)
#include &lt;iostream&gt; using namespace std; int main(int argc, char *argv) { ...

Написать в виде функции нахождение наибольшего элемента массива, исправить код
Добрый день. Нужно было написать в виде функции нахождение наибольшего элемента массива. Сделал...

Массивы - замена элемента, нахождение нового массива и максимального элемента
Если не затруднит, помогите, пожалуйста, написать программу на Паскале. Задание: Дана матрица...

Сортировка выбором максимального элемента, исправить код
public void Sort(int array, int begin, int end) { for (int i = end-1; i &gt;= begin;...


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

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