Ilkka Koivistoinen 13.02.2002

Edellinen

Seuraava

6.3.3 Loppuehtoinen toisto do - while

Syntaksi:

       do
           lause;
       while (ehto);

Jälkiehtoinen toisto on muuten samankaltainen kuin alkuehtoinen toisto paitsi, että toistolause tehdään ainakin yhden kerran. Kuten jo varmasti huomasit do - while rakenteessa ensin testataan ja sitten tehdään. Loppuehtoisessa toistossa ensin tehdään ja sitten testataan. Kaikki mitä on todettu indeksimuuttujasta alkuehtoisen toiston yhteydessä, pätee myös loppuehtoisessa toistossa. Usein, mikäli toisto-ongelman luonne ei selvästi tuo toistorakenteen luonnetta selville, on makuasia, käyttäkö alkuehtoista vai loppuehtoista toistoa. Usein loppuehtoista toistoa pidetään selvempänä. Seuraavissa esimerkeissä on yritetty tuoda esiin paitsi do – while –rakenteen tavallisimmat käyttötavat, myös eroavaisuudet while -rakenteeseen.

Esimerkki 19.

    import Lue.*;

    public class e19
    {
        public static void main(String args[])
        {
            String nimi,osoite;

            System.out.println("Ohjelma loppuu kun painat *-näppäintä");
            do
            {
                System.out.println("Anna nimesi");
                nimi = Lue.rivi();
                if (!nimi.equals("*"))
                {
                    System.out.println("Anna osoitteesi");
                    osoite = Lue.rivi();
                    System.out.println(nimi+" "+osoite);
                }
            }while (!nimi.equals("*"));
            System.out.println("LOPPU");
        }
    }

Esimerkki 20.

import Lue;
public class e20 // Ohjelma kysyy merkkijonoa ja tutkii, onko se palindromi
{
   public static void main(String args[])
   {
     String s;
     char kaannettyJono[] = new char[40];
     char jono[] = new char[40];
     int i;
     System.out.println("Anna merkkijono");
     s=Lue.rivi();
     jono = s.toCharArray();
     if (s.length()!=0)
     {
           i = -1; // indeksimuuttujan alustus
           do {    // Tehdään käännetty jono
               i++;
               kaannettyJono[i]=Jono[s.length()-i-1];
           } while (i<s.length()-1);
     }
/* Testataan merkki keraallaan, onko samoja
 * Testaus kaannettyJono=jono ei onnistu, ellei ole alusteta
 * kaikkia varattuja muistipaikkoja. Voisi käyttää myös compareTo() -metodia!!!!
 */
     boolean samoja=true;
      i=0;
     while( i<s.length())
     {
           if (kaannettyJono[i]!=jono[i])
               samoja = false;
           i++;
     }

     if (samoja)
       System.out.println(" oli Palindromi");
     else
       System.out.println(" ei ollut Palindromi");
     }
}

 

Esimerkki e20a. Parannettu palindromiohjelma

import Lue;
public class e20a  { // Ohjelma kysyy merkkijonoa ja tutkii, onko se palindromi. poistetaan ensin
                              // jonosta muut merkit, paitsi kirjaimet
  public static void main(String args[]){
    String s;
    char kaannettyJono[] = new char[40];
    char jono[] = new char[40];
    char apuJono[] = new char[40];
     int poistettujaMerkkejä = 0;

    int i;
    System.out.println("Anna merkkijono");
    s = Lue.rivi();
    apuJono = s.toCharArray();


    if (s.length()!=0) {
      // kopioidaan taulukkoon jono vain kirjaimet

      int index = 0;
      int paikka = 0;
      while (index < apuJono.length) {
        if (apuJono[index] != '!' &&
          apuJono[index] != ' ' &&
          apuJono[index] != '?' &&
          apuJono[index] != '-' &&
          apuJono[index] != ',' &&
          apuJono[index] != '.' &&
          apuJono[index] != ';' &&
          apuJono[index] != ':'
        ) {
        jono[paikka] = apuJono[index];
        paikka++;
      }else poistettujaMerkkejä++;
        index++;
    } // while


    i = -1; // indeksimuuttujan alustus
    do { // Tehdään käännetty jono
      i++;
      kaannettyJono[i]=jono[s.length()-i-1-poistettujaMerkkejä];
      } while (i<s.length()-1- poistettujaMerkkejä);
    }
     /* Testataan merkki keraallaan, onko samoja
      * Testaus kaannettyjono=jono ei onnistu, ellei ole alusteta
      * kaikkia varattuja muistipaikkoja. Voisi käyttää myös compareTo() -metodia!!!!
    */
    boolean samoja = true;
    i = 0;
    while( i < s.length() - poistettujaMerkkejä) {
      if (kaannettyJono[i]!=jono[i])
        samoja = false;
      i++;
    }

    if (samoja)
      System.out.println(" oli Palindromi");
    else
      System.out.println(" ei ollut Palindromi");
  }
}

6.3.3.1 Tehtäviä

  1. * Tee ohjelma, joka arpoo yhden numeron väliltä 0 .. 9 ja arvuuttelee sitä käyttäjältä. Jos arvaus osuu ensimmäisellä 3:lla arvauskerralla ohjelma onnittelee hyvästä tuurista. Muussa tapauksessa tulostetaan pelkkä toteamus "Vihdoikin oikein".
  2. * Tee ohjelma, joka kysyy Suomen pääkaupunkia kunnes vastaukseksi annetaan Helsinki. Tämän jälkeen ohjelma onnittelee oikeasta vastauksesta. (vrt. edellä oleva tehtävä. Käytä nyt do while -rakennetta)
  3. * Korjaa edellistä ohjelmaa siten, että ohjelma antaa arvata vain viisi kertaa, jonka jälkeen vastaajaa pyydetään menemään takaisin maantiedon tunnille. (vrt. edellä oleva tehtävä. Käytä nyt do while -rakennetta)
  4. Tee ohjelma, joka laskee 5:n näppäimistöltä luetun luvun summan. (vrt. edellä oleva tehtävä. Käytä nyt do while -rakennetta)
  5. Tee ohjelma, joka laskee k:n näppäimistöltä luetun luvun summan, kun k kysytään ensin käyttäjältä. (vrt. edellä oleva tehtävä. Käytä nyt do while -rakennetta)
  6. Tee ohjelma, joka laskee k:n näppäimistöltä luetun luvun keskiarvon, kun k kysytään ensin käyttäjältä. (vrt. edellä oleva tehtävä. Käytä nyt do while -rakennetta)

Vastaukset

Ilkka Koivistoinen 13.02.2002

Edellinen

Seuraava