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 of double (meestal double) die je dan kan gebruiken in het verdere verloop van het programma.
  • Naast methoden heeft de Math klasse ook constanten. De meest gebruikte zijn Math.PI en Math.E, die π\pi en ee 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 en tan is een hoek in radialen. Voorbeelden:
double hoek1 = Math.toDegrees(Math.PI/ 2); // geeft 90.0 double hoek2 = Math.toRadians(30); // geeft 0.5236 Math.sin(hoek1); // geeft 1 Math.sin(Math.toRadians(270)); // berekent de sinus van 270 graden Math.cos(Math.PI / 6); // berekent de cosinus van $pi/6$

Exponentiële functies

  • Er zijn 5 functies met exponenten
Methode Beschrijving
exp(x) berekent exe^x
log(x) berekent de natuurlijke logaritme van x (ln(x)ln(x))
log10(x) berekent de basis 10 logaritme van x (log10(x)log_{10}(x))
pow(a,b) berekent a tot de macht b (aba^b)
sqrt(a) berekent de vierkantswortel van x (a\sqrt{a})
  • Voorbeeld
double getal1 = Math.exp(3.5); //berekent e tot de macht 3.5 double getal2 = Math.pow(2,3); //berekent 2 tot de macht 3 double getal3 = Math.pow(getal1,getal2); System.out.println("De vierkantswortel van " + getal1 + " is " + Math.sqrt(getal1));

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:
char letter = 'a'; char cijfer = '4';
  • Het eerste statement kent het teken a toe aan letter. Het tweede statement kent het teken 4 toe aan cijfer. 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 code 00110000 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:
System.out.println("Hij zei "Java is leuk"");
  • 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.
System.out.println("Hij zei \"Java is leuk\"");
  • 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:
System.out.println("\\t is een tab character");

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 een char. Zo kunnen we een kommagetal omzetten naar een teken
char ch = (char)65.25; // Decimaal getal 65 wordt toegekend aan ch System.out.println(ch); // ch is een character A
  • Wanneer een char wordt omgezet naar een numeriek type dan wordt de Unicode code omgezet naar een getal.
int i = (int)'A'; // De unicode code van 'A' is toegekend aan i System.out.println(i); // i is 65
  • Er kan impliciet gecast worden (zonder (type)) van char naar byte en int:
byte b = 'a'; int i = 'a';
  • All numerieke operatoren kunnen uitgevoerd worden op char. Een char wordt dan automatisch omgezet in een getal.
int i = '2' + '3'; // (int)'2' is 50 en (int)'3' is 51 System.out.println("i is " + i); // scherm: i is 101 int j = 2 + 'a'; // (int)'a' is 97 System.out.println("j is " + j); // scherm: j is 99 System.out.println(j + " is de Unicode voor character " + (char)j); // 99 is the Unicode for character c System.out.println("Hoofdstuk " + '2');

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' want a 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:
if (ch >= 'A' && ch <= 'Z'){ System.out.println("Het teken " + ch + " is een hoofdletter."); } if (ch >= 'a' && ch <= 'z'){ System.out.println("Het teken " + ch + " is een kleine letter."); } if (ch >= '0' && ch <= '9'){ System.out.println("Het teken " + ch + " is een cijfer."); }
  • Voor het gemak biedt Java de volgende methodes aan in de Character klasse om tekens (characters) te testen. The Character klasse is gedefinieerd in de java.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

import java.lang.Character; public class CharacterDemo{ public static void main(String[] args){ System.out.println("isDigit('a') is " + Character.isDigit('a')); System.out.println("isLetter('a') is " + Character.isDigit('a')); char letter = 'b'; System.out.println("isLowerCase('b') is" + Character.isLowerCase(letter)); char letter2 = letter++; System.out.println("isLowerCase('c') is" + Character.isUpperCase(letter2)); } }

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 type String gebruiken. Bijvoorbeeld, volgend stukje code declareert een variabele van het type String met de naam boodschap en de waarde van die variabele is "Welkom bij Java".
String boodschap = "Welkom bij Java";
  • String is een vooraf gedefinieerde klasse in de Java bibliotheek, zoals System en Scanner. 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,
String boodschap = "Welkom bij Java!" System.out.println("De lengte van " + boodschap " is " + boodschap.length());
  • 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 tot s.length()-1. Hierbij is 0 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 aan W.
String charAt()
Figuur - String charAt()
  • 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 tot length()-1. Zo zal s.charAt(s.length()) een fout geven met de melding StringIndexOutOfBoundsException.

Concatenatie van strings

  • Je kan strings concateneren (bij elkaar voegen) op twee manieren. Een eerste manier is via de methode concat():
String s3 = s1.concat(s2); // deze code zal een nieuwe string s3 maken, met eerst de string s1 en daarachter s2.
  • 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.
String boodschap = "Welkom bij Java"; String nieuweboodschap = boodschap + " en " + "HTML"; // dit geeft de variabele een nieuwe waarde: Welkom bij Java en HTML
  • Je kan ook het +-teken gebruiken bij een string en een getal (bv. type int of double). Dan zal Java impliciet (automatisch) het getal omzetten naar een string (bv. getal 1 wordt dan 1 en 65.64 wordt 65.64) en deze string concateneren als string. Bijvoorbeeld
//Drie strings worden geconcateneerd String boodschap = "Welkom " + "bij " + "Java"; //String "Hoofdstuk" wordt geconcateneerd met getal 2 String hoofdstuk = "Hoofdstuk " + 2; //variabele hoofdstuk bevat "Hoofdstuk 2" //String "Appendix" wordt geconcateneerd met character 'A' String appendix = "Appendix " + 'A'; //variabele appendix bevat "Appendix 2"
  • In dit geval kunnen we ook de verkorte operator += gebruiken. Deze concateneert een stuk tekst met zichzelf.
String boodschap = "Welkom bij Java"; boodschap += " en Java is leuk"; // Dit is equivalent met boodschap = boodschap + " en Java is leuk";
  • Stel dat i = 1 en j = 2, wat zal op het scherm komen bij de volgende uitdrukking?
System.out.println("i + j is " + i + j);
  • Het antwoord is "i + j is 12", want "i + j is" wordt eerst concateneerd met de waarde van i en daarna met die van j. 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:
System.out.println("i + j is " + (i + j));

Inlezen van een string via de console

  • Om een string in te lezen vanuit de console, kan je next() methode aanroepen van een Scanner object. Volgens stuk code leest een zin in van 3 woorden:
Scanner input = new Scanner(System.in); System.out.println("Voer 3 woorden in gescheiden door een spatie:"); String s1 = input.next(); String s2 = input.next(); String s3 = input.next(); System.out.println("s1 is " + s1); System.out.println("s2 is " + s2); System.out.println("s3 is " + s3);

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 methode nextLine() 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 we Integer.parseInt(intString):
String intString = "123"; int intWaarde = Integer.parseInt(intString); // intWaarde heeft de waarde 123, intString heeft de waarde "123" (bemerk de ")
  • Om een string naar een double te converteren, gebruiken we Double.parseDouble(doubleString) als volgt:
String invoer = "3.14159"; double waarde = Integer.parseInt(invoer); // waarde heeft de waarde 3.14159, invoer heeft de waarde "3.14159" (bemerk de ")
  • Je kan gemakkelijk een getal naar een string omvormen door de concatenatie-operator te gebruiken
String s = nummer + "";

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:
double bedrag = 12618.98; double interestVoet = 0.0013; double interest = bedrag * interestVoet; System.out.println("De interest in € bedraagt " + interest );

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
double bedrag = 12618.98; double interestVoet = 0.0013; double interest = bedrag * interestVoet; System.out.println("De interest in € bedraagt " + (int)(interest *100)/100.0);

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 van 16.4. Dit kunnen we oplossen met de methode System.out.printf
double bedrag = 12618.98; double interestVoet = 0.0013; double interest = bedrag * interestVoet; System.out.printf("De interest in € bedraagt %4.2f", interest);

De uitvoer wordt nu

De interest in € bedraagt 16.40
  • De f in printf 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
System.out.printf(formaat, variabele1, variabele2, ... , variabelek)

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
int teller = 5; double bedrag = 45.56; System.out.printf("Telles is %d en bedrag is %f", teller, bedrag); // Eerste formaatspecificatie wordt ingevuld door 1ste variabele na de formaatstring

results matching ""

    No results matching ""