Вычислительные решения квадратного уравнения в bash - PullRequest
1 голос
/ 20 мая 2019

Спасибо, что нашли время, чтобы прочитать вопрос, так что в основном у меня есть проблема с моей домашней работой о том, как вычислить триномиальное решение.Я знаю, что на сайте есть и другие учебные пособия, но я хочу показать вам, что я придумала, и провести меня через мои проблемы.Я попытался изменить какой-то код или изменения здесь и там, но не сильно

#!/bin/bash
read a
read b
read c

d=$((b*b-4*a*c))

if ((d>=0)); then
    calc=$(echo "sqrt ($d)" | bc )
    x1=$((-b/2*a+calc/2*a))
    x2=$((-b/2*a-calc/2*a))
    echo "$x1""$x2"
else
    echo "To trionimo den exei pragmatikes rizes"
fi

После того, как я попробую любой набор чисел, он просто покажет мне ошибки в разных строках.

Ответы [ 2 ]

3 голосов
/ 20 мая 2019

Это домашнее задание.Поэтому я не буду предоставлять вам полностью выписанное решение, я дам вам информацию и укажу вам правильное направление.


общее примечание: когда вы закончите писать сценарийСкопируйте и вставьте его в 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 может работать только тогда и только тогда, когда вход очень хорошо спроектирован и должен удовлетворять следующим условиям:

  1. Дискриминант d является идеальным квадратом.Таким образом, он должен иметь любое из следующих значений: 1 4 9 16 25 36 49 64 81 100 ... n^2

  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 можно сделать с помощью таблицы поиска или простого двоичного поиска.

0 голосов
/ 20 мая 2019

для нескольких изменений, используя zsh вместо bash note -l option

calc=$(echo "sqrt ($d)" | bc -l)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...