# 4.2.2009 [Zk]

<{ForumPost(poster="Manicka", timestamp=2009-02-04 18:05:33)}>
Nevim jestli to pamatuji vse a spravne, kdyztak me opravte a doplnte.  
Urcete nezachovavam poradi jak byly otazky v pisemce.  
  
1. Co bude v a? (4)

    int a = 6 & (~3)
    

2. Co bude na konzoli? (2 3 3 4) - ano jde doopravdy jen o tu preinkrementaci

    public struct A
    {
        public int x;
        public int y;
        public void Fce()
        {
            Console.Writeline("x = {0}, y = {1}", ++x, ++y);
        }
    }
    public class Program
    {
        public static Main(string[] args)
        {
            A a = new A();
            a.x = 1;
            a.y = 2;
            a.Fce();
            a.Fce();
        }
    }
    

3. Jaka bude velikost nasledujiciho typu (zalezi na platforme) - je to jen adresa

    U ? []
    

4. Urcit referencni typy (string, System.Object, object) - mozna jeste neco

    string
    System.Object
    object
    System.Int64
    // mozna jeste neco
    

5. Ctyri vyroky o kusech kodu A a B a rict, ktere jsou pravdive. (A nejde prelozit)

    // A
    var x = "ahoj";
    x = ((string)x).Length;
    // B
    object x = "ahoj";
    x = ((string)x).Length;
    

6. Co muze vynucovat interface po tride aby implementovala? (properties, public metodu)

    private metodu
    protected metodu
    public metodu
    properties
    // asi jeste neco
    

7. Ze slidu 7th Lecture, hned prvni 2 slajdy.

    struct S {...}
    ...
    List<S> list = new List<S>();
    list.Add(new S());
    list[0].x = 20;   // nejde prelozit, struct je hodnotovy typ -> list[0] je jen navratova hodnota na stacku
    

8. Humus s interfacama ze slidu - nebudu to sem opisovat, stejne si to uz poradne nepamatuju a spis bych matla, nez informovala  
9. Doplnovacka - opet vyhledavaci stromecek a metoda Add (thread safe + vhodne vyjimky)  
  
Pokud jsem neco napsala spatne, tak se omlouvam.
<{/ForumPost}>

<{ForumPost(poster="janoro", timestamp=2009-02-04 18:52:53)}>
Jen bych něco dodal k té doplňovačce kódu, poslední otázce. V zadání stojí, že máte implementovat a patřičně ošetřit jistou metodu. V úvodu je nějaký kód - v našem případě to bylo klasické zavedení stromu - Node left, right, value a key. Já jsem to jen tak prolétl a začal programovat, to byla ovšem chyba - v tom předepsaném kódu totiž občas něco chybí, například nějaké klíčové slovo (v našem případě class nebo struct). Nevšiml jsem si toho a přišel o bod, což bylo téměř rozhodující...
<{/ForumPost}>

<{ForumPost(poster="mikkke", timestamp=2009-02-04 20:03:57)}>
Mohl by jste sem nekdo dat podrobnejsi zadani 9.otazky? Dekuji
<{/ForumPost}>

<{ForumPost(poster="kaktus", timestamp=2009-02-04 21:01:55)}>

 > Manicka wrote:
 > 2. Co bude na konzoli? (2 3 3 4) - ano jde doopravdy jen o tu preinkrementaci

len o tu preinkrementaciu neslo... ten kod vyzeral skor takto:

    public struct A
    {
        public int x;
        public int y;
        public A(int x, int y) {
            this.x = x;
            this.y = y;
        }
        public void Fce()
        {
            Console.Writeline("x = {0}, y = {1}", ++x, ++y);
        }
    }
    public class Program
    {
        public static Main(string[] args)
        {
            A a = new A();
            a.x = 1;
            a.y = 2;
            a.Fce();
            a.Fce();
        }
    }
    

takze struct A obsahoval iba parametricky konstruktor (bezparametricky ani obsahovat nemoze) ale volany bol z konstruktorom defaultnym bezparametrickym... to co u tried nefunguje, u structov zrejme funguje  

 > mikkke wrote:Mohl by jste sem nekdo dat podrobnejsi zadani 9.otazky? Dekuji

no co viac k tomu povedat... bolo tam nieco taketo

    public class BinTree<K, V>
    {
      Node {
        public Node left, right;
        public K key;
        public V value;
        public Node(K k, V v) {
          key = k;
          value = v;
        }
      }
      
      private Node root;
      
      public void Add(K key, V value) {
        Node n = new Node(key, value);
        
      }
      // na konci nejaky nepodstatny kod, indexer abo co
    }
    

a vsade bolo mnozstvo volneho miesta na dopisovanie. Co bolo treba doplnit?

* **1.** where K:IComparable<K> (uznalo sa aj IComparable) na konci hlavicky triedy BinTree  
**2.** class pred Node v hlavicke tejto triedy (to som si tiez sakra vobec nevsimol...)  
**3.** pomocny objekt o ako private member a potom cely kod metody Add v lock(o) {...}  
**4.** kod pridavania do stromu, ktory bolo nutne vymysliet (standardne kuknut ci je kluc mensi, vacsi a podla toho ist bud dolava alebo doprava). dolezite veci:
    
    * ***a.*** pre prax asi najdolezitejsia poznamka, ovela viac ako problemy ostanych uloh, z ktorymi sa bud v praxi nestretnem (a ak ano, tak tomu kolegovi, co to tak napisal, asi vykrutim hlavu) alebo mi pri nich pomoze kompilator: !!! pridavanie do stromu nepisat rekurziou ale while cyklom, pri rekurzii hrozi, ze program odleti kvoli plnemu zasobniku ak na vstupe bude napr. milion zotriedenych cisiel !!!  
    ***b.*** ak narazim na uzol s rovnakym klucom ako chcem vkladat... vyhodim vynimku (najlepsie nejaku svoju)  
    ***c.*** pri porovnavani klucov (ktore implementuju IComparable) pouzivat CompareTo (nie < > ==)

tak snad uz je ta odpoved vycerpavajuca...
<{/ForumPost}>

<{ForumPost(poster="Santhos", timestamp=2009-02-08 16:50:24)}>
Otazka 3:  
  
odpoved je zalezi na platforme? ... To je asi blbost, ne? Co v C# zalezi na platforme? Mozna tak promenna MoodOfBill, ktera je na windowsech true a jinde false...
<{/ForumPost}>

<{ForumPost(poster="svick", timestamp=2009-02-08 20:53:11)}>

 > Santhos wrote:Otazka 3:  
 >   
 > odpoved je zalezi na platforme? ... To je asi blbost, ne? Co v C# zalezi na platforme? Mozna tak promenna MoodOfBill, ktera je na windowsech true a jinde false...

Třeba zrovna velikost adresy záleží na platformě, jestli je systém 32 nebo 64-bitový.
<{/ForumPost}>

<{ForumPost(poster="starecml", timestamp=2009-02-08 21:41:02)}>
Tady je jedna z možností, jak by mohla vypadat ta poslední otázka - vkládání do bin. stromu...

    public class BinTree<K, V> where K:IComparable<K>
    {
        class Node 
        {
            public Node left, right;
            public K key;
            public V value;
            public Node(K k, V v) 
            {
                key = k;
                value = v;
            }
        }
    
        private Node root;
    
        private Object lockObject = new Object(); 
    
    
        public void Add(K key, V value) 
        {
            Node n = new Node(key,  value);
            lock (lockObject)
            {
                Add2(n, ref root);
            }
        }
    
        private void Add2(BinTree<K, V>.Node n, ref BinTree<K, V>.Node root)
        {
          if (root == null)
          {
              root = n;
          }
          else if (root.key.CompareTo(n.key) > 0)
          {
              Add2(n,ref root.left);
          }
          else if (root.key.CompareTo(n.key) < 0)
          {
              Add2(n, ref root.right);
          }
          else if (root.key.CompareTo(n.key) == 0)
          {
              throw new Exception("Nelze vlozit dva klice se stejnou hodnotou!");
          }
        }
    }
    

Samotné použití by mohlo vypadat například...

    BinTree<int, string> strom = new BinTree<int, string>();
    strom.Add(5, "pet");
    strom.Add(3, "tri");
    strom.Add(6, "sest");
    strom.Add(1, "jedna");
    //strom.Add(1, "jedna");
    

Když se odkomentuje ten poslední řádek tak to hodí výjimku...
<{/ForumPost}>

<{ForumPost(poster="Zabiják", timestamp=2009-02-09 09:45:51)}>
\[quote="starecml"]Tady je jedna z možností, jak by mohla vypadat ta poslední otázka - vkládání do bin. stromu...

        private void Add2(BinTree<K, V>.Node n, ref BinTree<K, V>.Node root)
        {
          ...
          else if (root.key.CompareTo(n.key) > 0)
          {
              Add2(n,ref root.left);
          }
          else if (root.key.CompareTo(n.key) < 0)
          {
              Add2(n, ref root.right);
          }
          ...
        }
    }
    

Tak přesně takhle by to nemělo vypadat, za tu rekurzi bych dával bod dolů. Při větším počtu hodnot ti to odletí s přetečením zásobníku. I když někteří by mohli namítat, že to kompilátor zoptimalizuje, protože je to [tail-recursion](http://en.wikipedia.org/wiki/Tail_recursion), ale současný .NETí kompilátor to nedělá, přestože v MSIL je na takovou rekurzi [zvláštní instrukce](http://blogs.msdn.com/abhinaba/archive/2007/07/27/tail-recursion-on-net.aspx).
<{/ForumPost}>

<{ForumPost(poster="starecml", timestamp=2009-02-09 11:08:18)}>

 > Zabiják wrote:Tak přesně takhle by to nemělo vypadat, za tu rekurzi bych dával bod dolů. Při větším počtu hodnot ti to odletí s přetečením zásobníku. I když někteří by mohli namítat, že to kompilátor zoptimalizuje, protože je to [tail-recursion](http://en.wikipedia.org/wiki/Tail_recursion), ale současný .NETí kompilátor to nedělá, přestože v MSIL je na takovou rekurzi [zvláštní instrukce](http://blogs.msdn.com/abhinaba/archive/2007/07/27/tail-recursion-on-net.aspx).

Díky za korekci
<{/ForumPost}>

<{ForumPost(poster="Merlin", timestamp=2011-02-15 11:06:08)}>

 > kaktus wrote:
 > takze struct A obsahoval iba parametricky konstruktor (bezparametricky ani obsahovat nemoze) ale volany bol z konstruktorom defaultnym bezparametrickym... to co u tried nefunguje, u structov zrejme funguje

U strutktur neplatí to pravidlo o tom, že defaultní konstruktor není doplněn, když napíšeme nějaký vlastní. Naopak je deafultní konstruktor překladačem doplněn vždy.
<{/ForumPost}>

