- Kursmaterial
- Planering
- Arbete
- Kunskapsdokument
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










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()ochConsole.WriteLine(). - Använd
\nfö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:
- vilken datatyp variabeln ska ha
- variabelns namn
- vilket värde som ska lagras
string namn = "Amina";
stringär datatypennamnä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 exempel42double– decimaltal, till exempel42.5bool– värdettrueellerfalse
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 radConsole.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,doubleochboollagrar 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










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:
- frågar efter användarens namn
- frågar efter användarens hemort
- 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
Console.ReadLine()läser det användaren skriver.Convert.ToInt32()omvandlar texten till ett heltal.- 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()ochConvert.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










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 += 5betydervärde = värde + 5värde -= 5betydervärde = värde - 5värde *= 5betydervärde = värde * 5värde /= 5betydervä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










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
F0visar inga decimaler.F1visar en decimal.F2visar 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
- Läs den första tydliga delen av felmeddelandet.
- Gå till raden som Visual Studio markerar.
- Kontrollera även raden precis före den markerade raden.
- Ändra en sak i taget.
- 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 iLine.
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
F2i 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. |