- 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);
Deklarera, initiera och tilldela
När vi arbetar med variabler används tre begrepp som beskriver vad som händer: deklarera, initiera och tilldela.
Deklarera en variabel
Att deklarera en variabel betyder att vi bestämmer dess datatyp och namn.
int poäng;
Variabeln heter poäng och kan lagra heltal. Den har ännu inte
fått något värde som kan användas i programmet.
Deklarera och initiera
Att initiera en variabel betyder att den får sitt första värde när den deklareras.
int poäng = 10;
På den här raden deklareras variabeln poäng och initieras med
värdet 10. Det är vanligt att göra båda sakerna på samma rad.
Tilldela ett nytt värde
Att tilldela betyder att en befintlig variabel får ett värde. Variabeln kan exempelvis få ett nytt värde senare i programmet.
poäng = 15;
Datatypen skrivs inte igen eftersom variabeln redan är deklarerad.
Det gamla värdet 10 ersätts med det nya värdet
15.
Vad betyder tecknet =?
I programmering betyder = inte samma sak som ett matematiskt
likhetstecken. Det betyder att värdet på höger sida ska lagras i variabeln
på vänster sida.
poäng = 15;
Raden kan läsas som: ”Tilldela värdet 15 till variabeln poäng.”
int poäng;– deklarationint poäng = 10;– deklaration och initieringpoäng = 15;– tilldelning av ett nytt värde
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}");
Uppgift: m02u02 – spelrundan
Skapa ett nytt program som visar hur en spelares värden förändras under en
spelrunda. Börja med en tom Program.cs och skriv programmet från
grunden. Användaren ska inte mata in några värden i den här uppgiften.
Del 1 – skapa variabler
Skapa variabler som lagrar:
- spelarens namn
- spelarens nivå
- antal poäng
- antal liv
- speltid i minuter
- om spelrundan är avslutad eller inte
Välj en lämplig datatyp för varje variabel och ge variablerna egna startvärden.
Del 2 – skriv ut startvärdena
Skriv ut en tydlig spelarprofil som visar alla variablernas värden före spelrundan.
Del 3 – ändra värdena
Under spelrundan händer följande:
- spelaren får 350 nya poäng
- spelaren förlorar ett liv
- speltiden ökar med 12,5 minuter
- spelaren går upp en nivå
- spelrundan avslutas
Ändra de befintliga variablerna. Använd den långa formen när ett tal ska förändras:
poäng = poäng + 350;
Del 4 – skriv ut de nya värdena
Skriv ut spelarprofilen igen så att det går att jämföra värdena före och efter spelrundan.
Exempel på utskrift
FÖRE SPELRUNDAN Spelare: Nova Nivå: 4 Poäng: 1250 Liv: 3 Speltid: 18,5 minuter Rundan avslutad: False EFTER SPELRUNDAN Spelare: Nova Nivå: 5 Poäng: 1600 Liv: 2 Speltid: 31 minuter Rundan avslutad: True
Kontrollera programmet
Ändra startvärdena och kör programmet igen. Kontrollera att de nya värdena fortfarande beräknas utifrån startvärdena.
Lösningsförslag
string spelare = "Nova";
int nivå = 4;
int poäng = 1250;
int liv = 3;
double speltid = 18.5;
bool rundaAvslutad = false;
Console.WriteLine("FÖRE SPELRUNDAN");
Console.WriteLine($"Spelare: {spelare}");
Console.WriteLine($"Nivå: {nivå}");
Console.WriteLine($"Poäng: {poäng}");
Console.WriteLine($"Liv: {liv}");
Console.WriteLine($"Speltid: {speltid} minuter");
Console.WriteLine($"Rundan avslutad: {rundaAvslutad}");
poäng = poäng + 350;
liv = liv - 1;
speltid = speltid + 12.5;
nivå = nivå + 1;
rundaAvslutad = true;
Console.WriteLine("\nEFTER SPELRUNDAN");
Console.WriteLine($"Spelare: {spelare}");
Console.WriteLine($"Nivå: {nivå}");
Console.WriteLine($"Poäng: {poäng}");
Console.WriteLine($"Liv: {liv}");
Console.WriteLine($"Speltid: {speltid} minuter");
Console.WriteLine($"Rundan avslutad: {rundaAvslutad}");
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: m02u03 – 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");
Uppgift: m02u04 – bilresan
Skapa ett nytt program som beräknar bränslekostnaden för en bilresa.
Börja med en tom Program.cs och skriv programmet från grunden.
Del 1 – läs in uppgifter
Programmet ska fråga efter:
- förarens namn
- resans destination
- resans längd i kilometer
- bilens förbrukning i liter per mil
- bränslepriset per liter
- antal personer som delar på kostnaden
Omvandla inmatningarna till int eller double där
det behövs.
Del 2 – genomför beräkningarna
Programmet ska beräkna:
- resans längd i mil
- hur många liter bränsle som behövs
- resans sammanlagda bränslekostnad
- kostnaden per person
Antal mil = antal kilometer / 10 Bränsleåtgång = antal mil * förbrukning Totalkostnad = bränsleåtgång * literpris Kostnad per person = totalkostnad / antal personer
Del 3 – presentera resultatet
Skriv ut förarens namn, destination, resans längd, bränsleåtgång, totalkostnad och kostnad per person.
Exempel på körning
Förarens namn: Sam Destination: Varberg Resans längd i kilometer: 200 Förbrukning i liter per mil: 0,6 Pris per liter: 20 Antal personer: 4 BILRESAN Förare: Sam Destination: Varberg Resans längd: 200 kilometer Bränsleåtgång: 12 liter Bränslekostnad: 240 kr Kostnad per person: 60 kr
Avgränsning
Programmet får utgå från att användaren skriver in korrekta tal och att
antalet personer är större än 0.
Lösningsförslag
Console.Write("Förarens namn: ");
string förare = Console.ReadLine();
Console.Write("Destination: ");
string destination = Console.ReadLine();
Console.Write("Resans längd i kilometer: ");
double kilometer = Convert.ToDouble(Console.ReadLine());
Console.Write("Förbrukning i liter per mil: ");
double förbrukning = Convert.ToDouble(Console.ReadLine());
Console.Write("Pris per liter: ");
double literpris = Convert.ToDouble(Console.ReadLine());
Console.Write("Antal personer: ");
int antalPersoner = Convert.ToInt32(Console.ReadLine());
double mil = kilometer / 10;
double bränsleåtgång = mil * förbrukning;
double totalkostnad = bränsleåtgång * literpris;
double kostnadPerPerson = totalkostnad / antalPersoner;
Console.WriteLine("
BILRESAN");
Console.WriteLine($"Förare: {förare}");
Console.WriteLine($"Destination: {destination}");
Console.WriteLine($"Resans längd: {kilometer} kilometer");
Console.WriteLine($"Bränsleåtgång: {bränsleåtgång} liter");
Console.WriteLine($"Bränslekostnad: {totalkostnad} kr");
Console.WriteLine($"Kostnad per person: {kostnadPerPerson} 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










Kommentera bort flera kodrader i Visual Studio
Ibland vill du tillfälligt stänga av en hel uppgift eller flera kodrader utan
att radera dem. Då kan du markera koden och låta Visual Studio placera
// framför varje rad.
Kommentera bort markerad kod
- Markera de kodrader som du vill kommentera bort.
- Tryck först
Ctrl + K. - Tryck därefter
Ctrl + C.
Kortkommandot skrivs ofta Ctrl + K, Ctrl + C. Det är alltså två
tangentkombinationer som trycks efter varandra – inte alla tangenter samtidigt.
Före:
Console.WriteLine("START");
int poäng = 100;
poäng = poäng + 50;
Console.WriteLine(poäng);
Efter Ctrl + K, Ctrl + C:
// Console.WriteLine("START");
// int poäng = 100;
// poäng = poäng + 50;
// Console.WriteLine(poäng);
Kodrader som börjar med // är kommentarer. De finns kvar i
källkoden, men programmet kör dem inte.
Aktivera koden igen
- Markera de kommenterade kodraderna.
- Tryck först
Ctrl + K. - Tryck därefter
Ctrl + U.
Visual Studio tar då bort // från de markerade raderna och koden
kan köras igen.
Kortkommandon
-
Ctrl + K, Ctrl + C– kommentera bort markerade kodrader. -
Ctrl + K, Ctrl + U– ta bort kommentarer från markerade kodrader.
Prova själv: Markera ett helt kodblock, kommentera bort det och kör programmet. Aktivera sedan koden igen och kontrollera att den körs som tidigare.
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: m02u05 – 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.");
Uppgift: m02u06 – poängjakten
Skapa ett nytt program som räknar ut en spelares resultat efter en
spelomgång. Börja med en tom Program.cs och skriv programmet
från grunden.
Del 1 – läs in värden
Programmet ska fråga efter:
- spelarens startpoäng
- poäng från omgång 1
- poäng från omgång 2
- ett poängavdrag
- en bonusfaktor
- hur många poäng en uppgradering kostar
Alla värden ska vara heltal. Priset för en uppgradering ska vara större
än 0.
Del 2 – uppdatera poängen
Uppdatera samma poängvariabel i följande ordning:
- Lägg till poängen från omgång 1 med
+=. - Lägg till poängen från omgång 2 med
+=. - Dra bort poängavdraget med
-=. - Multiplicera resultatet med bonusfaktorn med
*=.
Del 3 – köp uppgraderingar
Beräkna:
- hur många hela uppgraderingar spelaren kan köpa
- hur många poäng som blir kvar efter köpen
Använd heltalsdivision för att beräkna antalet uppgraderingar och
restoperatorn % för att beräkna återstående poäng.
Exempel på körning
Startpoäng: 100 Poäng från omgång 1: 150 Poäng från omgång 2: 100 Poängavdrag: 25 Bonusfaktor: 2 Pris per uppgradering: 120 POÄNGJAKTEN Slutpoäng: 650 Du kan köpa 5 uppgraderingar. Efter köpen återstår 50 poäng.
Kontrollera ordningen
Bonusen ska beräknas efter att poängen från omgångarna har lagts till och poängavdraget har dragits bort.
Lösningsförslag
Console.Write("Startpoäng: ");
int poäng = Convert.ToInt32(Console.ReadLine());
Console.Write("Poäng från omgång 1: ");
int omgång1 = Convert.ToInt32(Console.ReadLine());
Console.Write("Poäng från omgång 2: ");
int omgång2 = Convert.ToInt32(Console.ReadLine());
Console.Write("Poängavdrag: ");
int poängavdrag = Convert.ToInt32(Console.ReadLine());
Console.Write("Bonusfaktor: ");
int bonusfaktor = Convert.ToInt32(Console.ReadLine());
Console.Write("Pris per uppgradering: ");
int prisPerUppgradering = Convert.ToInt32(Console.ReadLine());
poäng += omgång1;
poäng += omgång2;
poäng -= poängavdrag;
poäng *= bonusfaktor;
int antalUppgraderingar = poäng / prisPerUppgradering;
int poängKvar = poäng % prisPerUppgradering;
Console.WriteLine("
POÄNGJAKTEN");
Console.WriteLine($"Slutpoäng: {poäng}");
Console.WriteLine($"Du kan köpa {antalUppgraderingar} uppgraderingar.");
Console.WriteLine($"Efter köpen återstår {poängKvar} poäng.");
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: m02u07 – 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");
Uppgift: m02u08 – veckans träning
Skapa ett nytt program som sammanställer en persons träning under tre
dagar. Börja med en tom Program.cs och skriv programmet från
grunden.
Del 1 – läs in träningstider
Programmet ska fråga efter:
- personens namn
- antal träningsminuter under dag 1
- antal träningsminuter under dag 2
- antal träningsminuter under dag 3
Träningstiderna ska lagras som double så att det går att
skriva in tider med decimaler.
Del 2 – genomför beräkningarna
Programmet ska beräkna:
- den sammanlagda träningstiden i minuter
- den genomsnittliga träningstiden per pass
- den sammanlagda träningstiden i timmar
Genomsnittet beräknas genom att den sammanlagda tiden divideras med antalet träningspass.
Del 3 – skriv ut träningsrapporten
Använd följande formatering:
F1för den sammanlagda tiden i minuterF2för genomsnittet per passF2för träningstiden i timmar
Exempel på körning
Namn: Alex Träningsminuter dag 1: 45,5 Träningsminuter dag 2: 60 Träningsminuter dag 3: 52 TRÄNINGSRAPPORT Namn: Alex Total träningstid: 157,5 minuter Genomsnitt per pass: 52,50 minuter Träningstid i timmar: 2,63
Del 4 – testa programmet
Skapa minst tre testfall och skriv ner det förväntade resultatet innan programmet körs. Testa:
- tre lika långa träningspass
- ett eller flera träningspass med decimaler
- tre andra värden som du själv väljer
Jämför programmets utskrift med det resultat du räknade ut i förväg.
Om resultatet blir fel
Lägg till tillfälliga utskrifter som visar de tre inmatade tiderna och totalsumman. Använd utskrifterna för att undersöka var felet uppstår. Ta sedan bort eller kommentera bort testutskrifterna.
Lösningsförslag
Console.Write("Namn: ");
string namn = Console.ReadLine();
Console.Write("Träningsminuter dag 1: ");
double dag1 = Convert.ToDouble(Console.ReadLine());
Console.Write("Träningsminuter dag 2: ");
double dag2 = Convert.ToDouble(Console.ReadLine());
Console.Write("Träningsminuter dag 3: ");
double dag3 = Convert.ToDouble(Console.ReadLine());
double totalTid = dag1 + dag2 + dag3;
double genomsnitt = totalTid / 3;
double timmar = totalTid / 60;
Console.WriteLine("
TRÄNINGSRAPPORT");
Console.WriteLine($"Namn: {namn}");
Console.WriteLine($"Total träningstid: {totalTid:F1} minuter");
Console.WriteLine($"Genomsnitt per pass: {genomsnitt:F2} minuter");
Console.WriteLine($"Träningstid i timmar: {timmar:F2}");
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.
Extra kodträning
För dig som är klar med momentets övriga uppgifter
Uppgifterna i det här avsnittet är extra kodträning för dig som har gjort momentets ordinarie uppgifter och kontrollerat att de fungerar.
Extrauppgifterna introducerar inget nytt. Du ska i stället träna på att kombinera sådant som redan har behandlats:
- variabler och datatyper
- inmatning och typomvandling
- matematiska beräkningar
- förkortade tilldelningar
- stränginterpolering och formaterad utskrift
- testning och felsökning
Välj en eller flera uppgifter. Börja varje uppgift med en tom
Program.cs och skriv programmet från grunden. Kopiera inte
kod från en tidigare uppgift.
Det viktigaste är inte att bli klar snabbt. Använd uppgifterna för att skriva mer kod, göra egna försök, upptäcka fel och rätta dem.
Extrauppgift: m02x01 – mobilabonnemanget
Skapa ett program som beräknar kostnaden för ett mobilabonnemang under ett antal månader.
Del 1 – läs in uppgifter
Programmet ska fråga efter:
- kundens namn
- abonnemangets fasta månadskostnad
- antal extra datapaket som köps varje månad
- priset för ett extra datapaket
- hur många månader som ska beräknas
Använd lämpliga datatyper och omvandla inmatningarna innan de används i beräkningarna.
Del 2 – beräkna kostnaderna
Programmet ska beräkna:
- kostnaden för de extra datapaketen under en månad
- den sammanlagda kostnaden per månad
- den sammanlagda kostnaden för hela perioden
Del 3 – skriv ut en sammanställning
Skriv ut kundens namn, den fasta kostnaden, kostnaden för extra data, den sammanlagda månadskostnaden och kostnaden för hela perioden. Alla kostnader ska visas med två decimaler.
Exempel på körning
Kundens namn: Mira Fast månadskostnad: 249 Antal extra datapaket per månad: 2 Pris per datapaket: 39,50 Antal månader: 6 MOBILABONNEMANGET Kund: Mira Fast kostnad: 249,00 kr Extra data per månad: 79,00 kr Kostnad per månad: 328,00 kr Kostnad för 6 månader: 1968,00 kr
Del 4 – testa programmet
Testa programmet med minst två olika uppsättningar värden. Ett av testen
ska använda 0 extra datapaket.
Lösningsförslag
Console.Write("Kundens namn: ");
string kund = Console.ReadLine();
Console.Write("Fast månadskostnad: ");
double fastKostnad = Convert.ToDouble(Console.ReadLine());
Console.Write("Antal extra datapaket per månad: ");
int antalDatapaket = Convert.ToInt32(Console.ReadLine());
Console.Write("Pris per datapaket: ");
double prisPerDatapaket = Convert.ToDouble(Console.ReadLine());
Console.Write("Antal månader: ");
int antalMånader = Convert.ToInt32(Console.ReadLine());
double extraKostnad = antalDatapaket * prisPerDatapaket;
double månadskostnad = fastKostnad + extraKostnad;
double kostnadFörPerioden = månadskostnad * antalMånader;
Console.WriteLine("
MOBILABONNEMANGET");
Console.WriteLine($"Kund: {kund}");
Console.WriteLine($"Fast kostnad: {fastKostnad:F2} kr");
Console.WriteLine($"Extra data per månad: {extraKostnad:F2} kr");
Console.WriteLine($"Kostnad per månad: {månadskostnad:F2} kr");
Console.WriteLine($"Kostnad för {antalMånader} månader: {kostnadFörPerioden:F2} kr");
Extrauppgift: m02x02 – spelturneringen
Skapa ett program som beräknar ekonomin för en spelturnering.
Del 1 – läs in uppgifter
Programmet ska fråga efter:
- turneringens namn
- antal deltagande lag
- antal spelare i varje lag
- anmälningsavgift per spelare
- kostnaden för lokalen
- kostnaden för priser
Del 2 – beräkna deltagare och inkomster
Beräkna:
- det sammanlagda antalet spelare
- turneringens sammanlagda inkomster
Del 3 – beräkna turneringens resultat
Skapa en variabel för turneringens ekonomiska resultat. Uppdatera samma variabel genom att:
- lägga till turneringens inkomster med
+= - dra bort kostnaden för lokalen med
-= - dra bort kostnaden för priserna med
-=
Resultatet kan bli positivt eller negativt. Du behöver inte använda ett villkor för att tolka resultatet.
Exempel på körning
Turneringens namn: Höstcupen Antal lag: 8 Spelare per lag: 4 Anmälningsavgift per spelare: 75 Kostnad för lokalen: 900 Kostnad för priser: 600 SPELTURNERINGEN Turnering: Höstcupen Antal spelare: 32 Inkomster: 2400,00 kr Kostnader: 1500,00 kr Resultat: 900,00 kr
Del 4 – testa programmet
Genomför minst två tester:
- ett test där resultatet blir positivt
- ett test där kostnaderna är större än inkomsterna
Lösningsförslag
Console.Write("Turneringens namn: ");
string turnering = Console.ReadLine();
Console.Write("Antal lag: ");
int antalLag = Convert.ToInt32(Console.ReadLine());
Console.Write("Spelare per lag: ");
int spelarePerLag = Convert.ToInt32(Console.ReadLine());
Console.Write("Anmälningsavgift per spelare: ");
double anmälningsavgift = Convert.ToDouble(Console.ReadLine());
Console.Write("Kostnad för lokalen: ");
double lokalKostnad = Convert.ToDouble(Console.ReadLine());
Console.Write("Kostnad för priser: ");
double prisKostnad = Convert.ToDouble(Console.ReadLine());
int antalSpelare = antalLag * spelarePerLag;
double inkomster = antalSpelare * anmälningsavgift;
double kostnader = lokalKostnad + prisKostnad;
double resultat = 0;
resultat += inkomster;
resultat -= lokalKostnad;
resultat -= prisKostnad;
Console.WriteLine("
SPELTURNERINGEN");
Console.WriteLine($"Turnering: {turnering}");
Console.WriteLine($"Antal spelare: {antalSpelare}");
Console.WriteLine($"Inkomster: {inkomster:F2} kr");
Console.WriteLine($"Kostnader: {kostnader:F2} kr");
Console.WriteLine($"Resultat: {resultat:F2} kr");
Extrauppgift: m02x03 – receptskalaren
Skapa ett program som räknar om mängden ingredienser när ett recept ska användas till ett annat antal portioner.
Del 1 – läs in receptet
Programmet ska fråga efter:
- receptets namn
- hur många portioner receptet ursprungligen är gjort för
- hur många portioner som ska tillagas
- mängden av ingrediens 1
- mängden av ingrediens 2
- mängden av ingrediens 3
Skriv måttenheterna i programmets frågor, exempelvis gram eller deciliter.
Portionsantalen ska lagras som double så att divisionen kan
ge ett decimaltal.
Del 2 – beräkna omräkningsfaktorn
Beräkna först en omräkningsfaktor:
Omräkningsfaktor = nya antalet portioner / ursprungliga antalet portioner
Multiplicera sedan varje ingrediensmängd med omräkningsfaktorn.
Del 3 – skriv ut det nya receptet
Skriv ut receptets namn, antal portioner och de nya ingrediensmängderna. Ingrediensmängderna ska visas med en decimal.
Exempel på körning
Receptets namn: Pastagratäng Ursprungligt antal portioner: 4 Nytt antal portioner: 6 Pasta i gram: 300 Sås i deciliter: 4 Ost i gram: 80 RECEPTSKALAREN Pastagratäng för 6 portioner Pasta: 450,0 gram Sås: 6,0 deciliter Ost: 120,0 gram
Del 4 – testa programmet
Testa programmet med:
- fler portioner än i originalreceptet
- färre portioner än i originalreceptet
- samma antal portioner som i originalreceptet
När antalet portioner är oförändrat ska ingrediensmängderna också vara oförändrade.
Avgränsning
Programmet får utgå från att det ursprungliga antalet portioner är
större än 0. Du behöver inte kontrollera inmatningen med
villkor.
Lösningsförslag
Console.Write("Receptets namn: ");
string recept = Console.ReadLine();
Console.Write("Ursprungligt antal portioner: ");
double gamlaPortioner = Convert.ToDouble(Console.ReadLine());
Console.Write("Nytt antal portioner: ");
double nyaPortioner = Convert.ToDouble(Console.ReadLine());
Console.Write("Pasta i gram: ");
double pasta = Convert.ToDouble(Console.ReadLine());
Console.Write("Sås i deciliter: ");
double sås = Convert.ToDouble(Console.ReadLine());
Console.Write("Ost i gram: ");
double ost = Convert.ToDouble(Console.ReadLine());
double omräkningsfaktor = nyaPortioner / gamlaPortioner;
double nyMängdPasta = pasta * omräkningsfaktor;
double nyMängdSås = sås * omräkningsfaktor;
double nyMängdOst = ost * omräkningsfaktor;
Console.WriteLine("
RECEPTSKALAREN");
Console.WriteLine($"{recept} för {nyaPortioner} portioner");
Console.WriteLine($"Pasta: {nyMängdPasta:F1} gram");
Console.WriteLine($"Sås: {nyMängdSås:F1} deciliter");
Console.WriteLine($"Ost: {nyMängdOst:F1} gram");
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. |