The page has been modified since the last reload. Refresh now?

There are {{ pendingUpdatesCount() }} pending paragraph updates.

1-ulotteiset taulukot

Yksiulotteinen taulukko on kuin rivitalo: selvittääksemme tietyn henkilön asunnon meidän tarvitsee tietää vain asunnon (järjestys-)numero.

Voimme esimerkiksi sanoa, että Pekka asuu rivitalon asunnossa nro 3, ja Maija asunnossa 0. Huomaa, että indeksit eli taulukon alkioiden laskeminen alkaa aina nollasta.

{}

1. Taulukon esittely

Taulukko esitellään sanomalla taulukon alkioiden tyyppi, hakasulut ja taulukon nimi. Esimerkiksi:

{}
#

Please login to interact with this component

//
        int[] kuukausienPituudet;
        double[] keskilampotilat;
{}

2. Taulukon luominen

Erona tavalliseen muuttujaan taulukkomuuttuja on "vain" viite itse taulukkoon joka on jossakin muualla. Itse taulukko pitää luoda new TYYPPI[koko] kutsulla.

{}
#

Please login to interact with this component

//
        kuukausienPituudet = new int[12];
        keskilampotilat = new double[31];

Kun taulukko on luotu, ovat sen kaikki alkiot 0:ia.

{}

3. Taulukon alkioon sijoittaminen

Taulukon indeksit alkavat 0:sta. Taulukon alkioon voidaan sijoittaa uusi arvo NIMI[INDEKSI] = LAUSEKE; Esimerkiksi:

{}
#

Please login to interact with this component

//
        kuukausienPituudet[0] = 31;  // laitetaan tammikuun pituus
        kuukausienPituudet[1] = 28;  // laitetaan helmikuun pituus
        kuukausienPituudet[11] = 31; // laitetaan joulukuun pituus
        keskilampotilat[0] = -20.7;  // Tammikuun 1. päivän keskilämpö
        keskilampotilat[4] = -16.7;  // Tammikuun 5. päivän keskilämpö
{}

4. Taulukon alustaminen luonnin yhteydessä

Taulukko voidaan alustaa myös jo luomisen yhteydessä:

{}
double[] keskilammot = {-20.7,-18.2,-10.3,-14.2,-16.7,-10.9};
string[] kuukausienNimet = {"tammi","helmi","maalis",...,"marras","joulu"};
#

Please login to interact with this component

//
        double[] keskilampotilat = {-20.7,-18.2,-10.3,-14.2,-16.7,-10.9};
        string[] kuukausienNimet = {"tammi","helmi","maalis","huhti","touko","kesä"};
{}

5. Taulukon alkioiden summa

Taulukon alkioiden summa voitaisiin laskea:

{}
#

Please login to interact with this component

//
        int vuodenPituus = 0;
        vuodenPituus  +=  kuukausienPituudet[0];
        vuodenPituus  +=  kuukausienPituudet[1];
        vuodenPituus  +=  kuukausienPituudet[2];
        vuodenPituus  +=  kuukausienPituudet[3];
        vuodenPituus  +=  kuukausienPituudet[4];
        vuodenPituus  +=  kuukausienPituudet[5];
        vuodenPituus  +=  kuukausienPituudet[6];
        vuodenPituus  +=  kuukausienPituudet[7];
        vuodenPituus  +=  kuukausienPituudet[8];
        vuodenPituus  +=  kuukausienPituudet[9];
        vuodenPituus  +=  kuukausienPituudet[10];
        vuodenPituus  +=  kuukausienPituudet[11];

Tässä ei kuitenkaan ole hirveästi järkeä ja siksi otetaan käyttöön silmukat:

{}
#

Please login to interact with this component

//
        int vuodenPituus = 0;
        for (int i=0; i < kuukausienPituudet.Length; i++)
        {
            vuodenPituus  +=  kuukausienPituudet[i];
        }

Saman voi kirjoittaa myös muodossa:

{}
#

Please login to interact with this component

//
        int vuodenPituus = 0;
        for (int i=0; i < kuukausienPituudet.Length; i++)
        {
            int pituus = kuukausienPituudet[i];
            vuodenPituus  +=  pituus;
        }

ja tälle on lyhenteenä foreach-silmukka:

{}
#

Please login to interact with this component

//
        int vuodenPituus = 0;
        foreach (int pituus in kuukausienPituudet)
        {
            vuodenPituus  +=  pituus;
        }
{}

6. Taulukkoja käsittelevien aliohjelmien testaaminen

6.1 Parametrina taulukko

Jos aliohjelmalle menee parametrina taulukko, voi tämän taulukon luoda etukäteen

{}
#

Please login to interact with this component

//
    ///   double[] luvut = {1,2,3,2,5};
    ///   Keskiluku.Summa(luvut)             ~~~ 13;

Taulukko voidaan myös luoda ja alustaa samalla kun aliohjelmaa kutsutaan

{}
#

Please login to interact with this component

//
    ///   Keskiluku.Summa(new double[]{3,6}) ~~~ 9;

Mikäli aliohjelman taulukko on esitelty params avainsanalla:

{}
public static double Summa(params double[] luvut)

voidaan alkiot viedä taulukon lisäksi luettelona (toimii siis vain parametrilistan viimeisenä parametrina):

{}
#

Please login to interact with this component

//
    ///   Keskiluku.Summa(new double[]{3,6})   ~~~ 9;
    ///   Keskiluku.Summa(3, 4, 5)             ~~~ 12;
{}

6.2 Tuloksena taulukko

Mikäli funktio palauttaa taulukon, on testaaminen helpointa kun muuttaa palautetun taulukon merkkijonoksi ja vertaa tätä jonoa:

{}
#

Please login to interact with this component

//
    ///   double[] luvut = Taulukot.ErotaLuvut("2 3 4 5 k      9 ;5");
    ///   String.Join(" ",luvut) === "2 3 4 5 0 9 5";
    ///  // Tai jopa samalla rivillä
    ///   String.Join(" ",Taulukot.ErotaLuvut("2 3 böö 9 ;5")) === "2 3 0 9 5";

Haasteita tulee jos on desimaaleja, koska desimaalimerkki vaihtelee. Tällöin pitää varmistaa tietty kulttuuri ennen testejä:

{}
#

Please login to interact with this component

//
    /// 
    /// Luodaan taulukko aloittaen x1:stä dx:n välein n kpl lukuja
    /// 
    /// montaka alkiota tulee
    /// alkuarvo
    /// kasvatusaskel
    /// taulukko jossa n reaalilukua
    /// 
    /// 
    ///    System.Threading.Thread.CurrentThread.CurrentCulture
    ///     = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
    ///    String.Join(" ",Listat.Lista(0,0.1,0.1)) === "";
    ///    String.Join(" ",Listat.Lista(1,0.2,0.1)) === "0.2";
    ///    String.Join(" ",Listat.Lista(4,0.1,0.2)) === "0.1 0.3 0.5 0.7";
    /// 
///
public static double[] Lista(int n, double x1, double dx) { double[] luvut = new double[n]; double x=x1; for (int i = 0; i < n; i++, x += dx) luvut[i] = x; return luvut; }

Toinen vaihtoehto on käyttää jotakin itse tehtyä Jonoksi-aliohjelmaa, joka varmasti tuottaa haluttua desimaalisymbolia:

{}
#

Please login to interact with this component

//
    /// 
    /// Palauttaa taulukon merkkijonona niin, että alkioiden välissä on erotin.
    /// Alkioden formaatin voi valita itse. Desimaalierotin on aina .
    /// 
    /// Taulukko josta tehdään merkkijono
    /// Jono, jolla rivin alkiot erotetaan toisistaan
    /// 
    /// 
    /// 
    ///  double[] luvut = {1,2.1,3};
    ///  Matriisit.Jonoksi(luvut) === "1 2.1 3";
    ///  Matriisit.Jonoksi(luvut,":","{0:0.0}") === "1.0:2.1:3.0";
    ///  Matriisit.Jonoksi((double[])null) === "null";
    ///  Matriisit.Jonoksi(new double[0]) === "";
    /// 
///
public static string Jonoksi(T[] luvut, string sarakeErotin = " ", string sarakeformaatti = "{0}") { if (luvut == null) return "null"; string vali = ""; StringBuilder rivi = new StringBuilder(); System.Globalization.CultureInfo ci = System.Globalization.CultureInfo.CreateSpecificCulture("en-US"); for (int ix = 0; ix < luvut.Length; ix++) { rivi.Append(vali); rivi.Append(String.Format(ci,sarakeformaatti, luvut[ix])); vali = sarakeErotin; } return rivi.ToString(); }
{}