Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C#: Luokat ja hakasulut (olio[x])

Käsi [16.02.2015 14:40:29]

#

Päätin alkaa loman kunniaksi tutustumaan C#:piin nettikurssin kautta.
Oon nyt jumittanu jo pidemmän tovin pariin seuraavaan tehtävää.
->
Tehtävä menee seuraavasti
Täydennä seuraava koodi uudella luokalla siten, että koodi toimii ja tuloste vastaa esimerkkiä:

class Ohjelma
    {
        static void Main()
        {
            Luokka luokka = new Luokka(3);
            luokka[0] = 1;
            luokka[1] = 2;
            luokka[2] = 3;
            luokka[3] = 4;

            for (int i = 0; i < 3; i++)
            {
                Console.WriteLine(luokka[i]);
            }
        }
    }

Tuloste pitäisi näyttää tältä:

Luku lisätty
Luku lisätty
Luku lisätty
Ei ole tilaa
1
2
3

En käsitä miten koodin:
Luokka luokka = new Luokka(3);
jälkeen voi luokka muuttujalla voi olla indeksejä?
(Vai onko ne indeksejä??)

luokka[0] = 1;

Eihän muuttujaa edes määritelty olemaan tyyppiä "Luokka[]" vaan "Luokka".


Se myös on hämärää miten luokan voi asettaa olemaan jokin integer arvo?
Onko luokka määriteltävä jotenkin seuraavaan tapaan?:

class Luokka : int
{
 //Toteutukset
}

Tämmöinen toteutus vaikuttaa jotenkin kyllä oudolta...


Vai pitäisikö luokalle määritellä metodi jonka esittely olisi jotain tällaista muotoa:

public Luokka operator=(int arvo)
{
  //Toteutus
}

Seuraava tehtävä vähän vielä härömpi:

namespace OlioohjelmoinninJatko
{
    // Sinun koodi tulee tähän

    class Ohjelma
    {
        static void Main()
        {
            Kokoelma kokoelma = new Kokoelma(3);
            kokoelma["kokonaisluku"] = 123;
            kokoelma["desimaaliluku"] = 456.78;
            kokoelma["teksti"] = "Hei maailma!";

            double summa = (double)(int)kokoelma["kokonaisluku"] + (double)kokoelma["desimaaliluku"];
            Console.WriteLine("Numeeristen arvojen summa on {0}", summa);

            Console.WriteLine();

            Kokoelma kokoelma2 = new Kokoelma(2);
            kokoelma2["kokonaisluku"] = 123;
            kokoelma2["desimaaliluku"] = 456.78;
            kokoelma2["teksti"] = "Hei maailma!";
        }
    }
}
(C#)

Esimerkkitulostus

Lisätty kokonaisluku = 123
Lisätty desimaaliluku = 456.78
Lisätty teksti = Hei maailma!
Numeeristen arvojen summa on 579.78

Lisätty kokonaisluku = 123
Lisätty desimaaliluku = 456.78
Kokoelma on täynnä

Luulen kyllä että selviän tuosta viimeisestä tehtävästä kuhan ensin tajuaisin mikä tuossa ensimmäisessä tehtävässä pitää tehdä.

Grez [16.02.2015 14:44:07]

#

Ne ei varsinaisesti ole indeksejä vaan avaimia.. Eli ei ole pakko olla tietotyypiltään numero eikä tarvitse olla järjestyksessä. Ajattele esim. Dictionaryä.

Kaivatun toteutuksen runko olisi jotakuinkin...

class Luokka {
    public int this[int key]
    {
        get { return /*koodia*/; }
        set { /*koodia*/ = value; }
    }
}

Käsi [16.02.2015 16:41:15]

#

Kiitos!
Tosta vinkistä oli paljon apua.
Vähän jäi mietityttämään onko olisko ton setterin ja Dictionaryn koon voinu toteuttaa jotenkin sulavammin... Otan mielellään vinkkejä vastaan, jäi vähä vaivaa

using System.Collections.Generic;
public class Kokoelma
{
    int koko;
    Dictionary<string, object> arvot = new Dictionary<string,object>();

    public object this[string key]
    {
        get
        {
            return arvot[key];
        }
        set
        {
            if (arvot.Count < koko)
            {
                string tietotyyppi;

                if (value is double)
                    tietotyyppi = "desimaaliluku";
                else if (value is string)
                    tietotyyppi = "teksti";
                else if (value is int)
                    tietotyyppi = "kokonaisluku";
                else
                    tietotyyppi ="jokin muu tietotyyppi";

                Console.WriteLine("Lisätty " + tietotyyppi + " = " + value);
                arvot.Add(key, value);
                arvot.Add(key, value);
            }
            else
                Console.WriteLine("Kokoelma on täynnä");
        }
    }
    public Kokoelma(int koko)
    {
        this.koko = koko;
    }
}

Metabolix [16.02.2015 17:30:27]

#

Tehtävästä päätellen ei ole tarkoitus tutkia oikeasti arvon tyyppiä vaan tulostaa vain ”Lisätty <avain> = <arvo>”. Lisäksi koodissasi on Add-rivi tuplana.

Käsi [16.02.2015 17:43:52]

#

Ah juu, en tuota tajunnukkaan. Näköjään ihan turhaan noita tietotyyppejä tuossa vertailin, kun tietotyypin kohdalle voisi vaan kirjoittaa 'key'.
Thanks!

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta