[+] Bash - obliczanie równania kwadratowego

Potrzebujesz pomocy z C, C++, perl, python, itp.
homoxymoronomatura
Posty: 2
Rejestracja: 31 grudnia 2011, 14:27

[+] Bash - obliczanie równania kwadratowego

Post autor: homoxymoronomatura »

Witam!
Próbuję napisać skrypt obliczający miejsca zerowe z równania kwadratowego. Dopiero uczę się basha i nie mogąc sobie poradzić. Postanowiłem ściągnąć gotowca i sprawdzić co ostatnio robiłem źle w swoim skrypcie. Znalazłem taki program:

Kod: Zaznacz cały

#!/bin/bash    echo "Podaj A: "
    read A
    echo "Podaj B: "
    read B
    echo "Podaj C: "
    read C
    DELTA="$((B*B-4*A*C))"
    PIERW=`echo "scale=5 ; sqrt($DELTA)" | bc`
    
    echo "Delta wynosi: $DELTA  , jej pierwiastek to: $PIERW"
    
        if [ "$DELTA" = 0 ]; then 
            P0="$(( -1*B/2*A ))"
            echo "Rownanie posiada jeden pierwiastek: $P0"
        elif [ "$DELTA" -gt 0 ]; then
            P1="$(( -1*B+PIERW/2*A ))"
            P2="$(( -1*B-PIERW/2*A ))"
            echo "Rownanie posiada dwa pierwiastki: $P1  i  $P2"
        else
            echo "To rownanie nie posiada pierwiastkow"
        fi
        
Przebieg jego działania jest np. taki:

Kod: Zaznacz cały

Podaj A: 
2
Podaj B: 
8
Podaj C: 
3
Delta wynosi: 40, jej pierwiastek to: 6.32455
./test: line 17: 6.32455: błąd składni: nieprawidłowy operator arytmetyczny (error token is ".32455")
Niestety nie jestem w stanie poradzić sobie z tym problemem. Nie wiem co oznacza ten błąd i zwracam się do Was z prośbą o pomoc w napisaniu tego programu.
Awatar użytkownika
Rafal_F
Moderator
Posty: 2350
Rejestracja: 29 sierpnia 2008, 16:45

Post autor: Rafal_F »

Bash nie wykonuje operacji na liczbach zmiennopozycyjnych.
To działa:

Kod: Zaznacz cały

#!/bin/bash
echo "Podaj A: "
    read A
    echo "Podaj B: "
    read B
    echo "Podaj C: "
    read C
    DELTA="$((B*B-4*A*C))"
    PIERW=`echo "scale=5 ; sqrt($DELTA)" | bc`
    CZYZERO=`echo "$DELTA==0" | bc`
    CZYWIEKSZE=`echo "$DELTA>0" |bc`
    echo "Delta wynosi: $DELTA  , jej pierwiastek to: $PIERW"
    
        if [ "$CZYZERO" = 1 ]; then 
              P0=`echo "scale=5 ;(-1*$B)/(2*$A)" | bc`
            echo "Rownanie posiada jeden pierwiastek: $P0"
        elif [ "$CZYWIEKSZE"=1 ]; then
            P1=`echo "scale=5 ;(-1*$B-$PIERW)/(2*$A)" | bc`
            P2=`echo "scale=5 ;(-1*$B+$PIERW)/(2*$A)" | bc`
            echo "Rownanie posiada dwa pierwiastki: $P1  i  $P2"
        else
            echo "To rownanie nie posiada pierwiastkow"
        fi
 
homoxymoronomatura
Posty: 2
Rejestracja: 31 grudnia 2011, 14:27

Post autor: homoxymoronomatura »

Dziękuję za pomoc. Ten skrypt nie działal w przypadku gdy delta wychodziła ujemna(kalkulator nie mógł wtedy wyciągnąć pierwiastka), ale po kilku poprawkach wszystko jest w porządku. Jeszcze raz dziękuję za pomoc i życzę szczęśliwego Nowego Roku.
Poniżej zamieszczam kod dla przyszłych pokoleń.

Kod: Zaznacz cały

 #!/bin/bashecho "Podaj A: "
    read A
    echo "Podaj B: "
    read B
    echo "Podaj C: "
    read C
    DELTA="$((B*B-4*A*C))"
    if [ $DELTA -ge 0 ]; then
    PIERW=`echo "scale=5 ; sqrt($DELTA)" | bc`
    fi
    CZYZERO=`echo "$DELTA==0" | bc`
    CZYWIEKSZE=`echo "$DELTA>0" |bc`
    echo "Delta wynosi: $DELTA"
    
        if [ "$CZYZERO" = 1 ]; then
           P0=`echo "scale=5 ;(-1*$B)/(2*$A)" | bc`
            echo "Rownanie posiada jeden pierwiastek: $P0"
        elif [ "$CZYWIEKSZE" = 1 ]; then
            P1=`echo "scale=5 ;(-1*$B-$PIERW)/(2*$A)" | bc`
            P2=`echo "scale=5 ;(-1*$B+$PIERW)/(2*$A)" | bc`
            echo "Rownanie posiada dwa pierwiastki: $P1  i  $P2"
        else
            echo "To rownanie nie posiada pierwiastkow"
        fi
ODPOWIEDZ