Föreläsningar 5,6 sept 17, sept 19 v 38).

DD Chapter 4.

Vi kan nu skriva kommandon (satser) som

- skriver ut saker: utdata.println("hej"); utdata.println("k = " + k );

- läser in värden och tilldelar det inlästa värdena till variabler

k = Integer.parseInt(...);

- tilldelar variabler värden av beräknade utttyck,

k = 3 + 4; // Addition av "bokstavliga värden (literaler)

i = 3*i +k; // uttryck som också använder värden i variabler

Våra main-metoder har varit följder av sådana kommandon som gjorts i tur och ordning. Varje kommando har gjorts en gång. Men ibland ska saker göras i annan ordning/inte alls.

gång på gång mm. Vi behöver kommanon som styr andra kommandon.

När man kanske vill göra något (en eller flera satser)

en gång.

Det finns ett styrkommado (control statement) för att göra saker en eller ingen gång:

DD följer inte Java Coding Convnetions, som jag däremot försöker följa.

Jag ser klammrarna { } som en del av if-konstruktionen. Jag använder alltid denna mall (engelska template) med klammrar { } för if-kommandon:

if ( ...) { // skriv mallen först, fyll sedan i detaljerna ...

..... // En eller flera kommandon, underordnade indenterade

// satser

}

DD (vilket nog följer språkets syntax) säger att efter if ( ...) skall följa ett komando. Om man måste ha flera kommandon gör man ett kommando (en sammansatt sats, compound statement ) av flera komandon med hjälp av { }. Klammrarna { } behövs alltså inte när det

som kanske skall göras kan utryckas med en enda sats. DD placerar också { på en egen rad. Motsvarande skillnad mellan DD och (mig+Java Coding Conventions) gäller alla styrkommandon.

När man vill göra (beror på)

antingen något en gång

eller annnars

nåt annat en gång

Det finns ett styrkommado för att göra vissa saker om nåt är sant annars göra andra saker:

Styrkommandon kan styra underordnade kommandon som i sin tur är styrkommandon; vilket ger en trädstuktur som kan kan bli ordentligt invecklad. Struktur bör absolut framhävas genom indentering. Blir det alltför krångligt bör man istället definiera nya metoder, mer om detta senare.

När man (om ..) vill

göra det

eller (om ..)

göra det

....

annars

göra det

Ibland skall ett val ske mellan fler än två alternativ, vilket brukar leda till att else-

delen av en if-kommando i sin tur är ett if-kommando. Mall :

Det är bra programmering att alltid (om man inte är helt helsäker på att man täkt alla fall)

ha med skönsalternativet.

Det finns ett annat sätt att ibland skriva sådana flervalsstrukturer, switch. Behanlas i DD kapitel 5.När vi vill göra något gång på gång.

Men ofta vill man att en eller flera kommano ska göra 0, 1,2 eller flera gånger, sålänge eller såvida något är sant. Vi behöver ett kommando som kan styra en grupp kommandon.

Ett styrkommando (control command)som vi ska lära oss är while-kommandot som ser till att en sats/sammansatt sats görs sålänge något är sant. while betyder ju just sålänge. En sådan konstuktion kallas ibland för en slinga, eller en snurra eller på engelska för en loop ;

Mall:

Att skaffa och använda ett DecimalFormat-objekt.

Klasser används i java på två sätt:

1. För att "förpacka" statiska metoder (klassmetoder) och statiska variabler (klassvariabler) som sedan kan användas i andra klasser.

Ex på användning av statisk metod i en klass :

import javax.swing.JOptionPane; //import av klassen

...

JOptionPane.showMessageDialog( null, ...)

2. För att definiera objekt.Detta börjar vi göra fr o m kapitel 8.

I kapitel 4 i DD förkommer en försiktig använding av objekt.

DD OO-programmerar inte på allvar förrän i kapitel 8, men ibland används objekt i de inledande kapitelen, bl a här för att förvandla ett värde av typen double till en sträng för att skriva ut talet på ett sätt som vi bestämmer själva (med två decimaler).

För att ett objekt skall kunna användas måste det först skapas. Detta göres av satsen

Semantik:

En tertiär operator:

De primitva typerna i java:

Det finns fler primitiva datatyper än int för heltal, det som skiljer är hur många bitar

som krävs för platsen i minnet och därmed vilka tal som "får plats".

Det finns förutom double ytterligare en primitiva datatyp float för flyttaltal ("decimaltal"), det som skiljer är att bara 32 bit tilldelas sådan variabler i minnet i stället för 64 bitar och att antalet signifikanta siffror och största och minsta exponent är därför är mindre.

Översikt av de primitiva datatyperna och de viktigaste operatorerna med

vars hjälp vi kan bilda uttryck :

Typen String är ej en primitiv typ Att två strängar a, b är lika skrivs så här: a.equals(b) .

DD CH 5 :

När vi vill göra saker gång på gång.

Ett alternativt sätt i vissa fall: for-satsen.

Exvis så skriver desssa kommandon ut rader med tal från och med 1 och dessa tals kvadrater sålänge kvadrattalet är mindre än 27:

import java.io.*;

public class F2 {

public static void main(String [] args) {

int i = 1;

System.out.println("i i*i ");

System.out.println("**********");

while (i*i < 27) {

System.out.println(i + " " + i*i);

i = i+1;

}

}

}

/* Körresultat

i i*i

**********

2 4

4 16

5 25

*/

Övning3: i *i räknas ut två gånger för varje varv i programmet. Ändra programmet så att multiplikation endast göres en gång. Tips: Använd en lokal variablel.

Övning4:

Vilken typ har uttrycket som testas för varje varv?

Övning5:

Om uttrycket som testas för varje varv aldrig blir osant, vad händer då? Skriv ett sådant uttryck! Är ett sådant program korrekt? Hur får man stopp på det ?

Övning4:

< är en relationsoperator. Vilka finns det ? Skilllnad mot logiska operator som ! && ||

Övning5:

Om satserna

System.out.println("i i*i ");

System.out.println("**********");

skulle stå inuti blocket, vad skulle hända då ?

Vi ändrar main så att vi istället testar på i istället för i*i:

public static void main(String [] args) {

int i = 1;

System.out.println("i i*i ");

System.out.println("**********");

while (i < 6) {

System.out.println(i + " " + i*i);

i = i+1;

}

}

}

Övning6:

Vilket körresultat får vi nu?

Variabeln i "räknar nu varven". Sådana slingor,

där antalet varv är känt innan slingan skall börja köras ,

brukar skrivas med for-satsen:

public static void main(String [] args) {

System.out.println("i i*i ");

System.out.println("**********");

for (int i = 1; i < 6; i = i+1) {

System.out.println(i + " " + i*i);

}

}

Mall för for-styr-kommandot:

När vi vill göra saker gång på gång.

Ett alternativt sätt i vissa fall: do-while-satsen.

Om någott, t ex satserna xxxxx; yyyyy; skall göras minst en gång och sedan gång på gång sålänge ett testvillkor är snat kan man skriva så här:

Detta kan lite bekvämare (överkurs) skrivas så här :

Sammanfattning styrkommandon för slingor :

while (...) {...; ...; }

kan alltid användas, speciellt lämpligt när nåt ska göras 0, 1, 2,.. gånger beroende på

nåt som händer i slingan

for ( ..;...;...) {...;...; }

används av många programmerarar när något skall göras ett bestämt antal gånger som inte beror på vad som händer i slingan. Vanligast så här om k gånger:

for (int i = 0; i < k; k = k+1;) {...;...; }

do {...;...; } while ( ...) ;

kan användas när nåt ska göras 1, 2,.. gånger beroende på nåt som händer i slingan.

Övning 7. Skriv tre program som skriver ut dessa olika "stjärn-ytor".

***** *** *

**** ** **

**** * ***

När man (i fallet att ett heltalsuttryck är lika med ..) vill

göra det

eller (i fallet ..)

göra det

....

annars

göra det .

Ett alternativt sätt: switch-satsen.

break måste finnas med, annars göres alla följande fall.

(Undantag om man "hoppar ut ur fallet" med t ex return , då klagar kompilatorn att den aldrig kan komma till break -kommandot. return lär vi oss senare)