Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
5 / 5 / 1
Регистрация: 09.03.2015
Сообщений: 66
1

Генерация слова по заданному алгоритму

25.03.2015, 20:36. Показов 1790. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста. Нужно сгенерировать слово
https://www.cyberforum.ru/atta... 1427303953
Длина слова - 7 символов. Шестой и седьмой - это цифры и они переносятся прямо в слово без изменений.
Второй символ игнорируется. Сначала генерируется первая часть слова из первого и третьего символа. Например:
aa = 40 , de - 74 и т.д. Потом 4 символ (Например :a - 0 , y - 18) аналогично с 5 символом.
Для наглядности: dtfgq44 -> 75061044
И также сделать обратную генерацию
Обязательно, чтобы писало 01 , 02 и т.д., а не 1 , 2
Всё к чему я додумался, так это всё записывать через Select Case
Миниатюры
Генерация слова по заданному алгоритму  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.03.2015, 20:36
Ответы с готовыми решениями:

Заполнение массива одной строкой по заданному алгоритму
Здравствуйте. Заполнение массива. Dim i(4) As Integer Dim a As Integer = 3 Dim b As Integer =5 ...

Полученные по заданному алгоритму слова вывести по очереди, противоположной к алфавитному
Задание: Дана строка, содержащая русский текст. Если в тексте нет слов, в котоpых есть две...

Генерация массива по Алгоритму Плейфера по ключу
public void button6_Click(object sender, EventArgs e) // Генерация энкрипт-матрицы 5 на 5 ...

Заполнить массив по заданному алгоритму
Вычислить и заполнить Xi, если Xi > 0 Y1= 0, если Xi = 0 -1, если Xi < 0 ...

19
5 / 5 / 1
Регистрация: 09.03.2015
Сообщений: 66
25.03.2015, 20:45  [ТС] 2
Я пишу VisualStudio 2010 на VB.NET
0
11508 / 3794 / 681
Регистрация: 13.02.2009
Сообщений: 11,197
25.03.2015, 20:56 3
И также сделать обратную генерацию
А второй символ откуда брать?

Добавлено через 6 минут
через Select Case
Цифры в массив. Обращаться по номеру строки-столбца
Номер буквы = Instr из строки
0
5 / 5 / 1
Регистрация: 09.03.2015
Сообщений: 66
25.03.2015, 21:00  [ТС] 4
Цитата Сообщение от Alex77755 Посмотреть сообщение
Зачем тогда постишь в VBA?
тему перенесли уже, Памирыч не разобрался и кинул с VB.NET на VBA. Уже обратно перенёс
Цитата Сообщение от Alex77755 Посмотреть сообщение
А второй символ откуда брать?
Протупил, щас узнаю насчёт этого
0
11508 / 3794 / 681
Регистрация: 13.02.2009
Сообщений: 11,197
25.03.2015, 21:01 5
При обрагной генерации 51 = bb, rb, ar, qr
0
5 / 5 / 1
Регистрация: 09.03.2015
Сообщений: 66
25.03.2015, 21:12  [ТС] 6
Цитата Сообщение от Alex77755 Посмотреть сообщение
При обрагной генерации 51 = bb, rb, ar, qr
Мне сказали, что бы я не мучался с генерацией слова обратно, потому что ещё ни у кого не получилось обратно слово получить

Добавлено через 3 минуты
Цитата Сообщение от Alex77755 Посмотреть сообщение
Цифры в массив. Обращаться по номеру строки-столбца
Номер буквы = Instr из строки
Чесно, я ничего не понял.
0
11508 / 3794 / 681
Регистрация: 13.02.2009
Сообщений: 11,197
25.03.2015, 21:15 7
А откуда цифры взяты и алгоритм генерации?

Добавлено через 2 минуты
Для обратной генерации цифры в матрице не должны повторяться
0
5 / 5 / 1
Регистрация: 09.03.2015
Сообщений: 66
25.03.2015, 21:17  [ТС] 8
Цитата Сообщение от Alex77755 Посмотреть сообщение
откуда цифры взяты и алгоритм генерации?
Умельцы написали такую таблицу Генерация кода для игры. У каждого предмета есть свой персональный код (dtfgq44), а для клиента игры его нужно сгенерировать в кодировку какую только он понимает (75061044), чтобы клиент понимал какой предмет это.

Добавлено через 2 минуты
Цитата Сообщение от Alex77755 Посмотреть сообщение
Для обратной генерации цифры в матрице не должны повторяться
Обратную генерацию уже не надо, мне сказали - это не реально, т.к. теряется 1 буква.
0
11508 / 3794 / 681
Регистрация: 13.02.2009
Сообщений: 11,197
26.03.2015, 09:46 9
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Ну можно и без массивов и без Select Case

VB.NET
1
2
3
4
5
6
7
8
9
10
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        MsgBox(SLOVO("dtfgq44"), 64, "dtfgq44")
    End Sub
 
    Function SLOVO(ByVal S As String)
        SLOVO = Hex(16 * ((Asc(Strings.Left(S, 1)) - 93) Mod 16) + Asc(Mid(S, 3, 1)) - 97) _
       & Format(Val((Hex(Asc(Strings.Mid(S, 4, 1)) - 97).ToString)), "00") _
       & Format(Val((Hex(Asc(Strings.Mid(S, 5, 1)) - 97).ToString)), "00") _
       & Mid(S, 6)
    End Function
Добавлено через 1 минуту
Там, наверняка, много лишнего. В NET совсем слабо
В VB6 так
Visual Basic
1
2
3
4
5
6
Function SLOVO(S)
     SLOVO = Hex(16 * ((Asc(Left(S, 1)) - 93) Mod 16) + Asc(Mid(S, 3, 1)) - 97) _
    & Format(Hex(Asc(Mid(S, 4, 1)) - 97), "00") _
    & Format(Hex(Asc(Mid(S, 5, 1)) - 97), "00") _
    & Mid(S, 6)
End Function
Добавлено через 9 часов 49 минут
Небольшая поправка. Первая составляющая должна быть такой
VB.NET
1
Hex((16 * ((Asc(Left(S, 1)) - 93) Mod 16) + Asc(Mid(S, 3, 1)) - 97) Mod 256)
4
5 / 5 / 1
Регистрация: 09.03.2015
Сообщений: 66
26.03.2015, 17:11  [ТС] 10
Теперь бы разобраться в этом коде и как он работает В первые вижу, что такое Asc\Mid\Format. Val - я так понял это значение. Буду опять листать литературу
0
11508 / 3794 / 681
Регистрация: 13.02.2009
Сообщений: 11,197
26.03.2015, 17:16 11
Краткие описания основных функций и команд VB

Добавлено через 3 минуты
Просто в NET они немного не так вызываются
Left или полностью VBA.Lef в NET вызывается Strings.Left
1
5 / 5 / 1
Регистрация: 09.03.2015
Сообщений: 66
27.03.2015, 20:00  [ТС] 12
Цитата Сообщение от Alex77755 Посмотреть сообщение
VB.NET
1
2
3
4
5
6
7
8
9
10
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        MsgBox(SLOVO("unbu008"), 64, "unbu008")
    End Sub
 
    Function SLOVO(ByVal S As String)
        SLOVO = Hex((16 * ((Asc(Strings.Left(S, 1)) - 93) Mod 16) + Asc(Mid(S, 3, 1)) - 97) Mod 256) _
       & Format(Val((Hex(Asc(Strings.Mid(S, 4, 1)) - 97).ToString)), "00") _
       & Format(Val((Hex(Asc(Strings.Mid(S, 5, 1)) - 97).ToString)), "00") _
       & Mid(S, 6)
    End Function
Просто офигеть. КАК вы до этого додумались? Что мне нужно читать, чтобы понять почему вы делили на 16 и 256, при этом оставляли остаток который умножали на 16, и отнимали 93 и 97

Добавлено через 34 минуты
Но иногда есть неточности, например iudcm05 - C3020C05, а пишет C3020005 (просто вместо С ставит ноль). Также вместо unbu001 - 81140100,а пишет 81140001. Но с этим я хочу попробовать сам разобраться, видать где-то неточность есть в подсчётах.
0
11508 / 3794 / 681
Регистрация: 13.02.2009
Сообщений: 11,197
27.03.2015, 22:00 13
не получилося
1
11508 / 3794 / 681
Регистрация: 13.02.2009
Сообщений: 11,197
27.03.2015, 22:02 14
Что-то н...
Вложения
Тип файла: rar функция.rar (82.7 Кб, 4 просмотров)
1
5 / 5 / 1
Регистрация: 09.03.2015
Сообщений: 66
28.03.2015, 20:05  [ТС] 15
Добавлено через 33 минуты
Alex77755,Можно ли более компактно код сделать этот?
VB.NET
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
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 
        Test(TextBox1.Text)
        TextBox2.Text = Test(TextBox1.Text)
 
    End Sub
 
    Public Function Test(ByVal T As String)
 
        Select Case (Hex((16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Asc(Mid(T, 3, 1)) - 97) Mod 256))
            Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"
                bykva1 = "0" & (Hex((16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Asc(Mid(T, 3, 1)) - 97) Mod 256))
            Case Else
                bykva1 = (Hex((16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Asc(Mid(T, 3, 1)) - 97) Mod 256))
        End Select
 
        Select Case Hex(Asc(Strings.Mid(T, 4, 1)) - 97)
            Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"
                bykva4 = "0" & Hex(Asc(Strings.Mid(T, 4, 1)) - 97)
            Case Else
                bykva4 = Hex(Asc(Strings.Mid(T, 4, 1)) - 97)
        End Select
        znach(9) = Hex(Asc(Strings.Mid(T, 5, 1)) - 97)
        Select Case Hex(Asc(Strings.Mid(T, 5, 1)) - 97)
            Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"
                bykva5 = "0" & Hex(Asc(Strings.Mid(T, 5, 1)) - 97)
            Case Else
                bykva5 = Hex(Asc(Strings.Mid(T, 5, 1)) - 97)
        End Select
 
        znach(11) = Mid(T, 6)
 
        If IsNumeric(Strings.Mid(T, 3, 1)) = True And IsNumeric(Strings.Mid(T, 4, 1)) = True And IsNumeric(Strings.Mid(T, 5, 1)) = True Then
            If 9 < Mid(T, 6) And Mid(T, 6) < 20 Then
                cifra(6) = 16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Mid(T, 6) + 6
            ElseIf 19 < Mid(T, 6) And Mid(T, 6) < 30 Then
                cifra(6) = 16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Mid(T, 6) + 12
            ElseIf 29 < Mid(T, 6) And Mid(T, 6) < 40 Then
                cifra(6) = 16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Mid(T, 6) + 18
            ElseIf 39 < Mid(T, 6) And Mid(T, 6) < 50 Then
                cifra(6) = 16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Mid(T, 6) + 24
            ElseIf 49 < Mid(T, 6) And Mid(T, 6) < 60 Then
                cifra(6) = 16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Mid(T, 6) + 30
            ElseIf 59 < Mid(T, 6) And Mid(T, 6) < 70 Then
                cifra(6) = 16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Mid(T, 6) + 36
            ElseIf 69 < Mid(T, 6) And Mid(T, 6) < 80 Then
                cifra(6) = 16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Mid(T, 6) + 42
            ElseIf 79 < Mid(T, 6) And Mid(T, 6) < 90 Then
                cifra(6) = 16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Mid(T, 6) + 48
            ElseIf 89 < Mid(T, 6) And Mid(T, 6) < 100 Then
                cifra(6) = 16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Mid(T, 6) + 54
            Else
                cifra(6) = 16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Mid(T, 6)
            End If
 
            cifra(7) = cifra(6) Mod 256
            znach(3) = Hex(cifra(7))
 
            Select Case znach(3)
                Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"
                    znach(3) = "0" & znach(3)
                Case Else
                    znach(3) = znach(3)
            End Select
            Test = (znach(3) & "00" & "00" & "00")
        ElseIf IsNumeric(Strings.Mid(T, 5, 1)) = True And IsNumeric(Strings.Mid(T, 4, 1)) = True Then
            Test = bykva1 & Mid(T, 6) & "00" & "00"
        ElseIf IsNumeric(Strings.Mid(T, 5, 1)) = True Then
            Test = bykva1 & bykva4 & Mid(T, 6) & "00"
        ElseIf IsNumeric(Strings.Mid(T, 4, 1)) = True Then
            Test = bykva1 & bykva5 & Mid(T, 6) & "00"
        Else
            Test = bykva1 & bykva4 & bykva5 & Mid(T, 6)
        End If
 
    End Function
1
11508 / 3794 / 681
Регистрация: 13.02.2009
Сообщений: 11,197
29.03.2015, 08:27 16
Ага
VB.NET
1
2
3
4
5
6
    Function SLOVO(ByVal S As String)
        SLOVO = Format(Val(Hex((16 * ((Asc(Strings.Left(S, 1)) - 93) Mod 16) + Asc(Mid(S, 3, 1)) - 97) Mod 256)), "00") _
       & Format(Val((Hex(Asc(Strings.Mid(S, 4, 1)) - 97).ToString)), "00") _
       & Format(Val((Hex(Asc(Strings.Mid(S, 5, 1)) - 97).ToString)), "00") _
       & Mid(S, 6)
    End Function
0
5 / 5 / 1
Регистрация: 09.03.2015
Сообщений: 66
29.03.2015, 14:33  [ТС] 17
Alex77755, Не подходит. Мне нужно ещё исключения. Если третий символ цифра, то обрабатывать нужно 1 и 4 символы, а 3 пропускать и т.д.
0
11508 / 3794 / 681
Регистрация: 13.02.2009
Сообщений: 11,197
29.03.2015, 16:11 18
Если третий символ цифра
Этого не было в вопросе.
как говорил герой фильма: огласите, пожалуйста, весь список
и т.д.
0
5 / 5 / 1
Регистрация: 09.03.2015
Сообщений: 66
29.03.2015, 22:58  [ТС] 19
Alex77755, извините, моя ошибка. Внутри екселя всё описано. https://www.cyberforum.ru/atta... 1427658554. Сервер код - это символы по краям таблицы. Клиент код - это мы его генерируем=)
Код описания на него не надо обращать внимания.
Лучше всего, что бы вы подсказали как сделать компактнее код, а не написали всё готовое, так не интересно просто. Мне же нужно учится Ну а если напишите, то не обижусь.
P.S. чтобы не плодить темы. Как вызвать окно игры, чтобы там что-то написать. Мне нужно Открыть\активировать(хз как сказать) окно игры -> нажать клавишу "У" -> что-то печатать в игре. Что нужно учить? А то в учебника не видел ничего похожего.
0
11508 / 3794 / 681
Регистрация: 13.02.2009
Сообщений: 11,197
30.03.2015, 11:08 20
Лучший ответ Сообщение было отмечено artem0228 как решение

Решение

Я уже дважды показал как сделать код компактнее
Блок:
Visual Basic
1
2
3
4
5
6
        Select Case (Hex((16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Asc(Mid(T, 3, 1)) - 97) Mod 256))
            Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"
                bykva1 = "0" & (Hex((16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Asc(Mid(T, 3, 1)) - 97) Mod 256))
            Case Else
                bykva1 = (Hex((16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Asc(Mid(T, 3, 1)) - 97) Mod 256))
        End Select
равносилен блоку:

Visual Basic
1
bykva1 =  Format(Val(Hex((16 * ((Asc(Strings.Left(S, 1)) - 93) Mod 16) + Asc(Mid(S, 3, 1)) - 97) Mod 256)), "00")
Аналогично и с bykva4 и bykva5
Я уже не говорю, что десяеиэтажный блок If-ов
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
            If 9 < Mid(T, 6) And Mid(T, 6) < 20 Then
                cifra(6) = 16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Mid(T, 6) + 6
            ElseIf 19 < Mid(T, 6) And Mid(T, 6) < 30 Then
                cifra(6) = 16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Mid(T, 6) + 12
            ElseIf 29 < Mid(T, 6) And Mid(T, 6) < 40 Then
                cifra(6) = 16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Mid(T, 6) + 18
            ElseIf 39 < Mid(T, 6) And Mid(T, 6) < 50 Then
                cifra(6) = 16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Mid(T, 6) + 24
            ElseIf 49 < Mid(T, 6) And Mid(T, 6) < 60 Then
                cifra(6) = 16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Mid(T, 6) + 30
            ElseIf 59 < Mid(T, 6) And Mid(T, 6) < 70 Then
                cifra(6) = 16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Mid(T, 6) + 36
            ElseIf 69 < Mid(T, 6) And Mid(T, 6) < 80 Then
                cifra(6) = 16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Mid(T, 6) + 42
            ElseIf 79 < Mid(T, 6) And Mid(T, 6) < 90 Then
                cifra(6) = 16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Mid(T, 6) + 48
            ElseIf 89 < Mid(T, 6) And Mid(T, 6) < 100 Then
                cifra(6) = 16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Mid(T, 6) + 54
            Else
                cifra(6) = 16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Mid(T, 6)
            End If
Вполне заменимо одной строчкой
Visual Basic
1
 cifra(6) = 16 * (Asc(Strings.Left(T, 1)) - 93 Mod 16) + Mid(T, 6) + 6 * (Val(Mid(T, 6)) \ 10)
1
30.03.2015, 11:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.03.2015, 11:08
Помогаю со студенческими работами здесь

Преобразование строк по заданному алгоритму
Маленькая Элизабет любит играть со строками. У нее есть строка длины n, полностью состоящая из букв...

Зашифровать строку по заданному алгоритму.
Дана строка-предложение. Зашифровать ее, поместив вначале все символы, расположенные на четных...

Заполнение матрицы по заданному алгоритму
Напишите программу, в которой объявляется массив размером 5х10 и массив размером 5х5. Первый массив...

Программа, работающая по заданному алгоритму
Помогите написать программу по данному алгоритму


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

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