С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
159 / 104 / 124
Регистрация: 01.04.2014
Сообщений: 466
Записей в блоге: 7

Вычислить функцию с неопределенным числом параметров

23.05.2014, 11:36. Показов 1698. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Требуется вычислить функцию y = max(a, b, c, ... ) где a, b, c, ... - целые числа
а y - максимальное из этих чисел. Причем некоторые числа могут быть
заданы в явном виде (например вместо "a" может стоять 11). Кроме того
число параметров (чисел) есть величина неопределенная.
Логика, размышления и решение:
Например в языке Си есть такое понятие как "перегрузка функций".
В Бейсике этого нет, однако и он не лаптем щи хлебает.
Нам ли сыновьям славного Бейсика уступить выскочке Си!
Я подумал:
а почему бы не подсунуть Бейсику Троянского коня. Суть дела
опирается на следующую аксиому (формулировка великого gehh).
Аксиома: Строковая переменная заменит 1000 параметров.
в самом деле, если ввести x$="a b c d e", то будут и волки сыты и
овцы целы. Один параметр заменяет все!!
Следующая программа решает эту задачу
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
Option Explicit
Dim x As String
Dim a%, b%, c%, d%, e%, i%, z%
Dim m() As String
Dim n() As Integer
 
Private Sub cmdD_Click()
    x = "a b c d e 1234"
    a = 11
    b = 0
    c = -33
    d = 777
    Print Max(x)
End Sub
 
Private Function Max(x As String) As Integer
    m = Split(x)
    z = UBound(m)
    ReDim n(z)
    For i = 0 To z
        Select Case m(i)
            Case "a": n(i) = Val(a)
            Case "b": n(i) = Val(b)
            Case "c": n(i) = Val(c)
            Case "d": n(i) = Val(d)
            Case "e": n(i) = Val(e)
            Case Else
                n(i) = Val(m(i))
        End Select
    Next i
    Max = n(0)
    For i = 1 To z
        If Max < n(i) Then Max = n(i)
    Next i
End Function
Успехов вам всем!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.05.2014, 11:36
Ответы с готовыми решениями:

Вызвать функцию из dll с неопределённым числом параметров
Нужно вызвать из dll функцию с неопределённым числом параметров. пока что работаю с таким вызовом char res; char (*dll) (char* ...);...

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

Процедура с неопределённым числом параметров: можно ли использовать для чисел, введённых с клавиатуры?
Процедура с неопределённым числом параметров, можно ли использовать для чисел, введённых с клавиатуры? Она работает, но как сделать чтобы...

9
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
23.05.2014, 11:49
Лучший ответ Сообщение было отмечено The trick как решение

Решение

В VB6 можно объявлять функции с переменным числом параметров, для этого есть специальное ключевое слово ParamArray:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub Form_Load()
    Dim max1 As Long, max2 As String
    
    max1 = Max(1, 5, 8, 2, 4, 7, 4, 22)
    max2 = Max("a", "v", "z", "w")
End Sub
 
Private Function Max(ParamArray v()) As Variant
    Dim x As Variant, i As Boolean
    For Each x In v
        If i Then
            If x > Max Then Max = x
        Else: Max = x: i = True
        End If
    Next
End Function
3
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
23.05.2014, 12:11
Цитата Сообщение от gehh Посмотреть сообщение
Один параметр заменяет все!!
- Правильно... Только почему не занести эти числа в обыкновенный массив? Будет быстрее, чем возиться со строками.
1
159 / 104 / 124
Регистрация: 01.04.2014
Сообщений: 466
Записей в блоге: 7
23.05.2014, 12:22  [ТС]
Конечно я знал, что можно использовать массив.
Но это все знают!! А вот использовать строковую переменную
(мне так кажется) и половина не догадается!!
Удачи вам!
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
23.05.2014, 12:27
Цитата Сообщение от gehh Посмотреть сообщение
и половина не догадается!!
- и правильно... Потому, что в данной задаче это нерационально. Точное решение привел The trick.
2
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
23.05.2014, 12:50
Более того, можно сравнивать значения разных типов.
Code
1
2
3
4
5
6
7
8
?Max("a", "v", "z", "w", 1, 5, 8, 2, 4, 7, 4, 22)
z
?Max(True, False)
False
?max(true,"A"),max(true,"z")
A             z
?max(false,"A"),max(false,"z")
A             z
Строки больше чисел и логических значений.
Code
1
2
3
4
5
6
7
8
?Max(true,1),max(false,1)
 1             1 
?max(true,0),max(false,0)
 0            False
?max(true,-1),max(false,-1)
True          False
?max(true,-1e-99),max(false,-1e-99)
-1E-99        False
При сравнении чисел и логических True преобразуется в -1, False в 0.
2
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
23.05.2014, 12:52
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Кстати по-сути, это ParamArray - это обыкновенный массив, "обернутый" в Variant переменную. С таким успехом можно написать и так:
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
Private Sub Form_Load()
    Dim Max11 As Long, Max12 As String
 
    Max11 = Max1(Array(1, 5, 3, 7, 8, 6, 5))
    Max12 = Max2(Array("a", "v", "z", "w"))
End Sub
 
' Так быстрее
Private Function Max1(v As Variant) As Variant
    Dim x As Variant, i As Long
    For Each x In v
        If i Then
            If x > Max1 Then Max1 = x
        Else: Max1 = x: i = True
        End If
    Next
End Function
Private Function Max2(v As Variant) As Variant
    Dim i As Long
    For i = 0 To UBound(v)
        If i Then
            If v(i) > Max2 Then Max2 = v(i)
        Else: Max2 = v(i)
        End If
    Next
End Function
2
159 / 104 / 124
Регистрация: 01.04.2014
Сообщений: 466
Записей в блоге: 7
23.05.2014, 16:41  [ТС]
Я тут поэксперементировал с кодом и получилась
интересная штука. Булева переменная мне вовсе
не пригодилась. Цикл сократился до одного оператора
И все работает! В чем тут дело??
Visual Basic
1
2
3
4
5
6
Private Function Max(ParamArray v()) As Variant
   Dim x As Variant
   For Each x In v
       If x > Max Then Max = x
   Next
End Function
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
23.05.2014, 16:43
Цитата Сообщение от gehh Посмотреть сообщение
В чем тут дело??
В том, что если ты передашь все отрицательные числа, то твоя функция не будет работать.
1
159 / 104 / 124
Регистрация: 01.04.2014
Сообщений: 466
Записей в блоге: 7
23.05.2014, 17:39  [ТС]
Я вам очень благодарен за разъяснение.
Теперь я добавил только одну строчку в предыдущий код
(ввёл самое большое по модулю отрицательное число)
Все работает! И программа короче!!
Спасибо вам ещё раз!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.05.2014, 17:39
Помогаю со студенческими работами здесь

Унаследовать функцию с переменным числом параметров
Добрый день, форум! Вот такая задачка: Есть базовый класс A с методом void func(void). От этого класса унаследовался другой класс,...

Написать функцию со сменным числом параметров
нужно написать функцию со сменным числом параметров, которая находит углы n-угольника по заданным сторонам. заранее благодарю!

Написать функцию с переменным числом параметров
Задание дали такое: Написать функцию с переменным числом параметров, в соответствии с вариантом, продемонстрировать вызов функции с...

Массивы в функцию с переменным числом параметров
Как передать некоторое кол-во массивов в функцию с переменным числом параметров и вывести в функции сумму элементов каждого массива (на...

Написать функцию с переменным числом параметров
Среднее арифметическое из элементов в списке параметров , стоящие на четных местах. вот что у меня получилось, дальше никак: #include...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru