#vbscript
#vbscript
Вопрос:
Я новичок в программировании и изучаю базовый курс программирования на скриптах VB в качестве требования для получения степени, над которой я работаю. У меня есть эта программа, которая преобразует числа по Цельсию в Фаренгейты и делает это с шагом и количеством, которое нужно просмотреть. Эта программа отлично работает в visual logic flow chart, и я потратил более 25 часов, просто пытаясь заставить эту программу работать. Я знаю, что это должно быть что-то совершенно глупое, но, будучи новичком в мире программирования, я в растерянности и не знаю ответов. Не мог бы кто-нибудь взглянуть на этот скрипт, он очень простой, и посмотреть, не упускаю ли я чего-нибудь. Ошибка всегда появляется после Else при fahtemp = (9/5) * tempaccum 32. Буду признателен за любую вставку. Заранее благодарю вас за ваше время. Джон
Option Explicit
Dim celtemp, amttemp, increment
Dim newtemp, tempaccum, fahtemp, loopnum, templist
celtemp = inputbox("What is your starting Temp?")
amttemp = inputbox("How many temperatures do you want displayed?")
increment = inputbox("What temperature increments do you want?")
Do while loopnum < amttemp
loopnum = loopnum 1
If loopnum = 1 then
tempaccum = celtemp
fahtemp = (9/5) * (tempaccum) 32
templist = "1." amp; "Cel Temp: " amp;tempaccum amp; "- " amp; "Fah Temp: " amp;fahtemp
else
tempaccum = tempaccum increment
fahtemp = (9/5) * tempaccum 32
templist = templist amp;" " amp;loopnum amp; "." amp; "Cel Temp: " amp;tempaccum amp; "- " amp; "Fah Temp: " amp;fahtemp
End If
newtemp = celtemp increment
Loop
Document.write "We are starting at Temp: " amp;celtemp
Document.write "<br> We are displaying " amp;amttemp amp; "times."
Document.write "<br> We are incrementing by: " amp;increment
Document.write "<br> The Temperature Table is as follows: " amp;templist
Комментарии:
1. Я добавил обновление к своему ответу после вашего последнего комментария. Надеюсь, это поможет. 🙂
Ответ №1:
Ошибка переполнения возникает при попытке сохранить значение, превышающее допустимое типом данных.
Если ваши входные данные слишком велики, вы столкнетесь с этой ошибкой.
Комментарии:
1. Хорошо, у меня есть эта часть. Итак, я думаю, что это не имеет никакого отношения к строке fahtemp, в которой она продолжает выходить из строя, и чему-то еще. Я говорю это только потому, что, если я введу 0 для моей начальной температуры и 5 для обоих приращений и количества, я все равно получу ту же ошибку. Если то, что вы говорите, верно, то 0-20 не может быть достаточно высоким значением, чтобы вызвать сбой. Это должно быть как-то связано с циклом или местом в памяти tempaccum. Спасибо за ответ
2. @Джон Гэммон: Смотрите мой ответ ниже для объяснения и исправлений.
Ответ №2:
@Jon Gammon: tempaccum = tempaccum increment
вычисляется не так, как вы могли бы подумать, вместо того, чтобы добавлять приращение как число, оно объединялось как строка, т. Е. если начальная температура равна 10
, приращение равно 5
и количество отображаемых раз равно 3
, вы ожидаете, что ваш результат будет
1. Cel Temp: 10 - Fah Temp: 50
2. Cel Temp: 15 - Fah Temp: 59
3. Cel Temp: 20 - Fah Temp: 68
Вместо этого вы получите
1. Cel Temp: 10 - Fah Temp: 50
2. Cel Temp: 105 - Fah Temp: 221
3. Cel Temp: 1055 - Fah Temp: 1931
Это то, что вызвало переполнение, потому что tempaccum
стало огромным, и дальнейшие умножения на нем нарушили бы работу скрипта. Document.Write
также недопустимый код VBScript, поэтому я превратил это в MsgBox
.
Вот рабочая и протестированная копия вашего скрипта, которую я немного переписал, чтобы исправить вышеупомянутые проблемы и немного улучшить его:
Option Explicit
Dim celtemp, amttemp, increment
Dim tempaccum, fahtemp, loopnum, templist
celtemp = inputbox("What is your starting temperature?")
amttemp = inputbox("How many temperatures do you want displayed?")
increment = inputbox("What temperature increments do you want?")
' Formula to converts Celcius to Fahrenheit
Function fahrenheit(ByRef celcius)
fahrenheit = ((9 / 5)* celcius) 32
End Function
' Some error checking
If NOT IsNumeric(amttemp) Then
amttemp = 1
Else
amttemp = Fix(amttemp) ' only interested in integer part '
End If
For loopnum = 1 To amttemp
If loopnum = 1 then
tempaccum = celtemp
fahtemp = fahrenheit(tempaccum)
templist = "1. " amp; "Cel Temp: " amp; tempaccum amp; _
" - " amp; "Fah Temp: " amp; fahtemp amp; vbCrLf
Else
tempaccum = celtemp (increment * (loopnum - 1))
fahtemp = fahrenheit(tempaccum)
templist = templist amp; loopnum amp; ". " amp; _
"Cel Temp: " amp; tempaccum amp; " - " amp; _
"Fah Temp: " amp; fahtemp amp; vbCrLf
End If
Next
MsgBox "Starting at temperature: " amp; celtemp amp; vbCrLf amp; _
"Displaying " amp;amttemp amp; " times." amp; vbCrLf amp; _
"Incrementing by: " amp;increment amp; vbCrLf amp; vbCrLf amp; _
"The temperature table is as follows: " amp; vbCrLf amp; templist, 0, _
"Temperature Converter"
Обновить
Мой класс довольно простой, мы не работали с функциями, и на самом деле единственное, что мы сделали, это входные данные, циклы while, выбор регистра и If . ИТАК, у меня было полно дел, пытаясь это закодировать. Хотя ваш работает блестяще, я боюсь, что он немного более продвинутый, чем тот, на котором мы находимся.
Я вижу, хорошо, я вернулся к исходному скрипту и обновил только те части, которые нарушали его, как упоминалось ранее. Вот новая рабочая копия:
Option Explicit
Dim celtemp, amttemp, increment
Dim tempaccum, fahtemp, loopnum, templist
celtemp = inputbox("What is your starting temperature?")
amttemp = inputbox("How many temperatures do you want displayed?")
increment = inputbox("What temperature increments do you want?")
loopnum = 1
Do While loopnum < CInt(amttemp)
If loopnum = 1 Then
tempaccum = celtemp
fahtemp = ((9 / 5) * tempaccum) 32
templist = "1. Cel Temp: " amp; tempaccum amp; " - " amp; "Fah Temp: " amp; fahtemp amp; vbCrLf
Else
tempaccum = celtemp (increment * loopnum)
fahtemp = ((9 / 5) * tempaccum) 32
templist = templist amp; loopnum amp; ". Cel Temp: " amp; tempaccum amp; " - " amp; "Fah Temp: " amp; fahtemp amp; vbCrLf
End If
loopnum = loopnum 1
Loop
MsgBox "Starting at temperature: " amp; celtemp amp; vbCrLf amp; _
"Displaying " amp; amttemp amp; " times." amp; vbCrLf amp; _
"Incrementing by: " amp; increment amp; vbCrLf amp; vbCrLf amp; _
"The temperature table is as follows: " amp; vbCrLf amp; templist, 0, _
"Temperature Converter"
Комментарии:
1. Потрясающе, это отлично работает, и это соответствует тому, где мы находимся в классе. Большое спасибо за вашу помощь. Я был близок, просто пропустил некоторые ключевые части. Ценю, что вы смотрите на это для меня. Джон