Teoritenta 2019 Flashcards

1
Q

Vad returnerar metoden nedan om man anropar den med: Print(“Hello world!”); ?

static void Print(string s)
{
Console.WriteLine(s);
}

● Hello world!
● Ingenting
● s
● Metodanropet fungerar inte eftersom att s inte är detsamma som “Hello world!”

A

Ingenting - metoden är void

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Hur vet man vad en metod ska returnera?

● Metodsignaturen innehåller informationen om vad som ska returneras.
● Metodens parametrar anger typen för vilken datatyp som returneras.
● Returtypen anges framför metodsignaturen.
● En metod returnerar den datatyp som anges i metodens return-statement.

A

Returtypen anges framför metodsignaturen.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

När kan man använda implicit typomvandling?

● När datatyperna är likadana.
● När det inte föreligger risk för informationsförlust.
● Detta görs automatiskt i samband med att en metod returnerar ett värde.
● Detta kan alltid göras vid behov när man behöver konvertera från en datatyp till en annan.

A

När det inte föreligger risk för informationsförlust.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Vad skriver följande metod ut?

static void P1()
{
     char c = 'l';
     string s = c.ToString();
     string s1 = "Programmering är kul" + c;
     Console.WriteLine(s1);
}

● Programmering är kul
● Programmering är kulc
● Programmering är kull
● Programmering är kuls

A

Programmering är kull

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Vilka tal skriver följande metod ut?

static void P2()
{
     int i = 1, j = 5;
     do
     {
           Console.WriteLine(i *= j);
     } while (i <= 10);
}

● 5 30
● 5 11 16 21 26 31 36 41 46 51
● 5 25
● 5 10 15 20 25 30 35 40 45 50

A

5 25

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Vad blir utskriften när följande metod körs?

static void P3()
{
     int i, s = 0;
     for (i = 1; i <= 10; s = s + i, i++)
     {
     }
     Console.WriteLine(s);
}

● 55
● Det blir en oändlig loop så programmet kraschar.
● 0 1 3 6 10 15 21 28 36 45
● Koden genererar ett felmeddelande.

A

55

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Givet metoden nedan, vilket metodanrop kommer att returnera true?

static bool P4(int a, int b, int c) {
     if (a > b || b != c && a + b > c + b)
     {
          return true;
     }
     return false;
}

● P4(1, 2, 1)
● P4(1, 3, 2)
● P4(3, 4, 1)
● P4(4, 5, 6)

A

P4(3, 4, 1)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Vilken av följande är en logisk operator i C#?

● ==
● >=
● =
● !
● !=
A

!

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Vad skrivs ut när metoden nedan anropas med:
Console.WriteLine(P1(new char[] {‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’ }));

static string P5(char[] arr)
{
     int i = 0;
     string s = "";
     foreach (char c in arr)
     {
          i++;
          string t = new string(arr);
          s = t;
     }
     return s;
}

● 7
● ‘a’ ‘b’ ‘c’ ‘d’ ‘e’ ‘f’ ‘g’
● abcdefg
● Det skrivs ut en tom sträng

A

abcdefg

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

När man itererar över en array händer det att man får ett s.k. IndexOutOfRangeException.
Vad beror det på?

● Arrayen tar upp för mycket av datorns minne så den kan inte längre läsa in nya tal.
● Det är datorns sätt att indikera att man försöker använda flera arrayer.
● Man försöker läsa från en indexposition som inte finns representerad i arrayen.
● Detta fel genereras om det högsta indexet i arrayen inte är det samma som längden av arrayen minus 1.

A

Man försöker läsa från en indexposition som inte finns representerad i arrayen.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Fråga 11
1/3

Beskriv övergripande vad resp. metod (A1, A2) nedan gör. Dvs. funktionen som resp. metod
förväntas utföra.

static int[] A1(int[] x)
{
     for (int i = 0; i < x.Length; i++)
     {
          if (x[i] == 0)
          A2(x, i);
     }
     return x;
}
static void A2(int[] x, int index)
{
     for (int i = index; i < x.Length - 1; i++)
     {
          int temp = x[i];
          x[i] = x[i + 1];
          x[i + 1] = temp;
     }
}
A

Fråga 11
1/3

A1: Tar emot en int[]. For-loopen loopar så många gånger som int-arrayen x är lång med i som temporär variabel som ökar med 1 varje gång, från 0 till längen av x -1. I forloopen kollas värdet på indexpositionen ‘i’ i arrayen x om det är == 0 (jämför om det har värdet 0). Om detta stämmer och if-satsen blir sann kallas metoden A2 som skickar in variablerna x och i. Efter loopen returneras x. Kort sagt, kollar om värdet är 0 på varje indexposition i arrayen och om ett tal är 0 skickas indexposition och arrayen till A2- metoden.

A2: Tar emot int[] x och int index(tidigare i i föregående metod). Alltså en int array och en int (som ska representera en indexposition där x[index] == 0). For-loopen som skrivs börjar på värdet i = index , och körs så länge i är mindre än längden av strängen -1. Notera att loopen slutar när i är på näst sista indexpositionen i arrayen. I forloopen sparas värdet på x[i] i en temporär variabel som kallas temp. x[i] får värdet x[i+1], alltså platsen framför det första talet. Till sist sätts x[i+1] till värdet av temp. De byter alltså plats. När sedan i ökar med 1 kommer samma sak ske . Det som händer till sist är att nollan (som vi vet att det är på x[i] under första loopen) kommer förflyttas till höger, till högsta indexpositionen.

Exempel:
loop 1: 1,5,0,7,8,9
loop 2: 1,5,7,0,8,9
loop 3: 1,5,7,8,0,9
loop 4: 1,5,7,8,9,0

Metoderna kommer alltså tillsammans hitta indexpositioner där x[i] == 0 och förflytta de nollorna som hittas till slutet av arrayen, alltså x[x.Length-1].

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Fråga 11
2/3

Vad kommer arr att innehålla om metoden anropas enligt följande metodanrop:

int[] arr = A1(new int[] { 4, 5, 6, 7, 8, 0 });

static int[] A1(int[] x)
{
     for (int i = 0; i < x.Length; i++)
     {
          if (x[i] == 0)
          A2(x, i);
     }
     return x;
}
static void A2(int[] x, int index)
{
     for (int i = index; i < x.Length - 1; i++)
     {
          int temp = x[i];
          x[i] = x[i + 1];
          x[i + 1] = temp;
     }
}
A

Fråga 11
2/3

arr = {4,5,6,7,8,0) sista värdet som itereras över är den näst sista indexpositionen, inget kommer hända (index out of range).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Fråga 11
3/3

Vad kommer arr att innehålla om metoden anropas enligt följande metodanrop:

int[] arr = A1(new int[] { 0, 4, 5, 0, 6, 7, 8, 3, 1 });

static int[] A1(int[] x)
{
     for (int i = 0; i < x.Length; i++)
     {
          if (x[i] == 0)
          A2(x, i);
     }
     return x;
}
static void A2(int[] x, int index)
{
     for (int i = index; i < x.Length - 1; i++)
     {
          int temp = x[i];
          x[i] = x[i + 1];
          x[i + 1] = temp;
     }
}
A

Fråga 11
3/3

arr = { 4, 5, 6, 7, 8, 3, 1, 0, 0}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Fråga 13
1/2

Beskriv kortfattat och övergripande hur metoden Sub fungerar. Dvs. dels vad som sker i metoden och dels den övergripande funktionen som Sub förväntas utföra.

static void M6(string value)
{
for (int i = 1; i < value.Length; i++)
{
for (int j = 0; j <= value.Length - i; j++)
{
string partOf = Sub(value, j, i);
Console.Write(partOf + “ “);
}
}
}

static string Sub(string input, int start, int length)
{
     string result = "";
     if (input.Length >= start + length)
     {
          for (int i = start; i < length + start; i++)
          {
               result += input[i];
          }
     }
     return result;
}
A

Fråga 13
1/2

Teknisk funktionalitet = Sub är en metod som tar emot en string och två heltal (start och length). I metoden skapas sedan en tom string (result), därefter formuleras en if-sats som säger att om längden av strängen “input” är större, eller lika med, heltalet start adderat med heltalet length så ska en for-loop initieras som itererar över samtliga värden mellan start och samtliga heltal mindre än length+start (ökar med ett 1 för varje iteration).

För varje värde på i adderas sedan i for-loopen det som återfinns i stringen input på indexpositionen i till strängen result. Efter att funktionen har loopat över samtliga värden returneras sedan den nya strängen result.

Övergripande syfte = Metoden Sub är avsedd att ta emot en sträng samt två värden som representerar den första indexplatsen som ska itereras över och hur många iterationer som
ska utföras. Sedan adderar den innehållet från den givna strängen från och med den angivna indexpositionen till den nya strängen result, tills dess att antalet avsedda iterationer har utförts.

Den skapar alltså en ny sträng från och med en viss indexposition från den tidigare strängen, fram till en viss indexposition i den gamla strängen.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Fråga 13
2/2

Vad kommer att skrivas ut, och hur kommer utskriften att se ut, om metoden M6 anropas enligt nedan metodanrop?

M6(“abcd”);

static void M6(string value)
{
for (int i = 1; i < value.Length; i++)
{
for (int j = 0; j <= value.Length - i; j++)
{
string partOf = Sub(value, j, i);
Console.Write(partOf + “ “);
}
}
}

static string Sub(string input, int start, int length)
{
     string result = "";
     if (input.Length >= start + length)
     {
          for (int i = start; i < length + start; i++)
          {
               result += input[i];
          }
     }
     return result;
}
A

Fråga 13
2/2

“a b c d ab bc cd abc bcd”

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Fråga 14
1/5

Vilka värden kommer att skrivas ut för a respektive b när metoden körts givet följandemetodanrop:

P6(3,1)

static void P6(int a, int b) {
     if(a > b) {
     int t = a; a = b; b
     = t; }
     switch (a - b)
     {
          case -1:
          a++; b++; break;
          case 2:
          a--; b++; break;
          default:
          a += 3; b += a; break;
     }
     Console.WriteLine("a = " + a + " b = " + b);
}
A

Fråga 14
1/5

a = 4, b = 7. Finns inget scenario för case -2, så default kommer åberopas och därmed ge a värdet 4 (3+1) och b värdet 7 (3+4).

17
Q

Fråga 14
2/5

Beskriv och förklara syftet med if-satsen i implementationen av metoden P6.

static void P6(int a, int b) {
     if(a > b) {
     int t = a; a = b; b
     = t; } switch (a -
     b)
     {
          case -1:
          a++; b++; break;
          case 2:
          a--; b++; break;
          default:
          a += 3; b += a; break;
     }
     Console.WriteLine("a = " + a + " b = " + b);
}
A

Fråga 14
2/5

If-satsen i metod P6 kontrollerar att värdet av a är större än värdet av b. Om det är sant byter den (genom en temporär variabel t) värdet på a och b. Detta utförs i syfte om att säkerställa att när metoden fortlöpt till switchen så kommer a vara mindre än b. Det fungerar utmärkt eftersom att om villkoret inte uppfylls och a redan är mindre än b så behöver inte
denna funktion utföras för att säkerställa storleksordningen av variablerna.

Därmed behöver det i switchen inte återfinnas några scenarion där ett positivt värde ges som input. I det här fallet så finns dock detta case (Case 2) vilket då inte fyller någon som helst funktion.

18
Q

Fråga 14
3/5

Vad händer när vi når nyckelordet break; för exempelvis case -1?

static void P6(int a, int b) {
     if(a > b) {
     int t = a; a = b; b
     = t; } switch (a -
     b)
     {
          case -1:
          a++; b++; break;
          case 2:
          a--; b++; break;
          default:
          a += 3; b += a; break;
     }
     Console.WriteLine("a = " + a + " b = " + b);
}
A

Fråga 14
3/5

När vi når break; så kommer programmet att “hoppa” fram till slutet av switch-satsen och därmed skriva ut det resultat som erhållits i case:t. Rent generellt så innebär break; att man avslutar loopen / switchen när break; anträffas.

19
Q

Fråga 14
4/5

Uttryck som –, ++ och += är förkortningar för ofta utförda operationer. Vad innefattar egentligen: b += a, om man skriver ut det i sin helhet?

A

Fråga 14
4/5

Utvecklar man uttrycket blir det “b = b +a”, det vill säga att b är summan av b, med a adderat till den.

20
Q

Fråga 14
5/5

I C# pratar man om metodsignatur, skriv ut metodsignaturen för metoden.

static void P6(int a, int b) {
     if(a > b) {
     int t = a; a = b; b
     = t; } switch (a -
     b)
     {
          case -1:
          a++; b++; break;
          case 2:
          a--; b++; break;
          default:
          a += 3; b += a; break;
     }
     Console.WriteLine("a = " + a + " b = " + b);
}
A

Fråga 14
5/5

Det är namnet, p6 samt vilka variabler (hur många och vilken typ) som tas emot. I detta fall två integers.

21
Q

Fråga 15
1/3

Vad skrivs ut om man anropar metoden med metodanroptet:

P7(2, 4);

static void P7(int a, int b)
{
     int counter = 0;
     if (a < b && b != a + a)
     {
           counter++;
     }
     if (a == b || b >= a)
     {
          counter = counter + 2;
     }
     if (b <= a && a%2 == 0)
     {
          counter = counter - a;
     }
     Console.WriteLine(counter);
}
A

Fråga 15
1/3

2

22
Q

Fråga 15
2/3

Vad skrivs ut om man anropar metoden med metodanroptet:

P7(3, 7);

static void P7(int a, int b)
{
     int counter = 0;
     if (a < b && b != a + a)
     {
           counter++;
     }
     if (a == b || b >= a)
     {
          counter = counter + 2;
     }
     if (b <= a && a%2 == 0)
     {
          counter = counter - a;
     }
     Console.WriteLine(counter);
}
A

Fråga 15
2/3

3

23
Q

Fråga 15
3/3

I implementationen för P7 finns tre if-satser. Det är inte ovanligt att man bygger ihop if-satser med else if. Förklara skillnaden mellan dessa två tillvägagångssätt.

static void P7(int a, int b)
{
     int counter = 0;
     if (a < b && b != a + a)
     {
           counter++;
     }
     if (a == b || b >= a)
     {
          counter = counter + 2;
     }
     if (b <= a && a%2 == 0)
     {
          counter = counter - a;
     }
     Console.WriteLine(counter);
}
A

Fråga 15
3/3

När man bygger isolerade if-satser som i denna fråga så kommer varje if-sats att värderas för dess villkor då koden genomarbetas. Med fallet i denna fråga som exempel så innebär det i praktiken att om den första if-satsen utvärderas till sann, och counter ökar med ett, så kommer även nästkommande if-sats att utvärderas och om även den är sann kommer 2 adderas till det befintliga värdet (1) på counter osv.

Hade detta formulerats som else-if-satser för exempelvis de två första antagandena så hade den första if-satsen prövats, hade den varit sann så hade 1 adderats till counter och sedan hade detta även direkt skrivits ut. Hade det första uttrycket däremot varit falskt, hade else-if-satsen utvärderats, därefter hade eventuella nästkommande else-if-satser utvärderats tills dess att någon av dessa får sitt villkor uppfyllt, eller samtliga satser har prövats.

Genom att bygga separata if-satser kan man därför pröva flera villkor, separat från varandra, vilket kan vara användbart om man exempelvis vill att en variabel ökar i värde för varje villkor som uppfylls eller liknande. Att bygga “if -> if-else (-> else)” gör istället att man prövar inputen uppfyller villkoret för någon av satserna. VIktigt att tänka på är även då att det finns en prioriteringsordning, där det minst sannolika utfallet bör placeras först (annars kommer ett enkelt villkor uppfyllas och inga andra satser prövas).

24
Q

Metoden Largest tar emot 5 st heltal och är tänkt att returnera det största heltalet. Metoden har två överlagrade metoder till sin hjälp, en som tar emot 2 st heltal och en som tar emot 3 st heltal. I metoderna finns totalt 4 st logiska fel.

Din uppgift är att identifiera vilka rader felen finns på samt förklara/beskriva vad det är som är fel.

1      static int Largest(int one, int two, int three, int four, int five)
2      {
3      return Largest(one, Largest(two, Largest(three, four, five)));
4      }
5
6      static int Largest(int one, int two)
7      {
8           if (one == two)
9           {
10                return one;
11            }
12           return two;
13      }
14
15      static int Largest(int one, int two, int three)
16      {
17           int largest = 1;
18           if (two < largest )
19                   largest = two;
20          else if (three > largest)
21                   largest = three;
22          return largest;
23     }
A

Fel 1 : Rad 8. I Largest som undersöker två st tal mot varandra kollar endast om de är == varandra, inte vilken som är störst. Den returnerar 1 om de har samma värde, och 2 om de inte har samma värde. Oavsett vilken som är störst returneras två, så länge de är olika nr.

Fel 2: Rad 17. I Largest som kollar tre heltal sätts en temporär variabel som 1, detta är fel då alla värden kan vara lägre än 1 och metoden skulle därför returnera 1 som största värde om alla värden skulle vara under 1. De skulle kunna satt första värdet som int largets = two; och sedan jämföra de andra utifrån det. (kan vara så att de skriver 1 istället för one, svårt att läsa tankar vad som är tänkt, fel hursomhelst). Kan ses som två fel, att 1 används även om man inte kan säga att det inte finns ett större tal, eller att de faktiskt inte kollar en av inputsen som får variabelnamnet “one”. Isåfall rad 15, typ “variable declared but never used”.

Fel 3 : Rad 18.står if (two < largest)
largest = two;
Detta betyder att om two är mindre än largest sätts largest till värdet av two, vilket är fel då largest endast ska byta värde om värdet på talet det jämförs med är större.

Fel 4 : Rad 20 - else if
Är two mindre än one, så kommer denna jämförelse aldrig utföras

25
Q

Metoden AddIfNew är tänkt att ta emot en array av heltal samt ett heltal och returnera en array av heltal där heltalet som skickas in har lagts till i slutet, om heltalet inte redan förekommer i arrayen. För att kunna göra detta använder metoden två stycken stödmetoder, AlreadyInArray och AddToArray.

Metoden AlreadyInArray är tänkt att ta emot en array av heltal samt ett heltal och returnera huruvida heltalet redan förekommer i arrayen eller inte.

Metoden AddToArray är tänkt att ta emot en array av heltal och ett heltal och lägga till
heltalet i slutet av arrayen.

Under metoderna finns några metodanrop och tillhörande exempel på vad som skall returneras om en viss input ges till metoden AddIfNew. I metoderna finns 9 stycken fel. Felen kan vara logiska fel men även syntaktiska fel.

Din uppgift är att identifiera vilka rader felen finns på samt vad det är som är fel.

1      static int AddIfNew(int[] arr, int value)
2      {
3           if (AlreadyInArray(arr, value))
4           {
5                arr = AddToArray(arr, value);
6           }
7           return arr;
8      }
9
10      static void AlreadyInArray(int[] arr, int value)
11      {
12           for (int i = 0; i <= arr.Length; i++)
13           {
14                if (arr[i] != value)
15                {
16                     return true;
17                }
18           }
19           return false;
20      }
21
22      static int[] AddToArray(int[] a, int v)
23      {
24            int[] n = new int[a.Length];
25            for (int k = 0; k <= a.Length; k++)
26           {
27                 n[k] = a[k];
28           }
29           n[n.Length] = v;
30           return v;
31      }

Körexempel:

int[] arr = { 1, 2, 3, 4, 5 };
int[] arr2 = AddIfNew(arr, 4);
//arr2 ska efter metodanropet innehålla följande värden: { 1, 2, 3, 4, 5 }
arr2 = AddIfNew(arr2, 10);
//arr2 ska efter metodanropet innehålla följande värden: { 1, 2, 3, 4, 5, 10 }
A

Rad 1: Fel att det står static int, ska stå static int [] då metoden returnerar en int-array och inte en int.

Rad 3 : Som koden är skriven ska det vara if(!AlreadyInArray(int[] arr, int value), då koden är skriven som att den returnerar en true om det finns ett värde i arrayen som är samma som value. Den ska inte köras om AlreadyInArray returnerar true.

Rad 10 : Metoden returnerar och ska returnera en bool, därför ska metodsignaturen vara static bool och inte static void.

Rad 12: Loopas en gång för mycket, borde vara arr.Length -1 eller < istälelt för <=. arr[i] kommer bli out of bounds då i kommer hamna på en indexposition som inte finns.

Rad 14: Står if(arr[i] != value)
return true;
Innebär att så fort ett värde i arrayen är skiljt från value returneras true. Det stämmer inte. Det ska vara att om ett värde är == det värdet ska true returneras.

(Rad 22: Deklarationen ger konstiga namn på variabler, hela metoden har konstiga namn men det är egentligen inte fel)

Rad 24 : int[] n måste ha en plats mer än a , alltså ska det stå int[] n = new int[a.Length +1] för att få plats med value (int v i denna metod).

Rad 25: Loopas en gång för mycket , kommer bli out of bounds på rad 27 om detta körs. Borde skrivas som <= a.Lenght -1 eller < a.Length.

Rad 29 : n[n.Length] går inte då detta är out of bounds. Sista indexpositionen i n [] är n[n.Length -1].

Rad 30: returnerar fel variabel, ska returnera en int[], eller snarare den ska returnera n.