Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C# static määre, kuinka toteutan

Zam [24.11.2010 21:31:16]

#

morjens taasen ! Olen yrittänyt ratkaista tätä tehtävää, mutta tuon static eli staattisen määreen käyttö tässä tehtävässä ei minulle ihan aukea kuinka se pitäisi toteuttaa ?
Tiedän ettei siihen kuulu käyttää this -operaattoria vaan sitä kutsutaan luokan nimen kautta.
En vain yrityksestä huolimatta ole sitä saanut toimimaan. Jaksaisko joku valaista asiaa kuinka tuo staattinen metodi vaihdaTeema()
saadaan toimimaan.

/*
 * Ohjelma, jossa määrittelet Kirja-luokan.
 * Kirja-luokan kentät ovat:
 * nimi, kirjailija, kustantaja, hinta, sekä teemanNimi joka on staattinen kenttä.
 *
 * Määrittele luokalle sopivat muodostimet sekä haeKirja() ja VaihdaTeema() -metodit.
 *
 * HaeKirja()-metodi saa parametrina nimen ja vertailee sitä kirjan nimeen.
 * Metodin tulee tulostaa kirjan loput tiedot, jos parametrin ja kirjan nimi ovat samat,
 * ja muussa tapauksessa ilmoittaa, että kirjaa ei löytynyt.
 * VaihdaTeema() on staattinen metodi, jolla muutat teeman nimeä.
 *
 * Luo Main()-metodissa muutama olio luokasta ja kutsu HaeKirja()- ja VaihdaTeema()-metodit.
 */

using System;

class Kirja
{
    /* Määritellään luokan kentät. Kentät ovat oletusarvoiesti private */
    string nimi;
    string kirjailija;
    string kustantaja;
    int hinta;

    /* staattinen muuttuja teemanNimi. Tätä voidaan käsitellä staattisella metodilla !  */
    static string teemanNimi;


    /* Määritellään luokalle olutsmuodostin ja kentät alustetaan oletusarvoilla. */
    public Kirja()
    {
        this.nimi = "Ei tiedossa";
        this.kirjailija = "Ei tiedossa";
        this.kustantaja = "Ei tiedossa";
        this.hinta = 0;

    }

    /* Määritellääm muodostin kaikilla parametreilla.  */
    public Kirja(string nimi, string kirjailija, string kustantaja, int hinta)
    {
        this.nimi = nimi;
        this.kirjailija = kirjailija;
        this.kustantaja = kustantaja;
        this.hinta = hinta;

    }

    /* Seuraavassa luodaan kopiointimuodostin joka saa parametrina toisen Kirja-olion.   */
    public Kirja(Kirja kirja)
    {
        this.nimi = kirja.nimi;
        this.kirjailija = kirja.kirjailija;
        this.kustantaja = kirja.kustantaja;
        this.hinta = kirja.hinta;
    }
    /*Luodaan HaeKirja() ja vertaillaan. Kutsuvan olion ja parametrina olevan kirja-olion nimi(kirjannimi) attribuutit verrataan keskenään. */
    public void HaeKirja(Kirja kirja)
    {
        if (this.nimi.Equals(kirja.nimi))
            Console.WriteLine("\t" + kirja.nimi + " " + kirja.kirjailija + " " + kirja.kustantaja + " " + kirja.hinta);

        // Console.WriteLine("\tKirjan nmi: '" + kirja.nimi + "' Kirjailija: '" + kirja.kirjailija + "' Kustantaja: '" + kirja.kustantaja + "' Hinta: '" + kirja.hinta);

        else
            Console.WriteLine("\tKirjaa " + kirja.nimi + " ei löytynyt");
    }

    public static void VaihdaTeema()
    {
        Console.WriteLine(teemanNimi);  //Tämä virheellinen
    }
}

class s202Tehtava1
{
    static void Main(string[] args)
    {
        /* Luodaan kirja1-olio oletusmuodostimella  */
        Kirja kirja1 = new Kirja("Lunta tupaan", "Kielo Karjunen", "WSOY", 57);

        /* Testataan staattista metodia VaihdaTeema  */

        Kirja.VaihdaTeema();

        Kirja kirja2 = new Kirja("C sharppia aivoon", "Cecilia Celsius", " WSOY", 400);

        kirja2.HaeKirja(kirja1);  //vertailtaessa tulee uusi oli.metodi ja parametrina toinen uusi olio.

        Kirja kirja3 = new Kirja("Lunta tupaan", "Kielo Karjunen", "WSOY", 57);

        kirja1.HaeKirja(kirja3);

    }
}

Mod. lisäsi kooditagit.

punppis [26.11.2010 02:20:59]

#

public static void VaihdaTeema()
{
    teemanNimi = "uusi teema";
}

Käytät siis muuttuja yksinkertaisesti ilman mitään härpäkkeitä. Mikä tässä nyt on ongelma, kun itsekin sanoit että tiedät että staattista muuttujaa kuuluu käyttää ilman thissiä?

Ja eikös tuon HaeKirjaa-parametrin pitänyt olla kirjan nimi (string) eikä toinen Kirja-olio?

edit: nyt kun katson koodia uudestaan, niin et koskaan määrittele teemanNimi-muuttujaan mitään. Yrität siis tulostaa määrittelemätöntä muuttujaa ja ohjelma kaatuu.

Kannattaa lukea niitä kääntäjän virheitä, ainakin Visual Studio herjasi samantien "Field 'Kirja.teemanNimi' is never assigned to, and will always have its default value null". Eipä tuota c sharppia oikein muulla edes kannata koodata.

neau33 [26.11.2010 02:53:09]

#

Morjens punppis!

punppis kirjoitti:

...ainakin Visual Studio herjasi...Eipä tuota c sharppia oikein muulla edes kannata koodata.

Oon kodannut jo vuosia C#:ia SharpDevelop-ympäristössä ja hyvin toimii FxCop & muut saatavilla olevat ilmaishilpakkeet (on tullut rakenneltua myös omia hilpakkeita jotka pärjäävät Visual Studion vastaaville).

-Nea-
Non Microsoft MVP

punppis [26.11.2010 02:58:51]

#

Joo näillä tunneilla pääsi vähän sammakoita suusta. Ajattelin lähinnä sitä, että ei tuota oikeastaan millään notepadilla kannata koodailla, vaan kunnon IDE:llä.

Kyllähän Visual Studio Express on ilmainen?

groovyb [26.11.2010 11:28:54]

#

eli tuo teemanNimi - muuttujasi ei toimi toimi siksi, että sille ei ole mitään arvoa asetettu. C#:ssa muuttujille ei luodessa alustu minkäänlaista alkuarvoa, joten se täytyy asettaa ennen käyttöä.

eli lyhyesti, et voi tulostaa näytölle tyhjää. tee vaikka joku metodi jolla asetetaan teema.

public static void AsetaTeema(string Teema)
{
   teemanNimi = Teema;
}

*edit*

kappas olikin jo laitettu :)

Zam [26.11.2010 18:34:47]

#

Kiitoksia, tuo valaisee meikäläistä.Ei tyhmiä kysymyksiä ole olemassa..vai onko?
Kyllä tämä tästä nyt ratkeaa.

groovyb [26.11.2010 19:35:17]

#

Neau33, sinänsä hieno lause tuo Non Microsoft MVP, Mutta C# itsessään taitaa kyllä olla microsoftin kehittämä ;)

Vastaus

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

Tietoa sivustosta