Консультация № 201151
13.06.2021, 10:06
0.00 руб.
0 4 1
Здравствуйте! У меня возникли сложности с таким вопросом:

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
При помощи датчика случайных чисел получить и вывести в столбец рабочего листа Excel N (N вводится с клавиатуры) целых чисел типа Long. В соседний столбец вывести представление соответствующего числа в дополнительном коде шестнадцатеричной системы счисления. (На языке VBA)
Огромное спасибо!!!

Обсуждение

давно
Модератор
137394
1850
13.06.2021, 14:49
общий
Адресаты:
Вы повторно задали этот вопрос. Он не нашел ответа,
Не могли бы Вы привести пример числа и как оно должно выглядеть после преобразования?
Или предоставить методичку, как это делать?
Или привести ссылку на методику?
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
давно
Посетитель
404319
21
13.06.2021, 19:26
общий
Адресаты:
Вот пример похожей задачи
При помощи датчика случайных чисел получить и вывести в столбец рабочего листа Excel N (N вводится с клавиатуры) целых чисел типа Long. Выделить цветом те ячейки, в которых находятся числа, в двоичном представлении которых имеются подцепочки, содержащие L подряд идущих цифр 0. При этом L кратно 4 и более 7. Числа хранятся в дополнительном коде. В соседний столбец вывести числа в двоичном представлении.
Решение

Sub Вариант0Задача22()
Dim a As Long, N As Long, bin As String, i As Integer, k As Integer
Dim Sum As Integer
Sheets("Лист22").Select: Cells.Clear
'Отформатировать столбец b, как текстовый
Columns("b").NumberFormat = "@"
Randomize Timer
N = Val(InputBox("Введите число элементов N"))
For i = 1 To N 'Цикл по всем элементам
'Получить целое случайное число в диапазоне[-1000000; 1000000]
a = Int(Rnd * 2000000) - 1000000
Cells(i, 1) = a
'Вызвать функцию, которая переводит в двоичный дополнительный
'код число a
bin = ПереводВ2Long(a)
Cells(i, 2) = bin 'Выводим во второй столбец число в двоичном виде
If ЧислоУдовлетворяетЛиУсловиюЗадачи(bin) Then
'Закрасить ячейку цветом, смешав 255 единиц красного цвета,
Cells(i, 1).Interior.Color = &HFF1199 '17 - зеленого и 153 - голубого
End If
Next i
End Sub
'Функция отвечает на вопрос: удовлетворяет ли строка bin условиям
'задачи?
Function ЧислоУдовлетворяетЛиУсловиюЗадачи(ByVal bin As String)_
As Boolean
Dim k As Integer, L As Integer
ЧислоУдовлетворяетЛиУсловиюЗадачи = True
bin = bin + " " 'В строку bin добавляем пробел справа
For k = 1 To 34 'Обходим по всем символам строки bin
If Mid(bin, k, 1) = "0" Then 'Вошли в цепочку из нулей
L = 1 'Число подряд идущих символов "0"
'Идем до конца этой цепочки и подсчитываем, сколько
'в ней символов "0"
k = k + 1
While Mid(bin, k, 1) = "0" 'Цикл пока k-тый символ = 0
k = k + 1: L = L + 1 'Переходим к следующему биту и увеличиваем L
Wend
'Вышли из цепочки, содержащей символы "0". Проверяем, длина
'цепочки удовлетворяет ли условию задачи. Если "ДА" - выходим из
'функции
If L > 7 And (L Mod 4) = 0 Then Exit Function
End If
Next k
'Если программа дошла до этого оператора, то цепочек
'удовлетворяющих условию задачи в этом числе нет. Имени функции
'присваиваем значение false
ЧислоУдовлетворяетЛиУсловиюЗадачи = False
End Function
'Функция, которая переводит число типа Long в двоичный формат
Function ПереводВ2Long(ByVal a As Long) As String
Dim b As Long, i As Integer, S As String
S = "" 'Здесь будем накапливать по одному биту двоичный код числа а
'В числе B - первый бит =1, а остальные (31 бит)равны 0
b = &H80000000 'для определения знака числа (первый бит)
If (a And b) = 0 Then S = S + "0" Else S = S + "1"
b = &H40000000 'второй бит =1 остальные 0
For i = 2 To 32 'Обходим по всем числовым битам
'В числе b i-тый бит = 1 остальные = 0
If (a And b) = 0 Then S = S + "0" Else S = S + "1"
b = b / 2 'Сдвиг 1 на один бит вправо
Next i
ПереводВ2Long = S
End Function
давно
Модератор
137394
1850
15.06.2021, 12:59
общий
15.06.2021, 19:57
это ответ
Если я правильно понял статью, вот код:
Код:
Sub DecHex()

Const R1 As String = "A1" ' Адрес ячейки с первым элементом массива чисел
'Const R1 As String = "C3" ' Адрес ячейки с первым элементом массива чисел
Const upperbound As Long = 2147483647# ' Пределы изменения элементов массива
Const lowerbound As Long = -2147483648#

Dim N, ierr, CN, i
Dim R1N As String, R2 As String, R2N As String
Dim Dhex As String

N = InputBox("Введите целое N>0")

ierr = False
If IsNumeric(N) Then
CN = CDbl(N)
ierr = CDbl(CN) > 0 And Int(CN) = CN
End If

If Not ierr Then
MsgBox "Введено неверное число" + vbCrLf + N
Exit Sub
End If

ReDim MLong(1 To N, 1 To 1) As Long
ReDim MDhex(1 To N, 1 To 1) As String

Randomize
For i = 1 To N
MLong(i, 1) = (CDbl(upperbound) - CDbl(lowerbound) + 1) * (CDbl(Rnd) + Rnd * 0.00001) + lowerbound
If MLong(i, 1) >= 0 Then
If MLong(i, 1) > 0 Then MDhex(i, 1) = "0" + Hex(MLong(i, 1)) Else MDhex(i, 1) = "0"
Else
Dhex = Hex(-MLong(i, 1))
MDhex(i, 1) = "F"
For j = 1 To Len(Dhex)
Select Case Mid(Dhex, j, 1)
Case "0"
MDhex(i, 1) = MDhex(i, 1) + "F"
Case "1"
MDhex(i, 1) = MDhex(i, 1) + "E"
Case "2"
MDhex(i, 1) = MDhex(i, 1) + "D"
Case "3"
MDhex(i, 1) = MDhex(i, 1) + "C"
Case "4"
MDhex(i, 1) = MDhex(i, 1) + "B"
Case "5"
MDhex(i, 1) = MDhex(i, 1) + "A"
Case "6"
MDhex(i, 1) = MDhex(i, 1) + "9"
Case "7"
MDhex(i, 1) = MDhex(i, 1) + "8"
Case "8"
MDhex(i, 1) = MDhex(i, 1) + "7"
Case "9"
MDhex(i, 1) = MDhex(i, 1) + "6"
Case "A"
MDhex(i, 1) = MDhex(i, 1) + "5"
Case "B"
MDhex(i, 1) = MDhex(i, 1) + "4"
Case "C"
MDhex(i, 1) = MDhex(i, 1) + "3"
Case "D"
MDhex(i, 1) = MDhex(i, 1) + "2"
Case "E"
MDhex(i, 1) = MDhex(i, 1) + "1"
Case "F"
MDhex(i, 1) = MDhex(i, 1) + "0"
End Select
Next
End If
Next

Rows("1:100000").ClearContents

R1N = Range(R1).Offset(N - 1, 0).Address
R2 = Range(R1).Offset(0, 1).Address
R2N = Range(R1).Offset(N - 1, 1).Address

Range(R1 + ":" + R1N) = MLong
Range(R2 + ":" + R2N) = MDhex

End Sub
Вместо выделенного цикла с использованием громоздкого Case можно использовать формулу:
Код:
        For j = 1 To Len(Dhex)
MDhex(i, 1) = MDhex(i, 1) + Hex(15 - CLng("&H" + Mid(Dhex, j, 1)))
Next
Я сделал как мог, кто сделает правильнее - пусть сделает.
Прикрепленные файлы:
5
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
давно
Модератор
137394
1850
15.06.2021, 19:58
общий
Адресаты:
Вместо выделенного цикла с использованием громоздкого Case можно использовать формулу:
Код:
        For j = 1 To Len(Dhex)
MDhex(i, 1) = MDhex(i, 1) + Hex(15 - CLng("&H" + Mid(Dhex, j, 1)))
Next
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Форма ответа