Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C#, Viope: Miten tehdään staattinen metodi?

ZupD [25.10.2015 17:38:15]

#

Hei,

Tämä tehtävä on ollut vuonna 2010 melkein samanlaisena, mutta silloin ei oikeastaan varsinaiseen ongelmaan tullut mitään sellaista vastausta mikä minua hyödyttäisi joten uudestaan:

"Kirjoita C#-kielellä ohjelma, jossa määrittelet Kirja-luokan. Kirja-luokan kentät ovat nimi, kirjailija, kustantaja, hinta sekä teemanNimi. Määrittele luokalle sopivat muodostimet sekä HaeKirja()- ja VaihdaTeema()-metodit. HaeKirja()-metodi saa parametrina nimen ja vertaile 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.

Ohje: osa ohjelmakoodista on annettu, täydennä ohjelma vain puuttuvilta osin."

Example output:
Kirja, K. Kirjoittaja, Kustannus Oy, Dekkari, 21.5
Toinen Kirja, O. Kirjailija, Kustantaja Ab, Jännitys, 36.9

using System;
using static Kirja;

class Kirja
{
    public string Nimi;
    string kirjailija;
    string kustantaja;
    float hinta;
    string teema;

    static string teemaNimi;

    public Kirja(string Nimi, string kirjailija, string kustantaja, float hinta, string teema)
    {
        this.Nimi = Nimi;
        this.kirjailija = kirjailija;
        this.kustantaja = kustantaja;
        this.hinta = hinta;
        this.teema = teema;
    }
    public void Tulosta()
    {
        Console.WriteLine("{0}, {1}, {2}, {3}, {4}", Nimi, kirjailija, kustantaja, hinta, teema);
    }

    public void HaeKirja(string Nimi)
    {
        if (this.Nimi.Equals(Nimi))
        {
            Console.WriteLine("{0}, {1}, {2}, {3}, {4}", Nimi, kirjailija, kustantaja, teema, hinta);
        }
        else
            Console.WriteLine("Kirjaa ei löytynyt");
    }

    public static void VaihdaTeema(Kirja var, string teema)
        {
            teema = teemaNimi;
            //mitäs sitten pitäs tehdä? teema = teemanimi; ja Kirja var, string teemaNimi ei tietysti toimi ei voi olla ei static kenttä
        }

}

    class Program
    {
        // Valmiina oleva koodi, EI voi muuttaa ja tämän jälkeen EI VOI lisätä mitään!
        static void Main(string[] args)
        {
        Kirja k = new Kirja("Kirja", "K. Kirjoittaja", "Kustannus Oy", 21.05f, "Dekkari");
        Kirja k2 = new Kirja("Toinen Kirja", "O. Kirjailija", "Kustantaja Ab", 36.90f, "Fantasia");
        k.HaeKirja(k.Nimi);
        VaihdaTeema(k2, "Jännitys");
        k2.HaeKirja(k2.Nimi);
        }
    }

Eli ongelmana on tuo että en nyt ihan keksi enkä löydä ratkaisuakaan, että miten saisin tuolla static methodilla tuon teeman muutettua. Jotenkin koen, että voisi olla helpompaa hoitaa jos tuossa muodostimessa olisi tuon teema:n sijaan static muuttuja, mutta:

public Kirja(string Nimi, string kirjailija, string kustantaja, float hinta, string teema)
 {
     this.Nimi = Nimi;
     this.kirjailija = kirjailija;
     this.kustantaja = kustantaja;
     this.hinta = hinta;
     teemaNimi = teema;
  }

Niin toisen olion muodostuksen yhteydessä tuon ensimmäisen olion teemakin tietysti vaihtuu ja on väärin. Tässäkin olisi varmaan joku keino millä tuon saisi tehtyä static kentällä?

Toinen ongelma on se, että jos static methodia kutsutaan MyClass.MyMethod(); ja tehtävässä kutsunta hoidetaan pelkästään MyMethod(); Tähän ratkaisuksi keksin tuon:

using static Kirja;

mutta viola ympäristössä compiler herjaa seuraavan errorin:

program.cs(2,6): error CS1041: Identifier expected, `static' is a keyword
program.cs(2,13): error CS1001: Unexpected symbol `Kirja', expecting identifier

Jotain muuta keinoa ettei tarvitse käyttää tuossa static methodin kutsussa tuota luokkaa kuin tuo yllä esitetty?

Kyseessä on koulutehtävä. Arvostaisin kovasti jos pientä vinkkiä oikeaan suuntaan olisi tarjota :)

jlaire [25.10.2015 17:44:04]

#

ZupD kirjoitti:

public static void VaihdaTeema(Kirja var, string teema)

Kuten värityksestä huomaa, var on avainsana eikä sitä voi käyttää muuttujanimenä. Vaihda parametrin nimeksi vaikkapa kirja ja toteuta metodi rivillä kirja.teema = teema;.

ZupD [25.10.2015 17:50:22]

#

jlaire kirjoitti:

Kuten värityksestä huomaa, var on avainsana eikä sitä voi käyttää muuttujanimenä. Vaihda parametrin nimeksi vaikkapa kirja ja toteuta metodi rivillä kirja.teema = teema;.

No näinpä, homma kävi toimimaan samantien. Jotenkin tuntuu että yön pikkutunneilla olisin jo testannut tuota ja olisi visual jotain herjannut. Teinpä kovin monimutkaista tuosta :) Kiitos.

Vielä olisi tuo methodin kutsu ilman tuota luokkaa edessä.

jlaire [25.10.2015 17:50:53]

#

Voisiko metodin siirtää Program-luokkaan?

ZupD [25.10.2015 18:20:45]

#

jlaire kirjoitti:

– –

Pystyi, teema kentälle vähän protection muutosta ja hyvin toimi. Kiitos paljon uudestaan :)

Vastaus

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

Tietoa sivustosta