1. Moment01 - Introduktion

Detta moment handlar om att vi skall få en fungerande miljö som vi sedan skall använda under kursen. När vi har en fungerande miljö så skall vi slå två flugor i samma smäll och både repetera det vi gjorde i kursen programmering01 samtidigt som vi lär oss ett nytt programmeringsspråk. Som programmerare är det vanligt att ibland behöva byta programmeringsspråk och också behöva lära dig något nytt inför ett specifikt projekt. Att lära sig nya programmeringsspråk är mycket enklare än att lära sig programmera för första gången och beroende på vilka språk som är aktuella så finns det en mängd likheter eller olikheter i syntax men också likheter/olikheter i struktur. Det språk vi skall lära oss nu heter C# (C-sharp) och det brukar gå bra att göra den övergången. De delar som skiljer sig mycket kommer vi gå in lite djupare på medan vissa delar är väldigt lika.

Vårt huvudspråk i denna kurs kommer vara C# som är ett objektorienterat programmeringsspråk som är en del av .NET-plattformen. C# är utvecklat av Microsoft för programvarutveckling främst i windowsmiljö men det går också att köra C# i macmiljö. Vi kommer börja kursen med att jobba i macOS så får vi se hur vi gör när vi skall börja programmera spel. Vissa år har det varit problematiskt att få till en fungerande utvecklingsmiljö för macOS och det beror på vilka versioner av olika programvaror som samverkar mer eller mindre bra. Men detta är ett senare problem.

1.1 Sätta upp miljön

Vi måste börja med att sätta upp en utvecklingsmiljö, här gäller det att vi först ser till att vi säkerhetskopierar våra projekt. Det gör vi med Google Drives tjänst för att Säkerhetskopiera och synkronisera och sedan installerar och konfigurerar vi Visual Studio som är den IDE vi kommer använda i kursen.

1.2 Vårt första projekt

Nu är vi redo för att skapa vårt första projekt. Välj att skapa det genom att i menylisten välja File -> New Solution... eller New i den rutan som möter dig när du öppnar Visual Studio.

Nu kommer det upp en dialogruta där du får välja vilken typ av projekt du vill skapa. På bilden nedan så har jag troligtvis fler val i vänstermenyn än vad du har och det beror på att jag har installerat fler paket. I början av kursen skall vi jobba med konsollapplikationer och ett sådant projekt skapar du genom att markera Other -> .NET -> Console Project (C#) och sedan klicka på Next.

Skärmdump

Ange nu namnet på det projekt du vill skapa. I kursen kommer du skapa många projekt så hitta ett lämpligt sätt att namnge dina projekt redan från början. Undvik å, ä och ö i projektnamnet och mellanslag kommer inte alls godkännas.

Se till att projektet skapas där du vill att det skall placeras. Klicka sedan på Create.

Skärmdump

Nu skapas ett projekt med den startkod som behövs för att köra ett konsollprojekt i C#. När vi skapade ett projekt i Python så fanns det ingen kod att utgå ifrån, men här finns redan från start 13 rader med kod. Koden ser ut på följande sätt.

Skärmdump

Innan vi går igenom vad koden betyder så testa att köra koden med hjälp av play-knappen i fönstrets övre del. Nu kommer koden kompileras och ett konsollfönster kommer att öppnas och i detta kommer applikationen att köras. Denna första applikation kommer bara skriva ut Hello World!.

Skärmdump

1.2.1 Startkoden

Det kan tyckas onödigt att ha 13 rader kod för att bara kunna skriva ut en enkel text men strukturen är tydlig och denna strukturen kommer du känna igen även när du bygger större applikationer. För att förklara koden så börjar jag inifrån.

På rad 9 så sker själva utskriften genom att metoden WriteLine() anropas. Metoden WriteLine() tillhör klassen Console och genom att anropa klassens metod så kommer utskriften hamna i konsollen. Instruktionen (kodraden) avslutas med ett semikolon (;) vilket är det sätt som vi i C# talar om för programmet att instruktionen är färdig. I C# så är det helt ok att ha flera instruktioner på samma rad, så länge varje instruktion avslutas med ett semikolon. min rekommendation är dock att hålla koden så strukturerad som möjligt, så börja med en instruktion per rad.

Runt rad 9, med början på rad 7 finns det ett kodblock. Kodblock i C# brukar byggas upp inom måsvingar/klammerparentes/curly bracket (kärt barn har många namn) och det är på det sätt som C# visar att kod ingår i en struktur. Denna struktur kan tex. vara en metod, en selektion eller en iteration. I Python använde vi tabbar för att visa att instruktioner fanns inne i kodblock. Metoden Main() på rad 7 deklareras med viss information men vad denna kod betyder går vi igenom senare.

Metoden Main() ingår i en kodstruktur som börjar på rad 5 där en klass deklareras. Hur klasser fungerar kommer vi kika mycket på i denna kursen då klasser är ett grundläggande begrepp inom Objektorientering och C# är ett objektorienterat programspråk. Metoden Main() är viktig då det är den metoden som startar vårt program. Finns det ingen Main() går programmet inte att starta, finns det flera Main()-metoder kommer programmet heller inte att starta. Därför bör varje uppgift du gör vara i ett eget projekt.

Klassen MainClass ingår också i ett kodblock, detta kodblock är ett namespace vilket kan ses som en yta där vi kan placera kod. I stora projekt skapas ofta olika namespace för att hålla isär applikationens olika koder.

slutligen på rad 1 så står det using System vilket kan jämföras med en import av klasser som ger oss tillgång till klasser och metoder. betydelsen är egentligen större, men det kan vi återkomma till.

1.2.2 Kompilerad kod

När du tryckte på playknappen för att köra applikationen så kompilerades koden och det skapades en programfil med maskinkod. Maskinkod är det språk som processorn förstår vilket gör att programfilen nu snabbt kan köras i en dator. När vi kodade i Python så fanns det ingen kompilator utan en interpretator, denna interpretator är en programtolk som varje gång Pythonkod körs tolkar koden och berättar för processorn vad den skall göra. En interpretator är långsammare än en kompilator.

1.3 Utskrifter

Kodexempel: utskrifter och escapetecken

using System;

namespace FirstProject
{
  class MainClass
  {
    public static void Main(string[] args)
    {
      // Ser till att vi kan skriva ut svenska tecken
      Console.OutputEncoding = System.Text.Encoding.UTF8;
      Console.WriteLine("Hello World!");

      // kommentar görs med två "slash",
      // testa att markera kod och tryck sedan "shift + cmd + 7"
      Console.WriteLine("Hej alla andra också.\nÄven på andra raden.");

      Console.Write("Write() skriver ");
      Console.WriteLine("ut utan rabrytning.");
      // WriteLine avslutar utskriften med en radbrytning vilket inte Write gör.
      // Det behöver vi tänka på när vi sedan skall fortsätta koden.

      /*
       * Vill du kommentera över flera rader så gör du på detta sätt.
       * Nu skall vi kika på escapetecken, de vanligaste är att skapa ny rad,
       * tab eller då vi vill skriva ut "
       */
      Console.WriteLine("\nIbland vill man skriva ut dubbelfnutt (\")");
      Console.WriteLine("\n\tAtt kunna tabba är viktigt ibland.");
    }
  }
}

Uppgift: m01u01

Skapa programkoden som skapar följande utskrift.

Utskrift

Jag heter <mitt namn> och jag läser programmering på Alströmergymnasiet.
Jag tycker att det verkar "kul" med programmering.

Dessa tre rader
har jag skrivit med
en enda instruktion.

Följande saker har jag kommenterat i min kod:
  * Hur jag skrev ut dubbelfnuttarna på andra raden
  * Hur jag kunde skriva ut tre rader med en enda instruktion.
  * Hur jag använde mig av tab, för att göra denna listan.

Saker att notera

  • <ditt namn> skall bytas ut mot ditt för och efternamn.
  • Tabbarna i slutet av utskriften kan vara olika långa beroende på inställningar, men det är tabboch inte mellanslag som du skall använda.
  • Innan du är klar så skapar du ett kommentarsblock längst upp i filen och där skriver du ditt namn, din klass, vilken uppgift det är du har löst och gärna ett datum då du blev färdig. Ta för vana att skapa detta huvud för varje uppgift, det måste du ha när du senare lämnar in en uppgift och då skall du dessutom skriva en kort utvärdering av uppgiften.

Visa upp lösningen för din kompis, diskutera om det går att lösa på olika sätt och om var något som kändes konstigt mot hur du är van att koda från Python.

1.4 Variabler

Hur vi jobbar med variabler i C# skiljer sig en del från vad du är van vid ifrån Python. Här måste du tala om vilken datatyp en variabel har och denna går sedan inte att ändra.

Kodexempel: variabler

using System;

namespace FirstProject
{
  class MainClass
  {
    public static void Main(string[] args)
    {
      // Ser till att vi kan skriva ut svenska tecken
      Console.OutputEncoding = System.Text.Encoding.UTF8;

      // du kanske märker att Console.OutputEncoding kan skriva ut ett blankt tecken,
      // det kan vi ta bort genom att rensa konsollen.
      Console.Clear();

      // Att bara skriva datatypen och variabelns namn kallas att deklarera en variabel
      string svar;
      svar = "Omkretsen blir: ";

      // När vi skapar variabeln och ger den ett värde samtidigt så
      // initierar vi variabeln med ett värde
      int radie = 14;
      double pi = 3.14;

      // En beräkning av två numeriska variabler gör att svaret får den
      // största/mest exakta datatypen, decimaltal * heltal ger resultatet decimaltal.
      double omkrets = 2 * pi * radie;

      // Enklaste utskriften av variabler
      Console.WriteLine(svar + omkrets);

      // Det går också att göra en smidigare utskrift för flera variabler
      Console.WriteLine("I figuren så är radien {0} och då blir omkretsen {1}.", radie, omkrets);
    }
  }
}

Uppgift: m01u02

I en affär så köper du 3st pennor som kostar 4kr/st och ett äpple som väger 200g. Äpplen kostar 19kr/kg.

Gör nedanstående utskrift på alla sätt som vi precis har gått igenom.

Utskrift

Jag handlade 3 pennor för 12kr och 1 äpple för 3.80kr vilket totalt blev 15.80kr.

Antalet varor och priser skall vara variabler. Summor, och delsummor, skall vara uträknade på lämpligt sätt.

Kommentera också de olika sätten som du har använt, vilka skall vara;

  • Utskrift med kommatecken
  • Utskrift med plustecken (konkatenering)
  • Utskrift genom att sträng byggs upp före utskrift
  • Utskrift med öppen print () utan radbrytning
  • Utskrift med formatmetoden

1.5 Inmatning

Eftersom C#, till skillnad från Python, inte automatiskt tar hand om datatyper så måste vi kunna styra detta, vilket märks inte minst vid inmatningar. All kommunikation med Konsoll och senare GUI kommer ske med datatypen string.

Kodexempel: inmatning och konvertering

using System;

namespace FirstProject
{
  class MainClass
  {
    public static void Main(string[] args)
    {
      // Ser till att vi kan skriva ut svenska tecken
      Console.OutputEncoding = System.Text.Encoding.UTF8;

      // Deklarerar variabler
      string name;
      int age;
      char favoriteChar;

      // Utskrift
      Console.WriteLine("Vad heter du?");
      // Inmatningar
      name = Console.ReadLine();

      // Utskrift
      Console.WriteLine("Hur gammal är du?");
      // Inmatning
      // All inmatning kommer som strängar, vi måste konvertera
      // till den datatyp som vi vill ha.
      age = Convert.ToInt32(Console.ReadLine());

      Console.WriteLine("Vilket är ditt favorittecken?");
      // Konverterar till datatypen Char.
      favoriteChar = Convert.ToChar(Console.ReadLine());
      // Om du inte vill läsa in tecken som en sträng (och slipper trycka enter)
      // favoriteChar = Console.ReadKey().KeyChar;

      // Utskrift, se att jag skriver ut en variabel två ggr.
      // Jag delar också utskriften över två rader, då behöver jag använda "+"-tecken.
      Console.Write("Hej {0}! Jag hörde att du är {1} år gammal och att ditt favorittecken var {2}. " +
      "Vi skriver det en gång till för säkerhets skull: \"{2}\".", name, age, favoriteChar);
    }
  }
}

Uppgift: m01u03

Du skall jobba vidare med uppgift m02u03 så att den blir mer användbar. Tidigare har du givit variablerna för antalet pennor och äpplen fasta värden i din kod, detta kallas att hårdkoda in värden. Nu skall du instället fråga användaren hur många äpplen och pennor hen vill köpa och ta emot de inmatningar som görs från konsollen.

Kommentera de delar som du ändrar i koden.

Tips

Innan du börjar med denna uppgiften så tar du en kopia av den gamla uppgiften så att du vidareutvecklar kopian och inte originalet. Att ha kvar en fungerande version är alltid att föredra, ibland tänker man så fel att det är enklare att börja om än att felsöka och backa.

Utbyggnad 1 (klicka för att visa uppgiften)

Du skall i påbyggnadsuppgiften också fråga efter priset / st för pennorna och priset / kg för äpplen. Istället för att fråga efter antalet äpple skall du fråga efter vikten på de äpplen du vill köpa. Skriv ut detta på lämpligt sätt.

1.6 Selektioner

Selektioner, eller villkor, är något vi använder ofta inom programmeringen oavsett vilket språk vi vill använda oss av. I Python använde vi oss endast av if-elif-else, motsvarande i C# heter if-elseif-else och använder åter {} för att markera kodblocken. Inom C# har vi också en annan kontrollstruktur som heter switch-case och som rätt använt är väldigt användbar.

Jag visar med exempel.

Kodexempel: selektion

using System;

namespace selection
{
  class MainClass
  {
    public static void Main(string[] args)
    {
      int age = 18;

      if (age < 17)
      {
        Console.WriteLine("Du är omyndig");
      }
      else if (age > 65)
      {
        Console.WriteLine("Du är pensionär");
      }
      else
      {
        Console.WriteLine("Du är myndig");
      }
    }
  }
}

Som du ser så är operatorerna likadana som de var när vi jobbade med Python.

Uppgift: m01u04

Uppgiften är att läsa av klockan på din dator och sedan använda detta värde för att skriva ut om skoldagen pågår, inte har börjat eller är slut enligt nedan. Koden för att hämta tid hittar du här;

Kodexempel: Datum

using System;

namespace test_date
{
  class MainClass
  {
    public static void Main(string[] args)
    {
      // Datatypen är DateTime, Now är en Property/Egenskap
      // som hämtar datum/tid just nu.
      DateTime dt = DateTime.Now;
      int hour = dt.Hour;
      Console.WriteLine(hour);
    }
  }
}
  • kl. 8 - 16, skoldagen pågår
  • kl. 0 - 7, skoldagen har inte börjat
  • kl. 17 - 23, skoldagen är slut

Testa genom att ställa om tidsvariabeln men återställ så att den hämtas automatiskt från datorn när du är klar.

1.6.1 Switch

Switch är särskilt användbart när vi vill skapa olika menyalternativ men kan också vara intressant när flera val skall ge samma utfall. Här kommer ett exempel.

Kodexempel: switch

using System;

public class Switch
{
  public static void Main()
  {
    int val = 1;

    // det är endast heltal (int) eller tecken (char) som
    // går att använda i en switch
    switch (val)
    {
      case 1:     // Om val har värdet 1 så fortsätter koden här
        Console.WriteLine("Val 1");
        break;    // break avslutar varje "case" och måste finnas med
      case 2:
        Console.WriteLine("Val 2");
        break;
      case 3:     // Flera case kan listas efter varandra
      case 4:     // Alla dessa case kommer köra samma instruktion
      case 5:
        Console.WriteLine("Val 3, 4 eller 5");
        break;
      default:    // Default-caset kommer ta hand om alla andra val
        Console.WriteLine("Alla andra val");
        break;
    }
  }
}

Uppgift: m01u05

Bygg en egen meny som läser in char som tar hand om 5 valfria val och sedan ger ett felmeddelande ifall användaren anger något annat värde.
Tips sträng: Läs in hela strängen och ta ut första tecknet genom s[0], vilket innebär position 0 i strängen s.
Tips char: Läs bara in ett tecken från konsollen med koden: char c = Console.ReadKey().KeyChar;

1.7 Iterationer

När vi jobbar med iterationer så finns det tre vanliga iterationer, två av dessa har vi tidigare använt i Python nämligen for och while. Den tredje iterationen är en do-while som fungerar som while-loopen men med den skillnaden att denna kommer alltid köras minst en gång då villkoret kommer köras i slutet av varje varv.

1.7.1 for

For-loopen är den mest styrda loopen, här sätts ett startvärde, ett villkor och sedan en steglängd.

Kodexempel: for

using System;

namespace t_for
{
  class MainClass
  {
    public static void Main(string[] args)
    {
      // Ser till att vi kan skriva ut svenska tecken
      Console.OutputEncoding = System.Text.Encoding.UTF8;
      // Rensar konsollen
      Console.Clear();

      // For-loopen, initiera i, tala om hur länge det skall iterera,
      // tala om vilken steglängd variabeln skall ha. (i++ är samma som i = i + 1)
      for (int i = 1; i < 10; i++)
      {
        // Gör om det till en formaterad sträng
        // http://www.csharp-examples.net/string-format-double/
        String sqrt = String.Format("{0:0.00}", Math.Sqrt(i));

        // Utskrift
        Console.WriteLine("Roten ur {0} är {1}", i, sqrt);
      }
    }
  }
}

Uppgift: m01u06

Skriv ut alla tal från 1 till 10, i steg om 2, med hjälp av en for-loop.

Multiplicera sedan värdet på alla dessa tal och skriv ut svaret.

1.7.2 while

I while-loopen är det vanligt att sätta villkoret i centrum. Men alla delar som finns med i forloopen måste finnas med här, ett startvärde, ett villkor och en förändring.

Kodexempel: while

using System;

namespace test
{
  class MainClass
  {
    public static void Main(string[] args)
    {
      // Variabler
      int i = 1;

      while (i < 10)
      {
        // i++ förklaras nedan...
        Console.WriteLine("Talet: {0}", i++);
      }

      Console.WriteLine("Programmet avslutas");
    }
  }
}

Här behöver troligtvis i++ förklaras. När vi itererar någonting så är det vanligt att någon variabel förändras och ofta är det en räknare som räknas upp till nästa värde. i++ gör just detta, vi använder värdet på i men när hela instruktionen är slut (byter till nästa rad) så ökar i sitt värde med 1. På samma sätt kan vi skriva i-- vilket då minskar med 1 efter att raden har körts.

Det går också att skriva ++i och --i vilket ökar eller minskar värdet på variabeln i med 1, fast detta sker innan instruktionen körs.

Uppgift: m01u07

Antalet råttor i en stad är 100 stycken, varje månad dubblas populationen av råttor, hur många månader dröjer det innan det finns en miljon råttor i staden? Lös uppgiften med en while-loop.

Tips: Under utveckling är det smart att skriva ut på varje rad för att se att du har tänkt, och beräknat, allt rätt.

1.7.3 do while

Do-while är den nya iterationen för er, denna fungerar i grunden som en vanlig while-loop men kommer alltid att köras minst en gång eftersom villkoret kollas sist. Vet du med dig att ett kodblock med instruktioner skall köras minst en gång så är denna kontrollstruktur lämplig. För menyer passar den utmärkt.

Kodexempel: do while

using System;

namespace test
{
  class MainClass
  {
    public static void Main(string[] args)
    {
      // Variabler
      int tal = 14;

      // Ser till att vi kan skriva ut svenska tecken
      Console.OutputEncoding = System.Text.Encoding.UTF8;
      // Rensar konsollen
      Console.Clear();

      Console.WriteLine("Programmet skriver ut alla tal från {0} till 10.", tal);

      do
      {
        Console.WriteLine("Tal: " + tal++);
      } while (tal <= 10);
    }
  }
}

Uppgift: m01u08

Bygg vidare på uppgift m01u05, menyn, så att switch-satsen omsluts av en do-while-sats. Alla val som skrivs in skall ge något resultat men när du skriver in det val som avslutar programmet så skall programmet avslutas och ett meddelande om detta skall skrivas ut.
Tips: För att villkoret skall fungera så måste variabeln som skall villkoras vara deklarerad utanför do-while-satsen.

1.7.4 break och continue

Break och continue fungerar på samma sätt som det gjorde i Python, break avbryter ett kodblock och continue hoppar över resten av ett kodblock och går till nästa iteration.

1.8 Listor

Vi skiljer på två olika typer av samlingar. Den ena är en array vilket är en fast samling med ett bestämt antal komponenter. En array kan inte ändras i storlek när den är skapad, men det går att ändra innehåll för en array.

1.8.1 Array

Kodexempel: array

using System;
namespace array
{
  public class array
  {
    public static void Main(string[] args)
    {
      // Ser till att vi kan skriva ut svenska tecken
      Console.OutputEncoding = System.Text.Encoding.UTF8;

      // Skapar en array av typen string med tre komponenter/element
      string[] color = new string[3];
      color[0] = "Grön";      // Ger komponent 1, index 0, värdet "Grön"
      color[1] = "Svart";
      color[2] = "Vit";

      // Skapar en array genom att ge den värden, storleken får den automatiskt
      string[] color2 = { "Röd", "Blå", "Gul" };

      // Skriver ut innehållet i arrayen
      for (int i = 0; i < color.Length; i++)
      {
        Console.WriteLine("Färg nr{0} i arrayen är {1}",i+1, color[i]);
      }

      // Om vi försöker nå en komponent som inte finns...
      // ... "System.IndexOutOfRangeException has been thrown"
      color[3] = "Gul";
    }
  }
}

1.8.2 List

List är strukturen som skall användas för att skapa en lista som är dynamisk, alltså kan öka och minska i storlek beroende på hur många komponenter som finns.

Kodexempel: list

using System;
// Namespace som innehåller klasser och metoder för att hantera listor
using System.Collections.Generic;

namespace list
{
  class MainClass
  {
    public static void Main(string[] args)
    {
      // Deklarerar listan tal av typen int.
      // Glöm inte att skapa listan (new List) innan den går att använda.
      List<int> tal = new List<int>();

      // Ser till att vi kan skriva ut svenska tecken
      Console.OutputEncoding = System.Text.Encoding.UTF8;

      // Lägg till tre tal till listan
      tal.Add(12); tal.Add(15); tal.Add(17);

      // Ta bort tal 12
      tal.Remove(12);

      // Ta bort tal som ligger på första plats (index 0).
      tal.RemoveAt(0);

      // Lägger till två nya tal
      tal.Add(9); tal.Add(7);

      // Sorterar listan, från min till max.
      tal.Sort();

      Console.WriteLine("Här är alla tal som nu finns i listan");
      foreach (int t in tal)
      {
        Console.WriteLine(t);
      }
    }
  }
}

Uppgift: m01u09

Fråga användaren om hur många tärningsslag hen vill göra. Vi använder en vanlig tärning med värden 1-6. Simulera sedan dessa slag och lagra dem i en lista. Skriv sedan ut hur många slag det blev av varje värde, skriv ut detta på ett snyggt sätt.

Kodexempel: Slumptal

using System;

namespace RandomTest
{
  class MainClass
  {
    public static void Main(string[] args)
    {
      // Skapar ett objekt Random
      Random r = new Random();

      for(int i = 0; i < 10; i++)
      {
        // Next() hämtar nästa slumptal
        Console.WriteLine(r.Next());
      }
    }
  }
}

1.9 Metoder

Tidigare när vi jobbade med Python så använde vi gärna funktioner, både egengjorda och de som var tillgängliga i programmeringsspråket. I C# kommer vi jobba på samma sätt men här kallas det för metoder istället trots att det inte är någon skillnad på dem.

Det som kan vålla lite bekymmer i början är följande saker;

  • Synlighet - när vi skapar en metod så anger vi hur synlig den skall vara för olika delar av vårt program. Detta går vi igenom grundligt senare i kursen när vi kikar på OOP. public innebär att metoden har full synlighet i hela applikationen.
  • Static - används för att visa att denna metod kommer användas av en klass och inte av ett objekt. Detta behöver du inte förstå just nu, det återkommer vi till när vi jobbar med OOP.
  • Returvärde - anges för att kunna styra vad som skall returneras från en metod. Alla datatyper går att returnera och vilken datatyp som skall returneras behöver anges i metoddeklarationen. void innebär att inget skall returneras från metoden.
  • Inparametrar - när vi sänder inparametrar till metoden så behöver vi deklarera dessa med namn och datatyp.

Kodexempel: metoder

using System;
// Namespace som innehåller klasser och metoder för att hantera listor
using System.Collections.Generic;

namespace method
{
  public class Method
  {
    // string är alias för String
    // Denna listan ligger i klassen men utanför alla metoder,
    // detta gör att variabeln "res" går att nå ifrån alla metoder.
    // Nyckelordet static innebär att variabeln tillhör klassen och
    // inte ett objekt, mer om detta när vi jobbar med OOP senare.
    static List<string> res = new List<string>();

    public static void Main(string[] args)
    {
      // Ser till att vi kan skriva ut svenska tecken
      Console.OutputEncoding = System.Text.Encoding.UTF8;

      // Anropar metoden AddName
      AddName("Johan");

      // Anropar metoden Summa med två inparametrar,
      // lagrar sedan returvärdet i listan res.
      res.Add(Summa(12, 45));

      // Skriver ut innehållet i res
      Print(res);

      // Exempel 2
      // Skapar en ny lista
      List<string> list = new List<string>();

      // Lägger till 3 värden i listan
      list.Add("Pelle"); list.Add("Sven"); list.Add("Stina");

      // Skriver ut innehållet i listan
      // listan "list" i Main-metoden skiljer sig från listan list i metoden Print
      // Att ha möjlighet att använda olika listor gör att en metod är mer generell.
      Print(list);
    }

    /// <summary>
    /// Metoden AddName lägger till ett namn till listan
    /// </summary>
    /// <param name="s">Namnet som skall läggas till</param>
    public static void AddName(string s)
    {
      res.Add(s);
    }

    /// <summary>
    /// Metoden Summa summerar två tal och skapar en sträng med uträkningen.
    /// </summary>
    /// <param name="a">Ett heltal</param>
    /// <param name="b">Ett heltal till</param>
    /// <returns>Returnerar uträkning</returns>
    public static String Summa(int a, int b)
    {
      String s = String.Format("Summan av {0} och {1} är {2}", a, b, a + b);
      return s;
      // Går att slå ihop till
      // return String.Format("Summan av {0} och {1} är {2}", a, b, a + b);
    }

    /// <summary>
    /// Metoden print skriver ut innehållet i en lista
    /// </summary>
    /// <param name="list">lista med strängar</param>
    public static void Print(List<string> list)
    {
      // Loopa igenom listan och låta varje komponent lagras i l
      foreach(string l in list)
      {
        Console.WriteLine(l);
      }
    }
  }
}

Uppgift: m01u10

Bygg en applikation som frågar efter radien på en cirkel. Skapa sedan två metoder, en för area och en för omkrets. Returnera resultatet från beräkningarna till Main()-metoden och skriv ut svaren här.

Kommentera metoderna enligt mitt exempel ovan. Genom att skriva /// ovanför metoden när den är skapad så kommer det att skapas en mall för kommentarerna.

1.10 Bankapplikation

Uppgift Bankapplikation

Gör ett bankkonto-program där du från meny kan välja

  1. Insättning
  2. Uttag
  3. Visa saldo
  4. Avsluta programmet

Följande gäller angående programmet

  • Sätt saldot vid start till 1000:-.
  • Programmet skall ge användaren chans att göra upprepade val under en och samma körning.
  • Självklart kan du inte kunna ta ut mer pengar än det finns på kontot.
  • Transaktioner skall lagras som värden i en lista och beräknas av metoder.

Kodexempel: programloop

Klicka för att visa koden!

Här följer ett kodexempel för att skapa en programloop som gör att vi kan välja olika delprogram och sedan avsluta vår applikation på ett kontrollerat sätt.

Exempelkod

Extra svårighetsgrad på banken

För den som vill utmana sig lite extra finns följande funktionalitet att addera till sin applikation.

  • Redovisa alla tal med två decimaler. Tillåt insättning och uttag av decimaltal.
  • Bygg in funktionalitet för att kunna skriva en händelse till varje transaktion så att det går att få ut en lista på alla transaktioner.
  • Bygg in hantering för att ta hand om alla felinmatningar. Felsökning och olika variabeltyper
  • Lagra transaktioner till fil och läs in dem från fil för att kunna komma tillbaka till det saldo som fanns på kontot när du senast avslutade applikationen. TIPS: Fundera på hur du skall jobba med fil och/eller arrayer för att inte tappa data.

Kodexempel: läsa och skriva till fil

Klicka för att visa koden!

Här följer ett kodexempel på hur vi kan skriva till och läsa från fil.

Exempelkod

Kodexempel: split med delimiter

Klicka för att visa koden!

Att läsa in från fil finns det tidigare exempel på, här visar jag också hur man kan läsa in data från fil och splitta upp denna i olika delar. Tänk att varje rad i filen innehåller info om beloppet, en kort information i form av en text och sedan ett datum. Denna informationen skrivs i filen på följande sätt 1000|Kontot skapades|2018-09-07 08:49:15 där pipe(|) används som delimiter (avdelare).

I exempelkoden nedan visar jag hur metoden för att läsa in filen och dela upp den i tre listor fungerar, dessa tre listor skall vi sedan använda för att jobba med applikationen.

Exempelkod

I exemplet visar jag bara de globala variablerna och metoden för att läsa in filen till listorna.

Kodexempel: felhantering

Klicka för att visa koden!

Här följer ett exempel för hur man kan bygga in skydd mot programkörningfel, vilket innebär att användaren matar in ett värde som inte förväntas.

Exempelkod

Uppgift Moment01

För att vara klar med detta moment skall följande saker vara klara!

  1. Du skall ha en fungerande installation på din dator.
  2. Du skall ha en implementerad plan för hur du backar upp de filer du jobbar med.
  3. Bankapplikationen skall vara genomförd, med en kort utvärdering av arbetet som en kommentar först i din kod. Din applikation skall kunna visas upp för eller lämnas in till läraren beroende på vad läraren meddelar.