4.2.2009 [Zk]

Cílem semináře je seznámit posluchače s jazykem C#, prostředím platformy .NET a tvorbou aplikací s grafickým uživatelským rozhraním. Předpokládají se znalosti objektově orientovaného programování.
Manicka
Matfyz(ák|ačka) level I
Příspěvky: 26
Registrován: 28. 6. 2006 18:20

4.2.2009 [Zk]

Příspěvek od Manicka »

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)

Kód: Vybrat vše

int a = 6 & (~3)
2. Co bude na konzoli? (2 3 3 4) - ano jde doopravdy jen o tu preinkrementaci

Kód: Vybrat vše

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

Kód: Vybrat vše

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

Kód: Vybrat vše

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)

Kód: Vybrat vše

// 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)

Kód: Vybrat vše

private metodu
protected metodu
public metodu
properties
// asi jeste neco
7. Ze slidu 7th Lecture, hned prvni 2 slajdy.

Kód: Vybrat vše

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.
janoro

Re: 4.2.2009 [Zk]

Příspěvek od janoro »

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í...
mikkke

Re: 4.2.2009 [Zk]

Příspěvek od mikkke »

Mohl by jste sem nekdo dat podrobnejsi zadani 9.otazky? Dekuji
kaktus
Matfyz(ák|ačka) level I
Příspěvky: 5
Registrován: 13. 1. 2006 21:00

Re: 4.2.2009 [Zk]

Příspěvek od kaktus »

Manicka píše: 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:

Kód: Vybrat vše

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 píše:Mohl by jste sem nekdo dat podrobnejsi zadani 9.otazky? Dekuji
no co viac k tomu povedat... bolo tam nieco taketo

Kód: Vybrat vše

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...
Uživatelský avatar
Santhos
Matfyz(ák|ačka) level I
Příspěvky: 24
Registrován: 8. 1. 2007 11:34

Re: 4.2.2009 [Zk]

Příspěvek od Santhos »

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...
svick
Matfyz(ák|ačka) level I
Příspěvky: 18
Registrován: 22. 2. 2008 19:19
Typ studia: Informatika Mgr.
Bydliště: 17. listopad

Re: 4.2.2009 [Zk]

Příspěvek od svick »

Santhos píše: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ý.
Uživatelský avatar
starecml
Matfyz(ák|ačka) level I
Příspěvky: 24
Registrován: 25. 9. 2006 18:06
Typ studia: Informatika Bc.
Kontaktovat uživatele:

Re: 4.2.2009 [Zk]

Příspěvek od starecml »

Tady je jedna z možností, jak by mohla vypadat ta poslední otázka - vkládání do bin. stromu...

Kód: Vybrat vše

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...

Kód: Vybrat vše

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...
Scientific Approach team
Zabiják

Re: 4.2.2009 [Zk]

Příspěvek od Zabiják »

[quote="starecml"]Tady je jedna z možností, jak by mohla vypadat ta poslední otázka - vkládání do bin. stromu...

Kód: Vybrat vše

    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, ale současný .NETí kompilátor to nedělá, přestože v MSIL je na takovou rekurzi zvláštní instrukce.
Uživatelský avatar
starecml
Matfyz(ák|ačka) level I
Příspěvky: 24
Registrován: 25. 9. 2006 18:06
Typ studia: Informatika Bc.
Kontaktovat uživatele:

Re: 4.2.2009 [Zk]

Příspěvek od starecml »

Zabiják píše: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, ale současný .NETí kompilátor to nedělá, přestože v MSIL je na takovou rekurzi zvláštní instrukce.
Díky za korekci
Scientific Approach team
Merlin
Matfyz(ák|ačka) level I
Příspěvky: 13
Registrován: 3. 2. 2008 01:00
Typ studia: Informatika Bc.
Bydliště: Praha
Kontaktovat uživatele:

Re: 4.2.2009 [Zk]

Příspěvek od Merlin »

kaktus píše: 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.
Odpovědět

Zpět na „NPRG035 Jazyk C# a platforma .NET“