Iteration while-satsen

Relevanta dokument
Föreläsning 3. Iteration while-satsen

Föreläsning 3. Iteration. while-satsen for-satsen do-satsen

Föreläsning 3. Föreläsning 3

Föreläsning 3. Föreläsning 3

Föreläsning 3. Föreläsning 3. Iteration. while-satsen for-satsen do-satsen. while-satsen. do-satsen. Datatypen double

Iteration. Föreläsning 3. TDA540 - Objektorienterad Programmering

Objektorienterad programmering

Primitiva datatyper Selektering

for-satsen Fält for-satsen Föreläsning 8 (OH-bilder 7) for-satsen for-sats är en styrsats för iterationer. for-sats har följande generella utseende:

Föreläsning 2. Primitiva datatyper Selektering

Föreläsning 7. for-satsen Fält

Lösningsförslag: Instuderingsfrågor, del A

Laboration 1. "kompilera"-ikonen "exekvera"-ikonen

JAVAUTVECKLING LEKTION 4

PROGRAMMERING-Java Omtentamina

Tentamen OOP

Föreläsning 3-4 Innehåll

Laboration 1. "kompilera"-ikonen "exekvera"-ikonen

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Lösningsförslag till tentamen

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Laboration 1. Objektorienterad programmering, Z1. Syfte

OOP Objekt-orienterad programmering

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Instuderingsfrågor, del B

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Föreläsning 8. Klassen String Mer om fält Klassen ArrayList

Malmö högskola 2012/2013 Teknik och samhälle

Inledande programmering med C# (1DV402) Summera med while"-satsen

Outline. For. I istället för att följa det normala ordningen, man ändra den. I i Java får man inte göra hopp hur som helst

Mer om klasser och objekt

Klassen String Mer om fält Något om inläsning

Variabler och konstanter

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

1 Iteration. 1.1 for-satsen

Programstruktur och terminologi. Programmet producerar följande utskrift i terminalfönstret: Ett Javaprogram består av en eller flera klasser

F4. programmeringsteknik och Matlab

Primitiva datatyper och selektering

Malmö högskola 2008/2009 CTS

Klassdeklaration. Metoddeklaration. Parameteröverföring

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Föreläsning 2. Föreläsning 2. Primitiva datatyper Selektering. Primitiva datatyper Selektering. Operationer på datatypen double

Lösningsförslag till tentamen

//Använd main som ett "handtag" för att hålla ihop programmet. //Själva programmet finns i övriga klasser.

Variabler som hör till enskilda objekt. Deklareras på översta nivån i klassen och i regel som private.

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

System.out.println("Jaså du har "+ antalhusdjur+ " husdjur"); if ( antalhusdjur > 5 ) System.out.println("Oj det var många);

Lektion Java Grunder. Javas historia. Programmeringsspråket Java. Skillnaderna mellan Java och C++ JVM (Javas Virtuella Maskin)

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Om att lära sig programmera. Föreläsning 1-2 Innehåll.

Föreläsning 2. Täcker material från lektion 1, 2, 3 och 4:

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

PROGRAMMERING-Java TENTAMINA

Objektorienterad programmering

Malmö högskola 2007/2008 Teknik och samhälle

Hej Då, Karel! Programmering. Vårt första Javaprogram. hh.se/db2004. Java. Grundtyper, variabler och arrayer

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

Mer om grafiska komponenter. Händelsestyrda program

Föreläsning 2. Primitiva datatyper Selektering. Operationer på datatypen double. Motsvarande operationer finns för float. a + b addition double

Heltalsrepresentation. Fler byggstenar. Overflow och Underflow. TvŒ-komplement. FlyttalsvŠrden. Fyra heltalstyper. Tecken-bit

Mer källkod. Styrstrukturer Val Slingor Operatorer Källkodsexempel med minne. Erik Forslin. Rum 1445, plan 4 på Nada

Villkor och tester. Utförande satser bygger upp metoderna, man brukar finindela detta i: sekvenser. Ett program består i princip av: selektioner (val)

2 b) Följande finns definierat: public class Spel String titel = "Spel"; Dice[] tärningar = new Dice[10]; tärningar[0] = new Dice("Röd"); tärningar[1]

Föreläsning 5&6 LOGISKA VARIABLER; IMPLEMENTERA KLASSER; MER ALGORITMER

Grundläggande programmering med C# 7,5 högskolepoäng

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Föreläsning 2 Programmeringsteknik och C DD1316

Föreläsnings 9 - Exceptions, I/O

Föreläsning 2. Föreläsning 2

Föreläsning 9-10 Innehåll

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

Lösningsförslag till tentamen

Föreläsning 1 & 2 INTRODUKTION

Typkonvertering. Java versus C

Lite om reella tal. Programmering. I java. Om operatorers associativitet och prioritet

Föreläsning 1 & 2 INTRODUKTION

Uppgift: Algoritm för att beräkna kontrollsiffran i ett personnummer givet de 9 första siffrorna. Torrsimning av algoritm för personnummer

Metoder och top-down design

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

OOP Objekt-orienterad programmering

JAVAUTVECKLING LEKTION 3

Instuderingsfrågor, del A

Operationer på datatypen double

Lösningsförslag till tentamen

Föreläsning REPETITION & EXTENTA

Programmering A. Johan Eliasson

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

I ett program hantera man ofta samlingar av objekt av samma typ.

Föreläsning 2. Föreläsning 2

Föreläsningsmaterial (Syntax och variabler)

System.out.println("Jaså du har "+ antaldollar + " stycken.");

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Data, typ, selektion, iteration

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy cards. Slingor

Transkript:

Datatypen double TDA143 I1 Programmerade system Föreläsning 3 (OH-bilder 3) Iteration while-satsen Christer Carlsson I en dator kan man inte lagra hur stora eller hur små tal som helst. De enkla datatyperna, som används för att lagra tal (t.ex. int och double), har en begränsad storlek och representerar således endast en delmängd av de verkliga talen. Detta innebär att ett resultat eller ett mellanresultat från en beräkning av ett uttryck kan bli ett värde som inte kan lagras. Resulterar uttrycket i ett för stort värde uppstår overflow och om uttrycket resulterar i ett för litet värde uppstår underflow. Reella tal lagras med ett bestämt antal signifikanta siffror, vilket innebär att det vid beräkningar uppstår trunkeringsfel och kancellationsfel: : Antag att vi lagrar decimala tal med 4 decimaler. Uttrycket 1.0/3.0 + 1.0/3.0 +1.0/3.0 kommer då att evalueras på följande sätt: 1.0/3.0 + 1.0/3.0 +1.0/3.0 = 0.3333 + 0.3333 + 0.3333 = 0.9999 resultatet blir inte 1.0, som man kanske trott! Konsekvens: När man handhar reella tal skall man aldrig jämföra på exakthet, utan istället jämföra på tillräcklig noggrannhet. 1 2 I en triangel kan man beteckna sidorna a, b och c. Om man känner till längden av sidorna a och b samt vinkeln ξ mellan dessa sidor, kan man räkna ut längden av sidan c med hjälp av formeln: c = a 2 + b 2 2ab cos( ξ) Skriv ett program som läser in längderna på två sidor i en triangel och vinkeln mellan dessa sidor (uttryckt i grader). Programmet skall avgöra om triangeln är liksidig (alla sidor lika långa), likbent (två sidor lika långa) eller oliksidig (inga sidor är lika långa). Programmet skall ge lämpliga utskrifter. Indata: Längderna A och B på två sidor i triangeln, samt den mellanliggande vinkeln VG i grader. Utdata: Utskrift av huruvida triangeln är liksidig, likbent eller oliksidig. Diskussion: I klassen Math i Java anges parametrarna till de trigonometriska funktionerna i radianer. Därför är en omvandling av vinkeln från grader till radianer nödvändig att göra. Detta omvandling kan antingen göras genom att använda metoden toradians i klassen Math, eller genom att använda formeln VR = VG π 180 där VR är vinkeln uttryckt i radianer och VG är vinkeln uttryckt i grader. För att två sidor skall betraktas som lika antas att sidornas längder skiljer sig med mindre än ε längdenheter. 3 4

Algoritm: 1. Läs längderna på sidorna A och B, samt gradtalet VG av den mellanliggande vinkeln. 2. Beräkna VR som den mellanliggande vinkeln uttryckt i radianer mha formeln VR = VG π 180. 3. Beräkna längden C av den den okända sidan i triangeln mha formeln C = A 2 + B 2 2AB cos( VR). 4. Om A-B ε och A-C ε och B-C ε så skriv ut att triangeln är liksidig om A-B ε eller A-C ε eller B-C ε så skriv ut att triangeln är likbent skriv ut att triangeln är oliksidig. Längderna A, B och C samt vinklarna VG och VR är av datatypen double. Konstanten PI, för att avbilda π finns tillgänglig i klassen Math. Konstanten EPS = 0.001, för att avbilda ε. /* Programmet läser in längderna av två sidor i en triangel */ /* samt mellanliggande vinkel, och skriver ut huruvida */ /* triangeln är liksidig, likbent eller oliksidig */ public class Triangel { final double EPS = 0.001; "Ange längden av första sidan i triangeln: "); double a = Double.parseDouble(indata); "Ange längden av andra sidan i triangeln: "); double b = Double.parseDouble(indata); "Ange vinkeln mellan dessa sidor: "); double vgrader = Double.parseDouble(indata); double vradianer = vgrader*math.pi/180.0; double c = Math.sqrt(a*a + b*b - 2.0*a*b*Math.cos(vRadianer)); if ((Math.abs(a - b) <= EPS) && (Math.abs(a - c) <= EPS) &&(Math.abs(b - c) <= EPS)) "LIKSIDIG"); if ((Math.abs(a -b) <= EPS) (Math.abs(a - c) <= EPS) (Math.abs(b - c) <= EPS)) "LIKBENT"); "OLIKSIDIG"); // main // Triangel 5 6 Styrstrukturerna i Java Olika typer av iteration Sekvens: Selektion: Iteration: Tilldelningssatsen Selektionssatser Iterationssatser return-satsen anrop av void-metod programblock if-satsen switch-satsen while-satsen do-while-satsen for-satsen a) ett på förhand bestämt antal gånger (räkneloop) b) tills ett visst villkor blivit uppfyllt (villkorsloop). : a) Gå fem steg framåt (räkneloop) b) Rör om tills smöret har smält (villkorsloop). 7 8

Iteration: while-satsen Upprepning av en sats: while (villkor) sats; Upprepning av programblock: sats1;... satsn; : Räkneloop public class Loop1 { public static void main (String[] arg) { "Ange antalet utskrifter:"); int number = Integer.parseInt(indata); int count = 0; String utdata = ""; while (count < number) { count = count + 1; utdata = utdata + "Detta är utskrift " + count + \n ; utdata); //main //Loop1 villkor false true sats 9 10 Indata: Ingen Antalet bakterier y n i en bakterieodling efter t tidsenheter ges av formeln y n = y s e 1.386t där y s är antalet bakterier vid t = 0. Skriv ett program som beräknar hur många tidsenheter det tar innan en bakterieodling som innehåller en bakterie innehåller 1 miljard bakterier. Utdata: Hur lång tid det tar innan bakterieodlingen innehåller 1 miljard bakterier. Algoritm: 1. Sätt tillväxttiden tid till 0. 2. Sätt ystart, antalet bakterier vid tiden 0, till 1. 3. Sätt totala antalet bakterier i odlingen ytotal till ystart. 4. Upprepa så länge som ytotal är mindre än 1000000000 4.1. Öka tid med 1. 4.2. Beräkna ytotal mha formeln ytotal = ystart * e 1.386*tid 5. Skriv ut värdet av tid. tid är av datatypen int. ystart och ytotal är reella tal, dvs av datatypen double. 11 12

public class Bakterier { int tid = 0; double ystart = 1; double ytotal = ystart; while (ytotal < 1.0e9) { tid = tid + 1; ytotal = ystart*math.exp(1.386*tid); "Det tar " + tid + " tidsenheter innan" + " odlingen innehåller 1 miljard bakterier."); //main //Bakterier Evighetsloop och satsen break Konstruktionen while (true) { satser innebär en evighetsloop. En loop kan när som helst lämnas mha satsen break. if (villkor för att sluta) Observera att vid nästlade loopar lämnas den loop i vilken break-satsen står! if (villkor för att sluta) Exekveringen fortsätter här 13 14 : Inläsningskontroll public class Loop2 { public static void main (String[] arg) { int talet; while (true) { "Ange ett tal mellan 1 och 200:"); talet = Integer.parseInt(indata); if (talet >= 1 && talet <= 200) "Ogiltigt tal! Försök igen!"); "Det accepterade talet är " + talet); //main //Loop2 : Upprepad programkörning import java.text.*; import java.util.*; public class Cylinder3 { public static void main (String[] arg) { while (true) { "Ange cylinderns radie och höjd:"); if (indata == null) Scanner sc = new Scanner(indata); double radie = sc.nextdouble(); double höjd = sc.nextdouble(); double volym = Math.PI * Math.pow(radie,2) * höjd; NumberFormat r = NumberFormat.getInstance(); r.setmaximumfractiondigits(2); r.setminimumfractiondigits(2); "Volymen av cylindern är " + r.format(volym)); //while //main //Cylinder3 Kommentar: Om man trycker på Cancel-knappen i en dialogruta görs ingen inläsning och strängen som erhålls får "specialvärdet" null. 15 16

Skriv ett program som läser en indataserie bestående av N positiva heltal samt beräknar och skriver ut medelvärdet av dessa tal. Indata: Antalet tal i dataserien samt själva dataserien. Utdata: Medelvärdet av talen i dataserien. Speciella åtgärder: Utkast till algoritm: Om inga tal ingår i dataserien kan inte medelvärdet beräknas. 1. Läs in antalet heltal som ingår i dataserien till variabeln antal. 2. Läs talen och beräkna talens sammalagda summa i variablen summa. 3. Beräkna medelvärdet medel mha formeln medel = summa / antal. 4. Skriv ut medelvärdet, dvs värdet av variabeln medel. Mer detaljerad algoritm: 1. Läs in antalet heltal som ingår i dataserien till variabeln antal. 2. Sätt summa till 0. 3. Upprepa antal gånger 3.1. Läs ett tal till variabeln tal. 3.2. Addera summa och tal och spara resultatet i summa. 4. Om antal > 0 så 4.1. Beräkna medelvärdet medel mha formeln medel = summa / antal 4.2. Skriv ut medelvärdet medel 4.3. Skriv ut att inga värden ingick i dataserien. antal, summa och tal är heltal av typen int. medel är ett reellt tal av typen double. 17 18 public class AdderaSerie { "Ange antalet tal i serien:"); int antal = Integer.parseInt(indata); int i = 0; while (i < antal) { i = i + 1; "Ange tal nr " + i + ": "); int tal = Integer.parseInt(indata); // main // AdderaSerie Skriv ett program som läsa och beräkna medelvärdet av ett okänt antal positiva heltal. Serien av heltalen avslutas med ett negativt heltal (vilket inte ingår i serien). 19 20

Indata: Talen i dataserien som skall läsas in, samt ett negativt tal som avbryter inläsningen. Utdata: Medelvärdet av talen som ingår i dataserien. Speciella åtgärder: Om inga tal ingår i dataserien kan inte medelvärdet beräknas. Algoritm: 1. Sätt summa till 0 och antal till 0. 2. Läs ett tal till variabeln tal. 3. Upprepa så länge som tal 0 3.1. Öka antal med 1. 3.2. Addera summa och tal och spara resultatet i summa. 3.3. Läs ett tal till variabeln tal. 4. Om antal > 0 så 4.1. Beräkna medelvärdet medel mha formeln medel = summa/antal 4.2. Skriv ut medelvärdet medel 4.3. Skriv ut att inga värden ingick i dataserien. public class AdderaSerie2 { int antal = 0; "Ange tal nr " + (antal+1) + ":"); int tal = Integer.parseInt(indata); while (tal >= 0) { antal = antal + 1; "Ange tal nr " + (antal + 1 ) + ":"); tal = Integer.parseInt(indata); // main // AdderaSerie2 antal, summa och tal är heltal av typen int. medel är ett reellt tal av typen double. 21 22 Skriv ett program som läsa och beräkna medelvärdet av ett okänt antal heltal. Diskussion: Nu kan alla heltal ingå i dataserien och hur skall vi då kunna markera slutet på serien? Ett sätt är att utnyttja Cancel-knappen i dialogrutan. När man trycker på Cancel returneras värdet null. Indata: Talen i dataserien som skall läsas in. Inläsningen avbryts genom att trycka på Cancel-knappen i dialogrutan. Utdata: Medelvärdet av talen som ingår i dataserien. Speciella åtgärder: Om inga tal ingår i dataserien kan inte medelvärdet beräknas. Algoritm: 1. Sätt summa till 0 och antal till 0. 2. Gör en inläsning från dialogfönstret till variabeln indata. 3. Upprepa så längs som indata inte är null 3.1. Öka antal med 1. 3.2. Konvertera intata till heltalet tal. 3.3. Addera summa och tal och spara resultatet i summa. 3.4. Gör en inläsning från dialogfönstret till variabeln indata. 4. Om antal > 0 så 4.1. Beräkna medelvärdet medel mha formeln medel = summa/antal 4.2. Skriv ut medelvärdet medel 4.3. Skriv ut att inga värden ingick i dataserien. antal, summa och tal är heltal av typen int. medel är ett reellt tal av typen double. 23 24

public class AdderaSerie3 { int antal = 0; "Ange nästa tal i serien\n" + "Avsluta med Cancel"); while (indata!= null) { int tal = Integer.parseInt(indata); antal = antal + 1; "Ange nästa tal i serien\n" + "Avsluta med Cancel"); // main // AdderaSerie3 Inläsning med användninga av klassen Scanner, dvs flera indatavärden kan ges i en och samma dialogruta. import java.util.*; public class AdderaSerie4 { int antal = 0; "Ange talen i serien\n" + "eller avsluta med Cancel"); while (indata!= null) { Scanner sc = new Scanner(indata); while (sc.hasnext()) { int tal = sc.nextint(); antal = antal + 1; "Ingår fler tal i serien så ge dessa\n" + "eller avsluta med Cancel"); // main // AdderaSerie4 25 26 Iteration: do-while-satsen Java har en variant av while-satsen, do-while-satsen. I while-satsen beräknas testutrycket inför varje varv i loopen. I do-while-satsen beräknas testutrycket efter varje varv i loopen. do do { sats; satser while (villkor); while(villkor); sats true villkor false En do-while-sats loopar minst en gång, medan en whilesats kan loopa noll gånger. 27