Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C# ja paluu tiettyyn osaan ohjelmaa

Tinketti [04.10.2012 10:11:07]

#

Olen tässä miettinyt asiaa, johon en ole saanut milloinkaan vastausta. Millä tavoin onnistuu paluu tiettyyn osaan ohjelmaa? Esim. Jos pyydettäessä kahta lukua, käyttäjä pistääkin vahingossa jälkimmäiseen kirjaimen, ohjelma palaisi pyytämään uudestaan 2. lukua. Aina tämmöisessä on käsketty tulostumaan lause "luku ei kelvollinen" ja ohjelma loppuu, mutta paluuhan olisi järkevämpi.

tneva82 [04.10.2012 10:14:35]

#

while(syote not valid) {
lue_syote()
}

Tuollaisella idealla voisi esmes komentoriviohjelmalla toteuttaa.

Tinketti [04.10.2012 15:03:26]

#

Entä tässä tilanteessa?

catch (FormatException)
        {
        // mitä laitan tähän?
        }

Metabolix [04.10.2012 15:43:35]

#

Järkevä ratkaisu olisi vaikka tällainen:

// Tämä silmukka ei ikinä lopu itsestään.
while (true) {
	Console.Write("Anna luku: ");
	try {
		luku = int.parseInt(Console.ReadLine());
		// Kun arvo on saatu luettua, lopetetaan silmukka.
		break;
	} catch (FormatException e) {
		// Poikkeustilanteessa tulostetaan virheilmoitus. Silmukka jatkuu.
		Console.WriteLine("Luvun muoto ei kelpaa!");
	}
}

Tästä voi tietenkin tehdä funktion, jolle annetaan parametrina kysymys ja joka palauttaa luetun arvon. (Silloin ei tarvita luku-muuttujaa eikä break-riviä, vaan try-lohkossa tarvitsee olla vain yksi return-rivi.) Näin ei tarvitse kirjoittaa samanlaista silmukkaa monta kertaa, vaan voi yksinkertaisesti kutsua funktiota eri kysymyksillä.

int tähtiä = pyydäLuku("Anna tähtien määrä: ");
int vuosi = pyydäLuku("Anna vuosiluku: ");

Funktiota voi vielä laajentaa niin, että se tarkistaa vaikkapa, että luvun suuruus on järkevä:

int luku = pyydäLuku("Anna luku yhdestä kymmeneen: ", 1, 10);

groovyb [05.10.2012 00:01:41]

#

tai jos ei halua käyttää Exceptionia:

int number;
while(true)
{
   Console.Write("Anna luku: ");
   bool result = Int32.TryParse(Console.Readline(),out number);
   if(result)
      break;
   else
      Console.WriteLine("Luvun muoto ei kelpaa!");
}

Vastaus

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

Tietoa sivustosta