Gå til indholdet

N145 Eval i en proceduralt form (SVÆR)

Dette er en af de sværere opgaver. Du kan vælge at analysere min løsning og evt. prøve at skrive din egen, men vigtigst er at du prøve at gennemtænke en mulig løsning på denne opgave.

Du skal skabe en konsol app som kan evaluere en simpel formel som kan indeholde følgende elementer:

  • Heltal (f.eks. 5)
    • operatoren
  • Alle mellemrum ignoreres

I denne version af opgaven skal du løse den uden brug af klasser eller strukturer, og jeg vil foreslå en løsning med en enkelt metode som tager en streng som input og returnerer et heltal som output.

int Eval(string formel)
{
    // din kode her
}

Her er et par eksempler på hvordan metoden skal fungere (fra min løsning):

Console.WriteLine(Eval("1+2+3"));                   // Output: 6
Console.WriteLine(Eval("10+20"));                   // Output: 30
Console.WriteLine(Eval("5"));                       // Output: 5
Console.WriteLine(Eval("1+1+1+1+1"));               // Output: 5
Console.WriteLine(Eval("1   + 1      +1+  1+1"));   // Output: 5
Console.WriteLine(Eval("1+1+1+1+1+1+1+1+1"));       // Output: 9

// Ugyldige inputs
//Console.WriteLine(Eval("1++2"));                  // Skal kaste en fejl
//Console.WriteLine(Eval("+1"));                    // Skal kaste en fejl

Ekstra udfordring

Overvej hvordan andre operatorer kunne implementeres.

Klik for at se et forslag til en løsning
Console.WriteLine(Eval("1+2+3"));                   // Output: 6
Console.WriteLine(Eval("10+20"));                   // Output: 30
Console.WriteLine(Eval("5"));                       // Output: 5
Console.WriteLine(Eval("1+1+1+1+1"));               // Output: 5
Console.WriteLine(Eval("1   + 1      +1+  1+1"));   // Output: 5
Console.WriteLine(Eval("1+1+1+1+1+1+1+1+1"));       // Output: 9

// Ugyldige inputs
Console.WriteLine(Eval(""));                        // Skal kaste en fejl
//Console.WriteLine(Eval("1++2"));                  // Skal kaste en fejl
//Console.WriteLine(Eval("+1"));                    // Skal kaste en fejl

int Eval(string expression)
{
    if (string.IsNullOrEmpty(expression))
        throw new ArgumentException("Missing expression");

    int length = expression.Length;
    int result = 0;
    int currentNumber = 0;
    bool expectNumber = true; // Angiver om vi forventer et tal

    for (int index = 0; index <= length; index++)
    {
        char currentChar = index < length ? expression[index] : '\0'; // Brug '\0' som slutmarkør

        if (char.IsWhiteSpace(currentChar))
        {
            // Springer mellemrum over
            continue;
        }
        else if (char.IsDigit(currentChar))
        {
            // Opbygger det aktuelle tal
            currentNumber = currentNumber * 10 + (currentChar - '0');
            expectNumber = false;
        }
        else if (currentChar == '+' || currentChar == '\0')
        {
            if (expectNumber)
            {
                throw new ArgumentException("Forventede et tal, men fandt '" + currentChar + "' ved position " + index);
            }
            // Lægger det aktuelle tal til resultatet
            result += currentNumber;
            currentNumber = 0;
            expectNumber = true;
        }
        else
        {
            throw new ArgumentException("Ugyldigt tegn '" + currentChar + "' ved position " + index);
        }
    }

    return result;
}