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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2011, 18:29   #11
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

однако... могу

Код:
' перевод из 10-ричной системы в какую-то n-ричную
Function D2xz(D As Long, N As Long) As String
  Dim R As Integer, s As String
  R = Int(Log(D + 0.0001) / Log(N)) 'Для 64, 128 перевод в 2-ичную систему дало неожиданный результат: Log(128)/Log(2) = 7 - это
  'правильно, а Int(Log(128)/Log(2)) уже равно 6 и в старшем разряде получается "2"!!!, пришлось добавить нелогичный 0.001
  Do
    s = s & D2C(Int(D / N ^ R))
    D = D - Int(D / N ^ R) * N ^ R
    R = R - 1
  Loop Until R = -1
  D2xz = s
End Function

' и обратно
Function xz2D(s As String, N As Long) As Long
  Dim R As Integer, D As Long
  s = UCase(s)
  For R = 0 To Len(s) - 1
    D = D + C2D(Mid(s, Len(s) - R, 1)) * N ^ R
  Next
  xz2D = D
End Function

Function D2C(i As Integer) As String
  D2C = Split("0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z", ",")(i)
End Function

Function C2D(c As String) As Long
  C2D = InStr("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", c) - 1
End Function
обьяснять-то особо нечего, кода 5 строк...
тут две рабочие функции D2xz (десятичное число в Хто Знает какую систему) и обратно xz2D (из ХЗ какой системы в 10-ричную).
и две функции для внутреннего использования:
D2C (число в символ) и обратно C2D (символ в число)

начнем из далека: в 10-ричной системе 10 цифр (0,1,2,3...9) 10 в 10-ричной системе это уже не цифра - это число состоящее из двух цифр 1 и 0 (т.е. 1 десяток и 0 единиц).

аналогично в двоичной системе всего две цифры (0,1) а в 16-ричной - 16 цифр (0,1,2...9,А,В,С...F).

Function D2C(i As Integer) As String возвращает изображение Н-го символа. 0-й символ выглядит как "0", 6-й - как "6", 10-й - как "А", 15-й - как "F", и 35-й - как "Z".

Function C2D(c As String) As Long - это обратная функция получает символ от "0" до "Z", возвращает его номер.

Function D2xz(D As Long, N As Long) As String
получает два параметра: D - число, которое нужно перевести в какую-то систему, и N - собственно в какую систему переводить.
R = Int(Log(D) / Log(N)) - определяем разрядность числа D в системе N
Do - крутим цикл начиная с старшего разряда пока разряд не упадет ниже нуля
s = s & D2C(Int(D / N ^ R))
D2C(Int(D / N ^ R)) - это определяет сколько единиц разряда R содержится в D.
D = D - Int(D / N ^ R) * N ^ R - уменьшаем D на величину, которая учтена строкой выше
R = R - 1 - уменьшаем разряд
Loop Until R = -1
D2xz = s - присвоили значение функции.
End Function

функция Function xz2D(s As String, N As Long) As Long еще проще.
начиная с конца строки берем по одному символу, умножаем на основу в степени соответствующего разряда, собираем это все в общую сумму.

успехов!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 26.04.2011, 18:39   #12
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

приблизительно так:
Код:
Function Rnd2_16() As Long
  N = 1 + Int(4 * Rnd())
  Select Case N
  Case 1
    Rnd2_16 = 2
  Case 2
    Rnd2_16 = 8
  Case 3
    Rnd2_16 = 10
  Case Else
    Rnd2_16 = 16
  End Select
End Function
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 26.04.2011, 19:40   #13
cfvbh
Пользователь
 
Аватар для cfvbh
 
Регистрация: 26.03.2011
Сообщений: 17
По умолчанию 123

Огромнейшее Благодарю IgorGO!!!!!!
Вам бы преподавать информатику)

Код:
Function D2xz(d As Long, N As Long) As String
  Dim R As Integer, s As String
   R = Int(Log(d + 0.0001) / Log(N))
  Do
    s = s & D2C(Int(d / N ^ R))
    d = d - Int(d / N ^ R) * N ^ R
    R = R - 1
  Loop Until R = -1
  D2xz = s
End Function
                                       
Function xz2D(s As String, N As Long) As Long
  Dim R As Integer, d As Long
  For R = 0 To Len(s) - 1
    d = d + C2D(Mid(s, Len(s) - R, 1)) * N ^ R
  Next
  xz2D = d
End Function

Function D2C(i As Integer) As String
  D2C = Split("0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z", ",")(i)
End Function

Function C2D(c As String) As Long
  C2D = InStr("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", c) - 1
End Function

Function Perevod(ByVal N1 As String, ByVal Base1 As Long, ByVal Base2 As Long) As String
    Dim DecNumber As Long: DecNumber = xz2D(N1, Base1)
    Perevod = D2xz(DecNumber, Base2)
End Function
не получается переводить из 16ой(((
тут думаю нужно какой то вид переменной задать другой?

или лучше вообще объединить две функции в одну?

Последний раз редактировалось cfvbh; 26.04.2011 в 20:04.
cfvbh вне форума Ответить с цитированием
Старый 26.04.2011, 20:17   #14
3BEPOBOY
Пользователь
 
Регистрация: 27.12.2010
Сообщений: 82
По умолчанию

Почему преподаватель информатики не знает информатики?
3BEPOBOY вне форума Ответить с цитированием
Старый 26.04.2011, 20:34   #15
cfvbh
Пользователь
 
Аватар для cfvbh
 
Регистрация: 26.03.2011
Сообщений: 17
По умолчанию

Цитата:
Сообщение от 3BEPOBOY Посмотреть сообщение
Почему преподаватель информатики не знает информатики?
в смысле? (это вы к чему?)
cfvbh вне форума Ответить с цитированием
Старый 26.04.2011, 20:45   #16
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Цитата:
Почему преподаватель информатики не знает информатики?
потому что она ему не интересна и ему навязали предмет.
я начинал свою трудовую деятельность в институте.
я обучил "основа компьютерной грамотности" порядка 150-200 человек.
думаете почему я тут? я ностальгирую...
вообще я инженер-строитель...
задавайте вопросы... не знаю настолько ли Вам приятно получить ответ, как мне его написать...
я благодарен местным профессионалам, я многому научился, мне тут хорошо...
вам того же!!! общайтесь и получайте от этого удовольствие.
Цитата:
не получается переводить из 16ой(((
тут думаю нужно какой то вид переменной задать другой?
функции универсальные - им по-фиг из какой в какую переводить (кажись все уже проверено) код весь открыт общественности, думаете были бы ошибки на них бы не указали?
пишите что куда не получается... разберемся... ошибка либо у меня, либо у Вас)))
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 26.04.2011, 21:06   #17
cfvbh
Пользователь
 
Аватар для cfvbh
 
Регистрация: 26.03.2011
Сообщений: 17
По умолчанию

если кто то думает что я учитель информатики то это не так)))
я студент 1ого курса) (очной формы)

Цитата:
Сообщение от IgorGO Посмотреть сообщение
задавайте вопросы... не знаю настолько ли Вам приятно получить ответ, как мне его написать...
я благодарен местным профессионалам, я многому научился, мне тут хорошо...
вам того же!!! общайтесь и получайте от этого удовольствие.
золотые слова!)

так вот:
перевожу например из 10ой в 16ую
Код:
Sub asd()
Debug.Print Perevod(1234, 10, 16)
End Sub
Ответ: 4D2 (все отлично, всё верно)

Теперь пробую обратно
Код:
Sub asd()
Debug.Print Perevod(4D2, 16, 10)
End Sub
сразу же при переходе курсора значение меняется
Код:
Sub asd()
Debug.Print Perevod(400#, 16, 10)
End Sub
ну и соответственно ответ при таком "изменении" не тот: 1024

наверно не те свойства заданы? я пока еще не полностью с некоторыми операторами разобрался.
cfvbh вне форума Ответить с цитированием
Старый 26.04.2011, 22:08   #18
R Dmitry
Форумчанин
 
Регистрация: 07.03.2010
Сообщений: 796
По умолчанию

одевайте стринги

Debug.Print Perevod("4D2", 16, 10)
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234
R Dmitry вне форума Ответить с цитированием
Старый 26.04.2011, 22:29   #19
3BEPOBOY
Пользователь
 
Регистрация: 27.12.2010
Сообщений: 82
По умолчанию

Цитата:
Сообщение от cfvbh Посмотреть сообщение
если кто то думает что я учитель информатики то это не так)))
я студент 1ого курса) (очной формы)
на самом деле это я дурак, как такое мог предположить... паранойя видимо
3BEPOBOY вне форума Ответить с цитированием
Старый 27.04.2011, 00:31   #20
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

cfvbh,
внимательно смотрим за типом параметров...
Function Perevod(ByVal N1 As String, ByVal Base1 As Long, ByVal Base2 As Long) As String
собственно, Дима уже все обьяснил...

а про учителя информатики - я оказывается вообще не вьехал в вопрос... я вспоминал своего учителя информатики. учитетелей математики и в школе, и в ПТУ, и в институте вспоминаю с огромной благодарностью, а об учителе информатики, увы, не могу такого сказать

3BEPOBOY,
а учитель информатики - в первую очередь учитель, а не программист, он должен уметь научить программировать, а не уметь программировать...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание программы Алекс 9 Помощь студентам 3 13.01.2011 16:57
Создание программы madcatt Фриланс 8 07.10.2010 06:34
С++/Создание программы с ИИ. Беспредельщикъ Помощь студентам 4 08.09.2010 16:03
Создание программы Kiler Visual C++ 2 18.08.2010 15:49
Создание программы в С++ Panterka Помощь студентам 10 25.12.2007 13:12