example cover photo

Grundläggande programmering 2IS048

Detta är en hemsida som är tänkt att nyttjas som en extra resurs när man försöker lära sig grunderna inom programmering. Hemsidan som sådan är strukturad på så vis att varje grundläggande koncept behandlas inom sin egna sektion (vilka du finner i menyn till vänster). För varje sektion så beskrivs konceptet först kortfattat vilket sedan följs av en uppgiftsförteckning med ett antal övningsuppgifter. Tanken är att du först och främst ska försöka lösa dessa uppgifter på egen hand (annars blir det i slutändan inte särskilt givande) och sedan kontrollera om din implementation fungerar. Om du kör fast eller om du vill jämföra din slutgiltiga lösning så kan du även kika på lösningsförslaget för resp. uppgift.

Längst ned på sidan hittar du slutligen 30 st. olika problem i varierande svårighetsgrad vilka du kan försöka dig på när du känner dig bekväm med samtliga koncept. För dessa problem tillhandahålls inget lösningsförslag. Om du har löst problemet enligt beskrivningen så har du klarat uppgiften, om inte så är det bara att fortsätta försöka. Om du kör fast så är tanken här istället att du felsöker din kod och testar olika implementationer, diskuterar med kollegor eller Googlar på ev. tips. kan nyttjas som ett verktyg för att lära sig programmering genom att öva på uppgifter.

Om du behöver hjälp med att komma igång med Visual Studio, hur man fjärransluter till datasalarna i Ekonomikum eller dylikt så kan du läsa mer om det via länken “Visual Studio” i menyn till vänster eller klicka HÄR

Inledning

För att lösa uppgifterna som du ser på denna sida så behöver du först skapa en konsol-applikation i Visual Studio för språket C#. Var uppmärksam när du skapar detta projekt så att du väljer C# och inte Visual Basic (som är ett annat programmeringsspråk). När du gör detta så kommer du att bemötas av koden som du ser nedan:

using System;

namespace PracticeAssignments // Namnet beror på vad du har döpt ditt projekt till.
{
  class Program
  {
    static void Main(string[] args)
    {
      // Write to console
      Console.WriteLine("Hello World!");
      Console.WriteLine("Press the Enter key to exit.");

      // Keep the terminal open until the user presses Enter.
      Console.ReadLine();
    }
  }
}

Det är inom metoden Main som du kommer att skriva din kod, till en början. Om vi kör koden från ovan exempel så kommer vi t.ex. att skriva ut “Hello World!” i konsolen. Konsolen kommer därefter att vänta på att du, eller användaren, klickar på Enter-tangenten innan applikationen stängs ned. Vi nyttjar alltså Console.WriteLine() för att skriva ut information i konsolen och Console.ReadLine() för att läsa in information från användaren.

För nästan varje uppgift på denna sida så förväntas det att du nyttjar dessa verktyg för att lösa uppgiften så lägg dem på minnet!

Föreslagen struktur

Då det snabbt kan bli omständigt att skapa en ny konsolapplikation för resp. uppgift så rekommenderar vi till en början att du, till en början, enbart arbetar i Main-metoden och separerar varje uppgift med hjälp av kommentarer. Dvs. exempelvis enligt nedan:

public class Program
{
  static void Main(string[] args)
  {
      // Uppgift 1 - Att deklarera vs. att instansiera
      int x;
      ...
      // Uppgift 2 - Hello, Name!
      Console.WriteLine("Enter your name: ");
      ...
  }
}

Där “…” representerar den kod du skriver för att lösa uppgiften.

Ett annat alternativ, något du förväntas nyttja senare oavsett fallet, är att strukturera ditt program med hjälp av metoder. Tanken här är att du skapar en ny, egendefinierad metod för resp. uppgift som du sedan anropar från Main-metoden. Mer information kring just metoder finner du under sektionen “Metoder” (Hoppa hit!). För att nyttja metoder så skriver man först en ny metod utanför Main-metoden som i nedan exempel:

public class Program
{
  static void Main(string[] args)
  {

  }
  // HÄR, efter den avslutande '}'
  // "static void" är något du måste lägga till framför metodnamnet, annars kan vi inte anropa metoden från Main
  // Hur en s.k. "metodsignatur" ser ut beskrivs ytterligare under sektionen "Metoder".
  static void Uppgift1()
  {
      int x;
      ...
  }
  
  static void Uppgift2()
  {
      Console.WriteLine("Enter your name: ");
      ...
  }
}

När du sedan är klar med din implementation, eller om du vill testa den, så behöver du anropa den metod som du har skrivit från Main-metoden. Exempel på hur man gör detta ser vi nedan:

public class Program
{
  static void Main(string[] args)
  {
      // Metodanrop för att köra Uppgift1
      Uppgift1();
      
      // Metodanrop för att köra Uppgift2
      Uppgift2();
      
      // Osv.
  }

  static void Uppgift1()
  {
      int x;
      ...
  }
  
  static void Uppgift2()
  {
      Console.WriteLine("Enter your name: ");
      ...
  }
}

Datatyper

Gällande grundläggande datatyper så behöver vi först och främst förstå att det finns olika typer av data. Vi har exempelvis datatypen int som kan nyttjas för att lagra numeriska värden, datatypen string för att lagra text och char för att lagra individuella bokstäver och tecken.

I denna sektion så kommer du att arbeta med dessa grundläggande datatyper, hur man interagerar med konsolen (input/output) samt konvertering av datatyper. För att göra detta så behöver man dock ha viss koll på de olika koncepten. Således följer en kortfattad beskrivning av resp. koncept nedan.

Datatyper:

// Grundläggande datatyper
bool b; // Hanterar värden av typen true eller false
int x; // Hanterar numeriska värden, t.ex. 123
char c; // Hanterar tecken, t.ex. '1' eller 'A'
DateTime date; // Hanterar datum och tid, t.ex. DateTime.Today

// Notera att det även finns en annan datatyp - decimal - för decimaltal.
double dd; // Hanterar decimaltal, t.ex. 12.3
string s; // Ord och meningar, t.ex. "Hello world"

Input/output:

// Input
// Läser det som användaren skriver in i konsolen.
// OBS! Alltid av typen string.
string input = Console.ReadLine();

// Output
// Skriver ut det som skrivs inom parenteserna i konsolen.
Console.WriteLine("Hello");

// .Write skriver ut innehållet på samma rad medan WriteLine bryter raden.
Console.Write("Hel");
Console.Write("lo");

Konvertering:

string input = Console.ReadLine();

// Fungerar enbart om input KAN konverteras till ett heltal.
// T.ex. kan "hej" inte konverteras till ett heltal.
int x = Convert.ToInt32(input);

// Fungerar alltid utan felmeddelande.
// Ger en felkod, 0, om konvertering misslyckas.
int y; 
int.TryParse(input, out y);

Uppgiftsförteckning

Uppgift 1 Att deklarera vs. att tilldela
Beskrivning Deklarera en variabel av resp. datatyp (int, string, char, bool) och tilldela sedan resp. variabel genom att tilldela dem ett värde.

Lösningsförslag
// Deklarering av variablerna. Vi skapar dem och ger dem ett namn men inget värde.
int x;
string s;
char c;
bool b;

// Tilldelning av variablerna. Vi ger dem ett värde.
x = 10;
s = "Hello world!";
c = 'H';
b = true;
Uppgift 2 Hello, Name!
Beskrivning Skriv ett program som visar ditt namn och en fullständig adress (såsom du skulle se den på ett brev). Programmet ska läsa in input från användaren.

Lösningsförslag
Console.WriteLine("Enter your name: ");
string name = Console.ReadLine();
Console.WriteLine("Enter your address: ");
string address = Console.ReadLine();

Console.WriteLine("Hello, " + name + "!");
Console.WriteLine("Your full adress is: " + address);
Uppgift 3 Modifiering av datatyper - Konvertering
Beskrivning Skriv ett program som läser in en siffra från en användare och sedan konverterar värdet till ett heltal.

TIPS! Tänk på att ALLT som läses in med Console.ReadLine() är av datatypen string. För att ändra detta till ett heltal så behöver man konvertera värdet. Detta kan ske på olika sätt, men försök dig på följande: Convert.ToInt32() samt int.TryParse(). Om du är intresserad av att läsa mer kring hur dessa metoder särskiljer sig så kan du kika på följande länk: Parse vs ConvertToInt32 vs TryParse

Lösningsförslag
string input = Console.ReadLine();
int x = Convert.ToInt32(input); // Detta fungerar enbart om värdet KAN transformeras till ett heltal. Om användaren t.ex. skriver in "Hej" så kommer applikationen att krascha.
Console.WriteLine(x);

int y;
int.TryParse(input, out y); // Metoden kommer att försöka omvandla värdet. Om det inte går så kommer y att innehålla värdet 0.
Console.WriteLine(y);
Uppgift 4 Konvertering med olika datatyper
Beskrivning I Uppgift 3 så behandlas hur man konverterar från en string till en int men det finns såklart flera olika metoder beroende på vilka datatyper som nyttjas. Testa på att konvertera enligt nedan:
Från int till string
Från double till int
Från double till string

Lösningsförslag
// Från int till string
int.TryParse(input, out int y);
string s = y.ToString();

// Från float till int
float x = 10.55f;
int a = Convert.ToInt32(x); // a = 11

// Från double till string
double z = 10.5;
string ss = z.ToString();

// Från float till string
float f = 42.31f;
string sss = f.ToString();
Uppgift 5 Olika typer av konvertering
Beskrivning Man kan även konvertera på olika sätt. Det finns exempelvis s.k. explicit konvertering och implicit konvertering samt konvertering utan att anropa Convert-klassen (dvs. exempelvis Convert.ToInt32).

Explicit konvertering är det har nyttjats i tidigare uppgifter. Dvs. exempelvis genom metoder såsom Convert.ToInt32 eller int.TryParse. Vi säger helt enkelt tydligt att vi vill genomföra konvertering.
Implicit konvertering tillåter oss att exempelvis gå från en int till en double utan att ange det då båda datatyper är av numerisk karaktär.

Det är även möjligt att genomföra explicit konvertering utan att ange en metod för konverteringen. Detta uppnås genom att placera datatypen som variabeln ska konverteras till - inom parenteser - framför variabeln. Testa på dessa olika typer av konvertering och ifall du är intresserad av att läsa mer om det så kan följande länk nyttjas: Olika typer av konvertering C#

Lösningsförslag
// Explicit
int.TryParse(input, out int y);
string s = y.ToString();

// Implicit
int a = 15;
int b = 3;
double kvot = a / b;

// Explicit med parenteser. Notera att detta inte fungerar i alla fall, t.ex. är det inte möjligt att byta ut double mot en string.
int x = 10;
double d = (double)x;
Uppgift 6 Summera två heltal
Beskrivning Skriv ett program som läser in två heltal från en användare. Programmet ska sedan summera heltalen och skriva ut den resulterande summan.

OBS! Programmet ska inte krascha pga. felaktig inmatning (t.ex. om användaren anger en bokstav istället för en ett heltal).

Lösningsförslag
int.TryParse(Console.ReadLine(), out int first);
int.TryParse(Console.ReadLine(), out int second);
int sum = first + second;
Console.WriteLine(sum);
Uppgift 7 Division av heltal
Beskrivning Skriv ett program som läser in två heltal och sedan beräknar samt skriver ut kvoten. Utöka sedan programmet så att det även läser in två decimaltal och sedan beräknar samt skriver ut kvoten för divisionen mellan dessa tal.

Notera skillnaden som uppstår mellan de två beräkningarna då det är viktigt att vara medveten om denna diskrepans vid exempelvis beräkningar av procent.

Lösningsförslag
// Division med int
int.TryParse(input, out int x);
int.TryParse(input, out int y);
Console.WriteLine(x / y); // Ger 3 om x är 10 och y är 3. Ger 2 om x är 8 och y är 3.

// Division med double
double.TryParse(input, out int a);
double.TryParse(input, out int b);
Console.WriteLine(a / b); // Ger t.ex. 3.33 om x är 10 och y är 3. Ger 2.66 om x är 8 och y är 3.

// Division med int som ger en double
double kvot = x / y; // Ger 3 om x är 10 och y är 3
double korrektKvot = (double)x / (double)y; // Ger 3.33 om x är 10 och y är 3. Konvertering måste ske INNAN beräkning.
Uppgift 8 Grundläggande matematik
Beskrivning Skriv ett program som läser in två heltal från användaren och som sedan skriver ut differensen mellan talen (subtraktion), produkten mellan talen (multiplikation) och kvoten mellan talen (division).

Lösningsförslag
int.TryParse(Console.ReadLine(), out int first);
int.TryParse(Console.ReadLine(), out int second);
int sub = first - second;
Console.WriteLine(sub);

int multi = first * second;
Console.WriteLine(multi);

double div = (double)first / (double)second;
Console.WriteLine(div);
Uppgift 9 Byta plats på värden
Beskrivning Skriv ett program som byter värdet hos två variabler av datatypen heltal och skriver ut variablernas nya värden. Exempel på interaktion med programmet:
Körexempel
// Innan byte:
First input contains: 3
Second input contains: 11 

// Efter byte:
First input contains: 11
Second input contains: 3
        

Lösningsförslag
int.TryParse(Console.ReadLine(), out int first);
int.TryParse(Console.ReadLine(), out int second);
int temp = first;
first = second;
second = temp;
Console.WriteLine("First input contains: " + first);
Console.WriteLine("Second input contains: " + second);
Uppgift 10 Korrekt beräkning
Beskrivning Skriv ett program som tar emot tre heltal (x, y & z) och sedan utför beräkningar enligt följande: (x + y) * z resp. x * y + y * z. Programmet ska sedan skriva ut resultatet för resp. beräkning. Exempel på interaktion med programmet:
Körexempel
// Input
// x = 3 
// y = 11 
// z = 2 

First calculation: 28
Second calculation: 55 
        

Lösningsförslag
int.TryParse(Console.ReadLine(), out int x);
int.TryParse(Console.ReadLine(), out int y);
int.TryParse(Console.ReadLine(), out int z);
int sum1 = (x+y) * z;
int sum2 = x * y + y * z;
Console.WriteLine("First calculation: " + sum1);
Console.WriteLine("Second calculation: " + sum2);
Uppgift 11 Beräkna hastighet
Beskrivning Skriv ett program som läser in avstånd och tid som input och sedan räknar ut hastighet i km/h.

TIPS! Använd datatypen float. Formeln som nyttjas för att beräkna hastighet (given tid och avstånd) är v = s / t där s är avstånd och t är antalet timmar.

Lösningsförslag
float.TryParse(Console.ReadLine(), out float distance);
float.TryParse(Console.ReadLine(), out float time);

float speed = distance / time;
Uppgift 12 Strängkonkatenering
Beskrivning Skriv ett program som läser in ett förnamn och ett efternamn. Konkatenera namnen genom att sätta ihop efternamnet med förnamnet. Tänk på att det utskrivna måste vara läsbart för datoranvändaren.

TIPS! För att konkatenera ("sätta ihop") strängar så kan man nyttja operatorn för addition (+) mellan de strängar man vill konkatenera. Exempel på interaktion med programmet:
Körexempel
// Input för förnamn: Anon
// Input för efternamn: Nym 
Name: Nym, Anon. 
        

Lösningsförslag
string fName = Console.ReadLine();
string lName = Console.ReadLine();

Console.WriteLine("Name: " + lName + ", " + fName + ".");
Uppgift 13 Modulus
Beskrivning Skriv ett program som läser in ett heltal och dividerar det med 2. Programmet ska sedan skriva ut "resten" (det som blev över efter divisionen). TIPS: Operatorn för Modulus är %. Anledningen till varför vi får 1 i ovan exempel beror på att 2 går i 5 två gånger (2+2=4) vilket lämnar oss med "resten" som är en 1:a. Exempel på interaktion med programmet:
Körexempel
Ange ett heltal: 5 
Resten efter division är: 1 
        

Lösningsförslag
Console.Write("Ange ett heltal: ");
int.TryParse(Console.ReadLine(), out int input);
double d = input % 2;
Console.WriteLine("Resten efter division är: " + d);

Metoder

Konceptet “Metod” behandlades kortfattat i inledningen där det beskrivs som ett alternativt sätt att strukturera kod. Varför detta är nödvändigt kan säkerligen ifrågasättas i början när man lär sig att programmera men i samband med att man bygger större och större program så märker man ganska snart att det utan hjälp av metoder snabbt blir överväldigande att dels hålla koll på vart all funktionalitet är placerad men även en påtaglig redundans av kod (dvs. ett identiskt kodstycke som förekommer på flera ställen). Om vi exempelvis föreställer oss att vi, vid olika tillfällen i ett program, vill kunna nyttja en viss funktion såsom t.ex. att lägga till en kontakt i en kontaktlista så känns det rimligt att bryta ut detta som en metod vilken vi sedan kan anropa vid behov. Detta gör det betydligt enklare att överblicka programmet såväl som att felsöka det. Det är således viktigt att man följer vissa riktlinjer när det kommer till metoder och det leder oss in på s.k. metodsignaturer:

Metodsignatur

Så, en metodsignatur. Vad är det egentligen och hur ser en signatur ut?

En metodsignatur består utav namnet på metoden och ev. parametrar som metoden tar emot. En parameter för exempelvis metoden Addition skulle kunna tänkas vara 2 st. heltal som ska summeras. Dvs. något i stil med:

Addition(int num1, int num2){
  // Code goes here.
}

Nämnvärt är att metodens- och parametrarnas namn bör vara beskrivande för vad metoden förväntas utföra. Exempelvis blir det snabbt väldigt svårt att avgöra vad en omfattande metod förväntas genomföra om dess namn är X och tar emot 14 parametrar döpta enligt x1, x2 osv.

Returtyp

Utöver själva metodsignaturen så behöver en metod även en s.k. returtyp. Det är denna som säger åt programmet vad, om något, metoden ska skicka tillbaka. I fallet av metoden Addition så kan vi exempelvis tänka oss att det är rimligt att metoden skickar tillbaka summan som ett heltal. Dvs. enligt följande:

int Addition(int num1, int num2){
    int sum;
    sum = num1 + num2;
    return sum;
}

När metoden då sedan anropas så vet vi att ett heltal kommer att skickas tillbaka samt att vi måste skicka in 2 st. heltal. Exempelvis enligt:

public class Program
{
  static void Main(string[] args)
  {
      int sum = Addition(10, 15); // sum = 25
      sum = Addition(12, -5); // sum = 7
      sum = Addition(10); // Error - Metoden förväntar sig 2 heltal
  }
  
  static int Addition(int num1, int num2)
  {
      int sum;
      sum = num1 + num2;
      return sum;
  }
}

OBS! Om metoden har en returtyp så måste metoden också skicka tillbaka något. Om metoden inte ska skicka tillbaka något, t.ex. om den enbart förväntas skriva ut information till konsolen så nyttjas returtypen void. Detta är lämpligt om resultatet från metoden inte behöver nyttjas senare i programmet, t.ex. om vi vill skriva ut resultatet på en gång.

public class Program
{
  static void Main(string[] args)
  {
      Addition(10, 15); // "Sum: 25" i konsolen
      Addition(12, -5); // "Sum: 7" i konsolen
      Addition(10); // Error - Metoden förväntar sig 2 heltal
  }
  
  static void Addition(int num1, int num2)
  {
      Console.WriteLine("Sum: " + (num1 + num2));
  }
}

När vi arbetar med konsolapplikationer så måste du även lägga till nyckelordet static framför din returtyp för att Main-metoden ska kunna “hitta” metoden. Vad static innefattar behandlas ytterligare under kursen “Objektorienterad programmering I”.

Uppgiftsförteckning

Uppgift 1 Metodsyntax
Beskrivning Skriv en lämplig metodsignatur och tillhörande returtyp för metoder som förväntas utföra följande funktion:

- Räkna ut något givet 3 st. parametrar.
- Avgöra om värdet hos en parameter är korrekt eller ej.
- Skickar tillbaka ett datum om input kan konverteras till ett sådant. Annars ska ett felmeddelande skrivas ut.
- Skriver ut innehållet i en array.

OBS! Ingen kod behöver skrivas för att lösa denna uppgift och du förväntas skriva en metodsignatur - och tillhörande returtyp - för resp. funktion.

Lösningsförslag
// Det spelar ingen roll om vi nyttjar int eller double här.
static double CalculateSum(int x, double y, int z) { }

bool IsLoggedIn(string usr, string psw) { }

// Givet returtypen så måste vi returnera något, i detta fall blir det en tom DateTime.
// Om konverteringen misslyckas så har vi en else-sats som skriver ut att ett fel har uppstått.
static DateTime ConvertToDate(int date) {
  // Code goes here.
  else{
    Console.WriteLine("Error.");
  }
  return new DateTime();
}

// void då vi enbart vill skriva ut innehållet i arrayen.
static void PrintArray(int[] arr){ }
Uppgift 2 KontrolleraRader
Beskrivning Skriv en metod som jämför om två meningar är identiska. Metoden ska ha namnet: KontrolleraRader. Presentera resultatet på lämpligt sätt och reflektera kring en lämplig returtyp.

Lösningsförslag
// Notera att metoden inte nödvändigtvis måste returerna något.
// Det kan dock vara aktuellt om vi t.ex. vill nyttja resultatet i en annan metod.
static bool KontrolleraRader(string a, string b){
  if(a == b)
  {
    Console.WriteLine("The strings match!");
    return true;
  }
  else
  {
    Console.WriteLine("The strings are not identical!");
    return false;
  }
}
Uppgift 3 Summering av udda tal
Beskrivning Skriv en metod som adderar två udda tal. Om talen inte är udda så ska ingen beräkning utföras. Användaren bör dock informeras om att ingen beräkning utförs. Denna metod är tänkt att nyttjas i en annan metod.

Lösningsförslag
// Notera att metoden inte nödvändigtvis måste returerna något.
// Det kan dock vara aktuellt om vi t.ex. vill nyttja resultatet i en annan metod.
static int SumOddNumbers(int x, int y){
  if(x % 2 != 0 && y % 2 != 0)
    return x + y;
  else
  {
    Console.WriteLine("At least one of the numbers is even.");
    return 0; // Agerar som felkod i den metod som nyttjar denna metod.
  }
}
Uppgift 4 Metoder med samma namn
Beskrivning Skriv en metod, PrintUserInfo, som tar emot två strängar. Metoden ska sedan skriva ut informationen enligt följande format:
Hello, Name!
Your number is: Number
Där "Name" är det ena argumentet och "Number" är det andra argumentet.
Skriv därefter ytterligare en metod med samma namn men som tar emot två strängar och ett heltal där heltalet representerar ett årtal. Denna metod ska skriva ut enligt samma format som den första metoden men även beräkna och skriva ut användarens ålder (dvs. antal år snarare än årtal).

OBS! Metoderna har samma namn men inte samma metodsignatur (två argument gentemot tre). Vi kommer att behandla detta koncept (method overloading) ytterligare i senare kurser, men i nuläget så är det tillräckligt att veta om att det existerar.

Lösningsförslag
static void PrintUserInfo(string name, string number){
  Console.WriteLine("Hello, " + name + "!");
  Console.WriteLine("Your number is: " + number);
}

static void PrintUserInfo(string name, string number, int year){
  Console.WriteLine("Hello, " + name + "!");
  Console.WriteLine("Your number is: " + number);
  Console.WriteLine("You are " + (2019 - year));
}
Uppgift 5 En metod i en metod
Beskrivning Skriv en metod som avgör om ett heltal är udda eller jämnt. Skriv därefter ytterligare en metod - som nyttjar den första metoden - för att antingen dividera heltalet med 2 (om det är ett jämnt tal) eller dividera heltalet med 5 (om det är ett udda tal).

Skriv ett metodanrop till båda metoder med korrekta argument (dvs. att argumentet är av typen double. NOTERA att namnet på de parametrar som anges för en metod enbart existerar i det kodblock som metoden avser. Detta innefattar att du inte måste skicka en variabel med samma namn som anges i metodens parametrar. Det enda som spelar någon roll är att datatypen är korrekt.

Lösningsförslag
// Notera att metoden inte nödvändigtvis måste returerna något.
// Det kan dock vara aktuellt om vi t.ex. vill nyttja resultatet i en annan metod.
static bool IsOdd(double x){
  if(x % 2 != 0)
    return true;
  else
    return false;
}

static double DivideOddAndEvenNumbers(double x){
  // Notera att "IsOdd(x)" är samma sak som att skriva "IsOdd(x) == true".
  // Detta då det är placerat som ett villkor i if-satsen och metoden returnerar en bool.
  if(IsOdd(x)) 
    return x / 5;
  else
    return x / 2;
}
Uppgift 6 En enkel meny II
Beskrivning Skriv en metod som presenterar användaren till en enklare meny med 3 alternativ. Dessa alternativ ska vara:

- Summera 3 heltal.
- Avgör om ett heltal är positivt eller negativt.
- Avgör först om två heltal är positiva eller negativa. Om båda heltal är positiva; summera dem. Om båda heltal är negativa; multiplicera dem. Ifall heltalen inte matchar varandra, utför ingen beräkning och returnerna 0.

Funktionaliteten ska placeras i lämpliga metoder.

Lösningsförslag
static void ASimpleMenu(){
  Console.WriteLine("Choose one of the following options:");
  Console.WriteLine("1. Sum 3 numbers.");
  Console.WriteLine("2. Check if a number is positive or negative.");
  Console.WriteLine("3. Check if two numbers are both negative, if they are - sum them. If they're not - multiply them.");
  
  int.TryParse(Console.ReadLine(), out int input);
  switch(input){
    case 1:
        Console.Write("Enter the first number: ");
        int.TryParse(Console.ReadLine(), out int x);
        Console.Write("Enter the second number: ");
        int.TryParse(Console.ReadLine(), out int y);
        Console.Write("Enter the third number: ");
        int.TryParse(Console.ReadLine(), out int z);
        Console.WriteLine("The sum is: " + SumNumbers(x, y, z));
        break;
    case 2:
        Console.Write("Enter a number: ");
        int.TryParse(Console.ReadLine(), out int num);
        Console.WriteLine("The number is positive: " + IsPositive(num));
        break;
    case 3:
        Console.WriteLine("The sum of PosNegSumOrMulti is: " + PosNegSumOrMulti());
        break;
    default:
        Console.WriteLine("Incorrect input.");
        break;
   } 
}

static int SumNumbers(int x, int y, int z){            
    return x + y + z;
}

static bool IsPositive(int n){   
    if(n >= 0)
      return true;
    else
      return false;
}

static int PosNegSumOrMulti(){
    Console.Write("Enter the first number: ");
    int.TryParse(Console.ReadLine(), out int input1);
    Console.Write("Enter the second number: ");
    int.TryParse(Console.ReadLine(), out int input2);

    if (IsPositive(input1) && IsPositive(input2))
        return input1 + input2;
        
    else if(!IsPositive(input1) && !IsPositive(input2))
        return input1 * input2;
        
    else
        return 0;
}

Selektion

I förhållande till konceptet selektion så behöver vi reflektera kring olika “vägar” som ett program kan ta. Ett program behöver nämligen kunna utföra olika saker beroende på vilka beslut en användare tar, precis som i vårt vardagliga liv! Vi kan exempelvis välja att ta bussen till jobbet ELLER ta cykeln. OM vi tar bussen så kostar det en viss summa, men vi anländer ev. snabbare. OM vi istället tar cykeln så kostar det inget, men det kan ev. ta lite längre tid och vara omständigare (t.ex. vid regn). Det finns självfallet även möjligheten att gå till jobbet om exempelvis både bussen är inställd och cykeln har fått punktering. Detta är mao. vad vi blir tvunga att välja OM de andra alternativen inte är tillgängliga.

Föreställ dig exempelvis att du nyttjar en hemsida som kräver inloggning för att lämna kommentarer. För att skapa ett konto så krävs det att man är äldre än 12 år gammal och att man anger ett användarnamn samt lösenord. Ett exempel på en simplistisk lösning för detta problem skulle kunna tänkas vara:

string usr = "";
string pass = "";
int age = 0;

Console.WriteLine("Ange ditt användarnamn: ");
usr = Console.ReadLine();
Console.WriteLine("Ange ditt lösenord: ");
pass = Console.ReadLine();
Console.WriteLine("Ange din ålder: ");
int.TryParse(Console.ReadLine(), out age);

if(age < 12)
    Console.WriteLine("Du måste vara minst 12 år för att skapa ett användarkonto!");
else if(age == 0) // Om konverteringen inte lyckades, t.ex. om "Tjugofem" anges istället för "25".
    Console.WriteLine("Du måste ange din ålder!");
else if(usr == "" || pass == "") // '||' representerar den logiska operatorn OR
    Console.WriteLine("Du måste ange ett användarnamn och ett lösenord!");
else
    Console.WriteLine("Ditt konto har skapats!");

Detta representerar alltså ett fall där vi gör en sak OM (if) ett - eller flera - kriterium är uppfyllt/uppfyllda, I ANNAT FALL (else if) så kontrollerar vi annat fall. Om vi i slutändan inte kan välja någon av dessa vägar så når vi vårt sista alternativ där vi helt enkelt säger att vi ANNARS eller I ALLA ANDRA FALL (else) väljer det alternativet. Detta är vad som kallas för selektion.

NOTERA att vi inte måste nyttja if/else parvis. Vi kan mao. ha en if-sats utan en medföljande else-sats. Vi säger då att vi utför detta OM kravet är uppfyllt, om det inte är det så gör vi ingenting.

Uppgiftsförteckning

Uppgift 1 Kontrollera input och grundläggande operatorer
Beskrivning Skriv ett program (eller en metod) som kontrollerar att:

- Input inte är lika med talet 5 och att det är mindre än 10.
- Input är lika med en annan variabel, intLika1. Denna variabel kan du tilldela vilket arbiträrt värde du än vill.
- Input innehåller bokstaven ‘h’ eller siffran ‘3’. Annars ska programmet skriva ut “Not true”.

TIPS: Operatorn för “lika med” är ==. Notera att enbart ett tilldelningstecken (=) indikerar just tilldelning medan två i rad alltså genomför en jämförelse. “inte lika med” kombinerar operatorn för “inte” (!) och “lika med” för att bilda “!=”. För att kontrollera om en sträng innehåller en bokstav så kan metoden Contains nyttjas i uppgiften. För att kontrollera flera uttryck samtidigt så kan operatörerna för AND (&&) och OR (||) nyttjas.

Lösningsförslag
int.TryParse(Console.ReadLine(), out int input);
if(input != 5 && input < 10) { 
  // Code goes here. 
}

int intLika1 = 112;
if(input == intLika1) { 
  // Code goes here. 
}

string newInput = Console.ReadLine();
if(!newInput.Contains('h') || !newInput.Contains('3')) { 
  // Code goes here. 
}
else { 
  Console.WriteLine("Not True"); 
}
Uppgift 2 Odd numbers?
Beskrivning Skriv ett program som läser in två heltal och skriver ut huruvida det stämmer om båda är udda eller ej.

TIPS: För att kontrollera om en siffra är jämn eller udda så rekommenderar vi att man nyttjar operatorn modulus. Om det inte finns någon rest efter att talet i fråga har dividerats med 2 så vet vi att talet är jämnt och vice versa.

Lösningsförslag
int.TryParse(Console.ReadLine(), out int input1);
int.TryParse(Console.ReadLine(), out int input2);

if(input1 % 2 != 0 && input2 % 2 != 0){
  Console.WriteLine("It's true!");
}
else{
  Console.WriteLine("It's not true!");
}
Uppgift 3 Positivt eller negativt?
Beskrivning Skriv ett program som läser in ett heltal och skriver ut huruvida det är ett positivt heltal eller ett negativt heltal. Exempel på interaktion med programmet:
Körexempel
 // Om input är: -12
-12 är ett negativt tal.

 // Om input är: 3
3 är ett positivt tal.
                

Lösningsförslag
int.TryParse(Console.ReadLine(), out int input1);

if(input1 >= 0){
  Console.WriteLine(input1 + " är ett positivt tal.");
}
else{
  Console.WriteLine(input1 + " är ett negativt tal.");
}
Uppgift 4 Skottår
Beskrivning Skriv ett program som läser in ett årtal och sedan skriver ut huruvida det årtalet är ett skottår eller ej. För att avgöra om ett år är ett skottår så ska programmet utgå från följande parametrar:

Om ett årtal är jämnt delbart med 4, 100 eller 400 så är det ett skottår.
Om årtalet som läses in är negativt så ska programmet skriva ut: “Du måste ange ett årtal efter år 0!”.

Lösningsförslag
int.TryParse(Console.ReadLine(), out int year);

if(year < 1){
  Console.WriteLine("Du måste ange ett årtal efter år 0!");
}
else if(year % 400 == 0 || year % 100 == 0 || year % 4 == 0){
  Console.WriteLine(year + " är ett skottår!");
}
else{
  Console.WriteLine(year + " är INTE ett skottår!");
}
Uppgift 5 Om m, skriv n
Beskrivning Skriv ett program som läser in ett heltal. Om heltalet är lika med 33 så ska heltalet + 9 skrivas ut, om heltalet är större än, eller lika med, 150 så ska heltalet delat i 2 skrivas ut. I alla andra fall ska heltalet upphöjt i 2 skrivas ut. Exempel på interaktion med programmet:
Körexempel
// Om input är: 33
42

// Om input är: 240
120

// Om input är: 149
22201
                

Lösningsförslag
int.TryParse(Console.ReadLine(), out int m);

if(m == 33){
  Console.WriteLine(m + 9);
}
else if(m >= 150){
  Console.WriteLine(m / 2);
}
else{
  Console.WriteLine(m * m);
}
Uppgift 6 Går det att bada?
Beskrivning Kajsa gillar att bada, dock tar vattnet ibland slut hemma och dessutom kan värmen variera ganska mycket. Denna metod undersöker om badet är redo. Kraven för att badet ska vara redo är att det måste finnas vatten, och att vattnet måste vara mellan 30 och 42 grader (inklusive). Programmet förväntas därför läsa in en parameter som avgör om badet har vatten eller ej. Detta kan anges i följande format: “true”, “yes” eller “y”. Programmet ska även läsa in en annan parameter som kan representera intervallet 30-48 grader.

OBS! Tänk på att om badkaret saknar vatten så kan vi inte kontrollera vattnets temperatur.

Lösningsförslag
Console.WriteLine("Ange om badkaret har vatten (true, yes eller y):");
string hasWater = Console.ReadLine();
bool b = false;
if(hasWater == "true" || hasWater == "yes" || hasWater == "y"){
  b = true;
  Console.WriteLine("Ange vattnets temperatur:");
  int.TryParse(Console.ReadLine(), out int temp);
  if(temp >= 30 && temp <= 42 && b){
    Console.WriteLine("Badet är redo.");
  }
  else{
    Console.WriteLine("Badet är INTE redo.");
  }
}
else{
  Console.WriteLine("Badkaret saknar vatten.");
}
Uppgift 7 Är personen arbetsför?
Beskrivning Skriv ett program som läser in en persons ålder. Programmet ska sedan kategorisera arbetsföra personer efter deras ålderskategori och skriva ut vilken kategori som personen tillhör. Kategorierna är:
16-19: Tonåring
20-29: Ung vuxen
30-39: Vuxen
40-49: Medelålder
50-64: Äldre

Om personen är under 16 eller äldre än 64 så ska programmet skriva ut att personen inte tillhör arbetsför kategori. Exempel på interaktion med programmet:
Körexempel
Ange personens ålder: 35
Personens kategori är: Vuxen

Ange personens ålder: 15
Personen tillhör inte arbetsför kategori!
                

Lösningsförslag
Console.Write("Ange personens ålder: ");
int.TryParse(Console.ReadLine(), out int age);

if(age < 16 || age > 64){
  Console.WriteLine("Personen tillhör inte arbetsför kategori!");
}
else{
  if(age > 15 && age < 20){
    Console.WriteLine("Personens kategori är: Tonåring");
  else if(age > 19 && age < 30){
    Console.WriteLine("Personens kategori är: Ung vuxen");
  else if(age > 29 && age < 40){
    Console.WriteLine("Personens kategori är: Vuxen");
  else if(age > 39 && age < 50){
    Console.WriteLine("Personens kategori är: Medelålder");
  else{
    Console.WriteLine("Personens kategori är: Äldre");
  }
}
Uppgift 8 Vilket betyg får studenten?
Beskrivning Skriv ett program som kontrollerar om en student har nått betyget G eller VG på en tentamen. Programmet behöver först läsa in antalet skrivpoäng som studenten har i en variabel och sedan ska programmet jämföra dess värde mot betygsgränserna som anges enligt:

U: <60
G: 60-84
VG: 85-100

Om studenten uppfyller kraven, dvs. antingen uppnår betyget G eller VG så ska programmet skriva ut "Studenten har avslutat kursen med betyget X!". Exempel på interaktion med programmet:
Körexempel
Ange studentens skrivpoäng: 90
Ange studentens bonuspoäng: 0
Studenten har avslutat kursen med betyget VG!

Ange studentens skrivpoäng: 57
Ange studentens bonuspoäng: 6
Studenten har avslutat kursen med betyget G!
                

OBS! Om något har gått tokigt till i systemet så behöver vi dock kunna avgöra detta. Ifall studentens skrivpoäng därför är negativa eller över 100 så ska programmet skriva ut "Något har gått fel vid inmatning.".

Vi behöver även kontrollera om studenten har fått bonuspoäng från andra moment på kursen och, om så är fallet, så behöver detta tas i beaktning vid bedömningen. Om en student exempelvis skriver 57 på tentamen men har sedan tidigare bonuspoäng som omfattar 6 poäng på tentamen så ska studenten ha betyget G.

Lösningsförslag
Console.WriteLine("Ange studentens skrivpoäng: ");
int.TryParse(Console.ReadLine(), out int points);
Console.WriteLine("Ange studentens bonuspoäng: ");
int.TryParse(Console.ReadLine(), out int bonus);

if(points < 0 || points > 100){
  Console.WriteLine("Något har gått fel vid inmatning.");
}
else{
  if((points + bonus) < 60){
    Console.WriteLine("Studenten har inte nått minst betyget G på kursen");
  else if((points + bonus) >= 60 && (points + bonus) < 85){
    Console.WriteLine("Studenten har avslutat kursen med betyget G!");
  else{
    Console.WriteLine("Studenten har avslutat kursen med betyget VG!");
  }
}
Uppgift 9 Introduktion till Switch
Beskrivning Skriv ett program som tar emot ett heltal och skriver ut den veckodag som matchar det heltalet. Dvs. att om användaren skriver in ‘5’ så ska ‘Fredag’ skrivas ut osv.
Om heltalet inte matchar en veckodag så ska istället följande skrivas ut: “Incorrect input”.

TIPS! Nyttja en s.k. switch-sats för att lösa uppgiften. För att läsa mer om dessa och se exempel på hur de kan nyttjas så kan du nyttja följande länk: Information om switch-satser

Lösningsförslag
string input = Console.ReadLine();

switch(input){
  case "1":
      Console.WriteLine("Måndag");
      break;
  case "2":
      Console.WriteLine("Tisdag");
      break;
  case "3":
      Console.WriteLine("Onsdag");
      break;
  case "4":
      Console.WriteLine("Torsdag");
      break;
  case "5":
      Console.WriteLine("Fredag");
      break;
  case "6":
      Console.WriteLine("Lördag");
      break;
  case "7":
      Console.WriteLine("Söndag");
      break;
  default:
      Console.WriteLine("Incorrect input");
      break;
}
Uppgift 10 Väder för veckan
Beskrivning Skriv ett program som skriver ut vädret för en angiven dag den nuvarande veckan. Vädret beror så klart på veckodag och gäller måndag till söndag enligt följande:
Mån: Soligt och >25C”
Tis: “Molnigt och runt 22C”
Ons: “Regn och <16C”
Tor: “Sol och regn, >20C”
Fre: “Orimligt varmt, runt 30C”
Lör: “Orimligt varmt, runt 32C”
Sön: “Regn och vind, <18C”.

Veckodagen skall anges enligt följande format, med måndag som ett exempel: "MONDAY"/"Monday"/"monday"/"mon"/"1".
Om det angivna formatet inte nyttjas så ska “Incorrect input” skrivas ut.

Lösningsförslag
string day = Console.ReadLine();

switch(day){
  case "MONDAY": case "Monday": case "monday": case "mon": case "1":
      Console.WriteLine("Soligt och >25C");
      break;
  case "TUESDAY": case "Tuesday": case "tuesday": case "tue": case "2":
      Console.WriteLine("Molnigt och runt 22C");
      break;
  case "WEDNESDAY": case "Wednesday": case "wednesday": case "wed": case "3":
      Console.WriteLine("Regn och <16C");
      break;
  case "THURSDAY": case "Thursday": case "thursday": case "thu": case "4":
      Console.WriteLine("Sol och regn, >20C");
      break;
 // Notera att det inte spelar någon roll om du skriver resp. "case" efter varandra enligt ovan eller på nästkommande rad som här.
  case "FRIDAY": 
  case "Friday":
  case "friday":
  case "fri":
  case "5":
      Console.WriteLine("Orimligt varmt, runt 30C");
      break;
  case "SATURDAY":
  case "Saturday":
  case "saturday":
  case "sat":
  case "6":
      Console.WriteLine("Orimligt varmt, runt 32C");
      break;
  case "SUNDAY":
  case "Sunday":
  case "sunday":
  case "sun":
  case "7":
      Console.WriteLine("Regn och vind, <18C");
      break;
  default:
      Console.WriteLine("Incorrect input");
      break;
}
Uppgift 11 Vinst eller förlust?
Beskrivning Skriv ett program som avgör om en person har gått med vinst eller förlust på en försäljning givet ett inköpspris och ett försäljningspris. Utgå exempelvis från följande scenario:

Karl köper andelar i en viss fond för 2300 kr runt löning med syfte att spara pengar. Han inser dock efter två veckors tid att han behöver pengarna pga. ett antal kostsamma utekvällar. Han säljer därför av sina andelar. Tyvärr så har fonden inte utvecklats väl under denna period och han säljer därför av andelarna för 1900 kr. Karl har därför gått med förlust på 400 kr (-17.3913043478261%). Du behöver inte avrunda procentsatsen. Om inköpet har resulterat i varken en vinst eller förlust så ska detta förmedlas via konsolen.

TIPS: Tänk på att du behöver nyttja datatypen double för att räkna med decimaler (vilket blir nödvändigt vid procentberäkning).

Lösningsförslag
int.TryParse(Console.ReadLine(), out int buyPrice);
int.TryParse(Console.ReadLine(), out int sellPrice);
double percent = 0;

if (sellPrice < buyPrice)
{
    double diff = buyPrice - sellPrice;
    percent = diff / (double)buyPrice;
    Console.WriteLine("The loss is: " + diff + " (-" + percent * 100 + "%)");
}
else if(sellPrice > buyPrice)
{
    double diff = sellPrice - buyPrice;
    percent = diff / (double)buyPrice;
    Console.WriteLine("The profit is: " + diff + " (" + percent * 100 + "%)");
}
else
{
    Console.WriteLine("You've made neither a profit or a loss.");
}
Uppgift 12 Typ av triangel?
Beskrivning Skriv ett program som tar emot längden från alla tre sidor hos en triangel och avgör om triangeln är likbent, liksidig eller oliksidig.

Lösningsförslag
int a, b, c;

Console.Write("Skriv in längden för sida a:");
int.TryParse(Console.ReadLine(), out a);
Console.Write("Skriv in längden för sida b:");
int.TryParse(Console.ReadLine(), out b);
Console.Write("Skriv in längden för sida c:");
int.TryParse(Console.ReadLine(), out c);
Console.WriteLine(); // En extra blankrad

if(a == b && a == c){
  Console.WriteLine("Triangeln är en liksidig triangel.");
}
else if(a == b || a == c || b == c){
  Console.WriteLine("Triangeln är en likbent triangel.");
}
else{
  Console.WriteLine("Triangeln är en oliksidig triangel.");
}
Uppgift 13 En enkel meny
Beskrivning Skriv ett program som presenterar användaren till en enklare meny med tre alternativ. Dessa alternativ ska vara:
- Beräkna arean hos en cirkel.
- Beräkna arean hos en rektangel.
- Avsluta programmet utan beräkning.

Notera att du behöver olika parametrar för de olika fallen. Exempelvis behöver du radien för att beräkna arean hos en cirkel men höjd och bredd för att istället beräkna arean hos en rektangel.

TIPS! För att nyttja PI i C# så kan du nyttja egenskapen Math.PI, men det går så klart även bra att enbart nyttja 3.14 istället.

Lösningsförslag
int input, r, b, h, area;

Console.WriteLine("Välj ett av följande alternativ:");
Console.WriteLine("1: Beräkna arean hos en cirkel.");
Console.WriteLine("2: Beräkna arean hos en rektangel.");
Console.WriteLine("3: Avsluta applikationen.");

int.TryParse(Console.ReadLine(), out input);
switch(day){
  case 1:
      Console.Write("Skriv in radien hos cirkeln: ");
      int.TryParse(Console.ReadLine(), out r);
      Console.WriteLine("Arean hos rektangeln är: " + Math.PI*r*r);
      break;
  case 2:
      Console.Write("Skriv in höjden hos rektangeln: ");
      int.TryParse(Console.ReadLine(), out h);
      Console.Write("Skriv in bredden hos rektangeln: ");
      int.TryParse(Console.ReadLine(), out b);
      Console.WriteLine("Arean hos rektangeln är: " + b*h);
      break;
  case 3:
      Console.WriteLine("Applikationen avslutas.");
      break;
  default:
      Console.WriteLine("Din input är felaktig. Försök igen.");
      break;
}

Iteration/Arrayer

Datatypen array är oftast något svår att förstå sig på inledningsvis. Exempelvis så kan man inte manipulera storleken (t.ex. lägga till en plats eller ta bort en plats i listan) på en array då dessa är statiska. Vi måste dessutom alltid ha i åtanke att, åtminstone för C#, indexpositionerna i en array alltid startar från position 0. Dvs. att när vi då exempelvis itererar över en array så måste man
1) börja på 0 (om vi inte vill hoppa över det första elementet) och
2) vara försiktig så att vi inte pekar på en indexposition som inte finns.
Se nedan exempel:

int[] arr = new int[] { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };

int x = arr[0]; // x = 2;
x = arr[9]; // x = 20;
x = arr[10]; // IndexOutOfRangeException då vi pekar på en position som inte existerar.

Iteration är ett koncept som tillåter oss att återupprepa ett stycke kod tills dess att vi når ett angivet resultat. En vanlig tillämpning av detta är nyttjandet av loopar såsom for-loopar, while-loopar och foreach-loopar. Föreställ dig exempelvis att vi vill söka efter ett angivet heltal i en array av heltal. Utan iteration så skulle vi behöva manuellt gå igenom varje element i arrayen och kontrollera dess värde med hjälp av if-satser. Genom att istället tillämpa iteration så kan vi säga åt vårt program att gå igenom hela arrayen åt oss och vi behöver bara skriva en if-sats istället för 10 (om arrayen från föregående kodexempel skulle nyttjas). Dvs. i stil med:

int search = 12; // Elementet vi letar efter i arrayen.
int[] arr = new int[] { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };

for(int i = 0; i < arr.Length; i++){
  if(arr[i] == search){
    Console.WriteLine("Elementet hittades på plats:" + i);
  }
}

OBS! I ovan kodexempel så är det värt att lägga märke till följande aspekter:

  • Syntaxen för en for-loop.
    • Vi skapar först en int som representerar indexpositionen i arrayen och tilldelar den värdet 0 (för att starta på den första positionen i arrayen).
    • Vi säger därefter att loopen ska fortsätta köras tills dess att i inte längre är mindre än 10 (i < arr.Length).
    • Därefter så exekveras koden i loopen så att vi under den första iterationen får arr[0] == search. Då detta inte stämmer så hoppar vi upp till i++ som kommer att öka värdet på i så att vi under nästa iteration istället får arr[1] == search osv.
  • Egenskapen Length hos arrayer som tillåter oss att hämta längden hos en array. I ovan fall så skulle vi därför få 10.

Uppgiftsförteckning

Uppgift 1 De första 100 positiva heltalen
Beskrivning Skriv en metod, PrintNumbers, som skriver ut alla positiva heltal från 1 till och med 50.

Lösningsförslag
void PrintNumbers(){
  for(int i = 1; i <= 50; i++){
    Console.WriteLine(i);
  }
}
Uppgift 2 Strukturerad utskrift
Beskrivning Skriv en metod, PrintNumbersTwo, som skriver ut alla positiva heltal från 1 till och med 50. Metoden ska skriva ut heltalen i intervaller av 10. Exempel på interaktion med metoden:
Körexempel
1, 2, 3, ..., 10    // ... = 4-9
11, 12, 13, ..., 20 // osv.
...
41, 42, 43, ..., 50
                

Lösningsförslag
void PrintNumbersTwo(){
  for (int i = 1; i <= 50; i++)
  {
      if(i == 10)
      {
        Console.Write(i);
        Console.WriteLine();
      }
      else if (i == 20)
      {
        Console.Write(i);
        Console.WriteLine();
      }
      else if (i == 30)
      {
        Console.Write(i);
        Console.WriteLine();
      }
      else if (i == 40)
      {
        Console.Write(i);
        Console.WriteLine();
      }
      else if (i == 50)
      {
        Console.Write(i);
        Console.WriteLine();
      }                   
      else
        Console.Write(i + ", ");
  }
}
Uppgift 3 Strukturerad utskrift II
Beskrivning Skriv en metod, NestedPrint, som skriver ut följande mönster:
Körexempel
        *
        **
        ***
        ****
        *****
        
TIPS! För att lösa denna uppgift så rekommenderas det att du nyttjar nästlade loopar, dvs. en loop inuti en annan. Ha i åtanke att all kod i den inre loopen kommer att köras för varje iteration i den yttre loopen. Nyttja gärna debugging i Visual Studio för att felsöka om något blir tokigt eller helt enkelt för att följa med i koden.

Lösningsförslag
void NestedPrint(){
  for(int i = 1; i <= 5; i++)
  {
    for(int j = 1; j <= i; j++)
    {  
      Console.Write("*");
    }
    // Används för att "gå till nästa rad", dvs. en break-line.
    Console.Write("\n"); // Går även att byta ut mot Console.WriteLine();
  }
}
Uppgift 4 Strukturerad utskrift III
Beskrivning Skriv en metod, NestedPrintTwo, som skriver ut följande mönster:
Körexempel
    *
   * * 
  * * *
 * * * *
* * * * *
                

Lösningsförslag
static void NestedPrintTwo()
{
    int count = 1;
    for (int i = 5; i >= 1; i--)
    {
        for (int j = i - 1; j >= 1; j--)
            Console.Write(" ");
        for (int k = 1; k <= count; k++)
        {
            Console.Write("*");
            Console.Write(" ");
        }
        count++;
        Console.WriteLine();
    }
}
Uppgift 5 Strukturerad utskrift IV
Beskrivning Skriv en metod, NestedPrintThree, som tar emot ett heltal som användaren anger. Metoden ska sedan iterera så pass många gånger som heltalet representerar och, för varje iteration, skriva ut enligt följande mönster:
Körexempel
// Givet heltalet 7 som input:
1
22
333
4444
55555
666666
7777777

// Givet heltalet 3 som input:
1
22
333
                

Lösningsförslag
void NestedPrintThree(int iterations){
  for(int i = 1; i <= iterations; i++)
  {
    for(int j = 1; j <= i; j++)
    {  
      Console.Write(i);
    }
    Console.WriteLine();
  }
}
Uppgift 6 Strukturerad utskrift V
Beskrivning Skriv en metod, NestedPrintFour, som tar emot ett heltal som användaren anger och skriver ut följande mönster:
Körexempel
// OBS! Du behöver inte inkl. mellanslag mellan symbolerna!
// Givet heltalet 2 som input:
        *
      * * *
 
// Givet heltalet 5 som input:
        *
      * * *
    * * * * *
  * * * * * * *
* * * * * * * * *
                
Notera att enbart udda antal * skrivs ut per rad. Antalet rader som skrivs ut bestäms av det heltal som tas emot som argument.

Lösningsförslag
void NestedPrintFour(int iterations){
   for(int i = 0; i < iterations; i++)
   {
      for(int j = 1; j <= iterations-i; j++)
        Console.Write(" ");
      for(int k = 1; k <= 2 * i-1; k++)
        Console.Write("*");
     Console.WriteLine();
   }
}
Uppgift 7 Summan av alla heltal mellan 1-100
Beskrivning Skriv en metod, GaussianSum, som skriver ut summan av alla positiva heltal från 1 till och med 100.

OBS! Resultatet av beräkningen är 5050, men detta ska beräknas i metoden. Du ska mao. inte hårdkoda resultatet och skriva ut det.

Lösningsförslag
void GaussianSum(){
  int sum = 0;
  for (int i = 1; i <= 100; i++)
  {
    sum += i;
  }
  Console.WriteLine(sum);
}

// alt. lösning
void GaussianSum(){
  Console.WriteLine(100(100+1)/2));
}
Uppgift 8 Beräkna medelvärdet
Beskrivning Skriv en metod, Average, som beräknar medelvärdet av heltal som anges av användaren. Metoden ska fortsätta ta emot heltal tills dess att användaren anger -1. När detta sker så beräknas medelvärdet vilket metoden sedan skriver ut och returnerar. Exempel på interaktion med metoden:
Körexempel
Ange ett heltal: 50
Ange ett heltal: 11
Ange ett heltal: 116
Ange ett heltal: -1
Medelvärdet är: 59
                

Lösningsförslag
int Average()
{
    int sum, count, input;
    sum = count = input = 0;

    while (input != -1)
    {
        Console.Write("Ange ett heltal: ");
        int.TryParse(Console.ReadLine(), out input);
        if (input == -1)
            break;
        sum += input;
        if (input != 0)
            count++;
    }

    if(count == 0)
    {
        Console.WriteLine("Beräkning kan ej genomföras");
        return 0;
    }
    else
    {
        Console.WriteLine("Medelvärdet är: " + (sum / count));
        return sum / count;
    }
    return 0;
}
Uppgift 9 Fakultet (matematik)
Beskrivning Skriv en metod, CalculateFactorial, som tar emot ett heltal som argument och skriver ut fakulteten hos det talet.

OBS! För att beräkna fakulteten hos ett tal så beräknar man produkten hos alla heltal - från och med 1 - till och med heltalet i fråga. Dvs. att om vi exempelvis vill beräkna fakulteten för heltalet 5 så skulle det se ut enligt: !5 = 1 * 2 * 3 * 4 * 5 vilket ger oss 120. Notera att heltalet i fråga måste vara större än 0, annars kan ingen beräkning ske.

Lösningsförslag
void CalculateFactorial(int input){
  if(input > 0){
    for (int i = input - 1; i >= 1; i--)
    {
       input *= i;
    }
    Console.WriteLine("Fakulteten är: " + input);
  }
  else
    Console.WriteLine("Heltalet måste vara större än 0!");
}
Uppgift 10 Rekursiv metod (Fakultet II)
Beskrivning En rekursiv metod är en metod som anropar sig själv tills dess att ett s.k. "basfall" uppnås. Denna typ av metod är mer vanligt förekommande i funktionella språk, men det är fullt möjligt att nyttja dem även i C#. Fördelarna med denna typ av metoder är att de resulterar i mindre kod och oftast är mer resurseffektiva (dvs. snabbare). Nackdelarna är det kan vara svårt att förstå sig på processen samt att det är betydligt svårare att felsöka dem i jämförelse med vanlig iteration. Ett exempel på rekursion skulle vara följande:
Körexempel
string Rec(int n) {
  if (n <= 0)   // Kontrollera att heltalet är ett positivt tal.
      return n + " must be higher than -1";
  else if (n > 9)
  {
      Console.Write(n);
      return "Completed"; // När vi har nått 10 så vill vi avsluta
  }
  else
  {
      Console.Write(n + ", ");
      return Rec(n + 1); // Rekursivt anrop. 1 + 1 -> 2 + 1 osv.
  }
}
                
Där metoden Rec räknar från det heltal som skrivs in till och med 10 och skriver ut följden i konsolen.

Uppgiften är att försöka lösa Uppgift 9 (Fakultet) på nytt fast genom att nyttja rekursion istället.

OBS! Denna uppgift är svår och faller egentligen något utanför kursens ramar (dvs. att innehållet är överkurs). Tanken med uppgiften är att introducera begreppet rekursion samt tillhandahålla möjligheten att testa på det.

Lösningsförslag
void CalculateFactorial(int input){
  if(input == 0)
    return 1;
  else
    return input * CalculateFactorial(input - 1);
}
Uppgift 11 Primtal?
Beskrivning Skriv en metod, IsPrime, som tar emot ett heltal och avgör om heltalet är ett primtal eller ej.

Ett primtal är ett heltal som är större än 1 och som enbart är jämnt delbart med 1 eller sig självt.

Exempelvis så är 2, 3 och 5 primtal medan 4 och 6 inte är det då de även är jämnt delbara med 2.

TIPS! Nyttja modulus och iteration för att kontrollera om det finns fler än två (1 resp. talet självt) faktorer. Tänk på att jämna tal, utöver 2, inte kan vara primtal.

Lösningsförslag
bool IsPrime(int input){
  // De första fallen kan hanteras via selektion.
  if (input == 1) return false;
  if (input == 2) return true;

  for (int i = 2; i * i <= input; i++)
  {
      if (input % i == 0)
          return false;                
  }
  // Om talet har passerat loopen så är det ett primtal.
  return true;
}
Uppgift 12 Alla primtal upp till…
Beskrivning Skriv en metod, PrimeNumbers, som tar emot ett heltal och skriver ut samtliga primtal från 1 upp till och med det heltalet.

TIPS! Nyttja din implementation från Uppgift 11 för att lösa uppgiften.

Lösningsförslag
void PrimeNumbers(int input){
  // De första fallen kan hanteras via selektion.
  if (input < 2)
    Console.WriteLine("Ange ett heltal större än 1.");
  else
  {
    for (int i = 1; i <= input; i++)
    {
      if(IsPrime(i))
        Console.WriteLine(i + " is a prime.");
    }
}
Uppgift 13 Fibonacci
Beskrivning Skriv en metod, Fibonacci, som tar emot ett heltal och skriver ut tal i Fibonnaci-sekvensen. Antalet tal som skrivs ut avgörs av det angivna heltalet.

Ett Fibonnaci-tal är summan av de två föregående talen i en sekvens av heltal. Exempelvis är de första 5 Fibonnaci-talen: 0 1 1 2 3. Vi kan i denna talföljd identifiera det tidigare nämnda mönstret givet 0 + 1 = 1, 1 + 1 = 2, 1 + 2 = 3 osv.

Lösningsförslag
void Fibonacci(int input)
{
    int n1, n2 = 1, n3;
    n1 = n3 = 0;

    Console.WriteLine(n1);
    Console.WriteLine(n2);

    for (int i = 2; i < input; i++)
    {
        n3 = n1 + n2;
        Console.WriteLine(n3);
        n1 = n2;
        n2 = n3;
    }
}

Alt. lösning:
void Fibb(int input)
{
    int i = 0;
    for (int n1 = 0, n2 = 1, n3 = 0; i < input; n3 = n1 + n2, n1 = n2, n2 = n3, i++)
    {
        Console.WriteLine(n1);
    }
}
Uppgift 14 Multiplikationstabellen för X
Beskrivning Skriv en metod, CalculateMultTable, som tar emot ett heltal som argument och returnerar en array av heltal. Metoden ska beräkna multiplikationstabellen (från 1 till och med 10) för heltalet och bygga upp en array innehållandes denna multiplikationstabell. Ett exempel på interaktion med metoden är:
Körexempel
int[] arr = CalculateMultTable(3);
// arr innehåller: [3, 6, 9, 12, 15, 18, 21, 24, 27, 30].
                

Lösningsförslag
int[] CalculateMultTable(int input){
  int[] arr = new int[10];
  
  for(int i = 1; i <= arr.Length; i++){
    arr[i-1] = input * i;
  }
  
  return arr;
}
Uppgift 15 Utskrift av arrayer
Beskrivning Skriv en metod, PrettyPrint, som tar emot en array av heltal som argument och inte returnerar någonting. Problemet med Uppgift 1 är att vi inte kan skriva ut innehållet i den array som skickas tillbaka i nuläget. Om vi exempelvis nyttjar Console.WriteLine(CalculateMultTable(3)); så kommer vi enbart att skriva ut dess datatyp snarare än innehållet i arrayen. För att skriva ut innehållet så behöver man istället peka på vilket element man specifikt vill skriva ut och det är detta PrettyPrint är ämnad att utföra.

Metoden ska skriva ut en array enligt följande format: 5, 10, 15, 20, 25, 30, 35, 40, 45, 50

NOTERA att det alltså inte ska förekomma ett kommatecken efter det sista värdet. Metoden ska även kunna skriva ut innehållet i en array av heltal oavsett dess storlek.

Lösningsförslag
void PrettyPrint(int[] input){  
  for(int i = 0; i < input.Length; i++){
    if(i == input.Length-1)
      Console.Write(input[i]);
    else
      Console.Write(input[i] + ", ");
  }
}
Uppgift 16 Utskrift av arrayer (baklänges)
Beskrivning Skriv en metod, PrettyPrintReversed, som tar emot en array av heltal som argument och skriver ut innehållet i arrayen baklänges.

Baklänges innefattar att om arrayen innehåller värdena [1, 3, 9] så ska utskriften vara [9, 3, 1].
Metoden ska skriva ut en array enligt följande format: 5, 10, 15, 20, 25, 30, 35, 40, 45, 50

NOTERA att det alltså inte ska förekomma ett kommatecken efter det sista värdet. Metoden ska även kunna skriva ut innehållet i en array av heltal oavsett dess storlek.

Lösningsförslag
void PrettyPrintReversed(int[] input){  
  for(int i = input.Legnth-1; i >= 0; i--){
    if(i == 0)
      Console.Write(input[i]);
    else
      Console.Write(input[i] + ", ");
  }
}
Uppgift 17 Största värdet i en array
Beskrivning Skriv en metod, HighestNumber, som tar emot en array av positiva heltal som argument och returnerar det största värdet i arrayen.

Lösningsförslag
int HighestNumber(int[] input){
  int max = 0;
  for(int i = 0; i < input.Length; i++){
    if(input[i] > max)
      max = input[i];
  }
  return max;
}
Uppgift 18 Näst största värdet i en array
Beskrivning Skriv en metod, SecondHighestNumber, som tar emot en array av heltal som argument och returnerar det näst största värdet i arrayen.

TIPS! Reflektera kring hur implementationen i Uppgift 17 kan anpassas för att hämta det näst största värdet istället för det största.

Lösningsförslag
int SecondHighestNumber(int[] input)
{
    int max = input[0], nMax = 0;
    for (int i = 1; i < input.Length; i++)
    {
        if (input[i] > max)
        {
            nMax = max;
            max = input[i];
        }
        else if (input[i] > nMax && input[i] != max)
            nMax = input[i];
    }
    return nMax;
}
Uppgift 19 Medelvärdet i en array
Beskrivning Skriv en metod, AverageNumber, som tar emot en array av heltal som argument och returnerar medelvärdet av alla värden i arrayen.

Lösningsförslag
int AverageNumber(int[] input){
  int sum = 0;
  for(int i = 0; i < input.Length; i++){
    sum += input[i];
  }
  return sum / (input.Length-1);
}
Uppgift 20 Summering av arrayer
Beskrivning Skriv en metod, SumArrays, som tar emot två arrayer av heltal som argument (arrayA och arrayB) och returnerar en array - arrayC - som innehåller summan av talen på resp. position. Ett exempel på interaktion med metoden är:
Körexempel
int[] arrC = SumArrays(new int[] {5, 3, 4}, new int[] {13, 1, 10});
// arrC innehåller: [18, 4, 14]
                
OBS! Metoden kan utgå från att arrayerna alltid är av samma längd.

Lösningsförslag
int[] SumArrays(int[] arrayA, int[] arrayB){
  int[] arrayC = new int[arrayA.Length];
  
  for(int i = 0; i < arrayA.Length; i++){
    arrayC[i] = arrayA[i] + arrayB[i];
  }
  return arrayC;
}
Uppgift 21 Count
Beskrivning Skriv en metod, Count, som tar emot en array av heltal och ett heltal som argument och returnerar antalet gånger det heltalet förekommer i arrayen. Ett exempel på interaktion med metoden är:
Körexempel
int c = Count(new int[] {6, 3, 3}, 3);
// c = 2;

c = Count(new int[] {6, 4, 1}, 2);
// c = 0;
                
OBS! Metoden kan utgå från att arrayerna alltid är av samma längd.

Lösningsförslag
int Count(int[] arr, int n){
  int count = 0;
  for(int i = 0; i < arr.Length; i++){
    if(arr[i] == n)
      count++;
  }
  return count;
}
Uppgift 22 PrintUniques
Beskrivning Skriv en metod, PrintUniques, som tar emot en array av heltal som argument och skriver ut alla unika värden i arrayen. Om arrayen inte innehåller några unika värden så ska "There are no unique values in the array." skrivas ut. Ett exempel på interaktion med metoden är:
Körexempel
PrintUniques(new int[] {6, 3, 3});
// Utskrift
6

PrintUniques(new int[] {6, 4, 1});
// Utskrift
6
4
1
                
TIPS! Nyttja din implementation av metoden Count från Uppgift 21.

Lösningsförslag
void PrintUniques(int[] arr)
{
    int count = 0;
    for (int i = 0; i < arr.Length; i++)
    {
        if (Count(arr, arr[i]) < 2)
        {
            Console.WriteLine(arr[i] + " is a unique value.");
            count++;
        }                   
    }

    if (count == 0)
        Console.WriteLine("There are no unique values in the array.");
}
Uppgift 23 Sort array
Beskrivning Skriv en metod, SimpleSort, som tar emot en array av heltal som argument och sorterar dem enligt storleksordning. Ett exempel på interaktion med metoden är:
Körexempel
int[] arr = SimpleSort(new int[] {6, 3, 1, 8, 4, 3});
// arr innehåller: [1, 3, 3, 4, 6, 8]
                
TIPS! Nyttja nästlade loopar för att lösa uppgiften.

Lösningsförslag
void SimpleSort(int[] arr)
{
    int temp = 0;
    for (int i = 0; i < arr.Length; i++)
    {
        for(int j = i; j < arr.Length; j++)
        {
            if(arr[i] > arr[j])
            {
              temp = arr[j];
              arr[j] = arr[i];
              arr[i] = temp;
            }
        }
    }
}
Uppgift 24 IsDuplicate
Beskrivning Skriv en metod, IsDuplicate, som tar emot en array av heltal som argument samt ett heltal och avgör om heltalet förekommer fler än en gång i arrayen. Ett exempel på interaktion med metoden är:
Körexempel
bool dupe = IsDuplicate(new int[] {6, 3, 1, 8, 4, 3}, 3);
// dupe = true

dupe = IsDuplicate(new int[] {6, 3, 1, 8, 4, 3}, 1);
// dupe = false
                
TIPS! Denna implementation kommer att påminnna om implementationen av Count (Uppgift 21).

Lösningsförslag
bool IsDuplicate(int[] arr, int n)
{
    int count = 0;
    for (int i = 0; i < arr.Length; i++)
    {
        if (arr[i] == n)
            count++;
    }

    if (count > 1)
        return true;

    return false;
}

Strängar

En sträng är egentligen en array utav tecken (char). Detta innebär att vi kan behandla en sträng likt hur vi behandlar en array. Föreställ dig exempelvis att vi har en sträng i stil med:

string hello = "Hello World!";

och att vi är intresserade av att hämta det tecken som förekommer på just indexposition 4. Vi kan uppnå detta genom att skriva hello[4] (som då är ‘o’).

Vi skulle även kunna iterera över en sträng, likt hur vi skulle göra för en array som består av heltal. Exempelvis enligt:

string text = "Hello everybody!";
char c = '';
for (int i = 0; i < text.Length; i++)
{
    c = text[i]; // nyttjar indexering. 'c' kommer första iterationen att innehålla 'H' sedan 'e' osv.
}

Datatypen string innehåller även många olika inbyggda metoder som gör det möjligt att enkelt hantera och manipulera strängar på olika sätt. Några exempel på några vanligt förekommande metoder är IndexOf, Substring, Split, ToUpper och ToLower.

IndexOf kan nyttjas för att returnera indexpositionen hos en specifik char i en sträng men även för att kontrollera om en sträng förekommer inuti en annan sträng. Om en sådan förekomst inte påträffas (dvs. om strängen inte finns i den andra strängen) så returneras -1, vilket kan nyttjas som en typ av kod vid felhantering. Exempel på nyttjande av metoden:

string text = "Hello world, it is I!";
string searchText = "world";
int startIndex = text.IndexOf(searchText); // startIndex = 6
int startIndex2 = text.IndexOf('e'); // startIndex2 = 1
string searchText2 = "test";
int startIndex3 = text.IndexOf(searchText2); // startIndex3 = -1

Substring kan nyttjas för att returnera en del utav en sträng. Vilken del som ska returneras samt och storleken på denna del är beror på vilka argument som anges. Exempelvis kan vi ange att vi vill ha allt från en angiven startposition string s = exempel.Substring(3); men vi kan även ange ytterligare ett argument som avser hur långt vi vill gå från startpositionen (dvs. längden på delsträngen) string s = exempel.Substring(3, 7);. OBS! Även blanksteg räknas som ett tecken i en sträng. Exempel på nyttjande av metoden:

string text = "Hello world, it is I!";
string subString = text.Substring(6); // subString = "world, it is I!"
string subString2 = text.Substring(6, 5); // subString = "world"

Split kan nyttjas för att returnera en array av strängar från en sträng som separerats på ett (eller flera) angivet/angivna tecken. Som namnet antyder innefattar metoden att vi “splittar” (delar upp) en sträng. Exempel på nyttjande av metoden:

string fruits = "Apples, Oranges, Pears";

// Vi anger att vi vill dela upp strängen vid ','.
// Resultatet blir en array som innehåller 3 st. strängar.
string[] listOfFruits = fruits.Split(','); // listOfFruits = ["Apples", "Oranges", "Pears"]

För att undvika tomma strängar så har vi även möjligheten att nyttja något som kallas för StringSplitOptions:

string fruits = "Apples, Oranges, Pears";

// Vi anger att vi vill dela upp strängen vid ',' och ' '.
// Resultatet blir en array som innehåller 3 st. strängar.
string[] listOfFruits = fruits.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);

Notera att utan StringSplitOptions så skulle vi få en array med 5 element då mellanslag förekommer framför “Oranges” resp. “Pears” i strängen.

ToLower och ToUpper är metoder som kan nyttjas för att helt enkelt transformera en sträng så att den antingen enbart innehåller gemener eller versaler. Detta kan vara särskilt smidigt i fall som exempelvis då vi vill jämföra två strängar eller kontrollera dess innehåll. Exempel på nyttjande av metoderna:

string input1 = "HelLO wOrlD";
string toLower = input1.ToLower(); // "hello world"

string input2 = "HelLO wOrlD";
string toUpper = input2.ToUpper(); // "HELLO WORLD"

I denna sektion så förväntas du öva på dessa olika former av strängmanipulering.

Uppgiftsförteckning

Uppgift 1 StringLength
Beskrivning Skriv en metod, StringLength, som tar emot en sträng som argument och beräknar längden på strängen (antalet tecken). Då en string kan, som tidigare nämnt, tolkas som en array av bokstäver så kan man självfallet nyttja egenskapen Length precis som vi har gjort i tidigare uppgifter men detta är inte syftet sett till uppgiften. Metoden StringLength ska dock beräkna längden via iteration istället.

TIPS! Nyttja en foreach-loop för att iterera över strängen.

Lösningsförslag
int StringLength (string input){
  int length = 0;
  foreach(char c in input)
  {
      length++;
  }
  return length;
}
Uppgift 2 Reverse string
Beskrivning Skriv en metod, StringReversed, som tar emot en sträng som argument och skriver ut strängen i bakvänd ordning. Dvs. givet strängen "Hello world!" så ska "!dlrow olleH" skrivas ut.

Lösningsförslag
void StringReversed (string input){
  for(int i = input.Length-1; i >=0; i--)
  {
      Console.Write(input[i]);
  }
}
Uppgift 3 RemoveSpaces
Beskrivning Skriv en metod, RemoveSpaces, som tar emot en sträng som argument och skriver ut den efter att alla mellanslag har tagits bort från strängen. Om inga mellanslag förekommer i strängen så ska “No spaces in string.” skrivas ut istället.

TIPS! Nyttja den inbyggda metoden Split.

Lösningsförslag
void RemoveSpaces (string input){
  string[] noSpaces = input.Split(' ');
  if(noSpaces.Length < 2)
      Console.WriteLine("No spaces in string.");
  else
  {  
      string output = string.Empty;
    
      for(int i = 0; i < noSpaces.Length; i++)
      {
          output += noSpaces[i];
      }
      
      Console.WriteLine(output);
}

// Alt. lösning
void RemoveSpaces (string input){
    string output = string.Empty;
    int count = 0;

    for(int i = 0; i < input.Length; i++)
    {
        if(input[i] != " ")
            output += input[i];
        else
            count++;
    }

    if(count > 0)
        Console.WriteLine("No spaces in string.");
    else
        Console.WriteLine(output);
}
Uppgift 4 RemoveSpecificChar
Beskrivning Skriv en metod, RemoveSpecificChar, som tar emot ett tecken samt en sträng som argument och returnerar strängen efter att alla tecken som matchar argumentet har tagits bort.

Lösningsförslag
string RemoveSpecificChar (string input, char c){
    string output = string.Empty;

    for(int i = 0; i < input.Length; i++)
    {
        if(input[i] != c)
            output += input[i];
    }

    return output;
}
Uppgift 5 Sammanställning av sträng
Beskrivning Skriv en metod, GetStringContent, som tar emot en sträng som argument och skriver ut alla bokstäver, siffror och specialtecken som förekommer i strängen. Dvs. givet meningen “Hello world! 123” så ska följande skrivas ut:

Bokstäver: 10
Siffror: 3
Specialtecken: 1.

Notera att mellanslag inte tillhör någon kategori och därför inte ska tillgodoräknas. TIPS! Det finns en inbyggd metod för datatypen char som kan avgöra om ett tecken är en siffra samt en annan som kan avgöra om ett tecken är en bokstav.

Lösningsförslag
void GetStringContent(string input)
{
    int digits, letters, symbols;
    digits = letters = symbols = 0;

    for (int i = 0; i < input.Length; i++)
    {
        // För att hantera mellanslag
        if (input[i] == ' ') { }

        else if (char.IsDigit(input[i]))
            digits++;
        else if (char.IsLetter(input[i]))
            letters++;
        else
            symbols++;
    }

    Console.WriteLine("Bokstäver: " + letters);
    Console.WriteLine("Siffror: " + digits);
    Console.WriteLine("Specialtecken: " + symbols);
}
Uppgift 6 Manuell Substring
Beskrivning Skriv en metod, SubString, som tar emot en sträng samt ett heltal som argument och returnerar en delsträng från och med det angivna heltalet där heltalet representerar en indexposition.

Skriv sedan en annan metod, SubString som tar emot en sträng samt två heltal som argument och returnerar en delsträng mellan indexpositionen som det första heltalet avser och indexpositionen som det andra heltalet avser.

OBS! Metoderna har samma namn men inte samma metodsignatur (två argument gentemot tre). Vi kommer att behandla detta ytterligare i senare kurser, men notera gärna detta.
Denna uppgift är tänkt att öka förståelsen för hur Substring fungerar genom att skriva en egen implementation av metoden. Uppgiften ska därför inte lösas mha. den inbyggda metoden Substring.

Lösningsförslag
string SubString(string input, int start)
{
    string substring = string.Empty;
    
    // Felhantering för att undvika IndexOutOfRange
    if(input.Length <= start || start < 1)
        return substring;
    
    for (int i = start; i < input.Length; i++)
    {
        substring += input[i];
    }

    return substring;
}

string SubString(string input, int start, int stop)
{
    string substring = string.Empty;
    
    // Felhantering för att undvika IndexOutOfRange
    if(input.Length <= start || start < 1 || input.Length <= stop)
        return substring;
    
    for (int i = start; i <= stop; i++)
    {
        substring += input[i];
    }

    return substring;
}
Uppgift 7 Manuell IndexOf
Beskrivning Skriv en metod, IndexOfChar, som tar emot en sträng, ett tecken samt ett heltal - som avser startposition för sökningen - och skickar tillbaka indexpositionen som tecknet förekommer på i strängen. Om tecknet inte förekommer i strängen så ska -1 returneras.

OBS! Denna uppgift är tänkt att öka förståelsen för hur IndexOf fungerar genom att skriva en egen implementation av metoden. Uppgiften ska därför inte lösas mha. den inbyggda metoden IndexOf.

Lösningsförslag
int IndexOfChar(string input, char c, int pos)
{
    for(int i = pos; i < input.Length; i++)
    {
        if(input[i] == c)
            return i;
    }

    return -1;
}
Uppgift 8 IsStringInString
Beskrivning Skriv en metod, IsStringInString, som tar emot två strängar som argument och avgör om den andra strängen förekommer i den första strängen. TIPS! Nyttja den inbyggda metoden Substring eller din implementation från Uppgift 6 för att jämföra den andra strängen mot den första strängen. Nyttja den inbyggda metoden IndexOf eller din implementation från Uppgift 7 för att hämta positionen i den första strängen där delsträngen (den andra strängen) börjar.

Lösningsförslag
bool IsStringInString(string input, string substring)
{
    // Positionen i input för den första bokstaven i substring
    int index = input.IndexOf(substring[0]);
    // variabel som tillåter oss att gå vidare till nästa "IndexOf"-värde
    int pos = 0;

    // Iteration för att om substring[0] t.ex. är 'a' så förekommer det sannolikt flera gånger i strängen.
    // -1 är felkoden för om tecknet inte hittas i strängen.
    while(index != -1)
    {
        // Felhantering så att vi inte får IndexOutOfRange.
        // Vi plockar ut en delsträng från input, med samma längd som "substring" och jämför dem mot varandra.
        if (index + substring.Length < input.Length && input.Substring(index, substring.Length) == substring)
            return true;
        
        // Uppdatera från vilken indexposition vi vill titta på.
        // Om vi inte gör detta så kommer vi att kolla på t.ex. position 10 för evigt.
        pos = index + 1;
        index = input.IndexOf(substring[0], pos);        
        // Alt. Uppgift 7 implementation
        // index = IndexOfChar(input, substring[0], pos);
    }

    return false;
}

Problemlösning

I denna sektion så hittar du övningsuppgifter utan några lösningsförslag. Tanken med dessa uppgifter är att du ska kombinera de koncept som har behandlats i tidigare sektioner för att lösa problem på egen hand. Om du kör fast så kan du i första hand återgå till relevanta tidigare sektioner, se över kursmaterialet eller Googla efter tillvägagångssätt på egen hand.

Uppgiftsförteckning

Uppgift 1 Summering och sammanslagning av arrayer (Enkel)
Beskrivning Skriv en metod, SumArrays, som tar emot två arrayer av heltal som argument (arrayA och arrayB) och returnerar en array - arrayC - som innehåller summan av talen på resp. position. Dvs. att om värdet på position 0 i arrayA är 5 och värdet på position 0 i arrayB är 13 så ska position 0 i arrayC innehålla värdet 18 osv.

OBS! Om den ena arrayen är längre än den andra så ska värdet från den längre arrayen placeras i arrayC.
Uppgift 2 Prisberäkning för inträde (Enkel)
Beskrivning Skriv en metod, AdmissionPrice, som beräknar priset för inträde till ett nöjesfält baserat på gästernas ålder. Antalet gäster som tillhör gruppen bestäms utav användaren som skriver in N. Därefter hämtas samtliga av dessa gästers namn och deras resp. ålderin.
Pristabellen som gäller är:
- Barn (3-12): 50 kr.
- Pensionär (65+): 75 kr.
Samtliga resterande åldersgrupper betalar alltid 110 kr.
Om gruppen består utav fler än 4 gäster så ges en rabatt på 20% på totalpriset. Metoden ska efter beräkning skriva ut antalet gäster i gruppen och den totala summan.
Uppgift 3 BMI kalkylator (Enkel)
Beskrivning Skriv en metod som beräknar BMI (body mass index) värdet för en person. Metoden ska läsa in personens längd och vikt och därefter nyttja en utav två formler för att utföra beräkningen. Vilken formel som ska nyttjas beror på om längd och vikt anges enligt metriska eller imperiska mått (dvs. exempelvis cm gentemot feet + inches). Den metriska formeln är:

BMI = (weight / (height * height))

och den imperiska formeln är:

BMI = (weight / (height * height)) * 703
Uppgift 4 Ordbyte (Enkel)
Beskrivning Skriv en metod, ReplaceWord, som byter alla förekomster av ett utvalt ord mot ett annat. Metoden ska ta emot en mening som argument och därefter fråga användaren vilket ord som ska bytas ut samt vad det ska bytas ut mot. Om ordet som ska bytas ut inte förekommer i meningen så ska användaren meddelas om detta och ges möjligheten att ange ett annat ord.
Uppgift 5 Element på udda positioner (Enkel)
Beskrivning Skriv en metod som tar emot en array av heltal och returnerar samtliga element som förekommer på udda indexpositioner. Dvs. att givet exempelvis arrayen [3, 5, 10, 2, 6] så ska 5 och 2 returneras. Om arrayen inte har några udda positioner så ska null returneras.
Uppgift 6 Guessing game (Enkel)
Beskrivning Skriv ett program som tillåter en användare att gissa på ett “hemligt” nummer. Efter varje gissning så ska programmet skriva ut huruvida gissningen var lägre eller större än det hemliga numret. Denna process ska återupprepas tills dess att användaren gissar rätt eller anger “EXIT”. Om användaren gissar rätt så ska antalet gissningar som krävdes för att komma fram till svaret skrivas ut.
Uppgift 7 LongestWord (Enkel)
Beskrivning Skriv en metod, LongestWord, som tar emot en mening och returnerar det längsta ordet i meningen. Om det förekommer två eller flera ord - vilka samtliga har samma längd och är längre än resterande ord i meningen - så ska det första ordet returneras. Dvs. att givet exempelvis meningen "I love cats" så ska "love" skickas tillbaka.

TIPS! Nyttja den inbyggda metoden Split för att dela upp meningen på mellanslag.
Uppgift 8 “Enkel” addition (Enkel)
Beskrivning Skriv en metod, SimpleAdd, som tar emot ett heltal (n) och returnerar summan av alla heltal från 1 till och med n. Dvs. att om n är 12 så ska 78 returneras (1+2+3…11+12).
Uppgift 9 ToggleString (Enkel)
Beskrivning Skriv en metod, ToggleString, som tar emot en sträng och returnerar samma sträng efter att ha bytt ut alla gemener mot versaler och versal mot gemener. Dvs. att givet strängen “HelLo wORld” så ska “hELlO WorLD” returneras. Strängen måste vara längre än 1 tecken men mindre än 100 tecken, om detta krav inte uppfylls så ska en tom sträng returneras.
Uppgift 10 PowerOf (Enkel)
Beskrivning Skriv en metod, PowerOf, som tar emot två heltal (n & p). Metoden ska sedan returnera heltalet n upphöjt i p. Dvs. att givet heltalen 5 och 3 så ska 125 returneras. Om det istället är heltalen 5 och 4 så ska 625 returneras osv.

TIPS! Nyttja datatypen long istället för int för att undvika att heltalet blir för stort (det största möjliga värdet som en int kan innehålla är 32767). NOTERA att den inbyggda metoden Math.Pow inte ska nyttjas för att lösa uppgiften.
Uppgift 11 FizzBuzz (Enkel)
Beskrivning Skriv en metod, FizzBuzz, som tar emot 3 heltal. n som representerar antalet iterationer, x som representerar det första delbara talet och y som representerar det andra delbara talet. Metoden fungerar på så sätt att den skriver ut alla tal mellan 1 till och med n. Om ett tal dock är jämnt delbart med x så ska "Fizz" skrivas ut framför talet. Om talet är jämnt delbart med y så ska “Buzz“ skrivas ut framför talet och om talet är jämnt delbart med x och y så ska “FizzBuzz“ skrivas ut framför talet. OBS! Varje tal ska enbart skrivas ut en gång. Exempel på interaktion med metoden kan tänkas se ut enligt följande:
Körexempel
//Om x = 2 och y = 4
1
Fizz 2
3
FizzBuzz 4
5
Fizz 6
                
Uppgift 12 Palindrom (Enkel/Medel)
Beskrivning Skriv en metod, IsPalindrome, som avgör om en sträng är ett palindrom eller ej. Ett palindrom är ett ord eller en mening som är exakt likadan skrivet baklänges, t.ex. “Sirap i paris”. Metoden ska ta mellanslag, specialtecken och versaler/gemener i beaktelse när den avgör om strängen är ett palindrom eller ej.
Uppgift 13 Hotellbokning (Enkel/Medel)
Beskrivning Inom en hotellverksamhet önskar man få överblick över vilka rum som är bokade samt vilka som är lediga. Skriv först ett program (eller en metod) som läser in “bokat” kontra “ledigt” i en array som består utav 15 platser. Varje plats i arrayen motsvarar ett rum på hotellet.

b. Utöka sedan programmet genom att lägga till möjligheten att genomföra bokningar. Vid en bokning så ska det första lediga rummet i rumslistan (arrayen) identifieras och sedan ändra värde till “bokat”.

c. Utöka sedan programmet ytterligare genom att låta användaren ange om ett rum önskas bokas eller avbokas. Om rummet ska bokas kan implementationen i b) nyttjas, om en avbokning ska ske så behöver vi dock kunna hantera detta. Vid en avbokning så ska rumsnummer anges och efter avbokning så ska värdet i arrayen ändras till “ledigt”.
Uppgift 14 Hitta medianen (Enkel/Medel)
Beskrivning Medianen är det tal som representerar mitten i en talföljd. Om vi exempelvis har heltalen 10, 63 och 15 så agerar 15 medianvärdet. Om vi istället har heltalen 10, 63, 15 och 25 så blir medianen istället 20 (15 + 20 / 2). Skriv en metod som tar emot en array av heltal som en parameter och returnerar medianen.

TIPS! Tänk på att arrayen först och främst bör sorteras i storleksordning. Uppgift 23, SortArray, under sektionen “Iteration/arrayer” kan nyttjas för detta syfte. Efter detta så kan vi antingen enkelt plocka ut värdet i mitten (om arrayen består utav ett udda antal element) eller så behöver vi identifiera de två mittenvärden som finns i arrayen och utföra beräkningen enligt ovan exempel.
Uppgift 15 StringFormat (Enkel/Medel)
Beskrivning Skriv en metod, StringFormat som tar emot en array av strängar och skriver ut samtliga strängar i arrayen enligt nedan format:

Om arrayen innehåller [apples, oranges] så får vi: apples and oranges
Om arrayen istället innehåller flera strängar t.ex. [apples, oranges, bananas] så får vi istället: apples, oranges and bananas

TIPS! Nyttja metoden string.Split.
Uppgift 16 Tillägg till array (Enkel/Medel)
Beskrivning Skriv en metod, AddInOrder, som tar emot en array av heltal samt ett heltal, lägger till heltalet i arrayen och sedan returnerar arrayen. Heltalet ska placeras i korrekt ordning i arrayen. Om heltalet redan förekommer i arrayen så ska tillägget inte ske. OBS! Metoden kan föreutsätta att arrayen redan är placerad i storleksordning, men du får självfallet nyttja en sorteringsalgoritm om du vill utöka metoden själv.
Uppgift 17 AlternateMerge (Medel)
Beskrivning Skriv en metod, AlternateMerge, som tar emot två arrayer av heltal och returnerar en array som innehåller samtliga element från resp. array. Elementen ska dock placeras i turordning där vi först tar elementet på position 0 i den första arrayen följt av elementet på position 0 i den andra arrayen osv. Dvs. att givet arrayen [3, 5, 10, 2, 6] och [8, 1, 4, 12, 7] så skulle följande array returneras: [3, 8, 5, 1, 10, 4, 2, 12, 6, 7].
Uppgift 18 Beräkning av heltal (Medel)
Beskrivning Skriv en metod som läser in ett godtyckligt antal positiva eller negativa tal från användaren. Metoden ska sedan räkna ut antalet positiva resp. negativa tal. För att avsluta inmatningen så ska användaren ange "e". Metoden ska då avslutningsvis skriva ut antalet positiva och negativa tal. Exempel på interaktion med metoden:
Körexempel
1
-4
-1
0
6
12
e
Antal positiva tal: 3
Antal negativa tal: -2
                
NOTERA att "0" inte ska tillgodoräknas som ett positivt eller negativt tal. TIPS! Nyttja en while-loop för att läsa in heltal från användaren.
Uppgift 19 Beräkning av SGD (Medel)
Beskrivning Den största gemensamma delaren (SGD) för ett antal heltal är det största heltalet som talen kan delas med utan att ge någon rest. Exempelvis är SGD(6, 9) = 3 då 3 är det största talet som är delbart med både 6 och 9. Skriv en metod som beräknar och returnerar den största gemensamma delaren för två heltal.

För att läsa mer om SGD och se mer utförliga exempel på hur processen går till så kan följande länk nyttjas: SGD med Euklides algoritm. TIPS! Nyttja modulus för att avgöra huruvida divisionen resulterar i rest kombinerat med iteration för att identifiera SGD.
Uppgift 20 Teckenbyte (Medel)
Beskrivning Skriv en metod som kan läsa in flera textrader från användaren och byta ut varje förekomst av tecknet "O" till tecknet "Ö" resp. "o" till "ö". Metoden ska läsa in en rad i taget varvid metoden sedan ska presentera raden med de teckenbyten som har skett för att sedan läsa in nästa rad. Denna process ska upprepas tills dess att användaren anger "EXIT". Exempel på interaktion med metoden kan tänkas se ut enligt följande:

Körexempel
Input: Mors lilla Olle i skogen gick.
Output: Mörs lilla Ölle i skögen gick.
Input: Om vädret är fint så kommer Ofelia på festen.
Output: Öm vädret är fint så kömmer Öfelia på festen.
Input: EXIT
        
Uppgift 21 RotateArrayBy2 (Medel/Svår)
Beskrivning Skriv en metod, RotateArrayBy2, som tar emot en array av heltal och roterar elementen i en array med 2 positioner åt vänster. Dvs. att givet arrayen [3, 5, 10, 2, 6] så skulle följande array returneras: [10, 2, 6, 3, 5]. OBS! Skriv din implementation utan att deklarera en ny array.
Uppgift 22 "String slicing" (Medel/Svår)
Beskrivning Skriv en metod som tar emot en sträng samt ett heltal (n) och returnerar alla angränsande delsträngar (substrings) av längden n i den ordning som de anges. Exempel på interaktion med metoden:
Körexempel
// Givet strängen "49142" och heltalet 3 så får vi följande delsträngar:
"491"
"914"
"142"

// Givet strängen "49142" och heltalet 3 så får vi följande delsträngar:
"4914"
"9142"
                
Notera att längden på delsträngarna måste vara större än 1 och att de självfallet inte kan vara längre än själva strängen. TIPS! Nyttja de inbyggda sträng-metoderna Concat samt Substring.
Uppgift 23 Decimal to binary (Medel/Svår)
Beskrivning Skriv en metod, DecToBin, som översätter ett heltal enligt det decimala talsystemet till det binära talsystemet. Det decimala talsystemet är det som vi nyttjar till vardags med basen 10 (0-9). Det binära talsystemet nyttjar istället basen 2 där något antingen är av eller på (0 eller 1). Således får vi exempelvis 1010 om vi översätter 10, 1100100 om vi översätter 100 osv. NOTERA att ju längre något är till vänster i ett binärt tal, desto större är det. I 1010 så har vi 8, 4, 2, 1 där 1:orna indikerar de värden som ska tillgodoräknas (i detta fall 8:an och 2:an för 10).

Om du vill läsa mer om hur man konverterar från det decimala talsystemet till det binära så kan du nyttja följande länk: Dec to binary. Om du vill nyttja en redan existerande konverterare så kan du kika på följande länk: Dec/Bin Converter.

TIPS! Nyttja iteration och modulus. Uppgiften skall lösas utan den inbyggda metoden Convert.ToString.
Uppgift 24 Tidsberäkning av tågresor (Medel/Svår)
Beskrivning Ett persontågsföretag vill ha ett program (en metod i detta fall) för att underlätta tidsberäkningen av tågresor med syftet att upprätta en tidtabell. Metoden ska läsa in avgångsort, avstånd mellan avgångsorten och destinationen samt datum och klockslag för avgång. Därefter ska metoden räkna ut vilket datum och vilken tid tåget kommer till destinationen. Tågets genomsnittliga hastighet är 130 km/h.

TIPS! Nyttja SVT-triangeln för att beräkna tiden (givet hastigheten och avståndet). Datatypen DateTime kan nyttjas för att enklare behandla datum och klockslag, men det krävs då att man utforskar lite vad datatypen har att erbjuda på egen hand. Det är dock fullt möjligt att nyttja strängar istället. Följande länk kan nyttjas för att få en inblick i DateTime: DateTime
Uppgift 25 Textmarkering (Medel/Svår)
Beskrivning Skriv ett program som läser in en sträng med valfri text. Programmet ska därefter markera alla förekomster av tecknet “å” genom att skriva ut texten igen och på raden under skriva ett * för varje förekomst av tecknet (“å”). Exempelvis kan interaktion med programmet se ut enligt följande:
Körexempel
        Svenska äpplen och fem året runt-äpplen
                               * 
        
b. Utöka programmet så att det även markerar “ä”. Skriv även här ut tecknet *.

c. Utöka programmet ytterligare så att det istället för att skriva * för “å” och “ä” skriver tecknet * för “å” och tecknet % för “ä”.
Uppgift 26 Summera individuella siffror i ett heltal (Medel/Svår)
Beskrivning Skriv en metod som summerar samtliga siffror i ett heltal och returnerar summan. Om metoden exempelvis tar emot heltalet 1234 så ska 10 returneras. Uppgiften ska lösas utan att konvertera heltalet till en sträng.

TIPS! Nyttja division och det decimala talsystemet för att “hoppa” en decimal i taget och summera dessa allt eftersom. Dvs. att vi från 1234 först plockar ut 4:an vilket lämnar oss med 123, därefter plockar vi ut 3:an osv.
Uppgift 27 IsInteger (Medel/Svår)
Beskrivning Skriv en metod, IsInteger som tar emot en sträng och avgör om strängen representerar ett riktigt heltal. Metoden ska ignorera mellanslag men behöver kunna hantera +-tecken och --tecken.

TIPS! Metoden char.IsDigit kan nyttjas för att avgöra om ett tecken representerar en siffra eller ej.
Uppgift 28 Begynnelsebokstäver (Medel/Svår)
Beskrivning Skriv en metod som skriver ut alla begynnelsebokstäver i en mening. Med begynnelsebokstäver så avses det första bokstaven i resp. ord i en mening. Exempel på interaktion med metoden:
Körexempel
// Input
Datorerna Synes Vänliga och Programmen Slutar Vårdslöst.

// Output
D S V o P S V
        
Uppgift 29 En bättre sökalgoritm (Svår)
Beskrivning I introduktionen till sektionen “Iteration/Arrayer” så beskrivs en enkel sökalgoritm för att identifiera ett heltal i en array av heltal. Denna typ av sökalgoritm är dock väldigt ineffektiv då vi ev. måste iterera igenom hela arrayen innan vi kan fastställa om heltalet förekommer eller ej. Denna uppgift går således ut på att skriva en mer effektiv sökalgoritm. Processen för denna sökalgoritm kan beskrivas enligt nedan:

1. Kontrollera om elementet förekommer i mitten av arrayen.
2. Om det inte förekommer i mitten, är heltalet vi söker efter större än eller mindre än heltalet i mitten?
Om det är mindre -> Upprepa sökningen, fast denna gång enbart från det första elementet till och med elementet till vänster om mittenvärdet.
Om det är större -> Upprepa sökningen, fast denna gång enbart från det elementet till höger om mittenvärdet till och med det sista elementet i arrayen.
3. Upprepa processen tills vi har identifierat heltalet eller tills dess att vi kan fastställa att det inte förekommer i arrayen. OBS! Metoden förutsätter att arrayen redan är placerad i storleksordning.

Skriv en metod, AvSearch, som tar emot en array av heltal samt ett heltal. Metoden ska därefter identifiera om heltalet förekommer i arrayen eller ej. TIPS! För att fastställa att talet inte förekommer i arrayen så är det fördelaktigt att ständigt uppdatera ramen som vi vill undersöka. Om vi t.ex. i första iterationen ser att talet tillhör den vänstra delen av arrayen så kan vi ändra vårt “max-värde” (inledningsvis det sista elementet i arrayen) till mittenvärdet -1. Därefter så fortsätter vi att iterera tills dess att vårt “min-värde” (inledningsvis det första elementet i arrayen) är större än eller lika med vårt “max-värde”. , men du får självfallet nyttja en sorteringsalgoritm om du vill utöka metoden själv.
Uppgift 30 RemoveDuplicates (Svår)
Beskrivning Skriv en metod, RemoveDuplicates, som tar emot en array av heltal. Metoden ska sedan ta bort alla duplicerade värden i arrayen. Dvs. att givet exempelvis arrayen: [6, 6, 3, 3, 1, 9, 4] så ska en array med värdena [6, 3, 1, 9, 4] returneras.

Testa först att skriva en implementation som ersätter alla duplicerade värden med 0:or snarare än att ta bort elementet från arrayen (reducera dess storlek). När du har lyckats med en sådan implementation så kan du sedan ge dig på den mer avancerade versionen som även reducerar arrayens storlek.

TIPS! Du kan nyttja implementationen från Uppgift 24 (IsDuplicate) under sektionen “Iteration/Arrayer” samt en ytterligare stödmetod som reducerar storleken på arrayen genom att ta bort ett angivet heltal från arrayen. Tänk i detta fall då på att inte ta bort alla förekomster av heltalet (vi vill exempelvis behålla en utav 6:orna i ovan exempel).

NOTERA att datastrukturen array ska nyttjas, inte ArrayList, List eller liknande datastrukturer. Det kan ev. dock vara fördelaktigt att reflektera kring inbyggda metoder för dessa andra typer av datastrukturer såsom Append, Add och Remove.

Feedback

OBS! All feedback är välkommen, men försök gärna att vara så tydlig och konstruktiv i din feedback som möjligt. För att uppnå denna tydlighet så ber vi dig att inleda din feedback på två olika sätt:

Om din feedback avser ett problem med innehållet på sidan så ska feedbacken inledningsvis inkludera följande: Vilken sektion problemet har identifierats inom samt vilken uppgift som avses. Ett exempel på en sådan inledning skulle kunna tänkas vara:
"Sektion: 2
Uppgift: 4
..."

Om din feedback istället avser t.ex. förbättringsförslag för hemsidan (utseendemässigt, innehållsmässigt eller i förhållande till navigationen) så ska feedbacken inledas enligt nedan:
"Övrig feedback
..."