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ä.
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; } } }
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; } }
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.
Ah juu, en tuota tajunnukkaan. Näköjään ihan turhaan noita tietotyyppejä tuossa vertailin, kun tietotyypin kohdalle voisi vaan kirjoittaa 'key'.
Thanks!
Aihe on jo aika vanha, joten et voi enää vastata siihen.