2. Moment02 - Utskrift, variabler, inmatning och beräkningar

Momentets innehåll

I detta moment ska du lära dig att lagra information i variabler, läsa in information från användaren och använda värdena i beräkningar.

Momentet avslutas med ett quiz och en praktisk diagnos där du får visa att du kan skapa mindre program på egen hand.

2.1 Utskrift, variabler och datatyper

Presentation

Utskrift, variabler och datatyperWriteLine och WriteKommentarerEn variabel har tre delarFyra grundläggande datatyperVärdet kan ändrasText och variabler i samma utskriftVariabler kan användas i beräkningarVanliga felUppgift: resan till GöteborgChecklista efter avsnitt 2.1

Ett program behöver ofta komma ihåg information. Det kan till exempel vara ett namn, en ålder, ett pris eller om en användare är inloggad. Informationen lagras i variabler.

Innan vi börjar arbeta med variabler repeterar vi hur text skrivs ut och hur kommentarer används i C#.

Fortsätt i samma projekt

Du behöver inte skapa ett nytt projekt för varje liten övning. Kommentera istället bort koden från den tidigare uppgiften innan du börjar med nästa.

/*
Console.WriteLine("Kod från en tidigare uppgift");
Console.WriteLine("Den här koden körs inte just nu");
*/

Console.WriteLine("Här börjar nästa uppgift");

2.1.1 Skriva ut text

Vi använder Console.WriteLine() för att skriva ut en rad i konsollen. Texten som ska skrivas ut placeras inom citationstecken.

Console.WriteLine("Hej världen!");
Console.WriteLine("Jag lär mig C#.");

Utskrift

Hej världen!
Jag lär mig C#.

Efter en utskrift med Console.WriteLine() flyttas markören till nästa rad. Console.Write() gör nästan samma sak, men markören stannar kvar på samma rad.

Console.Write("Hej ");
Console.Write("på ");
Console.WriteLine("dig!");
Console.WriteLine("Nästa utskrift hamnar på en ny rad.");

Utskrift

Hej på dig!
Nästa utskrift hamnar på en ny rad.

Tecknen \n skapar en radbrytning mitt i en text.

Console.WriteLine("Alingsås\nGöteborg");

Utskrift

Alingsås
Göteborg

Övning 2.1a – Write och WriteLine

Skriv ett program som skapar exakt följande utskrift:

Utskrift

Nästa tåg
Alingsås - Göteborg
Restid: 42 minuter
  • Använd både Console.Write() och Console.WriteLine().
  • Använd \n för minst en av radbrytningarna.

Lösningsförslag

Console.WriteLine("Nästa tåg");
Console.Write("Alingsås - ");
Console.WriteLine("Göteborg\nRestid: 42 minuter");

2.1.2 Kommentarer

Kommentarer är anteckningar i källkoden. De hjälper oss och andra programmerare att förstå koden, men de körs inte av programmet.

Två snedstreck, //, skapar en kommentar som fortsätter till slutet av raden.

// Skriver ut en hälsning
Console.WriteLine("Hej!");

Console.WriteLine("Välkommen"); // Kommentar efter kod

Om kommentaren ska sträcka sig över flera rader kan den placeras mellan /* och */.

/*
Det här är en kommentar
som sträcker sig över flera rader.
*/

Console.WriteLine("Kommentarerna skrivs inte ut.");

Kommentera lagom

Kommentarer ska förklara sådant som inte redan är tydligt. Du behöver normalt inte skriva en kommentar som bara upprepar exakt vad en enkel kodrad gör.

2.1.3 Variabler

En variabel är en namngiven plats där programmet lagrar ett värde. När vi skapar en variabel behöver vi ange tre saker:

  1. vilken datatyp variabeln ska ha
  2. variabelns namn
  3. vilket värde som ska lagras
string namn = "Amina";
  • string är datatypen
  • namn är variabelns namn
  • "Amina" är värdet
  • semikolonet avslutar instruktionen

När variabeln används skriver vi dess namn utan citationstecken. Med citationstecken skriver vi istället ut själva ordet namn.

string namn = "Amina";

Console.WriteLine(namn);
Console.WriteLine("namn");

Utskrift

Amina
namn

2.1.3.1 Bra variabelnamn

Variabelns namn ska beskriva vad värdet betyder. Namnet får inte innehålla mellanslag. Om namnet består av flera ord använder vi vanligtvis camelCase: första ordet börjar med liten bokstav och följande ord börjar med stor bokstav.

string förnamn = "Amina";
int antalElever = 28;
int högstaPoäng = 15;

C# skiljer på stora och små bokstäver

antalElever och AntalElever räknas som två olika namn. Detsamma gäller exempelvis Console.WriteLine(). Stor och liten bokstav måste därför bli rätt.

Övning 2.1b – presentation med variabler

Skapa tre variabler som lagrar:

  • ditt namn
  • din ålder
  • namnet på en kurs du läser

Skriv sedan ut alla tre variablerna, en per rad.

Lösningsförslag

string namn = "Amina";
int ålder = 16;
string kurs = "Programmering";

Console.WriteLine(namn);
Console.WriteLine(ålder);
Console.WriteLine(kurs);

2.1.4 Grundläggande datatyper

En datatyp talar om vilken sorts information som får lagras i variabeln. I början använder vi framför allt fyra datatyper.

  • string – text, till exempel "Alingsås"
  • int – heltal, till exempel 42
  • double – decimaltal, till exempel 42.5
  • bool – värdet true eller false
string destination = "Göteborg";
int restid = 42;
double avstånd = 47.5;
bool direkttåg = true;

Punkt i C#-koden

När ett decimaltal skrivs direkt i källkoden används punkt: 47.5. Hur användaren senare ska skriva decimaltal vid inmatning kan påverkas av datorns språkinställningar. Det återkommer vi till i nästa avsnitt.

Datatypen bestämmer vilka värden som kan lagras. Följande kod fungerar därför inte:

int ålder = "sexton";

Felmeddelande

Cannot implicitly convert type 'string' to 'int'

Övning 2.1c – välj rätt datatyp

Skapa en lämplig variabel för varje värde:

  • namnet på en film eller serie
  • antal avsnitt
  • ett avsnitts längd i minuter, till exempel 42.5
  • om du har sett klart serien eller inte

Skriv ut variablernas värden.

Lösningsförslag

string titel = "Exempelserien";
int antalAvsnitt = 8;
double längd = 42.5;
bool färdigtittad = false;

Console.WriteLine(titel);
Console.WriteLine(antalAvsnitt);
Console.WriteLine(längd);
Console.WriteLine(färdigtittad);

2.1.5 Ändra värdet i en variabel

Namnet variabel kommer från att värdet kan variera. När en variabel redan har skapats behöver vi inte skriva datatypen igen för att ge den ett nytt värde.

int poäng = 10;
Console.WriteLine(poäng);

poäng = 15;
Console.WriteLine(poäng);

Utskrift

10
15

Skapa inte samma variabel två gånger

Datatypen skrivs endast när variabeln skapas.

int poäng = 10;

// Fel: variabeln poäng finns redan
int poäng = 15;

// Rätt: ge den befintliga variabeln ett nytt värde
poäng = 15;

2.1.6 Variabler i en utskrift

Med stränginterpolering kan vi blanda text och variabler i samma utskrift. Då sätter vi ett dollartecken framför texten och placerar variabelns namn inom klamrar.

string namn = "Amina";
int ålder = 16;

Console.WriteLine($"{namn} är {ålder} år gammal.");

Utskrift

Amina är 16 år gammal.

Utan dollartecknet behandlas klamrarna som vanlig text och variablernas värden skrivs inte ut.

Console.WriteLine("{namn} är {ålder} år gammal.");

Utskrift

{namn} är {ålder} år gammal.

2.1.7 Enkla beräkningar

Tal som lagras i variabler kan användas i beräkningar. Resultatet kan också lagras i en ny variabel.

int biljettpris = 72;
int antalResenärer = 3;
int totalpris = biljettpris * antalResenärer;

Console.WriteLine($"Totalpris: {totalpris} kr");

Utskrift

Totalpris: 216 kr

I ett senare avsnitt går vi igenom de matematiska operatorerna mer noggrant. Just nu räcker det att känna igen +, -, * och /.

Uppgift: m02u01 – resan till Göteborg

Skapa ett program som presenterar information om en tågresa från Alingsås till Göteborg. All information ska i denna första version ligga i variabler. Användaren ska alltså inte mata in något ännu.

Del 1 – skapa variabler

Skapa variabler som lagrar:

  • startort
  • destination
  • restid i minuter
  • biljettpris i hela kronor
  • antal resenärer
  • om tåget är ett direkttåg eller inte

Del 2 – beräkna

  • Beräkna det sammanlagda biljettpriset för alla resenärer.
  • Beräkna den sammanlagda restiden för en resa tur och retur.
  • Lagra båda resultaten i egna variabler.

Del 3 – skriv ut en reseöversikt

Använd stränginterpolering och skapa en tydlig utskrift som innehåller:

  • sträckan
  • restiden för en enkelresa
  • antal resenärer
  • totalpriset
  • restiden tur och retur
  • värdet som visar om det är ett direkttåg

Exempel på utskrift

RESAN
Alingsås - Göteborg
Restid: 42 minuter
Antal resenärer: 3
Totalpris: 216 kr
Restid tur och retur: 84 minuter
Direkttåg: True

Extra utmaning

Lägg till kostnaden för en fika per person och beräkna resans nya totalpris. Ändra sedan antalet resenärer och kontrollera att alla beräkningar fortfarande ger rätt resultat.

Lösningsförslag

string startort = "Alingsås";
string destination = "Göteborg";
int restid = 42;
int biljettpris = 72;
int antalResenärer = 3;
bool direkttåg = true;

int totalpris = biljettpris * antalResenärer;
int restidTurOchRetur = restid * 2;

Console.WriteLine("RESAN");
Console.WriteLine($"{startort} - {destination}");
Console.WriteLine($"Restid: {restid} minuter");
Console.WriteLine($"Antal resenärer: {antalResenärer}");
Console.WriteLine($"Totalpris: {totalpris} kr");
Console.WriteLine($"Restid tur och retur: {restidTurOchRetur} minuter");
Console.WriteLine($"Direkttåg: {direkttåg}");

2.1.8 Sammanfattning

Efter detta avsnitt ska du känna till att:

  • Console.WriteLine() skriver ut och byter rad
  • Console.Write() skriver ut utan att byta rad
  • // och /* ... */ används för kommentarer
  • en variabel har en datatyp, ett namn och ett värde
  • string, int, double och bool lagrar olika typer av värden
  • ett variabelvärde kan ändras under programmets körning
  • stränginterpolering används för att blanda text och variabler i en utskrift
  • värden i variabler kan användas i beräkningar

Nästa avsnitt

I nästa avsnitt ska vi använda Console.ReadLine() för att låta användaren mata in information. Då behöver vi också lära oss hur text omvandlas till tal.

2.2 Inmatning och typomvandling

Presentation

Inmatning och typomvandlingProgrammet ställer en frågaReadLine ger textText sparas direktText kan inte användas som ett talOmvandla text till heltalOmvandla text till decimaltalInmatning blir ett resultatFelaktig inmaning stoppar programmetUppgift: biljettköpetChecklista efter avsnitt 2.2

Hittills har den som skriver programmet bestämt alla värden direkt i koden. Nu ska användaren själv få skriva in information medan programmet körs.

Vi använder Console.ReadLine() för att läsa in en rad från konsollen. Det inmatade värdet kan sedan lagras i en variabel och användas av programmet.

Från fast program till interaktivt program

Ett interaktivt program ställer en fråga, väntar på ett svar och använder svaret. Börja därför med att fundera på vilka frågor programmet behöver ställa och vad det ska göra med svaren.

2.2.1 Läsa in text med Console.ReadLine()

Console.ReadLine() väntar tills användaren har skrivit något och tryckt på Enter. Svaret kan lagras i en variabel av typen string.

Console.Write("Vad heter du? ");
string namn = Console.ReadLine();

Console.WriteLine($"Hej {namn}!");

Exempel på körning

Vad heter du? Amina
Hej Amina!

Frågan skrivs med Console.Write() så att användarens svar hamnar på samma rad. Console.ReadLine() läser sedan det som användaren skriver.

Programmet behöver visa vad användaren ska skriva

Om programmet bara använder Console.ReadLine() ser användaren en tom konsoll och vet inte vad som förväntas. Skriv därför alltid en tydlig fråga först.

Övning 2.2a – personlig hälsning

Skapa ett program som:

  1. frågar efter användarens namn
  2. frågar efter användarens hemort
  3. skriver ut en personlig hälsning med båda svaren

Exempel på körning

Vad heter du? Amina
Var bor du? Alingsås
Hej Amina från Alingsås!

Lösningsförslag

Console.Write("Vad heter du? ");
string namn = Console.ReadLine();

Console.Write("Var bor du? ");
string hemort = Console.ReadLine();

Console.WriteLine($"Hej {namn} från {hemort}!");

2.2.2 Inmatning blir text

Värdet från Console.ReadLine() behandlas som text, även om användaren skriver siffror. Därför fungerar inte följande kod:

Console.Write("Ange din ålder: ");
string ålder = Console.ReadLine();

int ålderNästaÅr = ålder + 1;

Variabeln ålder innehåller text, men beräkningen behöver ett heltal. Texten måste därför omvandlas innan programmet kan räkna med värdet.

2.2.3 Omvandla text till heltal

Convert.ToInt32() omvandlar text som innehåller ett heltal till datatypen int.

Console.Write("Ange din ålder: ");
int ålder = Convert.ToInt32(Console.ReadLine());

int ålderNästaÅr = ålder + 1;
Console.WriteLine($"Nästa år är du {ålderNästaÅr} år.");

Exempel på körning

Ange din ålder: 16
Nästa år är du 17 år.

Läs koden inifrån och ut

  1. Console.ReadLine() läser det användaren skriver.
  2. Convert.ToInt32() omvandlar texten till ett heltal.
  3. Heltalet lagras i variabeln ålder.

Fördjupning: Varför använder vi Convert?

Det finns flera sätt att omvandla text till tal i C#. I det här avsnittet använder vi Convert eftersom metoderna är tydliga och följer samma mönster för olika datatyper:

int antal = Convert.ToInt32(Console.ReadLine());
double pris = Convert.ToDouble(Console.ReadLine());

Ett vanligt alternativ är Parse(). Om användaren skriver ett korrekt heltal ger följande kod samma resultat:

int antal = int.Parse(Console.ReadLine());

I moderna C#-projekt kan den raden däremot ge en varning eftersom Console.ReadLine() i teorin kan ge värdet null. Convert låter oss vänta med den typen av null-hantering tills senare i kursen.

För inmatning från användare är TryParse() ofta det bästa alternativet i färdiga program. Det kan kontrollera om omvandlingen lyckades utan att programmet avbryts. Metoden behöver kombineras med ett villkor, så vi återkommer till den när vi har arbetat med if.

if (int.TryParse(Console.ReadLine(), out int antal))
{
    Console.WriteLine($"Du angav talet {antal}.");
}
else
{
    Console.WriteLine("Du måste skriva ett heltal.");
}

Convert är inte felsäkert

Både Convert.ToInt32() och int.Parse() ger ett felmeddelande om användaren till exempel skriver sexton. I det här avsnittet utgår vi därför från att användaren skriver rätt sorts värde.

Övning 2.2b – ålder i månader

Fråga efter användarens ålder i hela år. Beräkna ungefär hur många månader det är och skriv ut resultatet.

Exempel på körning

Hur många år är du? 16
Det är ungefär 192 månader.

Lösningsförslag

Console.Write("Hur många år är du? ");
int ålder = Convert.ToInt32(Console.ReadLine());

int antalMånader = ålder * 12;
Console.WriteLine($"Det är ungefär {antalMånader} månader.");

2.2.4 Omvandla text till decimaltal

Om användaren ska kunna skriva ett decimaltal använder vi Convert.ToDouble(). Resultatet lagras i en variabel av typen double.

Console.Write("Ange resans längd i kilometer: ");
double avstånd = Convert.ToDouble(Console.ReadLine());

double avståndTurOchRetur = avstånd * 2;
Console.WriteLine($"Tur och retur: {avståndTurOchRetur} km");

Punkt i koden, ofta komma vid inmatning

Ett decimaltal som skrivs direkt i C#-koden använder punkt, till exempel 47.5. När en svensk dator läser in ett decimaltal skriver användaren vanligtvis 47,5. Datorns språkinställningar avgör vilket tecken som fungerar vid inmatning.

Övning 2.2c – rektangelns area

Fråga efter en rektangels bredd och höjd. Använd double, beräkna arean och skriv ut resultatet.

Exempel på körning

Ange bredd: 4,5
Ange höjd: 3
Rektangelns area är 13,5.

Lösningsförslag

Console.Write("Ange bredd: ");
double bredd = Convert.ToDouble(Console.ReadLine());

Console.Write("Ange höjd: ");
double höjd = Convert.ToDouble(Console.ReadLine());

double area = bredd * höjd;
Console.WriteLine($"Rektangelns area är {area}.");

2.2.5 När inmatningen inte kan omvandlas

Om programmet förväntar sig ett heltal men användaren skriver något annat kan omvandlingen inte genomföras. Programmet avbryts då med ett felmeddelande.

Exempel på felaktig körning

Ange din ålder: sexton
Unhandled exception. System.FormatException ...

Testa både rätt och fel

Testa först med den typ av värde som programmet efterfrågar. Prova sedan med text, ett tomt svar eller ett decimaltal där ett heltal förväntas. Just nu räcker det att förstå varför felet uppstår. Senare lär vi oss att hantera felaktig inmatning utan att programmet avbryts.

Uppgift: m02u02 – biljettköpet

Bygg vidare på tanken från resan till Göteborg. Den här gången ska användaren själv mata in informationen och programmet ska beräkna priset för resan.

Del 1 – läs in uppgifter

Programmet ska fråga efter:

  • startort
  • destination
  • antal resenärer
  • biljettpris per person

Del 2 – omvandla och beräkna

  • Omvandla antal resenärer till int.
  • Omvandla biljettpriset till double.
  • Beräkna resans totalpris.

Del 3 – skriv ut en sammanställning

Använd stränginterpolering och skriv ut sträckan, antal resenärer, pris per person och totalpris.

Exempel på körning

Startort: Alingsås
Destination: Göteborg
Antal resenärer: 3
Biljettpris per person: 72,50

BILJETTKÖPET
Alingsås - Göteborg
3 resenärer
Pris per person: 72,5 kr
Totalpris: 217,5 kr

Extra utmaning

Fråga även efter kostnaden för fika per person. Beräkna och skriv ut både biljettkostnaden och hela kostnaden inklusive fika.

Lösningsförslag

Console.Write("Startort: ");
string startort = Console.ReadLine();

Console.Write("Destination: ");
string destination = Console.ReadLine();

Console.Write("Antal resenärer: ");
int antalResenärer = Convert.ToInt32(Console.ReadLine());

Console.Write("Biljettpris per person: ");
double biljettpris = Convert.ToDouble(Console.ReadLine());

double totalpris = biljettpris * antalResenärer;

Console.WriteLine("\nBILJETTKÖPET");
Console.WriteLine($"{startort} - {destination}");
Console.WriteLine($"{antalResenärer} resenärer");
Console.WriteLine($"Pris per person: {biljettpris} kr");
Console.WriteLine($"Totalpris: {totalpris} kr");

2.2.6 Sammanfattning

Efter detta avsnitt ska du kunna:

  • Läsa in och omvandla information från användaren.
  • Använda Console.ReadLine() för att läsa in text.
  • Skriva en tydlig fråga innan användaren matar in ett värde.
  • Förstå att värdet från Console.ReadLine() behandlas som text.
  • Omvandla inmatad text till heltal och decimaltal med Convert.ToInt32() och Convert.ToDouble().
  • Använda inmatade värden i beräkningar och tydliga utskrifter.
  • Känna igen att felaktig inmatning kan få programmet att avbrytas.

Nästa avsnitt

I nästa avsnitt arbetar vi vidare med matematiska operatorer, heltalsdivision, rest och prioriteringsregler. Då ska programmen kunna göra fler typer av beräkningar.

2.3 Matematiska operatorer och beräkningar

Presentation

Matematiska operatorer och beräkningarBetalningen från biljettköpetDe fyra räknesättenHeltalsdivisionDivision med decimalerRestoperatorn143 minuter delas uppPrioriteringsregler och parenteserSamma variabel får ett nytt värdeUppgift: klasskassanChecklista efter avsnitt 2.3

Ett program blir användbart när det kan bearbeta information. I det här avsnittet arbetar vi vidare med beräkningar och undersöker hur datatypen påverkar resultatet.

Vi ska också använda heltalsdivision och rest för att dela upp värden, till exempel minuter i timmar och minuter eller pengar i hela inköp och pengar som blir kvar.

Lektionens mål

Efter avsnittet ska du kunna välja lämplig operator, förutsäga resultatet av en beräkning och dela upp en större beräkning i tydliga steg.

2.3.1 De fyra räknesätten

C# använder följande operatorer för de fyra vanliga räknesätten:

  • + – addition
  • - – subtraktion
  • * – multiplikation
  • / – division
int tal1 = 12;
int tal2 = 5;

int summa = tal1 + tal2;
int skillnad = tal1 - tal2;
int produkt = tal1 * tal2;
int kvot = tal1 / tal2;

Console.WriteLine($"Summa: {summa}");
Console.WriteLine($"Skillnad: {skillnad}");
Console.WriteLine($"Produkt: {produkt}");
Console.WriteLine($"Kvot: {kvot}");

Utskrift

Summa: 17
Skillnad: 7
Produkt: 60
Kvot: 2

Varför blir 12 / 5 lika med 2?

Både tal1 och tal2 är heltal. När två värden av typen int divideras blir resultatet också ett heltal. Decimaldelen tas bort.

Övning 2.3a – enkel kalkylator

Läs in två heltal. Beräkna och skriv ut talens summa, skillnad, produkt och kvot. Provkör programmet med flera olika tal. Tal 2 får inte vara 0 eftersom division med noll inte är möjlig.

Exempel på körning

Ange tal 1: 20
Ange tal 2: 4
Summa: 24
Skillnad: 16
Produkt: 80
Kvot: 5

Lösningsförslag

Console.Write("Ange tal 1: ");
int tal1 = Convert.ToInt32(Console.ReadLine());

Console.Write("Ange tal 2: ");
int tal2 = Convert.ToInt32(Console.ReadLine());

int summa = tal1 + tal2;
int skillnad = tal1 - tal2;
int produkt = tal1 * tal2;
int kvot = tal1 / tal2;

Console.WriteLine($"Summa: {summa}");
Console.WriteLine($"Skillnad: {skillnad}");
Console.WriteLine($"Produkt: {produkt}");
Console.WriteLine($"Kvot: {kvot}");

2.3.2 Heltalsdivision och decimaldivision

Datatyperna i beräkningen bestämmer vilken typ resultatet får. När både täljaren och nämnaren är int används heltalsdivision.

int antalGodisbitar = 17;
int antalPersoner = 5;
int bitarPerPerson = antalGodisbitar / antalPersoner;

Console.WriteLine(bitarPerPerson);

Utskrift

3

Om minst ett av värdena är double kan resultatet innehålla decimaler.

double antalGodisbitar = 17;
int antalPersoner = 5;
double bitarPerPerson = antalGodisbitar / antalPersoner;

Console.WriteLine(bitarPerPerson);

Utskrift

3,4

Välj resultat efter problemet

Tre hela godisbitar per person kan vara ett rimligt svar om bitarna inte ska delas. Ett medelvärde eller ett pris per person behöver däremot ofta decimaler. Frågan avgör vilken datatyp som passar.

2.3.3 Restoperatorn %

Operatorn % ger resten efter en division. Den kallas ofta restoperatorn eller modulo.

int antalGodisbitar = 17;
int antalPersoner = 5;

int bitarPerPerson = antalGodisbitar / antalPersoner;
int bitarKvar = antalGodisbitar % antalPersoner;

Console.WriteLine($"Varje person får {bitarPerPerson} bitar.");
Console.WriteLine($"Det blir {bitarKvar} bitar kvar.");

Utskrift

Varje person får 3 bitar.
Det blir 2 bitar kvar.

Kombinationen heltalsdivision och rest är användbar när ett värde ska delas upp i större och mindre enheter.

int totalMinuter = 143;

int timmar = totalMinuter / 60;
int minuter = totalMinuter % 60;

Console.WriteLine($"{timmar} timmar och {minuter} minuter");

Utskrift

2 timmar och 23 minuter

Övning 2.3b – omvandla minuter

Läs in ett antal minuter. Beräkna hur många hela timmar och återstående minuter värdet motsvarar.

Exempel på körning

Ange antal minuter: 185
185 minuter är 3 timmar och 5 minuter.

Lösningsförslag

Console.Write("Ange antal minuter: ");
int totalMinuter = Convert.ToInt32(Console.ReadLine());

int timmar = totalMinuter / 60;
int minuter = totalMinuter % 60;

Console.WriteLine($"{totalMinuter} minuter är {timmar} timmar och {minuter} minuter.");

2.3.4 Prioriteringsregler och parenteser

C# följer vanliga matematiska prioriteringsregler. Multiplikation, division och rest utförs före addition och subtraktion.

int resultat = 10 + 4 * 2;
Console.WriteLine(resultat);

Utskrift

18

Parenteser används när en annan del av beräkningen ska utföras först.

int resultat = (10 + 4) * 2;
Console.WriteLine(resultat);

Utskrift

28

Använd parenteser för tydlighet

Även när parenteserna inte behövs kan de göra avsikten tydligare. Koden totalpris = grundavgift + (antal * styckpris) är lätt att läsa och visar hur beräkningen är uppbyggd.

Övning 2.3c – förutsäg resultatet

Försök räkna ut resultatet innan du kör koden.

Console.WriteLine(5 + 3 * 2);
Console.WriteLine((5 + 3) * 2);
Console.WriteLine(20 / 4 + 1);
Console.WriteLine(20 / (4 + 1));
Console.WriteLine(17 / 5);
Console.WriteLine(17 % 5);

Svar

11
16
6
4
3
2

2.3.5 Ändra ett värde med en beräkning

När en variabel ska få ett nytt värde utifrån sitt gamla värde kan vi först skriva hela beräkningen.

int saldo = 1000;

saldo = saldo + 500;
saldo = saldo - 200;

Console.WriteLine(saldo);

Samma kod kan skrivas kortare med förkortade tilldelningsoperatorer.

int saldo = 1000;

saldo += 500;
saldo -= 200;

Console.WriteLine(saldo);

Utskrift

1300
  • värde += 5 betyder värde = värde + 5
  • värde -= 5 betyder värde = värde - 5
  • värde *= 5 betyder värde = värde * 5
  • värde /= 5 betyder värde = värde / 5

Uppgift: m02u03 – klasskassan

Skapa ett program som håller reda på pengar i en klasskassa. Programmet ska ta emot insättningar och utgifter och därefter undersöka hur många saker klassen har råd att köpa.

Del 1 – läs in värden

Programmet ska fråga efter:

  • kassans startsaldo i hela kronor
  • en ny insättning
  • en utgift som ska betalas
  • priset för en sak som klassen vill köpa, större än 0

Del 2 – uppdatera saldot

  • Lägg till insättningen med +=.
  • Dra bort utgiften med -=.

Del 3 – använd division och rest

  • Beräkna hur många hela saker klassen kan köpa.
  • Beräkna hur många kronor som blir kvar efter inköpet.

Del 4 – presentera resultatet

Skriv ut det uppdaterade saldot, antal saker som kan köpas och hur mycket pengar som blir kvar.

Exempel på körning

Startsaldo: 1250
Ny insättning: 600
Utgift: 350
Pris per sak: 120

KLASSKASSAN
Saldo: 1500 kr
Ni kan köpa 12 saker.
Efter köpet blir 60 kr kvar.

Extra utmaning

Lägg till ytterligare en insättning och en utgift. Uppdatera samma saldovariabel och kontrollera att programmets övriga beräkningar fortfarande fungerar.

Lösningsförslag

Console.Write("Startsaldo: ");
int saldo = Convert.ToInt32(Console.ReadLine());

Console.Write("Ny insättning: ");
int insättning = Convert.ToInt32(Console.ReadLine());

Console.Write("Utgift: ");
int utgift = Convert.ToInt32(Console.ReadLine());

Console.Write("Pris per sak: ");
int prisPerSak = Convert.ToInt32(Console.ReadLine());

saldo += insättning;
saldo -= utgift;

int antalSaker = saldo / prisPerSak;
int pengarKvar = saldo % prisPerSak;

Console.WriteLine("\nKLASSKASSAN");
Console.WriteLine($"Saldo: {saldo} kr");
Console.WriteLine($"Ni kan köpa {antalSaker} saker.");
Console.WriteLine($"Efter köpet blir {pengarKvar} kr kvar.");

2.3.6 Sammanfattning

Lägg till följande punkter sist i checklistan. Efter detta avsnitt ska du kunna:

  • Utföra beräkningar med flera operatorer och datatyper.
  • Använda operatorerna +, -, * och /.
  • Förstå skillnaden mellan heltalsdivision och division som ger ett decimaltal.
  • Använda % för att beräkna resten efter en division.
  • Använda parenteser för att styra och förtydliga en beräkning.
  • Uppdatera en variabel med +=, -=, *= och /=.
  • Dela upp en större beräkning i tydligt namngivna variabler och kontrollera resultatet.

Nästa avsnitt

I nästa avsnitt arbetar vi med formaterad utskrift och felsökning. Vi kombinerar sedan kunskaperna från momentet i lite större program.

2.4 Formaterad utskrift, testning och felsökning

Presentation

Formaterad utskrift, testning och felsökningVilken utskrift är tydligast?Två decimaler med F2Formatering ändrar bara utskriftenTre typer av felSyntaxfel: läs felmeddelandetFel under körningLogiskt fel: programmet körsEn enkel arbetsgång för felsökningHuvuduppgift: kassakvittotChecklista efter avsnitt 2.4

Ett program är inte färdigt bara för att det går att köra. Resultatet behöver vara tydligt för användaren och programmeraren behöver kontrollera att programmet räknar rätt för flera olika inmatningar.

I det här avsnittet formaterar vi tal, undersöker olika typer av fel och arbetar systematiskt med testning och felsökning.

Lektionens mål

Efter avsnittet ska du kunna presentera tal på ett tydligt sätt, använda felmeddelanden som hjälp och kontrollera att programmets resultat är rimligt.

2.4.1 Formatera decimaltal

Priser och andra decimaltal kan få många decimaler. Med formatet F2 skriver vi ut ett tal med exakt två decimaler.

double totalpris = 217.5;

Console.WriteLine($"Totalpris: {totalpris} kr");
Console.WriteLine($"Totalpris: {totalpris:F2} kr");

Utskrift

Totalpris: 217,5 kr
Totalpris: 217,50 kr
  • F0 visar inga decimaler.
  • F1 visar en decimal.
  • F2 visar två decimaler.

Formateringen ändrar bara utskriften

Variabelns värde ändras inte när vi använder F2. Formateringen bestämmer bara hur värdet ska visas i just den utskriften.

Övning 2.4a – pris per person

Läs in ett totalpris och antal personer. Beräkna priset per person och skriv ut resultatet med två decimaler.

Exempel på körning

Ange totalpris: 500
Ange antal personer: 3
Pris per person: 166,67 kr

Lösningsförslag

Console.Write("Ange totalpris: ");
double totalpris = Convert.ToDouble(Console.ReadLine());

Console.Write("Ange antal personer: ");
int antalPersoner = Convert.ToInt32(Console.ReadLine());

double prisPerPerson = totalpris / antalPersoner;

Console.WriteLine($"Pris per person: {prisPerPerson:F2} kr");

2.4.2 Tre vanliga typer av fel

Fel i ett program kan visa sig på olika sätt. Det är lättare att felsöka när vi först funderar på vilken sorts fel vi letar efter.

Syntaxfel och kompileringsfel

Koden följer inte språkets regler och programmet kan inte starta. Visual Studio markerar ofta raden och visar ett felmeddelande.

Console.WriteLine("Hej")

Semikolonet saknas i slutet av raden.

Fel som uppstår när programmet körs

Programmet kan starta men avbryts när något oväntat händer. Ett exempel är att användaren skriver text när programmet försöker omvandla svaret till ett tal.

int ålder = Convert.ToInt32("sexton");

Logiska fel

Programmet körs utan felmeddelande men resultatet blir fel. Då behöver programmeraren kontrollera beräkningen och jämföra resultatet med det förväntade svaret.

double pris = 25;
int antal = 4;

// Fel operator: resultatet blir 29 istället för 100
double totalpris = pris + antal;

Inget felmeddelande betyder inte alltid att programmet är rätt

Logiska fel upptäcks genom att vi testar programmet och räknar ut det förväntade resultatet på egen hand.

2.4.3 Läs felmeddelandet

Felmeddelanden är hjälp från utvecklingsmiljön. De innehåller ofta information om vilken typ av fel som har inträffat och på vilken rad problemet upptäcktes.

En enkel arbetsgång

  1. Läs den första tydliga delen av felmeddelandet.
  2. Gå till raden som Visual Studio markerar.
  3. Kontrollera även raden precis före den markerade raden.
  4. Ändra en sak i taget.
  5. Kör programmet igen och kontrollera resultatet.

Ett saknat citationstecken, en parentes eller ett semikolon kan göra att nästa rad markeras, även om den egentliga orsaken finns på raden före.

2.4.4 Följ värden med tillfälliga utskrifter

Om programmet körs men räknar fel kan vi lägga in tillfälliga utskrifter. Då ser vi vilka värden variablerna innehåller under körningen.

double pris = 25;
int antal = 4;
double totalpris = pris * antal;

Console.WriteLine($"TEST pris: {pris}");
Console.WriteLine($"TEST antal: {antal}");
Console.WriteLine($"TEST totalpris: {totalpris}");

Ta bort eller kommentera bort testutskrifterna

När felet är hittat ska de tillfälliga utskrifterna tas bort eller kommenteras bort så att användaren bara ser programmets riktiga resultat.

Övning 2.4b – felsökningsverkstad

Följande program ska läsa in ett pris och ett antal och sedan skriva ut totalpriset. Koden innehåller två kompileringsfel och ett logiskt fel. Hitta och rätta alla tre.

Console.Write("Pris per vara: ")
double pris = Convert.ToDouble(Console.ReadLine());

Console.Write("Antal: ");
int antal = Convert.ToInt32(Console.ReadLine());

double totalpris = pris + antal;

Console.Writeline($"Totalpris: {totalpris:F2} kr");

Felen och den rättade koden

  • Semikolon saknas efter den första Console.Write()-raden.
  • Totalpriset ska beräknas med multiplikation, inte addition.
  • Console.WriteLine() ska ha stor bokstav i Line.
Console.Write("Pris per vara: ");
double pris = Convert.ToDouble(Console.ReadLine());

Console.Write("Antal: ");
int antal = Convert.ToInt32(Console.ReadLine());

double totalpris = pris * antal;

Console.WriteLine($"Totalpris: {totalpris:F2} kr");

2.4.5 Testa med flera värden

Ett enda lyckat test räcker inte för att veta att programmet fungerar. Testa med flera värden och jämför programmets utskrift med ett resultat som du har räknat ut i förväg.

Ett program som beräknar pris gånger antal kan till exempel testas med:

  • ett vanligt fall: 39,90 * 3 = 119,70
  • antalet ett: 49,50 * 1 = 49,50
  • ett helt pris: 25 * 4 = 100

Förväntat och faktiskt resultat

Skriv gärna ner vilket resultat du förväntar dig innan programmet körs. Om det faktiska resultatet skiljer sig från det förväntade vet du att något behöver undersökas.

Övning 2.4c – testa klasskassan

Öppna uppgiften klasskassan från avsnitt 2.3. Skapa minst tre egna testfall. Skriv ner inmatningarna och beräkna det förväntade resultatet innan du kör programmet.

Testa bland annat:

  • ett fall där pengarna räcker exakt och resten blir 0
  • ett fall där pengar blir kvar
  • ett fall med ett annat startsaldo och flera förändringar

Uppgift: m02u04 – kassakvittot

Skapa ett program som läser in information om ett köp, beräknar totalpriset och skriver ut ett tydligt kvitto. Alla priser ska visas med två decimaler.

Del 1 – läs in värden

Programmet ska fråga efter:

  • varans namn
  • pris per vara
  • antal varor
  • beloppet som kunden betalar

Del 2 – beräkna

  • Beräkna totalpriset.
  • Beräkna hur mycket pengar kunden ska få tillbaka.

Del 3 – skriv ut kvittot

Kvittot ska innehålla varans namn, antal, styckpris, totalpris, betalat belopp och pengar tillbaka. Använd F2 för alla priser.

Exempel på körning

Varans namn: Anteckningsbok
Pris per vara: 39,90
Antal varor: 3
Betalat belopp: 200

KVITTO
Anteckningsbok
3 st x 39,90 kr
Totalpris: 119,70 kr
Betalat: 200,00 kr
Tillbaka: 80,30 kr

Del 4 – testa

Provkör programmet med minst tre olika testfall. Räkna ut det förväntade totalpriset och pengarna tillbaka innan varje körning.

Avgränsning

I den här versionen utgår vi från att kunden betalar tillräckligt mycket. Senare kan vi använda villkor för att kontrollera om beloppet räcker.

Extra utmaning

Lägg till ytterligare en vara med eget namn, pris och antal. Beräkna det gemensamma totalpriset och visa båda varorna på kvittot.

Lösningsförslag

Console.Write("Varans namn: ");
string varansNamn = Console.ReadLine();

Console.Write("Pris per vara: ");
double prisPerVara = Convert.ToDouble(Console.ReadLine());

Console.Write("Antal varor: ");
int antalVaror = Convert.ToInt32(Console.ReadLine());

Console.Write("Betalat belopp: ");
double betalat = Convert.ToDouble(Console.ReadLine());

double totalpris = prisPerVara * antalVaror;
double tillbaka = betalat - totalpris;

Console.WriteLine("\nKVITTO");
Console.WriteLine(varansNamn);
Console.WriteLine($"{antalVaror} st x {prisPerVara:F2} kr");
Console.WriteLine($"Totalpris: {totalpris:F2} kr");
Console.WriteLine($"Betalat: {betalat:F2} kr");
Console.WriteLine($"Tillbaka: {tillbaka:F2} kr");

2.4.6 Sammanfattning

Lägg till följande punkter sist i checklistan. Efter detta avsnitt ska du kunna:

  • Presentera, testa och felsöka programmets resultat.
  • Formatera decimaltal med exempelvis F2 i en interpolerad sträng.
  • Förstå att formatering ändrar utskriften men inte variabelns värde.
  • Känna igen syntaxfel, fel under körning och logiska fel.
  • Läsa felmeddelanden och undersöka den markerade raden och raden före.
  • Använda tillfälliga utskrifter för att kontrollera variablernas värden.
  • Testa ett program med flera inmatningar och jämföra förväntat och faktiskt resultat.
  • Rätta kod som inte fungerar eller ger fel resultat.

Inför diagnoserna

Nästa steg är att repetera momentets checklista, genomföra quizet och förbereda den praktiska diagnosen. Använd övningarna för att träna extra på de punkter där du är osäker.

Checklista efter momentet

Använd checklistan för att kontrollera dina kunskaper inför diagnoserna. Markera varje punkt med det alternativ som passar bäst:

  • ✅ Kan – jag känner mig trygg med detta.
  • ❓ Osäker – jag behöver repetera lite.
  • 🔴 Träna – detta behöver jag öva mer på.

Checklista inför diagnos

2.1 Skriva program som lagrar och skriver ut information.
Använda Console.Write() och Console.WriteLine() för att skriva ut text och värden.
Använda \n för att skapa en radbrytning i en text.
Använda // och /* ... */ för kommentarer och för att tillfälligt kommentera bort kod.
Skapa variabler med tydliga namn och lämpliga datatyper.
Använda datatyperna string, int, double och bool.
Ändra värdet i en variabel utan att skapa variabeln på nytt.
Använda stränginterpolering för att blanda text och variabelvärden i en utskrift.
Använda variabler i enkla beräkningar och lagra resultatet i en ny variabel.
2.2 Läsa in och omvandla information från användaren.
Använda Console.ReadLine() för att läsa in text.
Skriva en tydlig fråga innan användaren matar in ett värde.
Förstå att värdet från Console.ReadLine() behandlas som text.
Omvandla inmatad text till heltal och decimaltal med Convert.ToInt32() och Convert.ToDouble().
Använda inmatade värden i beräkningar och tydliga utskrifter.
Känna igen att felaktig inmatning kan få programmet att avbrytas.
2.3 Utföra beräkningar med flera operatorer och datatyper.
Använda operatorerna +, -, * och /.
Förstå skillnaden mellan heltalsdivision och division som ger ett decimaltal.
Använda % för att beräkna resten efter en division.
Använda parenteser för att styra och förtydliga en beräkning.
Uppdatera en variabel med +=, -=, *= och /=.
Dela upp en större beräkning i tydligt namngivna variabler och kontrollera resultatet.
2.4 Presentera, testa och felsöka programmets resultat.
Formatera decimaltal med exempelvis F2 i en interpolerad sträng.
Förstå att formatering ändrar utskriften men inte variabelns värde.
Känna igen syntaxfel, fel under körning och logiska fel.
Läsa felmeddelanden och undersöka den markerade raden och raden före.
Använda tillfälliga utskrifter för att kontrollera variablernas värden.
Testa ett program med flera inmatningar och jämföra förväntat och faktiskt resultat.
Rätta kod som inte fungerar eller ger fel resultat.