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);

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; – deklaration
  • int poäng = 10; – deklaration och initiering
  • poä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 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: 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:

  1. resans längd i mil
  2. hur många liter bränsle som behövs
  3. resans sammanlagda bränslekostnad
  4. 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() 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

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

  1. Markera de kodrader som du vill kommentera bort.
  2. Tryck först Ctrl + K.
  3. 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

  1. Markera de kommenterade kodraderna.
  2. Tryck först Ctrl + K.
  3. 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 += 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: 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:

  1. Lägg till poängen från omgång 1 med +=.
  2. Lägg till poängen från omgång 2 med +=.
  3. Dra bort poängavdraget med -=.
  4. 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

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: 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:

  • F1 för den sammanlagda tiden i minuter
  • F2 för genomsnittet per pass
  • F2 fö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 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.

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:

  1. lägga till turneringens inkomster med +=
  2. dra bort kostnaden för lokalen med -=
  3. 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.