Seuraa 
Viestejä1311

Ovatko ohjelmointikielet jo nykyisellään täydellisiä?

Itse kaipaisin esim. operaattoreihin sellaista kuin: On lähempänä kuin.

Esim.

Jos x on lähempänä 75 kuin y niin....

 

En tiedä olisiko tuolla paljoa käyttöarvoa, mutta tahtoisin vielä sellaisenkin, jolla kykenee

vertailemaan kirjaimia tai sanoja.

 

Jos Matti on lähempänä Merja kun Pasi then ...

Tai jos h on lähempänä c kuin w then ......

 

Kannattaisko ohjelmointikieliin lisätä operaattoreita? 

Kommentit (10)

JPI
Seuraa 
Viestejä26805
Titanic

Ovatko ohjelmointikielet jo nykyisellään täydellisiä?

Itse kaipaisin esim. operaattoreihin sellaista kuin: On lähempänä kuin.

Esim.

Jos x on lähempänä 75 kuin y niin....

En tiedä olisiko tuolla paljoa käyttöarvoa, mutta tahtoisin vielä sellaisenkin, jolla kykenee

vertailemaan kirjaimia tai sanoja.

Jos Matti on lähempänä Merja kun Pasi then ...

Tai jos h on lähempänä c kuin w then ......

Kannattaisko ohjelmointikieliin lisätä operaattoreita? 

Jos x on lähempänä 75 kuin y niin....:

if abs(x-75) < abs(y-75) then...

3³+4³+5³=6³

abskissa
Seuraa 
Viestejä3654

60-luvun jälkeen ei enää ole ollut muodissa laajentaa kieliä tuohon tapaan. Sen sijaan uudet funktiot -- operaattori on aina funktio -- toteutetaan kirjastoina. Joissain kielissä itse toteutettuja operaatioita voidaan käyttää aivan kuten kielen omia operaattoreita. Vastaus kysymykseen on siis ei: kieliin ei kannata toteuttaa liikaa operaattoreita. Sen sijaan kielet pitää suunnitella siten, että toiminnallisuutta voidaan helposti laajentaa kirjastoilla.

No, tuollainen sovellusspesifi toiminnallisuus toki rakennellaan yleensä ihan sovelluksen omiin moduleihin. Oliokielissä, jotka nyt ovat valtavirtaa, kysymykseen 'onko x lähempänä y:tä vai z:taa' vastaisi tyypillisesti olio x itse. Implementaatiossa se näkyisi siten, että x:lle olisi määritelty funktio, jossa asia tutkittaisiin. Tämä funktio voisi tietty olla ihan vain tavan etäisyysfunktio, jos tuossa nyt olisi pelissä jonkinlainen metriikka. Sanojen etäisyyttä voidaan mitata vaikka ns. edit distancella.

We're all mad here.

Sisältö jatkuu mainoksen alla
Sisältö jatkuu mainoksen alla
abskissa
Seuraa 
Viestejä3654

Tässä vielä yksinkertaistettu esimerkki siitä, miten "lähempänä kuin" voidaan implementoida etäisyysfunktiolla. Kielenä Ruby.

Alla on 24-bittisten RGB-värien käsittelyyn tehty luokka. Luokassa ei ole mitään muuta toiminnallisuutta, kuin "distance_to"-metodi (Rubyssä tällaisia funktioita kutsutaan metodeiksi), joka laskee värin etäisyyden toiseen väriin. Oikeasti tällaisessa luokassa olisi paljon muutakin.

----8<----

class Color
    attr_reader :r, :g, :b
   
    def initialize(r, g, b)
        @r = r
        @g = g
        @b = b
    end

    def distance_to(c)
        Math.sqrt((@r - c.r)**2 + (@g - c.g)**2 + (@b - c.b)**2) * 0.002264118702704415
    end
end

----8<----

Etäisyys lasketaan tuossa 3-ulotteisten vektorien euklidisena etäisyytenä, joka vain skaalataan siten, että maksimietäisyydeksi, esimerkiksi mustan ja valkoisen väliseksi etäisyydeksi, tulee tasan 1. Värien etäisyyden voi tietty määritellä muullakin tavalla.

Jos nyt esimerkiksi pitää selvittää, onko oranssi lähempänä vihreää vai sinistä, homma hoituu näin:

----8<----

orange = Color.new(255, 128, 0)

green = Color.new(0, 255, 0)

blue = Color.new(0, 0, 255)

if (orange.distance_to(green) < orange.distance_to(blue))

    puts "oranssi lähempänä vihreää"

elsif (orange.distance_to(green) > orange.distance_to(blue))

    puts "oranssi lähempänä sinistä"

else

    puts "oranssi yhtä lähellä vihreää kuin sinistä"

end

----8<----

Näin siis Ruby ei tarvitse läheisyys- tai etäisyysoperaattoria. Etäisyys voidaan ilmaista olioiden ominaisuutena. Se tietty edellyttää sitä, että olioiden etäisyys osataan määritellä.

We're all mad here.

Titanic
Seuraa 
Viestejä1311

Yritän Lazarus Pascal kielistä ohjelmaa, joka laskee planeettojen kiertoaikojen perusteella linjautumiset, joissa on monia planeettoja lähellä toisiaan, mutta kun teen esim. jakolaskun 800000 / 4333 niin saan tulokseksi desimaaliluvun 184,6295868912993

Kuinka tuon desimaaliluvun voi PYÖRISTÄÄ LUVUKSI 184 tai 185?

Jos on muuttuja luku 1 as Single 

ja muuttuja luku 2 as Integer.

En siis edeltäkäsin voi tietää jakolaskun tulosta, koska käytän ScrollBaria, josta voi valita vapaasti vuoden väliltä 100 000 eKr - 100 000 jKr.

Lyhyesti: Muuttujassa on desimaaliluku, jonka arvoa tai desimaalien määrää en tiedä.

Kuinka PYÖRISTÄN tuon luvun lähimmäksi kokonaisluvuksi?

daiska
Seuraa 
Viestejä655
Titanic

Yritän Lazarus Pascal kielistä ohjelmaa, joka laskee planeettojen kiertoaikojen perusteella linjautumiset, joissa on monia planeettoja lähellä toisiaan, mutta kun teen esim. jakolaskun 800000 / 4333 niin saan tulokseksi desimaaliluvun 184,6295868912993

Kuinka tuon desimaaliluvun voi PYÖRISTÄÄ LUVUKSI 184 tai 185?

Jos on muuttuja luku 1 as Single 

ja muuttuja luku 2 as Integer.

En siis edeltäkäsin voi tietää jakolaskun tulosta, koska käytän ScrollBaria, josta voi valita vapaasti vuoden väliltä 100 000 eKr - 100 000 jKr.

Lyhyesti: Muuttujassa on desimaaliluku, jonka arvoa tai desimaalien määrää en tiedä.

Kuinka PYÖRISTÄN tuon luvun lähimmäksi kokonaisluvuksi?

 

Pitäisi löytyä jonkinlaiset floor() ja ceil() toteutukset Pascalistakin. floor pyöristää alaspäin ja ceil ylöspäin.

Aika pitkältä aikaväliltä lasket linjautumiset. Ei kovin pitkällä aikavälillä toimi pelkkä kierrosaikoihin perustuva linjautumis-laskenta.

jjw
Seuraa 
Viestejä795
Titanic

Yritän Lazarus Pascal kielistä ohjelmaa, joka laskee planeettojen kiertoaikojen perusteella linjautumiset, joissa on monia planeettoja lähellä toisiaan, mutta kun teen esim. jakolaskun 800000 / 4333 niin saan tulokseksi desimaaliluvun 184,6295868912993

Kuinka tuon desimaaliluvun voi PYÖRISTÄÄ LUVUKSI 184 tai 185?

Jos on muuttuja luku 1 as Single 

ja muuttuja luku 2 as Integer.

En siis edeltäkäsin voi tietää jakolaskun tulosta, koska käytän ScrollBaria, josta voi valita vapaasti vuoden väliltä 100 000 eKr - 100 000 jKr.

Lyhyesti: Muuttujassa on desimaaliluku, jonka arvoa tai desimaalien määrää en tiedä.

Kuinka PYÖRISTÄN tuon luvun lähimmäksi kokonaisluvuksi?

luku2 := round(luku1)

o_turunen
Seuraa 
Viestejä14900

Harva tietokone toimii desimaaliesityksellä. Binääri- tai hexadesimaalinotaatiossa riittää selvittää se, onko pisteen jälkeen nolla vai ykkönen.

Luku katkaistaan pisteen jälkeen ja seuraava bitti lisätään lukuun.

 

Korant: Oikea fysiikka on oikeampaa kuin sinun klassinen mekaniikkasi. Jos olet eri mieltä kanssani olet ilman muuta väärässä.

abskissa
Seuraa 
Viestejä3654

Round-funktiolla hoituu pyöristäminen, kuten jjw jo ehtikin vastaamaan.

Free Pascalin dokumentaatio -- kielen speksit ja standardikirjastojen kuvaukset -- löytyvät täältä. Kannattaa lukaista round-funktion kuvaus.

Sen verran pitää oikaista kysymystä, että oikeastaan et käsittele desimaalilukua vaan binääristä liukulukua.

Muoks: Nyt kun itse lukaisin round-funktion kuvauksen, niin huomasin että sehän ei pyöristä "half up"-säännöllä, vaan "bankers' rounding"-säännöllä. Puolikkaat pyöristyvät lähimpään parilliseen lukuun.

We're all mad here.

Titanic
Seuraa 
Viestejä1311

O.k. Kiitokset avusta! Kirjoitin pienen ohjelman tutkimaan planeettojen linjautumisia. Ei tarvinnut kuin kuusi ScrollBaria ja muutaman rivin. Ei kyllä välttämättä ole kovin tarkka.

procedure TForm1.ScrollBar6Change(Sender: TObject);
begin

  Edit1.Caption := IntToStr(ScrollBar6.Position);
  liuku1 := 365.25 * ScrollBar6.Position;
  liuku1 := 713476.25 + liuku1;
  liuku2 := 365.25 * ScrollBar6.Position;
  liuku2 := 713476.25 + liuku2;
  liuku3 := 365.25 * ScrollBar6.Position;
  liuku3 := 713476.25 + liuku3;
  liuku4 := 365.25 * ScrollBar6.Position;
  liuku4 := 713476.25 + liuku4;
  liuku5 := 365.25 * ScrollBar6.Position;
  liuku5 := 713476.25 + liuku5;

  begin
  Repeat liuku1 := liuku1 - 4331;
    until   liuku1 <= 4331;
  end;

  begin
  Repeat liuku2 := liuku2 - 10747;
    until   liuku2 <= 10747;
  end;

  begin
  Repeat liuku3 := liuku3 - 30589;
   until   liuku3 <= 30589;
  end;

  begin
  Repeat liuku4 := liuku4 - 59800;
  until   liuku4 <= 59800;
  end;

  begin
  Repeat liuku5 := liuku5 - 90589;
  until   liuku5 <= 90589;
  end;

  jupiter := round(liuku1);
  saturnus := round(liuku2);
  uranus := round(liuku3);
  neptunus := round(liuku4);
  pluto := round(liuku5);

  ScrollBar1.Position := jupiter;
  ScrollBar2.Position := saturnus;
  ScrollBar3.Position := uranus;
  ScrollBar4.Position := neptunus;
  ScrollBar5.Position := pluto;

end;

 

Tuo 713476.25 on vain eräänlainen nollakohta eli kun oli suuri linjautuminen 23. toukokuuta 1953 eKr niin käytin sitä eräänlaisena nollakohtana kaikille planeetoille. 713476.25 päivää on vuoden 1953 eKr toukokuusta vuoteen nolla.

Tuo laskee linjautumiset siis vuodesta 0 eteenpäin. En valitettavasti osannut tehdä luotettavaa eKr linjautumisia koskevaa osiota.

Nuo liuku1-5 muuttujien luvut ovat planeettojen kiertoajat päivissä.

 

 

Suosituimmat

Uusimmat

Sisältö jatkuu mainoksen alla

Uusimmat

Suosituimmat