© 1999-2003, Flemming Koch Jensen
Alle rettigheder forbeholdt
Iteration
Vejledende løsninger
 

 

1
int sum=0;
int tal=-10;

while ( tal <= 10 ) {
  sum += tal;
  tal++;
}

System.out.println( "Sum: " + sum );

int sum=0;
int tal=10;

while ( tal >= -10 ) {
  sum += tal;
  tal--;
}

System.out.println( "Sum: " + sum );

int sum=0;

for ( int tal=-10; tal<=10; tal++ )
  sum += tal;

System.out.println( "Sum: " + sum );

int sum=0;

for ( int tal=10; tal>=-10; tal-- )
  sum += tal;

System.out.println( "Sum: " + sum );

2
int tal=21;

while ( tal>=10 ) {
  System.out.println( tal );
  tal -= 2;
}

for ( int tal=21; tal>=10; tal-=2 )
  System.out.println( tal );

for ( int tal=11; tal<=21; tal+=2 )
  System.out.println( tal );

Her er 10 ændret til 11 som startværdi, for at det passer med at hveranden er ulige. Hvis man i stedet ønsker en mere dynamisk løsning kan man vælge at bruge:

int minimum=10;

for ( int tal = minimum*( minimum/2 )+1; ...
  ...

Der giver det nærmeste ulige heltal, der er større end eller lig minimum. Bemærk, at der er tale om heltalsdivision.

3
for ( int tal=8; tal<=8*10; tal+=8 )
  System.out.println( tal );
4
int fakultet=1;
int n=5;

for ( int tal=n; tal>1; tal-- )
  fakultet *= tal;

System.out.println( fakultet );
5
for ( int tal=0; tal<=10; tal++ )
  if ( tal % 2 == 0 )
    System.out.println( tal + " er lige" );
  else
    System.out.println( tal + " er ulige" );
6
int sum=0;

for ( int tal=1; tal<=20; tal+=2 )
  sum += tal;

System.out.println( sum );
7
int minimum=3;
int maximum=16;

int antalLige=0;
int antalUlige=0;

for ( int tal=minimum; tal<=maximum; tal++ )
  if ( tal % 2 == 0 )
    antalLige++;
  else
    antalUlige++;

System.out.println( "Der er " + antalUlige + " ulige og " +
                    antalLige + " lige tal i intervallet [" +
                    minimum + ":" + maximum + "]" );
8
int minimum=3;
int maximum=16;

int sum=0;
int antal=0;

for ( int tal=minimum; tal<=maximum; tal++ )
  if ( tal % 2 == 0 ) {
    sum += tal;
    antal++;
  }

int gennemsnit = sum/antal;

System.out.println( "Gennemsnit: " + gennemsnit );
9
int x=10;

int før1=1;
int før2=1;
int næste=før2;

for ( int nr=3; nr<=x; nr++ ) {
  næste = før1 + før2;
  før1  = før2;
  før2  = næste;
}

System.out.println( "Det " + x + "'te fibonacci-tal er " + næste );

At programmet virker selv om for-løkken ikke kommer til at køre (hvis x er 1 eller 2), skyldes at fibonacci-tallenes to startværdier er ens. Hvis det ikke var tilfældet, var det mere kompliceret at løse opgaven.

10
int x=-10;

int før1=1;
int før2=1;
int næste;

for ( int nr=0; nr>=x; nr-- ) {
  næste = før1 - før2;
  før1 = før2;
  før2 = næste;
}

System.out.println( x + "! er " + før2 );

I den anden løsning, hvor vi udnytter observationen, er det med blåt markeret hvilke dele af koden, der er direkte kopieret fra løsningen af opgave 9:

int x=-10;

x = -x;

int før1=1;
int før2=1;
int næste;

for ( int nr=3; nr<=x; nr++ ) {
  næste = før1 + før2;
  før1  = før2;
  før2  = næste;
}

if ( x % 2 == 0 )
  før2 = -før2;

System.out.println( x + "! er " + før2 );

11
int kandidat=87;
boolean erPrimtal=true; // indtil det modsatte er bevist

for ( int divisor=2; divisor<kandidat; divisor++ )
  if ( kandidat % divisor == 0 ) {
    erPrimtal = false;
    break;
  }

if ( erPrimtal )
  System.out.println( kandidat + " er et primtal" );
else
  System.out.println( kandidat + " er ikke et primtal" );
12
for ( int toPotens=2; toPotens<=1024; toPotens*=2 )
  System.out.println( toPotens );
13
for ( int tal1=1; tal1<=10; tal1++ )
  for ( int tal2=1; tal2<=10; tal2++ )
    System.out.println( tal1 + " * " + tal2 + " = " + tal1*tal2 );
14
System.out.println( Ulige[0] );
15
System.out.println( PosNeg.length );
16
for ( int index=0; index<5; index++ )
  System.out.print( Tabel[index] + " " );
System.out.println();
17
for ( int index=0; index<T1.length; index++ )
  System.out.print( T1[index] + " " );
System.out.println();
18
System.out.println( T2[T2.length/2] );
System.out.println( T2[T2.length-1] );
19
int sum=0;

for ( int index=0; index<PosNeg.length; index++ )
  sum += PosNeg[index];

System.out.println( "Sum: " + sum );
20
for ( int index=0; index<PosNeg.length; index++ )
  if ( PosNeg[index] < 0 )
    System.out.print( PosNeg[index] + " " );
System.out.println();
21
for ( int index=T3.length-1; index>=0; index-- )
  System.out.print( T3[index] + " " );
System.out.println();
22
for ( int indexT4=0; indexT4<3; indexT4++ )
  T4[indexT4] = T5[ T5.length - 3 + indexT4 ];

for ( int index=0; index<T4.length; index++ )
  System.out.print( T4[index] + " " );
System.out.println();
23
for ( int index=0; index<PosNeg.length; index++ )
  PosNeg[index] = -PosNeg[index];

for ( int index=0; index<4; index++ )
  System.out.print( PosNeg[index] + " " );
System.out.println();

for ( int index=PosNeg.length-4; index<PosNeg.length; index++ )
  System.out.print( PosNeg[index] + " " );
System.out.println();
24
for ( int index=0; index<5; index++ ) {
  System.out.print(  Lige[index] + " " );
  System.out.print( Ulige[index] + " " );
}
System.out.println();
25
int gem;
int andetIndex;

for ( int index=0; index<T3.length/2; index++ ) {
  andetIndex = T3.length - 1 - index;

  gem            = T3[index];
  T3[index]      = T3[andetIndex];
  T3[andetIndex] = gem;
}

for ( int index=0; index<T3.length; index++ )
  System.out.print( T3[index] + " " );
System.out.println();
26
int antal7=0;

for ( int index=0; index<Tabel.length; index++ )
  if ( Tabel[index] == 7 )
    antal7++;

System.out.println( "Antal 7'ere: " + antal7 );
27
int sum=0;

for ( int index=0; index<PosNeg.length; index++ )
  if ( PosNeg[index]%2==1 && PosNeg[index]>0 )
    sum += PosNeg[index];

System.out.println( "Sum: " + sum );
28
int størst=T1[0];

for ( int index=1; index<T1.length; index++ )
  if ( T1[index] > størst )
    størst = T1[index];

System.out.println( "Største tal: " + størst );
29
int[] statistik = new int[10];

for ( int index=0; index<Tabel.length; index++ )
  statistik[ Tabel[index] ]++;

System.out.println( "Værdi Antal" );
for ( int index=0; index<statistik.length; index++ )
  System.out.println( "  " + index + "     " + statistik[index] );
System.out.println();
30

do/while-sætning:

// PRE: PosNeg.length > 0

int index=0;

do {
  if ( PosNeg[index] < 0 ) {
    System.out.println( PosNeg[index] );
    break;
  }
  index++;
} while ( index<PosNeg.length );

Eller:

// PRE: PosNeg.length > 0

int index=-1;

do {
  index++;
} while ( index<PosNeg.length && PosNeg[index]>=0 );

if ( index < PosNeg.length )
  System.out.println( PosNeg[index] );

for-sætning:

for ( int index=0; index<PosNeg.length; index++ )
  if ( PosNeg[index] < 0 ) {
    System.out.println( PosNeg[index] );
    break;
  }

while-sætning:

int index=0;

while ( index < PosNeg.length ) {
  if ( PosNeg[index] < 0 ) {
    System.out.println( PosNeg[index] );
    break;
  }
  index++;
}

Eller

// PRE: PosNeg.length > 0

int index=0;

while ( index<PosNeg.length && PosNeg[index]>=0 )
  index++;

if ( index < PosNeg.length )
  System.out.println( PosNeg[index] );

31
// PRE: T5.length > 1

int mindst;
int næstMindst;

if ( T5[0] < T5[1] ) {
  mindst = T5[0];
  næstMindst = T5[1];
} else {
  mindst = T5[1];
  næstMindst = T5[0];
}

for ( int index=2; index<T5.length; index++ )
  if ( T5[index] < mindst ) {
    næstMindst = mindst;
    mindst = T5[index];
  } else if ( T5[index] < næstMindst )
    næstMindst = T5[index];

System.out.println( "De to mindste tal er: " + mindst + " og " + næstMindst );
32
for ( int index=0; index<T1.length-1; index++ )
  System.out.print( "(" + T1[index] + "," + T1[index+1] + ")" );
System.out.println();  
33

for ( int index=0; index<T1.length-1; index++ )
  if ( T1[index] > T1[index+1] ) {
    T1[index  ]--;
    T1[index+1]++;
  } else if ( T1[index] < T1[index+1] ) {
    T1[index  ]++;
    T1[index+1]--;
  }

34

Det er med blåt markeret hvilke dele af koden, der er direkte kopieret fra besvarelsen af opgave 33:

int antalGange=3;

for ( int gang=1; gang<=antalGange; gang++ )
  for ( int index=0; index<T1.length-1; index++ )
    if ( T1[index] > T1[index+1] ) {
      T1[index  ]--;
      T1[index+1]++;
    } else if ( T1[index] < T1[index+1] ) {
      T1[index  ]++;
      T1[index+1]--;
    }

Ved mange gennemløb begynder elementerne i arrayet at udlignes.

35

int antalGange=3;

for ( int gang=1; gang<=antalGange; gang++ )
  for ( int index=0; index<T1.length-1; index++ )
    if ( T1[index] != T1[index+1] )
      T1[index] = T1[index+1] = ( T1[index] + T1[index+1] ) / 2;

Ved mange gennemløb begynder elementerne også at udlignes,  men det sker hurtigere.

36

int antalGange=3;

for ( int gang=1; gang<=antalGange; gang++ )
  for ( int index=0; index<T1.length-1; index++ )
    if ( T1[index] > T1[index+1] ) {
      int gem = T1[index];
      T1[index] = T1[index+1];
      T1[index+1] =gem;
    }

Ved tilstrækkelig mange gennemløb bliver elementerne i arrayet sorteret i ikke-aftagende orden.

37

int antalGange=3;
int nSwap, nSammenligninger=0;
int usorterede=T1.length-1; // alle elementer hertil er usorterede

do {
  nSwap = 0;
  for ( int index=0; index<usorterede; index++ ) {
    nSammenligninger++;
    if ( T1[index] > T1[index+1] ) {
      int gem = T1[index];
      T1[index] = T1[index+1];
      T1[index+1] =gem;
      nSwap++;
    }
  }
  usorterede--; // den sidste er nu garanteret på plads
} while ( nSwap>0 && usorterede>0 );

System.out.println( "Antal sammenligninger: " + nSammenligninger );

38 For at følgende løsning skal kunne virke, er det nødvendigt at placere følgende linie som første linie i kildeteksten (dvs. før linien med class...).
 
import java.util.*;
 
int max=10000000;
boolean[] primTal = new boolean[max+1];
int antal=0;

System.out.println( new Date() );

primTal[0] = false;
primTal[1] = false;
for ( int index=2; index<primTal.length; index++ )
  primTal[index] = true;

for ( int primIndex=0; primIndex<primTal.length; primIndex++ )
  if ( primTal[primIndex] ) {
    antal++;
    for ( int index=2*primIndex; index<primTal.length; index+=primIndex )
      primTal[index] = false;
  }

System.out.println( new Date() );

System.out.println( antal + " primtal" );

//int n=0;
//for ( int index=0; index<primTal.length; index++ ) {
//  if ( primTal[index] ) {
//    System.out.print( index + " " );
//    n++;
//    if ( n == 10 ) {
//      System.out.println();
//      n = 0;
//    }
//  }
//}
//System.out.println();

...:40:00 CEST 1999
...:40:05 CEST 1999
664579 primtal

Med 5 sekunder for at finde over ½ million primtal er tiden ikke noget problem, men pladsen bliver det.

39
int[] t = { 3, 8, 9, 4, 3, 6, 5, 4, 1, 7,
            2, 8, 7, 6, 9, 4, 5, 2, 6, 1,
            0, 4, 9, 7, 8, 6, 2, 4, 9, 2 };

int[] bucket = new int[10];

for ( int index=0; index<t.length; index++ )
  bucket[ t[index] ]++;

int indexT=0;
int indexBucket=0;

while ( indexBucket < bucket.length ) {

  while ( bucket[indexBucket] > 0 ) {
    t[indexT] = indexBucket;
    indexT++;
    bucket[indexBucket]--;
  }
  
  indexBucket++;
}

for ( int index=0; index<t.length; index++ )
  System.out.print( t[index] + " " );
System.out.println();
40
int[][] lilleTabel = new int[1+10][1+10];
    
for ( int i=1; i<lilleTabel.length; i++ )
  for ( int j=1; j<lilleTabel[i].length; j++ )
    lilleTabel[i][j] = i * j;

for ( int i=1; i<lilleTabel.length; i++ ) {
  for ( int j=1; j<lilleTabel[i].length; j++ )
    System.out.print( lilleTabel[i][j] + " " );
  System.out.println();
}
41
int[][] bræt = { { 1, 2, 1 },
                 { 2, 1, 0 },
                 { 0, 0, 2 } };
    
for ( int række=0; række<bræt.length; række++ ) {
  for ( int kolonne=0; kolonne<bræt[række].length; kolonne++ )
    switch ( bræt[række][kolonne] ) {
      case 0: System.out.print( " " );
              break;
      case 1: System.out.print( "X" );
              break;
      case 2: System.out.print( "O" );
              break;
      default:System.out.print( "?" );
    }
  System.out.println();
}
42
int[][] matrix = { { 2, 0, 0, 0 },
                   { 0, 3, 0, 0 },
                   { 0, 0, 0, 0 },
                   { 0, 0, 0,-2 } };
                       
boolean diagonal=true;
    
for ( int række=0; række<matrix.length; række++ ) {
  for ( int kolonne=0; kolonne<matrix[række].length; kolonne++ )
    if ( række!=kolonne && matrix[række][kolonne]!=0 ) {
      diagonal = false;
      break;
    }
  if ( !diagonal )
    break;
}
    
if ( diagonal )
  System.out.println( "Det er en diagonal-matrice" );
else
  System.out.println( "Det er ikke en diagonal-matrice" );
43
boolean[][] tabel = { { false,  true,  true,  true, false, false, false, false },
                      { false,  true,  true, false, false, false, false, false },
                      { false,  true, false, false,  true, false, false, false },
                      { false, false, false,  true,  true,  true, false, false },
                      { false, false, false, false,  true,  true, false, false },
                      { false,  true,  true, false, false, false,  true, false },
                      { false, false,  true, false, false,  true, false, false },
                      { false, false,  true, false, false, false, false, false } };

for ( int række=1; række<tabel.length-1; række++ )
  for ( int kolonne=1; kolonne<tabel[række].length-1; kolonne++ )
    if ( tabel[række][kolonne]   && // feltet selv
         tabel[række-1][kolonne] && // til venstre
         tabel[række+1][kolonne] && // til højre
         tabel[række][kolonne-1] && // op
         tabel[række][kolonne+1] )  // ned
      System.out.println( "[" + række + "][" + kolonne + "]" );

[3][4]

44
int[][] kupon = { { 0, 2, 1, 2, 0, 0, 1, 2, 1, 2, 0, 2, 0 },
                  { 1, 1, 2, 1, 2, 2, 1, 0, 1, 0, 0, 2, 2 },
                  { 2, 1, 0, 0, 1, 0, 1, 1, 1, 2, 1, 4, 0 } };
    
for ( int kamp=0; kamp<kupon[0].length; kamp++ ) {
  for ( int række=0; række<kupon.length; række++ ) {
    if ( række==0 ) {
      int kampNo = kamp + 1;
      if ( kampNo < 10 )
        System.out.print( " " + kampNo );
      else
        System.out.print( "" + kampNo );
      System.out.print( "|" );
    }
    switch ( kupon[række][kamp] ) {
      case 0: System.out.print( " X " );
              break;
      case 1: System.out.print( "1  " );
              break;
      case 2: System.out.print( "  2" );
              break;
      default:System.out.print( "???" );
    }
    System.out.print( "|" );
  }
  System.out.println();
}