Hoofdstuk 6: Wiskundige Functies, Chars en Strings
Inleiding
In vorige hoofdstukken hebben we ons toegespitst op kleine programma's en konden we met eenvoudige selectie structuren (if
, if-else
, switch
) eenvoudige programma's maken. In dit hoofdstuk gaan we iets dieper in op wiskundige functies, characters en tekst (of String). Het zijn elementen die we in programma's vrij veel gebruiken. Voornamelijk strings of stukjes tekst worden heel veel gebruikt en hoe we tekst kunnen manipuleren.
Veelgebruikte wiskundige functies
Java voorziet veel nuttige methodes in de
Math
klasse om veelgebruikte wiskundige functie te berekenen
- Een methode is een verzameling van Java uitdrukkingen die een specifieke taak uitvoeren. De functies resulteren een in waarde van het type
int
ofdouble
(meestaldouble
) die je dan kan gebruiken in het verdere verloop van het programma. - Naast methoden heeft de
Math
klasse ook constanten. De meest gebruikte zijnMath.PI
enMath.E
, die en voorstellen.
Goniometrische functies
- Hieronder vind je een tabel met methoden die goniometrische functies uitvoeren
Methode | Beschrijving |
---|---|
sin(radialen) |
berekent de sinus van een hoek in radialen |
cos(radialen) |
berekent de cosinus van een hoek in radialen |
tan(radialen) |
berekent de tangens van een hoek in radialen |
toRadians(graden) |
berekent de hoek in radialen van een hoek in graden |
toDegrees(radialen) |
berekent de hoek in radialen van een hoek in graden |
asin(a) |
berekent de hoek in radialen voor de inverse sinus |
acos(a) |
berekent de hoek in radialen voor de inverse cosinus |
atan(a) |
berekent de hoek in radialen voor de inverse tangens |
- De parameter voor
sin
,cos
entan
is een hoek in radialen. Voorbeelden:
Exponentiële functies
- Er zijn 5 functies met exponenten
Methode | Beschrijving |
---|---|
exp(x) |
berekent |
log(x) |
berekent de natuurlijke logaritme van x () |
log10(x) |
berekent de basis 10 logaritme van x () |
pow(a,b) |
berekent a tot de macht b () |
sqrt(a) |
berekent de vierkantswortel van x () |
- Voorbeeld
TODO nog functies
Charactertypes en operaties
Een charactertype stelt juist één teken voor.
- Naast types om getallen voor te stellen, heeft Java ook types om tekens voor te stellen. Het datatype
char
dient om tekens voor te stellen. Een character literal is ingesloten in enkelvoudige aanhalingstekens, bv:
- Het eerste statement kent het teken
a
toe aanletter
. Het tweede statement kent het teken4
toe aancijfer
. Let op, voor de computer is dit slechts een teken, hij heeft geen notie dat wij daar misschien de waarde 4 mee associëren.
Unicode en ASCII Code
- een computer gebruikt binaire getallen om gegevens voor te stellen. Dat betekent ook dat het teken in een binaire voorstelling dient omgezet te worden.
- Vroeger was er de ASCII (American Standard Code for Information Interchange) die een teken voorstelde via 8 bits. Maar door de komst van ander tekens (bv. Chinees, Japans,...) was 8-bit niet meer genoeg.
- De Unicode voorstelling laat toe om 65,536 tekens voor te stellen in een 16-bit binaire voorstelling. Dit is op zich niet genoeg en meen heeft een uitbreiding gedaan zodat Unicode 1,112,064 tekens kan voorstellen. Maar wij gaan ons beperken tot de oorspronkelijke 16-bit voorstelling.
- Elke teken heeft een decimale waarde die in de binaire voorstelling overeenkomt met de ASCII code. Zo is het teken
0
gelijk aan de ASCII code00110000
wat in het decimaal getalstelsel overeekomt met 48. - In de Unicode standaard worden er 4 hexadecimale cijfers gebruikt. Elk hexadecimaal cijfer kan voorgesteld worden door 4 bits. De ASCII code is een onderdeel van de Unicode standaard. Een teken in Unicode wordt voorgesteld door
\u0000
tot\uFFFF
. De ASCII tekens zitten in de Unicode vervat van\u0000
tot\u007F
(e.g. de laatste 7 bits van de 16-bit Unicode teken). - In het Chinees is een begroeting gelijk aan 欢迎 en dat zijn de Unicode tekens
\u6B22 \u8FCE
.
Characters | Code waarde in decimaal |
---|---|
0 tot 9 |
48 tot 57 |
A tot Z |
65 tot 90 |
a tot z |
97 tot 122 |
Escape sequenties voor speciale characters
- Stel dat je in je programma een volgend stuk tekst op het scherm wil tonen:
Hij zei "Java is leuk"
. Logischerwijze zou een Java uitdrukking die dit doet als volgt zijn:
- Deze Java-uitdrukking zal een compileerfout opleveren omdat stukken tekst worden afgebakend met dubbele aanhalingstekens (
"
). In voorgaande Java-uitdrukking kan de compiler niet weten welke aanhalingsteken het stuk tekst afbakent of welk aanhalingsteken op het scherm moet getoond worden. - Om dit probleem op te lossen heeft java een speciale notatie om speciale tekens te tonen. Deze speciale notatie wordt ook wel escape sequenties genoemd en bestaat uit een backslash gevolgd door een teken of een combinatie van cijfers. Om een aanhalingsteken op het scherm te tonen moeten we
\"
gebruiken.
- Er zijn tekens die niet direct zichtbaar zijn. Zoals een nieuwe regel (
\n
) of tab (\t
). De escape sequentie\u0009
is het tab-teken in unicode en is dus equivalent met\t
.
Escape sequentie | Naam | Unicode code | Decimale waarde |
---|---|---|---|
\b |
Backspace | \u0008 |
8 |
\t |
Tab | \u0009 |
9 |
\n |
Nieuwe regel | \u000A |
10 |
\f |
Formfeed (wordt niet meer gebruikt) | \u000C |
12 |
\r |
Return | \u000D |
13 |
\\ |
Backslach | \u005C |
92 |
\" |
Aanhalingsteken | \u0022 |
34 |
- De backslash
\
wordt ook wel de escape character genoemd en is een speciaal character. Om een\
te tonen moet je de escape sequentie\\
gebruiken. Bijvoorbeeld:
toont
\t is een tab character
Casten tussen char en numerieke types
- Een
char
kan gecast worden naar een numeriek type. Een getal kan ook gecast worden naar eenchar
. Zo kunnen we een kommagetal omzetten naar een teken
- Wanneer een
char
wordt omgezet naar een numeriek type dan wordt de Unicode code omgezet naar een getal.
- Er kan impliciet gecast worden (zonder
(type)
) vanchar
naarbyte
enint
:
- All numerieke operatoren kunnen uitgevoerd worden op
char
. Eenchar
wordt dan automatisch omgezet in een getal.
toont
i is 101
j is 99
99 is de Unicode voor character c
Hoofdstuk 2
Vergelijken van chars
- Variabelen van het type
char
kunnen met elkaar vergeleken worden via de logische operatoren. Zo is'a' < 'b'
wanta
heeft unicode 97 en b heeft unicode 98. - Soms moet er in een programma getest worden indien een letter een hoofdletter is of kleine letter. Dit kan als volgt:
- Voor het gemak biedt Java de volgende methodes aan in de
Character
klasse om tekens (characters) te testen. TheCharacter
klasse is gedefinieerd in dejava.lang
package.
Methode | Beschrijving |
---|---|
isDigit(ch) |
geeft true als ch een cijfer is |
isLetter(ch) |
geeft true als ch een letter is |
isLetterOrDigit(ch) |
geeft true als ch een cijfer of een letter is |
isLowerCase(ch) |
geeft true als ch een kleine letter is |
isUpperCase(ch) |
geeft true als ch een hoofdletter is |
Bijvoorbeeld
De klasse String
Een string is een sequentie van characters.
- Een
char
stelt maar één teken vvoor. Om een stuk tekst voor stellen hebben we een reeks tekens nodig. Hierbij kunnen we het typeString
gebruiken. Bijvoorbeeld, volgend stukje code declareert een variabele van het typeString
met de naamboodschap
en de waarde van die variabele is"Welkom bij Java"
.
String
is een vooraf gedefinieerde klasse in de Java bibliotheek, zoalsSystem
enScanner
. Het is geen primitief type, maar een zogenaamde referentie type. Een variabele van een referentie type is een variabele dat refereert (verwijst) naar een object. Een object is een verzameling van inhoud die in het type gedeclareert is. We praten meer over objecten en klassen vanaf hoofdstuk XX. Voorlopig volstaat de uitleg die hier gegeven wordt om elementaire bewerkingen uit te voeren met stukjes tekst.- De
String
klasse heeft nekle methodes om eigenschappen en elementen uit strings te verkrijgen:
Methode | Beschrijving |
---|---|
length() |
Geeft het aantal tekens (characters) in de string |
charAt(index) |
Geeft het teken terug in rij op index |
concat(s1) |
Geeft een nieuwe string terug die de concatenatie is van de string met de string s1 |
toUpperCase() |
Geeft een nieuwe string terug waarbij alle letters verandert zijn in hoofdletters |
toLowerCase() |
Geeft een nieuwe string terug waarbij alle letters verandert zijn in kleine letters |
trim() |
Geeft een nieuwe string terug waarbij alle witruimte (spaties, tabs, enters) op de beide uiteinden verwijderd zijn |
De lengte van ee nstring
- Je kan de methode
length()
gebruiken om de lengte te bepalen van een stuk tekst of string. Onder lengte verstaan we het aantal characters. Spaties en witruimte tellen ook mee als tekens. Bijvoorbeeld,
- Dit toont het volgende op het scherm:
De lengte van "Welkom bij Java!" is 16
Characters in een string
- Een string kan je zien als een opeenvolging van tekens in een bepaalde volgorde. De plaats in de rij wordt aangegeven door een index, die gaat van
0
tots.length()-1
. Hierbij is0
de eerste character in de rij van tekens. De volgorde start dus vanaf 0 in Java. - Zo is het resultaat van
boodschap.charAt(0)
gelijk aanW
.
- Opgelet Een character ophalen buiten de grenzen van de string zal leiden tot een fout tijdens het uitvoeren. De index van een string is begrensd van
0
totlength()-1
. Zo zals.charAt(s.length())
een fout geven met de meldingStringIndexOutOfBoundsException
.
Concatenatie van strings
- Je kan strings concateneren (bij elkaar voegen) op twee manieren. Een eerste manier is via de methode
concat()
:
- Een tweede en meest gebruikte manier is het gebruik van het
+
-teken. Bij wiskundige bewerkingen is+
een optelling, maar als het+
-teken omgeven is door strings zal dit een andere betekenis hebben en weet Java dat de concatenatie zal worden toegepast.
- Je kan ook het
+
-teken gebruiken bij een string en een getal (bv. typeint
ofdouble
). Dan zal Java impliciet (automatisch) het getal omzetten naar een string (bv. getal 1 wordt dan1
en 65.64 wordt65.64
) en deze string concateneren als string. Bijvoorbeeld
- In dit geval kunnen we ook de verkorte operator
+=
gebruiken. Deze concateneert een stuk tekst met zichzelf.
- Stel dat
i = 1
enj = 2
, wat zal op het scherm komen bij de volgende uitdrukking?
- Het antwoord is
"i + j is 12"
, want"i + j is"
wordt eerst concateneerd met de waarde vani
en daarna met die vanj
. De eerste optelling is de concatenatie-operator bij strings, maar hierdoor wordt de tweede ook diezelfde operator. Om de tweede optelling te doen forceren om de wiskundige optelling uit te voeren moeten we haakjes gebruiken:
Inlezen van een string via de console
- Om een string in te lezen vanuit de console, kan je
next()
methode aanroepen van eenScanner
object. Volgens stuk code leest een zin in van 3 woorden:
Dit geeft hetvolgende als uitvoer:
Voer 3 woorden in gescheiden door een spatie: Welkom bij Java
s1 is Welkom
s2 is bij
s3 is Java
- De
next()
methode leest een string in dat eindigt met een witruimte character (e.g. spatie, tab (\t
) of enter (\n
)). Een andere methodenextLine()
leest een gander regel van tekst. De methode leest een string in dat eindigt met een druk van de Enter toets.
Vergelijken van strings
- De
String
klasse bevat methodes om stukken tekst of strings met elkaar te vergelijken
Methode | Beschrijving |
---|---|
s2.equals(s1) |
Geeft true als de string s2 gelijk is aan de string s1 |
s2.contains(s1) |
Geeft true als de string s2 de string s1 bevat |
Conversie van String naar Getallen
- Je kan een string dat enkel cijfers bevat omzetten naar een getal. Om een string te converteren naar een type
int
, gebruiken weInteger.parseInt(intString)
:
- Om een string naar een
double
te converteren, gebruiken weDouble.parseDouble(doubleString)
als volgt:
- Je kan gemakkelijk een getal naar een string omvormen door de concatenatie-operator te gebruiken
Formatteren van uitvoer
De methode
System.out.printf
wordt gebruikt om de uitvoer te formatteren
- Soms is het wenselijk om nummers in een bepaald formaat op het scherm te tonen. Bijvoorbeeld, het volgend stukkje code zal de interest gaan berekenen:
De uitvoer is
De interest in € bedraagt 16.404674
- Het heeft geen zin om een bedrag in € tot op 6 cijfers na de komma te tonen. Twee cijfers na de komma is genoeg. Dit kan je doen als volgt
De uitvoer wordt nu
De interest in € bedraagt 16.4
- Dit is nog altijd niet correct. We willen dat er
16.40
op het scherm wordt getoond in plaats van16.4
. Dit kunnen we oplossen met de methodeSystem.out.printf
De uitvoer wordt nu
De interest in € bedraagt 16.40
- De
f
inprintf
staat voor formatted en impliceert dat de methode iets op het scherm toont in een bepaald formaat. De syntax om de methode aan te roepen is
waarbij formaat
een string is die bestaat uit kleinere strings en zogenaamde formaatspecificaties of in het Engels format specifiers.
- Een formaatspecificatie specifieert hoe een variabele moet geformatteerd worden. Een variable kan van het numerieke type zijn (
int
,double
,byte
,short
,float
), een character (char
) en een Booleaanse waarde (boolean
) of een string (String
). Een formaatspecificatie bestaat uit een percent teken (%
) gevolgd door een conversiecode. Veel voorkomende formaatspecificaties vind je in onderstaande tabel:
Formaatspecificatie | Uitvoer | Voorbeeld |
---|---|---|
%b |
Een Booleaanse waarde | True of False |
%c |
Een character | 'a' |
%d |
Een decimaal geheel getal (integer) | 200 |
%f |
Een kommagetal | 45.460000 |
%e |
Een getal in wetenschappelijke notatie | 4.55600e+01 |
%s |
Een string | "Java is cool" |
- Een voorbeeld