Úlohy na procvičení

Virtuální metody

Co vypíše následující program? Jaké jsou typy proměnných b, d a d2?

namespace dedicnost;

class Base
{
    public void A() { Console.WriteLine("Base.A"); }
    public virtual void B() { Console.WriteLine("Base.B"); }
    public virtual void C() { Console.WriteLine("Base.C"); }
}

class Derived : Base
{
    public new void A() { Console.WriteLine("Derived.A"); }
    public override void B() { Console.WriteLine("Derived.B"); }
    public new void C() { Console.WriteLine("Derived.C"); }
}

class Program
{
    static void Main(string[] args)
    {
        var b = new Base();
        var d = new Derived();

        b.A();
        b.B();
        b.C();

        d.A();
        d.B();
        d.C();

        var d2 = (Base)d;
        d2.A();
        d2.B();
        d2.C();
    }
}

Funkcionální programování

Úlohy k procvičení. U všech úloh doporučuji začít tím, že si rozmyslíte signaturu funkce (parametry a jejich typy, typové parametry, návratovou hodnotu).

  1. Napište funkci Count, která spočítá, kolik prvků sekvence splňuje zadaný predikát. Funkci můžete otestovat třeba tak, že ze seznamu vyberete pouze sudá čísla. Zkuste si predikát napsat jako lambdu.

  2. Napište funkci First, která vrátí první prvek sekvence splňující zadaný predikát.

  3. Napište funkci Any, která ověří, že alespoň jeden prvek sekvence splňuje zadaný predikát.

  4. Napište funkci All, která ověří, že všechny prvky sekvence splňují zadaný predikát.

  5. Napište funkci Compose, která složí dvě funkce. Parametry jsou funkce \(f: A \to B\) a \(g: B \to C\) a výsledek je funkce \((g \circ f)(x) = g(f(x))\).

  6. Napište funkci Zip, která vezme dvě sekvence a vyrobí sekvenci dvojic. Například kód:

    var numbers = new[] { 1, 2, 3 };
    var letters = new[] { "a", "b", "c" };
    foreach ((int number, string letter) in Zip(numbers, letters))
        Console.WriteLine($"{number}: {letter}");
    má vypsat:
    1: a
    2: b
    3: c
    Pro zjednodušení můžete začít s tím, že vstupy i výstupy jsou pole, a pak teprve funkci zobecnit pro sekvence (IEnumerable).

    Nápověda: Pokud chcete procházet IEnumerable bez použití foreach, podívejte se, jak funguje metoda GetEnumerator().

  7. Ze seznamu vět vyrobte seznam dvojic (věta, počet mezer v dané větě). Například pro seznam

    ["Hello, how are you?", "The quick brown fox jumps over a lazy dog."]
    je řešením
    [("Hello, how are you?", 3), ("The quick brown fox jumps over a lazy dog.", 8)]

Functions inside functions meme

Učební výstupy

Učební výstupy podávají zhuštěný souhrn základních konceptů a dovedností, které byste měli umět vysvětlit a/nebo použít po každém cvičení.