Lektion 7
do-while-sats
for-sats
Mera om användarstyrning
Om man vill att användaren ska styra programmet – använd
break.
if(villkor_för_att_sluta) break;
När break-satsen utförs bryts while-loopen och
exekveringen (körningen) fortsätter efter while-loopens slut. För dialogrutor – om användaren klickar på
Gör ett menystyrt program som ger användaren möjlighet att räkna ut areor av olika figurer (kvadrat, rektangel, triangel och cirkel). Menyn ska se ut
ungefär sa här:
while(true) {
//Menypresentation
int val = sc.nextInt();
if(val == 1) { //Läs in sida //Beräkna area //Skriv ut area } else if(val == 2) { //Läs in längd och bredd //Beräkna area //Skriv ut area } else if(val == 3) { //Läs in bas och höjd //Beräkna area //Skriv ut area } else if(val == 4) { //Läs in radie //Beräkna area //Skriv ut area } else if(val == 0){ //Avsluta break; } else{ //Felinmatning } } ”Kapsla in” det som
ska göras varje gång
Användaren väljer att avsluta
do-while
• I en while-sats testas villkoret först, sedan utförs de satser som ska
göras i loopen.
• I en do-while-sats körs satserna först en gång och sedan testas
villkoret. while(uttryck){ sats_1; sats_2; . . } do{ sats_1; sats_2; . . }while(uttryck);
Do-while vs. while-sats
Skriv ett program som ber användaren att mata in tal. Programmet ska hålla reda på hur många tal som är
positiva respektive negativa. Skriver användaren in talet 0 ska resultatet skrivas ut och programmet avslutas.
while vs do-while
int pos = 0, neg = 0, t = -1;
while(t != 0){ System.out.print("Tal: "); t = sc.nextInt(); if(t > 0) pos++; else if(t < 0) neg++; } System.out.println(pos); System.out.println(neg);
int pos = 0, neg = 0, t = 0;
do{ System.out.print("Tal: "); t = sc.nextInt(); if(t > 0) pos++; else if(t < 0) neg++; }while(t != 0); System.out.println(pos); System.out.println(neg);
while vs do-while (med break)
int pos = 0, neg = 0, t = 0;
while(true){ System.out.print("Tal: "); t = sc.nextInt(); if(t == 0) break; else if(t > 0) pos++; else neg++; } System.out.println(pos); System.out.println(neg);
int pos = 0, neg = 0, t = 0;
do{ System.out.print("Tal: "); t = sc.nextInt(); if(t == 0) break; else if(t > 0) pos++; else neg++; }while(true); System.out.println(pos); System.out.println(neg);
do-while
• Det är en smaksak vilken man väljer – båda är lika bra!
• Ni ska kunna använda båda
• Ni ska även kunna använda for-satsen, som kommer snart.
for-sats
for(int j = 0; j < 6; j += 2) System.out.println(j);
Följande sker:
• j initieras (till 0)
• Villkoret j < 6 undersöks (true) • Skriver ut j:s värde
• j ökas med 2 (till värdet 2)
• Villkoret j < 6 undersöks (true) • Skriver ut j:s värde
• j ökas med 2 (till värdet 4)
• Villkoret j < 6 undersöks (true) • Skriver ut j:s värde
• j ökas med 2 (till värdet 6)
• Villkoret j < 6 undersöks (false)
for(init; villkor; ändring){ sats_1;
sats_2; .
. }
Följande görs i denna ordning: • Initiering (görs endast första
gången) • Villkor • Satser • Ändring • Villkor • Satser • Ändring • Villkor • Satser • Ändring Klammrar om två eller fler satser
for vs while
for(int i = 10; i > 0; i--) System.out.print(i+" "); int i = 10; while(i > 0) System.out.print((i--)+" ");Det är en smaksak vilken man föredrar.
Man brukar använda for-sats när man använder räknare som räknar upp eller ner för varje varv.
Läs in räntesats, saldo och antal år som önskas. Gör en räntetabell, d v s skriv saldoökning per år. Använd dialogrutor
import static javax.swing.JOptionPane.*;
public class Bank {
public static void main(String [] arg){
for(;;){
String s = showInputDialog("Räntesats?");
if(s == null)
break;
double ränta = Double.parseDouble(s); s = showInputDialog("Saldo?");
double saldo = Double.parseDouble(s); s = showInputDialog("Antal ar?");
int n = Integer.parseInt(s); String tabell = "";
for(int ar = 1; ar <=n; ar++){
saldo = saldo + saldo*0.01*ränta;
tabell = tabell + ar + " " +(int)saldo + "\n"; } showMessageDialog(null, tabell); } System.exit(0); } } statisk import
Samma som while(true)
Initierar en tom sträng
tabell fylls på efterhand
Fält (Arrayer, Vektorer)
Om programmet ska hantera data av samma typ är det bra att lagra dessa i s.k. fält (arrayer, vektorer). Tänk er en
bokhylla, där det på varje hyllplan ligger någonting (t ex ett heltal).
int[] n = new int[5];
definierar och skapar ett tomt fält (innehåller 0)
int[] n = {2, 2, 1, 9, 7};
definierar och skapar ett fält med värden
Obs! Postitionerna i fältet är numrerade från 0, d.v.s. första positionen har position 0, sista har n-1, där n är antalet
element (platser) i fältet.
2 2 1 9 7 n
Fält (Arrayer ,Vektorer)
Vill man ta reda på ett värde för en viss position:System.out.print(n[3]);
eller lagra en position i en annan variabel:
int temp = n[4];
Vill man ta reda på längden för ett fält:
int l = n.length; l 5 temp 7 2 2 1 9 7 n n[0] n[1] n[2] n[3] n[4]
Läsa in heltal till ett heltalsfält
class LasaInTalTillArray {
public static void main(String[] arg) {
int[] tal = new int[5];
for (int i = 0; i < tal.length; i++) {
System.out.print("Skriv in tal "+i+": "); tal[i] = sc.nextInt();
}
System.out.print("Talen baklänges: ");
for (int i = tal.length-1; i >= 0; i--) {
System.out.print(tal[i]+" "); }
} }
Lektionsövning
Skriv ett program som ger utskriften nedan då det körs.
Skapa en heltalsarray med plats för 5 heltal och låt användaren mata in heltal (markerade med fet stil nedan).
Skriv in fem heltal Skriv tal nummer 0: 4 Skriv tal nummer 1: -4 Skriv tal nummer 2: 2 Skriv tal nummer 3: 0 Skriv tal nummer 4: 3
Tredje talet som du matade in var 2 Du matade in dessa tal: 4 -4 2 0 3 Baklänges: 3 0 2 -4 4
Leta efter tal i array
Har man en array med data kan man leta upp sökt data. Man måste gå igenom arrayen (t ex for-sats)
Läs in sökt tal
Ej hittat talet && Ej gått igenom hela
arrayen
Aktuell position == sökt tal
Hittat talet Gå vidare false true true Ej hittat talet false
class LetaEfterTalIArray{
public static void main(String[] arg){
int[] tal = new int[5];
for (int i=0; i<tal.length; i++){
System.out.print("Skriv in tal "+i+": "); tal[i] = sc.nextInt();
}
System.out.print("Sökt tal?! ");
int sök = sc.nextInt();
boolean hittad = false;
for (int i = 0; i < 5 && !hittad; i++){
if(tal[i] == sök){ //hittat talet
System.out.println("Talet "+sök+" finns på position
"+i); hittad = true;
} }
if(!hittad){
System.out.println("Talet "+sök+" finns inte i
arrayen");
} }
Uppgifter
1. Skriv ett menystyrt program där användaren har följande
val:
1. Kvadrat
2. Rektangel
3. Cirkel
4. Triangel
0. Avsluta
Beroende på vilket val som görs ska programmet be
användaren läsa in behövlig data och sedan räkna ut
vald figurs omkrets och area. För t ex en rektangel
behövs det ju en bredd och en längd och för en cirkel en
radie.
Uppgifter
2. Skriv ett program där användaren anger hur många gånger en tärning ska kastas. Resultatet läggs in i ett heltalsfält
(array) beroende på vad tärningen visar. Därefter ska programmet skriva ut en tabell för hur resultatet blev:
Hur många tärningskast ska göras: 10 Resultat: 1:or 2 2:or 1 3:or 1 4:or 2 5:or 2 6:or 1
int kast = (int)(Math.random()*6)+1; slumpar ett
Uppgifter
3. Lägg till en kolumn för den procentuella andelen från förra uppgiften.
Hur många tärningskast ska göras: 10 Resultat: Antal % 1:or 2 20 2:or 1 10 3:or 1 10 4:or 2 20 5:or 2 20 6:or 1 20
Uppgifter
4. Ändra från Uppgift 3 så att summan av två tärningskast summeras och därefter registreras i statistiken. (Kast med två tärningar.) En körning med detta program skulle kunna ge det resultat som du ser i rutan:
Kast med två tärningar
Hur många kast önskas: 10000 Resultat
Antal Antal Relativ
prickar kast frekvens(%)
2 –or 278 2.8 3 –or 545 5.5 4 –or 815 8.1 5 –or 1114 11.1 6 –or 1366 13.7 7 –or 1654 16.5 8 –or 1416 14.2 9 –or 1138 11.4 10 –or 848 8.5 11 –or 545 5.5 12 –or 281 2.8
Uppgifter
5. Skriv ett program som skapar en heltalsarray med plats för 6 heltal. Låt därefter användaren mata en heltal på alla platser i arrayen. Låt programmet räkna och skriva ut medelvärdet av de inmatade talen. Låt dessutom programmet skriva ut vilka av de inmatade talen som är störst respektive minst.