Zkouška 21.1.2009 (13:00)

marxin at 2009-01-21 14:52:52

Zadání:
Test obsahuje v první části zaškrtávací možnosti, minimálně jedna možnost je vždy správně, za každé špatné zaškrtnutí jeden trestný bod( pokud otázka obsahuje 5 správných možností a žádnou nevyberu mám -5). Poslední příklad je na doplnění kódu (maximálně -4 body).

Hodnocení (# trestných bodů):
0-2 (výborně)
3-5 (velmi dobře)
6-8 (dobře)
9- (neprospěl)

Implicitně:
.NET 3.5

Test:

  1. Určete výsledek int i = -8 >> 1; [-4]

  2. Nějaká konstrukce, kde je třída C potomkem structu S, což nejle.

  3. Velikost intu [4B]

  4. Co bude na konzoli [26]

     class A {
         public static int a = 5;
    
         public A() {
             a *= 3;
             m();
         }
    
         public virtual void m() {
             a++;
         }
     }
    
     class B : A {
         public B() {
             a *= 2;
         }
    
         public override void m() {
             a -= 2;
         }
     }
    
     class Program {
         static void Main(string[] args)
         {
             B b = new B();
             Console.WriteLine(A.a);
    
         }
     }
    
  5. Zaškrtněte hodnotové typy: int, Interface I {}, enum A {}, System.Int64, bool[] [1,3,4]

  6. Co může být T? a
    a) Referencční typ
    b) Hodnotový typ
    c) Číselné typy (int, float, double, ...)
    d) Primární typy(bool, char, byte, int, ...)
    e) T smí obsahovat jenom bezparametrický konstruktor
    [b,c,d]

  7. Jaký bude výstup následujícího programu

         static void Main() {
             try {
                 Main();
             } catch { }
         }
    

a) Nepůjde zkompilovat
b) Program po spuštění skončí bez chyby
c) Program se zacyklí do nekonečna
d) Skončí s chybou
[d - Stack overflow, v 3.5 .NETu je tomu tak]
8) Napište jaké se budou volat metody. [A.m1(), D.I.m2(), D.m3()] Něco v tomto stylu

 interface I {
        void m1();
        void m2();
        void m3();
    }

    class A : I {
        public void m1() { Console.WriteLine("A::m1()"); }
        public virtual void m2() { Console.WriteLine("A::m2()"); }
        public virtual void m3() { Console.WriteLine("A::m3()"); }
    }


    class D : A, I {
        public override void m2() { Console.WriteLine("D::m2()"); }
        void I.m2() { Console.WriteLine("D::I.m2()"); }
        public new void m3() { Console.WriteLine("D::m3()"); }
    }

    class Program {
        static void Main(string[] args) {
            I d = new D();

            Console.Write("((A) d).m1() => "); d.m1();
            Console.Write("((A) d).m2() => "); d.m2();
            Console.Write("((A) d).m3() => "); d.m3();

        }
    }
  1. Použití using(blok obsahující FileStream f = new FileStream(...) { blok kódu}), k čemu blok using
    a) Uvolnění paměti alokované fs
    b) Uvolnění systémových zdrojů
    c) Když se nepovede připoj. k souboru v parametrech, pokračuje bez chyby
    d) Něco jiného

  2. Doplnění do kódu, aby byl vždy v konzistentním stavu (thread safe) a aby se choval správně za všech podmínek, popřípadě vyhodil výjimky !

    class Stack<T> { class Item { public T value; public Item next;

            public Item(T v, Item n) {
                value = v;
                next = n;
            }
        }
    
        Item top;
    
        public void Push(T v) {
            top = new Item(v, top);
        }
    
        public T Pop() {
            T value = top.value;
    
            top = top.next;
    
            return value;
        }
    }
    

Moje řešení:

class Stack<T> {
        class Item {
            public T value;
            public Item next;

            public Item(T v, Item n) {
                value = v;
                next = n;
            }
        }

        Item top;
        private object locker = new object();

        public void Push(T v) {
            lock (locker) {
                top = new Item(v, top);
            }
        }

        public T Pop() {
            lock (locker) {
                if (top == null)
                    throw new Exception("Empty stack !");

                T value = top.value;
                top = top.next;

                return value;
            }
        }
    }
Anonymous at 2009-01-21 15:11:44

marxin wrote: ...
Explicitně:
.NET 3.5
...

snad implicitne, nie?

Him at 2009-01-21 18:20:19

Pisemka byla přesně ve stylu pana profesora Ježka: "Proč dávat známku zadarmo, jen ať si ji zaslouží". Nicméně, kdo dával pozor na přednáškách a poctivě si prošel slidy, tak to musel na nějakou známku dát. Já si přečetl asi 200 stránek z knížky, kterou p. Ježek doporučoval a bylo tam vše, co je potřeba vědět na test. Nicméně i tak jsem měl v testu čtyři chyby, tj. výsledná 2.

R.U.R. at 2009-01-21 18:55:55

Dával jsem pozor na přednáškách a dopoledne před zkouškou jsem si pečlivě prošel slajdy a poznámky z přednášky - a nebylo tam úplně vše co jsem potřeboval vědět, ale na trojku to stačilo.

Donarus at 2009-01-21 21:04:35

Nemate nahodou nekdo nejake poznamky z c# - nejake ty nonslide veci ? .. Prochazel jsem si ted svoje ale popravde receno tam toho moc nenachazim ...

Him at 2009-01-21 21:14:11

Donaurus: Ne, ale zkus si opatrit tistenou (mozna je i nekde ke stahnuti) verzi knizky Programujeme profesionalne v C# .. tam je opravdu vsechno, co potrebujes.. staci precist to, kde mas mezery. Navic je to psano jak pro lidi trpici vypadky pameti, neustale autor opakuje a ujistuje se, ze tomu rozumis, takze se to da cist rychle.

Šlupka at 2009-01-21 21:19:00

Donarus wrote:Nemate nahodou nekdo nejake poznamky z c# - nejake ty nonslide veci ? .. Prochazel jsem si ted svoje ale popravde receno tam toho moc nenachazim ...

Stáhni si zdrojáky jak je naimplementován .NET a pořádně si prostuduj jak se .NET kompiluje... To jak se v C# programuje do zkoušky potřebovat takřka nebudeš...

Já jsem se C# učil z knížky "Pro C# 2008 and the .NET 3.5 Platform" a musím říct, že takové chujoviny co byly v testu v ní nejsou... A to je to opravdu hodně obsáhlá knížka...

cermi at 2009-01-21 21:41:27

Přesně tak, jde spíš o detaily v .netu runtimu než o reálné věci (na to byl zas test zápočtový). Já kdybych od někoho dostal kód podobný tomu s tím voláním virtuální overridlé fce v konstruktoru (bezparametrickém navíc) předka, tak mu asi urazím pařátky. Ale zas na druhou stranu je asi dobré o nich aspoň vědět, chyby, kdy jsme si naprosto jistí, že je to takhle, a ono to tak není, se občas špatně hledají. Já jsem dostal těsně za jedna naštěstí, i když třeba u toho usingu jsem si nebyl jistý, přeci jen, v té metodě Dispose můžu uvolňovat i unmanaged paměť (obecně teda, FileStream si nic takového nealokuje, takže jsem nakonec zvolil dobře).

dargor at 2009-01-30 23:49:02
  1. Použití using(blok obsahující FileStream f = new FileStream(...) { blok kódu}), k čemu blok using
    a) Uvolnění paměti alokované fs
    b) Uvolnění systémových zdrojů
    c) Když se nepovede připoj. k souboru v parametrech, pokračuje bez chyby
    d) Něco jiného

Tak ze spravna odpoved je b) ?

cermi at 2009-02-05 01:33:37

dargor wrote:9) Použití using(blok obsahující FileStream f = new FileStream(...) { blok kódu}), k čemu blok using
a) Uvolnění paměti alokované fs
b) Uvolnění systémových zdrojů
c) Když se nepovede připoj. k souboru v parametrech, pokračuje bez chyby
d) Něco jiného

Tak ze spravna odpoved je b) ?

Jo

Anonymous at 2009-06-11 18:10:44

cermi wrote:

dargor wrote:9) Použití using(blok obsahující FileStream f = new FileStream(...) { blok kódu}), k čemu blok using
a) Uvolnění paměti alokované fs
b) Uvolnění systémových zdrojů
c) Když se nepovede připoj. k souboru v parametrech, pokračuje bez chyby
d) Něco jiného

Tak ze spravna odpoved je b) ?

Jo

Povedal by som, ze skor a)

podla http://msdn.microsoft.com/en-us/library ... S.80).aspx

"Defines a scope, outside of which an object or objects will be disposed."

svick at 2009-06-11 21:13:14

Návštěvník wrote:

cermi wrote:

dargor wrote:9) Použití using(blok obsahující FileStream f = new FileStream(...) { blok kódu}), k čemu blok using
a) Uvolnění paměti alokované fs
b) Uvolnění systémových zdrojů
c) Když se nepovede připoj. k souboru v parametrech, pokračuje bez chyby
d) Něco jiného

Tak ze spravna odpoved je b) ?

Jo

Povedal by som, ze skor a)

podla http://msdn.microsoft.com/en-us/library ... S.80).aspx

"Defines a scope, outside of which an object or objects will be disposed."

Jenže "dispose" znamená zavolat metodu IDisposable.Dispose(), u které je napsané

Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.

Takže správně je opravdu b). Samozřejmě takový objekt pak (nejspíš) není dosažitelný, takže podléhá GC, ale to není podstatou using.

flavius_ at 2010-01-27 21:35:17

Ad ta 8) - jaktože to napotřetí vypíše D.m3? Vzhledem k tomu, že je ta m3 new, tak by snad neměla být z pohledu A vidět, i když v A je m3 virtuální... Viz příklad s Beagly ve slidech.

1.John at 2011-06-13 01:20:42

protože v kódu to není přetypované
viz

Console.Write("((A) d).m1() => "); ((A)d).m1();
Console.Write("((A) d).m2() => "); ((A)d).m2();
Console.Write("((A) d).m3() => "); ((A)d).m3();