11 Math-klassen & fler operatorer

Precis som med DateTime och strängar finns en hel del användbara funktioner vad gäller matematik färdiga att använda i C#. Den klass vi använder heter Math och där kommer vi åt både matematiska funktioner och konstanter.

11.1 Konstanter

Math-klassen har två konstanter - naturliga talet \(e\) och \(\pi\). Du kommer åt dom med Math.E respektive Math.PI och du behöver ej skapa ett nytt objekt av typen Math (faktum är att du inte kan skapa ett objekt av typen Math, med andra ord: Math m = new Math(); ger ett kompileringsfel ).

De båda konstanterna skrivs ut med följande decimalprecision:

  • \(\pi\) = 3,14159265358979
  • \(e\) = 2,71828182845905

11.2 Matematiska funktioner

Precis som med konstanterna kan du direkt använda de matematiska funktionerna genom att skriva Math.Funktionsnamn (eftersom att du inte ens kan skapa en new Math()). Värdet som respektive funktion räknar fram returneras av funktionen, vilket betyder att man bör lagra det i en variabel (om det ska användas senare i programmet). Du bör alltså skriva något i stil med:

double d = Math.Round(2.67, 1);

Utöver funktionerna i nedanstående tabell finns även samtliga trigonometriska funktioner.

Funktion Användning/beskrivning
Math.Round(decimaltal, antalDecimaler) Avrundar talet decimaltal till antalet decimaler angivna med antalDecimaler.
Math.Ceiling(decimaltal) Tvingar avrundning av decimaltal uppåt till närmsta heltal.
Math.Floor(decimaltal) Tvingar avrundning av decimaltal nedåt till närmsta heltal.
Math.Pow(bas, exponent) Beräknar potensen med bas och exponent. Båda talen kan vara heltal eller decimaltal.
Math.Abs(tal) Beräknar absolutbeloppet av tal. Fungerar både för heltal och decimaltal.
Math.Sqrt(tal) Beräknar kvadratroten ur tal. Fungerar både för heltal och decimaltal.
Math.Exp(exponent) Beräknar potens med \(e\) som bas och exponent som exponent.

11.3 Fler operatorer

Utöver själva Math-klassen finns några ytterligare operatorer som underlättar vår programmering en hel del.

11.3.1 Modulus

Modulus är en rest-operator, dvs. den beräknar resten (istället för kvoten) vid division. Tecknet för modulus är % (procenttecknet) men har inget med hundradelar att göra. Modulus blir t.ex. väldigt användbart när vi ska undersöka delbarhet. Om a är delbart med b så ger a % b resultaten 0 (ingen rest).

Console.WriteLine(5 % 2);
// 1

Console.WriteLine(7 % 8);
// 7

Console.WriteLine(26 % 13);
// 0

11.3.2 Tilldelningsoperatorer

När vi gör beräkningar i programmeringen så gör vi väldigt ofta också tilldelningar till en och samma variabel samtidigt. Till exempel när vi beräknar summan på det här sättet:

int summa = 0;
for (int i = 0; i < 10; i++)
{
    summa = summa + i;
}

Ett enklare sätt att skriva raden summa = summa + i; är summa += i;, dvs vi kombinerar tilldelnings- och additionsoperatorn. På så vis slipper vi skriva variabelnamnet summa flera gånger. Det betyder helt enkelt “addera på i till summa”. Motsvarigheter finns till de andra aritmetiska operatorerna -=, *=, /= och %=.

11.3.3 Övningar

  1. Loopa igenom följande array och beräkna summan av decimaltalen. Avrunda till 2 decimaler.

    double[] tal = { -12.1, 6.387, Math.E, 1.2, 16.47, 3.67 };
  2. Skriv ett program där användaren får mata in två tal, a och b. Programmet svarar sedan med ifall a är delbart med b.

  3. FizzBuzz är en klassisk programmeringsuppgift som ofta förekommer i kurser och i böcker. Skapa ett program som skriver ut alla tal mellan 1 och 100 men

    • för multiplar av 3 skriv Fizz istället för talet,
    • för multiplar av 5 skriv Buzz istället för talet och
    • för multiplar av både 3 och 5 skriv FizzBuzz istället för talet.
  4. Beräkna differensen mellan summan av kvadraterna och kvadraten av summan för alla tal mellan 1 och 1000.

    \(1^2 + 2^2 + 3^2 + ... 1000^2\)

    \((1 + 2 + 3 + ... + 1000)^2\)

  5. Skriv ett program (utan att använda DateTime) där användaren får mata in ett klockslag i form av två tal, timmar (0-23) och minuter (0-59). Därefter får användaren mata in ett tredje tal (i minuter med obegränsad storlek) som ska adderas till nuvarande tid. Programmet ska sedan visa det nya klockslaget korrekt på formatet hh:mm.

  6. Skriv ett program som låter användaren ange värden för \(p\) och \(q\) i ekvationen \(x^2 + px + q = 0\) och sedan ger två svar \(x = -\frac{p}{2} \pm \sqrt{(\frac{p}{2})^2 - q}\)

  7. Skriv ett program som omvandlar ett inmatat tal i bas 10 till bas 2. Använd t.ex. matteguiden.se/matte-diskret/de-hela-talen/binara-och-hexadecimala-tal om du glömt av hur man gör.