Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 68 ] Choď na stránku: predchádzajúca 1, 2, 3 ďalšia
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 30.04.2013 11:16

Som Ti nesmierne vďačný.
Mám už aj metódy na sčítanie, odčítanie a násobenie Polynomial objektov, takisto som už preťažil operátory pre tieto matematické funkcie a všetko funguje ako má.

Len jedna vec by ma potešila. Len neviem, či sa vôbec dá nejako jednoducho riešiť.
Potrebujem inicializovať nový objekt triedy Polynomial, ale neviem, akú bude mať dĺžku (počet prvkov). Keďže ide vlastne o pole, ktoré nie je dynamické, dá sa to vôbec nejako?

Viem, že int sa dá použiť ako ?int - potom môže nadobúdať "null"
Môj objekt triedy Polynomial nemôže byť null, ale ak by mohol, to by možno bolo riešením.

Nechápem, skúsil som:
Polynomial p4 = null;
nešlo, vypísalo, že nemôže byť null.
Ale zrazu to ide.
Nejako mi blbne ten MS Visual C# 2010 Express - chvílami nekontroluje priebežne chyby. Asi by to chcelo reštart PC (9 dní nereštartovaný :shock: )



A ešte, či by bolo možné (neviem, či sa správne vyjadrím) preťažiť "=" (ako priradenie), teda ak napíšem poly1 = poly2, aby nerobil kópiu odkazu, ale kópiu celého objektu.

Mohol by som to teoreticky okašľať, tak že by som vytvoril objekt nulovyPolynom, kde by bol polynom prveho stupna (nulovyPolynom), ktorého jediny clen by bol s parametrom 0 (0 * x^0), a potom by som mohol poly1 = poly2 + nulovyPolynom;

Si ma dosť toho naučil, ale veď to určite vieš :-)


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 30.04.2013 11:48

IClonable sa moc neodporúča používať, pretože ako si si mohol sám vyskúšať, nie je jednoznačné o akú kópiu ide.
Ideálne je vytvoriť si nejakú pomocnú triedu (prípadne extension, aby si nemusel volať triedu ale mohol to zavolať jednoducho "mojObjekt.DeepCopy()"). Vtedy to bude hneď očividné pre všetkých.
this.MemberwiseClone(); totižto vracia plytkú kópiu...

Citácia:
Potrebujem inicializovať nový objekt triedy Polynomial, ale neviem, akú bude mať dĺžku (počet prvkov). Keďže ide vlastne o pole, ktoré nie je dynamické, dá sa to vôbec nejako?

Kedy sa dozvieš finálnu veľkosť? Nejaké zväčšovanie poľa moc neprichádza do úvahy, keďže sa to vždy rieši pomocou kopírovania prvkov do nového poľa.. Ideálne je si zistiť veľkosť dopredu. Keby išlo o normálne pole, asi by som ti odporučil Dictionary alebo List, ale pri dvojrozmernom poli by si sa s tým natrápil...Minimálne ma teraz nenapadá jednoduchšie riešenie.

Citácia:
A ešte, či by bolo možné (neviem, či sa správne vyjadrím) preťažiť "=" (ako priradenie), teda ak napíšem poly1 = poly2, aby nerobil kópiu odkazu, ale kópiu celého objektu.

Toto by som určite nerobil, ani keby to bolo možné. Problém s tým je v tom, že keď programátor vidí priradenie medzi dvoma triedami, vie, že ide o priradenie pomocou odkazu. Nič by ho nevarovalo, že sa to bude správať úplne inak. Najjednoduchšie a najvhodnejšie je urobiť len nejakú metódu povedzme so syntaxou

mojObjekt.DeepCopyTo(druhyObjekt);
alebo
druhyObjekt = mojObjekt.DeepCopy();







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 30.04.2013 12:20

Všetko vyriešené, díky.
Len tak skúšobne som preťažil operátor ^ a teraz funguje
p2 = p2 ^ p1; //spraví kópiu objektu p1 do p2 :-)

Ale to je nezmysel, ten operátor síce nebudem potrebovať pri polynómoch, ale je to brutálne mätúce.
Takže to som si len chcel overiť, či to funguje.
Škoda, že C# neumožňuje vytvoriť vlastné (custom) operátory. Aspoň 2 - 3 znaky na to mohli vyhradiť :D

Tak teraz idem riešiť matice. Dúfam, že to už pôjde hladšie.
S maticami nebudem robiť veľa operácií - až na ten determinant :-)

Dík.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 02.05.2013 20:16

Jupee, už som napísal algoritmus na výpočet determinantu matice, ktorej prvky sú polynómy.
A funguje. Síce som to riešil asi 8 hodín, ale robí to to, čo má :D
Dal som maticu 10 x 10 a trvalo mu to 13 sekúnd :-)
Veď vyše 360000-krát musí spustiť tú istú metódu :-)

Urobil som to cez rekurzívnu metódu (funkciu).

Uvedomujem si, že je to dosť pomalé. Ale mne stačí, keď vyráta determinant matice max. 5. rádu. A to je v stotinách sekundy.

Kód:
5 9 5 1 5 6 1 7 8 9
0 2 5 9 6 8 7 4 1 2
9 8 5 2 1 4 7 7 8 6
1 2 3 6 9 8 7 4 5 6
5 8 9 5 4 1 7 8 5 9
9 5 8 5 8 2 1 5 3 2
7 8 9 6 5 4 1 2 3 0
8 7 4 5 6 3 2 1 5 9
5 5 5 5 5 8 9 6 3 2
8 8 8 7 4 1 2 5 9 8

Od zadanej matice bola odrátaná jednotková matica vynásobená λ

-λ+5  9     5     1     5     6     1     7     8     9     
0     -λ+2  5     9     6     8     7     4     1     2     
9     8     -λ+5  2     1     4     7     7     8     6     
1     2     3     -λ+6  9     8     7     4     5     6     
5     8     9     5     -λ+4  1     7     8     5     9     
9     5     8     5     8     -λ+2  1     5     3     2     
7     8     9     6     5     4     -λ+1  2     3     0     
8     7     4     5     6     3     2     -λ+1  5     9     
5     5     5     5     5     8     9     6     -λ+3  2     
8     8     8     7     4     1     2     5     9     -λ+8 


Determinant matice je:  λ^10-37λ^9-720λ^8-4665λ^7-35022λ^6-144049λ^5-176136λ^4-1424819λ^3-11369883λ^2-4288856λ-28890926


Ešte raz díky.
Neskôr ešte asi budem mať pár otázok. :-)


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 02.05.2013 20:20

Nie je začo, som rád, že funguje :) A kľudne napíš, o C# vždy rád pokecám.







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 02.05.2013 22:33

Jeden problémik by sa našiel.
Chcem sa opýtať.
Keď konvertujem text na číslo, tak používa ako desatinný oddelovač ".", ale ak vo Windowse nastavím ako oddelovač ",". Tak to mi to prestane fungovať, rozoznáva iba čísla s oddelovačom ",".

Ako nastavím, aby vždy rozoznával len desatinnú bodku?
Niečo som našiel, ale neviem, či je to dobré riešenie, vlastne ani neviem, kam do projektu dať ten riadok.
Skúšal som už všade, ale vždy ma pošle kade ľahšie :-o

Kód:
Thread.CurrentCulture.NumberFormat.NumberDecimalSeparator ".";


Díky.

Pozerám na internete, ale trošku som vychaosený z toho.
Ja len potrebujem mať istotu, že program sa v ktoromkoľvek Windowse (s rôznymi nastaveniami Regional Settings) bude chovať rovnako. T. j. aby nemal problémy s desatinnou čiarkou ani oddeľovačom trojíc číslic.
Jednoducho nech pracuje len s týmto formátom:
-12333.4789

a nie napr. -12,333.4789 - to by bol priekak.

Dík.


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 02.05.2013 23:38

Čo ma teraz v rýchlosti napadne, máš hneď pár možností...

1.) nastaviť CurrentCulture na takú Culture, ktorá bude vyhovovať tvojím požiadavkám na formát čísel, jazyk, menu...
2.) urobiť niečo takéto:

Kód:
NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberDecimalSeparator = ".";
nfi.NumberGroupSeparator = "";

string number = "15424.23";
Decimal decimalNumber = Decimal.Parse(number, nfi);


Samozrejme by bolo asi ideálne to obaliť do metódy, aby si sa neopakoval ak to potrebuješ na viacerých miestach.

Ten tvoj spôsob nešiel preto, lebo bohužiaľ je z nejakého dôvodu Thread.CurrentCulture.NumberFormat "read-only"...







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 03.05.2013 0:42

Ďakujem, implementované.

Ale teraz veľmi dôležitá otázka.
Nainštaloval som si vo VirtualPC Windows XP sp1 cz. Samozrejme exe súbor z diru "Release" v tomto Windowse nebeží. Je to tým, že tam nie je nainštalovaný .NET 4.0, resp. potrebné knižnice, teda si myslím.
Môžem skompilovať projekt do exe tak, že pobeží aj tam? Nemusí byť len exáč, kľudne aj nejaké dllky.

Proste, ako zabezpečím, aby aplikácia fungovala aj tam, kde nie sú všetky potrebné knižnice?

Dík.


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 03.05.2013 1:24

Jedine tak, že prekonvertuješ aplikáciu tak, že bude používať nižšiu verziu frameworku... To si nastavíš bez problému cez vlastnosti projektu.. Problém nastane vtedy, ak si sa spoliehal na niektorú z novších funkcií :) Na danom pc totižto musia byť všetky knižnice, ktoré aplikácia vyžaduje, inak to nejde.







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 03.05.2013 13:09

Skúsil som 3.0, ale použil som už prvky, ktoré v tej verzii nie sú. Ale 3.5 ide.
Takže, ak to skompilujem ako .Net 3.5, pobeží to na mašinách, kde je .Net 3.5 a .Net 4.0.

Ale ak by som to skompiloval ako .Net 4.0, tak to pobeží len tam, kde je .Net 4.0. V OS, kde je .Net 3.5 to nepobeží, aj keď sa nevyužívajú nové prvky z .Net 4.0, že?

Dík.


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 03.05.2013 13:51

Ak chceš čo najvyššiu kompatibilitu, musíš proste na nové veci zabudnúť, čo je v mnohých situáciách dosť problém.. Napríklad taký Entity framework v starších .NET verziách stál za veľké :shit:
Pri desktop aplikáciách to väčšinou až tak nevadí, lebo nie je problém do inštalátora zahrnúť inštalačku potrebnej .NET verzie. (samozrejme ak nejde o podporu prehistorických OS ako je XP :) ) Najhoršie je to ale pri webových aplikáciách, keďže buď daný hosting má potrebnú .NET verziu alebo nie, tam si moc nenavyberáš.
Teoreticky ale môže byť problém v tom prípade, ak sa na danom PC nenachádza potrebná verzia... Mám taký dojem, že bol problém, ak sa povedzme targetuje 4.0 a dotyčný nemá žiadnu predchádzajúcu verziu... Aj keď je pravda, že to je dosť ojedinelá situácia.. Ak máš najnovšiu, väčšinou to znamená aj to, že máš aj tie staršie. 2.0, 3.0 a 3.5 používali pokiaľ viem rovnaký základ, čiže tam bola kompatibilita relatívne fajn. Horšie je to teraz pri najnovších, to prerobili už zásadnejšie a beží to na novej verzii.
Treba proste vyskúšať a uvidíš.. Pri xp si ale dosť obmedzený, čiže tam by som proste len targetoval 3.5 a podľa potreby priložil inštalačku .NET frameworku.
Už je inak vonku aj .NET 4.5 :)







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 05.05.2013 8:49

Ahoj, zasa otázka, vlastne až 2 (asi aj viac).

1. Výpočet koreňov polynómu budem robiť v novom formulári. Môžem používať Class Polynomial, ktorú mám v starom formulári, aj v novom formulári, bez toho aby som musel písať
Kód:
staryformular.Polynomial p1 = new staryformular.Polynomial();

?

S týmto nemám žiadnu skúsenosť. Ale si by sa to dalo spraviť tak, že trieda Polynomial by bola v inom súbore, že?

Ako sa dostanem k dátam zo starého formulára? Dajú sa vytvárať premenné aj mimo formulára? Napr. nad nimi? Lebo to mi nešlo.


2. Pokiaľ program robí výpočty a trvá mu to dlhšie, ako zabezpečiť, aby užívateľ mohol výpočet prerušiť? Napr. klávesou, alebo kliknutím na button.

Ďakujem.


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 05.05.2013 11:06

1.) každá trieda by mala byť vo vlastnom súbore. Ty si pravdepodobne vnoril jednu do druhej... :)

Citácia:
Ako sa dostanem k dátam zo starého formulára? Dajú sa vytvárať premenné aj mimo formulára? Napr. nad nimi? Lebo to mi nešlo.

Nie, mimo nie, ale dajú sa vytvárať statické premenné/metódy, ku ktorým sa dá ľahko dostať. Pokiaľ je ale možné, statickým premenným sa vyhýbaj, len si skomplikuješ situáciu.
Čo je v tomto prípade vhodné je definovať premenné priamo v triede formuláru a potom ich inicializovať pomocou konštruktoru, dačo takéto:

Kód:
public class Formular1 : Form
{
    private string _nejakaHodnota;

    public Formular1(string hodnota)
    {
         NejakaHodnota = hodnota;
    }
}


Keby si mal rodičovský formulár, mohol by si to urobiť napríklad takto:

Kód:
public class Rodic : Form
{
     private Formular1 _formular1;
     ...

     public void NejakaMetoda()
     {
          _formular1 = new Formular1("nejaka hodnota");
          _formular1.Show();
     }
}


Prípadne opačne, ak chceš, aby mal child formulár odkaz na rodiča... Hádam chápeš.. :)
Alebo keby si chcel sprístupniť nejaké hodnoty z formuláru (napr text box)

Kód:
public class Formular1 : Form
{
    public string NejakaHodnota
    {
          get { return txtBox1.Text; }
          set { txtBox1.Text = value; }
    }

    ...
}


2.) Musíš robiť výpočty vo vlastnom vlákne. V najnovšej verzii C# na to existujú parádne mechanizmy, pri 3.5 si budeš musieť vystačiť s BackgroundWorker-om.
http://msdn.microsoft.com/en-us/library ... er(v=vs.90).aspx







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 08.05.2013 17:53

Ďakujem za vysvetlenie.
Ja to mám riešené takto:
Kód:
public partial class Form1 : Form
.
.
.
{
   public Class Polynomial {...}
   public Class Matrix {...}
   public struct resultOfDivisionPolynoms
   {
       public Polynomial Integral;
       public Polynomial Remainder;
   }
}
.
.
.


Mne išlo o to, aby to nebolo všetko napchaté v jednom súbore. Ale už to neriešim, to je pre môj projekt teraz irelevantné. V ďalšom projekte to určite budem riešiť. Aj zapúzdrovanie a veci okolo toho. Lebo tu som sa na to vykašľal.

Už som naučil môj počítač deliť polynóm polynómom :D

Dík.


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 08.05.2013 18:20

Nabudúce skús rovno riešiť WPF, s winforms sa už moc do budúcnosti nepočíta... :) Ideálne potom aj nejaký architektonický návrhový vzor ako MVVM, tam máš peknú separáciu.
A takisto by som odporučil aj knihu Čistý kód od Robert C. Martina, ak to myslíš s programovaním vážnejšie.







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 08.05.2013 19:43

Ďakujem, určite si nechám poradiť, tú knihu si kúpim.

Stala sa mi dosť čudná vec:
Mám kód:

Kód:
static public Polynomial Derive(Polynomial p1, int n)
            {
                for (int i = 1; i <= n; i++)
                {
                    int p1L = p1.Body.Length;
                    if (p1L <= 1)
                    {
                        //pDerived = new Polynomial(new Decimal[] { 0 });
                        p1 = new Polynomial(new Decimal[] { 0 });
                        break;
                    }
                    //pDerived = new Polynomial(new Decimal[p1L - 1]);
                    for (int j = 1; j < p1L; j++)
                    {
                        p1.Body[j - 1] = j * p1.Body[j];
                    }
                    p1.Body[p1L - 1] = 0;
                    //MessageBox.Show("pred: " + p1.Body.Length);
                    p1 = Polynomial.Opt(p1);
                    //MessageBox.Show("po: " + p1.Body.Length);
                }
                return p1;
            }

            static public Polynomial Opt(Polynomial p1)
            {
                Decimal[] d1 = p1.Body;
                int dec = 0;
                for (int i = p1.Body.Length - 1; i >= 0; i--)
                {
                    if (d1[i] != 0)
                    {
                        break;
                    }
                    else
                    {
                        dec += (d1[i] == 0 ? 1 : 0);
                    }
                }
                //MessageBox.Show("pred!: " + p1.Body.Length);
                Array.Resize(ref d1, d1.Length - dec);
                p1 = new Polynomial(d1);
                //MessageBox.Show("po!: " + p1.Body.Length);
                return p1;
            }


A keď zavolám
Kód:
pd1 = Polynomial.Derive(p77, 1);
pd2 = Polynomial.Derive(p77, 2);


pd1 bude 1. derivácia polynómu
pd2 bude 3. derivácia polynómu

ale ak zavolám len
pd2 = Polynomial.Derive(p77, 2);

Kód:
tak pd2 bude 2. derivácia polynómu


Jednoducho v tom prvom prípade, keď volám metódu Derive druhýkrát:
pd2 bude 3. derivácia polynómu
On si pamätá, to p1 z predošlého volania (takže napriek tomu, že mu odovzdám polynom p77 on použije p1 čo už tam ma (ten uz bol raz zderivovany))
Krok po kroku som to debugoval, ale nech robím čo robím.
Nejde mi do hlavy, to, že veď keď volám metódu, tak by mala mať čerstvé údaje a nie nejaké z minulého volania :-(

Nemusíš to riešiť, len som sa chcel posťažovať. Určite je tam niekde chybička, ktorú nevidím. Budem to musieť nechať na zajtra, lebo dnes už toho bolo moc.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 08.05.2013 19:50

Jáj, ja som blb - ja som kopíroval referenciu - už to riešim, ja musím v tej metóde vytvoriť nový objekt triedy Polynomial a ten meniť a odovzdať, inak mením ten pôvodný - vstupný.

No, mal som tam
Kód:
Polynomial pOut = p1;   //:-((((


Takže som použil toto:
Kód:
Polynomial pOut = Polynomial.Clone(p1);
//Polynomial pOut = p1 + new Polynomial(new Decimal[] { 0 });


Aj ten druhý riadok funguje, ale z toho prvého je jasné hneď o čo ide :-)


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 09.05.2013 18:15

Mám jednu otázočku, ale skôr matematického rázu.

Mám polynóm s reálnymi koeficientami (4. stupeň a vyššie). Potrebujem zistiť všetky korene polynómu.
Interval v ktorom sa nachádzajú všetky korene viem určiť.
Takisto viem čiastočne určiť počet kladných a záporných koreňov.

Neviem ako určiť presný počet reálnych koreňov a tým pádom aj komplexných koreňov.
Takisto neviem, ako separovať koreň, t. j. určiť interval, na ktorom je práve jeden koreň.

Ďalej už viem ako pokračovať.

Zohnal som si aj literatúru (4 knihy), ale v každej to berú tak, že koreň už je separovaný :-o

Tak len náhodou, či máš nejaký zdroj, kde je to popísané.

Dík.


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 09.05.2013 18:31

Obávam sa, že s matikou ti nepomôžem... Brali sme to síce na výške, ale nikdy ma to nejako extra nebralo :) Skús to hodiť sem: matematicky-kruzok-vt104376.html







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 17.05.2013 18:43

Ahoj, zasa mám problém. Ale už som si myslel, že tomu rozumiem, ale toto ma zasa zaskočilo.
príklad:
Mám

Kód:
public struct PolynomRoots {}


Mám metódu a v nej inicializujem:
Kód:
PolynomRoots AllRoots;

(skúšal som to aj vo Form1 : Form)
Z tejto metódy volám inú metódu, ktorá má zistiť, koľko koreňov je na intervale. Počas testovania sa môže stať, že hranica intervalu je koreň. Problém je, že našiel som koreň a neviem ho uložiť do AllRoots, dá sa vôbec nejako pristúpiť k AllRoots.

Toto je vec, ktorá mi v C# robí obrovské problémy, potrebujem globálnu premennú, ktorú môžem použiť všade.

Predpokladám, že problém je niekde v
Kód:
public struct PolynomRoots {}


skúšal som tam pridať static, ale... no úprimne, mám sa ešte čo učiť.

Dík.


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 17.05.2013 19:40

Ten struct máš definovaný len takto? Ako/kde sa k nemu snažíš pristupovať?
Statickým/globálnym premenným sa treba vyhýbať v každom programovacom jazyku, to nie je problém len v c#.







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 17.05.2013 23:27

No som sa s tým boril.
PolynomRoots mám definovaný takto:
Kód:
public struct PolynomRoots
        {
            public int index_r;
            public int index_c;
            public Decimal[] realRoots;
            public ComplexNumber[] complexRoots;
        }


Nakoniec som to vyriešil tak, že som tú inštanciu (AllRoot) triedy inicializoval v metóde:
Kód:
            //Metóda zistenia počtu reálnych a komplexných koreňov
            static public PolynomRoots FindRoots(Polynomial p)
            {
                PolynomRoots AllRoots;
                AllRoots.index_r = 0;
                AllRoots.index_c = 0;
                AllRoots.realRoots = new Decimal[p.Body.Length];
                AllRoots.complexRoots = new ComplexNumber[p.Body.Length];

a keď z tejto metódy volám metódu na zistenie počtu koreňov v intervale, tak jednoducho predám tú inštanciu ako parameter, a tam ju použijem. Mi nedocvaklo hneď, že nerobí kópiu objektu, iba referenciu:
Kód:
                //Zistí počet reálnych koreňov v každom intervale
                CountOfRoots[] countOfRoots = Polynomial.ComputeCountOfRoots(p, Interval, SturmSeries, AllRoots);


Takto to riešiť je asi úplne zle, ale čas ma tlačí, takže teraz som rád, že to ide. :?

Dík.

P.S.: Ja som kedysi ešte na osembiťákoch fičal na BASICu a vyryté koridory v mozgu sa ťažko rekonštruujú na nové koridory :D Robil som aj čosi v strojáku na ZX Spectre (Loadery a miniprogramíky, vrátane kompresora a dekompresora). Na PC som len jeden jediný jednoúčelový programčičoček spravil. Potreboval som z jedného súboru spraviť db. Celý program mal iba okolo 200 bytes (s príponou .com v DOSe) :) V dobe, keď som ešte nemal prístup na internet, som nevedel, že existuje aj vývojové prostredie na písanie v strojaku (Assembler), som to písal ručne. :(


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 18.05.2013 18:35

Bolo by treba vidieť celý zdroják, možno by sa potom dalo niečo poradiť.. :) Ale tak niekedy je lepšie sa učiť na vlastných chybách, človek si to lepšie zapamätá...

Inak aj u mňa bol BASIC prvým kontaktom s programovaním, ešte na PMD :lol:







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 21.05.2013 10:52

Och, PMD 85-1, to bolo moje prvé stretnute s počítačom, och.

Mám jeden problémik.
Mám triedu:

Kód:
        public class BigNumbers
        {
            public Byte[] body { get; set; }
            public int DecimalSeparator { get; set; }
            public Boolean Sign { get; set; }           //true = <0, inf>; false = <-inf, 0)

           public BigNumbers(String iNumber)
            {
                Regex rgx = new Regex("[^0-9-\\.]");
                String siNumber = rgx.Replace(iNumber, "");
               
                if (siNumber == "" || siNumber.Substring(0, 2) == ".-" || siNumber.Length - siNumber.Replace(".", "").Length > 1)
                {
                    siNumber = "n/a";
                }
                else
                {
                    //Je číslo záporné?
                    Sign = true;
                    if (siNumber.Substring(0, 1) == "-")
                    {
                        Sign = false;
                    }
                    siNumber = siNumber.Replace("-", "");

                    //Je desatinná bodka na prípustnom mieste?
                    int DecSep = siNumber.IndexOf(".");
                    if (DecSep == 0)
                    {
                        siNumber.Replace(".", "0");
                        DecimalSeparator = siNumber.Length - 1;
                    }
                    else if (siNumber.IndexOf(".") == -1)
                    {
                        DecimalSeparator = 0;
                    }
                    else
                    {
                        DecimalSeparator = siNumber.Length - DecSep - 1;
                        siNumber = siNumber.Replace(".", "");
                    }

                    //Odstráni neplatné nuly zo začiatku a konca čísla
                    while (siNumber.Substring(0, 1) == "0" && siNumber.Length - DecimalSeparator > 1)
                    {
                        siNumber = siNumber.Substring(1, siNumber.Length - 1);
                    }

                    while (siNumber.Substring(siNumber.Length - 1, 1) == "0" && DecimalSeparator > 0)
                    {
                        siNumber = siNumber.Substring(0, siNumber.Length - 1);
                        DecimalSeparator--;
                    }
                   
                    //Skonvertuje String do poľa Byte
                    Byte[] sbody = new Byte[siNumber.Length * sizeof(char)];
                    body = new Byte[siNumber.Length];
                    System.Buffer.BlockCopy(siNumber.ToCharArray(), 0, sbody, 0, sbody.Length);
                    for (int i = 0; i < sbody.Length / 2; i++) body[i] = (Byte)(sbody[i * 2] - 48);
                    return;
                }
            }


a keď vytvorím číslo:
Kód:
BigNumbers c2 = new BigNumbers("-12.4553");

tak ho mám uložené ako:
Kód:
Byte[] c2.body = Byte[]{1, 2, 4, 5, 5, 3};
Boolean c2.Sign = false;
int c2.DecimalSeparator = 4;


a problém je, že keď s nimi pracujem stane sa mi napríklad, že mi ostane číslo 12.240
Tú nulu chcem odstrániť, ale nedá sa spraviť:
Kód:
Array.Resize(ref c2.body, c2.body.Length - 1);

vypíše chybu:
A property, indexer or dynamic member access may not be passed as an out or ref parameter

Ako môžem znížiť dĺžku tohto poľa?

Dík.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 21.05.2013 10:59

Och prepáč.
Ja keď som to skúšal, urobil som fatálnu chybu.
Kód:
Byte[] tst = c2.body;
Array.Resize(ref tst, tst.Length - 1);
c2.body = tst;


Toto už ide, len dúfam, že tam nebude zradnosť s referenciami.
Ale nemalo by to byť, keďže ide o obyčajné pole.
Veď to o chvíľku zistím.

Ďakujem.

:-( foo, a predsa ide o refrenciu.


Oh, to je tak, keď idem na to hŕŕ.
Veď
Kód:
tst
zanikne a nie je čo riešiť. Och. :-)


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 21.05.2013 13:10

Pomaly tu už začínaš viesť monológ... :lol:
Funguje ti to už?







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 21.05.2013 15:24

Zatiaľ funguje všetko, čo som spravil. Díky.
Dúfam, že nevadí sčasti vediem monológ :)

Zasa sa mi vynorila jedna vec, ale nemám čas ju riešiť, ak by si len tak z voleja mi vedel poradiť, tak budem rád.
Preťažil som operátory != a == a pri hlavičke triedy
Kód:
public class BigNumbers
mi vypisuje 2 varovania:
Warning 1 'Test0004.Form1.BigNumbers' defines operator == or operator != but does not override Object.GetHashCode()
Warning 2 'Test0004.Form1.BigNumbers' defines operator == or operator != but does not override Object.Equals(object o)


Kód:
            static public Boolean operator ==(BigNumbers n1, BigNumbers n2)
            {
                if (n1.body.Length != n2.body.Length) return false;
                for (int i = 0; i < n1.body.Length; i++) if (n1.body[i] != n2.body[i]) return false;
                return n1.DecimalSeparator == n2.DecimalSeparator && n1.Sign == n2.Sign;
            }

            static public Boolean operator !=(BigNumbers n1, BigNumbers n2)
            {
                return !(n1 == n2);
            }

Ale program funguje.


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 21.05.2013 17:39

Vypisuje, lebo si neoverridol GetHashCode ani Equals... Teoreticky to robiť nemusíš (hlavne ak to nie je dôležitý projekt a funguje ako má), ale normálne by si to mal implementovať, aby si predišiel nečakaným situáciám :)
Pozri napríklad sem http://stackoverflow.com/questions/5144 ... g-operator

a http://msdn.microsoft.com/en-us/library ... 47(v=vs.80).aspx

Osobne moc preťažovanie operátorov nemám rád, lebo nie je okamžite očividné, čo sa deje.. Tvári sa to navonok ako jedna vec, ale v skutočnosti sa to správa inak. Preferujem skôr na takéto úlohy dedikované triedy/metódy.







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 26.05.2013 18:18

No, bez preťažovania by som to nedal, v tom by som sa vôbec nevyznal :roll:

Zasa mám môj klasický problém.
Mám formulár, v ňom mam TextBox "mojtextbox".
Napr. v:
Kód:
private void CheckMatrix_Click(object sender, EventArgs e)

bez problémov mám prístup, ale v:
Kód:
static public PolynomRoots FindRoots(Polynomial p)

nie. Za prvé, zasa mi nedopína prečo, ale hlavne za druhé, potrebujem prístup k tomu prvku. Potrebujem doňho vkladať text.
Kokos, sa z toho nevymotam :shock:
Ako nastaviť ten prvok, aby bol viditeľný aj v metódach?

Dik.


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 26.05.2013 18:59

Ide o to, že ten UI prvok (textbox) je premenná tej konkrétnej inštancie. Ak chceš mať prístup zvonku, potrebuješ jednak referenciu na danú inštanciu formu a druhak musíš mať ten textbox ako public. Potom by to malo ísť :)







_________________
C#, PHP, ...
Odpovedať na tému [ Príspevkov: 68 ] Choď na stránku: predchádzajúca 1, 2, 3 ďalšia


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. Ako skryt scrollbar v terminaly

v Operačné systémy Unix a Linux

0

438

02.02.2010 23:40

Ivan11114 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. ako skryť .html napriklad kuma.sk/info

v HTML, XHTML, XML, CSS

7

524

30.11.2014 19:54

Mego Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako mam skryt moju IP, resp. zmenit

v Sieťové a internetové programy

2

817

15.08.2008 0:23

suchy Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. 3Ds Max rigg - ako skryť bipedove kosti po riggingu

v Grafické programy

0

507

29.03.2011 18:03

FxEngine Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Aktívny subwoofer ako nastaviť vysokoúrovňový vstup HI/LOW prevodnik

v Elektronika

2

643

27.12.2019 15:42

jamal Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. ako otvorit rar?

v Operačné systémy Unix a Linux

4

1698

16.01.2009 19:33

webkar Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. ako otvorit port?

v Počítačové hry

1

709

19.03.2010 18:58

kllr007 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. AKo zapojit druhy monitor ?

v Monitory, televízory a projektory

3

412

17.12.2014 22:29

Miso122 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako otvoriť súbor OXPS?

v Ostatné programy

2

1311

19.01.2015 20:12

liveman Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako otvoriť súbor .organ

v Ostatné programy

4

488

08.12.2012 23:04

MiskoMalco Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako vymazem druhy operačny system ?

v Operačné systémy Microsoft

8

842

02.03.2009 19:22

dsljohn Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako nasilu naformatovat druhy HDD?

v Pevné disky a radiče

8

973

01.05.2009 21:45

tairikuokami Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako pridať druhý harddisk + Linux

v Pevné disky a radiče

4

646

20.06.2011 19:16

gamelaster Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako otvoriť HDD bez poškodenia?

[ Choď na stránku:Choď na stránku: 1, 2 ]

v Pevné disky a radiče

32

2952

10.02.2007 13:56

Jerry19 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako otvoriť exe v ničom

v Ostatné programy

4

1408

25.06.2008 12:24

Gyrxiur Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Jeden reproduktor hrá hlasnejšie ako druhý

v Zvuk

1

425

15.06.2013 17:43

shiro Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra