Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: 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 ?
-
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))
-
Miten tuon Bashillä (ja vain Bashillä) tekisitte ?
Bash ei ole oikea työkalu tällaiseen.
-
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 ?
-
voihan laskuja putkittaa bc-ohjelmallekin
echo 'scale=1; 24/5' |bc
Lisä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).
-
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 :)
-
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
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).
-
Onnistuu näemmä noinkin. Kiitos vinkistä.
Täytynee syventyä vielä awk:iin. Taulukot ovat tietty kova sana....
-
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:
$ 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:
$ dc <<< "4 6 * 5 sm[lm+]s1dlm%0!=1lm/lm*p"
-
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.
-
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:
$ i=24
$ k=5
$ (( i = (i + (i % k > 0 ? k : 0)) / k * k ))
$ echo "Tulos: $i"
Tarkemmin ajatellen tämä on parempi.
$ i=24
$ k=5
$ (( i = i % k == 0 ? i : (i / k + 1) * k ))
$ echo "Tulos: $i"