Anteckningar från föreläsning 3

Detta är den programkod vi skrev -- anteckningarna är gjorda bara för att vara ett stöd för minnet för dem som var där, och därför inte nödvändigtvis fullständiga eller ens sammanhängande. Betydligt mer hjälp finns att hämta i kompendiet.

OH-bilder finns här.

Mer om objekt och referenser

class NbrOfRolls {

    public static void main(String[] args) {
        new NbrOfRolls().run();
    }

    void run() {
        int limit = 35;    // gör att vi kan variera gränsen...
        Die die = new Die();
        for (int k = 1; k <= 10; k = k + 1) {
            int sum = 0;
            int count = 0;
            while (sum <= limit) {
                die.roll();
                sum = sum + die.getNbrOfSpots();
                count = count + 1;
            }
            System.out.print("Det behövdes ");
            System.out.print(count);
            System.out.println(" kast");
        }
    }
}

Funktioner

Vi började här med att lösa flera uppgifter i tät följd:

När vi var färdiga hade vi löst problemet att skriva ut uttrycket 1 + 2 * b, där b är det största av två inlästa värden.

class Functions1 {

    public static void main(String[] args) {
        new Functions1().run();
    }

    void run() {
        System.out.println("Detta program skriver ut kuben på");
        System.out.println("uttrycket 1 + 2 * b, där b är det");
        System.out.println("största av två inlästa värden x och y");
        double x = Keyboard.nextDouble("Ange x: ");
        double y = Keyboard.nextDouble("Ange y: ");
        System.out.print("Det största värdet är ");
        System.out.println(max(x, y));

        System.out.println(cube(1 + 2 * max(x, y)));
    }

    double max(double a, double b) {
        if (a > b) {
            return a;
        }
        return b;
    }

    double cube(double value) {
        return value * square(value);
    }

    double square(double value) {
        return value * value;
    }
}

class Functions2 {

    public static void main(String[] args) {
        new Functions2().run();
    }

    void run() {
        System.out.println(sum(100));
        System.out.println(sum(1000));
        System.out.println(sum(10000));
        System.out.println(sum(100) + sum(2000));
    }

    int sum(int n) {
        int sum = 0;
        for (int term = 1; term <= n; term++) {
            sum += term;
        }
        return sum;
    }
}

Procedurer

class Dice {

    public static void main(String[] args) {
        new Dice().run();
    }

    void run() {
        Die d1 = new Die();
        d1.roll();
        printDie(d1);
        d1.roll();
        printDie(d1);
        Die d2 = new Die();
        d2.roll();
        printDie(d2);
        printDice(d1, d2);
    }

    void printDice(Die die1, Die die2) {
        System.out.print("Den första tärningen visar ");
        System.out.print(die1.getNbrOfSpots());
        System.out.print(", den andra visar ");
        System.out.println(die2.getNbrOfSpots());
    }

    void printDie(Die die) {
        System.out.print("Tärningen visar ");
        System.out.print(die.getNbrOfSpots());
        System.out.println(" prickar");
    }
}

Heltal

Vi pratade lite om olika heltalstyper och heltalsoperationer, varpå jag visade ett fel som inte är helt ovanligt:

    int k = 1;
    System.out.println(k++);
    System.out.println(k);

    k = k++;           // ouch -- inget händer med k
    System.out.println(k);

class Divisors {

    public static void main(String[] args) {
        new Divisors().run();
    }

    void run() {
        int n = Keyboard.nextInt("Ange ett tal: ");
        System.out.print("Talet är delbart med: ");
        printDivisors(n);
        System.out.println();
    }

    void printDivisors(int value) {
        for (int k = 1; k <= value; k++) {
            if (value % k == 0) {
                System.out.print(k);
                System.out.print(" ");
            }
        }
    }
}

class DigitSums {

    public static void main(String[] args) {
        new DigitSums().run();
    }

    void run() {
        int n = Keyboard.nextInt("Ange ett tal: ");
        System.out.print("Siffersumman är ");
        System.out.println(digitSum(Math.abs(n)));
    }

    int digitSum(int value) {
        int sum = 0;
        while (value > 0) {
            sum += value % 10;
            value /= 10;
        }
        return sum;
    }
}

Reella tal

Detta exempel skulle bara illustrera att vi bör räkna med att reella tal är inexakta:

class StrangeValues {

    public static void main(String[] args) {
        new StrangeValues().run();
    }

    void run() {
        for (double x = 0.0; x <= 1.0; x += 0.1) {
            System.out.println(x);
        }
    }
}

Programmet ger utskriften

$ java StrangeValues
0.0
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999

class BooleanFunctions {

    public static void main(String[] args) {
        new BooleanFunctions().run();
    }

    void run() {
        int n = Keyboard.nextInt("Ange tal: ");
        if (isOdd(n)) {
            System.out.println("udda");
        } else {
            System.out.println("jämnt");
        }
    }

    boolean isOdd(int value) {
        if (value % 2 != 0) {
            return true;
        }
        return false;
    }
}

class Primes {

    public static void main(String[] args) {
        new Primes().run();
    }

    void run() {
        printPrimes(1, 100);
        printPrimes(100, 200);
        printPrimes(1500, 1800);
    }

    void printPrimes(int min, int max) {
        for (int k = min; k <= max; k++) {
            if (isPrime(k)) {
                System.out.print(k);
                System.out.print(" ");
            }
        }
        System.out.println();
    }

    boolean isPrime(int value) {
        if (value < 2) {
            return false;
        }
        for (int k = 2; k < value; k++) {
            if (value % k == 0) {
                return false;
            }
        }
        return true;
    }
}