Zápočtový test 15.1.2014

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í.
halbich
Matfyz(ák|ačka) level I
Příspěvky: 4
Registrován: 17. 6. 2013 17:45
Typ studia: Informatika Bc.

Zápočtový test 15.1.2014

Příspěvek od halbich »

Ahoj,
dnes jsme měli kontingenční tabulku, viz http://forum.matfyz.info/viewtopic.php? ... ni+tabulka.

Hlavní funkcionalitu jsem měl hotovou za 2 hodiny, takže 3 hodiny byly vážně luxusní čas na odladění drobností. Odcházel jsem po 2,75 hodinách a byl jsem 3. úspěšný z 10, dále nevím.

Moje řešení spočívalo v nagenerování sloupců dle záhlaví a pak pro každý řádek vstupu vytvořit řádek a do něj dát datové položky typu {hodnota, odpovídající reference na sloupec}
Pak jsem si do záhlaví určil, zda celý sloupec splňuje požadavek na typ - vše čísla (kvůli okamžité vazbě, zda přes tento sloupec můžu sčítat), nebo zda jsou to obecné textové řetězce.

Následně jsem si vygeneroval dotazovací řádky dle zadaných sloupců (ty, podle kterých jsme měli seskupovat) tak, abych rekurzí pracoval s již omezenou množinou dat nad dalším omezujícím sloupcem. (Pokud znáte IQueryble<T>, tak jsem vycházel z podobného principu - průběžně sestavovat dotaz a pak jednou šáhnout do dat)

Kód: Vybrat vše

class QueryRow
{
 public List<TableRow> Source {...}
 public string Filter {...}
 public List<QueryRow> SubItems {...}
}
Vytvořil jsem si prvně QueryRow, který jako Source obsahoval všechny řádky tabulky. To byl parametr rekurzivní funkce:

Kód: Vybrat vše

internal List<QueryRow> GetSubitems(QueryRow parent, List<Column> desiredColumns, int level)
{
  var result = new List<QueryRow>();
  
 //nacti unikatni hodnoty - ze vsech predfiltrovanych radku otce si nacti hodnoty v danym sloupci a vem je unikatne
 var unique = parent.Source.Select(e=> (e.GetColumn( desiredColumns[level].ColumnName).Value)).Distinct().ToList();
 foreach(var name in unique)
 {
   //vytvor novy QueryRow qRow;
   //nastav mu jako Source takove radky z parent.Source, ktere splnuji to, ze ve sloupci desiredColumns[level] maji hodnotu name;
   //nastav qRow.Filter = name       //slouzi pro vypisovani na vystup
   // pokud desiredColumns.Length > level, tak mu pridej SubItems = GetSubitems( qRow, desiredColumns, level +1)
   // pridej qRow do resultu
 }

 return result;
}
Tím mám de facto strom, který pak zase jednoduše rekurzivne projdu a vypíšu. Když se dostanu do bodu, že nemám žadne SubItemy, jsem tedy v místě, kde si vezmu sloupec, který mě zajímá, stejným způsobem si vytáhnu všechny unikátní hodnoty z mých předfiltovaných řádků a pro všechny tyto hodnoty udělám zase obdobně sumu přes všechny záznamy, které to splňují.

Až se dostanu ke svému řešení (má ho PJ a neměli jsme net, takže si ho nechám poslat), tak ho zde dám.
EDIT 23.1.2014: Po konzultaci s PJ ho zde dávat nebudu, nicméně s mojí nápovědou to jistě zvládnete.

Jinak klasika - k dispozici pouze lokální MSDN, router byl odstřihnut, takže bez netu, mohli jsme mít tištěné materiály.
Odpovědět

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