Это домашнее задание.Поэтому я не буду предоставлять вам полностью выписанное решение, я дам вам информацию и укажу вам правильное направление.
общее примечание: когда вы закончите писать сценарийСкопируйте и вставьте его в http://www.shellcheck.net и проверьте возможные проблемы.Если shellcheck сообщает о них, перейдите по ссылкам, предложенным на этой странице, и прочитайте информацию о том, как решить проблему.Кроме того, попытайтесь понять, почему это проблема.(вы также можете установить программу проверки оболочки в вашей системе)
примечание по математике: ваши решения для x1
и x2
неверны.Обозначение $((-b/2*a+calc/2*a))
фактически умножается на a
и не делит .Поэтому он должен читать $(( (-b+calc)/(2*a) ))
и $(( (-b-calc)/(2*a) ))
примечание по bash: Bash не знает арифметики с плавающей точкой.
ARITHMETICОЦЕНКА: Оболочка позволяет при определенных обстоятельствах вычислять арифметические выражения (см. Встроенные команды let и Declare и Расширение арифметики).Оценка выполняется в целых числах фиксированной ширины без проверки переполнения, хотя деление на 0 перехватывается и помечается как ошибка.
источник: man bash
Это означает, что решение bash может работать только тогда и только тогда, когда вход очень хорошо спроектирован и должен удовлетворять следующим условиям:
Дискриминант d
является идеальным квадратом.Таким образом, он должен иметь любое из следующих значений: 1 4 9 16 25 36 49 64 81 100 ... n^2
Из решений x1
и x2
мы знаем, что b
должно делиться на 2*a
и то же самое относится к calc
и, таким образом, d
должно делиться на 4*a*a
.
Существует только несколько возможных бесконечных комбинаций, которые удовлетворяют этому условию.
Если вы хотите, чтобы ваше решение было чисто bash, это также означает, что вы не можете использовать какие-либо другие инструменты, такие как bc
или awk
или python
или perl
.Подробный список таких обходных путей с такими инструментами можно найти здесь: Как выполнять целочисленные вычисления и вычисления с плавающей точкой, в bash или других языках / платформах? , но, к сожалению, вы не можете использовать это.Но это немного усложняет жизнь.
С этой целью я бы предложил использовать bc -l
для всех ваших математических вычислений.
d=$( bc - l <<< "$b*$b - 4.0*$a*$c" )
calc=$( bc - l <<< "sqrt($d)" )
x1=$( bc -l <<< "(-$b+$calc)/(2.0*$a)" )
Чтобы избежать использования echo
, мы используем HERESTRING
(см. man bash
)
Вы можете проверить, если d
больше нуля, протестировав с помощью регулярного выражения, если d
содержит дефис (-
) (поиск =~
в man bash
)
Но это будетвсе еще будьте обманщиком, когда используете bc
.Чисто баш сложно.Единственный способ увидеть, как я это делаю, - это умножить все ваши числа на большое число, а затем снова разделить.(Это можно сделать просто с помощью манипуляции со строками. Например, если входное значение равно 2
, преобразуйте его в 200000000
, если входное значение равно -2.5
, преобразуйте его в -250000000
(как если бы вы умножили на 100000000).sqrt
можно сделать с помощью таблицы поиска или простого двоичного поиска.