Страницы: 1
RSS
Проверка цифры в многозначном числе на порядок расположения.
 
Здравствуйте.
Есть вот это: Дано четырехзначное число. Верно ли, что цифр в нем расположены по убыванию? (Например, 4311 - нет, 4321 - да, 5542 - нет, 5631 - нет, 9871 - да).
Моё видение таково, что каждую цифру числа нужно разделать на её порядок с округлением, и далее сравнить их между собой.
Код
Sub homework0211()
          
    Dim x As Integer, a As Integer, b As Integer, c As Integer, d As Integer
    
    x = InputBox("Enter number")
    Cells(1, 1) = x
    a = x Mod 1000
    b = x - (a * 1000)
    b = b Mod 100
    c = x - (a * 1000 + b * 100)
    c = c Mod 10
    d = x - (a * 1000 + b * 100 + c * 10)
    
        If a > b And b > c And c > d Then
        MsgBox ("YES")
        Else
        MsgBox ("NO")
        End If
                                
End Sub

Однако на шаге 8 выходит ошибка Run-time error "Overflow".
Что сделано не так?
Изменено: Georgetta Monson - 05.10.2022 09:29:11
 
Georgetta Monson, Добрый день, замените Integer на Long.
Инфа тут >>>
Правда если у вас будут числа с плавующей запятой то тогда уже либо Double или Variant
Изменено: Wild.Godlike - 05.10.2022 09:31:26
 
Добавьте комментарии к каждой строке кода для чего она нужна и что пытались сделать, я думаю что вопросов останется меньше.
Изменено: nilske - 05.10.2022 09:30:48
 
Georgetta Monson, здравствуйте
Цитата
Georgetta Monson: Дано четырехзначное число. Верно ли, что цифр в нем расположены по убыванию? (Например, 4311 - нет, 9871 - да)
почему так? Уточните словами чёткое условие определения убывания…
Каждая цифра со второй должна быть меньше предыдущей
Изменено: Jack Famous - 05.10.2022 11:28:24
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Код
Sub homework0211()
           
    Dim x As Integer, a As Integer, b As Integer, c As Integer, d As Integer
    
    x = InputBox("Enter number")
    a = (x - x Mod 1000) / 1000
    b = (x - (a * 1000) - (x - (a * 1000)) Mod 100) / 100
    d = (x - (a * 1000 + b * 100)) Mod 10
    c = (x - (a * 1000 + b * 100) - d) / 10
  
    If a > b And b > c And c > d Then
        MsgBox ("YES")
    Else
        MsgBox ("NO")
    End If
                                 
End Sub
 
Код
Function IsDigitDown(d) As Boolean
  Dim i&, s$: s = "" & d
  For i = 2 To Len(s)
    If Mid(s, i, 1) >= Mid(s, i - 1, 1) Then Exit Function
  Next
  IsDigitDown = i > Len(s)
End Function

Sub test()
  Debug.Print IsDigitDown(9753)
  Debug.Print IsDigitDown(9756)
End Sub

test напишет Истина потом Ложь
Изменено: Ігор Гончаренко - 05.10.2022 14:12:50
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
написал:
Код
    [URL=#]?[/URL]       1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17      Sub   homework0211()                          Dim   x   As   Integer  , a   As   Integer  , b   As   Integer  , c   As   Integer  , d   As   Integer                   x = InputBox(  "Enter number"  )          a = (x - x   Mod   1000) / 1000          b = (x - (a * 1000) - (x - (a * 1000))   Mod   100) / 100          d = (x - (a * 1000 + b * 100))   Mod   10          c = (x - (a * 1000 + b * 100) - d) / 10                 If   a > b   And   b > c   And   c > d   Then              MsgBox (  "YES"  )          Else              MsgBox (  "NO"  )          End   If                                          End   Sub   
 
Код работает.
Что делает вот эта строка:
a = (x - x Mod 1000) / 1000
?
 
Цитата
Georgetta Monson написал:
Что делает вот эта строка:
А самому попробовать лень?
Код
Sub test()
  Debug.Print (7654 - 7654 Mod 1000) / 1000
End Sub
Изменено: bigorq - 05.10.2022 13:52:00
 
Цитата
написал:
Цитата
Georgetta Monson написал:
Что делает вот эта строка:
А самому попробовать лень?
Код
    [URL=#]?[/URL]       1  2  3      Sub   test()        Debug.Print (7654 - 7654   Mod   1000) / 1000    End   Sub   
 
Мы даже Debug.Print не изучали. Так что не лень, просто не знаю.
Изменено: Georgetta Monson - 05.10.2022 14:08:05
 
Цитата
Georgetta Monson: Мы даже Debug.Print не изучали
а вы спросите препода, как можно вообще писать код без возможности его отладки…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
написал:
Цитата
Georgetta Monson: Мы даже Debug.Print не изучали
а вы спросите препода, как можно вообще писать код без возможности его отладки…
Хорошая идея, спрошу.
 
Цитата
Что делает вот эта строка:
a = (x - x Mod 1000) / 1000
?

x Mod 1000 - остаток от деления числа х на 1000.
Поэтому "x - x Mod 1000" - есть округление числа х вниз до ближайшего кратного 1000.
Следовательно, (x - x Mod 1000) / 1000 - первая цифра в четырехзначном числе х.
 
Цитата
Sergey U: Следовательно, (x - x Mod 1000) / 1000 - первая цифра в четырехзначном числе х
можно получить её гораздо проще: Left$(x,1)  :)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous,

Я так понимаю, что эту функцию они еще не проходили ))
 
Цитата
Sergey U: Я так понимаю, что эту функцию они еще не проходили ))
судя по задачам - шарашка с учителями, далёкими от VBA и преподавания…
Это ж надо - проверку символов через Mod решать  8-0
Изменено: Jack Famous - 05.10.2022 15:18:11
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
написал:
Jack Famous,

Я так понимаю, что эту функцию они еще не проходили ))
Верно.

Про препода ничего не могу сказать, но уже есть подозрения, что ведёт не туда...
Есть желающие позаниматься?  :D  
 
Georgetta Monson, задавайте вопросы, готовьте примеры — так и научитесь. Совершенно бесплатно  ;)
Если прям нужен наставник на коммерческой основе - есть платная ветка. У нас немало спецов по VBA (и не только).
Изменено: Jack Famous - 05.10.2022 15:50:17
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
учили-не-учили
а учиться чему-то самостоятельно строго запрещено?
программирование позволяет экспериментировать с кодом пока он не начнет работать как следует ничем не рискуя при этом
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
написал:
задавайте вопросы, готовьте примеры — так и научитесь
Принято.
Форум - держись крепче!
 
Офф топ: сделано самостоятельно:
Код
'12. Дано трехзначное число. Переставьте первую и последнюю цифры. На примере 654.
Sub homework0212()
            
    Dim x As Integer, a As Integer, b As Integer, c As Integer
    x = InputBox("Enter number")
    
    a = (x - (x Mod 100)) / 100 'res=6
    MsgBox (a)
    c = (x Mod 100) Mod 10 'res=4, третья цифра
    MsgBox (c)
    b = (x - ((a * 100) + c)) / 10
    MsgBox (b)
    
    
    a = a + c
    c = a - c
    a = a - c
    
    Cells(1, 1) = (a & b & c)
                                  
End Sub
 
тоже самостоятельно сделал:
Код
Sub Repl654()
  Dim s$: s = 654
  MsgBox Right(s, 1) & Mid(s, 2, 1) & Left(s, 1)
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
написал:
тоже самостоятельно сделал:
Код
    [URL=#]?[/URL]       1  2  3  4      Sub   Repl654()        Dim   s$: s = 654        MsgBox Right(s, 1) & Mid(s, 2, 1) & Left(s, 1)    End   Sub   
 
С учётом того, что максимум изученного составляют арифметические действия с переменными, Ваше решение гениально!  ;)  
Изменено: Georgetta Monson - 06.10.2022 07:58:26
 
кокетничаете... Mod не арифметическое действие.
а освоить Right, Left и Mid - как бы материала в 3 раза больше, но не сложнее, чем Mod
см. ниже. оператор вам в коллекцию! (возможно звучит не очень, но он там действительно есть)
и все, что вносит пользователь - нужно проверять. замечено, что пользователи - это те еще вредители!
Код
Sub Digit3()
  Dim a, b, c, v&
  v = InputBox("Enter number (3 digit)")
  If v < 100 Or v > 999 Or Len("" & v) <> 3 Then Exit Sub
  c = v \ 100 'целая часть деления
  a = v Mod 10
  b = (v - c * 100 - a) / 10
  MsgBox v & "  ==> " & a & b & c
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
OFF

Цитата
Ігор Гончаренко: Mod не арифметическое действие
я бы поспорил
Изменено: Jack Famous - 06.10.2022 09:27:27
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
я бы  поспорил
а я не стану, я знаю всего 6 арифметических действий
каждый, кто знает больше - уже выиграл в споре, в котором я не буду участвовать))
Изменено: Ігор Гончаренко - 06.10.2022 09:47:10
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, ок - не действие, но к арифметике относится, а у Georgetta Monson я не видел, чтобы Mod назывался арифметическим действием. Это, если уж вот так докапываться до букв  :)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
в коллекцию:
Код
Sub i()
MsgBox StrReverse(654)
End Sub
 
Бахтиёр, блин, точно!  :D  :idea:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
однако... StrReverse - это "архиправильно", как говаривал один не упокоенный вождь)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Страницы: 1
Наверх