Softwarearkitektur - Opgaver Modul 1

Opgave 1 - Lav projekter med dotnet-kommandoen

Du skal testes dotnet-kommandoen til at oprette og køre .NET-projekter. Dette gøres direkte fra et terminal-vindue som kører bash eller zsh. Andre terminal-typer kan også bruges, men i det følgende antages der en af de to.

  1. Find listen af indbyggede templates med dotnet new --list.
  2. Kig listen igennem og noter ned navnene på templates der kunne have relevans for faget.
  3. Prøv nu at oprette et nyt projekt fra en blazor-template. Dette gøres med dotnet new blazorwasm -o mit-blazor-projekt.

Du har nu en folder med et nyt blazor-projekt i. Test at projektet virker sådan her:

  1. Gå ind i folderen via terminalen (cd mit-blazor-projekt).
  2. Kør det nye projekt direkte fra et terminal-vindue med dotnet watch.
  3. Se at projektet kører og virker i din browser.
  4. Lav ændringer i koden og se at ændringerne bliver indlæst i browseren.
  5. Stop projektet, og prøv at køre den igen med dotnet run i stedet. Se om nye ændringer i koden stadig bliver indlæst eller ej.
  6. Stop projektet igen.

Til sidst skal du prøve at lave et console-projekt i stedet. Gør følgende:

  1. Lav et nyt projekt. Denne gang skal du bruge skabelonen console i stedet for blazorwasm.
  2. Gå ind i projektet og start det med dotnet-kommandoen som før.
  3. Lav ændringer i koden, så den skriver noget andet end “Hello, World”.
  4. Genstart programmet og se om det virker.

Opgave 2 - Debug et console-projekt

Tag dit console-projekt fra sidste opgave, eller lav et nyt, og smid følgende kode ind i Program.cs.

Console.WriteLine("Skriv dit navn:");
var input = Console.ReadLine();
Console.WriteLine($"Hej {input}");

Kør programmet og se at det virker.

Du skal nu prøve at debugge programmet, dvs. sætte et breakpoint på sidste linje. Herefter skal programmet startes op med debugging. Hvis du bruger vscode, er det lidt bøvlet, men du kan bruge vejledningen herunder. Bruger du Visual Studio, behøver du ikke lave en launch.json først, men burde blot kunne starte programmet direkte op i debugging. Til gengæld er det lidt svært at finde Terminalen i Visual Studio.

Her er vejledningen til vscode. Med Visual Studio skal du selv prøve at gøre noget svarende til punkt 6 og frem.

  1. Vælg “Run and Debug” i vscode’s “Activity Bar” (den til venstre).
  2. Tryk på teksten “create a launch.json file”. Findes filen allerede, kan du hoppe ned til punkt 4.
  3. Vælg debugger “.NET 5+ and .NET Core”.
  4. Filen launch.json skal have følgende indhold. Dog skal filnavnet “test-project.dll” erstattes med et filnavn der matcher navnet på lige netop dit projekt:
    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": ".NET Core Launch (console)",
                "type": "coreclr",
                "request": "launch",
                "preLaunchTask": "build",
                "program": "${workspaceFolder}/bin/Debug/net6.0/test-project.dll",
                "args": [],
                "cwd": "${workspaceFolder}",
                "console": "integratedTerminal",
                "stopAtEntry": false
            }
        ]
    }
    
  5. Gem filen og luk den igen.
  6. Tryk nu på den grønne “run”-knap oppe til venstre. Den lige efter “RUN AND DEBUG”.
  7. Sæt et breakpoint i Program.cs på sidste linje, og gå ned i Terminal hvor programmet kører.
  8. Indtast dit navn og tryk på enter.
  9. Se nu at programmet “breaker” på den sidste linje. Linjen vil være markeret med en anden farve i editoren.
  10. Før musen over variablen “input” og se om du kan se indholdet af variablen.
  11. Find variablen ude til venstre under “variables”.
  12. Find den blå run-knap i debug-panelet øverst i midten og tryk på den.
  13. Programmet kører nu færdigt og stopper.

Kom du igennem alle steps? Prøv igen, men med følgende ændringer:

Opgave 3 - Beregn fakultet med rekursion

Skriv en rekursiv metode der beregner n!, også kaldet for “n fakultet”. Hvis du skal have genopfrisket fakultet fra matematikken, kan du læse om det i den danske wikipedia.

Den rekursive definition er givet ved

Du kan skrive koden i et console-projekt direkte i Program.cs. Strukturér koden sådan her:

// Program.cs
Console.WriteLine(Opgave3.Faculty(5)); // Output skal være '120'.

class Opgave3 {
    public static int Faculty(int n) {
       // TODO: Skriv koden til fakultet her!
    }
}

Du må ikke benytte loops i din kode!

Kør koden med dotnet run.

Opgave 4 - Flere rekursions-opgaver

I følgende delopgaver må du ikke benytte loops!

Delopgave 1

Skriv en rekursiv metode der implemeterer Euclids algoritme der finder største fælles divisor af to positive heltal. Den største fælles divisor af to tal er det største heltal der går op i begge tal.

Euclids algoritme Største Fælles Divisor, sdf(a,b), kan defineres som:

Bemærk at % betyder “modulu”.

Delopgave 2

Nu skal du lave en rekursiv funktion der opløfter et tal i n’te potens. Eksempel: Hvis n er 4, skriver man 5⁴ som læses som “5 opløftet til fjerde potens”, og resultatet her er 625.

Den rekursive definition er givet ved

Brug samme kodestruktur som før. Husk at du nu har to input: n og p.

Delopgave 3

Skriv en rekursiv metode der beregner a * b hvor a og b er to hele tal større end eller lig med nul.

Det er ikke tilladt at benytte * i koden til at gange tal sammen. Det hele skal løses rekursivt kun med sammenligninger, + og -.

Den rekursive definition er givet ved

Delopgave 4

Skriv en rekursiv metode der returnerer s med karaktererne i omvendt rækkefølge.

For eksempel skal kaldet Reverse(“EGAKNANAB”) = “BANANAKAGE”.

Beskriv først den rekursive definition som i de andre delopgaver, for hvordan man vender en string. Programmér dernæst den rekursive metode.

Man må selvfølgelig ikke benytte indbyggede metoder der vender en string.

Opgave 5 - Gennemlæsning af mappe på disken

Følgende rekursive metode gennemløber en mappestruktur på din computer og udskriver alle filnavne:

// Program.cs

// Input 'path' er den mappe man starter i
Opgave5.ScanDir("C:\\Users\\Kristian");

class Opgave5 {
    public static void ScanDir(string path) {
        DirectoryInfo dir = new DirectoryInfo(path);
        FileInfo[] files = dir.GetFiles();

        // Udskriver alle filerne
        foreach (FileInfo file in files) {
            Console.WriteLine(file.Name);
        }
        DirectoryInfo[] dirs = dir.GetDirectories();

        // Kalder rekursivt på alle undermapper
        foreach (DirectoryInfo subdir in dirs) {
            ScanDir(subdir.FullName);
        }        
    }
}

Gør nu følgende:

  1. Læs metoden igennem og forstå princippet i løsningen.
  2. Lav en ny rekursiv løsning der gennemløber en mappe og tæller antal mapper i stedet for at udskrive dem. Metoden kunne hedde public static int ScanDirCount(String path).
  3. Udskriften i eksemplet er ikke specielt pæn. Lav forbedringer så filerne i hver undermappe indrykkes svarende til niveauet. Herunder er et eksempel:
// Før
D:
D:\Hewlett-Packard
D:\Hewlett-Packard\BiosUpdate
D:\Hewlett-Packard\BIOS
D:\Hewlett-Packard\BIOS\New
D:\Hewlett-Packard\BIOS\Current
D:\Hewlett-Packard\BIOS\Previous

// Efter
D:
  D:\Hewlett-Packard
    D:\Hewlett-Packard\BiosUpdate
    D:\Hewlett-Packard\BIOS
      D:\Hewlett-Packard\BIOS\New
      D:\Hewlett-Packard\BIOS\Current
      D:\Hewlett-Packard\BIOS\Previous