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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2009, 22:32   #1
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Десятично-двоичный преобразователь (хрестоматийная задача любой ЭВМ)

Код:
Sub ThreeHypostasesOfNumber()
'Считывает (в окне ввода) число и печатает его в 2-чн., 8-чн. и 16-теричн. представлениях.'
'(когда это число больше 2 100 000 000 (точнее, 2-х в степени 31), этот алгоритм не годен)'
Dim i As Byte, N As Variant, dumn0 As String, dumn As String

dumn0 = InputBox("Ваше десятичное число равно...", Application, Day(Date))

For i = 1 To Len(dumn0)
If Mid(dumn0, i, 1) Like "[0-9]" Then dumn = dumn & Mid(dumn0, i, 1)
Next 'убрали из введённого числа всё кроме цифр: пробелы, табуляции и разделители разрядов'

If Not Left(dumn, 1) Like "[0-9]" Then MsgBox "Вы не ввели цифр!": Exit Sub '*** ВЫХОД ***'

N = dumn: MsgBox "Преобразую " & N & " к 2-чному, восьмеричному и шестнадцатеричному виду."

MakeBinOctHex N 'вызов функции, которая преобразует и печатает число N в документе Word'
End Sub

Код:
Function MakeBinOctHex(ByRef N)
Dim d As Integer, OctMask As String, BinMask As String
OctMask = Oct(N) 'Сначала представляем в восьмеричном счислении...'
 
For d = Len(OctMask) To 1 Step -1 'Сканируем восьмеричную "маску" справа налево.'
    BinMask = Choose(Mid$(OctMask, d, 1) + 1, _
    "000", "001", "010", "011", "100", "101", "110", "111") & BinMask
'    И заменяем соответственно цифры 0, 1, 2, 3, 4, 5, 6, 7 их двоичными аналогами.'
Next
 
BinMask = Mid$(BinMask, InStr(BinMask, "1"))            'убор начальных нулей из BinMask
 
With Selection
.ParagraphFormat.TabStops.Add Position:=CentimetersToPoints(15), Alignment:=wdAlignTabRight
.TypeText vbLf & N & " в 2-ичном виде: " & vbTab
.TypeText BinMask 'печать 2-чного, равного введённому в главной процедуре десятичному'
.TypeText vbLf & N & " в 8-меричном виде: " & vbTab
.TypeText OctMask 'печать 8-еричного, равного введённому в главной процедуре 10-чному'
.TypeText vbLf & N & " в 16-теричном виде: " & vbTab & Hex(N) & vbLf    '(в конце - абзац)'
'и наконец - печать шестнадцатеричного вида для введённого в главной процедуре десятичного'
End With
End Function
Вложения
Тип файла: doc Dec2BinOctHex.doc (49.5 Кб, 34 просмотров)

Последний раз редактировалось Sasha_Smirnov; 05.03.2009 в 22:35. Причина: не работал тэг кода.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 05.03.2009, 22:44   #2
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Обратную задачу не стал сюда втискивать. И эта-то мало кому понятна, чего уж там.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 05.03.2009, 22:44   #3
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цифровой гуру.

Скопировал себе файлик на будущее. Сам бы не додумался.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 05.03.2009, 23:08   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Сканировать восьмеричную маску, конечно же, круто, но не проще ли так:

Код:
Sub Dec2Bin()
    a = 123456789: b = ""
    While a > 0: b = a Mod 2 & b: a = a \ 2: Wend
    Debug.Print b    ' число A в двоичном формате
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 05.03.2009, 23:38   #5
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Ясно, проще. Но функция Mod не работает с числами Decimal (Dec).
А так вышло, что это кусок программы, выросшей из той (она здесь есть), что ищет простые числа в «районе» 10 в 29-й степени.

И вообще. Когда что-то УЖЕ работает, то проще — использовать. Чем улучшать.

Последний раз редактировалось Sasha_Smirnov; 05.03.2009 в 23:59. Причина: ссылка.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 18.07.2009, 16:36   #6
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Тег [code] в нашей ветке, или тэг

Вопрос модераторам: я выше применил к коду соответствующий тэг, но, как видите, он (тэг) сработал только применительно к подпрограмме — Sub, а функция ему неподвластна.

Это так и должно быть, т. е. обработка этим тэгом так и настроена?

А ещё, у EducatedFool, даже Sub не «расцвела», хотя, по-видимому, он тот же тэг использовал. Вот это вот вообще загадка. Для вас тоже?

Последний раз редактировалось Sasha_Smirnov; 18.07.2009 в 16:40.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 18.07.2009, 17:10   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
он (тэг) сработал только применительно к подпрограмме — Sub, а функция ему неподвластна.
Предназначение тэга - выделять\отделять код от остального текста, сохранять в коде отступы и применять определённое форматирование.

Тэг [code]...[/code] не обеспечивает раскраску кода VBA (поскольку соответствующий скрипт разрабатывался для других языков программирования) - поэтому не надо удивляться, что большинство ключевых слов не распознаются.

Можете расскрашивать код самостоятельно
Или применять специальные надстройки для копирования уже отформатированного тэгами кода в буфер обмена:
Код:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Not Intersect(Target, [d6:i6]) Is Nothing Then
        Cancel = True
        txt = InputBox("Введите индекс"): If Len(txt) <> 6 Then Exit Sub
        For i = 1 To 6
            [d6:i6].Cells(i) = Mid(txt, i, 1)
        Next
    End If
End Sub
В буфере обмена после нажатия кнопки оказывается приблизительно такой текст:

Цитата:
[code][color=darkblue]Private[/color] [color=darkblue]Sub[/color] Worksheet_BeforeDoubleClick([color=darkblue]ByVal[/color] Target [color=darkblue]As[/color] Range, Cancel [color=darkblue]As[/color] [color=darkblue]Boolean[/color])
[color=darkblue]If[/color] [color=darkblue]Not[/color] Intersect(Target, [d6:i6]) [color=darkblue]Is[/color] [color=darkblue]Nothing[/color] [color=darkblue]Then[/color]
Cancel = [color=darkblue]True[/color]
txt = InputBox("Введите индекс"): [color=darkblue]If[/color] Len(txt) <> 6 [color=darkblue]Then[/color] [color=darkblue]Exit[/color] [color=darkblue]Sub[/color]
[color=darkblue]For[/color] i = 1 [color=darkblue]To[/color] 6
[d6:i6].Cells(i) = Mid(txt, i, 1)
[color=darkblue]Next[/color]
[color=darkblue]End[/color] [color=darkblue]If[/color]
End [color=darkblue]Sub[/color][/code]
EducatedFool вне форума Ответить с цитированием
Старый 18.07.2009, 19:11   #8
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Однако раскраска как-то странно работает. Если ключевые слова идут подряд, то зачем к каждому из них применять тэг?
Вот так делаю я своей собственной утилитой:
Код:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Not Intersect(Target, [d6:i6]) Is Nothing Then
        Cancel = True
        txt = InputBox("Введите индекс"): If Len(txt) <> 6 Then Exit Sub
        For i = 1 To 6
            [d6:i6].Cells(i) = Mid(txt, i, 1)
        Next
    End If
End Sub
А код выглядит так:
Код:
[сode][сolor="blue"]Private Sub[/сolor] Worksheet_BeforeDoubleсliсk([сolor="blue"]ByVal[/сolor] Target [сolor="blue"]As[/сolor] Range, сanсel [сolor="blue"]As Boolean[/сolor])
    [сolor="blue"]If Not[/сolor] Interseсt(Target, [d6:i6]) [сolor="blue"]Is Nothing Then[/сolor]
        сanсel = [сolor="blue"]True[/сolor]
        txt = [сolor="blue"]InputBox[/сolor]("Введите индекс"): [сolor="blue"]If[/сolor] Len(txt) <> 6 [сolor="blue"]Then Exit Sub
        For[/сolor] i = 1 [сolor="blue"]To[/сolor] 6
            [d6:i6].сells(i) = [сolor="blue"]Mid[/сolor](txt, i, 1)
        [сolor="blue"]Next
    End If
End Sub[/сolor][/сode]
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 19.07.2009 в 16:07.
viter.alex вне форума Ответить с цитированием
Старый 05.10.2010, 18:03   #9
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Тэг [code]...[/code] не обеспечивает раскраску кода VBA (поскольку соответствующий скрипт разрабатывался для других языков программирования) - поэтому не надо удивляться, что большинство ключевых слов не распознаются.

Можете расскрашивать код самостоятельно
Да зачем! Главное же отступы.

Я удивлялся не "нераспознанным" ключевым словам (а то, что они ключевые, мы и так знаем) — мне странно, что тот же самый, как вы говорите, скрипт срабатывает с, казалось бы, аналогичным (а порой даже идентичным) текстом кода по-разному: то распознаёт его (вообще как код), то нет.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 15.04.2011, 05:11   #10
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Цитата:
Сообщение от Sasha_Smirnov Посмотреть сообщение
...я выше применил к коду соответствующий тэг, но, как видите, он (тэг) сработал только применительно к подпрограмме — Sub, а функция ему неподвластна.
Наконец-то и Function заиграла красками: http://programmersforum.ru/showthread.php?t=40897!

Спасибо главному по тегам!

Последний раз редактировалось Sasha_Smirnov; 15.04.2011 в 05:15. Причина: special thanks.
Sasha_Smirnov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двоичный поиск в Turbo C++ 3.0 Xeon332 Помощь студентам 3 29.01.2009 04:19
Перевод вещественного числа в двоичный код shepelin Свободное общение 9 06.07.2008 10:00
Двоичный код masterx13 Паскаль, Turbo Pascal, PascalABC.NET 4 14.11.2007 20:08
Сумма ряда на ЭВМ и вычисленная аналитически, программы на языке Pascal SunCHO Помощь студентам 2 02.05.2007 22:37