using System; using System.IO; using System.Text.RegularExpressions; using System.Collections.Generic; using System.Collections; namespace dev_kurzy_v01 { /// /// IListek - rozhrani pro kurzovni listky /// public interface IListek { // deklarace vlastnosti string NazevBanky {get; set;} string Radka {get; set;} float Kurz {get; set;} float[,] KonecneKurzy {get; set;} int PocetMen {get; set;} int Akce {get; set;} ArrayList NacteneKurzy {get; set;} string Vypis {get; set;} bool Pomocna {get; set;} int Nasobek {get; set;} float Vysledek {get; set;} int[] PomocnePole {get; set;} string Vzor {get; set;} int Dimenze {get; set;} bool Weekend {get; set;} // hlavicky metod bool NacistSoubor(string vzor); void ZiskatKurzy(string vzor); void VybratPotrebneKurzy(int nasobek, int[] pomocnePole); string VypsatKurzy(); } /// /// Listek - trida vytvori obecny kurzovni listek /// public class Listek { // instancni promenne // nazev banky protected string nazevBanky; // jedna radka z textu protected string radka; // kurz z kurzovniho listku protected float kurz; // dvourozmerne pole pro finalni kurzy protected float[,] konecneKurzy; // pocet men protected int pocetMen; // akce protected int akce; // seznam nactenych kurzu z kurzovniho listku protected ArrayList nacteneKurzy; // vypis protected string vypis; // pomocna promenna typu boolean protected bool pomocna; // dalsi pomocna typu int protected int nasobek; // vysledny hledany kurz protected float vysledek; /// /// Listek() - konstruktor inicializuje instancni promenne /// public Listek() { // nastaveni promennych pocetMen = 15; akce = 6; konecneKurzy = new float[pocetMen,akce]; nacteneKurzy = new ArrayList(); vypis = ""; pomocna = false; } // vlastnosti public string NazevBanky { get{return nazevBanky;} set{nazevBanky = value;} } public string Radka { get{return radka;} set{radka = value;} } public float Kurz { get{return kurz;} set{kurz = value;} } public float[,] KonecneKurzy { get{return konecneKurzy;} set{konecneKurzy = value;} } public int PocetMen { get{return pocetMen;} set{pocetMen = value;} } public int Akce { get{return akce;} set{akce = value;} } public ArrayList NacteneKurzy { get{return nacteneKurzy;} set{nacteneKurzy = value;} } public string Vypis { get{return vypis;} set{vypis = value;} } public bool Pomocna { get{return pomocna;} set{pomocna = value;} } public int Nasobek { get{return nasobek;} set{nasobek = value;} } public float Vysledek { get{return vysledek;} set{vysledek = value;} } /// /// NacistSoubor() - nacte pomocny soubor a snazi se z nej ziskat kurzy /// /// vyhledavaci vzor pro kurzy /// vraci true, kdyz se nalezne alespon jeden kurz v souboru public bool NacistSoubor(string vzor) { // zkouska na vyjimku try { // nacteni souboru s defaultnim kodovanim textu using(StreamReader io = new StreamReader(NazevBanky,System.Text.Encoding.Default)) { // dokud text v souboru for(int i = 0; true; i++) { // precteni radky radka = io.ReadLine(); // pokud neni dalsi radka, vyskocime z cyklu a prestaneme nacitat radky souboru if(radka==null) {break;} // volame metodu ZiskatKurzy(vzor); } } } // zachyceni a vypsani vyjimky catch(IOException e) { // vypisy chyb a vlastni vypis pro chybu Console.WriteLine("Chyba: {0}", e); Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine("\n\nAnalyzovany soubor musi byt umisten ve stejne slozce jako analyzator.exe"); Console.ForegroundColor = ConsoleColor.Gray; Console.ReadLine(); } // vratime hodnotu Pomocna return Pomocna; } /// /// ZiskatKurzy() - metoda vyhleda v radce kurz /// /// vyhledavaci vzor pro kurzy public void ZiskatKurzy(string vzor) { // jestlize je v radce hledany vzor, tedy kurz if(Regex.IsMatch(radka,vzor)==true) { // vybereme z ty radky ten kurz a prevedeme na string a priradime promenne nalezenyVyraz string nalezenyVyraz = Regex.Match(radka,vzor).ToString(); // osetreni reseni zapisu desetinych cisel - prevedeme tecku na carku (41.225 -> 41,225) nalezenyVyraz = nalezenyVyraz.Replace('.',','); // jeslize sme misto kurzu nasli znak "-" if(nalezenyVyraz=="-") { // nahradime "-" hodnotou 0 vysledek = 0.000F; } // jinak else { // prevedeme nalezeny vyraz na float a priradime do vysledek vysledek = float.Parse(nalezenyVyraz); } // vysledek priradime do seznamu nactenych kurzu nacteneKurzy.Add(vysledek); // a zmenime Pomocnou na true - tedy alespon jeden kruz jsme v textu nasli :) Pomocna = true; } } /// /// VybratPotrebneKurzy() - virtualni metoda, ktera vezme hodnoty z nactenych kurzu /// a ve spravnem poradi je preda do pole konecneKurzy /// /// pocet kurzu, ktere odpovidaji jedne akci - napr. nakup /// udava na jake radce v puvodnim dokumentu se nachazi hledany kurz public virtual void VybratPotrebneKurzy(int nasobek, int[] pomocnePole) { // pro vsechny pozadovane meny for(int x = 0; x < pocetMen; x++) { // pro kazdou akci v pozadovane mene for(int y = 0; y < akce; y++) { // jestli hodnota prvku z pomonePole rovna -1 if(pomocnePole[x]==-1) { // predame do konecneKurzy nulovou hodnotu konecneKurzy[x,y] = 0.0F; } // jinak else { // hodnotu z nacteneKurzy prevedem na float a hodime ji do konocneKurzy na danou hodnotu // hodnota z nacteneKurzy je dana strukturou puvodniho .html dokumentu // proto ten slozity index :) konecneKurzy[x,y] = (float) nacteneKurzy[(pomocnePole[x]*nasobek)+y]; } } } } /// /// VypsatKurzy() - udela z pole konecneKurzy jeden velky vypis /// public string VypsatKurzy() { // pro vsechny meny for(int x = 0; x < pocetMen; x++) { // a pro kazdou akci dane meny for(int y = 0; y < akce; y++) { // vem vypis a prirad k nemu pvek na souradnici x,y z konecneKurzy // a pridame svislitko a vse vratime do vypis vypis += konecneKurzy[x,y] + "|"; } // za vsemi akce odradkujeme vypis += "\n"; } // a vratime vypis return vypis; } } /// /// ListekCNB - oddedena trida od tridy Listek a implementujici rozhrani IListek /// public class ListekCNB : Listek,IListek { // instancni promenne a jejich inicializace // udava poradi kurzu pro danou banku protected int[] pomocnePole = {0,35,3,4,8,11,14,18,22,24,26,28,30,31,34}; // vzor pro vyhledavani protected string vzor = @"\b(\d+)\,(\d{3})\b|(-$)"; // udava kolik akci je na menu protected int dimenze = 1; // jestli je listek pristupny i o vikendu protected bool weekend = false; /// /// ListekCNB() - konstruktor nacte pomocny soubor /// vyhleda kurzy a vybere potrebne kurzy /// public ListekCNB() : base() { // nazev pomocneho souboru pro danou banku priradime do NazevBanky NazevBanky = MainClass.soubory[0]; // nacteme kurzy ze souboru weekend = NacistSoubor(vzor); // pokud sme zadny kurz nenasli if(weekend == false) { // naplnime pomocnePole samymi -1, coz nam dale zajisti naplneni // kurzovniho listku nulami - napr. kdyz nejsou o vikendu zverejneny kurzy for(int i = 0; i < pomocnePole.Length; i++) { pomocnePole[i] = -1; } } // volame metodu VybratPotrebneKurzy(dimenze,pomocnePole); } // vlastnosti public int[] PomocnePole { get{return pomocnePole;} set{pomocnePole = value;} } public string Vzor { get{return vzor;} set{vzor = value;} } public int Dimenze { get{return dimenze;} set{dimenze = value;} } public bool Weekend { get{return weekend;} set{weekend = value;} } /// /// VybratPotrebneKurzy() - prekryta metoda z tridy Listek /// /// pocet kurzu, ktere odpovidaji jedne akci - napr. nakup /// udava na jake radce v puvodnim dokumentu se nachazi hledany kurz public override void VybratPotrebneKurzy(int nasobek, int[] pomocnePole) { // pro vsechny pozadovane meny for(int x = 0; x < pocetMen; x++) { // pro kazdou akci v pozadovane mene for(int y = 0; y < akce; y++) { // jestli hodnota prvku z pomonePole rovna -1 if(pomocnePole[x]==-1) { // predame do konecneKurzy nulovou hodnotu konecneKurzy[x,y] = 0.0F; } else { // jestlize je akce: deviza-stred if(y==2) { // hodnotu z nacteneKurzy prevedem na float a hodime ji do konocneKurzy na danou hodnotu // hodnota z nacteneKurzy je dana strukturou puvodniho .html dokumentu konecneKurzy[x,y] = (float) nacteneKurzy[(pomocnePole[x]*nasobek)]; } // jinak else { // predame do konecneKurzy nulovou hodnotu konecneKurzy[x,y] = 0.0F; } } } } } } /// /// ListekCSOB - oddedena trida od tridy Listek a implementujici rozhrani IListek /// public class ListekCSOB : Listek,IListek { // instancni promenne a jejich inicializace // udava poradi kurzu pro danou banku protected int[] pomocnePole = {0,15,1,2,3,4,5,6,8,9,-1,10,11,12,14}; // vzor pro vyhledavani protected string vzor = @"\d+\,\d{1,2}\d$|(-$)"; // udava kolik akci je na menu protected int dimenze = 6; // jestli je listek pristupny i o vikendu protected bool weekend = false; /// /// ListekCSOB() - konstruktor nacte pomocny soubor /// vyhleda kurzy a vybere potrebne kurzy /// public ListekCSOB() : base() { // nazev pomocneho souboru pro danou banku priradime do NazevBanky NazevBanky = MainClass.soubory[1]; // nacteme kurzy ze souboru weekend = NacistSoubor(vzor); // pokud sme zadny kurz nenasli if(weekend == false) { // naplnime pomocnePole samymi -1, coz nam dale zajisti naplneni // kurzovniho listku nulami - napr. kdyz nejsou o vikendu zverejneny kurzy for(int i = 0; i < pomocnePole.Length; i++) { pomocnePole[i] = -1; } } // volame metodu VybratPotrebneKurzy(dimenze,pomocnePole); } // vlastnosti public int[] PomocnePole { get{return pomocnePole;} set{pomocnePole = value;} } public string Vzor { get{return vzor;} set{vzor = value;} } public int Dimenze { get{return dimenze;} set{dimenze = value;} } public bool Weekend { get{return weekend;} set{weekend = value;} } } /// /// ListekCSAS - oddedena trida od tridy Listek a implementujici rozhrani IListek /// public class ListekCSAS : Listek,IListek { // instancni promenne a jejich inicializace // udava poradi kurzu pro danou banku protected int[] pomocnePole = {0,1,3,4,2,5,6,7,9,11,-1,12,13,14,15}; // vzor pro vyhledavani protected string vzor = @"((\d+)\,\d{3})|(-$)"; // udava kolik akci je na menu protected int dimenze = 7; // jestli je listek pristupny i o vikendu protected bool weekend = false; /// /// ListekCSAS() - konstruktor nacte pomocny soubor /// vyhleda kurzy a vybere potrebne kurzy /// public ListekCSAS() : base() { // nazev pomocneho souboru pro danou banku priradime do NazevBanky NazevBanky = MainClass.soubory[2]; // nacteme kurzy ze souboru weekend = NacistSoubor(vzor); // pokud sme zadny kurz nenasli if(weekend == false) { // naplnime pomocnePole samymi -1, coz nam dale zajisti naplneni // kurzovniho listku nulami - napr. kdyz nejsou o vikendu zverejneny kurzy for(int i = 0; i < pomocnePole.Length; i++) { pomocnePole[i] = -1; } } // volame metodu VybratPotrebneKurzy(dimenze,pomocnePole); } // vlastnosti public int[] PomocnePole { get{return pomocnePole;} set{pomocnePole = value;} } public string Vzor { get{return vzor;} set{vzor = value;} } public int Dimenze { get{return dimenze;} set{dimenze = value;} } public bool Weekend { get{return weekend;} set{weekend = value;} } } /// /// ListekKB - oddedena trida od tridy Listek a implementujici rozhrani IListek /// public class ListekKB : Listek,IListek { // instancni promenne a jejich inicializace // udava poradi kurzu pro danou banku protected int[] pomocnePole = {0,5,3,4,-1,7,1,6,8,9,-1,11,10,2,12}; // vzor pro vyhledavani protected string vzor = @"((\d+)\,\d{4})|(-$)"; // udava kolik akci je na menu protected int dimenze = 6; // jestli je listek pristupny i o vikendu protected bool weekend = false; /// /// ListekKB() - konstruktor nacte pomocny soubor /// vyhleda kurzy a vybere potrebne kurzy /// public ListekKB() : base() { // nazev pomocneho souboru pro danou banku priradime do NazevBanky NazevBanky = MainClass.soubory[3]; // nacteme kurzy ze souboru weekend = NacistSoubor(vzor); // pokud sme zadny kurz nenasli if(weekend == false) { // naplnime pomocnePole samymi -1, coz nam dale zajisti naplneni // kurzovniho listku nulami - napr. kdyz nejsou o vikendu zverejneny kurzy for(int i = 0; i < pomocnePole.Length; i++) { pomocnePole[i] = -1; } } // volame metodu VybratPotrebneKurzy(dimenze,pomocnePole); } // vlastnosti public int[] PomocnePole { get{return pomocnePole;} set{pomocnePole = value;} } public string Vzor { get{return vzor;} set{vzor = value;} } public int Dimenze { get{return dimenze;} set{dimenze = value;} } public bool Weekend { get{return weekend;} set{weekend = value;} } /// /// VybratPotrebneKurzy() - prekryta metoda z tridy Listek /// /// pocet kurzu, ktere odpovidaji jedne akci - napr. nakup /// udava na jake radce v puvodnim dokumentu se nachazi hledany kurz public override void VybratPotrebneKurzy(int nasobek, int[] pomocnePole) { // pro vsechny pozadovane meny for(int x = 0; x < pocetMen; x++) { // pro kazdou akci v pozadovane mene for(int y = 0; y < akce; y++) { // jestli hodnota prvku z pomonePole rovna -1 if(pomocnePole[x]==-1) { // predame do konecneKurzy nulovou hodnotu konecneKurzy[x,y] = 0.0F; } // jinak prohazime kurzy z leva do prava, aby nam sedeli na valuta-deviza else { // jestlize akce je 0, 1 nebo 2 if(y==0 || y==1 || y==2) { // hodnotu z nacteneKurzy prevedem na float a hodime ji do konocneKurzy na danou hodnotu konecneKurzy[x,y+2] = (float) nacteneKurzy[(pomocnePole[x]*nasobek)+y+1]; } // jestlize akce je 3 nebo 4 else if(y==3 || y==4) { // hodnotu z nacteneKurzy prevedem na float a hodime ji do konocneKurzy na danou hodnotu konecneKurzy[x,y-3] = (float) nacteneKurzy[(pomocnePole[x]*nasobek)+y+1]; } // jinak (akce 5) else { // predame do konecneKurzy nulovou hodnotu konecneKurzy[x,y] = 0.0F; } } } } } } /// /// ListekWSPK - oddedena trida od tridy Listek a implementujici rozhrani IListek /// public class ListekWSPK : Listek,IListek { // instancni promenne a jejich inicializace // udava poradi kurzu pro danou banku protected int[] pomocnePole = {0,9,1,2,-1,-1,3,-1,4,-1,-1,5,6,7,8}; // vzor pro vyhledavani protected string vzor = @"(\b(\d+)(\.|\,)\d{3}\b)|(-$)"; // udava kolik akci je na menu protected int dimenze = 6; // jestli je listek pristupny i o vikendu protected bool weekend = false; /// /// ListekWSPK() - konstruktor nacte pomocny soubor /// vyhleda kurzy a vybere potrebne kurzy /// public ListekWSPK() : base() { // nazev pomocneho souboru pro danou banku priradime do NazevBanky NazevBanky = MainClass.soubory[4]; // nacteme kurzy ze souboru weekend = NacistSoubor(vzor); // pokud sme zadny kurz nenasli if(weekend == false) { // naplnime pomocnePole samymi -1, coz nam dale zajisti naplneni // kurzovniho listku nulami - napr. kdyz nejsou o vikendu zverejneny kurzy for(int i = 0; i < pomocnePole.Length; i++) { pomocnePole[i] = -1; } } // volame metodu VybratPotrebneKurzy(dimenze,pomocnePole); } // vlastnost public int[] PomocnePole { get{return pomocnePole;} set{pomocnePole = value;} } public string Vzor { get{return vzor;} set{vzor = value;} } public int Dimenze { get{return dimenze;} set{dimenze = value;} } public bool Weekend { get{return weekend;} set{weekend = value;} } /// /// VybratPotrebneKurzy() - prekryta metoda z tridy Listek /// /// pocet kurzu, ktere odpovidaji jedne akci - napr. nakup /// udava na jake radce v puvodnim dokumentu se nachazi hledany kurz public override void VybratPotrebneKurzy(int nasobek, int[] pomocnePole) { // lokalni pomocne promenne // vime ze pocet men pro tuto banku je 10 int pocetKurzu = 10; // vytvorime si pomocne dvourozmerne pole, kam si ulozime mezivysledek float[,] pomocnaTabulkaKurzu = new float[pocetMen,akce]; // pro vsechny pozadovane meny for(int x = 0; x < pocetKurzu; x++) { // pro kazdou akci v pozadovane mene for(int y = 0; y < akce; y++) { // zde doje k prohazeni kurzu a to diagonalne z nacteneKurzy do konecneKurzy // priklad mini tabulky 2x2: // // (1 2) a vysledek: (4 3) // (3 4) (2 1) // if(y < akce/2 && x < pocetKurzu/2) { konecneKurzy[x*2,y] = (float) nacteneKurzy[(x*dimenze)+y]; } else if(y >= akce/2 && x < pocetKurzu/2) { konecneKurzy[(x*2)+1,y-3] = (float) nacteneKurzy[(x*dimenze)+y]; } else if(y < akce/2 && x >= pocetKurzu/2) { konecneKurzy[(x-pocetKurzu/2)*2,y+3] = (float) nacteneKurzy[(x*dimenze)+y]; } else if(y >= akce/2 && x >= pocetKurzu/2) { konecneKurzy[((x-pocetKurzu/2)*2)+1,y] = (float) nacteneKurzy[(x*dimenze)+y]; } } } // pro vsechny pozadovane meny for(int x = 0; x < pocetMen; x++) { // pro kazdou akci v pozadovane mene for(int y = 0; y < akce; y++) { // jestli hodnota prvku z pomonePole rovna -1 if(pomocnePole[x]==-1) { // predame do pomocnaTabulkaKurzu nulovou hodnotu pomocnaTabulkaKurzu[x,y] = 0.0F; } // jinak dojde k prohozeni kurzu na valutach a devizach else { // priklad mini tabulky 2x2: // // (4 3) a vysledek: (2 1) // (2 1) (4 3) // if(y < akce/2) { pomocnaTabulkaKurzu[x,y] = konecneKurzy[pomocnePole[x],y+3]; } else { pomocnaTabulkaKurzu[x,y] = konecneKurzy[pomocnePole[x],y-3]; } } } } // upravenou pomocnouTabulkuKurzu muzeme predat do pole konecneKurzy konecneKurzy = pomocnaTabulkaKurzu; } } }