Operacje matematyczne w bashu

Potrzebujesz pomocy z C, C++, perl, python, itp.
wasalek
Posty: 4
Rejestracja: 23 maja 2007, 00:58

Operacje matematyczne w bashu

Post autor: wasalek »

Witam, jestem nowy na forum, liczę na Waszą pomoc. Mam problem z wyrażeniami matematycznymi w bashu. Piszę skrypt obliczający pierwiastki równania kwadratowego, jednak mam problem ze sformułowaniem prawidłowych operacji matematycznych w nawiasach. Tutoriale nie pokazują bardziej skomplikowanych przykładów obliczeń z ustaloną kolejnością wykonywania działań, w C++ pogrupowanie w nawiasy nie sprawiało mi problemu, w BASHu ciagle dostaje komunikaty o bledzie w skladni. Czy ktoś jest mi w stanie pomóc i poprawić mój skrypt, lub chociaż podać jakieś wskazówki, np jak obliczyć pierwiastek z danej zmiennej lub tez policzyc wyrazenie typu B^2 - 4*A*C. Zamieszczam mój kod:

Kod: Zaznacz cały

#!/bin/bash

function pierwiastek
	{
	echo "Podaj A: ";
	read A;
	echo "Podaj B: ";
	read B;
	echo "Podaj C: ";
	read C;
	$DELTA=[$B*$B-4*$A*$C]
	
	
	PIERW=(sqrt $DELTA)
	    if [$DELTA = 0]; then
	    P0=[-1*$B/2*$A]
	    echo "Rownanie posiada jeden pierwiastek: $P0";
	    elif [$DELTA > 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
	
	
	}
pierwiastek;
Gość

Post autor: Gość »

Miałeś tyle błędów składni, że nie dziw, iż Ci wywalało :)

Masz poprawione :

Kod: Zaznacz cały

#!/bin/bash 

pierwiastek()
{ 
    echo "Podaj A: "
    read A
    echo "Podaj B: "
    read B
    echo "Podaj C: "
    read C
    DELTA="$(( B*B-4*A*C ))"
    
    
    PIERW="$(( DELTA^2 ))"
        if [ "$DELTA" -eq 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 
    
    
} 

pierwiastek

Pozdrawiam
wasalek
Posty: 4
Rejestracja: 23 maja 2007, 00:58

Post autor: wasalek »

dzieki za natychmiastowa pomoc, poprawiles wszystkie bledy w skladni, pozostal tylko problem wyciagniecia pierwiastka ze zmiennej

Kod: Zaznacz cały

PIERW="$(( DELTA^2 ))" 
Na pierwszy rzut oka operator ^ podnosi do potęgi, jednak dzieje się całkowicie coś innego - po podstawieniu za A=6 B=7 C=1 skrypt prawidlowo wylicza DELTA = 25, jednak z wyrażenia które napisałeś dla zmiennej PIERW wyliczana jest w tym przypadku wartość 27, tak jakby zostało wykonane dodawanie "$(( DELTA^2 ))" =>>> 25+2

jak uzyskać pierwiastek ?
Gość

Post autor: Gość »

wasalek pisze:jak uzyskać pierwiastek ?
Tak :

Kod: Zaznacz cały

Debian  [pts/1]  [10:06:04]  [ ~ ]
 >> echo "$(( 25**2 ))"
625

Pozdrawiam
jang
Beginner
Posty: 208
Rejestracja: 26 stycznia 2007, 14:38

Post autor: jang »

Kod: Zaznacz cały

a=`echo "sqrt (25)" | bc`
echo $a
wynik -> 5
Gość

Post autor: Gość »

O żesz !

Ale gafa - podałem potęgę zamiast pierwiastka :D

Wybaczcie
wasalek
Posty: 4
Rejestracja: 23 maja 2007, 00:58

Post autor: wasalek »

jang pisze:a=`echo "sqrt (25)" | bc`
echo $a

wynik -> 5
Pierwiastkowanie dziala, ale jedynie jesli wynikiem jest liczba całkowita. Czy BASH umozliwia operacje na zmiennych innych od integer?
jang
Beginner
Posty: 208
Rejestracja: 26 stycznia 2007, 14:38

Post autor: jang »

Kod: Zaznacz cały

a=`echo "scale=5 ; sqrt (25.25)" | bc`
echo $a
wynik -> 5.02493

-------------------------------------------

Kod: Zaznacz cały

a=`echo "(5.02493^2)" | bc`
echo $a
wynik -> 25.24992

//edit
używaj tagów code
mlyczek
wasalek
Posty: 4
Rejestracja: 23 maja 2007, 00:58

Post autor: wasalek »

Jak poprawnie sformułowac wyrazanie ze zmienna niecalkowita - błąd pojawia się przy obliczaniu P1 i P2. Przedstawiam kod skryptu i wynik jego działania:

Kod skryptu:

Kod: Zaznacz cały

#!/bin/bash

pierwiastek()
{
    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" -eq 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
        
}
pierwiastek
Wynik działania:

Kod: Zaznacz cały

wasal@stirlitz:~$ ./skrypt
Podaj A:
6
Podaj B:
7
Podaj C:
1
Delta wynosi: 25  , jej pierwiastek to: 5.00000
./skrypt: line 20: 5.00000: syntax error in expression (error token is ".00000")
./skrypt: line 21: 5.00000: syntax error in expression (error token is ".00000")
Rownanie posiada dwa pierwiastki:   i
ODPOWIEDZ