Nada

Föreläsning 2: Slingor och operatorer

Det finns tre sorters programslingor i Java. Vi tar upp dom båda viktigaste.

While-slingor

När jag tömde sparbössan en gång på fyrtiotalet fann jag tre kronor och hundratrettiosju öre. För att få det omräknat till fyra kronor och trettiosju öre använde jag en if-sats:
   if (ören>99) {kr=kr+1; ören=ören-100;}
Men om jag hade tvåhundratrettisju ören fick jag byta ut if-satsen mot en while-slinga. Det här programmet skriver ut 5 kr, 37 ören.
class Pengar1                                   {
  public static void main(String[] args)        {
    int kr=3, ören=237                          ;
    while (ören>99)                             {
      kr=kr+1                                   ;  // eller kr++ 
      ören=ören-100                             ;} // eller ören-=100
    System.out.println(kr+" kr, "+ören+" ören") ;}}
Med operatorerna ++ och -= blir programmet kortare. Det blir också obegripligare, särskilt om ++ används inne i ett uttryck.

En while-slinga tas om ända tills villkoret inte är sant längre. En oändlig slinga får man med while(1<17) eller while(true). Men slingan kan alltid brytas med break. Vår while-slinga kunde alltså ha skrivits så här:

    while(true)                                           {
      if (ören<100) break                                 ;
      kr=kr+1                                             ; 
      ören=ören-100                                       ;}

For-slingor

När man redan vid programmeringen vet hur många varv slingan ska gå brukar man använda en for-slinga. Den är lite krångligare, men programmen blir i gengäld kortare. Det här programmet skriver ut raden 0123456789.
class Slingor1                                            {
  public static void main(String[] args)                  {
    System.out.print("Siffrorna är: ")                    ;
    for(int i=0; i<10; i++) System.out.print(i)           ; 
    System.out.println()                                  ;}}
Och det här gör en nedräkning
10...9...8...7...6...5...4...3...2...1...0...PANG!!!
class Slingor2                                            {
  public static void main(String[] args)                  {
    System.out.println("Nedräkning: ")                    ;
    for(int i=10; i>=0; i--) System.out.print(i+"...")    ; 
    System.out.println("PANG!!!")                         ;}}

Tideräkningsslingor

Anropet System.currentTimeMillis() ger antal ms sedan Unix födelse 1 jan 1970. Det kan användas för att göra en slinga som går runt, runt i exakt en sekund.
class Slingor3                                            {
  public static void main(String[] args)                  {
    long starttid = System.currentTimeMillis()            ;
    long sluttid=starttid+1000                            ;
    System.out.print("TICK ")                             ;
    while(System.currentTimeMillis()<sluttid)             ;
    System.out.println("TACK!")                           ;}}
Observera att slingan inte innehåller en enda sats - eller en tom sats, hur man nu vill se det. En sådan sekundslinga är så användbar att vi gör den till en egen procedur. Varje anrop av ticka() tar en sekund och skriver sedan ut TICK. Inom den egna klassen är anropet bara ticka(), från andra klasser i andra filer blir det Slingor4.ticka().
class Slingor4                                            {
  static void ticka()                                     {
    long starttid = System.currentTimeMillis()            ;
    long sluttid=starttid+1000                            ;
    System.out.print("TICK ")                             ;
    while(System.currentTimeMillis()<sluttid)             ;}
  public static void main(String[] args)                  {
    for(int i=0; i<10; i++) ticka()                       ;
    System.out.println("TACK!")                           ;}}

Operatorerna %, && och ||

Räkna till hundra, men säg BURR om talet är delbart med tre!
class Slingor5                                            {
  public static void main(String[] args)                  {
    for(int i=1; i<=100; i++)                             {
      if(i%3==0) System.out.println("BURR")               ;
      else System.out.println(i)                          ;}}}
Operatorn % uttalas modulo och betyder "resten vid heltalsdivision". Om i%3 är noll är talet i delbart med 3. Om i%10 är 3 måste talet i vara av typen 3,13,23,33,43,... Om man vill säga BURR när talet är delbart med 3 ELLER slutar på 3 ELLER börjar på 3 kan man använda eller-operatorn ||.
class Slingor6                                                   {
  public static void main(String[] args)                         {
    for(int i=1; i<=100; i++)                                    {
      if(i%3==0 || i%10==3 || i/10==3) System.out.println("BURR");
      else System.out.println(i)                                 ;}}}
Om man byter ut eller-operatorn mot och-operatorn &&, när blir det då BURR? Och-eller-förväxling tillhör dom vanligaste programmeringsfelen.

Slingor i slingor i slingor

En pytagoreisk triangel är en rätvinklig triangel med heltalssidor, till exempel den egyptiska triangeln 3,4,5. Följande program skriver ut alla sådana trianglar med sidor av längd högst hundra. Det finns fler än hundra sådana!
 
class Slingor7                                              {
  public static void main(String[] args)                    {
    System.out.println("Pytagoreiska trianglar:")           ;
    for(int a=1; a<=100; a++)                               {
      for(int b=1; b<=100; b++)                             {
	for(int c=1; c<=100; c++)                           {
	  if(a*a+b*b==c*c) System.out.println(a+","+b+","+c);}}}}}

Sidansvarig: <henrik@nada.kth.se>
Senast ändrad 30 oktober 2007
Tekniskt stöd: <webmaster@nada.kth.se>