Ubuntu Suomen keskustelualueet

Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: harras - 29.01.10 - klo:09.10

Otsikko: Bash lauseke
Kirjoitti: harras - 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 ?

Otsikko: Vs: Bash lauseke
Kirjoitti: olle - 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))

Otsikko: Vs: Bash lauseke
Kirjoitti: snifi - 29.01.10 - klo:14.29
Miten tuon Bashillä (ja vain Bashillä) tekisitte ?

Bash ei ole oikea työkalu tällaiseen.
Otsikko: Vs: Bash lauseke
Kirjoitti: harras - 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 ?

Otsikko: Vs: Bash lauseke
Kirjoitti: UbunTux - 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).
Otsikko: Vs: Bash lauseke
Kirjoitti: harras - 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  :)
Otsikko: Vs: Bash lauseke
Kirjoitti: UbunTux - 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).
Otsikko: Vs: Bash lauseke
Kirjoitti: harras - 29.01.10 - klo:21.18
Onnistuu näemmä noinkin. Kiitos vinkistä.

Täytynee syventyä vielä awk:iin. Taulukot ovat tietty kova sana....
Otsikko: Vs: Bash lauseke
Kirjoitti: mgronber - 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"
Otsikko: Vs: Bash lauseke
Kirjoitti: harras - 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.
Otsikko: Vs: Bash lauseke
Kirjoitti: mgronber - 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"