Gå til indholdet

Afsluttende opgave - Tekstbaseret lommeregner

Denne opgave er en afsluttende opgave til kurset Grundlæggende C# (iterativ og procedural programmering). Opgaven er en større opgave som skal vise, at du har forstået de grundlæggende koncepter i C#-programmering.

Opgavebeskrivelse

Baseret på en standard .NET 8 (eller højere) konsolapplikation, skal du udvikle en tekstbaseret lommeregner, der giver brugeren mulighed for at udføre forskellige matematiske operationer via en konsolmenu. Hver beregning skal gemmes i en logfil, som brugeren kan få adgang til via menuen.

Her er en video, der viser, hvordan programmet kan se ud:

Forslag til løsning

Krav

Følgende krav skal opfyldes:

  • Programmet skal være en standard .NET 8 (eller højere) konsolapplikation.
    • Benyt en konsolapplikation med top-level statement (uden en klasse Program og en Main-metode) - altså en “script” stil.
    • Koden (variabler, metoder mv) skal være skrevet på engelsk.
    • Du skal nøjes med at benytte iterativ og procedural programmering - altså ingen objektorienteret (klasser/strukturer) eller funktionel programmering (delegates, lambda mv).
  • Al kode skal være skrevet i Program.cs.
    • Husk at placere metoderne i toppen af filen for at få korrekt IntelliCode-understøttelse i VS, VS Code eller Rider.
  • Programmet skal logge alle hændelser (start, beregninger, eventuelle fejl og afslutning) i en logfil.
    • Stien til logfilen skal hentes fra en miljøvariabel (environment variabel) kaldet CALCULATOR_LOG_PATH (eksempelvis C:\logs\calculator.log).
      • Miljøvariablen skal være tilgængelig på maskinniveau.
        • I windows kan du benytte GUI eller terminal startet som Admin setx CALCULATOR_LOG_PATH "C:\temp\calculator.log" /M for at oprette en miljøvariabel.
        • Brug Environment.GetEnvironmentVariable("CALCULATOR_LOG_PATH", EnvironmentVariableTarget.Machine).
      • Hvis der ikke er nogen miljøvariabel, skal logfilen gemmes i applikationens mappe i en fil kaldet calculator.log. -
    • Formatet skal være yyyy-MM-dd HH:mm:ss Tekst på hver linje.
    • Log skal ske gennem en metode kaldet Log(string message).
    • Her er et eksempel på indholdet i en fil:
      2024-11-12 21:45:24 Program started
      2024-11-12 21:45:29 Operation: Add, Numbers: 1, 5, Result: 6
      2024-11-12 21:45:34 Operation: Multiply, Numbers: 5, 7, Result: 35
      2024-11-12 21:45:35 Program exited by user
      2024-11-12 21:45:35 Program ended
      
  • Programmet skal benytte NuGet-pakken Spectre.Console til at hjælpe med at skabe en menu (en såkaldt SelectionPrompt).
    • Programmet skal have en menu, der giver brugeren mulighed for at vælge mellem følgende operationer:
      • Læg sammen
      • Træk fra
      • Gange
      • Find gennemsnit af tre tal
      • Afslut
    • Menuen skal hentes fra en metode string ShowMenu() som returnerer en string svarende til brugerens menuvalg.
  • Når en menu er valgt, skal brugeren indtaste to tal, og programmet skal udføre den valgte operation.
    • Du kan benytte Console.ReadLine() til at indlæse brugerinput eller eventuelt hjælp fra Spectre.Console.
    • Afhentning af brugerinput skal ske i en metode int GetUserInput() som returnerer en int.
      • Bemærk dog, at Find gennemsnit af tre tal kræver tre indtastninger.
    • Hvis brugeren indtaster en forkert værdi, skal programmet afsluttes med en fejlmeddelelse.
      • Fejlen skal logges i en logfil.
      • Brug eventuelt Environment.Exit(1) for at afslutte programmet.
    • Resultatet af operationen skal vises i konsollen.
      • Til valget af matematiske operationer skal kun bruges en if-else-struktur.
    • Programmet skal fortsætte med at køre, indtil brugeren vælger at afslutte fra menuen.
  • Programmet skal benytte metoder til at udføre de forskellige matematiske operationer:
    • int Addition(int, int)
    • int Subtraction(int, int)
    • int Multiplication(int, int)
    • int Average(int[]) (gennemsnit af tre tal - bemærk at metoden skal tage et array som parameter).

Her en en skabelon til programmet som du kan benytte som udgangspunkt:

using Spectre.Console;  // Kræver at pakken Spectre.Console er installeret  

// Her skal du hente en sti til log fil fra en miljøvariabel (eller brug default) og gem i en variabel
// Her kan du placere metoden Log(string message)

// Her kan du placere metoden ShowMenu() som returnerer en string
// Her kan du placere metoden GetUserInput() som returnerer en int
// Her kan du placere metoden Addition(int, int) som returnerer en int
// Her kan du placere metoden Subtraction(int, int) som returnerer en int
// Her kan du placere metoden Multiplication(int, int) som returnerer en int
// Her kan du placere metoden Average(int[]) som returnerer en int

// Her kan du skabe en løkke som kører programmet indtil brugeren vælger at afslutte
// Her kan du vise menuen og afhente brugerinput
// Her kan du udføre den valgte operation og vise resultatet
// Husk at logge alle hændelser i logfilen 

Aflevering og bedømmelse

Aflevering af opgaven sker ved at sende en ZIP-fil med hele projektet til mig på mail. Jeg vil ikke have /bin eller /obj mapperne med i zip-filen (så fejler mail også) - kun de filer som er nødvendige for at kunne bygge og køre projektet (.csproj og Program.cs). Du må gerne inkludere en readme.txt hvor dit navn og mailadresse fremgår.

Det jeg gør for at tjekke om det virker er at jeg pakker det ud på min egen computer og prøver at bygge og køre det (dotnet run). Jeg vil også kigge på koden for at se om de forskellige metoder mv. er implementeret som beskrevet i opgaven. Herefter aftaler vi en tid til en kort online (Teams) samtale om opgaven hvor du kan forklare mig hvordan du har tænkt og hvorfor du har valgt at gøre som du har gjort.

Når opgaven er godkendt vil du modtage et bevis på at du har løst opgaven tilfredsstillende. Beviset vil indeholde en kort beskrivelse af opgaven.