Kirjoittaja Aihe: Bash lauseke  (Luettu 3998 kertaa)

harras

  • Käyttäjä
  • Viestejä: 66
    • Profiili
Bash lauseke
« : 29.01.10 - klo:09.10 »
Seuraava tuottaa päänvaivaa....

((( 4 * 6 ) / 5 ) * 5 )

Yhtälössä pitäisi tuon jaon jälkeen tehdä pyöristys. Eli 24 / 5 = 4,8 =>5. Pitäisi siis päästä lopputulemaan 25.
Skriptissä kaikki luvut ovat muuttujia.
Miten tuon Bashillä (ja vain Bashillä) tekisitte ?


olle

  • Käyttäjä
  • Viestejä: 120
    • Profiili
Vs: Bash lauseke
« Vastaus #1 : 29.01.10 - klo:10.14 »
Seuraava tuottaa päänvaivaa....

((( 4 * 6 ) / 5 ) * 5 )

Yhtälössä pitäisi tuon jaon jälkeen tehdä pyöristys. Eli 24 / 5 = 4,8 =>5. Pitäisi siis päästä lopputulemaan 25.
Skriptissä kaikki luvut ovat muuttujia.
Miten tuon Bashillä (ja vain Bashillä) tekisitte ?


Bash osaa vain kokonaislukuja. Hae ensin jakojäännös  (4*6)%5 , kehittele siitä pyöristyssääntö (ensin koko lauseke  *10, lisää 5, sitten /10 ).
Menikö kutakuinkin näin ?

Editointi: ei siinä jakojäännöstä tarvitse, normaali kymmenellä kertominen, +5 ja jako kymmenellä tekee normaalin pyöristyksen:

$((((((10*6*4)/5)+5)/10)*5))

« Viimeksi muokattu: 29.01.10 - klo:11.43 kirjoittanut olle »

snifi

  • Vieras
Vs: Bash lauseke
« Vastaus #2 : 29.01.10 - klo:14.29 »
Miten tuon Bashillä (ja vain Bashillä) tekisitte ?

Bash ei ole oikea työkalu tällaiseen.

harras

  • Käyttäjä
  • Viestejä: 66
    • Profiili
Vs: Bash lauseke
« Vastaus #3 : 29.01.10 - klo:15.09 »
Tattis Olle, noinhan se toimii !
Itse yritin lisätä tuota 0,5:ttä ja kaikki printit ja exprit yms., ja ei lohjennut.

Tuohon snifin kommenttiin.
Itse en näistä kielistä mitään tiedä. Koetin kuitenkin tehdä valmiista Excel laskentaohjelmasta, käyttäjäystävällisemmän version ja hyvinhän se onnistui, lukuunottamatta tuota hankalaa pyöristystä.
Niin kysymys, mitä oleellista Bashistä puuttuu (ja toisin, mitä parempaa), jos verrataan muihin yleisimpiin kieliin ?


UbunTux

  • Käyttäjä
  • Viestejä: 2046
  • KubunTux
    • Profiili
Vs: Bash lauseke
« Vastaus #4 : 29.01.10 - klo:17.28 »
voihan laskuja putkittaa bc-ohjelmallekin
Koodia: [Valitse]
echo 'scale=1; 24/5' |bcLisäksi voi tehdä skriptejä muilla kielillä, joita suoritetaan bash-skriptistä käsin.
Komentorivityökaluilla voi ratkaista todella nopeasti jonkin ongelman, mutta aika rajallinen se on ja hiiiidaaas (riippuu tietysti siitä, onko sillä nopeudella mitään väliä ja mitä suoritetaan ja kuinka paljon).
« Viimeksi muokattu: 29.01.10 - klo:17.42 kirjoittanut UbunTux »
KDE neon
Uudempaa KDE:tä Ubuntulla

harras

  • Käyttäjä
  • Viestejä: 66
    • Profiili
Vs: Bash lauseke
« Vastaus #5 : 29.01.10 - klo:19.07 »
Jep, bc:n läpi tuon kaavan vedinkin.
Ongelmaksi siinäkin tuli tuo pyöristys. Tarve kun oli pyöristää ennen lopputulemaa, niin tuo scale ei futannu (tai en osannu).

Ja tuohon lopulliseen versioon muutin vielä tuota kaavaa niin, että +5 sijaan +10, niin pyöristää aina ylöspäin.....luultavasti aina.

Lyhyen kokemuksen perusteella, saa ainakin nuo excelit ja accessit korvattua kohtuu helpostikin. Katsotaan miten sitten kovemman testauksen kanssa käy. Niin ja grafiikka hyötyohjelmissa on lukutaidottomille  :)

UbunTux

  • Käyttäjä
  • Viestejä: 2046
  • KubunTux
    • Profiili
Vs: Bash lauseke
« Vastaus #6 : 29.01.10 - klo:19.54 »
Luku katkaistaan ennen ensimmäistä desimaalia
echo 4.8| cut -d '.' -f1
ensimmäinen desimaali
echo 4.8| cut -d '.' -f2

Pitkän kaavan mukaan onnistuu se näinkin  :P
Koodia: [Valitse]
alku=$(echo 'scale=1;4*6/5'|bc)
luku=$(echo $alku |cut -f1 -d '.'  )
eka=$(echo $alku|cut -f2 -d '.'  )

if [ $eka -gt 4 ]; then
 lisaa=1
else
 lisaa=0
fi
pyoristys=$(($luku + $lisaa))
tulos=$(($pyoristys*5))
echo $tulos


Jos jotan talukkoja on tarkoitus tehdä, niin awk olisi varmaan tutusmisen arvoinen (saa esim. tehokkaita onelinereita bash-skripteihin).
KDE neon
Uudempaa KDE:tä Ubuntulla

harras

  • Käyttäjä
  • Viestejä: 66
    • Profiili
Vs: Bash lauseke
« Vastaus #7 : 29.01.10 - klo:21.18 »
Onnistuu näemmä noinkin. Kiitos vinkistä.

Täytynee syventyä vielä awk:iin. Taulukot ovat tietty kova sana....

mgronber

  • Käyttäjä
  • Viestejä: 1458
    • Profiili
Vs: Bash lauseke
« Vastaus #8 : 29.01.10 - klo:23.36 »
Onko tarkoituksena siis tehdä pyöristys aina ylöspäin halutun kantaluvun mukaisesti? Jos luku ei ole tasan kantaluvun moninkerta niin se pyöristetään ylöspäin seuraavaan moninkertaan?

Sen voi laskea dc:n avulla esimerkiksi seuraavasti:
Koodia: [Valitse]
$ dc <<< "24 5 sm[lm+]s1dlm%0!=1lm/lm*p"

Ensimmäinen luku on pyöristettävä luku ja toinen on käytettävä kantaluku.

Tietysti nuo parametrit voivat olla laskutoimituksiakin eli ensimmäisen viestin mukainen laskutoimitus "4 * 6" olisi tuossa seuraavanlainen:
Koodia: [Valitse]
$ dc <<< "4 6 * 5 sm[lm+]s1dlm%0!=1lm/lm*p"

harras

  • Käyttäjä
  • Viestejä: 66
    • Profiili
Vs: Bash lauseke
« Vastaus #9 : 30.01.10 - klo:08.10 »
Oikein oivallettu, tuota kantaluvun moninkertaa lopulta hain.

Tuota antamaasi skriptiä en saanut vielä toimimaan, mutta tutkitaanpa sekin.
Tuntuu näitä vaihtoehtoja lopulta löytyvän. Ilmeisesti Bashilläkin voi kaiken tehdä, kyse sitten siitä onko se jouhevaa.

mgronber

  • Käyttäjä
  • Viestejä: 1458
    • Profiili
Vs: Bash lauseke
« Vastaus #10 : 30.01.10 - klo:18.00 »
Ilmeisesti Bashilläkin voi kaiken tehdä, kyse sitten siitä onko se jouhevaa.

Tuo minun ratkaisuni ei kyllä ole puhtaasti bashilla tehty vaikka sekin olisi kyllä mahdollista. Yleensähän bash on vain liima jolla yhdistetään eri sovelluksia halutun lopputuloksen saamiseksi.

Puhdas bash-ratkaisu voisi olla esimerkiksi tällainen:
Koodia: [Valitse]
$ i=24
$ k=5
$ (( i = (i + (i % k > 0 ? k : 0)) / k * k ))
$ echo "Tulos: $i"

Tarkemmin ajatellen tämä on parempi.
Koodia: [Valitse]
$ i=24
$ k=5
$ (( i = i % k == 0 ? i : (i / k + 1) * k ))
$ echo "Tulos: $i"
« Viimeksi muokattu: 30.01.10 - klo:18.14 kirjoittanut mgronber »