Здравствуйте. Есть вот это: Дано четырехзначное число. Верно ли, что цифр в нем расположены по убыванию? (Например, 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, Добрый день, замените Integer на Long. Инфа тут >>> Правда если у вас будут числа с плавующей запятой то тогда уже либо Double или Variant
Georgetta Monson: Дано четырехзначное число. Верно ли, что цифр в нем расположены по убыванию? (Например, 4311 - нет, 9871 - да)
почему так? Уточните словами чёткое условие определения убывания…
Каждая цифра со второй должна быть меньше предыдущей
Код
Sub t()
Dim tx$, s&, num&, l&, nPrev&, nThis&
num = 6542: tx = num: l = Len(tx)
If l < 2 Then GoTo no
nPrev = Left$(tx, 1)
For s = 2 To l
nThis = Mid$(tx, s, 1)
If nThis >= nPrev Then GoTo no
nPrev = nThis
Next s
MsgBox "YES": Exit Sub
no: MsgBox "NO"
End Sub
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
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
[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 ?
а вы спросите препода, как можно вообще писать код без возможности его отладки…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Что делает вот эта строка: 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)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Georgetta Monson, задавайте вопросы, готовьте примеры — так и научитесь. Совершенно бесплатно Если прям нужен наставник на коммерческой основе - есть платная ветка. У нас немало спецов по VBA (и не только).
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
учили-не-учили а учиться чему-то самостоятельно строго запрещено? программирование позволяет экспериментировать с кодом пока он не начнет работать как следует ничем не рискуя при этом
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
'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
кокетничаете... 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
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Georgetta Monson, Про операторы Mod и \ (целочисленное деление) узнал сильно позднее (а начал использовать относительно недавно), чем строковые — когда уже весьма неплохо ориентировался на VBA. Для математики они, конечно, нужны, но строковые гораздо чаще необходимы — если так можно сравнивать по частоте использования на основании личного опыта.
Проблема не в порядке изучения, а в постановке задачи и определения способа её решения. Судя по вашей задаче и ограничении методов её решения до, мягко говоря, неудобных — бежать вам надо от таких преподов, потому что уметь неправильно это намного хуже, чем не уметь.
Решение перестановки строкой Right(s, 1) & Mid(s, 2, 1) & Left(s, 1) достаточно прочитать, чтобы понять, что произошло: берём из s 1 символ СПРАВА, потом 1 символ со 2ой позиции, потом 1 символ СЛЕВА. В вашем же решении можно вообще не понять, что происходит, если не знать. И дело не в вас, а в выборе метода.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Ігор Гончаренко, ок - не действие, но к арифметике относится, а у Georgetta Monson я не видел, чтобы Mod назывался арифметическим действием. Это, если уж вот так докапываться до букв
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄