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;
}
}
}