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.
while(syote not valid) {
lue_syote()
}
Tuollaisella idealla voisi esmes komentoriviohjelmalla toteuttaa.
Entä tässä tilanteessa?
catch (FormatException) { // mitä laitan tähän? }
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);
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!"); }
Aihe on jo aika vanha, joten et voi enää vastata siihen.