4 Sekvens

Sekvenser i pseudokod skrivs helt enkelt som instruktioner, rad för rad. I strukturdiagrammen representeras varje rad av en box och dessa förbinds med streck. Till exempel kan algoritmbeskrivningen för att addera två tal se ut såhär:

start
    läs in tal1
    läs in tal2
    summa = tal1 + tal2
    skriv ut summa
slut

Addera två tal som strukturdiagram.

4.1 Sekvens i C#

Som vi ser i exemplet ovan är en sekvens ingen specifik instruktion utan snarare en instruktioner generellt. Motsvarigheten till detta i C# blir då en kodrad (eller ett kodblock). Men för att vi ska bekanta oss med några vanliga, grundläggande C#-sekvenser så tittar vi på ett par specifika sådana här. Tänk på att varje sats skall avslutas med semikolon (;).

  • Läsa in: Console.ReadLine();
  • Läsa in och spara värde: var variabelnamn = Console.ReadLine();
  • Skriva ut text: Console.Write("Texten som ska skrivas");
  • Skriva ut text med avslutande radbrytning: Console.WriteLine("Texten som ska skrivas");
  • Skriva ut värde av variabel: Console.Write(variabelnamn); / Console.WriteLine(variabelnamn);
  • Tolka ett inmatat värde som heltal: var tal = int.Parse(inmatatVarde);

Att genomföra beräkningar med de fyra vanliga operatorerna (+, -, *, /) är inga problem så länge man har korrekta datatyper. Tänk dock på att tilldelning sker åt vänster i programspråket, t.ex. så genomför datorn följande sats var kraft = massa * 9.82 i dessa steg:

  1. Hämta värdet som finns lagrat i variabeln massa.
  2. Beräkna högerledet.
  3. Tilldela resultatet av beräkningen till variabeln i vänsterledet.

4.2 Övningar

Beskriv följande som algoritmer i form av både strukturdiagram och pseudokod. Implementera sedan algoritmerna i C#. Du kan anta att samtliga inlästa tal är heltal.

  1. Läs in två tal och beräkna produkten.
  2. Läs in två tal, a och b. Skriv sedan ut differensen a-b och b-a.
  3. Omvandla en tidsangivelse i timmar, minuter och sekunder till endast sekunder.
  4. Beräkna arean av en kub. Läs in längden på en av kubens sidor och skriv ut arean.
  5. Beräkna volymen av ett rätblock. Läs in nödvändiga värden och skriv ut volymen.

4.3 Variabler, datatyper och in/utmatning

Nyckelordet var som vi hittills använt för variabler är egentligen en speciallösning. Det används när variabeln man tänker använda är av okänd typ eller behöver anpassa sig på något sätt. Om man vet om vilken datatyp man ska hantera (vilket vi nästan alltid gör) så bör man specifikt ange den faktiska datatypen och därmed undvika var, även om det faktiskt fungerar.

4.3.1 Vanliga, enkla datatyper

I C# finns en hel del olika datatyper som kan lagra olika data. Några av dem är:

  • short: heltal mellan -32768 och 32767
  • int: heltal \(\pm 2 * 10^9\)
  • long: heltal \(\pm 9 * 10^{18}\)
  • float: decimaltal med 7 gällande siffror
  • double: decimaltal med 15 gällande siffror
  • char: ett tecken
  • string: text (sträng av tecken)
  • bool: true eller false

Det är dock ganska vanligt att man nöjer sig med att använda int, double, char, string och bool. På så vis blir det inte så jättemycket att lära sig.

Några saker att tänka på för vissa datatyper i C#:

  • I källkoden används punkt som decimaltecken och inte komma.
  • Värdet på strängar string skall alltid starta och sluta med citattecken ("). string text = "Hej"; är korrekt men string text = Hej; genererar ett fel.
  • Tecken omringas av single quote ('), t.ex: char tecken = 'a';
  • Datatypen bool kan endast lagra värdena true eller false och dessa ska ej omringas av citattecken.

4.3.2 Variabelnamn

Du kan namnge dina variabler nästan hur du vill men det finns några regler man inte kan bryta mot. Variabelnamn i C# får ej

  • Innehålla mellanslag
  • Börja på ett tal

Dessutom är det några regler man kan men inte bör bryta mot. Man bör

  • Låta sina variabelnamn börja på liten bokstav.
  • Ha tydliga, beskrivande namn på sina variabler.
  • Undvika åäö.
  • Ange stor bokstav vid nytt ord, t.ex: antalPoang och inte antalpoang eller antal_poang.

4.3.3 Deklaration och tilldelning

När en variabel “skapas” så kan det genomföras på två olika sätt. Processen delas upp i två viktiga begrepp: deklaration och tilldelning. Att deklarera en variabel är att säga åt datorn att “den här variabeln skall finnas och den ska vara av den här typen” men den får inget värde eftersom att vi inte lagrar någonting i den direkt. En delkaration består endast av datatyp variabelnamn;. Till exempel:

int antal;

eller

double temperatur;

Tills dess att variabeln har tilldelats ett värde (med =) har den “standardvärdet”/tomma värdet vid namn null. Om en variabel är deklarerad och skall tilldelas ett värde ska datatypen ej anges igen. T.ex:

antal = 5;

eller

temperatur = 27.6;

Många gånger vet man direkt vid deklarationen av en variabel vilket värde den skall tilldelas. Då kan man slå ihop deklaration och tilldelning på en och samma rad och istället utföra en så kallad initialisering. Då ser det helt enkelt ut såhär:

int antal = 5;

Algoritmen för att addera två tal från förra kapitlet skulle med andra ord kunna se ut på minst två olika sätt i C#:

string inlasning;
inlasning = Console.ReadLine();
int tal1;
tal1 = int.Parse(inlasning);
inlasning = Console.ReadLine();
int tal2;
tal2 = int.Parse(inlasning);
int summa;
summa = tal1 + tal2;
Console.WriteLine(summa);
string inlasning = Console.ReadLine();
int tal1 = int.Parse(inlasning);
inlasning = Console.ReadLine();
int tal2 = int.Parse(inlasning);
int summa = tal1 + tal2;
Console.WriteLine(summa);

4.3.4 Inläsning

Lägg märke till raden string inlasning = Console.ReadLine(); i exemplet ovan. Där vi tidigare använde var använder vi nu string - den egentligen datatypen vid inläsning från konsoll. Resultatet är dock detsamma, en variabel av typen var blir en string när koden faktiskt körs. Men om vi deklarerar eller initialiserar med string från början så har vi bättre koll på våra typer även i resten av källkoden.

Med andra ord kan du från och med nu ta förvana att alltid använda string när du skall läsa in från konsollen.

4.3.5 Typomvandling

Typomvandling är egentligen något du redan stött på. Varje gång vi läser in från konsollen har vi fått data i form av en text/sträng (string) men har sedan använt den i heltalsberäkningar. Med andra ord är det en typomvandling vi har gjort när vi använt funktionen/metoden int.Parse();.

För alla datatyperna utom string, dvs. int, double, char, bool så finns en .Parse()-funktion som omvandlar till just den datatypen (om så är möjligt). Det kan med andra ord se ut såhär:

string inlasning = Console.ReadLine();
int heltal = int.Parse(inlasning);
double decimaltal = double.Parse(inlasning);
char tecken = char.Parse(inlasning);
bool santEllerFalskt = bool.Parse(inlasning);

Om man istället vill omvandla från en datatyp till en textsträng så finns en funktion .ToString() som kan köras på alla variabler. Man skriver helt enkelt bara variabelnamn.ToString();. Ska man till exempel lagra ett tal som text kan man skriva:

int tal = 27;
string talSomText = tal.ToString();

4.3.6 Enkla beräkningar

Precis som tidigare nämnt så är det inga konstigheter med att använda de fyra vanliga räkneoperatorerna. Addition, subtraktion och multiplikation fungerar precis som tänkt. Division däremot kan tyckas bete sig lite underligt om man inte är uppmärksam på heltal och decimaltal. Exempelvis så resulterar den här kodraden i svaret 0.

Console.WriteLine(4 / 5);

Vilket är rätt endast om vi bara tar hänsyn till heltal. Hade vi tänkte oss ett svar i decimalform är det ju felaktigt. För att ett svar skall skrivas i decimalform måste en av siffrorna som ingår i beräkningen skrivas på decimalform. Med andra ord skulle nedanstående rad ge ett annat resultat.

Console.WriteLine(4 / 5.0);

Om resultatet ska lagras i en variabel istället för att skrivas ut direkt måste denna vara av typen double.

4.3.7 Utmatning

Hittills har vi gjort utmatningar med endast variabelvärden eller text. Inte både ock. För att åstadkomma detta är det några saker man ska vara noga med att inte göra fel på. Låt säga att vi ska skriva ett program som läser in ålder och sedan skriver ut texten “Min ålder är” tillsammans med siffran man matat in. Då skulle det kunna se ut såhär (koden för inläsning har uteslutits, istället används en variabel för ålder direkt):

int alder = 18;
Console.WriteLine("Min ålder är: " + alder);

Additionstecknet i det här fallet innebär att texten “Min ålder är:” skall slås i hop med värdet av variabeln alder. När en text slås ihop med en variabel av annan typ tolkas alltid variabeln om (automatiskt) till textformat (som om man kört .ToString() på den) och resultatet blir att en text följs av en annan. Med andra ord kan man tänka sig att det som faktiskt står i kod är:

Console.WriteLine("Min ålder är: " + "18");

Additionstecknet mellan text kallas för konkatenering. Ihopslagning av strängar helt enkelt. Om det inte är en sträng med i bilden och det istället handlar om ett additionstecken mellan två int i vår WriteLine-rad så utförs den faktiska beräkningen och resultatet av denna skrivs ut. Det här kodstycket skulle med andra ord skriva ut 5.

int tal = 3;
Console.WriteLine(tal + 2);

Vi har använt Console.WriteLine() och Console.Write() för att göra utskrifter med respektive utan radbrytning. Om man vill göra en radbrytning mitt i en utskrift (utan att behöva skriva en ny kodrad) kan man använda sig av \textbackslash n - dessa två tecken tillsammans tolkas som ett tecken som skrivs ut som radbrytning. Man kallar det för newline-tecken men läser ofta ut det som backslash n. Vi kan alltså skriva Console.Write("Erik \textbackslash n Dahlberg") i C# för att göra en utskrift med Erik på en rad och Dahlberg på nästa. Ett liknande tecken kan användas för att skriva ut ett indrag (tab). Då använder man istället \textbackslash t.

4.4 Övningar

Lös följande övningar i tre steg: Strukturdiagram, pseudokod och sedan i C#.

  1. Omvandla grader Celsius(läs in) till grader Fahrenheit och skriv ut resultatet. (Formeln är F = 1,8 * C + 32)
  2. Beräkna en cirkels omkrets och area med hjälp av radiens längd.
  3. Beräkna en försäljares månadslön. Försäljaren har en grundlön på 15 000 kr i månaden. Dessutom tillkommer 8 % på försäljningssumman(läs in).

Uppgifterna nedan behöver du bara lösa i C#, varken strukturdiagram eller pseudokod behövs.

  1. Skriv ett program där man kan mata in tre heltal av typen int och beräkna summan och medelvärdet av talen.

Körningsexempel för medelvärdesprogrammet.

  1. Skriv ett program för en uttagsautomat där man kan skriva in ett belopp, och som visar hur stort uttag man gjorde. Vi antar att automaten bara har hundralappar, så om man skriver till exempel 670 ska det skrivas ut ”Uttag: 600 kr”.
  2. Det blir lite svårare om automaten även har 500-lappar. Utöka programmet i uppgift 10 så att automaten svarar så här istället (om man skriver in 670): Uttag i 500-sedlar: 500 kr. Uttag i 100-sedlar: 100 kr.
  3. Du känner förmodligen igen sifferleken nedan. Man ber en kompis tänka på ett tal, addera 1 och så vidare. Till slut talar man om för kompisen vilket tal han kommit fram till, och om det är första gången kompisen hör sifferleken undrar han kanske hur du kunde veta det. Tänk på ett heltal. Addera 1. Multiplicera med 2. Subtrahera 6. Halvera. Addera 3. Subtrahera talet du tänkte på. Nu har du fått talet 1! Gör ett program där man kan mata in ett tal. Provkör med några olika tal. Om du gjort rätt ska resultatet alltid bli 1.
  4. Gör ett program som omvandlar ett bråktal till blandad form. Man ska kunna skriva in en täljare och en nämnare och trycka på en knapp. Om användaren till exempel skriver in 5 och 3 ska resultatet visas som ”5/3 blir 1 2/3 i blandad form.”